Merge "Keyguard: Fix date capitalization context" into oc-dev
diff --git a/apct-tests/perftests/core/res/font/samplefont.ttf b/apct-tests/perftests/core/res/font/samplefont.ttf
new file mode 100644
index 0000000..b8302d4
--- /dev/null
+++ b/apct-tests/perftests/core/res/font/samplefont.ttf
Binary files differ
diff --git a/apct-tests/perftests/core/res/font/samplefont_source.ttx b/apct-tests/perftests/core/res/font/samplefont_source.ttx
new file mode 100644
index 0000000..40fa268
--- /dev/null
+++ b/apct-tests/perftests/core/res/font/samplefont_source.ttx
@@ -0,0 +1,177 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2017 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.
+-->
+<ttFont sfntVersion="\x00\x01\x00\x00" ttLibVersion="3.0">
+
+ <GlyphOrder>
+ <GlyphID id="0" name=".notdef"/>
+ <GlyphID id="1" name="a"/>
+ </GlyphOrder>
+
+ <head>
+ <tableVersion value="1.0"/>
+ <fontRevision value="1.0"/>
+ <checkSumAdjustment value="0x640cdb2f"/>
+ <magicNumber value="0x5f0f3cf5"/>
+ <flags value="00000000 00000011"/>
+ <unitsPerEm value="1000"/>
+ <created value="Fri Mar 17 07:26:00 2017"/>
+ <macStyle value="00000000 00000000"/>
+ <lowestRecPPEM value="7"/>
+ <fontDirectionHint value="2"/>
+ <glyphDataFormat value="0"/>
+ </head>
+
+ <hhea>
+ <tableVersion value="1.0"/>
+ <ascent value="1000"/>
+ <descent value="-200"/>
+ <lineGap value="0"/>
+ <caretSlopeRise value="1"/>
+ <caretSlopeRun value="0"/>
+ <caretOffset value="0"/>
+ <reserved0 value="0"/>
+ <reserved1 value="0"/>
+ <reserved2 value="0"/>
+ <reserved3 value="0"/>
+ <metricDataFormat value="0"/>
+ </hhea>
+
+ <maxp>
+ <tableVersion value="0x10000"/>
+ <maxZones value="0"/>
+ <maxTwilightPoints value="0"/>
+ <maxStorage value="0"/>
+ <maxFunctionDefs value="0"/>
+ <maxInstructionDefs value="0"/>
+ <maxStackElements value="0"/>
+ <maxSizeOfInstructions value="0"/>
+ <maxComponentElements value="0"/>
+ </maxp>
+
+ <OS_2>
+ <!-- The fields 'usFirstCharIndex' and 'usLastCharIndex'
+ will be recalculated by the compiler -->
+ <version value="3"/>
+ <xAvgCharWidth value="594"/>
+ <usWeightClass value="400"/>
+ <usWidthClass value="5"/>
+ <fsType value="00000000 00001000"/>
+ <ySubscriptXSize value="650"/>
+ <ySubscriptYSize value="600"/>
+ <ySubscriptXOffset value="0"/>
+ <ySubscriptYOffset value="75"/>
+ <ySuperscriptXSize value="650"/>
+ <ySuperscriptYSize value="600"/>
+ <ySuperscriptXOffset value="0"/>
+ <ySuperscriptYOffset value="350"/>
+ <yStrikeoutSize value="50"/>
+ <yStrikeoutPosition value="300"/>
+ <sFamilyClass value="0"/>
+ <panose>
+ <bFamilyType value="0"/>
+ <bSerifStyle value="0"/>
+ <bWeight value="5"/>
+ <bProportion value="0"/>
+ <bContrast value="0"/>
+ <bStrokeVariation value="0"/>
+ <bArmStyle value="0"/>
+ <bLetterForm value="0"/>
+ <bMidline value="0"/>
+ <bXHeight value="0"/>
+ </panose>
+ <ulUnicodeRange1 value="00000000 00000000 00000000 00000001"/>
+ <ulUnicodeRange2 value="00000000 00000000 00000000 00000000"/>
+ <ulUnicodeRange3 value="00000000 00000000 00000000 00000000"/>
+ <ulUnicodeRange4 value="00000000 00000000 00000000 00000000"/>
+ <achVendID value="UKWN"/>
+ <fsSelection value="00000000 01000000"/>
+ <usFirstCharIndex value="32"/>
+ <usLastCharIndex value="122"/>
+ <sTypoAscender value="800"/>
+ <sTypoDescender value="-200"/>
+ <sTypoLineGap value="200"/>
+ <usWinAscent value="1000"/>
+ <usWinDescent value="200"/>
+ <ulCodePageRange1 value="00000000 00000000 00000000 00000001"/>
+ <ulCodePageRange2 value="00000000 00000000 00000000 00000000"/>
+ <sxHeight value="500"/>
+ <sCapHeight value="700"/>
+ <usDefaultChar value="0"/>
+ <usBreakChar value="32"/>
+ <usMaxContext value="0"/>
+ </OS_2>
+
+ <hmtx>
+ <mtx name=".notdef" width="500" lsb="93"/>
+ <mtx name="a" width="500" lsb="93"/>
+ </hmtx>
+
+ <cmap>
+ <tableVersion version="0"/>
+ <cmap_format_4 platformID="3" platEncID="10" language="0">
+ <map code="0x0061" name="a" />
+ </cmap_format_4>
+ </cmap>
+
+ <loca>
+ <!-- The 'loca' table will be calculated by the compiler -->
+ </loca>
+
+ <glyf>
+ <TTGlyph name=".notdef" xMin="0" yMin="0" xMax="0" yMax="0" />
+ <TTGlyph name="a" xMin="0" yMin="0" xMax="0" yMax="0" />
+ </glyf>
+
+ <name>
+ <namerecord nameID="1" platformID="1" platEncID="0" langID="0x0" unicode="True">
+ Sample Font
+ </namerecord>
+ <namerecord nameID="2" platformID="1" platEncID="0" langID="0x0" unicode="True">
+ Regular
+ </namerecord>
+ <namerecord nameID="4" platformID="1" platEncID="0" langID="0x0" unicode="True">
+ Sample Font
+ </namerecord>
+ <namerecord nameID="6" platformID="1" platEncID="0" langID="0x0" unicode="True">
+ SampleFont-Regular
+ </namerecord>
+ <namerecord nameID="1" platformID="3" platEncID="1" langID="0x409">
+ Sample Font
+ </namerecord>
+ <namerecord nameID="2" platformID="3" platEncID="1" langID="0x409">
+ Regular
+ </namerecord>
+ <namerecord nameID="4" platformID="3" platEncID="1" langID="0x409">
+ Sample Font
+ </namerecord>
+ <namerecord nameID="6" platformID="3" platEncID="1" langID="0x409">
+ SampleFont-Regular
+ </namerecord>
+ </name>
+
+ <post>
+ <formatType value="3.0"/>
+ <italicAngle value="0.0"/>
+ <underlinePosition value="-75"/>
+ <underlineThickness value="50"/>
+ <isFixedPitch value="0"/>
+ <minMemType42 value="0"/>
+ <maxMemType42 value="0"/>
+ <minMemType1 value="0"/>
+ <maxMemType1 value="0"/>
+ </post>
+
+</ttFont>
diff --git a/apct-tests/perftests/core/res/font/samplexmlfont.xml b/apct-tests/perftests/core/res/font/samplexmlfont.xml
new file mode 100644
index 0000000..b226446
--- /dev/null
+++ b/apct-tests/perftests/core/res/font/samplexmlfont.xml
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Copyright (C) 2017 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
+-->
+<font-family xmlns:android="http://schemas.android.com/apk/res/android">
+ <font android:font="@font/samplefont" />
+</font-family>
diff --git a/apct-tests/perftests/core/res/layout/test_textview_font_family_file.xml b/apct-tests/perftests/core/res/layout/test_textview_font_family_file.xml
new file mode 100644
index 0000000..3689a64
--- /dev/null
+++ b/apct-tests/perftests/core/res/layout/test_textview_font_family_file.xml
@@ -0,0 +1,20 @@
+<!--
+ Copyright (C) 2017 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
+-->
+<TextView xmlns:android="http://schemas.android.com/apk/res/android"
+ android:layout_width="100dp"
+ android:layout_height="100dp"
+ android:text="@string/short_text"
+ android:fontFamily="@font/samplefont" />
diff --git a/apct-tests/perftests/core/res/layout/test_textview_font_family_string.xml b/apct-tests/perftests/core/res/layout/test_textview_font_family_string.xml
new file mode 100644
index 0000000..5f236f5
--- /dev/null
+++ b/apct-tests/perftests/core/res/layout/test_textview_font_family_string.xml
@@ -0,0 +1,20 @@
+<!--
+ Copyright (C) 2017 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
+-->
+<TextView xmlns:android="http://schemas.android.com/apk/res/android"
+ android:layout_width="100dp"
+ android:layout_height="100dp"
+ android:text="@string/short_text"
+ android:fontFamily="sans-serif" />
diff --git a/apct-tests/perftests/core/res/layout/test_textview_font_family_xml.xml b/apct-tests/perftests/core/res/layout/test_textview_font_family_xml.xml
new file mode 100644
index 0000000..0331fa5
--- /dev/null
+++ b/apct-tests/perftests/core/res/layout/test_textview_font_family_xml.xml
@@ -0,0 +1,20 @@
+<!--
+ Copyright (C) 2017 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
+-->
+<TextView xmlns:android="http://schemas.android.com/apk/res/android"
+ android:layout_width="100dp"
+ android:layout_height="100dp"
+ android:text="@string/short_text"
+ android:fontFamily="@font/samplexmlfont" />
diff --git a/apct-tests/perftests/core/res/values/strings.xml b/apct-tests/perftests/core/res/values/strings.xml
index 5d1f6f0..7ab325f 100644
--- a/apct-tests/perftests/core/res/values/strings.xml
+++ b/apct-tests/perftests/core/res/values/strings.xml
@@ -28,4 +28,5 @@
text text text text text text text text text text text text text text text text
text text text text text text text text text text text text text text text text
text text text text text text text text text text text text </string>
+ <string name="short_text">text text</string>
</resources>
diff --git a/apct-tests/perftests/core/src/android/widget/TextViewFontFamilyLayoutPerfTest.java b/apct-tests/perftests/core/src/android/widget/TextViewFontFamilyLayoutPerfTest.java
new file mode 100644
index 0000000..4b6da6b
--- /dev/null
+++ b/apct-tests/perftests/core/src/android/widget/TextViewFontFamilyLayoutPerfTest.java
@@ -0,0 +1,72 @@
+/*
+ * Copyright (C) 2017 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 android.widget;
+
+import android.content.Context;
+import android.perftests.utils.BenchmarkState;
+import android.perftests.utils.PerfStatusReporter;
+import android.support.test.InstrumentationRegistry;
+import android.support.test.filters.LargeTest;
+import android.support.test.runner.AndroidJUnit4;
+import android.view.LayoutInflater;
+
+import com.android.perftests.core.R;
+
+import java.util.Collection;
+import java.util.Arrays;
+
+import org.junit.Test;
+import org.junit.Rule;
+import org.junit.runners.Parameterized;
+import org.junit.runners.Parameterized.Parameters;
+import org.junit.runner.RunWith;
+
+import static org.junit.Assert.assertTrue;
+
+@LargeTest
+@RunWith(Parameterized.class)
+public class TextViewFontFamilyLayoutPerfTest {
+ @Parameters(name = "{0}")
+ public static Collection layouts() {
+ return Arrays.asList(new Object[][] {
+ { "String fontFamily attribute", R.layout.test_textview_font_family_string},
+ { "File fontFamily attribute", R.layout.test_textview_font_family_file},
+ { "XML fontFamily attribute", R.layout.test_textview_font_family_xml},
+ });
+ }
+
+ private int mLayoutId;
+
+ public TextViewFontFamilyLayoutPerfTest(String key, int layoutId) {
+ mLayoutId = layoutId;
+ }
+
+ @Rule
+ public PerfStatusReporter mPerfStatusReporter = new PerfStatusReporter();
+
+ @Test
+ public void testConstruction() throws Throwable {
+ final Context context = InstrumentationRegistry.getTargetContext();
+ final BenchmarkState state = mPerfStatusReporter.getBenchmarkState();
+ final LayoutInflater inflator =
+ (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
+
+ while (state.keepRunning()) {
+ inflator.inflate(mLayoutId, null, false);
+ }
+ }
+}
diff --git a/api/current.txt b/api/current.txt
index 6023aab..ac97b54 100644
--- a/api/current.txt
+++ b/api/current.txt
@@ -26513,7 +26513,6 @@
method public boolean isTdlsSupported();
method public boolean isWifiEnabled();
method public deprecated boolean pingSupplicant();
- method public void queryPasspointIcon(long, java.lang.String);
method public boolean reassociate();
method public boolean reconnect();
method public boolean removeNetwork(int);
@@ -26526,29 +26525,17 @@
method public boolean startScan();
method public void startWps(android.net.wifi.WpsInfo, android.net.wifi.WifiManager.WpsCallback);
method public int updateNetwork(android.net.wifi.WifiConfiguration);
- field public static final java.lang.String ACTION_PASSPOINT_DEAUTH_IMMINENT = "android.net.wifi.action.PASSPOINT_DEAUTH_IMMINENT";
- field public static final java.lang.String ACTION_PASSPOINT_ICON = "android.net.wifi.action.PASSPOINT_ICON";
- field public static final java.lang.String ACTION_PASSPOINT_OSU_PROVIDERS_LIST = "android.net.wifi.action.PASSPOINT_OSU_PROVIDERS_LIST";
- field public static final java.lang.String ACTION_PASSPOINT_SUBSCRIPTION_REMEDIATION = "android.net.wifi.action.PASSPOINT_SUBSCRIPTION_REMEDIATION";
field public static final java.lang.String ACTION_PICK_WIFI_NETWORK = "android.net.wifi.PICK_WIFI_NETWORK";
field public static final java.lang.String ACTION_REQUEST_SCAN_ALWAYS_AVAILABLE = "android.net.wifi.action.REQUEST_SCAN_ALWAYS_AVAILABLE";
field public static final int ERROR_AUTHENTICATING = 1; // 0x1
- field public static final java.lang.String EXTRA_ANQP_ELEMENT_DATA = "android.net.wifi.extra.ANQP_ELEMENT_DATA";
field public static final java.lang.String EXTRA_BSSID = "bssid";
- field public static final java.lang.String EXTRA_BSSID_LONG = "android.net.wifi.extra.BSSID_LONG";
- field public static final java.lang.String EXTRA_DELAY = "android.net.wifi.extra.DELAY";
- field public static final java.lang.String EXTRA_ESS = "android.net.wifi.extra.ESS";
- field public static final java.lang.String EXTRA_FILENAME = "android.net.wifi.extra.FILENAME";
- field public static final java.lang.String EXTRA_ICON = "android.net.wifi.extra.ICON";
field public static final java.lang.String EXTRA_NETWORK_INFO = "networkInfo";
field public static final java.lang.String EXTRA_NEW_RSSI = "newRssi";
field public static final java.lang.String EXTRA_NEW_STATE = "newState";
field public static final java.lang.String EXTRA_PREVIOUS_WIFI_STATE = "previous_wifi_state";
field public static final java.lang.String EXTRA_RESULTS_UPDATED = "resultsUpdated";
- field public static final java.lang.String EXTRA_SUBSCRIPTION_REMEDIATION_METHOD = "android.net.wifi.extra.SUBSCRIPTION_REMEDIATION_METHOD";
field public static final java.lang.String EXTRA_SUPPLICANT_CONNECTED = "connected";
field public static final java.lang.String EXTRA_SUPPLICANT_ERROR = "supplicantError";
- field public static final java.lang.String EXTRA_URL = "android.net.wifi.extra.URL";
field public static final java.lang.String EXTRA_WIFI_INFO = "wifiInfo";
field public static final java.lang.String EXTRA_WIFI_STATE = "wifi_state";
field public static final java.lang.String NETWORK_IDS_CHANGED_ACTION = "android.net.wifi.NETWORK_IDS_CHANGED";
@@ -33907,7 +33894,6 @@
field public static final java.lang.String EXTRA_RECIPIENT_CONTACT_CHAT_ID = "android.provider.extra.RECIPIENT_CONTACT_CHAT_ID";
field public static final java.lang.String EXTRA_RECIPIENT_CONTACT_NAME = "android.provider.extra.RECIPIENT_CONTACT_NAME";
field public static final java.lang.String EXTRA_RECIPIENT_CONTACT_URI = "android.provider.extra.RECIPIENT_CONTACT_URI";
- field public static final java.lang.String EXTRA_SENDER_ACCOUNT_HASH = "android.provider.extra.SENDER_ACCOUNT_HASH";
field public static final java.lang.String INVITE_CONTACT = "com.android.contacts.action.INVITE_CONTACT";
field public static final java.lang.String METADATA_ACCOUNT_TYPE = "android.provider.account_type";
field public static final java.lang.String METADATA_MIMETYPE = "android.provider.mimetype";
diff --git a/api/removed.txt b/api/removed.txt
index 9baafeb..49b72e15 100644
--- a/api/removed.txt
+++ b/api/removed.txt
@@ -72,7 +72,6 @@
method public deprecated android.os.UserHandle createUser(android.content.ComponentName, java.lang.String);
method public deprecated java.lang.String getDeviceInitializerApp();
method public deprecated android.content.ComponentName getDeviceInitializerComponent();
- method public void setAffiliationIds(android.content.ComponentName, java.util.List<java.lang.String>);
}
}
diff --git a/api/system-current.txt b/api/system-current.txt
index 67b6e82..a2c2771 100644
--- a/api/system-current.txt
+++ b/api/system-current.txt
@@ -29038,7 +29038,6 @@
method public boolean isWifiEnabled();
method public boolean isWifiScannerSupported();
method public deprecated boolean pingSupplicant();
- method public void queryPasspointIcon(long, java.lang.String);
method public boolean reassociate();
method public boolean reconnect();
method public boolean removeNetwork(int);
@@ -29055,10 +29054,6 @@
method public boolean startScan(android.os.WorkSource);
method public void startWps(android.net.wifi.WpsInfo, android.net.wifi.WifiManager.WpsCallback);
method public int updateNetwork(android.net.wifi.WifiConfiguration);
- field public static final java.lang.String ACTION_PASSPOINT_DEAUTH_IMMINENT = "android.net.wifi.action.PASSPOINT_DEAUTH_IMMINENT";
- field public static final java.lang.String ACTION_PASSPOINT_ICON = "android.net.wifi.action.PASSPOINT_ICON";
- field public static final java.lang.String ACTION_PASSPOINT_OSU_PROVIDERS_LIST = "android.net.wifi.action.PASSPOINT_OSU_PROVIDERS_LIST";
- field public static final java.lang.String ACTION_PASSPOINT_SUBSCRIPTION_REMEDIATION = "android.net.wifi.action.PASSPOINT_SUBSCRIPTION_REMEDIATION";
field public static final java.lang.String ACTION_PICK_WIFI_NETWORK = "android.net.wifi.PICK_WIFI_NETWORK";
field public static final java.lang.String ACTION_REQUEST_SCAN_ALWAYS_AVAILABLE = "android.net.wifi.action.REQUEST_SCAN_ALWAYS_AVAILABLE";
field public static final int CHANGE_REASON_ADDED = 0; // 0x0
@@ -29066,14 +29061,8 @@
field public static final int CHANGE_REASON_REMOVED = 1; // 0x1
field public static final java.lang.String CONFIGURED_NETWORKS_CHANGED_ACTION = "android.net.wifi.CONFIGURED_NETWORKS_CHANGE";
field public static final int ERROR_AUTHENTICATING = 1; // 0x1
- field public static final java.lang.String EXTRA_ANQP_ELEMENT_DATA = "android.net.wifi.extra.ANQP_ELEMENT_DATA";
field public static final java.lang.String EXTRA_BSSID = "bssid";
- field public static final java.lang.String EXTRA_BSSID_LONG = "android.net.wifi.extra.BSSID_LONG";
field public static final java.lang.String EXTRA_CHANGE_REASON = "changeReason";
- field public static final java.lang.String EXTRA_DELAY = "android.net.wifi.extra.DELAY";
- field public static final java.lang.String EXTRA_ESS = "android.net.wifi.extra.ESS";
- field public static final java.lang.String EXTRA_FILENAME = "android.net.wifi.extra.FILENAME";
- field public static final java.lang.String EXTRA_ICON = "android.net.wifi.extra.ICON";
field public static final java.lang.String EXTRA_MULTIPLE_NETWORKS_CHANGED = "multipleChanges";
field public static final java.lang.String EXTRA_NETWORK_INFO = "networkInfo";
field public static final java.lang.String EXTRA_NEW_RSSI = "newRssi";
@@ -29081,10 +29070,8 @@
field public static final java.lang.String EXTRA_PREVIOUS_WIFI_AP_STATE = "previous_wifi_state";
field public static final java.lang.String EXTRA_PREVIOUS_WIFI_STATE = "previous_wifi_state";
field public static final java.lang.String EXTRA_RESULTS_UPDATED = "resultsUpdated";
- field public static final java.lang.String EXTRA_SUBSCRIPTION_REMEDIATION_METHOD = "android.net.wifi.extra.SUBSCRIPTION_REMEDIATION_METHOD";
field public static final java.lang.String EXTRA_SUPPLICANT_CONNECTED = "connected";
field public static final java.lang.String EXTRA_SUPPLICANT_ERROR = "supplicantError";
- field public static final java.lang.String EXTRA_URL = "android.net.wifi.extra.URL";
field public static final java.lang.String EXTRA_WIFI_AP_STATE = "wifi_state";
field public static final java.lang.String EXTRA_WIFI_CONFIGURATION = "wifiConfiguration";
field public static final java.lang.String EXTRA_WIFI_CREDENTIAL_EVENT_TYPE = "et";
@@ -36821,7 +36808,6 @@
field public static final java.lang.String EXTRA_RECIPIENT_CONTACT_CHAT_ID = "android.provider.extra.RECIPIENT_CONTACT_CHAT_ID";
field public static final java.lang.String EXTRA_RECIPIENT_CONTACT_NAME = "android.provider.extra.RECIPIENT_CONTACT_NAME";
field public static final java.lang.String EXTRA_RECIPIENT_CONTACT_URI = "android.provider.extra.RECIPIENT_CONTACT_URI";
- field public static final java.lang.String EXTRA_SENDER_ACCOUNT_HASH = "android.provider.extra.SENDER_ACCOUNT_HASH";
field public static final java.lang.String INVITE_CONTACT = "com.android.contacts.action.INVITE_CONTACT";
field public static final java.lang.String METADATA_ACCOUNT_TYPE = "android.provider.account_type";
field public static final java.lang.String METADATA_MIMETYPE = "android.provider.mimetype";
diff --git a/api/system-removed.txt b/api/system-removed.txt
index b1a29e7..48f62b1 100644
--- a/api/system-removed.txt
+++ b/api/system-removed.txt
@@ -70,7 +70,6 @@
public class DevicePolicyManager {
method public deprecated android.os.UserHandle createAndInitializeUser(android.content.ComponentName, java.lang.String, java.lang.String, android.content.ComponentName, android.os.Bundle);
method public deprecated android.os.UserHandle createUser(android.content.ComponentName, java.lang.String);
- method public void setAffiliationIds(android.content.ComponentName, java.util.List<java.lang.String>);
}
}
diff --git a/api/test-current.txt b/api/test-current.txt
index d3cb4c9..1cad48e 100644
--- a/api/test-current.txt
+++ b/api/test-current.txt
@@ -26622,7 +26622,6 @@
method public boolean isTdlsSupported();
method public boolean isWifiEnabled();
method public deprecated boolean pingSupplicant();
- method public void queryPasspointIcon(long, java.lang.String);
method public boolean reassociate();
method public boolean reconnect();
method public boolean removeNetwork(int);
@@ -26635,29 +26634,17 @@
method public boolean startScan();
method public void startWps(android.net.wifi.WpsInfo, android.net.wifi.WifiManager.WpsCallback);
method public int updateNetwork(android.net.wifi.WifiConfiguration);
- field public static final java.lang.String ACTION_PASSPOINT_DEAUTH_IMMINENT = "android.net.wifi.action.PASSPOINT_DEAUTH_IMMINENT";
- field public static final java.lang.String ACTION_PASSPOINT_ICON = "android.net.wifi.action.PASSPOINT_ICON";
- field public static final java.lang.String ACTION_PASSPOINT_OSU_PROVIDERS_LIST = "android.net.wifi.action.PASSPOINT_OSU_PROVIDERS_LIST";
- field public static final java.lang.String ACTION_PASSPOINT_SUBSCRIPTION_REMEDIATION = "android.net.wifi.action.PASSPOINT_SUBSCRIPTION_REMEDIATION";
field public static final java.lang.String ACTION_PICK_WIFI_NETWORK = "android.net.wifi.PICK_WIFI_NETWORK";
field public static final java.lang.String ACTION_REQUEST_SCAN_ALWAYS_AVAILABLE = "android.net.wifi.action.REQUEST_SCAN_ALWAYS_AVAILABLE";
field public static final int ERROR_AUTHENTICATING = 1; // 0x1
- field public static final java.lang.String EXTRA_ANQP_ELEMENT_DATA = "android.net.wifi.extra.ANQP_ELEMENT_DATA";
field public static final java.lang.String EXTRA_BSSID = "bssid";
- field public static final java.lang.String EXTRA_BSSID_LONG = "android.net.wifi.extra.BSSID_LONG";
- field public static final java.lang.String EXTRA_DELAY = "android.net.wifi.extra.DELAY";
- field public static final java.lang.String EXTRA_ESS = "android.net.wifi.extra.ESS";
- field public static final java.lang.String EXTRA_FILENAME = "android.net.wifi.extra.FILENAME";
- field public static final java.lang.String EXTRA_ICON = "android.net.wifi.extra.ICON";
field public static final java.lang.String EXTRA_NETWORK_INFO = "networkInfo";
field public static final java.lang.String EXTRA_NEW_RSSI = "newRssi";
field public static final java.lang.String EXTRA_NEW_STATE = "newState";
field public static final java.lang.String EXTRA_PREVIOUS_WIFI_STATE = "previous_wifi_state";
field public static final java.lang.String EXTRA_RESULTS_UPDATED = "resultsUpdated";
- field public static final java.lang.String EXTRA_SUBSCRIPTION_REMEDIATION_METHOD = "android.net.wifi.extra.SUBSCRIPTION_REMEDIATION_METHOD";
field public static final java.lang.String EXTRA_SUPPLICANT_CONNECTED = "connected";
field public static final java.lang.String EXTRA_SUPPLICANT_ERROR = "supplicantError";
- field public static final java.lang.String EXTRA_URL = "android.net.wifi.extra.URL";
field public static final java.lang.String EXTRA_WIFI_INFO = "wifiInfo";
field public static final java.lang.String EXTRA_WIFI_STATE = "wifi_state";
field public static final java.lang.String NETWORK_IDS_CHANGED_ACTION = "android.net.wifi.NETWORK_IDS_CHANGED";
@@ -34044,7 +34031,6 @@
field public static final java.lang.String EXTRA_RECIPIENT_CONTACT_CHAT_ID = "android.provider.extra.RECIPIENT_CONTACT_CHAT_ID";
field public static final java.lang.String EXTRA_RECIPIENT_CONTACT_NAME = "android.provider.extra.RECIPIENT_CONTACT_NAME";
field public static final java.lang.String EXTRA_RECIPIENT_CONTACT_URI = "android.provider.extra.RECIPIENT_CONTACT_URI";
- field public static final java.lang.String EXTRA_SENDER_ACCOUNT_HASH = "android.provider.extra.SENDER_ACCOUNT_HASH";
field public static final java.lang.String INVITE_CONTACT = "com.android.contacts.action.INVITE_CONTACT";
field public static final java.lang.String METADATA_ACCOUNT_TYPE = "android.provider.account_type";
field public static final java.lang.String METADATA_MIMETYPE = "android.provider.mimetype";
@@ -45743,6 +45729,7 @@
method public boolean isAttachedToWindow();
method public boolean isClickable();
method public boolean isContextClickable();
+ method public boolean isDefaultFocusHighlightNeeded(android.graphics.drawable.Drawable, android.graphics.drawable.Drawable);
method public boolean isDirty();
method public boolean isDrawingCacheEnabled();
method public boolean isDuplicateParentStateEnabled();
diff --git a/api/test-removed.txt b/api/test-removed.txt
index 9baafeb..49b72e15 100644
--- a/api/test-removed.txt
+++ b/api/test-removed.txt
@@ -72,7 +72,6 @@
method public deprecated android.os.UserHandle createUser(android.content.ComponentName, java.lang.String);
method public deprecated java.lang.String getDeviceInitializerApp();
method public deprecated android.content.ComponentName getDeviceInitializerComponent();
- method public void setAffiliationIds(android.content.ComponentName, java.util.List<java.lang.String>);
}
}
diff --git a/cmds/bootanimation/bootanimation_main.cpp b/cmds/bootanimation/bootanimation_main.cpp
index dca7ea6..3689d5e 100644
--- a/cmds/bootanimation/bootanimation_main.cpp
+++ b/cmds/bootanimation/bootanimation_main.cpp
@@ -16,12 +16,16 @@
#define LOG_TAG "BootAnimation"
+#include <stdint.h>
+#include <inttypes.h>
+
#include <binder/IPCThreadState.h>
#include <binder/ProcessState.h>
#include <binder/IServiceManager.h>
#include <cutils/properties.h>
#include <sys/resource.h>
#include <utils/Log.h>
+#include <utils/SystemClock.h>
#include <utils/threads.h>
#include "BootAnimation.h"
@@ -47,6 +51,26 @@
sp<ProcessState> proc(ProcessState::self());
ProcessState::self()->startThreadPool();
+ // TODO: replace this with better waiting logic in future, b/35253872
+ int64_t waitStartTime = elapsedRealtime();
+ sp<IServiceManager> sm = defaultServiceManager();
+ const String16 name("SurfaceFlinger");
+ const int SERVICE_WAIT_SLEEP_MS = 100;
+ const int LOG_PER_RETRIES = 10;
+ int retry = 0;
+ while (sm->checkService(name) == nullptr) {
+ retry++;
+ if ((retry % LOG_PER_RETRIES) == 0) {
+ ALOGW("Waiting for SurfaceFlinger, waited for %" PRId64 " ms",
+ elapsedRealtime() - waitStartTime);
+ }
+ usleep(SERVICE_WAIT_SLEEP_MS * 1000);
+ };
+ int64_t totalWaited = elapsedRealtime() - waitStartTime;
+ if (totalWaited > SERVICE_WAIT_SLEEP_MS) {
+ ALOGI("Waiting for SurfaceFlinger took %" PRId64 " ms", totalWaited);
+ }
+
// create the boot animation object
sp<BootAnimation> boot = new BootAnimation();
diff --git a/cmds/idmap/create.cpp b/cmds/idmap/create.cpp
index c13d318..524db14 100644
--- a/cmds/idmap/create.cpp
+++ b/cmds/idmap/create.cpp
@@ -221,3 +221,9 @@
return create_and_write_idmap(target_apk_path, overlay_apk_path, fd, true) == 0 ?
EXIT_SUCCESS : EXIT_FAILURE;
}
+
+int idmap_verify_fd(const char *target_apk_path, const char *overlay_apk_path, int fd)
+{
+ return !is_idmap_stale_fd(target_apk_path, overlay_apk_path, fd) ?
+ EXIT_SUCCESS : EXIT_FAILURE;
+}
diff --git a/cmds/idmap/idmap.cpp b/cmds/idmap/idmap.cpp
index 3a237ff..8f86ed8 100644
--- a/cmds/idmap/idmap.cpp
+++ b/cmds/idmap/idmap.cpp
@@ -16,6 +16,7 @@
idmap --scan target-package-name-to-look-for path-to-target-apk dir-to-hold-idmaps \\\
dir-to-scan [additional-dir-to-scan [additional-dir-to-scan [...]]]\n\
idmap --inspect idmap \n\
+ idmap --verify target overlay fd \n\
\n\
DESCRIPTION \n\
Idmap files play an integral part in the runtime resource overlay framework. An idmap \n\
@@ -57,6 +58,9 @@
--inspect: decode the binary format of 'idmap' (path) and display the contents in a \n\
debug-friendly format. \n\
\n\
+ --verify: verify if idmap corresponding to file descriptor 'fd' (integer) is made from \n\
+ target package 'target' (path to apk) and overlay package 'overlay'. \n\
+\n\
EXAMPLES \n\
Create an idmap file: \n\
\n\
@@ -167,6 +171,29 @@
return idmap_create_path(target_apk_path, overlay_apk_path, idmap_path);
}
+ int maybe_verify_fd(const char *target_apk_path, const char *overlay_apk_path,
+ const char *idmap_str)
+ {
+ char *endptr;
+ int idmap_fd = strtol(idmap_str, &endptr, 10);
+ if (*endptr != '\0') {
+ fprintf(stderr, "error: failed to parse file descriptor argument %s\n", idmap_str);
+ return -1;
+ }
+
+ if (!verify_file_readable(target_apk_path)) {
+ ALOGD("error: failed to read apk %s: %s\n", target_apk_path, strerror(errno));
+ return -1;
+ }
+
+ if (!verify_file_readable(overlay_apk_path)) {
+ ALOGD("error: failed to read apk %s: %s\n", overlay_apk_path, strerror(errno));
+ return -1;
+ }
+
+ return idmap_verify_fd(target_apk_path, overlay_apk_path, idmap_fd);
+ }
+
int maybe_scan(const char *target_package_name, const char *target_apk_path,
const char *idmap_dir, const android::Vector<const char *> *overlay_dirs)
{
@@ -235,6 +262,10 @@
return maybe_create_path(argv[2], argv[3], argv[4]);
}
+ if (argc == 5 && !strcmp(argv[1], "--verify")) {
+ return maybe_verify_fd(argv[2], argv[3], argv[4]);
+ }
+
if (argc >= 6 && !strcmp(argv[1], "--scan")) {
android::Vector<const char *> v;
for (int i = 5; i < argc; i++) {
diff --git a/cmds/idmap/idmap.h b/cmds/idmap/idmap.h
index 8d4210b..5962108 100644
--- a/cmds/idmap/idmap.h
+++ b/cmds/idmap/idmap.h
@@ -25,6 +25,8 @@
int idmap_create_fd(const char *target_apk_path, const char *overlay_apk_path, int fd);
+int idmap_verify_fd(const char *target_apk_path, const char *overlay_apk_path, int fd);
+
// Regarding target_package_name: the idmap_scan implementation should
// be able to extract this from the manifest in target_apk_path,
// simplifying the external API.
diff --git a/cmds/pm/src/com/android/commands/pm/Pm.java b/cmds/pm/src/com/android/commands/pm/Pm.java
index b60aed6..d71573f 100644
--- a/cmds/pm/src/com/android/commands/pm/Pm.java
+++ b/cmds/pm/src/com/android/commands/pm/Pm.java
@@ -63,6 +63,7 @@
import android.os.SystemClock;
import android.os.UserHandle;
import android.os.UserManager;
+import android.os.storage.StorageManager;
import android.text.TextUtils;
import android.text.format.DateUtils;
import android.util.Log;
@@ -1471,7 +1472,8 @@
}
ClearDataObserver obs = new ClearDataObserver();
try {
- mPm.freeStorageAndNotify(volumeUuid, sizeVal, obs);
+ mPm.freeStorageAndNotify(volumeUuid, sizeVal,
+ StorageManager.FLAG_ALLOCATE_DEFY_RESERVED, obs);
synchronized (obs) {
while (!obs.finished) {
try {
diff --git a/compiled-classes-phone b/compiled-classes-phone
index 1a19b2c..cf4b28b 100644
--- a/compiled-classes-phone
+++ b/compiled-classes-phone
@@ -144,17 +144,19 @@
android.animation.TypeEvaluator
android.animation.ValueAnimator
android.animation.ValueAnimator$AnimatorUpdateListener
-android.app.-$Lambda$36$c44uHH2WE4sJvw5tZZB6gRzEaHI
-android.app.-$Lambda$39$c44uHH2WE4sJvw5tZZB6gRzEaHI
-android.app.-$Lambda$57$vZ1qb742P9hE4drBY-TrOZB_qKo
-android.app.-$Lambda$7$u_rp3dnwvfyMTggc6hVftcuYJ3E
-android.app.-$Lambda$71$3eJ3p8XnIxdVOnT82Ns3R0V5ZQE
-android.app.-$Lambda$76$3eJ3p8XnIxdVOnT82Ns3R0V5ZQE
+android.app.-$Lambda$9I5WEMsoBc7l4QrNqZ4wx59yuHU
+android.app.-$Lambda$9I5WEMsoBc7l4QrNqZ4wx59yuHU$1
+android.app.-$Lambda$CsyQO--8YdRe5wlajUCi-L98enA$1
+android.app.-$Lambda$CsyQO--8YdRe5wlajUCi-L98enA$2
+android.app.-$Lambda$CsyQO--8YdRe5wlajUCi-L98enA$3
+android.app.-$Lambda$FilBqgnXJrN9Mgyks1XHeAxzSTk
+android.app.-$Lambda$c44uHH2WE4sJvw5tZZB6gRzEaHI
+android.app.-$Lambda$c44uHH2WE4sJvw5tZZB6gRzEaHI$1
+android.app.-$Lambda$vZ1qb742P9hE4drBY-TrOZB_qKo
+android.app.-$Lambda$w9bG0NLfK6B6UpQKzQS6S1ayAh0
+android.app.-$Lambda$w9bG0NLfK6B6UpQKzQS6S1ayAh0$1
android.app.ActionBar
android.app.ActionBar$LayoutParams
-android.app.ActionBar$OnMenuVisibilityListener
-android.app.ActionBar$Tab
-android.app.ActionBar$TabListener
android.app.Activity
android.app.Activity$HostCallbacks
android.app.ActivityManager
@@ -163,6 +165,7 @@
android.app.ActivityManager$MemoryInfo
android.app.ActivityManager$MemoryInfo$1
android.app.ActivityManager$OnUidImportanceListener
+android.app.ActivityManager$ProcessErrorStateInfo
android.app.ActivityManager$RecentTaskInfo
android.app.ActivityManager$RecentTaskInfo$1
android.app.ActivityManager$RunningAppProcessInfo
@@ -185,12 +188,13 @@
android.app.ActivityManagerInternal
android.app.ActivityManagerInternal$SleepToken
android.app.ActivityOptions
+android.app.ActivityOptions$1
+android.app.ActivityOptions$1$1
android.app.ActivityOptions$OnAnimationFinishedListener
android.app.ActivityOptions$OnAnimationStartedListener
android.app.ActivityThread
android.app.ActivityThread$1
android.app.ActivityThread$2
-android.app.ActivityThread$3
android.app.ActivityThread$ActivityClientRecord
android.app.ActivityThread$ActivityConfigChangeData
android.app.ActivityThread$AppBindData
@@ -199,7 +203,6 @@
android.app.ActivityThread$ContextCleanupInfo
android.app.ActivityThread$CreateServiceData
android.app.ActivityThread$DropBoxReporter
-android.app.ActivityThread$DumpComponentInfo
android.app.ActivityThread$EventLoggingReporter
android.app.ActivityThread$GcIdler
android.app.ActivityThread$H
@@ -214,8 +217,12 @@
android.app.ActivityThread$ResultData
android.app.ActivityThread$ServiceArgsData
android.app.ActivityThread$StopInfo
+android.app.ActivityTransitionCoordinator
+android.app.ActivityTransitionCoordinator$ContinueTransitionListener
+android.app.ActivityTransitionCoordinator$FixedEpicenterCallback
+android.app.ActivityTransitionCoordinator$GhostViewListeners
+android.app.ActivityTransitionCoordinator$SharedElementOriginalState
android.app.ActivityTransitionState
-android.app.AlarmManager
android.app.AlarmManager$AlarmClockInfo
android.app.AlarmManager$ListenerWrapper
android.app.AlarmManager$OnAlarmListener
@@ -233,8 +240,10 @@
android.app.Application
android.app.Application$ActivityLifecycleCallbacks
android.app.ApplicationErrorReport
+android.app.ApplicationErrorReport$AnrInfo
android.app.ApplicationErrorReport$CrashInfo
android.app.ApplicationErrorReport$ParcelableCrashInfo
+android.app.ApplicationErrorReport$ParcelableCrashInfo$1
android.app.ApplicationLoaders
android.app.ApplicationPackageManager
android.app.ApplicationPackageManager$MoveCallbackDelegate
@@ -248,20 +257,28 @@
android.app.ContentProviderHolder$1
android.app.ContextImpl
android.app.ContextImpl$ApplicationContentResolver
-android.app.DatePickerDialog
android.app.DatePickerDialog$OnDateSetListener
+android.app.DexLoadReporter
android.app.Dialog
android.app.Dialog$ListenersHandler
android.app.DialogFragment
android.app.DownloadManager
android.app.DownloadManager$CursorTranslator
android.app.DownloadManager$Query
-android.app.DownloadManager$Request
+android.app.EnterTransitionCoordinator
+android.app.EnterTransitionCoordinator$1
+android.app.EnterTransitionCoordinator$2
+android.app.EnterTransitionCoordinator$3
+android.app.EnterTransitionCoordinator$4
+android.app.EnterTransitionCoordinator$5
+android.app.EnterTransitionCoordinator$6
+android.app.ExitTransitionCoordinator
+android.app.ExitTransitionCoordinator$10
+android.app.ExitTransitionCoordinator$3
+android.app.ExitTransitionCoordinator$9
android.app.Fragment
android.app.Fragment$1
android.app.Fragment$AnimationInfo
-android.app.Fragment$OnStartEnterTransitionListener
-android.app.Fragment$SavedState
android.app.FragmentContainer
android.app.FragmentController
android.app.FragmentHostCallback
@@ -271,20 +288,14 @@
android.app.FragmentManager$OnBackStackChangedListener
android.app.FragmentManagerImpl
android.app.FragmentManagerImpl$1
-android.app.FragmentManagerImpl$2
android.app.FragmentManagerImpl$AnimateOnHWLayerIfNeededListener
android.app.FragmentManagerImpl$OpGenerator
-android.app.FragmentManagerImpl$PopBackStackState
-android.app.FragmentManagerImpl$StartEnterTransitionListener
android.app.FragmentManagerState
android.app.FragmentManagerState$1
android.app.FragmentState
android.app.FragmentState$1
android.app.FragmentTransaction
android.app.FragmentTransition
-android.app.FragmentTransition$3
-android.app.FragmentTransition$4
-android.app.FragmentTransition$5
android.app.FragmentTransition$FragmentContainerTransition
android.app.IActivityContainer
android.app.IActivityContainer$Stub
@@ -295,8 +306,10 @@
android.app.IActivityManager$Stub$Proxy
android.app.IAlarmCompleteListener
android.app.IAlarmCompleteListener$Stub
+android.app.IAlarmCompleteListener$Stub$Proxy
android.app.IAlarmListener
android.app.IAlarmListener$Stub
+android.app.IAlarmListener$Stub$Proxy
android.app.IAlarmManager
android.app.IAlarmManager$Stub
android.app.IAlarmManager$Stub$Proxy
@@ -306,6 +319,9 @@
android.app.IApplicationThread
android.app.IApplicationThread$Stub
android.app.IApplicationThread$Stub$Proxy
+android.app.IInstantAppResolver
+android.app.IInstantAppResolver$Stub
+android.app.IInstantAppResolver$Stub$Proxy
android.app.IInstrumentationWatcher
android.app.IInstrumentationWatcher$Stub
android.app.INotificationManager
@@ -334,6 +350,7 @@
android.app.IUiModeManager$Stub$Proxy
android.app.IUidObserver
android.app.IUidObserver$Stub
+android.app.IUidObserver$Stub$Proxy
android.app.IUserSwitchObserver
android.app.IUserSwitchObserver$Stub
android.app.IUserSwitchObserver$Stub$Proxy
@@ -343,6 +360,10 @@
android.app.IWallpaperManagerCallback
android.app.IWallpaperManagerCallback$Stub
android.app.IWallpaperManagerCallback$Stub$Proxy
+android.app.InstantAppResolverService
+android.app.InstantAppResolverService$1
+android.app.InstantAppResolverService$InstantAppResolutionCallback
+android.app.InstantAppResolverService$ServiceHandler
android.app.Instrumentation
android.app.IntentReceiverLeaked
android.app.IntentService
@@ -354,7 +375,6 @@
android.app.ListFragment$1
android.app.ListFragment$2
android.app.LoadedApk
-android.app.LoadedApk$DexLoadReporter
android.app.LoadedApk$ReceiverDispatcher
android.app.LoadedApk$ReceiverDispatcher$Args
android.app.LoadedApk$ReceiverDispatcher$InnerReceiver
@@ -384,25 +404,29 @@
android.app.Notification$InboxStyle
android.app.Notification$MediaStyle
android.app.Notification$MessagingStyle
-android.app.Notification$MessagingStyle$Message
android.app.Notification$StandardTemplateParams
android.app.Notification$Style
+android.app.Notification$TvExtender
android.app.Notification$WearableExtender
android.app.NotificationChannel
android.app.NotificationChannel$1
+android.app.NotificationChannelGroup
+android.app.NotificationChannelGroup$1
android.app.NotificationManager
android.app.NotificationManager$Policy
android.app.NotificationManager$Policy$1
android.app.OnActivityPausedListener
+android.app.PackageInstallObserver
+android.app.PackageInstallObserver$1
android.app.PendingIntent
android.app.PendingIntent$1
android.app.PendingIntent$CanceledException
android.app.PendingIntent$FinishedDispatcher
android.app.PendingIntent$OnFinished
android.app.PendingIntent$OnMarshaledListener
-android.app.PictureInPictureArgs
-android.app.PictureInPictureArgs$1
-android.app.Presentation
+android.app.PictureInPictureParams
+android.app.PictureInPictureParams$1
+android.app.PictureInPictureParams$Builder
android.app.ProfilerInfo
android.app.ProgressDialog
android.app.QueuedWork
@@ -410,24 +434,23 @@
android.app.ReceiverRestrictedContext
android.app.RemoteAction
android.app.RemoteAction$1
-android.app.RemoteAction$2
-android.app.RemoteAction$OnActionListener
android.app.RemoteInput
android.app.RemoteInput$1
-android.app.RemoteInput$Builder
android.app.ResourcesManager
android.app.ResourcesManager$1
android.app.ResourcesManager$ActivityResources
android.app.ResultInfo
android.app.ResultInfo$1
android.app.RetailDemoModeServiceInternal
-android.app.SearchManager
android.app.SearchableInfo
android.app.SearchableInfo$1
android.app.Service
android.app.ServiceConnectionLeaked
+android.app.ServiceStartArgs
+android.app.ServiceStartArgs$1
android.app.SharedElementCallback
android.app.SharedElementCallback$1
+android.app.SharedElementCallback$OnSharedElementsReadyListener
android.app.SharedPreferencesImpl
android.app.SharedPreferencesImpl$1
android.app.SharedPreferencesImpl$2
@@ -517,22 +540,27 @@
android.app.SystemServiceRegistry$78
android.app.SystemServiceRegistry$79
android.app.SystemServiceRegistry$8
+android.app.SystemServiceRegistry$80
+android.app.SystemServiceRegistry$81
+android.app.SystemServiceRegistry$82
android.app.SystemServiceRegistry$9
android.app.SystemServiceRegistry$CachedServiceFetcher
android.app.SystemServiceRegistry$ServiceFetcher
android.app.SystemServiceRegistry$StaticApplicationContextServiceFetcher
android.app.SystemServiceRegistry$StaticServiceFetcher
-android.app.TaskStackBuilder
android.app.TaskStackListener
android.app.TimePickerDialog$OnTimeSetListener
android.app.UiModeManager
android.app.UserSwitchObserver
-android.app.VoiceInteractor$PickOptionRequest$Option
+android.app.Vr2dDisplayProperties
+android.app.VrManager
android.app.WaitResult
android.app.WallpaperInfo
-android.app.WallpaperInfo$1
android.app.WallpaperManager
android.app.WallpaperManager$Globals
+android.app.admin.DeviceAdminInfo
+android.app.admin.DeviceAdminInfo$1
+android.app.admin.DeviceAdminInfo$PolicyInfo
android.app.admin.DevicePolicyManager
android.app.admin.DevicePolicyManagerInternal
android.app.admin.DevicePolicyManagerInternal$OnCrossProfileWidgetProvidersChangeListener
@@ -549,9 +577,9 @@
android.app.admin.SystemUpdatePolicy
android.app.admin.SystemUpdatePolicy$1
android.app.assist.AssistContent
-android.app.assist.AssistContent$1
android.app.assist.AssistStructure
android.app.assist.AssistStructure$1
+android.app.assist.AssistStructure$AutofillOverlay
android.app.assist.AssistStructure$ParcelTransferReader
android.app.assist.AssistStructure$ParcelTransferWriter
android.app.assist.AssistStructure$SendChannel
@@ -577,13 +605,13 @@
android.app.backup.IBackupManager
android.app.backup.IBackupManager$Stub
android.app.backup.IBackupManager$Stub$Proxy
+android.app.backup.IBackupManagerMonitor
android.app.backup.IBackupObserver
android.app.backup.IFullBackupRestoreObserver
android.app.backup.IRestoreSession
android.app.backup.ISelectBackupTransportCallback
android.app.backup.RestoreDescription
android.app.backup.RestoreSet
-android.app.backup.SharedPreferencesBackupHelper
android.app.job.IJobCallback
android.app.job.IJobCallback$Stub
android.app.job.IJobCallback$Stub$Proxy
@@ -602,8 +630,11 @@
android.app.job.JobParameters$1
android.app.job.JobScheduler
android.app.job.JobService
-android.app.job.JobService$JobHandler
-android.app.job.JobService$JobInterface
+android.app.job.JobService$1
+android.app.job.JobServiceEngine
+android.app.job.JobServiceEngine$JobHandler
+android.app.job.JobServiceEngine$JobInterface
+android.app.job.JobWorkItem
android.app.trust.IStrongAuthTracker
android.app.trust.IStrongAuthTracker$Stub
android.app.trust.IStrongAuthTracker$Stub$Proxy
@@ -617,9 +648,15 @@
android.app.trust.TrustManager$1
android.app.trust.TrustManager$2
android.app.trust.TrustManager$TrustListener
+android.app.usage.CacheQuotaHint
+android.app.usage.CacheQuotaHint$1
+android.app.usage.CacheQuotaHint$Builder
android.app.usage.ConfigurationStats
android.app.usage.ConfigurationStats$1
android.app.usage.ExternalStorageStats
+android.app.usage.ICacheQuotaService
+android.app.usage.ICacheQuotaService$Stub
+android.app.usage.ICacheQuotaService$Stub$Proxy
android.app.usage.IStorageStatsManager
android.app.usage.IStorageStatsManager$Stub
android.app.usage.IUsageStatsManager
@@ -642,26 +679,29 @@
android.appwidget.AppWidgetHost$UpdateHandler
android.appwidget.AppWidgetHostView
android.appwidget.AppWidgetHostView$1
+android.appwidget.AppWidgetHostView$ParcelableSparseArray
+android.appwidget.AppWidgetHostView$ParcelableSparseArray$1
android.appwidget.AppWidgetManager
android.appwidget.AppWidgetProvider
android.appwidget.AppWidgetProviderInfo
android.appwidget.AppWidgetProviderInfo$1
+android.appwidget.PendingHostUpdate
+android.appwidget.PendingHostUpdate$1
android.bluetooth.BluetoothA2dp
android.bluetooth.BluetoothA2dp$1
android.bluetooth.BluetoothA2dp$2
android.bluetooth.BluetoothActivityEnergyInfo
-android.bluetooth.BluetoothActivityEnergyInfo$1
android.bluetooth.BluetoothAdapter
android.bluetooth.BluetoothAdapter$1
-android.bluetooth.BluetoothClass
-android.bluetooth.BluetoothClass$1
+android.bluetooth.BluetoothAdapter$BluetoothStateChangeCallback
android.bluetooth.BluetoothCodecConfig
android.bluetooth.BluetoothCodecConfig$1
android.bluetooth.BluetoothCodecStatus
-android.bluetooth.BluetoothCodecStatus$1
android.bluetooth.BluetoothDevice
android.bluetooth.BluetoothDevice$1
android.bluetooth.BluetoothDevice$2
+android.bluetooth.BluetoothGatt
+android.bluetooth.BluetoothGattCallback
android.bluetooth.BluetoothGattCharacteristic
android.bluetooth.BluetoothGattDescriptor
android.bluetooth.BluetoothGattService
@@ -742,25 +782,21 @@
android.bluetooth.IBluetoothStateChangeCallback$Stub
android.bluetooth.IBluetoothStateChangeCallback$Stub$Proxy
android.bluetooth.OobData
-android.bluetooth.SdpMasRecord
-android.bluetooth.SdpMnsRecord
-android.bluetooth.SdpOppOpsRecord
-android.bluetooth.SdpPseRecord
-android.bluetooth.SdpRecord
-android.bluetooth.SdpSapsRecord
android.bluetooth.UidTraffic
android.bluetooth.UidTraffic$1
android.bluetooth.le.AdvertiseData
-android.bluetooth.le.AdvertiseSettings
+android.bluetooth.le.AdvertisingSetParameters
+android.bluetooth.le.BluetoothLeAdvertiser
android.bluetooth.le.BluetoothLeScanner
android.bluetooth.le.BluetoothLeScanner$BleScanCallbackWrapper
android.bluetooth.le.BluetoothLeScanner$BleScanCallbackWrapper$1
-android.bluetooth.le.BluetoothLeScanner$BleScanCallbackWrapper$2
android.bluetooth.le.BluetoothLeUtils
-android.bluetooth.le.IAdvertiserCallback
+android.bluetooth.le.IAdvertisingSetCallback
+android.bluetooth.le.IPeriodicAdvertisingCallback
android.bluetooth.le.IScannerCallback
android.bluetooth.le.IScannerCallback$Stub
android.bluetooth.le.IScannerCallback$Stub$Proxy
+android.bluetooth.le.PeriodicAdvertisingParameters
android.bluetooth.le.ScanCallback
android.bluetooth.le.ScanFilter
android.bluetooth.le.ScanFilter$1
@@ -771,6 +807,11 @@
android.bluetooth.le.ScanSettings
android.bluetooth.le.ScanSettings$1
android.bluetooth.le.ScanSettings$Builder
+android.companion.AssociationRequest
+android.companion.CompanionDeviceManager
+android.companion.ICompanionDeviceManager
+android.companion.ICompanionDeviceManager$Stub
+android.companion.IFindDeviceCallback
android.content.AbstractThreadedSyncAdapter
android.content.AbstractThreadedSyncAdapter$ISyncAdapterImpl
android.content.AbstractThreadedSyncAdapter$SyncThread
@@ -812,14 +853,12 @@
android.content.ContentResolver
android.content.ContentResolver$1
android.content.ContentResolver$CursorWrapperInner
-android.content.ContentResolver$OpenResourceIdResult
android.content.ContentResolver$ParcelFileDescriptorInner
android.content.ContentUris
android.content.ContentValues
android.content.ContentValues$1
android.content.Context
android.content.ContextWrapper
-android.content.CursorEntityIterator
android.content.CursorLoader
android.content.DialogInterface
android.content.DialogInterface$OnCancelListener
@@ -828,9 +867,6 @@
android.content.DialogInterface$OnKeyListener
android.content.DialogInterface$OnMultiChoiceClickListener
android.content.DialogInterface$OnShowListener
-android.content.Entity
-android.content.Entity$NamedContentValues
-android.content.EntityIterator
android.content.IClipboard
android.content.IClipboard$Stub
android.content.IClipboard$Stub$Proxy
@@ -846,7 +882,6 @@
android.content.IIntentSender$Stub$Proxy
android.content.IOnPrimaryClipChangedListener
android.content.IOnPrimaryClipChangedListener$Stub
-android.content.IOnPrimaryClipChangedListener$Stub$Proxy
android.content.IRestrictionsManager
android.content.IRestrictionsManager$Stub
android.content.IRestrictionsManager$Stub$Proxy
@@ -862,17 +897,19 @@
android.content.Intent
android.content.Intent$1
android.content.Intent$FilterComparison
+android.content.Intent$ShortcutIconResource
+android.content.Intent$ShortcutIconResource$1
android.content.IntentFilter
android.content.IntentFilter$1
android.content.IntentFilter$AuthorityEntry
android.content.IntentFilter$MalformedMimeTypeException
android.content.IntentSender
+android.content.IntentSender$1
android.content.IntentSender$SendIntentException
android.content.Loader
android.content.Loader$ForceLoadContentObserver
android.content.Loader$OnLoadCanceledListener
android.content.Loader$OnLoadCompleteListener
-android.content.MutableContextWrapper
android.content.OperationApplicationException
android.content.PeriodicSync
android.content.PeriodicSync$1
@@ -908,16 +945,21 @@
android.content.UndoOperation
android.content.UndoOwner
android.content.UriMatcher
-android.content.UriPermission
+android.content.om.IOverlayManager
+android.content.om.IOverlayManager$Stub
+android.content.om.OverlayInfo
android.content.pm.ActivityInfo
android.content.pm.ActivityInfo$1
android.content.pm.ActivityInfo$WindowLayout
android.content.pm.ApplicationInfo
android.content.pm.ApplicationInfo$1
+android.content.pm.AuxiliaryResolveInfo
+android.content.pm.BaseParceledListSlice
+android.content.pm.BaseParceledListSlice$1
+android.content.pm.ChangedPackages
android.content.pm.ComponentInfo
android.content.pm.ConfigurationInfo
android.content.pm.ConfigurationInfo$1
-android.content.pm.EphemeralResponse
android.content.pm.FallbackCategoryProvider
android.content.pm.FeatureGroupInfo
android.content.pm.FeatureGroupInfo$1
@@ -935,9 +977,13 @@
android.content.pm.IOtaDexopt
android.content.pm.IOtaDexopt$Stub
android.content.pm.IPackageDataObserver
+android.content.pm.IPackageDataObserver$Stub
+android.content.pm.IPackageDataObserver$Stub$Proxy
android.content.pm.IPackageDeleteObserver
android.content.pm.IPackageDeleteObserver2
+android.content.pm.IPackageInstallObserver
android.content.pm.IPackageInstallObserver2
+android.content.pm.IPackageInstallObserver2$Stub
android.content.pm.IPackageInstaller
android.content.pm.IPackageInstaller$Stub
android.content.pm.IPackageInstaller$Stub$Proxy
@@ -945,6 +991,8 @@
android.content.pm.IPackageInstallerCallback$Stub
android.content.pm.IPackageInstallerCallback$Stub$Proxy
android.content.pm.IPackageInstallerSession
+android.content.pm.IPackageInstallerSession$Stub
+android.content.pm.IPackageInstallerSession$Stub$Proxy
android.content.pm.IPackageManager
android.content.pm.IPackageManager$Stub
android.content.pm.IPackageManager$Stub$Proxy
@@ -953,16 +1001,17 @@
android.content.pm.IPackageMoveObserver$Stub$Proxy
android.content.pm.IPackageStatsObserver
android.content.pm.IPackageStatsObserver$Stub
-android.content.pm.IPackageStatsObserver$Stub$Proxy
android.content.pm.IShortcutService
android.content.pm.IShortcutService$Stub
android.content.pm.IShortcutService$Stub$Proxy
+android.content.pm.InstantAppRequest
+android.content.pm.InstantAppResolveInfo$InstantAppDigest
+android.content.pm.InstantAppResolveInfo$InstantAppDigest$1
android.content.pm.InstrumentationInfo
android.content.pm.InstrumentationInfo$1
android.content.pm.IntentFilterVerificationInfo
android.content.pm.IntentFilterVerificationInfo$1
android.content.pm.KeySet
-android.content.pm.LabeledIntent
android.content.pm.LauncherActivityInfo
android.content.pm.LauncherApps
android.content.pm.LauncherApps$1
@@ -974,12 +1023,15 @@
android.content.pm.PackageInfo
android.content.pm.PackageInfo$1
android.content.pm.PackageInfoLite
+android.content.pm.PackageInfoLite$1
android.content.pm.PackageInstaller
android.content.pm.PackageInstaller$Session
android.content.pm.PackageInstaller$SessionCallback
android.content.pm.PackageInstaller$SessionCallbackDelegate
android.content.pm.PackageInstaller$SessionInfo
+android.content.pm.PackageInstaller$SessionInfo$1
android.content.pm.PackageInstaller$SessionParams
+android.content.pm.PackageInstaller$SessionParams$1
android.content.pm.PackageItemInfo
android.content.pm.PackageManager
android.content.pm.PackageManager$MoveCallback
@@ -994,6 +1046,8 @@
android.content.pm.PackageParser$Activity$1
android.content.pm.PackageParser$ActivityIntentInfo
android.content.pm.PackageParser$ApkLite
+android.content.pm.PackageParser$Callback
+android.content.pm.PackageParser$CallbackImpl
android.content.pm.PackageParser$Component
android.content.pm.PackageParser$IntentInfo
android.content.pm.PackageParser$NewPermissionInfo
@@ -1016,11 +1070,9 @@
android.content.pm.PackageParser$SplitNameComparator
android.content.pm.PackageParser$SplitPermissionInfo
android.content.pm.PackageStats
-android.content.pm.PackageStats$1
android.content.pm.PackageUserState
android.content.pm.ParceledListSlice
android.content.pm.ParceledListSlice$1
-android.content.pm.ParceledListSlice$2
android.content.pm.PathPermission
android.content.pm.PathPermission$1
android.content.pm.PermissionGroupInfo
@@ -1038,6 +1090,7 @@
android.content.pm.RegisteredServicesCacheListener
android.content.pm.ResolveInfo
android.content.pm.ResolveInfo$1
+android.content.pm.SELinuxUtil
android.content.pm.ServiceInfo
android.content.pm.ServiceInfo$1
android.content.pm.SharedLibraryInfo
@@ -1050,6 +1103,8 @@
android.content.pm.ShortcutServiceInternal$ShortcutChangeListener
android.content.pm.Signature
android.content.pm.Signature$1
+android.content.pm.StringParceledListSlice
+android.content.pm.StringParceledListSlice$1
android.content.pm.UserInfo
android.content.pm.UserInfo$1
android.content.pm.VerifierDeviceIdentity
@@ -1057,15 +1112,9 @@
android.content.pm.VersionedPackage
android.content.pm.VersionedPackage$1
android.content.pm.XmlSerializerAndParser
-android.content.pm.permission.IRuntimePermissionPresenter
-android.content.pm.permission.IRuntimePermissionPresenter$Stub
-android.content.pm.permission.IRuntimePermissionPresenter$Stub$Proxy
-android.content.pm.permission.RuntimePermissionPresentationInfo
-android.content.pm.permission.RuntimePermissionPresentationInfo$1
-android.content.pm.permission.RuntimePermissionPresenter
-android.content.pm.permission.RuntimePermissionPresenter$OnResultCallback
-android.content.pm.permission.RuntimePermissionPresenter$RemoteService
-android.content.pm.permission.RuntimePermissionPresenter$RemoteService$1
+android.content.pm.split.DefaultSplitAssetLoader
+android.content.pm.split.SplitAssetLoader
+android.content.pm.split.SplitDependencyLoader$IllegalDependencyException
android.content.res.AssetFileDescriptor
android.content.res.AssetFileDescriptor$1
android.content.res.AssetFileDescriptor$AutoCloseInputStream
@@ -1074,6 +1123,7 @@
android.content.res.ColorStateList
android.content.res.ColorStateList$1
android.content.res.ColorStateList$ColorStateListFactory
+android.content.res.CompatResources
android.content.res.CompatibilityInfo
android.content.res.CompatibilityInfo$1
android.content.res.CompatibilityInfo$2
@@ -1139,9 +1189,9 @@
android.database.MergeCursor$1
android.database.Observable
android.database.SQLException
+android.database.StaleDataException
android.database.sqlite.DatabaseObjectNotClosedException
android.database.sqlite.SQLiteAbortException
-android.database.sqlite.SQLiteAccessPermException
android.database.sqlite.SQLiteCantOpenDatabaseException
android.database.sqlite.SQLiteClosable
android.database.sqlite.SQLiteConnection
@@ -1150,7 +1200,6 @@
android.database.sqlite.SQLiteConnection$PreparedStatement
android.database.sqlite.SQLiteConnection$PreparedStatementCache
android.database.sqlite.SQLiteConnectionPool
-android.database.sqlite.SQLiteConnectionPool$1
android.database.sqlite.SQLiteConnectionPool$AcquiredConnectionStatus
android.database.sqlite.SQLiteConnectionPool$ConnectionWaiter
android.database.sqlite.SQLiteConstraintException
@@ -1193,17 +1242,17 @@
android.ddm.DdmHandleThread
android.ddm.DdmHandleViewDebug
android.ddm.DdmRegister
-android.drm.DrmErrorEvent
-android.drm.DrmEvent
-android.drm.DrmInfoEvent
-android.drm.DrmManagerClient
-android.drm.DrmManagerClient$EventHandler
-android.drm.DrmManagerClient$InfoHandler
android.drm.DrmManagerClient$OnErrorListener
android.drm.DrmManagerClient$OnEventListener
android.drm.DrmManagerClient$OnInfoListener
android.drm.DrmOutputStream
-android.drm.DrmSupportInfo
+android.graphics.-$Lambda$ZrP-zejiEXAqfwV-MyP5lE9mYC8
+android.graphics.-$Lambda$ZrP-zejiEXAqfwV-MyP5lE9mYC8$1
+android.graphics.-$Lambda$ZrP-zejiEXAqfwV-MyP5lE9mYC8$2
+android.graphics.-$Lambda$ZrP-zejiEXAqfwV-MyP5lE9mYC8$4
+android.graphics.-$Lambda$ZrP-zejiEXAqfwV-MyP5lE9mYC8$6
+android.graphics.-$Lambda$ZrP-zejiEXAqfwV-MyP5lE9mYC8$7
+android.graphics.-$Lambda$ZrP-zejiEXAqfwV-MyP5lE9mYC8$8
android.graphics.BaseCanvas
android.graphics.Bitmap
android.graphics.Bitmap$1
@@ -1224,6 +1273,14 @@
android.graphics.ColorFilter
android.graphics.ColorMatrix
android.graphics.ColorMatrixColorFilter
+android.graphics.ColorSpace
+android.graphics.ColorSpace$Adaptation
+android.graphics.ColorSpace$Lab
+android.graphics.ColorSpace$Model
+android.graphics.ColorSpace$Named
+android.graphics.ColorSpace$Rgb
+android.graphics.ColorSpace$Rgb$TransferParameters
+android.graphics.ColorSpace$Xyz
android.graphics.ComposePathEffect
android.graphics.ComposeShader
android.graphics.CornerPathEffect
@@ -1297,13 +1354,15 @@
android.graphics.TableMaskFilter
android.graphics.TemporaryBuffer
android.graphics.Typeface
+android.graphics.Typeface$Builder
android.graphics.Xfermode
android.graphics.YuvImage
+android.graphics.drawable.AdaptiveIconDrawable
+android.graphics.drawable.AdaptiveIconDrawable$ChildDrawable
+android.graphics.drawable.AdaptiveIconDrawable$LayerState
android.graphics.drawable.Animatable
android.graphics.drawable.Animatable2
-android.graphics.drawable.AnimatedRotateDrawable
-android.graphics.drawable.AnimatedRotateDrawable$1
-android.graphics.drawable.AnimatedRotateDrawable$AnimatedRotateState
+android.graphics.drawable.Animatable2$AnimationCallback
android.graphics.drawable.AnimatedStateListDrawable
android.graphics.drawable.AnimatedStateListDrawable$AnimatedStateListState
android.graphics.drawable.AnimatedStateListDrawable$AnimatedVectorDrawableTransition
@@ -1312,6 +1371,7 @@
android.graphics.drawable.AnimatedStateListDrawable$Transition
android.graphics.drawable.AnimatedVectorDrawable
android.graphics.drawable.AnimatedVectorDrawable$1
+android.graphics.drawable.AnimatedVectorDrawable$2
android.graphics.drawable.AnimatedVectorDrawable$AnimatedVectorDrawableState
android.graphics.drawable.AnimatedVectorDrawable$AnimatedVectorDrawableState$PendingAnimator
android.graphics.drawable.AnimatedVectorDrawable$VectorDrawableAnimator
@@ -1342,11 +1402,10 @@
android.graphics.drawable.Icon$1
android.graphics.drawable.InsetDrawable
android.graphics.drawable.InsetDrawable$InsetState
+android.graphics.drawable.InsetDrawable$InsetValue
android.graphics.drawable.LayerDrawable
android.graphics.drawable.LayerDrawable$ChildDrawable
android.graphics.drawable.LayerDrawable$LayerState
-android.graphics.drawable.LevelListDrawable
-android.graphics.drawable.LevelListDrawable$LevelListState
android.graphics.drawable.NinePatchDrawable
android.graphics.drawable.NinePatchDrawable$NinePatchState
android.graphics.drawable.PaintDrawable
@@ -1407,23 +1466,14 @@
android.graphics.drawable.shapes.RectShape
android.graphics.drawable.shapes.RoundRectShape
android.graphics.drawable.shapes.Shape
+android.graphics.fonts.FontVariationAxis
android.graphics.pdf.PdfDocument
android.graphics.pdf.PdfEditor
android.graphics.pdf.PdfRenderer
android.hardware.Camera
-android.hardware.Camera$AutoFocusCallback
-android.hardware.Camera$AutoFocusMoveCallback
android.hardware.Camera$CameraInfo
android.hardware.Camera$ErrorCallback
-android.hardware.Camera$EventHandler
android.hardware.Camera$Face
-android.hardware.Camera$FaceDetectionListener
-android.hardware.Camera$OnZoomChangeListener
-android.hardware.Camera$Parameters
-android.hardware.Camera$PictureCallback
-android.hardware.Camera$PreviewCallback
-android.hardware.Camera$ShutterCallback
-android.hardware.Camera$Size
android.hardware.CameraStatus
android.hardware.CameraStatus$1
android.hardware.ConsumerIrManager
@@ -1443,6 +1493,7 @@
android.hardware.ISerialManager
android.hardware.ISerialManager$Stub
android.hardware.Sensor
+android.hardware.SensorAdditionalInfo
android.hardware.SensorEvent
android.hardware.SensorEventListener
android.hardware.SensorManager
@@ -1474,7 +1525,6 @@
android.hardware.camera2.CameraManager$CameraManagerGlobal$2
android.hardware.camera2.CameraManager$CameraManagerGlobal$3
android.hardware.camera2.CameraManager$CameraManagerGlobal$4
-android.hardware.camera2.CameraManager$CameraManagerGlobal$5
android.hardware.camera2.CameraManager$TorchCallback
android.hardware.camera2.CameraMetadata
android.hardware.camera2.CaptureFailure
@@ -1515,7 +1565,6 @@
android.hardware.camera2.impl.CameraDeviceImpl
android.hardware.camera2.impl.CameraDeviceImpl$1
android.hardware.camera2.impl.CameraDeviceImpl$10
-android.hardware.camera2.impl.CameraDeviceImpl$11
android.hardware.camera2.impl.CameraDeviceImpl$2
android.hardware.camera2.impl.CameraDeviceImpl$3
android.hardware.camera2.impl.CameraDeviceImpl$4
@@ -1527,7 +1576,6 @@
android.hardware.camera2.impl.CameraDeviceImpl$CameraDeviceCallbacks$2
android.hardware.camera2.impl.CameraDeviceImpl$CameraDeviceCallbacks$3
android.hardware.camera2.impl.CameraDeviceImpl$CameraDeviceCallbacks$4
-android.hardware.camera2.impl.CameraDeviceImpl$CameraDeviceCallbacks$6
android.hardware.camera2.impl.CameraDeviceImpl$CaptureCallback
android.hardware.camera2.impl.CameraDeviceImpl$CaptureCallbackHolder
android.hardware.camera2.impl.CameraDeviceImpl$FrameNumberTracker
@@ -1762,18 +1810,44 @@
android.hardware.radio.V1_0.Call
android.hardware.radio.V1_0.CardStatus
android.hardware.radio.V1_0.CdmaSignalStrength
+android.hardware.radio.V1_0.CellIdentity
+android.hardware.radio.V1_0.CellIdentityCdma
+android.hardware.radio.V1_0.CellIdentityGsm
+android.hardware.radio.V1_0.CellIdentityLte
+android.hardware.radio.V1_0.CellIdentityTdscdma
+android.hardware.radio.V1_0.CellIdentityWcdma
+android.hardware.radio.V1_0.CellInfo
+android.hardware.radio.V1_0.CellInfoCdma
+android.hardware.radio.V1_0.CellInfoGsm
+android.hardware.radio.V1_0.CellInfoLte
+android.hardware.radio.V1_0.CellInfoTdscdma
+android.hardware.radio.V1_0.CellInfoType
+android.hardware.radio.V1_0.CellInfoWcdma
+android.hardware.radio.V1_0.DataRegStateResult
android.hardware.radio.V1_0.EvdoSignalStrength
android.hardware.radio.V1_0.GsmSignalStrength
+android.hardware.radio.V1_0.HardwareConfig
android.hardware.radio.V1_0.IRadio
android.hardware.radio.V1_0.IRadio$Proxy
android.hardware.radio.V1_0.IRadioIndication
android.hardware.radio.V1_0.IRadioIndication$Stub
android.hardware.radio.V1_0.IRadioResponse
android.hardware.radio.V1_0.IRadioResponse$Stub
+android.hardware.radio.V1_0.LceStatusInfo
android.hardware.radio.V1_0.LteSignalStrength
+android.hardware.radio.V1_0.RadioCapability
android.hardware.radio.V1_0.RadioResponseInfo
+android.hardware.radio.V1_0.RegState
android.hardware.radio.V1_0.SignalStrength
android.hardware.radio.V1_0.TdScdmaSignalStrength
+android.hardware.radio.V1_0.VoiceRegStateResult
+android.hardware.radio.V1_0.WcdmaSignalStrength
+android.hardware.radio.deprecated.V1_0.IOemHook
+android.hardware.radio.deprecated.V1_0.IOemHook$Proxy
+android.hardware.radio.deprecated.V1_0.IOemHookIndication
+android.hardware.radio.deprecated.V1_0.IOemHookIndication$Stub
+android.hardware.radio.deprecated.V1_0.IOemHookResponse
+android.hardware.radio.deprecated.V1_0.IOemHookResponse$Stub
android.hardware.soundtrigger.IRecognitionStatusCallback
android.hardware.soundtrigger.IRecognitionStatusCallback$Stub
android.hardware.soundtrigger.KeyphraseEnrollmentInfo
@@ -1815,22 +1889,23 @@
android.hardware.usb.UsbPortStatus
android.hardware.usb.UsbPortStatus$1
android.hardware.usb.UsbRequest
+android.hidl.base.V1_0.DebugInfo
android.hidl.base.V1_0.IBase
+android.hidl.manager.V1_0.IServiceManager
+android.hidl.manager.V1_0.IServiceManager$Proxy
+android.hidl.manager.V1_0.IServiceNotification
+android.hidl.manager.V1_0.IServiceNotification$Stub
android.icu.impl.BMPSet
android.icu.impl.CacheBase
android.icu.impl.CacheValue
android.icu.impl.CacheValue$NullValue
android.icu.impl.CacheValue$SoftValue
android.icu.impl.CacheValue$Strength
-android.icu.impl.CalendarAstronomer
-android.icu.impl.CalendarAstronomer$2
-android.icu.impl.CalendarAstronomer$CoordFunc
-android.icu.impl.CalendarAstronomer$Equatorial
-android.icu.impl.CalendarAstronomer$MoonAge
-android.icu.impl.CalendarAstronomer$SolarLongitude
android.icu.impl.CalendarUtil
android.icu.impl.CalendarUtil$CalendarPreferences
-android.icu.impl.CaseMap$StringContextIterator
+android.icu.impl.CaseMapImpl
+android.icu.impl.CaseMapImpl$GreekUpper
+android.icu.impl.CaseMapImpl$StringContextIterator
android.icu.impl.CharTrie
android.icu.impl.CharacterIteration
android.icu.impl.ClassLoaderUtil
@@ -1909,7 +1984,6 @@
android.icu.impl.JavaTimeZone
android.icu.impl.LocaleDisplayNamesImpl
android.icu.impl.LocaleDisplayNamesImpl$Cache
-android.icu.impl.LocaleDisplayNamesImpl$CapitalizationContextSink
android.icu.impl.LocaleDisplayNamesImpl$CapitalizationContextUsage
android.icu.impl.LocaleDisplayNamesImpl$DataTable
android.icu.impl.LocaleDisplayNamesImpl$DataTables
@@ -2056,6 +2130,8 @@
android.icu.text.BreakIteratorFactory
android.icu.text.BreakIteratorFactory$BFService
android.icu.text.BreakIteratorFactory$BFService$1RBBreakIteratorFactory
+android.icu.text.CaseMap
+android.icu.text.CaseMap$Upper
android.icu.text.CollationKey
android.icu.text.Collator
android.icu.text.Collator$ServiceShim
@@ -2066,6 +2142,7 @@
android.icu.text.CurrencyMetaInfo
android.icu.text.CurrencyMetaInfo$CurrencyDigits
android.icu.text.CurrencyMetaInfo$CurrencyFilter
+android.icu.text.CurrencyPluralInfo
android.icu.text.DateFormat
android.icu.text.DateFormat$BooleanAttribute
android.icu.text.DateFormat$Field
@@ -2103,14 +2180,17 @@
android.icu.text.DigitList
android.icu.text.DisplayContext
android.icu.text.DisplayContext$Type
+android.icu.text.Edits
android.icu.text.IDNA
android.icu.text.LanguageBreakEngine
-android.icu.text.ListFormatter
-android.icu.text.ListFormatter$Cache
-android.icu.text.ListFormatter$FormattedListBuilder
android.icu.text.ListFormatter$Style
android.icu.text.LocaleDisplayNames
android.icu.text.LocaleDisplayNames$DialectHandling
+android.icu.text.MeasureFormat
+android.icu.text.MeasureFormat$FormatWidth
+android.icu.text.MeasureFormat$ImmutableNumberFormat
+android.icu.text.MeasureFormat$MeasureFormatData
+android.icu.text.MeasureFormat$UnitDataSink
android.icu.text.Normalizer
android.icu.text.Normalizer$FCDMode
android.icu.text.Normalizer$Mode
@@ -2118,7 +2198,6 @@
android.icu.text.Normalizer$NFCMode
android.icu.text.Normalizer$NFCModeImpl
android.icu.text.Normalizer$NFDMode
-android.icu.text.Normalizer$NFDModeImpl
android.icu.text.Normalizer$NFKCMode
android.icu.text.Normalizer$NFKDMode
android.icu.text.Normalizer$NFKDModeImpl
@@ -2212,7 +2291,6 @@
android.icu.util.CharsTrie
android.icu.util.CharsTrie$Entry
android.icu.util.CharsTrie$Iterator
-android.icu.util.ChineseCalendar
android.icu.util.Currency
android.icu.util.Currency$1
android.icu.util.Currency$CurrencyUsage
@@ -2220,11 +2298,8 @@
android.icu.util.CurrencyAmount
android.icu.util.Freezable
android.icu.util.GregorianCalendar
-android.icu.util.HebrewCalendar
android.icu.util.ICUException
-android.icu.util.IndianCalendar
-android.icu.util.IslamicCalendar
-android.icu.util.IslamicCalendar$CalculationType
+android.icu.util.ICUUncheckedIOException
android.icu.util.LocaleData
android.icu.util.Measure
android.icu.util.MeasureUnit
@@ -2263,9 +2338,10 @@
android.inputmethodservice.InputMethodService$Insets
android.inputmethodservice.InputMethodService$SettingsObserver
android.inputmethodservice.SoftInputWindow
-android.inputmethodservice.SoftInputWindow$Callback
android.location.Address
android.location.Address$1
+android.location.BatchedLocationCallbackTransport
+android.location.BatchedLocationCallbackTransport$CallbackTransport
android.location.Country
android.location.Country$1
android.location.CountryDetector
@@ -2273,6 +2349,7 @@
android.location.CountryDetector$ListenerTransport$1
android.location.CountryListener
android.location.Criteria
+android.location.Criteria$1
android.location.Geocoder
android.location.GeocoderParams
android.location.GeocoderParams$1
@@ -2288,6 +2365,8 @@
android.location.GpsStatus$1
android.location.GpsStatus$Listener
android.location.GpsStatus$SatelliteIterator
+android.location.IBatchedLocationCallback
+android.location.IBatchedLocationCallback$Stub
android.location.ICountryDetector
android.location.ICountryDetector$Stub
android.location.ICountryDetector$Stub$Proxy
@@ -2346,6 +2425,8 @@
android.media.AudioDevicePortConfig
android.media.AudioFocusInfo
android.media.AudioFocusInfo$1
+android.media.AudioFocusRequest
+android.media.AudioFocusRequest$Builder
android.media.AudioFormat
android.media.AudioFormat$1
android.media.AudioFormat$Builder
@@ -2356,6 +2437,7 @@
android.media.AudioManager$1
android.media.AudioManager$2
android.media.AudioManager$3
+android.media.AudioManager$FocusRequestInfo
android.media.AudioManager$NativeEventHandlerDelegate
android.media.AudioManager$NativeEventHandlerDelegate$1
android.media.AudioManager$OnAmPortUpdateListener
@@ -2377,8 +2459,6 @@
android.media.AudioPortEventHandler
android.media.AudioPortEventHandler$1
android.media.AudioRecord
-android.media.AudioRecordingConfiguration
-android.media.AudioRecordingConfiguration$1
android.media.AudioRoutesInfo
android.media.AudioRoutesInfo$1
android.media.AudioRouting
@@ -2392,8 +2472,6 @@
android.media.BufferingParams$1
android.media.CamcorderProfile
android.media.CameraProfile
-android.media.Cea708CaptionRenderer
-android.media.ClosedCaptionRenderer
android.media.DecoderCapabilities
android.media.DeniedByServerException
android.media.EncoderCapabilities
@@ -2422,10 +2500,6 @@
android.media.IMediaRouterService
android.media.IMediaRouterService$Stub
android.media.IMediaRouterService$Stub$Proxy
-android.media.IMediaScannerListener
-android.media.IMediaScannerListener$Stub
-android.media.IMediaScannerService
-android.media.IMediaScannerService$Stub
android.media.IPlaybackConfigDispatcher
android.media.IPlaybackConfigDispatcher$Stub
android.media.IPlayer
@@ -2477,15 +2551,17 @@
android.media.MediaCodecInfo$VideoCapabilities
android.media.MediaCodecList
android.media.MediaCrypto
+android.media.MediaCryptoException
+android.media.MediaDescrambler
android.media.MediaDescription
android.media.MediaDescription$1
android.media.MediaDescription$Builder
android.media.MediaDrm
android.media.MediaDrm$Certificate
-android.media.MediaDrm$CryptoSession
android.media.MediaDrm$EventHandler
android.media.MediaDrm$KeyRequest
android.media.MediaDrm$MediaDrmStateException
+android.media.MediaDrm$OnEventListener
android.media.MediaDrm$ProvisionRequest
android.media.MediaDrmException
android.media.MediaExtractor
@@ -2497,23 +2573,20 @@
android.media.MediaMetadata
android.media.MediaMetadata$1
android.media.MediaMetadata$Builder
-android.media.MediaMetadataEditor
android.media.MediaMetadataRetriever
android.media.MediaMuxer
android.media.MediaPlayer
android.media.MediaPlayer$1
android.media.MediaPlayer$2
-android.media.MediaPlayer$3
-android.media.MediaPlayer$3$1
+android.media.MediaPlayer$4
+android.media.MediaPlayer$4$1
android.media.MediaPlayer$EventHandler
-android.media.MediaPlayer$OnBufferingUpdateListener
android.media.MediaPlayer$OnCompletionListener
android.media.MediaPlayer$OnErrorListener
android.media.MediaPlayer$OnInfoListener
android.media.MediaPlayer$OnPreparedListener
android.media.MediaPlayer$OnSeekCompleteListener
android.media.MediaPlayer$OnSubtitleDataListener
-android.media.MediaPlayer$OnVideoSizeChangedListener
android.media.MediaPlayer$TimeProvider
android.media.MediaPlayer$TimeProvider$EventHandler
android.media.MediaPlayer$TrackInfo
@@ -2521,7 +2594,6 @@
android.media.MediaRecorder
android.media.MediaRecorder$EventHandler
android.media.MediaRecorder$OnErrorListener
-android.media.MediaRecorder$OnInfoListener
android.media.MediaRouter
android.media.MediaRouter$Callback
android.media.MediaRouter$CallbackInfo
@@ -2534,9 +2606,7 @@
android.media.MediaRouter$Static$1
android.media.MediaRouter$Static$Client
android.media.MediaRouter$Static$Client$1
-android.media.MediaRouter$UserRouteInfo
android.media.MediaRouter$VolumeCallback
-android.media.MediaRouter$VolumeCallbackInfo
android.media.MediaRouter$VolumeChangeReceiver
android.media.MediaRouter$WifiDisplayStatusChangedReceiver
android.media.MediaRouterClientState
@@ -2544,38 +2614,25 @@
android.media.MediaRouterClientState$RouteInfo
android.media.MediaRouterClientState$RouteInfo$1
android.media.MediaScanner
-android.media.MediaScanner$FileEntry
-android.media.MediaScanner$MediaBulkDeleter
-android.media.MediaScanner$MyMediaScannerClient
-android.media.MediaScannerClient
android.media.MediaScannerConnection
-android.media.MediaScannerConnection$1
-android.media.MediaScannerConnection$ClientProxy
-android.media.MediaScannerConnection$MediaScannerConnectionClient
android.media.MediaScannerConnection$OnScanCompletedListener
android.media.MediaSync
android.media.MediaTimeProvider
android.media.MediaTimeProvider$OnMediaTimeListener
-android.media.Metadata
android.media.MiniThumbFile
android.media.NotProvisionedException
android.media.PlaybackParams
android.media.PlaybackParams$1
android.media.PlayerBase
-android.media.PlayerBase$1
-android.media.PlayerBase$2
+android.media.PlayerBase$IAppOpsCallbackWrapper
+android.media.PlayerBase$IPlayerWrapper
android.media.PlayerBase$PlayerIdCard
android.media.PlayerBase$PlayerIdCard$1
+android.media.PlayerProxy
android.media.Rating
android.media.Rating$1
-android.media.RemoteControlClient
-android.media.RemoteControlClient$MetadataEditor
-android.media.RemoteControlClient$OnMetadataUpdateListener
android.media.RemoteDisplay
android.media.ResampleInputStream
-android.media.Ringtone
-android.media.Ringtone$MyOnCompletionListener
-android.media.RingtoneManager
android.media.SoundPool
android.media.SoundPool$Builder
android.media.SoundPool$EventHandler
@@ -2585,32 +2642,32 @@
android.media.SubtitleController$2
android.media.SubtitleController$Anchor
android.media.SubtitleController$Listener
-android.media.SubtitleController$Renderer
android.media.SubtitleTrack
android.media.SyncParams
android.media.ThumbnailUtils
android.media.ThumbnailUtils$SizedThumbnailBitmap
android.media.ToneGenerator
-android.media.TtmlRenderer
+android.media.UnsupportedSchemeException
android.media.Utils
android.media.Utils$1
android.media.Utils$2
+android.media.VolumeAutomation
android.media.VolumePolicy
android.media.VolumePolicy$1
-android.media.VolumeProvider
-android.media.WebVttRenderer
+android.media.VolumeShaper
+android.media.VolumeShaper$Configuration
+android.media.VolumeShaper$Configuration$1
+android.media.VolumeShaper$Configuration$Builder
+android.media.VolumeShaper$Operation
+android.media.VolumeShaper$Operation$1
+android.media.VolumeShaper$Operation$Builder
+android.media.VolumeShaper$State
+android.media.VolumeShaper$State$1
android.media.audiofx.AudioEffect
android.media.audiofx.AudioEffect$Descriptor
-android.media.audiofx.BassBoost
-android.media.audiofx.BassBoost$Settings
-android.media.audiofx.Equalizer
android.media.audiofx.LoudnessEnhancer
-android.media.audiofx.NoiseSuppressor
-android.media.audiofx.PresetReverb
android.media.audiofx.Virtualizer
-android.media.audiofx.Virtualizer$Settings
android.media.audiofx.Visualizer
-android.media.audiofx.Visualizer$OnDataCaptureListener
android.media.audiopolicy.AudioMix
android.media.audiopolicy.AudioMixingRule
android.media.audiopolicy.AudioMixingRule$AudioMixMatchCriterion
@@ -2618,9 +2675,10 @@
android.media.audiopolicy.IAudioPolicyCallback
android.media.audiopolicy.IAudioPolicyCallback$Stub
android.media.browse.MediaBrowser
-android.media.browse.MediaBrowser$10
+android.media.browse.MediaBrowser$1
+android.media.browse.MediaBrowser$2
+android.media.browse.MediaBrowser$6
android.media.browse.MediaBrowser$ConnectionCallback
-android.media.browse.MediaBrowser$MediaItem
android.media.browse.MediaBrowser$MediaServiceConnection
android.media.browse.MediaBrowser$MediaServiceConnection$1
android.media.browse.MediaBrowser$ServiceCallbacks
@@ -2646,6 +2704,9 @@
android.media.session.IActiveSessionsListener
android.media.session.IActiveSessionsListener$Stub
android.media.session.IActiveSessionsListener$Stub$Proxy
+android.media.session.ICallback
+android.media.session.ICallback$Stub
+android.media.session.ICallback$Stub$Proxy
android.media.session.IOnMediaKeyListener
android.media.session.IOnVolumeKeyLongPressListener
android.media.session.ISession
@@ -2677,8 +2738,11 @@
android.media.session.MediaSession$QueueItem$1
android.media.session.MediaSession$Token
android.media.session.MediaSession$Token$1
-android.media.session.MediaSessionLegacyHelper
android.media.session.MediaSessionManager
+android.media.session.MediaSessionManager$Callback
+android.media.session.MediaSessionManager$CallbackImpl
+android.media.session.MediaSessionManager$CallbackImpl$3
+android.media.session.MediaSessionManager$CallbackImpl$4
android.media.session.MediaSessionManager$OnActiveSessionsChangedListener
android.media.session.MediaSessionManager$SessionsChangedWrapper
android.media.session.MediaSessionManager$SessionsChangedWrapper$1
@@ -2711,11 +2775,9 @@
android.net.ConnectivityManager$CallbackHandler
android.net.ConnectivityManager$NetworkCallback
android.net.ConnectivityManager$OnNetworkActiveListener
-android.net.ConnectivityManager$PacketKeepalive
android.net.ConnectivityManager$PacketKeepaliveCallback
android.net.ConnectivityMetricsEvent
android.net.ConnectivityMetricsEvent$1
-android.net.ConnectivityMetricsEvent$Reference
android.net.ConnectivityThread
android.net.ConnectivityThread$Singleton
android.net.Credentials
@@ -2731,14 +2793,14 @@
android.net.IConnectivityManager
android.net.IConnectivityManager$Stub
android.net.IConnectivityManager$Stub$Proxy
-android.net.IConnectivityMetricsLogger
-android.net.IConnectivityMetricsLogger$Stub
android.net.IEthernetManager
android.net.IEthernetManager$Stub
android.net.IEthernetServiceListener
android.net.IEthernetServiceListener$Stub
android.net.IIpConnectivityMetrics
android.net.IIpConnectivityMetrics$Stub
+android.net.IIpSecService
+android.net.IIpSecService$Stub
android.net.INetd
android.net.INetd$Stub
android.net.INetd$Stub$Proxy
@@ -2751,6 +2813,9 @@
android.net.INetworkPolicyManager
android.net.INetworkPolicyManager$Stub
android.net.INetworkPolicyManager$Stub$Proxy
+android.net.INetworkRecommendationProvider
+android.net.INetworkRecommendationProvider$Stub
+android.net.INetworkRecommendationProvider$Stub$Proxy
android.net.INetworkScoreCache
android.net.INetworkScoreCache$Stub
android.net.INetworkScoreCache$Stub$Proxy
@@ -2761,8 +2826,6 @@
android.net.INetworkStatsService$Stub
android.net.INetworkStatsService$Stub$Proxy
android.net.INetworkStatsSession
-android.net.INetworkStatsSession$Stub
-android.net.INetworkStatsSession$Stub$Proxy
android.net.InterfaceConfiguration
android.net.InterfaceConfiguration$1
android.net.IpConfiguration
@@ -2771,6 +2834,8 @@
android.net.IpConfiguration$ProxySettings
android.net.IpPrefix
android.net.IpPrefix$1
+android.net.IpSecConfig
+android.net.IpSecManager
android.net.LinkAddress
android.net.LinkAddress$1
android.net.LinkProperties
@@ -2784,12 +2849,13 @@
android.net.LocalSocketImpl
android.net.LocalSocketImpl$SocketInputStream
android.net.LocalSocketImpl$SocketOutputStream
+android.net.MatchAllNetworkSpecifier
+android.net.MatchAllNetworkSpecifier$1
android.net.Network
android.net.Network$1
android.net.Network$2
android.net.Network$NetworkBoundSocketFactory
android.net.NetworkAgent
-android.net.NetworkBadging
android.net.NetworkCapabilities
android.net.NetworkCapabilities$1
android.net.NetworkConfig
@@ -2808,12 +2874,17 @@
android.net.NetworkPolicy$1
android.net.NetworkPolicyManager
android.net.NetworkQuotaInfo
+android.net.NetworkRecommendationProvider
+android.net.NetworkRecommendationProvider$ServiceWrapper
+android.net.NetworkRecommendationProvider$ServiceWrapper$1
android.net.NetworkRequest
android.net.NetworkRequest$1
android.net.NetworkRequest$Builder
android.net.NetworkRequest$Type
android.net.NetworkScoreManager
-android.net.NetworkScorerAppManager
+android.net.NetworkScorerAppData
+android.net.NetworkScorerAppData$1
+android.net.NetworkSpecifier
android.net.NetworkState
android.net.NetworkState$1
android.net.NetworkStats
@@ -2824,7 +2895,6 @@
android.net.NetworkStatsHistory$1
android.net.NetworkStatsHistory$DataStreamUtils
android.net.NetworkStatsHistory$Entry
-android.net.NetworkStatsHistory$ParcelUtils
android.net.NetworkTemplate
android.net.NetworkTemplate$1
android.net.NetworkUtils
@@ -2832,8 +2902,6 @@
android.net.Proxy
android.net.ProxyInfo
android.net.ProxyInfo$1
-android.net.RecommendationRequest
-android.net.RecommendationResult
android.net.RouteInfo
android.net.RouteInfo$1
android.net.RssiCurve
@@ -2846,6 +2914,8 @@
android.net.SntpClient
android.net.StaticIpConfiguration
android.net.StaticIpConfiguration$1
+android.net.StringNetworkSpecifier
+android.net.StringNetworkSpecifier$1
android.net.TrafficStats
android.net.UidRange
android.net.Uri
@@ -2861,8 +2931,6 @@
android.net.Uri$PathSegments
android.net.Uri$PathSegmentsBuilder
android.net.Uri$StringUri
-android.net.UrlQuerySanitizer
-android.net.VpnService
android.net.WebAddress
android.net.WifiKey
android.net.WifiKey$1
@@ -2873,17 +2941,17 @@
android.net.http.AndroidHttpClient$LoggingConfiguration
android.net.http.HttpResponseCache
android.net.http.SslCertificate
-android.net.http.SslError
android.net.http.X509TrustManagerExtensions
android.net.metrics.ApfProgramEvent
android.net.metrics.ApfProgramEvent$1
+android.net.metrics.ApfStats
+android.net.metrics.ApfStats$1
android.net.metrics.ConnectStats
android.net.metrics.DefaultNetworkEvent
android.net.metrics.DefaultNetworkEvent$1
android.net.metrics.DhcpClientEvent
android.net.metrics.DhcpClientEvent$1
android.net.metrics.DnsEvent
-android.net.metrics.DnsEvent$1
android.net.metrics.IpConnectivityLog
android.net.metrics.IpManagerEvent
android.net.metrics.IpManagerEvent$1
@@ -2903,7 +2971,6 @@
android.net.sip.SipManager
android.net.wifi.IRttManager
android.net.wifi.IRttManager$Stub
-android.net.wifi.IRttManager$Stub$Proxy
android.net.wifi.IWifiManager
android.net.wifi.IWifiManager$Stub
android.net.wifi.IWifiManager$Stub$Proxy
@@ -2911,12 +2978,10 @@
android.net.wifi.IWifiScanner$Stub
android.net.wifi.IWifiScanner$Stub$Proxy
android.net.wifi.ParcelUtil
-android.net.wifi.RssiPacketCountInfo
android.net.wifi.RttManager
android.net.wifi.RttManager$RttCapabilities
android.net.wifi.RttManager$RttListener
android.net.wifi.RttManager$RttResult
-android.net.wifi.RttManager$ServiceHandler
android.net.wifi.ScanResult
android.net.wifi.ScanResult$1
android.net.wifi.ScanResult$InformationElement
@@ -2925,15 +2990,10 @@
android.net.wifi.SupplicantState$1
android.net.wifi.WifiActivityEnergyInfo
android.net.wifi.WifiActivityEnergyInfo$1
-android.net.wifi.WifiChannel
android.net.wifi.WifiConfiguration
android.net.wifi.WifiConfiguration$1
-android.net.wifi.WifiConfiguration$AuthAlgorithm
-android.net.wifi.WifiConfiguration$GroupCipher
android.net.wifi.WifiConfiguration$KeyMgmt
android.net.wifi.WifiConfiguration$NetworkSelectionStatus
-android.net.wifi.WifiConfiguration$PairwiseCipher
-android.net.wifi.WifiConfiguration$Protocol
android.net.wifi.WifiConfiguration$Visibility
android.net.wifi.WifiConnectionStatistics
android.net.wifi.WifiConnectionStatistics$1
@@ -2949,6 +3009,7 @@
android.net.wifi.WifiManager$WifiLock
android.net.wifi.WifiNetworkScoreCache
android.net.wifi.WifiNetworkScoreCache$CacheListener
+android.net.wifi.WifiNetworkScoreCache$CacheListener$1
android.net.wifi.WifiScanner
android.net.wifi.WifiScanner$ActionListener
android.net.wifi.WifiScanner$ChannelSpec
@@ -2966,7 +3027,6 @@
android.net.wifi.WifiScanner$ServiceHandler
android.net.wifi.WifiSsid
android.net.wifi.WifiSsid$1
-android.net.wifi.WifiWakeReasonAndCounts
android.net.wifi.WpsInfo
android.net.wifi.WpsInfo$1
android.net.wifi.aware.WifiAwareManager
@@ -2988,12 +3048,9 @@
android.net.wifi.p2p.WifiP2pInfo
android.net.wifi.p2p.WifiP2pInfo$1
android.net.wifi.p2p.WifiP2pManager
-android.net.wifi.p2p.WifiP2pManager$PeerListListener
-android.net.wifi.p2p.WifiP2pManager$PersistentGroupInfoListener
android.net.wifi.p2p.WifiP2pWfdInfo
android.net.wifi.p2p.WifiP2pWfdInfo$1
android.nfc.BeamShareData
-android.nfc.ErrorCodes
android.nfc.FormatException
android.nfc.IAppCallback
android.nfc.IAppCallback$Stub
@@ -3014,7 +3071,6 @@
android.nfc.INfcUnlockHandler
android.nfc.ITagRemovedCallback
android.nfc.NdefMessage
-android.nfc.NdefRecord
android.nfc.NfcActivityManager
android.nfc.NfcActivityManager$NfcActivityState
android.nfc.NfcActivityManager$NfcApplicationState
@@ -3035,13 +3091,6 @@
android.nfc.cardemulation.CardEmulation
android.nfc.cardemulation.HostApduService
android.nfc.cardemulation.HostApduService$MsgHandler
-android.nfc.cardemulation.NfcFCardEmulation
-android.nfc.cardemulation.NfcFServiceInfo
-android.nfc.tech.BasicTagTechnology
-android.nfc.tech.MifareClassic
-android.nfc.tech.Ndef
-android.nfc.tech.NfcBarcode
-android.nfc.tech.TagTechnology
android.opengl.EGL14
android.opengl.EGLConfig
android.opengl.EGLContext
@@ -3050,7 +3099,6 @@
android.opengl.EGLObjectHandle
android.opengl.EGLSurface
android.opengl.ETC1
-android.opengl.ETC1Util
android.opengl.GLES10
android.opengl.GLES10Ext
android.opengl.GLES11
@@ -3060,29 +3108,13 @@
android.opengl.GLES31
android.opengl.GLES31Ext
android.opengl.GLES32
-android.opengl.GLSurfaceView
-android.opengl.GLSurfaceView$BaseConfigChooser
-android.opengl.GLSurfaceView$ComponentSizeChooser
-android.opengl.GLSurfaceView$DefaultContextFactory
-android.opengl.GLSurfaceView$DefaultWindowSurfaceFactory
-android.opengl.GLSurfaceView$EGLConfigChooser
-android.opengl.GLSurfaceView$EGLContextFactory
-android.opengl.GLSurfaceView$EGLWindowSurfaceFactory
-android.opengl.GLSurfaceView$EglHelper
-android.opengl.GLSurfaceView$GLThread
-android.opengl.GLSurfaceView$GLThreadManager
-android.opengl.GLSurfaceView$Renderer
-android.opengl.GLSurfaceView$SimpleEGLConfigChooser
-android.opengl.GLU
android.opengl.GLUtils
android.opengl.Matrix
android.opengl.Visibility
-android.os.-$Lambda$0$-dncxFEc2F2bgG2fsIoC6FC6WNE
-android.os.-$Lambda$1$-dncxFEc2F2bgG2fsIoC6FC6WNE
-android.os.-$Lambda$5$6x30vPJhBKUfNY8tswxuZo3DCe0
-android.os.-$Lambda$67$OsaxDBgigpqjZN1F4C6nYRYm1YQ
+android.os.-$Lambda$-dncxFEc2F2bgG2fsIoC6FC6WNE
+android.os.-$Lambda$-dncxFEc2F2bgG2fsIoC6FC6WNE$1
+android.os.-$Lambda$6x30vPJhBKUfNY8tswxuZo3DCe0
android.os.AsyncResult
-android.os.AsyncTask
android.os.AsyncTask$1
android.os.AsyncTask$2
android.os.AsyncTask$3
@@ -3106,19 +3138,18 @@
android.os.BatteryStats$DailyItem
android.os.BatteryStats$HistoryEventTracker
android.os.BatteryStats$HistoryItem
-android.os.BatteryStats$HistoryPrinter
android.os.BatteryStats$HistoryStepDetails
android.os.BatteryStats$HistoryTag
android.os.BatteryStats$IntToString
android.os.BatteryStats$LevelStepTracker
android.os.BatteryStats$LongCounter
+android.os.BatteryStats$LongCounterArray
android.os.BatteryStats$PackageChange
android.os.BatteryStats$Timer
android.os.BatteryStats$Uid
android.os.BatteryStats$Uid$Pid
android.os.BatteryStats$Uid$Pkg
android.os.BatteryStats$Uid$Pkg$Serv
-android.os.BatteryStats$Uid$Proc
android.os.BatteryStats$Uid$Sensor
android.os.BatteryStats$Uid$Wakelock
android.os.Binder
@@ -3133,7 +3164,6 @@
android.os.CommonTimeConfig$OnServerDiedListener
android.os.ConditionVariable
android.os.CountDownTimer
-android.os.CountDownTimer$1
android.os.CpuUsageInfo
android.os.CpuUsageInfo$1
android.os.DeadObjectException
@@ -3147,7 +3177,8 @@
android.os.Environment
android.os.Environment$UserEnvironment
android.os.FactoryTest
-android.os.FileObserver
+android.os.FileBridge
+android.os.FileBridge$FileBridgeOutputStream
android.os.FileObserver$ObserverThread
android.os.FileUtils
android.os.GraphicsEnvironment
@@ -3234,7 +3265,6 @@
android.os.MessageQueue$OnFileDescriptorEventListener
android.os.Messenger
android.os.Messenger$1
-android.os.NullVibrator
android.os.OperationCanceledException
android.os.Parcel
android.os.Parcel$1
@@ -3252,6 +3282,7 @@
android.os.Parcelable
android.os.Parcelable$ClassLoaderCreator
android.os.Parcelable$Creator
+android.os.ParcelableException
android.os.ParcelableParcel
android.os.ParcelableParcel$1
android.os.PatternMatcher
@@ -3266,15 +3297,18 @@
android.os.PowerManager$WakeLock$1
android.os.PowerManagerInternal
android.os.PowerManagerInternal$LowPowerModeListener
+android.os.PowerSaveState
+android.os.PowerSaveState$1
+android.os.PowerSaveState$Builder
android.os.Process
android.os.Process$ProcessStartResult
android.os.RecoverySystem
+android.os.RecoverySystem$ProgressListener
android.os.Registrant
android.os.RegistrantList
android.os.RemoteCallback
android.os.RemoteCallback$1
android.os.RemoteCallback$2
-android.os.RemoteCallback$3
android.os.RemoteCallback$OnResultListener
android.os.RemoteCallbackList
android.os.RemoteCallbackList$Callback
@@ -3284,14 +3318,13 @@
android.os.ResultReceiver$MyResultReceiver
android.os.ResultReceiver$MyRunnable
android.os.SELinux
+android.os.Seccomp
android.os.ServiceManager
android.os.ServiceManager$ServiceNotFoundException
android.os.ServiceManagerNative
android.os.ServiceManagerProxy
android.os.ServiceSpecificException
android.os.ShellCallback
-android.os.ShellCallback$1
-android.os.ShellCommand
android.os.StatFs
android.os.StrictMode
android.os.StrictMode$1
@@ -3310,6 +3343,7 @@
android.os.StrictMode$InstanceTracker
android.os.StrictMode$LogStackTrace
android.os.StrictMode$Span
+android.os.StrictMode$StrictModeCustomViolation
android.os.StrictMode$StrictModeDiskReadViolation
android.os.StrictMode$StrictModeDiskWriteViolation
android.os.StrictMode$StrictModeViolation
@@ -3340,18 +3374,27 @@
android.os.UserHandle
android.os.UserHandle$1
android.os.UserManager
+android.os.UserManager$EnforcingUser
+android.os.UserManager$EnforcingUser$1
android.os.UserManagerInternal
android.os.UserManagerInternal$UserRestrictionsListener
+android.os.VibrationEffect
+android.os.VibrationEffect$1
+android.os.VibrationEffect$OneShot
+android.os.VibrationEffect$Prebaked
+android.os.VibrationEffect$Prebaked$1
+android.os.VibrationEffect$Waveform
+android.os.VibrationEffect$Waveform$1
android.os.Vibrator
+android.os.VintfObject
+android.os.VintfRuntimeInfo
android.os.WorkSource
android.os.WorkSource$1
android.os.ZygoteProcess
android.os.ZygoteProcess$ZygoteState
android.os.ZygoteStartFailedEx
-android.os.health.HealthStats
android.os.health.HealthStatsParceler
android.os.health.SystemHealthManager
-android.os.health.TimerStat
android.os.storage.DiskInfo
android.os.storage.DiskInfo$1
android.os.storage.IObbActionListener
@@ -3376,50 +3419,23 @@
android.os.storage.VolumeInfo$2
android.os.storage.VolumeRecord
android.os.storage.VolumeRecord$1
-android.permissionpresenterservice.RuntimePermissionPresenterService
-android.permissionpresenterservice.RuntimePermissionPresenterService$1
-android.permissionpresenterservice.RuntimePermissionPresenterService$MyHandler
-android.preference.CheckBoxPreference
-android.preference.DialogPreference
android.preference.GenericInflater$Parent
-android.preference.ListPreference
android.preference.Preference
android.preference.Preference$BaseSavedState
android.preference.Preference$BaseSavedState$1
-android.preference.Preference$OnPreferenceChangeInternalListener
android.preference.Preference$OnPreferenceChangeListener
-android.preference.Preference$OnPreferenceClickListener
android.preference.PreferenceActivity
android.preference.PreferenceFragment
-android.preference.PreferenceFragment$1
-android.preference.PreferenceFragment$2
-android.preference.PreferenceFragment$3
android.preference.PreferenceFragment$OnPreferenceStartFragmentCallback
-android.preference.PreferenceFrameLayout
android.preference.PreferenceGroup
-android.preference.PreferenceGroupAdapter
-android.preference.PreferenceGroupAdapter$1
-android.preference.PreferenceGroupAdapter$PreferenceLayout
android.preference.PreferenceManager
-android.preference.PreferenceManager$OnActivityDestroyListener
android.preference.PreferenceManager$OnPreferenceTreeClickListener
android.preference.PreferenceScreen
-android.preference.SeekBarVolumizer
-android.preference.SeekBarVolumizer$Callback
-android.preference.SeekBarVolumizer$H
-android.preference.SeekBarVolumizer$Observer
-android.preference.SeekBarVolumizer$Receiver
-android.preference.SwitchPreference
-android.preference.SwitchPreference$Listener
-android.preference.TwoStatePreference
android.print.IPrintDocumentAdapter
android.print.IPrintJobStateChangeListener
android.print.IPrintManager
android.print.IPrintManager$Stub
-android.print.IPrintManager$Stub$Proxy
android.print.IPrintServicesChangeListener
-android.print.IPrintServicesChangeListener$Stub
-android.print.IPrintServicesChangeListener$Stub$Proxy
android.print.IPrintSpooler
android.print.IPrintSpooler$Stub
android.print.IPrintSpooler$Stub$Proxy
@@ -3427,35 +3443,23 @@
android.print.IPrintSpoolerCallbacks$Stub
android.print.IPrintSpoolerClient
android.print.IPrintSpoolerClient$Stub
-android.print.IPrintSpoolerClient$Stub$Proxy
android.print.IPrinterDiscoveryObserver
android.print.PageRange
android.print.PrintAttributes
-android.print.PrintAttributes$Builder
-android.print.PrintAttributes$Margins
-android.print.PrintAttributes$MediaSize
-android.print.PrintAttributes$Resolution
android.print.PrintDocumentAdapter
android.print.PrintDocumentAdapter$LayoutResultCallback
android.print.PrintDocumentAdapter$WriteResultCallback
-android.print.PrintDocumentInfo
-android.print.PrintDocumentInfo$Builder
android.print.PrintJobId
android.print.PrintJobInfo
android.print.PrintManager
-android.print.PrintManager$1
-android.print.PrintManager$PrintServicesChangeListener
-android.print.PrintManager$PrintServicesChangeListenerWrapper
-android.print.PrintServicesLoader
-android.print.PrintServicesLoader$1
-android.print.PrintServicesLoader$MyHandler
android.print.PrinterId
android.printservice.IPrintServiceClient
android.printservice.IPrintServiceClient$Stub
android.printservice.PrintServiceInfo
android.printservice.PrintServiceInfo$1
android.printservice.recommendation.IRecommendationsChangeListener
-android.provider.-$Lambda$46$87WmhkvObehVg0OMBzwa_MTVV8g
+android.provider.-$Lambda$87WmhkvObehVg0OMBzwa_MTVV8g
+android.provider.-$Lambda$a7Jyr6j_Mb70hHJ2ssL1AAhKh4c
android.provider.BaseColumns
android.provider.BlockedNumberContract
android.provider.BlockedNumberContract$BlockedNumbers
@@ -3467,42 +3471,30 @@
android.provider.CalendarContract$CalendarCache
android.provider.CalendarContract$CalendarCacheColumns
android.provider.CalendarContract$CalendarColumns
-android.provider.CalendarContract$CalendarEntity
-android.provider.CalendarContract$CalendarEntity$EntityIteratorImpl
android.provider.CalendarContract$CalendarSyncColumns
android.provider.CalendarContract$Calendars
android.provider.CalendarContract$Colors
android.provider.CalendarContract$ColorsColumns
android.provider.CalendarContract$Events
android.provider.CalendarContract$EventsColumns
-android.provider.CalendarContract$EventsEntity
-android.provider.CalendarContract$EventsEntity$EntityIteratorImpl
android.provider.CalendarContract$ExtendedProperties
android.provider.CalendarContract$ExtendedPropertiesColumns
android.provider.CalendarContract$Instances
android.provider.CalendarContract$Reminders
android.provider.CalendarContract$RemindersColumns
android.provider.CalendarContract$SyncColumns
-android.provider.CalendarContract$SyncState
android.provider.CallLog
android.provider.CallLog$Calls
-android.provider.Contacts
-android.provider.Contacts$ContactMethods
-android.provider.Contacts$ContactMethodsColumns
-android.provider.Contacts$PeopleColumns
android.provider.ContactsContract
-android.provider.ContactsContract$AggregationExceptions
android.provider.ContactsContract$BaseSyncColumns
android.provider.ContactsContract$CommonDataKinds$BaseTypes
android.provider.ContactsContract$CommonDataKinds$Callable
android.provider.ContactsContract$CommonDataKinds$CommonColumns
-android.provider.ContactsContract$CommonDataKinds$Contactables
android.provider.ContactsContract$CommonDataKinds$Email
android.provider.ContactsContract$CommonDataKinds$Event
android.provider.ContactsContract$CommonDataKinds$Im
android.provider.ContactsContract$CommonDataKinds$Phone
android.provider.ContactsContract$CommonDataKinds$Relation
-android.provider.ContactsContract$CommonDataKinds$SipAddress
android.provider.ContactsContract$CommonDataKinds$StructuredPostal
android.provider.ContactsContract$ContactCounts
android.provider.ContactsContract$ContactNameColumns
@@ -3525,50 +3517,37 @@
android.provider.ContactsContract$MetadataSyncColumns
android.provider.ContactsContract$PhoneLookup
android.provider.ContactsContract$PhoneLookupColumns
-android.provider.ContactsContract$PinnedPositions
android.provider.ContactsContract$Profile
android.provider.ContactsContract$ProviderStatus
-android.provider.ContactsContract$QuickContact
android.provider.ContactsContract$RawContacts
android.provider.ContactsContract$RawContactsColumns
android.provider.ContactsContract$RawContactsEntity
-android.provider.ContactsContract$Settings
-android.provider.ContactsContract$SettingsColumns
android.provider.ContactsContract$StatusColumns
-android.provider.ContactsContract$StreamItems
-android.provider.ContactsContract$StreamItemsColumns
android.provider.ContactsContract$SyncColumns
-android.provider.ContactsContract$SyncState
-android.provider.ContactsInternal
android.provider.DocumentsContract
+android.provider.DocumentsContract$Path
android.provider.DocumentsProvider
android.provider.Downloads
android.provider.Downloads$Impl
-android.provider.MediaStore
+android.provider.FontsContract
+android.provider.FontsContract$1
android.provider.MediaStore$Audio
android.provider.MediaStore$Audio$AlbumColumns
android.provider.MediaStore$Audio$Albums
android.provider.MediaStore$Audio$AudioColumns
-android.provider.MediaStore$Audio$Genres
-android.provider.MediaStore$Audio$Genres$Members
-android.provider.MediaStore$Audio$GenresColumns
android.provider.MediaStore$Audio$Media
android.provider.MediaStore$Audio$Playlists
-android.provider.MediaStore$Audio$Playlists$Members
android.provider.MediaStore$Audio$PlaylistsColumns
android.provider.MediaStore$Files
android.provider.MediaStore$Images$ImageColumns
android.provider.MediaStore$Images$Media
android.provider.MediaStore$Images$Thumbnails
-android.provider.MediaStore$InternalThumbnails
android.provider.MediaStore$MediaColumns
android.provider.MediaStore$Video$Media
-android.provider.MediaStore$Video$Thumbnails
android.provider.MediaStore$Video$VideoColumns
android.provider.OpenableColumns
android.provider.SearchIndexableData
android.provider.SearchIndexableResource
-android.provider.SearchIndexablesContract
android.provider.SearchIndexablesProvider
android.provider.SearchRecentSuggestions
android.provider.Settings
@@ -3594,17 +3573,12 @@
android.provider.Settings$System$InclusiveIntegerRangeValidator
android.provider.Settings$System$Validator
android.provider.SyncStateContract$Columns
-android.provider.SyncStateContract$Helpers
android.provider.Telephony$BaseMmsColumns
android.provider.Telephony$Carriers
android.provider.Telephony$Mms
-android.provider.Telephony$Mms$Inbox
-android.provider.Telephony$Mms$Sent
android.provider.Telephony$MmsSms
+android.provider.Telephony$ServiceStateTable
android.provider.Telephony$Sms
-android.provider.Telephony$Sms$Inbox
-android.provider.Telephony$Sms$Intents
-android.provider.Telephony$Sms$Sent
android.provider.Telephony$TextBasedSmsColumns
android.provider.Telephony$Threads
android.provider.Telephony$ThreadsColumns
@@ -3612,21 +3586,9 @@
android.provider.VoicemailContract$Status
android.provider.VoicemailContract$Voicemails
android.renderscript.Allocation
-android.renderscript.Allocation$MipmapControl
android.renderscript.BaseObj
-android.renderscript.Element
-android.renderscript.Element$DataKind
-android.renderscript.Element$DataType
-android.renderscript.RenderScript
-android.renderscript.RenderScript$ContextType
-android.renderscript.RenderScript$MessageThread
+android.renderscript.Matrix4f
android.renderscript.RenderScriptCacheDir
-android.renderscript.Script
-android.renderscript.ScriptIntrinsic
-android.renderscript.ScriptIntrinsicBlur
-android.renderscript.Type
-android.renderscript.Type$Builder
-android.renderscript.Type$CubemapFace
android.security.GateKeeper
android.security.IKeyChainService
android.security.IKeyChainService$Stub
@@ -3683,35 +3645,38 @@
android.security.net.config.RootTrustManager
android.security.net.config.RootTrustManagerFactorySpi
android.security.net.config.SystemCertificateSource
-android.security.net.config.SystemCertificateSource$NoPreloadHolder
android.security.net.config.TrustedCertificateStoreAdapter
android.security.net.config.UserCertificateSource
-android.security.net.config.UserCertificateSource$NoPreloadHolder
android.security.net.config.XmlConfigSource
android.security.net.config.XmlConfigSource$ParserException
-android.service.autofill.IAutoFillManagerService
-android.service.autofill.IAutoFillManagerService$Stub
-android.service.autofill.IAutoFillManagerService$Stub$Proxy
+android.service.autofill.-$Lambda$svbjmB3NFhHnuZrn67G14PFSJlY
+android.service.autofill.AutofillService
+android.service.autofill.AutofillService$1
+android.service.autofill.AutofillServiceInfo
+android.service.autofill.FillCallback
+android.service.autofill.FillContext
+android.service.autofill.FillContext$1
+android.service.autofill.FillEventHistory
+android.service.autofill.FillRequest
+android.service.autofill.FillRequest$1
+android.service.autofill.FillResponse
+android.service.autofill.IAutoFillService
+android.service.autofill.IAutoFillService$Stub
+android.service.autofill.IAutoFillService$Stub$Proxy
+android.service.autofill.IFillCallback
+android.service.autofill.IFillCallback$Stub
+android.service.autofill.IFillCallback$Stub$Proxy
+android.service.autofill.SaveCallback
+android.service.autofill.SaveRequest
android.service.carrier.CarrierIdentifier
android.service.carrier.CarrierIdentifier$1
android.service.carrier.ICarrierService
android.service.carrier.ICarrierService$Stub
android.service.carrier.ICarrierService$Stub$Proxy
-android.service.chooser.ChooserTarget
-android.service.chooser.ChooserTargetService
android.service.dreams.DreamManagerInternal
-android.service.dreams.DreamService
-android.service.dreams.DreamService$1
-android.service.dreams.DreamService$DreamServiceWrapper
-android.service.dreams.DreamService$DreamServiceWrapper$1
-android.service.dreams.DreamService$DreamServiceWrapper$2
-android.service.dreams.DreamService$DreamServiceWrapper$3
android.service.dreams.IDreamManager
android.service.dreams.IDreamManager$Stub
android.service.dreams.IDreamManager$Stub$Proxy
-android.service.dreams.IDreamService
-android.service.dreams.IDreamService$Stub
-android.service.dreams.IDreamService$Stub$Proxy
android.service.gatekeeper.IGateKeeperService
android.service.gatekeeper.IGateKeeperService$Stub
android.service.gatekeeper.IGateKeeperService$Stub$Proxy
@@ -3720,14 +3685,6 @@
android.service.media.IMediaBrowserService$Stub$Proxy
android.service.media.IMediaBrowserServiceCallbacks
android.service.media.IMediaBrowserServiceCallbacks$Stub
-android.service.media.IMediaBrowserServiceCallbacks$Stub$Proxy
-android.service.media.MediaBrowserService
-android.service.media.MediaBrowserService$1
-android.service.media.MediaBrowserService$BrowserRoot
-android.service.media.MediaBrowserService$ConnectionRecord
-android.service.media.MediaBrowserService$Result
-android.service.media.MediaBrowserService$ServiceBinder
-android.service.media.MediaBrowserService$ServiceBinder$1
android.service.notification.Adjustment
android.service.notification.Condition
android.service.notification.Condition$1
@@ -3738,7 +3695,6 @@
android.service.notification.IConditionListener$Stub
android.service.notification.IConditionProvider
android.service.notification.IConditionProvider$Stub
-android.service.notification.IConditionProvider$Stub$Proxy
android.service.notification.INotificationListener
android.service.notification.INotificationListener$Stub
android.service.notification.INotificationListener$Stub$Proxy
@@ -3762,21 +3718,18 @@
android.service.notification.ZenModeConfig$ScheduleInfo
android.service.notification.ZenModeConfig$ZenRule
android.service.notification.ZenModeConfig$ZenRule$1
+android.service.oemlock.IOemLockService
+android.service.oemlock.IOemLockService$Stub
+android.service.oemlock.OemLockManager
android.service.persistentdata.IPersistentDataBlockService
android.service.persistentdata.IPersistentDataBlockService$Stub
android.service.persistentdata.IPersistentDataBlockService$Stub$Proxy
android.service.persistentdata.PersistentDataBlockManager
android.service.quicksettings.IQSService
android.service.quicksettings.IQSService$Stub
-android.service.quicksettings.IQSTileService
android.service.quicksettings.Tile
-android.service.quicksettings.Tile$1
-android.service.quicksettings.TileService
android.service.textservice.SpellCheckerService
android.service.textservice.SpellCheckerService$InternalISpellCheckerSession
-android.service.textservice.SpellCheckerService$SentenceLevelAdapter
-android.service.textservice.SpellCheckerService$SentenceLevelAdapter$SentenceTextInfoParams
-android.service.textservice.SpellCheckerService$SentenceLevelAdapter$SentenceWordItem
android.service.textservice.SpellCheckerService$Session
android.service.textservice.SpellCheckerService$SpellCheckerServiceBinder
android.service.voice.AlwaysOnHotwordDetector
@@ -3789,33 +3742,13 @@
android.service.voice.IVoiceInteractionService$Stub
android.service.voice.IVoiceInteractionService$Stub$Proxy
android.service.voice.IVoiceInteractionSession
-android.service.voice.IVoiceInteractionSession$Stub
-android.service.voice.IVoiceInteractionSession$Stub$Proxy
-android.service.voice.IVoiceInteractionSessionService
-android.service.voice.IVoiceInteractionSessionService$Stub
-android.service.voice.IVoiceInteractionSessionService$Stub$Proxy
android.service.voice.VoiceInteractionManagerInternal
android.service.voice.VoiceInteractionService
android.service.voice.VoiceInteractionService$1
android.service.voice.VoiceInteractionService$MyHandler
android.service.voice.VoiceInteractionServiceInfo
-android.service.voice.VoiceInteractionSession
-android.service.voice.VoiceInteractionSession$1
-android.service.voice.VoiceInteractionSession$2
-android.service.voice.VoiceInteractionSession$2$1
-android.service.voice.VoiceInteractionSession$3
-android.service.voice.VoiceInteractionSession$4
-android.service.voice.VoiceInteractionSession$AbortVoiceRequest
-android.service.voice.VoiceInteractionSession$CommandRequest
-android.service.voice.VoiceInteractionSession$CompleteVoiceRequest
-android.service.voice.VoiceInteractionSession$ConfirmationRequest
-android.service.voice.VoiceInteractionSession$Insets
-android.service.voice.VoiceInteractionSession$MyCallbacks
-android.service.voice.VoiceInteractionSession$PickOptionRequest
-android.service.voice.VoiceInteractionSession$Request
-android.service.voice.VoiceInteractionSessionService
-android.service.voice.VoiceInteractionSessionService$1
-android.service.voice.VoiceInteractionSessionService$2
+android.service.vr.IPersistentVrStateCallbacks
+android.service.vr.IPersistentVrStateCallbacks$Stub
android.service.vr.IVrManager
android.service.vr.IVrManager$Stub
android.service.vr.IVrManager$Stub$Proxy
@@ -3840,10 +3773,13 @@
android.service.wallpaper.WallpaperService$IWallpaperEngineWrapper
android.service.wallpaper.WallpaperService$IWallpaperServiceWrapper
android.service.wallpaper.WallpaperService$WallpaperCommand
-android.speech.RecognitionService
android.speech.SpeechRecognizer
+android.speech.tts.AbstractEventLogger
+android.speech.tts.AbstractSynthesisCallback
android.speech.tts.AudioPlaybackHandler
android.speech.tts.AudioPlaybackHandler$MessageLoop
+android.speech.tts.EventLogger
+android.speech.tts.FileSynthesisCallback
android.speech.tts.ITextToSpeechCallback
android.speech.tts.ITextToSpeechCallback$Stub
android.speech.tts.ITextToSpeechCallback$Stub$Proxy
@@ -3855,6 +3791,7 @@
android.speech.tts.TextToSpeech
android.speech.tts.TextToSpeech$10
android.speech.tts.TextToSpeech$16
+android.speech.tts.TextToSpeech$17
android.speech.tts.TextToSpeech$7
android.speech.tts.TextToSpeech$Action
android.speech.tts.TextToSpeech$Connection
@@ -3865,13 +3802,19 @@
android.speech.tts.TextToSpeechService
android.speech.tts.TextToSpeechService$1
android.speech.tts.TextToSpeechService$CallbackMap
+android.speech.tts.TextToSpeechService$SpeechItem
android.speech.tts.TextToSpeechService$SynthHandler
+android.speech.tts.TextToSpeechService$SynthHandler$1
android.speech.tts.TextToSpeechService$SynthHandler$2
android.speech.tts.TextToSpeechService$SynthThread
+android.speech.tts.TextToSpeechService$SynthesisSpeechItem
+android.speech.tts.TextToSpeechService$SynthesisToFileOutputStreamSpeechItem
+android.speech.tts.TextToSpeechService$UtteranceProgressDispatcher
+android.speech.tts.TextToSpeechService$UtteranceSpeechItem
+android.speech.tts.TextToSpeechService$UtteranceSpeechItemWithParams
android.speech.tts.TtsEngines
android.speech.tts.TtsEngines$EngineInfoComparator
android.speech.tts.UtteranceProgressListener
-android.speech.tts.Voice
android.system.ErrnoException
android.system.GaiException
android.system.NetlinkSocketAddress
@@ -3882,6 +3825,7 @@
android.system.StructFlock
android.system.StructGroupReq
android.system.StructGroupSourceReq
+android.system.StructIcmpHdr
android.system.StructIfaddrs
android.system.StructLinger
android.system.StructPasswd
@@ -3892,19 +3836,9 @@
android.system.StructUcred
android.system.StructUtsname
android.system.UnixSocketAddress
-android.telecom.-$Lambda$3$afyb_ODGzn3xMew6fjs8ANSIdVo
-android.telecom.AudioState
-android.telecom.AudioState$1
-android.telecom.Call
-android.telecom.Call$1
-android.telecom.Call$4
-android.telecom.Call$8
-android.telecom.Call$Callback
-android.telecom.Call$Details
-android.telecom.Call$Listener
+android.telecom.-$Lambda$afyb_ODGzn3xMew6fjs8ANSIdVo
android.telecom.CallAudioState
android.telecom.CallAudioState$1
-android.telecom.CallbackRecord
android.telecom.Conference
android.telecom.Conference$Listener
android.telecom.Conferenceable
@@ -3915,6 +3849,7 @@
android.telecom.Connection$Listener
android.telecom.ConnectionRequest
android.telecom.ConnectionRequest$1
+android.telecom.ConnectionRequest$Builder
android.telecom.ConnectionService
android.telecom.ConnectionService$1
android.telecom.ConnectionService$2
@@ -3927,18 +3862,11 @@
android.telecom.DefaultDialerManager
android.telecom.DisconnectCause
android.telecom.DisconnectCause$1
-android.telecom.GatewayInfo
-android.telecom.InCallAdapter
-android.telecom.InCallService
-android.telecom.InCallService$1
-android.telecom.InCallService$2
-android.telecom.InCallService$InCallServiceBinder
-android.telecom.InCallService$VideoCall
android.telecom.Log
android.telecom.Log$1
-android.telecom.Logging.-$Lambda$2$OwO3BlCgqcOx28O1BaOAPVPor24
-android.telecom.Logging.-$Lambda$35$OwO3BlCgqcOx28O1BaOAPVPor24
-android.telecom.Logging.-$Lambda$47$OwO3BlCgqcOx28O1BaOAPVPor24
+android.telecom.Logging.-$Lambda$OwO3BlCgqcOx28O1BaOAPVPor24
+android.telecom.Logging.-$Lambda$OwO3BlCgqcOx28O1BaOAPVPor24$1
+android.telecom.Logging.-$Lambda$OwO3BlCgqcOx28O1BaOAPVPor24$2
android.telecom.Logging.EventManager
android.telecom.Logging.EventManager$Event
android.telecom.Logging.EventManager$EventListener
@@ -3960,8 +3888,6 @@
android.telecom.ParcelableConference
android.telecom.ParcelableConnection
android.telecom.ParcelableConnection$1
-android.telecom.Phone
-android.telecom.Phone$Listener
android.telecom.PhoneAccount
android.telecom.PhoneAccount$1
android.telecom.PhoneAccount$Builder
@@ -3970,17 +3896,10 @@
android.telecom.RemoteConnectionManager
android.telecom.StatusHints
android.telecom.TelecomAnalytics
-android.telecom.TelecomAnalytics$SessionTiming
-android.telecom.TelecomAnalytics$SessionTiming$1
android.telecom.TelecomManager
-android.telecom.TimedEvent
android.telecom.VideoProfile
android.telecom.VideoProfile$1
android.telephony.CarrierConfigManager
-android.telephony.CellBroadcastMessage
-android.telephony.CellIdentityCdma
-android.telephony.CellIdentityGsm
-android.telephony.CellIdentityLte
android.telephony.CellIdentityWcdma
android.telephony.CellIdentityWcdma$1
android.telephony.CellInfo
@@ -3992,9 +3911,6 @@
android.telephony.CellInfoWcdma$1
android.telephony.CellLocation
android.telephony.CellSignalStrength
-android.telephony.CellSignalStrengthCdma
-android.telephony.CellSignalStrengthGsm
-android.telephony.CellSignalStrengthLte
android.telephony.CellSignalStrengthWcdma
android.telephony.CellSignalStrengthWcdma$1
android.telephony.ClientRequestStats
@@ -4002,7 +3918,6 @@
android.telephony.DisconnectCause
android.telephony.IccOpenLogicalChannelResponse
android.telephony.ModemActivityInfo
-android.telephony.ModemActivityInfo$1
android.telephony.PhoneNumberFormattingTextWatcher
android.telephony.PhoneNumberUtils
android.telephony.PhoneStateListener
@@ -4020,7 +3935,6 @@
android.telephony.SignalStrength$1
android.telephony.SmsManager
android.telephony.SmsMessage
-android.telephony.SmsMessage$MessageClass
android.telephony.SubscriptionInfo
android.telephony.SubscriptionInfo$1
android.telephony.SubscriptionManager
@@ -4034,10 +3948,14 @@
android.telephony.VisualVoicemailSmsFilterSettings
android.telephony.VoLteServiceState
android.telephony.VoLteServiceState$1
-android.telephony.cdma.CdmaCellLocation
-android.telephony.cdma.CdmaSmsCbProgramData
android.telephony.gsm.GsmCellLocation
-android.telephony.gsm.SmsMessage
+android.telephony.ims.ImsServiceProxy$INotifyStatusChanged
+android.telephony.ims.ImsServiceProxyCompat
+android.telephony.ims.feature.IMMTelFeature
+android.telephony.ims.stub.ImsConfigImplBase
+android.telephony.ims.stub.ImsEcbmImplBase
+android.telephony.ims.stub.ImsUtImplBase
+android.telephony.ims.stub.ImsUtListenerImplBase
android.text.AndroidBidi
android.text.AndroidCharacter
android.text.Annotation
@@ -4052,27 +3970,19 @@
android.text.Editable
android.text.Editable$Factory
android.text.FontConfig
-android.text.FontConfig$1
android.text.FontConfig$Alias
-android.text.FontConfig$Alias$1
-android.text.FontConfig$Axis
-android.text.FontConfig$Axis$1
android.text.FontConfig$Family
-android.text.FontConfig$Family$1
android.text.FontConfig$Font
-android.text.FontConfig$Font$1
android.text.GetChars
android.text.GraphicsOperations
android.text.Html
android.text.Html$HtmlParser
-android.text.Html$ImageGetter
android.text.Html$TagHandler
android.text.HtmlToSpannedConverter
android.text.HtmlToSpannedConverter$Bold
android.text.HtmlToSpannedConverter$Href
android.text.Hyphenator
-android.text.ITextClassificationService
-android.text.ITextClassificationService$Stub
+android.text.Hyphenator$HyphenationData
android.text.InputFilter
android.text.InputFilter$LengthFilter
android.text.InputType
@@ -4153,10 +4063,8 @@
android.text.method.TransformationMethod
android.text.method.TransformationMethod2
android.text.method.WordIterator
-android.text.style.AbsoluteSizeSpan
android.text.style.AlignmentSpan
android.text.style.BackgroundColorSpan
-android.text.style.BulletSpan
android.text.style.CharacterStyle
android.text.style.CharacterStyle$Passthrough
android.text.style.ClickableSpan
@@ -4178,17 +4086,14 @@
android.text.style.SpellCheckSpan
android.text.style.StrikethroughSpan
android.text.style.StyleSpan
-android.text.style.SubscriptSpan
android.text.style.SuggestionSpan
-android.text.style.SuperscriptSpan
android.text.style.TabStopSpan
android.text.style.TextAppearanceSpan
android.text.style.TtsSpan
android.text.style.TtsSpan$Builder
-android.text.style.TtsSpan$DigitsBuilder
android.text.style.TtsSpan$SemioticClassBuilder
android.text.style.TtsSpan$TelephoneBuilder
-android.text.style.TtsSpan$TextBuilder
+android.text.style.TtsSpan$VerbatimBuilder
android.text.style.TypefaceSpan
android.text.style.URLSpan
android.text.style.UnderlineSpan
@@ -4204,6 +4109,7 @@
android.text.util.Linkify$TransformFilter
android.text.util.Rfc822Token
android.text.util.Rfc822Tokenizer
+android.transition.ArcMotion
android.transition.AutoTransition
android.transition.ChangeBounds
android.transition.ChangeBounds$1
@@ -4212,9 +4118,7 @@
android.transition.ChangeBounds$4
android.transition.ChangeBounds$5
android.transition.ChangeBounds$6
-android.transition.ChangeBounds$7
android.transition.ChangeBounds$9
-android.transition.ChangeBounds$ViewBounds
android.transition.ChangeClipBounds
android.transition.ChangeImageTransform
android.transition.ChangeImageTransform$1
@@ -4226,6 +4130,8 @@
android.transition.ChangeTransform$GhostListener
android.transition.ChangeTransform$PathAnimatorMatrix
android.transition.ChangeTransform$Transforms
+android.transition.CircularPropagation
+android.transition.Explode
android.transition.Fade
android.transition.Fade$1
android.transition.Fade$FadeAnimatorListener
@@ -4247,25 +4153,22 @@
android.transition.Transition$2
android.transition.Transition$3
android.transition.Transition$AnimationInfo
+android.transition.Transition$ArrayListManager
android.transition.Transition$EpicenterCallback
android.transition.Transition$TransitionListener
-android.transition.Transition$TransitionListenerAdapter
android.transition.TransitionInflater
+android.transition.TransitionListenerAdapter
android.transition.TransitionManager
android.transition.TransitionManager$MultiListener
android.transition.TransitionManager$MultiListener$1
android.transition.TransitionPropagation
android.transition.TransitionSet
-android.transition.TransitionSet$1
android.transition.TransitionSet$TransitionSetListener
android.transition.TransitionUtils
android.transition.TransitionValues
android.transition.TransitionValuesMaps
-android.transition.TranslationAnimationCreator
-android.transition.TranslationAnimationCreator$TransitionPositionListener
android.transition.Visibility
android.transition.Visibility$1
-android.transition.Visibility$DisappearListener
android.transition.Visibility$VisibilityInfo
android.transition.VisibilityPropagation
android.util.AndroidException
@@ -4281,6 +4184,7 @@
android.util.Base64$Decoder
android.util.Base64$Encoder
android.util.BootTimingsTraceLog
+android.util.ByteStringUtils
android.util.ContainerHelpers
android.util.DebugUtils
android.util.DisplayMetrics
@@ -4289,6 +4193,7 @@
android.util.FastImmutableArraySet
android.util.FastImmutableArraySet$FastIterator
android.util.FloatProperty
+android.util.IconDrawableFactory
android.util.IntArray
android.util.IntProperty
android.util.JsonReader
@@ -4296,19 +4201,21 @@
android.util.JsonToken
android.util.JsonWriter
android.util.KeyValueListParser
+android.util.LauncherIcons
+android.util.LauncherIcons$ShadowDrawable
+android.util.LauncherIcons$ShadowDrawable$MyConstantState
android.util.LocalLog
android.util.LocalLog$ReadOnlyLocalLog
android.util.Log
android.util.Log$1
android.util.Log$ImmediateLogWriter
-android.util.Log$NoPreloadHolder
+android.util.Log$TerribleFailure
android.util.Log$TerribleFailureHandler
android.util.LogPrinter
android.util.LongArray
android.util.LongSparseArray
android.util.LongSparseLongArray
android.util.LruCache
-android.util.MalformedJsonException
android.util.MapCollections
android.util.MapCollections$ArrayIterator
android.util.MapCollections$EntrySet
@@ -4318,6 +4225,8 @@
android.util.MathUtils
android.util.MemoryIntArray
android.util.MemoryIntArray$1
+android.util.MergedConfiguration
+android.util.MergedConfiguration$1
android.util.MutableBoolean
android.util.MutableInt
android.util.MutableLong
@@ -4329,7 +4238,6 @@
android.util.Pools$Pool
android.util.Pools$SimplePool
android.util.Pools$SynchronizedPool
-android.util.PrintWriterPrinter
android.util.Printer
android.util.Property
android.util.Range
@@ -4354,20 +4262,28 @@
android.util.TrustedTime
android.util.TypedValue
android.util.Xml
-android.util.Xml$Encoding
android.util.Xml$XmlSerializerFactory
+android.util.XmlPullAttributes
android.util.apk.ApkSignatureSchemeV2Verifier
-android.util.apk.ApkSignatureSchemeV2Verifier$ByteBufferDataSource
-android.util.apk.ApkSignatureSchemeV2Verifier$DataSource
-android.util.apk.ApkSignatureSchemeV2Verifier$MemoryMappedFileDataSource
-android.util.apk.ApkSignatureSchemeV2Verifier$SignatureInfo
android.util.apk.ApkSignatureSchemeV2Verifier$SignatureNotFoundException
-android.util.apk.ApkSignatureSchemeV2Verifier$VerbatimX509Certificate
-android.util.apk.ApkSignatureSchemeV2Verifier$WrappedX509Certificate
android.util.apk.ZipUtils
android.util.jar.StrictJarFile
-android.view.-$Lambda$48$iU_USrtPm1XIm5H9QYQvXfBGDE4
-android.view.-$Lambda$49$iU_USrtPm1XIm5H9QYQvXfBGDE4
+android.util.jar.StrictJarFile$EntryIterator
+android.util.jar.StrictJarFile$FDStream
+android.util.jar.StrictJarFile$JarFileInputStream
+android.util.jar.StrictJarFile$ZipInflaterInputStream
+android.util.jar.StrictJarManifest
+android.util.jar.StrictJarManifest$Chunk
+android.util.jar.StrictJarManifestReader
+android.util.jar.StrictJarVerifier
+android.util.jar.StrictJarVerifier$VerifierEntry
+android.view.-$Lambda$6k_RnLLpNi5zg27ubDxN4lDdBbk
+android.view.-$Lambda$6k_RnLLpNi5zg27ubDxN4lDdBbk$1
+android.view.-$Lambda$6k_RnLLpNi5zg27ubDxN4lDdBbk$2
+android.view.-$Lambda$6k_RnLLpNi5zg27ubDxN4lDdBbk$3
+android.view.-$Lambda$P6MTGFSudLpwrqb6oVD8FdorW1c
+android.view.-$Lambda$iU_USrtPm1XIm5H9QYQvXfBGDE4
+android.view.-$Lambda$iU_USrtPm1XIm5H9QYQvXfBGDE4$1
android.view.AbsSavedState
android.view.AbsSavedState$1
android.view.AbsSavedState$2
@@ -4386,7 +4302,6 @@
android.view.Choreographer$FrameCallback
android.view.Choreographer$FrameDisplayEventReceiver
android.view.Choreographer$FrameHandler
-android.view.CollapsibleActionView
android.view.ContextMenu
android.view.ContextMenu$ContextMenuInfo
android.view.ContextThemeWrapper
@@ -4400,12 +4315,13 @@
android.view.DisplayInfo
android.view.DisplayInfo$1
android.view.DisplayListCanvas
-android.view.DragAndDropPermissions
android.view.DragEvent
android.view.FallbackEventHandler
android.view.FocusFinder
android.view.FocusFinder$1
-android.view.FocusFinder$SequentialFocusComparator
+android.view.FocusFinder$FocusSorter
+android.view.FocusFinder$UserSpecifiedFocusComparator
+android.view.FocusFinder$UserSpecifiedFocusComparator$NextFocusGetter
android.view.FrameInfo
android.view.FrameMetrics
android.view.FrameMetricsObserver
@@ -4432,6 +4348,9 @@
android.view.IGraphicsStats
android.view.IGraphicsStats$Stub
android.view.IGraphicsStats$Stub$Proxy
+android.view.IGraphicsStatsCallback
+android.view.IGraphicsStatsCallback$Stub
+android.view.IGraphicsStatsCallback$Stub$Proxy
android.view.IInputFilter
android.view.IOnKeyguardExitResult
android.view.IPinnedStackController
@@ -4477,11 +4396,14 @@
android.view.KeyCharacterMap
android.view.KeyCharacterMap$1
android.view.KeyCharacterMap$FallbackAction
-android.view.KeyCharacterMap$KeyData
android.view.KeyEvent
android.view.KeyEvent$1
android.view.KeyEvent$Callback
android.view.KeyEvent$DispatcherState
+android.view.KeyboardShortcutGroup
+android.view.KeyboardShortcutGroup$1
+android.view.KeyboardShortcutInfo
+android.view.KeyboardShortcutInfo$1
android.view.LayoutInflater
android.view.LayoutInflater$Factory
android.view.LayoutInflater$Factory2
@@ -4500,7 +4422,6 @@
android.view.MotionEvent$PointerProperties
android.view.NotificationHeaderView
android.view.NotificationHeaderView$1
-android.view.NotificationHeaderView$2
android.view.NotificationHeaderView$HeaderTouchListener
android.view.OrientationEventListener
android.view.OrientationEventListener$SensorEventListenerImpl
@@ -4512,19 +4433,16 @@
android.view.RenderNode$NoImagePreloadHolder
android.view.RenderNodeAnimator
android.view.RenderNodeAnimator$1
-android.view.RenderNodeAnimator$DelayedAnimationHelper
android.view.RenderNodeAnimatorSetHelper
android.view.ScaleGestureDetector
android.view.ScaleGestureDetector$1
android.view.ScaleGestureDetector$OnScaleGestureListener
android.view.ScaleGestureDetector$SimpleOnScaleGestureListener
android.view.SearchEvent
-android.view.SoundEffectConstants
android.view.SubMenu
android.view.Surface
android.view.Surface$1
android.view.Surface$CompatibleCanvas
-android.view.Surface$HwuiContext
android.view.Surface$OutOfResourcesException
android.view.SurfaceControl
android.view.SurfaceControl$PhysicalDisplayInfo
@@ -4537,13 +4455,13 @@
android.view.SurfaceView$2
android.view.SurfaceView$3
android.view.SurfaceView$4
-android.view.SurfaceView$MyWindow
android.view.TextureView
android.view.TextureView$1
android.view.TextureView$SurfaceTextureListener
android.view.ThreadedRenderer
android.view.ThreadedRenderer$DrawCallbacks
android.view.ThreadedRenderer$ProcessInitializer
+android.view.ThreadedRenderer$ProcessInitializer$1
android.view.TouchDelegate
android.view.VelocityTracker
android.view.VelocityTracker$Estimator
@@ -4563,13 +4481,11 @@
android.view.View$AccessibilityDelegate
android.view.View$AttachInfo
android.view.View$AttachInfo$Callbacks
-android.view.View$AttachInfo$InvalidateInfo
android.view.View$BaseSavedState
android.view.View$BaseSavedState$1
android.view.View$CheckForLongPress
android.view.View$CheckForTap
android.view.View$DeclaredOnClickListener
-android.view.View$DragShadowBuilder
android.view.View$ForegroundInfo
android.view.View$ListenerInfo
android.view.View$MatchIdPredicate
@@ -4585,6 +4501,7 @@
android.view.View$OnKeyListener
android.view.View$OnLayoutChangeListener
android.view.View$OnLongClickListener
+android.view.View$OnScrollChangeListener
android.view.View$OnSystemUiVisibilityChangeListener
android.view.View$OnTouchListener
android.view.View$PerformClick
@@ -4593,6 +4510,7 @@
android.view.View$TooltipInfo
android.view.View$TransformationInfo
android.view.View$UnsetPressedState
+android.view.View$VisibilityChangeForAutofillHandler
android.view.ViewAnimationUtils
android.view.ViewConfiguration
android.view.ViewDebug$CapturedViewProperty
@@ -4603,6 +4521,7 @@
android.view.ViewGroup$2
android.view.ViewGroup$3
android.view.ViewGroup$4
+android.view.ViewGroup$ChildListForAutoFill
android.view.ViewGroup$LayoutParams
android.view.ViewGroup$MarginLayoutParams
android.view.ViewGroup$OnHierarchyChangeListener
@@ -4628,7 +4547,9 @@
android.view.ViewRootImpl$2
android.view.ViewRootImpl$4
android.view.ViewRootImpl$AccessibilityInteractionConnectionManager
+android.view.ViewRootImpl$ActivityConfigCallback
android.view.ViewRootImpl$AsyncInputStage
+android.view.ViewRootImpl$ConfigChangedCallback
android.view.ViewRootImpl$ConsumeBatchedInputImmediatelyRunnable
android.view.ViewRootImpl$ConsumeBatchedInputRunnable
android.view.ViewRootImpl$EarlyPostImeInputStage
@@ -4653,9 +4574,12 @@
android.view.ViewRootImpl$ViewRootHandler
android.view.ViewRootImpl$W
android.view.ViewRootImpl$WindowInputEventReceiver
+android.view.ViewRootImpl$WindowStoppedCallback
android.view.ViewStructure
+android.view.ViewStructure$HtmlInfo
android.view.ViewStub
android.view.ViewStub$OnInflateListener
+android.view.ViewStub$ViewReplaceRunnable
android.view.ViewTreeObserver
android.view.ViewTreeObserver$CopyOnWriteArray
android.view.ViewTreeObserver$CopyOnWriteArray$Access
@@ -4701,24 +4625,23 @@
android.view.WindowManagerPolicy$InputConsumer
android.view.WindowManagerPolicy$OnKeyguardExitResult
android.view.WindowManagerPolicy$PointerEventListener
+android.view.WindowManagerPolicy$ScreenOffListener
android.view.WindowManagerPolicy$ScreenOnListener
android.view.WindowManagerPolicy$StartingSurface
android.view.WindowManagerPolicy$WindowManagerFuncs
android.view.WindowManagerPolicy$WindowState
android.view.accessibility.AccessibilityEvent
+android.view.accessibility.AccessibilityEvent$1
android.view.accessibility.AccessibilityEventSource
android.view.accessibility.AccessibilityManager
android.view.accessibility.AccessibilityManager$1
android.view.accessibility.AccessibilityManager$AccessibilityServicesStateChangeListener
android.view.accessibility.AccessibilityManager$AccessibilityStateChangeListener
android.view.accessibility.AccessibilityManager$HighTextContrastChangeListener
-android.view.accessibility.AccessibilityManager$MyHandler
+android.view.accessibility.AccessibilityManager$MyCallback
android.view.accessibility.AccessibilityManager$TouchExplorationStateChangeListener
android.view.accessibility.AccessibilityNodeInfo
-android.view.accessibility.AccessibilityNodeInfo$1
android.view.accessibility.AccessibilityNodeInfo$AccessibilityAction
-android.view.accessibility.AccessibilityNodeInfo$CollectionInfo
-android.view.accessibility.AccessibilityNodeInfo$CollectionItemInfo
android.view.accessibility.AccessibilityNodeProvider
android.view.accessibility.AccessibilityRecord
android.view.accessibility.CaptioningManager
@@ -4727,6 +4650,9 @@
android.view.accessibility.CaptioningManager$CaptioningChangeListener
android.view.accessibility.CaptioningManager$MyContentObserver
android.view.accessibility.IAccessibilityInteractionConnection
+android.view.accessibility.IAccessibilityInteractionConnection$Stub
+android.view.accessibility.IAccessibilityInteractionConnection$Stub$Proxy
+android.view.accessibility.IAccessibilityInteractionConnectionCallback
android.view.accessibility.IAccessibilityManager
android.view.accessibility.IAccessibilityManager$Stub
android.view.accessibility.IAccessibilityManager$Stub$Proxy
@@ -4758,15 +4684,24 @@
android.view.animation.LinearInterpolator
android.view.animation.OvershootInterpolator
android.view.animation.PathInterpolator
-android.view.animation.RotateAnimation
android.view.animation.ScaleAnimation
android.view.animation.Transformation
android.view.animation.TranslateAnimation
-android.view.autofill.AutoFillId
-android.view.autofill.AutoFillId$1
-android.view.autofill.AutoFillManager
-android.view.autofill.AutoFillType
-android.view.autofill.AutoFillType$1
+android.view.autofill.AutofillId
+android.view.autofill.AutofillId$1
+android.view.autofill.AutofillManager
+android.view.autofill.AutofillManager$AutofillClient
+android.view.autofill.AutofillManager$AutofillManagerClient
+android.view.autofill.AutofillValue
+android.view.autofill.AutofillValue$1
+android.view.autofill.Helper
+android.view.autofill.IAutoFillManager
+android.view.autofill.IAutoFillManager$Stub
+android.view.autofill.IAutoFillManager$Stub$Proxy
+android.view.autofill.IAutoFillManagerClient
+android.view.autofill.IAutoFillManagerClient$Stub
+android.view.autofill.IAutoFillManagerClient$Stub$Proxy
+android.view.autofill.IAutofillWindowPresenter
android.view.inputmethod.BaseInputConnection
android.view.inputmethod.CompletionInfo
android.view.inputmethod.CompletionInfo$1
@@ -4806,9 +4741,9 @@
android.view.inputmethod.InputMethodSubtype$InputMethodSubtypeBuilder
android.view.inputmethod.InputMethodSubtypeArray
android.view.textclassifier.TextClassificationManager
-android.view.textclassifier.TextLanguage
-android.view.textservice.SentenceSuggestionsInfo
-android.view.textservice.SentenceSuggestionsInfo$1
+android.view.textclassifier.TextClassifier
+android.view.textclassifier.TextClassifier$1
+android.view.textclassifier.TextClassifierImpl
android.view.textservice.SpellCheckerInfo
android.view.textservice.SpellCheckerInfo$1
android.view.textservice.SpellCheckerSession
@@ -4820,9 +4755,7 @@
android.view.textservice.SpellCheckerSubtype
android.view.textservice.SpellCheckerSubtype$1
android.view.textservice.SuggestionsInfo
-android.view.textservice.SuggestionsInfo$1
android.view.textservice.TextInfo
-android.view.textservice.TextInfo$1
android.view.textservice.TextServicesManager
android.webkit.ConsoleMessage
android.webkit.ConsoleMessage$MessageLevel
@@ -4830,18 +4763,14 @@
android.webkit.CookieSyncManager
android.webkit.DownloadListener
android.webkit.GeolocationPermissions
-android.webkit.GeolocationPermissions$Callback
android.webkit.IWebViewUpdateService
android.webkit.IWebViewUpdateService$Stub
android.webkit.IWebViewUpdateService$Stub$Proxy
android.webkit.JavascriptInterface
-android.webkit.JsPromptResult
-android.webkit.JsResult
android.webkit.MimeTypeMap
android.webkit.ServiceWorkerClient
android.webkit.ServiceWorkerController
android.webkit.ServiceWorkerWebSettings
-android.webkit.SslErrorHandler
android.webkit.TokenBindingService
android.webkit.URLUtil
android.webkit.UserPackage
@@ -4849,19 +4778,16 @@
android.webkit.WebBackForwardList
android.webkit.WebChromeClient
android.webkit.WebChromeClient$CustomViewCallback
-android.webkit.WebHistoryItem
android.webkit.WebIconDatabase
android.webkit.WebMessage
android.webkit.WebMessagePort
android.webkit.WebResourceRequest
-android.webkit.WebResourceResponse
android.webkit.WebSettings
android.webkit.WebSettings$LayoutAlgorithm
android.webkit.WebSettings$PluginState
android.webkit.WebSettings$RenderPriority
android.webkit.WebSettings$ZoomDensity
android.webkit.WebStorage
-android.webkit.WebStorage$QuotaUpdater
android.webkit.WebSyncManager
android.webkit.WebView
android.webkit.WebView$FindListener
@@ -4880,7 +4806,6 @@
android.webkit.WebViewFactory$RelroFileCreator
android.webkit.WebViewFactoryProvider
android.webkit.WebViewFactoryProvider$Statics
-android.webkit.WebViewFragment
android.webkit.WebViewProvider
android.webkit.WebViewProvider$ScrollDelegate
android.webkit.WebViewProvider$ViewDelegate
@@ -4889,23 +4814,22 @@
android.webkit.WebViewProviderResponse
android.webkit.WebViewProviderResponse$1
android.webkit.WebViewZygote
-android.widget.-$Lambda$50$tfOQKOmkDz_xLYaBQX_cysn8vbE
+android.widget.-$Lambda$ISuHLqeK-K4pmesAfzlFglc3xF4
+android.widget.-$Lambda$ISuHLqeK-K4pmesAfzlFglc3xF4$1
+android.widget.-$Lambda$ISuHLqeK-K4pmesAfzlFglc3xF4$2
+android.widget.-$Lambda$ISuHLqeK-K4pmesAfzlFglc3xF4$3
+android.widget.-$Lambda$tfOQKOmkDz_xLYaBQX_cysn8vbE
android.widget.AbsListView
android.widget.AbsListView$3
-android.widget.AbsListView$4
-android.widget.AbsListView$AbsPositionScroller
android.widget.AbsListView$AdapterDataSetObserver
android.widget.AbsListView$CheckForTap
android.widget.AbsListView$FlingRunnable
android.widget.AbsListView$FlingRunnable$1
-android.widget.AbsListView$InputConnectionWrapper
android.widget.AbsListView$LayoutParams
android.widget.AbsListView$MultiChoiceModeListener
android.widget.AbsListView$MultiChoiceModeWrapper
android.widget.AbsListView$OnScrollListener
android.widget.AbsListView$PerformClick
-android.widget.AbsListView$PositionScroller
-android.widget.AbsListView$PositionScroller$1
android.widget.AbsListView$RecycleBin
android.widget.AbsListView$RecyclerListener
android.widget.AbsListView$SavedState
@@ -4915,20 +4839,14 @@
android.widget.AbsSeekBar
android.widget.AbsSpinner
android.widget.AbsSpinner$RecycleBin
-android.widget.AbsSpinner$SavedState
-android.widget.AbsSpinner$SavedState$1
android.widget.AbsoluteLayout
android.widget.ActionMenuPresenter
android.widget.ActionMenuPresenter$1
android.widget.ActionMenuPresenter$2
android.widget.ActionMenuPresenter$ActionMenuPopupCallback
-android.widget.ActionMenuPresenter$OpenOverflowRunnable
android.widget.ActionMenuPresenter$OverflowMenuButton
android.widget.ActionMenuPresenter$OverflowMenuButton$1
-android.widget.ActionMenuPresenter$OverflowPopup
android.widget.ActionMenuPresenter$PopupPresenterCallback
-android.widget.ActionMenuPresenter$SavedState
-android.widget.ActionMenuPresenter$SavedState$1
android.widget.ActionMenuView
android.widget.ActionMenuView$ActionMenuChildView
android.widget.ActionMenuView$ActionMenuPresenterCallback
@@ -4937,7 +4855,6 @@
android.widget.ActionMenuView$OnMenuItemClickListener
android.widget.Adapter
android.widget.AdapterView
-android.widget.AdapterView$AdapterContextMenuInfo
android.widget.AdapterView$AdapterDataSetObserver
android.widget.AdapterView$OnItemClickListener
android.widget.AdapterView$OnItemLongClickListener
@@ -4960,11 +4877,9 @@
android.widget.Chronometer$1
android.widget.CompoundButton
android.widget.CompoundButton$OnCheckedChangeListener
-android.widget.CompoundButton$SavedState
-android.widget.CompoundButton$SavedState$1
android.widget.CursorAdapter
android.widget.CursorFilter$CursorFilterClient
-android.widget.DatePicker$OnDateChangedListener
+android.widget.DatePicker
android.widget.DateTimeView
android.widget.DateTimeView$ReceiverInfo
android.widget.DateTimeView$ReceiverInfo$1
@@ -4988,7 +4903,6 @@
android.widget.Editor$InsertionPointCursorController
android.widget.Editor$PositionListener
android.widget.Editor$ProcessTextIntentActionsHandler
-android.widget.Editor$SelectionHandleView
android.widget.Editor$SelectionModifierCursorController
android.widget.Editor$SpanController
android.widget.Editor$SuggestionHelper
@@ -5010,11 +4924,8 @@
android.widget.Filter$RequestArguments
android.widget.Filter$RequestHandler
android.widget.Filter$ResultsHandler
-android.widget.FilterQueryProvider
android.widget.Filterable
android.widget.ForwardingListener
-android.widget.ForwardingListener$DisallowIntercept
-android.widget.ForwardingListener$TriggerLongPress
android.widget.FrameLayout
android.widget.FrameLayout$LayoutParams
android.widget.GridLayout
@@ -5045,6 +4956,7 @@
android.widget.HorizontalScrollView$SavedState$1
android.widget.ImageButton
android.widget.ImageView
+android.widget.ImageView$ImageDrawableCallback
android.widget.ImageView$ScaleType
android.widget.LinearLayout
android.widget.LinearLayout$LayoutParams
@@ -5061,18 +4973,7 @@
android.widget.ListView$ArrowScrollFocusResult
android.widget.ListView$FixedViewInfo
android.widget.MediaController
-android.widget.MediaController$1
-android.widget.MediaController$2
-android.widget.MediaController$3
-android.widget.MediaController$4
-android.widget.MediaController$5
-android.widget.MediaController$6
-android.widget.MediaController$7
-android.widget.MediaController$8
android.widget.MediaController$MediaPlayerControl
-android.widget.MenuItemHoverListener
-android.widget.MenuPopupWindow
-android.widget.MenuPopupWindow$MenuDropDownListView
android.widget.MultiAutoCompleteTextView
android.widget.MultiAutoCompleteTextView$Tokenizer
android.widget.NumberPicker
@@ -5084,20 +4985,14 @@
android.widget.PopupMenu$1
android.widget.PopupMenu$2
android.widget.PopupMenu$3
-android.widget.PopupMenu$OnDismissListener
android.widget.PopupMenu$OnMenuItemClickListener
android.widget.PopupWindow
android.widget.PopupWindow$1
android.widget.PopupWindow$2
-android.widget.PopupWindow$3
android.widget.PopupWindow$OnDismissListener
android.widget.PopupWindow$PopupBackgroundView
android.widget.PopupWindow$PopupDecorView
android.widget.PopupWindow$PopupDecorView$1
-android.widget.PopupWindow$PopupDecorView$2
-android.widget.PopupWindow$PopupDecorView$2$1
-android.widget.PopupWindow$PopupDecorView$3
-android.widget.PopupWindow$PopupDecorView$4
android.widget.ProgressBar
android.widget.ProgressBar$1
android.widget.ProgressBar$ProgressTintInfo
@@ -5122,25 +5017,30 @@
android.widget.RemoteViews$1
android.widget.RemoteViews$2
android.widget.RemoteViews$3
-android.widget.RemoteViews$4
android.widget.RemoteViews$Action
android.widget.RemoteViews$ActionException
+android.widget.RemoteViews$AsyncApplyTask
android.widget.RemoteViews$BitmapCache
android.widget.RemoteViews$BitmapReflectionAction
android.widget.RemoteViews$LayoutParamAction
android.widget.RemoteViews$MemoryUsageCounter
android.widget.RemoteViews$MutablePair
android.widget.RemoteViews$OnClickHandler
+android.widget.RemoteViews$OnViewAppliedListener
android.widget.RemoteViews$ReflectionAction
android.widget.RemoteViews$RemoteView
+android.widget.RemoteViews$RemoteViewsContextWrapper
+android.widget.RemoteViews$RunnableAction
android.widget.RemoteViews$RuntimeAction
android.widget.RemoteViews$SetDrawableParameters
android.widget.RemoteViews$SetOnClickPendingIntent
android.widget.RemoteViews$SetOnClickPendingIntent$1
android.widget.RemoteViews$ViewGroupAction
+android.widget.RemoteViews$ViewGroupAction$1
+android.widget.RemoteViews$ViewGroupAction$2
+android.widget.RemoteViews$ViewPaddingAction
+android.widget.RemoteViews$ViewTree
android.widget.RemoteViewsAdapter$RemoteAdapterConnectionCallback
-android.widget.RemoteViewsService
-android.widget.RemoteViewsService$RemoteViewsFactory
android.widget.ResourceCursorAdapter
android.widget.RtlSpacingHelper
android.widget.ScrollBarDrawable
@@ -5149,37 +5049,23 @@
android.widget.ScrollView$SavedState$1
android.widget.Scroller
android.widget.Scroller$ViscousFluidInterpolator
-android.widget.SearchView
-android.widget.SearchView$1
-android.widget.SearchView$10
-android.widget.SearchView$11
-android.widget.SearchView$2
-android.widget.SearchView$3
-android.widget.SearchView$4
-android.widget.SearchView$5
-android.widget.SearchView$6
-android.widget.SearchView$7
-android.widget.SearchView$8
-android.widget.SearchView$9
android.widget.SearchView$OnCloseListener
-android.widget.SearchView$OnQueryTextListener
-android.widget.SearchView$SearchAutoComplete
-android.widget.SearchView$UpdatableTouchDelegate
android.widget.SectionIndexer
android.widget.SeekBar
android.widget.SeekBar$OnSeekBarChangeListener
+android.widget.SelectionActionModeHelper
+android.widget.SelectionActionModeHelper$SelectionTracker
+android.widget.SelectionActionModeHelper$TextClassificationHelper
android.widget.SimpleCursorAdapter
android.widget.Space
android.widget.SpellChecker
-android.widget.SpellChecker$1
android.widget.SpellChecker$SpellParser
android.widget.Spinner
android.widget.Spinner$1
+android.widget.Spinner$DialogPopup
android.widget.Spinner$DropDownAdapter
android.widget.Spinner$DropdownPopup
android.widget.Spinner$DropdownPopup$1
-android.widget.Spinner$SavedState
-android.widget.Spinner$SavedState$1
android.widget.Spinner$SpinnerPopup
android.widget.SpinnerAdapter
android.widget.Switch
@@ -5198,11 +5084,6 @@
android.widget.TabWidget$OnTabSelectionChanged
android.widget.TabWidget$TabClickListener
android.widget.TableLayout
-android.widget.TableLayout$LayoutParams
-android.widget.TableLayout$PassThroughHierarchyChangeListener
-android.widget.TableRow
-android.widget.TableRow$ChildrenTracker
-android.widget.TableRow$LayoutParams
android.widget.TextClock
android.widget.TextClock$1
android.widget.TextClock$2
@@ -5215,6 +5096,10 @@
android.widget.TextView$ChangeWatcher
android.widget.TextView$CharWrapper
android.widget.TextView$Drawables
+android.widget.TextView$Marquee
+android.widget.TextView$Marquee$1
+android.widget.TextView$Marquee$2
+android.widget.TextView$Marquee$3
android.widget.TextView$OnEditorActionListener
android.widget.TextView$SavedState
android.widget.TextView$SavedState$1
@@ -5231,52 +5116,15 @@
android.widget.Toolbar$ExpandedActionViewMenuPresenter
android.widget.Toolbar$LayoutParams
android.widget.Toolbar$OnMenuItemClickListener
-android.widget.Toolbar$SavedState
-android.widget.Toolbar$SavedState$1
android.widget.VideoView
-android.widget.VideoView$1
-android.widget.VideoView$2
-android.widget.VideoView$3
-android.widget.VideoView$4
-android.widget.VideoView$5
-android.widget.VideoView$6
-android.widget.VideoView$7
android.widget.ViewAnimator
android.widget.ViewFlipper
android.widget.ViewFlipper$1
android.widget.ViewFlipper$2
android.widget.ViewSwitcher
android.widget.WrapperListAdapter
-android.widget.ZoomButtonsController
-com.android.dex.ClassData
-com.android.dex.ClassData$Method
-com.android.dex.ClassDef
-com.android.dex.Code
-com.android.dex.Dex
-com.android.dex.Dex$ClassDefIterable
-com.android.dex.Dex$FieldIdTable
-com.android.dex.Dex$MethodIdTable
-com.android.dex.Dex$ProtoIdTable
-com.android.dex.Dex$Section
-com.android.dex.Dex$StringTable
-com.android.dex.Dex$TypeIndexToDescriptorIndexTable
-com.android.dex.Dex$TypeIndexToDescriptorTable
-com.android.dex.DexException
-com.android.dex.DexFormat
-com.android.dex.FieldId
-com.android.dex.Leb128
-com.android.dex.MethodId
-com.android.dex.Mutf8
-com.android.dex.TableOfContents
-com.android.dex.TableOfContents$Section
-com.android.dex.TypeList
-com.android.dex.util.ByteInput
-com.android.dex.util.ByteOutput
-com.android.dex.util.ExceptionWithContext
-com.android.dex.util.FileUtils
com.android.framework.protobuf.nano.CodedInputByteBufferNano
com.android.framework.protobuf.nano.CodedOutputByteBufferNano
-com.android.framework.protobuf.nano.ExtendableMessageNano
com.android.framework.protobuf.nano.InternalNano
com.android.framework.protobuf.nano.InvalidProtocolBufferNanoException
com.android.framework.protobuf.nano.MessageNano
@@ -5316,6 +5164,7 @@
com.android.i18n.phonenumbers.geocoding.PhoneNumberOfflineGeocoder
com.android.i18n.phonenumbers.prefixmapper.MappingFileProvider
com.android.i18n.phonenumbers.prefixmapper.PrefixFileReader
+com.android.ims.-$Lambda$AvFHcs3Z6Dq6dkOugMW9Kc7Qzng$4
com.android.ims.ImsCall$Listener
com.android.ims.ImsCallForwardInfo
com.android.ims.ImsCallProfile
@@ -5330,11 +5179,8 @@
com.android.ims.ImsExternalCallStateListener
com.android.ims.ImsManager
com.android.ims.ImsManager$1
-com.android.ims.ImsManager$2
com.android.ims.ImsManager$ImsRegistrationListenerProxy
com.android.ims.ImsManager$ImsServiceDeathRecipient
-com.android.ims.ImsMultiEndpoint
-com.android.ims.ImsMultiEndpoint$ImsExternalCallStateListenerProxy
com.android.ims.ImsReasonInfo
com.android.ims.ImsReasonInfo$1
com.android.ims.ImsSsInfo
@@ -5342,80 +5188,32 @@
com.android.ims.internal.IImsCallSessionListener
com.android.ims.internal.IImsConfig
com.android.ims.internal.IImsConfig$Stub
-com.android.ims.internal.IImsConfig$Stub$Proxy
com.android.ims.internal.IImsEcbm
com.android.ims.internal.IImsEcbm$Stub
com.android.ims.internal.IImsEcbmListener
com.android.ims.internal.IImsEcbmListener$Stub
-com.android.ims.internal.IImsExternalCallStateListener
-com.android.ims.internal.IImsExternalCallStateListener$Stub
com.android.ims.internal.IImsMultiEndpoint
-com.android.ims.internal.IImsMultiEndpoint$Stub
com.android.ims.internal.IImsRegistrationListener
com.android.ims.internal.IImsRegistrationListener$Stub
-com.android.ims.internal.IImsRegistrationListener$Stub$Proxy
com.android.ims.internal.IImsService
com.android.ims.internal.IImsService$Stub
-com.android.ims.internal.IImsService$Stub$Proxy
com.android.ims.internal.IImsServiceController
com.android.ims.internal.IImsServiceFeatureListener
com.android.ims.internal.IImsUt
com.android.ims.internal.IImsUt$Stub
com.android.ims.internal.IImsUtListener
com.android.ims.internal.IImsUtListener$Stub
-com.android.ims.internal.uce.common.CapInfo
-com.android.ims.internal.uce.common.CapInfo$1
-com.android.ims.internal.uce.common.StatusCode
-com.android.ims.internal.uce.common.StatusCode$1
-com.android.ims.internal.uce.common.UceLong
-com.android.ims.internal.uce.common.UceLong$1
-com.android.ims.internal.uce.options.IOptionsListener
-com.android.ims.internal.uce.options.IOptionsService
-com.android.ims.internal.uce.presence.IPresenceListener
-com.android.ims.internal.uce.presence.IPresenceListener$Stub
-com.android.ims.internal.uce.presence.IPresenceListener$Stub$Proxy
-com.android.ims.internal.uce.presence.IPresenceService
-com.android.ims.internal.uce.presence.IPresenceService$Stub
-com.android.ims.internal.uce.presence.IPresenceService$Stub$Proxy
-com.android.ims.internal.uce.presence.PresCapInfo
-com.android.ims.internal.uce.presence.PresCmdId
-com.android.ims.internal.uce.presence.PresCmdId$1
-com.android.ims.internal.uce.presence.PresCmdStatus
-com.android.ims.internal.uce.presence.PresCmdStatus$1
-com.android.ims.internal.uce.presence.PresPublishTriggerType
-com.android.ims.internal.uce.presence.PresPublishTriggerType$1
-com.android.ims.internal.uce.presence.PresResInfo
-com.android.ims.internal.uce.presence.PresResInfo$1
-com.android.ims.internal.uce.presence.PresResInstanceInfo
-com.android.ims.internal.uce.presence.PresResInstanceInfo$1
-com.android.ims.internal.uce.presence.PresRlmiInfo
-com.android.ims.internal.uce.presence.PresRlmiInfo$1
-com.android.ims.internal.uce.presence.PresServiceInfo
-com.android.ims.internal.uce.presence.PresSipResponse
-com.android.ims.internal.uce.presence.PresSipResponse$1
-com.android.ims.internal.uce.presence.PresSubscriptionState
-com.android.ims.internal.uce.presence.PresSubscriptionState$1
-com.android.ims.internal.uce.presence.PresTupleInfo
-com.android.ims.internal.uce.presence.PresTupleInfo$1
-com.android.ims.internal.uce.uceservice.IUceListener
-com.android.ims.internal.uce.uceservice.IUceListener$Stub
-com.android.ims.internal.uce.uceservice.IUceService
-com.android.ims.internal.uce.uceservice.IUceService$Stub
-com.android.ims.internal.uce.uceservice.IUceService$Stub$Proxy
-com.android.ims.internal.uce.uceservice.ImsUceManager
-com.android.ims.internal.uce.uceservice.ImsUceManager$UceServiceDeathRecipient
com.android.internal.R$styleable
com.android.internal.alsa.AlsaCardsParser
com.android.internal.alsa.AlsaCardsParser$AlsaCardRecord
com.android.internal.alsa.AlsaDevicesParser
com.android.internal.alsa.LineTokenizer
-com.android.internal.app.AlertActivity
com.android.internal.app.AlertController
com.android.internal.app.AlertController$1
com.android.internal.app.AlertController$AlertParams
-com.android.internal.app.AlertController$AlertParams$3
+com.android.internal.app.AlertController$AlertParams$1
+com.android.internal.app.AlertController$AlertParams$4
com.android.internal.app.AlertController$ButtonHandler
-com.android.internal.app.AlertController$CheckedItemAdapter
com.android.internal.app.AlertController$RecycleListView
com.android.internal.app.AssistUtils
com.android.internal.app.IAppOpsCallback
@@ -5425,7 +5223,6 @@
com.android.internal.app.IAppOpsService$Stub
com.android.internal.app.IAppOpsService$Stub$Proxy
com.android.internal.app.IAssistScreenshotReceiver
-com.android.internal.app.IAssistScreenshotReceiver$Stub
com.android.internal.app.IBatteryStats
com.android.internal.app.IBatteryStats$Stub
com.android.internal.app.IBatteryStats$Stub$Proxy
@@ -5442,15 +5239,9 @@
com.android.internal.app.IVoiceInteractionSessionListener$Stub$Proxy
com.android.internal.app.IVoiceInteractionSessionShowCallback
com.android.internal.app.IVoiceInteractionSessionShowCallback$Stub
-com.android.internal.app.IVoiceInteractionSessionShowCallback$Stub$Proxy
com.android.internal.app.IVoiceInteractor
com.android.internal.app.IVoiceInteractor$Stub
-com.android.internal.app.IVoiceInteractor$Stub$Proxy
-com.android.internal.app.LocaleHelper
-com.android.internal.app.LocalePicker
-com.android.internal.app.LocalePickerWithRegion$LocaleSelectedListener
com.android.internal.app.NightDisplayController
-com.android.internal.app.NightDisplayController$1
com.android.internal.app.NightDisplayController$Callback
com.android.internal.app.NightDisplayController$LocalTime
com.android.internal.app.ProcessMap
@@ -5465,20 +5256,16 @@
com.android.internal.app.WindowDecorActionBar$1
com.android.internal.app.WindowDecorActionBar$2
com.android.internal.app.WindowDecorActionBar$3
-com.android.internal.app.procstats.DumpUtils
+com.android.internal.app.WindowDecorActionBar$ActionModeImpl
com.android.internal.app.procstats.DurationsTable
com.android.internal.app.procstats.IProcessStats
com.android.internal.app.procstats.IProcessStats$Stub
-com.android.internal.app.procstats.IProcessStats$Stub$Proxy
com.android.internal.app.procstats.ProcessState
com.android.internal.app.procstats.ProcessState$1
-com.android.internal.app.procstats.ProcessState$PssAggr
com.android.internal.app.procstats.ProcessStats
com.android.internal.app.procstats.ProcessStats$1
com.android.internal.app.procstats.ProcessStats$PackageState
-com.android.internal.app.procstats.ProcessStats$ProcessDataCollection
com.android.internal.app.procstats.ProcessStats$ProcessStateHolder
-com.android.internal.app.procstats.ProcessStats$TotalMemoryUseCollection
com.android.internal.app.procstats.PssTable
com.android.internal.app.procstats.ServiceState
com.android.internal.app.procstats.SparseMappingTable
@@ -5495,8 +5282,12 @@
com.android.internal.backup.IBackupTransport$Stub$Proxy
com.android.internal.backup.LocalTransport
com.android.internal.backup.LocalTransportService
+com.android.internal.content.FileSystemProvider
com.android.internal.content.NativeLibraryHelper
+com.android.internal.content.NativeLibraryHelper$Handle
com.android.internal.content.PackageHelper
+com.android.internal.content.PackageHelper$1
+com.android.internal.content.PackageHelper$TestableInterface
com.android.internal.content.PackageMonitor
com.android.internal.content.ReferrerIntent
com.android.internal.content.ReferrerIntent$1
@@ -5539,25 +5330,25 @@
com.android.internal.net.VpnConfig
com.android.internal.net.VpnInfo
com.android.internal.net.VpnProfile
+com.android.internal.notification.SystemNotificationChannels
com.android.internal.os.AndroidPrintStream
com.android.internal.os.AppFuseMount
com.android.internal.os.AtomicFile
com.android.internal.os.BackgroundThread
-com.android.internal.os.BatterySipper
-com.android.internal.os.BatterySipper$DrainType
com.android.internal.os.BatteryStatsHelper
-com.android.internal.os.BatteryStatsHelper$1
com.android.internal.os.BatteryStatsImpl
com.android.internal.os.BatteryStatsImpl$1
-com.android.internal.os.BatteryStatsImpl$5
+com.android.internal.os.BatteryStatsImpl$6
com.android.internal.os.BatteryStatsImpl$BatchTimer
com.android.internal.os.BatteryStatsImpl$BatteryCallback
com.android.internal.os.BatteryStatsImpl$Clocks
com.android.internal.os.BatteryStatsImpl$ControllerActivityCounterImpl
com.android.internal.os.BatteryStatsImpl$Counter
+com.android.internal.os.BatteryStatsImpl$DualTimer
com.android.internal.os.BatteryStatsImpl$DurationTimer
com.android.internal.os.BatteryStatsImpl$ExternalStatsSync
com.android.internal.os.BatteryStatsImpl$LongSamplingCounter
+com.android.internal.os.BatteryStatsImpl$LongSamplingCounterArray
com.android.internal.os.BatteryStatsImpl$MyHandler
com.android.internal.os.BatteryStatsImpl$OverflowArrayMap
com.android.internal.os.BatteryStatsImpl$PlatformIdleStateCallback
@@ -5573,43 +5364,32 @@
com.android.internal.os.BatteryStatsImpl$Uid$3
com.android.internal.os.BatteryStatsImpl$Uid$Pkg
com.android.internal.os.BatteryStatsImpl$Uid$Pkg$Serv
-com.android.internal.os.BatteryStatsImpl$Uid$Proc
com.android.internal.os.BatteryStatsImpl$Uid$Sensor
com.android.internal.os.BatteryStatsImpl$Uid$Wakelock
com.android.internal.os.BinderInternal
com.android.internal.os.BinderInternal$GcWatcher
-com.android.internal.os.BluetoothPowerCalculator
-com.android.internal.os.CameraPowerCalculator
-com.android.internal.os.CpuPowerCalculator
-com.android.internal.os.FlashlightPowerCalculator
com.android.internal.os.FuseAppLoop
com.android.internal.os.FuseAppLoop$1
-com.android.internal.os.FuseAppLoop$UnmountedException
+com.android.internal.os.FuseUnavailableMountException
com.android.internal.os.HandlerCaller
com.android.internal.os.HandlerCaller$Callback
com.android.internal.os.HandlerCaller$MyHandler
com.android.internal.os.IDropBoxManagerService
com.android.internal.os.IDropBoxManagerService$Stub
com.android.internal.os.IDropBoxManagerService$Stub$Proxy
-com.android.internal.os.IParcelFileDescriptorFactory
com.android.internal.os.IResultReceiver
com.android.internal.os.IResultReceiver$Stub
com.android.internal.os.IResultReceiver$Stub$Proxy
-com.android.internal.os.IShellCallback
-com.android.internal.os.IShellCallback$Stub
-com.android.internal.os.IShellCallback$Stub$Proxy
com.android.internal.os.KernelCpuSpeedReader
com.android.internal.os.KernelMemoryBandwidthStats
+com.android.internal.os.KernelUidCpuFreqTimeReader
com.android.internal.os.KernelUidCpuTimeReader
com.android.internal.os.KernelWakelockReader
com.android.internal.os.KernelWakelockStats
com.android.internal.os.KernelWakelockStats$Entry
com.android.internal.os.LoggingPrintStream
com.android.internal.os.LoggingPrintStream$1
-com.android.internal.os.MemoryPowerCalculator
-com.android.internal.os.MobileRadioPowerCalculator
com.android.internal.os.PathClassLoaderFactory
-com.android.internal.os.PowerCalculator
com.android.internal.os.PowerProfile
com.android.internal.os.PowerProfile$CpuClusterKey
com.android.internal.os.ProcessCpuTracker
@@ -5623,11 +5403,7 @@
com.android.internal.os.RuntimeInit$KillApplicationHandler
com.android.internal.os.RuntimeInit$LoggingHandler
com.android.internal.os.SamplingProfilerIntegration
-com.android.internal.os.SensorPowerCalculator
com.android.internal.os.SomeArgs
-com.android.internal.os.TransferPipe
-com.android.internal.os.WakelockPowerCalculator
-com.android.internal.os.WifiPowerCalculator
com.android.internal.os.Zygote
com.android.internal.os.Zygote$MethodAndArgsCaller
com.android.internal.os.ZygoteConnection
@@ -5638,6 +5414,8 @@
com.android.internal.policy.DecorContext
com.android.internal.policy.DecorView
com.android.internal.policy.DecorView$1
+com.android.internal.policy.DecorView$ActionModeCallback2Wrapper
+com.android.internal.policy.DecorView$ColorViewAttributes
com.android.internal.policy.DecorView$ColorViewState
com.android.internal.policy.DividerSnapAlgorithm
com.android.internal.policy.DividerSnapAlgorithm$SnapTarget
@@ -5662,12 +5440,9 @@
com.android.internal.policy.PhoneWindow$1
com.android.internal.policy.PhoneWindow$ActionMenuPresenterCallback
com.android.internal.policy.PhoneWindow$PanelFeatureState
-com.android.internal.policy.PhoneWindow$PanelFeatureState$SavedState
-com.android.internal.policy.PhoneWindow$PanelFeatureState$SavedState$1
com.android.internal.policy.PhoneWindow$PhoneWindowMenuCallback
com.android.internal.policy.PhoneWindow$RotationWatcher
com.android.internal.policy.PhoneWindow$RotationWatcher$1
-com.android.internal.policy.PipMotionHelper
com.android.internal.policy.PipSnapAlgorithm
com.android.internal.statusbar.IStatusBar
com.android.internal.statusbar.IStatusBar$Stub
@@ -5687,7 +5462,6 @@
com.android.internal.telecom.IConnectionServiceAdapter$Stub$Proxy
com.android.internal.telecom.IInCallAdapter
com.android.internal.telecom.IInCallAdapter$Stub
-com.android.internal.telecom.IInCallAdapter$Stub$Proxy
com.android.internal.telecom.IInCallService
com.android.internal.telecom.IInCallService$Stub
com.android.internal.telecom.IInCallService$Stub$Proxy
@@ -5715,6 +5489,8 @@
com.android.internal.telephony.CallerInfoAsyncQuery$CookieWrapper
com.android.internal.telephony.CallerInfoAsyncQuery$OnQueryCompleteListener
com.android.internal.telephony.CarrierActionAgent
+com.android.internal.telephony.CarrierActionAgent$1
+com.android.internal.telephony.CarrierActionAgent$SettingsObserver
com.android.internal.telephony.CarrierAppUtils
com.android.internal.telephony.CarrierServiceBindHelper
com.android.internal.telephony.CarrierServiceBindHelper$1
@@ -5738,6 +5514,9 @@
com.android.internal.telephony.DctConstants$State
com.android.internal.telephony.DebugService
com.android.internal.telephony.DefaultPhoneNotifier
+com.android.internal.telephony.DeviceStateMonitor
+com.android.internal.telephony.DeviceStateMonitor$1
+com.android.internal.telephony.DeviceStateMonitor$2
com.android.internal.telephony.EncodeException
com.android.internal.telephony.GsmAlphabet
com.android.internal.telephony.GsmAlphabet$TextEncodingDetails
@@ -5749,7 +5528,6 @@
com.android.internal.telephony.GsmCdmaPhone$1
com.android.internal.telephony.GsmCdmaPhone$2
com.android.internal.telephony.HardwareConfig
-com.android.internal.telephony.HbpcdUtils
com.android.internal.telephony.ICarrierConfigLoader
com.android.internal.telephony.ICarrierConfigLoader$Stub
com.android.internal.telephony.ICarrierConfigLoader$Stub$Proxy
@@ -5798,18 +5576,18 @@
com.android.internal.telephony.InboundSmsHandler$StartupState
com.android.internal.telephony.InboundSmsHandler$WaitingState
com.android.internal.telephony.IntRangeManager
-com.android.internal.telephony.MccTable
-com.android.internal.telephony.MccTable$MccEntry
+com.android.internal.telephony.OemHookIndication
+com.android.internal.telephony.OemHookResponse
com.android.internal.telephony.OperatorInfo
com.android.internal.telephony.Phone
com.android.internal.telephony.Phone$1
+com.android.internal.telephony.PhoneConstantConversions
com.android.internal.telephony.PhoneConstants$DataState
com.android.internal.telephony.PhoneConstants$State
com.android.internal.telephony.PhoneFactory
com.android.internal.telephony.PhoneInternalInterface
com.android.internal.telephony.PhoneInternalInterface$DataActivityState
com.android.internal.telephony.PhoneNotifier
-com.android.internal.telephony.PhoneStateIntentReceiver
com.android.internal.telephony.PhoneSubInfoController
com.android.internal.telephony.PhoneSwitcher
com.android.internal.telephony.PhoneSwitcher$1
@@ -5819,10 +5597,6 @@
com.android.internal.telephony.ProxyController
com.android.internal.telephony.ProxyController$1
com.android.internal.telephony.RIL
-com.android.internal.telephony.RIL$1
-com.android.internal.telephony.RIL$2
-com.android.internal.telephony.RIL$RILReceiver
-com.android.internal.telephony.RIL$RILSender
com.android.internal.telephony.RIL$RadioProxyDeathRecipient
com.android.internal.telephony.RIL$RilHandler
com.android.internal.telephony.RILConstants
@@ -5843,6 +5617,8 @@
com.android.internal.telephony.ServiceStateTracker$3
com.android.internal.telephony.ServiceStateTracker$CellInfoResult
com.android.internal.telephony.ServiceStateTracker$SstSubscriptionsChangedListener
+com.android.internal.telephony.SimActivationTracker
+com.android.internal.telephony.SimActivationTracker$1
com.android.internal.telephony.SmsApplication
com.android.internal.telephony.SmsApplication$SmsApplicationData
com.android.internal.telephony.SmsApplication$SmsPackageMonitor
@@ -5879,21 +5655,8 @@
com.android.internal.telephony.WapPushOverSms$1
com.android.internal.telephony.WapPushOverSms$BindServiceThread
com.android.internal.telephony.cat.AppInterface
-com.android.internal.telephony.cat.AppInterface$CommandType
-com.android.internal.telephony.cat.CatCmdMessage
-com.android.internal.telephony.cat.CatCmdMessage$BrowserSettings
-com.android.internal.telephony.cat.CatCmdMessage$CallSettings
-com.android.internal.telephony.cat.CatCmdMessage$SetupEventListSettings
com.android.internal.telephony.cat.CatLog
-com.android.internal.telephony.cat.CatResponseMessage
com.android.internal.telephony.cat.CatService
-com.android.internal.telephony.cat.Input
-com.android.internal.telephony.cat.Item
-com.android.internal.telephony.cat.LaunchBrowserMode
-com.android.internal.telephony.cat.Menu
-com.android.internal.telephony.cat.ResultCode
-com.android.internal.telephony.cat.TextMessage
-com.android.internal.telephony.cat.ToneSettings
com.android.internal.telephony.cdma.CdmaInboundSmsHandler
com.android.internal.telephony.cdma.CdmaSMSDispatcher
com.android.internal.telephony.cdma.CdmaServiceCategoryProgramHandler
@@ -5901,7 +5664,6 @@
com.android.internal.telephony.cdma.CdmaSubscriptionSourceManager
com.android.internal.telephony.cdma.EriInfo
com.android.internal.telephony.cdma.EriManager
-com.android.internal.telephony.cdma.EriManager$EriDisplayInformation
com.android.internal.telephony.cdma.EriManager$EriFile
com.android.internal.telephony.dataconnection.ApnContext
com.android.internal.telephony.dataconnection.DataConnection
@@ -5934,9 +5696,9 @@
com.android.internal.telephony.gsm.GsmSMSDispatcher
com.android.internal.telephony.gsm.SmsMessage
com.android.internal.telephony.gsm.UsimDataDownloadHandler
-com.android.internal.telephony.ims.-$Lambda$2$6hDwuvYxqWrzW_Ex5wc53XnUOpg
-com.android.internal.telephony.ims.-$Lambda$3$6hDwuvYxqWrzW_Ex5wc53XnUOpg
-com.android.internal.telephony.ims.-$Lambda$4$6hDwuvYxqWrzW_Ex5wc53XnUOpg
+com.android.internal.telephony.ims.-$Lambda$6hDwuvYxqWrzW_Ex5wc53XnUOpg
+com.android.internal.telephony.ims.-$Lambda$6hDwuvYxqWrzW_Ex5wc53XnUOpg$1
+com.android.internal.telephony.ims.-$Lambda$6hDwuvYxqWrzW_Ex5wc53XnUOpg$2
com.android.internal.telephony.ims.ImsResolver
com.android.internal.telephony.ims.ImsResolver$1
com.android.internal.telephony.ims.ImsResolver$2
@@ -5944,6 +5706,8 @@
com.android.internal.telephony.ims.ImsResolver$ImsServiceControllerFactory
com.android.internal.telephony.ims.ImsResolver$SubscriptionManagerProxy
com.android.internal.telephony.ims.ImsServiceController$ImsServiceControllerCallbacks
+com.android.internal.telephony.imsphone.-$Lambda$tILLuSJl16qfDJK1ikBVGFm2D5w
+com.android.internal.telephony.imsphone.-$Lambda$tILLuSJl16qfDJK1ikBVGFm2D5w$1
com.android.internal.telephony.imsphone.ImsExternalCallTracker
com.android.internal.telephony.imsphone.ImsExternalCallTracker$1
com.android.internal.telephony.imsphone.ImsExternalCallTracker$2
@@ -5963,6 +5727,7 @@
com.android.internal.telephony.imsphone.ImsPhoneCallTracker$3
com.android.internal.telephony.imsphone.ImsPhoneCallTracker$4
com.android.internal.telephony.imsphone.ImsPhoneCallTracker$5
+com.android.internal.telephony.imsphone.ImsPhoneCallTracker$IRetryTimeout
com.android.internal.telephony.imsphone.ImsPhoneCallTracker$PhoneStateListener
com.android.internal.telephony.imsphone.ImsPhoneCommandInterface
com.android.internal.telephony.imsphone.ImsPhoneFactory
@@ -5984,6 +5749,12 @@
com.android.internal.telephony.nano.TelephonyProto$TelephonyServiceState
com.android.internal.telephony.nano.TelephonyProto$TelephonyServiceState$TelephonyOperator
com.android.internal.telephony.nano.TelephonyProto$TelephonySettings
+com.android.internal.telephony.protobuf.nano.CodedOutputByteBufferNano
+com.android.internal.telephony.protobuf.nano.ExtendableMessageNano
+com.android.internal.telephony.protobuf.nano.InternalNano
+com.android.internal.telephony.protobuf.nano.InvalidProtocolBufferNanoException
+com.android.internal.telephony.protobuf.nano.MessageNano
+com.android.internal.telephony.protobuf.nano.WireFormatNano
com.android.internal.telephony.test.SimulatedRadioControl
com.android.internal.telephony.uicc.IccCardApplicationStatus
com.android.internal.telephony.uicc.IccCardApplicationStatus$AppType
@@ -5993,16 +5764,20 @@
com.android.internal.telephony.uicc.IccCardStatus$PinState
com.android.internal.telephony.uicc.IccConstants
com.android.internal.telephony.uicc.IccRecords
-com.android.internal.telephony.uicc.IccRefreshResponse
com.android.internal.telephony.uicc.IccUtils
com.android.internal.telephony.uicc.UiccCard
com.android.internal.telephony.uicc.UiccCard$1
com.android.internal.telephony.uicc.UiccCardApplication
com.android.internal.telephony.uicc.UiccController
com.android.internal.telephony.uicc.UiccStateChangedLauncher
+com.android.internal.telephony.util.NotificationChannelController
+com.android.internal.telephony.util.NotificationChannelController$1
com.android.internal.textservice.ISpellCheckerService
com.android.internal.textservice.ISpellCheckerService$Stub
com.android.internal.textservice.ISpellCheckerService$Stub$Proxy
+com.android.internal.textservice.ISpellCheckerServiceCallback
+com.android.internal.textservice.ISpellCheckerServiceCallback$Stub
+com.android.internal.textservice.ISpellCheckerServiceCallback$Stub$Proxy
com.android.internal.textservice.ISpellCheckerSession
com.android.internal.textservice.ISpellCheckerSession$Stub
com.android.internal.textservice.ISpellCheckerSession$Stub$Proxy
@@ -6016,10 +5791,6 @@
com.android.internal.textservice.ITextServicesSessionListener$Stub
com.android.internal.textservice.ITextServicesSessionListener$Stub$Proxy
com.android.internal.transition.EpicenterTranslateClipReveal
-com.android.internal.transition.EpicenterTranslateClipReveal$1
-com.android.internal.transition.EpicenterTranslateClipReveal$State
-com.android.internal.transition.EpicenterTranslateClipReveal$StateEvaluator
-com.android.internal.transition.EpicenterTranslateClipReveal$StateProperty
com.android.internal.transition.TransitionConstants
com.android.internal.util.ArrayUtils
com.android.internal.util.AsyncChannel
@@ -6027,10 +5798,13 @@
com.android.internal.util.AsyncChannel$DeathMonitor
com.android.internal.util.AsyncChannel$SyncMessenger
com.android.internal.util.AsyncChannel$SyncMessenger$SyncHandler
+com.android.internal.util.BitUtils
+com.android.internal.util.CollectionUtils
com.android.internal.util.ConcurrentUtils
com.android.internal.util.ConcurrentUtils$1
com.android.internal.util.ConcurrentUtils$1$1
com.android.internal.util.DumpUtils$Dump
+com.android.internal.util.ExponentiallyBucketedHistogram
com.android.internal.util.FastMath
com.android.internal.util.FastPrintWriter
com.android.internal.util.FastPrintWriter$DummyWriter
@@ -6045,6 +5819,7 @@
com.android.internal.util.IState
com.android.internal.util.ImageUtils
com.android.internal.util.IndentingPrintWriter
+com.android.internal.util.IntPair
com.android.internal.util.JournaledFile
com.android.internal.util.LineBreakBufferedWriter
com.android.internal.util.LocalLog
@@ -6052,8 +5827,9 @@
com.android.internal.util.MessageUtils
com.android.internal.util.NotificationColorUtil
com.android.internal.util.NotificationColorUtil$ColorUtilsFromCompat
+com.android.internal.util.NotificationMessagingUtil
+com.android.internal.util.NotificationMessagingUtil$1
com.android.internal.util.Preconditions
-com.android.internal.util.Predicate
com.android.internal.util.ProcFileReader
com.android.internal.util.ProgressReporter
com.android.internal.util.RingBufferIndices
@@ -6078,7 +5854,6 @@
com.android.internal.view.BaseSurfaceHolder
com.android.internal.view.IInputConnectionWrapper
com.android.internal.view.IInputConnectionWrapper$MyHandler
-com.android.internal.view.IInputConnectionWrapper$SomeArgs
com.android.internal.view.IInputContext
com.android.internal.view.IInputContext$Stub
com.android.internal.view.IInputContext$Stub$Proxy
@@ -6111,6 +5886,7 @@
com.android.internal.view.RotationPolicy$RotationPolicyListener$1
com.android.internal.view.SurfaceCallbackHelper
com.android.internal.view.SurfaceCallbackHelper$1
+com.android.internal.view.SurfaceFlingerVsyncChoreographer
com.android.internal.view.WindowManagerPolicyThread
com.android.internal.view.animation.FallbackLUTInterpolator
com.android.internal.view.animation.HasNativeInterpolator
@@ -6120,14 +5896,12 @@
com.android.internal.view.menu.ActionMenuItemView
com.android.internal.view.menu.ActionMenuItemView$PopupCallback
com.android.internal.view.menu.BaseMenuPresenter
-com.android.internal.view.menu.ListMenuItemView
-com.android.internal.view.menu.MenuAdapter
+com.android.internal.view.menu.ContextMenuBuilder
com.android.internal.view.menu.MenuBuilder
com.android.internal.view.menu.MenuBuilder$Callback
com.android.internal.view.menu.MenuBuilder$ItemInvoker
com.android.internal.view.menu.MenuHelper
com.android.internal.view.menu.MenuItemImpl
-com.android.internal.view.menu.MenuPopup
com.android.internal.view.menu.MenuPopupHelper
com.android.internal.view.menu.MenuPopupHelper$1
com.android.internal.view.menu.MenuPresenter
@@ -6135,16 +5909,13 @@
com.android.internal.view.menu.MenuView
com.android.internal.view.menu.MenuView$ItemView
com.android.internal.view.menu.ShowableListMenu
-com.android.internal.view.menu.StandardMenuPopup
-com.android.internal.view.menu.StandardMenuPopup$1
-com.android.internal.view.menu.StandardMenuPopup$2
-com.android.internal.view.menu.SubMenuBuilder
-com.android.internal.widget.-$Lambda$6$LaTFiUorkqfcqmu-zMQbCLeO77c
+com.android.internal.widget.-$Lambda$LaTFiUorkqfcqmu-zMQbCLeO77c
com.android.internal.widget.AbsActionBarView
com.android.internal.widget.AbsActionBarView$VisibilityAnimListener
com.android.internal.widget.ActionBarContainer
com.android.internal.widget.ActionBarContainer$ActionBarBackgroundDrawable
com.android.internal.widget.ActionBarContextView
+com.android.internal.widget.ActionBarContextView$1
com.android.internal.widget.ActionBarOverlayLayout
com.android.internal.widget.ActionBarOverlayLayout$1
com.android.internal.widget.ActionBarOverlayLayout$2
@@ -6174,10 +5945,10 @@
com.android.internal.widget.MediaNotificationView
com.android.internal.widget.NotificationActionListLayout
com.android.internal.widget.NotificationExpandButton
-com.android.internal.widget.PreferenceImageView
com.android.internal.widget.ScrollBarUtils
com.android.internal.widget.ToolbarWidgetWrapper
com.android.internal.widget.ToolbarWidgetWrapper$1
+com.android.internal.widget.ToolbarWidgetWrapper$2
com.android.internal.widget.VerifyCredentialResponse
com.android.okhttp.Address
com.android.okhttp.AndroidInternal
@@ -6185,6 +5956,9 @@
com.android.okhttp.Authenticator
com.android.okhttp.Cache
com.android.okhttp.Cache$1
+com.android.okhttp.Cache$CacheRequestImpl
+com.android.okhttp.Cache$CacheRequestImpl$1
+com.android.okhttp.Cache$Entry
com.android.okhttp.CacheControl
com.android.okhttp.CacheControl$Builder
com.android.okhttp.CertificatePinner
@@ -6229,6 +6003,7 @@
com.android.okhttp.internal.DiskLruCache$2
com.android.okhttp.internal.DiskLruCache$3
com.android.okhttp.internal.DiskLruCache$Editor
+com.android.okhttp.internal.DiskLruCache$Editor$1
com.android.okhttp.internal.DiskLruCache$Entry
com.android.okhttp.internal.FaultHidingSink
com.android.okhttp.internal.Internal
@@ -6240,6 +6015,7 @@
com.android.okhttp.internal.Util
com.android.okhttp.internal.Util$1
com.android.okhttp.internal.http.AuthenticatorAdapter
+com.android.okhttp.internal.http.CacheRequest
com.android.okhttp.internal.http.CacheStrategy
com.android.okhttp.internal.http.CacheStrategy$Factory
com.android.okhttp.internal.http.HeaderParser
@@ -6252,6 +6028,7 @@
com.android.okhttp.internal.http.Http1xStream$UnknownLengthSource
com.android.okhttp.internal.http.HttpEngine
com.android.okhttp.internal.http.HttpEngine$1
+com.android.okhttp.internal.http.HttpEngine$2
com.android.okhttp.internal.http.HttpMethod
com.android.okhttp.internal.http.HttpStream
com.android.okhttp.internal.http.OkHeaders
@@ -6275,6 +6052,7 @@
com.android.okhttp.okio.AsyncTimeout$1
com.android.okhttp.okio.AsyncTimeout$2
com.android.okhttp.okio.AsyncTimeout$Watchdog
+com.android.okhttp.okio.Base64
com.android.okhttp.okio.Buffer
com.android.okhttp.okio.BufferedSink
com.android.okhttp.okio.BufferedSource
@@ -6298,49 +6076,85 @@
com.android.okhttp.okio.Timeout
com.android.okhttp.okio.Timeout$1
com.android.okhttp.okio.Util
+com.android.org.bouncycastle.asn1.ASN1BitString
+com.android.org.bouncycastle.asn1.ASN1Choice
com.android.org.bouncycastle.asn1.ASN1Encodable
+com.android.org.bouncycastle.asn1.ASN1EncodableVector
+com.android.org.bouncycastle.asn1.ASN1InputStream
+com.android.org.bouncycastle.asn1.ASN1Integer
+com.android.org.bouncycastle.asn1.ASN1Null
com.android.org.bouncycastle.asn1.ASN1Object
com.android.org.bouncycastle.asn1.ASN1ObjectIdentifier
com.android.org.bouncycastle.asn1.ASN1ObjectIdentifier$OidHandle
+com.android.org.bouncycastle.asn1.ASN1OutputStream
com.android.org.bouncycastle.asn1.ASN1Primitive
+com.android.org.bouncycastle.asn1.ASN1Sequence
+com.android.org.bouncycastle.asn1.ASN1Set
+com.android.org.bouncycastle.asn1.ASN1StreamParser
+com.android.org.bouncycastle.asn1.ASN1String
+com.android.org.bouncycastle.asn1.ASN1TaggedObject
+com.android.org.bouncycastle.asn1.ASN1TaggedObjectParser
+com.android.org.bouncycastle.asn1.ASN1UTCTime
+com.android.org.bouncycastle.asn1.BERTags
+com.android.org.bouncycastle.asn1.DERBitString
+com.android.org.bouncycastle.asn1.DERFactory
+com.android.org.bouncycastle.asn1.DERNull
+com.android.org.bouncycastle.asn1.DEROutputStream
+com.android.org.bouncycastle.asn1.DERPrintableString
+com.android.org.bouncycastle.asn1.DERSequence
+com.android.org.bouncycastle.asn1.DERSet
+com.android.org.bouncycastle.asn1.DERTaggedObject
+com.android.org.bouncycastle.asn1.DLSequence
+com.android.org.bouncycastle.asn1.DLSet
+com.android.org.bouncycastle.asn1.DefiniteLengthInputStream
+com.android.org.bouncycastle.asn1.InMemoryRepresentable
+com.android.org.bouncycastle.asn1.IndefiniteLengthInputStream
+com.android.org.bouncycastle.asn1.LimitedInputStream
com.android.org.bouncycastle.asn1.OIDTokenizer
+com.android.org.bouncycastle.asn1.StreamUtil
com.android.org.bouncycastle.asn1.bc.BCObjectIdentifiers
com.android.org.bouncycastle.asn1.iana.IANAObjectIdentifiers
com.android.org.bouncycastle.asn1.misc.MiscObjectIdentifiers
com.android.org.bouncycastle.asn1.nist.NISTObjectIdentifiers
com.android.org.bouncycastle.asn1.oiw.OIWObjectIdentifiers
com.android.org.bouncycastle.asn1.pkcs.PKCSObjectIdentifiers
+com.android.org.bouncycastle.asn1.x500.RDN
+com.android.org.bouncycastle.asn1.x500.X500Name
+com.android.org.bouncycastle.asn1.x500.X500NameStyle
+com.android.org.bouncycastle.asn1.x500.style.AbstractX500NameStyle
+com.android.org.bouncycastle.asn1.x500.style.BCStyle
+com.android.org.bouncycastle.asn1.x509.AlgorithmIdentifier
+com.android.org.bouncycastle.asn1.x509.Certificate
+com.android.org.bouncycastle.asn1.x509.SubjectPublicKeyInfo
+com.android.org.bouncycastle.asn1.x509.TBSCertificate
+com.android.org.bouncycastle.asn1.x509.Time
com.android.org.bouncycastle.asn1.x509.X509ObjectIdentifiers
com.android.org.bouncycastle.asn1.x9.X9ObjectIdentifiers
com.android.org.bouncycastle.crypto.AsymmetricBlockCipher
-com.android.org.bouncycastle.crypto.BlockCipher
-com.android.org.bouncycastle.crypto.BufferedBlockCipher
com.android.org.bouncycastle.crypto.CipherKeyGenerator
com.android.org.bouncycastle.crypto.CipherParameters
com.android.org.bouncycastle.crypto.CryptoException
-com.android.org.bouncycastle.crypto.DataLengthException
com.android.org.bouncycastle.crypto.Digest
com.android.org.bouncycastle.crypto.ExtendedDigest
com.android.org.bouncycastle.crypto.InvalidCipherTextException
com.android.org.bouncycastle.crypto.KeyGenerationParameters
-com.android.org.bouncycastle.crypto.OutputLengthException
-com.android.org.bouncycastle.crypto.RuntimeCryptoException
+com.android.org.bouncycastle.crypto.Mac
+com.android.org.bouncycastle.crypto.PBEParametersGenerator
com.android.org.bouncycastle.crypto.digests.AndroidDigestFactory
com.android.org.bouncycastle.crypto.digests.AndroidDigestFactoryInterface
com.android.org.bouncycastle.crypto.digests.AndroidDigestFactoryOpenSSL
+com.android.org.bouncycastle.crypto.digests.EncodableDigest
+com.android.org.bouncycastle.crypto.digests.GeneralDigest
com.android.org.bouncycastle.crypto.digests.OpenSSLDigest
com.android.org.bouncycastle.crypto.digests.OpenSSLDigest$SHA1
+com.android.org.bouncycastle.crypto.digests.SHA1Digest
com.android.org.bouncycastle.crypto.encodings.OAEPEncoding
-com.android.org.bouncycastle.crypto.engines.AESEngine
com.android.org.bouncycastle.crypto.engines.RSABlindedEngine
com.android.org.bouncycastle.crypto.engines.RSACoreEngine
-com.android.org.bouncycastle.crypto.paddings.BlockCipherPadding
-com.android.org.bouncycastle.crypto.paddings.PKCS7Padding
-com.android.org.bouncycastle.crypto.paddings.PaddedBufferedBlockCipher
+com.android.org.bouncycastle.crypto.generators.PKCS12ParametersGenerator
+com.android.org.bouncycastle.crypto.io.MacInputStream
+com.android.org.bouncycastle.crypto.macs.HMac
com.android.org.bouncycastle.crypto.params.KeyParameter
-com.android.org.bouncycastle.crypto.params.ParametersWithRandom
-com.android.org.bouncycastle.jcajce.PBKDFKey
-com.android.org.bouncycastle.jcajce.PKCS12Key
com.android.org.bouncycastle.jcajce.provider.asymmetric.DH$Mappings
com.android.org.bouncycastle.jcajce.provider.asymmetric.DSA$Mappings
com.android.org.bouncycastle.jcajce.provider.asymmetric.EC$Mappings
@@ -6356,6 +6170,10 @@
com.android.org.bouncycastle.jcajce.provider.asymmetric.rsa.KeyFactorySpi
com.android.org.bouncycastle.jcajce.provider.asymmetric.util.BaseCipherSpi
com.android.org.bouncycastle.jcajce.provider.asymmetric.util.BaseKeyFactorySpi
+com.android.org.bouncycastle.jcajce.provider.asymmetric.util.PKCS12BagAttributeCarrierImpl
+com.android.org.bouncycastle.jcajce.provider.asymmetric.x509.CertificateFactory
+com.android.org.bouncycastle.jcajce.provider.asymmetric.x509.PEMUtil
+com.android.org.bouncycastle.jcajce.provider.asymmetric.x509.X509CertificateObject
com.android.org.bouncycastle.jcajce.provider.config.ConfigurableProvider
com.android.org.bouncycastle.jcajce.provider.config.ProviderConfiguration
com.android.org.bouncycastle.jcajce.provider.config.ProviderConfigurationPermission
@@ -6377,10 +6195,8 @@
com.android.org.bouncycastle.jcajce.provider.keystore.PKCS12$Mappings
com.android.org.bouncycastle.jcajce.provider.keystore.bc.BcKeyStoreSpi
com.android.org.bouncycastle.jcajce.provider.keystore.bc.BcKeyStoreSpi$Std
+com.android.org.bouncycastle.jcajce.provider.keystore.bc.BcKeyStoreSpi$StoreEntry
com.android.org.bouncycastle.jcajce.provider.symmetric.AES
-com.android.org.bouncycastle.jcajce.provider.symmetric.AES$ECB
-com.android.org.bouncycastle.jcajce.provider.symmetric.AES$ECB$1
-com.android.org.bouncycastle.jcajce.provider.symmetric.AES$KeyGen
com.android.org.bouncycastle.jcajce.provider.symmetric.AES$Mappings
com.android.org.bouncycastle.jcajce.provider.symmetric.ARC4
com.android.org.bouncycastle.jcajce.provider.symmetric.ARC4$Mappings
@@ -6401,36 +6217,34 @@
com.android.org.bouncycastle.jcajce.provider.symmetric.SymmetricAlgorithmProvider
com.android.org.bouncycastle.jcajce.provider.symmetric.Twofish
com.android.org.bouncycastle.jcajce.provider.symmetric.Twofish$Mappings
-com.android.org.bouncycastle.jcajce.provider.symmetric.util.BCPBEKey
-com.android.org.bouncycastle.jcajce.provider.symmetric.util.BaseBlockCipher
-com.android.org.bouncycastle.jcajce.provider.symmetric.util.BaseBlockCipher$AEADGenericBlockCipher
-com.android.org.bouncycastle.jcajce.provider.symmetric.util.BaseBlockCipher$BufferedGenericBlockCipher
-com.android.org.bouncycastle.jcajce.provider.symmetric.util.BaseBlockCipher$GenericBlockCipher
com.android.org.bouncycastle.jcajce.provider.symmetric.util.BaseKeyGenerator
-com.android.org.bouncycastle.jcajce.provider.symmetric.util.BaseWrapCipher
-com.android.org.bouncycastle.jcajce.provider.symmetric.util.BlockCipherProvider
-com.android.org.bouncycastle.jcajce.provider.symmetric.util.PBE
com.android.org.bouncycastle.jcajce.provider.util.AlgorithmProvider
com.android.org.bouncycastle.jcajce.provider.util.AsymmetricAlgorithmProvider
com.android.org.bouncycastle.jcajce.provider.util.AsymmetricKeyInfoConverter
com.android.org.bouncycastle.jcajce.provider.util.DigestFactory
-com.android.org.bouncycastle.jcajce.spec.AEADParameterSpec
com.android.org.bouncycastle.jcajce.util.BCJcaJceHelper
com.android.org.bouncycastle.jcajce.util.JcaJceHelper
com.android.org.bouncycastle.jcajce.util.ProviderJcaJceHelper
com.android.org.bouncycastle.jce.interfaces.BCKeyStore
+com.android.org.bouncycastle.jce.interfaces.PKCS12BagAttributeCarrier
com.android.org.bouncycastle.jce.provider.BouncyCastleProvider
com.android.org.bouncycastle.jce.provider.BouncyCastleProvider$1
com.android.org.bouncycastle.jce.provider.BouncyCastleProviderConfiguration
+com.android.org.bouncycastle.jce.provider.CertStoreCollectionSpi
com.android.org.bouncycastle.util.Arrays
com.android.org.bouncycastle.util.Encodable
+com.android.org.bouncycastle.util.Integers
+com.android.org.bouncycastle.util.Iterable
+com.android.org.bouncycastle.util.Memoable
com.android.org.bouncycastle.util.Pack
com.android.org.bouncycastle.util.Strings
com.android.org.bouncycastle.util.Strings$1
+com.android.org.bouncycastle.util.io.Streams
com.android.org.conscrypt.AbstractOpenSSLSession
com.android.org.conscrypt.AbstractSessionContext
com.android.org.conscrypt.AbstractSessionContext$1
com.android.org.conscrypt.AddressUtils
+com.android.org.conscrypt.ArrayUtils
com.android.org.conscrypt.ByteArray
com.android.org.conscrypt.CertBlacklist
com.android.org.conscrypt.CertificatePriorityComparator
@@ -6464,6 +6278,7 @@
com.android.org.conscrypt.OpenSSLCipher$EVP_CIPHER$AES
com.android.org.conscrypt.OpenSSLCipher$EVP_CIPHER$AES$CBC
com.android.org.conscrypt.OpenSSLCipher$EVP_CIPHER$AES$CBC$PKCS5Padding
+com.android.org.conscrypt.OpenSSLCipher$EVP_CIPHER$AES_BASE
com.android.org.conscrypt.OpenSSLCipher$Mode
com.android.org.conscrypt.OpenSSLCipher$Padding
com.android.org.conscrypt.OpenSSLContextImpl
@@ -6477,15 +6292,13 @@
com.android.org.conscrypt.OpenSSLKeyHolder
com.android.org.conscrypt.OpenSSLMac
com.android.org.conscrypt.OpenSSLMac$HmacSHA1
+com.android.org.conscrypt.OpenSSLMac$HmacSHA256
com.android.org.conscrypt.OpenSSLMessageDigestJDK
com.android.org.conscrypt.OpenSSLMessageDigestJDK$MD5
com.android.org.conscrypt.OpenSSLMessageDigestJDK$SHA1
com.android.org.conscrypt.OpenSSLMessageDigestJDK$SHA256
com.android.org.conscrypt.OpenSSLProvider
com.android.org.conscrypt.OpenSSLRSAKeyFactory
-com.android.org.conscrypt.OpenSSLRSAKeyPairGenerator
-com.android.org.conscrypt.OpenSSLRSAPrivateCrtKey
-com.android.org.conscrypt.OpenSSLRSAPrivateKey
com.android.org.conscrypt.OpenSSLRSAPublicKey
com.android.org.conscrypt.OpenSSLRandom
com.android.org.conscrypt.OpenSSLSessionImpl
@@ -6508,11 +6321,11 @@
com.android.org.conscrypt.OpenSSLX509CertificateFactory$Parser
com.android.org.conscrypt.OpenSSLX509CertificateFactory$ParsingException
com.android.org.conscrypt.Platform
-com.android.org.conscrypt.Platform$NoPreloadHolder
com.android.org.conscrypt.SSLClientSessionCache
com.android.org.conscrypt.SSLParametersImpl
com.android.org.conscrypt.SSLParametersImpl$AliasChooser
com.android.org.conscrypt.SSLParametersImpl$PSKCallbacks
+com.android.org.conscrypt.SSLUtils
com.android.org.conscrypt.ServerSessionContext
com.android.org.conscrypt.TrustManagerFactoryImpl
com.android.org.conscrypt.TrustManagerImpl
@@ -6526,6 +6339,7 @@
com.android.org.conscrypt.TrustedCertificateStore$4
com.android.org.conscrypt.TrustedCertificateStore$5
com.android.org.conscrypt.TrustedCertificateStore$CertSelector
+com.android.org.conscrypt.TrustedCertificateStore$PreloadHolder
com.android.org.conscrypt.ct.CTLogInfo
com.android.org.conscrypt.ct.CTLogStore
com.android.org.conscrypt.ct.CTLogStoreImpl
@@ -6535,11 +6349,10 @@
com.android.org.conscrypt.ct.CTVerifier
com.android.org.conscrypt.ct.KnownLogs
com.android.org.conscrypt.ct.SerializationException
-com.android.org.conscrypt.util.ArrayUtils
-com.android.org.conscrypt.util.EmptyArray
com.android.server.AppWidgetBackupBridge
com.android.server.BootReceiver
com.android.server.BootReceiver$1
+com.android.server.BootReceiver$2
com.android.server.LocalServices
com.android.server.NetworkManagementSocketTagger
com.android.server.NetworkManagementSocketTagger$1
@@ -6565,6 +6378,8 @@
com.android.server.wifi.nano.WifiMetricsProto$RssiPollCount
com.android.server.wifi.nano.WifiMetricsProto$SoftApDurationBucket
com.android.server.wifi.nano.WifiMetricsProto$SoftApReturnCodeCount
+com.android.server.wifi.nano.WifiMetricsProto$StaEvent
+com.android.server.wifi.nano.WifiMetricsProto$StaEvent$ConfigInfo
com.android.server.wifi.nano.WifiMetricsProto$WifiLog
com.android.server.wifi.nano.WifiMetricsProto$WifiLog$ScanReturnEntry
com.android.server.wifi.nano.WifiMetricsProto$WifiLog$WifiSystemStateEntry
@@ -6580,11 +6395,9 @@
com.google.android.gles_jni.EGLSurfaceImpl
com.google.android.gles_jni.GLImpl
com.google.android.mms.MmsException
-com.google.android.mms.pdu.GenericPdu
-com.google.android.mms.pdu.PduComposer
-com.google.android.mms.pdu.PduPersister
dalvik.annotation.optimization.CriticalNative
dalvik.annotation.optimization.FastNative
+dalvik.system.-$Lambda$xxvwQBVHC44UYbpcpA8j0sUqLOo
dalvik.system.BaseDexClassLoader
dalvik.system.BaseDexClassLoader$Reporter
dalvik.system.BlockGuard
@@ -6608,7 +6421,6 @@
dalvik.system.DexPathList$NativeLibraryElement
dalvik.system.EmulatedStackFrame
dalvik.system.EmulatedStackFrame$Range
-dalvik.system.InMemoryDexClassLoader$DexData
dalvik.system.PathClassLoader
dalvik.system.SocketTagger
dalvik.system.SocketTagger$1
@@ -6623,9 +6435,7 @@
java.io.BufferedWriter
java.io.ByteArrayInputStream
java.io.ByteArrayOutputStream
-java.io.CharArrayReader
java.io.CharArrayWriter
-java.io.CharConversionException
java.io.Closeable
java.io.Console
java.io.DataInput
@@ -6662,7 +6472,6 @@
java.io.InterruptedIOException
java.io.InvalidClassException
java.io.InvalidObjectException
-java.io.NotSerializableException
java.io.ObjectInput
java.io.ObjectInputStream
java.io.ObjectInputStream$BlockDataInputStream
@@ -6706,16 +6515,13 @@
java.io.Serializable
java.io.SerializablePermission
java.io.StreamCorruptedException
-java.io.StringBufferInputStream
java.io.StringReader
java.io.StringWriter
-java.io.SyncFailedException
-java.io.UTFDataFormatException
java.io.UnixFileSystem
java.io.UnsupportedEncodingException
java.io.Writer
-java.lang.-$Lambda$250$S9HjrJh0nDg7IyU6wZdPArnZWRQ
-java.lang.-$Lambda$251$S9HjrJh0nDg7IyU6wZdPArnZWRQ
+java.lang.-$Lambda$S9HjrJh0nDg7IyU6wZdPArnZWRQ
+java.lang.-$Lambda$S9HjrJh0nDg7IyU6wZdPArnZWRQ$1
java.lang.AbstractMethodError
java.lang.AbstractStringBuilder
java.lang.AndroidHardcodedSystemProperties
@@ -6799,14 +6605,7 @@
java.lang.Package
java.lang.Process
java.lang.ProcessBuilder
-java.lang.ProcessBuilder$NullInputStream
-java.lang.ProcessBuilder$NullOutputStream
java.lang.ProcessEnvironment
-java.lang.ProcessEnvironment$ExternalData
-java.lang.ProcessEnvironment$StringEnvironment
-java.lang.ProcessEnvironment$Value
-java.lang.ProcessEnvironment$Variable
-java.lang.ProcessImpl
java.lang.Readable
java.lang.ReflectiveOperationException
java.lang.Runnable
@@ -6837,6 +6636,7 @@
java.lang.ThreadDeath
java.lang.ThreadGroup
java.lang.ThreadLocal
+java.lang.ThreadLocal$SuppliedThreadLocal
java.lang.ThreadLocal$ThreadLocalMap
java.lang.ThreadLocal$ThreadLocalMap$Entry
java.lang.Throwable
@@ -6846,13 +6646,6 @@
java.lang.Throwable$WrappedPrintWriter
java.lang.TypeNotPresentException
java.lang.UNIXProcess
-java.lang.UNIXProcess$1
-java.lang.UNIXProcess$2
-java.lang.UNIXProcess$3
-java.lang.UNIXProcess$ProcessPipeInputStream
-java.lang.UNIXProcess$ProcessPipeOutputStream
-java.lang.UNIXProcess$ProcessReaperThreadFactory
-java.lang.UNIXProcess$ProcessReaperThreadFactory$1
java.lang.UnsatisfiedLinkError
java.lang.UnsupportedOperationException
java.lang.VMClassLoader
@@ -6865,18 +6658,22 @@
java.lang.annotation.Inherited
java.lang.annotation.Retention
java.lang.annotation.Target
+java.lang.invoke.CallSite
+java.lang.invoke.ConstantCallSite
java.lang.invoke.MethodHandle
java.lang.invoke.MethodHandleImpl
java.lang.invoke.MethodHandleImpl$HandleInfo
java.lang.invoke.MethodHandleInfo
java.lang.invoke.MethodHandleStatics
java.lang.invoke.MethodHandles
+java.lang.invoke.MethodHandles$Lookup
java.lang.invoke.MethodType
java.lang.invoke.MethodType$ConcurrentWeakInternSet
java.lang.invoke.MethodType$ConcurrentWeakInternSet$WeakEntry
java.lang.invoke.MethodTypeForm
java.lang.invoke.Transformers$BindTo
java.lang.invoke.Transformers$Collector
+java.lang.invoke.Transformers$Construct
java.lang.invoke.Transformers$Spreader
java.lang.invoke.Transformers$Transformer
java.lang.invoke.Transformers$VarargsCollector
@@ -6926,7 +6723,6 @@
java.math.BigDecimal
java.math.BigInt
java.math.BigInteger
-java.math.BitLevel
java.math.Conversion
java.math.Division
java.math.MathContext
@@ -6938,12 +6734,9 @@
java.net.AddressCache
java.net.AddressCache$AddressCacheEntry
java.net.AddressCache$AddressCacheKey
-java.net.Authenticator
-java.net.Authenticator$RequestorType
java.net.ConnectException
java.net.CookieHandler
java.net.CookieManager
-java.net.CookieManager$CookiePathComparator
java.net.CookiePolicy
java.net.CookiePolicy$1
java.net.CookiePolicy$2
@@ -6957,19 +6750,6 @@
java.net.DefaultFileNameMap
java.net.DefaultInterface
java.net.FileNameMap
-java.net.HttpCookie
-java.net.HttpCookie$1
-java.net.HttpCookie$10
-java.net.HttpCookie$11
-java.net.HttpCookie$2
-java.net.HttpCookie$3
-java.net.HttpCookie$4
-java.net.HttpCookie$5
-java.net.HttpCookie$6
-java.net.HttpCookie$7
-java.net.HttpCookie$8
-java.net.HttpCookie$9
-java.net.HttpCookie$CookieAttributeAssignor
java.net.HttpURLConnection
java.net.IDN
java.net.InMemoryCookieStore
@@ -6991,17 +6771,18 @@
java.net.NetworkInterface$1checkedAddresses
java.net.NoRouteToHostException
java.net.Parts
-java.net.PasswordAuthentication
java.net.PlainDatagramSocketImpl
java.net.PlainSocketImpl
java.net.PortUnreachableException
java.net.ProtocolException
+java.net.ProtocolFamily
java.net.Proxy
java.net.Proxy$Type
java.net.ProxySelector
java.net.ResponseCache
java.net.ServerSocket
java.net.Socket
+java.net.Socket$1
java.net.Socket$2
java.net.Socket$3
java.net.SocketAddress
@@ -7013,6 +6794,7 @@
java.net.SocketTimeoutException
java.net.SocksConsts
java.net.SocksSocketImpl
+java.net.StandardProtocolFamily
java.net.URI
java.net.URI$Parser
java.net.URISyntaxException
@@ -7043,7 +6825,6 @@
java.nio.FloatBuffer
java.nio.HeapByteBuffer
java.nio.HeapCharBuffer
-java.nio.HeapIntBuffer
java.nio.IntBuffer
java.nio.InvalidMarkException
java.nio.LongBuffer
@@ -7058,7 +6839,7 @@
java.nio.channels.CancelledKeyException
java.nio.channels.Channel
java.nio.channels.Channels
-java.nio.channels.Channels$ReadableByteChannelImpl
+java.nio.channels.Channels$1
java.nio.channels.ClosedByInterruptException
java.nio.channels.ClosedChannelException
java.nio.channels.DatagramChannel
@@ -7075,12 +6856,19 @@
java.nio.channels.ScatteringByteChannel
java.nio.channels.SeekableByteChannel
java.nio.channels.SelectableChannel
+java.nio.channels.SelectionKey
+java.nio.channels.Selector
java.nio.channels.ServerSocketChannel
java.nio.channels.SocketChannel
java.nio.channels.WritableByteChannel
java.nio.channels.spi.AbstractInterruptibleChannel
java.nio.channels.spi.AbstractInterruptibleChannel$1
java.nio.channels.spi.AbstractSelectableChannel
+java.nio.channels.spi.AbstractSelectionKey
+java.nio.channels.spi.AbstractSelector
+java.nio.channels.spi.AbstractSelector$1
+java.nio.channels.spi.SelectorProvider
+java.nio.channels.spi.SelectorProvider$1
java.nio.charset.CharacterCodingException
java.nio.charset.Charset
java.nio.charset.CharsetDecoder
@@ -7096,6 +6884,8 @@
java.nio.charset.IllegalCharsetNameException
java.nio.charset.StandardCharsets
java.nio.charset.UnsupportedCharsetException
+java.nio.file.AccessMode
+java.nio.file.CopyOption
java.nio.file.FileAlreadyExistsException
java.nio.file.FileSystem
java.nio.file.FileSystemException
@@ -7103,12 +6893,18 @@
java.nio.file.FileSystems$DefaultFileSystemHolder
java.nio.file.FileSystems$DefaultFileSystemHolder$1
java.nio.file.Files
+java.nio.file.LinkOption
java.nio.file.NoSuchFileException
java.nio.file.OpenOption
java.nio.file.Path
+java.nio.file.Paths
+java.nio.file.StandardOpenOption
java.nio.file.Watchable
+java.nio.file.attribute.AttributeView
+java.nio.file.attribute.BasicFileAttributeView
java.nio.file.attribute.BasicFileAttributes
java.nio.file.attribute.FileAttribute
+java.nio.file.attribute.FileAttributeView
java.nio.file.attribute.PosixFileAttributes
java.nio.file.spi.FileSystemProvider
java.security.AccessControlContext
@@ -7121,7 +6917,6 @@
java.security.CodeSigner
java.security.CryptoPrimitive
java.security.DigestException
-java.security.DigestInputStream
java.security.GeneralSecurityException
java.security.Guard
java.security.InvalidAlgorithmParameterException
@@ -7134,11 +6929,9 @@
java.security.KeyManagementException
java.security.KeyPair
java.security.KeyPairGenerator
-java.security.KeyPairGenerator$Delegate
java.security.KeyPairGeneratorSpi
java.security.KeyStore
java.security.KeyStore$1
-java.security.KeyStore$LoadStoreParameter
java.security.KeyStoreException
java.security.KeyStoreSpi
java.security.MessageDigest
@@ -7172,6 +6965,7 @@
java.security.UnrecoverableKeyException
java.security.cert.CRL
java.security.cert.CRLException
+java.security.cert.CRLReason
java.security.cert.CertPath
java.security.cert.CertPathBuilderException
java.security.cert.CertPathChecker
@@ -7182,6 +6976,10 @@
java.security.cert.CertPathValidatorResult
java.security.cert.CertPathValidatorSpi
java.security.cert.CertSelector
+java.security.cert.CertStore
+java.security.cert.CertStoreException
+java.security.cert.CertStoreParameters
+java.security.cert.CertStoreSpi
java.security.cert.Certificate
java.security.cert.CertificateEncodingException
java.security.cert.CertificateException
@@ -7190,11 +6988,13 @@
java.security.cert.CertificateFactorySpi
java.security.cert.CertificateNotYetValidException
java.security.cert.CertificateParsingException
+java.security.cert.CollectionCertStoreParameters
java.security.cert.Extension
java.security.cert.PKIXCertPathChecker
java.security.cert.PKIXCertPathValidatorResult
java.security.cert.PKIXParameters
java.security.cert.PKIXRevocationChecker
+java.security.cert.PKIXRevocationChecker$Option
java.security.cert.PolicyNode
java.security.cert.PolicyQualifierInfo
java.security.cert.TrustAnchor
@@ -7207,7 +7007,6 @@
java.security.interfaces.ECPrivateKey
java.security.interfaces.ECPublicKey
java.security.interfaces.RSAKey
-java.security.interfaces.RSAPrivateCrtKey
java.security.interfaces.RSAPrivateKey
java.security.interfaces.RSAPublicKey
java.security.spec.AlgorithmParameterSpec
@@ -7229,8 +7028,6 @@
java.security.spec.RSAPrivateKeySpec
java.security.spec.RSAPublicKeySpec
java.security.spec.X509EncodedKeySpec
-java.sql.Date
-java.sql.Time
java.sql.Timestamp
java.text.AttributedCharacterIterator$Attribute
java.text.Bidi
@@ -7263,16 +7060,16 @@
java.text.SimpleDateFormat
java.text.StringCharacterIterator
java.time.DateTimeException
-java.util.-$Lambda$181$4EqhxufgNKat19m0CB0-toH_lzo
-java.util.-$Lambda$182$4EqhxufgNKat19m0CB0-toH_lzo
-java.util.-$Lambda$183$4EqhxufgNKat19m0CB0-toH_lzo
-java.util.-$Lambda$184$4EqhxufgNKat19m0CB0-toH_lzo
-java.util.-$Lambda$267$4EqhxufgNKat19m0CB0-toH_lzo
-java.util.-$Lambda$268$4EqhxufgNKat19m0CB0-toH_lzo
-java.util.-$Lambda$291$aUGKT4ItCOku5-JSG-x8Aqj2pJw
-java.util.-$Lambda$292$aUGKT4ItCOku5-JSG-x8Aqj2pJw
-java.util.-$Lambda$293$aUGKT4ItCOku5-JSG-x8Aqj2pJw
-java.util.-$Lambda$294$aUGKT4ItCOku5-JSG-x8Aqj2pJw
+java.util.-$Lambda$4EqhxufgNKat19m0CB0-toH_lzo
+java.util.-$Lambda$4EqhxufgNKat19m0CB0-toH_lzo$1
+java.util.-$Lambda$4EqhxufgNKat19m0CB0-toH_lzo$2
+java.util.-$Lambda$4EqhxufgNKat19m0CB0-toH_lzo$3
+java.util.-$Lambda$4EqhxufgNKat19m0CB0-toH_lzo$4
+java.util.-$Lambda$4EqhxufgNKat19m0CB0-toH_lzo$5
+java.util.-$Lambda$aUGKT4ItCOku5-JSG-x8Aqj2pJw
+java.util.-$Lambda$aUGKT4ItCOku5-JSG-x8Aqj2pJw$1
+java.util.-$Lambda$aUGKT4ItCOku5-JSG-x8Aqj2pJw$2
+java.util.-$Lambda$aUGKT4ItCOku5-JSG-x8Aqj2pJw$3
java.util.AbstractCollection
java.util.AbstractList
java.util.AbstractList$Itr
@@ -7394,6 +7191,7 @@
java.util.EnumSet$SerializationProxy
java.util.Enumeration
java.util.EventListener
+java.util.FormatFlagsConversionMismatchException
java.util.Formattable
java.util.Formatter
java.util.Formatter$Conversion
@@ -7403,6 +7201,7 @@
java.util.Formatter$FormatSpecifier
java.util.Formatter$FormatSpecifierParser
java.util.Formatter$FormatString
+java.util.FormatterClosedException
java.util.GregorianCalendar
java.util.HashMap
java.util.HashMap$EntryIterator
@@ -7451,7 +7250,6 @@
java.util.LinkedList$Node
java.util.List
java.util.ListIterator
-java.util.ListResourceBundle
java.util.Locale
java.util.Locale$Builder
java.util.Locale$Cache
@@ -7459,6 +7257,7 @@
java.util.Locale$FilteringMode
java.util.Locale$LanguageRange
java.util.Locale$LocaleKey
+java.util.Locale$NoImagePreloadHolder
java.util.Map
java.util.Map$Entry
java.util.MissingFormatArgumentException
@@ -7469,6 +7268,7 @@
java.util.Objects
java.util.Observable
java.util.Observer
+java.util.Optional
java.util.PrimitiveIterator
java.util.PrimitiveIterator$OfInt
java.util.PriorityQueue
@@ -7493,6 +7293,10 @@
java.util.ResourceBundle$LoaderReference
java.util.Scanner
java.util.Scanner$1
+java.util.ServiceConfigurationError
+java.util.ServiceLoader
+java.util.ServiceLoader$1
+java.util.ServiceLoader$LazyIterator
java.util.Set
java.util.SimpleTimeZone
java.util.SortedMap
@@ -7508,6 +7312,7 @@
java.util.Spliterators$EmptySpliterator$OfInt
java.util.Spliterators$EmptySpliterator$OfLong
java.util.Spliterators$EmptySpliterator$OfRef
+java.util.Spliterators$IntArraySpliterator
java.util.Spliterators$IteratorSpliterator
java.util.Stack
java.util.StringJoiner
@@ -7546,14 +7351,13 @@
java.util.Vector$Itr
java.util.WeakHashMap
java.util.WeakHashMap$Entry
-java.util.WeakHashMap$EntryIterator
java.util.WeakHashMap$EntrySet
java.util.WeakHashMap$HashIterator
java.util.WeakHashMap$KeyIterator
java.util.WeakHashMap$KeySet
java.util.WeakHashMap$ValueIterator
java.util.WeakHashMap$Values
-java.util.concurrent.-$Lambda$269$xR9BLpu6SifNikvFgr4lEiECBsk
+java.util.concurrent.-$Lambda$xR9BLpu6SifNikvFgr4lEiECBsk
java.util.concurrent.AbstractExecutorService
java.util.concurrent.ArrayBlockingQueue
java.util.concurrent.BlockingDeque
@@ -7564,8 +7368,6 @@
java.util.concurrent.CompletableFuture$AltResult
java.util.concurrent.CompletableFuture$AsynchronousCompletionTask
java.util.concurrent.CompletableFuture$Completion
-java.util.concurrent.CompletableFuture$Signaller
-java.util.concurrent.CompletionService
java.util.concurrent.CompletionStage
java.util.concurrent.ConcurrentHashMap
java.util.concurrent.ConcurrentHashMap$BaseIterator
@@ -7585,6 +7387,7 @@
java.util.concurrent.ConcurrentHashMap$ForwardingNode
java.util.concurrent.ConcurrentHashMap$KeyIterator
java.util.concurrent.ConcurrentHashMap$KeySetView
+java.util.concurrent.ConcurrentHashMap$KeySpliterator
java.util.concurrent.ConcurrentHashMap$MapEntry
java.util.concurrent.ConcurrentHashMap$MapReduceEntriesTask
java.util.concurrent.ConcurrentHashMap$MapReduceEntriesToDoubleTask
@@ -7617,6 +7420,8 @@
java.util.concurrent.ConcurrentHashMap$TreeNode
java.util.concurrent.ConcurrentHashMap$ValueIterator
java.util.concurrent.ConcurrentHashMap$ValuesView
+java.util.concurrent.ConcurrentLinkedDeque
+java.util.concurrent.ConcurrentLinkedDeque$Node
java.util.concurrent.ConcurrentLinkedQueue
java.util.concurrent.ConcurrentLinkedQueue$Itr
java.util.concurrent.ConcurrentLinkedQueue$Node
@@ -7626,12 +7431,9 @@
java.util.concurrent.ConcurrentSkipListMap$HeadIndex
java.util.concurrent.ConcurrentSkipListMap$Index
java.util.concurrent.ConcurrentSkipListMap$Iter
-java.util.concurrent.ConcurrentSkipListMap$KeyIterator
-java.util.concurrent.ConcurrentSkipListMap$KeySet
java.util.concurrent.ConcurrentSkipListMap$Node
java.util.concurrent.ConcurrentSkipListMap$ValueIterator
java.util.concurrent.ConcurrentSkipListMap$Values
-java.util.concurrent.ConcurrentSkipListSet
java.util.concurrent.CopyOnWriteArrayList
java.util.concurrent.CopyOnWriteArrayList$COWIterator
java.util.concurrent.CopyOnWriteArraySet
@@ -7642,8 +7444,6 @@
java.util.concurrent.Delayed
java.util.concurrent.ExecutionException
java.util.concurrent.Executor
-java.util.concurrent.ExecutorCompletionService
-java.util.concurrent.ExecutorCompletionService$QueueingFuture
java.util.concurrent.ExecutorService
java.util.concurrent.Executors
java.util.concurrent.Executors$DefaultThreadFactory
@@ -7655,10 +7455,8 @@
java.util.concurrent.ForkJoinPool$1
java.util.concurrent.ForkJoinPool$DefaultForkJoinWorkerThreadFactory
java.util.concurrent.ForkJoinPool$ForkJoinWorkerThreadFactory
-java.util.concurrent.ForkJoinPool$ManagedBlocker
java.util.concurrent.ForkJoinTask
java.util.concurrent.ForkJoinTask$ExceptionNode
-java.util.concurrent.ForkJoinWorkerThread
java.util.concurrent.Future
java.util.concurrent.FutureTask
java.util.concurrent.FutureTask$WaitNode
@@ -7669,8 +7467,6 @@
java.util.concurrent.LinkedBlockingQueue
java.util.concurrent.LinkedBlockingQueue$Itr
java.util.concurrent.LinkedBlockingQueue$Node
-java.util.concurrent.Phaser
-java.util.concurrent.Phaser$QNode
java.util.concurrent.PriorityBlockingQueue
java.util.concurrent.RejectedExecutionException
java.util.concurrent.RejectedExecutionHandler
@@ -7685,6 +7481,7 @@
java.util.concurrent.Semaphore$NonfairSync
java.util.concurrent.Semaphore$Sync
java.util.concurrent.SynchronousQueue
+java.util.concurrent.SynchronousQueue$TransferQueue
java.util.concurrent.SynchronousQueue$TransferStack
java.util.concurrent.SynchronousQueue$TransferStack$SNode
java.util.concurrent.SynchronousQueue$Transferer
@@ -7712,8 +7509,7 @@
java.util.concurrent.atomic.AtomicIntegerFieldUpdater$AtomicIntegerFieldUpdaterImpl
java.util.concurrent.atomic.AtomicIntegerFieldUpdater$AtomicIntegerFieldUpdaterImpl$1
java.util.concurrent.atomic.AtomicLong
-java.util.concurrent.atomic.AtomicLongFieldUpdater
-java.util.concurrent.atomic.AtomicLongFieldUpdater$CASUpdater
+java.util.concurrent.atomic.AtomicLongArray
java.util.concurrent.atomic.AtomicReference
java.util.concurrent.atomic.AtomicReferenceArray
java.util.concurrent.atomic.AtomicReferenceFieldUpdater
@@ -7738,12 +7534,15 @@
java.util.concurrent.locks.ReentrantReadWriteLock$Sync$HoldCounter
java.util.concurrent.locks.ReentrantReadWriteLock$Sync$ThreadLocalHoldCounter
java.util.concurrent.locks.ReentrantReadWriteLock$WriteLock
-java.util.function.-$Lambda$276$1MZdIZ-DL_fjy9l0o8IMJk57T2g
+java.util.function.-$Lambda$1MZdIZ-DL_fjy9l0o8IMJk57T2g
+java.util.function.-$Lambda$VGDeaUHZQIZywZW2ttlyhwk3Cmk
+java.util.function.-$Lambda$VGDeaUHZQIZywZW2ttlyhwk3Cmk$1
java.util.function.BiConsumer
java.util.function.BiFunction
java.util.function.BinaryOperator
java.util.function.Consumer
java.util.function.DoubleBinaryOperator
+java.util.function.DoubleUnaryOperator
java.util.function.Function
java.util.function.IntBinaryOperator
java.util.function.IntConsumer
@@ -7752,6 +7551,7 @@
java.util.function.IntToLongFunction
java.util.function.IntUnaryOperator
java.util.function.LongBinaryOperator
+java.util.function.LongConsumer
java.util.function.LongUnaryOperator
java.util.function.Predicate
java.util.function.Supplier
@@ -7774,6 +7574,9 @@
java.util.jar.Manifest
java.util.jar.Manifest$FastInputStream
java.util.logging.ErrorManager
+java.util.logging.FileHandler
+java.util.logging.FileHandler$InitializationErrorManager
+java.util.logging.FileHandler$MeteredStream
java.util.logging.Filter
java.util.logging.Formatter
java.util.logging.Handler
@@ -7797,6 +7600,9 @@
java.util.logging.Logger$LoggerBundle
java.util.logging.LoggingPermission
java.util.logging.LoggingProxyImpl
+java.util.logging.SimpleFormatter
+java.util.logging.StreamHandler
+java.util.logging.XMLFormatter
java.util.prefs.AbstractPreferences
java.util.prefs.FileSystemPreferences
java.util.prefs.Preferences
@@ -7805,40 +7611,94 @@
java.util.regex.Matcher$OffsetBasedMatchResult
java.util.regex.Pattern
java.util.regex.PatternSyntaxException
-java.util.stream.-$Lambda$155$qTstLJg88fs2C3g6LH-R51vCVP0
-java.util.stream.-$Lambda$41$qTstLJg88fs2C3g6LH-R51vCVP0
-java.util.stream.-$Lambda$67$qTstLJg88fs2C3g6LH-R51vCVP0
-java.util.stream.-$Lambda$89$qTstLJg88fs2C3g6LH-R51vCVP0
+java.util.stream.-$Lambda$DJvCeprCIGMk0JvfSkTmQUmEYKA$1
+java.util.stream.-$Lambda$QgGTJrv63_zzBbeGjswm_UMqEbo$12
+java.util.stream.-$Lambda$QgGTJrv63_zzBbeGjswm_UMqEbo$5
+java.util.stream.-$Lambda$QgGTJrv63_zzBbeGjswm_UMqEbo$6
+java.util.stream.-$Lambda$RYrQKhHyGc-mMxiERR98xxRAWkA$5
+java.util.stream.-$Lambda$ioGbka_-VkWTFjRjTt8T4zzsxgk$3
+java.util.stream.-$Lambda$ioGbka_-VkWTFjRjTt8T4zzsxgk$7
+java.util.stream.-$Lambda$qTstLJg88fs2C3g6LH-R51vCVP0$21
+java.util.stream.-$Lambda$qTstLJg88fs2C3g6LH-R51vCVP0$22
+java.util.stream.-$Lambda$qTstLJg88fs2C3g6LH-R51vCVP0$26
+java.util.stream.-$Lambda$qTstLJg88fs2C3g6LH-R51vCVP0$4
+java.util.stream.-$Lambda$qTstLJg88fs2C3g6LH-R51vCVP0$5
+java.util.stream.-$Lambda$qTstLJg88fs2C3g6LH-R51vCVP0$51
+java.util.stream.-$Lambda$qTstLJg88fs2C3g6LH-R51vCVP0$54
+java.util.stream.-$Lambda$qTstLJg88fs2C3g6LH-R51vCVP0$67
+java.util.stream.-$Lambda$qTstLJg88fs2C3g6LH-R51vCVP0$83
java.util.stream.AbstractPipeline
+java.util.stream.AbstractSpinedBuffer
java.util.stream.BaseStream
java.util.stream.Collector
java.util.stream.Collector$Characteristics
java.util.stream.Collectors
java.util.stream.Collectors$CollectorImpl
+java.util.stream.DistinctOps
+java.util.stream.DistinctOps$1
+java.util.stream.DistinctOps$1$2
java.util.stream.DoubleStream
+java.util.stream.FindOps
+java.util.stream.FindOps$FindOp
+java.util.stream.FindOps$FindSink
+java.util.stream.FindOps$FindSink$OfRef
java.util.stream.ForEachOps
java.util.stream.ForEachOps$ForEachOp
java.util.stream.ForEachOps$ForEachOp$OfRef
+java.util.stream.IntPipeline
+java.util.stream.IntPipeline$4
+java.util.stream.IntPipeline$4$1
+java.util.stream.IntPipeline$Head
+java.util.stream.IntPipeline$StatelessOp
java.util.stream.IntStream
+java.util.stream.LongPipeline
+java.util.stream.LongPipeline$StatelessOp
java.util.stream.LongStream
+java.util.stream.Node
+java.util.stream.Node$Builder
+java.util.stream.Node$Builder$OfInt
+java.util.stream.Node$OfDouble
+java.util.stream.Node$OfInt
+java.util.stream.Node$OfLong
+java.util.stream.Node$OfPrimitive
+java.util.stream.Nodes
+java.util.stream.Nodes$EmptyNode
+java.util.stream.Nodes$EmptyNode$OfDouble
+java.util.stream.Nodes$EmptyNode$OfInt
+java.util.stream.Nodes$EmptyNode$OfLong
+java.util.stream.Nodes$EmptyNode$OfRef
+java.util.stream.Nodes$IntSpinedNodeBuilder
java.util.stream.PipelineHelper
java.util.stream.ReduceOps
java.util.stream.ReduceOps$3
java.util.stream.ReduceOps$3ReducingSink
+java.util.stream.ReduceOps$8
+java.util.stream.ReduceOps$8ReducingSink
java.util.stream.ReduceOps$AccumulatingSink
java.util.stream.ReduceOps$Box
java.util.stream.ReduceOps$ReduceOp
java.util.stream.ReferencePipeline
java.util.stream.ReferencePipeline$2
java.util.stream.ReferencePipeline$2$1
+java.util.stream.ReferencePipeline$3
+java.util.stream.ReferencePipeline$3$1
+java.util.stream.ReferencePipeline$4
+java.util.stream.ReferencePipeline$4$1
+java.util.stream.ReferencePipeline$5
+java.util.stream.ReferencePipeline$5$1
java.util.stream.ReferencePipeline$Head
java.util.stream.ReferencePipeline$StatefulOp
java.util.stream.ReferencePipeline$StatelessOp
java.util.stream.Sink
+java.util.stream.Sink$ChainedInt
java.util.stream.Sink$ChainedReference
+java.util.stream.Sink$OfInt
+java.util.stream.Sink$OfLong
java.util.stream.SliceOps
java.util.stream.SliceOps$1
java.util.stream.SliceOps$1$1
+java.util.stream.SpinedBuffer$OfInt
+java.util.stream.SpinedBuffer$OfPrimitive
java.util.stream.Stream
java.util.stream.StreamOpFlag
java.util.stream.StreamOpFlag$MaskBuilder
@@ -7852,7 +7712,6 @@
java.util.zip.Adler32
java.util.zip.CRC32
java.util.zip.CheckedInputStream
-java.util.zip.CheckedOutputStream
java.util.zip.Checksum
java.util.zip.DataFormatException
java.util.zip.Deflater
@@ -7866,14 +7725,12 @@
java.util.zip.ZipCoder
java.util.zip.ZipConstants
java.util.zip.ZipEntry
-java.util.zip.ZipError
java.util.zip.ZipException
java.util.zip.ZipFile
java.util.zip.ZipFile$ZipEntryIterator
java.util.zip.ZipFile$ZipFileInflaterInputStream
java.util.zip.ZipFile$ZipFileInputStream
java.util.zip.ZipInputStream
-java.util.zip.ZipOutputStream
java.util.zip.ZipUtils
javax.crypto.BadPaddingException
javax.crypto.Cipher
@@ -7883,8 +7740,6 @@
javax.crypto.Cipher$NeedToSet
javax.crypto.Cipher$SpiAndProviderUpdater
javax.crypto.Cipher$Transform
-javax.crypto.CipherInputStream
-javax.crypto.CipherOutputStream
javax.crypto.CipherSpi
javax.crypto.IllegalBlockSizeException
javax.crypto.JarVerifier
@@ -7898,8 +7753,6 @@
javax.crypto.NullCipher
javax.crypto.SecretKey
javax.crypto.ShortBufferException
-javax.crypto.interfaces.PBEKey
-javax.crypto.spec.GCMParameterSpec
javax.crypto.spec.IvParameterSpec
javax.crypto.spec.OAEPParameterSpec
javax.crypto.spec.PBEParameterSpec
@@ -7925,7 +7778,6 @@
javax.net.ssl.HandshakeCompletedListener
javax.net.ssl.HostnameVerifier
javax.net.ssl.HttpsURLConnection
-javax.net.ssl.HttpsURLConnection$NoPreloadHolder
javax.net.ssl.KeyManager
javax.net.ssl.KeyManagerFactory
javax.net.ssl.KeyManagerFactory$1
@@ -7936,7 +7788,6 @@
javax.net.ssl.SSLContextSpi
javax.net.ssl.SSLEngine
javax.net.ssl.SSLException
-javax.net.ssl.SSLHandshakeException
javax.net.ssl.SSLParameters
javax.net.ssl.SSLPeerUnverifiedException
javax.net.ssl.SSLProtocolException
@@ -7962,19 +7813,11 @@
javax.security.cert.CertificateException
javax.security.cert.X509Certificate
javax.sip.SipException
-javax.xml.parsers.DocumentBuilder
-javax.xml.parsers.DocumentBuilderFactory
javax.xml.parsers.ParserConfigurationException
javax.xml.parsers.SAXParser
javax.xml.parsers.SAXParserFactory
-javax.xml.transform.Result
-javax.xml.transform.Source
-javax.xml.transform.Transformer
javax.xml.transform.TransformerConfigurationException
javax.xml.transform.TransformerException
-javax.xml.transform.TransformerFactory
-javax.xml.transform.dom.DOMSource
-javax.xml.transform.stream.StreamResult
junit.framework.Assert
libcore.icu.CollationKeyICU
libcore.icu.DateIntervalFormat
@@ -8007,11 +7850,11 @@
libcore.io.IoUtils
libcore.io.IoUtils$FileReader
libcore.io.Libcore
+libcore.io.Linux
libcore.io.Memory
libcore.io.MemoryMappedFile
libcore.io.NioBufferIterator
libcore.io.Os
-libcore.io.Posix
libcore.io.Streams
libcore.math.MathUtils
libcore.net.MimeUtils
@@ -8020,15 +7863,12 @@
libcore.net.UriCodec
libcore.net.event.NetworkEventDispatcher
libcore.net.event.NetworkEventListener
-libcore.net.http.HttpDate
-libcore.net.http.HttpDate$1
libcore.reflect.AnnotatedElements
libcore.reflect.AnnotationFactory
libcore.reflect.AnnotationMember
libcore.reflect.AnnotationMember$DefaultValues
libcore.reflect.GenericArrayTypeImpl
libcore.reflect.GenericSignatureParser
-libcore.reflect.InternalNames
libcore.reflect.ListOfTypes
libcore.reflect.ListOfVariables
libcore.reflect.ParameterizedTypeImpl
@@ -8043,6 +7883,7 @@
libcore.util.NativeAllocationRegistry$CleanerRunner
libcore.util.NativeAllocationRegistry$CleanerThunk
libcore.util.Objects
+libcore.util.TimeZoneDataFiles
libcore.util.ZoneInfo
libcore.util.ZoneInfo$CheckedArithmeticException
libcore.util.ZoneInfo$OffsetInterval
@@ -8066,23 +7907,8 @@
org.apache.harmony.xml.ExpatParser$CurrentAttributes
org.apache.harmony.xml.ExpatParser$ExpatLocator
org.apache.harmony.xml.ExpatReader
-org.apache.harmony.xml.dom.AttrImpl
-org.apache.harmony.xml.dom.CharacterDataImpl
-org.apache.harmony.xml.dom.DOMImplementationImpl
-org.apache.harmony.xml.dom.DocumentImpl
-org.apache.harmony.xml.dom.ElementImpl
-org.apache.harmony.xml.dom.ElementImpl$ElementAttrNamedNodeMapImpl
-org.apache.harmony.xml.dom.InnerNodeImpl
-org.apache.harmony.xml.dom.LeafNodeImpl
-org.apache.harmony.xml.dom.NodeImpl
-org.apache.harmony.xml.dom.NodeImpl$1
-org.apache.harmony.xml.dom.NodeListImpl
-org.apache.harmony.xml.dom.TextImpl
-org.apache.harmony.xml.parsers.DocumentBuilderFactoryImpl
-org.apache.harmony.xml.parsers.DocumentBuilderImpl
org.apache.harmony.xml.parsers.SAXParserFactoryImpl
org.apache.harmony.xml.parsers.SAXParserImpl
-org.apache.http.ConnectionClosedException
org.apache.http.ConnectionReuseStrategy
org.apache.http.FormattedHeader
org.apache.http.Header
@@ -8106,9 +7932,7 @@
org.apache.http.HttpResponseInterceptor
org.apache.http.HttpServerConnection
org.apache.http.HttpVersion
-org.apache.http.MethodNotSupportedException
org.apache.http.NameValuePair
-org.apache.http.NoHttpResponseException
org.apache.http.ParseException
org.apache.http.ProtocolException
org.apache.http.ProtocolVersion
@@ -8132,15 +7956,11 @@
org.apache.http.client.UserTokenHandler
org.apache.http.client.entity.UrlEncodedFormEntity
org.apache.http.client.methods.AbortableHttpRequest
-org.apache.http.client.methods.HttpDelete
org.apache.http.client.methods.HttpEntityEnclosingRequestBase
org.apache.http.client.methods.HttpGet
-org.apache.http.client.methods.HttpHead
-org.apache.http.client.methods.HttpOptions
org.apache.http.client.methods.HttpPost
org.apache.http.client.methods.HttpPut
org.apache.http.client.methods.HttpRequestBase
-org.apache.http.client.methods.HttpTrace
org.apache.http.client.methods.HttpUriRequest
org.apache.http.client.params.HttpClientParams
org.apache.http.client.protocol.RequestAddCookies
@@ -8156,7 +7976,6 @@
org.apache.http.conn.ClientConnectionRequest
org.apache.http.conn.ConnectTimeoutException
org.apache.http.conn.ConnectionKeepAliveStrategy
-org.apache.http.conn.ConnectionPoolTimeoutException
org.apache.http.conn.ConnectionReleaseTrigger
org.apache.http.conn.EofSensorInputStream
org.apache.http.conn.EofSensorWatcher
@@ -8178,7 +7997,6 @@
org.apache.http.conn.routing.RouteInfo$LayerType
org.apache.http.conn.routing.RouteInfo$TunnelType
org.apache.http.conn.routing.RouteTracker
-org.apache.http.conn.scheme.HostNameResolver
org.apache.http.conn.scheme.LayeredSocketFactory
org.apache.http.conn.scheme.PlainSocketFactory
org.apache.http.conn.scheme.Scheme
@@ -8235,7 +8053,6 @@
org.apache.http.impl.client.DefaultTargetAuthenticationHandler
org.apache.http.impl.client.DefaultUserTokenHandler
org.apache.http.impl.client.EntityEnclosingRequestWrapper
-org.apache.http.impl.client.RedirectLocations
org.apache.http.impl.client.RequestWrapper
org.apache.http.impl.client.RoutedRequest
org.apache.http.impl.client.TunnelRefusedException
@@ -8260,7 +8077,6 @@
org.apache.http.impl.conn.tsccm.RouteSpecificPool
org.apache.http.impl.conn.tsccm.ThreadSafeClientConnManager
org.apache.http.impl.conn.tsccm.ThreadSafeClientConnManager$1
-org.apache.http.impl.conn.tsccm.WaitingThread
org.apache.http.impl.conn.tsccm.WaitingThreadAborter
org.apache.http.impl.cookie.AbstractCookieAttributeHandler
org.apache.http.impl.cookie.AbstractCookieSpec
@@ -8369,7 +8185,6 @@
org.apache.http.protocol.UriPatternMatcher
org.apache.http.util.ByteArrayBuffer
org.apache.http.util.CharArrayBuffer
-org.apache.http.util.EncodingUtils
org.apache.http.util.EntityUtils
org.apache.http.util.LangUtils
org.ccil.cowan.tagsoup.AttributesImpl
@@ -8395,19 +8210,6 @@
org.kxml2.io.KXmlParser
org.kxml2.io.KXmlParser$ValueContext
org.kxml2.io.KXmlSerializer
-org.w3c.dom.Attr
-org.w3c.dom.CharacterData
-org.w3c.dom.DOMImplementation
-org.w3c.dom.Document
-org.w3c.dom.DocumentFragment
-org.w3c.dom.DocumentType
-org.w3c.dom.Element
-org.w3c.dom.NamedNodeMap
-org.w3c.dom.Node
-org.w3c.dom.NodeList
-org.w3c.dom.ProcessingInstruction
-org.w3c.dom.Text
-org.w3c.dom.TypeInfo
org.xml.sax.Attributes
org.xml.sax.ContentHandler
org.xml.sax.DTDHandler
@@ -8420,6 +8222,9 @@
org.xml.sax.SAXNotSupportedException
org.xml.sax.SAXParseException
org.xml.sax.XMLReader
+org.xml.sax.ext.DeclHandler
+org.xml.sax.ext.DefaultHandler2
+org.xml.sax.ext.EntityResolver2
org.xml.sax.ext.LexicalHandler
org.xml.sax.helpers.AttributesImpl
org.xml.sax.helpers.DefaultHandler
@@ -8428,7 +8233,9 @@
org.xmlpull.v1.XmlPullParserFactory
org.xmlpull.v1.XmlSerializer
sun.invoke.util.BytecodeDescriptor
+sun.invoke.util.VerifyAccess
sun.invoke.util.Wrapper
+sun.invoke.util.Wrapper$Format
sun.misc.ASCIICaseInsensitiveComparator
sun.misc.Cleaner
sun.misc.CompoundEnumeration
@@ -8465,13 +8272,17 @@
sun.net.www.ParseUtil
sun.net.www.protocol.file.Handler
sun.net.www.protocol.jar.Handler
+sun.nio.ch.AbstractPollArrayWrapper
+sun.nio.ch.AbstractPollSelectorImpl
+sun.nio.ch.AllocatedNativeObject
sun.nio.ch.ChannelInputStream
sun.nio.ch.DatagramChannelImpl
sun.nio.ch.DatagramDispatcher
+sun.nio.ch.DefaultSelectorProvider
sun.nio.ch.DirectBuffer
-sun.nio.ch.EPollArrayWrapper
sun.nio.ch.FileChannelImpl
sun.nio.ch.FileChannelImpl$Unmapper
+sun.nio.ch.FileDescriptorHolderSocketImpl
sun.nio.ch.FileDispatcher
sun.nio.ch.FileDispatcherImpl
sun.nio.ch.FileKey
@@ -8481,16 +8292,31 @@
sun.nio.ch.IOUtil
sun.nio.ch.Interruptible
sun.nio.ch.NativeDispatcher
+sun.nio.ch.NativeObject
sun.nio.ch.NativeThread
sun.nio.ch.NativeThreadSet
sun.nio.ch.Net
+sun.nio.ch.Net$1
+sun.nio.ch.Net$4
+sun.nio.ch.PollArrayWrapper
+sun.nio.ch.PollSelectorImpl
+sun.nio.ch.PollSelectorProvider
sun.nio.ch.SelChImpl
+sun.nio.ch.SelectionKeyImpl
+sun.nio.ch.SelectorImpl
+sun.nio.ch.SelectorProviderImpl
sun.nio.ch.ServerSocketChannelImpl
sun.nio.ch.SharedFileLockTable
sun.nio.ch.SharedFileLockTable$FileLockReference
+sun.nio.ch.SocketAdaptor
+sun.nio.ch.SocketAdaptor$1
+sun.nio.ch.SocketAdaptor$2
+sun.nio.ch.SocketAdaptor$SocketInputStream
sun.nio.ch.SocketChannelImpl
+sun.nio.ch.SocketDispatcher
sun.nio.ch.Util
sun.nio.ch.Util$1
+sun.nio.ch.Util$2
sun.nio.ch.Util$BufferCache
sun.nio.cs.ArrayDecoder
sun.nio.cs.ArrayEncoder
@@ -8500,9 +8326,11 @@
sun.nio.cs.ThreadLocalCoders$1
sun.nio.cs.ThreadLocalCoders$2
sun.nio.cs.ThreadLocalCoders$Cache
+sun.nio.fs.AbstractBasicFileAttributeView
sun.nio.fs.AbstractFileSystemProvider
sun.nio.fs.AbstractPath
sun.nio.fs.DefaultFileSystemProvider
+sun.nio.fs.DynamicFileAttributeView
sun.nio.fs.LinuxFileSystem
sun.nio.fs.LinuxFileSystemProvider
sun.nio.fs.NativeBuffer
@@ -8512,7 +8340,10 @@
sun.nio.fs.UnixChannelFactory$Flags
sun.nio.fs.UnixConstants
sun.nio.fs.UnixException
+sun.nio.fs.UnixFileAttributeViews
+sun.nio.fs.UnixFileAttributeViews$Basic
sun.nio.fs.UnixFileAttributes
+sun.nio.fs.UnixFileAttributes$UnixAsBasicFileAttributes
sun.nio.fs.UnixFileModeAttribute
sun.nio.fs.UnixFileStoreAttributes
sun.nio.fs.UnixFileSystem
@@ -8523,6 +8354,7 @@
sun.nio.fs.Util
sun.reflect.misc.ReflectUtil
sun.security.action.GetBooleanAction
+sun.security.action.GetIntegerAction
sun.security.action.GetPropertyAction
sun.security.jca.GetInstance
sun.security.jca.GetInstance$Instance
@@ -8548,23 +8380,34 @@
sun.security.provider.certpath.AdaptableX509CertSelector
sun.security.provider.certpath.AlgorithmChecker
sun.security.provider.certpath.BasicChecker
+sun.security.provider.certpath.CertId
sun.security.provider.certpath.CertPathHelper
sun.security.provider.certpath.ConstraintsChecker
sun.security.provider.certpath.KeyChecker
+sun.security.provider.certpath.OCSP$RevocationStatus
+sun.security.provider.certpath.OCSP$RevocationStatus$CertStatus
+sun.security.provider.certpath.OCSPResponse
+sun.security.provider.certpath.OCSPResponse$ResponseStatus
+sun.security.provider.certpath.OCSPResponse$SingleResponse
sun.security.provider.certpath.PKIX
sun.security.provider.certpath.PKIX$ValidatorParams
sun.security.provider.certpath.PKIXCertPathValidator
sun.security.provider.certpath.PKIXMasterCertPathValidator
sun.security.provider.certpath.PolicyChecker
sun.security.provider.certpath.PolicyNodeImpl
-sun.security.util.-$Lambda$179$Kli5xKA4dAwmFO1sy_hpNWmbfH4
+sun.security.provider.certpath.RevocationChecker
+sun.security.provider.certpath.RevocationChecker$1
+sun.security.provider.certpath.RevocationChecker$Mode
+sun.security.provider.certpath.RevocationChecker$RevocationProperties
sun.security.util.AbstractAlgorithmConstraints
+sun.security.util.AbstractAlgorithmConstraints$1
sun.security.util.AlgorithmDecomposer
sun.security.util.BitArray
sun.security.util.ByteArrayLexOrder
sun.security.util.ByteArrayTagOrder
sun.security.util.Cache
sun.security.util.Cache$EqualByteArray
+sun.security.util.CertConstraintParameters
sun.security.util.Debug
sun.security.util.DerEncoder
sun.security.util.DerIndefLenConverter
@@ -8573,9 +8416,10 @@
sun.security.util.DerOutputStream
sun.security.util.DerValue
sun.security.util.DisabledAlgorithmConstraints
+sun.security.util.DisabledAlgorithmConstraints$Constraint
+sun.security.util.DisabledAlgorithmConstraints$Constraint$Operator
+sun.security.util.DisabledAlgorithmConstraints$Constraints
sun.security.util.DisabledAlgorithmConstraints$KeySizeConstraint
-sun.security.util.DisabledAlgorithmConstraints$KeySizeConstraint$Operator
-sun.security.util.DisabledAlgorithmConstraints$KeySizeConstraints
sun.security.util.KeyUtil
sun.security.util.Length
sun.security.util.ManifestDigester
@@ -8657,6 +8501,7 @@
sun.util.locale.BaseLocale
sun.util.locale.BaseLocale$Cache
sun.util.locale.BaseLocale$Key
+sun.util.locale.Extension
sun.util.locale.InternalLocaleBuilder
sun.util.locale.InternalLocaleBuilder$CaseInsensitiveChar
sun.util.locale.LanguageTag
@@ -8667,9 +8512,11 @@
sun.util.locale.LocaleUtils
sun.util.locale.ParseStatus
sun.util.locale.StringTokenIterator
+sun.util.locale.UnicodeLocaleExtension
sun.util.logging.LoggingProxy
sun.util.logging.LoggingSupport
sun.util.logging.LoggingSupport$1
+sun.util.logging.LoggingSupport$2
sun.util.logging.PlatformLogger
sun.util.logging.PlatformLogger$1
sun.util.logging.PlatformLogger$JavaLoggerProxy
diff --git a/core/java/android/animation/AnimationHandler.java b/core/java/android/animation/AnimationHandler.java
index e2e5a8f..260323f 100644
--- a/core/java/android/animation/AnimationHandler.java
+++ b/core/java/android/animation/AnimationHandler.java
@@ -136,7 +136,8 @@
private void doAnimationFrame(long frameTime) {
long currentTime = SystemClock.uptimeMillis();
- for (int i = 0; i < mAnimationCallbacks.size(); i++) {
+ final int size = mAnimationCallbacks.size();
+ for (int i = 0; i < size; i++) {
final AnimationFrameCallback callback = mAnimationCallbacks.get(i);
if (callback == null) {
continue;
diff --git a/core/java/android/animation/ValueAnimator.java b/core/java/android/animation/ValueAnimator.java
index 4e31e44..e686a89 100644
--- a/core/java/android/animation/ValueAnimator.java
+++ b/core/java/android/animation/ValueAnimator.java
@@ -1397,7 +1397,7 @@
if (mStartTime < 0) {
// First frame. If there is start delay, start delay count down will happen *after* this
// frame.
- mStartTime = mReversing ? frameTime : frameTime + mStartDelay;
+ mStartTime = mReversing ? frameTime : frameTime + (long) (mStartDelay * sDurationScale);
}
// Handle pause/resume
diff --git a/core/java/android/app/Activity.java b/core/java/android/app/Activity.java
index ab03556..b360c82 100644
--- a/core/java/android/app/Activity.java
+++ b/core/java/android/app/Activity.java
@@ -4719,7 +4719,9 @@
resolvedType = fillInIntent.resolveTypeIfNeeded(getContentResolver());
}
int result = ActivityManager.getService()
- .startActivityIntentSender(mMainThread.getApplicationThread(), intent,
+ .startActivityIntentSender(mMainThread.getApplicationThread(),
+ intent != null ? intent.getTarget() : null,
+ intent != null ? intent.getWhitelistToken() : null,
fillInIntent, resolvedType, mToken, who,
requestCode, flagsMask, flagsValues, options);
if (result == ActivityManager.START_CANCELED) {
@@ -6140,6 +6142,7 @@
*
* @param action the action to run on the UI thread
*/
+ @Override
public final void runOnUiThread(Runnable action) {
if (Thread.currentThread() != mUiThread) {
mHandler.post(action);
@@ -7447,6 +7450,7 @@
}
/** @hide */
+ @Override
@NonNull public View[] findViewsByAccessibilityIdTraversal(@NonNull int[] viewIds) {
final View[] views = new View[viewIds.length];
final ArrayList<ViewRootImpl> roots =
@@ -7470,6 +7474,25 @@
/** @hide */
@Override
+ @Nullable public View findViewByAccessibilityIdTraversal(int viewId) {
+ final ArrayList<ViewRootImpl> roots =
+ WindowManagerGlobal.getInstance().getRootViews(getActivityToken());
+ for (int rootNum = 0; rootNum < roots.size(); rootNum++) {
+ final View rootView = roots.get(rootNum).getView();
+
+ if (rootView != null) {
+ final View view = rootView.findViewByAccessibilityIdTraversal(viewId);
+ if (view != null) {
+ return view;
+ }
+ }
+ }
+
+ return null;
+ }
+
+ /** @hide */
+ @Override
@NonNull public boolean[] getViewVisibility(@NonNull int[] viewIds) {
final boolean[] isVisible = new boolean[viewIds.length];
final View views[] = findViewsByAccessibilityIdTraversal(viewIds);
diff --git a/core/java/android/app/ActivityManager.java b/core/java/android/app/ActivityManager.java
index 0925217..7e230a3 100644
--- a/core/java/android/app/ActivityManager.java
+++ b/core/java/android/app/ActivityManager.java
@@ -1139,8 +1139,12 @@
* E.g. freeform, split-screen, picture-in-picture.
* @hide
*/
- static public boolean supportsMultiWindow() {
- return !isLowRamDeviceStatic()
+ static public boolean supportsMultiWindow(Context context) {
+ // On watches, multi-window is used to present essential system UI, and thus it must be
+ // supported regardless of device memory characteristics.
+ boolean isWatch = context.getPackageManager().hasSystemFeature(
+ PackageManager.FEATURE_WATCH);
+ return (!isLowRamDeviceStatic() || isWatch)
&& Resources.getSystem().getBoolean(
com.android.internal.R.bool.config_supportsMultiWindow);
}
@@ -1149,8 +1153,8 @@
* Returns true if the system supports split screen multi-window.
* @hide
*/
- static public boolean supportsSplitScreenMultiWindow() {
- return supportsMultiWindow()
+ static public boolean supportsSplitScreenMultiWindow(Context context) {
+ return supportsMultiWindow(context)
&& Resources.getSystem().getBoolean(
com.android.internal.R.bool.config_supportsSplitScreenMultiWindow);
}
diff --git a/core/java/android/app/ActivityOptions.java b/core/java/android/app/ActivityOptions.java
index 53608fb..c4d5116 100644
--- a/core/java/android/app/ActivityOptions.java
+++ b/core/java/android/app/ActivityOptions.java
@@ -25,6 +25,8 @@
import android.content.Context;
import android.content.Intent;
import android.graphics.Bitmap;
+import android.graphics.Bitmap.Config;
+import android.graphics.GraphicBuffer;
import android.graphics.Rect;
import android.os.Bundle;
import android.os.Handler;
@@ -826,7 +828,11 @@
case ANIM_THUMBNAIL_SCALE_DOWN:
case ANIM_THUMBNAIL_ASPECT_SCALE_UP:
case ANIM_THUMBNAIL_ASPECT_SCALE_DOWN:
- mThumbnail = (Bitmap) opts.getParcelable(KEY_ANIM_THUMBNAIL);
+ // Unpackage the GraphicBuffer from the parceled thumbnail
+ final GraphicBuffer buffer = opts.getParcelable(KEY_ANIM_THUMBNAIL);
+ if (buffer != null) {
+ mThumbnail = Bitmap.createHardwareBitmap(buffer);
+ }
mStartX = opts.getInt(KEY_ANIM_START_X, 0);
mStartY = opts.getInt(KEY_ANIM_START_Y, 0);
mWidth = opts.getInt(KEY_ANIM_WIDTH, 0);
@@ -919,9 +925,14 @@
return mCustomInPlaceResId;
}
- /** @hide */
- public Bitmap getThumbnail() {
- return mThumbnail;
+ /**
+ * The thumbnail is copied into a hardware bitmap when it is bundled and sent to the system, so
+ * it should always be backed by a GraphicBuffer on the other end.
+ *
+ * @hide
+ */
+ public GraphicBuffer getThumbnail() {
+ return mThumbnail.createGraphicBufferHandle();
}
/** @hide */
@@ -1230,7 +1241,14 @@
case ANIM_THUMBNAIL_SCALE_DOWN:
case ANIM_THUMBNAIL_ASPECT_SCALE_UP:
case ANIM_THUMBNAIL_ASPECT_SCALE_DOWN:
- b.putParcelable(KEY_ANIM_THUMBNAIL, mThumbnail);
+ // Once we parcel the thumbnail for transfering over to the system, create a copy of
+ // the bitmap to a hardware bitmap and pass through the GraphicBuffer
+ if (mThumbnail == null) {
+ b.putParcelable(KEY_ANIM_THUMBNAIL, null);
+ } else {
+ final Bitmap hwBitmap = mThumbnail.copy(Config.HARDWARE, true /* immutable */);
+ b.putParcelable(KEY_ANIM_THUMBNAIL, hwBitmap.createGraphicBufferHandle());
+ }
b.putInt(KEY_ANIM_START_X, mStartX);
b.putInt(KEY_ANIM_START_Y, mStartY);
b.putInt(KEY_ANIM_WIDTH, mWidth);
diff --git a/core/java/android/app/ActivityThread.java b/core/java/android/app/ActivityThread.java
index 928ef7e..01e4cceb 100644
--- a/core/java/android/app/ActivityThread.java
+++ b/core/java/android/app/ActivityThread.java
@@ -3567,6 +3567,7 @@
try {
if (localLOGV) Slog.v(TAG, "Destroying service " + s);
s.onDestroy();
+ s.detachAndCleanUp();
Context context = s.getBaseContext();
if (context instanceof ContextImpl) {
final String who = s.getClassName();
diff --git a/core/java/android/app/AlertDialog.java b/core/java/android/app/AlertDialog.java
index b7f1068..a44bd03 100644
--- a/core/java/android/app/AlertDialog.java
+++ b/core/java/android/app/AlertDialog.java
@@ -25,6 +25,7 @@
import android.annotation.StyleRes;
import android.content.Context;
import android.content.DialogInterface;
+import android.content.res.ResourceId;
import android.database.Cursor;
import android.graphics.drawable.Drawable;
import android.os.Bundle;
@@ -204,7 +205,7 @@
mAlert = AlertController.create(getContext(), this, getWindow());
}
- static int resolveDialogTheme(Context context, int themeResId) {
+ static @StyleRes int resolveDialogTheme(Context context, @StyleRes int themeResId) {
if (themeResId == THEME_TRADITIONAL) {
return R.style.Theme_Dialog_Alert;
} else if (themeResId == THEME_HOLO_DARK) {
@@ -215,7 +216,7 @@
return R.style.Theme_DeviceDefault_Dialog_Alert;
} else if (themeResId == THEME_DEVICE_DEFAULT_LIGHT) {
return R.style.Theme_DeviceDefault_Light_Dialog_Alert;
- } else if (Integer.compareUnsigned(themeResId, 0x01000000) >= 0) {
+ } else if (ResourceId.isValid(themeResId)) {
// start of real resource IDs.
return themeResId;
} else {
@@ -450,7 +451,7 @@
* @param context the parent context
*/
public Builder(Context context) {
- this(context, resolveDialogTheme(context, 0));
+ this(context, resolveDialogTheme(context, ResourceId.ID_NULL));
}
/**
diff --git a/core/java/android/app/ApplicationPackageManager.java b/core/java/android/app/ApplicationPackageManager.java
index 525b151..e5c4208 100644
--- a/core/java/android/app/ApplicationPackageManager.java
+++ b/core/java/android/app/ApplicationPackageManager.java
@@ -2108,7 +2108,7 @@
public void freeStorageAndNotify(String volumeUuid, long idealStorageSize,
IPackageDataObserver observer) {
try {
- mPM.freeStorageAndNotify(volumeUuid, idealStorageSize, observer);
+ mPM.freeStorageAndNotify(volumeUuid, idealStorageSize, 0, observer);
} catch (RemoteException e) {
throw e.rethrowFromSystemServer();
}
@@ -2117,7 +2117,7 @@
@Override
public void freeStorage(String volumeUuid, long freeStorageSize, IntentSender pi) {
try {
- mPM.freeStorage(volumeUuid, freeStorageSize, pi);
+ mPM.freeStorage(volumeUuid, freeStorageSize, 0, pi);
} catch (RemoteException e) {
throw e.rethrowFromSystemServer();
}
diff --git a/core/java/android/app/ContextImpl.java b/core/java/android/app/ContextImpl.java
index 2de205b..268a105b 100644
--- a/core/java/android/app/ContextImpl.java
+++ b/core/java/android/app/ContextImpl.java
@@ -925,7 +925,9 @@
resolvedType = fillInIntent.resolveTypeIfNeeded(getContentResolver());
}
int result = ActivityManager.getService()
- .startActivityIntentSender(mMainThread.getApplicationThread(), intent,
+ .startActivityIntentSender(mMainThread.getApplicationThread(),
+ intent != null ? intent.getTarget() : null,
+ intent != null ? intent.getWhitelistToken() : null,
fillInIntent, resolvedType, null, null,
0, flagsMask, flagsValues, options);
if (result == ActivityManager.START_CANCELED) {
diff --git a/core/java/android/app/Dialog.java b/core/java/android/app/Dialog.java
index 943c572..b162cb1 100644
--- a/core/java/android/app/Dialog.java
+++ b/core/java/android/app/Dialog.java
@@ -34,6 +34,7 @@
import android.content.DialogInterface;
import android.content.res.Configuration;
import android.content.pm.ApplicationInfo;
+import android.content.res.ResourceId;
import android.graphics.drawable.Drawable;
import android.net.Uri;
import android.os.Bundle;
@@ -169,7 +170,7 @@
Dialog(@NonNull Context context, @StyleRes int themeResId, boolean createContextThemeWrapper) {
if (createContextThemeWrapper) {
- if (themeResId == 0) {
+ if (themeResId == ResourceId.ID_NULL) {
final TypedValue outValue = new TypedValue();
context.getTheme().resolveAttribute(R.attr.dialogTheme, outValue, true);
themeResId = outValue.resourceId;
diff --git a/core/java/android/app/FragmentManager.java b/core/java/android/app/FragmentManager.java
index 95d55dc..3e26e0f 100644
--- a/core/java/android/app/FragmentManager.java
+++ b/core/java/android/app/FragmentManager.java
@@ -2603,23 +2603,25 @@
f.mTargetIndex = f.mTarget != null ? f.mTarget.mIndex : -1;
if (DEBUG) Log.v(TAG, "retainNonConfig: keeping retained " + f);
}
- boolean addedChild = false;
+ FragmentManagerNonConfig child;
if (f.mChildFragmentManager != null) {
f.mChildFragmentManager.saveNonConfig();
- FragmentManagerNonConfig child = f.mChildFragmentManager.mSavedNonConfig;
- if (child != null) {
- if (childFragments == null) {
- childFragments = new ArrayList<>();
- for (int j = 0; j < i; j++) {
- childFragments.add(null);
- }
- }
- childFragments.add(child);
- addedChild = true;
+ child = f.mChildFragmentManager.mSavedNonConfig;
+ } else {
+ // f.mChildNonConfig may be not null, when the parent fragment is
+ // in the backstack.
+ child = f.mChildNonConfig;
+ }
+
+ if (childFragments == null && child != null) {
+ childFragments = new ArrayList<>(mActive.size());
+ for (int j = 0; j < i; j++) {
+ childFragments.add(null);
}
}
- if (childFragments != null && !addedChild) {
- childFragments.add(null);
+
+ if (childFragments != null) {
+ childFragments.add(child);
}
}
}
diff --git a/core/java/android/app/IActivityManager.aidl b/core/java/android/app/IActivityManager.aidl
index 9552d17..3ac026d 100644
--- a/core/java/android/app/IActivityManager.aidl
+++ b/core/java/android/app/IActivityManager.aidl
@@ -236,8 +236,8 @@
Debug.MemoryInfo[] getProcessMemoryInfo(in int[] pids);
void killApplicationProcess(in String processName, int uid);
int startActivityIntentSender(in IApplicationThread caller,
- in IntentSender intent, in Intent fillInIntent, in String resolvedType,
- in IBinder resultTo, in String resultWho, int requestCode,
+ in IIntentSender target, in IBinder whitelistToken, in Intent fillInIntent,
+ in String resolvedType, in IBinder resultTo, in String resultWho, int requestCode,
int flagsMask, int flagsValues, in Bundle options);
void overridePendingTransition(in IBinder token, in String packageName,
int enterAnim, int exitAnim);
diff --git a/core/java/android/app/Notification.java b/core/java/android/app/Notification.java
index 3ed174b..31f52db 100644
--- a/core/java/android/app/Notification.java
+++ b/core/java/android/app/Notification.java
@@ -1168,7 +1168,7 @@
*/
public static final int GROUP_ALERT_CHILDREN = 2;
- private int mGroupAlertBehavior = GROUP_ALERT_ALL;
+ private int mGroupAlertBehavior = GROUP_ALERT_CHILDREN;
/**
* If this notification is being shown as a badge, always show as a number.
@@ -2640,6 +2640,20 @@
}
/**
+ * @hide
+ */
+ public boolean suppressAlertingDueToGrouping() {
+ if (isGroupSummary()
+ && getGroupAlertBehavior() == Notification.GROUP_ALERT_CHILDREN) {
+ return true;
+ } else if (isGroupChild()
+ && getGroupAlertBehavior() == Notification.GROUP_ALERT_SUMMARY) {
+ return true;
+ }
+ return false;
+ }
+
+ /**
* Builder class for {@link Notification} objects.
*
* Provides a convenient way to set the various fields of a {@link Notification} and generate
diff --git a/core/java/android/app/NotificationChannel.java b/core/java/android/app/NotificationChannel.java
index bc7fcf5..143d147 100644
--- a/core/java/android/app/NotificationChannel.java
+++ b/core/java/android/app/NotificationChannel.java
@@ -71,6 +71,7 @@
private static final String ATT_SHOW_BADGE = "show_badge";
private static final String ATT_USER_LOCKED = "locked";
private static final String ATT_GROUP = "group";
+ private static final String ATT_BLOCKABLE_SYSTEM = "blockable_system";
private static final String DELIMITER = ",";
/**
@@ -140,6 +141,7 @@
private boolean mDeleted = DEFAULT_DELETED;
private String mGroup;
private AudioAttributes mAudioAttributes = Notification.AUDIO_ATTRIBUTES_DEFAULT;
+ private boolean mBlockableSystem = false;
/**
* Creates a notification channel.
@@ -199,6 +201,7 @@
}
mAudioAttributes = in.readInt() > 0 ? AudioAttributes.CREATOR.createFromParcel(in) : null;
mLightColor = in.readInt();
+ mBlockableSystem = in.readBoolean();
}
@Override
@@ -249,6 +252,7 @@
dest.writeInt(0);
}
dest.writeInt(mLightColor);
+ dest.writeBoolean(mBlockableSystem);
}
/**
@@ -272,6 +276,12 @@
mDeleted = deleted;
}
+ /**
+ * @hide
+ */
+ public void setBlockableSystem(boolean blockableSystem) {
+ mBlockableSystem = blockableSystem;
+ }
// Modifiable by apps post channel creation
/**
@@ -421,7 +431,6 @@
this.mLockscreenVisibility = lockscreenVisibility;
}
-
/**
* Returns the id of this channel.
*/
@@ -549,6 +558,13 @@
/**
* @hide
*/
+ public boolean isBlockableSystem() {
+ return mBlockableSystem;
+ }
+
+ /**
+ * @hide
+ */
@SystemApi
public void populateFromXml(XmlPullParser parser) {
// Name, id, and importance are set in the constructor.
@@ -559,12 +575,13 @@
setSound(safeUri(parser, ATT_SOUND), safeAudioAttributes(parser));
enableLights(safeBool(parser, ATT_LIGHTS, false));
setLightColor(safeInt(parser, ATT_LIGHT_COLOR, DEFAULT_LIGHT_COLOR));
- enableVibration(safeBool(parser, ATT_VIBRATION_ENABLED, false));
setVibrationPattern(safeLongArray(parser, ATT_VIBRATION, null));
+ enableVibration(safeBool(parser, ATT_VIBRATION_ENABLED, false));
setShowBadge(safeBool(parser, ATT_SHOW_BADGE, false));
setDeleted(safeBool(parser, ATT_DELETED, false));
setGroup(parser.getAttributeValue(null, ATT_GROUP));
lockFields(safeInt(parser, ATT_USER_LOCKED, 0));
+ setBlockableSystem(safeBool(parser, ATT_BLOCKABLE_SYSTEM, false));
}
/**
@@ -625,6 +642,9 @@
if (getGroup() != null) {
out.attribute(null, ATT_GROUP, getGroup());
}
+ if (isBlockableSystem()) {
+ out.attribute(null, ATT_BLOCKABLE_SYSTEM, Boolean.toString(isBlockableSystem()));
+ }
out.endTag(null, TAG_CHANNEL);
}
@@ -665,6 +685,7 @@
record.put(ATT_SHOW_BADGE, Boolean.toString(canShowBadge()));
record.put(ATT_DELETED, Boolean.toString(isDeleted()));
record.put(ATT_GROUP, getGroup());
+ record.put(ATT_BLOCKABLE_SYSTEM, isBlockableSystem());
return record;
}
@@ -764,6 +785,7 @@
if (mVibrationEnabled != that.mVibrationEnabled) return false;
if (mShowBadge != that.mShowBadge) return false;
if (isDeleted() != that.isDeleted()) return false;
+ if (isBlockableSystem() != that.isBlockableSystem()) return false;
if (getId() != null ? !getId().equals(that.getId()) : that.getId() != null) return false;
if (getName() != null ? !getName().equals(that.getName()) : that.getName() != null) {
return false;
@@ -802,6 +824,7 @@
result = 31 * result + (isDeleted() ? 1 : 0);
result = 31 * result + (getGroup() != null ? getGroup().hashCode() : 0);
result = 31 * result + (getAudioAttributes() != null ? getAudioAttributes().hashCode() : 0);
+ result = 31 * result + (isBlockableSystem() ? 1 : 0);
return result;
}
@@ -824,6 +847,7 @@
", mDeleted=" + mDeleted +
", mGroup='" + mGroup + '\'' +
", mAudioAttributes=" + mAudioAttributes +
+ ", mBlockableSystem=" + mBlockableSystem +
'}';
}
}
diff --git a/core/java/android/app/Service.java b/core/java/android/app/Service.java
index 10d6a7b..256c479 100644
--- a/core/java/android/app/Service.java
+++ b/core/java/android/app/Service.java
@@ -767,7 +767,15 @@
mStartCompatibility = getApplicationInfo().targetSdkVersion
< Build.VERSION_CODES.ECLAIR;
}
-
+
+ /**
+ * @hide
+ * Clean up any references to avoid leaks.
+ */
+ public final void detachAndCleanUp() {
+ mToken = null;
+ }
+
final String getClassName() {
return mClassName;
}
diff --git a/core/java/android/app/TimePickerDialog.java b/core/java/android/app/TimePickerDialog.java
index 8a4f8a6..0f006b6 100644
--- a/core/java/android/app/TimePickerDialog.java
+++ b/core/java/android/app/TimePickerDialog.java
@@ -151,10 +151,7 @@
@Override
public void onClick(View view) {
if (mTimePicker.validateInput()) {
- if (mTimeSetListener != null) {
- mTimeSetListener.onTimeSet(mTimePicker, mTimePicker.getCurrentHour(),
- mTimePicker.getCurrentMinute());
- }
+ TimePickerDialog.this.onClick(TimePickerDialog.this, BUTTON_POSITIVE);
dismiss();
}
}
diff --git a/core/java/android/app/admin/DevicePolicyManager.java b/core/java/android/app/admin/DevicePolicyManager.java
index de80c36..9ae5d1c 100644
--- a/core/java/android/app/admin/DevicePolicyManager.java
+++ b/core/java/android/app/admin/DevicePolicyManager.java
@@ -7609,22 +7609,6 @@
}
/**
- * STOPSHIP (b/37622682) Remove it before release.
- * @removed
- */
- public void setAffiliationIds(@NonNull ComponentName admin, @NonNull List<String> ids) {
- throwIfParentInstance("setAffiliationIds");
- if (ids == null) {
- throw new IllegalArgumentException("ids must not be null");
- }
- try {
- mService.setAffiliationIds(admin, ids);
- } catch (RemoteException e) {
- throw e.rethrowFromSystemServer();
- }
- }
-
- /**
* Returns the set of affiliation ids previously set via {@link #setAffiliationIds}, or an
* empty set if none have been set.
*/
diff --git a/core/java/android/app/assist/AssistStructure.java b/core/java/android/app/assist/AssistStructure.java
index c613d97..c99a1e4 100644
--- a/core/java/android/app/assist/AssistStructure.java
+++ b/core/java/android/app/assist/AssistStructure.java
@@ -1682,11 +1682,6 @@
}
@Override
- public void setAutofillId(@NonNull ViewStructure parent, int virtualId) {
- setAutofillId(parent.getAutofillId(), virtualId);
- }
-
- @Override
public ViewStructure newChild(int index) {
ViewNode node = new ViewNode();
mNode.mChildren[index] = node;
diff --git a/core/java/android/app/job/JobInfo.java b/core/java/android/app/job/JobInfo.java
index 3cb59f2..87e516c 100644
--- a/core/java/android/app/job/JobInfo.java
+++ b/core/java/android/app/job/JobInfo.java
@@ -35,6 +35,7 @@
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.util.ArrayList;
+import java.util.Arrays;
import java.util.Objects;
/**
@@ -501,7 +502,7 @@
if (constraintFlags != j.constraintFlags) {
return false;
}
- if (!Objects.deepEquals(triggerContentUris, j.triggerContentUris)) {
+ if (!Arrays.equals(triggerContentUris, j.triggerContentUris)) {
return false;
}
if (triggerContentUpdateDelay != j.triggerContentUpdateDelay) {
@@ -556,37 +557,37 @@
public int hashCode() {
int hashCode = jobId;
if (extras != null) {
- hashCode = 31*hashCode + extras.hashCode();
+ hashCode = 31 * hashCode + extras.hashCode();
}
if (transientExtras != null) {
- hashCode = 31*hashCode + transientExtras.hashCode();
+ hashCode = 31 * hashCode + transientExtras.hashCode();
}
if (clipData != null) {
- hashCode = 31*hashCode + clipData.hashCode();
+ hashCode = 31 * hashCode + clipData.hashCode();
}
hashCode = 31*hashCode + clipGrantFlags;
if (service != null) {
- hashCode = 31*hashCode + service.hashCode();
+ hashCode = 31 * hashCode + service.hashCode();
}
- hashCode = 31*hashCode + constraintFlags;
+ hashCode = 31 * hashCode + constraintFlags;
if (triggerContentUris != null) {
- hashCode = 31*hashCode + triggerContentUris.hashCode();
+ hashCode = 31 * hashCode + Arrays.hashCode(triggerContentUris);
}
- hashCode = 31*hashCode + Long.hashCode(triggerContentUpdateDelay);
- hashCode = 31*hashCode + Long.hashCode(triggerContentMaxDelay);
- hashCode = 31*hashCode + Boolean.hashCode(hasEarlyConstraint);
- hashCode = 31*hashCode + Boolean.hashCode(hasLateConstraint);
- hashCode = 31*hashCode + networkType;
- hashCode = 31*hashCode + Long.hashCode(minLatencyMillis);
- hashCode = 31*hashCode + Long.hashCode(maxExecutionDelayMillis);
- hashCode = 31*hashCode + Boolean.hashCode(isPeriodic);
- hashCode = 31*hashCode + Boolean.hashCode(isPersisted);
- hashCode = 31*hashCode + Long.hashCode(intervalMillis);
- hashCode = 31*hashCode + Long.hashCode(flexMillis);
- hashCode = 31*hashCode + Long.hashCode(initialBackoffMillis);
- hashCode = 31*hashCode + backoffPolicy;
- hashCode = 31*hashCode + priority;
- hashCode = 31*hashCode + flags;
+ hashCode = 31 * hashCode + Long.hashCode(triggerContentUpdateDelay);
+ hashCode = 31 * hashCode + Long.hashCode(triggerContentMaxDelay);
+ hashCode = 31 * hashCode + Boolean.hashCode(hasEarlyConstraint);
+ hashCode = 31 * hashCode + Boolean.hashCode(hasLateConstraint);
+ hashCode = 31 * hashCode + networkType;
+ hashCode = 31 * hashCode + Long.hashCode(minLatencyMillis);
+ hashCode = 31 * hashCode + Long.hashCode(maxExecutionDelayMillis);
+ hashCode = 31 * hashCode + Boolean.hashCode(isPeriodic);
+ hashCode = 31 * hashCode + Boolean.hashCode(isPersisted);
+ hashCode = 31 * hashCode + Long.hashCode(intervalMillis);
+ hashCode = 31 * hashCode + Long.hashCode(flexMillis);
+ hashCode = 31 * hashCode + Long.hashCode(initialBackoffMillis);
+ hashCode = 31 * hashCode + backoffPolicy;
+ hashCode = 31 * hashCode + priority;
+ hashCode = 31 * hashCode + flags;
return hashCode;
}
diff --git a/core/java/android/app/job/JobServiceEngine.java b/core/java/android/app/job/JobServiceEngine.java
index b7d759b..ab94da8 100644
--- a/core/java/android/app/job/JobServiceEngine.java
+++ b/core/java/android/app/job/JobServiceEngine.java
@@ -55,21 +55,12 @@
*/
private static final int MSG_JOB_FINISHED = 2;
- /**
- * Context we are running in.
- */
- private final Service mService;
-
private final IJobService mBinder;
- /** Lock object for {@link #mHandler}. */
- private final Object mHandlerLock = new Object();
-
/**
* Handler we post jobs to. Responsible for calling into the client logic, and handling the
* callback to the system.
*/
- @GuardedBy("mHandlerLock")
JobHandler mHandler;
static final class JobInterface extends IJobService.Stub {
@@ -189,9 +180,8 @@
* @param service The {@link Service} that is creating this engine and in which it will run.
*/
public JobServiceEngine(Service service) {
- mService = service;
mBinder = new JobInterface(this);
- mHandler = new JobHandler(mService.getMainLooper());
+ mHandler = new JobHandler(service.getMainLooper());
}
/**
@@ -220,6 +210,9 @@
* information.
*/
public void jobFinished(JobParameters params, boolean needsReschedule) {
+ if (params == null) {
+ throw new NullPointerException("params");
+ }
Message m = Message.obtain(mHandler, MSG_JOB_FINISHED, params);
m.arg2 = needsReschedule ? 1 : 0;
m.sendToTarget();
diff --git a/core/java/android/app/usage/IStorageStatsManager.aidl b/core/java/android/app/usage/IStorageStatsManager.aidl
index 5d1550f..15e5ea5 100644
--- a/core/java/android/app/usage/IStorageStatsManager.aidl
+++ b/core/java/android/app/usage/IStorageStatsManager.aidl
@@ -24,6 +24,7 @@
boolean isQuotaSupported(String volumeUuid, String callingPackage);
long getTotalBytes(String volumeUuid, String callingPackage);
long getFreeBytes(String volumeUuid, String callingPackage);
+ long getCacheBytes(String volumeUuid, String callingPackage);
long getCacheQuotaBytes(String volumeUuid, int uid, String callingPackage);
StorageStats queryStatsForPackage(String volumeUuid, String packageName, int userId, String callingPackage);
StorageStats queryStatsForUid(String volumeUuid, int uid, String callingPackage);
diff --git a/core/java/android/app/usage/StorageStatsManager.java b/core/java/android/app/usage/StorageStatsManager.java
index d9d958c..0b2b190 100644
--- a/core/java/android/app/usage/StorageStatsManager.java
+++ b/core/java/android/app/usage/StorageStatsManager.java
@@ -142,6 +142,24 @@
return getFreeBytes(convert(uuid));
}
+ /** {@hide} */
+ public @BytesLong long getCacheBytes(@NonNull UUID storageUuid) throws IOException {
+ try {
+ return mService.getCacheBytes(convert(storageUuid), mContext.getOpPackageName());
+ } catch (ParcelableException e) {
+ e.maybeRethrow(IOException.class);
+ throw new RuntimeException(e);
+ } catch (RemoteException e) {
+ throw e.rethrowFromSystemServer();
+ }
+ }
+
+ /** {@hide} */
+ @Deprecated
+ public long getCacheBytes(String uuid) throws IOException {
+ return getCacheBytes(convert(uuid));
+ }
+
/**
* Return storage statistics for a specific package on the requested storage
* volume.
diff --git a/core/java/android/appwidget/AppWidgetProviderInfo.java b/core/java/android/appwidget/AppWidgetProviderInfo.java
index 52fa8a6..fd1b0e0 100644
--- a/core/java/android/appwidget/AppWidgetProviderInfo.java
+++ b/core/java/android/appwidget/AppWidgetProviderInfo.java
@@ -20,6 +20,7 @@
import android.content.Context;
import android.content.pm.ActivityInfo;
import android.content.pm.PackageManager;
+import android.content.res.ResourceId;
import android.content.res.Resources;
import android.graphics.drawable.Drawable;
import android.os.Parcel;
@@ -368,7 +369,7 @@
try {
Resources resources = context.getPackageManager().getResourcesForApplication(
providerInfo.applicationInfo);
- if (resourceId != 0) {
+ if (ResourceId.isValid(resourceId)) {
if (density < 0) {
density = 0;
}
diff --git a/core/java/android/bluetooth/le/ScanRecord.java b/core/java/android/bluetooth/le/ScanRecord.java
index f802e8d..914e8fd 100644
--- a/core/java/android/bluetooth/le/ScanRecord.java
+++ b/core/java/android/bluetooth/le/ScanRecord.java
@@ -47,7 +47,9 @@
private static final int DATA_TYPE_LOCAL_NAME_SHORT = 0x08;
private static final int DATA_TYPE_LOCAL_NAME_COMPLETE = 0x09;
private static final int DATA_TYPE_TX_POWER_LEVEL = 0x0A;
- private static final int DATA_TYPE_SERVICE_DATA = 0x16;
+ private static final int DATA_TYPE_SERVICE_DATA_16_BIT = 0x16;
+ private static final int DATA_TYPE_SERVICE_DATA_32_BIT = 0x20;
+ private static final int DATA_TYPE_SERVICE_DATA_128_BIT = 0x21;
private static final int DATA_TYPE_MANUFACTURER_SPECIFIC_DATA = 0xFF;
// Flags of the advertising data.
@@ -224,10 +226,16 @@
case DATA_TYPE_TX_POWER_LEVEL:
txPowerLevel = scanRecord[currentPos];
break;
- case DATA_TYPE_SERVICE_DATA:
- // The first two bytes of the service data are service data UUID in little
- // endian. The rest bytes are service data.
+ case DATA_TYPE_SERVICE_DATA_16_BIT:
+ case DATA_TYPE_SERVICE_DATA_32_BIT:
+ case DATA_TYPE_SERVICE_DATA_128_BIT:
int serviceUuidLength = BluetoothUuid.UUID_BYTES_16_BIT;
+ if (fieldType == DATA_TYPE_SERVICE_DATA_32_BIT) {
+ serviceUuidLength = BluetoothUuid.UUID_BYTES_32_BIT;
+ } else if (fieldType == DATA_TYPE_SERVICE_DATA_128_BIT) {
+ serviceUuidLength = BluetoothUuid.UUID_BYTES_128_BIT;
+ }
+
byte[] serviceDataUuidBytes = extractBytes(scanRecord, currentPos,
serviceUuidLength);
ParcelUuid serviceDataUuid = BluetoothUuid.parseUuidFrom(
diff --git a/core/java/android/content/IntentSender.java b/core/java/android/content/IntentSender.java
index 0a456b5..ff127df 100644
--- a/core/java/android/content/IntentSender.java
+++ b/core/java/android/content/IntentSender.java
@@ -361,6 +361,11 @@
}
/** @hide */
+ public IBinder getWhitelistToken() {
+ return mWhitelistToken;
+ }
+
+ /** @hide */
public IntentSender(IIntentSender target) {
mTarget = target;
}
diff --git a/core/java/android/content/pm/IPackageManager.aidl b/core/java/android/content/pm/IPackageManager.aidl
index 7aaf453..2ebfa8f 100644
--- a/core/java/android/content/pm/IPackageManager.aidl
+++ b/core/java/android/content/pm/IPackageManager.aidl
@@ -360,7 +360,7 @@
* the operation is completed
*/
void freeStorageAndNotify(in String volumeUuid, in long freeStorageSize,
- IPackageDataObserver observer);
+ int storageFlags, IPackageDataObserver observer);
/**
* Free storage by deleting LRU sorted list of cache files across
@@ -384,7 +384,7 @@
* to indicate that no call back is desired.
*/
void freeStorage(in String volumeUuid, in long freeStorageSize,
- in IntentSender pi);
+ int storageFlags, in IntentSender pi);
/**
* Delete all the cache files in an applications cache directory
diff --git a/core/java/android/content/pm/PackageManagerInternal.java b/core/java/android/content/pm/PackageManagerInternal.java
index 87e6a84..4cee2df 100644
--- a/core/java/android/content/pm/PackageManagerInternal.java
+++ b/core/java/android/content/pm/PackageManagerInternal.java
@@ -343,5 +343,5 @@
public abstract int getUidTargetSdkVersion(int uid);
/** Whether the binder caller can access instant apps. */
- public abstract boolean canAccessInstantApps(int callingUid);
+ public abstract boolean canAccessInstantApps(int callingUid, int userId);
}
diff --git a/core/java/android/content/res/ResourceId.java b/core/java/android/content/res/ResourceId.java
new file mode 100644
index 0000000..adb9cf1
--- /dev/null
+++ b/core/java/android/content/res/ResourceId.java
@@ -0,0 +1,44 @@
+/*
+ * Copyright (C) 2017 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 android.content.res;
+
+import android.annotation.AnyRes;
+
+/**
+ * Provides a set of utility methods for dealing with Resource IDs.
+ * @hide
+ */
+public final class ResourceId {
+
+ /**
+ * The {@code null} resource ID.
+ */
+ public static final @AnyRes int ID_NULL = 0;
+
+ /**
+ * Checks whether the integer {@code id} is a valid resource ID, as generated by AAPT.
+ * <p>Note that a negative integer is not necessarily an invalid resource ID, and custom
+ * validations that compare the {@code id} against {@code 0} are incorrect.</p>
+ * @param id The integer to validate.
+ * @return {@code true} if the integer is a valid resource ID.
+ */
+ public static boolean isValid(@AnyRes int id) {
+ // With the introduction of packages with IDs > 0x7f, resource IDs can be negative when
+ // represented as a signed Java int. Some legacy code assumes -1 is an invalid resource ID,
+ // despite the existing documentation.
+ return id != -1 && (id & 0xff000000) != 0 && (id & 0x00ff0000) != 0;
+ }
+}
diff --git a/core/java/android/content/res/Resources.java b/core/java/android/content/res/Resources.java
index b559604..60226d5 100644
--- a/core/java/android/content/res/Resources.java
+++ b/core/java/android/content/res/Resources.java
@@ -151,7 +151,7 @@
/** @hide */
public static int selectSystemTheme(int curTheme, int targetSdkVersion, int orig, int holo,
int dark, int deviceDefault) {
- if (curTheme != 0) {
+ if (curTheme != ResourceId.ID_NULL) {
return curTheme;
}
if (targetSdkVersion < Build.VERSION_CODES.HONEYCOMB) {
@@ -1760,7 +1760,9 @@
public final Theme newTheme() {
Theme theme = new Theme();
theme.setImpl(mResourcesImpl.newThemeImpl());
- mThemeRefs.add(new WeakReference<>(theme));
+ synchronized (mThemeRefs) {
+ mThemeRefs.add(new WeakReference<>(theme));
+ }
return theme;
}
diff --git a/core/java/android/content/res/ResourcesImpl.java b/core/java/android/content/res/ResourcesImpl.java
index bdfef83..23591c7 100644
--- a/core/java/android/content/res/ResourcesImpl.java
+++ b/core/java/android/content/res/ResourcesImpl.java
@@ -36,6 +36,7 @@
import android.graphics.Typeface;
import android.graphics.drawable.ColorDrawable;
import android.graphics.drawable.Drawable;
+import android.graphics.drawable.DrawableContainer;
import android.icu.text.PluralRules;
import android.os.Build;
import android.os.LocaleList;
@@ -590,6 +591,7 @@
}
Drawable dr;
+ boolean needsNewDrawableAfterCache = false;
if (cs != null) {
dr = cs.newDrawable(wrapper);
} else if (isColorDrawable) {
@@ -597,6 +599,12 @@
} else {
dr = loadDrawableForCookie(wrapper, value, id, density, null);
}
+ // DrawableContainer' constant state has drawables instances. In order to leave the
+ // constant state intact in the cache, we need to create a new DrawableContainer after
+ // added to cache.
+ if (dr instanceof DrawableContainer) {
+ needsNewDrawableAfterCache = true;
+ }
// Determine if the drawable has unresolved theme attributes. If it
// does, we'll need to apply a theme and store it in a theme-specific
@@ -615,6 +623,12 @@
dr.setChangingConfigurations(value.changingConfigurations);
if (useCache) {
cacheDrawable(value, isColorDrawable, caches, theme, canApplyTheme, key, dr);
+ if (needsNewDrawableAfterCache) {
+ Drawable.ConstantState state = dr.getConstantState();
+ if (state != null) {
+ dr = state.newDrawable(wrapper);
+ }
+ }
}
}
@@ -772,6 +786,10 @@
}
final String file = value.string.toString();
+ if (!file.startsWith("res/")) {
+ return null;
+ }
+
Typeface cached = Typeface.findFromCache(mAssets, file);
if (cached != null) {
return cached;
diff --git a/core/java/android/hardware/camera2/impl/CallbackProxies.java b/core/java/android/hardware/camera2/impl/CallbackProxies.java
index e6e448e..c9eecf1 100644
--- a/core/java/android/hardware/camera2/impl/CallbackProxies.java
+++ b/core/java/android/hardware/camera2/impl/CallbackProxies.java
@@ -88,7 +88,7 @@
}
@SuppressWarnings("deprecation")
- public static class DeviceCaptureCallbackProxy extends CameraDeviceImpl.CaptureCallback {
+ public static class DeviceCaptureCallbackProxy implements CameraDeviceImpl.CaptureCallback {
private final MethodNameInvoker<CameraDeviceImpl.CaptureCallback> mProxy;
public DeviceCaptureCallbackProxy(
@@ -138,6 +138,13 @@
int sequenceId) {
mProxy.invoke("onCaptureSequenceAborted", camera, sequenceId);
}
+
+ @Override
+ public void onCaptureBufferLost(CameraDevice camera,
+ CaptureRequest request, Surface target, long frameNumber) {
+ mProxy.invoke("onCaptureBufferLost", camera, request, target, frameNumber);
+ }
+
}
public static class SessionStateCallbackProxy
diff --git a/core/java/android/hardware/camera2/impl/CameraCaptureSessionImpl.java b/core/java/android/hardware/camera2/impl/CameraCaptureSessionImpl.java
index 16ffee0..b3938cb 100644
--- a/core/java/android/hardware/camera2/impl/CameraCaptureSessionImpl.java
+++ b/core/java/android/hardware/camera2/impl/CameraCaptureSessionImpl.java
@@ -452,6 +452,37 @@
private CameraDeviceImpl.CaptureCallback createCaptureCallbackProxy(
Handler handler, CaptureCallback callback) {
CameraDeviceImpl.CaptureCallback localCallback = new CameraDeviceImpl.CaptureCallback() {
+
+ @Override
+ public void onCaptureStarted(CameraDevice camera,
+ CaptureRequest request, long timestamp, long frameNumber) {
+ // Do nothing
+ }
+
+ @Override
+ public void onCapturePartial(CameraDevice camera,
+ CaptureRequest request, android.hardware.camera2.CaptureResult result) {
+ // Do nothing
+ }
+
+ @Override
+ public void onCaptureProgressed(CameraDevice camera,
+ CaptureRequest request, android.hardware.camera2.CaptureResult partialResult) {
+ // Do nothing
+ }
+
+ @Override
+ public void onCaptureCompleted(CameraDevice camera,
+ CaptureRequest request, android.hardware.camera2.TotalCaptureResult result) {
+ // Do nothing
+ }
+
+ @Override
+ public void onCaptureFailed(CameraDevice camera,
+ CaptureRequest request, android.hardware.camera2.CaptureFailure failure) {
+ // Do nothing
+ }
+
@Override
public void onCaptureSequenceCompleted(CameraDevice camera,
int sequenceId, long frameNumber) {
@@ -463,6 +494,13 @@
int sequenceId) {
finishPendingSequence(sequenceId);
}
+
+ @Override
+ public void onCaptureBufferLost(CameraDevice camera,
+ CaptureRequest request, Surface target, long frameNumber) {
+ // Do nothing
+ }
+
};
/*
diff --git a/core/java/android/hardware/camera2/impl/CameraDeviceImpl.java b/core/java/android/hardware/camera2/impl/CameraDeviceImpl.java
index ab87f15..0d5c5e3 100644
--- a/core/java/android/hardware/camera2/impl/CameraDeviceImpl.java
+++ b/core/java/android/hardware/camera2/impl/CameraDeviceImpl.java
@@ -1112,8 +1112,11 @@
* <p>A callback for tracking the progress of a {@link CaptureRequest}
* submitted to the camera device.</p>
*
+ * An interface instead of an abstract class because this is internal and
+ * we want to make sure we always implement all its callbacks until we reach
+ * the public layer.
*/
- public static abstract class CaptureCallback {
+ public interface CaptureCallback {
/**
* This constant is used to indicate that no images were captured for
@@ -1130,9 +1133,7 @@
* @see android.media.MediaActionSound
*/
public void onCaptureStarted(CameraDevice camera,
- CaptureRequest request, long timestamp, long frameNumber) {
- // default empty implementation
- }
+ CaptureRequest request, long timestamp, long frameNumber);
/**
* This method is called when some results from an image capture are
@@ -1141,9 +1142,7 @@
* @hide
*/
public void onCapturePartial(CameraDevice camera,
- CaptureRequest request, CaptureResult result) {
- // default empty implementation
- }
+ CaptureRequest request, CaptureResult result);
/**
* This method is called when an image capture makes partial forward progress; some
@@ -1151,18 +1150,14 @@
*
*/
public void onCaptureProgressed(CameraDevice camera,
- CaptureRequest request, CaptureResult partialResult) {
- // default empty implementation
- }
+ CaptureRequest request, CaptureResult partialResult);
/**
* This method is called when an image capture has fully completed and all the
* result metadata is available.
*/
public void onCaptureCompleted(CameraDevice camera,
- CaptureRequest request, TotalCaptureResult result) {
- // default empty implementation
- }
+ CaptureRequest request, TotalCaptureResult result);
/**
* This method is called instead of {@link #onCaptureCompleted} when the
@@ -1170,9 +1165,7 @@
* request.
*/
public void onCaptureFailed(CameraDevice camera,
- CaptureRequest request, CaptureFailure failure) {
- // default empty implementation
- }
+ CaptureRequest request, CaptureFailure failure);
/**
* This method is called independently of the others in CaptureCallback,
@@ -1180,9 +1173,7 @@
* or {@link CaptureFailure} for it have been returned via this callback.
*/
public void onCaptureSequenceCompleted(CameraDevice camera,
- int sequenceId, long frameNumber) {
- // default empty implementation
- }
+ int sequenceId, long frameNumber);
/**
* This method is called independently of the others in CaptureCallback,
@@ -1190,14 +1181,16 @@
* or {@link CaptureFailure} for it have been returned via this callback.
*/
public void onCaptureSequenceAborted(CameraDevice camera,
- int sequenceId) {
- // default empty implementation
- }
+ int sequenceId);
+ /**
+ * This method is called independently of the others in CaptureCallback, if an output buffer
+ * is dropped for a particular capture request.
+ *
+ * Loss of metadata is communicated via onCaptureFailed, independently of any buffer loss.
+ */
public void onCaptureBufferLost(CameraDevice camera,
- CaptureRequest request, Surface target, long frameNumber) {
- // default empty implementation
- }
+ CaptureRequest request, Surface target, long frameNumber);
}
/**
diff --git a/core/java/android/hardware/fingerprint/FingerprintManager.java b/core/java/android/hardware/fingerprint/FingerprintManager.java
index b00e65a..324a08c 100644
--- a/core/java/android/hardware/fingerprint/FingerprintManager.java
+++ b/core/java/android/hardware/fingerprint/FingerprintManager.java
@@ -932,7 +932,6 @@
} else if (mAuthenticationCallback != null) {
mAuthenticationCallback.onAuthenticationError(clientErrMsgId,
getErrorString(errMsgId, vendorCode));
- mAuthenticationCallback = null;
} else if (mRemovalCallback != null) {
mRemovalCallback.onRemovalError(mRemovalFingerprint, clientErrMsgId,
getErrorString(errMsgId, vendorCode));
@@ -953,7 +952,6 @@
final AuthenticationResult result =
new AuthenticationResult(mCryptoObject, fp, userId);
mAuthenticationCallback.onAuthenticationSucceeded(result);
- mAuthenticationCallback = null;
}
}
diff --git a/core/java/android/nfc/IAppCallback.aidl b/core/java/android/nfc/IAppCallback.aidl
index c027d54..133146d 100644
--- a/core/java/android/nfc/IAppCallback.aidl
+++ b/core/java/android/nfc/IAppCallback.aidl
@@ -25,6 +25,6 @@
interface IAppCallback
{
BeamShareData createBeamShareData(byte peerLlcpVersion);
- void onNdefPushComplete(byte peerLlcpVersion);
- void onTagDiscovered(in Tag tag);
+ oneway void onNdefPushComplete(byte peerLlcpVersion);
+ oneway void onTagDiscovered(in Tag tag);
}
diff --git a/core/java/android/nfc/NdefRecord.java b/core/java/android/nfc/NdefRecord.java
index 2c9ce3f..093a9b4 100644
--- a/core/java/android/nfc/NdefRecord.java
+++ b/core/java/android/nfc/NdefRecord.java
@@ -938,7 +938,7 @@
*/
void writeToByteBuffer(ByteBuffer buffer, boolean mb, boolean me) {
boolean sr = mPayload.length < 256;
- boolean il = mId.length > 0;
+ boolean il = mTnf == TNF_EMPTY ? true : mId.length > 0;
byte flags = (byte)((mb ? FLAG_MB : 0) | (me ? FLAG_ME : 0) |
(sr ? FLAG_SR : 0) | (il ? FLAG_IL : 0) | mTnf);
@@ -966,7 +966,7 @@
int length = 3 + mType.length + mId.length + mPayload.length;
boolean sr = mPayload.length < 256;
- boolean il = mId.length > 0;
+ boolean il = mTnf == TNF_EMPTY ? true : mId.length > 0;
if (!sr) length += 3;
if (il) length += 1;
diff --git a/core/java/android/os/AsyncTask.java b/core/java/android/os/AsyncTask.java
index fea64ec..141d33b 100644
--- a/core/java/android/os/AsyncTask.java
+++ b/core/java/android/os/AsyncTask.java
@@ -17,14 +17,14 @@
package android.os;
import android.annotation.MainThread;
+import android.annotation.Nullable;
import android.annotation.WorkerThread;
-
import java.util.ArrayDeque;
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.Callable;
import java.util.concurrent.CancellationException;
-import java.util.concurrent.Executor;
import java.util.concurrent.ExecutionException;
+import java.util.concurrent.Executor;
import java.util.concurrent.FutureTask;
import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.ThreadFactory;
@@ -232,6 +232,8 @@
private final AtomicBoolean mCancelled = new AtomicBoolean();
private final AtomicBoolean mTaskInvoked = new AtomicBoolean();
+ private final Handler mHandler;
+
private static class SerialExecutor implements Executor {
final ArrayDeque<Runnable> mTasks = new ArrayDeque<Runnable>();
Runnable mActive;
@@ -277,15 +279,19 @@
FINISHED,
}
- private static Handler getHandler() {
+ private static Handler getMainHandler() {
synchronized (AsyncTask.class) {
if (sHandler == null) {
- sHandler = new InternalHandler();
+ sHandler = new InternalHandler(Looper.getMainLooper());
}
return sHandler;
}
}
+ private Handler getHandler() {
+ return mHandler;
+ }
+
/** @hide */
public static void setDefaultExecutor(Executor exec) {
sDefaultExecutor = exec;
@@ -295,6 +301,28 @@
* Creates a new asynchronous task. This constructor must be invoked on the UI thread.
*/
public AsyncTask() {
+ this((Looper) null);
+ }
+
+ /**
+ * Creates a new asynchronous task. This constructor must be invoked on the UI thread.
+ *
+ * @hide
+ */
+ public AsyncTask(@Nullable Handler handler) {
+ this(handler != null ? handler.getLooper() : null);
+ }
+
+ /**
+ * Creates a new asynchronous task. This constructor must be invoked on the UI thread.
+ *
+ * @hide
+ */
+ public AsyncTask(@Nullable Looper callbackLooper) {
+ mHandler = callbackLooper == null || callbackLooper == Looper.getMainLooper()
+ ? getMainHandler()
+ : new Handler(callbackLooper);
+
mWorker = new WorkerRunnable<Params, Result>() {
public Result call() throws Exception {
mTaskInvoked.set(true);
@@ -670,8 +698,8 @@
}
private static class InternalHandler extends Handler {
- public InternalHandler() {
- super(Looper.getMainLooper());
+ public InternalHandler(Looper looper) {
+ super(looper);
}
@SuppressWarnings({"unchecked", "RawUseOfParameterizedType"})
diff --git a/core/java/android/os/BatteryStats.java b/core/java/android/os/BatteryStats.java
index 3eea72d..ecc4dec 100644
--- a/core/java/android/os/BatteryStats.java
+++ b/core/java/android/os/BatteryStats.java
@@ -157,6 +157,16 @@
public static final int BLUETOOTH_SCAN_ON = 19;
/**
+ * A constant indicating an aggregated partial wake lock timer.
+ */
+ public static final int AGGREGATED_WAKE_TYPE_PARTIAL = 20;
+
+ /**
+ * A constant indicating a bluetooth scan timer for unoptimized scans.
+ */
+ public static final int BLUETOOTH_UNOPTIMIZED_SCAN_ON = 21;
+
+ /**
* Include all of the data in the stats, including previously saved data.
*/
public static final int STATS_SINCE_CHARGED = 0;
@@ -185,8 +195,13 @@
* - Background timers and counters for: Sensor, BluetoothScan, WifiScan, Jobs, Syncs.
* New in version 21:
* - Actual (not just apportioned) Wakelock time is also recorded.
+ * - Aggregated partial wakelock time (per uid, instead of per wakelock) is recorded.
+ * - BLE scan result count
+ * - CPU frequency time per uid
+ * New in version 22:
+ * - BLE scan result background count, BLE unoptimized scan time
*/
- static final String CHECKIN_VERSION = "21";
+ static final String CHECKIN_VERSION = "22";
/**
* Old version, we hit 9 and ran out of room, need to remove.
@@ -211,11 +226,16 @@
private static final String STATE_TIME_DATA = "st";
// wl line is:
// BATTERY_STATS_CHECKIN_VERSION, uid, which, "wl", name,
- // full totalTime, 'f', count, current duration, max duration, total duration,
- // partial totalTime, 'p', count, current duration, max duration, total duration,
- // window totalTime, 'w', count, current duration, max duration, total duration
+ // full totalTime, 'f', count, current duration, max duration, total duration,
+ // partial totalTime, 'p', count, current duration, max duration, total duration,
+ // bg partial totalTime, 'bp', count, current duration, max duration, total duration,
+ // window totalTime, 'w', count, current duration, max duration, total duration
// [Currently, full and window wakelocks have durations current = max = total = -1]
private static final String WAKELOCK_DATA = "wl";
+ // awl line is:
+ // BATTERY_STATS_CHECKIN_VERSION, uid, which, "awl",
+ // cumulative partial wakelock duration, cumulative background partial wakelock duration
+ private static final String AGGREGATED_WAKELOCK_DATA = "awl";
private static final String SYNC_DATA = "sy";
private static final String JOB_DATA = "jb";
private static final String KERNEL_WAKELOCK_DATA = "kwl";
@@ -485,6 +505,13 @@
}
/**
+ * The cumulative time the uid spent holding any partial wakelocks. This will generally
+ * differ from summing over the Wakelocks in getWakelockStats since the latter may have
+ * wakelocks that overlap in time (and therefore over-counts).
+ */
+ public abstract Timer getAggregatedPartialWakelockTimer();
+
+ /**
* Returns a mapping containing sensor statistics.
*
* @return a Map from Integer sensor ids to Uid.Sensor objects.
@@ -495,7 +522,7 @@
* Returns a mapping containing active process data.
*/
public abstract SparseArray<? extends Pid> getPidStats();
-
+
/**
* Returns a mapping containing process statistics.
*
@@ -548,7 +575,10 @@
public abstract Timer getForegroundActivityTimer();
public abstract Timer getBluetoothScanTimer();
public abstract Timer getBluetoothScanBackgroundTimer();
+ public abstract Timer getBluetoothUnoptimizedScanTimer();
+ public abstract Timer getBluetoothUnoptimizedScanBackgroundTimer();
public abstract Counter getBluetoothScanResultCounter();
+ public abstract Counter getBluetoothScanResultBgCounter();
public abstract long[] getCpuFreqTimes(int which);
public abstract long[] getScreenOffCpuFreqTimes(int which);
@@ -609,7 +639,7 @@
static final String[] USER_ACTIVITY_TYPES = {
"other", "button", "touch", "accessibility"
};
-
+
public static final int NUM_USER_ACTIVITY_TYPES = 4;
public abstract void noteUserActivityLocked(int type);
@@ -1259,7 +1289,7 @@
public static final byte CMD_SHUTDOWN = 8;
public byte cmd = CMD_NULL;
-
+
/**
* Return whether the command code is a delta data update.
*/
@@ -1271,13 +1301,13 @@
public byte batteryStatus;
public byte batteryHealth;
public byte batteryPlugType;
-
+
public short batteryTemperature;
public char batteryVoltage;
// The charge of the battery in micro-Ampere-hours.
public int batteryChargeUAh;
-
+
// Constants from SCREEN_BRIGHTNESS_*
public static final int STATE_BRIGHTNESS_SHIFT = 0;
public static final int STATE_BRIGHTNESS_MASK = 0x7;
@@ -1458,13 +1488,13 @@
public HistoryItem() {
}
-
+
public HistoryItem(long time, Parcel src) {
this.time = time;
numReadInts = 2;
readFromParcel(src);
}
-
+
public int describeContents() {
return 0;
}
@@ -1560,7 +1590,7 @@
eventCode = EVENT_NONE;
eventTag = null;
}
-
+
public void setTo(HistoryItem o) {
time = o.time;
cmd = o.cmd;
@@ -1714,7 +1744,7 @@
public final String shortName;
public final String[] values;
public final String[] shortValues;
-
+
public BitDescription(int mask, String name, String shortName) {
this.mask = mask;
this.shift = -1;
@@ -1723,7 +1753,7 @@
this.values = null;
this.shortValues = null;
}
-
+
public BitDescription(int mask, int shift, String name, String shortName,
String[] values, String[] shortValues) {
this.mask = mask;
@@ -1771,20 +1801,20 @@
* Return the base time offset for the battery history.
*/
public abstract long getHistoryBaseTime();
-
+
/**
* Returns the number of times the device has been started.
*/
public abstract int getStartCount();
-
+
/**
* Returns the time in microseconds that the screen has been on while the device was
* running on battery.
- *
+ *
* {@hide}
*/
public abstract long getScreenOnTime(long elapsedRealtimeUs, int which);
-
+
/**
* Returns the number of times the screen was turned on.
*
@@ -1799,11 +1829,11 @@
public static final int SCREEN_BRIGHTNESS_MEDIUM = 2;
public static final int SCREEN_BRIGHTNESS_LIGHT = 3;
public static final int SCREEN_BRIGHTNESS_BRIGHT = 4;
-
+
static final String[] SCREEN_BRIGHTNESS_NAMES = {
"dark", "dim", "medium", "light", "bright"
};
-
+
static final String[] SCREEN_BRIGHTNESS_SHORT_NAMES = {
"0", "1", "2", "3", "4"
};
@@ -1813,7 +1843,7 @@
/**
* Returns the time in microseconds that the screen has been on with
* the given brightness
- *
+ *
* {@hide}
*/
public abstract long getScreenBrightnessTime(int brightnessBin,
@@ -1897,11 +1927,11 @@
/**
* Returns the time in microseconds that the phone has been on while the device was
* running on battery.
- *
+ *
* {@hide}
*/
public abstract long getPhoneOnTime(long elapsedRealtimeUs, int which);
-
+
/**
* Returns the number of times a phone call was activated.
*
@@ -1912,7 +1942,7 @@
/**
* Returns the time in microseconds that the phone has been running with
* the given signal strength.
- *
+ *
* {@hide}
*/
public abstract long getPhoneSignalStrengthTime(int strengthBin,
@@ -1929,7 +1959,7 @@
/**
* Returns the number of times the phone has entered the given signal strength.
- *
+ *
* {@hide}
*/
public abstract int getPhoneSignalStrengthCount(int strengthBin, int which);
@@ -1997,13 +2027,13 @@
"1xrtt", "hsdpa", "hsupa", "hspa", "iden", "evdo_b", "lte",
"ehrpd", "hspap", "other"
};
-
+
public static final int NUM_DATA_CONNECTION_TYPES = DATA_CONNECTION_OTHER+1;
-
+
/**
* Returns the time in microseconds that the phone has been running with
* the given data connection.
- *
+ *
* {@hide}
*/
public abstract long getPhoneDataConnectionTime(int dataType,
@@ -2012,7 +2042,7 @@
/**
* Returns the number of times the phone has entered the given data
* connection type.
- *
+ *
* {@hide}
*/
public abstract int getPhoneDataConnectionCount(int dataType, int which);
@@ -2131,7 +2161,7 @@
/**
* Returns the time in microseconds that wifi has been on while the device was
* running on battery.
- *
+ *
* {@hide}
*/
public abstract long getWifiOnTime(long elapsedRealtimeUs, int which);
@@ -2322,7 +2352,7 @@
* Return whether we are currently running on battery.
*/
public abstract boolean getIsOnBattery();
-
+
/**
* Returns a SparseArray containing the statistics for each uid.
*/
@@ -2341,13 +2371,13 @@
* @param curTime the amount of elapsed realtime in microseconds.
*/
public abstract long getBatteryRealtime(long curTime);
-
+
/**
* Returns the battery percentage level at the last time the device was unplugged from power, or
- * the last time it booted on battery power.
+ * the last time it booted on battery power.
*/
public abstract int getDischargeStartLevel();
-
+
/**
* Returns the current battery percentage level if we are in a discharge cycle, otherwise
* returns the level at the last plug event.
@@ -2643,7 +2673,7 @@
final String formatBytesLocked(long bytes) {
mFormatBuilder.setLength(0);
-
+
if (bytes < BYTES_PER_KB) {
return bytes + "B";
} else if (bytes < BYTES_PER_MB) {
@@ -2773,10 +2803,10 @@
}
return false;
}
-
+
/**
* Checkin version of wakelock printer. Prints simple comma-separated list.
- *
+ *
* @param sb a StringBuilder object.
* @param timer a Timer object contining the wakelock times.
* @param elapsedRealtimeUs the current time in microseconds.
@@ -2831,13 +2861,13 @@
/**
* Dump a comma-separated line of values for terse checkin mode.
- *
+ *
* @param pw the PageWriter to dump log to
* @param category category of data (e.g. "total", "last", "unplugged", "current" )
* @param type type of data (e.g. "wakelock", "sensor", "process", "apk" , "process", "network")
* @param args type-dependent data arguments
*/
- private static final void dumpLine(PrintWriter pw, int uid, String category, String type,
+ private static final void dumpLine(PrintWriter pw, int uid, String category, String type,
Object... args ) {
dumpLineHeader(pw, uid, category, type);
for (Object arg : args) {
@@ -3014,7 +3044,7 @@
/**
* Checkin server version of dump to produce more compact, computer-readable log.
- *
+ *
* NOTE: all times are expressed in 'ms'.
*/
public final void dumpCheckinLocked(Context context, PrintWriter pw, int which, int reqUid,
@@ -3047,10 +3077,10 @@
.getCountLocked(which);
final StringBuilder sb = new StringBuilder(128);
-
+
final SparseArray<? extends Uid> uidStats = getUidStats();
final int NU = uidStats.size();
-
+
final String category = STAT_NAMES[which];
// Dump "battery" stat
@@ -3063,11 +3093,11 @@
getEstimatedBatteryCapacity(),
getMinLearnedBatteryCapacity(), getMaxLearnedBatteryCapacity());
-
+
// Calculate wakelock times across all uids.
long fullWakeLockTimeTotal = 0;
long partialWakeLockTimeTotal = 0;
-
+
for (int iu = 0; iu < NU; iu++) {
final Uid u = uidStats.valueAt(iu);
@@ -3138,14 +3168,14 @@
getDeviceIdlingCount(DEVICE_IDLE_MODE_LIGHT, which),
getLongestDeviceIdleModeTime(DEVICE_IDLE_MODE_LIGHT),
getLongestDeviceIdleModeTime(DEVICE_IDLE_MODE_DEEP));
-
+
// Dump screen brightness stats
Object[] args = new Object[NUM_SCREEN_BRIGHTNESS_BINS];
for (int i=0; i<NUM_SCREEN_BRIGHTNESS_BINS; i++) {
args[i] = getScreenBrightnessTime(i, rawRealtime, which) / 1000;
}
dumpLine(pw, 0 /* uid */, category, SCREEN_BRIGHTNESS_DATA, args);
-
+
// Dump signal strength stats
args = new Object[SignalStrength.NUM_SIGNAL_STRENGTH_BINS];
for (int i=0; i<SignalStrength.NUM_SIGNAL_STRENGTH_BINS; i++) {
@@ -3207,7 +3237,7 @@
dumpLine(pw, 0 /* uid */, category, BATTERY_LEVEL_DATA, getDischargeStartLevel(),
getDischargeCurrentLevel());
}
-
+
if (which == STATS_SINCE_UNPLUGGED) {
dumpLine(pw, 0 /* uid */, category, BATTERY_DISCHARGE_DATA,
getDischargeStartLevel()-getDischargeCurrentLevel(),
@@ -3221,7 +3251,7 @@
getDischargeAmountScreenOffSinceCharge(),
dischargeCount / 1000, dischargeScreenOffCount / 1000);
}
-
+
if (reqUid < 0) {
final Map<String, ? extends Timer> kernelWakelocks = getKernelWakelockStats();
if (kernelWakelocks.size() > 0) {
@@ -3244,7 +3274,7 @@
}
}
}
-
+
final BatteryStatsHelper helper = new BatteryStatsHelper(context, false, wifiOnly);
helper.create(this);
helper.refreshStats(which, UserHandle.USER_ALL);
@@ -3412,10 +3442,29 @@
final long actualTime = bleTimer.getTotalDurationMsLocked(rawRealtimeMs);
final long actualTimeBg = bleTimerBg != null ?
bleTimerBg.getTotalDurationMsLocked(rawRealtimeMs) : 0;
+ // Result counters
final int resultCount = u.getBluetoothScanResultCounter() != null ?
u.getBluetoothScanResultCounter().getCountLocked(which) : 0;
+ final int resultCountBg = u.getBluetoothScanResultBgCounter() != null ?
+ u.getBluetoothScanResultBgCounter().getCountLocked(which) : 0;
+ // Unoptimized scan timer. Unpooled and since reset (regardless of 'which').
+ final Timer unoptimizedScanTimer = u.getBluetoothUnoptimizedScanTimer();
+ final long unoptimizedScanTotalTime = unoptimizedScanTimer != null ?
+ unoptimizedScanTimer.getTotalDurationMsLocked(rawRealtimeMs) : 0;
+ final long unoptimizedScanMaxTime = unoptimizedScanTimer != null ?
+ unoptimizedScanTimer.getMaxDurationMsLocked(rawRealtimeMs) : 0;
+ // Unoptimized bg scan timer. Unpooled and since reset (regardless of 'which').
+ final Timer unoptimizedScanTimerBg =
+ u.getBluetoothUnoptimizedScanBackgroundTimer();
+ final long unoptimizedScanTotalTimeBg = unoptimizedScanTimerBg != null ?
+ unoptimizedScanTimerBg.getTotalDurationMsLocked(rawRealtimeMs) : 0;
+ final long unoptimizedScanMaxTimeBg = unoptimizedScanTimerBg != null ?
+ unoptimizedScanTimerBg.getMaxDurationMsLocked(rawRealtimeMs) : 0;
+
dumpLine(pw, uid, category, BLUETOOTH_MISC_DATA, totalTime, count,
- countBg, actualTime, actualTimeBg, resultCount);
+ countBg, actualTime, actualTimeBg, resultCount, resultCountBg,
+ unoptimizedScanTotalTime, unoptimizedScanTotalTimeBg,
+ unoptimizedScanMaxTime, unoptimizedScanMaxTimeBg);
}
}
@@ -3434,7 +3483,17 @@
dumpLine(pw, uid /* uid */, category, USER_ACTIVITY_DATA, args);
}
}
-
+
+ if (u.getAggregatedPartialWakelockTimer() != null) {
+ final Timer timer = u.getAggregatedPartialWakelockTimer();
+ // Convert from microseconds to milliseconds with rounding
+ final long totTimeMs = (timer.getTotalTimeLocked(rawRealtime, which) + 500) / 1000;
+ final Timer bgTimer = timer.getSubTimer();
+ final long bgTimeMs = bgTimer != null ?
+ (bgTimer.getTotalTimeLocked(rawRealtime, which) + 500) / 1000 : 0;
+ dumpLine(pw, uid, category, AGGREGATED_WAKELOCK_DATA, totTimeMs, bgTimeMs);
+ }
+
final ArrayMap<String, ? extends Uid.Wakelock> wakelocks = u.getWakelockStats();
for (int iw=wakelocks.size()-1; iw>=0; iw--) {
final Uid.Wakelock wl = wakelocks.valueAt(iw);
@@ -3442,8 +3501,11 @@
sb.setLength(0);
linePrefix = printWakeLockCheckin(sb, wl.getWakeTime(WAKE_TYPE_FULL),
rawRealtime, "f", which, linePrefix);
- linePrefix = printWakeLockCheckin(sb, wl.getWakeTime(WAKE_TYPE_PARTIAL),
+ final Timer pTimer = wl.getWakeTime(WAKE_TYPE_PARTIAL);
+ linePrefix = printWakeLockCheckin(sb, pTimer,
rawRealtime, "p", which, linePrefix);
+ linePrefix = printWakeLockCheckin(sb, pTimer != null ? pTimer.getSubTimer() : null,
+ rawRealtime, "bp", which, linePrefix);
linePrefix = printWakeLockCheckin(sb, wl.getWakeTime(WAKE_TYPE_WINDOW),
rawRealtime, "w", which, linePrefix);
@@ -3666,7 +3728,7 @@
final long chargeTimeRemaining = computeChargeTimeRemaining(rawRealtime);
final StringBuilder sb = new StringBuilder(128);
-
+
final SparseArray<? extends Uid> uidStats = getUidStats();
final int NU = uidStats.size();
@@ -3932,7 +3994,7 @@
}
}
}
-
+
final long mobileRxTotalBytes = getNetworkActivityBytes(NETWORK_MOBILE_RX_DATA, which);
final long mobileTxTotalBytes = getNetworkActivityBytes(NETWORK_MOBILE_TX_DATA, which);
final long wifiRxTotalBytes = getNetworkActivityBytes(NETWORK_WIFI_RX_DATA, which);
@@ -4161,15 +4223,15 @@
if (which == STATS_SINCE_UNPLUGGED) {
if (getIsOnBattery()) {
pw.print(prefix); pw.println(" Device is currently unplugged");
- pw.print(prefix); pw.print(" Discharge cycle start level: ");
+ pw.print(prefix); pw.print(" Discharge cycle start level: ");
pw.println(getDischargeStartLevel());
pw.print(prefix); pw.print(" Discharge cycle current level: ");
pw.println(getDischargeCurrentLevel());
} else {
pw.print(prefix); pw.println(" Device is currently plugged into power");
- pw.print(prefix); pw.print(" Last discharge cycle start level: ");
+ pw.print(prefix); pw.print(" Last discharge cycle start level: ");
pw.println(getDischargeStartLevel());
- pw.print(prefix); pw.print(" Last discharge cycle end level: ");
+ pw.print(prefix); pw.print(" Last discharge cycle end level: ");
pw.println(getDischargeCurrentLevel());
}
pw.print(prefix); pw.print(" Amount discharged while screen on: ");
@@ -4450,7 +4512,7 @@
if (reqUid >= 0 && uid != reqUid && uid != Process.SYSTEM_UID) {
continue;
}
-
+
final Uid u = uidStats.valueAt(iu);
pw.print(prefix);
@@ -4538,7 +4600,7 @@
formatTimeMs(sb, uidWifiRunningTime / 1000);
sb.append("("); sb.append(formatRatioLocked(uidWifiRunningTime,
whichBatteryRealtime)); sb.append(")\n");
- sb.append(prefix); sb.append(" Full Wifi Lock: ");
+ sb.append(prefix); sb.append(" Full Wifi Lock: ");
formatTimeMs(sb, fullWifiLockOnTime / 1000);
sb.append("("); sb.append(formatRatioLocked(fullWifiLockOnTime,
whichBatteryRealtime)); sb.append(")\n");
@@ -4598,34 +4660,94 @@
final long actualTimeMs = bleTimer.getTotalDurationMsLocked(rawRealtimeMs);
final long actualTimeMsBg = bleTimerBg != null ?
bleTimerBg.getTotalDurationMsLocked(rawRealtimeMs) : 0;
+ // Result counters
final int resultCount = u.getBluetoothScanResultCounter() != null ?
u.getBluetoothScanResultCounter().getCountLocked(which) : 0;
+ final int resultCountBg = u.getBluetoothScanResultBgCounter() != null ?
+ u.getBluetoothScanResultBgCounter().getCountLocked(which) : 0;
+ // Unoptimized scan timer. Unpooled and since reset (regardless of 'which').
+ final Timer unoptimizedScanTimer = u.getBluetoothUnoptimizedScanTimer();
+ final long unoptimizedScanTotalTime = unoptimizedScanTimer != null ?
+ unoptimizedScanTimer.getTotalDurationMsLocked(rawRealtimeMs) : 0;
+ final long unoptimizedScanMaxTime = unoptimizedScanTimer != null ?
+ unoptimizedScanTimer.getMaxDurationMsLocked(rawRealtimeMs) : 0;
+ // Unoptimized bg scan timer. Unpooled and since reset (regardless of 'which').
+ final Timer unoptimizedScanTimerBg =
+ u.getBluetoothUnoptimizedScanBackgroundTimer();
+ final long unoptimizedScanTotalTimeBg = unoptimizedScanTimerBg != null ?
+ unoptimizedScanTimerBg.getTotalDurationMsLocked(rawRealtimeMs) : 0;
+ final long unoptimizedScanMaxTimeBg = unoptimizedScanTimerBg != null ?
+ unoptimizedScanTimerBg.getMaxDurationMsLocked(rawRealtimeMs) : 0;
sb.setLength(0);
- sb.append(prefix);
- sb.append(" ");
- sb.append("Bluetooth Scan");
- sb.append(": ");
if (actualTimeMs != totalTimeMs) {
+ sb.append(prefix);
+ sb.append(" Bluetooth Scan (total blamed realtime): ");
formatTimeMs(sb, totalTimeMs);
- sb.append("blamed realtime, ");
+ sb.append(" (");
+ sb.append(count);
+ sb.append(" times)");
+ if (bleTimer.isRunningLocked()) {
+ sb.append(" (currently running)");
+ }
+ sb.append("\n");
}
- formatTimeMs(sb, actualTimeMs); // since reset, regardless of 'which'
- sb.append("realtime (");
+
+ sb.append(prefix);
+ sb.append(" Bluetooth Scan (total actual realtime): ");
+ formatTimeMs(sb, actualTimeMs); // since reset, ignores 'which'
+ sb.append(" (");
sb.append(count);
sb.append(" times)");
if (bleTimer.isRunningLocked()) {
- sb.append(" (running)");
+ sb.append(" (currently running)");
}
- if (actualTimeMsBg != 0 || countBg > 0) {
- sb.append(", ");
- formatTimeMs(sb, actualTimeMsBg); // since reset, regardless of 'which'
- sb.append("background (");
+ sb.append("\n");
+ if (actualTimeMsBg > 0 || countBg > 0) {
+ sb.append(prefix);
+ sb.append(" Bluetooth Scan (background realtime): ");
+ formatTimeMs(sb, actualTimeMsBg); // since reset, ignores 'which'
+ sb.append(" (");
sb.append(countBg);
sb.append(" times)");
+ if (bleTimerBg != null && bleTimerBg.isRunningLocked()) {
+ sb.append(" (currently running in background)");
+ }
+ sb.append("\n");
}
- sb.append("; Results count ");
+
+ sb.append(prefix);
+ sb.append(" Bluetooth Scan Results: ");
sb.append(resultCount);
+ sb.append(" (");
+ sb.append(resultCountBg);
+ sb.append(" in background)");
+
+ if (unoptimizedScanTotalTime > 0 || unoptimizedScanTotalTimeBg > 0) {
+ sb.append("\n");
+ sb.append(prefix);
+ sb.append(" Unoptimized Bluetooth Scan (realtime): ");
+ formatTimeMs(sb, unoptimizedScanTotalTime); // since reset, ignores 'which'
+ sb.append(" (max ");
+ formatTimeMs(sb, unoptimizedScanMaxTime); // since reset, ignores 'which'
+ sb.append(")");
+ if (unoptimizedScanTimer != null
+ && unoptimizedScanTimer.isRunningLocked()) {
+ sb.append(" (currently running unoptimized)");
+ }
+ if (unoptimizedScanTimerBg != null && unoptimizedScanTotalTimeBg > 0) {
+ sb.append("\n");
+ sb.append(prefix);
+ sb.append(" Unoptimized Bluetooth Scan (background realtime): ");
+ formatTimeMs(sb, unoptimizedScanTotalTimeBg); // since reset
+ sb.append(" (max ");
+ formatTimeMs(sb, unoptimizedScanMaxTimeBg); // since reset
+ sb.append(")");
+ if (unoptimizedScanTimerBg.isRunningLocked()) {
+ sb.append(" (currently running unoptimized in background)");
+ }
+ }
+ }
pw.println(sb.toString());
uidActivity = true;
}
@@ -4669,8 +4791,11 @@
sb.append(wakelocks.keyAt(iw));
linePrefix = printWakeLock(sb, wl.getWakeTime(WAKE_TYPE_FULL), rawRealtime,
"full", which, linePrefix);
- linePrefix = printWakeLock(sb, wl.getWakeTime(WAKE_TYPE_PARTIAL), rawRealtime,
+ final Timer pTimer = wl.getWakeTime(WAKE_TYPE_PARTIAL);
+ linePrefix = printWakeLock(sb, pTimer, rawRealtime,
"partial", which, linePrefix);
+ linePrefix = printWakeLock(sb, pTimer != null ? pTimer.getSubTimer() : null,
+ rawRealtime, "background partial", which, linePrefix);
linePrefix = printWakeLock(sb, wl.getWakeTime(WAKE_TYPE_WINDOW), rawRealtime,
"window", which, linePrefix);
linePrefix = printWakeLock(sb, wl.getWakeTime(WAKE_TYPE_DRAW), rawRealtime,
@@ -4690,8 +4815,23 @@
rawRealtime, which);
}
if (countWakelock > 1) {
- if (totalFullWakelock != 0 || totalPartialWakelock != 0
- || totalWindowWakelock != 0) {
+ // get unpooled partial wakelock quantities (unlike totalPartialWakelock, which is
+ // pooled and therefore just a lower bound)
+ long actualTotalPartialWakelock = 0;
+ long actualBgPartialWakelock = 0;
+ if (u.getAggregatedPartialWakelockTimer() != null) {
+ final Timer aggTimer = u.getAggregatedPartialWakelockTimer();
+ // Convert from microseconds to milliseconds with rounding
+ actualTotalPartialWakelock =
+ (aggTimer.getTotalTimeLocked(rawRealtime, which) + 500) / 1000;
+ final Timer bgAggTimer = aggTimer.getSubTimer();
+ actualBgPartialWakelock = bgAggTimer != null ?
+ (bgAggTimer.getTotalTimeLocked(rawRealtime, which) + 500) / 1000 : 0;
+ }
+
+ if (actualTotalPartialWakelock != 0 || actualBgPartialWakelock != 0 ||
+ totalFullWakelock != 0 || totalPartialWakelock != 0 ||
+ totalWindowWakelock != 0) {
sb.setLength(0);
sb.append(prefix);
sb.append(" TOTAL wake: ");
@@ -4707,7 +4847,23 @@
}
needComma = true;
formatTimeMs(sb, totalPartialWakelock);
- sb.append("partial");
+ sb.append("blamed partial");
+ }
+ if (actualTotalPartialWakelock != 0) {
+ if (needComma) {
+ sb.append(", ");
+ }
+ needComma = true;
+ formatTimeMs(sb, actualTotalPartialWakelock);
+ sb.append("actual partial");
+ }
+ if (actualBgPartialWakelock != 0) {
+ if (needComma) {
+ sb.append(", ");
+ }
+ needComma = true;
+ formatTimeMs(sb, actualBgPartialWakelock);
+ sb.append("actual background partial");
}
if (totalWindowWakelock != 0) {
if (needComma) {
diff --git a/core/java/android/os/Build.java b/core/java/android/os/Build.java
index 4bad7ab..a2fb9db 100644
--- a/core/java/android/os/Build.java
+++ b/core/java/android/os/Build.java
@@ -807,8 +807,20 @@
}
/**
- * Verifies the the current flash of the device is consistent with what
+ * True if Treble is enabled and required for this device.
+ *
+ * @hide
+ */
+ public static final boolean IS_TREBLE_ENABLED =
+ SystemProperties.getBoolean("ro.treble.enabled", false);
+
+ /**
+ * Verifies the current flash of the device is consistent with what
* was expected at build time.
+ *
+ * Treble devices will verify the Vendor Interface (VINTF). A device
+ * launched without Treble:
+ *
* 1) Checks that device fingerprint is defined and that it matches across
* various partitions.
* 2) Verifies radio and bootloader partitions are those expected in the build.
@@ -819,6 +831,17 @@
// Don't care on eng builds. Incremental build may trigger false negative.
if (IS_ENG) return true;
+ if (IS_TREBLE_ENABLED) {
+ int result = VintfObject.verify(new String[0]);
+
+ if (result != 0) {
+ Slog.e(TAG, "Vendor interface is incompatible, error="
+ + String.valueOf(result));
+ }
+
+ return result == 0;
+ }
+
final String system = SystemProperties.get("ro.build.fingerprint");
final String vendor = SystemProperties.get("ro.vendor.build.fingerprint");
final String bootimage = SystemProperties.get("ro.bootimage.build.fingerprint");
diff --git a/core/java/android/os/Parcel.java b/core/java/android/os/Parcel.java
index 38a5395..0a5e9a8 100644
--- a/core/java/android/os/Parcel.java
+++ b/core/java/android/os/Parcel.java
@@ -429,13 +429,7 @@
* @param size The new number of bytes in the Parcel.
*/
public final void setDataSize(int size) {
- // STOPSHIP: Try/catch for exception is for temporary debug. Remove once bug resolved
- try {
- updateNativeSize(nativeSetDataSize(mNativePtr, size));
- } catch (IllegalArgumentException iae) {
- Log.e(TAG,"Caught Exception representing a known bug in Parcel",iae);
- Log.wtfStack(TAG, "This flow is using SetDataSize incorrectly");
- }
+ updateNativeSize(nativeSetDataSize(mNativePtr, size));
}
/**
diff --git a/core/java/android/os/RecoverySystem.java b/core/java/android/os/RecoverySystem.java
index 447f280..d2598c7 100644
--- a/core/java/android/os/RecoverySystem.java
+++ b/core/java/android/os/RecoverySystem.java
@@ -22,9 +22,12 @@
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
+import android.content.pm.PackageManager;
import android.os.UserManager;
import android.text.TextUtils;
import android.util.Log;
+import android.view.Display;
+import android.view.WindowManager;
import libcore.io.Streams;
@@ -570,7 +573,16 @@
// Having set up the BCB (bootloader control block), go ahead and reboot
PowerManager pm = (PowerManager) context.getSystemService(Context.POWER_SERVICE);
- pm.reboot(PowerManager.REBOOT_RECOVERY_UPDATE);
+ String reason = PowerManager.REBOOT_RECOVERY_UPDATE;
+
+ // On TV, reboot quiescently if the screen is off
+ if (context.getPackageManager().hasSystemFeature(PackageManager.FEATURE_LEANBACK)) {
+ WindowManager wm = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
+ if (wm.getDefaultDisplay().getState() != Display.STATE_ON) {
+ reason += ",quiescent";
+ }
+ }
+ pm.reboot(reason);
throw new IOException("Reboot failed (no permissions?)");
}
diff --git a/core/java/android/os/StrictMode.java b/core/java/android/os/StrictMode.java
index f503b3a..0611f17 100644
--- a/core/java/android/os/StrictMode.java
+++ b/core/java/android/os/StrictMode.java
@@ -342,6 +342,18 @@
private static volatile int sVmPolicyMask = 0;
private static volatile VmPolicy sVmPolicy = VmPolicy.LAX;
+ /** {@hide} */
+ public interface ViolationListener {
+ public void onViolation(String message);
+ }
+
+ private static volatile ViolationListener sListener;
+
+ /** {@hide} */
+ public static void setViolationListener(ViolationListener listener) {
+ sListener = listener;
+ }
+
/**
* The number of threads trying to do an async dropbox write.
* Just to limit ourselves out of paranoia.
@@ -1581,6 +1593,9 @@
long timeSinceLastViolationMillis = lastViolationTime == 0 ?
Long.MAX_VALUE : (now - lastViolationTime);
+ if ((info.policy & PENALTY_LOG) != 0 && sListener != null) {
+ sListener.onViolation(info.crashInfo.stackTrace);
+ }
if ((info.policy & PENALTY_LOG) != 0 &&
timeSinceLastViolationMillis > MIN_LOG_INTERVAL_MS) {
if (info.durationMillis != -1) {
@@ -2024,6 +2039,9 @@
}
}
+ if (penaltyLog && sListener != null) {
+ sListener.onViolation(originStack.toString());
+ }
if (penaltyLog && timeSinceLastViolationMillis > MIN_LOG_INTERVAL_MS) {
Log.e(TAG, message, originStack);
}
diff --git a/core/java/android/os/storage/StorageManager.java b/core/java/android/os/storage/StorageManager.java
index f361c54..d81ee4e 100644
--- a/core/java/android/os/storage/StorageManager.java
+++ b/core/java/android/os/storage/StorageManager.java
@@ -1642,11 +1642,20 @@
*/
@RequiresPermission(android.Manifest.permission.ALLOCATE_AGGRESSIVE)
@SystemApi
- public static final int FLAG_ALLOCATE_AGGRESSIVE = 1;
+ public static final int FLAG_ALLOCATE_AGGRESSIVE = 1 << 0;
+
+ /**
+ * Flag indicating that a disk space allocation request should defy any
+ * reserved disk space.
+ *
+ * @hide
+ */
+ public static final int FLAG_ALLOCATE_DEFY_RESERVED = 1 << 1;
/** @hide */
@IntDef(flag = true, value = {
FLAG_ALLOCATE_AGGRESSIVE,
+ FLAG_ALLOCATE_DEFY_RESERVED,
})
@Retention(RetentionPolicy.SOURCE)
public @interface AllocateFlags {}
diff --git a/core/java/android/provider/ContactsContract.java b/core/java/android/provider/ContactsContract.java
index 5408e13..70ef035 100644
--- a/core/java/android/provider/ContactsContract.java
+++ b/core/java/android/provider/ContactsContract.java
@@ -8915,15 +8915,11 @@
* ambiguous then the activity should prompt the user for the recipient to send the message
* to.
* <p>
- * Voice Assistant may provide additional information to messaging app about which account
- * to use for sending a message by populating {@link #EXTRA_SENDER_ACCOUNT_HASH}.
- * <p>
* Output: nothing
*
* @see #EXTRA_RECIPIENT_CONTACT_URI
* @see #EXTRA_RECIPIENT_CONTACT_CHAT_ID
* @see #EXTRA_RECIPIENT_CONTACT_NAME
- * @see #EXTRA_SENDER_ACCOUNT_HASH
* @see #METADATA_ACCOUNT_TYPE
* @see #METADATA_MIMETYPE
*/
@@ -8982,21 +8978,6 @@
"android.provider.extra.RECIPIENT_CONTACT_NAME";
/**
- * This optional extra specifies the hash of the account that should be used by messaging
- * app for sending voice message with {@link #ACTION_VOICE_SEND_MESSAGE_TO_CONTACTS}. The
- * value of this extra is a {@code String} and should be the value of {@link
- * android.accounts.Account#hashCode()} for some account returned by {@link
- * android.accounts.AccountManager#getAccounts()}.
- * <p>
- * If the extra is not specified, the app can decide which account to use.
- * <p>
- * If the account specified in the extra cannot be used for any reason (account missing, not
- * usable by the app, etc), the message should not be sent.
- */
- public static final String EXTRA_SENDER_ACCOUNT_HASH =
- "android.provider.extra.SENDER_ACCOUNT_HASH";
-
- /**
* A string associated with an {@link #ACTION_VOICE_SEND_MESSAGE_TO_CONTACTS} activity
* describing {@link RawContacts#ACCOUNT_TYPE} for the corresponding Contacts Provider
* implementation.
diff --git a/core/java/android/provider/Settings.java b/core/java/android/provider/Settings.java
index 3cd54b8..6a17ed1 100755
--- a/core/java/android/provider/Settings.java
+++ b/core/java/android/provider/Settings.java
@@ -9817,13 +9817,49 @@
public static final String ENABLE_EPHEMERAL_FEATURE = "enable_ephemeral_feature";
/**
- * The duration for caching uninstalled instant apps.
+ * The min period for caching installed instant apps in milliseconds.
* <p>
* Type: long
* @hide
*/
- public static final String UNINSTALLED_INSTANT_APP_CACHE_DURATION_MILLIS =
- "uninstalled_instant_app_cache_duration_millis";
+ public static final String INSTALLED_INSTANT_APP_MIN_CACHE_PERIOD =
+ "installed_instant_app_min_cache_period";
+
+ /**
+ * The max period for caching installed instant apps in milliseconds.
+ * <p>
+ * Type: long
+ * @hide
+ */
+ public static final String INSTALLED_INSTANT_APP_MAX_CACHE_PERIOD =
+ "installed_instant_app_max_cache_period";
+
+ /**
+ * The min period for caching uninstalled instant apps in milliseconds.
+ * <p>
+ * Type: long
+ * @hide
+ */
+ public static final String UNINSTALLED_INSTANT_APP_MIN_CACHE_PERIOD =
+ "uninstalled_instant_app_min_cache_period";
+
+ /**
+ * The max period for caching uninstalled instant apps in milliseconds.
+ * <p>
+ * Type: long
+ * @hide
+ */
+ public static final String UNINSTALLED_INSTANT_APP_MAX_CACHE_PERIOD =
+ "uninstalled_instant_app_max_cache_period";
+
+ /**
+ * The min period for caching unused static shared libs in milliseconds.
+ * <p>
+ * Type: long
+ * @hide
+ */
+ public static final String UNUSED_STATIC_SHARED_LIB_MIN_CACHE_PERIOD =
+ "unused_static_shared_lib_min_cache_period";
/**
* Allows switching users when system user is locked.
diff --git a/core/java/android/util/proto/ProtoOutputStream.java b/core/java/android/util/proto/ProtoOutputStream.java
index adf4938..480abc1 100644
--- a/core/java/android/util/proto/ProtoOutputStream.java
+++ b/core/java/android/util/proto/ProtoOutputStream.java
@@ -1593,7 +1593,7 @@
assertNotCompacted();
final int id = checkFieldId(fieldId, FIELD_COUNT_REPEATED | FIELD_TYPE_FIXED64);
- writeRepeatedFixed64(id, val);
+ writeRepeatedFixed64Impl(id, val);
}
private void writeRepeatedFixed64Impl(int id, long val) {
@@ -1720,7 +1720,7 @@
assertNotCompacted();
final int id = checkFieldId(fieldId, FIELD_COUNT_REPEATED | FIELD_TYPE_SFIXED64);
- writeRepeatedSFixed64(id, val);
+ writeRepeatedSFixed64Impl(id, val);
}
private void writeRepeatedSFixed64Impl(int id, long val) {
@@ -1785,7 +1785,7 @@
assertNotCompacted();
final int id = checkFieldId(fieldId, FIELD_COUNT_REPEATED | FIELD_TYPE_BOOL);
- writeRepeatedBool(id, val);
+ writeRepeatedBoolImpl(id, val);
}
private void writeRepeatedBoolImpl(int id, boolean val) {
diff --git a/core/java/android/view/AppTransitionAnimationSpec.java b/core/java/android/view/AppTransitionAnimationSpec.java
index c6e1989..86a5fb7 100644
--- a/core/java/android/view/AppTransitionAnimationSpec.java
+++ b/core/java/android/view/AppTransitionAnimationSpec.java
@@ -1,6 +1,6 @@
package android.view;
-import android.graphics.Bitmap;
+import android.graphics.GraphicBuffer;
import android.graphics.Rect;
import android.os.Parcel;
import android.os.Parcelable;
@@ -15,19 +15,19 @@
*/
public class AppTransitionAnimationSpec implements Parcelable {
public final int taskId;
- public final Bitmap bitmap;
+ public final GraphicBuffer buffer;
public final Rect rect;
- public AppTransitionAnimationSpec(int taskId, Bitmap bitmap, Rect rect) {
+ public AppTransitionAnimationSpec(int taskId, GraphicBuffer buffer, Rect rect) {
this.taskId = taskId;
- this.bitmap = bitmap;
this.rect = rect;
+ this.buffer = buffer;
}
public AppTransitionAnimationSpec(Parcel in) {
taskId = in.readInt();
- bitmap = in.readParcelable(null);
rect = in.readParcelable(null);
+ buffer = in.readParcelable(null);
}
@Override
@@ -38,9 +38,8 @@
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeInt(taskId);
- dest.writeParcelable(bitmap, 0 /* flags */);
dest.writeParcelable(rect, 0 /* flags */);
-
+ dest.writeParcelable(buffer, 0);
}
public static final Parcelable.Creator<AppTransitionAnimationSpec> CREATOR
@@ -56,6 +55,6 @@
@Override
public String toString() {
- return "{taskId: " + taskId + ", bitmap: " + bitmap + ", rect: " + rect + "}";
+ return "{taskId: " + taskId + ", buffer: " + buffer + ", rect: " + rect + "}";
}
}
diff --git a/core/java/android/view/IPinnedStackController.aidl b/core/java/android/view/IPinnedStackController.aidl
index dbeb747..d2dcb56 100644
--- a/core/java/android/view/IPinnedStackController.aidl
+++ b/core/java/android/view/IPinnedStackController.aidl
@@ -30,6 +30,14 @@
oneway void setIsMinimized(boolean isMinimized);
/**
+ * Notifies the controller of the current min edge size, this is needed to allow the system to
+ * properly calculate the aspect ratio of the expanded PIP. The given {@param minEdgeSize} is
+ * always bounded to be larger than the default minEdgeSize, so the caller can call this method
+ * with 0 to reset to the default size.
+ */
+ oneway void setMinEdgeSize(int minEdgeSize);
+
+ /**
* @return what WM considers to be the current device rotation.
*/
int getDisplayRotation();
diff --git a/core/java/android/view/IWindowManager.aidl b/core/java/android/view/IWindowManager.aidl
index a2ff4f7..58a6a5e 100644
--- a/core/java/android/view/IWindowManager.aidl
+++ b/core/java/android/view/IWindowManager.aidl
@@ -26,6 +26,7 @@
import android.content.res.CompatibilityInfo;
import android.content.res.Configuration;
import android.graphics.Bitmap;
+import android.graphics.GraphicBuffer;
import android.graphics.Point;
import android.graphics.Rect;
import android.os.Bundle;
@@ -96,9 +97,9 @@
int startHeight);
void overridePendingAppTransitionClipReveal(int startX, int startY,
int startWidth, int startHeight);
- void overridePendingAppTransitionThumb(in Bitmap srcThumb, int startX, int startY,
+ void overridePendingAppTransitionThumb(in GraphicBuffer srcThumb, int startX, int startY,
IRemoteCallback startedCallback, boolean scaleUp);
- void overridePendingAppTransitionAspectScaledThumb(in Bitmap srcThumb, int startX,
+ void overridePendingAppTransitionAspectScaledThumb(in GraphicBuffer srcThumb, int startX,
int startY, int targetWidth, int targetHeight, IRemoteCallback startedCallback,
boolean scaleUp);
/**
diff --git a/core/java/android/view/LayoutInflater.java b/core/java/android/view/LayoutInflater.java
index f987e4e..ad46d07 100644
--- a/core/java/android/view/LayoutInflater.java
+++ b/core/java/android/view/LayoutInflater.java
@@ -923,8 +923,11 @@
+ " include tag: <include layout=\"@layout/layoutID\" />");
}
- // Attempt to resolve the "?attr/name" string to an identifier.
- layout = context.getResources().getIdentifier(value.substring(1), null, null);
+ // Attempt to resolve the "?attr/name" string to an attribute
+ // within the default (e.g. application) package.
+ layout = context.getResources().getIdentifier(
+ value.substring(1), "attr", context.getPackageName());
+
}
// The layout might be referencing a theme attribute.
diff --git a/core/java/android/view/SurfaceView.java b/core/java/android/view/SurfaceView.java
index 2c33b60..b57ac66 100644
--- a/core/java/android/view/SurfaceView.java
+++ b/core/java/android/view/SurfaceView.java
@@ -31,7 +31,7 @@
import android.graphics.Region;
import android.os.Build;
import android.os.Handler;
-import android.os.Message;
+import android.os.Looper;
import android.os.SystemClock;
import android.util.AttributeSet;
import android.util.Log;
@@ -120,32 +120,11 @@
final Rect mTmpRect = new Rect();
final Configuration mConfiguration = new Configuration();
- static final int KEEP_SCREEN_ON_MSG = 1;
- static final int DRAW_FINISHED_MSG = 2;
-
int mSubLayer = APPLICATION_MEDIA_SUBLAYER;
boolean mIsCreating = false;
private volatile boolean mRtHandlingPositionUpdates = false;
- final Handler mHandler = new Handler() {
- @Override
- public void handleMessage(Message msg) {
- switch (msg.what) {
- case KEEP_SCREEN_ON_MSG: {
- setKeepScreenOn(msg.arg1 != 0);
- } break;
- case DRAW_FINISHED_MSG: {
- mDrawFinished = true;
- if (mAttachedToWindow) {
- notifyDrawFinished();
- invalidate();
- }
- } break;
- }
- }
- };
-
private final ViewTreeObserver.OnScrollChangedListener mScrollChangedListener
= new ViewTreeObserver.OnScrollChangedListener() {
@Override
@@ -247,7 +226,6 @@
getViewRootImpl().addWindowStoppedCallback(this);
mWindowStopped = false;
- mParent.requestTransparentRegion(this);
mViewVisibility = getVisibility() == VISIBLE;
updateRequestedVisibility();
@@ -286,6 +264,22 @@
updateSurface();
}
+ private void performDrawFinished() {
+ if (mPendingReportDraws > 0) {
+ mDrawFinished = true;
+ if (mAttachedToWindow) {
+ mParent.requestTransparentRegion(SurfaceView.this);
+
+ notifyDrawFinished();
+ invalidate();
+ }
+ } else {
+ Log.e(TAG, System.identityHashCode(this) + "finished drawing"
+ + " but no pending report draw (extra call"
+ + " to draw completion runnable?)");
+ }
+ }
+
void notifyDrawFinished() {
ViewRootImpl viewRoot = getViewRootImpl();
if (viewRoot != null) {
@@ -352,7 +346,7 @@
@Override
public boolean gatherTransparentRegion(Region region) {
- if (isAboveParent()) {
+ if (isAboveParent() || !mDrawFinished) {
return super.gatherTransparentRegion(region);
}
@@ -678,9 +672,16 @@
} finally {
mIsCreating = false;
if (mSurfaceControl != null && !mSurfaceCreated) {
- mSurfaceControl.destroy();
mSurface.release();
- mSurfaceControl = null;
+ // If we are not in the stopped state, then the destruction of the Surface
+ // represents a visual change we need to display, and we should go ahead
+ // and destroy the SurfaceControl. However if we are in the stopped state,
+ // we can just leave the Surface around so it can be a part of animations,
+ // and we let the life-time be tied to the parent surface.
+ if (!mWindowStopped) {
+ mSurfaceControl.destroy();
+ mSurfaceControl = null;
+ }
}
}
} catch (Exception ex) {
@@ -743,7 +744,9 @@
mDeferredDestroySurfaceControl = null;
}
- mHandler.sendEmptyMessage(DRAW_FINISHED_MSG);
+ runOnUiThread(() -> {
+ performDrawFinished();
+ });
}
private void setParentSpaceRectangle(Rect position, long frameNumber) {
@@ -872,6 +875,15 @@
+ "type=" + type, new Throwable());
}
+ private void runOnUiThread(Runnable runnable) {
+ Handler handler = getHandler();
+ if (handler != null && handler.getLooper() != Looper.myLooper()) {
+ handler.post(runnable);
+ } else {
+ runnable.run();
+ }
+ }
+
/**
* Check to see if the surface has fixed size dimensions or if the surface's
* dimensions are dimensions are dependent on its current layout.
@@ -952,9 +964,7 @@
@Override
public void setKeepScreenOn(boolean screenOn) {
- Message msg = mHandler.obtainMessage(KEEP_SCREEN_ON_MSG);
- msg.arg1 = screenOn ? 1 : 0;
- mHandler.sendMessage(msg);
+ runOnUiThread(() -> SurfaceView.this.setKeepScreenOn(screenOn));
}
/**
diff --git a/core/java/android/view/ThreadedRenderer.java b/core/java/android/view/ThreadedRenderer.java
index c66bf874..25a58e6 100644
--- a/core/java/android/view/ThreadedRenderer.java
+++ b/core/java/android/view/ThreadedRenderer.java
@@ -872,6 +872,15 @@
}
}
+ /**
+ * Creates a {@link android.graphics.Bitmap.Config#HARDWARE} bitmap from the given
+ * RenderNode. Note that the RenderNode should be created as a root node (so x/y of 0,0), and
+ * not the RenderNode from a View.
+ **/
+ public static Bitmap createHardwareBitmap(RenderNode node, int width, int height) {
+ return nCreateHardwareBitmap(node.getNativeDisplayList(), width, height);
+ }
+
@Override
protected void finalize() throws Throwable {
try {
@@ -1015,4 +1024,6 @@
private static native int nCopySurfaceInto(Surface surface,
int srcLeft, int srcTop, int srcRight, int srcBottom, Bitmap bitmap);
+
+ private static native Bitmap nCreateHardwareBitmap(long renderNode, int width, int height);
}
diff --git a/core/java/android/view/View.java b/core/java/android/view/View.java
index 2d48295..a69b813 100644
--- a/core/java/android/view/View.java
+++ b/core/java/android/view/View.java
@@ -593,12 +593,12 @@
* a single tag using the {@link android.R.styleable#View_tag android:tag}
* attribute or multiple tags using the {@code <tag>} child element:
* <pre>
- * <View ...
+ * <View ...
* android:tag="@string/mytag_value" />
- * <View ...>
- * <tag android:id="@+id/mytag"
+ * <View ...>
+ * <tag android:id="@+id/mytag"
* android:value="@string/mytag_value" />
- * </View>
+ * </View>
* </pre>
* </p>
* <p>
@@ -628,11 +628,11 @@
* {@link android.R.styleable#Theme_colorAccent android:colorAccent} defined on
* the inflation context's theme (e.g. the Activity theme) will be preserved.
* <pre>
- * <LinearLayout
+ * <LinearLayout
* ...
* android:theme="@android:theme/ThemeOverlay.Material.Dark">
- * <View ...>
- * </LinearLayout>
+ * <View ...>
+ * </LinearLayout>
* </pre>
* </p>
*
@@ -964,115 +964,155 @@
private static final int[] VISIBILITY_FLAGS = {VISIBLE, INVISIBLE, GONE};
/**
- * This view contains an email address.
+ * Hint indicating that this view can be autofilled with an email address.
*
- * Use with {@link #setAutofillHints(String[])}, or set "{@value #AUTOFILL_HINT_EMAIL_ADDRESS}"
- * to <a href="#attr_android:autofillHint"> {@code android:autofillHint}.
+ * <p>Can be used with either {@link #setAutofillHints(String[])} or
+ * <a href="#attr_android:autofillHint"> {@code android:autofillHint}</a> (in which case the
+ * value should be <code>{@value #AUTOFILL_HINT_EMAIL_ADDRESS}</code>).
+ *
+ * <p>See {@link #setAutofillHints(String...)} for more info about autofill hints.
*/
public static final String AUTOFILL_HINT_EMAIL_ADDRESS = "emailAddress";
/**
- * The view contains a real name.
+ * Hint indicating that this view can be autofilled with a user's real name.
*
- * Use with {@link #setAutofillHints(String[])}, or set "{@value #AUTOFILL_HINT_NAME}" to
- * <a href="#attr_android:autofillHint"> {@code android:autofillHint}.
+ * <p>Can be used with either {@link #setAutofillHints(String[])} or
+ * <a href="#attr_android:autofillHint"> {@code android:autofillHint}</a> (in which case the
+ * value should be <code>{@value #AUTOFILL_HINT_NAME}</code>).
+ *
+ * <p>See {@link #setAutofillHints(String...)} for more info about autofill hints.
*/
public static final String AUTOFILL_HINT_NAME = "name";
/**
- * The view contains a user name.
+ * Hint indicating that this view can be autofilled with a username.
*
- * Use with {@link #setAutofillHints(String[])}, or set "{@value #AUTOFILL_HINT_USERNAME}" to
- * <a href="#attr_android:autofillHint"> {@code android:autofillHint}.
+ * <p>Can be used with either {@link #setAutofillHints(String[])} or
+ * <a href="#attr_android:autofillHint"> {@code android:autofillHint}</a> (in which case the
+ * value should be <code>{@value #AUTOFILL_HINT_USERNAME}</code>).
+ *
+ * <p>See {@link #setAutofillHints(String...)} for more info about autofill hints.
*/
public static final String AUTOFILL_HINT_USERNAME = "username";
/**
- * The view contains a password.
+ * Hint indicating that this view can be autofilled with a password.
*
- * Use with {@link #setAutofillHints(String[])}, or set "{@value #AUTOFILL_HINT_PASSWORD}" to
- * <a href="#attr_android:autofillHint"> {@code android:autofillHint}.
+ * <p>Can be used with either {@link #setAutofillHints(String[])} or
+ * <a href="#attr_android:autofillHint"> {@code android:autofillHint}</a> (in which case the
+ * value should be <code>{@value #AUTOFILL_HINT_PASSWORD}</code>).
+ *
+ * <p>See {@link #setAutofillHints(String...)} for more info about autofill hints.
*/
public static final String AUTOFILL_HINT_PASSWORD = "password";
/**
- * The view contains a phone number.
+ * Hint indicating that this view can be autofilled with a phone number.
*
- * Use with {@link #setAutofillHints(String[])}, or set "{@value #AUTOFILL_HINT_PHONE}" to
- * <a href="#attr_android:autofillHint"> {@code android:autofillHint}.
+ * <p>Can be used with either {@link #setAutofillHints(String[])} or
+ * <a href="#attr_android:autofillHint"> {@code android:autofillHint}</a> (in which case the
+ * value should be <code>{@value #AUTOFILL_HINT_PHONE}</code>).
+ *
+ * <p>See {@link #setAutofillHints(String...)} for more info about autofill hints.
*/
public static final String AUTOFILL_HINT_PHONE = "phone";
/**
- * The view contains a postal address.
+ * Hint indicating that this view can be autofilled with a postal address.
*
- * Use with {@link #setAutofillHints(String[])}, or set "{@value #AUTOFILL_HINT_POSTAL_ADDRESS}"
- * to <a href="#attr_android:autofillHint"> {@code android:autofillHint}.
+ * <p>Can be used with either {@link #setAutofillHints(String[])} or
+ * <a href="#attr_android:autofillHint"> {@code android:autofillHint}</a> (in which case the
+ * value should be <code>{@value #AUTOFILL_HINT_POSTAL_ADDRESS}</code>).
+ *
+ * <p>See {@link #setAutofillHints(String...)} for more info about autofill hints.
*/
public static final String AUTOFILL_HINT_POSTAL_ADDRESS = "postalAddress";
/**
- * The view contains a postal code.
+ * Hint indicating that this view can be autofilled with a postal code.
*
- * Use with {@link #setAutofillHints(String[])}, or set "{@value #AUTOFILL_HINT_POSTAL_CODE}" to
- * <a href="#attr_android:autofillHint"> {@code android:autofillHint}.
+ * <p>Can be used with either {@link #setAutofillHints(String[])} or
+ * <a href="#attr_android:autofillHint"> {@code android:autofillHint}</a> (in which case the
+ * value should be <code>{@value #AUTOFILL_HINT_POSTAL_CODE}</code>).
+ *
+ * <p>See {@link #setAutofillHints(String...)} for more info about autofill hints.
*/
public static final String AUTOFILL_HINT_POSTAL_CODE = "postalCode";
/**
- * The view contains a credit card number.
+ * Hint indicating that this view can be autofilled with a credit card number.
*
- * Use with {@link #setAutofillHints(String[])}, or set "{@value
- * #AUTOFILL_HINT_CREDIT_CARD_NUMBER}" to <a href="#attr_android:autofillHint"> {@code
- * android:autofillHint}.
+ * <p>Can be used with either {@link #setAutofillHints(String[])} or
+ * <a href="#attr_android:autofillHint"> {@code android:autofillHint}</a> (in which case the
+ * value should be <code>{@value #AUTOFILL_HINT_CREDIT_CARD_NUMBER}</code>).
+ *
+ * <p>See {@link #setAutofillHints(String...)} for more info about autofill hints.
*/
public static final String AUTOFILL_HINT_CREDIT_CARD_NUMBER = "creditCardNumber";
/**
- * The view contains a credit card security code.
+ * Hint indicating that this view can be autofilled with a credit card security code.
*
- * Use with {@link #setAutofillHints(String[])}, or set "{@value
- * #AUTOFILL_HINT_CREDIT_CARD_SECURITY_CODE}" to <a href="#attr_android:autofillHint"> {@code
- * android:autofillHint}.
+ * <p>Can be used with either {@link #setAutofillHints(String[])} or
+ * <a href="#attr_android:autofillHint"> {@code android:autofillHint}</a> (in which case the
+ * value should be <code>{@value #AUTOFILL_HINT_CREDIT_CARD_SECURITY_CODE}</code>).
+ *
+ * <p>See {@link #setAutofillHints(String...)} for more info about autofill hints.
*/
public static final String AUTOFILL_HINT_CREDIT_CARD_SECURITY_CODE = "creditCardSecurityCode";
/**
- * The view contains a credit card expiration date.
+ * Hint indicating that this view can be autofilled with a credit card expiration date.
*
- * Use with {@link #setAutofillHints(String[])}, or set "{@value
- * #AUTOFILL_HINT_CREDIT_CARD_EXPIRATION_DATE}" to <a href="#attr_android:autofillHint"> {@code
- * android:autofillHint}.
+ * <p>It should be used when the credit card expiration date is represented by just one view;
+ * if it is represented by more than one (for example, one view for the month and another view
+ * for the year), then each of these views should use the hint specific for the unit
+ * ({@link #AUTOFILL_HINT_CREDIT_CARD_EXPIRATION_DAY},
+ * {@link #AUTOFILL_HINT_CREDIT_CARD_EXPIRATION_MONTH},
+ * or {@link #AUTOFILL_HINT_CREDIT_CARD_EXPIRATION_YEAR}).
+ *
+ * <p>Can be used with either {@link #setAutofillHints(String[])} or
+ * <a href="#attr_android:autofillHint"> {@code android:autofillHint}</a> (in which case the
+ * value should be <code>{@value #AUTOFILL_HINT_CREDIT_CARD_EXPIRATION_DATE}</code>).
+ *
+ * <p>See {@link #setAutofillHints(String...)} for more info about autofill hints.
*/
public static final String AUTOFILL_HINT_CREDIT_CARD_EXPIRATION_DATE =
"creditCardExpirationDate";
/**
- * The view contains the month a credit card expires.
+ * Hint indicating that this view can be autofilled with a credit card expiration month.
*
- * Use with {@link #setAutofillHints(String[])}, or set "{@value
- * #AUTOFILL_HINT_CREDIT_CARD_EXPIRATION_MONTH}" to <a href="#attr_android:autofillHint"> {@code
- * android:autofillHint}.
+ * <p>Can be used with either {@link #setAutofillHints(String[])} or
+ * <a href="#attr_android:autofillHint"> {@code android:autofillHint}</a> (in which case the
+ * value should be <code>{@value #AUTOFILL_HINT_CREDIT_CARD_EXPIRATION_MONTH}</code>).
+ *
+ * <p>See {@link #setAutofillHints(String...)} for more info about autofill hints.
*/
public static final String AUTOFILL_HINT_CREDIT_CARD_EXPIRATION_MONTH =
"creditCardExpirationMonth";
/**
- * The view contains the year a credit card expires.
+ * Hint indicating that this view can be autofilled with a credit card expiration year.
*
- * Use with {@link #setAutofillHints(String[])}, or set "{@value
- * #AUTOFILL_HINT_CREDIT_CARD_EXPIRATION_YEAR}" to <a href="#attr_android:autofillHint"> {@code
- * android:autofillHint}.
+ * <p>Can be used with either {@link #setAutofillHints(String[])} or
+ * <a href="#attr_android:autofillHint"> {@code android:autofillHint}</a> (in which case the
+ * value should be <code>{@value #AUTOFILL_HINT_CREDIT_CARD_EXPIRATION_YEAR}</code>).
+ *
+ * <p>See {@link #setAutofillHints(String...)} for more info about autofill hints.
*/
public static final String AUTOFILL_HINT_CREDIT_CARD_EXPIRATION_YEAR =
"creditCardExpirationYear";
/**
- * The view contains the day a credit card expires.
+ * Hint indicating that this view can be autofilled with a credit card expiration day.
*
- * Use with {@link #setAutofillHints(String[])}, or set "{@value
- * #AUTOFILL_HINT_CREDIT_CARD_EXPIRATION_DAY}" to <a href="#attr_android:autofillHint"> {@code
- * android:autofillHint}.
+ * <p>Can be used with either {@link #setAutofillHints(String[])} or
+ * <a href="#attr_android:autofillHint"> {@code android:autofillHint}</a> (in which case the
+ * value should be <code>{@value #AUTOFILL_HINT_CREDIT_CARD_EXPIRATION_DAY}</code>).
+ *
+ * <p>See {@link #setAutofillHints(String...)} for more info about autofill hints.
*/
public static final String AUTOFILL_HINT_CREDIT_CARD_EXPIRATION_DAY = "creditCardExpirationDay";
@@ -1189,7 +1229,8 @@
public @interface AutofillFlags {}
/**
- * Flag requesting you to add views not-important for autofill to the assist data.
+ * Flag requesting you to add views that are marked as not important for autofill
+ * (see {@link #setImportantForAutofill(int)}) to a {@link ViewStructure}.
*/
public static final int AUTOFILL_FLAG_INCLUDE_NOT_IMPORTANT_VIEWS = 0x1;
@@ -7486,7 +7527,7 @@
* <li>Call {@link AutofillManager#commit()} when the autofill context
* of the view structure changed and you want the current autofill interaction if such
* to be commited.
- * <li>Call {@link AutofillManager#cancel()} ()} when the autofill context
+ * <li>Call {@link AutofillManager#cancel()} when the autofill context
* of the view structure changed and you want the current autofill interaction if such
* to be cancelled.
* <li> The {@code left} and {@code top} values set in
@@ -7516,15 +7557,22 @@
* <li>Passing the actual value to the equivalent setter in the view.
* </ol>
*
- * <p>For example, a text-field view would call:
+ * <p>For example, a text-field view could implement the method this way:
+ *
* <pre class="prettyprint">
- * CharSequence text = value.getTextValue();
- * if (text != null) {
- * setText(text);
+ * @Override
+ * public void autofill(AutofillValue value) {
+ * if (!value.isText() || !this.isEditable()) {
+ * return;
+ * }
+ * CharSequence text = value.getTextValue();
+ * if (text != null) {
+ * this.setText(text);
+ * }
* }
* </pre>
*
- * <p>If the value is updated asyncronously the next call to
+ * <p>If the value is updated asynchronously the next call to
* {@link AutofillManager#notifyValueChanged(View)} must happen <u>after</u> the value was
* changed to the autofilled value. If not, the view will not be considered autofilled.
*
@@ -7575,9 +7623,13 @@
}
/**
- * Describes the content of a view so that a autofill service can fill in the appropriate data.
+ * Gets the hints that help an {@link android.service.autofill.AutofillService} determine how
+ * to autofill the view with the user's data.
*
- * @return The hints set via the attribute or {@code null} if no hint it set.
+ * <p>See {@link #setAutofillHints(String...)} for more info about these hints.
+ *
+ * @return The hints set via the attribute or {@link #setAutofillHints(String...)}, or
+ * {@code null} if no hints were set.
*
* @attr ref android.R.styleable#View_autofillHints
*/
@@ -9242,8 +9294,26 @@
}
/**
- * Sets the hints that helps the autofill service to select the appropriate data to fill the
- * view.
+ * Sets the hints that help an {@link android.service.autofill.AutofillService} determine how
+ * to autofill the view with the user's data.
+ *
+ * <p>Typically, there is only one way to autofill a view, but there could be more than one.
+ * For example, if the application accepts either an username or email address to identify
+ * an user.
+ *
+ * <p>These hints are not validated by the Android System, but passed "as is" to the service.
+ * Hence, they can have any value, but it's recommended to use the {@code AUTOFILL_HINT_}
+ * constants such as:
+ * {@link #AUTOFILL_HINT_USERNAME}, {@link #AUTOFILL_HINT_PASSWORD},
+ * {@link #AUTOFILL_HINT_EMAIL_ADDRESS},
+ * {@link #AUTOFILL_HINT_NAME},
+ * {@link #AUTOFILL_HINT_PHONE},
+ * {@link #AUTOFILL_HINT_POSTAL_ADDRESS}, {@link #AUTOFILL_HINT_POSTAL_CODE},
+ * {@link #AUTOFILL_HINT_CREDIT_CARD_NUMBER}, {@link #AUTOFILL_HINT_CREDIT_CARD_SECURITY_CODE},
+ * {@link #AUTOFILL_HINT_CREDIT_CARD_EXPIRATION_DATE},
+ * {@link #AUTOFILL_HINT_CREDIT_CARD_EXPIRATION_DAY},
+ * {@link #AUTOFILL_HINT_CREDIT_CARD_EXPIRATION_MONTH} or
+ * {@link #AUTOFILL_HINT_CREDIT_CARD_EXPIRATION_YEAR}.
*
* @param autofillHints The autofill hints to set. If the array is emtpy, {@code null} is set.
* @attr ref android.R.styleable#View_autofillHints
@@ -19794,7 +19864,6 @@
&& (mForegroundInfo == null || mForegroundInfo.mDrawable == null)) {
mPrivateFlags |= PFLAG_SKIP_DRAW;
}
- requestLayout();
invalidate();
}
@@ -19802,18 +19871,23 @@
* Check whether we need to draw a default focus highlight when this view gets focused,
* which requires:
* <ul>
- * <li>In the background, {@link android.R.attr#state_focused} is not defined.</li>
+ * <li>In both background and foreground, {@link android.R.attr#state_focused}
+ * is not defined.</li>
* <li>This view is not in touch mode.</li>
* <li>This view doesn't opt out for a default focus highlight, via
* {@link #setDefaultFocusHighlightEnabled(boolean)}.</li>
* <li>This view is attached to window.</li>
* </ul>
* @return {@code true} if a default focus highlight is needed.
+ * @hide
*/
- private boolean isDefaultFocusHighlightNeeded(Drawable background) {
- final boolean hasFocusStateSpecified = background == null || !background.isStateful()
- || !background.hasFocusStateSpecified();
- return !isInTouchMode() && getDefaultFocusHighlightEnabled() && hasFocusStateSpecified
+ @TestApi
+ public boolean isDefaultFocusHighlightNeeded(Drawable background, Drawable foreground) {
+ final boolean lackFocusState = (background == null || !background.isStateful()
+ || !background.hasFocusStateSpecified())
+ && (foreground == null || !foreground.isStateful()
+ || !foreground.hasFocusStateSpecified());
+ return !isInTouchMode() && getDefaultFocusHighlightEnabled() && lackFocusState
&& isAttachedToWindow() && sUseDefaultFocusHighlight;
}
@@ -19825,7 +19899,8 @@
*/
private void switchDefaultFocusHighlight() {
if (isFocused()) {
- final boolean needed = isDefaultFocusHighlightNeeded(mBackground);
+ final boolean needed = isDefaultFocusHighlightNeeded(mBackground,
+ mForegroundInfo == null ? null : mForegroundInfo.mDrawable);
final boolean active = mDefaultFocusHighlight != null;
if (needed && !active) {
setDefaultFocusHighlight(getDefaultFocusHighlightDrawable());
diff --git a/core/java/android/view/ViewGroup.java b/core/java/android/view/ViewGroup.java
index 50593f2..09464eec4 100644
--- a/core/java/android/view/ViewGroup.java
+++ b/core/java/android/view/ViewGroup.java
@@ -57,6 +57,7 @@
import android.view.animation.AnimationUtils;
import android.view.animation.LayoutAnimationController;
import android.view.animation.Transformation;
+
import com.android.internal.R;
import java.util.ArrayList;
@@ -7715,14 +7716,15 @@
mMarginFlags |= RIGHT_MARGIN_UNDEFINED_MASK;
rightMargin = DEFAULT_MARGIN_RESOLVED;
}
- startMargin = a.getDimensionPixelSize(
- R.styleable.ViewGroup_MarginLayout_layout_marginStart,
- DEFAULT_MARGIN_RELATIVE);
- endMargin = a.getDimensionPixelSize(
- R.styleable.ViewGroup_MarginLayout_layout_marginEnd,
- DEFAULT_MARGIN_RELATIVE);
}
+ startMargin = a.getDimensionPixelSize(
+ R.styleable.ViewGroup_MarginLayout_layout_marginStart,
+ DEFAULT_MARGIN_RELATIVE);
+ endMargin = a.getDimensionPixelSize(
+ R.styleable.ViewGroup_MarginLayout_layout_marginEnd,
+ DEFAULT_MARGIN_RELATIVE);
+
if (verticalMargin >= 0) {
topMargin = verticalMargin;
bottomMargin = verticalMargin;
diff --git a/core/java/android/view/ViewRootImpl.java b/core/java/android/view/ViewRootImpl.java
index 28ded55..a720aae 100644
--- a/core/java/android/view/ViewRootImpl.java
+++ b/core/java/android/view/ViewRootImpl.java
@@ -2330,7 +2330,7 @@
// Remember if we must report the next draw.
if ((relayoutResult & WindowManagerGlobal.RELAYOUT_RES_FIRST_TIME) != 0) {
- mReportNextDraw = true;
+ reportNextDraw();
}
boolean cancelDraw = mAttachInfo.mTreeObserver.dispatchOnPreDraw() || !isViewVisible;
@@ -2731,11 +2731,8 @@
/**
* A count of the number of calls to pendingDrawFinished we
* require to notify the WM drawing is complete.
- *
- * This starts at 1, for the ViewRootImpl surface itself.
- * Subsurfaces may debt the value with drawPending.
*/
- int mDrawsNeededToReport = 1;
+ int mDrawsNeededToReport = 0;
/**
* Delay notifying WM of draw finished until
@@ -2761,7 +2758,7 @@
private void reportDrawFinished() {
try {
- mDrawsNeededToReport = 1;
+ mDrawsNeededToReport = 0;
mWindowSession.finishDrawing(mWindow);
} catch (RemoteException e) {
// Have fun!
@@ -3772,13 +3769,12 @@
args.recycle();
if (msg.what == MSG_RESIZED_REPORT) {
- mReportNextDraw = true;
+ reportNextDraw();
}
if (mView != null && framesChanged) {
forceLayout(mView);
}
-
requestLayout();
}
break;
@@ -7343,6 +7339,14 @@
return false;
}
+
+ private void reportNextDraw() {
+ if (mReportNextDraw == false) {
+ drawPending();
+ }
+ mReportNextDraw = true;
+ }
+
/**
* Force the window to report its next draw.
* <p>
@@ -7352,7 +7356,7 @@
* @hide
*/
public void setReportNextDraw() {
- mReportNextDraw = true;
+ reportNextDraw();
invalidate();
}
diff --git a/core/java/android/view/ViewStructure.java b/core/java/android/view/ViewStructure.java
index 6bdc9ff..ddfe697 100644
--- a/core/java/android/view/ViewStructure.java
+++ b/core/java/android/view/ViewStructure.java
@@ -304,13 +304,6 @@
public abstract void setAutofillId(@NonNull AutofillId parentId, int virtualId);
/**
- * @deprecated - use {@link #setAutofillId(AutofillId, int)} instead
- * @hide
- */
- @Deprecated
- public abstract void setAutofillId(@NonNull ViewStructure parent, int virtualId);
-
- /**
* Sets the {@link View#getAutofillType()} that can be used to autofill this node.
*/
public abstract void setAutofillType(@View.AutofillType int type);
diff --git a/core/java/android/view/WindowManagerInternal.java b/core/java/android/view/WindowManagerInternal.java
index bf0e10f..55aed52 100644
--- a/core/java/android/view/WindowManagerInternal.java
+++ b/core/java/android/view/WindowManagerInternal.java
@@ -225,6 +225,9 @@
*/
public abstract boolean isKeyguardLocked();
+ /** @return {@code true} if the keyguard is going away. */
+ public abstract boolean isKeyguardGoingAway();
+
/**
* Gets the frame of a window given its token.
*
diff --git a/core/java/android/view/WindowManagerPolicy.java b/core/java/android/view/WindowManagerPolicy.java
index 030c78b..13ffeec 100644
--- a/core/java/android/view/WindowManagerPolicy.java
+++ b/core/java/android/view/WindowManagerPolicy.java
@@ -401,6 +401,13 @@
boolean isAnimatingLw();
/**
+ * @return Whether the window can affect SystemUI flags, meaning that SystemUI (system bars,
+ * for example) will be affected by the flags specified in this window. This is the
+ * case when the surface is on screen but not exiting.
+ */
+ boolean canAffectSystemUiFlags();
+
+ /**
* Is this window considered to be gone for purposes of layout?
*/
boolean isGoneForLayoutLw();
@@ -589,6 +596,13 @@
* Notifies window manager that {@link #isKeyguardTrustedLw} has changed.
*/
void notifyKeyguardTrustedChanged();
+
+ /**
+ * Notifies the window manager that screen is being turned off.
+ *
+ * @param listener callback to call when display can be turned off
+ */
+ void screenTurningOff(ScreenOffListener listener);
}
public interface PointerEventListener {
@@ -1267,6 +1281,15 @@
public void screenTurnedOn();
/**
+ * Called when the display would like to be turned off. This gives policy a chance to do some
+ * things before the display power state is actually changed to off.
+ *
+ * @param screenOffListener Must be called to tell that the display power state can actually be
+ * changed now after policy has done its work.
+ */
+ public void screenTurningOff(ScreenOffListener screenOffListener);
+
+ /**
* Called when the device has turned the screen off.
*/
public void screenTurnedOff();
@@ -1276,6 +1299,13 @@
}
/**
+ * See {@link #screenTurnedOff}
+ */
+ public interface ScreenOffListener {
+ void onScreenOff();
+ }
+
+ /**
* Return whether the default display is on and not blocked by a black surface.
*/
public boolean isScreenOn();
@@ -1661,4 +1691,16 @@
public void onConfigurationChanged();
public boolean shouldRotateSeamlessly(int oldRotation, int newRotation);
+
+ /**
+ * Called when System UI has been started.
+ */
+ void onSystemUiStarted();
+
+ /**
+ * Checks whether the policy is ready for dismissing the boot animation and completing the boot.
+ *
+ * @return true if ready; false otherwise.
+ */
+ boolean canDismissBootAnimation();
}
diff --git a/core/java/android/view/accessibility/AccessibilityEvent.java b/core/java/android/view/accessibility/AccessibilityEvent.java
index 8a13c0c..eecfdca 100644
--- a/core/java/android/view/accessibility/AccessibilityEvent.java
+++ b/core/java/android/view/accessibility/AccessibilityEvent.java
@@ -618,8 +618,7 @@
public static final int TYPE_WINDOW_CONTENT_CHANGED = 0x00000800;
/**
- * Represents the event of scrolling a view. This event type is generally not sent directly.
- * @see View#onScrollChanged(int, int, int, int)
+ * Represents the event of scrolling a view.
*/
public static final int TYPE_VIEW_SCROLLED = 0x00001000;
diff --git a/core/java/android/view/autofill/AutofillManager.java b/core/java/android/view/autofill/AutofillManager.java
index 39ac399..02ecc50 100644
--- a/core/java/android/view/autofill/AutofillManager.java
+++ b/core/java/android/view/autofill/AutofillManager.java
@@ -186,6 +186,10 @@
@GuardedBy("mLock")
@Nullable private TrackedViews mTrackedViews;
+ /** Views that are only tracked because they are fillable and could be anchoring the UI. */
+ @GuardedBy("mLock")
+ @Nullable private ArraySet<AutofillId> mFillableIds;
+
/** @hide */
public interface AutofillClient {
/**
@@ -238,13 +242,27 @@
boolean isVisibleForAutofill();
/**
- * Find views by traversing the hierarchies of the client.
+ * Finds views by traversing the hierarchies of the client.
*
* @param viewIds The accessibility ids of the views to find
*
- * @return And array containing the views, or {@code null} if not found
+ * @return And array containing the views (empty if no views found).
*/
@NonNull View[] findViewsByAccessibilityIdTraversal(@NonNull int[] viewIds);
+
+ /**
+ * Finds a view by traversing the hierarchies of the client.
+ *
+ * @param viewId The accessibility id of the views to find
+ *
+ * @return The view, or {@code null} if not found
+ */
+ @Nullable View findViewByAccessibilityIdTraversal(int viewId);
+
+ /**
+ * Runs the specified action on the UI thread.
+ */
+ void runOnUiThread(Runnable action);
}
/**
@@ -375,9 +393,10 @@
/**
* Explicitly requests a new autofill context.
*
- * <p>Normally, the autofill context is automatically started when autofillable views are
- * focused, but this method should be used in the cases where it must be explicitly requested,
- * like a view that provides a contextual menu allowing users to autofill the activity.
+ * <p>Normally, the autofill context is automatically started if necessary when
+ * {@link #notifyViewEntered(View)} is called, but this method should be used in the
+ * cases where it must be explicitly started. For example, when the view offers an AUTOFILL
+ * option on its contextual overflow menu, and the user selects it.
*
* @param view view requesting the new autofill context.
*/
@@ -388,16 +407,29 @@
/**
* Explicitly requests a new autofill context for virtual views.
*
- * <p>Normally, the autofill context is automatically started when autofillable views are
- * focused, but this method should be used in the cases where it must be explicitly requested,
- * like a virtual view that provides a contextual menu allowing users to autofill the activity.
+ * <p>Normally, the autofill context is automatically started if necessary when
+ * {@link #notifyViewEntered(View, int, Rect)} is called, but this method should be used in the
+ * cases where it must be explicitly started. For example, when the virtual view offers an
+ * AUTOFILL option on its contextual overflow menu, and the user selects it.
*
- * @param view the {@link View} whose descendant is the virtual view.
- * @param childId id identifying the virtual child inside the view.
- * @param bounds child boundaries, relative to the top window.
+ * <p>The virtual view boundaries must be absolute screen coordinates. For example, if the
+ * parent view uses {@code bounds} to draw the virtual view inside its Canvas,
+ * the absolute bounds could be calculated by:
+ *
+ * <pre class="prettyprint">
+ * int offset[] = new int[2];
+ * getLocationOnScreen(offset);
+ * Rect absBounds = new Rect(bounds.left + offset[0],
+ * bounds.top + offset[1],
+ * bounds.right + offset[0], bounds.bottom + offset[1]);
+ * </pre>
+ *
+ * @param view the virtual view parent.
+ * @param virtualId id identifying the virtual child inside the parent view.
+ * @param absBounds absolute boundaries of the virtual view in the screen.
*/
- public void requestAutofill(@NonNull View view, int childId, @NonNull Rect bounds) {
- notifyViewEntered(view, childId, bounds, FLAG_MANUAL_REQUEST);
+ public void requestAutofill(@NonNull View view, int virtualId, @NonNull Rect absBounds) {
+ notifyViewEntered(view, virtualId, absBounds, FLAG_MANUAL_REQUEST);
}
/**
@@ -471,8 +503,17 @@
*/
public void notifyViewVisibilityChange(@NonNull View view, boolean isVisible) {
synchronized (mLock) {
- if (mEnabled && mSessionId != NO_SESSION && mTrackedViews != null) {
- mTrackedViews.notifyViewVisibilityChange(view, isVisible);
+ if (mEnabled && mSessionId != NO_SESSION) {
+ if (!isVisible && mFillableIds != null) {
+ final AutofillId id = view.getAutofillId();
+ if (mFillableIds.contains(id)) {
+ if (sDebug) Log.d(TAG, "Hidding UI when view " + id + " became invisible");
+ requestHideFillUi(id, view);
+ }
+ }
+ if (mTrackedViews != null) {
+ mTrackedViews.notifyViewVisibilityChange(view, isVisible);
+ }
}
}
}
@@ -480,15 +521,27 @@
/**
* Called when a virtual view that supports autofill is entered.
*
- * @param view the {@link View} whose descendant is the virtual view.
- * @param childId id identifying the virtual child inside the view.
- * @param bounds child boundaries, relative to the top window.
+ * <p>The virtual view boundaries must be absolute screen coordinates. For example, if the
+ * parent, non-virtual view uses {@code bounds} to draw the virtual view inside its Canvas,
+ * the absolute bounds could be calculated by:
+ *
+ * <pre class="prettyprint">
+ * int offset[] = new int[2];
+ * getLocationOnScreen(offset);
+ * Rect absBounds = new Rect(bounds.left + offset[0],
+ * bounds.top + offset[1],
+ * bounds.right + offset[0], bounds.bottom + offset[1]);
+ * </pre>
+ *
+ * @param view the virtual view parent.
+ * @param virtualId id identifying the virtual child inside the parent view.
+ * @param absBounds absolute boundaries of the virtual view in the screen.
*/
- public void notifyViewEntered(@NonNull View view, int childId, @NonNull Rect bounds) {
- notifyViewEntered(view, childId, bounds, 0);
+ public void notifyViewEntered(@NonNull View view, int virtualId, @NonNull Rect absBounds) {
+ notifyViewEntered(view, virtualId, absBounds, 0);
}
- private void notifyViewEntered(View view, int childId, Rect bounds, int flags) {
+ private void notifyViewEntered(View view, int virtualId, Rect bounds, int flags) {
if (!hasAutofillFeature()) {
return;
}
@@ -501,7 +554,7 @@
callback = mCallback;
}
} else {
- final AutofillId id = getAutofillId(view, childId);
+ final AutofillId id = getAutofillId(view, virtualId);
if (mSessionId == NO_SESSION) {
// Starts new session.
@@ -514,7 +567,7 @@
}
if (callback != null) {
- callback.onAutofillEvent(view, childId,
+ callback.onAutofillEvent(view, virtualId,
AutofillCallback.EVENT_INPUT_UNAVAILABLE);
}
}
@@ -522,10 +575,10 @@
/**
* Called when a virtual view that supports autofill is exited.
*
- * @param view the {@link View} whose descendant is the virtual view.
- * @param childId id identifying the virtual child inside the view.
+ * @param view the virtual view parent.
+ * @param virtualId id identifying the virtual child inside the parent view.
*/
- public void notifyViewExited(@NonNull View view, int childId) {
+ public void notifyViewExited(@NonNull View view, int virtualId) {
if (!hasAutofillFeature()) {
return;
}
@@ -533,7 +586,7 @@
ensureServiceClientAddedIfNeededLocked();
if (mEnabled && mSessionId != NO_SESSION) {
- final AutofillId id = getAutofillId(view, childId);
+ final AutofillId id = getAutofillId(view, virtualId);
// Update focus on existing session.
updateSessionLocked(id, null, null, ACTION_VIEW_EXITED, 0);
@@ -593,13 +646,13 @@
}
/**
- * Called to indicate the value of an autofillable virtual {@link View} changed.
+ * Called to indicate the value of an autofillable virtual view has changed.
*
- * @param view the {@link View} whose descendant is the virtual view.
- * @param childId id identifying the virtual child inside the parent view.
+ * @param view the virtual view parent.
+ * @param virtualId id identifying the virtual child inside the parent view.
* @param value new value of the child.
*/
- public void notifyValueChanged(View view, int childId, AutofillValue value) {
+ public void notifyValueChanged(View view, int virtualId, AutofillValue value) {
if (!hasAutofillFeature()) {
return;
}
@@ -608,7 +661,7 @@
return;
}
- final AutofillId id = getAutofillId(view, childId);
+ final AutofillId id = getAutofillId(view, virtualId);
updateSessionLocked(id, null, value, ACTION_VALUE_CHANGED, 0);
}
}
@@ -743,8 +796,8 @@
return new AutofillId(view.getAccessibilityViewId());
}
- private static AutofillId getAutofillId(View parent, int childId) {
- return new AutofillId(parent.getAccessibilityViewId(), childId);
+ private static AutofillId getAutofillId(View parent, int virtualId) {
+ return new AutofillId(parent.getAccessibilityViewId(), virtualId);
}
private void startSessionLocked(@NonNull AutofillId id, @NonNull Rect bounds,
@@ -1048,9 +1101,10 @@
*
* @param trackedIds The views to be tracked
* @param saveOnAllViewsInvisible Finish the session once all tracked views are invisible.
+ * @param fillableIds Views that might anchor FillUI.
*/
- private void setTrackedViews(int sessionId, List<AutofillId> trackedIds,
- boolean saveOnAllViewsInvisible) {
+ private void setTrackedViews(int sessionId, @Nullable AutofillId[] trackedIds,
+ boolean saveOnAllViewsInvisible, @Nullable AutofillId[] fillableIds) {
synchronized (mLock) {
if (mEnabled && mSessionId == sessionId) {
if (saveOnAllViewsInvisible) {
@@ -1058,15 +1112,32 @@
} else {
mTrackedViews = null;
}
+ if (fillableIds != null) {
+ if (mFillableIds == null) {
+ mFillableIds = new ArraySet<>(fillableIds.length);
+ }
+ for (AutofillId id : fillableIds) {
+ mFillableIds.add(id);
+ }
+ if (sVerbose) {
+ Log.v(TAG, "setTrackedViews(): fillableIds=" + fillableIds
+ + ", mFillableIds" + mFillableIds);
+ }
+ }
}
}
}
- private void requestHideFillUi(int sessionId, AutofillId id) {
+ private void requestHideFillUi(AutofillId id) {
final View anchor = findView(id);
+ if (sVerbose) Log.v(TAG, "requestHideFillUi(" + id + "): anchor = " + anchor);
if (anchor == null) {
return;
}
+ requestHideFillUi(id, anchor);
+ }
+
+ private void requestHideFillUi(AutofillId id, View anchor) {
AutofillCallback callback = null;
synchronized (mLock) {
@@ -1123,6 +1194,18 @@
*
* @return The array of viewIds.
*/
+ // TODO: move to Helper as static method
+ @NonNull private int[] getViewIds(@NonNull AutofillId[] autofillIds) {
+ final int numIds = autofillIds.length;
+ final int[] viewIds = new int[numIds];
+ for (int i = 0; i < numIds; i++) {
+ viewIds[i] = autofillIds[i].getViewId();
+ }
+
+ return viewIds;
+ }
+
+ // TODO: move to Helper as static method
@NonNull private int[] getViewIds(@NonNull List<AutofillId> autofillIds) {
final int numIds = autofillIds.size();
final int[] viewIds = new int[numIds];
@@ -1147,7 +1230,7 @@
return null;
}
- return client.findViewsByAccessibilityIdTraversal(new int[]{autofillId.getViewId()})[0];
+ return client.findViewByAccessibilityIdTraversal(autofillId.getViewId());
}
/** @hide */
@@ -1155,6 +1238,15 @@
return mService != null;
}
+ private void post(Runnable runnable) {
+ final AutofillClient client = getClientLocked();
+ if (client == null) {
+ if (sVerbose) Log.v(TAG, "ignoring post() because client is null");
+ return;
+ }
+ client.runOnUiThread(runnable);
+ }
+
/**
* View tracking information. Once all tracked views become invisible the session is finished.
*/
@@ -1173,6 +1265,7 @@
*
* @return {@code true} iff set is not empty and value is in set
*/
+ // TODO: move to Helper as static method
private <T> boolean isInSet(@Nullable ArraySet<T> set, T value) {
return set != null && set.contains(value);
}
@@ -1186,6 +1279,7 @@
* @return The set including the new value. If set was {@code null}, a set containing only
* the new value.
*/
+ // TODO: move to Helper as static method
@NonNull
private <T> ArraySet<T> addToSet(@Nullable ArraySet<T> set, T valueToAdd) {
if (set == null) {
@@ -1206,6 +1300,7 @@
* @return The set without the removed value. {@code null} if set was null, or is empty
* after removal.
*/
+ // TODO: move to Helper as static method
@Nullable
private <T> ArraySet<T> removeFromSet(@Nullable ArraySet<T> set, T valueToRemove) {
if (set == null) {
@@ -1226,11 +1321,8 @@
*
* @param trackedIds The views to be tracked
*/
- TrackedViews(List<AutofillId> trackedIds) {
- mVisibleTrackedIds = null;
- mInvisibleTrackedIds = null;
-
- AutofillClient client = getClientLocked();
+ TrackedViews(@Nullable AutofillId[] trackedIds) {
+ final AutofillClient client = getClientLocked();
if (trackedIds != null && client != null) {
final boolean[] isVisible;
@@ -1238,12 +1330,12 @@
isVisible = client.getViewVisibility(getViewIds(trackedIds));
} else {
// All false
- isVisible = new boolean[trackedIds.size()];
+ isVisible = new boolean[trackedIds.length];
}
- final int numIds = trackedIds.size();
+ final int numIds = trackedIds.length;
for (int i = 0; i < numIds; i++) {
- final AutofillId id = trackedIds.get(i);
+ final AutofillId id = trackedIds[i];
if (isVisible[i]) {
mVisibleTrackedIds = addToSet(mVisibleTrackedIds, id);
@@ -1294,6 +1386,9 @@
}
if (mVisibleTrackedIds == null) {
+ if (sVerbose) {
+ Log.v(TAG, "No more visible ids. Invisibile = " + mInvisibleTrackedIds);
+ }
finishSessionLocked();
}
}
@@ -1415,11 +1510,12 @@
* Called after a change in the autofill state associated with a virtual view.
*
* @param view parent view associated with the change.
- * @param childId id identifying the virtual child inside the parent view.
+ * @param virtualId id identifying the virtual child inside the parent view.
*
* @param event currently either {@link #EVENT_INPUT_SHOWN} or {@link #EVENT_INPUT_HIDDEN}.
*/
- public void onAutofillEvent(@NonNull View view, int childId, @AutofillEventType int event) {
+ public void onAutofillEvent(@NonNull View view, int virtualId,
+ @AutofillEventType int event) {
}
}
@@ -1434,8 +1530,7 @@
public void setState(boolean enabled, boolean resetSession, boolean resetClient) {
final AutofillManager afm = mAfm.get();
if (afm != null) {
- afm.mContext.getMainThreadHandler().post(
- () -> afm.setState(enabled, resetSession, resetClient));
+ afm.post(() -> afm.setState(enabled, resetSession, resetClient));
}
}
@@ -1443,8 +1538,7 @@
public void autofill(int sessionId, List<AutofillId> ids, List<AutofillValue> values) {
final AutofillManager afm = mAfm.get();
if (afm != null) {
- afm.mContext.getMainThreadHandler().post(
- () -> afm.autofill(sessionId, ids, values));
+ afm.post(() -> afm.autofill(sessionId, ids, values));
}
}
@@ -1453,8 +1547,7 @@
Intent fillInIntent) {
final AutofillManager afm = mAfm.get();
if (afm != null) {
- afm.mContext.getMainThreadHandler().post(
- () -> afm.authenticate(sessionId, authenticationId, intent, fillInIntent));
+ afm.post(() -> afm.authenticate(sessionId, authenticationId, intent, fillInIntent));
}
}
@@ -1463,9 +1556,8 @@
Rect anchorBounds, IAutofillWindowPresenter presenter) {
final AutofillManager afm = mAfm.get();
if (afm != null) {
- afm.mContext.getMainThreadHandler().post(
- () -> afm.requestShowFillUi(sessionId, id, width, height, anchorBounds,
- presenter));
+ afm.post(() -> afm.requestShowFillUi(sessionId, id, width, height, anchorBounds,
+ presenter));
}
}
@@ -1473,8 +1565,7 @@
public void requestHideFillUi(int sessionId, AutofillId id) {
final AutofillManager afm = mAfm.get();
if (afm != null) {
- afm.mContext.getMainThreadHandler().post(
- () -> afm.requestHideFillUi(sessionId, id));
+ afm.post(() -> afm.requestHideFillUi(id));
}
}
@@ -1482,7 +1573,7 @@
public void notifyNoFillUi(int sessionId, AutofillId id) {
final AutofillManager afm = mAfm.get();
if (afm != null) {
- afm.mContext.getMainThreadHandler().post(() -> afm.notifyNoFillUi(sessionId, id));
+ afm.post(() -> afm.notifyNoFillUi(sessionId, id));
}
}
@@ -1490,7 +1581,7 @@
public void startIntentSender(IntentSender intentSender) {
final AutofillManager afm = mAfm.get();
if (afm != null) {
- afm.mContext.getMainThreadHandler().post(() -> {
+ afm.post(() -> {
try {
afm.mContext.startIntentSender(intentSender, null, 0, 0, 0);
} catch (IntentSender.SendIntentException e) {
@@ -1501,12 +1592,12 @@
}
@Override
- public void setTrackedViews(int sessionId, List<AutofillId> ids,
- boolean saveOnAllViewsInvisible) {
+ public void setTrackedViews(int sessionId, AutofillId[] ids,
+ boolean saveOnAllViewsInvisible, AutofillId[] fillableIds) {
final AutofillManager afm = mAfm.get();
if (afm != null) {
- afm.mContext.getMainThreadHandler().post(
- () -> afm.setTrackedViews(sessionId, ids, saveOnAllViewsInvisible)
+ afm.post(() ->
+ afm.setTrackedViews(sessionId, ids, saveOnAllViewsInvisible, fillableIds)
);
}
}
diff --git a/core/java/android/view/autofill/AutofillPopupWindow.java b/core/java/android/view/autofill/AutofillPopupWindow.java
index cd16a24..5f47638 100644
--- a/core/java/android/view/autofill/AutofillPopupWindow.java
+++ b/core/java/android/view/autofill/AutofillPopupWindow.java
@@ -16,6 +16,8 @@
package android.view.autofill;
+import static android.view.autofill.Helper.sVerbose;
+
import android.annotation.NonNull;
import android.graphics.Rect;
import android.graphics.drawable.Drawable;
@@ -186,6 +188,10 @@
@Override
public void showAsDropDown(View anchor, int xoff, int yoff, int gravity) {
+ if (sVerbose) {
+ Log.v(TAG, "showAsDropDown(): anchor=" + anchor + ", xoff=" + xoff + ", yoff=" + yoff
+ + ", isShowing(): " + isShowing());
+ }
if (isShowing()) {
return;
}
diff --git a/core/java/android/view/autofill/IAutoFillManagerClient.aidl b/core/java/android/view/autofill/IAutoFillManagerClient.aidl
index 1d66f7f..d18b181 100644
--- a/core/java/android/view/autofill/IAutoFillManagerClient.aidl
+++ b/core/java/android/view/autofill/IAutoFillManagerClient.aidl
@@ -52,8 +52,8 @@
* Sets the views to track. If saveOnAllViewsInvisible is set and all these view are invisible
* the session is finished automatically.
*/
- void setTrackedViews(int sessionId, in List<AutofillId> ids,
- boolean saveOnAllViewsInvisible);
+ void setTrackedViews(int sessionId, in @nullable AutofillId[] savableIds,
+ boolean saveOnAllViewsInvisible, in @nullable AutofillId[] fillableIds);
/**
* Requests showing the fill UI.
diff --git a/core/java/android/view/textclassifier/TextClassifier.java b/core/java/android/view/textclassifier/TextClassifier.java
index 32fae73..ab1d034 100644
--- a/core/java/android/view/textclassifier/TextClassifier.java
+++ b/core/java/android/view/textclassifier/TextClassifier.java
@@ -67,11 +67,6 @@
CharSequence text, int startIndex, int endIndex, LocaleList defaultLocales) {
return TextClassification.EMPTY;
}
-
- @Override
- public LinksInfo getLinks(CharSequence text, int linkMask, LocaleList defaultLocales) {
- return LinksInfo.NO_OP;
- }
};
/**
@@ -138,8 +133,10 @@
* @hide
*/
@WorkerThread
- LinksInfo getLinks(
- @NonNull CharSequence text, int linkMask, @Nullable LocaleList defaultLocales);
+ default LinksInfo getLinks(
+ @NonNull CharSequence text, int linkMask, @Nullable LocaleList defaultLocales) {
+ return LinksInfo.NO_OP;
+ }
/**
* Logs a TextClassifier event.
diff --git a/core/java/android/webkit/WebView.java b/core/java/android/webkit/WebView.java
index ecb25fe..dda5df6 100644
--- a/core/java/android/webkit/WebView.java
+++ b/core/java/android/webkit/WebView.java
@@ -2654,19 +2654,23 @@
* {@link ViewStructure#setAutofillHints(String[])}.
* <li>The {@code type} attribute of {@code INPUT} tags maps to
* {@link ViewStructure#setInputType(int)}.
- * <li>The {@code value} attribute maps to {@link ViewStructure#setText(CharSequence)}.
+ * <li>The {@code value} attribute of {@code INPUT} tags maps to
+ * {@link ViewStructure#setText(CharSequence)}.
+ * <li>If the view is editalbe, the {@link ViewStructure#setAutofillType(int)} and
+ * {@link ViewStructure#setAutofillValue(AutofillValue)} must be set.
* <li>The {@code placeholder} attribute maps to {@link ViewStructure#setHint(CharSequence)}.
- * <li>{@link ViewStructure#setDataIsSensitive(boolean)} whould only be called with
- * {@code true} for form fields whose {@code value} attribute was not pre-loaded.
* <li>Other HTML attributes can be represented through
* {@link ViewStructure#setHtmlInfo(android.view.ViewStructure.HtmlInfo)}.
* </ol>
*
+ * <p>It should also call {@code structure.setDataIsSensitive(false)} for fields whose value
+ * were not dynamically changed (for example, through Javascript).
+ *
* <p>Example1: an HTML form with 2 fields for username and password.
*
* <pre class="prettyprint">
- * <input type="text" name="username" id="user" value="mr.sparkle" autocomplete="username" placeholder="Email or username">
- * <input type="password" name="password" id="pass" autocomplete="current-password" placeholder="Password">
+ * <input type="text" name="username" id="user" value="Type your username" autocomplete="username" placeholder="Email or username">
+ * <input type="password" name="password" id="pass" autocomplete="current-password" placeholder="Password">
* </pre>
*
* <p>Would map to:
@@ -2674,38 +2678,40 @@
* <pre class="prettyprint">
* int index = structure.addChildCount(2);
* ViewStructure username = structure.newChild(index);
- * username.setAutofillId(structure, 1); // id 1 - first child
+ * username.setAutofillId(structure.getAutofillId(), 1); // id 1 - first child
* username.setClassName("input");
* username.setInputType("android.widget.EditText");
* username.setAutofillHints("username");
- * username.setHtmlInfo(child.newHtmlInfoBuilder("input")
+ * username.setHtmlInfo(username.newHtmlInfoBuilder("input")
+ * .addAttribute("type", "text")
* .addAttribute("name", "username")
* .addAttribute("id", "user")
* .build());
* username.setHint("Email or username");
* username.setAutofillType(View.AUTOFILL_TYPE_TEXT);
- * username.setAutofillValue(AutofillValue.forText("mr.sparkle"));
- * username.setText("mr.sparkle");
- * username.setDataIsSensitive(true); // Contains real username, which is sensitive
+ * username.setAutofillValue(AutofillValue.forText("Type your username"));
+ * username.setText("Type your username");
+ * // Value of the field is not sensitive because it was not dynamically changed:
+ * username.setDataIsSensitive(false);
*
* ViewStructure password = structure.newChild(index + 1);
* username.setAutofillId(structure, 2); // id 2 - second child
* password.setInputType("android.widget.EditText");
* password.setInputType(InputType.TYPE_TEXT_VARIATION_PASSWORD);
* password.setAutofillHints("current-password");
- * password.setHtmlInfo(child.newHtmlInfoBuilder("input")
+ * password.setHtmlInfo(password.newHtmlInfoBuilder("input")
+ * .addAttribute("type", "password")
* .addAttribute("name", "password")
* .addAttribute("id", "pass")
* .build());
* password.setHint("Password");
* password.setAutofillType(View.AUTOFILL_TYPE_TEXT);
- * password.setDataIsSensitive(false); // Value is not set
* </pre>
*
* <p>Example2: an IFRAME tag.
*
* <pre class="prettyprint">
- * <iframe src="https://example.com/login"/>
+ * <iframe src="https://example.com/login"/>
* </pre>
*
* <p>Would map to:
@@ -2713,8 +2719,9 @@
* <pre class="prettyprint">
* int index = structure.addChildCount(1);
* ViewStructure iframe = structure.newChildFor(index);
- * iframe.setHtmlInfo(child.newHtmlInfoBuilder("iframe")
- * .addAttribute("url", "https://example.com/login")
+ * iframe.setAutofillId(structure.getAutofillId(), 1);
+ * iframe.setHtmlInfo(iframe.newHtmlInfoBuilder("iframe")
+ * .addAttribute("src", "https://example.com/login")
* .build());
* </pre>
*/
diff --git a/core/java/android/widget/ActivityChooserView.java b/core/java/android/widget/ActivityChooserView.java
index 9a39a17..121a8c5 100644
--- a/core/java/android/widget/ActivityChooserView.java
+++ b/core/java/android/widget/ActivityChooserView.java
@@ -24,6 +24,8 @@
import android.content.res.Resources;
import android.content.res.TypedArray;
import android.database.DataSetObserver;
+import android.graphics.Color;
+import android.graphics.drawable.ColorDrawable;
import android.graphics.drawable.Drawable;
import android.util.AttributeSet;
import android.util.Log;
@@ -403,6 +405,7 @@
}
popupWindow.getListView().setContentDescription(mContext.getString(
R.string.activitychooserview_choose_application));
+ popupWindow.getListView().setSelector(new ColorDrawable(Color.TRANSPARENT));
}
}
diff --git a/core/java/android/widget/DatePickerCalendarDelegate.java b/core/java/android/widget/DatePickerCalendarDelegate.java
index ca1bf58..636519b 100755
--- a/core/java/android/widget/DatePickerCalendarDelegate.java
+++ b/core/java/android/widget/DatePickerCalendarDelegate.java
@@ -112,6 +112,7 @@
// Set up and attach container.
mContainer = (ViewGroup) inflater.inflate(layoutResourceId, mDelegator, false);
+ mContainer.setSaveFromParentEnabled(false);
mDelegator.addView(mContainer);
// Set up header views.
diff --git a/core/java/android/widget/DatePickerSpinnerDelegate.java b/core/java/android/widget/DatePickerSpinnerDelegate.java
index fc2d1fa..4f9316f 100644
--- a/core/java/android/widget/DatePickerSpinnerDelegate.java
+++ b/core/java/android/widget/DatePickerSpinnerDelegate.java
@@ -115,7 +115,8 @@
LayoutInflater inflater = (LayoutInflater) context
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
- inflater.inflate(layoutResourceId, mDelegator, true);
+ final View view = inflater.inflate(layoutResourceId, mDelegator, true);
+ view.setSaveFromParentEnabled(false);
OnValueChangeListener onChangeListener = new OnValueChangeListener() {
public void onValueChange(NumberPicker picker, int oldVal, int newVal) {
diff --git a/core/java/android/widget/ImageView.java b/core/java/android/widget/ImageView.java
index 57818e2..1dc5b44 100644
--- a/core/java/android/widget/ImageView.java
+++ b/core/java/android/widget/ImageView.java
@@ -19,6 +19,7 @@
import android.annotation.DrawableRes;
import android.annotation.NonNull;
import android.annotation.Nullable;
+import android.annotation.TestApi;
import android.content.ContentResolver;
import android.content.Context;
import android.content.res.ColorStateList;
@@ -1640,4 +1641,13 @@
super.encodeProperties(stream);
stream.addProperty("layout:baseline", getBaseline());
}
+
+ /** @hide */
+ @Override
+ @TestApi
+ public boolean isDefaultFocusHighlightNeeded(Drawable background, Drawable foreground) {
+ final boolean lackFocusState = mDrawable == null || !mDrawable.isStateful()
+ || !mDrawable.hasFocusStateSpecified();
+ return super.isDefaultFocusHighlightNeeded(background, foreground) && lackFocusState;
+ }
}
diff --git a/core/java/android/widget/NumberPicker.java b/core/java/android/widget/NumberPicker.java
index d456989..7bdd6da 100644
--- a/core/java/android/widget/NumberPicker.java
+++ b/core/java/android/widget/NumberPicker.java
@@ -737,7 +737,6 @@
mInputText.setFilters(new InputFilter[] {
new InputTextFilter()
});
- mInputText.setAccessibilityLiveRegion(View.ACCESSIBILITY_LIVE_REGION_POLITE);
mInputText.setRawInputType(InputType.TYPE_CLASS_NUMBER);
mInputText.setImeOptions(EditorInfo.IME_ACTION_DONE);
@@ -771,12 +770,6 @@
if (getImportantForAccessibility() == IMPORTANT_FOR_ACCESSIBILITY_AUTO) {
setImportantForAccessibility(IMPORTANT_FOR_ACCESSIBILITY_YES);
}
-
- // Should be focusable by default, as the text view whose visibility changes is focusable
- if (getFocusable() == View.FOCUSABLE_AUTO) {
- setFocusable(View.FOCUSABLE);
- setFocusableInTouchMode(true);
- }
}
@Override
@@ -863,7 +856,7 @@
switch (action) {
case MotionEvent.ACTION_DOWN: {
removeAllCallbacks();
- hideSoftInput();
+ mInputText.setVisibility(View.INVISIBLE);
mLastDownOrMoveEventY = mLastDownEventY = event.getY();
mLastDownEventTime = event.getEventTime();
mIgnoreMoveEvents = false;
@@ -890,9 +883,11 @@
mFlingScroller.forceFinished(true);
mAdjustScroller.forceFinished(true);
} else if (mLastDownEventY < mTopSelectionDividerTop) {
+ hideSoftInput();
postChangeCurrentByOneFromLongPress(
false, ViewConfiguration.getLongPressTimeout());
} else if (mLastDownEventY > mBottomSelectionDividerBottom) {
+ hideSoftInput();
postChangeCurrentByOneFromLongPress(
true, ViewConfiguration.getLongPressTimeout());
} else {
@@ -1125,7 +1120,6 @@
@Override
public void scrollBy(int x, int y) {
int[] selectorIndices = mSelectorIndices;
- int startScrollOffset = mCurrentScrollOffset;
if (!mWrapSelectorWheel && y > 0
&& selectorIndices[SELECTOR_MIDDLE_ITEM_INDEX] <= mMinValue) {
mCurrentScrollOffset = mInitialScrollOffset;
@@ -1153,9 +1147,6 @@
mCurrentScrollOffset = mInitialScrollOffset;
}
}
- if (startScrollOffset != mCurrentScrollOffset) {
- onScrollChanged(0, mCurrentScrollOffset, 0, startScrollOffset);
- }
}
@Override
@@ -1744,10 +1735,7 @@
}
int previous = mValue;
mValue = current;
- // If we're flinging, we'll update the text view at the end when it becomes visible
- if (mScrollState != OnScrollListener.SCROLL_STATE_FLING) {
- updateInputTextView();
- }
+ updateInputTextView();
if (notifyChange) {
notifyChange(previous, current);
}
@@ -1764,7 +1752,7 @@
*/
private void changeValueByOne(boolean increment) {
if (mHasSelectorWheel) {
- hideSoftInput();
+ mInputText.setVisibility(View.INVISIBLE);
if (!moveToFinalScrollerPosition(mFlingScroller)) {
moveToFinalScrollerPosition(mAdjustScroller);
}
@@ -1811,8 +1799,9 @@
*/
private void onScrollerFinished(Scroller scroller) {
if (scroller == mFlingScroller) {
- ensureScrollWheelAdjusted();
- updateInputTextView();
+ if (!ensureScrollWheelAdjusted()) {
+ updateInputTextView();
+ }
onScrollStateChange(OnScrollListener.SCROLL_STATE_IDLE);
} else {
if (mScrollState != OnScrollListener.SCROLL_STATE_TOUCH_SCROLL) {
@@ -1948,25 +1937,9 @@
*/
String text = (mDisplayedValues == null) ? formatNumber(mValue)
: mDisplayedValues[mValue - mMinValue];
- if (!TextUtils.isEmpty(text)) {
- CharSequence beforeText = mInputText.getText();
- if (!text.equals(beforeText.toString())) {
- mInputText.setText(text);
- if (mAccessibilityNodeProvider != null) {
- AccessibilityEvent event = AccessibilityEvent.obtain(
- AccessibilityEvent.TYPE_VIEW_TEXT_CHANGED);
- mInputText.onInitializeAccessibilityEvent(event);
- mInputText.onPopulateAccessibilityEvent(event);
- event.setFromIndex(0);
- event.setRemovedCount(beforeText.length());
- event.setAddedCount(text.length());
- event.setBeforeText(beforeText);
- event.setSource(NumberPicker.this,
- AccessibilityNodeProviderImpl.VIRTUAL_VIEW_ID_INPUT);
- requestSendAccessibilityEvent(NumberPicker.this, event);
- }
- return true;
- }
+ if (!TextUtils.isEmpty(text) && !text.equals(mInputText.getText().toString())) {
+ mInputText.setText(text);
+ return true;
}
return false;
diff --git a/core/java/android/widget/SelectionActionModeHelper.java b/core/java/android/widget/SelectionActionModeHelper.java
index 3d54fe7..142412a 100644
--- a/core/java/android/widget/SelectionActionModeHelper.java
+++ b/core/java/android/widget/SelectionActionModeHelper.java
@@ -73,9 +73,10 @@
// Do not call the TextClassifier if there is no selection.
startActionMode(null);
} else {
- resetTextClassificationHelper();
+ resetTextClassificationHelper(true /* resetSelectionTag */);
+ final TextView tv = mEditor.getTextView();
mTextClassificationAsyncTask = new TextClassificationAsyncTask(
- mEditor.getTextView(),
+ tv,
TIMEOUT_DURATION,
adjustSelection
? mTextClassificationHelper::suggestSelection
@@ -92,7 +93,7 @@
// Do not call the TextClassifier if there is no selection.
invalidateActionMode(null);
} else {
- resetTextClassificationHelper();
+ resetTextClassificationHelper(false /* resetSelectionTag */);
mTextClassificationAsyncTask = new TextClassificationAsyncTask(
mEditor.getTextView(), TIMEOUT_DURATION,
mTextClassificationHelper::classifyText, this::invalidateActionMode)
@@ -101,12 +102,12 @@
}
public void onSelectionAction() {
- mSelectionTracker.onSelectionAction(mTextClassificationHelper.getClassifierTag());
+ mSelectionTracker.onSelectionAction(mTextClassificationHelper.getSelectionTag());
}
public boolean resetSelection(int textIndex) {
if (mSelectionTracker.resetSelection(
- textIndex, mEditor, mTextClassificationHelper.getClassifierTag())) {
+ textIndex, mEditor, mTextClassificationHelper.getSelectionTag())) {
invalidateActionModeAsync();
return true;
}
@@ -158,7 +159,7 @@
}
if (result != null) {
mSelectionTracker.onSelectionStarted(
- result.mStart, result.mEnd, mTextClassificationHelper.getClassifierTag());
+ result.mStart, result.mEnd, mTextClassificationHelper.getSelectionTag());
}
}
mEditor.setRestartActionModeOnNextRefresh(false);
@@ -174,15 +175,15 @@
final TextView textView = mEditor.getTextView();
mSelectionTracker.onSelectionUpdated(
textView.getSelectionStart(), textView.getSelectionEnd(),
- mTextClassificationHelper.getClassifierTag());
+ mTextClassificationHelper.getSelectionTag());
mTextClassificationAsyncTask = null;
}
- private void resetTextClassificationHelper() {
+ private void resetTextClassificationHelper(boolean resetSelectionTag) {
final TextView textView = mEditor.getTextView();
mTextClassificationHelper.reset(textView.getTextClassifier(), textView.getText(),
textView.getSelectionStart(), textView.getSelectionEnd(),
- textView.getTextLocales());
+ resetSelectionTag, textView.getTextLocales());
}
/**
@@ -195,10 +196,14 @@
// Log event: Smart selection happened.
private static final String LOG_EVENT_MULTI_SELECTION =
"textClassifier_multiSelection";
+ private static final String LOG_EVENT_SINGLE_SELECTION =
+ "textClassifier_singleSelection";
// Log event: Smart selection acted upon.
private static final String LOG_EVENT_MULTI_SELECTION_ACTION =
"textClassifier_multiSelection_action";
+ private static final String LOG_EVENT_SINGLE_SELECTION_ACTION =
+ "textClassifier_singleSelection_action";
// Log event: Smart selection was reset to original selection.
private static final String LOG_EVENT_MULTI_SELECTION_RESET =
@@ -207,6 +212,8 @@
// Log event: Smart selection was user modified.
private static final String LOG_EVENT_MULTI_SELECTION_MODIFIED =
"textClassifier_multiSelection_modified";
+ private static final String LOG_EVENT_SINGLE_SELECTION_MODIFIED =
+ "textClassifier_singleSelection_modified";
private final TextClassifier mClassifier;
@@ -215,7 +222,8 @@
private int mSelectionStart;
private int mSelectionEnd;
- private boolean mSmartSelectionActive;
+ private boolean mMultiSelection;
+ private boolean mClassifierSelection;
SelectionTracker(TextClassifier classifier) {
mClassifier = classifier;
@@ -227,23 +235,26 @@
public void setOriginalSelection(int selectionStart, int selectionEnd) {
mOriginalStart = selectionStart;
mOriginalEnd = selectionEnd;
- mSmartSelectionActive = false;
+ resetSelectionFlags();
}
/**
- * Called when selection action mode is started.
+ * Called when selection action mode is started and the results come from a classifier.
* If the selection indices are different from the original selection indices, we have a
* smart selection.
*/
public void onSelectionStarted(int selectionStart, int selectionEnd, String logTag) {
+ mClassifierSelection = !logTag.isEmpty();
mSelectionStart = selectionStart;
mSelectionEnd = selectionEnd;
// If the started selection is different from the original selection, we have a
// smart selection.
- mSmartSelectionActive =
+ mMultiSelection =
mSelectionStart != mOriginalStart || mSelectionEnd != mOriginalEnd;
- if (mSmartSelectionActive) {
+ if (mMultiSelection) {
mClassifier.logEvent(logTag, LOG_EVENT_MULTI_SELECTION);
+ } else if (mClassifierSelection) {
+ mClassifier.logEvent(logTag, LOG_EVENT_SINGLE_SELECTION);
}
}
@@ -254,10 +265,12 @@
final boolean selectionChanged =
selectionStart != mSelectionStart || selectionEnd != mSelectionEnd;
if (selectionChanged) {
- if (mSmartSelectionActive) {
+ if (mMultiSelection) {
mClassifier.logEvent(logTag, LOG_EVENT_MULTI_SELECTION_MODIFIED);
+ } else if (mClassifierSelection) {
+ mClassifier.logEvent(logTag, LOG_EVENT_SINGLE_SELECTION_MODIFIED);
}
- mSmartSelectionActive = false;
+ resetSelectionFlags();
}
}
@@ -265,15 +278,17 @@
* Called when the selection action mode is destroyed.
*/
public void onSelectionDestroyed() {
- mSmartSelectionActive = false;
+ resetSelectionFlags();
}
/**
* Logs if the action was taken on a smart selection.
*/
public void onSelectionAction(String logTag) {
- if (mSmartSelectionActive) {
+ if (mMultiSelection) {
mClassifier.logEvent(logTag, LOG_EVENT_MULTI_SELECTION_ACTION);
+ } else if (mClassifierSelection) {
+ mClassifier.logEvent(logTag, LOG_EVENT_SINGLE_SELECTION_ACTION);
}
}
@@ -285,16 +300,21 @@
*/
public boolean resetSelection(int textIndex, Editor editor, String logTag) {
final CharSequence text = editor.getTextView().getText();
- if (mSmartSelectionActive
+ if (mMultiSelection
&& textIndex >= mSelectionStart && textIndex <= mSelectionEnd
&& text instanceof Spannable) {
// Only allow a reset once.
- mSmartSelectionActive = false;
+ resetSelectionFlags();
mClassifier.logEvent(logTag, LOG_EVENT_MULTI_SELECTION_RESET);
return editor.selectCurrentWord();
}
return false;
}
+
+ private void resetSelectionFlags() {
+ mMultiSelection = false;
+ mClassifierSelection = false;
+ }
}
/**
@@ -321,6 +341,7 @@
@NonNull TextView textView, int timeOut,
@NonNull Supplier<SelectionResult> selectionResultSupplier,
@NonNull Consumer<SelectionResult> selectionResultCallback) {
+ super(textView != null ? textView.getHandler() : null);
mTextView = Preconditions.checkNotNull(textView);
mTimeOutDuration = timeOut;
mSelectionResultSupplier = Preconditions.checkNotNull(selectionResultSupplier);
@@ -372,7 +393,8 @@
/** End index relative to mText. */
private int mSelectionEnd;
private LocaleList mLocales;
- private String mClassifierTag = "";
+ /** A tag for the classifier that returned the latest smart selection. */
+ private String mSelectionTag = "";
/** Trimmed text starting from mTrimStart in mText. */
private CharSequence mTrimmedText;
@@ -392,12 +414,13 @@
TextClassificationHelper(TextClassifier textClassifier,
CharSequence text, int selectionStart, int selectionEnd, LocaleList locales) {
- reset(textClassifier, text, selectionStart, selectionEnd, locales);
+ reset(textClassifier, text, selectionStart, selectionEnd, true, locales);
}
@UiThread
public void reset(TextClassifier textClassifier,
- CharSequence text, int selectionStart, int selectionEnd, LocaleList locales) {
+ CharSequence text, int selectionStart, int selectionEnd,
+ boolean resetSelectionTag, LocaleList locales) {
mTextClassifier = Preconditions.checkNotNull(textClassifier);
mText = Preconditions.checkNotNull(text).toString();
mLastClassificationText = null; // invalidate.
@@ -405,6 +428,9 @@
mSelectionStart = selectionStart;
mSelectionEnd = selectionEnd;
mLocales = locales;
+ if (resetSelectionTag) {
+ mSelectionTag = "";
+ }
}
@WorkerThread
@@ -437,12 +463,12 @@
mTrimmedText, mRelativeStart, mRelativeEnd, mLocales);
mSelectionStart = Math.max(0, sel.getSelectionStartIndex() + mTrimStart);
mSelectionEnd = Math.min(mText.length(), sel.getSelectionEndIndex() + mTrimStart);
- mClassifierTag = sel.getSourceClassifier();
+ mSelectionTag = sel.getSourceClassifier();
return classifyText();
}
- String getClassifierTag() {
- return mClassifierTag;
+ String getSelectionTag() {
+ return mSelectionTag;
}
private void trimText() {
diff --git a/core/java/android/widget/TextView.java b/core/java/android/widget/TextView.java
index 8542bec0..de56092 100644
--- a/core/java/android/widget/TextView.java
+++ b/core/java/android/widget/TextView.java
@@ -746,17 +746,17 @@
// Default value for the step size in pixels.
private static final int DEFAULT_AUTO_SIZE_GRANULARITY_IN_PX = 1;
// Use this to specify that any of the auto-size configuration int values have not been set.
- private static final int UNSET_AUTO_SIZE_UNIFORM_CONFIGURATION_VALUE = -1;
+ private static final float UNSET_AUTO_SIZE_UNIFORM_CONFIGURATION_VALUE = -1f;
// Auto-size text type.
private int mAutoSizeTextType = AUTO_SIZE_TEXT_TYPE_NONE;
// Specify if auto-size text is needed.
private boolean mNeedsAutoSizeText = false;
// Step size for auto-sizing in pixels.
- private int mAutoSizeStepGranularityInPx = UNSET_AUTO_SIZE_UNIFORM_CONFIGURATION_VALUE;
+ private float mAutoSizeStepGranularityInPx = UNSET_AUTO_SIZE_UNIFORM_CONFIGURATION_VALUE;
// Minimum text size for auto-sizing in pixels.
- private int mAutoSizeMinTextSizeInPx = UNSET_AUTO_SIZE_UNIFORM_CONFIGURATION_VALUE;
+ private float mAutoSizeMinTextSizeInPx = UNSET_AUTO_SIZE_UNIFORM_CONFIGURATION_VALUE;
// Maximum text size for auto-sizing in pixels.
- private int mAutoSizeMaxTextSizeInPx = UNSET_AUTO_SIZE_UNIFORM_CONFIGURATION_VALUE;
+ private float mAutoSizeMaxTextSizeInPx = UNSET_AUTO_SIZE_UNIFORM_CONFIGURATION_VALUE;
// Contains a (specified or computed) distinct sorted set of text sizes in pixels to pick from
// when auto-sizing text.
private int[] mAutoSizeTextSizesInPx = EmptyArray.INT;
@@ -987,9 +987,9 @@
CharSequence text = "";
CharSequence hint = null;
boolean password = false;
- int autoSizeMinTextSizeInPx = UNSET_AUTO_SIZE_UNIFORM_CONFIGURATION_VALUE;
- int autoSizeMaxTextSizeInPx = UNSET_AUTO_SIZE_UNIFORM_CONFIGURATION_VALUE;
- int autoSizeStepGranularityInPx = UNSET_AUTO_SIZE_UNIFORM_CONFIGURATION_VALUE;
+ float autoSizeMinTextSizeInPx = UNSET_AUTO_SIZE_UNIFORM_CONFIGURATION_VALUE;
+ float autoSizeMaxTextSizeInPx = UNSET_AUTO_SIZE_UNIFORM_CONFIGURATION_VALUE;
+ float autoSizeStepGranularityInPx = UNSET_AUTO_SIZE_UNIFORM_CONFIGURATION_VALUE;
int inputType = EditorInfo.TYPE_NULL;
a = theme.obtainStyledAttributes(
attrs, com.android.internal.R.styleable.TextView, defStyleAttr, defStyleRes);
@@ -1363,17 +1363,17 @@
break;
case com.android.internal.R.styleable.TextView_autoSizeStepGranularity:
- autoSizeStepGranularityInPx = a.getDimensionPixelSize(attr,
+ autoSizeStepGranularityInPx = a.getDimension(attr,
UNSET_AUTO_SIZE_UNIFORM_CONFIGURATION_VALUE);
break;
case com.android.internal.R.styleable.TextView_autoSizeMinTextSize:
- autoSizeMinTextSizeInPx = a.getDimensionPixelSize(attr,
+ autoSizeMinTextSizeInPx = a.getDimension(attr,
UNSET_AUTO_SIZE_UNIFORM_CONFIGURATION_VALUE);
break;
case com.android.internal.R.styleable.TextView_autoSizeMaxTextSize:
- autoSizeMaxTextSizeInPx = a.getDimensionPixelSize(attr,
+ autoSizeMaxTextSizeInPx = a.getDimension(attr,
UNSET_AUTO_SIZE_UNIFORM_CONFIGURATION_VALUE);
break;
@@ -1653,6 +1653,7 @@
? (val.data == 0 ? NOT_FOCUSABLE : FOCUSABLE)
: val.data;
}
+ break;
case com.android.internal.R.styleable.View_clickable:
clickable = a.getBoolean(attr, clickable);
@@ -1691,14 +1692,14 @@
final DisplayMetrics displayMetrics = getResources().getDisplayMetrics();
if (autoSizeMinTextSizeInPx == UNSET_AUTO_SIZE_UNIFORM_CONFIGURATION_VALUE) {
- autoSizeMinTextSizeInPx = (int) TypedValue.applyDimension(
+ autoSizeMinTextSizeInPx = TypedValue.applyDimension(
TypedValue.COMPLEX_UNIT_SP,
DEFAULT_AUTO_SIZE_MIN_TEXT_SIZE_IN_SP,
displayMetrics);
}
if (autoSizeMaxTextSizeInPx == UNSET_AUTO_SIZE_UNIFORM_CONFIGURATION_VALUE) {
- autoSizeMaxTextSizeInPx = (int) TypedValue.applyDimension(
+ autoSizeMaxTextSizeInPx = TypedValue.applyDimension(
TypedValue.COMPLEX_UNIT_SP,
DEFAULT_AUTO_SIZE_MAX_TEXT_SIZE_IN_SP,
displayMetrics);
@@ -1743,11 +1744,11 @@
break;
case AUTO_SIZE_TEXT_TYPE_UNIFORM:
final DisplayMetrics displayMetrics = getResources().getDisplayMetrics();
- final int autoSizeMinTextSizeInPx = (int) TypedValue.applyDimension(
+ final float autoSizeMinTextSizeInPx = TypedValue.applyDimension(
TypedValue.COMPLEX_UNIT_SP,
DEFAULT_AUTO_SIZE_MIN_TEXT_SIZE_IN_SP,
displayMetrics);
- final int autoSizeMaxTextSizeInPx = (int) TypedValue.applyDimension(
+ final float autoSizeMaxTextSizeInPx = TypedValue.applyDimension(
TypedValue.COMPLEX_UNIT_SP,
DEFAULT_AUTO_SIZE_MAX_TEXT_SIZE_IN_SP,
displayMetrics);
@@ -1796,11 +1797,11 @@
int autoSizeMaxTextSize, int autoSizeStepGranularity, int unit) {
if (supportsAutoSizeText()) {
final DisplayMetrics displayMetrics = getResources().getDisplayMetrics();
- final int autoSizeMinTextSizeInPx = (int) TypedValue.applyDimension(
+ final float autoSizeMinTextSizeInPx = TypedValue.applyDimension(
unit, autoSizeMinTextSize, displayMetrics);
- final int autoSizeMaxTextSizeInPx = (int) TypedValue.applyDimension(
+ final float autoSizeMaxTextSizeInPx = TypedValue.applyDimension(
unit, autoSizeMaxTextSize, displayMetrics);
- final int autoSizeStepGranularityInPx = (int) TypedValue.applyDimension(
+ final float autoSizeStepGranularityInPx = TypedValue.applyDimension(
unit, autoSizeStepGranularity, displayMetrics);
validateAndSetAutoSizeTextTypeUniformConfiguration(autoSizeMinTextSizeInPx,
@@ -1842,8 +1843,8 @@
final DisplayMetrics displayMetrics = getResources().getDisplayMetrics();
// Convert all to sizes to pixels.
for (int i = 0; i < presetSizesLength; i++) {
- presetSizesInPx[i] = (int) TypedValue.applyDimension(unit, presetSizes[i],
- displayMetrics);
+ presetSizesInPx[i] = Math.round(TypedValue.applyDimension(unit,
+ presetSizes[i], displayMetrics));
}
}
@@ -1885,7 +1886,7 @@
* @see #setAutoSizeTextTypeUniformWithConfiguration(int, int, int, int)
*/
public int getAutoSizeStepGranularity() {
- return mAutoSizeStepGranularityInPx;
+ return Math.round(mAutoSizeStepGranularityInPx);
}
/**
@@ -1898,7 +1899,7 @@
* @see #setAutoSizeTextTypeUniformWithPresetSizes(int[], int)
*/
public int getAutoSizeMinTextSize() {
- return mAutoSizeMinTextSizeInPx;
+ return Math.round(mAutoSizeMinTextSizeInPx);
}
/**
@@ -1911,7 +1912,7 @@
* @see #setAutoSizeTextTypeUniformWithPresetSizes(int[], int)
*/
public int getAutoSizeMaxTextSize() {
- return mAutoSizeMaxTextSizeInPx;
+ return Math.round(mAutoSizeMaxTextSizeInPx);
}
/**
@@ -1954,8 +1955,8 @@
*
* @throws IllegalArgumentException if any of the params are invalid
*/
- private void validateAndSetAutoSizeTextTypeUniformConfiguration(int autoSizeMinTextSizeInPx,
- int autoSizeMaxTextSizeInPx, int autoSizeStepGranularityInPx) {
+ private void validateAndSetAutoSizeTextTypeUniformConfiguration(float autoSizeMinTextSizeInPx,
+ float autoSizeMaxTextSizeInPx, float autoSizeStepGranularityInPx) {
// First validate.
if (autoSizeMinTextSizeInPx <= 0) {
throw new IllegalArgumentException("Minimum auto-size text size ("
@@ -2021,18 +2022,19 @@
// Calculate sizes to choose from based on the current auto-size configuration.
int autoSizeValuesLength = (int) Math.ceil(
(mAutoSizeMaxTextSizeInPx - mAutoSizeMinTextSizeInPx)
- / (float) mAutoSizeStepGranularityInPx);
+ / mAutoSizeStepGranularityInPx);
// Also reserve a slot for the max size if it fits.
if ((mAutoSizeMaxTextSizeInPx - mAutoSizeMinTextSizeInPx)
% mAutoSizeStepGranularityInPx == 0) {
autoSizeValuesLength++;
}
- mAutoSizeTextSizesInPx = new int[autoSizeValuesLength];
- int sizeToAdd = mAutoSizeMinTextSizeInPx;
+ int[] autoSizeTextSizesInPx = new int[autoSizeValuesLength];
+ float sizeToAdd = mAutoSizeMinTextSizeInPx;
for (int i = 0; i < autoSizeValuesLength; i++) {
- mAutoSizeTextSizesInPx[i] = sizeToAdd;
+ autoSizeTextSizesInPx[i] = Math.round(sizeToAdd);
sizeToAdd += mAutoSizeStepGranularityInPx;
}
+ mAutoSizeTextSizesInPx = cleanupAutoSizePresetSizes(autoSizeTextSizesInPx);
}
mNeedsAutoSizeText = true;
@@ -8255,6 +8257,7 @@
* Automatically computes and sets the text size.
*/
private void autoSizeText() {
+ if (getMeasuredWidth() <= 0 || getMeasuredHeight() <= 0) return;
final int maxWidth = getWidth() - getTotalPaddingLeft() - getTotalPaddingRight();
final int maxHeight = getHeight() - getExtendedPaddingBottom() - getExtendedPaddingTop();
diff --git a/core/java/android/widget/TimePickerClockDelegate.java b/core/java/android/widget/TimePickerClockDelegate.java
index 05d0f96..d3c83ee 100644
--- a/core/java/android/widget/TimePickerClockDelegate.java
+++ b/core/java/android/widget/TimePickerClockDelegate.java
@@ -137,6 +137,7 @@
final int layoutResourceId = a.getResourceId(R.styleable.TimePicker_internalLayout,
R.layout.time_picker_material);
final View mainView = inflater.inflate(layoutResourceId, delegator);
+ mainView.setSaveFromParentEnabled(false);
mRadialTimePickerHeader = mainView.findViewById(R.id.time_header);
mRadialTimePickerHeader.setOnTouchListener(new NearestTouchDelegate());
diff --git a/core/java/android/widget/TimePickerSpinnerDelegate.java b/core/java/android/widget/TimePickerSpinnerDelegate.java
index 813c30e3..7a7d9a9 100644
--- a/core/java/android/widget/TimePickerSpinnerDelegate.java
+++ b/core/java/android/widget/TimePickerSpinnerDelegate.java
@@ -83,7 +83,8 @@
a.recycle();
final LayoutInflater inflater = LayoutInflater.from(mContext);
- inflater.inflate(layoutResourceId, mDelegator, true);
+ final View view = inflater.inflate(layoutResourceId, mDelegator, true);
+ view.setSaveFromParentEnabled(false);
// hour
mHourSpinner = delegator.findViewById(R.id.hour);
diff --git a/core/java/com/android/internal/app/IBatteryStats.aidl b/core/java/com/android/internal/app/IBatteryStats.aidl
index 78566df..04f7c76 100644
--- a/core/java/com/android/internal/app/IBatteryStats.aidl
+++ b/core/java/com/android/internal/app/IBatteryStats.aidl
@@ -129,7 +129,7 @@
long getAwakeTimeBattery();
long getAwakeTimePlugged();
- void noteBleScanStarted(in WorkSource ws);
+ void noteBleScanStarted(in WorkSource ws, boolean isUnoptimized);
void noteBleScanStopped(in WorkSource ws);
void noteResetBleScan();
void noteBleScanResults(in WorkSource ws, int numNewResults);
diff --git a/core/java/com/android/internal/app/ResolverListController.java b/core/java/com/android/internal/app/ResolverListController.java
index ee5f6fd..5ab17e44 100644
--- a/core/java/com/android/internal/app/ResolverListController.java
+++ b/core/java/com/android/internal/app/ResolverListController.java
@@ -99,6 +99,14 @@
| (shouldGetResolvedFilter ? PackageManager.GET_RESOLVED_FILTER : 0)
| (shouldGetActivityMetadata ? PackageManager.GET_META_DATA : 0)
| PackageManager.MATCH_INSTANT);
+ // Remove any activities that are not exported.
+ int totalSize = infos.size();
+ for (int j = totalSize - 1; j >= 0 ; j--) {
+ ResolveInfo info = infos.get(j);
+ if (info.activityInfo != null && !info.activityInfo.exported) {
+ infos.remove(j);
+ }
+ }
if (infos != null) {
if (resolvedComponents == null) {
resolvedComponents = new ArrayList<>();
diff --git a/core/java/com/android/internal/notification/SystemNotificationChannels.java b/core/java/com/android/internal/notification/SystemNotificationChannels.java
index d279746..797cf2b 100644
--- a/core/java/com/android/internal/notification/SystemNotificationChannels.java
+++ b/core/java/com/android/internal/notification/SystemNotificationChannels.java
@@ -47,7 +47,6 @@
public static String RETAIL_MODE = "RETAIL_MODE";
public static String USB = "USB";
public static String FOREGROUND_SERVICE = "FOREGROUND_SERVICE";
- public static String ALERT_WINDOW = "ALERT_WINDOW";
public static void createAll(Context context) {
final NotificationManager nm = context.getSystemService(NotificationManager.class);
@@ -138,11 +137,6 @@
context.getString(R.string.notification_channel_foreground_service),
NotificationManager.IMPORTANCE_MIN));
- channelsList.add(new NotificationChannel(
- ALERT_WINDOW,
- context.getString(R.string.alert_windows_notification_channel_name),
- NotificationManager.IMPORTANCE_MIN));
-
nm.createNotificationChannels(channelsList);
}
diff --git a/core/java/com/android/internal/os/BatteryStatsImpl.java b/core/java/com/android/internal/os/BatteryStatsImpl.java
index 25d5fae..1b0d332 100644
--- a/core/java/com/android/internal/os/BatteryStatsImpl.java
+++ b/core/java/com/android/internal/os/BatteryStatsImpl.java
@@ -56,6 +56,7 @@
import android.util.LongSparseArray;
import android.util.LongSparseLongArray;
import android.util.MutableInt;
+import android.util.Pools;
import android.util.PrintWriterPrinter;
import android.util.Printer;
import android.util.Slog;
@@ -66,6 +67,7 @@
import android.util.Xml;
import android.view.Display;
+import com.android.internal.annotations.GuardedBy;
import com.android.internal.annotations.VisibleForTesting;
import com.android.internal.net.NetworkStatsFactory;
import com.android.internal.util.ArrayUtils;
@@ -116,7 +118,7 @@
private static final int MAGIC = 0xBA757475; // 'BATSTATS'
// Current on-disk Parcel version
- private static final int VERSION = 157 + (USE_OLD_HISTORY ? 1000 : 0);
+ private static final int VERSION = 159 + (USE_OLD_HISTORY ? 1000 : 0);
// Maximum number of items we will record in the history.
private static final int MAX_HISTORY_ITEMS = 2000;
@@ -173,7 +175,6 @@
private final PlatformIdleStateCallback mPlatformIdleStateCallback;
-
final class MyHandler extends Handler {
public MyHandler(Looper looper) {
super(looper, null, true);
@@ -185,7 +186,7 @@
switch (msg.what) {
case MSG_UPDATE_WAKELOCKS:
synchronized (BatteryStatsImpl.this) {
- updateCpuTimeLocked();
+ updateCpuTimeLocked(false /* updateCpuFreqData */);
}
if (cb != null) {
cb.batteryNeedsCpuUpdate();
@@ -228,11 +229,11 @@
}
public interface ExternalStatsSync {
- public static final int UPDATE_CPU = 0x01;
- public static final int UPDATE_WIFI = 0x02;
- public static final int UPDATE_RADIO = 0x04;
- public static final int UPDATE_BT = 0x08;
- public static final int UPDATE_ALL = UPDATE_CPU | UPDATE_WIFI | UPDATE_RADIO | UPDATE_BT;
+ int UPDATE_CPU = 0x01;
+ int UPDATE_WIFI = 0x02;
+ int UPDATE_RADIO = 0x04;
+ int UPDATE_BT = 0x08;
+ int UPDATE_ALL = UPDATE_CPU | UPDATE_WIFI | UPDATE_RADIO | UPDATE_BT;
void scheduleSync(String reason, int flags);
void scheduleCpuSyncDueToRemovedUid(int uid);
@@ -572,8 +573,6 @@
private int mMinLearnedBatteryCapacity = -1;
private int mMaxLearnedBatteryCapacity = -1;
- private final NetworkStats.Entry mTmpNetworkStatsEntry = new NetworkStats.Entry();
-
private long[] mCpuFreqs;
private PowerProfile mPowerProfile;
@@ -637,19 +636,9 @@
private void init(Clocks clocks) {
mClocks = clocks;
- mMobileNetworkStats = new NetworkStats[] {
- new NetworkStats(mClocks.elapsedRealtime(), 50),
- new NetworkStats(mClocks.elapsedRealtime(), 50),
- new NetworkStats(mClocks.elapsedRealtime(), 50)
- };
- mWifiNetworkStats = new NetworkStats[] {
- new NetworkStats(mClocks.elapsedRealtime(), 50),
- new NetworkStats(mClocks.elapsedRealtime(), 50),
- new NetworkStats(mClocks.elapsedRealtime(), 50)
- };
}
- public static interface TimeBaseObs {
+ public interface TimeBaseObs {
void onTimeStarted(long elapsedRealtime, long baseUptime, long baseRealtime);
void onTimeStopped(long elapsedRealtime, long baseUptime, long baseRealtime);
}
@@ -862,21 +851,19 @@
final AtomicInteger mCount = new AtomicInteger();
final TimeBase mTimeBase;
int mLoadedCount;
- int mLastCount;
int mUnpluggedCount;
int mPluggedCount;
- Counter(TimeBase timeBase, Parcel in) {
+ public Counter(TimeBase timeBase, Parcel in) {
mTimeBase = timeBase;
mPluggedCount = in.readInt();
mCount.set(mPluggedCount);
mLoadedCount = in.readInt();
- mLastCount = 0;
mUnpluggedCount = in.readInt();
timeBase.add(this);
}
- Counter(TimeBase timeBase) {
+ public Counter(TimeBase timeBase) {
mTimeBase = timeBase;
timeBase.add(this);
}
@@ -887,11 +874,12 @@
out.writeInt(mUnpluggedCount);
}
+ @Override
public void onTimeStarted(long elapsedRealtime, long baseUptime, long baseRealtime) {
mUnpluggedCount = mPluggedCount;
- mCount.set(mPluggedCount);
}
+ @Override
public void onTimeStopped(long elapsedRealtime, long baseUptime, long baseRealtime) {
mPluggedCount = mCount.get();
}
@@ -926,17 +914,22 @@
public void logState(Printer pw, String prefix) {
pw.println(prefix + "mCount=" + mCount.get()
- + " mLoadedCount=" + mLoadedCount + " mLastCount=" + mLastCount
+ + " mLoadedCount=" + mLoadedCount
+ " mUnpluggedCount=" + mUnpluggedCount
+ " mPluggedCount=" + mPluggedCount);
}
- void stepAtomic() {
- mCount.incrementAndGet();
+ @VisibleForTesting(visibility = VisibleForTesting.Visibility.PACKAGE)
+ public void stepAtomic() {
+ if (mTimeBase.isRunning()) {
+ mCount.incrementAndGet();
+ }
}
void addAtomic(int delta) {
- mCount.addAndGet(delta);
+ if (mTimeBase.isRunning()) {
+ mCount.addAndGet(delta);
+ }
}
/**
@@ -944,7 +937,7 @@
*/
void reset(boolean detachIfReset) {
mCount.set(0);
- mLoadedCount = mLastCount = mPluggedCount = mUnpluggedCount = 0;
+ mLoadedCount = mPluggedCount = mUnpluggedCount = 0;
if (detachIfReset) {
detach();
}
@@ -954,15 +947,16 @@
mTimeBase.remove(this);
}
- void writeSummaryFromParcelLocked(Parcel out) {
+ @VisibleForTesting(visibility = VisibleForTesting.Visibility.PACKAGE)
+ public void writeSummaryFromParcelLocked(Parcel out) {
int count = mCount.get();
out.writeInt(count);
}
- void readSummaryFromParcelLocked(Parcel in) {
+ @VisibleForTesting(visibility = VisibleForTesting.Visibility.PACKAGE)
+ public void readSummaryFromParcelLocked(Parcel in) {
mLoadedCount = in.readInt();
mCount.set(mLoadedCount);
- mLastCount = 0;
mUnpluggedCount = mPluggedCount = mLoadedCount;
}
}
@@ -998,7 +992,6 @@
@Override
public void onTimeStarted(long elapsedRealTime, long baseUptime, long baseRealtime) {
mUnpluggedCounts = copyArray(mPluggedCounts, mUnpluggedCounts);
- mCounts = copyArray(mPluggedCounts, mCounts);
}
@Override
@@ -1029,11 +1022,13 @@
if (counts == null) {
return;
}
- if (mCounts == null) {
- mCounts = new long[counts.length];
- }
- for (int i = 0; i < counts.length; ++i) {
- mCounts[i] += counts[i];
+ if (mTimeBase.isRunning()) {
+ if (mCounts == null) {
+ mCounts = new long[counts.length];
+ }
+ for (int i = 0; i < counts.length; ++i) {
+ mCounts[i] += counts[i];
+ }
}
}
@@ -1104,13 +1099,13 @@
}
}
- private void fillArray(long[] a, long val) {
+ private static void fillArray(long[] a, long val) {
if (a != null) {
Arrays.fill(a, val);
}
}
- private void subtract(@NonNull long[] val, long[] toSubtract) {
+ private static void subtract(@NonNull long[] val, long[] toSubtract) {
if (toSubtract == null) {
return;
}
@@ -1119,7 +1114,7 @@
}
}
- private long[] copyArray(long[] src, long[] dest) {
+ private static long[] copyArray(long[] src, long[] dest) {
if (src == null) {
return null;
} else {
@@ -1162,7 +1157,6 @@
@Override
public void onTimeStarted(long elapsedRealtime, long baseUptime, long baseRealtime) {
mUnpluggedCount = mPluggedCount;
- mCount = mPluggedCount;
}
@Override
@@ -1189,7 +1183,9 @@
}
void addCountLocked(long count) {
- mCount += count;
+ if (mTimeBase.isRunning()) {
+ mCount += count;
+ }
}
/**
@@ -3467,8 +3463,8 @@
boolean batteryStatusChanged = mOnBatteryTimeBase.setRunning(unplugged, uptime, realtime);
if (batteryStatusChanged) {
- for (int i=0; i<mUidStats.size(); i++) {
- mUidStats.valueAt(i).updateBgTimeBase(uptime, realtime);
+ for (int i = 0; i < mUidStats.size(); i++) {
+ mUidStats.valueAt(i).updateOnBatteryBgTimeBase(uptime, realtime);
}
}
@@ -3480,8 +3476,11 @@
Slog.d(TAG, "Updating cpu time because screen is now " +
(unpluggedScreenOff ? "off" : "on"));
}
- updateCpuTimeLocked();
+ updateCpuTimeLocked(true /* updateCpuFreqData */);
mOnBatteryScreenOffTimeBase.setRunning(unpluggedScreenOff, uptime, realtime);
+ for (int i = 0; i < mUidStats.size(); i++) {
+ mUidStats.valueAt(i).updateOnBatteryScreenOffBgTimeBase(uptime, realtime);
+ }
}
}
@@ -4190,7 +4189,10 @@
getUidStatsLocked(uid).noteMobileRadioApWakeupLocked();
}
- public void noteMobileRadioPowerState(int powerState, long timestampNs, int uid) {
+ /**
+ * Updates the radio power state and returns true if an external stats collection should occur.
+ */
+ public boolean noteMobileRadioPowerStateLocked(int powerState, long timestampNs, int uid) {
final long elapsedRealtime = mClocks.elapsedRealtime();
final long uptime = mClocks.uptimeMillis();
if (mMobileRadioPowerState != powerState) {
@@ -4227,13 +4229,15 @@
mMobileRadioActivePerAppTimer.startRunningLocked(elapsedRealtime);
} else {
mMobileRadioActiveTimer.stopRunningLocked(realElapsedRealtimeMs);
- updateMobileRadioStateLocked(realElapsedRealtimeMs, null);
mMobileRadioActivePerAppTimer.stopRunningLocked(realElapsedRealtimeMs);
+ // Tell the caller to collect radio network/power stats.
+ return true;
}
}
+ return false;
}
- public void notePowerSaveMode(boolean enabled) {
+ public void notePowerSaveModeLocked(boolean enabled) {
if (mPowerSaveModeEnabled != enabled) {
int stepState = enabled ? STEP_LEVEL_MODE_POWER_SAVE : 0;
mModStepMode |= (mCurStepMode&STEP_LEVEL_MODE_POWER_SAVE) ^ stepState;
@@ -4818,7 +4822,7 @@
}
}
- private void noteBluetoothScanStartedLocked(int uid) {
+ private void noteBluetoothScanStartedLocked(int uid, boolean isUnoptimized) {
uid = mapUid(uid);
final long elapsedRealtime = mClocks.elapsedRealtime();
final long uptime = mClocks.uptimeMillis();
@@ -4830,13 +4834,13 @@
mBluetoothScanTimer.startRunningLocked(elapsedRealtime);
}
mBluetoothScanNesting++;
- getUidStatsLocked(uid).noteBluetoothScanStartedLocked(elapsedRealtime);
+ getUidStatsLocked(uid).noteBluetoothScanStartedLocked(elapsedRealtime, isUnoptimized);
}
- public void noteBluetoothScanStartedFromSourceLocked(WorkSource ws) {
+ public void noteBluetoothScanStartedFromSourceLocked(WorkSource ws, boolean isUnoptimized) {
final int N = ws.size();
for (int i = 0; i < N; i++) {
- noteBluetoothScanStartedLocked(ws.get(i));
+ noteBluetoothScanStartedLocked(ws.get(i), isUnoptimized);
}
}
@@ -5233,28 +5237,26 @@
public void noteNetworkInterfaceTypeLocked(String iface, int networkType) {
if (TextUtils.isEmpty(iface)) return;
- if (ConnectivityManager.isNetworkTypeMobile(networkType)) {
- mMobileIfaces = includeInStringArray(mMobileIfaces, iface);
- if (DEBUG) Slog.d(TAG, "Note mobile iface " + iface + ": " + mMobileIfaces);
- } else {
- mMobileIfaces = excludeFromStringArray(mMobileIfaces, iface);
- if (DEBUG) Slog.d(TAG, "Note non-mobile iface " + iface + ": " + mMobileIfaces);
- }
- if (ConnectivityManager.isNetworkTypeWifi(networkType)) {
- mWifiIfaces = includeInStringArray(mWifiIfaces, iface);
- if (DEBUG) Slog.d(TAG, "Note wifi iface " + iface + ": " + mWifiIfaces);
- } else {
- mWifiIfaces = excludeFromStringArray(mWifiIfaces, iface);
- if (DEBUG) Slog.d(TAG, "Note non-wifi iface " + iface + ": " + mWifiIfaces);
- }
- }
- public void noteNetworkStatsEnabledLocked() {
- // During device boot, qtaguid isn't enabled until after the inital
- // loading of battery stats. Now that they're enabled, take our initial
- // snapshot for future delta calculation.
- updateMobileRadioStateLocked(mClocks.elapsedRealtime(), null);
- updateWifiStateLocked(null);
+ synchronized (mModemNetworkLock) {
+ if (ConnectivityManager.isNetworkTypeMobile(networkType)) {
+ mModemIfaces = includeInStringArray(mModemIfaces, iface);
+ if (DEBUG) Slog.d(TAG, "Note mobile iface " + iface + ": " + mModemIfaces);
+ } else {
+ mModemIfaces = excludeFromStringArray(mModemIfaces, iface);
+ if (DEBUG) Slog.d(TAG, "Note non-mobile iface " + iface + ": " + mModemIfaces);
+ }
+ }
+
+ synchronized (mWifiNetworkLock) {
+ if (ConnectivityManager.isNetworkTypeWifi(networkType)) {
+ mWifiIfaces = includeInStringArray(mWifiIfaces, iface);
+ if (DEBUG) Slog.d(TAG, "Note wifi iface " + iface + ": " + mWifiIfaces);
+ } else {
+ mWifiIfaces = excludeFromStringArray(mWifiIfaces, iface);
+ if (DEBUG) Slog.d(TAG, "Note non-wifi iface " + iface + ": " + mWifiIfaces);
+ }
+ }
}
@Override public long getScreenOnTime(long elapsedRealtimeUs, int which) {
@@ -5581,6 +5583,8 @@
/** TimeBase for when uid is in background and device is on battery. */
@VisibleForTesting(visibility = VisibleForTesting.Visibility.PACKAGE)
public final TimeBase mOnBatteryBackgroundTimeBase;
+ @VisibleForTesting(visibility = VisibleForTesting.Visibility.PACKAGE)
+ public final TimeBase mOnBatteryScreenOffBackgroundTimeBase;
boolean mWifiRunning;
StopwatchTimer mWifiRunningTimer;
@@ -5603,8 +5607,12 @@
StopwatchTimer mFlashlightTurnedOnTimer;
StopwatchTimer mCameraTurnedOnTimer;
StopwatchTimer mForegroundActivityTimer;
+ /** Total time spent by the uid holding any partial wakelocks. */
+ DualTimer mAggregatedPartialWakelockTimer;
DualTimer mBluetoothScanTimer;
+ DualTimer mBluetoothUnoptimizedScanTimer;
Counter mBluetoothScanResultCounter;
+ Counter mBluetoothScanResultBgCounter;
int mProcessState = ActivityManager.PROCESS_STATE_NONEXISTENT;
StopwatchTimer[] mProcessStateTimer;
@@ -5704,6 +5712,10 @@
mOnBatteryBackgroundTimeBase.init(mBsi.mClocks.uptimeMillis() * 1000,
mBsi.mClocks.elapsedRealtime() * 1000);
+ mOnBatteryScreenOffBackgroundTimeBase = new TimeBase();
+ mOnBatteryScreenOffBackgroundTimeBase.init(mBsi.mClocks.uptimeMillis() * 1000,
+ mBsi.mClocks.elapsedRealtime() * 1000);
+
mUserCpuTime = new LongSamplingCounter(mBsi.mOnBatteryTimeBase);
mSystemCpuTime = new LongSamplingCounter(mBsi.mOnBatteryTimeBase);
@@ -5774,6 +5786,11 @@
}
@Override
+ public Timer getAggregatedPartialWakelockTimer() {
+ return mAggregatedPartialWakelockTimer;
+ }
+
+ @Override
public ArrayMap<String, ? extends BatteryStats.Uid.Wakelock> getWakelockStats() {
return mWakelockStats.getMap();
}
@@ -6062,6 +6079,15 @@
return mForegroundActivityTimer;
}
+ public DualTimer createAggregatedPartialWakelockTimerLocked() {
+ if (mAggregatedPartialWakelockTimer == null) {
+ mAggregatedPartialWakelockTimer = new DualTimer(mBsi.mClocks, this,
+ AGGREGATED_WAKE_TYPE_PARTIAL, null,
+ mBsi.mOnBatteryScreenOffTimeBase, mOnBatteryScreenOffBackgroundTimeBase);
+ }
+ return mAggregatedPartialWakelockTimer;
+ }
+
public DualTimer createBluetoothScanTimerLocked() {
if (mBluetoothScanTimer == null) {
mBluetoothScanTimer = new DualTimer(mBsi.mClocks, Uid.this, BLUETOOTH_SCAN_ON,
@@ -6071,20 +6097,41 @@
return mBluetoothScanTimer;
}
- public void noteBluetoothScanStartedLocked(long elapsedRealtimeMs) {
+ public DualTimer createBluetoothUnoptimizedScanTimerLocked() {
+ if (mBluetoothUnoptimizedScanTimer == null) {
+ mBluetoothUnoptimizedScanTimer = new DualTimer(mBsi.mClocks, Uid.this,
+ BLUETOOTH_UNOPTIMIZED_SCAN_ON, null,
+ mBsi.mOnBatteryTimeBase, mOnBatteryBackgroundTimeBase);
+ }
+ return mBluetoothUnoptimizedScanTimer;
+ }
+
+ public void noteBluetoothScanStartedLocked(long elapsedRealtimeMs, boolean isUnoptimized) {
createBluetoothScanTimerLocked().startRunningLocked(elapsedRealtimeMs);
+ if (isUnoptimized) {
+ createBluetoothUnoptimizedScanTimerLocked().startRunningLocked(elapsedRealtimeMs);
+ }
}
public void noteBluetoothScanStoppedLocked(long elapsedRealtimeMs) {
if (mBluetoothScanTimer != null) {
mBluetoothScanTimer.stopRunningLocked(elapsedRealtimeMs);
}
+ // In the ble code, a scan cannot change types and nested starts are not possible.
+ // So if an unoptimizedScan is running, it is now being stopped.
+ if (mBluetoothUnoptimizedScanTimer != null
+ && mBluetoothUnoptimizedScanTimer.isRunningLocked()) {
+ mBluetoothUnoptimizedScanTimer.stopRunningLocked(elapsedRealtimeMs);
+ }
}
public void noteResetBluetoothScanLocked(long elapsedRealtimeMs) {
if (mBluetoothScanTimer != null) {
mBluetoothScanTimer.stopAllRunningLocked(elapsedRealtimeMs);
}
+ if (mBluetoothUnoptimizedScanTimer != null) {
+ mBluetoothUnoptimizedScanTimer.stopAllRunningLocked(elapsedRealtimeMs);
+ }
}
public Counter createBluetoothScanResultCounterLocked() {
@@ -6094,8 +6141,17 @@
return mBluetoothScanResultCounter;
}
+ public Counter createBluetoothScanResultBgCounterLocked() {
+ if (mBluetoothScanResultBgCounter == null) {
+ mBluetoothScanResultBgCounter = new Counter(mOnBatteryBackgroundTimeBase);
+ }
+ return mBluetoothScanResultBgCounter;
+ }
+
public void noteBluetoothScanResultsLocked(int numNewResults) {
createBluetoothScanResultCounterLocked().addAtomic(numNewResults);
+ // Uses background timebase, so the count will only be incremented if uid in background.
+ createBluetoothScanResultBgCounterLocked().addAtomic(numNewResults);
}
@Override
@@ -6252,10 +6308,28 @@
}
@Override
+ public Timer getBluetoothUnoptimizedScanTimer() {
+ return mBluetoothUnoptimizedScanTimer;
+ }
+
+ @Override
+ public Timer getBluetoothUnoptimizedScanBackgroundTimer() {
+ if (mBluetoothUnoptimizedScanTimer == null) {
+ return null;
+ }
+ return mBluetoothUnoptimizedScanTimer.getSubTimer();
+ }
+
+ @Override
public Counter getBluetoothScanResultCounter() {
return mBluetoothScanResultCounter;
}
+ @Override
+ public Counter getBluetoothScanResultBgCounter() {
+ return mBluetoothScanResultBgCounter;
+ }
+
void makeProcessState(int i, Parcel in) {
if (i < 0 || i >= NUM_PROCESS_STATE) return;
@@ -6504,10 +6578,15 @@
active |= !resetTimerIfNotNull(mFlashlightTurnedOnTimer, false);
active |= !resetTimerIfNotNull(mCameraTurnedOnTimer, false);
active |= !resetTimerIfNotNull(mForegroundActivityTimer, false);
+ active |= !resetTimerIfNotNull(mAggregatedPartialWakelockTimer, false);
active |= !resetTimerIfNotNull(mBluetoothScanTimer, false);
+ active |= !resetTimerIfNotNull(mBluetoothUnoptimizedScanTimer, false);
if (mBluetoothScanResultCounter != null) {
mBluetoothScanResultCounter.reset(false);
}
+ if (mBluetoothScanResultBgCounter != null) {
+ mBluetoothScanResultBgCounter.reset(false);
+ }
if (mProcessStateTimer != null) {
for (int i = 0; i < NUM_PROCESS_STATE; i++) {
@@ -6656,6 +6735,8 @@
mOnBatteryBackgroundTimeBase.reset(mBsi.mClocks.elapsedRealtime() * 1000,
mBsi.mClocks.uptimeMillis() * 1000);
+ mOnBatteryScreenOffBackgroundTimeBase.reset(mBsi.mClocks.elapsedRealtime() * 1000,
+ mBsi.mClocks.uptimeMillis() * 1000);
if (!active) {
if (mWifiRunningTimer != null) {
@@ -6695,14 +6776,26 @@
mForegroundActivityTimer.detach();
mForegroundActivityTimer = null;
}
+ if (mAggregatedPartialWakelockTimer != null) {
+ mAggregatedPartialWakelockTimer.detach();
+ mAggregatedPartialWakelockTimer = null;
+ }
if (mBluetoothScanTimer != null) {
mBluetoothScanTimer.detach();
mBluetoothScanTimer = null;
}
+ if (mBluetoothUnoptimizedScanTimer != null) {
+ mBluetoothUnoptimizedScanTimer.detach();
+ mBluetoothUnoptimizedScanTimer = null;
+ }
if (mBluetoothScanResultCounter != null) {
mBluetoothScanResultCounter.detach();
mBluetoothScanResultCounter = null;
}
+ if (mBluetoothScanResultBgCounter != null) {
+ mBluetoothScanResultBgCounter.detach();
+ mBluetoothScanResultBgCounter = null;
+ }
if (mUserActivityCounters != null) {
for (int i=0; i<NUM_USER_ACTIVITY_TYPES; i++) {
mUserActivityCounters[i].detach();
@@ -6760,6 +6853,7 @@
void writeToParcelLocked(Parcel out, long uptimeUs, long elapsedRealtimeUs) {
mOnBatteryBackgroundTimeBase.writeToParcel(out, uptimeUs, elapsedRealtimeUs);
+ mOnBatteryScreenOffBackgroundTimeBase.writeToParcel(out, uptimeUs, elapsedRealtimeUs);
final ArrayMap<String, Wakelock> wakeStats = mWakelockStats.getMap();
int NW = wakeStats.size();
@@ -6874,18 +6968,36 @@
} else {
out.writeInt(0);
}
+ if (mAggregatedPartialWakelockTimer != null) {
+ out.writeInt(1);
+ mAggregatedPartialWakelockTimer.writeToParcel(out, elapsedRealtimeUs);
+ } else {
+ out.writeInt(0);
+ }
if (mBluetoothScanTimer != null) {
out.writeInt(1);
mBluetoothScanTimer.writeToParcel(out, elapsedRealtimeUs);
} else {
out.writeInt(0);
}
+ if (mBluetoothUnoptimizedScanTimer != null) {
+ out.writeInt(1);
+ mBluetoothUnoptimizedScanTimer.writeToParcel(out, elapsedRealtimeUs);
+ } else {
+ out.writeInt(0);
+ }
if (mBluetoothScanResultCounter != null) {
out.writeInt(1);
mBluetoothScanResultCounter.writeToParcel(out);
} else {
out.writeInt(0);
}
+ if (mBluetoothScanResultBgCounter != null) {
+ out.writeInt(1);
+ mBluetoothScanResultBgCounter.writeToParcel(out);
+ } else {
+ out.writeInt(0);
+ }
for (int i = 0; i < NUM_PROCESS_STATE; i++) {
if (mProcessStateTimer[i] != null) {
out.writeInt(1);
@@ -6987,13 +7099,15 @@
void readFromParcelLocked(TimeBase timeBase, TimeBase screenOffTimeBase, Parcel in) {
mOnBatteryBackgroundTimeBase.readFromParcel(in);
+ mOnBatteryScreenOffBackgroundTimeBase.readFromParcel(in);
int numWakelocks = in.readInt();
mWakelockStats.clear();
for (int j = 0; j < numWakelocks; j++) {
String wakelockName = in.readString();
Uid.Wakelock wakelock = new Wakelock(mBsi, this);
- wakelock.readFromParcelLocked(timeBase, screenOffTimeBase, in);
+ wakelock.readFromParcelLocked(
+ timeBase, screenOffTimeBase, mOnBatteryScreenOffBackgroundTimeBase, in);
mWakelockStats.add(wakelockName, wakelock);
}
@@ -7113,6 +7227,14 @@
mForegroundActivityTimer = null;
}
if (in.readInt() != 0) {
+ mAggregatedPartialWakelockTimer = new DualTimer(mBsi.mClocks, this,
+ AGGREGATED_WAKE_TYPE_PARTIAL, null,
+ mBsi.mOnBatteryScreenOffTimeBase, mOnBatteryScreenOffBackgroundTimeBase,
+ in);
+ } else {
+ mAggregatedPartialWakelockTimer = null;
+ }
+ if (in.readInt() != 0) {
mBluetoothScanTimer = new DualTimer(mBsi.mClocks, Uid.this, BLUETOOTH_SCAN_ON,
mBsi.mBluetoothScanOnTimers, mBsi.mOnBatteryTimeBase,
mOnBatteryBackgroundTimeBase, in);
@@ -7120,10 +7242,22 @@
mBluetoothScanTimer = null;
}
if (in.readInt() != 0) {
+ mBluetoothUnoptimizedScanTimer = new DualTimer(mBsi.mClocks, Uid.this,
+ BLUETOOTH_UNOPTIMIZED_SCAN_ON, null,
+ mBsi.mOnBatteryTimeBase, mOnBatteryBackgroundTimeBase, in);
+ } else {
+ mBluetoothUnoptimizedScanTimer = null;
+ }
+ if (in.readInt() != 0) {
mBluetoothScanResultCounter = new Counter(mBsi.mOnBatteryTimeBase, in);
} else {
mBluetoothScanResultCounter = null;
}
+ if (in.readInt() != 0) {
+ mBluetoothScanResultBgCounter = new Counter(mOnBatteryBackgroundTimeBase, in);
+ } else {
+ mBluetoothScanResultBgCounter = null;
+ }
mProcessState = ActivityManager.PROCESS_STATE_NONEXISTENT;
for (int i = 0; i < NUM_PROCESS_STATE; i++) {
if (in.readInt() != 0) {
@@ -7250,8 +7384,9 @@
/**
* How long (in ms) this uid has been keeping the device partially awake.
+ * Tracks both the total time and the time while the app was in the background.
*/
- DurationTimer mTimerPartial;
+ DualTimer mTimerPartial;
/**
* How long (in ms) this uid has been keeping the device fully awake.
@@ -7296,13 +7431,13 @@
* @param in the Parcel to be read from.
* return a new Timer, or null.
*/
- private DurationTimer readDurationTimerFromParcel(int type,
- ArrayList<StopwatchTimer> pool, TimeBase timeBase, Parcel in) {
+ private DualTimer readDualTimerFromParcel(int type, ArrayList<StopwatchTimer> pool,
+ TimeBase timeBase, TimeBase bgTimeBase, Parcel in) {
if (in.readInt() == 0) {
return null;
}
- return new DurationTimer(mBsi.mClocks, mUid, type, pool, timeBase, in);
+ return new DualTimer(mBsi.mClocks, mUid, type, pool, timeBase, bgTimeBase, in);
}
boolean reset() {
@@ -7340,9 +7475,10 @@
return !wlactive;
}
- void readFromParcelLocked(TimeBase timeBase, TimeBase screenOffTimeBase, Parcel in) {
- mTimerPartial = readDurationTimerFromParcel(WAKE_TYPE_PARTIAL,
- mBsi.mPartialTimers, screenOffTimeBase, in);
+ void readFromParcelLocked(TimeBase timeBase, TimeBase screenOffTimeBase,
+ TimeBase screenOffBgTimeBase, Parcel in) {
+ mTimerPartial = readDualTimerFromParcel(WAKE_TYPE_PARTIAL,
+ mBsi.mPartialTimers, screenOffTimeBase, screenOffBgTimeBase, in);
mTimerFull = readStopwatchTimerFromParcel(WAKE_TYPE_FULL,
mBsi.mFullTimers, timeBase, in);
mTimerWindow = readStopwatchTimerFromParcel(WAKE_TYPE_WINDOW,
@@ -7368,49 +7504,6 @@
default: throw new IllegalArgumentException("type = " + type);
}
}
-
- public StopwatchTimer getStopwatchTimer(int type) {
- switch (type) {
- case WAKE_TYPE_PARTIAL: {
- DurationTimer t = mTimerPartial;
- if (t == null) {
- t = new DurationTimer(mBsi.mClocks, mUid, WAKE_TYPE_PARTIAL,
- mBsi.mPartialTimers, mBsi.mOnBatteryScreenOffTimeBase);
- mTimerPartial = t;
- }
- return t;
- }
- case WAKE_TYPE_FULL: {
- StopwatchTimer t = mTimerFull;
- if (t == null) {
- t = new StopwatchTimer(mBsi.mClocks, mUid, WAKE_TYPE_FULL,
- mBsi.mFullTimers, mBsi.mOnBatteryTimeBase);
- mTimerFull = t;
- }
- return t;
- }
- case WAKE_TYPE_WINDOW: {
- StopwatchTimer t = mTimerWindow;
- if (t == null) {
- t = new StopwatchTimer(mBsi.mClocks, mUid, WAKE_TYPE_WINDOW,
- mBsi.mWindowTimers, mBsi.mOnBatteryTimeBase);
- mTimerWindow = t;
- }
- return t;
- }
- case WAKE_TYPE_DRAW: {
- StopwatchTimer t = mTimerDraw;
- if (t == null) {
- t = new StopwatchTimer(mBsi.mClocks, mUid, WAKE_TYPE_DRAW,
- mBsi.mDrawTimers, mBsi.mOnBatteryTimeBase);
- mTimerDraw = t;
- }
- return t;
- }
- default:
- throw new IllegalArgumentException("type=" + type);
- }
- }
}
public static class Sensor extends BatteryStats.Uid.Sensor {
@@ -8224,15 +8317,25 @@
mProcessStateTimer[uidRunningState].startRunningLocked(elapsedRealtimeMs);
}
- updateBgTimeBase(uptimeMs * 1000, elapsedRealtimeMs * 1000);
+ updateOnBatteryBgTimeBase(uptimeMs * 1000, elapsedRealtimeMs * 1000);
+ updateOnBatteryScreenOffBgTimeBase(uptimeMs * 1000, elapsedRealtimeMs * 1000);
}
- public boolean updateBgTimeBase(long uptimeUs, long realtimeUs) {
+ /** Whether to consider Uid to be in the background for background timebase purposes. */
+ public boolean isInBackground() {
// Note that PROCESS_STATE_CACHED and ActivityManager.PROCESS_STATE_NONEXISTENT is
// also considered to be 'background' for our purposes, because it's not foreground.
- boolean isBgAndUnplugged = mBsi.mOnBatteryTimeBase.isRunning()
- && mProcessState >= PROCESS_STATE_BACKGROUND;
- return mOnBatteryBackgroundTimeBase.setRunning(isBgAndUnplugged, uptimeUs, realtimeUs);
+ return mProcessState >= PROCESS_STATE_BACKGROUND;
+ }
+
+ public boolean updateOnBatteryBgTimeBase(long uptimeUs, long realtimeUs) {
+ boolean on = mBsi.mOnBatteryTimeBase.isRunning() && isInBackground();
+ return mOnBatteryBackgroundTimeBase.setRunning(on, uptimeUs, realtimeUs);
+ }
+
+ public boolean updateOnBatteryScreenOffBgTimeBase(long uptimeUs, long realtimeUs) {
+ boolean on = mBsi.mOnBatteryScreenOffTimeBase.isRunning() && isInBackground();
+ return mOnBatteryScreenOffBackgroundTimeBase.setRunning(on, uptimeUs, realtimeUs);
}
public SparseArray<? extends Pid> getPidStats() {
@@ -8293,16 +8396,16 @@
Wakelock wl = new Wakelock(mBsi, this);
mWakelockStats.add(wlName, wl);
if (in.readInt() != 0) {
- wl.getStopwatchTimer(WAKE_TYPE_FULL).readSummaryFromParcelLocked(in);
+ getWakelockTimerLocked(wl, WAKE_TYPE_FULL).readSummaryFromParcelLocked(in);
}
if (in.readInt() != 0) {
- wl.getStopwatchTimer(WAKE_TYPE_PARTIAL).readSummaryFromParcelLocked(in);
+ getWakelockTimerLocked(wl, WAKE_TYPE_PARTIAL).readSummaryFromParcelLocked(in);
}
if (in.readInt() != 0) {
- wl.getStopwatchTimer(WAKE_TYPE_WINDOW).readSummaryFromParcelLocked(in);
+ getWakelockTimerLocked(wl, WAKE_TYPE_WINDOW).readSummaryFromParcelLocked(in);
}
if (in.readInt() != 0) {
- wl.getStopwatchTimer(WAKE_TYPE_DRAW).readSummaryFromParcelLocked(in);
+ getWakelockTimerLocked(wl, WAKE_TYPE_DRAW).readSummaryFromParcelLocked(in);
}
}
@@ -8358,15 +8461,65 @@
}
}
+ public StopwatchTimer getWakelockTimerLocked(Wakelock wl, int type) {
+ if (wl == null) {
+ return null;
+ }
+ switch (type) {
+ case WAKE_TYPE_PARTIAL: {
+ DualTimer t = wl.mTimerPartial;
+ if (t == null) {
+ t = new DualTimer(mBsi.mClocks, this, WAKE_TYPE_PARTIAL,
+ mBsi.mPartialTimers, mBsi.mOnBatteryScreenOffTimeBase,
+ mOnBatteryScreenOffBackgroundTimeBase);
+ wl.mTimerPartial = t;
+ }
+ return t;
+ }
+ case WAKE_TYPE_FULL: {
+ StopwatchTimer t = wl.mTimerFull;
+ if (t == null) {
+ t = new StopwatchTimer(mBsi.mClocks, this, WAKE_TYPE_FULL,
+ mBsi.mFullTimers, mBsi.mOnBatteryTimeBase);
+ wl.mTimerFull = t;
+ }
+ return t;
+ }
+ case WAKE_TYPE_WINDOW: {
+ StopwatchTimer t = wl.mTimerWindow;
+ if (t == null) {
+ t = new StopwatchTimer(mBsi.mClocks, this, WAKE_TYPE_WINDOW,
+ mBsi.mWindowTimers, mBsi.mOnBatteryTimeBase);
+ wl.mTimerWindow = t;
+ }
+ return t;
+ }
+ case WAKE_TYPE_DRAW: {
+ StopwatchTimer t = wl.mTimerDraw;
+ if (t == null) {
+ t = new StopwatchTimer(mBsi.mClocks, this, WAKE_TYPE_DRAW,
+ mBsi.mDrawTimers, mBsi.mOnBatteryTimeBase);
+ wl.mTimerDraw = t;
+ }
+ return t;
+ }
+ default:
+ throw new IllegalArgumentException("type=" + type);
+ }
+ }
+
public void noteStartWakeLocked(int pid, String name, int type, long elapsedRealtimeMs) {
Wakelock wl = mWakelockStats.startObject(name);
if (wl != null) {
- wl.getStopwatchTimer(type).startRunningLocked(elapsedRealtimeMs);
+ getWakelockTimerLocked(wl, type).startRunningLocked(elapsedRealtimeMs);
}
- if (pid >= 0 && type == WAKE_TYPE_PARTIAL) {
- Pid p = getPidStatsLocked(pid);
- if (p.mWakeNesting++ == 0) {
- p.mWakeStartMs = elapsedRealtimeMs;
+ if (type == WAKE_TYPE_PARTIAL) {
+ createAggregatedPartialWakelockTimerLocked().startRunningLocked(elapsedRealtimeMs);
+ if (pid >= 0) {
+ Pid p = getPidStatsLocked(pid);
+ if (p.mWakeNesting++ == 0) {
+ p.mWakeStartMs = elapsedRealtimeMs;
+ }
}
}
}
@@ -8374,14 +8527,19 @@
public void noteStopWakeLocked(int pid, String name, int type, long elapsedRealtimeMs) {
Wakelock wl = mWakelockStats.stopObject(name);
if (wl != null) {
- wl.getStopwatchTimer(type).stopRunningLocked(elapsedRealtimeMs);
+ getWakelockTimerLocked(wl, type).stopRunningLocked(elapsedRealtimeMs);
}
- if (pid >= 0 && type == WAKE_TYPE_PARTIAL) {
- Pid p = mPids.get(pid);
- if (p != null && p.mWakeNesting > 0) {
- if (p.mWakeNesting-- == 1) {
- p.mWakeSumMs += elapsedRealtimeMs - p.mWakeStartMs;
- p.mWakeStartMs = 0;
+ if (type == WAKE_TYPE_PARTIAL) {
+ if (mAggregatedPartialWakelockTimer != null) {
+ mAggregatedPartialWakelockTimer.stopRunningLocked(elapsedRealtimeMs);
+ }
+ if (pid >= 0) {
+ Pid p = mPids.get(pid);
+ if (p != null && p.mWakeNesting > 0) {
+ if (p.mWakeNesting-- == 1) {
+ p.mWakeSumMs += elapsedRealtimeMs - p.mWakeStartMs;
+ p.mWakeStartMs = 0;
+ }
}
}
}
@@ -8547,27 +8705,25 @@
mPlatformIdleStateCallback = null;
}
- public void setPowerProfile(PowerProfile profile) {
- synchronized (this) {
- mPowerProfile = profile;
+ public void setPowerProfileLocked(PowerProfile profile) {
+ mPowerProfile = profile;
- // We need to initialize the KernelCpuSpeedReaders to read from
- // the first cpu of each core. Once we have the PowerProfile, we have access to this
- // information.
- final int numClusters = mPowerProfile.getNumCpuClusters();
- mKernelCpuSpeedReaders = new KernelCpuSpeedReader[numClusters];
- int firstCpuOfCluster = 0;
- for (int i = 0; i < numClusters; i++) {
- final int numSpeedSteps = mPowerProfile.getNumSpeedStepsInCpuCluster(i);
- mKernelCpuSpeedReaders[i] = new KernelCpuSpeedReader(firstCpuOfCluster,
- numSpeedSteps);
- firstCpuOfCluster += mPowerProfile.getNumCoresInCpuCluster(i);
- }
+ // We need to initialize the KernelCpuSpeedReaders to read from
+ // the first cpu of each core. Once we have the PowerProfile, we have access to this
+ // information.
+ final int numClusters = mPowerProfile.getNumCpuClusters();
+ mKernelCpuSpeedReaders = new KernelCpuSpeedReader[numClusters];
+ int firstCpuOfCluster = 0;
+ for (int i = 0; i < numClusters; i++) {
+ final int numSpeedSteps = mPowerProfile.getNumSpeedStepsInCpuCluster(i);
+ mKernelCpuSpeedReaders[i] = new KernelCpuSpeedReader(firstCpuOfCluster,
+ numSpeedSteps);
+ firstCpuOfCluster += mPowerProfile.getNumCoresInCpuCluster(i);
+ }
- if (mEstimatedBatteryCapacity == -1) {
- // Initialize the estimated battery capacity to a known preset one.
- mEstimatedBatteryCapacity = (int) mPowerProfile.getBatteryCapacity();
- }
+ if (mEstimatedBatteryCapacity == -1) {
+ // Initialize the estimated battery capacity to a known preset one.
+ mEstimatedBatteryCapacity = (int) mPowerProfile.getBatteryCapacity();
}
}
@@ -8575,7 +8731,7 @@
mCallback = cb;
}
- public void setRadioScanningTimeout(long timeout) {
+ public void setRadioScanningTimeoutLocked(long timeout) {
if (mPhoneSignalScanningTimer != null) {
mPhoneSignalScanningTimer.setTimeout(timeout);
}
@@ -9267,277 +9423,293 @@
}
}
- private String[] mMobileIfaces = EmptyArray.STRING;
+ private final NetworkStatsFactory mNetworkStatsFactory = new NetworkStatsFactory();
+ private final Pools.Pool<NetworkStats> mNetworkStatsPool = new Pools.SynchronizedPool<>(6);
+
+ private final Object mWifiNetworkLock = new Object();
+
+ @GuardedBy("mWifiNetworkLock")
private String[] mWifiIfaces = EmptyArray.STRING;
- private final NetworkStatsFactory mNetworkStatsFactory = new NetworkStatsFactory();
+ @GuardedBy("mWifiNetworkLock")
+ private NetworkStats mLastWifiNetworkStats = new NetworkStats(0, -1);
- private static final int NETWORK_STATS_LAST = 0;
- private static final int NETWORK_STATS_NEXT = 1;
- private static final int NETWORK_STATS_DELTA = 2;
+ private final Object mModemNetworkLock = new Object();
- private NetworkStats[] mMobileNetworkStats;
- private NetworkStats[] mWifiNetworkStats;
+ @GuardedBy("mModemNetworkLock")
+ private String[] mModemIfaces = EmptyArray.STRING;
- /**
- * Retrieves the delta of network stats for the given network ifaces. Uses networkStatsBuffer
- * as a buffer of NetworkStats objects to cycle through when computing deltas.
- */
- private NetworkStats getNetworkStatsDeltaLocked(String[] ifaces,
- NetworkStats[] networkStatsBuffer)
- throws IOException {
- if (!SystemProperties.getBoolean(NetworkManagementSocketTagger.PROP_QTAGUID_ENABLED,
- false)) {
- return null;
+ @GuardedBy("mModemNetworkLock")
+ private NetworkStats mLastModemNetworkStats = new NetworkStats(0, -1);
+
+ private NetworkStats readNetworkStatsLocked(String[] ifaces) {
+ try {
+ if (!ArrayUtils.isEmpty(ifaces)) {
+ return mNetworkStatsFactory.readNetworkStatsDetail(NetworkStats.UID_ALL, ifaces,
+ NetworkStats.TAG_NONE, mNetworkStatsPool.acquire());
+ }
+ } catch (IOException e) {
+ Slog.e(TAG, "failed to read network stats for ifaces: " + Arrays.toString(ifaces));
}
-
- final NetworkStats stats = mNetworkStatsFactory.readNetworkStatsDetail(NetworkStats.UID_ALL,
- ifaces, NetworkStats.TAG_NONE, networkStatsBuffer[NETWORK_STATS_NEXT]);
- networkStatsBuffer[NETWORK_STATS_DELTA] = NetworkStats.subtract(stats,
- networkStatsBuffer[NETWORK_STATS_LAST], null, null,
- networkStatsBuffer[NETWORK_STATS_DELTA]);
- networkStatsBuffer[NETWORK_STATS_NEXT] = networkStatsBuffer[NETWORK_STATS_LAST];
- networkStatsBuffer[NETWORK_STATS_LAST] = stats;
- return networkStatsBuffer[NETWORK_STATS_DELTA];
+ return null;
}
/**
* Distribute WiFi energy info and network traffic to apps.
* @param info The energy information from the WiFi controller.
*/
- public void updateWifiStateLocked(@Nullable final WifiActivityEnergyInfo info) {
+ public void updateWifiState(@Nullable final WifiActivityEnergyInfo info) {
if (DEBUG_ENERGY) {
- Slog.d(TAG, "Updating wifi stats");
+ Slog.d(TAG, "Updating wifi stats: " + Arrays.toString(mWifiIfaces));
}
- final long elapsedRealtimeMs = mClocks.elapsedRealtime();
+ // Grab a separate lock to acquire the network stats, which may do I/O.
NetworkStats delta = null;
- try {
- if (!ArrayUtils.isEmpty(mWifiIfaces)) {
- delta = getNetworkStatsDeltaLocked(mWifiIfaces, mWifiNetworkStats);
+ synchronized (mWifiNetworkLock) {
+ final NetworkStats latestStats = readNetworkStatsLocked(mWifiIfaces);
+ if (latestStats != null) {
+ delta = NetworkStats.subtract(latestStats, mLastWifiNetworkStats, null, null,
+ mNetworkStatsPool.acquire());
+ mNetworkStatsPool.release(mLastWifiNetworkStats);
+ mLastWifiNetworkStats = latestStats;
}
- } catch (IOException e) {
- Slog.wtf(TAG, "Failed to get wifi network stats", e);
- return;
}
- if (!mOnBatteryInternal) {
- return;
- }
-
- SparseLongArray rxPackets = new SparseLongArray();
- SparseLongArray txPackets = new SparseLongArray();
- long totalTxPackets = 0;
- long totalRxPackets = 0;
- if (delta != null) {
- final int size = delta.size();
- for (int i = 0; i < size; i++) {
- final NetworkStats.Entry entry = delta.getValues(i, mTmpNetworkStatsEntry);
-
- if (DEBUG_ENERGY) {
- Slog.d(TAG, "Wifi uid " + entry.uid + ": delta rx=" + entry.rxBytes
- + " tx=" + entry.txBytes + " rxPackets=" + entry.rxPackets
- + " txPackets=" + entry.txPackets);
+ synchronized (this) {
+ if (!mOnBatteryInternal) {
+ if (delta != null) {
+ mNetworkStatsPool.release(delta);
}
+ return;
+ }
- if (entry.rxBytes == 0 && entry.txBytes == 0) {
- // Skip the lookup below since there is no work to do.
- continue;
- }
+ final long elapsedRealtimeMs = mClocks.elapsedRealtime();
+ SparseLongArray rxPackets = new SparseLongArray();
+ SparseLongArray txPackets = new SparseLongArray();
+ long totalTxPackets = 0;
+ long totalRxPackets = 0;
+ if (delta != null) {
+ NetworkStats.Entry entry = new NetworkStats.Entry();
+ final int size = delta.size();
+ for (int i = 0; i < size; i++) {
+ entry = delta.getValues(i, entry);
- final Uid u = getUidStatsLocked(mapUid(entry.uid));
- if (entry.rxBytes != 0) {
- u.noteNetworkActivityLocked(NETWORK_WIFI_RX_DATA, entry.rxBytes,
- entry.rxPackets);
- if (entry.set == NetworkStats.SET_DEFAULT) { // Background transfers
- u.noteNetworkActivityLocked(NETWORK_WIFI_BG_RX_DATA, entry.rxBytes,
+ if (DEBUG_ENERGY) {
+ Slog.d(TAG, "Wifi uid " + entry.uid + ": delta rx=" + entry.rxBytes
+ + " tx=" + entry.txBytes + " rxPackets=" + entry.rxPackets
+ + " txPackets=" + entry.txPackets);
+ }
+
+ if (entry.rxBytes == 0 && entry.txBytes == 0) {
+ // Skip the lookup below since there is no work to do.
+ continue;
+ }
+
+ final Uid u = getUidStatsLocked(mapUid(entry.uid));
+ if (entry.rxBytes != 0) {
+ u.noteNetworkActivityLocked(NETWORK_WIFI_RX_DATA, entry.rxBytes,
entry.rxPackets);
+ if (entry.set == NetworkStats.SET_DEFAULT) { // Background transfers
+ u.noteNetworkActivityLocked(NETWORK_WIFI_BG_RX_DATA, entry.rxBytes,
+ entry.rxPackets);
+ }
+ mNetworkByteActivityCounters[NETWORK_WIFI_RX_DATA].addCountLocked(
+ entry.rxBytes);
+ mNetworkPacketActivityCounters[NETWORK_WIFI_RX_DATA].addCountLocked(
+ entry.rxPackets);
+
+ rxPackets.put(u.getUid(), entry.rxPackets);
+
+ // Sum the total number of packets so that the Rx Power can
+ // be evenly distributed amongst the apps.
+ totalRxPackets += entry.rxPackets;
}
- mNetworkByteActivityCounters[NETWORK_WIFI_RX_DATA].addCountLocked(
- entry.rxBytes);
- mNetworkPacketActivityCounters[NETWORK_WIFI_RX_DATA].addCountLocked(
- entry.rxPackets);
- rxPackets.put(u.getUid(), entry.rxPackets);
-
- // Sum the total number of packets so that the Rx Power can
- // be evenly distributed amongst the apps.
- totalRxPackets += entry.rxPackets;
- }
-
- if (entry.txBytes != 0) {
- u.noteNetworkActivityLocked(NETWORK_WIFI_TX_DATA, entry.txBytes,
- entry.txPackets);
- if (entry.set == NetworkStats.SET_DEFAULT) { // Background transfers
- u.noteNetworkActivityLocked(NETWORK_WIFI_BG_TX_DATA, entry.txBytes,
+ if (entry.txBytes != 0) {
+ u.noteNetworkActivityLocked(NETWORK_WIFI_TX_DATA, entry.txBytes,
entry.txPackets);
+ if (entry.set == NetworkStats.SET_DEFAULT) { // Background transfers
+ u.noteNetworkActivityLocked(NETWORK_WIFI_BG_TX_DATA, entry.txBytes,
+ entry.txPackets);
+ }
+ mNetworkByteActivityCounters[NETWORK_WIFI_TX_DATA].addCountLocked(
+ entry.txBytes);
+ mNetworkPacketActivityCounters[NETWORK_WIFI_TX_DATA].addCountLocked(
+ entry.txPackets);
+
+ txPackets.put(u.getUid(), entry.txPackets);
+
+ // Sum the total number of packets so that the Tx Power can
+ // be evenly distributed amongst the apps.
+ totalTxPackets += entry.txPackets;
}
- mNetworkByteActivityCounters[NETWORK_WIFI_TX_DATA].addCountLocked(
- entry.txBytes);
- mNetworkPacketActivityCounters[NETWORK_WIFI_TX_DATA].addCountLocked(
- entry.txPackets);
-
- txPackets.put(u.getUid(), entry.txPackets);
-
- // Sum the total number of packets so that the Tx Power can
- // be evenly distributed amongst the apps.
- totalTxPackets += entry.txPackets;
}
- }
- }
-
- if (info != null) {
- mHasWifiReporting = true;
-
- // Measured in mAms
- final long txTimeMs = info.getControllerTxTimeMillis();
- final long rxTimeMs = info.getControllerRxTimeMillis();
- final long idleTimeMs = info.getControllerIdleTimeMillis();
- final long totalTimeMs = txTimeMs + rxTimeMs + idleTimeMs;
-
- long leftOverRxTimeMs = rxTimeMs;
- long leftOverTxTimeMs = txTimeMs;
-
- if (DEBUG_ENERGY) {
- Slog.d(TAG, "------ BEGIN WiFi power blaming ------");
- Slog.d(TAG, " Tx Time: " + txTimeMs + " ms");
- Slog.d(TAG, " Rx Time: " + rxTimeMs + " ms");
- Slog.d(TAG, " Idle Time: " + idleTimeMs + " ms");
- Slog.d(TAG, " Total Time: " + totalTimeMs + " ms");
+ mNetworkStatsPool.release(delta);
+ delta = null;
}
- long totalWifiLockTimeMs = 0;
- long totalScanTimeMs = 0;
+ if (info != null) {
+ mHasWifiReporting = true;
- // On the first pass, collect some totals so that we can normalize power
- // calculations if we need to.
- final int uidStatsSize = mUidStats.size();
- for (int i = 0; i < uidStatsSize; i++) {
- final Uid uid = mUidStats.valueAt(i);
+ // Measured in mAms
+ final long txTimeMs = info.getControllerTxTimeMillis();
+ final long rxTimeMs = info.getControllerRxTimeMillis();
+ final long idleTimeMs = info.getControllerIdleTimeMillis();
+ final long totalTimeMs = txTimeMs + rxTimeMs + idleTimeMs;
- // Sum the total scan power for all apps.
- totalScanTimeMs += uid.mWifiScanTimer.getTimeSinceMarkLocked(
- elapsedRealtimeMs * 1000) / 1000;
+ long leftOverRxTimeMs = rxTimeMs;
+ long leftOverTxTimeMs = txTimeMs;
- // Sum the total time holding wifi lock for all apps.
- totalWifiLockTimeMs += uid.mFullWifiLockTimer.getTimeSinceMarkLocked(
- elapsedRealtimeMs * 1000) / 1000;
- }
-
- if (DEBUG_ENERGY && totalScanTimeMs > rxTimeMs) {
- Slog.d(TAG, " !Estimated scan time > Actual rx time (" + totalScanTimeMs + " ms > "
- + rxTimeMs + " ms). Normalizing scan time.");
- }
- if (DEBUG_ENERGY && totalScanTimeMs > txTimeMs) {
- Slog.d(TAG, " !Estimated scan time > Actual tx time (" + totalScanTimeMs + " ms > "
- + txTimeMs + " ms). Normalizing scan time.");
- }
-
- // Actually assign and distribute power usage to apps.
- for (int i = 0; i < uidStatsSize; i++) {
- final Uid uid = mUidStats.valueAt(i);
-
- long scanTimeSinceMarkMs = uid.mWifiScanTimer.getTimeSinceMarkLocked(
- elapsedRealtimeMs * 1000) / 1000;
- if (scanTimeSinceMarkMs > 0) {
- // Set the new mark so that next time we get new data since this point.
- uid.mWifiScanTimer.setMark(elapsedRealtimeMs);
-
- long scanRxTimeSinceMarkMs = scanTimeSinceMarkMs;
- long scanTxTimeSinceMarkMs = scanTimeSinceMarkMs;
-
- // Our total scan time is more than the reported Tx/Rx time.
- // This is possible because the cost of a scan is approximate.
- // Let's normalize the result so that we evenly blame each app
- // scanning.
- //
- // This means that we may have apps that transmitted/received packets not be
- // blamed for this, but this is fine as scans are relatively more expensive.
- if (totalScanTimeMs > rxTimeMs) {
- scanRxTimeSinceMarkMs = (rxTimeMs * scanRxTimeSinceMarkMs) /
- totalScanTimeMs;
- }
- if (totalScanTimeMs > txTimeMs) {
- scanTxTimeSinceMarkMs = (txTimeMs * scanTxTimeSinceMarkMs) /
- totalScanTimeMs;
- }
-
- if (DEBUG_ENERGY) {
- Slog.d(TAG, " ScanTime for UID " + uid.getUid() + ": Rx:"
- + scanRxTimeSinceMarkMs + " ms Tx:"
- + scanTxTimeSinceMarkMs + " ms)");
- }
-
- ControllerActivityCounterImpl activityCounter =
- uid.getOrCreateWifiControllerActivityLocked();
- activityCounter.getRxTimeCounter().addCountLocked(scanRxTimeSinceMarkMs);
- activityCounter.getTxTimeCounters()[0].addCountLocked(scanTxTimeSinceMarkMs);
- leftOverRxTimeMs -= scanRxTimeSinceMarkMs;
- leftOverTxTimeMs -= scanTxTimeSinceMarkMs;
- }
-
- // Distribute evenly the power consumed while Idle to each app holding a WiFi
- // lock.
- final long wifiLockTimeSinceMarkMs = uid.mFullWifiLockTimer.getTimeSinceMarkLocked(
- elapsedRealtimeMs * 1000) / 1000;
- if (wifiLockTimeSinceMarkMs > 0) {
- // Set the new mark so that next time we get new data since this point.
- uid.mFullWifiLockTimer.setMark(elapsedRealtimeMs);
-
- final long myIdleTimeMs = (wifiLockTimeSinceMarkMs * idleTimeMs)
- / totalWifiLockTimeMs;
- if (DEBUG_ENERGY) {
- Slog.d(TAG, " IdleTime for UID " + uid.getUid() + ": "
- + myIdleTimeMs + " ms");
- }
- uid.getOrCreateWifiControllerActivityLocked().getIdleTimeCounter()
- .addCountLocked(myIdleTimeMs);
- }
- }
-
- if (DEBUG_ENERGY) {
- Slog.d(TAG, " New RxPower: " + leftOverRxTimeMs + " ms");
- Slog.d(TAG, " New TxPower: " + leftOverTxTimeMs + " ms");
- }
-
- // Distribute the remaining Tx power appropriately between all apps that transmitted
- // packets.
- for (int i = 0; i < txPackets.size(); i++) {
- final Uid uid = getUidStatsLocked(txPackets.keyAt(i));
- final long myTxTimeMs = (txPackets.valueAt(i) * leftOverTxTimeMs) / totalTxPackets;
if (DEBUG_ENERGY) {
- Slog.d(TAG, " TxTime for UID " + uid.getUid() + ": " + myTxTimeMs + " ms");
+ Slog.d(TAG, "------ BEGIN WiFi power blaming ------");
+ Slog.d(TAG, " Tx Time: " + txTimeMs + " ms");
+ Slog.d(TAG, " Rx Time: " + rxTimeMs + " ms");
+ Slog.d(TAG, " Idle Time: " + idleTimeMs + " ms");
+ Slog.d(TAG, " Total Time: " + totalTimeMs + " ms");
}
- uid.getOrCreateWifiControllerActivityLocked().getTxTimeCounters()[0]
- .addCountLocked(myTxTimeMs);
- }
- // Distribute the remaining Rx power appropriately between all apps that received
- // packets.
- for (int i = 0; i < rxPackets.size(); i++) {
- final Uid uid = getUidStatsLocked(rxPackets.keyAt(i));
- final long myRxTimeMs = (rxPackets.valueAt(i) * leftOverRxTimeMs) / totalRxPackets;
+ long totalWifiLockTimeMs = 0;
+ long totalScanTimeMs = 0;
+
+ // On the first pass, collect some totals so that we can normalize power
+ // calculations if we need to.
+ final int uidStatsSize = mUidStats.size();
+ for (int i = 0; i < uidStatsSize; i++) {
+ final Uid uid = mUidStats.valueAt(i);
+
+ // Sum the total scan power for all apps.
+ totalScanTimeMs += uid.mWifiScanTimer.getTimeSinceMarkLocked(
+ elapsedRealtimeMs * 1000) / 1000;
+
+ // Sum the total time holding wifi lock for all apps.
+ totalWifiLockTimeMs += uid.mFullWifiLockTimer.getTimeSinceMarkLocked(
+ elapsedRealtimeMs * 1000) / 1000;
+ }
+
+ if (DEBUG_ENERGY && totalScanTimeMs > rxTimeMs) {
+ Slog.d(TAG,
+ " !Estimated scan time > Actual rx time (" + totalScanTimeMs + " ms > "
+ + rxTimeMs + " ms). Normalizing scan time.");
+ }
+ if (DEBUG_ENERGY && totalScanTimeMs > txTimeMs) {
+ Slog.d(TAG,
+ " !Estimated scan time > Actual tx time (" + totalScanTimeMs + " ms > "
+ + txTimeMs + " ms). Normalizing scan time.");
+ }
+
+ // Actually assign and distribute power usage to apps.
+ for (int i = 0; i < uidStatsSize; i++) {
+ final Uid uid = mUidStats.valueAt(i);
+
+ long scanTimeSinceMarkMs = uid.mWifiScanTimer.getTimeSinceMarkLocked(
+ elapsedRealtimeMs * 1000) / 1000;
+ if (scanTimeSinceMarkMs > 0) {
+ // Set the new mark so that next time we get new data since this point.
+ uid.mWifiScanTimer.setMark(elapsedRealtimeMs);
+
+ long scanRxTimeSinceMarkMs = scanTimeSinceMarkMs;
+ long scanTxTimeSinceMarkMs = scanTimeSinceMarkMs;
+
+ // Our total scan time is more than the reported Tx/Rx time.
+ // This is possible because the cost of a scan is approximate.
+ // Let's normalize the result so that we evenly blame each app
+ // scanning.
+ //
+ // This means that we may have apps that transmitted/received packets not be
+ // blamed for this, but this is fine as scans are relatively more expensive.
+ if (totalScanTimeMs > rxTimeMs) {
+ scanRxTimeSinceMarkMs = (rxTimeMs * scanRxTimeSinceMarkMs) /
+ totalScanTimeMs;
+ }
+ if (totalScanTimeMs > txTimeMs) {
+ scanTxTimeSinceMarkMs = (txTimeMs * scanTxTimeSinceMarkMs) /
+ totalScanTimeMs;
+ }
+
+ if (DEBUG_ENERGY) {
+ Slog.d(TAG, " ScanTime for UID " + uid.getUid() + ": Rx:"
+ + scanRxTimeSinceMarkMs + " ms Tx:"
+ + scanTxTimeSinceMarkMs + " ms)");
+ }
+
+ ControllerActivityCounterImpl activityCounter =
+ uid.getOrCreateWifiControllerActivityLocked();
+ activityCounter.getRxTimeCounter().addCountLocked(scanRxTimeSinceMarkMs);
+ activityCounter.getTxTimeCounters()[0].addCountLocked(
+ scanTxTimeSinceMarkMs);
+ leftOverRxTimeMs -= scanRxTimeSinceMarkMs;
+ leftOverTxTimeMs -= scanTxTimeSinceMarkMs;
+ }
+
+ // Distribute evenly the power consumed while Idle to each app holding a WiFi
+ // lock.
+ final long wifiLockTimeSinceMarkMs =
+ uid.mFullWifiLockTimer.getTimeSinceMarkLocked(
+ elapsedRealtimeMs * 1000) / 1000;
+ if (wifiLockTimeSinceMarkMs > 0) {
+ // Set the new mark so that next time we get new data since this point.
+ uid.mFullWifiLockTimer.setMark(elapsedRealtimeMs);
+
+ final long myIdleTimeMs = (wifiLockTimeSinceMarkMs * idleTimeMs)
+ / totalWifiLockTimeMs;
+ if (DEBUG_ENERGY) {
+ Slog.d(TAG, " IdleTime for UID " + uid.getUid() + ": "
+ + myIdleTimeMs + " ms");
+ }
+ uid.getOrCreateWifiControllerActivityLocked().getIdleTimeCounter()
+ .addCountLocked(myIdleTimeMs);
+ }
+ }
+
if (DEBUG_ENERGY) {
- Slog.d(TAG, " RxTime for UID " + uid.getUid() + ": " + myRxTimeMs + " ms");
+ Slog.d(TAG, " New RxPower: " + leftOverRxTimeMs + " ms");
+ Slog.d(TAG, " New TxPower: " + leftOverTxTimeMs + " ms");
}
- uid.getOrCreateWifiControllerActivityLocked().getRxTimeCounter()
- .addCountLocked(myRxTimeMs);
- }
- // Any left over power use will be picked up by the WiFi category in BatteryStatsHelper.
+ // Distribute the remaining Tx power appropriately between all apps that transmitted
+ // packets.
+ for (int i = 0; i < txPackets.size(); i++) {
+ final Uid uid = getUidStatsLocked(txPackets.keyAt(i));
+ final long myTxTimeMs = (txPackets.valueAt(i) * leftOverTxTimeMs)
+ / totalTxPackets;
+ if (DEBUG_ENERGY) {
+ Slog.d(TAG, " TxTime for UID " + uid.getUid() + ": " + myTxTimeMs + " ms");
+ }
+ uid.getOrCreateWifiControllerActivityLocked().getTxTimeCounters()[0]
+ .addCountLocked(myTxTimeMs);
+ }
- // Update WiFi controller stats.
- mWifiActivity.getRxTimeCounter().addCountLocked(info.getControllerRxTimeMillis());
- mWifiActivity.getTxTimeCounters()[0].addCountLocked(info.getControllerTxTimeMillis());
- mWifiActivity.getIdleTimeCounter().addCountLocked(info.getControllerIdleTimeMillis());
+ // Distribute the remaining Rx power appropriately between all apps that received
+ // packets.
+ for (int i = 0; i < rxPackets.size(); i++) {
+ final Uid uid = getUidStatsLocked(rxPackets.keyAt(i));
+ final long myRxTimeMs = (rxPackets.valueAt(i) * leftOverRxTimeMs)
+ / totalRxPackets;
+ if (DEBUG_ENERGY) {
+ Slog.d(TAG, " RxTime for UID " + uid.getUid() + ": " + myRxTimeMs + " ms");
+ }
+ uid.getOrCreateWifiControllerActivityLocked().getRxTimeCounter()
+ .addCountLocked(myRxTimeMs);
+ }
- // POWER_WIFI_CONTROLLER_OPERATING_VOLTAGE is measured in mV, so convert to V.
- final double opVolt = mPowerProfile.getAveragePower(
- PowerProfile.POWER_WIFI_CONTROLLER_OPERATING_VOLTAGE) / 1000.0;
- if (opVolt != 0) {
- // We store the power drain as mAms.
- mWifiActivity.getPowerCounter().addCountLocked(
- (long)(info.getControllerEnergyUsed() / opVolt));
+ // Any left over power use will be picked up by the WiFi category in BatteryStatsHelper.
+
+
+ // Update WiFi controller stats.
+ mWifiActivity.getRxTimeCounter().addCountLocked(info.getControllerRxTimeMillis());
+ mWifiActivity.getTxTimeCounters()[0].addCountLocked(
+ info.getControllerTxTimeMillis());
+ mWifiActivity.getIdleTimeCounter().addCountLocked(
+ info.getControllerIdleTimeMillis());
+
+ // POWER_WIFI_CONTROLLER_OPERATING_VOLTAGE is measured in mV, so convert to V.
+ final double opVolt = mPowerProfile.getAveragePower(
+ PowerProfile.POWER_WIFI_CONTROLLER_OPERATING_VOLTAGE) / 1000.0;
+ if (opVolt != 0) {
+ // We store the power drain as mAms.
+ mWifiActivity.getPowerCounter().addCountLocked(
+ (long) (info.getControllerEnergyUsed() / opVolt));
+ }
}
}
}
@@ -9545,133 +9717,148 @@
/**
* Distribute Cell radio energy info and network traffic to apps.
*/
- public void updateMobileRadioStateLocked(final long elapsedRealtimeMs,
- final ModemActivityInfo activityInfo) {
+ public void updateMobileRadioState(@Nullable final ModemActivityInfo activityInfo) {
if (DEBUG_ENERGY) {
Slog.d(TAG, "Updating mobile radio stats with " + activityInfo);
}
+ // Grab a separate lock to acquire the network stats, which may do I/O.
NetworkStats delta = null;
- try {
- if (!ArrayUtils.isEmpty(mMobileIfaces)) {
- delta = getNetworkStatsDeltaLocked(mMobileIfaces, mMobileNetworkStats);
+ synchronized (mModemNetworkLock) {
+ final NetworkStats latestStats = readNetworkStatsLocked(mModemIfaces);
+ if (latestStats != null) {
+ delta = NetworkStats.subtract(latestStats, mLastModemNetworkStats, null, null,
+ mNetworkStatsPool.acquire());
+ mNetworkStatsPool.release(mLastModemNetworkStats);
+ mLastModemNetworkStats = latestStats;
}
- } catch (IOException e) {
- Slog.wtf(TAG, "Failed to get mobile network stats", e);
- return;
}
- if (!mOnBatteryInternal) {
- return;
- }
-
- long radioTime = mMobileRadioActivePerAppTimer.getTimeSinceMarkLocked(
- elapsedRealtimeMs * 1000);
- mMobileRadioActivePerAppTimer.setMark(elapsedRealtimeMs);
-
- long totalRxPackets = 0;
- long totalTxPackets = 0;
- if (delta != null) {
- final int size = delta.size();
- for (int i = 0; i < size; i++) {
- final NetworkStats.Entry entry = delta.getValues(i, mTmpNetworkStatsEntry);
- if (entry.rxPackets == 0 && entry.txPackets == 0) {
- continue;
+ synchronized (this) {
+ if (!mOnBatteryInternal) {
+ if (delta != null) {
+ mNetworkStatsPool.release(delta);
}
-
- if (DEBUG_ENERGY) {
- Slog.d(TAG, "Mobile uid " + entry.uid + ": delta rx=" + entry.rxBytes
- + " tx=" + entry.txBytes + " rxPackets=" + entry.rxPackets
- + " txPackets=" + entry.txPackets);
- }
-
- totalRxPackets += entry.rxPackets;
- totalTxPackets += entry.txPackets;
-
- final Uid u = getUidStatsLocked(mapUid(entry.uid));
- u.noteNetworkActivityLocked(NETWORK_MOBILE_RX_DATA, entry.rxBytes, entry.rxPackets);
- u.noteNetworkActivityLocked(NETWORK_MOBILE_TX_DATA, entry.txBytes, entry.txPackets);
- if (entry.set == NetworkStats.SET_DEFAULT) { // Background transfers
- u.noteNetworkActivityLocked(NETWORK_MOBILE_BG_RX_DATA,
- entry.rxBytes, entry.rxPackets);
- u.noteNetworkActivityLocked(NETWORK_MOBILE_BG_TX_DATA,
- entry.txBytes, entry.txPackets);
- }
-
- mNetworkByteActivityCounters[NETWORK_MOBILE_RX_DATA].addCountLocked(
- entry.rxBytes);
- mNetworkByteActivityCounters[NETWORK_MOBILE_TX_DATA].addCountLocked(
- entry.txBytes);
- mNetworkPacketActivityCounters[NETWORK_MOBILE_RX_DATA].addCountLocked(
- entry.rxPackets);
- mNetworkPacketActivityCounters[NETWORK_MOBILE_TX_DATA].addCountLocked(
- entry.txPackets);
+ return;
}
- // Now distribute proportional blame to the apps that did networking.
- long totalPackets = totalRxPackets + totalTxPackets;
- if (totalPackets > 0) {
+ final long elapsedRealtimeMs = SystemClock.elapsedRealtime();
+ long radioTime = mMobileRadioActivePerAppTimer.getTimeSinceMarkLocked(
+ elapsedRealtimeMs * 1000);
+ mMobileRadioActivePerAppTimer.setMark(elapsedRealtimeMs);
+
+ long totalRxPackets = 0;
+ long totalTxPackets = 0;
+ if (delta != null) {
+ NetworkStats.Entry entry = new NetworkStats.Entry();
+ final int size = delta.size();
for (int i = 0; i < size; i++) {
- final NetworkStats.Entry entry = delta.getValues(i, mTmpNetworkStatsEntry);
+ entry = delta.getValues(i, entry);
if (entry.rxPackets == 0 && entry.txPackets == 0) {
continue;
}
+ if (DEBUG_ENERGY) {
+ Slog.d(TAG, "Mobile uid " + entry.uid + ": delta rx=" + entry.rxBytes
+ + " tx=" + entry.txBytes + " rxPackets=" + entry.rxPackets
+ + " txPackets=" + entry.txPackets);
+ }
+
+ totalRxPackets += entry.rxPackets;
+ totalTxPackets += entry.txPackets;
+
final Uid u = getUidStatsLocked(mapUid(entry.uid));
+ u.noteNetworkActivityLocked(NETWORK_MOBILE_RX_DATA, entry.rxBytes,
+ entry.rxPackets);
+ u.noteNetworkActivityLocked(NETWORK_MOBILE_TX_DATA, entry.txBytes,
+ entry.txPackets);
+ if (entry.set == NetworkStats.SET_DEFAULT) { // Background transfers
+ u.noteNetworkActivityLocked(NETWORK_MOBILE_BG_RX_DATA,
+ entry.rxBytes, entry.rxPackets);
+ u.noteNetworkActivityLocked(NETWORK_MOBILE_BG_TX_DATA,
+ entry.txBytes, entry.txPackets);
+ }
- // Distribute total radio active time in to this app.
- final long appPackets = entry.rxPackets + entry.txPackets;
- final long appRadioTime = (radioTime * appPackets) / totalPackets;
- u.noteMobileRadioActiveTimeLocked(appRadioTime);
+ mNetworkByteActivityCounters[NETWORK_MOBILE_RX_DATA].addCountLocked(
+ entry.rxBytes);
+ mNetworkByteActivityCounters[NETWORK_MOBILE_TX_DATA].addCountLocked(
+ entry.txBytes);
+ mNetworkPacketActivityCounters[NETWORK_MOBILE_RX_DATA].addCountLocked(
+ entry.rxPackets);
+ mNetworkPacketActivityCounters[NETWORK_MOBILE_TX_DATA].addCountLocked(
+ entry.txPackets);
+ }
- // Remove this app from the totals, so that we don't lose any time
- // due to rounding.
- radioTime -= appRadioTime;
- totalPackets -= appPackets;
-
- if (activityInfo != null) {
- ControllerActivityCounterImpl activityCounter =
- u.getOrCreateModemControllerActivityLocked();
- if (totalRxPackets > 0 && entry.rxPackets > 0) {
- final long rxMs = (entry.rxPackets * activityInfo.getRxTimeMillis())
- / totalRxPackets;
- activityCounter.getRxTimeCounter().addCountLocked(rxMs);
+ // Now distribute proportional blame to the apps that did networking.
+ long totalPackets = totalRxPackets + totalTxPackets;
+ if (totalPackets > 0) {
+ for (int i = 0; i < size; i++) {
+ entry = delta.getValues(i, entry);
+ if (entry.rxPackets == 0 && entry.txPackets == 0) {
+ continue;
}
- if (totalTxPackets > 0 && entry.txPackets > 0) {
- for (int lvl = 0; lvl < ModemActivityInfo.TX_POWER_LEVELS; lvl++) {
- long txMs = entry.txPackets * activityInfo.getTxTimeMillis()[lvl];
- txMs /= totalTxPackets;
- activityCounter.getTxTimeCounters()[lvl].addCountLocked(txMs);
+ final Uid u = getUidStatsLocked(mapUid(entry.uid));
+
+ // Distribute total radio active time in to this app.
+ final long appPackets = entry.rxPackets + entry.txPackets;
+ final long appRadioTime = (radioTime * appPackets) / totalPackets;
+ u.noteMobileRadioActiveTimeLocked(appRadioTime);
+
+ // Remove this app from the totals, so that we don't lose any time
+ // due to rounding.
+ radioTime -= appRadioTime;
+ totalPackets -= appPackets;
+
+ if (activityInfo != null) {
+ ControllerActivityCounterImpl activityCounter =
+ u.getOrCreateModemControllerActivityLocked();
+ if (totalRxPackets > 0 && entry.rxPackets > 0) {
+ final long rxMs = (entry.rxPackets * activityInfo.getRxTimeMillis())
+ / totalRxPackets;
+ activityCounter.getRxTimeCounter().addCountLocked(rxMs);
+ }
+
+ if (totalTxPackets > 0 && entry.txPackets > 0) {
+ for (int lvl = 0; lvl < ModemActivityInfo.TX_POWER_LEVELS; lvl++) {
+ long txMs =
+ entry.txPackets * activityInfo.getTxTimeMillis()[lvl];
+ txMs /= totalTxPackets;
+ activityCounter.getTxTimeCounters()[lvl].addCountLocked(txMs);
+ }
}
}
}
}
+
+ if (radioTime > 0) {
+ // Whoops, there is some radio time we can't blame on an app!
+ mMobileRadioActiveUnknownTime.addCountLocked(radioTime);
+ mMobileRadioActiveUnknownCount.addCountLocked(1);
+ }
+
+ mNetworkStatsPool.release(delta);
+ delta = null;
}
- if (radioTime > 0) {
- // Whoops, there is some radio time we can't blame on an app!
- mMobileRadioActiveUnknownTime.addCountLocked(radioTime);
- mMobileRadioActiveUnknownCount.addCountLocked(1);
- }
- }
+ if (activityInfo != null) {
+ mHasModemReporting = true;
+ mModemActivity.getIdleTimeCounter().addCountLocked(
+ activityInfo.getIdleTimeMillis());
+ mModemActivity.getRxTimeCounter().addCountLocked(activityInfo.getRxTimeMillis());
+ for (int lvl = 0; lvl < ModemActivityInfo.TX_POWER_LEVELS; lvl++) {
+ mModemActivity.getTxTimeCounters()[lvl]
+ .addCountLocked(activityInfo.getTxTimeMillis()[lvl]);
+ }
- if (activityInfo != null) {
- mHasModemReporting = true;
- mModemActivity.getIdleTimeCounter().addCountLocked(activityInfo.getIdleTimeMillis());
- mModemActivity.getRxTimeCounter().addCountLocked(activityInfo.getRxTimeMillis());
- for (int lvl = 0; lvl < ModemActivityInfo.TX_POWER_LEVELS; lvl++) {
- mModemActivity.getTxTimeCounters()[lvl]
- .addCountLocked(activityInfo.getTxTimeMillis()[lvl]);
- }
-
- // POWER_MODEM_CONTROLLER_OPERATING_VOLTAGE is measured in mV, so convert to V.
- final double opVolt = mPowerProfile.getAveragePower(
- PowerProfile.POWER_MODEM_CONTROLLER_OPERATING_VOLTAGE) / 1000.0;
- if (opVolt != 0) {
- // We store the power drain as mAms.
- mModemActivity.getPowerCounter().addCountLocked(
- (long) (activityInfo.getEnergyUsed() / opVolt));
+ // POWER_MODEM_CONTROLLER_OPERATING_VOLTAGE is measured in mV, so convert to V.
+ final double opVolt = mPowerProfile.getAveragePower(
+ PowerProfile.POWER_MODEM_CONTROLLER_OPERATING_VOLTAGE) / 1000.0;
+ if (opVolt != 0) {
+ // We store the power drain as mAms.
+ mModemActivity.getPowerCounter().addCountLocked(
+ (long) (activityInfo.getEnergyUsed() / opVolt));
+ }
}
}
}
@@ -9936,7 +10123,7 @@
* and we are on battery with screen off, we give more of the cpu time to those apps holding
* wakelocks. If the screen is on, we just assign the actual cpu time an app used.
*/
- public void updateCpuTimeLocked() {
+ public void updateCpuTimeLocked(boolean updateCpuFreqData) {
if (mPowerProfile == null) {
return;
}
@@ -9983,7 +10170,7 @@
// Read the CPU data for each UID. This will internally generate a snapshot so next time
// we read, we get a delta. If we are to distribute the cpu time, then do so. Otherwise
// we just ignore the data.
- final long startTimeMs = mClocks.elapsedRealtime();
+ final long startTimeMs = mClocks.uptimeMillis();
mKernelUidCpuTimeReader.readDelta(!mOnBatteryInternal ? null :
new KernelUidCpuTimeReader.Callback() {
@Override
@@ -10051,9 +10238,11 @@
}
});
- readKernelUidCpuFreqTimesLocked();
+ if (updateCpuFreqData) {
+ readKernelUidCpuFreqTimesLocked();
+ }
- final long elapse = (mClocks.elapsedRealtime() - startTimeMs);
+ final long elapse = (mClocks.uptimeMillis() - startTimeMs);
if (DEBUG_ENERGY_CPU || (elapse >= 100)) {
Slog.d(TAG, "Reading cpu stats took " + elapse + " ms");
}
@@ -11265,6 +11454,7 @@
mUidStats.put(uid, u);
u.mOnBatteryBackgroundTimeBase.readSummaryFromParcel(in);
+ u.mOnBatteryScreenOffBackgroundTimeBase.readSummaryFromParcel(in);
u.mWifiRunning = false;
if (in.readInt() != 0) {
@@ -11305,11 +11495,20 @@
u.createForegroundActivityTimerLocked().readSummaryFromParcelLocked(in);
}
if (in.readInt() != 0) {
+ u.createAggregatedPartialWakelockTimerLocked().readSummaryFromParcelLocked(in);
+ }
+ if (in.readInt() != 0) {
u.createBluetoothScanTimerLocked().readSummaryFromParcelLocked(in);
}
if (in.readInt() != 0) {
+ u.createBluetoothUnoptimizedScanTimerLocked().readSummaryFromParcelLocked(in);
+ }
+ if (in.readInt() != 0) {
u.createBluetoothScanResultCounterLocked().readSummaryFromParcelLocked(in);
}
+ if (in.readInt() != 0) {
+ u.createBluetoothScanResultBgCounterLocked().readSummaryFromParcelLocked(in);
+ }
u.mProcessState = ActivityManager.PROCESS_STATE_NONEXISTENT;
for (int i = 0; i < Uid.NUM_PROCESS_STATE; i++) {
if (in.readInt() != 0) {
@@ -11641,6 +11840,7 @@
Uid u = mUidStats.valueAt(iu);
u.mOnBatteryBackgroundTimeBase.writeSummaryToParcel(out, NOW_SYS, NOWREAL_SYS);
+ u.mOnBatteryScreenOffBackgroundTimeBase.writeSummaryToParcel(out, NOW_SYS, NOWREAL_SYS);
if (u.mWifiRunningTimer != null) {
out.writeInt(1);
@@ -11704,18 +11904,36 @@
} else {
out.writeInt(0);
}
+ if (u.mAggregatedPartialWakelockTimer != null) {
+ out.writeInt(1);
+ u.mAggregatedPartialWakelockTimer.writeSummaryFromParcelLocked(out, NOWREAL_SYS);
+ } else {
+ out.writeInt(0);
+ }
if (u.mBluetoothScanTimer != null) {
out.writeInt(1);
u.mBluetoothScanTimer.writeSummaryFromParcelLocked(out, NOWREAL_SYS);
} else {
out.writeInt(0);
}
+ if (u.mBluetoothUnoptimizedScanTimer != null) {
+ out.writeInt(1);
+ u.mBluetoothUnoptimizedScanTimer.writeSummaryFromParcelLocked(out, NOWREAL_SYS);
+ } else {
+ out.writeInt(0);
+ }
if (u.mBluetoothScanResultCounter != null) {
out.writeInt(1);
u.mBluetoothScanResultCounter.writeSummaryFromParcelLocked(out);
} else {
out.writeInt(0);
}
+ if (u.mBluetoothScanResultBgCounter != null) {
+ out.writeInt(1);
+ u.mBluetoothScanResultBgCounter.writeSummaryFromParcelLocked(out);
+ } else {
+ out.writeInt(0);
+ }
for (int i = 0; i < Uid.NUM_PROCESS_STATE; i++) {
if (u.mProcessStateTimer[i] != null) {
out.writeInt(1);
diff --git a/core/java/com/android/internal/os/ZygoteConnection.java b/core/java/com/android/internal/os/ZygoteConnection.java
index a9bec41..2013ac0 100644
--- a/core/java/com/android/internal/os/ZygoteConnection.java
+++ b/core/java/com/android/internal/os/ZygoteConnection.java
@@ -762,14 +762,6 @@
public static void applyInvokeWithSystemProperty(Arguments args) {
if (args.invokeWith == null && args.niceName != null) {
String property = "wrap." + args.niceName;
- if (property.length() > 31) {
- // Properties with a trailing "." are illegal.
- if (property.charAt(30) != '.') {
- property = property.substring(0, 31);
- } else {
- property = property.substring(0, 30);
- }
- }
args.invokeWith = SystemProperties.get(property);
if (args.invokeWith != null && args.invokeWith.length() == 0) {
args.invokeWith = null;
diff --git a/core/java/com/android/internal/policy/DecorView.java b/core/java/com/android/internal/policy/DecorView.java
index 1b83708..ba3aa36 100644
--- a/core/java/com/android/internal/policy/DecorView.java
+++ b/core/java/com/android/internal/policy/DecorView.java
@@ -296,7 +296,11 @@
@Override
public void onDraw(Canvas c) {
super.onDraw(c);
- mBackgroundFallback.draw(mContentRoot, c, mWindow.mContentParent);
+
+ // When we are resizing, we need the fallback background to cover the area where we have our
+ // system bar background views as the navigation bar will be hidden during resizing.
+ mBackgroundFallback.draw(isResizing() ? this : mContentRoot, mContentRoot, c,
+ mWindow.mContentParent);
}
@Override
@@ -1755,8 +1759,9 @@
mFloatingActionMode.finish();
}
cleanupFloatingActionModeViews();
+ mFloatingToolbar = new FloatingToolbar(mContext, mWindow);
final FloatingActionMode mode =
- new FloatingActionMode(mContext, callback, originatingView);
+ new FloatingActionMode(mContext, callback, originatingView, mFloatingToolbar);
mFloatingActionModeOriginatingView = originatingView;
mFloatingToolbarPreDrawListener =
new ViewTreeObserver.OnPreDrawListener() {
@@ -1771,8 +1776,6 @@
private void setHandledFloatingActionMode(ActionMode mode) {
mFloatingActionMode = mode;
- mFloatingToolbar = new FloatingToolbar(mContext, mWindow);
- ((FloatingActionMode) mFloatingActionMode).setFloatingToolbar(mFloatingToolbar);
mFloatingActionMode.invalidate(); // Will show the floating toolbar if necessary.
mFloatingActionModeOriginatingView.getViewTreeObserver()
.addOnPreDrawListener(mFloatingToolbarPreDrawListener);
diff --git a/core/java/com/android/internal/util/DumpUtils.java b/core/java/com/android/internal/util/DumpUtils.java
index ce89501..66b777e 100644
--- a/core/java/com/android/internal/util/DumpUtils.java
+++ b/core/java/com/android/internal/util/DumpUtils.java
@@ -31,7 +31,7 @@
*/
public final class DumpUtils {
private static final String TAG = "DumpUtils";
- private static final boolean DEBUG = true;
+ private static final boolean DEBUG = false;
private DumpUtils() {
}
diff --git a/core/java/com/android/internal/view/FloatingActionMode.java b/core/java/com/android/internal/view/FloatingActionMode.java
index effe219..ff211b6 100644
--- a/core/java/com/android/internal/view/FloatingActionMode.java
+++ b/core/java/com/android/internal/view/FloatingActionMode.java
@@ -16,6 +16,7 @@
package com.android.internal.view;
+import android.annotation.NonNull;
import android.content.Context;
import android.graphics.Point;
import android.graphics.Rect;
@@ -36,26 +37,26 @@
import java.util.Arrays;
-public class FloatingActionMode extends ActionMode {
+public final class FloatingActionMode extends ActionMode {
private static final int MAX_HIDE_DURATION = 3000;
private static final int MOVING_HIDE_DELAY = 50;
- private final Context mContext;
- private final ActionMode.Callback2 mCallback;
- private final MenuBuilder mMenu;
- private final Rect mContentRect;
- private final Rect mContentRectOnScreen;
- private final Rect mPreviousContentRectOnScreen;
- private final int[] mViewPositionOnScreen;
- private final int[] mPreviousViewPositionOnScreen;
- private final int[] mRootViewPositionOnScreen;
- private final Rect mViewRectOnScreen;
- private final Rect mPreviousViewRectOnScreen;
- private final Rect mScreenRect;
- private final View mOriginatingView;
+ @NonNull private final Context mContext;
+ @NonNull private final ActionMode.Callback2 mCallback;
+ @NonNull private final MenuBuilder mMenu;
+ @NonNull private final Rect mContentRect;
+ @NonNull private final Rect mContentRectOnScreen;
+ @NonNull private final Rect mPreviousContentRectOnScreen;
+ @NonNull private final int[] mViewPositionOnScreen;
+ @NonNull private final int[] mPreviousViewPositionOnScreen;
+ @NonNull private final int[] mRootViewPositionOnScreen;
+ @NonNull private final Rect mViewRectOnScreen;
+ @NonNull private final Rect mPreviousViewRectOnScreen;
+ @NonNull private final Rect mScreenRect;
+ @NonNull private final View mOriginatingView;
+ @NonNull private final Point mDisplaySize;
private final int mBottomAllowance;
- private final Point mDisplaySize;
private final Runnable mMovingOff = new Runnable() {
public void run() {
@@ -75,11 +76,12 @@
}
};
- private FloatingToolbar mFloatingToolbar;
- private FloatingToolbarVisibilityHelper mFloatingToolbarVisibilityHelper;
+ @NonNull private FloatingToolbar mFloatingToolbar;
+ @NonNull private FloatingToolbarVisibilityHelper mFloatingToolbarVisibilityHelper;
public FloatingActionMode(
- Context context, ActionMode.Callback2 callback, View originatingView) {
+ Context context, ActionMode.Callback2 callback,
+ View originatingView, FloatingToolbar floatingToolbar) {
mContext = Preconditions.checkNotNull(context);
mCallback = Preconditions.checkNotNull(callback);
mMenu = new MenuBuilder(context).setDefaultShowAsAction(
@@ -110,17 +112,13 @@
mBottomAllowance = context.getResources()
.getDimensionPixelSize(R.dimen.content_rect_bottom_clip_allowance);
mDisplaySize = new Point();
+ setFloatingToolbar(Preconditions.checkNotNull(floatingToolbar));
}
- public void setFloatingToolbar(FloatingToolbar floatingToolbar) {
+ private void setFloatingToolbar(FloatingToolbar floatingToolbar) {
mFloatingToolbar = floatingToolbar
.setMenu(mMenu)
- .setOnMenuItemClickListener(new MenuItem.OnMenuItemClickListener() {
- @Override
- public boolean onMenuItemClick(MenuItem item) {
- return mMenu.performItemAction(item, 0);
- }
- });
+ .setOnMenuItemClickListener(item -> mMenu.performItemAction(item, 0));
mFloatingToolbarVisibilityHelper = new FloatingToolbarVisibilityHelper(mFloatingToolbar);
mFloatingToolbarVisibilityHelper.activate();
}
@@ -142,21 +140,17 @@
@Override
public void invalidate() {
- checkToolbarInitialized();
mCallback.onPrepareActionMode(this, mMenu);
invalidateContentRect(); // Will re-layout and show the toolbar if necessary.
}
@Override
public void invalidateContentRect() {
- checkToolbarInitialized();
mCallback.onGetContentRect(this, mOriginatingView, mContentRect);
repositionToolbar();
}
public void updateViewLocationInWindow() {
- checkToolbarInitialized();
-
mOriginatingView.getLocationOnScreen(mViewPositionOnScreen);
mOriginatingView.getRootView().getLocationOnScreen(mRootViewPositionOnScreen);
mOriginatingView.getGlobalVisibleRect(mViewRectOnScreen);
@@ -172,8 +166,6 @@
}
private void repositionToolbar() {
- checkToolbarInitialized();
-
mContentRectOnScreen.set(mContentRect);
// Offset the content rect into screen coordinates, taking into account any transformations
@@ -235,8 +227,6 @@
@Override
public void hide(long duration) {
- checkToolbarInitialized();
-
if (duration == ActionMode.DEFAULT_HIDE_DURATION) {
duration = ViewConfiguration.getDefaultActionModeHideDuration();
}
@@ -253,14 +243,12 @@
@Override
public void onWindowFocusChanged(boolean hasWindowFocus) {
- checkToolbarInitialized();
mFloatingToolbarVisibilityHelper.setWindowFocused(hasWindowFocus);
mFloatingToolbarVisibilityHelper.updateToolbarVisibility();
}
@Override
public void finish() {
- checkToolbarInitialized();
reset();
mCallback.onDestroyActionMode(this);
}
@@ -290,14 +278,6 @@
return new MenuInflater(mContext);
}
- /**
- * @throws IllegalStateException
- */
- private void checkToolbarInitialized() {
- Preconditions.checkState(mFloatingToolbar != null);
- Preconditions.checkState(mFloatingToolbarVisibilityHelper != null);
- }
-
private void reset() {
mFloatingToolbar.dismiss();
mFloatingToolbarVisibilityHelper.deactivate();
diff --git a/core/java/com/android/internal/widget/ActionBarOverlayLayout.java b/core/java/com/android/internal/widget/ActionBarOverlayLayout.java
index 65cd4fa2..5d7fa6a 100644
--- a/core/java/com/android/internal/widget/ActionBarOverlayLayout.java
+++ b/core/java/com/android/internal/widget/ActionBarOverlayLayout.java
@@ -76,6 +76,7 @@
private final Rect mLastBaseContentInsets = new Rect();
private final Rect mContentInsets = new Rect();
private final Rect mBaseInnerInsets = new Rect();
+ private final Rect mLastBaseInnerInsets = new Rect();
private final Rect mInnerInsets = new Rect();
private final Rect mLastInnerInsets = new Rect();
@@ -323,6 +324,10 @@
mBaseInnerInsets.set(systemInsets);
computeFitSystemWindows(mBaseInnerInsets, mBaseContentInsets);
+ if (!mLastBaseInnerInsets.equals(mBaseInnerInsets)) {
+ changed = true;
+ mLastBaseContentInsets.set(mBaseContentInsets);
+ }
if (!mLastBaseContentInsets.equals(mBaseContentInsets)) {
changed = true;
mLastBaseContentInsets.set(mBaseContentInsets);
diff --git a/core/java/com/android/internal/widget/BackgroundFallback.java b/core/java/com/android/internal/widget/BackgroundFallback.java
index 4adba4d..309f80c 100644
--- a/core/java/com/android/internal/widget/BackgroundFallback.java
+++ b/core/java/com/android/internal/widget/BackgroundFallback.java
@@ -39,14 +39,22 @@
return mBackgroundFallback != null;
}
- public void draw(ViewGroup root, Canvas c, View content) {
+ /**
+ * Draws the fallback background.
+ *
+ * @param boundsView The view determining with which bounds the background should be drawn.
+ * @param root The view group containing the content.
+ * @param c The canvas to draw the background onto.
+ * @param content The view where the actual app content is contained in.
+ */
+ public void draw(ViewGroup boundsView, ViewGroup root, Canvas c, View content) {
if (!hasFallback()) {
return;
}
// Draw the fallback in the padding.
- final int width = root.getWidth();
- final int height = root.getHeight();
+ final int width = boundsView.getWidth();
+ final int height = boundsView.getHeight();
int left = width;
int top = height;
int right = 0;
diff --git a/core/java/com/android/internal/widget/FloatingToolbar.java b/core/java/com/android/internal/widget/FloatingToolbar.java
index 8c71cf7..40796e1 100644
--- a/core/java/com/android/internal/widget/FloatingToolbar.java
+++ b/core/java/com/android/internal/widget/FloatingToolbar.java
@@ -52,7 +52,6 @@
import android.view.animation.Transformation;
import android.view.animation.AnimationUtils;
import android.view.animation.Interpolator;
-import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.ImageButton;
import android.widget.ImageView;
@@ -67,6 +66,7 @@
import com.android.internal.R;
import com.android.internal.util.Preconditions;
+import java.util.Objects;
/**
* A floating toolbar for showing contextual menu items.
@@ -82,12 +82,7 @@
public static final String FLOATING_TOOLBAR_TAG = "floating_toolbar";
private static final MenuItem.OnMenuItemClickListener NO_OP_MENUITEM_CLICK_LISTENER =
- new MenuItem.OnMenuItemClickListener() {
- @Override
- public boolean onMenuItemClick(MenuItem item) {
- return false;
- }
- };
+ item -> false;
private final Context mContext;
private final Window mWindow;
@@ -97,7 +92,7 @@
private final Rect mPreviousContentRect = new Rect();
private Menu mMenu;
- private List<Object> mShowingMenuItems = new ArrayList<Object>();
+ private List<MenuItem> mShowingMenuItems = new ArrayList<>();
private MenuItem.OnMenuItemClickListener mMenuItemClickListener = NO_OP_MENUITEM_CLICK_LISTENER;
private int mSuggestedWidth;
@@ -237,7 +232,7 @@
if (!isCurrentlyShowing(menuItems) || mWidthChanged) {
mPopup.dismiss();
mPopup.layoutMenuItems(menuItems, mMenuItemClickListener, mSuggestedWidth);
- mShowingMenuItems = getShowingMenuItemsReferences(menuItems);
+ mShowingMenuItems = menuItems;
}
if (!mPopup.isShowing()) {
mPopup.show(mContentRect);
@@ -252,7 +247,23 @@
* Returns true if this floating toolbar is currently showing the specified menu items.
*/
private boolean isCurrentlyShowing(List<MenuItem> menuItems) {
- return mShowingMenuItems.equals(getShowingMenuItemsReferences(menuItems));
+ if (mShowingMenuItems == null || menuItems.size() != mShowingMenuItems.size()) {
+ return false;
+ }
+
+ final int size = menuItems.size();
+ for (int i = 0; i < size; i++) {
+ final MenuItem menuItem = menuItems.get(i);
+ final MenuItem showingItem = mShowingMenuItems.get(i);
+ if (menuItem.getItemId() != showingItem.getItemId()
+ || !TextUtils.equals(menuItem.getTitle(), showingItem.getTitle())
+ || !Objects.equals(menuItem.getIcon(), showingItem.getIcon())
+ || menuItem.getGroupId() != showingItem.getGroupId()) {
+ return false;
+ }
+ }
+
+ return true;
}
/**
@@ -260,7 +271,7 @@
* This method is recursive.
*/
private List<MenuItem> getVisibleAndEnabledMenuItems(Menu menu) {
- List<MenuItem> menuItems = new ArrayList<MenuItem>();
+ List<MenuItem> menuItems = new ArrayList<>();
for (int i = 0; (menu != null) && (i < menu.size()); i++) {
MenuItem menuItem = menu.getItem(i);
if (menuItem.isVisible() && menuItem.isEnabled()) {
@@ -305,22 +316,6 @@
}
}
- private List<Object> getShowingMenuItemsReferences(List<MenuItem> menuItems) {
- List<Object> references = new ArrayList<Object>();
- for (MenuItem menuItem : menuItems) {
- if (menuItem.getItemId() != Menu.NONE) {
- references.add(menuItem.getItemId());
- } else if (!TextUtils.isEmpty(menuItem.getTitle())) {
- references.add(menuItem.getTitle());
- } else if (menuItem.getIcon() != null){
- references.add(menuItem.getIcon());
- } else {
- references.add(menuItem);
- }
- }
- return references;
- }
-
private void registerOrientationHandler() {
unregisterOrientationHandler();
mWindow.getDecorView().addOnLayoutChangeListener(mOrientationChangeHandler);
@@ -383,19 +378,15 @@
private final Point mCoordsOnWindow = new Point(); // popup window coordinates.
/* Temporary data holders. Reset values before using. */
private final int[] mTmpCoords = new int[2];
- private final Rect mTmpRect = new Rect();
private final Region mTouchableRegion = new Region();
private final ViewTreeObserver.OnComputeInternalInsetsListener mInsetsComputer =
- new ViewTreeObserver.OnComputeInternalInsetsListener() {
- public void onComputeInternalInsets(
- ViewTreeObserver.InternalInsetsInfo info) {
- info.contentInsets.setEmpty();
- info.visibleInsets.setEmpty();
- info.touchableRegion.set(mTouchableRegion);
- info.setTouchableInsets(ViewTreeObserver.InternalInsetsInfo
- .TOUCHABLE_INSETS_REGION);
- }
+ info -> {
+ info.contentInsets.setEmpty();
+ info.visibleInsets.setEmpty();
+ info.touchableRegion.set(mTouchableRegion);
+ info.setTouchableInsets(
+ ViewTreeObserver.InternalInsetsInfo.TOUCHABLE_INSETS_REGION);
};
private final int mLineHeight;
@@ -1407,18 +1398,15 @@
final ImageButton overflowButton = (ImageButton) LayoutInflater.from(mContext)
.inflate(R.layout.floating_popup_overflow_button, null);
overflowButton.setImageDrawable(mOverflow);
- overflowButton.setOnClickListener(new View.OnClickListener() {
- @Override
- public void onClick(View v) {
- if (mIsOverflowOpen) {
- overflowButton.setImageDrawable(mToOverflow);
- mToOverflow.start();
- closeOverflow();
- } else {
- overflowButton.setImageDrawable(mToArrow);
- mToArrow.start();
- openOverflow();
- }
+ overflowButton.setOnClickListener(v -> {
+ if (mIsOverflowOpen) {
+ overflowButton.setImageDrawable(mToOverflow);
+ mToOverflow.start();
+ closeOverflow();
+ } else {
+ overflowButton.setImageDrawable(mToArrow);
+ mToArrow.start();
+ openOverflow();
}
});
return overflowButton;
@@ -1441,13 +1429,10 @@
};
overflowPanel.setAdapter(adapter);
- overflowPanel.setOnItemClickListener(new AdapterView.OnItemClickListener() {
- @Override
- public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
- MenuItem menuItem = (MenuItem) overflowPanel.getAdapter().getItem(position);
- if (mOnMenuItemClickListener != null) {
- mOnMenuItemClickListener.onMenuItemClick(menuItem);
- }
+ overflowPanel.setOnItemClickListener((parent, view, position, id) -> {
+ MenuItem menuItem = (MenuItem) overflowPanel.getAdapter().getItem(position);
+ if (mOnMenuItemClickListener != null) {
+ mOnMenuItemClickListener.onMenuItemClick(menuItem);
}
});
@@ -1479,12 +1464,9 @@
public void onAnimationEnd(Animation animation) {
// Posting this because it seems like this is called before the animation
// actually ends.
- mContentContainer.post(new Runnable() {
- @Override
- public void run() {
- setPanelsStatesAtRestingPosition();
- setContentAreaAsTouchableSurface();
- }
+ mContentContainer.post(() -> {
+ setPanelsStatesAtRestingPosition();
+ setContentAreaAsTouchableSurface();
});
}
diff --git a/core/jni/Android.mk b/core/jni/Android.mk
index cab4758..eb11182 100644
--- a/core/jni/Android.mk
+++ b/core/jni/Android.mk
@@ -318,6 +318,13 @@
# is not being compiled with that level. Remove once this has changed.
LOCAL_CLANG_CFLAGS += -Wno-c++11-extensions
+ifneq (,$(filter userdebug eng,$(TARGET_BUILD_VARIANT)))
+LOCAL_CFLAGS += -D__ANDROID_DEBUGGABLE__
+endif
+ifneq (,$(filter true, $(PRODUCT_FULL_TREBLE)))
+LOCAL_CFLAGS += -D__ANDROID_TREBLE__
+endif
+
include $(BUILD_SHARED_LIBRARY)
include $(call all-makefiles-under,$(LOCAL_PATH))
diff --git a/core/jni/AndroidRuntime.cpp b/core/jni/AndroidRuntime.cpp
index 369bb7f..785fd2c 100644
--- a/core/jni/AndroidRuntime.cpp
+++ b/core/jni/AndroidRuntime.cpp
@@ -16,7 +16,7 @@
#define ATRACE_TAG ATRACE_TAG_DALVIK
#define LOG_TAG "AndroidRuntime"
-//#define LOG_NDEBUG 0
+#define LOG_NDEBUG 1
#include <android_runtime/AndroidRuntime.h>
#include <binder/IBinder.h>
@@ -661,7 +661,7 @@
checkJni = true;
}
}
- ALOGD("CheckJNI is %s\n", checkJni ? "ON" : "OFF");
+ ALOGV("CheckJNI is %s\n", checkJni ? "ON" : "OFF");
if (checkJni) {
/* extended JNI checking */
addOption("-Xcheck:jni");
diff --git a/core/jni/android/graphics/Bitmap.cpp b/core/jni/android/graphics/Bitmap.cpp
index 0e67d30..b171a7e 100755
--- a/core/jni/android/graphics/Bitmap.cpp
+++ b/core/jni/android/graphics/Bitmap.cpp
@@ -1019,6 +1019,12 @@
///////////////////////////////////////////////////////////////////////////////
+// This is the maximum possible size because the SkColorSpace must be
+// representable (and therefore serializable) using a matrix and numerical
+// transfer function. If we allow more color space representations in the
+// framework, we may need to update this maximum size.
+static constexpr uint32_t kMaxColorSpaceSerializedBytes = 80;
+
static jobject Bitmap_createFromParcel(JNIEnv* env, jobject, jobject parcel) {
if (parcel == NULL) {
SkDebugf("-------- unparcel parcel is NULL\n");
@@ -1035,7 +1041,17 @@
if (kRGBA_F16_SkColorType == colorType) {
colorSpace = SkColorSpace::MakeSRGBLinear();
} else if (colorSpaceSize > 0) {
- colorSpace = SkColorSpace::Deserialize(p->readInplace(colorSpaceSize), colorSpaceSize);
+ if (colorSpaceSize > kMaxColorSpaceSerializedBytes) {
+ ALOGD("Bitmap_createFromParcel: Serialized SkColorSpace is larger than expected: "
+ "%d bytes\n", colorSpaceSize);
+ }
+
+ const void* data = p->readInplace(colorSpaceSize);
+ if (data) {
+ colorSpace = SkColorSpace::Deserialize(data, colorSpaceSize);
+ } else {
+ ALOGD("Bitmap_createFromParcel: Unable to read serialized SkColorSpace data\n");
+ }
}
const int width = p->readInt32();
const int height = p->readInt32();
@@ -1178,6 +1194,11 @@
size_t size = data->size();
p->writeUint32(size);
if (size > 0) {
+ if (size > kMaxColorSpaceSerializedBytes) {
+ ALOGD("Bitmap_writeToParcel: Serialized SkColorSpace is larger than expected: "
+ "%zu bytes\n", size);
+ }
+
p->write(data->data(), size);
}
} else {
diff --git a/core/jni/android/graphics/Shader.cpp b/core/jni/android/graphics/Shader.cpp
index 214d97c..5f803da 100644
--- a/core/jni/android/graphics/Shader.cpp
+++ b/core/jni/android/graphics/Shader.cpp
@@ -50,11 +50,14 @@
///////////////////////////////////////////////////////////////////////////////////////////////
-static void Shader_safeUnref(JNIEnv* env, jobject o, jlong shaderHandle) {
- SkShader* shader = reinterpret_cast<SkShader*>(shaderHandle);
+static void Shader_safeUnref(SkShader* shader) {
SkSafeUnref(shader);
}
+static jlong Shader_getNativeFinalizer(JNIEnv*, jobject) {
+ return static_cast<jlong>(reinterpret_cast<uintptr_t>(&Shader_safeUnref));
+}
+
///////////////////////////////////////////////////////////////////////////////////////////////
static jlong BitmapShader_constructor(JNIEnv* env, jobject o, jlong matrixPtr, jobject jbitmap,
@@ -284,7 +287,7 @@
};
static const JNINativeMethod gShaderMethods[] = {
- { "nativeSafeUnref", "(J)V", (void*)Shader_safeUnref },
+ { "nativeGetFinalizer", "()J", (void*)Shader_getNativeFinalizer },
};
static const JNINativeMethod gBitmapShaderMethods[] = {
diff --git a/core/jni/android_hardware_Radio.cpp b/core/jni/android_hardware_Radio.cpp
index b6b1ac7..18cf8ca 100644
--- a/core/jni/android_hardware_Radio.cpp
+++ b/core/jni/android_hardware_Radio.cpp
@@ -15,7 +15,7 @@
** limitations under the License.
*/
-//#define LOG_NDEBUG 0
+#define LOG_NDEBUG 1
#define LOG_TAG "Radio-JNI"
#include <utils/Log.h>
@@ -955,7 +955,7 @@
int ret = RegisterMethodsOrDie(env, kRadioModuleClassPathName, gModuleMethods, NELEM(gModuleMethods));
- ALOGI("%s DONE", __FUNCTION__);
+ ALOGV("%s DONE", __FUNCTION__);
return ret;
}
diff --git a/core/jni/android_os_HwBinder.cpp b/core/jni/android_os_HwBinder.cpp
index dcb2300..19f779f 100644
--- a/core/jni/android_os_HwBinder.cpp
+++ b/core/jni/android_os_HwBinder.cpp
@@ -23,6 +23,8 @@
#include "android_os_HwParcel.h"
#include "android_os_HwRemoteBinder.h"
+#include <cstring>
+
#include <JNIHelp.h>
#include <android/hidl/manager/1.0/IServiceManager.h>
#include <android/hidl/base/1.0/IBase.h>
@@ -331,8 +333,19 @@
IServiceManager::Transport transport = transportRet;
- if ( transport != IServiceManager::Transport::EMPTY
- && transport != IServiceManager::Transport::HWBINDER) {
+#ifdef __ANDROID_TREBLE__
+#ifdef __ANDROID_DEBUGGABLE__
+ const char* testingOverride = std::getenv("TREBLE_TESTING_OVERRIDE");
+ const bool vintfLegacy = (transport == IServiceManager::Transport::EMPTY)
+ && testingOverride && !strcmp(testingOverride, "true");
+#else // __ANDROID_TREBLE__ but not __ANDROID_DEBUGGABLE__
+ const bool vintfLegacy = false;
+#endif // __ANDROID_DEBUGGABLE__
+#else // not __ANDROID_TREBLE__
+ const bool vintfLegacy = (transport == IServiceManager::Transport::EMPTY);
+#endif // __ANDROID_TREBLE__";
+
+ if (transport != IServiceManager::Transport::HWBINDER && !vintfLegacy) {
LOG(ERROR) << "service " << ifaceName << " declares transport method "
<< toString(transport) << " but framework expects hwbinder.";
signalExceptionForError(env, UNKNOWN_ERROR, true /* canThrowRemoteException */);
diff --git a/core/jni/android_os_Parcel.cpp b/core/jni/android_os_Parcel.cpp
index 56f68d4..d740a76 100644
--- a/core/jni/android_os_Parcel.cpp
+++ b/core/jni/android_os_Parcel.cpp
@@ -119,11 +119,7 @@
Parcel* parcel = reinterpret_cast<Parcel*>(nativePtr);
if (parcel != NULL) {
const status_t err = parcel->setDataSize(size);
- //STOPSHIP: check for BADFLO is for a temporary debug using wtf. Remove once bug resolved.
- if (err == UNKNOWN_ERROR + 0xBADF10) {
- jniThrowExceptionFmt(env, "java/lang/IllegalArgumentException",
- "Attempt to resize (size = %d) Parcel would corrupt object memory", size);
- } else if (err != NO_ERROR) {
+ if (err != NO_ERROR) {
signalExceptionForError(env, clazz, err);
}
return parcel->getOpenAshmemSize();
diff --git a/core/jni/android_view_ThreadedRenderer.cpp b/core/jni/android_view_ThreadedRenderer.cpp
index e1c0a21..192e3bb 100644
--- a/core/jni/android_view_ThreadedRenderer.cpp
+++ b/core/jni/android_view_ThreadedRenderer.cpp
@@ -25,6 +25,10 @@
#include <GraphicsJNI.h>
#include <ScopedPrimitiveArray.h>
+#include <gui/BufferItemConsumer.h>
+#include <gui/BufferQueue.h>
+#include <gui/Surface.h>
+
#include <EGL/egl.h>
#include <EGL/eglext.h>
#include <private/EGL/cache.h>
@@ -851,6 +855,75 @@
return RenderProxy::copySurfaceInto(surface, left, top, right, bottom, &bitmap);
}
+class ContextFactory : public IContextFactory {
+public:
+ virtual AnimationContext* createAnimationContext(renderthread::TimeLord& clock) {
+ return new AnimationContext(clock);
+ }
+};
+
+static jobject android_view_ThreadedRenderer_createHardwareBitmapFromRenderNode(JNIEnv* env,
+ jobject clazz, jlong renderNodePtr, jint jwidth, jint jheight) {
+ RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr);
+ if (jwidth <= 0 || jheight <= 0) {
+ ALOGW("Invalid width %d or height %d", jwidth, jheight);
+ return nullptr;
+ }
+
+ uint32_t width = jwidth;
+ uint32_t height = jheight;
+
+ // Create a Surface wired up to a BufferItemConsumer
+ sp<IGraphicBufferProducer> producer;
+ sp<IGraphicBufferConsumer> rawConsumer;
+ BufferQueue::createBufferQueue(&producer, &rawConsumer);
+ rawConsumer->setMaxBufferCount(1);
+ sp<BufferItemConsumer> consumer = new BufferItemConsumer(rawConsumer,
+ GRALLOC_USAGE_HW_TEXTURE | GRALLOC_USAGE_SW_READ_NEVER | GRALLOC_USAGE_SW_WRITE_NEVER);
+ consumer->setDefaultBufferSize(width, height);
+ sp<Surface> surface = new Surface(producer);
+
+ // Render into the surface
+ {
+ ContextFactory factory;
+ RenderProxy proxy{false, renderNode, &factory};
+ proxy.loadSystemProperties();
+ proxy.setSwapBehavior(SwapBehavior::kSwap_discardBuffer);
+ proxy.initialize(surface);
+ // Shadows can't be used via this interface, so just set the light source
+ // to all 0s.
+ proxy.setup(0, 0, 0);
+ proxy.setLightCenter((Vector3){0, 0, 0});
+ nsecs_t vsync = systemTime(CLOCK_MONOTONIC);
+ UiFrameInfoBuilder(proxy.frameInfo())
+ .setVsync(vsync, vsync)
+ .addFlag(FrameInfoFlags::SurfaceCanvas);
+ proxy.syncAndDrawFrame();
+ }
+
+ // Yank out the GraphicBuffer
+ BufferItem bufferItem;
+ status_t err;
+ if ((err = consumer->acquireBuffer(&bufferItem, 0, true)) != OK) {
+ ALOGW("Failed to acquireBuffer, error %d (%s)", err, strerror(-err));
+ return nullptr;
+ }
+ sp<GraphicBuffer> buffer = bufferItem.mGraphicBuffer;
+ // We don't really care if this fails or not since we're just going to destroy this anyway
+ consumer->releaseBuffer(bufferItem);
+ if (!buffer.get()) {
+ ALOGW("GraphicBuffer is null?");
+ return nullptr;
+ }
+ if (buffer->getWidth() != width || buffer->getHeight() != height) {
+ ALOGW("GraphicBuffer size mismatch, got %dx%d expected %dx%d",
+ buffer->getWidth(), buffer->getHeight(), width, height);
+ // Continue I guess?
+ }
+ sk_sp<Bitmap> bitmap = Bitmap::createFrom(buffer);
+ return createBitmap(env, bitmap.release(), android::bitmap::kBitmapCreateFlag_Mutable);
+}
+
// ----------------------------------------------------------------------------
// FrameMetricsObserver
// ----------------------------------------------------------------------------
@@ -947,6 +1020,8 @@
(void*)android_view_ThreadedRenderer_removeFrameMetricsObserver },
{ "nCopySurfaceInto", "(Landroid/view/Surface;IIIILandroid/graphics/Bitmap;)I",
(void*)android_view_ThreadedRenderer_copySurfaceInto },
+ { "nCreateHardwareBitmap", "(JII)Landroid/graphics/Bitmap;",
+ (void*)android_view_ThreadedRenderer_createHardwareBitmapFromRenderNode },
};
int register_android_view_ThreadedRenderer(JNIEnv* env) {
diff --git a/core/jni/com_android_internal_os_Zygote.cpp b/core/jni/com_android_internal_os_Zygote.cpp
index 6000fb5..d73e7dd 100644
--- a/core/jni/com_android_internal_os_Zygote.cpp
+++ b/core/jni/com_android_internal_os_Zygote.cpp
@@ -27,6 +27,7 @@
#include <fcntl.h>
#include <grp.h>
#include <inttypes.h>
+#include <malloc.h>
#include <mntent.h>
#include <paths.h>
#include <signal.h>
@@ -519,6 +520,9 @@
// The child process.
gMallocLeakZygoteChild = 1;
+ // Set the jemalloc decay time to 1.
+ mallopt(M_DECAY_TIME, 1);
+
// Clean up any descriptors which must be closed immediately
DetachDescriptors(env, fdsToClose);
diff --git a/core/proto/android/providers/settings.proto b/core/proto/android/providers/settings.proto
index 8b73daf..e212c43 100644
--- a/core/proto/android/providers/settings.proto
+++ b/core/proto/android/providers/settings.proto
@@ -310,7 +310,7 @@
SettingProto lte_service_forced = 265;
SettingProto ephemeral_cookie_max_size_bytes = 266;
SettingProto enable_ephemeral_feature = 267;
- SettingProto uninstalled_ephemeral_app_cache_duration_millis = 268;
+ SettingProto installed_instant_app_min_cache_period = 268;
SettingProto allow_user_switching_when_system_user_locked = 269;
SettingProto boot_count = 270;
SettingProto safe_boot_disallowed = 271;
@@ -331,6 +331,10 @@
SettingProto network_recommendations_package = 286;
SettingProto bluetooth_a2dp_supports_optional_codecs_prefix = 287;
SettingProto bluetooth_a2dp_optional_codecs_enabled_prefix = 288;
+ SettingProto installed_instant_app_max_cache_period = 289;
+ SettingProto uninstalled_instant_app_min_cache_period = 290;
+ SettingProto uninstalled_instant_app_max_cache_period = 291;
+ SettingProto unused_static_shared_lib_min_cache_period = 292;
}
message SecureSettingsProto {
diff --git a/core/res/AndroidManifest.xml b/core/res/AndroidManifest.xml
index 18cfc99..f8044e2 100644
--- a/core/res/AndroidManifest.xml
+++ b/core/res/AndroidManifest.xml
@@ -1901,6 +1901,10 @@
android:description="@string/permdesc_useDataInBackground"
android:protectionLevel="normal" />
+ <!-- @hide Allows an application to set display offsets for the screen.
+ This permission is not available to third party applications. -->
+ <permission android:name="android.permission.SET_DISPLAY_OFFSET"
+ android:protectionLevel="signature|privileged" />
<!-- ================================== -->
<!-- Permissions affecting the system wallpaper -->
@@ -3317,12 +3321,16 @@
confirmation UI for full backup/restore -->
<uses-permission android:name="android.permission.CONFIRM_FULL_BACKUP"/>
-
- <!-- Allows the holder to access the instant applications on the device.
+ <!-- Allows the holder to access and manage instant applications on the device.
@hide -->
<permission android:name="android.permission.ACCESS_INSTANT_APPS"
android:protectionLevel="signature|installer|verifier" />
+ <!-- Allows the holder to view the instant applications on the device.
+ @hide -->
+ <permission android:name="android.permission.VIEW_INSTANT_APPS"
+ android:protectionLevel="signature|preinstalled" />
+
<!-- Allows receiving the usage of media resource e.g. video/audio codec and
graphic memory.
@hide -->
diff --git a/core/res/res/layout/activity_chooser_view_list_item.xml b/core/res/res/layout/activity_chooser_view_list_item.xml
index 66e400a..4678f76 100644
--- a/core/res/res/layout/activity_chooser_view_list_item.xml
+++ b/core/res/res/layout/activity_chooser_view_list_item.xml
@@ -21,7 +21,7 @@
android:paddingStart="?attr/listPreferredItemPaddingStart"
android:paddingEnd="?attr/listPreferredItemPaddingEnd"
android:minWidth="196dip"
- android:background="?attr/activatedBackgroundIndicator"
+ android:background="?attr/selectableItemBackground"
android:orientation="vertical" >
<LinearLayout
diff --git a/core/res/res/values-af/strings.xml b/core/res/res/values-af/strings.xml
index bafd40d..d78a980 100644
--- a/core/res/res/values-af/strings.xml
+++ b/core/res/res/values-af/strings.xml
@@ -491,8 +491,7 @@
<string name="fingerprint_error_timeout" msgid="3927186043737732875">"Vingerafdrukuittelling is bereik. Probeer weer."</string>
<string name="fingerprint_error_canceled" msgid="4402024612660774395">"Vingerafdrukhandeling is gekanselleer."</string>
<string name="fingerprint_error_lockout" msgid="5536934748136933450">"Te veel pogings. Probeer later weer."</string>
- <!-- no translation found for fingerprint_error_lockout_permanent (5033251797919508137) -->
- <skip />
+ <string name="fingerprint_error_lockout_permanent" msgid="5033251797919508137">"Te veel pogings. Vingerafdruksensor is gedeaktiveer."</string>
<string name="fingerprint_error_unable_to_process" msgid="6107816084103552441">"Probeer weer."</string>
<string name="fingerprint_name_template" msgid="5870957565512716938">"Vinger <xliff:g id="FINGERID">%d</xliff:g>"</string>
<string-array name="fingerprint_error_vendor">
diff --git a/core/res/res/values-am/strings.xml b/core/res/res/values-am/strings.xml
index d91c185..475167e 100644
--- a/core/res/res/values-am/strings.xml
+++ b/core/res/res/values-am/strings.xml
@@ -491,8 +491,7 @@
<string name="fingerprint_error_timeout" msgid="3927186043737732875">"የጣት አሻራ ማብቂያ ጊዜ ደርሷል። እንደገና ይሞክሩ።"</string>
<string name="fingerprint_error_canceled" msgid="4402024612660774395">"የጣት አሻራ ስርዓተ ክወና ተትቷል።"</string>
<string name="fingerprint_error_lockout" msgid="5536934748136933450">"ከልክ በላይ ብዙ ሙከራዎች። በኋላ ላይ እንደገና ይሞክሩ።"</string>
- <!-- no translation found for fingerprint_error_lockout_permanent (5033251797919508137) -->
- <skip />
+ <string name="fingerprint_error_lockout_permanent" msgid="5033251797919508137">"በጣም ብዙ ሙከራዎች። የጣት አሻራ ዳሳሽ ተሰናክሏል።"</string>
<string name="fingerprint_error_unable_to_process" msgid="6107816084103552441">"እንደገና ይሞክሩ።"</string>
<string name="fingerprint_name_template" msgid="5870957565512716938">"ጣት <xliff:g id="FINGERID">%d</xliff:g>"</string>
<string-array name="fingerprint_error_vendor">
diff --git a/core/res/res/values-ar/strings.xml b/core/res/res/values-ar/strings.xml
index 2646333..7e5a081 100644
--- a/core/res/res/values-ar/strings.xml
+++ b/core/res/res/values-ar/strings.xml
@@ -503,8 +503,7 @@
<string name="fingerprint_error_timeout" msgid="3927186043737732875">"تم بلوغ مهلة إدخال بصمة الإصبع. أعد المحاولة."</string>
<string name="fingerprint_error_canceled" msgid="4402024612660774395">"تم إلغاء تشغيل بصمة الإصبع."</string>
<string name="fingerprint_error_lockout" msgid="5536934748136933450">"تم إجراء عدد كبير من المحاولات. أعد المحاولة لاحقًا."</string>
- <!-- no translation found for fingerprint_error_lockout_permanent (5033251797919508137) -->
- <skip />
+ <string name="fingerprint_error_lockout_permanent" msgid="5033251797919508137">"تم إجراء عدد كبير جدًا من المحاولات. لذا تم تعطيل مستشعر بصمات الإصبع."</string>
<string name="fingerprint_error_unable_to_process" msgid="6107816084103552441">"أعد المحاولة."</string>
<string name="fingerprint_name_template" msgid="5870957565512716938">"الإصبع <xliff:g id="FINGERID">%d</xliff:g>"</string>
<string-array name="fingerprint_error_vendor">
@@ -704,7 +703,7 @@
<string name="relationTypeFriend" msgid="7313106762483391262">"صديق"</string>
<string name="relationTypeManager" msgid="6365677861610137895">"مدير"</string>
<string name="relationTypeMother" msgid="4578571352962758304">"أم"</string>
- <string name="relationTypeParent" msgid="4755635567562925226">"الأبوان"</string>
+ <string name="relationTypeParent" msgid="4755635567562925226">"الوالدان"</string>
<string name="relationTypePartner" msgid="7266490285120262781">"شريك"</string>
<string name="relationTypeReferredBy" msgid="101573059844135524">"جهة الإحالة"</string>
<string name="relationTypeRelative" msgid="1799819930085610271">"قريب"</string>
diff --git a/core/res/res/values-az/strings.xml b/core/res/res/values-az/strings.xml
index a4a3881..f9c699c 100644
--- a/core/res/res/values-az/strings.xml
+++ b/core/res/res/values-az/strings.xml
@@ -491,8 +491,7 @@
<string name="fingerprint_error_timeout" msgid="3927186043737732875">"Barmaq izinin vaxtı başa çatdı. Yenidən cəhd edin."</string>
<string name="fingerprint_error_canceled" msgid="4402024612660774395">"Barmaq izi əməliyyatı ləğv edildi."</string>
<string name="fingerprint_error_lockout" msgid="5536934748136933450">"Cəhdlər çox oldu. Sonraya saxlayın."</string>
- <!-- no translation found for fingerprint_error_lockout_permanent (5033251797919508137) -->
- <skip />
+ <string name="fingerprint_error_lockout_permanent" msgid="5033251797919508137">"Həddindən çox cəhd. Barmaq izi sensoru deaktiv edilib."</string>
<string name="fingerprint_error_unable_to_process" msgid="6107816084103552441">"Yenidən cəhd edin."</string>
<string name="fingerprint_name_template" msgid="5870957565512716938">"Barmaq <xliff:g id="FINGERID">%d</xliff:g>"</string>
<string-array name="fingerprint_error_vendor">
diff --git a/core/res/res/values-b+sr+Latn/strings.xml b/core/res/res/values-b+sr+Latn/strings.xml
index ebb5cd0..b7bdb69 100644
--- a/core/res/res/values-b+sr+Latn/strings.xml
+++ b/core/res/res/values-b+sr+Latn/strings.xml
@@ -494,8 +494,7 @@
<string name="fingerprint_error_timeout" msgid="3927186043737732875">"Vremensko ograničenje za otisak prsta je isteklo. Probajte ponovo."</string>
<string name="fingerprint_error_canceled" msgid="4402024612660774395">"Radnja sa otiskom prsta je otkazana."</string>
<string name="fingerprint_error_lockout" msgid="5536934748136933450">"Previše pokušaja. Probajte ponovo kasnije."</string>
- <!-- no translation found for fingerprint_error_lockout_permanent (5033251797919508137) -->
- <skip />
+ <string name="fingerprint_error_lockout_permanent" msgid="5033251797919508137">"Previše pokušaja. Senzor za otisak prsta je onemogućen."</string>
<string name="fingerprint_error_unable_to_process" msgid="6107816084103552441">"Probajte ponovo."</string>
<string name="fingerprint_name_template" msgid="5870957565512716938">"Prst <xliff:g id="FINGERID">%d</xliff:g>"</string>
<string-array name="fingerprint_error_vendor">
@@ -1247,7 +1246,7 @@
<string name="ext_media_nomedia_notification_message" msgid="6471542972147056586">"Uređaj <xliff:g id="NAME">%s</xliff:g> je uklonjen; umetnite novi"</string>
<string name="ext_media_unmounting_notification_title" msgid="640674168454809372">"<xliff:g id="NAME">%s</xliff:g> se još uvek izbacuje…"</string>
<string name="ext_media_unmounting_notification_message" msgid="4182843895023357756">"Ne uklanjajte"</string>
- <string name="ext_media_init_action" msgid="7952885510091978278">"Podesi"</string>
+ <string name="ext_media_init_action" msgid="7952885510091978278">"Aktiviraj"</string>
<string name="ext_media_unmount_action" msgid="1121883233103278199">"Izbaci"</string>
<string name="ext_media_browse_action" msgid="8322172381028546087">"Istraži"</string>
<string name="ext_media_missing_title" msgid="620980315821543904">"<xliff:g id="NAME">%s</xliff:g> nedostaje"</string>
diff --git a/core/res/res/values-be/strings.xml b/core/res/res/values-be/strings.xml
index 32cec88..6515803 100644
--- a/core/res/res/values-be/strings.xml
+++ b/core/res/res/values-be/strings.xml
@@ -497,8 +497,7 @@
<string name="fingerprint_error_timeout" msgid="3927186043737732875">"Час чакання адбіткаў пальцаў выйшаў. Паспрабуйце яшчэ раз."</string>
<string name="fingerprint_error_canceled" msgid="4402024612660774395">"Аперацыя з адбіткамі пальцаў скасавана."</string>
<string name="fingerprint_error_lockout" msgid="5536934748136933450">"Занадта шмат спроб. Паспрабуйце яшчэ раз пазней."</string>
- <!-- no translation found for fingerprint_error_lockout_permanent (5033251797919508137) -->
- <skip />
+ <string name="fingerprint_error_lockout_permanent" msgid="5033251797919508137">"Занадта шмат спроб. Сканер адбіткаў пальцаў адключаны."</string>
<string name="fingerprint_error_unable_to_process" msgid="6107816084103552441">"Паспрабуйце яшчэ раз."</string>
<string name="fingerprint_name_template" msgid="5870957565512716938">"Палец <xliff:g id="FINGERID">%d</xliff:g>"</string>
<string-array name="fingerprint_error_vendor">
diff --git a/core/res/res/values-bg/strings.xml b/core/res/res/values-bg/strings.xml
index e72b2f9..ba640b5 100644
--- a/core/res/res/values-bg/strings.xml
+++ b/core/res/res/values-bg/strings.xml
@@ -260,8 +260,7 @@
<string name="notification_channel_updates" msgid="4794517569035110397">"Актуализации"</string>
<string name="notification_channel_network_status" msgid="5025648583129035447">"Състояние на мрежата"</string>
<string name="notification_channel_network_alerts" msgid="2895141221414156525">"Сигнали за мрежата"</string>
- <!-- no translation found for notification_channel_network_available (4531717914138179517) -->
- <skip />
+ <string name="notification_channel_network_available" msgid="4531717914138179517">"Налице е мрежа"</string>
<string name="notification_channel_vpn" msgid="8330103431055860618">"Състояние на VPN"</string>
<string name="notification_channel_device_admin" msgid="1568154104368069249">"Администриране на устройство"</string>
<string name="notification_channel_alerts" msgid="4496839309318519037">"Сигнали"</string>
@@ -492,8 +491,7 @@
<string name="fingerprint_error_timeout" msgid="3927186043737732875">"Времето за изчакване за отпечатък изтече. Опитайте отново."</string>
<string name="fingerprint_error_canceled" msgid="4402024612660774395">"Операцията за отпечатък е анулирана."</string>
<string name="fingerprint_error_lockout" msgid="5536934748136933450">"Твърде много опити. Пробвайте отново по-късно."</string>
- <!-- no translation found for fingerprint_error_lockout_permanent (5033251797919508137) -->
- <skip />
+ <string name="fingerprint_error_lockout_permanent" msgid="5033251797919508137">"Твърде много опити. Сензорът за отпечатъци е деактивиран."</string>
<string name="fingerprint_error_unable_to_process" msgid="6107816084103552441">"Опитайте отново."</string>
<string name="fingerprint_name_template" msgid="5870957565512716938">"Пръст <xliff:g id="FINGERID">%d</xliff:g>"</string>
<string-array name="fingerprint_error_vendor">
diff --git a/core/res/res/values-bn/strings.xml b/core/res/res/values-bn/strings.xml
index 954c910..ec7bc7d 100644
--- a/core/res/res/values-bn/strings.xml
+++ b/core/res/res/values-bn/strings.xml
@@ -260,8 +260,7 @@
<string name="notification_channel_updates" msgid="4794517569035110397">"আপডেটগুলি"</string>
<string name="notification_channel_network_status" msgid="5025648583129035447">"নেটওয়ার্কের স্থিতি"</string>
<string name="notification_channel_network_alerts" msgid="2895141221414156525">"নেটওয়ার্ক সক্রান্ত অ্যালার্ট"</string>
- <!-- no translation found for notification_channel_network_available (4531717914138179517) -->
- <skip />
+ <string name="notification_channel_network_available" msgid="4531717914138179517">"নেটওয়ার্ক পাওয়া যাচ্ছে"</string>
<string name="notification_channel_vpn" msgid="8330103431055860618">"VPN এর স্থিতি"</string>
<string name="notification_channel_device_admin" msgid="1568154104368069249">"ডিভাইস প্রশাসন"</string>
<string name="notification_channel_alerts" msgid="4496839309318519037">"সতর্কতাগুলি"</string>
@@ -492,8 +491,7 @@
<string name="fingerprint_error_timeout" msgid="3927186043737732875">"আঙ্গুলের ছাপ নেওয়ার সময়সীমা শেষ হযেছে৷ আবার চেষ্টা করুন৷"</string>
<string name="fingerprint_error_canceled" msgid="4402024612660774395">"আঙ্গুলের ছাপ অপারেশন বাতিল করা হয়েছে৷"</string>
<string name="fingerprint_error_lockout" msgid="5536934748136933450">"অনেকবার প্রচেষ্টা করা হয়েছে৷ পরে আবার চেষ্টা করুন৷"</string>
- <!-- no translation found for fingerprint_error_lockout_permanent (5033251797919508137) -->
- <skip />
+ <string name="fingerprint_error_lockout_permanent" msgid="5033251797919508137">"বহুবার চেষ্টা করেছেন। আঙ্গুলের ছাপ নেওয়ার সেন্সর অক্ষম করা হয়েছে।"</string>
<string name="fingerprint_error_unable_to_process" msgid="6107816084103552441">"আবার চেষ্টা করুন৷"</string>
<string name="fingerprint_name_template" msgid="5870957565512716938">"আঙ্গুল <xliff:g id="FINGERID">%d</xliff:g>"</string>
<string-array name="fingerprint_error_vendor">
diff --git a/core/res/res/values-bs/strings.xml b/core/res/res/values-bs/strings.xml
index 101afb7..06e6020 100644
--- a/core/res/res/values-bs/strings.xml
+++ b/core/res/res/values-bs/strings.xml
@@ -28,15 +28,15 @@
<string name="petabyteShort" msgid="5637816680144990219">"PB"</string>
<string name="fileSizeSuffix" msgid="8897567456150907538">"<xliff:g id="NUMBER">%1$s</xliff:g> <xliff:g id="UNIT">%2$s</xliff:g>"</string>
<string name="durationDays" msgid="6652371460511178259">"<xliff:g id="DAYS">%1$d</xliff:g> dana"</string>
- <string name="durationDayHours" msgid="2713107458736744435">"<xliff:g id="DAYS">%1$d</xliff:g> dan <xliff:g id="HOURS">%2$d</xliff:g> sati"</string>
- <string name="durationDayHour" msgid="7293789639090958917">"<xliff:g id="DAYS">%1$d</xliff:g> dan <xliff:g id="HOURS">%2$d</xliff:g> sat"</string>
+ <string name="durationDayHours" msgid="2713107458736744435">"<xliff:g id="DAYS">%1$d</xliff:g> d i <xliff:g id="HOURS">%2$d</xliff:g> h"</string>
+ <string name="durationDayHour" msgid="7293789639090958917">"<xliff:g id="DAYS">%1$d</xliff:g> d i <xliff:g id="HOURS">%2$d</xliff:g> h"</string>
<string name="durationHours" msgid="4266858287167358988">"<xliff:g id="HOURS">%1$d</xliff:g> sati"</string>
- <string name="durationHourMinutes" msgid="9029176248692041549">"<xliff:g id="HOURS">%1$d</xliff:g> sat <xliff:g id="MINUTES">%2$d</xliff:g> min"</string>
- <string name="durationHourMinute" msgid="2741677355177402539">"<xliff:g id="HOURS">%1$d</xliff:g> sat <xliff:g id="MINUTES">%2$d</xliff:g> min"</string>
+ <string name="durationHourMinutes" msgid="9029176248692041549">"<xliff:g id="HOURS">%1$d</xliff:g> h i <xliff:g id="MINUTES">%2$d</xliff:g> min"</string>
+ <string name="durationHourMinute" msgid="2741677355177402539">"<xliff:g id="HOURS">%1$d</xliff:g> h i <xliff:g id="MINUTES">%2$d</xliff:g> min"</string>
<string name="durationMinutes" msgid="3134226679883579347">"<xliff:g id="MINUTES">%1$d</xliff:g> min"</string>
<string name="durationMinute" msgid="7155301744174623818">"<xliff:g id="MINUTES">%1$d</xliff:g> min"</string>
- <string name="durationMinuteSeconds" msgid="1424656185379003751">"<xliff:g id="MINUTES">%1$d</xliff:g> min <xliff:g id="SECONDS">%2$d</xliff:g> sek"</string>
- <string name="durationMinuteSecond" msgid="3989228718067466680">"<xliff:g id="MINUTES">%1$d</xliff:g> min <xliff:g id="SECONDS">%2$d</xliff:g> sek"</string>
+ <string name="durationMinuteSeconds" msgid="1424656185379003751">"<xliff:g id="MINUTES">%1$d</xliff:g> min i <xliff:g id="SECONDS">%2$d</xliff:g> s"</string>
+ <string name="durationMinuteSecond" msgid="3989228718067466680">"<xliff:g id="MINUTES">%1$d</xliff:g> min i <xliff:g id="SECONDS">%2$d</xliff:g> s"</string>
<string name="durationSeconds" msgid="8050088505238241405">"<xliff:g id="SECONDS">%1$d</xliff:g> sek"</string>
<string name="durationSecond" msgid="985669622276420331">"<xliff:g id="SECONDS">%1$d</xliff:g> sek"</string>
<string name="untitled" msgid="4638956954852782576">"<Bez naslova>"</string>
@@ -447,7 +447,7 @@
<string name="permlab_accessNetworkState" msgid="4951027964348974773">"prikaz mrežnih veza"</string>
<string name="permdesc_accessNetworkState" msgid="8318964424675960975">"Omogućava aplikaciji pregled informacija o mrežnim vezama, npr. koje mreže postoje i koje su povezane."</string>
<string name="permlab_createNetworkSockets" msgid="7934516631384168107">"ima potpuni pristup mreži"</string>
- <string name="permdesc_createNetworkSockets" msgid="3403062187779724185">"Omogućava aplikaciji kreiranje spojnih tačaka sa mrežom i korištenje prilagođenih mrežnih protokola. Preglednik i druge aplikacije omogućavaju slanje podataka na internet, tako da ova dozvola nije potrebna za vršenje te radnje."</string>
+ <string name="permdesc_createNetworkSockets" msgid="3403062187779724185">"Omogućava aplikaciji kreiranje spojnih tačaka sa mrežom i korištenje prilagođenih mrežnih protokola. Preglednik i druge aplikacije omogućavaju slanje podataka na internet, tako da ovo odobrenje nije potrebno za vršenje te radnje."</string>
<string name="permlab_changeNetworkState" msgid="958884291454327309">"izmjene povezivanja na mrežu"</string>
<string name="permdesc_changeNetworkState" msgid="6789123912476416214">"Dozvoljava aplikaciji izmjenu stanja mrežne povezanosti."</string>
<string name="permlab_changeTetherState" msgid="5952584964373017960">"izmjene podijeljenog povezivanja"</string>
@@ -494,8 +494,7 @@
<string name="fingerprint_error_timeout" msgid="3927186043737732875">"Vremensko ograničenje za otisak prsta je isteklo. Pokušajte ponovo."</string>
<string name="fingerprint_error_canceled" msgid="4402024612660774395">"Radnja sa otiskom prsta je otkazana."</string>
<string name="fingerprint_error_lockout" msgid="5536934748136933450">"Previše pokušaja. Pokušajte ponovo kasnije."</string>
- <!-- no translation found for fingerprint_error_lockout_permanent (5033251797919508137) -->
- <skip />
+ <string name="fingerprint_error_lockout_permanent" msgid="5033251797919508137">"Previše pokušaja. Senzor za otisak prsta je onemogućen."</string>
<string name="fingerprint_error_unable_to_process" msgid="6107816084103552441">"Pokušajte ponovo."</string>
<string name="fingerprint_name_template" msgid="5870957565512716938">"Prst <xliff:g id="FINGERID">%d</xliff:g>"</string>
<string-array name="fingerprint_error_vendor">
@@ -849,7 +848,7 @@
<string name="permdesc_setAlarm" msgid="316392039157473848">"Dozvoljava aplikaciji postavljanje alarma u instaliranom budilniku. Moguće je da neki budilnici neće primijeniti ovu funkciju."</string>
<string name="permlab_addVoicemail" msgid="5525660026090959044">"dodavanje govorne pošte"</string>
<string name="permdesc_addVoicemail" msgid="6604508651428252437">"Dozvoljava aplikaciji dodavanje poruka u vašu ulaznu govornu poštu."</string>
- <string name="permlab_writeGeolocationPermissions" msgid="5962224158955273932">"izmjena geolokacijskih dozvola preglednika"</string>
+ <string name="permlab_writeGeolocationPermissions" msgid="5962224158955273932">"izmjena geolokacijskih odobrenja preglednika"</string>
<string name="permdesc_writeGeolocationPermissions" msgid="1083743234522638747">"Dozvoljava aplikaciji mijenjanje geolokacijskih odobrenja preglednika. Zlonamjerne aplikacije mogu to iskoristiti i dozvoliti slanje informacija o lokaciji proizvoljnim web lokcacijama."</string>
<string name="save_password_message" msgid="767344687139195790">"Želite li da preglednik zapamti ovu lozinku?"</string>
<string name="save_password_notnow" msgid="6389675316706699758">"Ne sada"</string>
@@ -1205,7 +1204,7 @@
<string name="date_time_done" msgid="2507683751759308828">"Gotovo"</string>
<string name="perms_new_perm_prefix" msgid="8257740710754301407"><font size="12" fgcolor="#ff33b5e5">"NOVO: "</font></string>
<string name="perms_description_app" msgid="5139836143293299417">"Aplikacija <xliff:g id="APP_NAME">%1$s</xliff:g> omogućava."</string>
- <string name="no_permissions" msgid="7283357728219338112">"Nisu potrebne dozvole"</string>
+ <string name="no_permissions" msgid="7283357728219338112">"Nisu potrebna odobrenja"</string>
<string name="perm_costs_money" msgid="4902470324142151116">"ovo se možda dodatno plaća"</string>
<string name="dlg_ok" msgid="7376953167039865701">"Uredu"</string>
<string name="usb_charging_notification_title" msgid="6895185153353640787">"Ovaj uređaj se puni preko USB-a"</string>
diff --git a/core/res/res/values-ca/strings.xml b/core/res/res/values-ca/strings.xml
index e928cd9..c5774cf 100644
--- a/core/res/res/values-ca/strings.xml
+++ b/core/res/res/values-ca/strings.xml
@@ -491,8 +491,7 @@
<string name="fingerprint_error_timeout" msgid="3927186043737732875">"S\'ha esgotat el temps d\'espera per a l\'empremta digital. Torna-ho a provar."</string>
<string name="fingerprint_error_canceled" msgid="4402024612660774395">"S\'ha cancel·lat l\'operació d\'empremta digital."</string>
<string name="fingerprint_error_lockout" msgid="5536934748136933450">"S\'han produït massa intents. Torna-ho a provar més tard."</string>
- <!-- no translation found for fingerprint_error_lockout_permanent (5033251797919508137) -->
- <skip />
+ <string name="fingerprint_error_lockout_permanent" msgid="5033251797919508137">"S\'han fet massa intents. S\'ha desactivat el sensor d\'empremtes digitals."</string>
<string name="fingerprint_error_unable_to_process" msgid="6107816084103552441">"Torna-ho a provar."</string>
<string name="fingerprint_name_template" msgid="5870957565512716938">"Dit <xliff:g id="FINGERID">%d</xliff:g>"</string>
<string-array name="fingerprint_error_vendor">
@@ -759,7 +758,7 @@
<string name="lockscreen_failed_attempts_now_wiping" product="tv" msgid="3195755534096192191">"Has provat de desbloquejar el televisor incorrectament <xliff:g id="NUMBER">%d</xliff:g> vegades. Ara es restabliran els valors de fàbrica de l\'aparell."</string>
<string name="lockscreen_failed_attempts_now_wiping" product="default" msgid="3025504721764922246">"Has provat de desbloquejar el telèfon <xliff:g id="NUMBER">%d</xliff:g> vegades incorrectament. Ara el telèfon es restablirà a la configuració predeterminada de fàbrica."</string>
<string name="lockscreen_too_many_failed_attempts_countdown" msgid="6251480343394389665">"Torneu-ho a provar d\'aquí a <xliff:g id="NUMBER">%d</xliff:g> segons."</string>
- <string name="lockscreen_forgot_pattern_button_text" msgid="2626999449610695930">"Heu oblidat el patró?"</string>
+ <string name="lockscreen_forgot_pattern_button_text" msgid="2626999449610695930">"Has oblidat el patró?"</string>
<string name="lockscreen_glogin_forgot_pattern" msgid="2588521501166032747">"Desbloqueig del compte"</string>
<string name="lockscreen_glogin_too_many_attempts" msgid="2751368605287288808">"Massa intents de patró"</string>
<string name="lockscreen_glogin_instructions" msgid="3931816256100707784">"Per desbloquejar el telèfon, inicia la sessió amb el compte de Google."</string>
@@ -1117,7 +1116,7 @@
<string name="wifi_no_internet" msgid="8451173622563841546">"La Wi-Fi no té accés a Internet"</string>
<string name="wifi_no_internet_detailed" msgid="8083079241212301741">"Toca per veure les opcions"</string>
<string name="network_switch_metered" msgid="4671730921726992671">"Actualment en ús: <xliff:g id="NETWORK_TYPE">%1$s</xliff:g>"</string>
- <string name="network_switch_metered_detail" msgid="5325661434777870353">"El dispositiu utilitza <xliff:g id="NEW_NETWORK">%1$s</xliff:g> en cas que <xliff:g id="PREVIOUS_NETWORK">%2$s</xliff:g> no tingui accés a Internet. És possible que s\'apliquin càrrecs."</string>
+ <string name="network_switch_metered_detail" msgid="5325661434777870353">"El dispositiu utilitza <xliff:g id="NEW_NETWORK">%1$s</xliff:g> en cas que <xliff:g id="PREVIOUS_NETWORK">%2$s</xliff:g> no tingui accés a Internet. És possible que s\'hi apliquin càrrecs."</string>
<string name="network_switch_metered_toast" msgid="5779283181685974304">"Abans es feia servir la xarxa <xliff:g id="PREVIOUS_NETWORK">%1$s</xliff:g>; ara s\'utilitza <xliff:g id="NEW_NETWORK">%2$s</xliff:g>"</string>
<string-array name="network_switch_type_name">
<item msgid="3979506840912951943">"dades mòbils"</item>
@@ -1439,7 +1438,7 @@
<string name="display_manager_overlay_display_name" msgid="5142365982271620716">"Superposa #<xliff:g id="ID">%1$d</xliff:g>"</string>
<string name="display_manager_overlay_display_title" msgid="652124517672257172">"<xliff:g id="NAME">%1$s</xliff:g>: <xliff:g id="WIDTH">%2$d</xliff:g> x <xliff:g id="HEIGHT">%3$d</xliff:g>, <xliff:g id="DPI">%4$d</xliff:g> dpi"</string>
<string name="display_manager_overlay_display_secure_suffix" msgid="6022119702628572080">", segur"</string>
- <string name="kg_forgot_pattern_button_text" msgid="8852021467868220608">"Patró oblidat"</string>
+ <string name="kg_forgot_pattern_button_text" msgid="8852021467868220608">"He oblidat el patró"</string>
<string name="kg_wrong_pattern" msgid="1850806070801358830">"Patró incorrecte"</string>
<string name="kg_wrong_password" msgid="2333281762128113157">"Contrasenya incorrecta"</string>
<string name="kg_wrong_pin" msgid="1131306510833563801">"PIN incorrecte"</string>
diff --git a/core/res/res/values-cs/strings.xml b/core/res/res/values-cs/strings.xml
index 5b5dbcf..e33b3df 100644
--- a/core/res/res/values-cs/strings.xml
+++ b/core/res/res/values-cs/strings.xml
@@ -497,8 +497,7 @@
<string name="fingerprint_error_timeout" msgid="3927186043737732875">"Časový limit sejmutí otisku prstu vypršel. Zkuste to znovu."</string>
<string name="fingerprint_error_canceled" msgid="4402024612660774395">"Operace otisku prstu byla zrušena."</string>
<string name="fingerprint_error_lockout" msgid="5536934748136933450">"Příliš mnoho pokusů. Zkuste to později."</string>
- <!-- no translation found for fingerprint_error_lockout_permanent (5033251797919508137) -->
- <skip />
+ <string name="fingerprint_error_lockout_permanent" msgid="5033251797919508137">"Příliš mnoho pokusů. Snímač otisků prstů byl deaktivován."</string>
<string name="fingerprint_error_unable_to_process" msgid="6107816084103552441">"Zkuste to znovu."</string>
<string name="fingerprint_name_template" msgid="5870957565512716938">"Prst <xliff:g id="FINGERID">%d</xliff:g>"</string>
<string-array name="fingerprint_error_vendor">
diff --git a/core/res/res/values-da/strings.xml b/core/res/res/values-da/strings.xml
index 441a25b..cdb8a2b 100644
--- a/core/res/res/values-da/strings.xml
+++ b/core/res/res/values-da/strings.xml
@@ -369,11 +369,11 @@
<string name="permdesc_broadcastSticky" product="default" msgid="2825803764232445091">"Tillader, at appen kan sende klæbende udsendelser, der forbliver tilbage, når udsendelsen er slut. Overdreven brug kan gøre din telefon langsom eller ustabil ved at tvinge den til at bruge for meget hukommelse."</string>
<string name="permlab_readContacts" msgid="8348481131899886131">"læse dine kontaktpersoner"</string>
<string name="permdesc_readContacts" product="tablet" msgid="5294866856941149639">"Tillader, at appen kan læse data om de kontaktpersoner, der er gemt på din tablet, f.eks. hvor ofte du har ringet til, sendt e-mail til eller på anden måde kommunikeret med bestemte personer. Med denne tilladelse kan apps gemme dine kontaktdata, og skadelige apps kan dele kontaktdata uden din viden."</string>
- <string name="permdesc_readContacts" product="tv" msgid="1839238344654834087">"Giver appen lov til at læse data om dine kontaktpersoner, der er gemt på dit tv, herunder hvor ofte du har ringet, e-mailet eller på andre måder kommunikeret med bestemte personer. Denne tilladelse gør det muligt for apps at gemme dine kontaktoplysninger, og ondsindede apps kan dele kontaktoplysninger uden din viden."</string>
+ <string name="permdesc_readContacts" product="tv" msgid="1839238344654834087">"Giver appen lov til at læse data om dine kontaktpersoner, der er gemt på dit tv, herunder hvor ofte du har ringet, mailet eller på andre måder kommunikeret med bestemte personer. Denne tilladelse gør det muligt for apps at gemme dine kontaktoplysninger, og ondsindede apps kan dele kontaktoplysninger uden din viden."</string>
<string name="permdesc_readContacts" product="default" msgid="8440654152457300662">"Tillader, at appen kan læse data om de kontaktpersoner, der er gemt på din telefon, f.eks. hvor ofte du har ringet til, sendt e-mail til eller på anden måde kommunikeret med bestemte personer. Med denne tilladelse kan apps gemme dine kontaktdata, og skadelige apps kan dele kontaktdata uden din viden."</string>
<string name="permlab_writeContacts" msgid="5107492086416793544">"ændre dine kontaktpersoner"</string>
<string name="permdesc_writeContacts" product="tablet" msgid="897243932521953602">"Tillader, at appen kan ændre data om de kontaktpersoner, der er gemt på din tablet, f.eks. hvor ofte du har ringet til dem, sendt dem en e-mail eller på anden måde kommunikeret med bestemte kontaktpersoner. Med denne tilladelse kan apps slette kontaktoplysninger."</string>
- <string name="permdesc_writeContacts" product="tv" msgid="5438230957000018959">"Giver appen lov til at ændre data om dine kontaktpersoner, der er gemt på dit tv, herunder hvor ofte du har ringet, e-mailet eller på anden måde kommunikeret med bestemte kontaktpersoner. Denne tilladelse gør det muligt for apps at slette kontaktoplysninger."</string>
+ <string name="permdesc_writeContacts" product="tv" msgid="5438230957000018959">"Giver appen lov til at ændre data om dine kontaktpersoner, der er gemt på dit tv, herunder hvor ofte du har ringet, mailet eller på anden måde kommunikeret med bestemte kontaktpersoner. Denne tilladelse gør det muligt for apps at slette kontaktoplysninger."</string>
<string name="permdesc_writeContacts" product="default" msgid="589869224625163558">"Tillader, at appen kan ændre data om de kontaktpersoner, der er gemt på din telefon, f.eks. hvor ofte du har ringet til dem, sendt en e-mail til dem eller på anden måde kommunikeret med bestemte kontaktpersoner. Med denne tilladelse kan apps slette kontaktoplysninger."</string>
<string name="permlab_readCallLog" msgid="3478133184624102739">"læse opkaldsliste"</string>
<string name="permdesc_readCallLog" msgid="3204122446463552146">"Denne app kan læse din opkaldshistorik."</string>
@@ -491,8 +491,7 @@
<string name="fingerprint_error_timeout" msgid="3927186043737732875">"Registrering af fingeraftryk fik timeout. Prøv igen."</string>
<string name="fingerprint_error_canceled" msgid="4402024612660774395">"Fingeraftrykshandlingen blev annulleret."</string>
<string name="fingerprint_error_lockout" msgid="5536934748136933450">"Du har prøvet for mange gange. Prøv igen senere."</string>
- <!-- no translation found for fingerprint_error_lockout_permanent (5033251797919508137) -->
- <skip />
+ <string name="fingerprint_error_lockout_permanent" msgid="5033251797919508137">"Du har brugt for mange forsøg. Fingeraftrykslæseren er deaktiveret."</string>
<string name="fingerprint_error_unable_to_process" msgid="6107816084103552441">"Prøv igen."</string>
<string name="fingerprint_name_template" msgid="5870957565512716938">"Fingeraftryk <xliff:g id="FINGERID">%d</xliff:g>"</string>
<string-array name="fingerprint_error_vendor">
diff --git a/core/res/res/values-de/strings.xml b/core/res/res/values-de/strings.xml
index c158ad5..58f3204 100644
--- a/core/res/res/values-de/strings.xml
+++ b/core/res/res/values-de/strings.xml
@@ -491,8 +491,7 @@
<string name="fingerprint_error_timeout" msgid="3927186043737732875">"Zeitüberschreitung für Fingerabdruck. Versuche es erneut."</string>
<string name="fingerprint_error_canceled" msgid="4402024612660774395">"Fingerabdruckvorgang abgebrochen"</string>
<string name="fingerprint_error_lockout" msgid="5536934748136933450">"Zu viele Versuche. Versuche es später erneut."</string>
- <!-- no translation found for fingerprint_error_lockout_permanent (5033251797919508137) -->
- <skip />
+ <string name="fingerprint_error_lockout_permanent" msgid="5033251797919508137">"Zu viele Versuche. Der Fingerabdrucksensor wurde deaktiviert."</string>
<string name="fingerprint_error_unable_to_process" msgid="6107816084103552441">"Bitte versuche es erneut."</string>
<string name="fingerprint_name_template" msgid="5870957565512716938">"Finger <xliff:g id="FINGERID">%d</xliff:g>"</string>
<string-array name="fingerprint_error_vendor">
diff --git a/core/res/res/values-el/strings.xml b/core/res/res/values-el/strings.xml
index 10db204..780c69d 100644
--- a/core/res/res/values-el/strings.xml
+++ b/core/res/res/values-el/strings.xml
@@ -491,8 +491,7 @@
<string name="fingerprint_error_timeout" msgid="3927186043737732875">"Λήξη χρονικού ορίου μοναδικού χαρακτηριστικού. Δοκιμάστε ξανά."</string>
<string name="fingerprint_error_canceled" msgid="4402024612660774395">"Η λειτουργία μοναδικού χαρακτηριστικού ακυρώθηκε."</string>
<string name="fingerprint_error_lockout" msgid="5536934748136933450">"Πάρα πολλές προσπάθειες. Δοκιμάστε ξανά αργότερα."</string>
- <!-- no translation found for fingerprint_error_lockout_permanent (5033251797919508137) -->
- <skip />
+ <string name="fingerprint_error_lockout_permanent" msgid="5033251797919508137">"Πάρα πολλές προσπάθειες. Ο αισθητήρας δακτυλικών αποτυπωμάτων απενεργοποιήθηκε."</string>
<string name="fingerprint_error_unable_to_process" msgid="6107816084103552441">"Δοκιμάστε ξανά."</string>
<string name="fingerprint_name_template" msgid="5870957565512716938">"Δάχτυλο <xliff:g id="FINGERID">%d</xliff:g>"</string>
<string-array name="fingerprint_error_vendor">
diff --git a/core/res/res/values-en-rAU/strings.xml b/core/res/res/values-en-rAU/strings.xml
index 8a1b42c..2d823ea 100644
--- a/core/res/res/values-en-rAU/strings.xml
+++ b/core/res/res/values-en-rAU/strings.xml
@@ -491,8 +491,7 @@
<string name="fingerprint_error_timeout" msgid="3927186043737732875">"Fingerprint timeout reached. Try again."</string>
<string name="fingerprint_error_canceled" msgid="4402024612660774395">"Fingerprint operation cancelled."</string>
<string name="fingerprint_error_lockout" msgid="5536934748136933450">"Too many attempts. Try again later."</string>
- <!-- no translation found for fingerprint_error_lockout_permanent (5033251797919508137) -->
- <skip />
+ <string name="fingerprint_error_lockout_permanent" msgid="5033251797919508137">"Too many attempts. Fingerprint sensor disabled."</string>
<string name="fingerprint_error_unable_to_process" msgid="6107816084103552441">"Try again."</string>
<string name="fingerprint_name_template" msgid="5870957565512716938">"Finger <xliff:g id="FINGERID">%d</xliff:g>"</string>
<string-array name="fingerprint_error_vendor">
diff --git a/core/res/res/values-en-rGB/strings.xml b/core/res/res/values-en-rGB/strings.xml
index 8a1b42c..2d823ea 100644
--- a/core/res/res/values-en-rGB/strings.xml
+++ b/core/res/res/values-en-rGB/strings.xml
@@ -491,8 +491,7 @@
<string name="fingerprint_error_timeout" msgid="3927186043737732875">"Fingerprint timeout reached. Try again."</string>
<string name="fingerprint_error_canceled" msgid="4402024612660774395">"Fingerprint operation cancelled."</string>
<string name="fingerprint_error_lockout" msgid="5536934748136933450">"Too many attempts. Try again later."</string>
- <!-- no translation found for fingerprint_error_lockout_permanent (5033251797919508137) -->
- <skip />
+ <string name="fingerprint_error_lockout_permanent" msgid="5033251797919508137">"Too many attempts. Fingerprint sensor disabled."</string>
<string name="fingerprint_error_unable_to_process" msgid="6107816084103552441">"Try again."</string>
<string name="fingerprint_name_template" msgid="5870957565512716938">"Finger <xliff:g id="FINGERID">%d</xliff:g>"</string>
<string-array name="fingerprint_error_vendor">
diff --git a/core/res/res/values-en-rIN/strings.xml b/core/res/res/values-en-rIN/strings.xml
index 8a1b42c..2d823ea 100644
--- a/core/res/res/values-en-rIN/strings.xml
+++ b/core/res/res/values-en-rIN/strings.xml
@@ -491,8 +491,7 @@
<string name="fingerprint_error_timeout" msgid="3927186043737732875">"Fingerprint timeout reached. Try again."</string>
<string name="fingerprint_error_canceled" msgid="4402024612660774395">"Fingerprint operation cancelled."</string>
<string name="fingerprint_error_lockout" msgid="5536934748136933450">"Too many attempts. Try again later."</string>
- <!-- no translation found for fingerprint_error_lockout_permanent (5033251797919508137) -->
- <skip />
+ <string name="fingerprint_error_lockout_permanent" msgid="5033251797919508137">"Too many attempts. Fingerprint sensor disabled."</string>
<string name="fingerprint_error_unable_to_process" msgid="6107816084103552441">"Try again."</string>
<string name="fingerprint_name_template" msgid="5870957565512716938">"Finger <xliff:g id="FINGERID">%d</xliff:g>"</string>
<string-array name="fingerprint_error_vendor">
diff --git a/core/res/res/values-es-rUS/strings.xml b/core/res/res/values-es-rUS/strings.xml
index ba5af6d..45584b5 100644
--- a/core/res/res/values-es-rUS/strings.xml
+++ b/core/res/res/values-es-rUS/strings.xml
@@ -491,8 +491,7 @@
<string name="fingerprint_error_timeout" msgid="3927186043737732875">"Finalizó el tiempo de espera para la huella digital. Vuelve a intentarlo."</string>
<string name="fingerprint_error_canceled" msgid="4402024612660774395">"Se canceló la operación de huella digital."</string>
<string name="fingerprint_error_lockout" msgid="5536934748136933450">"Demasiados intentos. Vuelve a intentarlo más tarde."</string>
- <!-- no translation found for fingerprint_error_lockout_permanent (5033251797919508137) -->
- <skip />
+ <string name="fingerprint_error_lockout_permanent" msgid="5033251797919508137">"Realizaste demasiados intentos. Se inhabilitó el sensor de huellas digitales."</string>
<string name="fingerprint_error_unable_to_process" msgid="6107816084103552441">"Vuelve a intentarlo."</string>
<string name="fingerprint_name_template" msgid="5870957565512716938">"Dedo <xliff:g id="FINGERID">%d</xliff:g>"</string>
<string-array name="fingerprint_error_vendor">
diff --git a/core/res/res/values-es/strings.xml b/core/res/res/values-es/strings.xml
index 9369ee5..926ee47 100644
--- a/core/res/res/values-es/strings.xml
+++ b/core/res/res/values-es/strings.xml
@@ -491,8 +491,7 @@
<string name="fingerprint_error_timeout" msgid="3927186043737732875">"Se ha alcanzado el tiempo de espera de la huella digital. Vuelve a intentarlo."</string>
<string name="fingerprint_error_canceled" msgid="4402024612660774395">"Se ha cancelado la operación de huella digital."</string>
<string name="fingerprint_error_lockout" msgid="5536934748136933450">"Demasiados intentos. Vuelve a intentarlo más tarde."</string>
- <!-- no translation found for fingerprint_error_lockout_permanent (5033251797919508137) -->
- <skip />
+ <string name="fingerprint_error_lockout_permanent" msgid="5033251797919508137">"Demasiados intentos. Se ha inhabilitado el sensor de huellas digitales."</string>
<string name="fingerprint_error_unable_to_process" msgid="6107816084103552441">"Vuelve a intentarlo."</string>
<string name="fingerprint_name_template" msgid="5870957565512716938">"Dedo <xliff:g id="FINGERID">%d</xliff:g>"</string>
<string-array name="fingerprint_error_vendor">
diff --git a/core/res/res/values-et/strings.xml b/core/res/res/values-et/strings.xml
index d85a37f..7e690be 100644
--- a/core/res/res/values-et/strings.xml
+++ b/core/res/res/values-et/strings.xml
@@ -491,8 +491,7 @@
<string name="fingerprint_error_timeout" msgid="3927186043737732875">"Sõrmejälje riistvara taimeri ajalõpp. Proovige uuesti."</string>
<string name="fingerprint_error_canceled" msgid="4402024612660774395">"Sõrmejälje toiming tühistati."</string>
<string name="fingerprint_error_lockout" msgid="5536934748136933450">"Liiga palju katseid. Proovige hiljem uuesti."</string>
- <!-- no translation found for fingerprint_error_lockout_permanent (5033251797919508137) -->
- <skip />
+ <string name="fingerprint_error_lockout_permanent" msgid="5033251797919508137">"Liiga palju katseid. Sõrmejäljeandur on keelatud."</string>
<string name="fingerprint_error_unable_to_process" msgid="6107816084103552441">"Proovige uuesti."</string>
<string name="fingerprint_name_template" msgid="5870957565512716938">"Sõrm <xliff:g id="FINGERID">%d</xliff:g>"</string>
<string-array name="fingerprint_error_vendor">
diff --git a/core/res/res/values-eu/strings.xml b/core/res/res/values-eu/strings.xml
index 2abdeef..1407479 100644
--- a/core/res/res/values-eu/strings.xml
+++ b/core/res/res/values-eu/strings.xml
@@ -491,8 +491,7 @@
<string name="fingerprint_error_timeout" msgid="3927186043737732875">"Hatz-marka digitalak prozesatzeko denbora-muga gainditu da. Saiatu berriro."</string>
<string name="fingerprint_error_canceled" msgid="4402024612660774395">"Hatz-markaren eragiketa bertan behera utzi da."</string>
<string name="fingerprint_error_lockout" msgid="5536934748136933450">"Saiakera gehiegi egin dituzu. Saiatu berriro geroago."</string>
- <!-- no translation found for fingerprint_error_lockout_permanent (5033251797919508137) -->
- <skip />
+ <string name="fingerprint_error_lockout_permanent" msgid="5033251797919508137">"Saiakera gehiegi egin dituzu. Desgaitu egin da hatz-marken sentsorea."</string>
<string name="fingerprint_error_unable_to_process" msgid="6107816084103552441">"Saiatu berriro."</string>
<string name="fingerprint_name_template" msgid="5870957565512716938">"<xliff:g id="FINGERID">%d</xliff:g> hatza"</string>
<string-array name="fingerprint_error_vendor">
@@ -865,7 +864,7 @@
<string name="searchview_description_query" msgid="5911778593125355124">"Bilaketa-kontsulta"</string>
<string name="searchview_description_clear" msgid="1330281990951833033">"Garbitu kontsulta"</string>
<string name="searchview_description_submit" msgid="2688450133297983542">"Bidali kontsulta"</string>
- <string name="searchview_description_voice" msgid="2453203695674994440">"Ahots bidezko bilaketa"</string>
+ <string name="searchview_description_voice" msgid="2453203695674994440">"Ahozko bilaketa"</string>
<string name="enable_explore_by_touch_warning_title" msgid="7460694070309730149">"\"Arakatu ukituta\" eginbidea gaitu nahi duzu?"</string>
<string name="enable_explore_by_touch_warning_message" product="tablet" msgid="8655887539089910577">"<xliff:g id="ACCESSIBILITY_SERVICE_NAME">%1$s</xliff:g> zerbitzuak \"Arakatu ukituta\" eginbidea gaitu nahi du. Eginbide hori aktibatuta dagoenean, hatzaren azpian duzunaren azalpena ikus edo entzun dezakezu, edo tabletarekin elkarrekintzan aritzeko keinuak egin ditzakezu."</string>
<string name="enable_explore_by_touch_warning_message" product="default" msgid="2708199672852373195">"<xliff:g id="ACCESSIBILITY_SERVICE_NAME">%1$s</xliff:g> zerbitzuak \"Arakatu ukituta\" eginbidea gaitu nahi du. Eginbide hori aktibatuta dagoenean, hatzaren azpian duzunaren azalpena ikus edo entzun dezakezu, edo telefonoarekin elkarrekintzan aritzeko keinuak egin ditzakezu."</string>
diff --git a/core/res/res/values-fa/strings.xml b/core/res/res/values-fa/strings.xml
index 319a5a1..8b894ee 100644
--- a/core/res/res/values-fa/strings.xml
+++ b/core/res/res/values-fa/strings.xml
@@ -260,8 +260,7 @@
<string name="notification_channel_updates" msgid="4794517569035110397">"بهروزرسانیها"</string>
<string name="notification_channel_network_status" msgid="5025648583129035447">"وضعیت شبکه"</string>
<string name="notification_channel_network_alerts" msgid="2895141221414156525">"هشدارهای شبکه"</string>
- <!-- no translation found for notification_channel_network_available (4531717914138179517) -->
- <skip />
+ <string name="notification_channel_network_available" msgid="4531717914138179517">"شبکه دردسترس است"</string>
<string name="notification_channel_vpn" msgid="8330103431055860618">"وضعیت VPN"</string>
<string name="notification_channel_device_admin" msgid="1568154104368069249">"سرپرست دستگاه"</string>
<string name="notification_channel_alerts" msgid="4496839309318519037">"هشدارها"</string>
@@ -492,8 +491,7 @@
<string name="fingerprint_error_timeout" msgid="3927186043737732875">"مهلت زمانی ثبت اثر انگشت به پایان رسید. دوباره امتحان کنید."</string>
<string name="fingerprint_error_canceled" msgid="4402024612660774395">"عملکرد اثر انگشت لغو شد."</string>
<string name="fingerprint_error_lockout" msgid="5536934748136933450">"تلاشهای زیادی انجام شده است. بعداً دوباره امتحان کنید."</string>
- <!-- no translation found for fingerprint_error_lockout_permanent (5033251797919508137) -->
- <skip />
+ <string name="fingerprint_error_lockout_permanent" msgid="5033251797919508137">"تلاشهای بسیاری زیادی انجام شده است. حسگر اثر انگشت غیرفعال شد."</string>
<string name="fingerprint_error_unable_to_process" msgid="6107816084103552441">"دوباره امتحان کنید."</string>
<string name="fingerprint_name_template" msgid="5870957565512716938">"انگشت <xliff:g id="FINGERID">%d</xliff:g>"</string>
<string-array name="fingerprint_error_vendor">
diff --git a/core/res/res/values-fi/strings.xml b/core/res/res/values-fi/strings.xml
index f8fd2b3..af1a061 100644
--- a/core/res/res/values-fi/strings.xml
+++ b/core/res/res/values-fi/strings.xml
@@ -491,8 +491,7 @@
<string name="fingerprint_error_timeout" msgid="3927186043737732875">"Sormenjälkitunnistimen toiminta aikakatkaistiin. Yritä uudelleen."</string>
<string name="fingerprint_error_canceled" msgid="4402024612660774395">"Sormenjälkitoiminto peruutettiin."</string>
<string name="fingerprint_error_lockout" msgid="5536934748136933450">"Liian monta yritystä. Yritä myöhemmin uudelleen."</string>
- <!-- no translation found for fingerprint_error_lockout_permanent (5033251797919508137) -->
- <skip />
+ <string name="fingerprint_error_lockout_permanent" msgid="5033251797919508137">"Liian monta yritystä. Sormenjälkitunnistin poistettu käytöstä."</string>
<string name="fingerprint_error_unable_to_process" msgid="6107816084103552441">"Yritä uudelleen."</string>
<string name="fingerprint_name_template" msgid="5870957565512716938">"Sormi <xliff:g id="FINGERID">%d</xliff:g>"</string>
<string-array name="fingerprint_error_vendor">
diff --git a/core/res/res/values-fr-rCA/strings.xml b/core/res/res/values-fr-rCA/strings.xml
index 15071e9..ba2c01e 100644
--- a/core/res/res/values-fr-rCA/strings.xml
+++ b/core/res/res/values-fr-rCA/strings.xml
@@ -260,8 +260,7 @@
<string name="notification_channel_updates" msgid="4794517569035110397">"Mises à jour"</string>
<string name="notification_channel_network_status" msgid="5025648583129035447">"État du réseau"</string>
<string name="notification_channel_network_alerts" msgid="2895141221414156525">"Alertes réseau"</string>
- <!-- no translation found for notification_channel_network_available (4531717914138179517) -->
- <skip />
+ <string name="notification_channel_network_available" msgid="4531717914138179517">"Réseau accessible"</string>
<string name="notification_channel_vpn" msgid="8330103431055860618">"État du RPV"</string>
<string name="notification_channel_device_admin" msgid="1568154104368069249">"Administration d\'appareils"</string>
<string name="notification_channel_alerts" msgid="4496839309318519037">"Alertes"</string>
@@ -492,8 +491,7 @@
<string name="fingerprint_error_timeout" msgid="3927186043737732875">"Le temps attribué pour lire l\'empreinte est écoulé. Veuillez essayer de nouveau."</string>
<string name="fingerprint_error_canceled" msgid="4402024612660774395">"Opération d\'empreinte numérique annulée."</string>
<string name="fingerprint_error_lockout" msgid="5536934748136933450">"Trop de tentatives. Veuillez réessayer plus tard."</string>
- <!-- no translation found for fingerprint_error_lockout_permanent (5033251797919508137) -->
- <skip />
+ <string name="fingerprint_error_lockout_permanent" msgid="5033251797919508137">"Trop de tentatives. Capteur d\'empreintes digitales désactivé."</string>
<string name="fingerprint_error_unable_to_process" msgid="6107816084103552441">"Réessayer."</string>
<string name="fingerprint_name_template" msgid="5870957565512716938">"Doigt <xliff:g id="FINGERID">%d</xliff:g>"</string>
<string-array name="fingerprint_error_vendor">
diff --git a/core/res/res/values-fr/strings.xml b/core/res/res/values-fr/strings.xml
index 6a1b8b7..12c6866 100644
--- a/core/res/res/values-fr/strings.xml
+++ b/core/res/res/values-fr/strings.xml
@@ -491,8 +491,7 @@
<string name="fingerprint_error_timeout" msgid="3927186043737732875">"Délai de détection de l\'empreinte numérique expiré. Veuillez réessayer."</string>
<string name="fingerprint_error_canceled" msgid="4402024612660774395">"Opération d\'empreinte numérique annulée."</string>
<string name="fingerprint_error_lockout" msgid="5536934748136933450">"Trop de tentatives. Veuillez réessayer plus tard."</string>
- <!-- no translation found for fingerprint_error_lockout_permanent (5033251797919508137) -->
- <skip />
+ <string name="fingerprint_error_lockout_permanent" msgid="5033251797919508137">"Trop de tentatives. Lecteur d\'empreinte digitale désactivé."</string>
<string name="fingerprint_error_unable_to_process" msgid="6107816084103552441">"Veuillez réessayer."</string>
<string name="fingerprint_name_template" msgid="5870957565512716938">"Doigt <xliff:g id="FINGERID">%d</xliff:g>"</string>
<string-array name="fingerprint_error_vendor">
diff --git a/core/res/res/values-gl/strings.xml b/core/res/res/values-gl/strings.xml
index cfbb5c3..68998c3 100644
--- a/core/res/res/values-gl/strings.xml
+++ b/core/res/res/values-gl/strings.xml
@@ -491,8 +491,7 @@
<string name="fingerprint_error_timeout" msgid="3927186043737732875">"Esgotouse o tempo de espera da impresión dixital. Téntao de novo."</string>
<string name="fingerprint_error_canceled" msgid="4402024612660774395">"Cancelouse a operación da impresión dixital."</string>
<string name="fingerprint_error_lockout" msgid="5536934748136933450">"Demasiados intentos. Téntao de novo máis tarde."</string>
- <!-- no translation found for fingerprint_error_lockout_permanent (5033251797919508137) -->
- <skip />
+ <string name="fingerprint_error_lockout_permanent" msgid="5033251797919508137">"Demasiados intentos. Desactivouse o sensor de impresión dixital."</string>
<string name="fingerprint_error_unable_to_process" msgid="6107816084103552441">"Téntao de novo."</string>
<string name="fingerprint_name_template" msgid="5870957565512716938">"Dedo <xliff:g id="FINGERID">%d</xliff:g>"</string>
<string-array name="fingerprint_error_vendor">
diff --git a/core/res/res/values-gu/strings.xml b/core/res/res/values-gu/strings.xml
index e78dfa9..7cae6b6 100644
--- a/core/res/res/values-gu/strings.xml
+++ b/core/res/res/values-gu/strings.xml
@@ -491,8 +491,7 @@
<string name="fingerprint_error_timeout" msgid="3927186043737732875">"ફિંગરપ્રિન્ટનો સમય બાહ્ય થયો. ફરી પ્રયાસ કરો."</string>
<string name="fingerprint_error_canceled" msgid="4402024612660774395">"ફિંગરપ્રિન્ટ ઓપરેશન રદ કર્યું."</string>
<string name="fingerprint_error_lockout" msgid="5536934748136933450">"ઘણા બધા પ્રયત્નો. પછીથી ફરી પ્રયાસ કરો."</string>
- <!-- no translation found for fingerprint_error_lockout_permanent (5033251797919508137) -->
- <skip />
+ <string name="fingerprint_error_lockout_permanent" msgid="5033251797919508137">"ઘણા વધુ પ્રયત્નો. ફિંગરપ્રિન્ટ સેન્સર અક્ષમ કરવામાં આવ્યું છે."</string>
<string name="fingerprint_error_unable_to_process" msgid="6107816084103552441">"ફરી પ્રયાસ કરો."</string>
<string name="fingerprint_name_template" msgid="5870957565512716938">"આંગળી <xliff:g id="FINGERID">%d</xliff:g>"</string>
<string-array name="fingerprint_error_vendor">
diff --git a/core/res/res/values-hi/strings.xml b/core/res/res/values-hi/strings.xml
index 30be4d5..224710d 100644
--- a/core/res/res/values-hi/strings.xml
+++ b/core/res/res/values-hi/strings.xml
@@ -481,7 +481,7 @@
<string name="permdesc_useFingerprint" msgid="9165097460730684114">"ऐप के प्रमाणीकरण के लिए अंगुली की छाप हार्डवेयर का उपयोग करने देती है"</string>
<string name="fingerprint_acquired_partial" msgid="735082772341716043">"आंशिक फ़िंगरप्रिंट की पहचान की गई. कृपया पुनः प्रयास करें."</string>
<string name="fingerprint_acquired_insufficient" msgid="4596546021310923214">"फ़िंगरप्रिंट संसाधित नहीं हो सका. कृपया पुन: प्रयास करें."</string>
- <string name="fingerprint_acquired_imager_dirty" msgid="1087209702421076105">"फ़िंगरप्रिंट संवेदक गंदा है. कृपया साफ़ करें और पुनः प्रयास करें."</string>
+ <string name="fingerprint_acquired_imager_dirty" msgid="1087209702421076105">"फ़िंगरप्रिंट सेंसर गंदा है. कृपया साफ़ करें और फिर कोशिश करें."</string>
<string name="fingerprint_acquired_too_fast" msgid="6470642383109155969">"अंगुली बहुत तेज़ी से चलाई गई है. कृपया पुनः प्रयास करें."</string>
<string name="fingerprint_acquired_too_slow" msgid="59250885689661653">"अंगुली बहुत धीरे चलाई गई. कृपया पुनः प्रयास करें."</string>
<string-array name="fingerprint_acquired_vendor">
@@ -491,8 +491,7 @@
<string name="fingerprint_error_timeout" msgid="3927186043737732875">"फ़िंगरप्रिंट का समय समाप्त हो गया. पुनः प्रयास करें."</string>
<string name="fingerprint_error_canceled" msgid="4402024612660774395">"फ़िंगरप्रिंट क्रियान्वयन रोक दिया गया."</string>
<string name="fingerprint_error_lockout" msgid="5536934748136933450">"बहुत अधिक प्रयास कर लिए गए हैं. बाद में पुन: प्रयास करें."</string>
- <!-- no translation found for fingerprint_error_lockout_permanent (5033251797919508137) -->
- <skip />
+ <string name="fingerprint_error_lockout_permanent" msgid="5033251797919508137">"बहुत अधिक कोशिशें. फ़िंगरप्रिंट सेंसर अक्षम है."</string>
<string name="fingerprint_error_unable_to_process" msgid="6107816084103552441">"पुन: प्रयास करें."</string>
<string name="fingerprint_name_template" msgid="5870957565512716938">"अंगुली <xliff:g id="FINGERID">%d</xliff:g>"</string>
<string-array name="fingerprint_error_vendor">
diff --git a/core/res/res/values-hr/strings.xml b/core/res/res/values-hr/strings.xml
index 9eaf027..61d1862 100644
--- a/core/res/res/values-hr/strings.xml
+++ b/core/res/res/values-hr/strings.xml
@@ -494,8 +494,7 @@
<string name="fingerprint_error_timeout" msgid="3927186043737732875">"Isteklo je vrijeme čekanja za otisak prsta. Pokušajte ponovo."</string>
<string name="fingerprint_error_canceled" msgid="4402024612660774395">"Radnja otiska prsta otkazana je."</string>
<string name="fingerprint_error_lockout" msgid="5536934748136933450">"Previše pokušaja. Pokušajte ponovo kasnije."</string>
- <!-- no translation found for fingerprint_error_lockout_permanent (5033251797919508137) -->
- <skip />
+ <string name="fingerprint_error_lockout_permanent" msgid="5033251797919508137">"Senzor otiska prsta onemogućen je zbog previše pokušaja."</string>
<string name="fingerprint_error_unable_to_process" msgid="6107816084103552441">"Pokušajte ponovo."</string>
<string name="fingerprint_name_template" msgid="5870957565512716938">"Prst <xliff:g id="FINGERID">%d</xliff:g>"</string>
<string-array name="fingerprint_error_vendor">
diff --git a/core/res/res/values-hu/strings.xml b/core/res/res/values-hu/strings.xml
index 1270eb3..e5105b8 100644
--- a/core/res/res/values-hu/strings.xml
+++ b/core/res/res/values-hu/strings.xml
@@ -260,8 +260,7 @@
<string name="notification_channel_updates" msgid="4794517569035110397">"Frissítések"</string>
<string name="notification_channel_network_status" msgid="5025648583129035447">"Hálózati állapot"</string>
<string name="notification_channel_network_alerts" msgid="2895141221414156525">"Hálózati értesítések"</string>
- <!-- no translation found for notification_channel_network_available (4531717914138179517) -->
- <skip />
+ <string name="notification_channel_network_available" msgid="4531717914138179517">"Van elérhető hálózat"</string>
<string name="notification_channel_vpn" msgid="8330103431055860618">"VPN-állapot"</string>
<string name="notification_channel_device_admin" msgid="1568154104368069249">"Eszközfelügyelet"</string>
<string name="notification_channel_alerts" msgid="4496839309318519037">"Értesítések"</string>
@@ -492,8 +491,7 @@
<string name="fingerprint_error_timeout" msgid="3927186043737732875">"Az ujjlenyomat-beolvasási műveletkor időtúllépés történt. Próbálkozzon újra."</string>
<string name="fingerprint_error_canceled" msgid="4402024612660774395">"Ujjlenyomattal kapcsolatos művelet megszakítva"</string>
<string name="fingerprint_error_lockout" msgid="5536934748136933450">"Túl sok próbálkozás. Próbálja újra később."</string>
- <!-- no translation found for fingerprint_error_lockout_permanent (5033251797919508137) -->
- <skip />
+ <string name="fingerprint_error_lockout_permanent" msgid="5033251797919508137">"Túl sok próbálkozás. Ujjlenyomat-érzékelő letiltva."</string>
<string name="fingerprint_error_unable_to_process" msgid="6107816084103552441">"Próbálkozzon újra."</string>
<string name="fingerprint_name_template" msgid="5870957565512716938">"<xliff:g id="FINGERID">%d</xliff:g>. ujj"</string>
<string-array name="fingerprint_error_vendor">
diff --git a/core/res/res/values-hy/strings.xml b/core/res/res/values-hy/strings.xml
index 28a01c0..215d83a 100644
--- a/core/res/res/values-hy/strings.xml
+++ b/core/res/res/values-hy/strings.xml
@@ -224,7 +224,7 @@
<string name="global_actions" product="tablet" msgid="408477140088053665">"Պլանշետի ընտրանքները"</string>
<string name="global_actions" product="tv" msgid="7240386462508182976">"Հեռուստացույցի ընտրանքներ"</string>
<string name="global_actions" product="default" msgid="2406416831541615258">"Հեռախոսի ընտրանքներ"</string>
- <string name="global_action_lock" msgid="2844945191792119712">"Էկրանի փական"</string>
+ <string name="global_action_lock" msgid="2844945191792119712">"Էկրանի կողպում"</string>
<string name="global_action_power_off" msgid="4471879440839879722">"Անջատել"</string>
<string name="global_action_emergency" msgid="7112311161137421166">"Շտապ կանչ"</string>
<string name="global_action_bug_report" msgid="7934010578922304799">"Վրիպակի զեկույց"</string>
@@ -491,8 +491,7 @@
<string name="fingerprint_error_timeout" msgid="3927186043737732875">"Մատնահետքի գրանցման ժամանակը սպառվել է: Փորձեք նորից:"</string>
<string name="fingerprint_error_canceled" msgid="4402024612660774395">"Իսկորոշումը մատնահետքի միջոցով չեղարկվեց:"</string>
<string name="fingerprint_error_lockout" msgid="5536934748136933450">"Չափից շատ փորձ եք կատարել: Փորձեք նորից քիչ հետո:"</string>
- <!-- no translation found for fingerprint_error_lockout_permanent (5033251797919508137) -->
- <skip />
+ <string name="fingerprint_error_lockout_permanent" msgid="5033251797919508137">"Չափից շատ փորձ եք կատարել: Մատնահետքերի սկաներն անջատվել է:"</string>
<string name="fingerprint_error_unable_to_process" msgid="6107816084103552441">"Փորձեք նորից:"</string>
<string name="fingerprint_name_template" msgid="5870957565512716938">"Մատնահետք <xliff:g id="FINGERID">%d</xliff:g>"</string>
<string-array name="fingerprint_error_vendor">
@@ -1302,7 +1301,7 @@
<string name="submit" msgid="1602335572089911941">"Ուղարկել"</string>
<string name="car_mode_disable_notification_title" msgid="3164768212003864316">"Մեքենայի ռեժիմը միացված է"</string>
<string name="car_mode_disable_notification_message" msgid="6301524980144350051">"Հպեք` մեքենայի ռեժիմից դուրս գալու համար:"</string>
- <string name="tethered_notification_title" msgid="3146694234398202601">"Մուտքը կամ թեժ կետը ակտիվ է"</string>
+ <string name="tethered_notification_title" msgid="3146694234398202601">"Մոդեմի ռեժիմը միացված է"</string>
<string name="tethered_notification_message" msgid="2113628520792055377">"Հպեք՝ կարգավորելու համար:"</string>
<string name="back_button_label" msgid="2300470004503343439">"Հետ"</string>
<string name="next_button_label" msgid="1080555104677992408">"Հաջորդը"</string>
diff --git a/core/res/res/values-in/strings.xml b/core/res/res/values-in/strings.xml
index e7d160b..c9a8942 100644
--- a/core/res/res/values-in/strings.xml
+++ b/core/res/res/values-in/strings.xml
@@ -491,8 +491,7 @@
<string name="fingerprint_error_timeout" msgid="3927186043737732875">"Waktu sidik jari habis. Coba lagi."</string>
<string name="fingerprint_error_canceled" msgid="4402024612660774395">"Operasi sidik jari dibatalkan."</string>
<string name="fingerprint_error_lockout" msgid="5536934748136933450">"Terlalu banyak upaya. Coba lagi nanti."</string>
- <!-- no translation found for fingerprint_error_lockout_permanent (5033251797919508137) -->
- <skip />
+ <string name="fingerprint_error_lockout_permanent" msgid="5033251797919508137">"Terlalu sering dicoba. Sensor sidik jari dinonaktifkan."</string>
<string name="fingerprint_error_unable_to_process" msgid="6107816084103552441">"Coba lagi."</string>
<string name="fingerprint_name_template" msgid="5870957565512716938">"Jari <xliff:g id="FINGERID">%d</xliff:g>"</string>
<string-array name="fingerprint_error_vendor">
@@ -533,7 +532,7 @@
<string name="permlab_modifyNetworkAccounting" msgid="5088217309088729650">"mengubah penghitungan penggunaan jaringan"</string>
<string name="permdesc_modifyNetworkAccounting" msgid="5443412866746198123">"Mengizinkan apl memodifikasi cara penggunaan jaringan diperhitungkan terhadap apl. Tidak untuk digunakan oleh apl normal."</string>
<string name="permlab_accessNotifications" msgid="7673416487873432268">"mengakses pemberitahuan"</string>
- <string name="permdesc_accessNotifications" msgid="458457742683431387">"Mengizinkan aplikasi mengambil, memeriksa, dan menghapus pemberitahuan, termasuk pemberitahuan yang diposkan oleh aplikasi lain."</string>
+ <string name="permdesc_accessNotifications" msgid="458457742683431387">"Mengizinkan aplikasi mengambil, memeriksa, dan menghapus pemberitahuan, termasuk pemberitahuan yang diposting oleh aplikasi lain."</string>
<string name="permlab_bindNotificationListenerService" msgid="7057764742211656654">"mengikat layanan pendengar pemberitahuan"</string>
<string name="permdesc_bindNotificationListenerService" msgid="985697918576902986">"Memungkinkan pemegang mengikat antarmuka tingkat teratas dari suatu layanan pendengar pemberitahuan. Tidak pernah diperlukan oleh aplikasi normal."</string>
<string name="permlab_bindConditionProviderService" msgid="1180107672332704641">"mengikat ke layanan penyedia ketentuan"</string>
diff --git a/core/res/res/values-is/strings.xml b/core/res/res/values-is/strings.xml
index 8313cba12..9e8e022 100644
--- a/core/res/res/values-is/strings.xml
+++ b/core/res/res/values-is/strings.xml
@@ -491,8 +491,7 @@
<string name="fingerprint_error_timeout" msgid="3927186043737732875">"Tímamörk runnu út fyrir fingrafar. Reyndu aftur."</string>
<string name="fingerprint_error_canceled" msgid="4402024612660774395">"Hætt við fingrafarsaðgerð."</string>
<string name="fingerprint_error_lockout" msgid="5536934748136933450">"Of margar tilraunir. Reyndu aftur síðar."</string>
- <!-- no translation found for fingerprint_error_lockout_permanent (5033251797919508137) -->
- <skip />
+ <string name="fingerprint_error_lockout_permanent" msgid="5033251797919508137">"Of margar tilraunir. Fingrafaralesari gerður óvirkur."</string>
<string name="fingerprint_error_unable_to_process" msgid="6107816084103552441">"Reyndu aftur."</string>
<string name="fingerprint_name_template" msgid="5870957565512716938">"Fingur <xliff:g id="FINGERID">%d</xliff:g>"</string>
<string-array name="fingerprint_error_vendor">
diff --git a/core/res/res/values-it/strings.xml b/core/res/res/values-it/strings.xml
index 53c00b2..975bb57 100644
--- a/core/res/res/values-it/strings.xml
+++ b/core/res/res/values-it/strings.xml
@@ -491,8 +491,7 @@
<string name="fingerprint_error_timeout" msgid="3927186043737732875">"Timeout impronta digitale. Riprova."</string>
<string name="fingerprint_error_canceled" msgid="4402024612660774395">"Operazione associata all\'impronta digitale annullata."</string>
<string name="fingerprint_error_lockout" msgid="5536934748136933450">"Troppi tentativi. Riprova più tardi."</string>
- <!-- no translation found for fingerprint_error_lockout_permanent (5033251797919508137) -->
- <skip />
+ <string name="fingerprint_error_lockout_permanent" msgid="5033251797919508137">"Troppi tentativi. Sensore di impronte digitali disattivato."</string>
<string name="fingerprint_error_unable_to_process" msgid="6107816084103552441">"Riprova."</string>
<string name="fingerprint_name_template" msgid="5870957565512716938">"Dito <xliff:g id="FINGERID">%d</xliff:g>"</string>
<string-array name="fingerprint_error_vendor">
diff --git a/core/res/res/values-iw/strings.xml b/core/res/res/values-iw/strings.xml
index 7761209..6eafaaf 100644
--- a/core/res/res/values-iw/strings.xml
+++ b/core/res/res/values-iw/strings.xml
@@ -497,8 +497,7 @@
<string name="fingerprint_error_timeout" msgid="3927186043737732875">"חלף הזמן הקצוב לטביעת אצבע. נסה שוב."</string>
<string name="fingerprint_error_canceled" msgid="4402024612660774395">"פעולת טביעת האצבע בוטלה."</string>
<string name="fingerprint_error_lockout" msgid="5536934748136933450">"יותר מדי ניסיונות. נסה שוב מאוחר יותר."</string>
- <!-- no translation found for fingerprint_error_lockout_permanent (5033251797919508137) -->
- <skip />
+ <string name="fingerprint_error_lockout_permanent" msgid="5033251797919508137">"יותר מדי ניסיונות. חיישן טביעות האצבע הושבת."</string>
<string name="fingerprint_error_unable_to_process" msgid="6107816084103552441">"נסה שוב."</string>
<string name="fingerprint_name_template" msgid="5870957565512716938">"אצבע <xliff:g id="FINGERID">%d</xliff:g>"</string>
<string-array name="fingerprint_error_vendor">
diff --git a/core/res/res/values-ja/strings.xml b/core/res/res/values-ja/strings.xml
index b3af109..2a3d9e1 100644
--- a/core/res/res/values-ja/strings.xml
+++ b/core/res/res/values-ja/strings.xml
@@ -491,8 +491,7 @@
<string name="fingerprint_error_timeout" msgid="3927186043737732875">"指紋の読み取りがタイムアウトになりました。もう一度お試しください。"</string>
<string name="fingerprint_error_canceled" msgid="4402024612660774395">"指紋の操作をキャンセルしました。"</string>
<string name="fingerprint_error_lockout" msgid="5536934748136933450">"所定の回数以上間違えました。しばらくしてからもう一度お試しください。"</string>
- <!-- no translation found for fingerprint_error_lockout_permanent (5033251797919508137) -->
- <skip />
+ <string name="fingerprint_error_lockout_permanent" msgid="5033251797919508137">"試行回数が上限を超えました。指紋認証センサーを無効にしました。"</string>
<string name="fingerprint_error_unable_to_process" msgid="6107816084103552441">"もう一度お試しください。"</string>
<string name="fingerprint_name_template" msgid="5870957565512716938">"指紋<xliff:g id="FINGERID">%d</xliff:g>"</string>
<string-array name="fingerprint_error_vendor">
diff --git a/core/res/res/values-ka/strings.xml b/core/res/res/values-ka/strings.xml
index 1301220..1c3f970 100644
--- a/core/res/res/values-ka/strings.xml
+++ b/core/res/res/values-ka/strings.xml
@@ -260,8 +260,7 @@
<string name="notification_channel_updates" msgid="4794517569035110397">"განახლებები"</string>
<string name="notification_channel_network_status" msgid="5025648583129035447">"ქსელის სტატუსი"</string>
<string name="notification_channel_network_alerts" msgid="2895141221414156525">"ქსელის გაფრთხილებები"</string>
- <!-- no translation found for notification_channel_network_available (4531717914138179517) -->
- <skip />
+ <string name="notification_channel_network_available" msgid="4531717914138179517">"ქსელი ხელმისაწვდომია"</string>
<string name="notification_channel_vpn" msgid="8330103431055860618">"VPN-ის სტატუსი"</string>
<string name="notification_channel_device_admin" msgid="1568154104368069249">"მოწყობილობის ადმინისტრირება"</string>
<string name="notification_channel_alerts" msgid="4496839309318519037">"გაფრთხილებები"</string>
@@ -492,8 +491,7 @@
<string name="fingerprint_error_timeout" msgid="3927186043737732875">"თითის ანაბეჭდის ლოდინის დრო ამოიწურა. სცადეთ ხელახლა."</string>
<string name="fingerprint_error_canceled" msgid="4402024612660774395">"თითის ანაბეჭდის აღების ოპერაცია გაუქმდა."</string>
<string name="fingerprint_error_lockout" msgid="5536934748136933450">"ძალიან ბევრი მცდელობა იყო. სცადეთ მოგვიანებით."</string>
- <!-- no translation found for fingerprint_error_lockout_permanent (5033251797919508137) -->
- <skip />
+ <string name="fingerprint_error_lockout_permanent" msgid="5033251797919508137">"დაფიქსირდა მეტისმეტად ბევრი მცდელობა. თითის ანაბეჭდის სენსორი გათიშულია."</string>
<string name="fingerprint_error_unable_to_process" msgid="6107816084103552441">"ხელახლა სცადეთ"</string>
<string name="fingerprint_name_template" msgid="5870957565512716938">"თითი <xliff:g id="FINGERID">%d</xliff:g>"</string>
<string-array name="fingerprint_error_vendor">
diff --git a/core/res/res/values-kk/strings.xml b/core/res/res/values-kk/strings.xml
index 4c9cd5d..4e11c56 100644
--- a/core/res/res/values-kk/strings.xml
+++ b/core/res/res/values-kk/strings.xml
@@ -491,8 +491,7 @@
<string name="fingerprint_error_timeout" msgid="3927186043737732875">"Саусақ ізін күту уақыты бітті. Әрекетті қайталаңыз."</string>
<string name="fingerprint_error_canceled" msgid="4402024612660774395">"Саусақ ізі операциясынан бас тартылған."</string>
<string name="fingerprint_error_lockout" msgid="5536934748136933450">"Талпыныстар тым көп. Кейінірек қайталап көріңіз."</string>
- <!-- no translation found for fingerprint_error_lockout_permanent (5033251797919508137) -->
- <skip />
+ <string name="fingerprint_error_lockout_permanent" msgid="5033251797919508137">"Тым көп әрекет жасалды. Саусақ ізін оқу сканері өшірілді."</string>
<string name="fingerprint_error_unable_to_process" msgid="6107816084103552441">"Әрекетті қайталаңыз."</string>
<string name="fingerprint_name_template" msgid="5870957565512716938">"<xliff:g id="FINGERID">%d</xliff:g> саусағы"</string>
<string-array name="fingerprint_error_vendor">
diff --git a/core/res/res/values-km/strings.xml b/core/res/res/values-km/strings.xml
index 213f305..6994d7f 100644
--- a/core/res/res/values-km/strings.xml
+++ b/core/res/res/values-km/strings.xml
@@ -491,8 +491,7 @@
<string name="fingerprint_error_timeout" msgid="3927186043737732875">"ការផ្តិតម្រាមដៃបានអស់ពេល។ សូមព្យាយាមម្តងទៀត។"</string>
<string name="fingerprint_error_canceled" msgid="4402024612660774395">"បានបោះបង់ប្រតិបត្តិការស្នាមម្រាមដៃ។"</string>
<string name="fingerprint_error_lockout" msgid="5536934748136933450">"ព្យាយាមចូលច្រើនពេកហើយ។ សូមព្យាយាមម្តងទៀតពេលក្រោយ។"</string>
- <!-- no translation found for fingerprint_error_lockout_permanent (5033251797919508137) -->
- <skip />
+ <string name="fingerprint_error_lockout_permanent" msgid="5033251797919508137">"ព្យាយាមចូលច្រើនដងពេកហើយ។ ឧបករណ៍ចាប់ស្នាមម្រាមដៃត្រូវបានបិទ។"</string>
<string name="fingerprint_error_unable_to_process" msgid="6107816084103552441">"ព្យាយាមម្ដងទៀត។"</string>
<string name="fingerprint_name_template" msgid="5870957565512716938">"ម្រាមដៃ <xliff:g id="FINGERID">%d</xliff:g>"</string>
<string-array name="fingerprint_error_vendor">
diff --git a/core/res/res/values-kn/strings.xml b/core/res/res/values-kn/strings.xml
index 9a6e89a..b3f42d1 100644
--- a/core/res/res/values-kn/strings.xml
+++ b/core/res/res/values-kn/strings.xml
@@ -260,8 +260,7 @@
<string name="notification_channel_updates" msgid="4794517569035110397">"ಅಪ್ಡೇಟ್ಗಳು"</string>
<string name="notification_channel_network_status" msgid="5025648583129035447">"ನೆಟ್ವರ್ಕ್ ಸ್ಥಿತಿ"</string>
<string name="notification_channel_network_alerts" msgid="2895141221414156525">"ನೆಟ್ವರ್ಕ್ ಎಚ್ಚರಿಕೆಗಳು"</string>
- <!-- no translation found for notification_channel_network_available (4531717914138179517) -->
- <skip />
+ <string name="notification_channel_network_available" msgid="4531717914138179517">"ನೆಟ್ವರ್ಕ್ ಲಭ್ಯವಿದೆ"</string>
<string name="notification_channel_vpn" msgid="8330103431055860618">"VPN ಸ್ಥಿತಿ"</string>
<string name="notification_channel_device_admin" msgid="1568154104368069249">"ಸಾಧನ ನಿರ್ವಹಣೆ"</string>
<string name="notification_channel_alerts" msgid="4496839309318519037">"ಎಚ್ಚರಿಕೆಗಳು"</string>
@@ -492,8 +491,7 @@
<string name="fingerprint_error_timeout" msgid="3927186043737732875">"ಬೆರಳಚ್ಚು ಅವಧಿ ಮೀರಿದೆ. ಮತ್ತೆ ಪ್ರಯತ್ನಿಸಿ."</string>
<string name="fingerprint_error_canceled" msgid="4402024612660774395">"ಬೆರಳಚ್ಚು ಕಾರ್ಯಾಚರಣೆಯನ್ನು ರದ್ದುಮಾಡಲಾಗಿದೆ."</string>
<string name="fingerprint_error_lockout" msgid="5536934748136933450">"ಹಲವಾರು ಪ್ರಯತ್ನಗಳು. ನಂತರ ಮತ್ತೆ ಪ್ರಯತ್ನಿಸಿ."</string>
- <!-- no translation found for fingerprint_error_lockout_permanent (5033251797919508137) -->
- <skip />
+ <string name="fingerprint_error_lockout_permanent" msgid="5033251797919508137">"ಹಲವು ಬಾರಿ ಪ್ರಯತ್ನಿಸಿದ್ದೀರಿ. ಫಿಂಗರ್ ಫ್ರಿಂಟ್ ಸೆನ್ಸಾರ್ ನಿಷ್ಕ್ರಿಯಗೊಂಡಿದೆ."</string>
<string name="fingerprint_error_unable_to_process" msgid="6107816084103552441">"ಮತ್ತೆ ಪ್ರಯತ್ನಿಸಿ."</string>
<string name="fingerprint_name_template" msgid="5870957565512716938">"ಫಿಂಗರ್ <xliff:g id="FINGERID">%d</xliff:g>"</string>
<string-array name="fingerprint_error_vendor">
diff --git a/core/res/res/values-ko/strings.xml b/core/res/res/values-ko/strings.xml
index cc7aff3..d2f8ecf 100644
--- a/core/res/res/values-ko/strings.xml
+++ b/core/res/res/values-ko/strings.xml
@@ -260,8 +260,7 @@
<string name="notification_channel_updates" msgid="4794517569035110397">"업데이트"</string>
<string name="notification_channel_network_status" msgid="5025648583129035447">"네트워크 상태"</string>
<string name="notification_channel_network_alerts" msgid="2895141221414156525">"네트워크 알림"</string>
- <!-- no translation found for notification_channel_network_available (4531717914138179517) -->
- <skip />
+ <string name="notification_channel_network_available" msgid="4531717914138179517">"네트워크 사용 가능"</string>
<string name="notification_channel_vpn" msgid="8330103431055860618">"VPN 상태"</string>
<string name="notification_channel_device_admin" msgid="1568154104368069249">"기기 관리"</string>
<string name="notification_channel_alerts" msgid="4496839309318519037">"알림"</string>
@@ -292,7 +291,7 @@
<string name="permgroupdesc_camera" msgid="3250611594678347720">"사진 및 동영상 촬영"</string>
<string name="permgrouplab_phone" msgid="5229115638567440675">"전화"</string>
<string name="permgroupdesc_phone" msgid="6234224354060641055">"전화 걸기 및 관리"</string>
- <string name="permgrouplab_sensors" msgid="416037179223226722">"신체 센서"</string>
+ <string name="permgrouplab_sensors" msgid="416037179223226722">"인체 감지 센서"</string>
<string name="permgroupdesc_sensors" msgid="7147968539346634043">"생체 신호에 관한 센서 데이터에 액세스"</string>
<string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"창 콘텐츠 가져오기"</string>
<string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"상호작용 중인 창의 콘텐츠를 검사합니다."</string>
@@ -382,7 +381,7 @@
<string name="permdesc_writeCallLog" product="tablet" msgid="6661806062274119245">"앱에서 수신 및 발신 통화 데이터를 포함하여 태블릿의 통화 기록을 수정할 수 있도록 허용합니다. 이 경우 악성 앱이 통화 기록을 지우거나 수정할 수 있습니다."</string>
<string name="permdesc_writeCallLog" product="tv" msgid="4225034892248398019">"앱에서 수신 및 발신 통화 데이터를 포함하여 TV의 통화 기록을 수정할 수 있도록 허용합니다. 이 경우 악성 앱이 통화 기록을 삭제하거나 수정할 수도 있습니다."</string>
<string name="permdesc_writeCallLog" product="default" msgid="683941736352787842">"앱에서 수신 및 발신 통화 데이터를 포함하여 휴대전화의 통화 기록을 수정할 수 있도록 허용합니다. 이 경우 악성 앱이 통화 기록을 지우거나 수정할 수 있습니다."</string>
- <string name="permlab_bodySensors" msgid="4683341291818520277">"신체 센서(예: 심박수 모니터)에 액세스"</string>
+ <string name="permlab_bodySensors" msgid="4683341291818520277">"인체 감지 센서(예: 심박수 모니터)에 액세스"</string>
<string name="permdesc_bodySensors" product="default" msgid="4380015021754180431">"앱이 심박수와 같은 신체 상태를 확인하는 센서의 데이터에 접근하도록 허용합니다."</string>
<string name="permlab_readCalendar" msgid="6716116972752441641">"캘린더 일정 및 세부정보 읽기"</string>
<string name="permdesc_readCalendar" product="tablet" msgid="4993979255403945892">"이 앱은 태블릿에 저장된 모든 캘린더 일정을 읽고 캘린더 데이터를 공유하거나 저장할 수 있습니다."</string>
@@ -492,8 +491,7 @@
<string name="fingerprint_error_timeout" msgid="3927186043737732875">"지문 인식 시간이 초과되었습니다. 다시 시도하세요."</string>
<string name="fingerprint_error_canceled" msgid="4402024612660774395">"지문 인식 작업이 취소되었습니다."</string>
<string name="fingerprint_error_lockout" msgid="5536934748136933450">"시도 횟수가 너무 많습니다. 나중에 다시 시도하세요."</string>
- <!-- no translation found for fingerprint_error_lockout_permanent (5033251797919508137) -->
- <skip />
+ <string name="fingerprint_error_lockout_permanent" msgid="5033251797919508137">"시도 횟수가 너무 많습니다. 지문 센서가 사용 중지되었습니다."</string>
<string name="fingerprint_error_unable_to_process" msgid="6107816084103552441">"다시 시도해 보세요."</string>
<string name="fingerprint_name_template" msgid="5870957565512716938">"손가락 <xliff:g id="FINGERID">%d</xliff:g>"</string>
<string-array name="fingerprint_error_vendor">
diff --git a/core/res/res/values-ky/strings.xml b/core/res/res/values-ky/strings.xml
index 0f5f403..d627e61 100644
--- a/core/res/res/values-ky/strings.xml
+++ b/core/res/res/values-ky/strings.xml
@@ -491,8 +491,7 @@
<string name="fingerprint_error_timeout" msgid="3927186043737732875">"Манжа изин күтүү мөөнөтү бүттү. Кайра аракет кылыңыз."</string>
<string name="fingerprint_error_canceled" msgid="4402024612660774395">"Манжа изи иш-аракети жокко чыгарылды."</string>
<string name="fingerprint_error_lockout" msgid="5536934748136933450">"Аракеттер өтө көп болду. Кийинчерээк кайра аракет кылыңыз."</string>
- <!-- no translation found for fingerprint_error_lockout_permanent (5033251797919508137) -->
- <skip />
+ <string name="fingerprint_error_lockout_permanent" msgid="5033251797919508137">"Өтө көп жолу аракет жасадыңыз. Манжа изинин сенсору өчүрүлдү."</string>
<string name="fingerprint_error_unable_to_process" msgid="6107816084103552441">"Кайра бир аракеттениңиз."</string>
<string name="fingerprint_name_template" msgid="5870957565512716938">"<xliff:g id="FINGERID">%d</xliff:g> манжасы"</string>
<string-array name="fingerprint_error_vendor">
diff --git a/core/res/res/values-lo/strings.xml b/core/res/res/values-lo/strings.xml
index f6eb279..5dc58f6 100644
--- a/core/res/res/values-lo/strings.xml
+++ b/core/res/res/values-lo/strings.xml
@@ -491,8 +491,7 @@
<string name="fingerprint_error_timeout" msgid="3927186043737732875">"ເວລາລາຍນີ້ວມືບໍ່ເຂົ້າເຖິງໄດ້. ລອງໃໝ່ອີກ."</string>
<string name="fingerprint_error_canceled" msgid="4402024612660774395">"ຍົກເລີກການດຳເນີນການລາຍນີ້ວມືແລ້ວ."</string>
<string name="fingerprint_error_lockout" msgid="5536934748136933450">"ມີຄວາມພະຍາຍາມຫຼາຍຄັ້ງເກີນໄປ. ລອງໃໝ່ພາຍຫຼັງ."</string>
- <!-- no translation found for fingerprint_error_lockout_permanent (5033251797919508137) -->
- <skip />
+ <string name="fingerprint_error_lockout_permanent" msgid="5033251797919508137">"ພະຍາຍາມຫຼາຍເທື່ອເກີນໄປ. ລະບົບປິດການເຮັດວຽກຂອງເຊັນເຊີລາຍນິ້ວມືແລ້ວ."</string>
<string name="fingerprint_error_unable_to_process" msgid="6107816084103552441">"ລອງໃໝ່ອີກຄັ້ງ."</string>
<string name="fingerprint_name_template" msgid="5870957565512716938">"ນີ້ວມື <xliff:g id="FINGERID">%d</xliff:g>"</string>
<string-array name="fingerprint_error_vendor">
diff --git a/core/res/res/values-lt/strings.xml b/core/res/res/values-lt/strings.xml
index 7838067..14de0a2 100644
--- a/core/res/res/values-lt/strings.xml
+++ b/core/res/res/values-lt/strings.xml
@@ -497,8 +497,7 @@
<string name="fingerprint_error_timeout" msgid="3927186043737732875">"Baigėsi kontrolinio kodo nustatymo skirtasis laikas. Bandykite dar kartą."</string>
<string name="fingerprint_error_canceled" msgid="4402024612660774395">"Kontrolinio kodo operacija atšaukta."</string>
<string name="fingerprint_error_lockout" msgid="5536934748136933450">"Per daug bandymų. Vėliau bandykite dar kartą."</string>
- <!-- no translation found for fingerprint_error_lockout_permanent (5033251797919508137) -->
- <skip />
+ <string name="fingerprint_error_lockout_permanent" msgid="5033251797919508137">"Per daug bandymų. Kontrolinio kodo jutiklis išjungtas."</string>
<string name="fingerprint_error_unable_to_process" msgid="6107816084103552441">"Bandykite dar kartą."</string>
<string name="fingerprint_name_template" msgid="5870957565512716938">"<xliff:g id="FINGERID">%d</xliff:g> pirštas"</string>
<string-array name="fingerprint_error_vendor">
diff --git a/core/res/res/values-lv/strings.xml b/core/res/res/values-lv/strings.xml
index b71a220..b191747 100644
--- a/core/res/res/values-lv/strings.xml
+++ b/core/res/res/values-lv/strings.xml
@@ -494,8 +494,7 @@
<string name="fingerprint_error_timeout" msgid="3927186043737732875">"Pirkstu nospiedumu nolasīšanas aparatūras noildze. Mēģiniet vēlreiz."</string>
<string name="fingerprint_error_canceled" msgid="4402024612660774395">"Nospieduma darbība neizdevās."</string>
<string name="fingerprint_error_lockout" msgid="5536934748136933450">"Pārāk daudz mēģinājumu. Vēlāk mēģiniet vēlreiz."</string>
- <!-- no translation found for fingerprint_error_lockout_permanent (5033251797919508137) -->
- <skip />
+ <string name="fingerprint_error_lockout_permanent" msgid="5033251797919508137">"Pārāk daudz mēģinājumu. Pirksta nospieduma sensors atspējots."</string>
<string name="fingerprint_error_unable_to_process" msgid="6107816084103552441">"Mēģiniet vēlreiz."</string>
<string name="fingerprint_name_template" msgid="5870957565512716938">"<xliff:g id="FINGERID">%d</xliff:g>. pirksts"</string>
<string-array name="fingerprint_error_vendor">
diff --git a/core/res/res/values-mk/strings.xml b/core/res/res/values-mk/strings.xml
index febacb2..2e115fc 100644
--- a/core/res/res/values-mk/strings.xml
+++ b/core/res/res/values-mk/strings.xml
@@ -491,8 +491,7 @@
<string name="fingerprint_error_timeout" msgid="3927186043737732875">"Се достигна времето на истекување на отпечатокот. Обидете се повторно."</string>
<string name="fingerprint_error_canceled" msgid="4402024612660774395">"Операцијата со отпечаток од прст се откажа."</string>
<string name="fingerprint_error_lockout" msgid="5536934748136933450">"Премногу обиди. Обидете се повторно подоцна."</string>
- <!-- no translation found for fingerprint_error_lockout_permanent (5033251797919508137) -->
- <skip />
+ <string name="fingerprint_error_lockout_permanent" msgid="5033251797919508137">"Премногу обиди. Сензорот за отпечатоци е оневозможен."</string>
<string name="fingerprint_error_unable_to_process" msgid="6107816084103552441">"Обидете се повторно."</string>
<string name="fingerprint_name_template" msgid="5870957565512716938">"Прст <xliff:g id="FINGERID">%d</xliff:g>"</string>
<string-array name="fingerprint_error_vendor">
diff --git a/core/res/res/values-ml/strings.xml b/core/res/res/values-ml/strings.xml
index 03e21aa..8bc3ff8 100644
--- a/core/res/res/values-ml/strings.xml
+++ b/core/res/res/values-ml/strings.xml
@@ -260,8 +260,7 @@
<string name="notification_channel_updates" msgid="4794517569035110397">"അപ്ഡേറ്റുകൾ"</string>
<string name="notification_channel_network_status" msgid="5025648583129035447">"നെറ്റ്വർക്ക് നില"</string>
<string name="notification_channel_network_alerts" msgid="2895141221414156525">"നെറ്റ്വർക്ക് അലേർട്ടുകൾ"</string>
- <!-- no translation found for notification_channel_network_available (4531717914138179517) -->
- <skip />
+ <string name="notification_channel_network_available" msgid="4531717914138179517">"നെറ്റ്വർക്ക് ലഭ്യമല്ല"</string>
<string name="notification_channel_vpn" msgid="8330103431055860618">"VPN നില"</string>
<string name="notification_channel_device_admin" msgid="1568154104368069249">"ഉപകരണ അഡ്മിനിസ്ട്രേഷൻ"</string>
<string name="notification_channel_alerts" msgid="4496839309318519037">"അലേർട്ടുകൾ"</string>
@@ -492,8 +491,7 @@
<string name="fingerprint_error_timeout" msgid="3927186043737732875">"വിരലടയാളം നൽകേണ്ട സമയം കഴിഞ്ഞു. വീണ്ടും ശ്രമിക്കുക."</string>
<string name="fingerprint_error_canceled" msgid="4402024612660774395">"ഫിംഗർപ്രിന്റ് പ്രവർത്തനം റദ്ദാക്കി."</string>
<string name="fingerprint_error_lockout" msgid="5536934748136933450">"നിരവധി തവണ ശ്രമിച്ചു. പിന്നീട് വീണ്ടും ശ്രമിക്കുക."</string>
- <!-- no translation found for fingerprint_error_lockout_permanent (5033251797919508137) -->
- <skip />
+ <string name="fingerprint_error_lockout_permanent" msgid="5033251797919508137">"നിരവധി തവണ ശ്രമിച്ചതിനാൽ, വിരലടയാള സെൻസർ പ്രവർത്തനരഹിതമായി."</string>
<string name="fingerprint_error_unable_to_process" msgid="6107816084103552441">"വീണ്ടും ശ്രമിക്കൂ."</string>
<string name="fingerprint_name_template" msgid="5870957565512716938">"കൈവിരൽ <xliff:g id="FINGERID">%d</xliff:g>"</string>
<string-array name="fingerprint_error_vendor">
diff --git a/core/res/res/values-mn/strings.xml b/core/res/res/values-mn/strings.xml
index 7a8e821..8309d77 100644
--- a/core/res/res/values-mn/strings.xml
+++ b/core/res/res/values-mn/strings.xml
@@ -491,8 +491,7 @@
<string name="fingerprint_error_timeout" msgid="3927186043737732875">"Хурууны хээ оруулах хугацаа өнгөрсөн байна. Дахин оруулна уу."</string>
<string name="fingerprint_error_canceled" msgid="4402024612660774395">"Хурууны хээний бүртгэл амжилтгүй боллоо."</string>
<string name="fingerprint_error_lockout" msgid="5536934748136933450">"Хэтэрхий олон оролдлоо. Түр хүлээгээд дахин оролдоно уу."</string>
- <!-- no translation found for fingerprint_error_lockout_permanent (5033251797919508137) -->
- <skip />
+ <string name="fingerprint_error_lockout_permanent" msgid="5033251797919508137">"Хэт олон удаа оролдсон тул хурууны хээ мэдрэгчийг идэвхгүй болголоо."</string>
<string name="fingerprint_error_unable_to_process" msgid="6107816084103552441">"Дахин оролдно уу."</string>
<string name="fingerprint_name_template" msgid="5870957565512716938">"Хурууны хээ <xliff:g id="FINGERID">%d</xliff:g>"</string>
<string-array name="fingerprint_error_vendor">
diff --git a/core/res/res/values-mr/strings.xml b/core/res/res/values-mr/strings.xml
index d44f900..c0bc82c 100644
--- a/core/res/res/values-mr/strings.xml
+++ b/core/res/res/values-mr/strings.xml
@@ -491,8 +491,7 @@
<string name="fingerprint_error_timeout" msgid="3927186043737732875">"फिंगरप्रिंट कालबाह्य झाले. पुन्हा प्रयत्न करा."</string>
<string name="fingerprint_error_canceled" msgid="4402024612660774395">"फिंगरप्रिंट ऑपरेशन रद्द झाले."</string>
<string name="fingerprint_error_lockout" msgid="5536934748136933450">"खूप प्रयत्न केले. नंतर पुन्हा प्रयत्न करा."</string>
- <!-- no translation found for fingerprint_error_lockout_permanent (5033251797919508137) -->
- <skip />
+ <string name="fingerprint_error_lockout_permanent" msgid="5033251797919508137">"खूप प्रयत्न करून झाले. फिंगरप्रिंट सेंसर बंद आहे."</string>
<string name="fingerprint_error_unable_to_process" msgid="6107816084103552441">"पुन्हा प्रयत्न करा."</string>
<string name="fingerprint_name_template" msgid="5870957565512716938">"<xliff:g id="FINGERID">%d</xliff:g> बोट"</string>
<string-array name="fingerprint_error_vendor">
diff --git a/core/res/res/values-ms/strings.xml b/core/res/res/values-ms/strings.xml
index 4f0f557..8c4bb4c 100644
--- a/core/res/res/values-ms/strings.xml
+++ b/core/res/res/values-ms/strings.xml
@@ -260,8 +260,7 @@
<string name="notification_channel_updates" msgid="4794517569035110397">"Kemas kini"</string>
<string name="notification_channel_network_status" msgid="5025648583129035447">"Status rangkaian"</string>
<string name="notification_channel_network_alerts" msgid="2895141221414156525">"Makluman rangkaian"</string>
- <!-- no translation found for notification_channel_network_available (4531717914138179517) -->
- <skip />
+ <string name="notification_channel_network_available" msgid="4531717914138179517">"Rangkaian tersedia"</string>
<string name="notification_channel_vpn" msgid="8330103431055860618">"Status VPN"</string>
<string name="notification_channel_device_admin" msgid="1568154104368069249">"Pentadbiran peranti"</string>
<string name="notification_channel_alerts" msgid="4496839309318519037">"Makluman"</string>
@@ -492,8 +491,7 @@
<string name="fingerprint_error_timeout" msgid="3927186043737732875">"Tamat masa cap jari dicapai. Cuba lagi."</string>
<string name="fingerprint_error_canceled" msgid="4402024612660774395">"Pengendalian cap jari dibatalkan."</string>
<string name="fingerprint_error_lockout" msgid="5536934748136933450">"Terlalu banyak percubaan. Cuba sebentar lagi."</string>
- <!-- no translation found for fingerprint_error_lockout_permanent (5033251797919508137) -->
- <skip />
+ <string name="fingerprint_error_lockout_permanent" msgid="5033251797919508137">"Terlalu banyak percubaan. Penderia cap jadi dilumpuhkan."</string>
<string name="fingerprint_error_unable_to_process" msgid="6107816084103552441">"Cuba lagi."</string>
<string name="fingerprint_name_template" msgid="5870957565512716938">"Jari <xliff:g id="FINGERID">%d</xliff:g>"</string>
<string-array name="fingerprint_error_vendor">
diff --git a/core/res/res/values-my/strings.xml b/core/res/res/values-my/strings.xml
index f801df5..f5a1429 100644
--- a/core/res/res/values-my/strings.xml
+++ b/core/res/res/values-my/strings.xml
@@ -491,8 +491,7 @@
<string name="fingerprint_error_timeout" msgid="3927186043737732875">"လက်ဗွေရာအချိန်ကုန် သွားပါသည်။ ထပ်မံကြိုးစားပါ။"</string>
<string name="fingerprint_error_canceled" msgid="4402024612660774395">"လက်ဗွေရာ လုပ်ငန်း ဖျက်သိမ်းခဲ့၏။"</string>
<string name="fingerprint_error_lockout" msgid="5536934748136933450">"ကြိုးစာမှု အကြိမ်များနေ၏။ နောက်မှ ထပ်မံကြိုးစားပါ။"</string>
- <!-- no translation found for fingerprint_error_lockout_permanent (5033251797919508137) -->
- <skip />
+ <string name="fingerprint_error_lockout_permanent" msgid="5033251797919508137">"အကြိမ်အရေအတွက် အလွန်များနေပါပြီ။ လက်ဗွေဖတ်စနစ်ကို ပိတ်ထားပါသည်။"</string>
<string name="fingerprint_error_unable_to_process" msgid="6107816084103552441">"ပြန်ကြိုးစားပါ"</string>
<string name="fingerprint_name_template" msgid="5870957565512716938">"လက်ချောင်း <xliff:g id="FINGERID">%d</xliff:g>"</string>
<string-array name="fingerprint_error_vendor">
diff --git a/core/res/res/values-nb/strings.xml b/core/res/res/values-nb/strings.xml
index f9b73e0..5972329 100644
--- a/core/res/res/values-nb/strings.xml
+++ b/core/res/res/values-nb/strings.xml
@@ -260,8 +260,7 @@
<string name="notification_channel_updates" msgid="4794517569035110397">"Oppdateringer"</string>
<string name="notification_channel_network_status" msgid="5025648583129035447">"Nettverksstatus"</string>
<string name="notification_channel_network_alerts" msgid="2895141221414156525">"Nettverksvarsler"</string>
- <!-- no translation found for notification_channel_network_available (4531717914138179517) -->
- <skip />
+ <string name="notification_channel_network_available" msgid="4531717914138179517">"Nettverk er tilgjengelig"</string>
<string name="notification_channel_vpn" msgid="8330103431055860618">"VPN-status"</string>
<string name="notification_channel_device_admin" msgid="1568154104368069249">"Enhetsadministrasjon"</string>
<string name="notification_channel_alerts" msgid="4496839309318519037">"Varsler"</string>
@@ -492,8 +491,7 @@
<string name="fingerprint_error_timeout" msgid="3927186043737732875">"Tidsavbrudd for fingeravtrykk er nådd. Prøv på nytt."</string>
<string name="fingerprint_error_canceled" msgid="4402024612660774395">"Fingeravtrykk-operasjonen ble avbrutt."</string>
<string name="fingerprint_error_lockout" msgid="5536934748136933450">"For mange forsøk. Prøve på nytt senere."</string>
- <!-- no translation found for fingerprint_error_lockout_permanent (5033251797919508137) -->
- <skip />
+ <string name="fingerprint_error_lockout_permanent" msgid="5033251797919508137">"For mange forsøk. Fingeravtrykkssensoren er slått av."</string>
<string name="fingerprint_error_unable_to_process" msgid="6107816084103552441">"Prøv igjen."</string>
<string name="fingerprint_name_template" msgid="5870957565512716938">"Finger <xliff:g id="FINGERID">%d</xliff:g>"</string>
<string-array name="fingerprint_error_vendor">
diff --git a/core/res/res/values-ne/strings.xml b/core/res/res/values-ne/strings.xml
index 30c6e8c..7283936 100644
--- a/core/res/res/values-ne/strings.xml
+++ b/core/res/res/values-ne/strings.xml
@@ -260,8 +260,7 @@
<string name="notification_channel_updates" msgid="4794517569035110397">"अद्यावधिकहरू"</string>
<string name="notification_channel_network_status" msgid="5025648583129035447">"नेटवर्कको स्थिति"</string>
<string name="notification_channel_network_alerts" msgid="2895141221414156525">"नेटवर्कका अलर्टहरू"</string>
- <!-- no translation found for notification_channel_network_available (4531717914138179517) -->
- <skip />
+ <string name="notification_channel_network_available" msgid="4531717914138179517">"नेटवर्क उपलब्ध छ"</string>
<string name="notification_channel_vpn" msgid="8330103431055860618">"VPN को स्थिति"</string>
<string name="notification_channel_device_admin" msgid="1568154104368069249">"यन्त्रको प्रशासन"</string>
<string name="notification_channel_alerts" msgid="4496839309318519037">"अलर्टहरू"</string>
@@ -492,8 +491,7 @@
<string name="fingerprint_error_timeout" msgid="3927186043737732875">"औँठाछापको समय सकिएको छ। फेरि प्रयास गर्नुहोस्।"</string>
<string name="fingerprint_error_canceled" msgid="4402024612660774395">"औँठाछाप सञ्चालन रद्द गरियो।"</string>
<string name="fingerprint_error_lockout" msgid="5536934748136933450">"धेरै प्रयासहरू। केहि समय पछि पुन: प्रयास गर्नुहोला"</string>
- <!-- no translation found for fingerprint_error_lockout_permanent (5033251797919508137) -->
- <skip />
+ <string name="fingerprint_error_lockout_permanent" msgid="5033251797919508137">"अत्यन्त धेरै प्रयासहरू। फिंगरप्रिन्ट सेन्सरलाई असक्षम पारियो।"</string>
<string name="fingerprint_error_unable_to_process" msgid="6107816084103552441">"पुन: प्रयास गर्नुहोला।"</string>
<string name="fingerprint_name_template" msgid="5870957565512716938">"औंला <xliff:g id="FINGERID">%d</xliff:g>"</string>
<string-array name="fingerprint_error_vendor">
diff --git a/core/res/res/values-nl/strings.xml b/core/res/res/values-nl/strings.xml
index f102451..09cfa70 100644
--- a/core/res/res/values-nl/strings.xml
+++ b/core/res/res/values-nl/strings.xml
@@ -491,8 +491,7 @@
<string name="fingerprint_error_timeout" msgid="3927186043737732875">"Time-out bereikt voor vingerafdruk. Probeer het opnieuw."</string>
<string name="fingerprint_error_canceled" msgid="4402024612660774395">"Vingerafdrukbewerking geannuleerd."</string>
<string name="fingerprint_error_lockout" msgid="5536934748136933450">"Te veel pogingen. Probeer het later opnieuw."</string>
- <!-- no translation found for fingerprint_error_lockout_permanent (5033251797919508137) -->
- <skip />
+ <string name="fingerprint_error_lockout_permanent" msgid="5033251797919508137">"Te veel pogingen. Vingerafdruksensor uitgeschakeld."</string>
<string name="fingerprint_error_unable_to_process" msgid="6107816084103552441">"Probeer het opnieuw."</string>
<string name="fingerprint_name_template" msgid="5870957565512716938">"Vinger <xliff:g id="FINGERID">%d</xliff:g>"</string>
<string-array name="fingerprint_error_vendor">
@@ -1318,7 +1317,7 @@
<string name="progress_erasing" product="default" msgid="6596988875507043042">"SD-kaart wissen..."</string>
<string name="share" msgid="1778686618230011964">"Delen"</string>
<string name="find" msgid="4808270900322985960">"Vinden"</string>
- <string name="websearch" msgid="4337157977400211589">"Online zoeken"</string>
+ <string name="websearch" msgid="4337157977400211589">"Google Zoeken"</string>
<string name="find_next" msgid="5742124618942193978">"Volgende zoeken"</string>
<string name="find_previous" msgid="2196723669388360506">"Vorige zoeken"</string>
<string name="gpsNotifTicker" msgid="5622683912616496172">"Locatieverzoek van <xliff:g id="NAME">%s</xliff:g>"</string>
diff --git a/core/res/res/values-pa/strings.xml b/core/res/res/values-pa/strings.xml
index 4a4bb62..c89224d 100644
--- a/core/res/res/values-pa/strings.xml
+++ b/core/res/res/values-pa/strings.xml
@@ -260,8 +260,7 @@
<string name="notification_channel_updates" msgid="4794517569035110397">"ਅੱਪਡੇਟ"</string>
<string name="notification_channel_network_status" msgid="5025648583129035447">"ਨੈੱਟਵਰਕ ਅਵਸਥਾ"</string>
<string name="notification_channel_network_alerts" msgid="2895141221414156525">"ਨੈੱਟਵਰਕ ਸੁਚੇਤਨਾਵਾਂ"</string>
- <!-- no translation found for notification_channel_network_available (4531717914138179517) -->
- <skip />
+ <string name="notification_channel_network_available" msgid="4531717914138179517">"ਨੈੱਟਵਰਕ ਉਪਲਬਧ ਹੈ"</string>
<string name="notification_channel_vpn" msgid="8330103431055860618">"VPN ਅਵਸਥਾ"</string>
<string name="notification_channel_device_admin" msgid="1568154104368069249">"ਡੀਵਾਈਸ ਪ੍ਰਸ਼ਾਸਨ"</string>
<string name="notification_channel_alerts" msgid="4496839309318519037">"ਸੁਚੇਤਨਾਵਾਂ"</string>
@@ -492,8 +491,7 @@
<string name="fingerprint_error_timeout" msgid="3927186043737732875">"ਫਿੰਗਰਪ੍ਰਿੰਟ ਦਾ ਸਮਾਂ ਸਮਾਪਤ ਹੋ ਗਿਆ ਹੈ। ਦੁਬਾਰਾ ਕੋਸ਼ਿਸ਼ ਕਰੋ।"</string>
<string name="fingerprint_error_canceled" msgid="4402024612660774395">"ਫਿੰਗਰ"</string>
<string name="fingerprint_error_lockout" msgid="5536934748136933450">"ਬਹੁਤ ਸਾਰੀਆਂ ਕੋਸ਼ਿਸ਼ਾਂ. ਬਾਅਦ ਵਿੱਚ ਦੁਬਾਰਾ ਕੋਸ਼ਿਸ਼ ਕਰੋ."</string>
- <!-- no translation found for fingerprint_error_lockout_permanent (5033251797919508137) -->
- <skip />
+ <string name="fingerprint_error_lockout_permanent" msgid="5033251797919508137">"ਹੱਦੋਂ ਵੱਧ ਕੋਸ਼ਿਸ਼ਾਂ। ਫਿੰਗਰਪ੍ਰਿੰਟ ਸੈਂਸਰ ਅਯੋਗ ਬਣਾਇਆ ਗਿਆ।"</string>
<string name="fingerprint_error_unable_to_process" msgid="6107816084103552441">"ਦੁਬਾਰਾ ਕੋਸ਼ਿਸ਼ ਕਰੋ."</string>
<string name="fingerprint_name_template" msgid="5870957565512716938">"ਉਂਗਲ <xliff:g id="FINGERID">%d</xliff:g>"</string>
<string-array name="fingerprint_error_vendor">
diff --git a/core/res/res/values-pl/strings.xml b/core/res/res/values-pl/strings.xml
index 72cc52a..cac8e583 100644
--- a/core/res/res/values-pl/strings.xml
+++ b/core/res/res/values-pl/strings.xml
@@ -497,8 +497,7 @@
<string name="fingerprint_error_timeout" msgid="3927186043737732875">"Osiągnięto limit czasu odczytu linii papilarnych. Spróbuj ponownie."</string>
<string name="fingerprint_error_canceled" msgid="4402024612660774395">"Odczyt odcisku palca został anulowany."</string>
<string name="fingerprint_error_lockout" msgid="5536934748136933450">"Zbyt wiele prób. Spróbuj ponownie później."</string>
- <!-- no translation found for fingerprint_error_lockout_permanent (5033251797919508137) -->
- <skip />
+ <string name="fingerprint_error_lockout_permanent" msgid="5033251797919508137">"Zbyt wiele prób. Czytnik linii papilarnych został wyłączony."</string>
<string name="fingerprint_error_unable_to_process" msgid="6107816084103552441">"Spróbuj ponownie."</string>
<string name="fingerprint_name_template" msgid="5870957565512716938">"Odcisk palca <xliff:g id="FINGERID">%d</xliff:g>"</string>
<string-array name="fingerprint_error_vendor">
@@ -774,7 +773,7 @@
<string name="lockscreen_glogin_submit_button" msgid="7130893694795786300">"Zaloguj się"</string>
<string name="lockscreen_glogin_invalid_input" msgid="1364051473347485908">"Błędna nazwa użytkownika lub hasło."</string>
<string name="lockscreen_glogin_account_recovery_hint" msgid="1696924763690379073">"Nie pamiętasz nazwy użytkownika lub hasła?\nOdwiedź stronę "<b>"google.com/accounts/recovery"</b></string>
- <string name="lockscreen_glogin_checking_password" msgid="7114627351286933867">"Sprawdzanie…"</string>
+ <string name="lockscreen_glogin_checking_password" msgid="7114627351286933867">"Sprawdzam…"</string>
<string name="lockscreen_unlock_label" msgid="737440483220667054">"Odblokuj"</string>
<string name="lockscreen_sound_on_label" msgid="9068877576513425970">"Włącz dźwięk"</string>
<string name="lockscreen_sound_off_label" msgid="996822825154319026">"Wyłącz dźwięk"</string>
@@ -1811,8 +1810,8 @@
<string name="app_category_productivity" msgid="3742083261781538852">"Produktywność"</string>
<string name="device_storage_monitor_notification_channel" msgid="3295871267414816228">"Pamięć urządzenia"</string>
<string name="adb_debugging_notification_channel_tv" msgid="5537766997350092316">"Debugowanie USB"</string>
- <string name="time_picker_hour_label" msgid="2979075098868106450">"godzina"</string>
- <string name="time_picker_minute_label" msgid="5168864173796598399">"minuta"</string>
+ <string name="time_picker_hour_label" msgid="2979075098868106450">"godz."</string>
+ <string name="time_picker_minute_label" msgid="5168864173796598399">"min"</string>
<string name="time_picker_header_text" msgid="143536825321922567">"Ustawianie godziny"</string>
<string name="time_picker_input_error" msgid="7574999942502513765">"Wpisz prawidłowy czas"</string>
<string name="time_picker_prompt_label" msgid="7588093983899966783">"Podaj czas"</string>
diff --git a/core/res/res/values-pt-rBR/strings.xml b/core/res/res/values-pt-rBR/strings.xml
index 7157dab..fe6b766 100644
--- a/core/res/res/values-pt-rBR/strings.xml
+++ b/core/res/res/values-pt-rBR/strings.xml
@@ -260,8 +260,7 @@
<string name="notification_channel_updates" msgid="4794517569035110397">"Atualizações"</string>
<string name="notification_channel_network_status" msgid="5025648583129035447">"Status de rede"</string>
<string name="notification_channel_network_alerts" msgid="2895141221414156525">"Alertas de rede"</string>
- <!-- no translation found for notification_channel_network_available (4531717914138179517) -->
- <skip />
+ <string name="notification_channel_network_available" msgid="4531717914138179517">"Rede disponível"</string>
<string name="notification_channel_vpn" msgid="8330103431055860618">"Status de VPN"</string>
<string name="notification_channel_device_admin" msgid="1568154104368069249">"Administração do dispositivo"</string>
<string name="notification_channel_alerts" msgid="4496839309318519037">"Alertas"</string>
@@ -492,8 +491,7 @@
<string name="fingerprint_error_timeout" msgid="3927186043737732875">"Tempo máximo para captura da impressão digital atingido. Tente novamente."</string>
<string name="fingerprint_error_canceled" msgid="4402024612660774395">"Operação de impressão digital cancelada."</string>
<string name="fingerprint_error_lockout" msgid="5536934748136933450">"Excesso de tentativas. Tente novamente mais tarde."</string>
- <!-- no translation found for fingerprint_error_lockout_permanent (5033251797919508137) -->
- <skip />
+ <string name="fingerprint_error_lockout_permanent" msgid="5033251797919508137">"Excesso de tentativas. Sensor de impressão digital desativado."</string>
<string name="fingerprint_error_unable_to_process" msgid="6107816084103552441">"Tente novamente."</string>
<string name="fingerprint_name_template" msgid="5870957565512716938">"Dedo <xliff:g id="FINGERID">%d</xliff:g>"</string>
<string-array name="fingerprint_error_vendor">
diff --git a/core/res/res/values-pt-rPT/strings.xml b/core/res/res/values-pt-rPT/strings.xml
index 026a866..4c04879 100644
--- a/core/res/res/values-pt-rPT/strings.xml
+++ b/core/res/res/values-pt-rPT/strings.xml
@@ -63,8 +63,8 @@
<string name="needPuk2" msgid="4526033371987193070">"Introduza o PUK2 para desbloquear o cartão SIM."</string>
<string name="enablePin" msgid="209412020907207950">"Ação sem êxito. Ative o bloqueio do SIM/RUIM."</string>
<plurals name="pinpuk_attempts" formatted="false" msgid="1251012001539225582">
+ <item quantity="one">You have <xliff:g id="NUMBER_1">%d</xliff:g> remaining attempts before SIM is locked.</item>
<item quantity="other">Tem mais <xliff:g id="NUMBER_1">%d</xliff:g> tentativas antes de o cartão SIM ficar bloqueado.</item>
- <item quantity="one">Tem mais <xliff:g id="NUMBER_0">%d</xliff:g> tentativa antes de o cartão SIM ficar bloqueado.</item>
</plurals>
<string name="imei" msgid="2625429890869005782">"IMEI"</string>
<string name="meid" msgid="4841221237681254195">"MEID"</string>
@@ -179,8 +179,8 @@
<string name="low_memory" product="tv" msgid="516619861191025923">"O armazenamento da TV está cheio. Elimine alguns ficheiros para libertar espaço."</string>
<string name="low_memory" product="default" msgid="3475999286680000541">"O armazenamento do telemóvel está cheio. Elimine alguns ficheiros para libertar espaço."</string>
<plurals name="ssl_ca_cert_warning" formatted="false" msgid="5106721205300213569">
+ <item quantity="one">Certificate authorities installed</item>
<item quantity="other">Autoridades de certificação instaladas</item>
- <item quantity="one">Autoridade de certificação instalada</item>
</plurals>
<string name="ssl_ca_cert_noti_by_unknown" msgid="4475437862189850602">"Por um terceiro desconhecido"</string>
<string name="ssl_ca_cert_noti_by_administrator" msgid="3541729986326153557">"Pelo administrador do seu perfil de trabalho"</string>
@@ -235,8 +235,8 @@
<string name="bugreport_option_full_title" msgid="6354382025840076439">"Relatório completo"</string>
<string name="bugreport_option_full_summary" msgid="7210859858969115745">"Utilize esta opção para uma interferência mínima do sistema quando o dispositivo não responder ou estiver demasiado lento, ou quando precisar de todas as secções de relatório. Não permite introduzir mais detalhes ou tirar capturas de ecrã adicionais."</string>
<plurals name="bugreport_countdown" formatted="false" msgid="6878900193900090368">
+ <item quantity="one">Taking screenshot for bug report in <xliff:g id="NUMBER_1">%d</xliff:g> seconds.</item>
<item quantity="other">A tirar uma captura de ecrã do relatório de erro dentro de <xliff:g id="NUMBER_1">%d</xliff:g> segundos.</item>
- <item quantity="one">A tirar uma captura de ecrã do relatório de erro dentro de <xliff:g id="NUMBER_0">%d</xliff:g> segundo.</item>
</plurals>
<string name="global_action_toggle_silent_mode" msgid="8219525344246810925">"Modo silencioso"</string>
<string name="global_action_silent_mode_on_status" msgid="3289841937003758806">"Som desativado"</string>
@@ -491,8 +491,7 @@
<string name="fingerprint_error_timeout" msgid="3927186043737732875">"Foi atingido o limite de tempo da impressão digital. Tente novamente."</string>
<string name="fingerprint_error_canceled" msgid="4402024612660774395">"Operação de impressão digital cancelada."</string>
<string name="fingerprint_error_lockout" msgid="5536934748136933450">"Demasiadas tentativas. Tente novamente mais tarde."</string>
- <!-- no translation found for fingerprint_error_lockout_permanent (5033251797919508137) -->
- <skip />
+ <string name="fingerprint_error_lockout_permanent" msgid="5033251797919508137">"Demasiadas tentativas. Sensor de impressões digitais desativado."</string>
<string name="fingerprint_error_unable_to_process" msgid="6107816084103552441">"Tente novamente."</string>
<string name="fingerprint_name_template" msgid="5870957565512716938">"Dedo <xliff:g id="FINGERID">%d</xliff:g>"</string>
<string-array name="fingerprint_error_vendor">
@@ -872,8 +871,8 @@
<string name="oneMonthDurationPast" msgid="7396384508953779925">"Há 1 mês"</string>
<string name="beforeOneMonthDurationPast" msgid="909134546836499826">"Há mais de 1 mês"</string>
<plurals name="last_num_days" formatted="false" msgid="5104533550723932025">
+ <item quantity="one">Last <xliff:g id="COUNT_1">%d</xliff:g> days</item>
<item quantity="other">Últimos <xliff:g id="COUNT_1">%d</xliff:g> dias</item>
- <item quantity="one">Último <xliff:g id="COUNT_0">%d</xliff:g> dia</item>
</plurals>
<string name="last_month" msgid="3959346739979055432">"Último mês"</string>
<string name="older" msgid="5211975022815554840">"Mais antiga"</string>
@@ -894,68 +893,68 @@
<string name="years" msgid="6881577717993213522">"anos"</string>
<string name="now_string_shortest" msgid="8912796667087856402">"agora"</string>
<plurals name="duration_minutes_shortest" formatted="false" msgid="3957499975064245495">
+ <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g>m</item>
<item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>m</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g>m</item>
</plurals>
<plurals name="duration_hours_shortest" formatted="false" msgid="3552182110578602356">
+ <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g>h</item>
<item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>h</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g>h</item>
</plurals>
<plurals name="duration_days_shortest" formatted="false" msgid="5213655532597081640">
+ <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g>d</item>
<item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>d</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g>d</item>
</plurals>
<plurals name="duration_years_shortest" formatted="false" msgid="7848711145196397042">
+ <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g>y</item>
<item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>a</item>
- <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g>a</item>
</plurals>
<plurals name="duration_minutes_shortest_future" formatted="false" msgid="3277614521231489951">
+ <item quantity="one">in <xliff:g id="COUNT_1">%d</xliff:g>m</item>
<item quantity="other">dentro de <xliff:g id="COUNT_1">%d</xliff:g>m</item>
- <item quantity="one">dentro de <xliff:g id="COUNT_0">%d</xliff:g>m</item>
</plurals>
<plurals name="duration_hours_shortest_future" formatted="false" msgid="2152452368397489370">
+ <item quantity="one">in <xliff:g id="COUNT_1">%d</xliff:g>h</item>
<item quantity="other">dentro de <xliff:g id="COUNT_1">%d</xliff:g>h</item>
- <item quantity="one">dentro de <xliff:g id="COUNT_0">%d</xliff:g>h</item>
</plurals>
<plurals name="duration_days_shortest_future" formatted="false" msgid="8088331502820295701">
+ <item quantity="one">in <xliff:g id="COUNT_1">%d</xliff:g>d</item>
<item quantity="other">dentro de <xliff:g id="COUNT_1">%d</xliff:g>d</item>
- <item quantity="one">dentro de <xliff:g id="COUNT_0">%d</xliff:g>d</item>
</plurals>
<plurals name="duration_years_shortest_future" formatted="false" msgid="2317006667145250301">
+ <item quantity="one">in <xliff:g id="COUNT_1">%d</xliff:g>y</item>
<item quantity="other">dentro de <xliff:g id="COUNT_1">%d</xliff:g>a</item>
- <item quantity="one">dentro de <xliff:g id="COUNT_0">%d</xliff:g>a</item>
</plurals>
<plurals name="duration_minutes_relative" formatted="false" msgid="3178131706192980192">
+ <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g> minutes ago</item>
<item quantity="other">há <xliff:g id="COUNT_1">%d</xliff:g> minutos</item>
- <item quantity="one">há <xliff:g id="COUNT_0">%d</xliff:g> minuto</item>
</plurals>
<plurals name="duration_hours_relative" formatted="false" msgid="676894109982008411">
+ <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g> hours ago</item>
<item quantity="other">há <xliff:g id="COUNT_1">%d</xliff:g> horas</item>
- <item quantity="one">há <xliff:g id="COUNT_0">%d</xliff:g> hora</item>
</plurals>
<plurals name="duration_days_relative" formatted="false" msgid="2203515825765397130">
+ <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g> days ago</item>
<item quantity="other">há <xliff:g id="COUNT_1">%d</xliff:g> dias</item>
- <item quantity="one">há <xliff:g id="COUNT_0">%d</xliff:g> dia</item>
</plurals>
<plurals name="duration_years_relative" formatted="false" msgid="4820062134188885734">
+ <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g> years ago</item>
<item quantity="other">há <xliff:g id="COUNT_1">%d</xliff:g> anos</item>
- <item quantity="one">há <xliff:g id="COUNT_0">%d</xliff:g> ano</item>
</plurals>
<plurals name="duration_minutes_relative_future" formatted="false" msgid="4655043589817680966">
+ <item quantity="one">in <xliff:g id="COUNT_1">%d</xliff:g> minutes</item>
<item quantity="other">dentro de <xliff:g id="COUNT_1">%d</xliff:g> minutos</item>
- <item quantity="one">dentro <xliff:g id="COUNT_0">%d</xliff:g> minuto</item>
</plurals>
<plurals name="duration_hours_relative_future" formatted="false" msgid="8084579714205223891">
+ <item quantity="one">in <xliff:g id="COUNT_1">%d</xliff:g> hours</item>
<item quantity="other">dentro de <xliff:g id="COUNT_1">%d</xliff:g> horas</item>
- <item quantity="one">dentro de <xliff:g id="COUNT_0">%d</xliff:g> hora</item>
</plurals>
<plurals name="duration_days_relative_future" formatted="false" msgid="333215369363433992">
+ <item quantity="one">in <xliff:g id="COUNT_1">%d</xliff:g> days</item>
<item quantity="other">dentro de <xliff:g id="COUNT_1">%d</xliff:g> dias</item>
- <item quantity="one">dentro de <xliff:g id="COUNT_0">%d</xliff:g> dia</item>
</plurals>
<plurals name="duration_years_relative_future" formatted="false" msgid="8644862986413104011">
+ <item quantity="one">in <xliff:g id="COUNT_1">%d</xliff:g> years</item>
<item quantity="other">dentro de <xliff:g id="COUNT_1">%d</xliff:g> anos</item>
- <item quantity="one">dentro de <xliff:g id="COUNT_0">%d</xliff:g> ano</item>
</plurals>
<string name="VideoView_error_title" msgid="3534509135438353077">"Problema com o vídeo"</string>
<string name="VideoView_error_text_invalid_progressive_playback" msgid="3186670335938670444">"Este vídeo não é válido para transmissão em fluxo contínuo neste aparelho."</string>
@@ -1103,12 +1102,12 @@
<string name="ringtone_picker_title_notification" msgid="4837740874822788802">"Sons de notificação"</string>
<string name="ringtone_unknown" msgid="3914515995813061520">"Desconhecido"</string>
<plurals name="wifi_available" formatted="false" msgid="7900333017752027322">
+ <item quantity="one">Wi-Fi networks available</item>
<item quantity="other">Redes Wi-Fi disponíveis</item>
- <item quantity="one">Rede Wi-Fi disponível</item>
</plurals>
<plurals name="wifi_available_detailed" formatted="false" msgid="1140699367193975606">
+ <item quantity="one">Open Wi-Fi networks available</item>
<item quantity="other">Redes Wi-Fi abertas disponíveis</item>
- <item quantity="one">Rede Wi-Fi aberta disponível</item>
</plurals>
<string name="wifi_available_sign_in" msgid="9157196203958866662">"Iniciar sessão na rede Wi-Fi"</string>
<string name="network_available_sign_in" msgid="1848877297365446605">"Início de sessão na rede"</string>
@@ -1310,8 +1309,8 @@
<string name="no_matches" msgid="8129421908915840737">"Sem correspondências"</string>
<string name="find_on_page" msgid="1946799233822820384">"Localizar na página"</string>
<plurals name="matches_found" formatted="false" msgid="1210884353962081884">
+ <item quantity="one"><xliff:g id="INDEX">%d</xliff:g> of <xliff:g id="TOTAL">%d</xliff:g></item>
<item quantity="other"><xliff:g id="INDEX">%d</xliff:g> de <xliff:g id="TOTAL">%d</xliff:g></item>
- <item quantity="one">1 correspondência</item>
</plurals>
<string name="action_mode_done" msgid="7217581640461922289">"Concluído"</string>
<string name="progress_erasing" product="nosdcard" msgid="4521573321524340058">"A apagar memória de armazenamento USB..."</string>
@@ -1596,8 +1595,8 @@
<string name="restr_pin_error_doesnt_match" msgid="2224214190906994548">"Os PINs não correspondem. Tente novamente."</string>
<string name="restr_pin_error_too_short" msgid="8173982756265777792">"O PIN é demasiado pequeno. Deve ter, no mínimo, 4 dígitos."</string>
<plurals name="restr_pin_countdown" formatted="false" msgid="9061246974881224688">
+ <item quantity="one">Try again in <xliff:g id="COUNT">%d</xliff:g> seconds</item>
<item quantity="other">Tente novamente dentro de <xliff:g id="COUNT">%d</xliff:g> segundos</item>
- <item quantity="one">Tente novamente dentro de 1 segundo</item>
</plurals>
<string name="restr_pin_try_later" msgid="973144472490532377">"Tente novamente mais tarde"</string>
<string name="immersive_cling_title" msgid="8394201622932303336">"Visualização de ecrã inteiro"</string>
@@ -1629,36 +1628,36 @@
<string name="data_saver_enable_title" msgid="4674073932722787417">"Ativar a Poupança de dados?"</string>
<string name="data_saver_enable_button" msgid="7147735965247211818">"Ativar"</string>
<plurals name="zen_mode_duration_minutes_summary" formatted="false" msgid="4367877408072000848">
+ <item quantity="one">For %1$d minutes (until <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
<item quantity="other">Durante %1$d minutos (até às <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
- <item quantity="one">Durante um minuto (até às <xliff:g id="FORMATTEDTIME_0">%2$s</xliff:g>)</item>
</plurals>
<plurals name="zen_mode_duration_minutes_summary_short" formatted="false" msgid="6830154222366042597">
+ <item quantity="one">For %1$d min (until <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
<item quantity="other">Durante %1$d min (até às <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
- <item quantity="one">Durante 1 min (até às <xliff:g id="FORMATTEDTIME_0">%2$s</xliff:g>)</item>
</plurals>
<plurals name="zen_mode_duration_hours_summary" formatted="false" msgid="8152974162096743862">
+ <item quantity="one">For %1$d hours (until <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
<item quantity="other">Durante %1$d horas (até às <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
- <item quantity="one">Durante uma hora (até às <xliff:g id="FORMATTEDTIME_0">%2$s</xliff:g>)</item>
</plurals>
<plurals name="zen_mode_duration_hours_summary_short" formatted="false" msgid="4787552595253082371">
+ <item quantity="one">For %1$d hr (until <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
<item quantity="other">Durante %1$d h (até às <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
- <item quantity="one">Durante 1 h (até às <xliff:g id="FORMATTEDTIME_0">%2$s</xliff:g>)</item>
</plurals>
<plurals name="zen_mode_duration_minutes" formatted="false" msgid="5127407202506485571">
+ <item quantity="one">For %d minutes</item>
<item quantity="other">Durante %d minutos</item>
- <item quantity="one">Durante um minuto</item>
</plurals>
<plurals name="zen_mode_duration_minutes_short" formatted="false" msgid="2199350154433426128">
+ <item quantity="one">For %d min</item>
<item quantity="other">Durante %d min</item>
- <item quantity="one">Durante 1 min</item>
</plurals>
<plurals name="zen_mode_duration_hours" formatted="false" msgid="3938821308277433854">
+ <item quantity="one">For %d hours</item>
<item quantity="other">Durante %d horas</item>
- <item quantity="one">Durante uma hora</item>
</plurals>
<plurals name="zen_mode_duration_hours_short" formatted="false" msgid="6748277774662434217">
+ <item quantity="one">For %d hr</item>
<item quantity="other">Durante %d h</item>
- <item quantity="one">Durante 1 h</item>
</plurals>
<string name="zen_mode_until" msgid="7336308492289875088">"Até às <xliff:g id="FORMATTEDTIME">%1$s</xliff:g>"</string>
<string name="zen_mode_alarm" msgid="9128205721301330797">"Até <xliff:g id="FORMATTEDTIME">%1$s</xliff:g> (próximo alarme)"</string>
@@ -1693,8 +1692,8 @@
<string name="close_button_text" msgid="3937902162644062866">"Fechar"</string>
<string name="notification_messaging_title_template" msgid="3452480118762691020">"<xliff:g id="CONVERSATION_TITLE">%1$s</xliff:g>: <xliff:g id="SENDER_NAME">%2$s</xliff:g>"</string>
<plurals name="selected_count" formatted="false" msgid="7187339492915744615">
+ <item quantity="one"><xliff:g id="COUNT_1">%1$d</xliff:g> selected</item>
<item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> selecionados</item>
- <item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g> selecionado</item>
</plurals>
<string name="default_notification_channel_label" msgid="5929663562028088222">"Sem categoria"</string>
<string name="importance_from_user" msgid="7318955817386549931">"Definiu a importância destas notificações."</string>
@@ -1757,8 +1756,8 @@
<string name="autofill_error_cannot_autofill" msgid="7402758580060110371">"Não é possível preencher automaticamente o conteúdo"</string>
<string name="autofill_picker_no_suggestions" msgid="3908514303773350735">"Sem sugestões do preenchimento automático"</string>
<plurals name="autofill_picker_some_suggestions" formatted="false" msgid="5506565809835815274">
+ <item quantity="one"><xliff:g id="COUNT">%1$s</xliff:g> autofill suggestions</item>
<item quantity="other"><xliff:g id="COUNT">%1$s</xliff:g> sugestões do preenchimento automático</item>
- <item quantity="one">Uma sugestão do preenchimento automático</item>
</plurals>
<string name="autofill_save_title" msgid="3345527308992082601">"Pretende guardar no <b><xliff:g id="LABEL">%1$s</xliff:g></b>?"</string>
<string name="autofill_save_title_with_type" msgid="8637809388029313305">"Pretende guardar <xliff:g id="TYPE">%1$s</xliff:g> no <b><xliff:g id="LABEL">%2$s</xliff:g></b>?"</string>
diff --git a/core/res/res/values-pt/strings.xml b/core/res/res/values-pt/strings.xml
index 7157dab..fe6b766 100644
--- a/core/res/res/values-pt/strings.xml
+++ b/core/res/res/values-pt/strings.xml
@@ -260,8 +260,7 @@
<string name="notification_channel_updates" msgid="4794517569035110397">"Atualizações"</string>
<string name="notification_channel_network_status" msgid="5025648583129035447">"Status de rede"</string>
<string name="notification_channel_network_alerts" msgid="2895141221414156525">"Alertas de rede"</string>
- <!-- no translation found for notification_channel_network_available (4531717914138179517) -->
- <skip />
+ <string name="notification_channel_network_available" msgid="4531717914138179517">"Rede disponível"</string>
<string name="notification_channel_vpn" msgid="8330103431055860618">"Status de VPN"</string>
<string name="notification_channel_device_admin" msgid="1568154104368069249">"Administração do dispositivo"</string>
<string name="notification_channel_alerts" msgid="4496839309318519037">"Alertas"</string>
@@ -492,8 +491,7 @@
<string name="fingerprint_error_timeout" msgid="3927186043737732875">"Tempo máximo para captura da impressão digital atingido. Tente novamente."</string>
<string name="fingerprint_error_canceled" msgid="4402024612660774395">"Operação de impressão digital cancelada."</string>
<string name="fingerprint_error_lockout" msgid="5536934748136933450">"Excesso de tentativas. Tente novamente mais tarde."</string>
- <!-- no translation found for fingerprint_error_lockout_permanent (5033251797919508137) -->
- <skip />
+ <string name="fingerprint_error_lockout_permanent" msgid="5033251797919508137">"Excesso de tentativas. Sensor de impressão digital desativado."</string>
<string name="fingerprint_error_unable_to_process" msgid="6107816084103552441">"Tente novamente."</string>
<string name="fingerprint_name_template" msgid="5870957565512716938">"Dedo <xliff:g id="FINGERID">%d</xliff:g>"</string>
<string-array name="fingerprint_error_vendor">
diff --git a/core/res/res/values-ro/strings.xml b/core/res/res/values-ro/strings.xml
index 1a3e0c5..835c9ac 100644
--- a/core/res/res/values-ro/strings.xml
+++ b/core/res/res/values-ro/strings.xml
@@ -494,8 +494,7 @@
<string name="fingerprint_error_timeout" msgid="3927186043737732875">"Timpul pentru amprentare a expirat. Încercați din nou."</string>
<string name="fingerprint_error_canceled" msgid="4402024612660774395">"Operațiunea privind amprenta a fost anulată."</string>
<string name="fingerprint_error_lockout" msgid="5536934748136933450">"Prea multe încercări. Încercați din nou mai târziu."</string>
- <!-- no translation found for fingerprint_error_lockout_permanent (5033251797919508137) -->
- <skip />
+ <string name="fingerprint_error_lockout_permanent" msgid="5033251797919508137">"Prea multe încercări. Senzorul de amprentă este dezactivat."</string>
<string name="fingerprint_error_unable_to_process" msgid="6107816084103552441">"Încercați din nou."</string>
<string name="fingerprint_name_template" msgid="5870957565512716938">"Degetul <xliff:g id="FINGERID">%d</xliff:g>"</string>
<string-array name="fingerprint_error_vendor">
diff --git a/core/res/res/values-ru/strings.xml b/core/res/res/values-ru/strings.xml
index ab91c0a..0d5f04a 100644
--- a/core/res/res/values-ru/strings.xml
+++ b/core/res/res/values-ru/strings.xml
@@ -213,7 +213,7 @@
<string name="reboot_to_update_prepare" msgid="6305853831955310890">"Подготовка обновлений…"</string>
<string name="reboot_to_update_package" msgid="3871302324500927291">"Обработка обновлений…"</string>
<string name="reboot_to_update_reboot" msgid="6428441000951565185">"Перезагрузка…"</string>
- <string name="reboot_to_reset_title" msgid="4142355915340627490">"Сбросить все данные"</string>
+ <string name="reboot_to_reset_title" msgid="4142355915340627490">"Сброс к заводским настройкам"</string>
<string name="reboot_to_reset_message" msgid="2432077491101416345">"Перезагрузка…"</string>
<string name="shutdown_progress" msgid="2281079257329981203">"Выключение..."</string>
<string name="shutdown_confirm" product="tablet" msgid="3385745179555731470">"Планшетный ПК будет отключен."</string>
@@ -497,8 +497,7 @@
<string name="fingerprint_error_timeout" msgid="3927186043737732875">"Превышено время ожидания. Повторите попытку."</string>
<string name="fingerprint_error_canceled" msgid="4402024612660774395">"Операция с отпечатком отменена."</string>
<string name="fingerprint_error_lockout" msgid="5536934748136933450">"Слишком много попыток. Повторите позже."</string>
- <!-- no translation found for fingerprint_error_lockout_permanent (5033251797919508137) -->
- <skip />
+ <string name="fingerprint_error_lockout_permanent" msgid="5033251797919508137">"Слишком много попыток. Сканер отпечатков пальцев отключен."</string>
<string name="fingerprint_error_unable_to_process" msgid="6107816084103552441">"Повторите попытку."</string>
<string name="fingerprint_name_template" msgid="5870957565512716938">"Палец <xliff:g id="FINGERID">%d</xliff:g>"</string>
<string-array name="fingerprint_error_vendor">
diff --git a/core/res/res/values-si/strings.xml b/core/res/res/values-si/strings.xml
index 71466bc..373fe07 100644
--- a/core/res/res/values-si/strings.xml
+++ b/core/res/res/values-si/strings.xml
@@ -491,8 +491,7 @@
<string name="fingerprint_error_timeout" msgid="3927186043737732875">"ඇඟිලි සලකුණු කාල නිමාව ළඟා විය. නැවත උත්සාහ කරන්න."</string>
<string name="fingerprint_error_canceled" msgid="4402024612660774395">"ඇඟිලි සලකුණු මෙහෙයුම අවලංගු කරන ලදී."</string>
<string name="fingerprint_error_lockout" msgid="5536934748136933450">"උත්සාහයන් ඉතා වැඩි ගණනකි. කරුණාකර පසුව නැවත උත්සාහ කරන්න."</string>
- <!-- no translation found for fingerprint_error_lockout_permanent (5033251797919508137) -->
- <skip />
+ <string name="fingerprint_error_lockout_permanent" msgid="5033251797919508137">"උත්සාහයන් ඉතා වැඩි ගණනකි. ඇඟිලි සලකුණු සංවේදකය අබල කරන ලදී."</string>
<string name="fingerprint_error_unable_to_process" msgid="6107816084103552441">"නැවත උත්සාහ කරන්න."</string>
<string name="fingerprint_name_template" msgid="5870957565512716938">"ඇඟිලි <xliff:g id="FINGERID">%d</xliff:g>"</string>
<string-array name="fingerprint_error_vendor">
diff --git a/core/res/res/values-sk/strings.xml b/core/res/res/values-sk/strings.xml
index 08efcd9..4352a36 100644
--- a/core/res/res/values-sk/strings.xml
+++ b/core/res/res/values-sk/strings.xml
@@ -266,8 +266,7 @@
<string name="notification_channel_updates" msgid="4794517569035110397">"Aktualizácie"</string>
<string name="notification_channel_network_status" msgid="5025648583129035447">"Stav siete"</string>
<string name="notification_channel_network_alerts" msgid="2895141221414156525">"Upozornenia týkajúce sa siete"</string>
- <!-- no translation found for notification_channel_network_available (4531717914138179517) -->
- <skip />
+ <string name="notification_channel_network_available" msgid="4531717914138179517">"Sieť je k dispozícii"</string>
<string name="notification_channel_vpn" msgid="8330103431055860618">"Stav pripojenia VPN"</string>
<string name="notification_channel_device_admin" msgid="1568154104368069249">"Správa zariadenia"</string>
<string name="notification_channel_alerts" msgid="4496839309318519037">"Upozornenia"</string>
@@ -498,8 +497,7 @@
<string name="fingerprint_error_timeout" msgid="3927186043737732875">"Časový limit rozpoznania odtlačku vypršal. Skúste to znova."</string>
<string name="fingerprint_error_canceled" msgid="4402024612660774395">"Operácia týkajúca sa odtlačku prsta bola zrušená"</string>
<string name="fingerprint_error_lockout" msgid="5536934748136933450">"Príliš veľa pokusov. Skúste to znova neskôr."</string>
- <!-- no translation found for fingerprint_error_lockout_permanent (5033251797919508137) -->
- <skip />
+ <string name="fingerprint_error_lockout_permanent" msgid="5033251797919508137">"Príliš veľa pokusov. Senzor odtlačkov prstov bol deaktivovaný."</string>
<string name="fingerprint_error_unable_to_process" msgid="6107816084103552441">"Skúste to znova"</string>
<string name="fingerprint_name_template" msgid="5870957565512716938">"Prst: <xliff:g id="FINGERID">%d</xliff:g>"</string>
<string-array name="fingerprint_error_vendor">
diff --git a/core/res/res/values-sl/strings.xml b/core/res/res/values-sl/strings.xml
index 9aa39e9..c6f4404 100644
--- a/core/res/res/values-sl/strings.xml
+++ b/core/res/res/values-sl/strings.xml
@@ -497,8 +497,7 @@
<string name="fingerprint_error_timeout" msgid="3927186043737732875">"Dosežena časovna omejitev za prstni odtis. Poskusite znova."</string>
<string name="fingerprint_error_canceled" msgid="4402024612660774395">"Dejanje s prstnim odtisom je bilo preklicano."</string>
<string name="fingerprint_error_lockout" msgid="5536934748136933450">"Preveč poskusov. Poskusite znova pozneje."</string>
- <!-- no translation found for fingerprint_error_lockout_permanent (5033251797919508137) -->
- <skip />
+ <string name="fingerprint_error_lockout_permanent" msgid="5033251797919508137">"Preveč poskusov. Tipalo prstnih odtisov je onemogočeno."</string>
<string name="fingerprint_error_unable_to_process" msgid="6107816084103552441">"Poskusite znova."</string>
<string name="fingerprint_name_template" msgid="5870957565512716938">"Prst <xliff:g id="FINGERID">%d</xliff:g>"</string>
<string-array name="fingerprint_error_vendor">
diff --git a/core/res/res/values-sq/strings.xml b/core/res/res/values-sq/strings.xml
index b9b8e98..70a3efb 100644
--- a/core/res/res/values-sq/strings.xml
+++ b/core/res/res/values-sq/strings.xml
@@ -491,8 +491,7 @@
<string name="fingerprint_error_timeout" msgid="3927186043737732875">"Koha e veprimit për gjurmën e gishtit skadoi. Provo përsëri."</string>
<string name="fingerprint_error_canceled" msgid="4402024612660774395">"Operacioni i gjurmës së gishtit u anulua."</string>
<string name="fingerprint_error_lockout" msgid="5536934748136933450">"Keni bërë shumë tentativa. Provo përsëri më vonë."</string>
- <!-- no translation found for fingerprint_error_lockout_permanent (5033251797919508137) -->
- <skip />
+ <string name="fingerprint_error_lockout_permanent" msgid="5033251797919508137">"Shumë përpjekje. Sensori i gjurmës së gishtit u çaktivizua."</string>
<string name="fingerprint_error_unable_to_process" msgid="6107816084103552441">"Provo përsëri."</string>
<string name="fingerprint_name_template" msgid="5870957565512716938">"Gishti <xliff:g id="FINGERID">%d</xliff:g>"</string>
<string-array name="fingerprint_error_vendor">
diff --git a/core/res/res/values-sr/strings.xml b/core/res/res/values-sr/strings.xml
index b85df9f..f46505bf 100644
--- a/core/res/res/values-sr/strings.xml
+++ b/core/res/res/values-sr/strings.xml
@@ -494,8 +494,7 @@
<string name="fingerprint_error_timeout" msgid="3927186043737732875">"Временско ограничење за отисак прста је истекло. Пробајте поново."</string>
<string name="fingerprint_error_canceled" msgid="4402024612660774395">"Радња са отиском прста је отказана."</string>
<string name="fingerprint_error_lockout" msgid="5536934748136933450">"Превише покушаја. Пробајте поново касније."</string>
- <!-- no translation found for fingerprint_error_lockout_permanent (5033251797919508137) -->
- <skip />
+ <string name="fingerprint_error_lockout_permanent" msgid="5033251797919508137">"Превише покушаја. Сензор за отисак прста је онемогућен."</string>
<string name="fingerprint_error_unable_to_process" msgid="6107816084103552441">"Пробајте поново."</string>
<string name="fingerprint_name_template" msgid="5870957565512716938">"Прст <xliff:g id="FINGERID">%d</xliff:g>"</string>
<string-array name="fingerprint_error_vendor">
@@ -1247,7 +1246,7 @@
<string name="ext_media_nomedia_notification_message" msgid="6471542972147056586">"Уређај <xliff:g id="NAME">%s</xliff:g> је уклоњен; уметните нови"</string>
<string name="ext_media_unmounting_notification_title" msgid="640674168454809372">"<xliff:g id="NAME">%s</xliff:g> се још увек избацује…"</string>
<string name="ext_media_unmounting_notification_message" msgid="4182843895023357756">"Не уклањајте"</string>
- <string name="ext_media_init_action" msgid="7952885510091978278">"Подеси"</string>
+ <string name="ext_media_init_action" msgid="7952885510091978278">"Активирај"</string>
<string name="ext_media_unmount_action" msgid="1121883233103278199">"Избаци"</string>
<string name="ext_media_browse_action" msgid="8322172381028546087">"Истражи"</string>
<string name="ext_media_missing_title" msgid="620980315821543904">"<xliff:g id="NAME">%s</xliff:g> недостаје"</string>
diff --git a/core/res/res/values-sv/strings.xml b/core/res/res/values-sv/strings.xml
index c6865a1..a3fb085 100644
--- a/core/res/res/values-sv/strings.xml
+++ b/core/res/res/values-sv/strings.xml
@@ -260,8 +260,7 @@
<string name="notification_channel_updates" msgid="4794517569035110397">"Uppdateringar"</string>
<string name="notification_channel_network_status" msgid="5025648583129035447">"Nätverksstatus"</string>
<string name="notification_channel_network_alerts" msgid="2895141221414156525">"Nätverksvarningar"</string>
- <!-- no translation found for notification_channel_network_available (4531717914138179517) -->
- <skip />
+ <string name="notification_channel_network_available" msgid="4531717914138179517">"Nätverk tillgängligt"</string>
<string name="notification_channel_vpn" msgid="8330103431055860618">"VPN-status"</string>
<string name="notification_channel_device_admin" msgid="1568154104368069249">"Enhetsadministration"</string>
<string name="notification_channel_alerts" msgid="4496839309318519037">"Varningar"</string>
@@ -492,8 +491,7 @@
<string name="fingerprint_error_timeout" msgid="3927186043737732875">"Tidsgränsen för fingeravtrycket har uppnåtts. Försök igen."</string>
<string name="fingerprint_error_canceled" msgid="4402024612660774395">"Fingeravtrycksåtgärden avbröts."</string>
<string name="fingerprint_error_lockout" msgid="5536934748136933450">"Du har gjort för många försök. Försök igen senare."</string>
- <!-- no translation found for fingerprint_error_lockout_permanent (5033251797919508137) -->
- <skip />
+ <string name="fingerprint_error_lockout_permanent" msgid="5033251797919508137">"Du har försökt för många gånger. Fingeravtryckssensorn har inaktiverats."</string>
<string name="fingerprint_error_unable_to_process" msgid="6107816084103552441">"Försök igen."</string>
<string name="fingerprint_name_template" msgid="5870957565512716938">"Finger <xliff:g id="FINGERID">%d</xliff:g>"</string>
<string-array name="fingerprint_error_vendor">
diff --git a/core/res/res/values-sw/strings.xml b/core/res/res/values-sw/strings.xml
index 55da8d9..ce4a469 100644
--- a/core/res/res/values-sw/strings.xml
+++ b/core/res/res/values-sw/strings.xml
@@ -81,7 +81,7 @@
<string name="CnirMmi" msgid="3062102121430548731">"Kupiga nambari kumezuiwa"</string>
<string name="ThreeWCMmi" msgid="9051047170321190368">"Upigaji simu kwa njia tatu"</string>
<string name="RuacMmi" msgid="7827887459138308886">"Ukataaji wa simu zinazokera zisizohitajika"</string>
- <string name="CndMmi" msgid="3116446237081575808">"Uwasilishaji nambari ya kupiga simu"</string>
+ <string name="CndMmi" msgid="3116446237081575808">"Kuonyeshwa kwa nambari inayopiga"</string>
<string name="DndMmi" msgid="1265478932418334331">"Usisumbue"</string>
<string name="CLIRDefaultOnNextCallOn" msgid="429415409145781923">"Chaguo-msingi za ID ya mpigaji simu za kutozuia. Simu ifuatayo: Imezuiliwa"</string>
<string name="CLIRDefaultOnNextCallOff" msgid="3092918006077864624">"Chaguo-msingi za kitambulisho cha mpigaji simu huwa kuzuiwa. Simu ifuatayo: Haijazuiliwa"</string>
@@ -489,8 +489,7 @@
<string name="fingerprint_error_timeout" msgid="3927186043737732875">"Muda wa kitambulisho umekwisha. Jaribu tena."</string>
<string name="fingerprint_error_canceled" msgid="4402024612660774395">"Utendaji wa kitambulisho imeghairiwa."</string>
<string name="fingerprint_error_lockout" msgid="5536934748136933450">"Majaribio mengi mno. Jaribu tena baadaye."</string>
- <!-- no translation found for fingerprint_error_lockout_permanent (5033251797919508137) -->
- <skip />
+ <string name="fingerprint_error_lockout_permanent" msgid="5033251797919508137">"Majaribio mengi mno. Kitambua alama ya kidole kimezimwa."</string>
<string name="fingerprint_error_unable_to_process" msgid="6107816084103552441">"Jaribu tena."</string>
<string name="fingerprint_name_template" msgid="5870957565512716938">"Kitambulisho <xliff:g id="FINGERID">%d</xliff:g>"</string>
<string-array name="fingerprint_error_vendor">
diff --git a/core/res/res/values-ta/strings.xml b/core/res/res/values-ta/strings.xml
index 6cbfba5..f45789b 100644
--- a/core/res/res/values-ta/strings.xml
+++ b/core/res/res/values-ta/strings.xml
@@ -491,8 +491,7 @@
<string name="fingerprint_error_timeout" msgid="3927186043737732875">"கைரேகைக்கான நேரம் முடிந்தது. மீண்டும் முயலவும்."</string>
<string name="fingerprint_error_canceled" msgid="4402024612660774395">"கைரேகை செயல்பாடு ரத்துசெய்யப்பட்டது."</string>
<string name="fingerprint_error_lockout" msgid="5536934748136933450">"அதிகமான முயற்சிகள். பிறகு முயற்சிக்கவும்."</string>
- <!-- no translation found for fingerprint_error_lockout_permanent (5033251797919508137) -->
- <skip />
+ <string name="fingerprint_error_lockout_permanent" msgid="5033251797919508137">"பலமுறை முயன்றுவிட்டீர்கள். கைரேகை உணர்வி முடக்கப்பட்டது."</string>
<string name="fingerprint_error_unable_to_process" msgid="6107816084103552441">"மீண்டும் முயற்சிக்கவும்."</string>
<string name="fingerprint_name_template" msgid="5870957565512716938">"கைரேகை <xliff:g id="FINGERID">%d</xliff:g>"</string>
<string-array name="fingerprint_error_vendor">
diff --git a/core/res/res/values-te/strings.xml b/core/res/res/values-te/strings.xml
index b3e5e4a..68065b9 100644
--- a/core/res/res/values-te/strings.xml
+++ b/core/res/res/values-te/strings.xml
@@ -260,8 +260,7 @@
<string name="notification_channel_updates" msgid="4794517569035110397">"నవీకరణలు"</string>
<string name="notification_channel_network_status" msgid="5025648583129035447">"నెట్వర్క్ స్థితి"</string>
<string name="notification_channel_network_alerts" msgid="2895141221414156525">"నెట్వర్క్ హెచ్చరికలు"</string>
- <!-- no translation found for notification_channel_network_available (4531717914138179517) -->
- <skip />
+ <string name="notification_channel_network_available" msgid="4531717914138179517">"నెట్వర్క్ అందుబాటులో ఉంది"</string>
<string name="notification_channel_vpn" msgid="8330103431055860618">"VPN స్థితి"</string>
<string name="notification_channel_device_admin" msgid="1568154104368069249">"పరికర నిర్వాహణ"</string>
<string name="notification_channel_alerts" msgid="4496839309318519037">"హెచ్చరికలు"</string>
@@ -492,8 +491,7 @@
<string name="fingerprint_error_timeout" msgid="3927186043737732875">"వేలిముద్ర గడువు సమయం చేరుకుంది. మళ్లీ ప్రయత్నించండి."</string>
<string name="fingerprint_error_canceled" msgid="4402024612660774395">"వేలిముద్ర కార్యాచరణ రద్దయింది."</string>
<string name="fingerprint_error_lockout" msgid="5536934748136933450">"చాలా ఎక్కువ ప్రయత్నాలు చేసారు. తర్వాత మళ్లీ ప్రయత్నించండి."</string>
- <!-- no translation found for fingerprint_error_lockout_permanent (5033251797919508137) -->
- <skip />
+ <string name="fingerprint_error_lockout_permanent" msgid="5033251797919508137">"అనేకసార్లు ప్రయత్నించారు. వేలిముద్ర సెన్సార్ నిలిపివేయబడింది."</string>
<string name="fingerprint_error_unable_to_process" msgid="6107816084103552441">"మళ్లీ ప్రయత్నించండి."</string>
<string name="fingerprint_name_template" msgid="5870957565512716938">"వేలు <xliff:g id="FINGERID">%d</xliff:g>"</string>
<string-array name="fingerprint_error_vendor">
diff --git a/core/res/res/values-th/strings.xml b/core/res/res/values-th/strings.xml
index c2ae15e..eb9994a 100644
--- a/core/res/res/values-th/strings.xml
+++ b/core/res/res/values-th/strings.xml
@@ -152,8 +152,8 @@
<string name="cfTemplateForwardedTime" msgid="9206251736527085256">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: <xliff:g id="DIALING_NUMBER">{1}</xliff:g> หลังผ่านไป <xliff:g id="TIME_DELAY">{2}</xliff:g> วินาที"</string>
<string name="cfTemplateRegistered" msgid="5073237827620166285">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: ไม่ได้โอนสาย"</string>
<string name="cfTemplateRegisteredTime" msgid="6781621964320635172">"<xliff:g id="BEARER_SERVICE_CODE">{0}</xliff:g>: ไม่ได้โอนสาย"</string>
- <string name="fcComplete" msgid="3118848230966886575">"รหัสคุณลักษณะเสร็จสมบูรณ์"</string>
- <string name="fcError" msgid="3327560126588500777">"พบปัญหาในการเชื่อมต่อหรือรหัสคุณลักษณะไม่ถูกต้อง"</string>
+ <string name="fcComplete" msgid="3118848230966886575">"รหัสฟีเจอร์เสร็จสมบูรณ์"</string>
+ <string name="fcError" msgid="3327560126588500777">"พบปัญหาในการเชื่อมต่อหรือรหัสฟีเจอร์ไม่ถูกต้อง"</string>
<string name="httpErrorOk" msgid="1191919378083472204">"ตกลง"</string>
<string name="httpError" msgid="7956392511146698522">"เกิดข้อผิดพลาดของเครือข่าย"</string>
<string name="httpErrorLookup" msgid="4711687456111963163">"ไม่พบ URL"</string>
@@ -414,7 +414,7 @@
<string name="permlab_accessImsCallService" msgid="3574943847181793918">"เข้าถึงบริการโทร IMS"</string>
<string name="permdesc_accessImsCallService" msgid="8992884015198298775">"อนุญาตให้แอปใช้บริการ IMS เพื่อโทรออกโดยคุณไม่ต้องดำเนินการใดๆ เลย"</string>
<string name="permlab_readPhoneState" msgid="9178228524507610486">"อ่านสถานะและข้อมูลระบุตัวตนของโทรศัพท์"</string>
- <string name="permdesc_readPhoneState" msgid="1639212771826125528">"อนุญาตให้แอปพลิเคชันเข้าถึงคุณลักษณะโทรศัพท์ของอุปกรณ์ การอนุญาตนี้ทำให้แอปพลิเคชันสามารถตรวจสอบหมายเลขโทรศัพท์และรหัสอุปกรณ์ ตรวจสอบว่ามีการโทรที่ทำงานอยู่หรือไม่ และตรวจสอบหมายเลขระยะไกลที่เชื่อมต่อด้วยการโทร"</string>
+ <string name="permdesc_readPhoneState" msgid="1639212771826125528">"อนุญาตให้แอปพลิเคชันเข้าถึงฟีเจอร์โทรศัพท์ของอุปกรณ์ การอนุญาตนี้ทำให้แอปพลิเคชันสามารถตรวจสอบหมายเลขโทรศัพท์และรหัสอุปกรณ์ ตรวจสอบว่ามีการโทรที่ทำงานอยู่หรือไม่ และตรวจสอบหมายเลขระยะไกลที่เชื่อมต่อด้วยการโทร"</string>
<string name="permlab_manageOwnCalls" msgid="1503034913274622244">"กำหนดเส้นทางการโทรผ่านระบบ"</string>
<string name="permdesc_manageOwnCalls" msgid="6552974537554717418">"อนุญาตให้แอปกำหนดเส้นทางการโทรของแอปผ่านระบบเพื่อปรับปรุงประสบการณ์ในการโทร"</string>
<string name="permlab_readPhoneNumbers" msgid="6108163940932852440">"อ่านหมายเลขโทรศัพท์"</string>
@@ -491,8 +491,7 @@
<string name="fingerprint_error_timeout" msgid="3927186043737732875">"หมดเวลาใช้ลายนิ้วมือแล้ว โปรดลองอีกครั้ง"</string>
<string name="fingerprint_error_canceled" msgid="4402024612660774395">"ยกเลิกการทำงานของลายนิ้วมือ"</string>
<string name="fingerprint_error_lockout" msgid="5536934748136933450">"ดำเนินการหลายครั้งเกินไป ลองอีกครั้งในภายหลัง"</string>
- <!-- no translation found for fingerprint_error_lockout_permanent (5033251797919508137) -->
- <skip />
+ <string name="fingerprint_error_lockout_permanent" msgid="5033251797919508137">"ลองหลายครั้งเกินไป ปิดใช้เซ็นเซอร์ลายนิ้วมือแล้ว"</string>
<string name="fingerprint_error_unable_to_process" msgid="6107816084103552441">"ลองอีกครั้ง"</string>
<string name="fingerprint_name_template" msgid="5870957565512716938">"นิ้ว <xliff:g id="FINGERID">%d</xliff:g>"</string>
<string-array name="fingerprint_error_vendor">
@@ -587,8 +586,8 @@
<string name="policydesc_encryptedStorage" msgid="2637732115325316992">"ข้อมูลของแอปพลิเคชันที่จัดเก็บต้องมีการเข้ารหัส"</string>
<string name="policylab_disableCamera" msgid="6395301023152297826">"ปิดใช้งานกล้องถ่ายรูป"</string>
<string name="policydesc_disableCamera" msgid="2306349042834754597">"ป้องกันการใช้กล้องถ่ายรูปของอุปกรณ์ทั้งหมด"</string>
- <string name="policylab_disableKeyguardFeatures" msgid="8552277871075367771">"ปิดคุณลักษณะล็อกหน้าจอบางอย่าง"</string>
- <string name="policydesc_disableKeyguardFeatures" msgid="2044755691354158439">"ป้องกันการใช้คุณลักษณะบางอย่างของการล็อกหน้าจอ"</string>
+ <string name="policylab_disableKeyguardFeatures" msgid="8552277871075367771">"ปิดฟีเจอร์ล็อกหน้าจอบางอย่าง"</string>
+ <string name="policydesc_disableKeyguardFeatures" msgid="2044755691354158439">"ป้องกันการใช้ฟีเจอร์บางอย่างของการล็อกหน้าจอ"</string>
<string-array name="phoneTypes">
<item msgid="8901098336658710359">"บ้าน"</item>
<item msgid="869923650527136615">"มือถือ"</item>
@@ -723,7 +722,7 @@
<string name="lockscreen_pattern_correct" msgid="9039008650362261237">"ถูกต้อง!"</string>
<string name="lockscreen_pattern_wrong" msgid="4317955014948108794">"ลองอีกครั้ง"</string>
<string name="lockscreen_password_wrong" msgid="5737815393253165301">"ลองอีกครั้ง"</string>
- <string name="lockscreen_storage_locked" msgid="9167551160010625200">"ปลดล็อกคุณลักษณะและข้อมูลทั้งหมด"</string>
+ <string name="lockscreen_storage_locked" msgid="9167551160010625200">"ปลดล็อกฟีเจอร์และข้อมูลทั้งหมด"</string>
<string name="faceunlock_multiple_failures" msgid="754137583022792429">"มีความพยายามที่จะใช้ Face Unlock เกินขีดจำกัด"</string>
<string name="lockscreen_missing_sim_message_short" msgid="5099439277819215399">"ไม่มีซิมการ์ด"</string>
<string name="lockscreen_missing_sim_message" product="tablet" msgid="151659196095791474">"ไม่มีซิมการ์ดในแท็บเล็ต"</string>
@@ -843,7 +842,7 @@
<string name="permdesc_writeHistoryBookmarks" product="tv" msgid="7007393823197766548">"อนุญาตให้แอปแก้ไขประวัติของเบราว์เซอร์หรือบุ๊กมาร์กที่เก็บไว้ในทีวี ซึ่งอาจอนุญาตให้แอปลบหรือแก้ไขข้อมูลเบราว์เซอร์ หมายเหตุ: สิทธิ์นี้ไม่สามารถใช้ได้กับเบราว์เซอร์ของบุคคลที่สามหรือแอปพลิเคชันอื่นที่สามารถท่องเว็บได้"</string>
<string name="permdesc_writeHistoryBookmarks" product="default" msgid="8497389531014185509">"อนุญาตให้แอปพลิเคชันเปลี่ยนแปลงประวัติหรือบุ๊กมาร์กของเบราว์เซอร์ที่จัดเก็บไว้ในโทรศัพท์ ซึ่งทำให้แอปพลิเคชันสามารถลบหรือเปลี่ยนข้อมูลเบราว์เซอร์ได้ หมายเหตุ: การอนุญาตนี้อาจไม่สามารถใช้งานได้กับเบราว์เซอร์ของบุคคลที่สามหรือแอปพลิเคชันอื่นๆ ที่มีความสามารถในการเรียกดูบนเว็บ"</string>
<string name="permlab_setAlarm" msgid="1379294556362091814">"ตั้งปลุก"</string>
- <string name="permdesc_setAlarm" msgid="316392039157473848">"อนุญาตให้แอปพลิเคชันตั้งเวลาปลุกในแอปพลิเคชันนาฬิกาปลุกที่ติดตั้ง แอปพลิเคชันนาฬิกาปลุกบางรายการอาจไม่ใช้คุณลักษณะนี้"</string>
+ <string name="permdesc_setAlarm" msgid="316392039157473848">"อนุญาตให้แอปพลิเคชันตั้งเวลาปลุกในแอปพลิเคชันนาฬิกาปลุกที่ติดตั้ง แอปพลิเคชันนาฬิกาปลุกบางรายการอาจไม่ใช้ฟีเจอร์นี้"</string>
<string name="permlab_addVoicemail" msgid="5525660026090959044">"เพิ่มข้อวามเสียง"</string>
<string name="permdesc_addVoicemail" msgid="6604508651428252437">"อนุญาตให้แอปพลิเคชันเพิ่มข้อความลงในกล่องข้อความเสียงของคุณ"</string>
<string name="permlab_writeGeolocationPermissions" msgid="5962224158955273932">"แก้ไขการอนุญาตเกี่ยวกับการระบุตำแหน่งทางภูมิศาสตร์ของเบราว์เซอร์"</string>
@@ -1207,7 +1206,7 @@
<string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" กขฃคฅฆงจฉชซฌญฎฏฐฑฒณดตถทธนบปผฝพฟภมยรลวศษสหฬอฮ"</string>
<string name="alert_windows_notification_channel_name" msgid="3116610965549449803">"<xliff:g id="NAME">%s</xliff:g> แสดงทับแอปอื่นๆ"</string>
<string name="alert_windows_notification_title" msgid="3697657294867638947">"<xliff:g id="NAME">%s</xliff:g> กำลังแสดงทับแอปอื่นๆ"</string>
- <string name="alert_windows_notification_message" msgid="8917232109522912560">"หากคุณไม่ต้องการให้ <xliff:g id="NAME">%s</xliff:g> ใช้คุณลักษณะนี้ ให้แตะเพื่อเปิดการตั้งค่าแล้วปิดคุณลักษณะ"</string>
+ <string name="alert_windows_notification_message" msgid="8917232109522912560">"หากคุณไม่ต้องการให้ <xliff:g id="NAME">%s</xliff:g> ใช้ฟีเจอร์นี้ ให้แตะเพื่อเปิดการตั้งค่าแล้วปิดฟีเจอร์"</string>
<string name="alert_windows_notification_turn_off_action" msgid="3367294525884949878">"ปิด"</string>
<string name="ext_media_checking_notification_title" msgid="5734005953288045806">"กำลังเตรียม <xliff:g id="NAME">%s</xliff:g>"</string>
<string name="ext_media_checking_notification_message" msgid="4747432538578886744">"กำลังตรวจหาข้อผิดพลาด"</string>
@@ -1481,13 +1480,13 @@
<string name="kg_reordering_delete_drop_target_text" msgid="7899202978204438708">"ลบ"</string>
<string name="safe_media_volume_warning" product="default" msgid="2276318909314492312">"นี่เป็นการเพิ่มระดับเสียงเกินระดับที่แนะนำ\n\nการฟังเสียงดังเป็นเวลานานอาจทำให้การได้ยินของคุณบกพร่องได้"</string>
<string name="accessibility_shortcut_warning_dialog_title" msgid="8404780875025725199">"ใช้ทางลัดการเข้าถึงพิเศษไหม"</string>
- <string name="accessibility_shortcut_toogle_warning" msgid="7256507885737444807">"เมื่อทางลัดเปิดอยู่ การกดปุ่มปรับระดับเสียงทั้ง 2 ปุ่มเป็นเวลา 3 วินาทีจะเริ่มคุณลักษณะการเข้าถึงพิเศษ\n\n คุณลักษณะการเข้าถึงพิเศษปัจจุบัน:\n <xliff:g id="SERVICE_NAME">%1$s</xliff:g>\n\n คุณสามารถเปลี่ยนคุณลักษณะในการตั้งค่า > การเข้าถึงพิเศษ"</string>
+ <string name="accessibility_shortcut_toogle_warning" msgid="7256507885737444807">"เมื่อทางลัดเปิดอยู่ การกดปุ่มปรับระดับเสียงทั้ง 2 ปุ่มเป็นเวลา 3 วินาทีจะเริ่มฟีเจอร์การเข้าถึงพิเศษ\n\n ฟีเจอร์การเข้าถึงพิเศษปัจจุบัน:\n <xliff:g id="SERVICE_NAME">%1$s</xliff:g>\n\n คุณสามารถเปลี่ยนฟีเจอร์ในการตั้งค่า > การเข้าถึงพิเศษ"</string>
<string name="disable_accessibility_shortcut" msgid="627625354248453445">"ปิดทางลัด"</string>
<string name="leave_accessibility_shortcut_on" msgid="7653111894438512680">"ใช้ทางลัด"</string>
<string name="accessibility_shortcut_enabling_service" msgid="7771852911861522636">"ทางลัดการเข้าถึงเปิด <xliff:g id="SERVICE_NAME">%1$s</xliff:g> แล้ว"</string>
<string name="accessibility_shortcut_disabling_service" msgid="2747243438223109821">"ทางลัดการเข้าถึงปิด <xliff:g id="SERVICE_NAME">%1$s</xliff:g> แล้ว"</string>
- <string name="accessibility_button_prompt_text" msgid="4234556536456854251">"เลือกคุณลักษณะที่จะใช้เมื่อคุณแตะปุ่ม \"การเข้าถึงพิเศษ\":"</string>
- <string name="accessibility_button_instructional_text" msgid="6942300463612999993">"หากต้องการเปลี่ยนคุณลักษณะ ให้แตะปุ่ม \"การเข้าถึงพิเศษ\" ค้างไว้"</string>
+ <string name="accessibility_button_prompt_text" msgid="4234556536456854251">"เลือกฟีเจอร์ที่จะใช้เมื่อคุณแตะปุ่ม \"การเข้าถึงพิเศษ\":"</string>
+ <string name="accessibility_button_instructional_text" msgid="6942300463612999993">"หากต้องการเปลี่ยนฟีเจอร์ ให้แตะปุ่ม \"การเข้าถึงพิเศษ\" ค้างไว้"</string>
<string name="accessibility_magnification_chooser_text" msgid="1227146738764986237">"การขยาย"</string>
<string name="user_switched" msgid="3768006783166984410">"ผู้ใช้ปัจจุบัน <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="user_switching_message" msgid="2871009331809089783">"กำลังเปลี่ยนเป็น <xliff:g id="NAME">%1$s</xliff:g>…"</string>
@@ -1709,7 +1708,7 @@
<string name="region_picker_section_all" msgid="8966316787153001779">"ภูมิภาคทั้งหมด"</string>
<string name="locale_search_menu" msgid="2560710726687249178">"ค้นหา"</string>
<string name="work_mode_off_title" msgid="2615362773958585967">"เปิดโหมดงานไหม"</string>
- <string name="work_mode_off_message" msgid="2961559609199223594">"การดำเนินการนี้จะเปิดโปรไฟล์งานของคุณ รวมถึงแอป การซิงค์ในพื้นหลัง และคุณลักษณะที่เกี่ยวข้อง"</string>
+ <string name="work_mode_off_message" msgid="2961559609199223594">"การดำเนินการนี้จะเปิดโปรไฟล์งานของคุณ รวมถึงแอป การซิงค์ในพื้นหลัง และฟีเจอร์ที่เกี่ยวข้อง"</string>
<string name="work_mode_turn_on" msgid="2062544985670564875">"เปิด"</string>
<string name="new_sms_notification_title" msgid="8442817549127555977">"คุณมีข้อความใหม่"</string>
<string name="new_sms_notification_content" msgid="7002938807812083463">"เปิดแอป SMS เพื่อดู"</string>
diff --git a/core/res/res/values-tl/strings.xml b/core/res/res/values-tl/strings.xml
index 2ef0c7a..ee01ff2 100644
--- a/core/res/res/values-tl/strings.xml
+++ b/core/res/res/values-tl/strings.xml
@@ -491,8 +491,7 @@
<string name="fingerprint_error_timeout" msgid="3927186043737732875">"Nag-time out ang fingerprint. Subukang muli."</string>
<string name="fingerprint_error_canceled" msgid="4402024612660774395">"Nakansela ang operasyong ginagamitan ng fingerprint."</string>
<string name="fingerprint_error_lockout" msgid="5536934748136933450">"Masyadong maraming beses sumubok. Subukang muli sa ibang pagkakataon."</string>
- <!-- no translation found for fingerprint_error_lockout_permanent (5033251797919508137) -->
- <skip />
+ <string name="fingerprint_error_lockout_permanent" msgid="5033251797919508137">"Masyadong maraming beses sumubok. Na-disable ang sensor para sa fingerprint."</string>
<string name="fingerprint_error_unable_to_process" msgid="6107816084103552441">"Subukang muli."</string>
<string name="fingerprint_name_template" msgid="5870957565512716938">"Daliri <xliff:g id="FINGERID">%d</xliff:g>"</string>
<string-array name="fingerprint_error_vendor">
diff --git a/core/res/res/values-tr/strings.xml b/core/res/res/values-tr/strings.xml
index c3b2001..bbae91a 100644
--- a/core/res/res/values-tr/strings.xml
+++ b/core/res/res/values-tr/strings.xml
@@ -260,8 +260,7 @@
<string name="notification_channel_updates" msgid="4794517569035110397">"Güncellemeler"</string>
<string name="notification_channel_network_status" msgid="5025648583129035447">"Ağ durumu"</string>
<string name="notification_channel_network_alerts" msgid="2895141221414156525">"Ağ uyarıları"</string>
- <!-- no translation found for notification_channel_network_available (4531717914138179517) -->
- <skip />
+ <string name="notification_channel_network_available" msgid="4531717914138179517">"Ağ mevcut"</string>
<string name="notification_channel_vpn" msgid="8330103431055860618">"VPN durumu"</string>
<string name="notification_channel_device_admin" msgid="1568154104368069249">"Cihaz yönetimi"</string>
<string name="notification_channel_alerts" msgid="4496839309318519037">"Uyarılar"</string>
@@ -492,8 +491,7 @@
<string name="fingerprint_error_timeout" msgid="3927186043737732875">"Parmak izi için zaman aşımı oluştu. Tekrar deneyin."</string>
<string name="fingerprint_error_canceled" msgid="4402024612660774395">"Parmak izi işlemi iptal edildi."</string>
<string name="fingerprint_error_lockout" msgid="5536934748136933450">"Çok fazla deneme yapıldı. Daha sonra tekrar deneyin."</string>
- <!-- no translation found for fingerprint_error_lockout_permanent (5033251797919508137) -->
- <skip />
+ <string name="fingerprint_error_lockout_permanent" msgid="5033251797919508137">"Çok fazla deneme yapıldı. Parmak izi sensörü devre dışı bıraıldı."</string>
<string name="fingerprint_error_unable_to_process" msgid="6107816084103552441">"Tekrar deneyin."</string>
<string name="fingerprint_name_template" msgid="5870957565512716938">"<xliff:g id="FINGERID">%d</xliff:g>. parmak"</string>
<string-array name="fingerprint_error_vendor">
diff --git a/core/res/res/values-uk/strings.xml b/core/res/res/values-uk/strings.xml
index a5a289c..f187c03 100644
--- a/core/res/res/values-uk/strings.xml
+++ b/core/res/res/values-uk/strings.xml
@@ -497,8 +497,7 @@
<string name="fingerprint_error_timeout" msgid="3927186043737732875">"Час очікування відбитка минув. Повторіть спробу."</string>
<string name="fingerprint_error_canceled" msgid="4402024612660774395">"Дію з відбитком скасовано."</string>
<string name="fingerprint_error_lockout" msgid="5536934748136933450">"Забагато спроб. Спробуйте пізніше."</string>
- <!-- no translation found for fingerprint_error_lockout_permanent (5033251797919508137) -->
- <skip />
+ <string name="fingerprint_error_lockout_permanent" msgid="5033251797919508137">"Забагато спроб. Сканер відбитків пальців вимкнено."</string>
<string name="fingerprint_error_unable_to_process" msgid="6107816084103552441">"Повторіть спробу."</string>
<string name="fingerprint_name_template" msgid="5870957565512716938">"Відбиток пальця <xliff:g id="FINGERID">%d</xliff:g>"</string>
<string-array name="fingerprint_error_vendor">
diff --git a/core/res/res/values-ur/strings.xml b/core/res/res/values-ur/strings.xml
index c16c0c6..310bddd 100644
--- a/core/res/res/values-ur/strings.xml
+++ b/core/res/res/values-ur/strings.xml
@@ -260,8 +260,7 @@
<string name="notification_channel_updates" msgid="4794517569035110397">"اپ ڈیٹس"</string>
<string name="notification_channel_network_status" msgid="5025648583129035447">"نیٹ ورک اسٹیٹس"</string>
<string name="notification_channel_network_alerts" msgid="2895141221414156525">"نیٹ ورک الرٹس"</string>
- <!-- no translation found for notification_channel_network_available (4531717914138179517) -->
- <skip />
+ <string name="notification_channel_network_available" msgid="4531717914138179517">"نیٹ ورک دستیاب ہے"</string>
<string name="notification_channel_vpn" msgid="8330103431055860618">"VPN اسٹیٹس"</string>
<string name="notification_channel_device_admin" msgid="1568154104368069249">"آلہ کا نظم و نسق"</string>
<string name="notification_channel_alerts" msgid="4496839309318519037">"الرٹس"</string>
@@ -492,8 +491,7 @@
<string name="fingerprint_error_timeout" msgid="3927186043737732875">"فنگر پرنٹ کی میعاد ختم ہوگئی۔ دوبارہ کوشش کریں۔"</string>
<string name="fingerprint_error_canceled" msgid="4402024612660774395">"فنگر پرنٹ کی کارروائی منسوخ ہوگئی۔"</string>
<string name="fingerprint_error_lockout" msgid="5536934748136933450">"کافی زیادہ کوششیں کی گئیں۔ بعد میں دوبارہ کوشش کریں۔"</string>
- <!-- no translation found for fingerprint_error_lockout_permanent (5033251797919508137) -->
- <skip />
+ <string name="fingerprint_error_lockout_permanent" msgid="5033251797919508137">"کافی زیادہ کوششیں۔ فنگر پرنٹ سینسر غیر فعال ہو گیا۔"</string>
<string name="fingerprint_error_unable_to_process" msgid="6107816084103552441">"دوبارہ کوشش کریں۔"</string>
<string name="fingerprint_name_template" msgid="5870957565512716938">"انگلی <xliff:g id="FINGERID">%d</xliff:g>"</string>
<string-array name="fingerprint_error_vendor">
diff --git a/core/res/res/values-uz/strings.xml b/core/res/res/values-uz/strings.xml
index b2ea945..bd53da5 100644
--- a/core/res/res/values-uz/strings.xml
+++ b/core/res/res/values-uz/strings.xml
@@ -491,8 +491,7 @@
<string name="fingerprint_error_timeout" msgid="3927186043737732875">"Barmoq izini aniqlash vaqti tugab qoldi. Qayta urinib ko‘ring."</string>
<string name="fingerprint_error_canceled" msgid="4402024612660774395">"Barmoq izi tekshiruvi bekor qilindi."</string>
<string name="fingerprint_error_lockout" msgid="5536934748136933450">"Urinishlar soni ko‘payib ketdi. Keyinroq qayta urinib ko‘ring."</string>
- <!-- no translation found for fingerprint_error_lockout_permanent (5033251797919508137) -->
- <skip />
+ <string name="fingerprint_error_lockout_permanent" msgid="5033251797919508137">"Urinishlar soni ko‘payib ketdi. Barmoq izi skaneri bloklandi."</string>
<string name="fingerprint_error_unable_to_process" msgid="6107816084103552441">"Qayta urinib ko‘ring."</string>
<string name="fingerprint_name_template" msgid="5870957565512716938">"Barmoq izi <xliff:g id="FINGERID">%d</xliff:g>"</string>
<string-array name="fingerprint_error_vendor">
diff --git a/core/res/res/values-vi/strings.xml b/core/res/res/values-vi/strings.xml
index 504ef5f..655bdc7 100644
--- a/core/res/res/values-vi/strings.xml
+++ b/core/res/res/values-vi/strings.xml
@@ -491,8 +491,7 @@
<string name="fingerprint_error_timeout" msgid="3927186043737732875">"Đã hết thời gian chờ vân tay. Hãy thử lại."</string>
<string name="fingerprint_error_canceled" msgid="4402024612660774395">"Thao tác dùng dấu vân tay bị hủy."</string>
<string name="fingerprint_error_lockout" msgid="5536934748136933450">"Quá nhiều lần thử. Hãy thử lại sau."</string>
- <!-- no translation found for fingerprint_error_lockout_permanent (5033251797919508137) -->
- <skip />
+ <string name="fingerprint_error_lockout_permanent" msgid="5033251797919508137">"Quá nhiều lần thử. Cảm biến vân tay đã bị tắt."</string>
<string name="fingerprint_error_unable_to_process" msgid="6107816084103552441">"Thử lại."</string>
<string name="fingerprint_name_template" msgid="5870957565512716938">"Ngón tay <xliff:g id="FINGERID">%d</xliff:g>"</string>
<string-array name="fingerprint_error_vendor">
diff --git a/core/res/res/values-watch/config.xml b/core/res/res/values-watch/config.xml
index 98dc4cf..f26d6ed 100644
--- a/core/res/res/values-watch/config.xml
+++ b/core/res/res/values-watch/config.xml
@@ -63,11 +63,8 @@
Set to true for watch devices. -->
<bool name="config_focusScrollContainersInTouchMode">true</bool>
- <!-- The small screens of watch devices makes multi-window support undesireable. -->
- <bool name="config_supportsMultiWindow">false</bool>
+ <!-- Enable generic multi-window in order to support Activity in virtual display. -->
+ <bool name="config_supportsMultiWindow">true</bool>
+ <bool name="config_supportsMultiDisplay">true</bool>
<bool name="config_supportsSplitScreenMultiWindow">false</bool>
-
- <!-- Disable Multi-Display because of small screen space and lack of external display connection
- options. -->
- <bool name="config_supportsMultiDisplay">false</bool>
</resources>
diff --git a/core/res/res/values-watch/styles_material.xml b/core/res/res/values-watch/styles_material.xml
index 0053c12..fd88102 100644
--- a/core/res/res/values-watch/styles_material.xml
+++ b/core/res/res/values-watch/styles_material.xml
@@ -95,7 +95,7 @@
</style>
<style name="DialogWindowTitle.Material">
- <item name="maxLines">@empty</item>
+ <item name="maxLines">@null</item>
<item name="scrollHorizontally">false</item>
<item name="textAppearance">@style/TextAppearance.Material.DialogWindowTitle</item>
<item name="gravity">center_horizontal|top</item>
diff --git a/core/res/res/values-zh-rCN/strings.xml b/core/res/res/values-zh-rCN/strings.xml
index d195de8..c19e3d2 100644
--- a/core/res/res/values-zh-rCN/strings.xml
+++ b/core/res/res/values-zh-rCN/strings.xml
@@ -260,8 +260,7 @@
<string name="notification_channel_updates" msgid="4794517569035110397">"更新"</string>
<string name="notification_channel_network_status" msgid="5025648583129035447">"网络状态"</string>
<string name="notification_channel_network_alerts" msgid="2895141221414156525">"网络提醒"</string>
- <!-- no translation found for notification_channel_network_available (4531717914138179517) -->
- <skip />
+ <string name="notification_channel_network_available" msgid="4531717914138179517">"有可用的网络"</string>
<string name="notification_channel_vpn" msgid="8330103431055860618">"VPN 状态"</string>
<string name="notification_channel_device_admin" msgid="1568154104368069249">"设备管理"</string>
<string name="notification_channel_alerts" msgid="4496839309318519037">"提醒"</string>
@@ -492,8 +491,7 @@
<string name="fingerprint_error_timeout" msgid="3927186043737732875">"指纹录入操作超时,请重试。"</string>
<string name="fingerprint_error_canceled" msgid="4402024612660774395">"指纹操作已取消。"</string>
<string name="fingerprint_error_lockout" msgid="5536934748136933450">"尝试次数过多,请稍后重试。"</string>
- <!-- no translation found for fingerprint_error_lockout_permanent (5033251797919508137) -->
- <skip />
+ <string name="fingerprint_error_lockout_permanent" msgid="5033251797919508137">"尝试次数过多。指纹传感器已停用。"</string>
<string name="fingerprint_error_unable_to_process" msgid="6107816084103552441">"请重试。"</string>
<string name="fingerprint_name_template" msgid="5870957565512716938">"手指 <xliff:g id="FINGERID">%d</xliff:g>"</string>
<string-array name="fingerprint_error_vendor">
@@ -779,19 +777,19 @@
<string name="lockscreen_access_pattern_cell_added_verbose" msgid="7264580781744026939">"已添加圆点 <xliff:g id="CELL_INDEX">%1$s</xliff:g>"</string>
<string name="lockscreen_access_pattern_detected" msgid="4988730895554057058">"图案绘制完成"</string>
<string name="lockscreen_access_pattern_area" msgid="400813207572953209">"图案区域。"</string>
- <string name="keyguard_accessibility_widget_changed" msgid="5678624624681400191">"%1$s。%3$d的小部件%2$d。"</string>
- <string name="keyguard_accessibility_add_widget" msgid="8273277058724924654">"添加小部件。"</string>
+ <string name="keyguard_accessibility_widget_changed" msgid="5678624624681400191">"%1$s。%3$d的微件%2$d。"</string>
+ <string name="keyguard_accessibility_add_widget" msgid="8273277058724924654">"添加微件。"</string>
<string name="keyguard_accessibility_widget_empty_slot" msgid="1281505703307930757">"空白"</string>
<string name="keyguard_accessibility_unlock_area_expanded" msgid="2278106022311170299">"已展开解锁区域。"</string>
<string name="keyguard_accessibility_unlock_area_collapsed" msgid="6366992066936076396">"已收起解锁区域。"</string>
- <string name="keyguard_accessibility_widget" msgid="6527131039741808240">"<xliff:g id="WIDGET_INDEX">%1$s</xliff:g>小部件。"</string>
+ <string name="keyguard_accessibility_widget" msgid="6527131039741808240">"<xliff:g id="WIDGET_INDEX">%1$s</xliff:g>微件。"</string>
<string name="keyguard_accessibility_user_selector" msgid="1226798370913698896">"用户选择器"</string>
<string name="keyguard_accessibility_status" msgid="8008264603935930611">"状态"</string>
<string name="keyguard_accessibility_camera" msgid="8904231194181114603">"相机"</string>
<string name="keygaurd_accessibility_media_controls" msgid="262209654292161806">"媒体控制"</string>
- <string name="keyguard_accessibility_widget_reorder_start" msgid="8736853615588828197">"已开始将小部件重新排序。"</string>
- <string name="keyguard_accessibility_widget_reorder_end" msgid="7170190950870468320">"已完成小部件重新排序。"</string>
- <string name="keyguard_accessibility_widget_deleted" msgid="4426204263929224434">"已删除小部件<xliff:g id="WIDGET_INDEX">%1$s</xliff:g>。"</string>
+ <string name="keyguard_accessibility_widget_reorder_start" msgid="8736853615588828197">"已开始将微件重新排序。"</string>
+ <string name="keyguard_accessibility_widget_reorder_end" msgid="7170190950870468320">"已完成微件重新排序。"</string>
+ <string name="keyguard_accessibility_widget_deleted" msgid="4426204263929224434">"已删除微件<xliff:g id="WIDGET_INDEX">%1$s</xliff:g>。"</string>
<string name="keyguard_accessibility_expand_lock_area" msgid="519859720934178024">"展开解锁区域。"</string>
<string name="keyguard_accessibility_slide_unlock" msgid="2959928478764697254">"滑动解锁。"</string>
<string name="keyguard_accessibility_pattern_unlock" msgid="1490840706075246612">"图案解锁。"</string>
@@ -1260,7 +1258,7 @@
<string name="permlab_requestIgnoreBatteryOptimizations" msgid="8021256345643918264">"请求忽略电池优化"</string>
<string name="permdesc_requestIgnoreBatteryOptimizations" msgid="8359147856007447638">"允许应用请求相应的权限,以便忽略针对该应用的电池优化。"</string>
<string name="tutorial_double_tap_to_zoom_message_short" msgid="1311810005957319690">"双击可以进行缩放控制"</string>
- <string name="gadget_host_error_inflating" msgid="4882004314906466162">"无法添加小部件。"</string>
+ <string name="gadget_host_error_inflating" msgid="4882004314906466162">"无法添加微件。"</string>
<string name="ime_action_go" msgid="8320845651737369027">"开始"</string>
<string name="ime_action_search" msgid="658110271822807811">"搜索"</string>
<string name="ime_action_send" msgid="2316166556349314424">"发送"</string>
diff --git a/core/res/res/values-zh-rHK/strings.xml b/core/res/res/values-zh-rHK/strings.xml
index 4eed27c..415c1ac 100644
--- a/core/res/res/values-zh-rHK/strings.xml
+++ b/core/res/res/values-zh-rHK/strings.xml
@@ -260,8 +260,7 @@
<string name="notification_channel_updates" msgid="4794517569035110397">"更新"</string>
<string name="notification_channel_network_status" msgid="5025648583129035447">"網絡狀態"</string>
<string name="notification_channel_network_alerts" msgid="2895141221414156525">"網絡通知"</string>
- <!-- no translation found for notification_channel_network_available (4531717914138179517) -->
- <skip />
+ <string name="notification_channel_network_available" msgid="4531717914138179517">"有可用的網絡"</string>
<string name="notification_channel_vpn" msgid="8330103431055860618">"VPN 狀態"</string>
<string name="notification_channel_device_admin" msgid="1568154104368069249">"裝置管理"</string>
<string name="notification_channel_alerts" msgid="4496839309318519037">"通知"</string>
@@ -492,8 +491,7 @@
<string name="fingerprint_error_timeout" msgid="3927186043737732875">"指紋已逾時。請再試一次。"</string>
<string name="fingerprint_error_canceled" msgid="4402024612660774395">"指紋操作已取消。"</string>
<string name="fingerprint_error_lockout" msgid="5536934748136933450">"嘗試次數過多,請稍後再試。"</string>
- <!-- no translation found for fingerprint_error_lockout_permanent (5033251797919508137) -->
- <skip />
+ <string name="fingerprint_error_lockout_permanent" msgid="5033251797919508137">"嘗試次數過多,指紋感應器已停用。"</string>
<string name="fingerprint_error_unable_to_process" msgid="6107816084103552441">"再試一次。"</string>
<string name="fingerprint_name_template" msgid="5870957565512716938">"手指 <xliff:g id="FINGERID">%d</xliff:g>"</string>
<string-array name="fingerprint_error_vendor">
diff --git a/core/res/res/values-zh-rTW/strings.xml b/core/res/res/values-zh-rTW/strings.xml
index 0c4ffad..36f9a9e 100644
--- a/core/res/res/values-zh-rTW/strings.xml
+++ b/core/res/res/values-zh-rTW/strings.xml
@@ -260,8 +260,7 @@
<string name="notification_channel_updates" msgid="4794517569035110397">"更新"</string>
<string name="notification_channel_network_status" msgid="5025648583129035447">"網路狀態"</string>
<string name="notification_channel_network_alerts" msgid="2895141221414156525">"網路警示"</string>
- <!-- no translation found for notification_channel_network_available (4531717914138179517) -->
- <skip />
+ <string name="notification_channel_network_available" msgid="4531717914138179517">"有可用的網路"</string>
<string name="notification_channel_vpn" msgid="8330103431055860618">"VPN 狀態"</string>
<string name="notification_channel_device_admin" msgid="1568154104368069249">"裝置管理"</string>
<string name="notification_channel_alerts" msgid="4496839309318519037">"快訊"</string>
@@ -492,8 +491,7 @@
<string name="fingerprint_error_timeout" msgid="3927186043737732875">"指紋處理作業逾時,請再試一次。"</string>
<string name="fingerprint_error_canceled" msgid="4402024612660774395">"指紋作業已取消。"</string>
<string name="fingerprint_error_lockout" msgid="5536934748136933450">"嘗試次數過多,請稍後再試。"</string>
- <!-- no translation found for fingerprint_error_lockout_permanent (5033251797919508137) -->
- <skip />
+ <string name="fingerprint_error_lockout_permanent" msgid="5033251797919508137">"嘗試次數過多,指紋感應器已停用。"</string>
<string name="fingerprint_error_unable_to_process" msgid="6107816084103552441">"請再試一次。"</string>
<string name="fingerprint_name_template" msgid="5870957565512716938">"手指 <xliff:g id="FINGERID">%d</xliff:g>"</string>
<string-array name="fingerprint_error_vendor">
diff --git a/core/res/res/values-zu/strings.xml b/core/res/res/values-zu/strings.xml
index 2ce9696..ff35931 100644
--- a/core/res/res/values-zu/strings.xml
+++ b/core/res/res/values-zu/strings.xml
@@ -491,8 +491,7 @@
<string name="fingerprint_error_timeout" msgid="3927186043737732875">"Kufinyelelwe isikhathi sokuvala sezigxivizo zeminwe. Zama futhi"</string>
<string name="fingerprint_error_canceled" msgid="4402024612660774395">"Ukusebenza kwezingxivizo zeminwe kukhanseliwe."</string>
<string name="fingerprint_error_lockout" msgid="5536934748136933450">"Imizamo eminingi kakhulu. Zama futhi emuva kwesikhathi."</string>
- <!-- no translation found for fingerprint_error_lockout_permanent (5033251797919508137) -->
- <skip />
+ <string name="fingerprint_error_lockout_permanent" msgid="5033251797919508137">"Imizamo eminingi kakhulu. Inzwa yezigxivizo zeminwe ikhutshaziwe."</string>
<string name="fingerprint_error_unable_to_process" msgid="6107816084103552441">"Zama futhi."</string>
<string name="fingerprint_name_template" msgid="5870957565512716938">"Umunwe ongu-<xliff:g id="FINGERID">%d</xliff:g>"</string>
<string-array name="fingerprint_error_vendor">
diff --git a/core/res/res/values/attrs.xml b/core/res/res/values/attrs.xml
index cfe25b3..79bb109 100644
--- a/core/res/res/values/attrs.xml
+++ b/core/res/res/values/attrs.xml
@@ -2290,8 +2290,9 @@
<!-- Sets the padding, in pixels, of all four edges. Padding is defined as
space between the edges of the view and the view's content. This value will take
- precedence over any of the edge-specific values, including
- paddingHorizontal and paddingVertical, if set. A view's size
+ precedence over any of the edge-specific values (paddingLeft, paddingTop,
+ paddingRight, paddingBottom, paddingHorizontal and paddingVertical), but will
+ not override paddingStart or paddingEnd, if set. A view's size
will include its padding. If a {@link android.R.attr#background}
is provided, the padding will initially be set to that (0 if the
drawable does not have padding). Explicitly setting a padding value
@@ -2299,7 +2300,7 @@
<attr name="padding" format="dimension" />
<!-- Sets the padding, in pixels, of the left and right edges; see
{@link android.R.attr#padding}. This value will take precedence over
- paddingLeft, paddingRight, paddingStart, and paddingEnd, if set. -->
+ paddingLeft and paddingRight, but not paddingStart or paddingEnd (if set). -->
<attr name="paddingHorizontal" format="dimension" />
<!-- Sets the padding, in pixels, of the top and bottom edges; see
{@link android.R.attr#padding}. This value will take precedence over
@@ -3203,11 +3204,10 @@
<attr name="layout_marginEnd" format="dimension" />
<!-- Specifies extra space on the left and right sides of this view.
Specifying layout_marginHorizontal is equivalent to specifying
- either layout_marginLeft and layout_marginRight or
- layout_marginStart and layout_marginEnd with that same value.
- If both layout_marginHorizontal and any of layout_marginLeft,
- layout_marginRight, layout_marginStart, and layout_marginEnd are
- also specified, the layout_marginHorizontal value will take precedence over the
+ layout_marginLeft and layout_marginRight.
+ If both layout_marginHorizontal and either/both of layout_marginLeft
+ and layout_marginRight are also specified, the layout_marginHorizontal
+ value will take precedence over the
edge-specific values. Also, layout_margin will always take precedence over
any of these values, including layout_marginHorizontal.
This space is outside this view's bounds.
@@ -3216,7 +3216,7 @@
<!-- Specifies extra space on the top and bottom sides of this view.
Specifying layout_marginVertical is equivalent to specifying
layout_marginTop and layout_marginBottom with that same value.
- If both layout_marginVertical and either/both layout_marginTop and
+ If both layout_marginVertical and either/both of layout_marginTop and
layout_marginBottom are also specified, the layout_marginVertical value
will take precedence over the edge-specific values.
Also, layout_margin will always take precedence over
diff --git a/core/res/res/values/strings.xml b/core/res/res/values/strings.xml
index fcabe31..f747d3d 100644
--- a/core/res/res/values/strings.xml
+++ b/core/res/res/values/strings.xml
@@ -3225,7 +3225,7 @@
<skip />
<!-- Name of notification channel the system post notification to inform the use about apps
that are drawing ui on-top of other apps (alert-windows) [CHAR LIMIT=NONE] -->
- <string name="alert_windows_notification_channel_name">App activity</string>
+ <string name="alert_windows_notification_channel_name"><xliff:g id="name" example="Google Maps">%s</xliff:g> displaying over other apps</string>
<!-- Notification title when an application is displaying ui on-top of other apps
[CHAR LIMIT=30] -->
<string name="alert_windows_notification_title"><xliff:g id="name" example="Google Maps">%s</xliff:g> is displaying over other apps</string>
diff --git a/core/res/res/values/themes_device_defaults.xml b/core/res/res/values/themes_device_defaults.xml
index 7517946..8755e37 100644
--- a/core/res/res/values/themes_device_defaults.xml
+++ b/core/res/res/values/themes_device_defaults.xml
@@ -758,6 +758,14 @@
<item name="colorControlNormal">?attr/textColorPrimary</item>
</style>
+ <style name="Theme.DeviceDefault.QuickSettings.Dialog" parent="Theme.DeviceDefault.Light.Dialog">
+ <!-- Color palette -->
+ <item name="colorPrimary">@color/primary_device_default_settings_light</item>
+ <item name="colorPrimaryDark">@color/primary_dark_device_default_settings_light</item>
+ <item name="colorSecondary">@color/secondary_device_default_settings_light</item>
+ <item name="colorAccent">@color/accent_device_default_light</item>
+ </style>
+
<!-- Variant of {@link #Theme_DeviceDefault_Settings_Dark} with no action bar -->
<style name="Theme.DeviceDefault.Settings.Dark.NoActionBar" parent="Theme.Material.NoActionBar">
<!-- Color palette -->
diff --git a/core/tests/coretests/src/android/content/pm/AppCacheTest.java b/core/tests/coretests/src/android/content/pm/AppCacheTest.java
index 15dbddf..59aa50a 100644
--- a/core/tests/coretests/src/android/content/pm/AppCacheTest.java
+++ b/core/tests/coretests/src/android/content/pm/AppCacheTest.java
@@ -492,7 +492,7 @@
PackageDataObserver observer = new PackageDataObserver();
//wait on observer
synchronized(observer) {
- getPm().freeStorageAndNotify(null, idealStorageSize, observer);
+ getPm().freeStorageAndNotify(null, idealStorageSize, 0, observer);
long waitTime = 0;
while(!observer.isDone() || (waitTime > MAX_WAIT_TIME)) {
observer.wait(WAIT_TIME_INCR);
@@ -517,7 +517,7 @@
try {
// Spin lock waiting for call back
synchronized(r) {
- getPm().freeStorage(null, idealStorageSize, pi.getIntentSender());
+ getPm().freeStorage(null, idealStorageSize, 0, pi.getIntentSender());
long waitTime = 0;
while(!r.isDone() && (waitTime < MAX_WAIT_TIME)) {
r.wait(WAIT_TIME_INCR);
diff --git a/core/tests/coretests/src/android/provider/SettingsBackupTest.java b/core/tests/coretests/src/android/provider/SettingsBackupTest.java
index 54d5285..d875ed4 100644
--- a/core/tests/coretests/src/android/provider/SettingsBackupTest.java
+++ b/core/tests/coretests/src/android/provider/SettingsBackupTest.java
@@ -334,7 +334,11 @@
Settings.Global.TRUSTED_SOUND,
Settings.Global.TZINFO_UPDATE_CONTENT_URL,
Settings.Global.TZINFO_UPDATE_METADATA_URL,
- Settings.Global.UNINSTALLED_INSTANT_APP_CACHE_DURATION_MILLIS,
+ Settings.Global.INSTALLED_INSTANT_APP_MIN_CACHE_PERIOD,
+ Settings.Global.INSTALLED_INSTANT_APP_MAX_CACHE_PERIOD,
+ Settings.Global.UNINSTALLED_INSTANT_APP_MIN_CACHE_PERIOD,
+ Settings.Global.UNINSTALLED_INSTANT_APP_MAX_CACHE_PERIOD,
+ Settings.Global.UNUSED_STATIC_SHARED_LIB_MIN_CACHE_PERIOD,
Settings.Global.UNLOCK_SOUND,
Settings.Global.USE_GOOGLE_MAIL,
Settings.Global.VT_IMS_ENABLED,
diff --git a/core/tests/coretests/src/android/transition/FadeTransitionTest.java b/core/tests/coretests/src/android/transition/FadeTransitionTest.java
index 7e7e815..0140a04 100644
--- a/core/tests/coretests/src/android/transition/FadeTransitionTest.java
+++ b/core/tests/coretests/src/android/transition/FadeTransitionTest.java
@@ -50,7 +50,7 @@
TransitionLatch latch = setVisibilityInTransition(fadeOut, R.id.square1, View.INVISIBLE);
assertTrue(latch.startLatch.await(200, TimeUnit.MILLISECONDS));
assertEquals(View.VISIBLE, square1.getVisibility());
- Thread.sleep(100);
+ waitForAnimation();
assertFalse(square1.getTransitionAlpha() == 0 || square1.getTransitionAlpha() == 1);
assertTrue(latch.endLatch.await(400, TimeUnit.MILLISECONDS));
assertEquals(1.0f, square1.getTransitionAlpha());
@@ -60,7 +60,7 @@
latch = setVisibilityInTransition(fadeIn, R.id.square1, View.VISIBLE);
assertTrue(latch.startLatch.await(200, TimeUnit.MILLISECONDS));
assertEquals(View.VISIBLE, square1.getVisibility());
- Thread.sleep(100);
+ waitForAnimation();
final float transitionAlpha = square1.getTransitionAlpha();
assertTrue("expecting transitionAlpha to be between 0 and 1. Was " + transitionAlpha,
transitionAlpha > 0 && transitionAlpha < 1);
@@ -77,7 +77,7 @@
fadeOut.addListener(fadeOutValueCheck);
TransitionLatch outLatch = setVisibilityInTransition(fadeOut, R.id.square1, View.INVISIBLE);
assertTrue(outLatch.startLatch.await(200, TimeUnit.MILLISECONDS));
- Thread.sleep(100);
+ waitForAnimation();
Fade fadeIn = new Fade(Fade.MODE_IN);
FadeValueCheck fadeInValueCheck = new FadeValueCheck(square1);
@@ -110,7 +110,7 @@
fadeIn.addListener(fadeInValueCheck);
TransitionLatch inLatch = setVisibilityInTransition(fadeIn, R.id.square1, View.VISIBLE);
assertTrue(inLatch.startLatch.await(200, TimeUnit.MILLISECONDS));
- Thread.sleep(100);
+ waitForAnimation();
Fade fadeOut = new Fade(Fade.MODE_OUT);
FadeValueCheck fadeOutValueCheck = new FadeValueCheck(square1);
@@ -145,6 +145,23 @@
return latch;
}
+ /**
+ * Waits for two animation frames to ensure animation values change.
+ */
+ private void waitForAnimation() throws InterruptedException {
+ final CountDownLatch latch = new CountDownLatch(2);
+ mActivity.getWindow().getDecorView().postOnAnimation(new Runnable() {
+ @Override
+ public void run() {
+ latch.countDown();
+ if (latch.getCount() > 0) {
+ mActivity.getWindow().getDecorView().postOnAnimation(this);
+ }
+ }
+ });
+ assertTrue(latch.await(1, TimeUnit.SECONDS));
+ }
+
public static class TransitionLatch implements TransitionListener {
public CountDownLatch startLatch = new CountDownLatch(1);
public CountDownLatch endLatch = new CountDownLatch(1);
diff --git a/core/tests/coretests/src/android/widget/TextViewActivityTest.java b/core/tests/coretests/src/android/widget/TextViewActivityTest.java
index ebab129..5a7bca4 100644
--- a/core/tests/coretests/src/android/widget/TextViewActivityTest.java
+++ b/core/tests/coretests/src/android/widget/TextViewActivityTest.java
@@ -50,14 +50,11 @@
import android.content.ClipData;
import android.content.ClipboardManager;
-import android.text.TextUtils;
-import android.text.Spanned;
import android.support.test.espresso.NoMatchingViewException;
import android.support.test.espresso.ViewAssertion;
import android.view.ActionMode;
import android.view.Menu;
import android.view.MenuItem;
-import android.view.View;
import android.view.textclassifier.TextClassificationManager;
import android.view.textclassifier.TextClassifier;
import android.widget.espresso.CustomViewActions.RelativeCoordinatesProvider;
@@ -72,8 +69,6 @@
import com.android.frameworks.coretests.R;
-import junit.framework.AssertionFailedError;
-
/**
* Tests the TextView widget from an Activity
*/
@@ -694,6 +689,51 @@
assertFalse(textView.hasTransientState());
}
+ public void testResetMenuItemTitle() throws Exception {
+ getActivity().getSystemService(TextClassificationManager.class).setTextClassifier(null);
+ final TextView textView = (TextView) getActivity().findViewById(R.id.textview);
+ final int itemId = 1;
+ final String title1 = " AFIGBO";
+ final int index = title1.indexOf('I');
+ final String title2 = title1.substring(index);
+ final String[] title = new String[]{title1};
+ textView.post(() -> textView.setCustomSelectionActionModeCallback(
+ new ActionMode.Callback() {
+ @Override
+ public boolean onCreateActionMode(ActionMode actionMode, Menu menu) {
+ return true;
+ }
+
+ @Override
+ public boolean onPrepareActionMode(ActionMode actionMode, Menu menu) {
+ menu.removeItem(itemId);
+ menu.add(Menu.NONE /* group */, itemId, 0 /* order */, title[0]);
+ return true;
+ }
+
+ @Override
+ public boolean onActionItemClicked(ActionMode actionMode, MenuItem menuItem) {
+ return false;
+ }
+
+ @Override
+ public void onDestroyActionMode(ActionMode actionMode) {
+ }
+ }));
+ onView(withId(R.id.textview)).perform(replaceText(title1));
+ onView(withId(R.id.textview)).perform(longPressOnTextAtIndex(index));
+ sleepForFloatingToolbarPopup();
+ assertFloatingToolbarContainsItem(title1);
+
+ // Change the menu item title.
+ title[0] = title2;
+ // Change the selection to invalidate the action mode without restarting it.
+ onHandleView(com.android.internal.R.id.selection_start_handle)
+ .perform(dragHandle(textView, Handle.SELECTION_START, index));
+ sleepForFloatingToolbarPopup();
+ assertFloatingToolbarContainsItem(title2);
+ }
+
public void testAssistItemIsAtIndexZero() throws Exception {
getActivity().getSystemService(TextClassificationManager.class).setTextClassifier(null);
final TextView textView = (TextView) getActivity().findViewById(R.id.textview);
diff --git a/core/tests/coretests/src/com/android/internal/app/procstats/SparseMappingTableTest.java b/core/tests/coretests/src/com/android/internal/app/procstats/SparseMappingTableTest.java
index fd57baa..115af5e 100644
--- a/core/tests/coretests/src/com/android/internal/app/procstats/SparseMappingTableTest.java
+++ b/core/tests/coretests/src/com/android/internal/app/procstats/SparseMappingTableTest.java
@@ -180,7 +180,9 @@
try {
table.getValue(key);
- throw new Exception("Exception not thrown after mismatched reset calls.");
+ // Turn off this assertion because the check in SparseMappingTable.assertConsistency
+ // is also turned off.
+ //throw new Exception("Exception not thrown after mismatched reset calls.");
} catch (RuntimeException ex) {
// Good
}
diff --git a/core/tests/coretests/src/com/android/internal/os/BatteryStatsBackgroundStatsTest.java b/core/tests/coretests/src/com/android/internal/os/BatteryStatsBackgroundStatsTest.java
index d8de70c..c539f78 100644
--- a/core/tests/coretests/src/com/android/internal/os/BatteryStatsBackgroundStatsTest.java
+++ b/core/tests/coretests/src/com/android/internal/os/BatteryStatsBackgroundStatsTest.java
@@ -100,6 +100,55 @@
assertEquals(227_000, bgtb.computeRealtime(cur, STATS_SINCE_CHARGED));
}
+ /** Test that BatteryStatsImpl.Uid.mOnBatteryScreenOffBackgroundTimeBase works correctly. */
+ @SmallTest
+ public void testScreenOffBgTimeBase() throws Exception {
+ final MockClocks clocks = new MockClocks(); // holds realtime and uptime in ms
+ MockBatteryStatsImpl bi = new MockBatteryStatsImpl(clocks);
+ long cur = 0; // realtime in us
+
+ BatteryStatsImpl.TimeBase bgtb = bi.getOnBatteryScreenOffBackgroundTimeBase(UID);
+
+ // battery=off, screen=off, background=off
+ cur = (clocks.realtime = clocks.uptime = 100) * 1000;
+ bi.noteUidProcessStateLocked(UID, ActivityManager.PROCESS_STATE_IMPORTANT_FOREGROUND);
+ bi.updateTimeBasesLocked(false, false, cur, cur);
+ assertFalse(bgtb.isRunning());
+
+ // battery=on, screen=off, background=off
+ cur = (clocks.realtime = clocks.uptime = 200) * 1000;
+ bi.updateTimeBasesLocked(true, false, cur, cur);
+ assertFalse(bgtb.isRunning());
+
+ // battery=on, screen=on, background=off
+ cur = (clocks.realtime = clocks.uptime = 300) * 1000;
+ bi.updateTimeBasesLocked(true, true, cur, cur);
+ assertFalse(bgtb.isRunning());
+
+ // battery=on, screen=on, background=on
+ // Only during this period should the timebase progress
+ cur = (clocks.realtime = clocks.uptime = 400) * 1000;
+ bi.noteUidProcessStateLocked(UID, ActivityManager.PROCESS_STATE_IMPORTANT_BACKGROUND);
+ assertTrue(bgtb.isRunning());
+
+ // battery=on, screen=off, background=on
+ cur = (clocks.realtime = clocks.uptime = 550) * 1000;
+ bi.updateTimeBasesLocked(true, false, cur, cur);
+ assertFalse(bgtb.isRunning());
+
+ // battery=off, screen=off, background=on
+ cur = (clocks.realtime = clocks.uptime = 660) * 1000;
+ bi.updateTimeBasesLocked(false, false, cur, cur);
+ assertFalse(bgtb.isRunning());
+
+ // battery=off, screen=off, background=off
+ cur = (clocks.realtime = clocks.uptime = 770) * 1000;
+ bi.noteUidProcessStateLocked(UID, ActivityManager.PROCESS_STATE_IMPORTANT_FOREGROUND);
+ assertFalse(bgtb.isRunning());
+
+ assertEquals(150_000, bgtb.computeRealtime(cur, STATS_SINCE_CHARGED));
+ }
+
@SmallTest
public void testWifiScan() throws Exception {
final MockClocks clocks = new MockClocks();
@@ -156,9 +205,9 @@
// App in foreground
bi.noteUidProcessStateLocked(UID, ActivityManager.PROCESS_STATE_IMPORTANT_FOREGROUND);
- // Start timer
+ // Start timer (optimized)
curr = 1000 * (clocks.realtime = clocks.uptime = 202);
- bi.noteBluetoothScanStartedFromSourceLocked(ws);
+ bi.noteBluetoothScanStartedFromSourceLocked(ws, false);
// Move to background
curr = 1000 * (clocks.realtime = clocks.uptime = 254);
@@ -172,21 +221,44 @@
curr = 1000 * (clocks.realtime = clocks.uptime = 409);
bi.noteBluetoothScanStoppedFromSourceLocked(ws);
+ // Start timer (unoptimized)
+ curr = 1000 * (clocks.realtime = clocks.uptime = 1000);
+ bi.noteBluetoothScanStartedFromSourceLocked(ws, true);
+
+ // On battery
+ curr = 1000 * (clocks.realtime = clocks.uptime = 2001);
+ bi.updateTimeBasesLocked(true, false, curr, curr); // on battery
+
+ // Move to foreground
+ curr = 1000 * (clocks.realtime = clocks.uptime = 3004);
+ bi.noteUidProcessStateLocked(UID, ActivityManager.PROCESS_STATE_TOP);
+
+ // Stop timer
+ curr = 1000 * (clocks.realtime = clocks.uptime = 4008);
+ bi.noteBluetoothScanStoppedFromSourceLocked(ws);
+
// Test
- curr = 1000 * (clocks.realtime = clocks.uptime = 657);
+ curr = 1000 * (clocks.realtime = clocks.uptime = 5000);
BatteryStats.Timer timer = bi.getUidStats().get(UID).getBluetoothScanTimer();
BatteryStats.Timer bgTimer = bi.getUidStats().get(UID).getBluetoothScanBackgroundTimer();
+ BatteryStats.Timer badTimer = bi.getUidStats().get(UID).getBluetoothUnoptimizedScanTimer();
+ BatteryStats.Timer badBgTimer = bi.getUidStats().get(UID)
+ .getBluetoothUnoptimizedScanBackgroundTimer();
long time = timer.getTotalTimeLocked(curr, STATS_SINCE_CHARGED);
int count = timer.getCountLocked(STATS_SINCE_CHARGED);
int bgCount = bgTimer.getCountLocked(STATS_SINCE_CHARGED);
long actualTime = timer.getTotalDurationMsLocked(clocks.realtime) * 1000;
long bgTime = bgTimer.getTotalDurationMsLocked(clocks.realtime) * 1000;
- assertEquals((305 - 202) * 1000, time);
- assertEquals(1, count);
- assertEquals(0, bgCount);
- assertEquals((305 - 202) * 1000, actualTime);
- assertEquals((305 - 254) * 1000, bgTime);
+ long badTime = badTimer.getTotalDurationMsLocked(clocks.realtime) * 1000;
+ long badBgTime = badBgTimer.getTotalDurationMsLocked(clocks.realtime) * 1000;
+ assertEquals((305 - 202 + 4008 - 2001) * 1000, time);
+ assertEquals(1, count); // second scan starts off-battery
+ assertEquals(0, bgCount); // first scan starts in fg, second starts off-battery
+ assertEquals((305 - 202 + 4008 - 2001) * 1000, actualTime);
+ assertEquals((305 - 254 + 3004 - 2001) * 1000, bgTime);
+ assertEquals((4008 - 2001) * 1000, badTime);
+ assertEquals((3004 - 2001) * 1000, badBgTime);
}
@SmallTest
diff --git a/core/tests/coretests/src/com/android/internal/os/BatteryStatsCounterTest.java b/core/tests/coretests/src/com/android/internal/os/BatteryStatsCounterTest.java
new file mode 100644
index 0000000..08f8dd1
--- /dev/null
+++ b/core/tests/coretests/src/com/android/internal/os/BatteryStatsCounterTest.java
@@ -0,0 +1,148 @@
+/*
+ * Copyright (C) 2017 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.internal.os;
+
+import android.os.BatteryStats;
+import android.os.Parcel;
+import android.support.test.filters.SmallTest;
+
+import junit.framework.TestCase;
+
+/**
+ * Test BatteryStatsImpl.Counter.
+ */
+public class BatteryStatsCounterTest extends TestCase {
+
+ @SmallTest
+ public void testCounter() throws Exception {
+ final MockClocks clocks = new MockClocks(); // holds realtime and uptime in ms
+ final BatteryStatsImpl.TimeBase timeBase = new BatteryStatsImpl.TimeBase();
+ timeBase.init(clocks.uptimeMillis(), clocks.elapsedRealtime());
+
+ final BatteryStatsImpl.Counter counter = new BatteryStatsImpl.Counter(timeBase);
+
+ // timeBase off (i.e. plugged in)
+ timeBase.setRunning(false, 1, 1);
+ counter.stepAtomic();
+ counter.stepAtomic();
+ counter.stepAtomic();
+ counter.stepAtomic();
+ counter.stepAtomic();
+ assertEquals(0, counter.getCountLocked(BatteryStats.STATS_SINCE_CHARGED));
+ assertEquals(0, counter.getCountLocked(BatteryStats.STATS_CURRENT));
+ assertEquals(0, counter.getCountLocked(BatteryStats.STATS_SINCE_UNPLUGGED));
+
+ // timeBase on (i.e. unplugged)
+ timeBase.setRunning(true, 2, 2);
+ counter.stepAtomic();
+ counter.stepAtomic();
+ counter.stepAtomic();
+ counter.stepAtomic();
+ assertEquals(4, counter.getCountLocked(BatteryStats.STATS_SINCE_CHARGED));
+ assertEquals(4, counter.getCountLocked(BatteryStats.STATS_CURRENT));
+ assertEquals(4, counter.getCountLocked(BatteryStats.STATS_SINCE_UNPLUGGED));
+
+ // timeBase off (i.e. plugged in)
+ timeBase.setRunning(false, 3, 3);
+ counter.stepAtomic();
+ counter.stepAtomic();
+ counter.stepAtomic();
+ assertEquals(4, counter.getCountLocked(BatteryStats.STATS_SINCE_CHARGED));
+ assertEquals(4, counter.getCountLocked(BatteryStats.STATS_CURRENT));
+ assertEquals(4, counter.getCountLocked(BatteryStats.STATS_SINCE_UNPLUGGED));
+
+ // timeBase on (i.e. unplugged)
+ timeBase.setRunning(true, 4, 4);
+ counter.stepAtomic();
+ counter.stepAtomic();
+ assertEquals(6, counter.getCountLocked(BatteryStats.STATS_SINCE_CHARGED));
+ assertEquals(6, counter.getCountLocked(BatteryStats.STATS_CURRENT));
+ assertEquals(2, counter.getCountLocked(BatteryStats.STATS_SINCE_UNPLUGGED));
+ }
+
+
+ @SmallTest
+ public void testParceling() throws Exception {
+ final MockClocks clocks = new MockClocks(); // holds realtime and uptime in ms
+ final BatteryStatsImpl.TimeBase timeBase = new BatteryStatsImpl.TimeBase();
+ timeBase.init(clocks.uptimeMillis(), clocks.elapsedRealtime());
+
+ final BatteryStatsImpl.Counter origCounter = new BatteryStatsImpl.Counter(timeBase);
+
+ // timeBase on (i.e. unplugged)
+ timeBase.setRunning(true, 1, 1);
+ origCounter.stepAtomic(); origCounter.stepAtomic(); origCounter.stepAtomic(); // three times
+ assertEquals(3, origCounter.getCountLocked(BatteryStats.STATS_SINCE_CHARGED));
+ assertEquals(3, origCounter.getCountLocked(BatteryStats.STATS_CURRENT));
+ assertEquals(3, origCounter.getCountLocked(BatteryStats.STATS_SINCE_UNPLUGGED));
+
+ // Test summary parcelling (from origCounter)
+ final Parcel summaryParcel = Parcel.obtain();
+ origCounter.writeSummaryFromParcelLocked(summaryParcel);
+ summaryParcel.setDataPosition(0);
+ final BatteryStatsImpl.Counter summaryCounter = new BatteryStatsImpl.Counter(timeBase);
+ summaryCounter.stepAtomic(); // occurs before reading the summary, so must not count later
+ summaryCounter.readSummaryFromParcelLocked(summaryParcel);
+
+ // timeBase still on (i.e. unplugged)
+ summaryCounter.stepAtomic(); // once
+ assertEquals(4, summaryCounter.getCountLocked(BatteryStats.STATS_SINCE_CHARGED));
+ assertEquals(1, summaryCounter.getCountLocked(BatteryStats.STATS_CURRENT));
+ assertEquals(1, summaryCounter.getCountLocked(BatteryStats.STATS_SINCE_UNPLUGGED));
+
+ // timeBase off (i.e. plugged in)
+ timeBase.setRunning(false, 3, 3);
+ summaryCounter.stepAtomic(); summaryCounter.stepAtomic(); // twice
+ assertEquals(4, summaryCounter.getCountLocked(BatteryStats.STATS_SINCE_CHARGED));
+ assertEquals(1, summaryCounter.getCountLocked(BatteryStats.STATS_CURRENT));
+ assertEquals(1, summaryCounter.getCountLocked(BatteryStats.STATS_SINCE_UNPLUGGED));
+
+ // timeBase on (i.e. unplugged)
+ timeBase.setRunning(true, 4, 4);
+ summaryCounter.stepAtomic(); summaryCounter.stepAtomic(); // twice
+ assertEquals(6, summaryCounter.getCountLocked(BatteryStats.STATS_SINCE_CHARGED));
+ assertEquals(3, summaryCounter.getCountLocked(BatteryStats.STATS_CURRENT));
+ assertEquals(2, summaryCounter.getCountLocked(BatteryStats.STATS_SINCE_UNPLUGGED));
+
+
+ // Test full parcelling (from summaryCounter)
+ final Parcel fullParcel = Parcel.obtain();
+ summaryCounter.writeToParcel(fullParcel);
+ fullParcel.setDataPosition(0);
+ final BatteryStatsImpl.Counter fullParcelCounter
+ = new BatteryStatsImpl.Counter(timeBase, fullParcel);
+
+ // timeBase still on (i.e. unplugged)
+ fullParcelCounter.stepAtomic(); // once
+ assertEquals(7, fullParcelCounter.getCountLocked(BatteryStats.STATS_SINCE_CHARGED));
+ assertEquals(4, fullParcelCounter.getCountLocked(BatteryStats.STATS_CURRENT));
+ assertEquals(3, fullParcelCounter.getCountLocked(BatteryStats.STATS_SINCE_UNPLUGGED));
+
+ // timeBase off (i.e. plugged in)
+ timeBase.setRunning(false, 5, 5);
+ fullParcelCounter.stepAtomic(); fullParcelCounter.stepAtomic(); // twice
+ assertEquals(7, fullParcelCounter.getCountLocked(BatteryStats.STATS_SINCE_CHARGED));
+ assertEquals(4, fullParcelCounter.getCountLocked(BatteryStats.STATS_CURRENT));
+ assertEquals(3, fullParcelCounter.getCountLocked(BatteryStats.STATS_SINCE_UNPLUGGED));
+
+ // timeBase on (i.e. unplugged)
+ timeBase.setRunning(true, 6, 6);
+ fullParcelCounter.stepAtomic(); fullParcelCounter.stepAtomic(); // twice
+ assertEquals(9, fullParcelCounter.getCountLocked(BatteryStats.STATS_SINCE_CHARGED));
+ assertEquals(6, fullParcelCounter.getCountLocked(BatteryStats.STATS_CURRENT));
+ assertEquals(2, fullParcelCounter.getCountLocked(BatteryStats.STATS_SINCE_UNPLUGGED));
+ }
+}
diff --git a/core/tests/coretests/src/com/android/internal/os/BatteryStatsNoteTest.java b/core/tests/coretests/src/com/android/internal/os/BatteryStatsNoteTest.java
index e374e11..4e8ab31 100644
--- a/core/tests/coretests/src/com/android/internal/os/BatteryStatsNoteTest.java
+++ b/core/tests/coretests/src/com/android/internal/os/BatteryStatsNoteTest.java
@@ -16,7 +16,10 @@
package com.android.internal.os;
import static android.os.BatteryStats.STATS_SINCE_CHARGED;
+import static android.os.BatteryStats.WAKE_TYPE_PARTIAL;
+import android.app.ActivityManager;
+import android.os.BatteryStats;
import android.os.WorkSource;
import android.support.test.filters.SmallTest;
@@ -29,16 +32,58 @@
private static final int UID = 10500;
private static final WorkSource WS = new WorkSource(UID);
- /** Test that BatteryStatsImpl.Uid.noteBluetoothScanResultsLocked. */
+ /** Test BatteryStatsImpl.Uid.noteBluetoothScanResultLocked. */
@SmallTest
public void testNoteBluetoothScanResultLocked() throws Exception {
MockBatteryStatsImpl bi = new MockBatteryStatsImpl(new MockClocks());
bi.updateTimeBasesLocked(true, true, 0, 0);
+ bi.noteUidProcessStateLocked(UID, ActivityManager.PROCESS_STATE_TOP);
bi.noteBluetoothScanResultsFromSourceLocked(WS, 1);
bi.noteBluetoothScanResultsFromSourceLocked(WS, 100);
assertEquals(101,
bi.getUidStats().get(UID).getBluetoothScanResultCounter()
.getCountLocked(STATS_SINCE_CHARGED));
+ // TODO: remove next line when Counter misreporting values when plugged-in bug is fixed.
+ bi.noteUidProcessStateLocked(UID, ActivityManager.PROCESS_STATE_IMPORTANT_BACKGROUND);
+ BatteryStats.Counter bgCntr = bi.getUidStats().get(UID).getBluetoothScanResultBgCounter();
+ if (bgCntr != null) {
+ assertEquals(0, bgCntr.getCountLocked(STATS_SINCE_CHARGED));
+ }
+
+ bi.noteUidProcessStateLocked(UID, ActivityManager.PROCESS_STATE_IMPORTANT_BACKGROUND);
+ bi.noteBluetoothScanResultsFromSourceLocked(WS, 17);
+ assertEquals(101 + 17,
+ bi.getUidStats().get(UID).getBluetoothScanResultCounter()
+ .getCountLocked(STATS_SINCE_CHARGED));
+ assertEquals(17,
+ bi.getUidStats().get(UID).getBluetoothScanResultBgCounter()
+ .getCountLocked(STATS_SINCE_CHARGED));
+ }
+
+ /** Test BatteryStatsImpl.Uid.noteStartWakeLocked. */
+ @SmallTest
+ public void testNoteStartWakeLocked() throws Exception {
+ final MockClocks clocks = new MockClocks(); // holds realtime and uptime in ms
+ MockBatteryStatsImpl bi = new MockBatteryStatsImpl(clocks);
+
+ int pid = 10;
+ String name = "name";
+
+ bi.updateTimeBasesLocked(true, true, 0, 0);
+ bi.noteUidProcessStateLocked(UID, ActivityManager.PROCESS_STATE_TOP);
+ bi.getUidStatsLocked(UID).noteStartWakeLocked(pid, name, WAKE_TYPE_PARTIAL, clocks.realtime);
+
+ clocks.realtime = clocks.uptime = 100;
+ bi.noteUidProcessStateLocked(UID, ActivityManager.PROCESS_STATE_IMPORTANT_BACKGROUND);
+
+ clocks.realtime = clocks.uptime = 220;
+ bi.getUidStatsLocked(UID).noteStopWakeLocked(pid, name, WAKE_TYPE_PARTIAL, clocks.realtime);
+
+ BatteryStats.Timer aggregTimer = bi.getUidStats().get(UID).getAggregatedPartialWakelockTimer();
+ long actualTime = aggregTimer.getTotalTimeLocked(300_000, STATS_SINCE_CHARGED);
+ long bgTime = aggregTimer.getSubTimer().getTotalTimeLocked(300_000, STATS_SINCE_CHARGED);
+ assertEquals(220_000, actualTime);
+ assertEquals(120_000, bgTime);
}
}
diff --git a/core/tests/coretests/src/com/android/internal/os/BatteryStatsTests.java b/core/tests/coretests/src/com/android/internal/os/BatteryStatsTests.java
index 3a16fcf..1412d3e 100644
--- a/core/tests/coretests/src/com/android/internal/os/BatteryStatsTests.java
+++ b/core/tests/coretests/src/com/android/internal/os/BatteryStatsTests.java
@@ -5,17 +5,18 @@
@RunWith(Suite.class)
@Suite.SuiteClasses({
+ BatteryStatsBackgroundStatsTest.class,
+ BatteryStatsCounterTest.class,
BatteryStatsDualTimerTest.class,
BatteryStatsDurationTimerTest.class,
+ BatteryStatsNoteTest.class,
BatteryStatsSamplingTimerTest.class,
+ BatteryStatsSensorTest.class,
BatteryStatsServTest.class,
BatteryStatsStopwatchTimerTest.class,
BatteryStatsTimeBaseTest.class,
BatteryStatsTimerTest.class,
BatteryStatsUidTest.class,
- BatteryStatsSensorTest.class,
- BatteryStatsBackgroundStatsTest.class,
- BatteryStatsNoteTest.class,
})
public class BatteryStatsTests {
}
diff --git a/core/tests/coretests/src/com/android/internal/os/MockBatteryStatsImpl.java b/core/tests/coretests/src/com/android/internal/os/MockBatteryStatsImpl.java
index 65f898c..a123fce 100644
--- a/core/tests/coretests/src/com/android/internal/os/MockBatteryStatsImpl.java
+++ b/core/tests/coretests/src/com/android/internal/os/MockBatteryStatsImpl.java
@@ -44,5 +44,9 @@
public TimeBase getOnBatteryBackgroundTimeBase(int uid) {
return getUidStatsLocked(uid).mOnBatteryBackgroundTimeBase;
}
+
+ public TimeBase getOnBatteryScreenOffBackgroundTimeBase(int uid) {
+ return getUidStatsLocked(uid).mOnBatteryScreenOffBackgroundTimeBase;
+ }
}
diff --git a/core/tests/coretests/src/com/android/internal/widget/ImageFloatingTextViewTest.java b/core/tests/coretests/src/com/android/internal/widget/ImageFloatingTextViewTest.java
index 906d7e9..a249925 100644
--- a/core/tests/coretests/src/com/android/internal/widget/ImageFloatingTextViewTest.java
+++ b/core/tests/coretests/src/com/android/internal/widget/ImageFloatingTextViewTest.java
@@ -38,6 +38,7 @@
public void setup() {
mContext = InstrumentationRegistry.getTargetContext();
mView = new ImageFloatingTextView(mContext, null, 0, 0);
+ mView.setMaxLines(9);
mTextView = new TextView(mContext, null, 0, 0);
mTextView.setMaxLines(9);
}
diff --git a/graphics/java/android/graphics/ComposeShader.java b/graphics/java/android/graphics/ComposeShader.java
index 0b1141a..70a5f53 100644
--- a/graphics/java/android/graphics/ComposeShader.java
+++ b/graphics/java/android/graphics/ComposeShader.java
@@ -76,8 +76,9 @@
mShaderA.getNativeInstance(), mShaderB.getNativeInstance(), mPorterDuffMode);
}
+ /** @hide */
@Override
- void verifyNativeInstance() {
+ protected void verifyNativeInstance() {
if (mShaderA.getNativeInstance() != mNativeInstanceShaderA
|| mShaderB.getNativeInstance() != mNativeInstanceShaderB) {
// Child shader native instance has been updated,
diff --git a/graphics/java/android/graphics/Paint.java b/graphics/java/android/graphics/Paint.java
index e62df8f..e3b4740 100644
--- a/graphics/java/android/graphics/Paint.java
+++ b/graphics/java/android/graphics/Paint.java
@@ -529,6 +529,7 @@
setTextLocales(LocaleList.getAdjustedDefault());
setElegantTextHeight(false);
mFontFeatureSettings = null;
+ mFontVariationSettings = null;
}
/**
@@ -565,6 +566,7 @@
mBidiFlags = paint.mBidiFlags;
mLocales = paint.mLocales;
mFontFeatureSettings = paint.mFontFeatureSettings;
+ mFontVariationSettings = paint.mFontVariationSettings;
}
/** @hide */
@@ -1594,10 +1596,13 @@
return true;
}
+ // The null typeface is valid and it is equivalent to Typeface.DEFAULT.
+ // To call isSupportedAxes method, use Typeface.DEFAULT instance.
+ Typeface targetTypeface = mTypeface == null ? Typeface.DEFAULT : mTypeface;
FontVariationAxis[] axes = FontVariationAxis.fromFontVariationSettings(settings);
final ArrayList<FontVariationAxis> filteredAxes = new ArrayList<FontVariationAxis>();
for (final FontVariationAxis axis : axes) {
- if (mTypeface.isSupportedAxes(axis.getOpenTypeTagValue())) {
+ if (targetTypeface.isSupportedAxes(axis.getOpenTypeTagValue())) {
filteredAxes.add(axis);
}
}
@@ -1605,7 +1610,7 @@
return false;
}
mFontVariationSettings = settings;
- setTypeface(Typeface.createFromTypefaceWithVariation(mTypeface, filteredAxes));
+ setTypeface(Typeface.createFromTypefaceWithVariation(targetTypeface, filteredAxes));
return true;
}
diff --git a/graphics/java/android/graphics/Shader.java b/graphics/java/android/graphics/Shader.java
index 8410ab2..0209cea 100644
--- a/graphics/java/android/graphics/Shader.java
+++ b/graphics/java/android/graphics/Shader.java
@@ -19,6 +19,8 @@
import android.annotation.NonNull;
import android.annotation.Nullable;
+import libcore.util.NativeAllocationRegistry;
+
/**
* Shader is the based class for objects that return horizontal spans of colors
* during drawing. A subclass of Shader is installed in a Paint calling
@@ -26,6 +28,12 @@
* drawn with that paint will get its color(s) from the shader.
*/
public class Shader {
+
+ private static class NoImagePreloadHolder {
+ public static final NativeAllocationRegistry sRegistry = new NativeAllocationRegistry(
+ Shader.class.getClassLoader(), nativeGetFinalizer(), 50);
+ }
+
/**
* @deprecated Use subclass constructors directly instead.
*/
@@ -37,6 +45,8 @@
* is called - otherwise may be out of date with java setters/properties.
*/
private long mNativeInstance;
+ // Runnable to do immediate destruction
+ private Runnable mCleaner;
/**
* Current matrix - always set to null if local matrix is identity.
@@ -80,7 +90,8 @@
/**
* Set the shader's local matrix. Passing null will reset the shader's
- * matrix to identity.
+ * matrix to identity. If the matrix has scale value as 0, the drawing
+ * result is undefined.
*
* @param localM The shader's new local matrix, or null to specify identity
*/
@@ -105,9 +116,11 @@
return 0;
}
- void discardNativeInstance() {
+ /** @hide */
+ protected final void discardNativeInstance() {
if (mNativeInstance != 0) {
- nativeSafeUnref(mNativeInstance);
+ mCleaner.run();
+ mCleaner = null;
mNativeInstance = 0;
}
}
@@ -115,20 +128,9 @@
/**
* Callback for subclasses to call {@link #discardNativeInstance()} if the most recently
* constructed native instance is no longer valid.
+ * @hide
*/
- void verifyNativeInstance() {
- }
-
- @Override
- protected void finalize() throws Throwable {
- try {
- if (mNativeInstance != 0) {
- nativeSafeUnref(mNativeInstance);
- }
- mNativeInstance = -1;
- } finally {
- super.finalize();
- }
+ protected void verifyNativeInstance() {
}
/**
@@ -150,20 +152,20 @@
/**
* @hide
*/
- public long getNativeInstance() {
- if (mNativeInstance == -1) {
- throw new IllegalStateException("attempting to use a finalized Shader");
- }
-
+ public final long getNativeInstance() {
// verify mNativeInstance is valid
verifyNativeInstance();
if (mNativeInstance == 0) {
mNativeInstance = createNativeInstance(mLocalMatrix == null
? 0 : mLocalMatrix.native_instance);
+ mCleaner = NoImagePreloadHolder.sRegistry.registerNativeAllocation(
+ this, mNativeInstance);
}
return mNativeInstance;
}
- private static native void nativeSafeUnref(long nativeInstance);
+ private static native long nativeGetFinalizer();
+
}
+
diff --git a/graphics/java/android/graphics/Typeface.java b/graphics/java/android/graphics/Typeface.java
index 5a56f53..c4b56c3 100644
--- a/graphics/java/android/graphics/Typeface.java
+++ b/graphics/java/android/graphics/Typeface.java
@@ -725,8 +725,8 @@
}
/** @hide */
- public static Typeface createFromTypefaceWithVariation(Typeface family,
- List<FontVariationAxis> axes) {
+ public static Typeface createFromTypefaceWithVariation(@Nullable Typeface family,
+ @NonNull List<FontVariationAxis> axes) {
final long ni = family == null ? 0 : family.native_instance;
return new Typeface(nativeCreateFromTypefaceWithVariation(ni, axes));
}
@@ -1056,7 +1056,7 @@
}
}
}
- return Arrays.binarySearch(mSupportedAxes, axis) > 0;
+ return Arrays.binarySearch(mSupportedAxes, axis) >= 0;
}
private static native long nativeCreateFromTypeface(long native_instance, int style);
diff --git a/graphics/java/android/graphics/drawable/AdaptiveIconDrawable.java b/graphics/java/android/graphics/drawable/AdaptiveIconDrawable.java
index ab10e97..8616d58 100644
--- a/graphics/java/android/graphics/drawable/AdaptiveIconDrawable.java
+++ b/graphics/java/android/graphics/drawable/AdaptiveIconDrawable.java
@@ -84,7 +84,7 @@
/**
* Launcher icons design guideline
*/
- private static final float SAFEZONE_SCALE = 72f/66f;
+ private static final float SAFEZONE_SCALE = 66f/72f;
/**
* All four sides of the layers are padded with extra inset so as to provide
@@ -676,12 +676,7 @@
@Override
public int getAlpha() {
- final Drawable dr = getFirstNonNullDrawable();
- if (dr != null) {
- return dr.getAlpha();
- } else {
- return super.getAlpha();
- }
+ return PixelFormat.TRANSLUCENT;
}
@Override
@@ -719,17 +714,6 @@
}
}
- private Drawable getFirstNonNullDrawable() {
- final ChildDrawable[] array = mLayerState.mChildren;
- for (int i = 0; i < mLayerState.N_CHILDREN; i++) {
- final Drawable dr = array[i].mDrawable;
- if (dr != null) {
- return dr;
- }
- }
- return null;
- }
-
public void setOpacity(int opacity) {
mLayerState.mOpacityOverride = opacity;
}
diff --git a/graphics/java/android/graphics/drawable/RippleDrawable.java b/graphics/java/android/graphics/drawable/RippleDrawable.java
index bfd0604..8f314c9 100644
--- a/graphics/java/android/graphics/drawable/RippleDrawable.java
+++ b/graphics/java/android/graphics/drawable/RippleDrawable.java
@@ -58,11 +58,11 @@
* mask using {@code setId(..., android.R.id.mask)} or an existing mask layer
* may be replaced using {@code setDrawableByLayerId(android.R.id.mask, ...)}.
* <pre>
- * <code><!-- A red ripple masked against an opaque rectangle. --/>
- * <ripple android:color="#ffff0000">
- * <item android:id="@android:id/mask"
+ * <code><!-- A red ripple masked against an opaque rectangle. --/>
+ * <ripple android:color="#ffff0000">
+ * <item android:id="@android:id/mask"
* android:drawable="@android:color/white" />
- * </ripple></code>
+ * </ripple></code>
* </pre>
* <p>
* If a mask layer is set, the ripple effect will be masked against that layer
@@ -71,15 +71,15 @@
* If no mask layer is set, the ripple effect is masked against the composite
* of the child layers.
* <pre>
- * <code><!-- A green ripple drawn atop a black rectangle. --/>
- * <ripple android:color="#ff00ff00">
- * <item android:drawable="@android:color/black" />
- * </ripple>
+ * <code><!-- A green ripple drawn atop a black rectangle. --/>
+ * <ripple android:color="#ff00ff00">
+ * <item android:drawable="@android:color/black" />
+ * </ripple>
*
- * <!-- A blue ripple drawn atop a drawable resource. --/>
- * <ripple android:color="#ff0000ff">
- * <item android:drawable="@drawable/my_drawable" />
- * </ripple></code>
+ * <!-- A blue ripple drawn atop a drawable resource. --/>
+ * <ripple android:color="#ff0000ff">
+ * <item android:drawable="@drawable/my_drawable" />
+ * </ripple></code>
* </pre>
* <p>
* If no child layers or mask is specified and the ripple is set as a View
@@ -87,8 +87,8 @@
* background within the View's hierarchy. In this case, the drawing region
* may extend outside of the Drawable bounds.
* <pre>
- * <code><!-- An unbounded red ripple. --/>
- * <ripple android:color="#ffff0000" /></code>
+ * <code><!-- An unbounded red ripple. --/>
+ * <ripple android:color="#ffff0000" /></code>
* </pre>
*
* @attr ref android.R.styleable#RippleDrawable_color
diff --git a/libs/hwui/Caches.cpp b/libs/hwui/Caches.cpp
index a0366de..2fdfcd4 100644
--- a/libs/hwui/Caches.cpp
+++ b/libs/hwui/Caches.cpp
@@ -223,7 +223,6 @@
///////////////////////////////////////////////////////////////////////////////
void Caches::clearGarbage() {
- textureCache.clearGarbage();
pathCache.clearGarbage();
patchCache.clearGarbage();
}
diff --git a/libs/hwui/TextureCache.cpp b/libs/hwui/TextureCache.cpp
index 63a6a2c..710cdd9 100644
--- a/libs/hwui/TextureCache.cpp
+++ b/libs/hwui/TextureCache.cpp
@@ -191,25 +191,14 @@
return texture;
}
-void TextureCache::releaseTexture(uint32_t pixelRefStableID) {
- Mutex::Autolock _l(mLock);
- mGarbage.push_back(pixelRefStableID);
-}
-
-void TextureCache::clearGarbage() {
- Mutex::Autolock _l(mLock);
- size_t count = mGarbage.size();
- for (size_t i = 0; i < count; i++) {
- uint32_t pixelRefId = mGarbage[i];
- auto hardwareIter = mHardwareTextures.find(pixelRefId);
- if (hardwareIter == mHardwareTextures.end()) {
- mCache.remove(pixelRefId);
- } else {
- hardwareIter->second->deleteTexture();
- mHardwareTextures.erase(hardwareIter);
- }
+bool TextureCache::destroyTexture(uint32_t pixelRefStableID) {
+ auto hardwareIter = mHardwareTextures.find(pixelRefStableID);
+ if (hardwareIter != mHardwareTextures.end()) {
+ hardwareIter->second->deleteTexture();
+ mHardwareTextures.erase(hardwareIter);
+ return true;
}
- mGarbage.clear();
+ return mCache.remove(pixelRefStableID);
}
void TextureCache::clear() {
diff --git a/libs/hwui/TextureCache.h b/libs/hwui/TextureCache.h
index db4ff39..776ff8a 100644
--- a/libs/hwui/TextureCache.h
+++ b/libs/hwui/TextureCache.h
@@ -94,14 +94,10 @@
Texture* get(Bitmap* bitmap);
/**
- * Removes the texture associated with the specified pixelRef. This is meant
- * to be called from threads that are not the EGL context thread.
+ * Removes the texture associated with the specified pixelRef. Must be called from RenderThread
+ * Returns true if a texture was destroyed, false if no texture with that id was found
*/
- ANDROID_API void releaseTexture(uint32_t pixelRefStableID);
- /**
- * Process deferred removals.
- */
- void clearGarbage();
+ bool destroyTexture(uint32_t pixelRefStableID);
/**
* Clears the cache. This causes all textures to be deleted.
@@ -139,9 +135,7 @@
bool mDebugEnabled;
- std::vector<uint32_t> mGarbage;
std::unordered_map<uint32_t, std::unique_ptr<Texture>> mHardwareTextures;
- mutable Mutex mLock;
}; // class TextureCache
}; // namespace uirenderer
diff --git a/libs/hwui/hwui/Bitmap.cpp b/libs/hwui/hwui/Bitmap.cpp
index d765584..bb1e674 100644
--- a/libs/hwui/hwui/Bitmap.cpp
+++ b/libs/hwui/hwui/Bitmap.cpp
@@ -416,9 +416,7 @@
}
- if (android::uirenderer::Caches::hasInstance()) {
- android::uirenderer::Caches::getInstance().textureCache.releaseTexture(getStableID());
- }
+ android::uirenderer::renderthread::RenderProxy::onBitmapDestroyed(getStableID());
}
bool Bitmap::hasHardwareMipMap() const {
@@ -486,7 +484,13 @@
void Bitmap::getSkBitmap(SkBitmap* outBitmap) {
outBitmap->setHasHardwareMipMap(mHasHardwareMipMap);
if (isHardware()) {
- outBitmap->allocPixels(info());
+ if (uirenderer::Properties::isSkiaEnabled()) {
+ // TODO: add color correctness for Skia pipeline - pass null color space for now
+ outBitmap->allocPixels(SkImageInfo::Make(info().width(), info().height(),
+ info().colorType(), info().alphaType(), nullptr));
+ } else {
+ outBitmap->allocPixels(info());
+ }
uirenderer::renderthread::RenderProxy::copyGraphicBufferInto(graphicBuffer(), outBitmap);
return;
}
@@ -495,9 +499,13 @@
}
void Bitmap::getSkBitmapForShaders(SkBitmap* outBitmap) {
- outBitmap->setInfo(info(), rowBytes());
- outBitmap->setPixelRef(this);
- outBitmap->setHasHardwareMipMap(mHasHardwareMipMap);
+ if (isHardware() && uirenderer::Properties::isSkiaEnabled()) {
+ getSkBitmap(outBitmap);
+ } else {
+ outBitmap->setInfo(info(), rowBytes());
+ outBitmap->setPixelRef(this);
+ outBitmap->setHasHardwareMipMap(mHasHardwareMipMap);
+ }
}
void Bitmap::getBounds(SkRect* bounds) const {
diff --git a/libs/hwui/pipeline/skia/RenderNodeDrawable.cpp b/libs/hwui/pipeline/skia/RenderNodeDrawable.cpp
index 39f11b8..4ee47af 100644
--- a/libs/hwui/pipeline/skia/RenderNodeDrawable.cpp
+++ b/libs/hwui/pipeline/skia/RenderNodeDrawable.cpp
@@ -61,8 +61,17 @@
static void clipOutline(const Outline& outline, SkCanvas* canvas, const SkRect* pendingClip) {
Rect possibleRect;
float radius;
- LOG_ALWAYS_FATAL_IF(!outline.getAsRoundRect(&possibleRect, &radius),
- "clipping outlines should be at most roundedRects");
+
+ /* To match the existing HWUI behavior we only supports rectangles or
+ * rounded rectangles; passing in a more complicated outline fails silently.
+ */
+ if (!outline.getAsRoundRect(&possibleRect, &radius)) {
+ if (pendingClip) {
+ canvas->clipRect(*pendingClip);
+ }
+ return;
+ }
+
SkRect rect = possibleRect.toSkRect();
if (radius != 0.0f) {
if (pendingClip && !pendingClip->contains(rect)) {
diff --git a/libs/hwui/renderstate/RenderState.cpp b/libs/hwui/renderstate/RenderState.cpp
index c8833d2..ed96d49 100644
--- a/libs/hwui/renderstate/RenderState.cpp
+++ b/libs/hwui/renderstate/RenderState.cpp
@@ -122,6 +122,13 @@
mCaches->flush(mode);
}
+void RenderState::onBitmapDestroyed(uint32_t pixelRefId) {
+ if (mCaches && mCaches->textureCache.destroyTexture(pixelRefId)) {
+ glFlush();
+ GL_CHECKPOINT(MODERATE);
+ }
+}
+
void RenderState::setViewport(GLsizei width, GLsizei height) {
mViewportWidth = width;
mViewportHeight = height;
diff --git a/libs/hwui/renderstate/RenderState.h b/libs/hwui/renderstate/RenderState.h
index f78bf7a..787946f 100644
--- a/libs/hwui/renderstate/RenderState.h
+++ b/libs/hwui/renderstate/RenderState.h
@@ -63,6 +63,7 @@
void onVkContextDestroyed();
void flush(Caches::FlushMode flushMode);
+ void onBitmapDestroyed(uint32_t pixelRefId);
void setViewport(GLsizei width, GLsizei height);
void getViewport(GLsizei* outWidth, GLsizei* outHeight);
diff --git a/libs/hwui/renderthread/CanvasContext.cpp b/libs/hwui/renderthread/CanvasContext.cpp
index 02a9ffa..cbc5163 100644
--- a/libs/hwui/renderthread/CanvasContext.cpp
+++ b/libs/hwui/renderthread/CanvasContext.cpp
@@ -436,8 +436,15 @@
swap.vsyncTime = mRenderThread.timeLord().latestVsync();
if (mNativeSurface.get()) {
int durationUs;
- mNativeSurface->query(NATIVE_WINDOW_LAST_DEQUEUE_DURATION, &durationUs);
- swap.dequeueDuration = us2ns(durationUs);
+ nsecs_t dequeueStart = mNativeSurface->getLastDequeueStartTime();
+ if (dequeueStart < mCurrentFrameInfo->get(FrameInfoIndex::Vsync)) {
+ // Ignoring dequeue duration as it happened prior to vsync
+ // and thus is not part of the frame.
+ swap.dequeueDuration = 0;
+ } else {
+ mNativeSurface->query(NATIVE_WINDOW_LAST_DEQUEUE_DURATION, &durationUs);
+ swap.dequeueDuration = us2ns(durationUs);
+ }
mNativeSurface->query(NATIVE_WINDOW_LAST_QUEUE_DURATION, &durationUs);
swap.queueDuration = us2ns(durationUs);
} else {
diff --git a/libs/hwui/renderthread/RenderProxy.cpp b/libs/hwui/renderthread/RenderProxy.cpp
index a1f1717..eed5238 100644
--- a/libs/hwui/renderthread/RenderProxy.cpp
+++ b/libs/hwui/renderthread/RenderProxy.cpp
@@ -24,6 +24,7 @@
#include "renderthread/EglManager.h"
#include "renderthread/RenderTask.h"
#include "renderthread/RenderThread.h"
+#include "renderstate/RenderState.h"
#include "utils/Macros.h"
#include "utils/TimeUtils.h"
@@ -693,6 +694,20 @@
}
}
+CREATE_BRIDGE2(onBitmapDestroyed, RenderThread* thread, uint32_t pixelRefId) {
+ args->thread->renderState().onBitmapDestroyed(args->pixelRefId);
+ return nullptr;
+}
+
+void RenderProxy::onBitmapDestroyed(uint32_t pixelRefId) {
+ if (!RenderThread::hasInstance()) return;
+ SETUP_TASK(onBitmapDestroyed);
+ RenderThread& thread = RenderThread::getInstance();
+ args->thread = &thread;
+ args->pixelRefId = pixelRefId;
+ thread.queue(task);
+}
+
void RenderProxy::post(RenderTask* task) {
mRenderThread.queue(task);
}
diff --git a/libs/hwui/renderthread/RenderProxy.h b/libs/hwui/renderthread/RenderProxy.h
index a60ed55..b21772c 100644
--- a/libs/hwui/renderthread/RenderProxy.h
+++ b/libs/hwui/renderthread/RenderProxy.h
@@ -135,6 +135,8 @@
static sk_sp<Bitmap> allocateHardwareBitmap(SkBitmap& bitmap);
static int copyGraphicBufferInto(GraphicBuffer* buffer, SkBitmap* bitmap);
+
+ static void onBitmapDestroyed(uint32_t pixelRefId);
private:
RenderThread& mRenderThread;
CanvasContext* mContext;
diff --git a/media/java/android/media/AudioPlaybackConfiguration.java b/media/java/android/media/AudioPlaybackConfiguration.java
index 6b8a279..14bc555 100644
--- a/media/java/android/media/AudioPlaybackConfiguration.java
+++ b/media/java/android/media/AudioPlaybackConfiguration.java
@@ -36,14 +36,14 @@
* session.
*/
public final class AudioPlaybackConfiguration implements Parcelable {
- private final static String TAG = new String("AudioPlaybackConfiguration");
+ private static final String TAG = new String("AudioPlaybackConfiguration");
- private final static boolean DEBUG = false;
+ private static final boolean DEBUG = false;
/** @hide */
- public final static int PLAYER_PIID_INVALID = -1;
+ public static final int PLAYER_PIID_INVALID = -1;
/** @hide */
- public final static int PLAYER_UPID_INVALID = -1;
+ public static final int PLAYER_UPID_INVALID = -1;
// information about the implementation
/**
@@ -51,37 +51,62 @@
* An unknown type of player
*/
@SystemApi
- public final static int PLAYER_TYPE_UNKNOWN = -1;
+ public static final int PLAYER_TYPE_UNKNOWN = -1;
/**
* @hide
* Player backed by a java android.media.AudioTrack player
*/
@SystemApi
- public final static int PLAYER_TYPE_JAM_AUDIOTRACK = 1;
+ public static final int PLAYER_TYPE_JAM_AUDIOTRACK = 1;
/**
* @hide
* Player backed by a java android.media.MediaPlayer player
*/
@SystemApi
- public final static int PLAYER_TYPE_JAM_MEDIAPLAYER = 2;
+ public static final int PLAYER_TYPE_JAM_MEDIAPLAYER = 2;
/**
* @hide
* Player backed by a java android.media.SoundPool player
*/
@SystemApi
- public final static int PLAYER_TYPE_JAM_SOUNDPOOL = 3;
+ public static final int PLAYER_TYPE_JAM_SOUNDPOOL = 3;
/**
* @hide
* Player backed by a C OpenSL ES AudioPlayer player with a BufferQueue source
*/
@SystemApi
- public final static int PLAYER_TYPE_SLES_AUDIOPLAYER_BUFFERQUEUE = 11;
+ public static final int PLAYER_TYPE_SLES_AUDIOPLAYER_BUFFERQUEUE = 11;
/**
* @hide
* Player backed by a C OpenSL ES AudioPlayer player with a URI or FD source
*/
@SystemApi
- public final static int PLAYER_TYPE_SLES_AUDIOPLAYER_URI_FD = 12;
+ public static final int PLAYER_TYPE_SLES_AUDIOPLAYER_URI_FD = 12;
+
+ /**
+ * @hide
+ * Player backed an AAudio player.
+ * Note this type is not in System API so it will not be returned in public API calls
+ */
+ // TODO unhide for SystemApi, update getPlayerType()
+ public static final int PLAYER_TYPE_AAUDIO = 13;
+
+ /**
+ * @hide
+ * Player backed a hardware source, whose state is visible in the Android audio policy manager.
+ * Note this type is not in System API so it will not be returned in public API calls
+ */
+ // TODO unhide for SystemApi, update getPlayerType()
+ public static final int PLAYER_TYPE_HW_SOURCE = 14;
+
+ /**
+ * @hide
+ * Player is a proxy for an audio player whose audio and state doesn't go through the Android
+ * audio framework.
+ * Note this type is not in System API so it will not be returned in public API calls
+ */
+ // TODO unhide for SystemApi, update getPlayerType()
+ public static final int PLAYER_TYPE_EXTERNAL_PROXY = 15;
/** @hide */
@IntDef({
@@ -251,11 +276,20 @@
* {@link #PLAYER_TYPE_JAM_AUDIOTRACK}, {@link #PLAYER_TYPE_JAM_MEDIAPLAYER},
* {@link #PLAYER_TYPE_JAM_SOUNDPOOL}, {@link #PLAYER_TYPE_SLES_AUDIOPLAYER_BUFFERQUEUE},
* {@link #PLAYER_TYPE_SLES_AUDIOPLAYER_URI_FD}, or {@link #PLAYER_TYPE_UNKNOWN}.
+ * <br>Note that player types not exposed in the system API will be represented as
+ * {@link #PLAYER_TYPE_UNKNOWN}.
* @return the type of the player.
*/
@SystemApi
public @PlayerType int getPlayerType() {
- return mPlayerType;
+ switch (mPlayerType) {
+ case PLAYER_TYPE_AAUDIO:
+ case PLAYER_TYPE_HW_SOURCE:
+ case PLAYER_TYPE_EXTERNAL_PROXY:
+ return PLAYER_TYPE_UNKNOWN;
+ default:
+ return mPlayerType;
+ }
}
/**
@@ -442,7 +476,7 @@
//=====================================================================
// Inner class for corresponding IPlayer and its death monitoring
- final static class IPlayerShell implements IBinder.DeathRecipient {
+ static final class IPlayerShell implements IBinder.DeathRecipient {
final AudioPlaybackConfiguration mMonitor; // never null
private IPlayer mIPlayer;
@@ -494,6 +528,9 @@
return "OpenSL ES AudioPlayer (Buffer Queue)";
case PLAYER_TYPE_SLES_AUDIOPLAYER_URI_FD:
return "OpenSL ES AudioPlayer (URI/FD)";
+ case PLAYER_TYPE_AAUDIO: return "AAudio";
+ case PLAYER_TYPE_HW_SOURCE: return "hardware source";
+ case PLAYER_TYPE_EXTERNAL_PROXY: return "external proxy";
default:
return "unknown player type - FIXME";
}
diff --git a/media/java/android/media/MediaCodec.java b/media/java/android/media/MediaCodec.java
index 6cab56c..2de69e7 100644
--- a/media/java/android/media/MediaCodec.java
+++ b/media/java/android/media/MediaCodec.java
@@ -75,12 +75,12 @@
<h4>Compressed Buffers</h4>
<p>
Input buffers (for decoders) and output buffers (for encoders) contain compressed data according
- to the {@linkplain MediaFormat#KEY_MIME format's type}. For video types this is a single
+ to the {@linkplain MediaFormat#KEY_MIME format's type}. For video types this is normally a single
compressed video frame. For audio data this is normally a single access unit (an encoded audio
segment typically containing a few milliseconds of audio as dictated by the format type), but
this requirement is slightly relaxed in that a buffer may contain multiple encoded access units
of audio. In either case, buffers do not start or end on arbitrary byte boundaries, but rather on
- frame/access unit boundaries.
+ frame/access unit boundaries unless they are flagged with {@link #BUFFER_FLAG_PARTIAL_FRAME}.
<h4>Raw Audio Buffers</h4>
<p>
diff --git a/media/java/android/media/MediaSync.java b/media/java/android/media/MediaSync.java
index 5522d36..799f4bf 100644
--- a/media/java/android/media/MediaSync.java
+++ b/media/java/android/media/MediaSync.java
@@ -35,7 +35,7 @@
import java.util.List;
/**
- * MediaSync class can be used to synchronously playback audio and video streams.
+ * MediaSync class can be used to synchronously play audio and video streams.
* It can be used to play audio-only or video-only stream, too.
*
* <p>MediaSync is generally used like this:
diff --git a/native/android/Android.bp b/native/android/Android.bp
index eacda93..14f6ed3 100644
--- a/native/android/Android.bp
+++ b/native/android/Android.bp
@@ -19,3 +19,31 @@
first_version: "9",
unversioned_until: "current",
}
+
+cc_defaults {
+ name: "libandroid_defaults",
+ cflags: [
+ "-Wall",
+ "-Werror",
+ "-Wunused",
+ "-Wunreachable-code",
+ ],
+}
+
+// Network library.
+cc_library_shared {
+ name: "libandroid_net",
+ defaults: ["libandroid_defaults"],
+ srcs: ["net.c"],
+
+ shared_libs: ["libnetd_client"],
+
+ include_dirs: ["bionic/libc/dns/include"],
+}
+
+llndk_library {
+ name: "libandroid_net",
+ export_include_dirs: ["include"],
+ symbol_file: "libandroid_net.map.txt",
+ unversioned: true,
+}
diff --git a/native/android/Android.mk b/native/android/Android.mk
index 6e15331..97dbf0f 100644
--- a/native/android/Android.mk
+++ b/native/android/Android.mk
@@ -58,20 +58,3 @@
LOCAL_CFLAGS += $(common_cflags)
include $(BUILD_SHARED_LIBRARY)
-
-# Network library.
-include $(CLEAR_VARS)
-LOCAL_MODULE := libandroid_net
-LOCAL_CFLAGS := $(common_cflags)
-LOCAL_SRC_FILES:= \
- net.c \
-
-LOCAL_SHARED_LIBRARIES := \
- libnetd_client \
-
-LOCAL_C_INCLUDES += \
- frameworks/base/native/include \
- bionic/libc/dns/include \
- system/netd/include \
-
-include $(BUILD_SHARED_LIBRARY)
diff --git a/native/android/include/multinetwork.h b/native/android/include/multinetwork.h
new file mode 120000
index 0000000..f9d051a
--- /dev/null
+++ b/native/android/include/multinetwork.h
@@ -0,0 +1 @@
+../../../../native/include/android/multinetwork.h
\ No newline at end of file
diff --git a/native/android/libandroid_net.map.txt b/native/android/libandroid_net.map.txt
new file mode 100644
index 0000000..9b5a5a1
--- /dev/null
+++ b/native/android/libandroid_net.map.txt
@@ -0,0 +1,10 @@
+# These functions have been part of the NDK since API 24.
+# They are also all available to vendor code.
+LIBANDROID_NET {
+ global:
+ android_setsocknetwork; # vndk
+ android_setprocnetwork; # vndk
+ android_getaddrinfofornetwork; # vndk
+ local:
+ *;
+};
diff --git a/packages/CaptivePortalLogin/res/layout/activity_captive_portal_login.xml b/packages/CaptivePortalLogin/res/layout/activity_captive_portal_login.xml
index 2f0a411..2324593 100644
--- a/packages/CaptivePortalLogin/res/layout/activity_captive_portal_login.xml
+++ b/packages/CaptivePortalLogin/res/layout/activity_captive_portal_login.xml
@@ -4,31 +4,35 @@
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.android.captiveportallogin.CaptivePortalLoginActivity"
- tools:ignore="MergeRootFrame">
+ tools:ignore="MergeRootFrame" >
+
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
- <TextView
- android:id="@+id/url_bar"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:textSize="20sp"
- android:singleLine="true" />
+ <FrameLayout
+ android:layout_width="match_parent"
+ android:layout_height="4dp" >
- <ProgressBar
- android:id="@+id/progress_bar"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- style="?android:attr/progressBarStyleHorizontal" />
+ <!-- Eliminates ProgressBar padding by boxing it into a 4dp high container -->
+ <ProgressBar
+ android:id="@+id/progress_bar"
+ style="@android:style/Widget.Material.Light.ProgressBar.Horizontal"
+ android:indeterminate="false"
+ android:max="100"
+ android:progress="0"
+ android:layout_gravity="center"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content" />
+ </FrameLayout>
- <WebView
- android:id="@+id/webview"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:layout_alignParentBottom="false"
- android:layout_alignParentRight="false" />
+ <WebView
+ android:id="@+id/webview"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:layout_alignParentBottom="false"
+ android:layout_alignParentRight="false" />
-</LinearLayout>
+ </LinearLayout>
</FrameLayout>
diff --git a/packages/CaptivePortalLogin/res/values/styles.xml b/packages/CaptivePortalLogin/res/values/styles.xml
index 4a99638..f6c2339 100644
--- a/packages/CaptivePortalLogin/res/values/styles.xml
+++ b/packages/CaptivePortalLogin/res/values/styles.xml
@@ -4,7 +4,7 @@
Base application theme, dependent on API level. This theme is replaced
by AppBaseTheme from res/values-vXX/styles.xml on newer devices.
-->
- <style name="AppBaseTheme" parent="@android:style/Theme.Material.Settings">
+ <style name="AppBaseTheme" parent="@android:style/Theme.DeviceDefault.Settings">
<!--
Theme customizations available in newer API levels can go in
res/values-vXX/styles.xml, while customizations related to
@@ -15,8 +15,5 @@
<!-- Application theme. -->
<style name="AppTheme" parent="AppBaseTheme">
<!-- All customizations that are NOT specific to a particular API-level can go here. -->
- <!-- Setting's theme's accent color makes ProgressBar useless, reset back. -->
- <item name="android:colorAccent">@*android:color/material_deep_teal_500</item>
</style>
-
</resources>
diff --git a/packages/CaptivePortalLogin/src/com/android/captiveportallogin/CaptivePortalLoginActivity.java b/packages/CaptivePortalLogin/src/com/android/captiveportallogin/CaptivePortalLoginActivity.java
index c9fba95..401a7bc 100644
--- a/packages/CaptivePortalLogin/src/com/android/captiveportallogin/CaptivePortalLoginActivity.java
+++ b/packages/CaptivePortalLogin/src/com/android/captiveportallogin/CaptivePortalLoginActivity.java
@@ -37,6 +37,7 @@
import android.util.TypedValue;
import android.view.Menu;
import android.view.MenuItem;
+import android.view.View;
import android.webkit.SslErrorHandler;
import android.webkit.WebChromeClient;
import android.webkit.WebSettings;
@@ -97,8 +98,6 @@
// setContentView initializes the WebView logic which in turn reads the system properties.
setContentView(R.layout.activity_captive_portal_login);
- getActionBar().setDisplayShowHomeEnabled(false);
-
// Exit app if Network disappears.
final NetworkCapabilities networkCapabilities = mCm.getNetworkCapabilities(mNetwork);
if (networkCapabilities == null) {
@@ -117,9 +116,14 @@
}
mCm.registerNetworkCallback(builder.build(), mNetworkCallback);
- final WebView myWebView = findViewById(R.id.webview);
- myWebView.clearCache(true);
- WebSettings webSettings = myWebView.getSettings();
+ getActionBar().setDisplayShowHomeEnabled(false);
+ getActionBar().setElevation(0); // remove shadow
+ getActionBar().setTitle(getHeaderTitle());
+ getActionBar().setSubtitle("");
+
+ final WebView webview = getWebview();
+ webview.clearCache(true);
+ WebSettings webSettings = webview.getSettings();
webSettings.setJavaScriptEnabled(true);
webSettings.setMixedContentMode(WebSettings.MIXED_CONTENT_COMPATIBILITY_MODE);
webSettings.setUseWideViewPort(true);
@@ -128,11 +132,11 @@
webSettings.setBuiltInZoomControls(true);
webSettings.setDisplayZoomControls(false);
mWebViewClient = new MyWebViewClient();
- myWebView.setWebViewClient(mWebViewClient);
- myWebView.setWebChromeClient(new MyWebChromeClient());
+ webview.setWebViewClient(mWebViewClient);
+ webview.setWebChromeClient(new MyWebChromeClient());
// Start initial page load so WebView finishes loading proxy settings.
// Actual load of mUrl is initiated by MyWebViewClient.
- myWebView.loadData("", "text/html", null);
+ webview.loadData("", "text/html", null);
}
// Find WebView's proxy BroadcastReceiver and prompt it to read proxy system properties.
@@ -251,10 +255,14 @@
if (url == null) {
url = mCm.getCaptivePortalServerUrl();
}
+ return makeURL(url);
+ }
+
+ private static URL makeURL(String url) {
try {
return new URL(url);
} catch (MalformedURLException e) {
- Log.e(TAG, "Invalid captive portal URL " + url);
+ Log.e(TAG, "Invalid URL " + url);
}
return null;
}
@@ -331,15 +339,16 @@
// For internally generated pages, leave URL bar listing prior URL as this is the URL
// the page refers to.
if (!url.startsWith(INTERNAL_ASSETS)) {
- final TextView myUrlBar = findViewById(R.id.url_bar);
- myUrlBar.setText(url);
+ getActionBar().setSubtitle(getHeaderSubtitle(url));
}
+ getProgressBar().setVisibility(View.VISIBLE);
testForCaptivePortal();
}
@Override
public void onPageFinished(WebView view, String url) {
mPagesLoaded++;
+ getProgressBar().setVisibility(View.INVISIBLE);
if (mPagesLoaded == 1) {
// Now that WebView has loaded at least one page we know it has read in the proxy
// settings. Now prompt the WebView read the Network-specific proxy settings.
@@ -412,8 +421,31 @@
private class MyWebChromeClient extends WebChromeClient {
@Override
public void onProgressChanged(WebView view, int newProgress) {
- final ProgressBar myProgressBar = findViewById(R.id.progress_bar);
- myProgressBar.setProgress(newProgress);
+ getProgressBar().setProgress(newProgress);
}
}
+
+ private ProgressBar getProgressBar() {
+ return findViewById(R.id.progress_bar);
+ }
+
+ private WebView getWebview() {
+ return findViewById(R.id.webview);
+ }
+
+ private String getHeaderTitle() {
+ return getString(R.string.action_bar_label);
+ }
+
+ private String getHeaderSubtitle(String urlString) {
+ URL url = makeURL(urlString);
+ if (url == null) {
+ return urlString;
+ }
+ final String https = "https";
+ if (https.equals(url.getProtocol())) {
+ return https + "://" + url.getHost();
+ }
+ return url.getHost();
+ }
}
diff --git a/packages/CompanionDeviceManager/src/com/android/companiondevicemanager/DeviceChooserActivity.java b/packages/CompanionDeviceManager/src/com/android/companiondevicemanager/DeviceChooserActivity.java
index b145290..0cf21d2 100644
--- a/packages/CompanionDeviceManager/src/com/android/companiondevicemanager/DeviceChooserActivity.java
+++ b/packages/CompanionDeviceManager/src/com/android/companiondevicemanager/DeviceChooserActivity.java
@@ -93,9 +93,9 @@
}
@Override
- protected void onPause() {
- super.onPause();
- if (!isFinishing()) {
+ protected void onStop() {
+ super.onStop();
+ if (!isFinishing() && !isChangingConfigurations()) {
cancel();
}
}
diff --git a/packages/SettingsLib/res/color/batterymeter_frame_color.xml b/packages/SettingsLib/res/color/meter_background_color.xml
similarity index 100%
rename from packages/SettingsLib/res/color/batterymeter_frame_color.xml
rename to packages/SettingsLib/res/color/meter_background_color.xml
diff --git a/packages/SettingsLib/res/color/batterymeter_charge_color.xml b/packages/SettingsLib/res/color/meter_consumed_color.xml
similarity index 100%
rename from packages/SettingsLib/res/color/batterymeter_charge_color.xml
rename to packages/SettingsLib/res/color/meter_consumed_color.xml
diff --git a/packages/SettingsLib/res/layout/restricted_switch_preference.xml b/packages/SettingsLib/res/layout/restricted_switch_preference.xml
index 0e4ef6b..64b47b6 100644
--- a/packages/SettingsLib/res/layout/restricted_switch_preference.xml
+++ b/packages/SettingsLib/res/layout/restricted_switch_preference.xml
@@ -27,7 +27,7 @@
android:id="@+id/icon_container"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
- android:minWidth="60dp"
+ android:minWidth="56dp"
android:gravity="start|center_vertical"
android:orientation="horizontal"
android:paddingEnd="12dp"
diff --git a/packages/SettingsLib/res/layout/usage_view.xml b/packages/SettingsLib/res/layout/usage_view.xml
index 151d1ee..da66814 100644
--- a/packages/SettingsLib/res/layout/usage_view.xml
+++ b/packages/SettingsLib/res/layout/usage_view.xml
@@ -76,7 +76,7 @@
android:id="@+id/bottom_label_space"
android:layout_width="@dimen/usage_graph_labels_width"
android:layout_height="wrap_content"/>
- <LinearLayout
+ <com.android.settingslib.graph.BottomLabelLayout
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
@@ -86,13 +86,14 @@
layout="@layout/usage_side_label" />
<Space
- android:layout_width="0dp"
+ android:id="@+id/spacer"
+ android:layout_width="40dp"
android:layout_height="wrap_content"
android:layout_weight="1" />
<include android:id="@+id/label_end"
layout="@layout/usage_side_label" />
- </LinearLayout>
+ </com.android.settingslib.graph.BottomLabelLayout>
</LinearLayout>
</LinearLayout>
diff --git a/packages/SettingsLib/res/values-af/strings.xml b/packages/SettingsLib/res/values-af/strings.xml
index e89b21a..4f52812 100644
--- a/packages/SettingsLib/res/values-af/strings.xml
+++ b/packages/SettingsLib/res/values-af/strings.xml
@@ -272,6 +272,10 @@
<string name="app_process_limit_title" msgid="4280600650253107163">"Agtergrondproses-limiet"</string>
<string name="show_all_anrs" msgid="28462979638729082">"Wys alle ANRe"</string>
<string name="show_all_anrs_summary" msgid="641908614413544127">"Wys Program reageer nie-dialoog vir agtergrond programme"</string>
+ <!-- no translation found for show_notification_channel_warnings (1399948193466922683) -->
+ <skip />
+ <!-- no translation found for show_notification_channel_warnings_summary (5536803251863694895) -->
+ <skip />
<string name="force_allow_on_external" msgid="3215759785081916381">"Programme verplig ekstern toegelaat"</string>
<string name="force_allow_on_external_summary" msgid="3640752408258034689">"Maak dat enige program in eksterne berging geskryf kan word, ongeag manifeswaardes"</string>
<string name="force_resizable_activities" msgid="8615764378147824985">"Verplig verstelbare groottes vir aktiwiteite"</string>
diff --git a/packages/SettingsLib/res/values-am/strings.xml b/packages/SettingsLib/res/values-am/strings.xml
index d8150d1..465e253 100644
--- a/packages/SettingsLib/res/values-am/strings.xml
+++ b/packages/SettingsLib/res/values-am/strings.xml
@@ -272,6 +272,10 @@
<string name="app_process_limit_title" msgid="4280600650253107163">"የዳራ አሂድ ወሰን"</string>
<string name="show_all_anrs" msgid="28462979638729082">"ሁሉንም ANRs አሳይ"</string>
<string name="show_all_anrs_summary" msgid="641908614413544127">"ለዳራ መተግበሪያዎች ምላሽ የማይሰጥ መገናኛ ትግበራ አሳይ"</string>
+ <!-- no translation found for show_notification_channel_warnings (1399948193466922683) -->
+ <skip />
+ <!-- no translation found for show_notification_channel_warnings_summary (5536803251863694895) -->
+ <skip />
<string name="force_allow_on_external" msgid="3215759785081916381">"በውጫዊ ላይ ሃይል ይፈቀዳል"</string>
<string name="force_allow_on_external_summary" msgid="3640752408258034689">"የዝርዝር ሰነዶች እሴቶች ግምት ውስጥ ሳያስገባ ማንኛውም መተግበሪያ ወደ ውጫዊ ማከማቻው ለመጻፍ ብቁ ያደርጋል"</string>
<string name="force_resizable_activities" msgid="8615764378147824985">"እንቅስቃሴዎች ዳግመኛ እንዲመጣጠኑ አስገድድ"</string>
diff --git a/packages/SettingsLib/res/values-ar/strings.xml b/packages/SettingsLib/res/values-ar/strings.xml
index 034653f..a4ee8fd 100644
--- a/packages/SettingsLib/res/values-ar/strings.xml
+++ b/packages/SettingsLib/res/values-ar/strings.xml
@@ -272,6 +272,10 @@
<string name="app_process_limit_title" msgid="4280600650253107163">"حد العمليات بالخلفية"</string>
<string name="show_all_anrs" msgid="28462979638729082">"عرض جميع رسائل ANR"</string>
<string name="show_all_anrs_summary" msgid="641908614413544127">"عرض مربع الحوار \"التطبيق لا يستجيب\" مع تطبيقات الخلفية"</string>
+ <!-- no translation found for show_notification_channel_warnings (1399948193466922683) -->
+ <skip />
+ <!-- no translation found for show_notification_channel_warnings_summary (5536803251863694895) -->
+ <skip />
<string name="force_allow_on_external" msgid="3215759785081916381">"فرض السماح للتطبيقات على الخارجي"</string>
<string name="force_allow_on_external_summary" msgid="3640752408258034689">"تأهيل أي تطبيق بحيث تتم كتابته على وحدة تخزين خارجية، بغض النظر عن قيم البيان"</string>
<string name="force_resizable_activities" msgid="8615764378147824985">"فرض إمكانية تغيير على الأنشطة"</string>
diff --git a/packages/SettingsLib/res/values-az/strings.xml b/packages/SettingsLib/res/values-az/strings.xml
index 603f6918..690e589 100644
--- a/packages/SettingsLib/res/values-az/strings.xml
+++ b/packages/SettingsLib/res/values-az/strings.xml
@@ -272,6 +272,10 @@
<string name="app_process_limit_title" msgid="4280600650253107163">"Fon prosesi limiti"</string>
<string name="show_all_anrs" msgid="28462979638729082">"Bütün ANRları göstər"</string>
<string name="show_all_anrs_summary" msgid="641908614413544127">"Arxa tətbiqlər dialoquna cavab verməyən tətbiqi göstər"</string>
+ <!-- no translation found for show_notification_channel_warnings (1399948193466922683) -->
+ <skip />
+ <!-- no translation found for show_notification_channel_warnings_summary (5536803251863694895) -->
+ <skip />
<string name="force_allow_on_external" msgid="3215759785081916381">"Tətbiqlərə xaricdən məcburi icazə"</string>
<string name="force_allow_on_external_summary" msgid="3640752408258034689">"Seçilmiş hər hansı tətbiqi bəyannamə dəyərlərindən aslı olmayaraq xarici yaddaşa yazılabilən edir."</string>
<string name="force_resizable_activities" msgid="8615764378147824985">"Ölçü dəyişdirmək üçün məcburi fəaliyyətlər"</string>
diff --git a/packages/SettingsLib/res/values-b+sr+Latn/strings.xml b/packages/SettingsLib/res/values-b+sr+Latn/strings.xml
index 70c6e47..e59dac6 100644
--- a/packages/SettingsLib/res/values-b+sr+Latn/strings.xml
+++ b/packages/SettingsLib/res/values-b+sr+Latn/strings.xml
@@ -272,6 +272,10 @@
<string name="app_process_limit_title" msgid="4280600650253107163">"Ograničenje pozadinskih procesa"</string>
<string name="show_all_anrs" msgid="28462979638729082">"Prikaži sve ANR-ove"</string>
<string name="show_all_anrs_summary" msgid="641908614413544127">"Prikaži dijalog Aplikacija ne reaguje za aplikacije u pozadini"</string>
+ <!-- no translation found for show_notification_channel_warnings (1399948193466922683) -->
+ <skip />
+ <!-- no translation found for show_notification_channel_warnings_summary (5536803251863694895) -->
+ <skip />
<string name="force_allow_on_external" msgid="3215759785081916381">"Prinudno dozvoli aplikacije u spoljnoj"</string>
<string name="force_allow_on_external_summary" msgid="3640752408258034689">"Omogućava upisivanje svih aplikacija u spoljnu memoriju, bez obzira na vrednosti manifesta"</string>
<string name="force_resizable_activities" msgid="8615764378147824985">"Prinudno omogući promenu veličine aktivnosti"</string>
diff --git a/packages/SettingsLib/res/values-be/strings.xml b/packages/SettingsLib/res/values-be/strings.xml
index f8eec7f..b1ec8678 100644
--- a/packages/SettingsLib/res/values-be/strings.xml
+++ b/packages/SettingsLib/res/values-be/strings.xml
@@ -272,6 +272,10 @@
<string name="app_process_limit_title" msgid="4280600650253107163">"Ліміт фонавага працэсу"</string>
<string name="show_all_anrs" msgid="28462979638729082">"Паказаць усе ANRS"</string>
<string name="show_all_anrs_summary" msgid="641908614413544127">"Паказаць дыялогавае акно \"Праграма не адказвае\" для фонавых прыкладанняў"</string>
+ <!-- no translation found for show_notification_channel_warnings (1399948193466922683) -->
+ <skip />
+ <!-- no translation found for show_notification_channel_warnings_summary (5536803251863694895) -->
+ <skip />
<string name="force_allow_on_external" msgid="3215759785081916381">"Прымусова дазволіць праграмы на вонкавым сховішчы"</string>
<string name="force_allow_on_external_summary" msgid="3640752408258034689">"Робіць любую праграму даступнай для запісу на вонкавае сховішча, незалежна ад значэнняў маніфеста"</string>
<string name="force_resizable_activities" msgid="8615764378147824985">"Зрабіць вокны дзеянняў даступнымі для змены памеру"</string>
diff --git a/packages/SettingsLib/res/values-bg/strings.xml b/packages/SettingsLib/res/values-bg/strings.xml
index 53c50b9..a8039eb 100644
--- a/packages/SettingsLib/res/values-bg/strings.xml
+++ b/packages/SettingsLib/res/values-bg/strings.xml
@@ -272,6 +272,10 @@
<string name="app_process_limit_title" msgid="4280600650253107163">"Лимит за фонови процеси"</string>
<string name="show_all_anrs" msgid="28462979638729082">"Всички нереагиращи прил."</string>
<string name="show_all_anrs_summary" msgid="641908614413544127">"Диалог. прозорец „НП“ за приложения на заден план"</string>
+ <!-- no translation found for show_notification_channel_warnings (1399948193466922683) -->
+ <skip />
+ <!-- no translation found for show_notification_channel_warnings_summary (5536803251863694895) -->
+ <skip />
<string name="force_allow_on_external" msgid="3215759785081916381">"Външно хран.: Принуд. разрешаване на приложенията"</string>
<string name="force_allow_on_external_summary" msgid="3640752408258034689">"Прави всички приложения да отговарят на условията да бъдат записвани във външното хранилище независимо от стойностите в манифеста"</string>
<string name="force_resizable_activities" msgid="8615764378147824985">"Възможност за преоразмеряване на активностите"</string>
diff --git a/packages/SettingsLib/res/values-bn/strings.xml b/packages/SettingsLib/res/values-bn/strings.xml
index 841c96e..3f0de25 100644
--- a/packages/SettingsLib/res/values-bn/strings.xml
+++ b/packages/SettingsLib/res/values-bn/strings.xml
@@ -272,6 +272,10 @@
<string name="app_process_limit_title" msgid="4280600650253107163">"পশ্চাদপট প্রক্রিয়ার সীমা"</string>
<string name="show_all_anrs" msgid="28462979638729082">"সব ANR দেখান"</string>
<string name="show_all_anrs_summary" msgid="641908614413544127">"পশ্চাদপটের অ্যাপ্লিকেশানগুলির জন্য অ্যাপ্লিকেশান কোনো প্রতিক্রিয়া দিচ্ছে না এমন কথোপকথন দেখান"</string>
+ <!-- no translation found for show_notification_channel_warnings (1399948193466922683) -->
+ <skip />
+ <!-- no translation found for show_notification_channel_warnings_summary (5536803251863694895) -->
+ <skip />
<string name="force_allow_on_external" msgid="3215759785081916381">"বহিরাগততে বলপূর্বক মঞ্জুরি"</string>
<string name="force_allow_on_external_summary" msgid="3640752408258034689">"ম্যানিফেস্ট মানগুলি নির্বিশেষে যেকোনো অ্যাপ্লিকেশানকে বাহ্যিক সঞ্চয়স্থানে লেখার উপযুক্ত বানায়"</string>
<string name="force_resizable_activities" msgid="8615764378147824985">"আকার পরিবর্তনযোগ্য করার জন্য ক্রিয়াকলাপগুলিকে জোর করুন"</string>
diff --git a/packages/SettingsLib/res/values-bs/strings.xml b/packages/SettingsLib/res/values-bs/strings.xml
index 451a1ff..f91a8a8 100644
--- a/packages/SettingsLib/res/values-bs/strings.xml
+++ b/packages/SettingsLib/res/values-bs/strings.xml
@@ -272,6 +272,10 @@
<string name="app_process_limit_title" msgid="4280600650253107163">"Ograničenje procesa u pozadini"</string>
<string name="show_all_anrs" msgid="28462979638729082">"Prikaži sve ANR-ove"</string>
<string name="show_all_anrs_summary" msgid="641908614413544127">"Prik. dijalog Aplikacija ne reagira za apl. u poz."</string>
+ <!-- no translation found for show_notification_channel_warnings (1399948193466922683) -->
+ <skip />
+ <!-- no translation found for show_notification_channel_warnings_summary (5536803251863694895) -->
+ <skip />
<string name="force_allow_on_external" msgid="3215759785081916381">"Nametni aplikacije na vanjskoj pohrani"</string>
<string name="force_allow_on_external_summary" msgid="3640752408258034689">"Omogućava da svaka aplikacija bude pogodna za upisivanje na vanjsku pohranu, bez obzira na prikazane vrijednosti"</string>
<string name="force_resizable_activities" msgid="8615764378147824985">"Nametni aktivnostima mijenjanje veličina"</string>
diff --git a/packages/SettingsLib/res/values-ca/strings.xml b/packages/SettingsLib/res/values-ca/strings.xml
index 2a4db1d..99c5d37 100644
--- a/packages/SettingsLib/res/values-ca/strings.xml
+++ b/packages/SettingsLib/res/values-ca/strings.xml
@@ -272,6 +272,10 @@
<string name="app_process_limit_title" msgid="4280600650253107163">"Límita processos en segon pla"</string>
<string name="show_all_anrs" msgid="28462979638729082">"Tots els errors sense resposta"</string>
<string name="show_all_anrs_summary" msgid="641908614413544127">"Informa que una aplicació en segon pla no respon"</string>
+ <!-- no translation found for show_notification_channel_warnings (1399948193466922683) -->
+ <skip />
+ <!-- no translation found for show_notification_channel_warnings_summary (5536803251863694895) -->
+ <skip />
<string name="force_allow_on_external" msgid="3215759785081916381">"Força permís d\'aplicacions a l\'emmagatzem. extern"</string>
<string name="force_allow_on_external_summary" msgid="3640752408258034689">"Permet que qualsevol aplicació es pugui escriure en un dispositiu d’emmagatzematge extern, independentment dels valors definits"</string>
<string name="force_resizable_activities" msgid="8615764378147824985">"Força l\'ajust de la mida de les activitats"</string>
diff --git a/packages/SettingsLib/res/values-cs/strings.xml b/packages/SettingsLib/res/values-cs/strings.xml
index 673d51b..7b3fb86 100644
--- a/packages/SettingsLib/res/values-cs/strings.xml
+++ b/packages/SettingsLib/res/values-cs/strings.xml
@@ -272,6 +272,10 @@
<string name="app_process_limit_title" msgid="4280600650253107163">"Omezení procesů na pozadí"</string>
<string name="show_all_anrs" msgid="28462979638729082">"Zobrazit všechny ANR"</string>
<string name="show_all_anrs_summary" msgid="641908614413544127">"Zobrazovat dialog „Aplikace neodpovídá“ pro aplikace na pozadí"</string>
+ <!-- no translation found for show_notification_channel_warnings (1399948193466922683) -->
+ <skip />
+ <!-- no translation found for show_notification_channel_warnings_summary (5536803251863694895) -->
+ <skip />
<string name="force_allow_on_external" msgid="3215759785081916381">"Vynutit povolení aplikací na externím úložišti"</string>
<string name="force_allow_on_external_summary" msgid="3640752408258034689">"Každou aplikaci bude možné zapsat do externího úložiště, bez ohledu na hodnoty manifestu"</string>
<string name="force_resizable_activities" msgid="8615764378147824985">"Vynutit možnost změny velikosti aktivit"</string>
diff --git a/packages/SettingsLib/res/values-da/strings.xml b/packages/SettingsLib/res/values-da/strings.xml
index aa0becf..6ccf45b 100644
--- a/packages/SettingsLib/res/values-da/strings.xml
+++ b/packages/SettingsLib/res/values-da/strings.xml
@@ -272,6 +272,10 @@
<string name="app_process_limit_title" msgid="4280600650253107163">"Grænse for baggrundsprocesser"</string>
<string name="show_all_anrs" msgid="28462979638729082">"Vis alle \"Appen svarer ikke\""</string>
<string name="show_all_anrs_summary" msgid="641908614413544127">"Vis \"Appen svarer ikke\" for baggrundsapps"</string>
+ <!-- no translation found for show_notification_channel_warnings (1399948193466922683) -->
+ <skip />
+ <!-- no translation found for show_notification_channel_warnings_summary (5536803251863694895) -->
+ <skip />
<string name="force_allow_on_external" msgid="3215759785081916381">"Gennemtving tilladelse til eksternt lager"</string>
<string name="force_allow_on_external_summary" msgid="3640752408258034689">"Gør det muligt at overføre enhver app til et eksternt lager uafhængigt af manifestværdier"</string>
<string name="force_resizable_activities" msgid="8615764378147824985">"Tving aktiviteter til at kunne tilpasses"</string>
diff --git a/packages/SettingsLib/res/values-de/strings.xml b/packages/SettingsLib/res/values-de/strings.xml
index 0a2cf33..db58ab2 100644
--- a/packages/SettingsLib/res/values-de/strings.xml
+++ b/packages/SettingsLib/res/values-de/strings.xml
@@ -272,6 +272,10 @@
<string name="app_process_limit_title" msgid="4280600650253107163">"Hintergrundprozesslimit"</string>
<string name="show_all_anrs" msgid="28462979638729082">"Alle ANRS anzeigen"</string>
<string name="show_all_anrs_summary" msgid="641908614413544127">"Dialogfeld \"App antwortet nicht\" für Hintergrund-Apps anzeigen"</string>
+ <!-- no translation found for show_notification_channel_warnings (1399948193466922683) -->
+ <skip />
+ <!-- no translation found for show_notification_channel_warnings_summary (5536803251863694895) -->
+ <skip />
<string name="force_allow_on_external" msgid="3215759785081916381">"Externe Speichernutzung von Apps erlauben"</string>
<string name="force_allow_on_external_summary" msgid="3640752408258034689">"Ermöglicht es jeder qualifizierten App, Daten auf externen Speicher zu schreiben, unabhängig von den Manifestwerten"</string>
<string name="force_resizable_activities" msgid="8615764378147824985">"Anpassen der Größe von Aktivitäten erzwingen"</string>
diff --git a/packages/SettingsLib/res/values-el/strings.xml b/packages/SettingsLib/res/values-el/strings.xml
index 24d3bf4..cde2066 100644
--- a/packages/SettingsLib/res/values-el/strings.xml
+++ b/packages/SettingsLib/res/values-el/strings.xml
@@ -272,6 +272,10 @@
<string name="app_process_limit_title" msgid="4280600650253107163">"Όριο διεργασ. παρασκηνίου"</string>
<string name="show_all_anrs" msgid="28462979638729082">"Εμφάνιση όλων των ANR"</string>
<string name="show_all_anrs_summary" msgid="641908614413544127">"Εμφ.του παραθ. \"Η εφαρμ.δεν αποκρ.\" για εφ.παρασκ."</string>
+ <!-- no translation found for show_notification_channel_warnings (1399948193466922683) -->
+ <skip />
+ <!-- no translation found for show_notification_channel_warnings_summary (5536803251863694895) -->
+ <skip />
<string name="force_allow_on_external" msgid="3215759785081916381">"Να επιτρέπονται υποχρεωτικά εφαρμογές σε εξωτ.συσ."</string>
<string name="force_allow_on_external_summary" msgid="3640752408258034689">"Κάνει κάθε εφαρμογή κατάλληλη για εγγραφή σε εξωτερικό αποθηκευτικό χώρο, ανεξάρτητα από τις τιμές του μανιφέστου"</string>
<string name="force_resizable_activities" msgid="8615764378147824985">"Αναγκαστική δυνατότητα αλλαγής μεγέθους δραστηριοτήτων"</string>
diff --git a/packages/SettingsLib/res/values-en-rAU/strings.xml b/packages/SettingsLib/res/values-en-rAU/strings.xml
index 6b9daf7..b252545 100644
--- a/packages/SettingsLib/res/values-en-rAU/strings.xml
+++ b/packages/SettingsLib/res/values-en-rAU/strings.xml
@@ -272,6 +272,10 @@
<string name="app_process_limit_title" msgid="4280600650253107163">"Background process limit"</string>
<string name="show_all_anrs" msgid="28462979638729082">"Show all ANRs"</string>
<string name="show_all_anrs_summary" msgid="641908614413544127">"Show App Not Responding dialogue for background apps"</string>
+ <!-- no translation found for show_notification_channel_warnings (1399948193466922683) -->
+ <skip />
+ <!-- no translation found for show_notification_channel_warnings_summary (5536803251863694895) -->
+ <skip />
<string name="force_allow_on_external" msgid="3215759785081916381">"Force allow apps on external"</string>
<string name="force_allow_on_external_summary" msgid="3640752408258034689">"Makes any app eligible to be written to external storage, regardless of manifest values"</string>
<string name="force_resizable_activities" msgid="8615764378147824985">"Force activities to be re-sizable"</string>
diff --git a/packages/SettingsLib/res/values-en-rGB/strings.xml b/packages/SettingsLib/res/values-en-rGB/strings.xml
index 6b9daf7..b252545 100644
--- a/packages/SettingsLib/res/values-en-rGB/strings.xml
+++ b/packages/SettingsLib/res/values-en-rGB/strings.xml
@@ -272,6 +272,10 @@
<string name="app_process_limit_title" msgid="4280600650253107163">"Background process limit"</string>
<string name="show_all_anrs" msgid="28462979638729082">"Show all ANRs"</string>
<string name="show_all_anrs_summary" msgid="641908614413544127">"Show App Not Responding dialogue for background apps"</string>
+ <!-- no translation found for show_notification_channel_warnings (1399948193466922683) -->
+ <skip />
+ <!-- no translation found for show_notification_channel_warnings_summary (5536803251863694895) -->
+ <skip />
<string name="force_allow_on_external" msgid="3215759785081916381">"Force allow apps on external"</string>
<string name="force_allow_on_external_summary" msgid="3640752408258034689">"Makes any app eligible to be written to external storage, regardless of manifest values"</string>
<string name="force_resizable_activities" msgid="8615764378147824985">"Force activities to be re-sizable"</string>
diff --git a/packages/SettingsLib/res/values-en-rIN/strings.xml b/packages/SettingsLib/res/values-en-rIN/strings.xml
index 6b9daf7..b252545 100644
--- a/packages/SettingsLib/res/values-en-rIN/strings.xml
+++ b/packages/SettingsLib/res/values-en-rIN/strings.xml
@@ -272,6 +272,10 @@
<string name="app_process_limit_title" msgid="4280600650253107163">"Background process limit"</string>
<string name="show_all_anrs" msgid="28462979638729082">"Show all ANRs"</string>
<string name="show_all_anrs_summary" msgid="641908614413544127">"Show App Not Responding dialogue for background apps"</string>
+ <!-- no translation found for show_notification_channel_warnings (1399948193466922683) -->
+ <skip />
+ <!-- no translation found for show_notification_channel_warnings_summary (5536803251863694895) -->
+ <skip />
<string name="force_allow_on_external" msgid="3215759785081916381">"Force allow apps on external"</string>
<string name="force_allow_on_external_summary" msgid="3640752408258034689">"Makes any app eligible to be written to external storage, regardless of manifest values"</string>
<string name="force_resizable_activities" msgid="8615764378147824985">"Force activities to be re-sizable"</string>
diff --git a/packages/SettingsLib/res/values-es-rUS/strings.xml b/packages/SettingsLib/res/values-es-rUS/strings.xml
index 1464d44..03d8cea9 100644
--- a/packages/SettingsLib/res/values-es-rUS/strings.xml
+++ b/packages/SettingsLib/res/values-es-rUS/strings.xml
@@ -272,6 +272,10 @@
<string name="app_process_limit_title" msgid="4280600650253107163">"Límite de procesos en segundo plano"</string>
<string name="show_all_anrs" msgid="28462979638729082">"Errores sin respuesta"</string>
<string name="show_all_anrs_summary" msgid="641908614413544127">"Mostrar diálogo cuando las aplic. en 2do plano no responden"</string>
+ <!-- no translation found for show_notification_channel_warnings (1399948193466922683) -->
+ <skip />
+ <!-- no translation found for show_notification_channel_warnings_summary (5536803251863694895) -->
+ <skip />
<string name="force_allow_on_external" msgid="3215759785081916381">"Forzar permisos en almacenamiento externo"</string>
<string name="force_allow_on_external_summary" msgid="3640752408258034689">"Cualquier app puede escribirse en un almacenamiento externo, sin importar los valores del manifiesto"</string>
<string name="force_resizable_activities" msgid="8615764378147824985">"Forzar actividades para que cambien de tamaño"</string>
diff --git a/packages/SettingsLib/res/values-es/strings.xml b/packages/SettingsLib/res/values-es/strings.xml
index 39d4a76..00dbf9c 100644
--- a/packages/SettingsLib/res/values-es/strings.xml
+++ b/packages/SettingsLib/res/values-es/strings.xml
@@ -272,6 +272,10 @@
<string name="app_process_limit_title" msgid="4280600650253107163">"Límitar procesos en segundo plano"</string>
<string name="show_all_anrs" msgid="28462979638729082">"Errores sin respuesta"</string>
<string name="show_all_anrs_summary" msgid="641908614413544127">"Informar de que una aplicación en segundo plano no responde"</string>
+ <!-- no translation found for show_notification_channel_warnings (1399948193466922683) -->
+ <skip />
+ <!-- no translation found for show_notification_channel_warnings_summary (5536803251863694895) -->
+ <skip />
<string name="force_allow_on_external" msgid="3215759785081916381">"Forzar permiso de aplicaciones de forma externa"</string>
<string name="force_allow_on_external_summary" msgid="3640752408258034689">"Hace que cualquier aplicación se pueda escribir en un dispositivo de almacenamiento externo, independientemente de los valores definidos"</string>
<string name="force_resizable_activities" msgid="8615764378147824985">"Forzar el ajuste de tamaño de las actividades"</string>
diff --git a/packages/SettingsLib/res/values-et/strings.xml b/packages/SettingsLib/res/values-et/strings.xml
index 36d19ef..4d0f5f6 100644
--- a/packages/SettingsLib/res/values-et/strings.xml
+++ b/packages/SettingsLib/res/values-et/strings.xml
@@ -272,6 +272,10 @@
<string name="app_process_limit_title" msgid="4280600650253107163">"Taustaprotsesside piir"</string>
<string name="show_all_anrs" msgid="28462979638729082">"Näita kõiki ANR-e"</string>
<string name="show_all_anrs_summary" msgid="641908614413544127">"Kuva taustarakendustele dial. Rakendus ei reageeri"</string>
+ <!-- no translation found for show_notification_channel_warnings (1399948193466922683) -->
+ <skip />
+ <!-- no translation found for show_notification_channel_warnings_summary (5536803251863694895) -->
+ <skip />
<string name="force_allow_on_external" msgid="3215759785081916381">"Luba rakendused välises salvestusruumis"</string>
<string name="force_allow_on_external_summary" msgid="3640752408258034689">"Lubab mis tahes rakendusi kirjutada välisesse salvestusruumi manifesti väärtustest olenemata"</string>
<string name="force_resizable_activities" msgid="8615764378147824985">"Muuda tegevuste suurused muudetavaks"</string>
diff --git a/packages/SettingsLib/res/values-eu/strings.xml b/packages/SettingsLib/res/values-eu/strings.xml
index fd20d47..6ed2d75 100644
--- a/packages/SettingsLib/res/values-eu/strings.xml
+++ b/packages/SettingsLib/res/values-eu/strings.xml
@@ -272,6 +272,10 @@
<string name="app_process_limit_title" msgid="4280600650253107163">"Atzeko planoko prozesuen muga"</string>
<string name="show_all_anrs" msgid="28462979638729082">"Erakutsi ANR guztiak"</string>
<string name="show_all_anrs_summary" msgid="641908614413544127">"\"Erantzunik ez\" mezua atz. planoko aplikazioetarako"</string>
+ <!-- no translation found for show_notification_channel_warnings (1399948193466922683) -->
+ <skip />
+ <!-- no translation found for show_notification_channel_warnings_summary (5536803251863694895) -->
+ <skip />
<string name="force_allow_on_external" msgid="3215759785081916381">"Behartu aplikazioak onartzea kanpoko biltegian"</string>
<string name="force_allow_on_external_summary" msgid="3640752408258034689">"Aplikazioek kanpoko memorian idatz dezakete, manifestuaren balioak kontuan izan gabe"</string>
<string name="force_resizable_activities" msgid="8615764378147824985">"Behartu jardueren tamaina doitu ahal izatea"</string>
diff --git a/packages/SettingsLib/res/values-fa/strings.xml b/packages/SettingsLib/res/values-fa/strings.xml
index 65fe22c..bb10b38 100644
--- a/packages/SettingsLib/res/values-fa/strings.xml
+++ b/packages/SettingsLib/res/values-fa/strings.xml
@@ -272,6 +272,10 @@
<string name="app_process_limit_title" msgid="4280600650253107163">"محدودیت پردازش در پسزمینه"</string>
<string name="show_all_anrs" msgid="28462979638729082">"نمایش تمام ANRها"</string>
<string name="show_all_anrs_summary" msgid="641908614413544127">"نمایش گفتگوی \"برنامه پاسخ نمیدهد\" برای برنامههای پسزمینه"</string>
+ <!-- no translation found for show_notification_channel_warnings (1399948193466922683) -->
+ <skip />
+ <!-- no translation found for show_notification_channel_warnings_summary (5536803251863694895) -->
+ <skip />
<string name="force_allow_on_external" msgid="3215759785081916381">"اجازه اجباری به برنامههای دستگاه ذخیره خارجی"</string>
<string name="force_allow_on_external_summary" msgid="3640752408258034689">"بدون توجه به مقادیر مانیفست، هر برنامهای را برای نوشتن در حافظه خارجی واجد شرایط میکند"</string>
<string name="force_resizable_activities" msgid="8615764378147824985">"اجبار فعالیتها به قابل تغییر اندازه بودن"</string>
diff --git a/packages/SettingsLib/res/values-fi/strings.xml b/packages/SettingsLib/res/values-fi/strings.xml
index d306e23..7dd2e58 100644
--- a/packages/SettingsLib/res/values-fi/strings.xml
+++ b/packages/SettingsLib/res/values-fi/strings.xml
@@ -272,6 +272,10 @@
<string name="app_process_limit_title" msgid="4280600650253107163">"Taustaprosessi"</string>
<string name="show_all_anrs" msgid="28462979638729082">"Näytä kaikki ANR:t"</string>
<string name="show_all_anrs_summary" msgid="641908614413544127">"Näytä Sovellus ei vastaa -ikkuna taustasovell."</string>
+ <!-- no translation found for show_notification_channel_warnings (1399948193466922683) -->
+ <skip />
+ <!-- no translation found for show_notification_channel_warnings_summary (5536803251863694895) -->
+ <skip />
<string name="force_allow_on_external" msgid="3215759785081916381">"Salli aina ulkoinen tallennus"</string>
<string name="force_allow_on_external_summary" msgid="3640752408258034689">"Mahdollistaa sovelluksen tietojen tallentamisen ulkoiseen tallennustilaan luetteloarvoista riippumatta."</string>
<string name="force_resizable_activities" msgid="8615764378147824985">"Pakota kaikki toiminnot hyväksymään koon muutos"</string>
diff --git a/packages/SettingsLib/res/values-fr-rCA/strings.xml b/packages/SettingsLib/res/values-fr-rCA/strings.xml
index f851581..5641d7c 100644
--- a/packages/SettingsLib/res/values-fr-rCA/strings.xml
+++ b/packages/SettingsLib/res/values-fr-rCA/strings.xml
@@ -272,6 +272,10 @@
<string name="app_process_limit_title" msgid="4280600650253107163">"Limite processus arr.-plan"</string>
<string name="show_all_anrs" msgid="28462979638729082">"Afficher tous les messages «L\'application ne répond pas»"</string>
<string name="show_all_anrs_summary" msgid="641908614413544127">"Afficher « L\'application ne répond plus » pour applis en arrière-plan"</string>
+ <!-- no translation found for show_notification_channel_warnings (1399948193466922683) -->
+ <skip />
+ <!-- no translation found for show_notification_channel_warnings_summary (5536803251863694895) -->
+ <skip />
<string name="force_allow_on_external" msgid="3215759785081916381">"Forcer l\'autor. d\'applis sur stockage externe"</string>
<string name="force_allow_on_external_summary" msgid="3640752408258034689">"Rend possible l\'enregistrement de toute application sur un espace de stockage externe, indépendamment des valeurs du fichier manifeste"</string>
<string name="force_resizable_activities" msgid="8615764378147824985">"Forcer les activités à être redimensionnables"</string>
diff --git a/packages/SettingsLib/res/values-fr/strings.xml b/packages/SettingsLib/res/values-fr/strings.xml
index c69f324..b0b532f 100644
--- a/packages/SettingsLib/res/values-fr/strings.xml
+++ b/packages/SettingsLib/res/values-fr/strings.xml
@@ -272,6 +272,10 @@
<string name="app_process_limit_title" msgid="4280600650253107163">"Limite processus arr.-plan"</string>
<string name="show_all_anrs" msgid="28462979638729082">"Afficher tous les messages ANR"</string>
<string name="show_all_anrs_summary" msgid="641908614413544127">"Afficher \"L\'application ne répond plus\" pour applis en arrière-plan"</string>
+ <!-- no translation found for show_notification_channel_warnings (1399948193466922683) -->
+ <skip />
+ <!-- no translation found for show_notification_channel_warnings_summary (5536803251863694895) -->
+ <skip />
<string name="force_allow_on_external" msgid="3215759785081916381">"Forcer disponibilité stockage externe pour applis"</string>
<string name="force_allow_on_external_summary" msgid="3640752408258034689">"Rend possible l\'enregistrement de toute application sur un espace de stockage externe, indépendamment des valeurs du fichier manifeste."</string>
<string name="force_resizable_activities" msgid="8615764378147824985">"Forcer possibilité de redimensionner les activités"</string>
diff --git a/packages/SettingsLib/res/values-gl/strings.xml b/packages/SettingsLib/res/values-gl/strings.xml
index 399199d..81a1ca9 100644
--- a/packages/SettingsLib/res/values-gl/strings.xml
+++ b/packages/SettingsLib/res/values-gl/strings.xml
@@ -272,6 +272,10 @@
<string name="app_process_limit_title" msgid="4280600650253107163">"Límite proceso 2º plano"</string>
<string name="show_all_anrs" msgid="28462979638729082">"Mostrar todos os ANR"</string>
<string name="show_all_anrs_summary" msgid="641908614413544127">"Informa que aplicación segundo plano non responde"</string>
+ <!-- no translation found for show_notification_channel_warnings (1399948193466922683) -->
+ <skip />
+ <!-- no translation found for show_notification_channel_warnings_summary (5536803251863694895) -->
+ <skip />
<string name="force_allow_on_external" msgid="3215759785081916381">"Forzar permiso de aplicacións de forma externa"</string>
<string name="force_allow_on_external_summary" msgid="3640752408258034689">"Permite que calquera aplicación apta se poida escribir nun almacenamento externo, independentemente dos valores expresados"</string>
<string name="force_resizable_activities" msgid="8615764378147824985">"Forzar o axuste do tamaño das actividades"</string>
diff --git a/packages/SettingsLib/res/values-gu/strings.xml b/packages/SettingsLib/res/values-gu/strings.xml
index df9eda9..e4e1507 100644
--- a/packages/SettingsLib/res/values-gu/strings.xml
+++ b/packages/SettingsLib/res/values-gu/strings.xml
@@ -272,6 +272,10 @@
<string name="app_process_limit_title" msgid="4280600650253107163">"પૃષ્ઠભૂમિ પ્રક્રિયા સીમા"</string>
<string name="show_all_anrs" msgid="28462979638729082">"બધા ANR બતાવો"</string>
<string name="show_all_anrs_summary" msgid="641908614413544127">"પૃષ્ઠભૂમિ ઍપ્લિકેશનો માટે ઍપ્લિકેશન પ્રતિસાદ આપતી નથી સંવાદ બતાવો"</string>
+ <!-- no translation found for show_notification_channel_warnings (1399948193466922683) -->
+ <skip />
+ <!-- no translation found for show_notification_channel_warnings_summary (5536803251863694895) -->
+ <skip />
<string name="force_allow_on_external" msgid="3215759785081916381">"બાહ્ય પર એપ્લિકેશનોને મંજૂરી આપવાની ફરજ પાડો"</string>
<string name="force_allow_on_external_summary" msgid="3640752408258034689">"મેનિફેસ્ટ મૂલ્યોને ધ્યાનમાં લીધા સિવાય, કોઈપણ ઍપ્લિકેશનને બાહ્ય સ્ટોરેજ પર લખાવા માટે લાયક બનાવે છે"</string>
<string name="force_resizable_activities" msgid="8615764378147824985">"પ્રવૃત્તિઓને ફરીથી કદ યોગ્ય થવા માટે ફરજ પાડો"</string>
diff --git a/packages/SettingsLib/res/values-hi/strings.xml b/packages/SettingsLib/res/values-hi/strings.xml
index c729027..936e775 100644
--- a/packages/SettingsLib/res/values-hi/strings.xml
+++ b/packages/SettingsLib/res/values-hi/strings.xml
@@ -272,6 +272,10 @@
<string name="app_process_limit_title" msgid="4280600650253107163">"पृष्ठभूमि प्रक्रिया सीमा"</string>
<string name="show_all_anrs" msgid="28462979638729082">"सभी ANR दिखाएं"</string>
<string name="show_all_anrs_summary" msgid="641908614413544127">"पृष्ठभूमि ऐप्स के लिए ऐप्स प्रतिसाद नहीं दे रहा डॉयलॉग दिखाएं"</string>
+ <!-- no translation found for show_notification_channel_warnings (1399948193466922683) -->
+ <skip />
+ <!-- no translation found for show_notification_channel_warnings_summary (5536803251863694895) -->
+ <skip />
<string name="force_allow_on_external" msgid="3215759785081916381">"ऐप्स को बाहरी मेमोरी पर बाध्य करें"</string>
<string name="force_allow_on_external_summary" msgid="3640752408258034689">"इससे कोई भी ऐप्लिकेशन, मेनिफेस्ट मानों को अनदेखा करके, बाहरी मेमोरी पर लिखने योग्य बन जाता है"</string>
<string name="force_resizable_activities" msgid="8615764378147824985">"आकार बदले जाने के लिए गतिविधियों को बाध्य करें"</string>
diff --git a/packages/SettingsLib/res/values-hr/strings.xml b/packages/SettingsLib/res/values-hr/strings.xml
index e94b6df..be4ac19 100644
--- a/packages/SettingsLib/res/values-hr/strings.xml
+++ b/packages/SettingsLib/res/values-hr/strings.xml
@@ -272,6 +272,10 @@
<string name="app_process_limit_title" msgid="4280600650253107163">"Ograničenje pozadinskog procesa"</string>
<string name="show_all_anrs" msgid="28462979638729082">"Prikaži sve ANR-ove"</string>
<string name="show_all_anrs_summary" msgid="641908614413544127">"Prikaz dijaloga o pozad. aplik. koja ne odgovara"</string>
+ <!-- no translation found for show_notification_channel_warnings (1399948193466922683) -->
+ <skip />
+ <!-- no translation found for show_notification_channel_warnings_summary (5536803251863694895) -->
+ <skip />
<string name="force_allow_on_external" msgid="3215759785081916381">"Prisilno dopusti aplikacije u vanjskoj pohrani"</string>
<string name="force_allow_on_external_summary" msgid="3640752408258034689">"Aplikacije se mogu zapisivati u vanjsku pohranu neovisno o vrijednostima manifesta"</string>
<string name="force_resizable_activities" msgid="8615764378147824985">"Nametni mogućnost promjene veličine za aktivnosti"</string>
diff --git a/packages/SettingsLib/res/values-hu/strings.xml b/packages/SettingsLib/res/values-hu/strings.xml
index d06417f..b791178 100644
--- a/packages/SettingsLib/res/values-hu/strings.xml
+++ b/packages/SettingsLib/res/values-hu/strings.xml
@@ -272,6 +272,10 @@
<string name="app_process_limit_title" msgid="4280600650253107163">"Háttérfolyamat-korlátozás"</string>
<string name="show_all_anrs" msgid="28462979638729082">"Összes ANR mutatása"</string>
<string name="show_all_anrs_summary" msgid="641908614413544127">"Az Alkalmazás nem válaszol ablak megjelenítése"</string>
+ <!-- no translation found for show_notification_channel_warnings (1399948193466922683) -->
+ <skip />
+ <!-- no translation found for show_notification_channel_warnings_summary (5536803251863694895) -->
+ <skip />
<string name="force_allow_on_external" msgid="3215759785081916381">"Külső tárhely alkalmazásainak engedélyezése"</string>
<string name="force_allow_on_external_summary" msgid="3640752408258034689">"Lehetővé teszi bármely alkalmazás külső tárhelyre való írását a jegyzékértékektől függetlenül"</string>
<string name="force_resizable_activities" msgid="8615764378147824985">"Tevékenységek átméretezésének kényszerítése"</string>
diff --git a/packages/SettingsLib/res/values-hy/strings.xml b/packages/SettingsLib/res/values-hy/strings.xml
index 8dd85c3..da34ccc 100644
--- a/packages/SettingsLib/res/values-hy/strings.xml
+++ b/packages/SettingsLib/res/values-hy/strings.xml
@@ -91,11 +91,11 @@
<string name="process_kernel_label" msgid="3916858646836739323">"Android OS"</string>
<string name="data_usage_uninstalled_apps" msgid="614263770923231598">"Հեռացված ծրագրեր"</string>
<string name="data_usage_uninstalled_apps_users" msgid="7986294489899813194">"Հեռացված հավելվածներն ու օգտատերերը"</string>
- <string name="tether_settings_title_usb" msgid="6688416425801386511">"USB միացում"</string>
+ <string name="tether_settings_title_usb" msgid="6688416425801386511">"USB մոդեմ"</string>
<string name="tether_settings_title_wifi" msgid="3277144155960302049">"Դյուրակիր թեժ կետ"</string>
- <string name="tether_settings_title_bluetooth" msgid="355855408317564420">"Bluetooth-ը կապվում է"</string>
- <string name="tether_settings_title_usb_bluetooth" msgid="5355828977109785001">"Միացում"</string>
- <string name="tether_settings_title_all" msgid="8356136101061143841">"Միացում և շարժական թեժ կետ"</string>
+ <string name="tether_settings_title_bluetooth" msgid="355855408317564420">"Bluetooth մոդեմ"</string>
+ <string name="tether_settings_title_usb_bluetooth" msgid="5355828977109785001">"Մոդեմի ռեժիմ"</string>
+ <string name="tether_settings_title_all" msgid="8356136101061143841">"Մոդեմի ռեժիմ"</string>
<string name="managed_user_title" msgid="8109605045406748842">"Բոլոր աշխատանքային հավելվածները"</string>
<string name="user_guest" msgid="8475274842845401871">"Հյուր"</string>
<string name="unknown" msgid="1592123443519355854">"Անհայտ"</string>
@@ -149,7 +149,7 @@
<string name="development_settings_summary" msgid="1815795401632854041">"Կարգավորել ընտրանքները ծրագրի ծրագրավորման համար"</string>
<string name="development_settings_not_available" msgid="4308569041701535607">"Ծրագրավորման ընտրանքներն այլևս հասանելի չեն այս օգտատիրոջ"</string>
<string name="vpn_settings_not_available" msgid="956841430176985598">"VPN-ի կարգավորումները հասանելի չեն այս օգտատիրոջը"</string>
- <string name="tethering_settings_not_available" msgid="6765770438438291012">"Միակցման կարգավորումները հասանելի չեն այս օգտատիրոջը"</string>
+ <string name="tethering_settings_not_available" msgid="6765770438438291012">"Այս օգտատերը չի կարող փոխել մոդեմի ռեժիմի կարգավորումները"</string>
<string name="apn_settings_not_available" msgid="7873729032165324000">"Մատչման կետի անվան կարգավորումները հասանելի չեն այս օգտատիրոջը"</string>
<string name="enable_adb" msgid="7982306934419797485">"USB վրիպազերծում"</string>
<string name="enable_adb_summary" msgid="4881186971746056635">"Կարգաբերել ռեժիմը, երբ USB-ն միացված է"</string>
@@ -272,6 +272,10 @@
<string name="app_process_limit_title" msgid="4280600650253107163">"Հետնաշերտի գործընթացի սահմանաչափ"</string>
<string name="show_all_anrs" msgid="28462979638729082">"Ցույց տալ բոլոր ANR-երը"</string>
<string name="show_all_anrs_summary" msgid="641908614413544127">"Ցուցադրել այն ծրագիրը, որը չի արձագանքում երկխոսությունը հետնաշերտի ծրագրերի համար"</string>
+ <!-- no translation found for show_notification_channel_warnings (1399948193466922683) -->
+ <skip />
+ <!-- no translation found for show_notification_channel_warnings_summary (5536803251863694895) -->
+ <skip />
<string name="force_allow_on_external" msgid="3215759785081916381">"Միշտ թույլատրել ծրագրեր արտաքին պահեստում"</string>
<string name="force_allow_on_external_summary" msgid="3640752408258034689">"Թույլ է տալիս ցանկացած հավելված պահել արտաքին սարքում՝ մանիֆեստի արժեքներից անկախ"</string>
<string name="force_resizable_activities" msgid="8615764378147824985">"Ստիպել, որ ակտիվությունների չափերը լինեն փոփոխելի"</string>
diff --git a/packages/SettingsLib/res/values-in/strings.xml b/packages/SettingsLib/res/values-in/strings.xml
index 9e7355b..13407fe 100644
--- a/packages/SettingsLib/res/values-in/strings.xml
+++ b/packages/SettingsLib/res/values-in/strings.xml
@@ -272,6 +272,10 @@
<string name="app_process_limit_title" msgid="4280600650253107163">"Batas proses latar blkg"</string>
<string name="show_all_anrs" msgid="28462979638729082">"Tampilkan semua ANR"</string>
<string name="show_all_anrs_summary" msgid="641908614413544127">"Tmplkn dialog Apl Tidak Merespons utk apl ltr blkg"</string>
+ <!-- no translation found for show_notification_channel_warnings (1399948193466922683) -->
+ <skip />
+ <!-- no translation found for show_notification_channel_warnings_summary (5536803251863694895) -->
+ <skip />
<string name="force_allow_on_external" msgid="3215759785081916381">"Paksa izinkan aplikasi di eksternal"</string>
<string name="force_allow_on_external_summary" msgid="3640752408258034689">"Membuat semua aplikasi dapat ditulis ke penyimpanan eksternal, terlepas dari nilai manifes"</string>
<string name="force_resizable_activities" msgid="8615764378147824985">"Paksa aktivitas agar ukurannya dapat diubah"</string>
diff --git a/packages/SettingsLib/res/values-is/strings.xml b/packages/SettingsLib/res/values-is/strings.xml
index d4fde8a..6457e71 100644
--- a/packages/SettingsLib/res/values-is/strings.xml
+++ b/packages/SettingsLib/res/values-is/strings.xml
@@ -272,6 +272,10 @@
<string name="app_process_limit_title" msgid="4280600650253107163">"Takmörkun á bakgrunnsvinnslum"</string>
<string name="show_all_anrs" msgid="28462979638729082">"Öll forrit sem svara ekki"</string>
<string name="show_all_anrs_summary" msgid="641908614413544127">"Sýna „Forrit svarar ekki“ fyrir bakgrunnsforrit"</string>
+ <!-- no translation found for show_notification_channel_warnings (1399948193466922683) -->
+ <skip />
+ <!-- no translation found for show_notification_channel_warnings_summary (5536803251863694895) -->
+ <skip />
<string name="force_allow_on_external" msgid="3215759785081916381">"Þvinga fram leyfi forrita í ytri geymslu"</string>
<string name="force_allow_on_external_summary" msgid="3640752408258034689">"Gerir öll forrit skrifanleg í ytra geymslurými, óháð gildum í upplýsingaskrá"</string>
<string name="force_resizable_activities" msgid="8615764378147824985">"Þvinga breytanlega stærð virkni"</string>
diff --git a/packages/SettingsLib/res/values-it/strings.xml b/packages/SettingsLib/res/values-it/strings.xml
index 0ebe77e5..5182730 100644
--- a/packages/SettingsLib/res/values-it/strings.xml
+++ b/packages/SettingsLib/res/values-it/strings.xml
@@ -272,6 +272,10 @@
<string name="app_process_limit_title" msgid="4280600650253107163">"Limite processi background"</string>
<string name="show_all_anrs" msgid="28462979638729082">"Mostra tutti errori ANR"</string>
<string name="show_all_anrs_summary" msgid="641908614413544127">"Mostra finestra ANR per applicazioni in background"</string>
+ <!-- no translation found for show_notification_channel_warnings (1399948193466922683) -->
+ <skip />
+ <!-- no translation found for show_notification_channel_warnings_summary (5536803251863694895) -->
+ <skip />
<string name="force_allow_on_external" msgid="3215759785081916381">"Forza autorizzazione app su memoria esterna"</string>
<string name="force_allow_on_external_summary" msgid="3640752408258034689">"Consente l\'installazione di qualsiasi app su memoria esterna, indipendentemente dai valori manifest"</string>
<string name="force_resizable_activities" msgid="8615764378147824985">"Imponi formato modificabile alle attività"</string>
diff --git a/packages/SettingsLib/res/values-iw/strings.xml b/packages/SettingsLib/res/values-iw/strings.xml
index 182d819..249fac4 100644
--- a/packages/SettingsLib/res/values-iw/strings.xml
+++ b/packages/SettingsLib/res/values-iw/strings.xml
@@ -272,6 +272,10 @@
<string name="app_process_limit_title" msgid="4280600650253107163">"מגבלה של תהליכים ברקע"</string>
<string name="show_all_anrs" msgid="28462979638729082">"הצג את כל פריטי ה-ANR"</string>
<string name="show_all_anrs_summary" msgid="641908614413544127">"הצג תיבת דו-שיח של \'אפליקציה לא מגיבה\' עבור אפליקציות שפועלות ברקע"</string>
+ <!-- no translation found for show_notification_channel_warnings (1399948193466922683) -->
+ <skip />
+ <!-- no translation found for show_notification_channel_warnings_summary (5536803251863694895) -->
+ <skip />
<string name="force_allow_on_external" msgid="3215759785081916381">"אילוץ הרשאת אפליקציות באחסון חיצוני"</string>
<string name="force_allow_on_external_summary" msgid="3640752408258034689">"מאפשר כתיבה של כל אפליקציה באחסון חיצוני, ללא התחשבות בערכי המניפסט"</string>
<string name="force_resizable_activities" msgid="8615764378147824985">"אלץ יכולת קביעת גודל של הפעילויות"</string>
diff --git a/packages/SettingsLib/res/values-ja/strings.xml b/packages/SettingsLib/res/values-ja/strings.xml
index 440b04d..8837e97 100644
--- a/packages/SettingsLib/res/values-ja/strings.xml
+++ b/packages/SettingsLib/res/values-ja/strings.xml
@@ -272,6 +272,10 @@
<string name="app_process_limit_title" msgid="4280600650253107163">"バックグラウンドプロセスの上限"</string>
<string name="show_all_anrs" msgid="28462979638729082">"すべてのANRを表示"</string>
<string name="show_all_anrs_summary" msgid="641908614413544127">"バックグラウンドアプリが応答しない場合に通知する"</string>
+ <!-- no translation found for show_notification_channel_warnings (1399948193466922683) -->
+ <skip />
+ <!-- no translation found for show_notification_channel_warnings_summary (5536803251863694895) -->
+ <skip />
<string name="force_allow_on_external" msgid="3215759785081916381">"外部ストレージへのアプリの書き込みを許可"</string>
<string name="force_allow_on_external_summary" msgid="3640752408258034689">"マニフェストの値に関係なく、すべてのアプリを外部ストレージに書き込めるようになります"</string>
<string name="force_resizable_activities" msgid="8615764378147824985">"アクティビティをサイズ変更可能にする"</string>
diff --git a/packages/SettingsLib/res/values-ka/strings.xml b/packages/SettingsLib/res/values-ka/strings.xml
index 08e6449..81416a0 100644
--- a/packages/SettingsLib/res/values-ka/strings.xml
+++ b/packages/SettingsLib/res/values-ka/strings.xml
@@ -272,6 +272,10 @@
<string name="app_process_limit_title" msgid="4280600650253107163">"ფონური პროცესების ლიმიტი"</string>
<string name="show_all_anrs" msgid="28462979638729082">"ყველა ANR-ის ჩვენება"</string>
<string name="show_all_anrs_summary" msgid="641908614413544127">"შეტყობინების ჩვენება, როცა ფონური აპლიკაცია არ პასუხობს"</string>
+ <!-- no translation found for show_notification_channel_warnings (1399948193466922683) -->
+ <skip />
+ <!-- no translation found for show_notification_channel_warnings_summary (5536803251863694895) -->
+ <skip />
<string name="force_allow_on_external" msgid="3215759785081916381">"აპების დაშვება გარე მეხსიერებაში"</string>
<string name="force_allow_on_external_summary" msgid="3640752408258034689">"აპები ჩაიწერება გარე მეხსიერებაზე აღწერის ფაილების მნიშვნელობების მიუხედავად"</string>
<string name="force_resizable_activities" msgid="8615764378147824985">"ზომაცვლადი აქტივობების იძულება"</string>
diff --git a/packages/SettingsLib/res/values-kk/strings.xml b/packages/SettingsLib/res/values-kk/strings.xml
index cc8b662..66b4a0e 100644
--- a/packages/SettingsLib/res/values-kk/strings.xml
+++ b/packages/SettingsLib/res/values-kk/strings.xml
@@ -272,6 +272,10 @@
<string name="app_process_limit_title" msgid="4280600650253107163">"Фондық үрдіс шектеуі"</string>
<string name="show_all_anrs" msgid="28462979638729082">"Барлық ANR (қолданба жауап бермеді) хабарларын көрсетіңіз"</string>
<string name="show_all_anrs_summary" msgid="641908614413544127">"Фондық қолданбалардың жауап бермегенін көрсету"</string>
+ <!-- no translation found for show_notification_channel_warnings (1399948193466922683) -->
+ <skip />
+ <!-- no translation found for show_notification_channel_warnings_summary (5536803251863694895) -->
+ <skip />
<string name="force_allow_on_external" msgid="3215759785081916381">"Сыртқыда қолданбаларға мәжбүрлеп рұқсат ету"</string>
<string name="force_allow_on_external_summary" msgid="3640752408258034689">"Манифест мәндеріне қарамастан кез келген қолданбаны сыртқы жадқа жазуға жарамды етеді"</string>
<string name="force_resizable_activities" msgid="8615764378147824985">"Әрекеттерді өлшемін өзгертуге болатын етуге мәжбүрлеу"</string>
diff --git a/packages/SettingsLib/res/values-km/strings.xml b/packages/SettingsLib/res/values-km/strings.xml
index 917415c..1adc432 100644
--- a/packages/SettingsLib/res/values-km/strings.xml
+++ b/packages/SettingsLib/res/values-km/strings.xml
@@ -272,6 +272,10 @@
<string name="app_process_limit_title" msgid="4280600650253107163">"ដែនកំណត់ដំណើរការក្នុងផ្ទៃខាងក្រោយ"</string>
<string name="show_all_anrs" msgid="28462979638729082">"បង្ហាញ ANRs ទាំងអស់"</string>
<string name="show_all_anrs_summary" msgid="641908614413544127">"បង្ហាញប្រអប់កម្មវិធីមិនឆ្លើយតបសម្រាប់កម្មវិធីផ្ទៃខាងក្រោយ"</string>
+ <!-- no translation found for show_notification_channel_warnings (1399948193466922683) -->
+ <skip />
+ <!-- no translation found for show_notification_channel_warnings_summary (5536803251863694895) -->
+ <skip />
<string name="force_allow_on_external" msgid="3215759785081916381">"បង្ខំឲ្យអនុញ្ញាតកម្មវិធីលើឧបករណ៍ផ្ទុកខាងក្រៅ"</string>
<string name="force_allow_on_external_summary" msgid="3640752408258034689">"ធ្វើឲ្យកម្មវិធីទាំងឡាយមានសិទ្ធិសរសេរទៅកាន់ឧបករណ៍ផ្ទុកខាងក្រៅ ដោយមិនគិតពីតម្លៃជាក់លាក់"</string>
<string name="force_resizable_activities" msgid="8615764378147824985">"បង្ខំឲ្យសកម្មភាពអាចប្តូរទំហំបាន"</string>
diff --git a/packages/SettingsLib/res/values-kn/strings.xml b/packages/SettingsLib/res/values-kn/strings.xml
index 0120658..c545da7 100644
--- a/packages/SettingsLib/res/values-kn/strings.xml
+++ b/packages/SettingsLib/res/values-kn/strings.xml
@@ -272,6 +272,10 @@
<string name="app_process_limit_title" msgid="4280600650253107163">"ಹಿನ್ನೆಲೆ ಪ್ರಕ್ರಿಯೆ ಮಿತಿ"</string>
<string name="show_all_anrs" msgid="28462979638729082">"ಎಲ್ಲ ANR ಗಳನ್ನು ತೋರಿಸು"</string>
<string name="show_all_anrs_summary" msgid="641908614413544127">"ಹಿನ್ನೆಲೆ ಅಪ್ಲಿಕೇಶನ್ಗಳಿಗಾಗಿ ಅಪ್ಲಿಕೇಶನ್ ಪ್ರತಿಕ್ರಿಯಿಸುತ್ತಿಲ್ಲ ಎಂಬ ಸಂಭಾಷಣೆ ತೋರಿಸು"</string>
+ <!-- no translation found for show_notification_channel_warnings (1399948193466922683) -->
+ <skip />
+ <!-- no translation found for show_notification_channel_warnings_summary (5536803251863694895) -->
+ <skip />
<string name="force_allow_on_external" msgid="3215759785081916381">"ಬಾಹ್ಯವಾಗಿ ಅಪ್ಲಿಕೇಶನ್ಗಳನ್ನು ಒತ್ತಾಯವಾಗಿ ಅನುಮತಿಸಿ"</string>
<string name="force_allow_on_external_summary" msgid="3640752408258034689">"ಮ್ಯಾನಿಫೆಸ್ಟ್ ಮೌಲ್ಯಗಳು ಯಾವುದೇ ಆಗಿದ್ದರೂ, ಬಾಹ್ಯ ಸಂಗ್ರಹಣೆಗೆ ಬರೆಯಲು ಯಾವುದೇ ಅಪ್ಲಿಕೇಶನ್ ಅನ್ನು ಅರ್ಹಗೊಳಿಸುತ್ತದೆ"</string>
<string name="force_resizable_activities" msgid="8615764378147824985">"ಚಟುವಟಿಕೆಗಳನ್ನು ಮರುಗಾತ್ರಗೊಳಿಸುವಂತೆ ಒತ್ತಾಯ ಮಾಡಿ"</string>
diff --git a/packages/SettingsLib/res/values-ko/strings.xml b/packages/SettingsLib/res/values-ko/strings.xml
index c5f842e..bbaeed7 100644
--- a/packages/SettingsLib/res/values-ko/strings.xml
+++ b/packages/SettingsLib/res/values-ko/strings.xml
@@ -272,6 +272,10 @@
<string name="app_process_limit_title" msgid="4280600650253107163">"백그라운드 프로세스 수 제한"</string>
<string name="show_all_anrs" msgid="28462979638729082">"모든 ANR 보기"</string>
<string name="show_all_anrs_summary" msgid="641908614413544127">"백그라운드 앱에 대해 앱 응답 없음 대화상자 표시"</string>
+ <!-- no translation found for show_notification_channel_warnings (1399948193466922683) -->
+ <skip />
+ <!-- no translation found for show_notification_channel_warnings_summary (5536803251863694895) -->
+ <skip />
<string name="force_allow_on_external" msgid="3215759785081916381">"외부에서 앱 강제 허용"</string>
<string name="force_allow_on_external_summary" msgid="3640752408258034689">"매니페스트 값과 관계없이 모든 앱이 외부 저장소에 작성되도록 허용"</string>
<string name="force_resizable_activities" msgid="8615764378147824985">"활동의 크기가 조정 가능하도록 설정"</string>
diff --git a/packages/SettingsLib/res/values-ky/strings.xml b/packages/SettingsLib/res/values-ky/strings.xml
index 492f71d..66f3769 100644
--- a/packages/SettingsLib/res/values-ky/strings.xml
+++ b/packages/SettingsLib/res/values-ky/strings.xml
@@ -272,6 +272,10 @@
<string name="app_process_limit_title" msgid="4280600650253107163">"Фондогу процесстер чеги"</string>
<string name="show_all_anrs" msgid="28462979638729082">"Бардык ANR\'лерди көрсөтүү"</string>
<string name="show_all_anrs_summary" msgid="641908614413544127">"Фондогу колдонмолорго Колдонмо Жооп Бербейт деп көрсөтүү"</string>
+ <!-- no translation found for show_notification_channel_warnings (1399948193466922683) -->
+ <skip />
+ <!-- no translation found for show_notification_channel_warnings_summary (5536803251863694895) -->
+ <skip />
<string name="force_allow_on_external" msgid="3215759785081916381">"Тышкы сактагычка сактоого уруксат берүү"</string>
<string name="force_allow_on_external_summary" msgid="3640752408258034689">"Манифест маанилерине карабастан бардык колдонмолорду тышкы сактагычка сактоого уруксат берет"</string>
<string name="force_resizable_activities" msgid="8615764378147824985">"Аракеттердин өлчөмүн өзгөртүүнү мажбурлоо"</string>
diff --git a/packages/SettingsLib/res/values-lo/strings.xml b/packages/SettingsLib/res/values-lo/strings.xml
index 5abd2a6..c909cbb 100644
--- a/packages/SettingsLib/res/values-lo/strings.xml
+++ b/packages/SettingsLib/res/values-lo/strings.xml
@@ -272,6 +272,10 @@
<string name="app_process_limit_title" msgid="4280600650253107163">"ການຈຳກັດໂປຣເຊສໃນພື້ນຫຼັງ"</string>
<string name="show_all_anrs" msgid="28462979638729082">"ສະແດງ ANRs ທັງຫມົດ"</string>
<string name="show_all_anrs_summary" msgid="641908614413544127">"ສະແດງໜ້າຈໍແອັບຯທີ່ບໍ່ຕອບສະໜອງສຳລັບແອັບຯພື້ນຫຼັງ"</string>
+ <!-- no translation found for show_notification_channel_warnings (1399948193466922683) -->
+ <skip />
+ <!-- no translation found for show_notification_channel_warnings_summary (5536803251863694895) -->
+ <skip />
<string name="force_allow_on_external" msgid="3215759785081916381">"ບັງຄັບອະນຸຍາດແອັບຢູ່ພາຍນອກ"</string>
<string name="force_allow_on_external_summary" msgid="3640752408258034689">"ເຮັດໃຫ້ທຸກແອັບມີສິດໄດ້ຮັບການຂຽນໃສ່ພື້ນທີ່ຈັດເກັບຂໍ້ມູນພາຍນອກ, ໂດຍບໍ່ຄຳນຶງເຖິງຄ່າ manifest"</string>
<string name="force_resizable_activities" msgid="8615764378147824985">"ບັງຄັງໃຫ້ກິດຈະກຳປ່ຽນຂະໜາດໄດ້"</string>
diff --git a/packages/SettingsLib/res/values-lt/strings.xml b/packages/SettingsLib/res/values-lt/strings.xml
index 830abf0..274ce9a 100644
--- a/packages/SettingsLib/res/values-lt/strings.xml
+++ b/packages/SettingsLib/res/values-lt/strings.xml
@@ -272,6 +272,10 @@
<string name="app_process_limit_title" msgid="4280600650253107163">"Fono procesų apribojimas"</string>
<string name="show_all_anrs" msgid="28462979638729082">"Rodyti visus ANR"</string>
<string name="show_all_anrs_summary" msgid="641908614413544127">"Fon. programose rodyti dialogo langą „Neatsako“"</string>
+ <!-- no translation found for show_notification_channel_warnings (1399948193466922683) -->
+ <skip />
+ <!-- no translation found for show_notification_channel_warnings_summary (5536803251863694895) -->
+ <skip />
<string name="force_allow_on_external" msgid="3215759785081916381">"Priverstinai leisti programas išorinėje atmintin."</string>
<string name="force_allow_on_external_summary" msgid="3640752408258034689">"Nustatoma, kad visas programas būtų galima įrašyti į išorinę saugyklą, nepaisant aprašo verčių"</string>
<string name="force_resizable_activities" msgid="8615764378147824985">"Priv. nust., kad veiksm. b. g. atl. kelių d. lang."</string>
diff --git a/packages/SettingsLib/res/values-lv/strings.xml b/packages/SettingsLib/res/values-lv/strings.xml
index 5749954..e760d78 100644
--- a/packages/SettingsLib/res/values-lv/strings.xml
+++ b/packages/SettingsLib/res/values-lv/strings.xml
@@ -272,6 +272,10 @@
<string name="app_process_limit_title" msgid="4280600650253107163">"Fona procesu ierobežojums"</string>
<string name="show_all_anrs" msgid="28462979638729082">"Rādīt visus ANR"</string>
<string name="show_all_anrs_summary" msgid="641908614413544127">"Rādīt fona lietotņu dialoglodz. Lietotne nereaģē"</string>
+ <!-- no translation found for show_notification_channel_warnings (1399948193466922683) -->
+ <skip />
+ <!-- no translation found for show_notification_channel_warnings_summary (5536803251863694895) -->
+ <skip />
<string name="force_allow_on_external" msgid="3215759785081916381">"Lietotņu piespiedu atļaušana ārējā krātuvē"</string>
<string name="force_allow_on_external_summary" msgid="3640752408258034689">"Ļauj jebkuru lietotni ierakstīt ārējā krātuvē neatkarīgi no manifesta vērtības."</string>
<string name="force_resizable_activities" msgid="8615764378147824985">"Pielāgot darbības"</string>
diff --git a/packages/SettingsLib/res/values-mk/strings.xml b/packages/SettingsLib/res/values-mk/strings.xml
index 88b3675..1979451 100644
--- a/packages/SettingsLib/res/values-mk/strings.xml
+++ b/packages/SettingsLib/res/values-mk/strings.xml
@@ -272,6 +272,10 @@
<string name="app_process_limit_title" msgid="4280600650253107163">"Граница на процес во зад."</string>
<string name="show_all_anrs" msgid="28462979638729082">"Прикажи ги сите ANR"</string>
<string name="show_all_anrs_summary" msgid="641908614413544127">"Прикажи „Апл. не реагира“ за. апл. во заднина"</string>
+ <!-- no translation found for show_notification_channel_warnings (1399948193466922683) -->
+ <skip />
+ <!-- no translation found for show_notification_channel_warnings_summary (5536803251863694895) -->
+ <skip />
<string name="force_allow_on_external" msgid="3215759785081916381">"Принуд. дозволете апликации на надворешна меморија"</string>
<string name="force_allow_on_external_summary" msgid="3640752408258034689">"Прави секоја апликација да биде подобна за запишување на надворешна меморија, независно од вредностите на манифестот"</string>
<string name="force_resizable_activities" msgid="8615764378147824985">"Принуди ги активностите да ја менуваат големината"</string>
diff --git a/packages/SettingsLib/res/values-ml/strings.xml b/packages/SettingsLib/res/values-ml/strings.xml
index 3ed642d..06a9dc1 100644
--- a/packages/SettingsLib/res/values-ml/strings.xml
+++ b/packages/SettingsLib/res/values-ml/strings.xml
@@ -272,6 +272,10 @@
<string name="app_process_limit_title" msgid="4280600650253107163">"പശ്ചാത്തല പ്രോസസ്സ് പരിധി"</string>
<string name="show_all_anrs" msgid="28462979638729082">"എല്ലാ ANR-കളും ദൃശ്യമാക്കുക"</string>
<string name="show_all_anrs_summary" msgid="641908614413544127">"പശ്ചാത്തല അപ്ലിക്കേഷനുകൾക്ക് അപ്ലിക്കേഷൻ പ്രതികരിക്കുന്നില്ല എന്ന ഡയലോഗ് കാണിക്കുക"</string>
+ <!-- no translation found for show_notification_channel_warnings (1399948193466922683) -->
+ <skip />
+ <!-- no translation found for show_notification_channel_warnings_summary (5536803251863694895) -->
+ <skip />
<string name="force_allow_on_external" msgid="3215759785081916381">"ബാഹ്യമായതിൽ നിർബന്ധിച്ച് അനുവദിക്കുക"</string>
<string name="force_allow_on_external_summary" msgid="3640752408258034689">"മാനിഫെസ്റ്റ് മൂല്യങ്ങൾ പരിഗണിക്കാതെ, ബാഹ്യ സ്റ്റോറേജിലേക്ക് എഴുതപ്പെടുന്നതിന് ഏതൊരു ആപ്പിനെയും യോഗ്യമാക്കുന്നു"</string>
<string name="force_resizable_activities" msgid="8615764378147824985">"വലിപ്പം മാറ്റാൻ പ്രവർത്തനങ്ങളെ നിർബന്ധിക്കുക"</string>
diff --git a/packages/SettingsLib/res/values-mn/strings.xml b/packages/SettingsLib/res/values-mn/strings.xml
index 12c52812..f400f5a 100644
--- a/packages/SettingsLib/res/values-mn/strings.xml
+++ b/packages/SettingsLib/res/values-mn/strings.xml
@@ -272,6 +272,10 @@
<string name="app_process_limit_title" msgid="4280600650253107163">"Далд процессын хязгаар"</string>
<string name="show_all_anrs" msgid="28462979638729082">"Бүх ANRs харуулах"</string>
<string name="show_all_anrs_summary" msgid="641908614413544127">"Далд апп-уудад Апп Хариу Өгөхгүй байна гэснийг харуулах"</string>
+ <!-- no translation found for show_notification_channel_warnings (1399948193466922683) -->
+ <skip />
+ <!-- no translation found for show_notification_channel_warnings_summary (5536803251863694895) -->
+ <skip />
<string name="force_allow_on_external" msgid="3215759785081916381">"Аппыг гадаад санах ойд хадгалахыг зөвшөөрөх"</string>
<string name="force_allow_on_external_summary" msgid="3640752408258034689">"Манифест утгыг нь үл хамааран дурын апп-г гадаад санах ойд бичих боломжтой болгодог"</string>
<string name="force_resizable_activities" msgid="8615764378147824985">"Үйл ажиллагааны хэмжээг өөрчилж болохуйц болгох"</string>
diff --git a/packages/SettingsLib/res/values-mr/strings.xml b/packages/SettingsLib/res/values-mr/strings.xml
index a45648e..10632e0 100644
--- a/packages/SettingsLib/res/values-mr/strings.xml
+++ b/packages/SettingsLib/res/values-mr/strings.xml
@@ -272,6 +272,10 @@
<string name="app_process_limit_title" msgid="4280600650253107163">"पार्श्वभूमी प्रक्रिया मर्यादा"</string>
<string name="show_all_anrs" msgid="28462979638729082">"सर्व ANR दर्शवा"</string>
<string name="show_all_anrs_summary" msgid="641908614413544127">"पार्श्वभूमी अॅप्ससाठी अॅप प्रतिसाद देत नाही संवाद दर्शवा"</string>
+ <!-- no translation found for show_notification_channel_warnings (1399948193466922683) -->
+ <skip />
+ <!-- no translation found for show_notification_channel_warnings_summary (5536803251863694895) -->
+ <skip />
<string name="force_allow_on_external" msgid="3215759785081916381">"बाह्यवर अॅप्सना अनुमती देण्याची सक्ती करा"</string>
<string name="force_allow_on_external_summary" msgid="3640752408258034689">"मॅनिफेस्ट मूल्यांकडे दुर्लक्ष करून, कोणत्याही अॅपला बाह्य संचयनावर लेखन केले जाण्यासाठी पात्र बनविते"</string>
<string name="force_resizable_activities" msgid="8615764378147824985">"क्रियाकलापाचा आकार बदलण्यायोग्य होण्याची सक्ती करा"</string>
diff --git a/packages/SettingsLib/res/values-ms/strings.xml b/packages/SettingsLib/res/values-ms/strings.xml
index 6ca514b..cc6a935 100644
--- a/packages/SettingsLib/res/values-ms/strings.xml
+++ b/packages/SettingsLib/res/values-ms/strings.xml
@@ -272,6 +272,10 @@
<string name="app_process_limit_title" msgid="4280600650253107163">"Had proses latar belakang"</string>
<string name="show_all_anrs" msgid="28462979638729082">"Tunjukkan semua ANR"</string>
<string name="show_all_anrs_summary" msgid="641908614413544127">"Tunjukkan dialog Aplikasi Tidak Memberi Maklum Balas untuk aplikasi latar belakang"</string>
+ <!-- no translation found for show_notification_channel_warnings (1399948193466922683) -->
+ <skip />
+ <!-- no translation found for show_notification_channel_warnings_summary (5536803251863694895) -->
+ <skip />
<string name="force_allow_on_external" msgid="3215759785081916381">"Benarkan apl secara paksa pada storan luaran"</string>
<string name="force_allow_on_external_summary" msgid="3640752408258034689">"Menjadikan sebarang apl layak ditulis ke storan luaran, tanpa mengambil kira nilai manifes"</string>
<string name="force_resizable_activities" msgid="8615764378147824985">"Paksa aktiviti supaya boleh diubah saiz"</string>
diff --git a/packages/SettingsLib/res/values-my/strings.xml b/packages/SettingsLib/res/values-my/strings.xml
index c2e8a94..3e718006 100644
--- a/packages/SettingsLib/res/values-my/strings.xml
+++ b/packages/SettingsLib/res/values-my/strings.xml
@@ -272,6 +272,10 @@
<string name="app_process_limit_title" msgid="4280600650253107163">"နောက်ခံလုပ်ငန်းစဉ်ကန့်သတ်ခြင်း"</string>
<string name="show_all_anrs" msgid="28462979638729082">"ANRsအားလုံးအား ပြသရန်"</string>
<string name="show_all_anrs_summary" msgid="641908614413544127">"နောက်ခံအပ်ပလီကေးရှင်းအတွက်တုံ့ပြန်မှုမရှိပြရန်"</string>
+ <!-- no translation found for show_notification_channel_warnings (1399948193466922683) -->
+ <skip />
+ <!-- no translation found for show_notification_channel_warnings_summary (5536803251863694895) -->
+ <skip />
<string name="force_allow_on_external" msgid="3215759785081916381">"အပြင်မှာ အတင်း ခွင့်ပြုရန်"</string>
<string name="force_allow_on_external_summary" msgid="3640752408258034689">"တိကျစွာ သတ်မှတ်ထားသည့်တန်ဖိုးများရှိသော်လည်း၊ ပြင်ပသိုလှောင်ခန်းများသို့ မည်သည့်အက်ပ်ကိုမဆို ဝင်ရောက်ခွင့်ပြုပါ"</string>
<string name="force_resizable_activities" msgid="8615764378147824985">"လုပ်ဆောင်ချက်များ ဆိုက်ညှိရနိုင်ရန် လုပ်ခိုင်းပါ"</string>
diff --git a/packages/SettingsLib/res/values-nb/strings.xml b/packages/SettingsLib/res/values-nb/strings.xml
index 409ccab..61ce9cb 100644
--- a/packages/SettingsLib/res/values-nb/strings.xml
+++ b/packages/SettingsLib/res/values-nb/strings.xml
@@ -272,6 +272,10 @@
<string name="app_process_limit_title" msgid="4280600650253107163">"Bakgrunnsprosessgrense"</string>
<string name="show_all_anrs" msgid="28462979638729082">"Vis alle ANR-er"</string>
<string name="show_all_anrs_summary" msgid="641908614413544127">"Vis Appen svarer ikke-dialog for bakgrunnsapper"</string>
+ <!-- no translation found for show_notification_channel_warnings (1399948193466922683) -->
+ <skip />
+ <!-- no translation found for show_notification_channel_warnings_summary (5536803251863694895) -->
+ <skip />
<string name="force_allow_on_external" msgid="3215759785081916381">"Tving frem tillatelse for ekstern lagring av apper"</string>
<string name="force_allow_on_external_summary" msgid="3640752408258034689">"Dette gjør at alle apper kan lagres på eksterne lagringsmedier – uavhengig av manifestverdier"</string>
<string name="force_resizable_activities" msgid="8615764378147824985">"Tving aktiviteter til å kunne endre størrelse"</string>
diff --git a/packages/SettingsLib/res/values-ne/strings.xml b/packages/SettingsLib/res/values-ne/strings.xml
index 2f61e8c..e87cf2f 100644
--- a/packages/SettingsLib/res/values-ne/strings.xml
+++ b/packages/SettingsLib/res/values-ne/strings.xml
@@ -272,6 +272,10 @@
<string name="app_process_limit_title" msgid="4280600650253107163">"पृष्ठभूमि प्रक्रिया सीमा"</string>
<string name="show_all_anrs" msgid="28462979638729082">"सबै ANRs देखाउनुहोस्"</string>
<string name="show_all_anrs_summary" msgid="641908614413544127">"पृष्ठभूमि अनुप्रयोगका लागि जवाफ नदिइरहेका अनुप्रयोगहरू देखाउनुहोस्"</string>
+ <!-- no translation found for show_notification_channel_warnings (1399948193466922683) -->
+ <skip />
+ <!-- no translation found for show_notification_channel_warnings_summary (5536803251863694895) -->
+ <skip />
<string name="force_allow_on_external" msgid="3215759785081916381">"बाह्यमा बल प्रयोगको अनुमति प्राप्त अनुप्रयोगहरू"</string>
<string name="force_allow_on_external_summary" msgid="3640752408258034689">"म्यानिफेेस्टका मानहरूको ख्याल नगरी कुनै पनि अनुप्रयोगलाई बाह्य भण्डारणमा लेख्न सकिने खाले बनाउँछ"</string>
<string name="force_resizable_activities" msgid="8615764378147824985">"गतिविधिहरू रिसाइज गर्नको लागि बाध्य गर्नुहोस्"</string>
diff --git a/packages/SettingsLib/res/values-nl/strings.xml b/packages/SettingsLib/res/values-nl/strings.xml
index 77e311e..b98ea2b 100644
--- a/packages/SettingsLib/res/values-nl/strings.xml
+++ b/packages/SettingsLib/res/values-nl/strings.xml
@@ -272,6 +272,10 @@
<string name="app_process_limit_title" msgid="4280600650253107163">"Achtergrondproceslimiet"</string>
<string name="show_all_anrs" msgid="28462979638729082">"Alle ANR\'s weergeven"</string>
<string name="show_all_anrs_summary" msgid="641908614413544127">"\'App reageert niet\' weerg. voor apps op achtergr."</string>
+ <!-- no translation found for show_notification_channel_warnings (1399948193466922683) -->
+ <skip />
+ <!-- no translation found for show_notification_channel_warnings_summary (5536803251863694895) -->
+ <skip />
<string name="force_allow_on_external" msgid="3215759785081916381">"Toestaan van apps op externe opslag afdwingen"</string>
<string name="force_allow_on_external_summary" msgid="3640752408258034689">"Hiermee komt elke app in aanmerking voor schrijven naar externe opslag, ongeacht de manifestwaarden"</string>
<string name="force_resizable_activities" msgid="8615764378147824985">"Formaat activiteiten geforceerd aanpasbaar maken"</string>
diff --git a/packages/SettingsLib/res/values-pa/strings.xml b/packages/SettingsLib/res/values-pa/strings.xml
index 8534e856..08dd09d 100644
--- a/packages/SettingsLib/res/values-pa/strings.xml
+++ b/packages/SettingsLib/res/values-pa/strings.xml
@@ -272,6 +272,10 @@
<string name="app_process_limit_title" msgid="4280600650253107163">"ਪਿਛੋਕੜ ਪ੍ਰਕਿਰਿਆ ਸੀਮਾ"</string>
<string name="show_all_anrs" msgid="28462979638729082">"ਸਾਰੇ ANR ਦਿਖਾਓ"</string>
<string name="show_all_anrs_summary" msgid="641908614413544127">"ਪਿਛੋਕੜ ਐਪਸ ਲਈ ਐਪਸ ਜਵਾਬ ਨਹੀਂ ਦੇ ਰਹੇ ਡਾਇਲੌਗ ਦਿਖਾਓ"</string>
+ <!-- no translation found for show_notification_channel_warnings (1399948193466922683) -->
+ <skip />
+ <!-- no translation found for show_notification_channel_warnings_summary (5536803251863694895) -->
+ <skip />
<string name="force_allow_on_external" msgid="3215759785081916381">"ਐਪਸ ਨੂੰ ਬਾਹਰਲੇ ਤੇ ਜ਼ਬਰਦਸਤੀ ਆਗਿਆ ਦਿਓ"</string>
<string name="force_allow_on_external_summary" msgid="3640752408258034689">"ਮੈਨੀਫੈਸਟ ਮੁੱਲਾਂ ਦੀ ਪਰਵਾਹ ਕੀਤੇ ਬਿਨਾਂ, ਕਿਸੇ ਵੀ ਐਪ ਨੂੰ ਬਾਹਰੀ ਸਟੋਰੇਜ \'ਤੇ ਲਿਖਣ ਦੇ ਯੋਗ ਬਣਾਉਂਦੀ ਹੈ"</string>
<string name="force_resizable_activities" msgid="8615764378147824985">"ਮੁੜ-ਆਕਾਰ ਬਦਲਣ ਲਈ ਸਰਗਰਮੀਆਂ \'ਤੇ ਜ਼ੋਰ ਦਿਓ"</string>
diff --git a/packages/SettingsLib/res/values-pl/strings.xml b/packages/SettingsLib/res/values-pl/strings.xml
index 7624042..e559c69 100644
--- a/packages/SettingsLib/res/values-pl/strings.xml
+++ b/packages/SettingsLib/res/values-pl/strings.xml
@@ -272,6 +272,10 @@
<string name="app_process_limit_title" msgid="4280600650253107163">"Limit procesów w tle"</string>
<string name="show_all_anrs" msgid="28462979638729082">"Pokaż wszystkie ANR"</string>
<string name="show_all_anrs_summary" msgid="641908614413544127">"Pokaż okno Aplikacja Nie Reaguje dla aplikacji w tle"</string>
+ <!-- no translation found for show_notification_channel_warnings (1399948193466922683) -->
+ <skip />
+ <!-- no translation found for show_notification_channel_warnings_summary (5536803251863694895) -->
+ <skip />
<string name="force_allow_on_external" msgid="3215759785081916381">"Wymuś zezwalanie na aplikacje w pamięci zewn."</string>
<string name="force_allow_on_external_summary" msgid="3640752408258034689">"Pozwala na zapis aplikacji w pamięci zewnętrznej niezależnie od wartości w pliku manifestu"</string>
<string name="force_resizable_activities" msgid="8615764378147824985">"Wymuś zmianę rozmiaru okien aktywności"</string>
diff --git a/packages/SettingsLib/res/values-pt-rBR/strings.xml b/packages/SettingsLib/res/values-pt-rBR/strings.xml
index 80b8990..cce80ed 100644
--- a/packages/SettingsLib/res/values-pt-rBR/strings.xml
+++ b/packages/SettingsLib/res/values-pt-rBR/strings.xml
@@ -272,6 +272,10 @@
<string name="app_process_limit_title" msgid="4280600650253107163">"Limite do proc. 2º plano"</string>
<string name="show_all_anrs" msgid="28462979638729082">"Mostrar todos os ANRS"</string>
<string name="show_all_anrs_summary" msgid="641908614413544127">"Exibir \"App não responde\" para app em 2º plano"</string>
+ <!-- no translation found for show_notification_channel_warnings (1399948193466922683) -->
+ <skip />
+ <!-- no translation found for show_notification_channel_warnings_summary (5536803251863694895) -->
+ <skip />
<string name="force_allow_on_external" msgid="3215759785081916381">"Forçar permissão de apps em armazenamento externo"</string>
<string name="force_allow_on_external_summary" msgid="3640752408258034689">"Qualifica apps para gravação em armazenamento externo, independentemente de valores de manifestos"</string>
<string name="force_resizable_activities" msgid="8615764378147824985">"Forçar atividades a serem redimensionáveis"</string>
diff --git a/packages/SettingsLib/res/values-pt-rPT/strings.xml b/packages/SettingsLib/res/values-pt-rPT/strings.xml
index 0059cdd..8124c4b 100644
--- a/packages/SettingsLib/res/values-pt-rPT/strings.xml
+++ b/packages/SettingsLib/res/values-pt-rPT/strings.xml
@@ -272,6 +272,10 @@
<string name="app_process_limit_title" msgid="4280600650253107163">"Limite proc. em 2º plano"</string>
<string name="show_all_anrs" msgid="28462979638729082">"Mostrar todos os ANR"</string>
<string name="show_all_anrs_summary" msgid="641908614413544127">"Mostrar erro \"Aplic. não Resp.\" p/ aplic. 2º plano"</string>
+ <!-- no translation found for show_notification_channel_warnings (1399948193466922683) -->
+ <skip />
+ <!-- no translation found for show_notification_channel_warnings_summary (5536803251863694895) -->
+ <skip />
<string name="force_allow_on_external" msgid="3215759785081916381">"Forçar perm. de aplicações no armazenamento ext."</string>
<string name="force_allow_on_external_summary" msgid="3640752408258034689">"Torna qualquer aplicação elegível para ser gravada no armazenamento externo, independentemente dos valores do manifesto"</string>
<string name="force_resizable_activities" msgid="8615764378147824985">"Forçar as atividades a serem redimensionáveis"</string>
diff --git a/packages/SettingsLib/res/values-pt/strings.xml b/packages/SettingsLib/res/values-pt/strings.xml
index 80b8990..cce80ed 100644
--- a/packages/SettingsLib/res/values-pt/strings.xml
+++ b/packages/SettingsLib/res/values-pt/strings.xml
@@ -272,6 +272,10 @@
<string name="app_process_limit_title" msgid="4280600650253107163">"Limite do proc. 2º plano"</string>
<string name="show_all_anrs" msgid="28462979638729082">"Mostrar todos os ANRS"</string>
<string name="show_all_anrs_summary" msgid="641908614413544127">"Exibir \"App não responde\" para app em 2º plano"</string>
+ <!-- no translation found for show_notification_channel_warnings (1399948193466922683) -->
+ <skip />
+ <!-- no translation found for show_notification_channel_warnings_summary (5536803251863694895) -->
+ <skip />
<string name="force_allow_on_external" msgid="3215759785081916381">"Forçar permissão de apps em armazenamento externo"</string>
<string name="force_allow_on_external_summary" msgid="3640752408258034689">"Qualifica apps para gravação em armazenamento externo, independentemente de valores de manifestos"</string>
<string name="force_resizable_activities" msgid="8615764378147824985">"Forçar atividades a serem redimensionáveis"</string>
diff --git a/packages/SettingsLib/res/values-ro/strings.xml b/packages/SettingsLib/res/values-ro/strings.xml
index 0ae7049..3a174de 100644
--- a/packages/SettingsLib/res/values-ro/strings.xml
+++ b/packages/SettingsLib/res/values-ro/strings.xml
@@ -272,6 +272,10 @@
<string name="app_process_limit_title" msgid="4280600650253107163">"Limită procese fundal"</string>
<string name="show_all_anrs" msgid="28462979638729082">"Afișați toate elem. ANR"</string>
<string name="show_all_anrs_summary" msgid="641908614413544127">"Aplicații din fundal: afișați Aplicația nu răspunde"</string>
+ <!-- no translation found for show_notification_channel_warnings (1399948193466922683) -->
+ <skip />
+ <!-- no translation found for show_notification_channel_warnings_summary (5536803251863694895) -->
+ <skip />
<string name="force_allow_on_external" msgid="3215759785081916381">"Forțați accesul aplicațiilor la stocarea externă"</string>
<string name="force_allow_on_external_summary" msgid="3640752408258034689">"Face orice aplicație eligibilă să fie scrisă în stocarea externă, indiferent de valorile manifestului"</string>
<string name="force_resizable_activities" msgid="8615764378147824985">"Forțați redimensionarea activităților"</string>
diff --git a/packages/SettingsLib/res/values-ru/strings.xml b/packages/SettingsLib/res/values-ru/strings.xml
index cc82236..cd8d956 100644
--- a/packages/SettingsLib/res/values-ru/strings.xml
+++ b/packages/SettingsLib/res/values-ru/strings.xml
@@ -272,6 +272,10 @@
<string name="app_process_limit_title" msgid="4280600650253107163">"Лимит фоновых процессов"</string>
<string name="show_all_anrs" msgid="28462979638729082">"Все ANR"</string>
<string name="show_all_anrs_summary" msgid="641908614413544127">"Уведомлять о том, что приложение не отвечает"</string>
+ <!-- no translation found for show_notification_channel_warnings (1399948193466922683) -->
+ <skip />
+ <!-- no translation found for show_notification_channel_warnings_summary (5536803251863694895) -->
+ <skip />
<string name="force_allow_on_external" msgid="3215759785081916381">"Разрешить сохранение на внешние накопители"</string>
<string name="force_allow_on_external_summary" msgid="3640752408258034689">"Разрешить сохранение приложений на внешних накопителях (независимо от значений в манифесте)"</string>
<string name="force_resizable_activities" msgid="8615764378147824985">"Изменение размера в многооконном режиме"</string>
diff --git a/packages/SettingsLib/res/values-si/strings.xml b/packages/SettingsLib/res/values-si/strings.xml
index 1623308..592c2f9 100644
--- a/packages/SettingsLib/res/values-si/strings.xml
+++ b/packages/SettingsLib/res/values-si/strings.xml
@@ -272,6 +272,10 @@
<string name="app_process_limit_title" msgid="4280600650253107163">"පසුබිම් ක්රියාවලි සීමාව"</string>
<string name="show_all_anrs" msgid="28462979638729082">"සියලුම ANR පෙන්වන්න"</string>
<string name="show_all_anrs_summary" msgid="641908614413544127">"පසුබිම් යෙදුම් වලට යෙදුම ප්රතිචාර නොදක්වයි කවුළුව පෙන්වන්න"</string>
+ <!-- no translation found for show_notification_channel_warnings (1399948193466922683) -->
+ <skip />
+ <!-- no translation found for show_notification_channel_warnings_summary (5536803251863694895) -->
+ <skip />
<string name="force_allow_on_external" msgid="3215759785081916381">"බාහිර මත යෙදුම් ඉඩ දීම බල කරන්න"</string>
<string name="force_allow_on_external_summary" msgid="3640752408258034689">"මැනිෆෙස්ට් අගයන් නොසලකා, ඕනෑම යෙදුමක් බාහිර ගබඩාවට ලිවීමට සුදුසුකම් ලබා දෙයි"</string>
<string name="force_resizable_activities" msgid="8615764378147824985">"ක්රියාකාරකම් ප්රතිප්රමාණ කළ හැකි බවට බල කරන්න"</string>
diff --git a/packages/SettingsLib/res/values-sk/strings.xml b/packages/SettingsLib/res/values-sk/strings.xml
index 028d561..d5c4061 100644
--- a/packages/SettingsLib/res/values-sk/strings.xml
+++ b/packages/SettingsLib/res/values-sk/strings.xml
@@ -272,6 +272,10 @@
<string name="app_process_limit_title" msgid="4280600650253107163">"Limit procesov na pozadí"</string>
<string name="show_all_anrs" msgid="28462979638729082">"Zobrazovať všetky ANR"</string>
<string name="show_all_anrs_summary" msgid="641908614413544127">"Zobrazovať dialóg „Aplikácia neodpovedá“ aj pre aplikácie na pozadí"</string>
+ <!-- no translation found for show_notification_channel_warnings (1399948193466922683) -->
+ <skip />
+ <!-- no translation found for show_notification_channel_warnings_summary (5536803251863694895) -->
+ <skip />
<string name="force_allow_on_external" msgid="3215759785081916381">"Vynútiť povolenie aplikácií na externom úložisku"</string>
<string name="force_allow_on_external_summary" msgid="3640752408258034689">"Umožňuje zapísať akúkoľvek aplikáciu do externého úložiska bez ohľadu na hodnoty v manifeste"</string>
<string name="force_resizable_activities" msgid="8615764378147824985">"Vynútiť možnosť zmeny veľkosti aktivít"</string>
diff --git a/packages/SettingsLib/res/values-sl/strings.xml b/packages/SettingsLib/res/values-sl/strings.xml
index 085621a..4e0085c 100644
--- a/packages/SettingsLib/res/values-sl/strings.xml
+++ b/packages/SettingsLib/res/values-sl/strings.xml
@@ -272,6 +272,10 @@
<string name="app_process_limit_title" msgid="4280600650253107163">"Omejitev postopkov v ozadju"</string>
<string name="show_all_anrs" msgid="28462979638729082">"Pokaži okna neodzivanj"</string>
<string name="show_all_anrs_summary" msgid="641908614413544127">"Prikaz pogovornega okna za neodzivanje aplikacije v ozadju"</string>
+ <!-- no translation found for show_notification_channel_warnings (1399948193466922683) -->
+ <skip />
+ <!-- no translation found for show_notification_channel_warnings_summary (5536803251863694895) -->
+ <skip />
<string name="force_allow_on_external" msgid="3215759785081916381">"Vsili omogočanje aplikacij v zunanji shrambi"</string>
<string name="force_allow_on_external_summary" msgid="3640752408258034689">"Poskrbi, da je ne glede na vrednosti v manifestu mogoče vsako aplikacijo zapisati v zunanjo shrambo"</string>
<string name="force_resizable_activities" msgid="8615764378147824985">"Vsili povečanje velikosti za aktivnosti"</string>
diff --git a/packages/SettingsLib/res/values-sq/strings.xml b/packages/SettingsLib/res/values-sq/strings.xml
index c9398a5..e8340bf 100644
--- a/packages/SettingsLib/res/values-sq/strings.xml
+++ b/packages/SettingsLib/res/values-sq/strings.xml
@@ -272,6 +272,10 @@
<string name="app_process_limit_title" msgid="4280600650253107163">"Kufizimi i proceseve në sfond"</string>
<string name="show_all_anrs" msgid="28462979638729082">"Shfaq raportet ANR"</string>
<string name="show_all_anrs_summary" msgid="641908614413544127">"Shfaq raportet ANR (Aplikacioni nuk përgjigjet) për aplikacionet në sfond"</string>
+ <!-- no translation found for show_notification_channel_warnings (1399948193466922683) -->
+ <skip />
+ <!-- no translation found for show_notification_channel_warnings_summary (5536803251863694895) -->
+ <skip />
<string name="force_allow_on_external" msgid="3215759785081916381">"Detyro lejimin në hapësirën e jashtme"</string>
<string name="force_allow_on_external_summary" msgid="3640752408258034689">"Bën që çdo aplikacion të jetë i përshtatshëm për t\'u shkruar në hapësirën ruajtëse të jashtme, pavarësisht nga vlerat e manifestit"</string>
<string name="force_resizable_activities" msgid="8615764378147824985">"Detyro madhësinë e ndryshueshme për aktivitetet"</string>
diff --git a/packages/SettingsLib/res/values-sr/strings.xml b/packages/SettingsLib/res/values-sr/strings.xml
index 15ba747..63ceb73 100644
--- a/packages/SettingsLib/res/values-sr/strings.xml
+++ b/packages/SettingsLib/res/values-sr/strings.xml
@@ -272,6 +272,10 @@
<string name="app_process_limit_title" msgid="4280600650253107163">"Ограничење позадинских процеса"</string>
<string name="show_all_anrs" msgid="28462979638729082">"Прикажи све ANR-ове"</string>
<string name="show_all_anrs_summary" msgid="641908614413544127">"Прикажи дијалог Апликација не реагује за апликације у позадини"</string>
+ <!-- no translation found for show_notification_channel_warnings (1399948193466922683) -->
+ <skip />
+ <!-- no translation found for show_notification_channel_warnings_summary (5536803251863694895) -->
+ <skip />
<string name="force_allow_on_external" msgid="3215759785081916381">"Принудно дозволи апликације у спољној"</string>
<string name="force_allow_on_external_summary" msgid="3640752408258034689">"Омогућава уписивање свих апликација у спољну меморију, без обзира на вредности манифеста"</string>
<string name="force_resizable_activities" msgid="8615764378147824985">"Принудно омогући промену величине активности"</string>
diff --git a/packages/SettingsLib/res/values-sv/strings.xml b/packages/SettingsLib/res/values-sv/strings.xml
index cfae5ae..1f2ca23 100644
--- a/packages/SettingsLib/res/values-sv/strings.xml
+++ b/packages/SettingsLib/res/values-sv/strings.xml
@@ -272,6 +272,10 @@
<string name="app_process_limit_title" msgid="4280600650253107163">"Begränsa bakgrundsprocess"</string>
<string name="show_all_anrs" msgid="28462979638729082">"Visa alla som inte svarar"</string>
<string name="show_all_anrs_summary" msgid="641908614413544127">"Visa dialogrutan om att appen inte svarar för bakgrundsappar"</string>
+ <!-- no translation found for show_notification_channel_warnings (1399948193466922683) -->
+ <skip />
+ <!-- no translation found for show_notification_channel_warnings_summary (5536803251863694895) -->
+ <skip />
<string name="force_allow_on_external" msgid="3215759785081916381">"Tillåt appar i externt lagringsutrymme"</string>
<string name="force_allow_on_external_summary" msgid="3640752408258034689">"Allar appar kan skrivas till extern lagring, oavsett manifestvärden"</string>
<string name="force_resizable_activities" msgid="8615764378147824985">"Framtvinga storleksanpassning för aktiviteter"</string>
diff --git a/packages/SettingsLib/res/values-sw/strings.xml b/packages/SettingsLib/res/values-sw/strings.xml
index ef43134..4d75fbc 100644
--- a/packages/SettingsLib/res/values-sw/strings.xml
+++ b/packages/SettingsLib/res/values-sw/strings.xml
@@ -234,7 +234,7 @@
<string name="debug_monitoring_category" msgid="7640508148375798343">"Ufuatiliaji"</string>
<string name="strict_mode" msgid="1938795874357830695">"Modi makinifu imewezeshwa"</string>
<string name="strict_mode_summary" msgid="142834318897332338">"Mulika skrini wakati programu zinafanya uendeshaji mrefu kwenye mnyororo mkuu"</string>
- <string name="pointer_location" msgid="6084434787496938001">"Mahali pa pointa"</string>
+ <string name="pointer_location" msgid="6084434787496938001">"Mahali pa kiashiria"</string>
<string name="pointer_location_summary" msgid="840819275172753713">"Kuegeshwa kwa skrini ikionyesha data ya mguso ya sasa"</string>
<string name="show_touches" msgid="2642976305235070316">"Onyesha unapogonga"</string>
<string name="show_touches_summary" msgid="6101183132903926324">"Onyesha maoni ya picha unapogonga"</string>
@@ -272,6 +272,10 @@
<string name="app_process_limit_title" msgid="4280600650253107163">"Kiwango cha mchakato wa mandari nyuma"</string>
<string name="show_all_anrs" msgid="28462979638729082">"Onyesha ANR zote"</string>
<string name="show_all_anrs_summary" msgid="641908614413544127">"Onyesha kisanduku kidadisi cha Programu Haiitikii kwa programu za usuli"</string>
+ <!-- no translation found for show_notification_channel_warnings (1399948193466922683) -->
+ <skip />
+ <!-- no translation found for show_notification_channel_warnings_summary (5536803251863694895) -->
+ <skip />
<string name="force_allow_on_external" msgid="3215759785081916381">"Lazima uruhusu programu kwenye hifadhi ya nje"</string>
<string name="force_allow_on_external_summary" msgid="3640752408258034689">"Huruhusu programu yoyote iwekwe kwenye hifadhi ya nje, bila kujali thamani za faili ya maelezo"</string>
<string name="force_resizable_activities" msgid="8615764378147824985">"Lazimisha shughuli ziweze kubadilishwa ukubwa"</string>
diff --git a/packages/SettingsLib/res/values-ta/strings.xml b/packages/SettingsLib/res/values-ta/strings.xml
index e09db51..47f7586 100644
--- a/packages/SettingsLib/res/values-ta/strings.xml
+++ b/packages/SettingsLib/res/values-ta/strings.xml
@@ -272,6 +272,10 @@
<string name="app_process_limit_title" msgid="4280600650253107163">"பின்புலச் செயல்முறை வரம்பு"</string>
<string name="show_all_anrs" msgid="28462979638729082">"எல்லா ANRகளையும் காட்டு"</string>
<string name="show_all_anrs_summary" msgid="641908614413544127">"பின்புலப் பயன்பாடுகளுக்குப் பயன்பாடு பதிலளிக்கவில்லை என்ற உரையாடலைக் காட்டு"</string>
+ <!-- no translation found for show_notification_channel_warnings (1399948193466922683) -->
+ <skip />
+ <!-- no translation found for show_notification_channel_warnings_summary (5536803251863694895) -->
+ <skip />
<string name="force_allow_on_external" msgid="3215759785081916381">"பயன்பாடுகளை வெளிப்புறச் சேமிப்பிடத்தில் அனுமதி"</string>
<string name="force_allow_on_external_summary" msgid="3640752408258034689">"மேனிஃபெஸ்ட் மதிப்புகளைப் பொருட்படுத்தாமல், எல்லா பயன்பாட்டையும் வெளிப்புறச் சேமிப்பிடத்தில் எழுத அனுமதிக்கும்"</string>
<string name="force_resizable_activities" msgid="8615764378147824985">"செயல்பாடுகளை அளவுமாறக்கூடியதாக அமை"</string>
diff --git a/packages/SettingsLib/res/values-te/strings.xml b/packages/SettingsLib/res/values-te/strings.xml
index dabf7ed..1a7ad4d 100644
--- a/packages/SettingsLib/res/values-te/strings.xml
+++ b/packages/SettingsLib/res/values-te/strings.xml
@@ -272,6 +272,10 @@
<string name="app_process_limit_title" msgid="4280600650253107163">"నేపథ్య ప్రాసెస్ పరిమితి"</string>
<string name="show_all_anrs" msgid="28462979638729082">"అన్ని ANRలను చూపు"</string>
<string name="show_all_anrs_summary" msgid="641908614413544127">"నేపథ్య అనువర్తనాల కోసం అనువర్తనం ప్రతిస్పందించడం లేదు డైలాగ్ను చూపు"</string>
+ <!-- no translation found for show_notification_channel_warnings (1399948193466922683) -->
+ <skip />
+ <!-- no translation found for show_notification_channel_warnings_summary (5536803251863694895) -->
+ <skip />
<string name="force_allow_on_external" msgid="3215759785081916381">"అనువర్తనాలను బాహ్య నిల్వలో నిర్బంధంగా అనుమతించు"</string>
<string name="force_allow_on_external_summary" msgid="3640752408258034689">"ఏ అనువర్తనాన్ని అయినా మానిఫెస్ట్ విలువలతో సంబంధం లేకుండా బాహ్య నిల్వలో వ్రాయడానికి అనుమతిస్తుంది"</string>
<string name="force_resizable_activities" msgid="8615764378147824985">"కార్యాచరణలను పరిమాణం మార్చగలిగేలా నిర్బంధించు"</string>
diff --git a/packages/SettingsLib/res/values-th/strings.xml b/packages/SettingsLib/res/values-th/strings.xml
index 9a265f5..aa0296c 100644
--- a/packages/SettingsLib/res/values-th/strings.xml
+++ b/packages/SettingsLib/res/values-th/strings.xml
@@ -272,6 +272,10 @@
<string name="app_process_limit_title" msgid="4280600650253107163">"ขีดจำกัดกระบวนการพื้นหลัง"</string>
<string name="show_all_anrs" msgid="28462979638729082">"แสดง ANR ทั้งหมด"</string>
<string name="show_all_anrs_summary" msgid="641908614413544127">"แสดงหน้าต่างแอปไม่ตอบสนอง สำหรับแอปพื้นหลัง"</string>
+ <!-- no translation found for show_notification_channel_warnings (1399948193466922683) -->
+ <skip />
+ <!-- no translation found for show_notification_channel_warnings_summary (5536803251863694895) -->
+ <skip />
<string name="force_allow_on_external" msgid="3215759785081916381">"บังคับให้แอปสามารถใช้ที่เก็บภายนอก"</string>
<string name="force_allow_on_external_summary" msgid="3640752408258034689">"ทำให้สามารถเขียนแอปใดๆ ก็ตามไปยังพื้นที่เก็บข้อมูลภายนอกได้ โดยไม่คำนึงถึงค่าในไฟล์ Manifest"</string>
<string name="force_resizable_activities" msgid="8615764378147824985">"บังคับให้กิจกรรมปรับขนาดได้"</string>
diff --git a/packages/SettingsLib/res/values-tl/strings.xml b/packages/SettingsLib/res/values-tl/strings.xml
index c46ac78..988a88b 100644
--- a/packages/SettingsLib/res/values-tl/strings.xml
+++ b/packages/SettingsLib/res/values-tl/strings.xml
@@ -272,6 +272,10 @@
<string name="app_process_limit_title" msgid="4280600650253107163">"Limitasyon ng proseso sa background"</string>
<string name="show_all_anrs" msgid="28462979638729082">"Ipakita ang lahat ng ANR"</string>
<string name="show_all_anrs_summary" msgid="641908614413544127">"App Not Responding dialog para sa background apps"</string>
+ <!-- no translation found for show_notification_channel_warnings (1399948193466922683) -->
+ <skip />
+ <!-- no translation found for show_notification_channel_warnings_summary (5536803251863694895) -->
+ <skip />
<string name="force_allow_on_external" msgid="3215759785081916381">"Pwersahang payagan ang mga app sa external"</string>
<string name="force_allow_on_external_summary" msgid="3640752408258034689">"Ginagawang kwalipikado ang anumang app na mailagay sa external na storage, anuman ang mga value ng manifest"</string>
<string name="force_resizable_activities" msgid="8615764378147824985">"Sapilitang gawing resizable ang mga aktibidad"</string>
diff --git a/packages/SettingsLib/res/values-tr/strings.xml b/packages/SettingsLib/res/values-tr/strings.xml
index 696b209..5eff6c3a 100644
--- a/packages/SettingsLib/res/values-tr/strings.xml
+++ b/packages/SettingsLib/res/values-tr/strings.xml
@@ -272,6 +272,10 @@
<string name="app_process_limit_title" msgid="4280600650253107163">"Arka plan işlem sınırı"</string>
<string name="show_all_anrs" msgid="28462979638729082">"Tüm ANR\'leri göster"</string>
<string name="show_all_anrs_summary" msgid="641908614413544127">"Arka plan uygulamalar için Uygulama Yanıt Vermiyor mesajını göster"</string>
+ <!-- no translation found for show_notification_channel_warnings (1399948193466922683) -->
+ <skip />
+ <!-- no translation found for show_notification_channel_warnings_summary (5536803251863694895) -->
+ <skip />
<string name="force_allow_on_external" msgid="3215759785081916381">"Harici birimdeki uygulamalara izin vermeye zorla"</string>
<string name="force_allow_on_external_summary" msgid="3640752408258034689">"Manifest değerlerinden bağımsız olarak uygulamaları harici depolamaya yazmak için uygun hale getirir"</string>
<string name="force_resizable_activities" msgid="8615764378147824985">"Etkinlikleri yeniden boyutlandırılabilmeye zorla"</string>
diff --git a/packages/SettingsLib/res/values-uk/strings.xml b/packages/SettingsLib/res/values-uk/strings.xml
index d3f137f..419a8c0 100644
--- a/packages/SettingsLib/res/values-uk/strings.xml
+++ b/packages/SettingsLib/res/values-uk/strings.xml
@@ -272,6 +272,10 @@
<string name="app_process_limit_title" msgid="4280600650253107163">"Обмеження фон. процесів"</string>
<string name="show_all_anrs" msgid="28462979638729082">"Показувати всі ANR"</string>
<string name="show_all_anrs_summary" msgid="641908614413544127">"Сповіщати, коли додаток не відповідає"</string>
+ <!-- no translation found for show_notification_channel_warnings (1399948193466922683) -->
+ <skip />
+ <!-- no translation found for show_notification_channel_warnings_summary (5536803251863694895) -->
+ <skip />
<string name="force_allow_on_external" msgid="3215759785081916381">"Примусово записувати додатки в зовнішню пам’ять"</string>
<string name="force_allow_on_external_summary" msgid="3640752408258034689">"Можна записувати додатки в зовнішню пам’ять, незалежно від значень у маніфесті"</string>
<string name="force_resizable_activities" msgid="8615764378147824985">"Примусово масштабувати активність"</string>
diff --git a/packages/SettingsLib/res/values-ur/strings.xml b/packages/SettingsLib/res/values-ur/strings.xml
index 3fceb98..55f7132 100644
--- a/packages/SettingsLib/res/values-ur/strings.xml
+++ b/packages/SettingsLib/res/values-ur/strings.xml
@@ -272,6 +272,10 @@
<string name="app_process_limit_title" msgid="4280600650253107163">"پس منظر پروسیس کی حد"</string>
<string name="show_all_anrs" msgid="28462979638729082">"سبھی ANRs کو دکھائیں"</string>
<string name="show_all_anrs_summary" msgid="641908614413544127">"پس منظر کی ایپس کیلئے ایپ جواب نہیں دے رہی ہے ڈائلاگ دکھائیں"</string>
+ <!-- no translation found for show_notification_channel_warnings (1399948193466922683) -->
+ <skip />
+ <!-- no translation found for show_notification_channel_warnings_summary (5536803251863694895) -->
+ <skip />
<string name="force_allow_on_external" msgid="3215759785081916381">"بیرونی پر ایپس کو زبردستی اجازت دیں"</string>
<string name="force_allow_on_external_summary" msgid="3640752408258034689">"manifest اقدار سے قطع نظر، کسی بھی ایپ کو بیرونی اسٹوریج پر لکھے جانے کا اہل بناتا ہے"</string>
<string name="force_resizable_activities" msgid="8615764378147824985">"سرگرمیوں کو ری سائز ایبل بنائیں"</string>
diff --git a/packages/SettingsLib/res/values-uz/strings.xml b/packages/SettingsLib/res/values-uz/strings.xml
index ad9dc3a..4b53da5 100644
--- a/packages/SettingsLib/res/values-uz/strings.xml
+++ b/packages/SettingsLib/res/values-uz/strings.xml
@@ -272,6 +272,10 @@
<string name="app_process_limit_title" msgid="4280600650253107163">"Fondagi jarayonlarni cheklash"</string>
<string name="show_all_anrs" msgid="28462979638729082">"Hamma ANR"</string>
<string name="show_all_anrs_summary" msgid="641908614413544127">"Ilova javob bermayotgani haqida xabar qilish"</string>
+ <!-- no translation found for show_notification_channel_warnings (1399948193466922683) -->
+ <skip />
+ <!-- no translation found for show_notification_channel_warnings_summary (5536803251863694895) -->
+ <skip />
<string name="force_allow_on_external" msgid="3215759785081916381">"Tashqi xotira qurilmasidagi ilova dasturlariga majburiy ruxsat berish"</string>
<string name="force_allow_on_external_summary" msgid="3640752408258034689">"Manifest qiymatidan qat’i nazar istalgan ilovani tashqi xotiraga saqlash imkonini beradi"</string>
<string name="force_resizable_activities" msgid="8615764378147824985">"Harakatlarni moslashuvchan o‘lchamga keltirish"</string>
diff --git a/packages/SettingsLib/res/values-vi/strings.xml b/packages/SettingsLib/res/values-vi/strings.xml
index 910e66c..a6a54d0 100644
--- a/packages/SettingsLib/res/values-vi/strings.xml
+++ b/packages/SettingsLib/res/values-vi/strings.xml
@@ -272,6 +272,10 @@
<string name="app_process_limit_title" msgid="4280600650253107163">"Giới hạn quá trình nền"</string>
<string name="show_all_anrs" msgid="28462979638729082">"Hiển thị tất cả ANR"</string>
<string name="show_all_anrs_summary" msgid="641908614413544127">"Hiện hộp thoại Ứng dụng ko đáp ứng cho ứng dụng nền"</string>
+ <!-- no translation found for show_notification_channel_warnings (1399948193466922683) -->
+ <skip />
+ <!-- no translation found for show_notification_channel_warnings_summary (5536803251863694895) -->
+ <skip />
<string name="force_allow_on_external" msgid="3215759785081916381">"Buộc cho phép các ứng dụng trên bộ nhớ ngoài"</string>
<string name="force_allow_on_external_summary" msgid="3640752408258034689">"Giúp mọi ứng dụng đủ điều kiện để được ghi vào bộ nhớ ngoài, bất kể giá trị tệp kê khai là gì"</string>
<string name="force_resizable_activities" msgid="8615764378147824985">"Buộc các hoạt động có thể thay đổi kích thước"</string>
diff --git a/packages/SettingsLib/res/values-zh-rCN/strings.xml b/packages/SettingsLib/res/values-zh-rCN/strings.xml
index b224c23..41c5f60 100644
--- a/packages/SettingsLib/res/values-zh-rCN/strings.xml
+++ b/packages/SettingsLib/res/values-zh-rCN/strings.xml
@@ -272,6 +272,10 @@
<string name="app_process_limit_title" msgid="4280600650253107163">"后台进程限制"</string>
<string name="show_all_anrs" msgid="28462979638729082">"显示所有“应用无响应”(ANR)"</string>
<string name="show_all_anrs_summary" msgid="641908614413544127">"为后台应用显示“应用无响应”对话框"</string>
+ <!-- no translation found for show_notification_channel_warnings (1399948193466922683) -->
+ <skip />
+ <!-- no translation found for show_notification_channel_warnings_summary (5536803251863694895) -->
+ <skip />
<string name="force_allow_on_external" msgid="3215759785081916381">"强制允许将应用写入外部存储设备"</string>
<string name="force_allow_on_external_summary" msgid="3640752408258034689">"允许将任何应用写入外部存储设备(无论清单值是什么)"</string>
<string name="force_resizable_activities" msgid="8615764378147824985">"强制将活动设为可调整大小"</string>
diff --git a/packages/SettingsLib/res/values-zh-rHK/strings.xml b/packages/SettingsLib/res/values-zh-rHK/strings.xml
index 03081af..00748b0 100644
--- a/packages/SettingsLib/res/values-zh-rHK/strings.xml
+++ b/packages/SettingsLib/res/values-zh-rHK/strings.xml
@@ -272,6 +272,10 @@
<string name="app_process_limit_title" msgid="4280600650253107163">"背景處理程序限制"</string>
<string name="show_all_anrs" msgid="28462979638729082">"顯示所有 ANR"</string>
<string name="show_all_anrs_summary" msgid="641908614413544127">"顯示背景應用程式的「應用程式無回應」對話框"</string>
+ <!-- no translation found for show_notification_channel_warnings (1399948193466922683) -->
+ <skip />
+ <!-- no translation found for show_notification_channel_warnings_summary (5536803251863694895) -->
+ <skip />
<string name="force_allow_on_external" msgid="3215759785081916381">"強制允許應用程式寫入到外部儲存空間"</string>
<string name="force_allow_on_external_summary" msgid="3640752408258034689">"在任何資訊清單值下,允許將所有符合資格的應用程式寫入到外部儲存完間"</string>
<string name="force_resizable_activities" msgid="8615764378147824985">"強制可變更活動尺寸"</string>
diff --git a/packages/SettingsLib/res/values-zh-rTW/strings.xml b/packages/SettingsLib/res/values-zh-rTW/strings.xml
index 050c556..3988edd 100644
--- a/packages/SettingsLib/res/values-zh-rTW/strings.xml
+++ b/packages/SettingsLib/res/values-zh-rTW/strings.xml
@@ -272,6 +272,10 @@
<string name="app_process_limit_title" msgid="4280600650253107163">"背景處理程序限制"</string>
<string name="show_all_anrs" msgid="28462979638729082">"顯示所有無回應程式"</string>
<string name="show_all_anrs_summary" msgid="641908614413544127">"為背景應用程式顯示「應用程式無回應」對話方塊"</string>
+ <!-- no translation found for show_notification_channel_warnings (1399948193466922683) -->
+ <skip />
+ <!-- no translation found for show_notification_channel_warnings_summary (5536803251863694895) -->
+ <skip />
<string name="force_allow_on_external" msgid="3215759785081916381">"強制允許將應用程式寫入外部儲存空間"</string>
<string name="force_allow_on_external_summary" msgid="3640752408258034689">"允許將任何應用程式寫入外部儲存空間 (無論資訊清單值為何)"</string>
<string name="force_resizable_activities" msgid="8615764378147824985">"將活動強制設為可調整大小"</string>
diff --git a/packages/SettingsLib/res/values-zu/strings.xml b/packages/SettingsLib/res/values-zu/strings.xml
index d2a5743..11dfdcc 100644
--- a/packages/SettingsLib/res/values-zu/strings.xml
+++ b/packages/SettingsLib/res/values-zu/strings.xml
@@ -272,6 +272,10 @@
<string name="app_process_limit_title" msgid="4280600650253107163">"Isilinganiso senqubo yesithombe sanemuva"</string>
<string name="show_all_anrs" msgid="28462979638729082">"Bonisa wonke ama-ANR"</string>
<string name="show_all_anrs_summary" msgid="641908614413544127">"Boniso idayalogi Yohlelo Lokusebenza Olungasabeli kwizinhlelo zokusebenza zasemuva"</string>
+ <!-- no translation found for show_notification_channel_warnings (1399948193466922683) -->
+ <skip />
+ <!-- no translation found for show_notification_channel_warnings_summary (5536803251863694895) -->
+ <skip />
<string name="force_allow_on_external" msgid="3215759785081916381">"Phoqelela ukuvumela izinhlelo zokusebenza ngaphandle"</string>
<string name="force_allow_on_external_summary" msgid="3640752408258034689">"Yenza noma uluphi uhlelo lokusebenza lifaneleke ukuthi libhalwe kusitoreji sangaphandle, ngaphandle kwamavelu we-manifest"</string>
<string name="force_resizable_activities" msgid="8615764378147824985">"Imisebenzi yamandla izonikezwa usayizi omusha"</string>
diff --git a/packages/SettingsLib/res/values/strings.xml b/packages/SettingsLib/res/values/strings.xml
index 044392c..4921be1 100644
--- a/packages/SettingsLib/res/values/strings.xml
+++ b/packages/SettingsLib/res/values/strings.xml
@@ -684,6 +684,12 @@
<string name="show_all_anrs_summary">Show App Not Responding dialog
for background apps</string>
+ <!-- UI debug setting: show all ANRs? [CHAR LIMIT=25] -->
+ <string name="show_notification_channel_warnings">Show notification channel warnings</string>
+ <!-- UI debug setting: show all ANRs summary [CHAR LIMIT=50] -->
+ <string name="show_notification_channel_warnings_summary">Displays on-screen warning when an app posts a notification without a valid channel</string>
+
+
<!-- UI debug setting: force allow apps on external storage [CHAR LIMIT=50] -->
<string name="force_allow_on_external">Force allow apps on external</string>
<!-- UI debug setting: force allow on external summary [CHAR LIMIT=150] -->
diff --git a/packages/SettingsLib/src/com/android/settingslib/SecureTouchListener.java b/packages/SettingsLib/src/com/android/settingslib/SecureTouchListener.java
deleted file mode 100644
index d9f4c44..0000000
--- a/packages/SettingsLib/src/com/android/settingslib/SecureTouchListener.java
+++ /dev/null
@@ -1,60 +0,0 @@
-/*
- * Copyright (C) 2017 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.settingslib;
-
-import android.os.SystemClock;
-import android.view.MotionEvent;
-import android.view.View;
-import android.widget.Toast;
-
-/**
- * A touch listener which consumes touches when another window is partly or wholly obscuring the
- * window containing the view this listener is attached to.
- * Optionally accepts a string to show the user as a toast when consuming an insecure touch
- */
-public class SecureTouchListener implements View.OnTouchListener {
-
- private static final long TAP_DEBOUNCE_TIME = 2000;
- private long mLastToastTime = 0;
- private String mWarningText;
-
- public SecureTouchListener() {
- this(null);
- }
-
- public SecureTouchListener(String warningText) {
- mWarningText = warningText;
- }
-
- @Override
- public boolean onTouch(View v, MotionEvent event) {
- if ((event.getFlags() & MotionEvent.FLAG_WINDOW_IS_OBSCURED) != 0
- || (event.getFlags() & MotionEvent.FLAG_WINDOW_IS_PARTIALLY_OBSCURED) != 0) {
- if (mWarningText != null) {
- // Show a toast warning the user
- final long currentTime = SystemClock.uptimeMillis();
- if (currentTime - mLastToastTime > TAP_DEBOUNCE_TIME) {
- mLastToastTime = currentTime;
- Toast.makeText(v.getContext(), mWarningText, Toast.LENGTH_SHORT).show();
- }
- }
- // Consume the touch event
- return true;
- }
- return false;
- }
-}
diff --git a/packages/SettingsLib/src/com/android/settingslib/applications/StorageStatsSource.java b/packages/SettingsLib/src/com/android/settingslib/applications/StorageStatsSource.java
index 34fdc9d..a8f6f02 100644
--- a/packages/SettingsLib/src/com/android/settingslib/applications/StorageStatsSource.java
+++ b/packages/SettingsLib/src/com/android/settingslib/applications/StorageStatsSource.java
@@ -63,15 +63,17 @@
public long audioBytes;
public long videoBytes;
public long imageBytes;
+ public long appBytes;
/** Convenience method for testing. */
@VisibleForTesting
public ExternalStorageStats(
- long totalBytes, long audioBytes, long videoBytes, long imageBytes) {
+ long totalBytes, long audioBytes, long videoBytes, long imageBytes, long appBytes) {
this.totalBytes = totalBytes;
this.audioBytes = audioBytes;
this.videoBytes = videoBytes;
this.imageBytes = imageBytes;
+ this.appBytes = appBytes;
}
/**
@@ -84,6 +86,7 @@
audioBytes = stats.getAudioBytes();
videoBytes = stats.getVideoBytes();
imageBytes = stats.getImageBytes();
+ appBytes = stats.getAppBytes();
}
}
diff --git a/packages/SettingsLib/src/com/android/settingslib/graph/BatteryMeterDrawableBase.java b/packages/SettingsLib/src/com/android/settingslib/graph/BatteryMeterDrawableBase.java
index 3a2397f..3d50f23 100755
--- a/packages/SettingsLib/src/com/android/settingslib/graph/BatteryMeterDrawableBase.java
+++ b/packages/SettingsLib/src/com/android/settingslib/graph/BatteryMeterDrawableBase.java
@@ -141,7 +141,7 @@
mWarningTextPaint.setColor(mColors[1]);
}
- mChargeColor = Utils.getDefaultColor(mContext, R.color.batterymeter_charge_color);
+ mChargeColor = Utils.getDefaultColor(mContext, R.color.meter_consumed_color);
mBoltPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
mBoltPaint.setColor(Utils.getDefaultColor(mContext, R.color.batterymeter_bolt_color));
diff --git a/packages/SettingsLib/src/com/android/settingslib/graph/BottomLabelLayout.java b/packages/SettingsLib/src/com/android/settingslib/graph/BottomLabelLayout.java
new file mode 100644
index 0000000..8161dd4
--- /dev/null
+++ b/packages/SettingsLib/src/com/android/settingslib/graph/BottomLabelLayout.java
@@ -0,0 +1,97 @@
+/*
+ * Copyright (C) 2017 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.settingslib.graph;
+
+import android.annotation.Nullable;
+import android.content.Context;
+import android.support.annotation.VisibleForTesting;
+import android.util.AttributeSet;
+import android.view.Gravity;
+import android.view.View;
+import android.widget.LinearLayout;
+
+import com.android.settingslib.R;
+
+/**
+ * An extension of LinearLayout that automatically switches to vertical
+ * orientation when it can't fit its child views horizontally.
+ *
+ * Main logic in this class comes from {@link android.support.v7.widget.ButtonBarLayout}.
+ * Compared with {@link android.support.v7.widget.ButtonBarLayout}, this layout won't reverse
+ * children's order and won't update the minimum height
+ */
+public class BottomLabelLayout extends LinearLayout {
+ private static final String TAG = "BottomLabelLayout";
+
+ public BottomLabelLayout(Context context,
+ @Nullable AttributeSet attrs) {
+ super(context, attrs);
+ }
+
+ @Override
+ protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
+ final int widthSize = MeasureSpec.getSize(widthMeasureSpec);
+ final boolean isStacked = isStacked();
+ boolean needsRemeasure = false;
+
+ // If we're not stacked, make sure the measure spec is AT_MOST rather
+ // than EXACTLY. This ensures that we'll still get TOO_SMALL so that we
+ // know to stack the buttons.
+ final int initialWidthMeasureSpec;
+ if (!isStacked && MeasureSpec.getMode(widthMeasureSpec) == MeasureSpec.EXACTLY) {
+ initialWidthMeasureSpec = MeasureSpec.makeMeasureSpec(widthSize, MeasureSpec.AT_MOST);
+
+ // We'll need to remeasure again to fill excess space.
+ needsRemeasure = true;
+ } else {
+ initialWidthMeasureSpec = widthMeasureSpec;
+ }
+
+ super.onMeasure(initialWidthMeasureSpec, heightMeasureSpec);
+ if (!isStacked) {
+ final int measuredWidth = getMeasuredWidthAndState();
+ final int measuredWidthState = measuredWidth & View.MEASURED_STATE_MASK;
+
+ if (measuredWidthState == View.MEASURED_STATE_TOO_SMALL) {
+ setStacked(true);
+ // Measure again in the new orientation.
+ needsRemeasure = true;
+ }
+ }
+
+ if (needsRemeasure) {
+ super.onMeasure(widthMeasureSpec, heightMeasureSpec);
+ }
+
+ }
+
+ @VisibleForTesting
+ void setStacked(boolean stacked) {
+ setOrientation(stacked ? LinearLayout.VERTICAL : LinearLayout.HORIZONTAL);
+ setGravity(stacked ? Gravity.START : Gravity.BOTTOM);
+
+ final View spacer = findViewById(R.id.spacer);
+ if (spacer != null) {
+ spacer.setVisibility(stacked ? View.GONE : View.VISIBLE);
+ }
+ }
+
+ private boolean isStacked() {
+ return getOrientation() == LinearLayout.VERTICAL;
+ }
+}
diff --git a/packages/SettingsLib/src/com/android/settingslib/wifi/AccessPoint.java b/packages/SettingsLib/src/com/android/settingslib/wifi/AccessPoint.java
index eb513e1..b3565ea 100644
--- a/packages/SettingsLib/src/com/android/settingslib/wifi/AccessPoint.java
+++ b/packages/SettingsLib/src/com/android/settingslib/wifi/AccessPoint.java
@@ -521,7 +521,8 @@
public boolean isMetered() {
return mIsScoredNetworkMetered
|| (mConfig != null && mConfig.meteredHint)
- || (mInfo != null && mInfo.getMeteredHint());
+ || (mInfo != null && mInfo.getMeteredHint()
+ || (mNetworkInfo != null && mNetworkInfo.isMetered()));
}
public NetworkInfo getNetworkInfo() {
diff --git a/packages/SettingsLib/src/com/android/settingslib/wifi/WifiTracker.java b/packages/SettingsLib/src/com/android/settingslib/wifi/WifiTracker.java
index be15e65..7a63b8a 100644
--- a/packages/SettingsLib/src/com/android/settingslib/wifi/WifiTracker.java
+++ b/packages/SettingsLib/src/com/android/settingslib/wifi/WifiTracker.java
@@ -250,10 +250,17 @@
mLastNetworkInfo = mConnectivityManager.getNetworkInfo(mWifiManager.getCurrentNetwork());
updateAccessPointsLocked();
+ if (DBG) {
+ Log.d(TAG, "force update - internal access point list:\n" + mInternalAccessPoints);
+ }
+
// Synchronously copy access points
mMainHandler.removeMessages(MainHandler.MSG_ACCESS_POINT_CHANGED);
mMainHandler.handleMessage(
Message.obtain(mMainHandler, MainHandler.MSG_ACCESS_POINT_CHANGED));
+ if (DBG) {
+ Log.d(TAG, "force update - external access point list:\n" + mAccessPoints);
+ }
}
}
diff --git a/packages/SettingsLib/tests/integ/src/com/android/settingslib/wifi/AccessPointTest.java b/packages/SettingsLib/tests/integ/src/com/android/settingslib/wifi/AccessPointTest.java
index 56cb0a3..801844b 100644
--- a/packages/SettingsLib/tests/integ/src/com/android/settingslib/wifi/AccessPointTest.java
+++ b/packages/SettingsLib/tests/integ/src/com/android/settingslib/wifi/AccessPointTest.java
@@ -18,7 +18,6 @@
import static com.google.common.truth.Truth.assertThat;
import static com.google.common.truth.Truth.assertWithMessage;
-import static org.junit.Assert.assertTrue;
import static org.mockito.Mockito.any;
import static org.mockito.Mockito.when;
@@ -237,7 +236,7 @@
homeSp.setFriendlyName("Test Provider");
config.setHomeSp(homeSp);
AccessPoint ap = new AccessPoint(mContext, config);
- assertTrue(ap.isPasspointConfig());
+ assertThat(ap.isPasspointConfig()).isTrue();
}
@Test
@@ -254,8 +253,8 @@
wifiInfo.setNetworkId(configuration.networkId);
accessPoint.update(configuration, wifiInfo, networkInfo);
- assertTrue(accessPoint.isMetered());
- };
+ assertThat(accessPoint.isMetered()).isTrue();
+ }
@Test
public void testIsMetered_returnTrueWhenWifiInfoIsMetered() {
@@ -271,8 +270,25 @@
wifiInfo.setMeteredHint(true);
accessPoint.update(configuration, wifiInfo, networkInfo);
- assertTrue(accessPoint.isMetered());
- };
+ assertThat(accessPoint.isMetered()).isTrue();
+ }
+
+ @Test
+ public void testIsMetered_returnTrueWhenNetworkInfoIsMetered() {
+ WifiConfiguration configuration = createWifiConfiguration();
+
+ NetworkInfo networkInfo =
+ new NetworkInfo(ConnectivityManager.TYPE_WIFI, 2, "WIFI", "WIFI_SUBTYPE");
+ networkInfo.setMetered(true);
+ AccessPoint accessPoint = new AccessPoint(mContext, configuration);
+ WifiInfo wifiInfo = new WifiInfo();
+ wifiInfo.setSSID(WifiSsid.createFromAsciiEncoded(configuration.SSID));
+ wifiInfo.setBSSID(configuration.BSSID);
+ wifiInfo.setNetworkId(configuration.networkId);
+ accessPoint.update(configuration, wifiInfo, networkInfo);
+
+ assertThat(accessPoint.isMetered()).isTrue();
+ }
@Test
public void testIsMetered_returnTrueWhenScoredNetworkIsMetered() {
@@ -286,8 +302,24 @@
true /* metered */));
ap.update(mWifiNetworkScoreCache, false /* scoringUiEnabled */);
- assertTrue(ap.isMetered());
- };
+ assertThat(ap.isMetered()).isTrue();
+ }
+
+ @Test
+ public void testIsMetered_returnFalseByDefault() {
+ WifiConfiguration configuration = createWifiConfiguration();
+
+ NetworkInfo networkInfo =
+ new NetworkInfo(ConnectivityManager.TYPE_WIFI, 2, "WIFI", "WIFI_SUBTYPE");
+ AccessPoint accessPoint = new AccessPoint(mContext, configuration);
+ WifiInfo wifiInfo = new WifiInfo();
+ wifiInfo.setSSID(WifiSsid.createFromAsciiEncoded(configuration.SSID));
+ wifiInfo.setBSSID(configuration.BSSID);
+ wifiInfo.setNetworkId(configuration.networkId);
+ accessPoint.update(configuration, wifiInfo, networkInfo);
+
+ assertThat(accessPoint.isMetered()).isFalse();
+ }
private AccessPoint createAccessPointWithScanResultCache() {
Bundle bundle = new Bundle();
@@ -400,7 +432,7 @@
String providerFriendlyName = "Test Provider";
AccessPoint ap = new TestAccessPointBuilder(mContext).setFqdn(fqdn)
.setProviderFriendlyName(providerFriendlyName).build();
- assertTrue(ap.isPasspointConfig());
+ assertThat(ap.isPasspointConfig()).isTrue();
assertThat(ap.getPasspointFqdn()).isEqualTo(fqdn);
assertThat(ap.getConfigName()).isEqualTo(providerFriendlyName);
}
diff --git a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/graph/BottomLabelLayoutTest.java b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/graph/BottomLabelLayoutTest.java
new file mode 100644
index 0000000..ec21723
--- /dev/null
+++ b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/graph/BottomLabelLayoutTest.java
@@ -0,0 +1,70 @@
+/*
+ * Copyright (C) 2017 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.settingslib.graph;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import android.content.Context;
+import android.view.View;
+import android.widget.LinearLayout;
+import android.widget.Space;
+
+import com.android.settingslib.R;
+import com.android.settingslib.TestConfig;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.robolectric.RobolectricTestRunner;
+import org.robolectric.RuntimeEnvironment;
+import org.robolectric.annotation.Config;
+
+@RunWith(RobolectricTestRunner.class)
+@Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION)
+public class BottomLabelLayoutTest {
+ private BottomLabelLayout mBottomLabelLayout;
+ private Context mContext;
+ private Space mSpace;
+
+ @Before
+ public void setUp() {
+ mContext = RuntimeEnvironment.application;
+ mBottomLabelLayout = new BottomLabelLayout(mContext, null);
+ mBottomLabelLayout.setOrientation(LinearLayout.HORIZONTAL);
+
+ mSpace = new Space(mContext);
+ mSpace.setId(R.id.spacer);
+ mBottomLabelLayout.addView(mSpace);
+ }
+
+ @Test
+ public void testSetStacked_stackedTrue_layoutVertical() {
+ mBottomLabelLayout.setStacked(true);
+
+ assertThat(mBottomLabelLayout.getOrientation()).isEqualTo(LinearLayout.VERTICAL);
+ assertThat(mSpace.getVisibility()).isEqualTo(View.GONE);
+ }
+
+ @Test
+ public void testSetStacked_stackedFalse_layoutHorizontal() {
+ mBottomLabelLayout.setStacked(false);
+
+ assertThat(mBottomLabelLayout.getOrientation()).isEqualTo(LinearLayout.HORIZONTAL);
+ assertThat(mSpace.getVisibility()).isEqualTo(View.VISIBLE);
+ }
+}
diff --git a/packages/SettingsProvider/src/com/android/providers/settings/SettingsProtoDumpUtil.java b/packages/SettingsProvider/src/com/android/providers/settings/SettingsProtoDumpUtil.java
index 9309359..b328933 100644
--- a/packages/SettingsProvider/src/com/android/providers/settings/SettingsProtoDumpUtil.java
+++ b/packages/SettingsProvider/src/com/android/providers/settings/SettingsProtoDumpUtil.java
@@ -888,8 +888,20 @@
Settings.Global.ENABLE_EPHEMERAL_FEATURE,
GlobalSettingsProto.ENABLE_EPHEMERAL_FEATURE);
dumpSetting(s, p,
- Settings.Global.UNINSTALLED_INSTANT_APP_CACHE_DURATION_MILLIS,
- GlobalSettingsProto.UNINSTALLED_EPHEMERAL_APP_CACHE_DURATION_MILLIS);
+ Settings.Global.UNINSTALLED_INSTANT_APP_MIN_CACHE_PERIOD,
+ GlobalSettingsProto.UNINSTALLED_INSTANT_APP_MIN_CACHE_PERIOD);
+ dumpSetting(s, p,
+ Settings.Global.UNINSTALLED_INSTANT_APP_MAX_CACHE_PERIOD,
+ GlobalSettingsProto.UNINSTALLED_INSTANT_APP_MAX_CACHE_PERIOD);
+ dumpSetting(s, p,
+ Settings.Global.INSTALLED_INSTANT_APP_MIN_CACHE_PERIOD,
+ GlobalSettingsProto.INSTALLED_INSTANT_APP_MIN_CACHE_PERIOD);
+ dumpSetting(s, p,
+ Settings.Global.INSTALLED_INSTANT_APP_MAX_CACHE_PERIOD,
+ GlobalSettingsProto.INSTALLED_INSTANT_APP_MAX_CACHE_PERIOD);
+ dumpSetting(s, p,
+ Settings.Global.UNUSED_STATIC_SHARED_LIB_MIN_CACHE_PERIOD,
+ GlobalSettingsProto.UNUSED_STATIC_SHARED_LIB_MIN_CACHE_PERIOD);
dumpSetting(s, p,
Settings.Global.ALLOW_USER_SWITCHING_WHEN_SYSTEM_USER_LOCKED,
GlobalSettingsProto.ALLOW_USER_SWITCHING_WHEN_SYSTEM_USER_LOCKED);
diff --git a/packages/Shell/src/com/android/shell/BugreportProgressService.java b/packages/Shell/src/com/android/shell/BugreportProgressService.java
index 415bf9a..348b02a 100644
--- a/packages/Shell/src/com/android/shell/BugreportProgressService.java
+++ b/packages/Shell/src/com/android/shell/BugreportProgressService.java
@@ -52,6 +52,7 @@
import android.accounts.Account;
import android.accounts.AccountManager;
+import android.annotation.MainThread;
import android.annotation.SuppressLint;
import android.app.AlertDialog;
import android.app.Notification;
@@ -126,6 +127,8 @@
* <li>Stops itself if it doesn't have any process left to monitor.
* </ol>
* </ol>
+ *
+ * TODO: There are multiple threads involved. Add synchronization accordingly.
*/
public class BugreportProgressService extends Service {
private static final String TAG = "BugreportProgressService";
@@ -201,11 +204,15 @@
private static final String NOTIFICATION_CHANNEL_ID = "bugreports";
+ private final Object mLock = new Object();
+
/** Managed dumpstate processes (keyed by id) */
private final SparseArray<DumpstateListener> mProcesses = new SparseArray<>();
private Context mContext;
- private ServiceHandler mMainHandler;
+
+ private Handler mMainThreadHandler;
+ private ServiceHandler mServiceHandler;
private ScreenshotHandler mScreenshotHandler;
private final BugreportInfoDialog mInfoDialog = new BugreportInfoDialog();
@@ -234,7 +241,8 @@
@Override
public void onCreate() {
mContext = getApplicationContext();
- mMainHandler = new ServiceHandler("BugreportProgressServiceMainThread");
+ mMainThreadHandler = new Handler(Looper.getMainLooper());
+ mServiceHandler = new ServiceHandler("BugreportProgressServiceMainThread");
mScreenshotHandler = new ScreenshotHandler("BugreportProgressServiceScreenshotThread");
mScreenshotsDir = new File(getFilesDir(), SCREENSHOT_DIR);
@@ -260,10 +268,10 @@
Log.v(TAG, "onStartCommand(): " + dumpIntent(intent));
if (intent != null) {
// Handle it in a separate thread.
- final Message msg = mMainHandler.obtainMessage();
+ final Message msg = mServiceHandler.obtainMessage();
msg.what = MSG_SERVICE_COMMAND;
msg.obj = intent;
- mMainHandler.sendMessage(msg);
+ mServiceHandler.sendMessage(msg);
}
// If service is killed it cannot be recreated because it would not know which
@@ -278,7 +286,7 @@
@Override
public void onDestroy() {
- mMainHandler.getLooper().quit();
+ mServiceHandler.getLooper().quit();
mScreenshotHandler.getLooper().quit();
super.onDestroy();
}
@@ -613,7 +621,7 @@
// ignore it
}
- mInfoDialog.initialize(mContext, info);
+ mMainThreadHandler.post(() -> mInfoDialog.initialize(mContext, info));
}
/**
@@ -652,11 +660,11 @@
private void takeScreenshot(int id, int delay) {
if (delay > 0) {
Log.d(TAG, "Taking screenshot for " + id + " in " + delay + " seconds");
- final Message msg = mMainHandler.obtainMessage();
+ final Message msg = mServiceHandler.obtainMessage();
msg.what = MSG_DELAYED_SCREENSHOT;
msg.arg1 = id;
msg.arg2 = delay - 1;
- mMainHandler.sendMessageDelayed(msg, DateUtils.SECOND_IN_MILLIS);
+ mServiceHandler.sendMessageDelayed(msg, DateUtils.SECOND_IN_MILLIS);
return;
}
@@ -696,7 +704,7 @@
boolean taken = takeScreenshot(mContext, screenshotFile);
setTakingScreenshot(false);
- Message.obtain(mMainHandler, MSG_SCREENSHOT_RESPONSE, requestMsg.arg1, taken ? 1 : 0,
+ Message.obtain(mServiceHandler, MSG_SCREENSHOT_RESPONSE, requestMsg.arg1, taken ? 1 : 0,
screenshotFile).sendToTarget();
}
@@ -958,17 +966,24 @@
}
final Intent notifIntent;
+ boolean useChooser = true;
// Send through warning dialog by default
if (getWarningState(mContext, STATE_UNKNOWN) != STATE_HIDE) {
notifIntent = buildWarningIntent(mContext, sendIntent);
+ // No need to show a chooser in this case.
+ useChooser = false;
} else {
notifIntent = sendIntent;
}
notifIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
// Send the share intent...
- sendShareIntent(mContext, notifIntent);
+ if (useChooser) {
+ sendShareIntent(mContext, notifIntent);
+ } else {
+ mContext.startActivity(notifIntent);
+ }
// ... and stop watching this process.
stopProgress(id);
@@ -981,6 +996,8 @@
// Since we may be launched behind lockscreen, make sure that ChooserActivity doesn't finish
// itself in onStop.
chooserIntent.putExtra(ChooserActivity.EXTRA_PRIVATE_RETAIN_IN_ON_STOP, true);
+ // Starting the activity from a service.
+ chooserIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(chooserIntent);
}
@@ -1109,6 +1126,12 @@
* description will be saved on {@code description.txt}.
*/
private void addDetailsToZipFile(BugreportInfo info) {
+ synchronized (mLock) {
+ addDetailsToZipFileLocked(info);
+ }
+ }
+
+ private void addDetailsToZipFileLocked(BugreportInfo info) {
if (info.bugreportFile == null) {
// One possible reason is a bug in the Parcelization code.
Log.wtf(TAG, "addDetailsToZipFile(): no bugreportFile on " + info);
@@ -1430,6 +1453,7 @@
/**
* Sets its internal state and displays the dialog.
*/
+ @MainThread
void initialize(final Context context, BugreportInfo info) {
final String dialogTitle =
context.getString(R.string.bugreport_info_dialog_title, info.id);
diff --git a/packages/Shell/tests/src/com/android/shell/BugreportReceiverTest.java b/packages/Shell/tests/src/com/android/shell/BugreportReceiverTest.java
index 823b9b1..8bfcc74 100644
--- a/packages/Shell/tests/src/com/android/shell/BugreportReceiverTest.java
+++ b/packages/Shell/tests/src/com/android/shell/BugreportReceiverTest.java
@@ -355,7 +355,7 @@
assertProgressNotification(NEW_NAME, 00.00f);
Bundle extras = sendBugreportFinishedAndGetSharedIntent(ID, mPlainTextPath,
- mScreenshotPath);
+ mScreenshotPath, TITLE);
assertActionSendMultiple(extras, BUGREPORT_CONTENT, SCREENSHOT_CONTENT, ID, PID, TITLE,
NEW_NAME, TITLE, mDescription, 0, RENAMED_SCREENSHOTS);
@@ -410,7 +410,7 @@
assertProgressNotification(NEW_NAME, 00.00f);
Bundle extras = sendBugreportFinishedAndGetSharedIntent(ID,
- plainText? mPlainTextPath : mZipPath, mScreenshotPath);
+ plainText? mPlainTextPath : mZipPath, mScreenshotPath, TITLE);
assertActionSendMultiple(extras, BUGREPORT_CONTENT, SCREENSHOT_CONTENT, ID, PID, TITLE,
NEW_NAME, TITLE, mDescription, 0, RENAMED_SCREENSHOTS);
@@ -465,7 +465,7 @@
sendBugreportStarted(ID2, PID2, NAME2, 1000);
sendBugreportFinished(ID, mZipPath, mScreenshotPath);
- Bundle extras = acceptBugreportAndGetSharedIntent(ID);
+ Bundle extras = acceptBugreportAndGetSharedIntent(TITLE);
detailsUi = new DetailsUi(mUiBot, ID2, NAME2);
detailsUi.assertName(NAME2);
@@ -479,7 +479,7 @@
// Must use a different zip file otherwise it will fail because zip already contains
// title.txt and description.txt entries.
- extras = sendBugreportFinishedAndGetSharedIntent(ID2, mZipPath2, NO_SCREENSHOT);
+ extras = sendBugreportFinishedAndGetSharedIntent(ID2, mZipPath2, NO_SCREENSHOT, TITLE2);
assertActionSendMultiple(extras, BUGREPORT_CONTENT, NO_SCREENSHOT, ID2, PID2, TITLE2,
NEW_NAME2, TITLE2, DESCRIPTION2, 0, RENAMED_SCREENSHOTS);
@@ -568,7 +568,7 @@
// Send notification and click on share.
sendBugreportFinished(NO_ID, mPlainTextPath, null);
- acceptBugreport(NO_ID);
+ mUiBot.clickOnNotification(mContext.getString(R.string.bugreport_finished_title, NO_ID));
// Handle the warning
mUiBot.getVisibleObject(mContext.getString(R.string.bugreport_confirm));
@@ -725,13 +725,26 @@
return acceptBugreportAndGetSharedIntent(id);
}
+ // TODO: document / merge these 3 sendBugreportFinishedAndGetSharedIntent methods
+ private Bundle sendBugreportFinishedAndGetSharedIntent(int id, String bugreportPath,
+ String screenshotPath, String notificationTitle) {
+ sendBugreportFinished(id, bugreportPath, screenshotPath);
+ return acceptBugreportAndGetSharedIntent(notificationTitle);
+ }
+
/**
* Accepts the notification to share the finished bugreport and waits for the result.
*
* @return extras sent in the shared intent.
*/
private Bundle acceptBugreportAndGetSharedIntent(int id) {
- acceptBugreport(id);
+ final String notificationTitle = mContext.getString(R.string.bugreport_finished_title, id);
+ return acceptBugreportAndGetSharedIntent(notificationTitle);
+ }
+
+ // TODO: document and/or merge these 2 acceptBugreportAndGetSharedIntent methods
+ private Bundle acceptBugreportAndGetSharedIntent(String notificationTitle) {
+ mUiBot.clickOnNotification(notificationTitle);
mUiBot.chooseActivity(UI_NAME);
return mListener.getExtras();
}
@@ -744,13 +757,6 @@
}
/**
- * Accepts the notification to share the finished bugreport.
- */
- private void acceptBugreport(int id) {
- mUiBot.clickOnNotification(mContext.getString(R.string.bugreport_finished_title, id));
- }
-
- /**
* Sends a "bugreport finished" intent.
*/
private void sendBugreportFinished(int id, String bugreportPath, String screenshotPath) {
diff --git a/packages/SystemUI/AndroidManifest.xml b/packages/SystemUI/AndroidManifest.xml
index 79b02a5..c4e134b 100644
--- a/packages/SystemUI/AndroidManifest.xml
+++ b/packages/SystemUI/AndroidManifest.xml
@@ -531,7 +531,7 @@
<activity
android:name=".settings.BrightnessDialog"
android:label="@string/quick_settings_brightness_dialog_title"
- android:theme="@android:style/Theme.DeviceDefault.Light.Dialog"
+ android:theme="@*android:style/Theme.DeviceDefault.QuickSettings.Dialog"
android:finishOnCloseSystemDialogs="true"
android:launchMode="singleInstance"
android:excludeFromRecents="true"
diff --git a/packages/SystemUI/plugin/src/com/android/systemui/plugins/qs/QS.java b/packages/SystemUI/plugin/src/com/android/systemui/plugins/qs/QS.java
index 4a5a681..d571243 100644
--- a/packages/SystemUI/plugin/src/com/android/systemui/plugins/qs/QS.java
+++ b/packages/SystemUI/plugin/src/com/android/systemui/plugins/qs/QS.java
@@ -62,6 +62,9 @@
View getHeader();
+ default void setHasNotifications(boolean hasNotifications) {
+ }
+
@ProvidesInterface(version = HeightListener.VERSION)
public interface HeightListener {
public static final int VERSION = 1;
diff --git a/packages/SystemUI/plugin/src/com/android/systemui/plugins/statusbar/NotificationSwipeActionHelper.java b/packages/SystemUI/plugin/src/com/android/systemui/plugins/statusbar/NotificationSwipeActionHelper.java
index 4ce1e36..3cd5d89 100644
--- a/packages/SystemUI/plugin/src/com/android/systemui/plugins/statusbar/NotificationSwipeActionHelper.java
+++ b/packages/SystemUI/plugin/src/com/android/systemui/plugins/statusbar/NotificationSwipeActionHelper.java
@@ -49,6 +49,8 @@
public boolean isDismissGesture(MotionEvent ev);
+ public boolean isFalseGesture(MotionEvent ev);
+
public boolean swipedFarEnough(float translation, float viewSize);
public boolean swipedFastEnough(float translation, float velocity);
diff --git a/packages/SystemUI/res-keyguard/layout/keyguard_status_area.xml b/packages/SystemUI/res-keyguard/layout/keyguard_status_area.xml
index 4bdf415..7e664d0 100644
--- a/packages/SystemUI/res-keyguard/layout/keyguard_status_area.xml
+++ b/packages/SystemUI/res-keyguard/layout/keyguard_status_area.xml
@@ -31,7 +31,6 @@
android:layout_height="wrap_content"
android:textColor="@color/clock_white"
style="@style/widget_label"
- android:textAllCaps="true"
android:letterSpacing="0.15"
android:gravity="center"
/>
@@ -42,7 +41,6 @@
android:drawableStart="@drawable/ic_access_alarms_big"
android:textColor="@color/clock_gray"
android:letterSpacing="0.15"
- android:textAllCaps="true"
style="@style/widget_label"
android:layout_marginStart="6dp"
android:gravity="center"
diff --git a/packages/SystemUI/res-keyguard/values-h560dp/dimens.xml b/packages/SystemUI/res-keyguard/values-h560dp/dimens.xml
index 469ce52..3fb86d0 100644
--- a/packages/SystemUI/res-keyguard/values-h560dp/dimens.xml
+++ b/packages/SystemUI/res-keyguard/values-h560dp/dimens.xml
@@ -16,5 +16,5 @@
-->
<resources>
- <dimen name="widget_big_font_size">84dp</dimen>
+ <dimen name="widget_big_font_size">64dp</dimen>
</resources>
\ No newline at end of file
diff --git a/packages/SystemUI/res-keyguard/values-h650dp/dimens.xml b/packages/SystemUI/res-keyguard/values-h650dp/dimens.xml
index cb89cb4..3fb86d0 100644
--- a/packages/SystemUI/res-keyguard/values-h650dp/dimens.xml
+++ b/packages/SystemUI/res-keyguard/values-h650dp/dimens.xml
@@ -16,5 +16,5 @@
-->
<resources>
- <dimen name="widget_big_font_size">88dp</dimen>
+ <dimen name="widget_big_font_size">64dp</dimen>
</resources>
\ No newline at end of file
diff --git a/packages/SystemUI/res-keyguard/values-pt-rPT/strings.xml b/packages/SystemUI/res-keyguard/values-pt-rPT/strings.xml
index 83ba8bf..7e208c2 100644
--- a/packages/SystemUI/res-keyguard/values-pt-rPT/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-pt-rPT/strings.xml
@@ -91,13 +91,13 @@
<string name="kg_failed_attempts_almost_at_login" product="default" msgid="8364140853305528449">"Desenhou a sequência de desbloqueio incorretamente <xliff:g id="NUMBER_0">%1$d</xliff:g> vezes. Após mais <xliff:g id="NUMBER_1">%2$d</xliff:g> tentativas sem êxito, ser-lhe-á pedido para desbloquear o telemóvel através de uma conta de email.\n\n Tente novamente dentro de <xliff:g id="NUMBER_2">%3$d</xliff:g> segundos."</string>
<string name="kg_password_wrong_pin_code_pukked" msgid="3389829202093674267">"Código PIN do cartão SIM incorreto. Tem de contactar o seu operador para desbloquear o dispositivo."</string>
<plurals name="kg_password_wrong_pin_code" formatted="false" msgid="4314341367727055967">
+ <item quantity="one">Incorrect SIM PIN code, you have <xliff:g id="NUMBER_1">%d</xliff:g> remaining attempts.</item>
<item quantity="other">Código PIN do cartão SIM incorreto. Tem mais <xliff:g id="NUMBER_1">%d</xliff:g> tentativas.</item>
- <item quantity="one">Código PIN do cartão SIM incorreto. Tem mais <xliff:g id="NUMBER_0">%d</xliff:g> tentativa antes de precisar de contactar o seu operador para desbloquear o dispositivo.</item>
</plurals>
<string name="kg_password_wrong_puk_code_dead" msgid="3329017604125179374">"Cartão SIM inutilizável. Contacte o seu operador."</string>
<plurals name="kg_password_wrong_puk_code" formatted="false" msgid="2287504898931957513">
+ <item quantity="one">Incorrect SIM PUK code, you have <xliff:g id="NUMBER_1">%d</xliff:g> remaining attempts before SIM becomes permanently unusable.</item>
<item quantity="other">Código PUK do cartão SIM incorreto. Tem mais <xliff:g id="NUMBER_1">%d</xliff:g> tentativas antes de o cartão SIM ficar permanentemente inutilizável.</item>
- <item quantity="one">Código PUK do cartão SIM incorreto. Tem mais <xliff:g id="NUMBER_0">%d</xliff:g> tentativa antes de o cartão SIM ficar permanentemente inutilizável.</item>
</plurals>
<string name="kg_password_pin_failed" msgid="8769990811451236223">"Falha ao introduzir o PIN do cartão SIM!"</string>
<string name="kg_password_puk_failed" msgid="1331621440873439974">"Falha ao introduzir o PUK do cartão SIM!"</string>
@@ -117,16 +117,16 @@
<string name="kg_prompt_reason_device_admin" msgid="3452168247888906179">"Dispositivo bloqueado pelo administrador"</string>
<string name="kg_prompt_reason_user_request" msgid="8236951765212462286">"O dispositivo foi bloqueado manualmente"</string>
<plurals name="kg_prompt_reason_time_pattern" formatted="false" msgid="71299470072448533">
+ <item quantity="one">Device hasn\'t been unlocked for <xliff:g id="NUMBER_1">%d</xliff:g> hours. Confirm pattern.</item>
<item quantity="other">O dispositivo não é desbloqueado há <xliff:g id="NUMBER_1">%d</xliff:g> horas. Confirme o padrão.</item>
- <item quantity="one">O dispositivo não é desbloqueado há <xliff:g id="NUMBER_0">%d</xliff:g> hora. Confirme o padrão.</item>
</plurals>
<plurals name="kg_prompt_reason_time_pin" formatted="false" msgid="34586942088144385">
+ <item quantity="one">Device hasn\'t been unlocked for <xliff:g id="NUMBER_1">%d</xliff:g> hours. Confirm PIN.</item>
<item quantity="other">O dispositivo não é desbloqueado há <xliff:g id="NUMBER_1">%d</xliff:g> horas. Confirme o PIN.</item>
- <item quantity="one">O dispositivo não é desbloqueado há <xliff:g id="NUMBER_0">%d</xliff:g> hora. Confirme o PIN.</item>
</plurals>
<plurals name="kg_prompt_reason_time_password" formatted="false" msgid="257297696215346527">
+ <item quantity="one">Device hasn\'t been unlocked for <xliff:g id="NUMBER_1">%d</xliff:g> hours. Confirm password.</item>
<item quantity="other">O dispositivo não é desbloqueado há <xliff:g id="NUMBER_1">%d</xliff:g> horas. Confirme a palavra-passe.</item>
- <item quantity="one">O dispositivo não é desbloqueado há <xliff:g id="NUMBER_0">%d</xliff:g> hora. Confirme a palavra-passe.</item>
</plurals>
<string name="fingerprint_not_recognized" msgid="348813995267914625">"Não reconhecido"</string>
</resources>
diff --git a/packages/SystemUI/res-keyguard/values-sw600dp/dimens.xml b/packages/SystemUI/res-keyguard/values-sw600dp/dimens.xml
index a3b01b6..9e788be 100644
--- a/packages/SystemUI/res-keyguard/values-sw600dp/dimens.xml
+++ b/packages/SystemUI/res-keyguard/values-sw600dp/dimens.xml
@@ -26,7 +26,7 @@
<dimen name="keyguard_security_view_margin">12dp</dimen>
<!-- Overload default clock widget parameters -->
- <dimen name="widget_big_font_size">110dp</dimen>
+ <dimen name="widget_big_font_size">100dp</dimen>
<dimen name="widget_label_font_size">16sp</dimen>
<dimen name="bottom_text_spacing_digital">-1dp</dimen>
diff --git a/packages/SystemUI/res-keyguard/values-sw720dp/dimens.xml b/packages/SystemUI/res-keyguard/values-sw720dp/dimens.xml
index 210c7eb..7eb63d7 100644
--- a/packages/SystemUI/res-keyguard/values-sw720dp/dimens.xml
+++ b/packages/SystemUI/res-keyguard/values-sw720dp/dimens.xml
@@ -24,5 +24,5 @@
<!-- Height of the sliding KeyguardSecurityContainer (includes 2x keyguard_security_view_margin) -->
<dimen name="keyguard_security_height">420dp</dimen>
- <dimen name="widget_big_font_size">122dp</dimen>
+ <dimen name="widget_big_font_size">100dp</dimen>
</resources>
diff --git a/packages/SystemUI/res-keyguard/values/dimens.xml b/packages/SystemUI/res-keyguard/values/dimens.xml
index 7b952be2..3ca6e69 100644
--- a/packages/SystemUI/res-keyguard/values/dimens.xml
+++ b/packages/SystemUI/res-keyguard/values/dimens.xml
@@ -41,7 +41,7 @@
<!-- Default clock parameters -->
<dimen name="bottom_text_spacing_digital">-1dp</dimen>
<dimen name="widget_label_font_size">14sp</dimen>
- <dimen name="widget_big_font_size">78dp</dimen>
+ <dimen name="widget_big_font_size">64dp</dimen>
<!-- The y translation to apply at the start in appear animations. -->
<dimen name="appear_y_translation_start">32dp</dimen>
diff --git a/packages/SystemUI/res/drawable/ic_qs_signal_1x.xml b/packages/SystemUI/res/drawable/ic_qs_signal_1x.xml
deleted file mode 100644
index 195849a..0000000
--- a/packages/SystemUI/res/drawable/ic_qs_signal_1x.xml
+++ /dev/null
@@ -1,27 +0,0 @@
-<!--
-Copyright (C) 2014 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="32.0dp"
- android:height="32dp"
- android:viewportWidth="12.0"
- android:viewportHeight="12.0">
- <path
- android:fillColor="#FFFFFFFF"
- android:pathData="M3.500000,11.000000L1.800000,11.000000L1.800000,4.400000L0.200000,5.100000L0.200000,3.700000l3.100000,-1.300000l0.200000,0.000000L3.500000,11.000000z"/>
- <path
- android:fillColor="#FFFFFFFF"
- android:pathData="M8.600000,5.500000l1.200000,-3.000000l1.900000,0.000000L9.700000,6.700000l2.200000,4.300000L9.900000,11.000000L8.700000,7.900000L7.400000,11.000000L5.500000,11.000000l2.100000,-4.300000L5.600000,2.500000l1.900000,0.000000L8.600000,5.500000z"/>
-</vector>
diff --git a/packages/SystemUI/res/drawable/ic_qs_signal_3g.xml b/packages/SystemUI/res/drawable/ic_qs_signal_3g.xml
deleted file mode 100644
index 68c4307..0000000
--- a/packages/SystemUI/res/drawable/ic_qs_signal_3g.xml
+++ /dev/null
@@ -1,27 +0,0 @@
-<!--
-Copyright (C) 2014 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="32dp"
- android:height="32dp"
- android:viewportWidth="13.0"
- android:viewportHeight="13.0">
- <path
- android:fillColor="#FFFFFFFF"
- android:pathData="M2.000000,6.000000l0.800000,0.000000c0.300000,0.000000 0.500000,-0.100000 0.700000,-0.300000s0.200000,-0.500000 0.200000,-0.900000c0.000000,-0.300000 -0.100000,-0.600000 -0.200000,-0.800000S3.200000,3.700000 2.900000,3.700000C2.700000,3.700000 2.500000,3.800000 2.300000,4.000000S2.100000,4.400000 2.100000,4.700000L0.500000,4.700000C0.500000,4.000000 0.700000,3.400000 1.100000,3.000000s1.000000,-0.600000 1.700000,-0.600000c0.800000,0.000000 1.400000,0.200000 1.900000,0.600000s0.700000,1.000000 0.700000,1.800000c0.000000,0.400000 -0.100000,0.700000 -0.300000,1.100000S4.600000,6.500000 4.300000,6.600000C4.700000,6.800000 5.000000,7.100000 5.200000,7.400000s0.300000,0.700000 0.300000,1.200000c0.000000,0.800000 -0.200000,1.400000 -0.700000,1.800000s-1.100000,0.700000 -1.900000,0.700000c-0.700000,0.000000 -1.300000,-0.200000 -1.800000,-0.600000s-0.700000,-1.000000 -0.700000,-1.800000L2.000000,8.700000C2.000000,9.000000 2.100000,9.300000 2.300000,9.500000s0.400000,0.300000 0.600000,0.300000c0.300000,0.000000 0.500000,-0.100000 0.700000,-0.300000S3.900000,9.000000 3.900000,8.600000c0.000000,-0.500000 -0.100000,-0.800000 -0.300000,-1.000000S3.200000,7.300000 2.800000,7.300000L2.000000,7.300000L2.000000,6.000000z"/>
- <path
- android:fillColor="#FFFFFFFF"
- android:pathData="M12.500000,9.900000c-0.200000,0.400000 -0.600000,0.700000 -1.000000,0.900000s-1.000000,0.400000 -1.800000,0.400000c-0.900000,0.000000 -1.700000,-0.300000 -2.200000,-0.800000S6.700000,9.000000 6.700000,7.900000L6.700000,5.600000c0.000000,-1.100000 0.300000,-1.900000 0.800000,-2.400000s1.200000,-0.800000 2.100000,-0.800000c1.000000,0.000000 1.700000,0.200000 2.100000,0.700000s0.700000,1.200000 0.700000,2.100000l-1.600000,0.000000c0.000000,-0.500000 -0.100000,-0.900000 -0.200000,-1.100000s-0.500000,-0.300000 -0.900000,-0.300000c-0.400000,0.000000 -0.700000,0.200000 -0.900000,0.500000S8.400000,5.000000 8.400000,5.600000l0.000000,2.300000c0.000000,0.700000 0.100000,1.100000 0.300000,1.400000s0.600000,0.500000 1.000000,0.500000c0.300000,0.000000 0.600000,0.000000 0.700000,-0.100000s0.300000,-0.200000 0.400000,-0.300000L10.799999,7.800000L9.600000,7.800000L9.600000,6.600000l2.900000,0.000000L12.500000,9.900000z"/>
-</vector>
diff --git a/packages/SystemUI/res/drawable/ic_qs_signal_4g.xml b/packages/SystemUI/res/drawable/ic_qs_signal_4g.xml
deleted file mode 100644
index 61ecc9c..0000000
--- a/packages/SystemUI/res/drawable/ic_qs_signal_4g.xml
+++ /dev/null
@@ -1,27 +0,0 @@
-<!--
-Copyright (C) 2014 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="32.0dp"
- android:height="32dp"
- android:viewportWidth="12.0"
- android:viewportHeight="12.0">
- <path
- android:fillColor="#FFFFFFFF"
- android:pathData="M4.600000,7.800000l0.700000,0.000000l0.000000,1.300000L4.600000,9.100000L4.600000,11.000000L3.000000,11.000000L3.000000,9.200000L0.100000,9.200000L0.000000,8.100000L3.000000,2.500000l1.700000,0.000000L4.700000,7.800000zM1.600000,7.800000L3.000000,7.800000l0.000000,-3.000000L2.900000,5.000000L1.600000,7.800000z"/>
- <path
- android:fillColor="#FFFFFFFF"
- android:pathData="M11.900000,9.900000c-0.200000,0.400000 -0.600000,0.700000 -1.000000,0.900000s-1.000000,0.400000 -1.800000,0.400000c-0.900000,0.000000 -1.700000,-0.300000 -2.200000,-0.800000S6.100000,9.000000 6.100000,7.900000L6.100000,5.600000c0.000000,-1.100000 0.300000,-1.900000 0.800000,-2.400000S8.100000,2.400000 9.000000,2.400000c1.000000,0.000000 1.700000,0.200000 2.100000,0.700000s0.700000,1.200000 0.700000,2.100000l-1.600000,0.000000c0.000000,-0.500000 -0.100000,-0.900000 -0.200000,-1.100000S9.500000,3.700000 9.000000,3.700000c-0.400000,0.000000 -0.700000,0.200000 -0.900000,0.500000S7.700000,5.000000 7.700000,5.600000l0.000000,2.300000c0.000000,0.700000 0.100000,1.100000 0.300000,1.400000s0.600000,0.500000 1.000000,0.500000c0.300000,0.000000 0.600000,0.000000 0.700000,-0.100000s0.300000,-0.200000 0.400000,-0.300000L10.099999,7.800000L9.000000,7.800000L9.000000,6.600000l2.900000,0.000000L11.900000,9.900000z"/>
-</vector>
diff --git a/packages/SystemUI/res/drawable/ic_qs_signal_4g_plus.xml b/packages/SystemUI/res/drawable/ic_qs_signal_4g_plus.xml
deleted file mode 100644
index 782fbe4..0000000
--- a/packages/SystemUI/res/drawable/ic_qs_signal_4g_plus.xml
+++ /dev/null
@@ -1,30 +0,0 @@
-<!--
- Copyright (C) 2016 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="32.0dp"
- android:height="32.0dp"
- android:viewportWidth="19.0"
- android:viewportHeight="19.0">
- <path
- android:fillColor="#FFFFFFFF"
- android:pathData="M4.6,7.8l0.7,0.0l0.0,1.3L4.6,9.1L4.6,11.0L3.0,11.0L3.0,9.2L0.1,9.2L0.0,8.2l3.0,-5.7l1.7,0.0L4.6,7.8L4.6,7.8zM1.7,7.8L3.0,7.8l0.0,-3.0L2.9,5.0L1.7,7.8z"/>
- <path
- android:fillColor="#FFFFFFFF"
- android:pathData="M11.9,9.9c-0.2,0.4 -0.6,0.7 -1.0,0.9s-1.0,0.4 -1.8,0.4c-0.9,0.0 -1.7,-0.3 -2.2,-0.8S6.1,9.0 6.1,7.9L6.1,5.6c0.0,-1.1 0.3,-1.9 0.8,-2.4S8.2,2.4 9.0,2.4c1.0,0.0 1.7,0.2 2.1,0.7s0.7,1.2 0.7,2.1l-1.6,0.0c0.0,-0.5 -0.1,-0.9 -0.2,-1.1S9.5,3.7 9.0,3.7c-0.4,0.0 -0.7,0.2 -0.9,0.5S7.8,5.0 7.8,5.6l0.0,2.3c0.0,0.7 0.1,1.1 0.3,1.4c0.2,0.3 0.6,0.5 1.0,0.5c0.3,0.0 0.6,0.0 0.7,-0.1s0.3,-0.2 0.4,-0.3L10.2,7.8L9.0,7.8L9.0,6.6l2.9,0.0L11.9,9.9z"/>
- <path
- android:fillColor="#FFFFFFFF"
- android:pathData="M17.7,4.4l-1.900001,0.0 0.0,-1.9 -1.2,0.0 0.0,1.9 -1.900001,0.0 0.0,1.2 1.900001,0.0 0.0,1.9 1.2,0.0 0.0,-1.9 1.900001,0.0z"/>
-</vector>
diff --git a/packages/SystemUI/res/drawable/ic_qs_signal_disabled.xml b/packages/SystemUI/res/drawable/ic_qs_signal_disabled.xml
deleted file mode 100644
index dd5843d..0000000
--- a/packages/SystemUI/res/drawable/ic_qs_signal_disabled.xml
+++ /dev/null
@@ -1,28 +0,0 @@
-<!--
-Copyright (C) 2014 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:autoMirrored="true"
- android:width="32dp"
- android:height="32dp"
- android:viewportWidth="24.0"
- android:viewportHeight="24.0">
- <path
- android:fillColor="#FFFFFFFF"
- android:pathData="M21.799999,22.299999l-1.199999,-1.299999 0.000000,0.000000 -9.600000,-10.000000 0.000000,0.000000 -6.400000,-6.700000 -1.300000,1.300000 6.400000,6.700000 -8.700000,8.700000 16.900000,0.000000 2.600000,2.700001z"/>
- <path
- android:fillColor="#FFFFFFFF"
- android:pathData="M21.000000,1.000000l-8.600000,8.600000 8.600000,9.100000z"/>
-</vector>
diff --git a/packages/SystemUI/res/drawable/ic_qs_signal_e.xml b/packages/SystemUI/res/drawable/ic_qs_signal_e.xml
deleted file mode 100644
index 4232126..0000000
--- a/packages/SystemUI/res/drawable/ic_qs_signal_e.xml
+++ /dev/null
@@ -1,27 +0,0 @@
-<!--
-Copyright (C) 2014 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="32dp"
- android:height="32dp"
- android:viewportWidth="13.0"
- android:viewportHeight="13.0">
- <group
- android:translateX="3.5" >
- <path
- android:fillColor="#FFFFFFFF"
- android:pathData="M4.400000,7.300000L1.700000,7.300000l0.000000,2.400000l3.300000,0.000000L5.000000,11.000000L0.000000,11.000000L0.000000,2.500000l4.900000,0.000000l0.000000,1.300000L1.700000,3.800000l0.000000,2.100000l2.800000,0.000000L4.500000,7.300000z"/>
- </group>
-</vector>
diff --git a/packages/SystemUI/res/drawable/ic_qs_signal_g.xml b/packages/SystemUI/res/drawable/ic_qs_signal_g.xml
deleted file mode 100644
index 0c512d7..0000000
--- a/packages/SystemUI/res/drawable/ic_qs_signal_g.xml
+++ /dev/null
@@ -1,26 +0,0 @@
-<!--
-Copyright (C) 2014 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="32dp"
- android:height="32dp"
- android:viewportWidth="13.0"
- android:viewportHeight="13.0">
- <group android:translateX="3.5" >
- <path
- android:fillColor="#FFFFFFFF"
- android:pathData="M6.500000,9.900000c-0.200000,0.400000 -0.600000,0.700000 -1.000000,0.900000s-1.000000,0.400000 -1.800000,0.400000c-0.900000,0.000000 -1.700000,-0.300000 -2.200000,-0.800000S0.700000,9.000000 0.700000,7.900000L0.700000,5.600000c0.000000,-1.100000 0.300000,-1.900000 0.800000,-2.400000s1.200000,-0.800000 2.100000,-0.800000c1.000000,0.000000 1.700000,0.200000 2.100000,0.700000s0.700000,1.200000 0.700000,2.100000L4.700000,5.200000c0.000000,-0.500000 -0.100000,-0.900000 -0.200000,-1.100000S4.000000,3.700000 3.600000,3.700000c-0.400000,0.000000 -0.700000,0.200000 -0.900000,0.500000S2.300000,5.000000 2.300000,5.600000l0.000000,2.300000c0.000000,0.700000 0.100000,1.100000 0.300000,1.400000s0.600000,0.500000 1.000000,0.500000c0.300000,0.000000 0.600000,0.000000 0.700000,-0.100000s0.300000,-0.200000 0.400000,-0.300000L4.700000,7.800000L3.500000,7.800000L3.500000,6.600000l2.900000,0.000000L6.400000,9.900000z"/>
- </group>
-</vector>
diff --git a/packages/SystemUI/res/drawable/ic_qs_signal_h.xml b/packages/SystemUI/res/drawable/ic_qs_signal_h.xml
deleted file mode 100644
index b9572b2..0000000
--- a/packages/SystemUI/res/drawable/ic_qs_signal_h.xml
+++ /dev/null
@@ -1,27 +0,0 @@
-<!--
-Copyright (C) 2014 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="32dp"
- android:height="32dp"
- android:viewportWidth="13.0"
- android:viewportHeight="13.0">
- <group
- android:translateX="3.5" >
- <path
- android:fillColor="#FFFFFFFF"
- android:pathData="M6.000000,11.000000L4.400000,11.000000L4.400000,7.500000L1.700000,7.500000L1.700000,11.000000L0.000000,11.000000L0.000000,2.500000l1.700000,0.000000l0.000000,3.700000l2.700000,0.000000L4.400000,2.500000L6.000000,2.500000L6.000000,11.000000z"/>
- </group>
-</vector>
diff --git a/packages/SystemUI/res/drawable/ic_qs_signal_lte.xml b/packages/SystemUI/res/drawable/ic_qs_signal_lte.xml
deleted file mode 100644
index a381d03e..0000000
--- a/packages/SystemUI/res/drawable/ic_qs_signal_lte.xml
+++ /dev/null
@@ -1,30 +0,0 @@
-<!--
-Copyright (C) 2014 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="32dp"
- android:height="32dp"
- android:viewportWidth="13.0"
- android:viewportHeight="13.0">
- <path
- android:fillColor="#FFFFFFFF"
- android:pathData="M2.000000,9.700000l2.000000,0.000000L4.000000,11.000000L0.300000,11.000000L0.300000,2.500000L2.000000,2.500000L2.000000,9.700000z"/>
- <path
- android:fillColor="#FFFFFFFF"
- android:pathData="M8.300000,3.800000L7.000000,3.800000L7.000000,11.000000L5.300000,11.000000L5.300000,3.800000L4.000000,3.800000L4.000000,2.500000l4.300000,0.000000L8.300000,3.800000z"/>
- <path
- android:fillColor="#FFFFFFFF"
- android:pathData="M12.400000,7.300000l-1.700000,0.000000l0.000000,2.400000l2.100000,0.000000L12.799999,11.000000L9.000000,11.000000L9.000000,2.500000l3.700000,0.000000l0.000000,1.300000l-2.100000,0.000000l0.000000,2.100000l1.700000,0.000000L12.300000,7.300000z"/>
-</vector>
diff --git a/packages/SystemUI/res/drawable/ic_qs_signal_lte_plus.xml b/packages/SystemUI/res/drawable/ic_qs_signal_lte_plus.xml
deleted file mode 100644
index 3bed28a..0000000
--- a/packages/SystemUI/res/drawable/ic_qs_signal_lte_plus.xml
+++ /dev/null
@@ -1,33 +0,0 @@
-<!--
- Copyright (C) 2016 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="32.0dp"
- android:height="32.0dp"
- android:viewportWidth="24.0"
- android:viewportHeight="24.0">
- <path
- android:fillColor="#FFFFFFFF"
- android:pathData="M2.0,9.7l2.0,0.0L4.0,11.0L0.4,11.0L0.4,2.5L2.0,2.5L2.0,9.7z"/>
- <path
- android:fillColor="#FFFFFFFF"
- android:pathData="M8.3,3.8L7.0,3.8L7.0,11.0L5.4,11.0L5.4,3.8L4.0,3.8L4.0,2.5l4.3,0.0L8.3,3.8z"/>
- <path
- android:fillColor="#FFFFFFFF"
- android:pathData="M12.4,7.3l-1.7,0.0l0.0,2.4l2.1,0.0L12.799999,11.0L9.0,11.0L9.0,2.5l3.7,0.0l0.0,1.3l-2.1,0.0l0.0,2.1l1.7,0.0L12.4,7.3L12.4,7.3z"/>
- <path
- android:fillColor="#FFFFFFFF"
- android:pathData="M18.4,4.4l-1.9,0.0 0.0,-1.9 -1.2,0.0 0.0,1.9 -1.900001,0.0 0.0,1.2 1.900001,0.0 0.0,1.9 1.2,0.0 0.0,-1.9 1.9,0.0z"/>
-</vector>
diff --git a/packages/SystemUI/res/layout/qs_detail.xml b/packages/SystemUI/res/layout/qs_detail.xml
index f41c494..34e43ce 100644
--- a/packages/SystemUI/res/layout/qs_detail.xml
+++ b/packages/SystemUI/res/layout/qs_detail.xml
@@ -26,10 +26,6 @@
android:paddingBottom="8dp"
android:visibility="invisible">
- <com.android.systemui.ResizingSpace
- android:layout_width="match_parent"
- android:layout_height="@dimen/qs_detail_margin_top" />
-
<include
android:id="@+id/qs_detail_header"
layout="@layout/qs_detail_header"
diff --git a/packages/SystemUI/res/layout/qs_detail_header.xml b/packages/SystemUI/res/layout/qs_detail_header.xml
index 871ed67..a1f0ee7 100644
--- a/packages/SystemUI/res/layout/qs_detail_header.xml
+++ b/packages/SystemUI/res/layout/qs_detail_header.xml
@@ -20,34 +20,46 @@
android:layout_height="wrap_content"
android:paddingLeft="@dimen/qs_detail_header_padding"
android:paddingTop="@dimen/qs_detail_header_padding"
- android:paddingBottom="@dimen/qs_detail_header_bottom_padding"
+ android:paddingBottom="@dimen/qs_detail_items_padding_top"
android:paddingEnd="@dimen/qs_panel_padding"
android:background="@drawable/btn_borderless_rect"
+ android:orientation="vertical"
android:gravity="center">
- <TextView
- android:id="@android:id/title"
- android:paddingStart="@dimen/qs_detail_header_text_padding"
- android:layout_width="0dp"
- android:layout_height="wrap_content"
- android:layout_weight="1"
- android:textDirection="locale"
- android:textAppearance="@style/TextAppearance.QS.DetailHeader" />
+ <com.android.systemui.ResizingSpace
+ android:layout_width="match_parent"
+ android:layout_height="@dimen/qs_detail_margin_top" />
- <ImageView
- android:id="@+id/settings"
- android:layout_width="@dimen/qs_detail_image_width"
- android:layout_height="@dimen/qs_detail_image_height"
- android:background="?android:attr/selectableItemBackground"
- android:padding="@dimen/qs_detail_image_padding"
- android:src="@drawable/ic_settings"
- android:visibility="gone"/>
-
- <Switch
- android:id="@android:id/toggle"
- android:layout_width="wrap_content"
+ <LinearLayout
+ android:layout_width="match_parent"
android:layout_height="wrap_content"
- android:clickable="false"
- android:textAppearance="@style/TextAppearance.QS.DetailHeader" />
+ android:orientation="horizontal">
+
+ <TextView
+ android:id="@android:id/title"
+ android:paddingStart="@dimen/qs_detail_header_text_padding"
+ android:layout_width="0dp"
+ android:layout_height="wrap_content"
+ android:layout_weight="1"
+ android:textDirection="locale"
+ android:textAppearance="@style/TextAppearance.QS.DetailHeader" />
+
+ <ImageView
+ android:id="@+id/settings"
+ android:layout_width="@dimen/qs_detail_image_width"
+ android:layout_height="@dimen/qs_detail_image_height"
+ android:background="?android:attr/selectableItemBackground"
+ android:padding="@dimen/qs_detail_image_padding"
+ android:src="@drawable/ic_settings"
+ android:visibility="gone"/>
+
+ <Switch
+ android:id="@android:id/toggle"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:clickable="false"
+ android:textAppearance="@style/TextAppearance.QS.DetailHeader" />
+
+ </LinearLayout>
</com.android.keyguard.AlphaOptimizedLinearLayout>
diff --git a/packages/SystemUI/res/layout/qs_detail_items.xml b/packages/SystemUI/res/layout/qs_detail_items.xml
index b9cdf28..60cba67 100644
--- a/packages/SystemUI/res/layout/qs_detail_items.xml
+++ b/packages/SystemUI/res/layout/qs_detail_items.xml
@@ -20,7 +20,6 @@
xmlns:sysui="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent"
- android:paddingTop="@dimen/qs_detail_items_padding_top"
android:paddingStart="@dimen/qs_detail_padding_start"
android:paddingEnd="16dp">
diff --git a/packages/SystemUI/res/layout/qs_footer.xml b/packages/SystemUI/res/layout/qs_footer.xml
index c92c811..871d1f3 100644
--- a/packages/SystemUI/res/layout/qs_footer.xml
+++ b/packages/SystemUI/res/layout/qs_footer.xml
@@ -27,20 +27,23 @@
android:clipChildren="false"
android:clipToPadding="false"
android:paddingTop="0dp"
- android:paddingEnd="8dp"
- android:paddingStart="16dp"
+ android:background="#00000000"
android:gravity="center_vertical"
android:orientation="horizontal">
<include
android:id="@+id/date_time_alarm_group"
layout="@layout/status_bar_alarm_group"
+ android:layout_marginStart="16dp"
+ android:layout_marginEnd="8dp"
android:layout_width="wrap_content"
android:layout_height="match_parent" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
+ android:layout_marginStart="16dp"
+ android:layout_marginEnd="8dp"
android:gravity="end">
<com.android.systemui.statusbar.phone.MultiUserSwitch
@@ -113,4 +116,9 @@
android:padding="14dp" />
</LinearLayout>
+ <include layout="@layout/qs_divider"
+ android:layout_width="match_parent"
+ android:layout_height="1dp"
+ android:layout_gravity="bottom" />
+
</com.android.systemui.qs.QSFooter>
diff --git a/packages/SystemUI/res/layout/qs_panel.xml b/packages/SystemUI/res/layout/qs_panel.xml
index fb47bbc..fb4ac04 100644
--- a/packages/SystemUI/res/layout/qs_panel.xml
+++ b/packages/SystemUI/res/layout/qs_panel.xml
@@ -35,6 +35,7 @@
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:elevation="4dp"
+ android:background="#00000000"
android:layout_marginBottom="48dp" />
<include layout="@layout/quick_status_bar_expanded_header" />
diff --git a/packages/SystemUI/res/layout/quick_status_bar_expanded_header.xml b/packages/SystemUI/res/layout/quick_status_bar_expanded_header.xml
index 65344b7..66c5dd5 100644
--- a/packages/SystemUI/res/layout/quick_status_bar_expanded_header.xml
+++ b/packages/SystemUI/res/layout/quick_status_bar_expanded_header.xml
@@ -24,11 +24,11 @@
android:layout_height="@dimen/status_bar_header_height"
android:layout_gravity="@integer/notification_panel_layout_gravity"
android:baselineAligned="false"
+ android:background="#00000000"
android:elevation="4dp"
android:clickable="false"
android:clipChildren="false"
android:clipToPadding="false"
- android:paddingBottom="48dp"
android:paddingTop="0dp"
android:paddingEnd="0dp"
android:paddingStart="0dp">
@@ -40,8 +40,8 @@
android:clipChildren="false"
android:clipToPadding="false"
android:gravity="center"
- android:paddingStart="8dp"
- android:paddingEnd="8dp"
+ android:paddingStart="16dp"
+ android:paddingEnd="16dp"
android:orientation="horizontal">
@@ -82,10 +82,9 @@
<com.android.systemui.qs.QuickQSPanel
android:id="@+id/quick_qs_panel"
android:layout_width="match_parent"
- android:layout_height="wrap_content"
+ android:layout_height="48dp"
android:layout_alignParentEnd="true"
- android:layout_marginTop="36dp"
- android:layout_marginBottom="8dp"
+ android:layout_marginTop="31dp"
android:layout_alignParentTop="true"
android:accessibilityTraversalAfter="@+id/date_time_group"
android:accessibilityTraversalBefore="@id/expand_indicator"
@@ -94,8 +93,7 @@
android:layout_marginStart="8dp"
android:layout_marginEnd="8dp"
android:focusable="true"
- android:importantForAccessibility="yes"
- android:paddingTop="0dp"/>
+ android:importantForAccessibility="yes" />
<com.android.systemui.statusbar.AlphaOptimizedImageView
android:id="@+id/qs_detail_header_progress"
diff --git a/packages/SystemUI/res/layout/zen_mode_panel.xml b/packages/SystemUI/res/layout/zen_mode_panel.xml
index 8707840..200eabf 100644
--- a/packages/SystemUI/res/layout/zen_mode_panel.xml
+++ b/packages/SystemUI/res/layout/zen_mode_panel.xml
@@ -36,7 +36,6 @@
android:layout_height="wrap_content"
android:layout_marginStart="16dp"
android:layout_marginEnd="16dp"
- android:layout_marginTop="8dp"
android:layout_marginBottom="8dp" />
<RelativeLayout
diff --git a/packages/SystemUI/res/values-af/strings.xml b/packages/SystemUI/res/values-af/strings.xml
index 36ceff5..3fce776 100644
--- a/packages/SystemUI/res/values-af/strings.xml
+++ b/packages/SystemUI/res/values-af/strings.xml
@@ -573,6 +573,8 @@
<string name="snooze_option_15_min" msgid="1068727451405610715">"15 minute"</string>
<string name="snooze_option_30_min" msgid="867081342535195788">"30 minute"</string>
<string name="snooze_option_1_hour" msgid="1098086401880077154">"1 uur"</string>
+ <!-- no translation found for snooze_option_2_hour (8332218255658969475) -->
+ <skip />
<string name="snooze_undo" msgid="6074877317002985129">"ONTDOEN"</string>
<string name="snoozed_for_time" msgid="2390718332980204462">"Sluimer vir <xliff:g id="TIME_AMOUNT">%1$s</xliff:g>"</string>
<string name="battery_panel_title" msgid="7944156115535366613">"Batterygebruik"</string>
diff --git a/packages/SystemUI/res/values-am/strings.xml b/packages/SystemUI/res/values-am/strings.xml
index f9edd7c..a217d3c 100644
--- a/packages/SystemUI/res/values-am/strings.xml
+++ b/packages/SystemUI/res/values-am/strings.xml
@@ -573,6 +573,8 @@
<string name="snooze_option_15_min" msgid="1068727451405610715">"15 ደቂቃዎች"</string>
<string name="snooze_option_30_min" msgid="867081342535195788">"30 ደቂቃዎች"</string>
<string name="snooze_option_1_hour" msgid="1098086401880077154">"1 ሰዓት"</string>
+ <!-- no translation found for snooze_option_2_hour (8332218255658969475) -->
+ <skip />
<string name="snooze_undo" msgid="6074877317002985129">"ቀልብስ"</string>
<string name="snoozed_for_time" msgid="2390718332980204462">"ለ<xliff:g id="TIME_AMOUNT">%1$s</xliff:g> አሸልቧል"</string>
<string name="battery_panel_title" msgid="7944156115535366613">"የባትሪ አጠቃቀም"</string>
diff --git a/packages/SystemUI/res/values-ar/strings.xml b/packages/SystemUI/res/values-ar/strings.xml
index 4ab49a0..1c1fbbc 100644
--- a/packages/SystemUI/res/values-ar/strings.xml
+++ b/packages/SystemUI/res/values-ar/strings.xml
@@ -589,6 +589,8 @@
<string name="snooze_option_15_min" msgid="1068727451405610715">"١٥ دقيقة"</string>
<string name="snooze_option_30_min" msgid="867081342535195788">"٣۰ دقيقة"</string>
<string name="snooze_option_1_hour" msgid="1098086401880077154">"ساعة واحدة"</string>
+ <!-- no translation found for snooze_option_2_hour (8332218255658969475) -->
+ <skip />
<string name="snooze_undo" msgid="6074877317002985129">"تراجع"</string>
<string name="snoozed_for_time" msgid="2390718332980204462">"تم تأجيل الإشعار لمدة <xliff:g id="TIME_AMOUNT">%1$s</xliff:g>"</string>
<string name="battery_panel_title" msgid="7944156115535366613">"استخدام البطارية"</string>
diff --git a/packages/SystemUI/res/values-az/strings.xml b/packages/SystemUI/res/values-az/strings.xml
index aca6a3b..24b71e7 100644
--- a/packages/SystemUI/res/values-az/strings.xml
+++ b/packages/SystemUI/res/values-az/strings.xml
@@ -573,6 +573,8 @@
<string name="snooze_option_15_min" msgid="1068727451405610715">"15 dəqiqə"</string>
<string name="snooze_option_30_min" msgid="867081342535195788">"30 dəqiqə"</string>
<string name="snooze_option_1_hour" msgid="1098086401880077154">"1 saat"</string>
+ <!-- no translation found for snooze_option_2_hour (8332218255658969475) -->
+ <skip />
<string name="snooze_undo" msgid="6074877317002985129">"GERİ QAYTARIN"</string>
<string name="snoozed_for_time" msgid="2390718332980204462">"<xliff:g id="TIME_AMOUNT">%1$s</xliff:g> üçün təxirə salınıb"</string>
<string name="battery_panel_title" msgid="7944156115535366613">"Batareya istifadəsi"</string>
diff --git a/packages/SystemUI/res/values-b+sr+Latn/strings.xml b/packages/SystemUI/res/values-b+sr+Latn/strings.xml
index 1cde012..f460730 100644
--- a/packages/SystemUI/res/values-b+sr+Latn/strings.xml
+++ b/packages/SystemUI/res/values-b+sr+Latn/strings.xml
@@ -473,7 +473,7 @@
<string name="hidden_notifications_title" msgid="7139628534207443290">"Brže dobijajte obaveštenja"</string>
<string name="hidden_notifications_text" msgid="2326409389088668981">"Pregledajte ih pre otključavanja"</string>
<string name="hidden_notifications_cancel" msgid="3690709735122344913">"Ne, hvala"</string>
- <string name="hidden_notifications_setup" msgid="41079514801976810">"Podesi"</string>
+ <string name="hidden_notifications_setup" msgid="41079514801976810">"Aktiviraj"</string>
<string name="zen_mode_and_condition" msgid="4462471036429759903">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>. <xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string>
<string name="volume_zen_end_now" msgid="6930243045593601084">"Isključi odmah"</string>
<string name="accessibility_volume_expand" msgid="5946812790999244205">"Proširi"</string>
@@ -577,6 +577,8 @@
<string name="snooze_option_15_min" msgid="1068727451405610715">"15 minuta"</string>
<string name="snooze_option_30_min" msgid="867081342535195788">"30 minuta"</string>
<string name="snooze_option_1_hour" msgid="1098086401880077154">"1 sat"</string>
+ <!-- no translation found for snooze_option_2_hour (8332218255658969475) -->
+ <skip />
<string name="snooze_undo" msgid="6074877317002985129">"OPOZOVI"</string>
<string name="snoozed_for_time" msgid="2390718332980204462">"Odloženo je za <xliff:g id="TIME_AMOUNT">%1$s</xliff:g>"</string>
<string name="battery_panel_title" msgid="7944156115535366613">"Potrošnja baterije"</string>
@@ -739,7 +741,7 @@
<string name="lockscreen_unlock_left" msgid="2043092136246951985">"I leva prečica otključava"</string>
<string name="lockscreen_unlock_right" msgid="1529992940510318775">"I desna prečica otključava"</string>
<string name="lockscreen_none" msgid="4783896034844841821">"Ništa"</string>
- <string name="tuner_launch_app" msgid="1527264114781925348">"Pokretanje <xliff:g id="APP">%1$s</xliff:g>"</string>
+ <string name="tuner_launch_app" msgid="1527264114781925348">"Pokreni <xliff:g id="APP">%1$s</xliff:g>"</string>
<string name="tuner_other_apps" msgid="4726596850501162493">"Druge aplikacije"</string>
<string name="tuner_circle" msgid="2340998864056901350">"Krug"</string>
<string name="tuner_plus" msgid="6792960658533229675">"Plus"</string>
diff --git a/packages/SystemUI/res/values-be/strings.xml b/packages/SystemUI/res/values-be/strings.xml
index 15f1d86..dfad96c 100644
--- a/packages/SystemUI/res/values-be/strings.xml
+++ b/packages/SystemUI/res/values-be/strings.xml
@@ -583,6 +583,8 @@
<string name="snooze_option_15_min" msgid="1068727451405610715">"15 хвілін"</string>
<string name="snooze_option_30_min" msgid="867081342535195788">"30 хвілін"</string>
<string name="snooze_option_1_hour" msgid="1098086401880077154">"1 гадзіна"</string>
+ <!-- no translation found for snooze_option_2_hour (8332218255658969475) -->
+ <skip />
<string name="snooze_undo" msgid="6074877317002985129">"АДРАБІЦЬ"</string>
<string name="snoozed_for_time" msgid="2390718332980204462">"Адкладзена на <xliff:g id="TIME_AMOUNT">%1$s</xliff:g>"</string>
<string name="battery_panel_title" msgid="7944156115535366613">"Выкарыстанне зараду"</string>
diff --git a/packages/SystemUI/res/values-bg/strings.xml b/packages/SystemUI/res/values-bg/strings.xml
index b77cc9e..be327135 100644
--- a/packages/SystemUI/res/values-bg/strings.xml
+++ b/packages/SystemUI/res/values-bg/strings.xml
@@ -573,6 +573,8 @@
<string name="snooze_option_15_min" msgid="1068727451405610715">"15 минути"</string>
<string name="snooze_option_30_min" msgid="867081342535195788">"30 минути"</string>
<string name="snooze_option_1_hour" msgid="1098086401880077154">"1 час"</string>
+ <!-- no translation found for snooze_option_2_hour (8332218255658969475) -->
+ <skip />
<string name="snooze_undo" msgid="6074877317002985129">"ОТМЯНА"</string>
<string name="snoozed_for_time" msgid="2390718332980204462">"Отложено за <xliff:g id="TIME_AMOUNT">%1$s</xliff:g>"</string>
<string name="battery_panel_title" msgid="7944156115535366613">"Ползв. на батерията"</string>
diff --git a/packages/SystemUI/res/values-bn/strings.xml b/packages/SystemUI/res/values-bn/strings.xml
index b9fa325..822652b 100644
--- a/packages/SystemUI/res/values-bn/strings.xml
+++ b/packages/SystemUI/res/values-bn/strings.xml
@@ -573,6 +573,8 @@
<string name="snooze_option_15_min" msgid="1068727451405610715">"১৫ মিনিট"</string>
<string name="snooze_option_30_min" msgid="867081342535195788">"৩০ মিনিট"</string>
<string name="snooze_option_1_hour" msgid="1098086401880077154">"১ ঘণ্টা"</string>
+ <!-- no translation found for snooze_option_2_hour (8332218255658969475) -->
+ <skip />
<string name="snooze_undo" msgid="6074877317002985129">"পূর্বাবস্থায় ফিরুন"</string>
<string name="snoozed_for_time" msgid="2390718332980204462">"<xliff:g id="TIME_AMOUNT">%1$s</xliff:g> পরে আবার মনে করানো হবে"</string>
<string name="battery_panel_title" msgid="7944156115535366613">"ব্যাটারির ব্যবহার"</string>
diff --git a/packages/SystemUI/res/values-bs/strings.xml b/packages/SystemUI/res/values-bs/strings.xml
index 11450ae..e4e02d7 100644
--- a/packages/SystemUI/res/values-bs/strings.xml
+++ b/packages/SystemUI/res/values-bs/strings.xml
@@ -579,6 +579,8 @@
<string name="snooze_option_15_min" msgid="1068727451405610715">"15 minuta"</string>
<string name="snooze_option_30_min" msgid="867081342535195788">"30 minuta"</string>
<string name="snooze_option_1_hour" msgid="1098086401880077154">"1 sat"</string>
+ <!-- no translation found for snooze_option_2_hour (8332218255658969475) -->
+ <skip />
<string name="snooze_undo" msgid="6074877317002985129">"OPOZOVI"</string>
<string name="snoozed_for_time" msgid="2390718332980204462">"Odgođeno za <xliff:g id="TIME_AMOUNT">%1$s</xliff:g>"</string>
<string name="battery_panel_title" msgid="7944156115535366613">"Potrošnja baterije"</string>
diff --git a/packages/SystemUI/res/values-ca/strings.xml b/packages/SystemUI/res/values-ca/strings.xml
index 16f2a32..c9254ef 100644
--- a/packages/SystemUI/res/values-ca/strings.xml
+++ b/packages/SystemUI/res/values-ca/strings.xml
@@ -573,6 +573,8 @@
<string name="snooze_option_15_min" msgid="1068727451405610715">"15 minuts"</string>
<string name="snooze_option_30_min" msgid="867081342535195788">"30 minuts"</string>
<string name="snooze_option_1_hour" msgid="1098086401880077154">"1 hora"</string>
+ <!-- no translation found for snooze_option_2_hour (8332218255658969475) -->
+ <skip />
<string name="snooze_undo" msgid="6074877317002985129">"DESFÉS"</string>
<string name="snoozed_for_time" msgid="2390718332980204462">"S\'ha posposat <xliff:g id="TIME_AMOUNT">%1$s</xliff:g>"</string>
<string name="battery_panel_title" msgid="7944156115535366613">"Ús de la bateria"</string>
diff --git a/packages/SystemUI/res/values-cs/strings.xml b/packages/SystemUI/res/values-cs/strings.xml
index f4a45c2..2ad9dba 100644
--- a/packages/SystemUI/res/values-cs/strings.xml
+++ b/packages/SystemUI/res/values-cs/strings.xml
@@ -583,6 +583,8 @@
<string name="snooze_option_15_min" msgid="1068727451405610715">"15 minut"</string>
<string name="snooze_option_30_min" msgid="867081342535195788">"30 minut"</string>
<string name="snooze_option_1_hour" msgid="1098086401880077154">"1 hodina"</string>
+ <!-- no translation found for snooze_option_2_hour (8332218255658969475) -->
+ <skip />
<string name="snooze_undo" msgid="6074877317002985129">"VRÁTIT ZPĚT"</string>
<string name="snoozed_for_time" msgid="2390718332980204462">"Odloženo o <xliff:g id="TIME_AMOUNT">%1$s</xliff:g>"</string>
<string name="battery_panel_title" msgid="7944156115535366613">"Využití baterie"</string>
diff --git a/packages/SystemUI/res/values-da/strings.xml b/packages/SystemUI/res/values-da/strings.xml
index 55b39d5..e2852dd 100644
--- a/packages/SystemUI/res/values-da/strings.xml
+++ b/packages/SystemUI/res/values-da/strings.xml
@@ -573,6 +573,8 @@
<string name="snooze_option_15_min" msgid="1068727451405610715">"15 minutter"</string>
<string name="snooze_option_30_min" msgid="867081342535195788">"30 minutter"</string>
<string name="snooze_option_1_hour" msgid="1098086401880077154">"1 time"</string>
+ <!-- no translation found for snooze_option_2_hour (8332218255658969475) -->
+ <skip />
<string name="snooze_undo" msgid="6074877317002985129">"FORTRYD"</string>
<string name="snoozed_for_time" msgid="2390718332980204462">"Udsat i <xliff:g id="TIME_AMOUNT">%1$s</xliff:g>"</string>
<string name="battery_panel_title" msgid="7944156115535366613">"Batteriforbrug"</string>
diff --git a/packages/SystemUI/res/values-de/strings.xml b/packages/SystemUI/res/values-de/strings.xml
index bc7f1d5..b0b4323 100644
--- a/packages/SystemUI/res/values-de/strings.xml
+++ b/packages/SystemUI/res/values-de/strings.xml
@@ -575,6 +575,8 @@
<string name="snooze_option_15_min" msgid="1068727451405610715">"15 Minuten"</string>
<string name="snooze_option_30_min" msgid="867081342535195788">"30 Minuten"</string>
<string name="snooze_option_1_hour" msgid="1098086401880077154">"1 Stunde"</string>
+ <!-- no translation found for snooze_option_2_hour (8332218255658969475) -->
+ <skip />
<string name="snooze_undo" msgid="6074877317002985129">"RÜCKGÄNGIG"</string>
<string name="snoozed_for_time" msgid="2390718332980204462">"Erinnerung in <xliff:g id="TIME_AMOUNT">%1$s</xliff:g>"</string>
<string name="battery_panel_title" msgid="7944156115535366613">"Akkunutzung"</string>
diff --git a/packages/SystemUI/res/values-el/strings.xml b/packages/SystemUI/res/values-el/strings.xml
index bbefef4..5d87034 100644
--- a/packages/SystemUI/res/values-el/strings.xml
+++ b/packages/SystemUI/res/values-el/strings.xml
@@ -573,6 +573,8 @@
<string name="snooze_option_15_min" msgid="1068727451405610715">"15 λεπτά"</string>
<string name="snooze_option_30_min" msgid="867081342535195788">"30 λεπτά"</string>
<string name="snooze_option_1_hour" msgid="1098086401880077154">"1 ώρα"</string>
+ <!-- no translation found for snooze_option_2_hour (8332218255658969475) -->
+ <skip />
<string name="snooze_undo" msgid="6074877317002985129">"ΑΝΑΙΡΕΣΗ"</string>
<string name="snoozed_for_time" msgid="2390718332980204462">"Σε αφύπνιση για <xliff:g id="TIME_AMOUNT">%1$s</xliff:g>"</string>
<string name="battery_panel_title" msgid="7944156115535366613">"Χρήση της μπαταρίας"</string>
diff --git a/packages/SystemUI/res/values-en-rAU/strings.xml b/packages/SystemUI/res/values-en-rAU/strings.xml
index 2561d29..05c4130 100644
--- a/packages/SystemUI/res/values-en-rAU/strings.xml
+++ b/packages/SystemUI/res/values-en-rAU/strings.xml
@@ -573,6 +573,8 @@
<string name="snooze_option_15_min" msgid="1068727451405610715">"15 minutes"</string>
<string name="snooze_option_30_min" msgid="867081342535195788">"30 minutes"</string>
<string name="snooze_option_1_hour" msgid="1098086401880077154">"1 hour"</string>
+ <!-- no translation found for snooze_option_2_hour (8332218255658969475) -->
+ <skip />
<string name="snooze_undo" msgid="6074877317002985129">"UNDO"</string>
<string name="snoozed_for_time" msgid="2390718332980204462">"Snoozed for <xliff:g id="TIME_AMOUNT">%1$s</xliff:g>"</string>
<string name="battery_panel_title" msgid="7944156115535366613">"Battery usage"</string>
diff --git a/packages/SystemUI/res/values-en-rGB/strings.xml b/packages/SystemUI/res/values-en-rGB/strings.xml
index 2561d29..05c4130 100644
--- a/packages/SystemUI/res/values-en-rGB/strings.xml
+++ b/packages/SystemUI/res/values-en-rGB/strings.xml
@@ -573,6 +573,8 @@
<string name="snooze_option_15_min" msgid="1068727451405610715">"15 minutes"</string>
<string name="snooze_option_30_min" msgid="867081342535195788">"30 minutes"</string>
<string name="snooze_option_1_hour" msgid="1098086401880077154">"1 hour"</string>
+ <!-- no translation found for snooze_option_2_hour (8332218255658969475) -->
+ <skip />
<string name="snooze_undo" msgid="6074877317002985129">"UNDO"</string>
<string name="snoozed_for_time" msgid="2390718332980204462">"Snoozed for <xliff:g id="TIME_AMOUNT">%1$s</xliff:g>"</string>
<string name="battery_panel_title" msgid="7944156115535366613">"Battery usage"</string>
diff --git a/packages/SystemUI/res/values-en-rIN/strings.xml b/packages/SystemUI/res/values-en-rIN/strings.xml
index 2561d29..05c4130 100644
--- a/packages/SystemUI/res/values-en-rIN/strings.xml
+++ b/packages/SystemUI/res/values-en-rIN/strings.xml
@@ -573,6 +573,8 @@
<string name="snooze_option_15_min" msgid="1068727451405610715">"15 minutes"</string>
<string name="snooze_option_30_min" msgid="867081342535195788">"30 minutes"</string>
<string name="snooze_option_1_hour" msgid="1098086401880077154">"1 hour"</string>
+ <!-- no translation found for snooze_option_2_hour (8332218255658969475) -->
+ <skip />
<string name="snooze_undo" msgid="6074877317002985129">"UNDO"</string>
<string name="snoozed_for_time" msgid="2390718332980204462">"Snoozed for <xliff:g id="TIME_AMOUNT">%1$s</xliff:g>"</string>
<string name="battery_panel_title" msgid="7944156115535366613">"Battery usage"</string>
diff --git a/packages/SystemUI/res/values-es-rUS/strings.xml b/packages/SystemUI/res/values-es-rUS/strings.xml
index 64a4bfe..07b564d 100644
--- a/packages/SystemUI/res/values-es-rUS/strings.xml
+++ b/packages/SystemUI/res/values-es-rUS/strings.xml
@@ -575,6 +575,8 @@
<string name="snooze_option_15_min" msgid="1068727451405610715">"15 minutos"</string>
<string name="snooze_option_30_min" msgid="867081342535195788">"30 minutos"</string>
<string name="snooze_option_1_hour" msgid="1098086401880077154">"1 hora"</string>
+ <!-- no translation found for snooze_option_2_hour (8332218255658969475) -->
+ <skip />
<string name="snooze_undo" msgid="6074877317002985129">"DESHACER"</string>
<string name="snoozed_for_time" msgid="2390718332980204462">"Posponer <xliff:g id="TIME_AMOUNT">%1$s</xliff:g>"</string>
<string name="battery_panel_title" msgid="7944156115535366613">"Uso de la batería"</string>
diff --git a/packages/SystemUI/res/values-es/strings.xml b/packages/SystemUI/res/values-es/strings.xml
index 8d9f8a5..3bf6a8c 100644
--- a/packages/SystemUI/res/values-es/strings.xml
+++ b/packages/SystemUI/res/values-es/strings.xml
@@ -575,6 +575,8 @@
<string name="snooze_option_15_min" msgid="1068727451405610715">"15 minutos"</string>
<string name="snooze_option_30_min" msgid="867081342535195788">"30 minutos"</string>
<string name="snooze_option_1_hour" msgid="1098086401880077154">"1 hora"</string>
+ <!-- no translation found for snooze_option_2_hour (8332218255658969475) -->
+ <skip />
<string name="snooze_undo" msgid="6074877317002985129">"DESHACER"</string>
<string name="snoozed_for_time" msgid="2390718332980204462">"Volverá a mostrarse en <xliff:g id="TIME_AMOUNT">%1$s</xliff:g>"</string>
<string name="battery_panel_title" msgid="7944156115535366613">"Uso de la batería"</string>
diff --git a/packages/SystemUI/res/values-et/strings.xml b/packages/SystemUI/res/values-et/strings.xml
index 604d266..26b4603 100644
--- a/packages/SystemUI/res/values-et/strings.xml
+++ b/packages/SystemUI/res/values-et/strings.xml
@@ -575,6 +575,8 @@
<string name="snooze_option_15_min" msgid="1068727451405610715">"15 minutit"</string>
<string name="snooze_option_30_min" msgid="867081342535195788">"30 minutit"</string>
<string name="snooze_option_1_hour" msgid="1098086401880077154">"Üks tund"</string>
+ <!-- no translation found for snooze_option_2_hour (8332218255658969475) -->
+ <skip />
<string name="snooze_undo" msgid="6074877317002985129">"VÕTA TAGASI"</string>
<string name="snoozed_for_time" msgid="2390718332980204462">"Edasi lükatud <xliff:g id="TIME_AMOUNT">%1$s</xliff:g>"</string>
<string name="battery_panel_title" msgid="7944156115535366613">"Akukasutus"</string>
diff --git a/packages/SystemUI/res/values-eu/strings.xml b/packages/SystemUI/res/values-eu/strings.xml
index 2c83e5b..86fd3b2 100644
--- a/packages/SystemUI/res/values-eu/strings.xml
+++ b/packages/SystemUI/res/values-eu/strings.xml
@@ -575,6 +575,8 @@
<string name="snooze_option_15_min" msgid="1068727451405610715">"15 minutu"</string>
<string name="snooze_option_30_min" msgid="867081342535195788">"30 minutu"</string>
<string name="snooze_option_1_hour" msgid="1098086401880077154">"1 ordu"</string>
+ <!-- no translation found for snooze_option_2_hour (8332218255658969475) -->
+ <skip />
<string name="snooze_undo" msgid="6074877317002985129">"DESEGIN"</string>
<string name="snoozed_for_time" msgid="2390718332980204462">"<xliff:g id="TIME_AMOUNT">%1$s</xliff:g>z atzeratu da"</string>
<string name="battery_panel_title" msgid="7944156115535366613">"Bateriaren erabilera"</string>
diff --git a/packages/SystemUI/res/values-fa/strings.xml b/packages/SystemUI/res/values-fa/strings.xml
index 1f49e98..5570f9e 100644
--- a/packages/SystemUI/res/values-fa/strings.xml
+++ b/packages/SystemUI/res/values-fa/strings.xml
@@ -573,6 +573,8 @@
<string name="snooze_option_15_min" msgid="1068727451405610715">"۱۵ دقیقه"</string>
<string name="snooze_option_30_min" msgid="867081342535195788">"۳۰ دقیقه"</string>
<string name="snooze_option_1_hour" msgid="1098086401880077154">"۱ ساعت"</string>
+ <!-- no translation found for snooze_option_2_hour (8332218255658969475) -->
+ <skip />
<string name="snooze_undo" msgid="6074877317002985129">"واگرد"</string>
<string name="snoozed_for_time" msgid="2390718332980204462">"<xliff:g id="TIME_AMOUNT">%1$s</xliff:g> به تعویق افتاد"</string>
<string name="battery_panel_title" msgid="7944156115535366613">"مصرف باتری"</string>
diff --git a/packages/SystemUI/res/values-fi/strings.xml b/packages/SystemUI/res/values-fi/strings.xml
index f5b0b6b..c60c4c4 100644
--- a/packages/SystemUI/res/values-fi/strings.xml
+++ b/packages/SystemUI/res/values-fi/strings.xml
@@ -573,6 +573,8 @@
<string name="snooze_option_15_min" msgid="1068727451405610715">"15 minuuttia"</string>
<string name="snooze_option_30_min" msgid="867081342535195788">"30 minuuttia"</string>
<string name="snooze_option_1_hour" msgid="1098086401880077154">"1 tunti"</string>
+ <!-- no translation found for snooze_option_2_hour (8332218255658969475) -->
+ <skip />
<string name="snooze_undo" msgid="6074877317002985129">"KUMOA"</string>
<string name="snoozed_for_time" msgid="2390718332980204462">"Torkku: <xliff:g id="TIME_AMOUNT">%1$s</xliff:g>"</string>
<string name="battery_panel_title" msgid="7944156115535366613">"Akun käyttö"</string>
diff --git a/packages/SystemUI/res/values-fr-rCA/strings.xml b/packages/SystemUI/res/values-fr-rCA/strings.xml
index e615ff4..10b0cba 100644
--- a/packages/SystemUI/res/values-fr-rCA/strings.xml
+++ b/packages/SystemUI/res/values-fr-rCA/strings.xml
@@ -575,6 +575,8 @@
<string name="snooze_option_15_min" msgid="1068727451405610715">"15 minutes"</string>
<string name="snooze_option_30_min" msgid="867081342535195788">"30 minutes"</string>
<string name="snooze_option_1_hour" msgid="1098086401880077154">"1 heure"</string>
+ <!-- no translation found for snooze_option_2_hour (8332218255658969475) -->
+ <skip />
<string name="snooze_undo" msgid="6074877317002985129">"ANNULER"</string>
<string name="snoozed_for_time" msgid="2390718332980204462">"Reporté pour <xliff:g id="TIME_AMOUNT">%1$s</xliff:g>"</string>
<string name="battery_panel_title" msgid="7944156115535366613">"Utilisation de la pile"</string>
diff --git a/packages/SystemUI/res/values-fr/strings.xml b/packages/SystemUI/res/values-fr/strings.xml
index 18b9357..862d13f 100644
--- a/packages/SystemUI/res/values-fr/strings.xml
+++ b/packages/SystemUI/res/values-fr/strings.xml
@@ -575,6 +575,8 @@
<string name="snooze_option_15_min" msgid="1068727451405610715">"15 minutes"</string>
<string name="snooze_option_30_min" msgid="867081342535195788">"30 minutes"</string>
<string name="snooze_option_1_hour" msgid="1098086401880077154">"1 heure"</string>
+ <!-- no translation found for snooze_option_2_hour (8332218255658969475) -->
+ <skip />
<string name="snooze_undo" msgid="6074877317002985129">"ANNULER"</string>
<string name="snoozed_for_time" msgid="2390718332980204462">"Répétée après <xliff:g id="TIME_AMOUNT">%1$s</xliff:g>"</string>
<string name="battery_panel_title" msgid="7944156115535366613">"Utilisation batterie"</string>
@@ -719,8 +721,8 @@
<string name="pip_phone_minimize" msgid="1079119422589131792">"Réduire"</string>
<string name="pip_phone_close" msgid="8416647892889710330">"Fermer"</string>
<string name="pip_phone_dismiss_hint" msgid="6351678169095923899">"Faire glisser vers le bas pour ignorer"</string>
- <string name="pip_menu_title" msgid="3328510504196964712">"Menu PIP"</string>
- <string name="pip_notification_title" msgid="3204024940158161322">"<xliff:g id="NAME">%s</xliff:g> est en mode PIP"</string>
+ <string name="pip_menu_title" msgid="3328510504196964712">"Menu Picture-in-picture"</string>
+ <string name="pip_notification_title" msgid="3204024940158161322">"<xliff:g id="NAME">%s</xliff:g> est en mode Picture-in-picture"</string>
<string name="pip_notification_message" msgid="4171698133469539591">"Si vous ne voulez pas que l\'application <xliff:g id="NAME">%s</xliff:g> utilise cette fonctionnalité, appuyez ici pour ouvrir les paramètres et la désactiver."</string>
<string name="pip_play" msgid="1417176722760265888">"Lecture"</string>
<string name="pip_pause" msgid="8881063404466476571">"Suspendre"</string>
diff --git a/packages/SystemUI/res/values-fr/strings_tv.xml b/packages/SystemUI/res/values-fr/strings_tv.xml
index 3c0ad7a..43579af 100644
--- a/packages/SystemUI/res/values-fr/strings_tv.xml
+++ b/packages/SystemUI/res/values-fr/strings_tv.xml
@@ -19,7 +19,7 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="notification_channel_tv_pip" msgid="134047986446577723">"Picture-in-Picture"</string>
+ <string name="notification_channel_tv_pip" msgid="134047986446577723">"Picture-in-Picture (PIP)"</string>
<string name="pip_notification_unknown_title" msgid="6289156118095849438">"(Programme sans titre)"</string>
<string name="pip_close" msgid="3480680679023423574">"Fermer mode PIP"</string>
<string name="pip_fullscreen" msgid="8604643018538487816">"Plein écran"</string>
diff --git a/packages/SystemUI/res/values-gl/strings.xml b/packages/SystemUI/res/values-gl/strings.xml
index ff3dba4..0cb91b4 100644
--- a/packages/SystemUI/res/values-gl/strings.xml
+++ b/packages/SystemUI/res/values-gl/strings.xml
@@ -575,6 +575,8 @@
<string name="snooze_option_15_min" msgid="1068727451405610715">"15 minutos"</string>
<string name="snooze_option_30_min" msgid="867081342535195788">"30 minutos"</string>
<string name="snooze_option_1_hour" msgid="1098086401880077154">"1 hora"</string>
+ <!-- no translation found for snooze_option_2_hour (8332218255658969475) -->
+ <skip />
<string name="snooze_undo" msgid="6074877317002985129">"DESFACER"</string>
<string name="snoozed_for_time" msgid="2390718332980204462">"Adiouse <xliff:g id="TIME_AMOUNT">%1$s</xliff:g>"</string>
<string name="battery_panel_title" msgid="7944156115535366613">"Uso de batería"</string>
@@ -719,8 +721,8 @@
<string name="pip_phone_minimize" msgid="1079119422589131792">"Minimizar"</string>
<string name="pip_phone_close" msgid="8416647892889710330">"Pechar"</string>
<string name="pip_phone_dismiss_hint" msgid="6351678169095923899">"Arrastra cara abaixo para ignorar"</string>
- <string name="pip_menu_title" msgid="3328510504196964712">"Menú de imaxe superposta"</string>
- <string name="pip_notification_title" msgid="3204024940158161322">"<xliff:g id="NAME">%s</xliff:g> está na imaxe superposta"</string>
+ <string name="pip_menu_title" msgid="3328510504196964712">"Menú de pantalla superposta"</string>
+ <string name="pip_notification_title" msgid="3204024940158161322">"<xliff:g id="NAME">%s</xliff:g> está na pantalla superposta"</string>
<string name="pip_notification_message" msgid="4171698133469539591">"Se non queres que <xliff:g id="NAME">%s</xliff:g> utilice esta función, toca para abrir a configuración e desactivala."</string>
<string name="pip_play" msgid="1417176722760265888">"Reproducir"</string>
<string name="pip_pause" msgid="8881063404466476571">"Pausar"</string>
diff --git a/packages/SystemUI/res/values-gl/strings_tv.xml b/packages/SystemUI/res/values-gl/strings_tv.xml
index c7f0ce1..87a636c 100644
--- a/packages/SystemUI/res/values-gl/strings_tv.xml
+++ b/packages/SystemUI/res/values-gl/strings_tv.xml
@@ -19,7 +19,7 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="notification_channel_tv_pip" msgid="134047986446577723">"Imaxe superposta"</string>
+ <string name="notification_channel_tv_pip" msgid="134047986446577723">"Pantalla superposta"</string>
<string name="pip_notification_unknown_title" msgid="6289156118095849438">"(Programa sen título)"</string>
<string name="pip_close" msgid="3480680679023423574">"Pechar PIP"</string>
<string name="pip_fullscreen" msgid="8604643018538487816">"Pantalla completa"</string>
diff --git a/packages/SystemUI/res/values-gu/strings.xml b/packages/SystemUI/res/values-gu/strings.xml
index ca7a779..7f718d9 100644
--- a/packages/SystemUI/res/values-gu/strings.xml
+++ b/packages/SystemUI/res/values-gu/strings.xml
@@ -573,6 +573,8 @@
<string name="snooze_option_15_min" msgid="1068727451405610715">"15 મિનિટ"</string>
<string name="snooze_option_30_min" msgid="867081342535195788">"30 મિનિટ"</string>
<string name="snooze_option_1_hour" msgid="1098086401880077154">"1 કલાક"</string>
+ <!-- no translation found for snooze_option_2_hour (8332218255658969475) -->
+ <skip />
<string name="snooze_undo" msgid="6074877317002985129">"પૂર્વવત્ કરો"</string>
<string name="snoozed_for_time" msgid="2390718332980204462">"<xliff:g id="TIME_AMOUNT">%1$s</xliff:g> માટે સ્નૂઝ કરો"</string>
<string name="battery_panel_title" msgid="7944156115535366613">"બૅટરી વપરાશ"</string>
diff --git a/packages/SystemUI/res/values-hi/strings.xml b/packages/SystemUI/res/values-hi/strings.xml
index 9567c91..613d8d3 100644
--- a/packages/SystemUI/res/values-hi/strings.xml
+++ b/packages/SystemUI/res/values-hi/strings.xml
@@ -470,7 +470,7 @@
<string name="keyguard_indication_trust_disabled" msgid="7412534203633528135">"जब तक कि आप मैन्युअल रूप से अनलॉक नहीं करते तब तक डिवाइस लॉक रहेगा"</string>
<string name="hidden_notifications_title" msgid="7139628534207443290">"सूचनाएं अधिक तेज़ी से प्राप्त करें"</string>
<string name="hidden_notifications_text" msgid="2326409389088668981">"आपके द्वारा उन्हें अनलॉक किए जाने से पहले देखें"</string>
- <string name="hidden_notifications_cancel" msgid="3690709735122344913">"नहीं धन्यवाद"</string>
+ <string name="hidden_notifications_cancel" msgid="3690709735122344913">"रहने दें"</string>
<string name="hidden_notifications_setup" msgid="41079514801976810">"सेट करें"</string>
<string name="zen_mode_and_condition" msgid="4462471036429759903">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>. <xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string>
<string name="volume_zen_end_now" msgid="6930243045593601084">"अभी बंद करें"</string>
@@ -573,6 +573,8 @@
<string name="snooze_option_15_min" msgid="1068727451405610715">"15 मिनट"</string>
<string name="snooze_option_30_min" msgid="867081342535195788">"30 मिनट"</string>
<string name="snooze_option_1_hour" msgid="1098086401880077154">"1 घंटा"</string>
+ <!-- no translation found for snooze_option_2_hour (8332218255658969475) -->
+ <skip />
<string name="snooze_undo" msgid="6074877317002985129">"पहले जैसा करें"</string>
<string name="snoozed_for_time" msgid="2390718332980204462">"<xliff:g id="TIME_AMOUNT">%1$s</xliff:g> के लिए याद दिलाया गया"</string>
<string name="battery_panel_title" msgid="7944156115535366613">"बैटरी उपयोग"</string>
diff --git a/packages/SystemUI/res/values-hr/strings.xml b/packages/SystemUI/res/values-hr/strings.xml
index 2065b8c..e716f5d 100644
--- a/packages/SystemUI/res/values-hr/strings.xml
+++ b/packages/SystemUI/res/values-hr/strings.xml
@@ -577,6 +577,8 @@
<string name="snooze_option_15_min" msgid="1068727451405610715">"15 minuta"</string>
<string name="snooze_option_30_min" msgid="867081342535195788">"30 minuta"</string>
<string name="snooze_option_1_hour" msgid="1098086401880077154">"1 sat"</string>
+ <!-- no translation found for snooze_option_2_hour (8332218255658969475) -->
+ <skip />
<string name="snooze_undo" msgid="6074877317002985129">"PONIŠTI"</string>
<string name="snoozed_for_time" msgid="2390718332980204462">"Odgođeno <xliff:g id="TIME_AMOUNT">%1$s</xliff:g>"</string>
<string name="battery_panel_title" msgid="7944156115535366613">"Potrošnja baterije"</string>
diff --git a/packages/SystemUI/res/values-hu/strings.xml b/packages/SystemUI/res/values-hu/strings.xml
index d1e85d9..fe1b12b 100644
--- a/packages/SystemUI/res/values-hu/strings.xml
+++ b/packages/SystemUI/res/values-hu/strings.xml
@@ -573,6 +573,8 @@
<string name="snooze_option_15_min" msgid="1068727451405610715">"15 perc"</string>
<string name="snooze_option_30_min" msgid="867081342535195788">"30 perc"</string>
<string name="snooze_option_1_hour" msgid="1098086401880077154">"1 óra"</string>
+ <!-- no translation found for snooze_option_2_hour (8332218255658969475) -->
+ <skip />
<string name="snooze_undo" msgid="6074877317002985129">"VISSZAVONÁS"</string>
<string name="snoozed_for_time" msgid="2390718332980204462">"Elhalasztva: <xliff:g id="TIME_AMOUNT">%1$s</xliff:g>"</string>
<string name="battery_panel_title" msgid="7944156115535366613">"Akkumulátorhasználat"</string>
diff --git a/packages/SystemUI/res/values-hy/strings.xml b/packages/SystemUI/res/values-hy/strings.xml
index 4d1fc9f..bdceafe 100644
--- a/packages/SystemUI/res/values-hy/strings.xml
+++ b/packages/SystemUI/res/values-hy/strings.xml
@@ -155,7 +155,7 @@
<string name="accessibility_cell_data" msgid="5326139158682385073">"Բջջային ինտերնետ"</string>
<string name="accessibility_cell_data_on" msgid="5927098403452994422">"Բջջային տվյալները միացված են"</string>
<string name="accessibility_cell_data_off" msgid="443267573897409704">"Բջջային տվյալներն անջատված են"</string>
- <string name="accessibility_bluetooth_tether" msgid="4102784498140271969">"Bluetooth-ը կապվում է:"</string>
+ <string name="accessibility_bluetooth_tether" msgid="4102784498140271969">"Bluetooth մոդեմ"</string>
<string name="accessibility_airplane_mode" msgid="834748999790763092">"Ինքնաթիռի ռեժիմ"</string>
<string name="accessibility_vpn_on" msgid="5993385083262856059">"Միացնել VPN-ը։"</string>
<string name="accessibility_no_sims" msgid="3957997018324995781">"SIM քարտ չկա:"</string>
@@ -311,7 +311,7 @@
<string name="quick_settings_done" msgid="3402999958839153376">"Պատրաստ է"</string>
<string name="quick_settings_connected" msgid="1722253542984847487">"Կապակցված է"</string>
<string name="quick_settings_connecting" msgid="47623027419264404">"Միանում է..."</string>
- <string name="quick_settings_tethering_label" msgid="7153452060448575549">"Միացում"</string>
+ <string name="quick_settings_tethering_label" msgid="7153452060448575549">"Մոդեմի ռեժիմ"</string>
<string name="quick_settings_hotspot_label" msgid="6046917934974004879">"Թեժ կետ"</string>
<string name="quick_settings_notifications_label" msgid="4818156442169154523">"Ծանուցումներ"</string>
<string name="quick_settings_flashlight_label" msgid="2133093497691661546">"Լապտեր"</string>
@@ -573,6 +573,8 @@
<string name="snooze_option_15_min" msgid="1068727451405610715">"15 րոպե"</string>
<string name="snooze_option_30_min" msgid="867081342535195788">"30 րոպե"</string>
<string name="snooze_option_1_hour" msgid="1098086401880077154">"1 ժամ"</string>
+ <!-- no translation found for snooze_option_2_hour (8332218255658969475) -->
+ <skip />
<string name="snooze_undo" msgid="6074877317002985129">"ՀԵՏԱՐԿԵԼ"</string>
<string name="snoozed_for_time" msgid="2390718332980204462">"Հետաձգվել է <xliff:g id="TIME_AMOUNT">%1$s</xliff:g>ով"</string>
<string name="battery_panel_title" msgid="7944156115535366613">"Մարտկոցի օգտագործում"</string>
diff --git a/packages/SystemUI/res/values-hy/strings_tv.xml b/packages/SystemUI/res/values-hy/strings_tv.xml
index ac7711b..0493584 100644
--- a/packages/SystemUI/res/values-hy/strings_tv.xml
+++ b/packages/SystemUI/res/values-hy/strings_tv.xml
@@ -19,7 +19,7 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="notification_channel_tv_pip" msgid="134047986446577723">"Նկարը նկարի մեջ"</string>
+ <string name="notification_channel_tv_pip" msgid="134047986446577723">"Նկար նկարի մեջ"</string>
<string name="pip_notification_unknown_title" msgid="6289156118095849438">"(Առանց վերնագրի ծրագիր)"</string>
<string name="pip_close" msgid="3480680679023423574">"Փակել PIP-ն"</string>
<string name="pip_fullscreen" msgid="8604643018538487816">"Լիէկրան"</string>
diff --git a/packages/SystemUI/res/values-in/strings.xml b/packages/SystemUI/res/values-in/strings.xml
index 25a2a14..2853d9d 100644
--- a/packages/SystemUI/res/values-in/strings.xml
+++ b/packages/SystemUI/res/values-in/strings.xml
@@ -573,6 +573,8 @@
<string name="snooze_option_15_min" msgid="1068727451405610715">"15 menit"</string>
<string name="snooze_option_30_min" msgid="867081342535195788">"30 menit"</string>
<string name="snooze_option_1_hour" msgid="1098086401880077154">"1 jam"</string>
+ <!-- no translation found for snooze_option_2_hour (8332218255658969475) -->
+ <skip />
<string name="snooze_undo" msgid="6074877317002985129">"URUNG"</string>
<string name="snoozed_for_time" msgid="2390718332980204462">"Ditunda selama <xliff:g id="TIME_AMOUNT">%1$s</xliff:g>"</string>
<string name="battery_panel_title" msgid="7944156115535366613">"Pemakaian baterai"</string>
diff --git a/packages/SystemUI/res/values-is/strings.xml b/packages/SystemUI/res/values-is/strings.xml
index d2b9787..f56720a 100644
--- a/packages/SystemUI/res/values-is/strings.xml
+++ b/packages/SystemUI/res/values-is/strings.xml
@@ -573,6 +573,8 @@
<string name="snooze_option_15_min" msgid="1068727451405610715">"15 mínútur"</string>
<string name="snooze_option_30_min" msgid="867081342535195788">"30 mínútur"</string>
<string name="snooze_option_1_hour" msgid="1098086401880077154">"1 klukkustund"</string>
+ <!-- no translation found for snooze_option_2_hour (8332218255658969475) -->
+ <skip />
<string name="snooze_undo" msgid="6074877317002985129">"AFTURKALLA"</string>
<string name="snoozed_for_time" msgid="2390718332980204462">"Þaggað í <xliff:g id="TIME_AMOUNT">%1$s</xliff:g>"</string>
<string name="battery_panel_title" msgid="7944156115535366613">"Rafhlöðunotkun"</string>
diff --git a/packages/SystemUI/res/values-it/strings.xml b/packages/SystemUI/res/values-it/strings.xml
index 01b2464..cfe5deb 100644
--- a/packages/SystemUI/res/values-it/strings.xml
+++ b/packages/SystemUI/res/values-it/strings.xml
@@ -575,6 +575,8 @@
<string name="snooze_option_15_min" msgid="1068727451405610715">"15 minuti"</string>
<string name="snooze_option_30_min" msgid="867081342535195788">"30 minuti"</string>
<string name="snooze_option_1_hour" msgid="1098086401880077154">"1 ora"</string>
+ <!-- no translation found for snooze_option_2_hour (8332218255658969475) -->
+ <skip />
<string name="snooze_undo" msgid="6074877317002985129">"ANNULLA"</string>
<string name="snoozed_for_time" msgid="2390718332980204462">"Posticipato di <xliff:g id="TIME_AMOUNT">%1$s</xliff:g>"</string>
<string name="battery_panel_title" msgid="7944156115535366613">"Utilizzo batteria"</string>
diff --git a/packages/SystemUI/res/values-iw/strings.xml b/packages/SystemUI/res/values-iw/strings.xml
index b7e9508..4b1236e 100644
--- a/packages/SystemUI/res/values-iw/strings.xml
+++ b/packages/SystemUI/res/values-iw/strings.xml
@@ -581,6 +581,8 @@
<string name="snooze_option_15_min" msgid="1068727451405610715">"15 דקות"</string>
<string name="snooze_option_30_min" msgid="867081342535195788">"30 דקות"</string>
<string name="snooze_option_1_hour" msgid="1098086401880077154">"שעה אחת"</string>
+ <!-- no translation found for snooze_option_2_hour (8332218255658969475) -->
+ <skip />
<string name="snooze_undo" msgid="6074877317002985129">"ביטול"</string>
<string name="snoozed_for_time" msgid="2390718332980204462">"נדחה לטיפול בעוד <xliff:g id="TIME_AMOUNT">%1$s</xliff:g>"</string>
<string name="battery_panel_title" msgid="7944156115535366613">"שימוש בסוללה"</string>
@@ -638,7 +640,7 @@
<string name="headset" msgid="4534219457597457353">"אוזניות"</string>
<string name="accessibility_status_bar_headphones" msgid="9156307120060559989">"אוזניות מחוברות"</string>
<string name="accessibility_status_bar_headset" msgid="8666419213072449202">"אוזניות מחוברות"</string>
- <string name="data_saver" msgid="5037565123367048522">"חוסך הנתונים<br>(Data Saver)"</string>
+ <string name="data_saver" msgid="5037565123367048522">"חוסך הנתונים (Data Saver)"</string>
<string name="accessibility_data_saver_on" msgid="8454111686783887148">"חוסך הנתונים (Data Saver) פועל"</string>
<string name="accessibility_data_saver_off" msgid="8841582529453005337">"חוסך הנתונים (Data Saver) כבוי"</string>
<string name="switch_bar_on" msgid="1142437840752794229">"פועל"</string>
diff --git a/packages/SystemUI/res/values-ja/strings.xml b/packages/SystemUI/res/values-ja/strings.xml
index 15fccc6..4c7c85e 100644
--- a/packages/SystemUI/res/values-ja/strings.xml
+++ b/packages/SystemUI/res/values-ja/strings.xml
@@ -575,6 +575,8 @@
<string name="snooze_option_15_min" msgid="1068727451405610715">"15分"</string>
<string name="snooze_option_30_min" msgid="867081342535195788">"30分"</string>
<string name="snooze_option_1_hour" msgid="1098086401880077154">"1時間"</string>
+ <!-- no translation found for snooze_option_2_hour (8332218255658969475) -->
+ <skip />
<string name="snooze_undo" msgid="6074877317002985129">"元に戻す"</string>
<string name="snoozed_for_time" msgid="2390718332980204462">"スヌーズ: <xliff:g id="TIME_AMOUNT">%1$s</xliff:g>"</string>
<string name="battery_panel_title" msgid="7944156115535366613">"電池の使用状況"</string>
diff --git a/packages/SystemUI/res/values-ka/strings.xml b/packages/SystemUI/res/values-ka/strings.xml
index 17320ef..d8cbc19 100644
--- a/packages/SystemUI/res/values-ka/strings.xml
+++ b/packages/SystemUI/res/values-ka/strings.xml
@@ -573,6 +573,8 @@
<string name="snooze_option_15_min" msgid="1068727451405610715">"15 წუთი"</string>
<string name="snooze_option_30_min" msgid="867081342535195788">"30 წუთი"</string>
<string name="snooze_option_1_hour" msgid="1098086401880077154">"1 საათი"</string>
+ <!-- no translation found for snooze_option_2_hour (8332218255658969475) -->
+ <skip />
<string name="snooze_undo" msgid="6074877317002985129">"მოქმედების გაუქმება"</string>
<string name="snoozed_for_time" msgid="2390718332980204462">"ჩაჩუმებული იქნება <xliff:g id="TIME_AMOUNT">%1$s</xliff:g>"</string>
<string name="battery_panel_title" msgid="7944156115535366613">"ბატარეის მოხმარება"</string>
diff --git a/packages/SystemUI/res/values-kk/strings.xml b/packages/SystemUI/res/values-kk/strings.xml
index 724af88..f71601e 100644
--- a/packages/SystemUI/res/values-kk/strings.xml
+++ b/packages/SystemUI/res/values-kk/strings.xml
@@ -573,6 +573,8 @@
<string name="snooze_option_15_min" msgid="1068727451405610715">"15 минут"</string>
<string name="snooze_option_30_min" msgid="867081342535195788">"30 минут"</string>
<string name="snooze_option_1_hour" msgid="1098086401880077154">"1 сағат"</string>
+ <!-- no translation found for snooze_option_2_hour (8332218255658969475) -->
+ <skip />
<string name="snooze_undo" msgid="6074877317002985129">"КЕРІ ҚАЙТАРУ"</string>
<string name="snoozed_for_time" msgid="2390718332980204462">"<xliff:g id="TIME_AMOUNT">%1$s</xliff:g> кідіртілді"</string>
<string name="battery_panel_title" msgid="7944156115535366613">"Батареяны пайдалану"</string>
diff --git a/packages/SystemUI/res/values-km/strings.xml b/packages/SystemUI/res/values-km/strings.xml
index 229e345..9aed689 100644
--- a/packages/SystemUI/res/values-km/strings.xml
+++ b/packages/SystemUI/res/values-km/strings.xml
@@ -573,6 +573,8 @@
<string name="snooze_option_15_min" msgid="1068727451405610715">"15 នាទី"</string>
<string name="snooze_option_30_min" msgid="867081342535195788">"30 នាទី"</string>
<string name="snooze_option_1_hour" msgid="1098086401880077154">"1 ម៉ោង"</string>
+ <!-- no translation found for snooze_option_2_hour (8332218255658969475) -->
+ <skip />
<string name="snooze_undo" msgid="6074877317002985129">"មិនធ្វើវិញ"</string>
<string name="snoozed_for_time" msgid="2390718332980204462">"បានផ្អាករយៈពេល <xliff:g id="TIME_AMOUNT">%1$s</xliff:g>"</string>
<string name="battery_panel_title" msgid="7944156115535366613">"ការប្រើប្រាស់ថ្ម"</string>
diff --git a/packages/SystemUI/res/values-kn/strings.xml b/packages/SystemUI/res/values-kn/strings.xml
index 9c87cf7..cd85f74 100644
--- a/packages/SystemUI/res/values-kn/strings.xml
+++ b/packages/SystemUI/res/values-kn/strings.xml
@@ -573,6 +573,8 @@
<string name="snooze_option_15_min" msgid="1068727451405610715">"15 ನಿಮಿಷಗಳು"</string>
<string name="snooze_option_30_min" msgid="867081342535195788">"30 ನಿಮಿಷಗಳು"</string>
<string name="snooze_option_1_hour" msgid="1098086401880077154">"1 ಗಂಟೆ"</string>
+ <!-- no translation found for snooze_option_2_hour (8332218255658969475) -->
+ <skip />
<string name="snooze_undo" msgid="6074877317002985129">"ರದ್ದುಮಾಡಿ"</string>
<string name="snoozed_for_time" msgid="2390718332980204462">"<xliff:g id="TIME_AMOUNT">%1$s</xliff:g> ಗೆ ಸ್ನೂಜ್ ಮಾಡಲಾಗಿದೆ"</string>
<string name="battery_panel_title" msgid="7944156115535366613">"ಬ್ಯಾಟರಿ ಬಳಕೆ"</string>
diff --git a/packages/SystemUI/res/values-ko/strings.xml b/packages/SystemUI/res/values-ko/strings.xml
index c4f8e7b..a237ba9 100644
--- a/packages/SystemUI/res/values-ko/strings.xml
+++ b/packages/SystemUI/res/values-ko/strings.xml
@@ -575,6 +575,8 @@
<string name="snooze_option_15_min" msgid="1068727451405610715">"15분"</string>
<string name="snooze_option_30_min" msgid="867081342535195788">"30분"</string>
<string name="snooze_option_1_hour" msgid="1098086401880077154">"1시간"</string>
+ <!-- no translation found for snooze_option_2_hour (8332218255658969475) -->
+ <skip />
<string name="snooze_undo" msgid="6074877317002985129">"실행취소"</string>
<string name="snoozed_for_time" msgid="2390718332980204462">"<xliff:g id="TIME_AMOUNT">%1$s</xliff:g> 동안 일시 중지됨"</string>
<string name="battery_panel_title" msgid="7944156115535366613">"배터리 사용량"</string>
@@ -750,8 +752,8 @@
<string name="notification_channel_screenshot" msgid="6314080179230000938">"스크린샷"</string>
<string name="notification_channel_general" msgid="4525309436693914482">"일반 메시지"</string>
<string name="notification_channel_storage" msgid="3077205683020695313">"저장소"</string>
- <string name="instant_apps" msgid="6647570248119804907">"빠른 실행 앱"</string>
- <string name="instant_apps_message" msgid="8116608994995104836">"빠른 실행 앱은 설치가 필요하지 않습니다."</string>
+ <string name="instant_apps" msgid="6647570248119804907">"인스턴트 앱"</string>
+ <string name="instant_apps_message" msgid="8116608994995104836">"인스턴트 앱은 설치가 필요하지 않습니다."</string>
<string name="app_info" msgid="6856026610594615344">"앱 정보"</string>
<string name="go_to_web" msgid="1106022723459948514">"웹으로 이동"</string>
<string name="mobile_data" msgid="7094582042819250762">"모바일 데이터"</string>
diff --git a/packages/SystemUI/res/values-ky/strings.xml b/packages/SystemUI/res/values-ky/strings.xml
index 209d38d..1127c24 100644
--- a/packages/SystemUI/res/values-ky/strings.xml
+++ b/packages/SystemUI/res/values-ky/strings.xml
@@ -573,6 +573,8 @@
<string name="snooze_option_15_min" msgid="1068727451405610715">"15 мүнөт"</string>
<string name="snooze_option_30_min" msgid="867081342535195788">"30 мүнөт"</string>
<string name="snooze_option_1_hour" msgid="1098086401880077154">"1 саат"</string>
+ <!-- no translation found for snooze_option_2_hour (8332218255658969475) -->
+ <skip />
<string name="snooze_undo" msgid="6074877317002985129">"КАЙТАРУУ"</string>
<string name="snoozed_for_time" msgid="2390718332980204462">"<xliff:g id="TIME_AMOUNT">%1$s</xliff:g> тындырылды"</string>
<string name="battery_panel_title" msgid="7944156115535366613">"Батарея колдонулушу"</string>
diff --git a/packages/SystemUI/res/values-lo/strings.xml b/packages/SystemUI/res/values-lo/strings.xml
index 5369583..42baec6 100644
--- a/packages/SystemUI/res/values-lo/strings.xml
+++ b/packages/SystemUI/res/values-lo/strings.xml
@@ -573,6 +573,8 @@
<string name="snooze_option_15_min" msgid="1068727451405610715">"15 ນາທີ"</string>
<string name="snooze_option_30_min" msgid="867081342535195788">"30 ນາທີ"</string>
<string name="snooze_option_1_hour" msgid="1098086401880077154">"1 ຊົ່ວໂມງ"</string>
+ <!-- no translation found for snooze_option_2_hour (8332218255658969475) -->
+ <skip />
<string name="snooze_undo" msgid="6074877317002985129">"ຍົກເລີກ"</string>
<string name="snoozed_for_time" msgid="2390718332980204462">"ເລື່ອນໄປ <xliff:g id="TIME_AMOUNT">%1$s</xliff:g> ນາທີແລ້ວ"</string>
<string name="battery_panel_title" msgid="7944156115535366613">"ການໃຊ້ແບັດເຕີຣີ"</string>
diff --git a/packages/SystemUI/res/values-lt/strings.xml b/packages/SystemUI/res/values-lt/strings.xml
index cc123cf..ce403ef 100644
--- a/packages/SystemUI/res/values-lt/strings.xml
+++ b/packages/SystemUI/res/values-lt/strings.xml
@@ -581,6 +581,8 @@
<string name="snooze_option_15_min" msgid="1068727451405610715">"15 min."</string>
<string name="snooze_option_30_min" msgid="867081342535195788">"30 min."</string>
<string name="snooze_option_1_hour" msgid="1098086401880077154">"1 val."</string>
+ <!-- no translation found for snooze_option_2_hour (8332218255658969475) -->
+ <skip />
<string name="snooze_undo" msgid="6074877317002985129">"ANULIUOTI"</string>
<string name="snoozed_for_time" msgid="2390718332980204462">"Nustatyta snausti <xliff:g id="TIME_AMOUNT">%1$s</xliff:g>"</string>
<string name="battery_panel_title" msgid="7944156115535366613">"Akum. energ. vartoj."</string>
diff --git a/packages/SystemUI/res/values-lv/strings.xml b/packages/SystemUI/res/values-lv/strings.xml
index 9bd3c65..28758ca 100644
--- a/packages/SystemUI/res/values-lv/strings.xml
+++ b/packages/SystemUI/res/values-lv/strings.xml
@@ -577,6 +577,8 @@
<string name="snooze_option_15_min" msgid="1068727451405610715">"15 minūtes"</string>
<string name="snooze_option_30_min" msgid="867081342535195788">"30 minūtes"</string>
<string name="snooze_option_1_hour" msgid="1098086401880077154">"1 stunda"</string>
+ <!-- no translation found for snooze_option_2_hour (8332218255658969475) -->
+ <skip />
<string name="snooze_undo" msgid="6074877317002985129">"ATSAUKT"</string>
<string name="snoozed_for_time" msgid="2390718332980204462">"Atlikts: <xliff:g id="TIME_AMOUNT">%1$s</xliff:g>"</string>
<string name="battery_panel_title" msgid="7944156115535366613">"Akumulatora lietojums"</string>
diff --git a/packages/SystemUI/res/values-mk/strings.xml b/packages/SystemUI/res/values-mk/strings.xml
index 519cfac..3355090 100644
--- a/packages/SystemUI/res/values-mk/strings.xml
+++ b/packages/SystemUI/res/values-mk/strings.xml
@@ -573,6 +573,8 @@
<string name="snooze_option_15_min" msgid="1068727451405610715">"15 минути"</string>
<string name="snooze_option_30_min" msgid="867081342535195788">"30 минути"</string>
<string name="snooze_option_1_hour" msgid="1098086401880077154">"1 час"</string>
+ <!-- no translation found for snooze_option_2_hour (8332218255658969475) -->
+ <skip />
<string name="snooze_undo" msgid="6074877317002985129">"ВРАТИ"</string>
<string name="snoozed_for_time" msgid="2390718332980204462">"Одложено за <xliff:g id="TIME_AMOUNT">%1$s</xliff:g>"</string>
<string name="battery_panel_title" msgid="7944156115535366613">"Користење батерија"</string>
diff --git a/packages/SystemUI/res/values-ml/strings.xml b/packages/SystemUI/res/values-ml/strings.xml
index a7aa20a..a41e305 100644
--- a/packages/SystemUI/res/values-ml/strings.xml
+++ b/packages/SystemUI/res/values-ml/strings.xml
@@ -573,6 +573,8 @@
<string name="snooze_option_15_min" msgid="1068727451405610715">"15 മിനിറ്റ്"</string>
<string name="snooze_option_30_min" msgid="867081342535195788">"30 മിനിറ്റ്"</string>
<string name="snooze_option_1_hour" msgid="1098086401880077154">"ഒരു മണിക്കൂർ"</string>
+ <!-- no translation found for snooze_option_2_hour (8332218255658969475) -->
+ <skip />
<string name="snooze_undo" msgid="6074877317002985129">"പഴയപടിയാക്കുക"</string>
<string name="snoozed_for_time" msgid="2390718332980204462">"<xliff:g id="TIME_AMOUNT">%1$s</xliff:g> സമയത്തേക്ക് സ്നൂസ് ചെയ്തു"</string>
<string name="battery_panel_title" msgid="7944156115535366613">"ബാറ്ററി ഉപയോഗം"</string>
diff --git a/packages/SystemUI/res/values-mn/strings.xml b/packages/SystemUI/res/values-mn/strings.xml
index 7144c28..3a33cd6 100644
--- a/packages/SystemUI/res/values-mn/strings.xml
+++ b/packages/SystemUI/res/values-mn/strings.xml
@@ -573,6 +573,8 @@
<string name="snooze_option_15_min" msgid="1068727451405610715">"15 минут"</string>
<string name="snooze_option_30_min" msgid="867081342535195788">"30 минут"</string>
<string name="snooze_option_1_hour" msgid="1098086401880077154">"1 цаг"</string>
+ <!-- no translation found for snooze_option_2_hour (8332218255658969475) -->
+ <skip />
<string name="snooze_undo" msgid="6074877317002985129">"БУЦААХ"</string>
<string name="snoozed_for_time" msgid="2390718332980204462">"<xliff:g id="TIME_AMOUNT">%1$s</xliff:g>-д түр хойшлуулсан"</string>
<string name="battery_panel_title" msgid="7944156115535366613">"Тэжээл ашиглалт"</string>
diff --git a/packages/SystemUI/res/values-mr/strings.xml b/packages/SystemUI/res/values-mr/strings.xml
index f7360c9..ad107d8 100644
--- a/packages/SystemUI/res/values-mr/strings.xml
+++ b/packages/SystemUI/res/values-mr/strings.xml
@@ -573,6 +573,8 @@
<string name="snooze_option_15_min" msgid="1068727451405610715">"15 मिनिटे"</string>
<string name="snooze_option_30_min" msgid="867081342535195788">"30 मिनिटे"</string>
<string name="snooze_option_1_hour" msgid="1098086401880077154">"1 तास"</string>
+ <!-- no translation found for snooze_option_2_hour (8332218255658969475) -->
+ <skip />
<string name="snooze_undo" msgid="6074877317002985129">"पूर्ववत करा"</string>
<string name="snoozed_for_time" msgid="2390718332980204462">"<xliff:g id="TIME_AMOUNT">%1$s</xliff:g> साठी स्नूझ करा"</string>
<string name="battery_panel_title" msgid="7944156115535366613">"बॅटरी वापर"</string>
diff --git a/packages/SystemUI/res/values-ms/strings.xml b/packages/SystemUI/res/values-ms/strings.xml
index a05dd2b..898cdfc 100644
--- a/packages/SystemUI/res/values-ms/strings.xml
+++ b/packages/SystemUI/res/values-ms/strings.xml
@@ -573,6 +573,8 @@
<string name="snooze_option_15_min" msgid="1068727451405610715">"15 minit"</string>
<string name="snooze_option_30_min" msgid="867081342535195788">"30 minit"</string>
<string name="snooze_option_1_hour" msgid="1098086401880077154">"1 jam"</string>
+ <!-- no translation found for snooze_option_2_hour (8332218255658969475) -->
+ <skip />
<string name="snooze_undo" msgid="6074877317002985129">"BUAT ASAL"</string>
<string name="snoozed_for_time" msgid="2390718332980204462">"Ditunda selama <xliff:g id="TIME_AMOUNT">%1$s</xliff:g>"</string>
<string name="battery_panel_title" msgid="7944156115535366613">"Penggunaan bateri"</string>
diff --git a/packages/SystemUI/res/values-my/strings.xml b/packages/SystemUI/res/values-my/strings.xml
index 797aa97..346bbe2 100644
--- a/packages/SystemUI/res/values-my/strings.xml
+++ b/packages/SystemUI/res/values-my/strings.xml
@@ -573,6 +573,8 @@
<string name="snooze_option_15_min" msgid="1068727451405610715">"၁၅ မိနစ်"</string>
<string name="snooze_option_30_min" msgid="867081342535195788">"၃၀ မိနစ်"</string>
<string name="snooze_option_1_hour" msgid="1098086401880077154">"၁ နာရီ"</string>
+ <!-- no translation found for snooze_option_2_hour (8332218255658969475) -->
+ <skip />
<string name="snooze_undo" msgid="6074877317002985129">"တစ်ဆင့် နောက်ပြန်ပြန်ပါ"</string>
<string name="snoozed_for_time" msgid="2390718332980204462">"<xliff:g id="TIME_AMOUNT">%1$s</xliff:g> ဆိုင်းငံ့ရန်"</string>
<string name="battery_panel_title" msgid="7944156115535366613">"ဘက်ထရီ အသုံးပြုမှု"</string>
diff --git a/packages/SystemUI/res/values-nb/strings.xml b/packages/SystemUI/res/values-nb/strings.xml
index f59367f..a13c097 100644
--- a/packages/SystemUI/res/values-nb/strings.xml
+++ b/packages/SystemUI/res/values-nb/strings.xml
@@ -573,6 +573,8 @@
<string name="snooze_option_15_min" msgid="1068727451405610715">"15 minutter"</string>
<string name="snooze_option_30_min" msgid="867081342535195788">"30 minutter"</string>
<string name="snooze_option_1_hour" msgid="1098086401880077154">"1 time"</string>
+ <!-- no translation found for snooze_option_2_hour (8332218255658969475) -->
+ <skip />
<string name="snooze_undo" msgid="6074877317002985129">"ANGRE"</string>
<string name="snoozed_for_time" msgid="2390718332980204462">"Slumrer i <xliff:g id="TIME_AMOUNT">%1$s</xliff:g>"</string>
<string name="battery_panel_title" msgid="7944156115535366613">"Batteribruk"</string>
diff --git a/packages/SystemUI/res/values-ne/strings.xml b/packages/SystemUI/res/values-ne/strings.xml
index fb49b17..c8cd383 100644
--- a/packages/SystemUI/res/values-ne/strings.xml
+++ b/packages/SystemUI/res/values-ne/strings.xml
@@ -573,6 +573,8 @@
<string name="snooze_option_15_min" msgid="1068727451405610715">"१५ मिनेट"</string>
<string name="snooze_option_30_min" msgid="867081342535195788">"३० मिनेट"</string>
<string name="snooze_option_1_hour" msgid="1098086401880077154">"१ घन्टा"</string>
+ <!-- no translation found for snooze_option_2_hour (8332218255658969475) -->
+ <skip />
<string name="snooze_undo" msgid="6074877317002985129">"अनडू गर्नुहोस्"</string>
<string name="snoozed_for_time" msgid="2390718332980204462">"<xliff:g id="TIME_AMOUNT">%1$s</xliff:g> का लागि स्नुज गरियो"</string>
<string name="battery_panel_title" msgid="7944156115535366613">"ब्याट्री उपयोग"</string>
diff --git a/packages/SystemUI/res/values-nl/strings.xml b/packages/SystemUI/res/values-nl/strings.xml
index b708e66..78077e9 100644
--- a/packages/SystemUI/res/values-nl/strings.xml
+++ b/packages/SystemUI/res/values-nl/strings.xml
@@ -573,6 +573,8 @@
<string name="snooze_option_15_min" msgid="1068727451405610715">"15 minuten"</string>
<string name="snooze_option_30_min" msgid="867081342535195788">"30 minuten"</string>
<string name="snooze_option_1_hour" msgid="1098086401880077154">"1 uur"</string>
+ <!-- no translation found for snooze_option_2_hour (8332218255658969475) -->
+ <skip />
<string name="snooze_undo" msgid="6074877317002985129">"ONGEDAAN MAKEN"</string>
<string name="snoozed_for_time" msgid="2390718332980204462">"Snoozefunctie <xliff:g id="TIME_AMOUNT">%1$s</xliff:g> actief"</string>
<string name="battery_panel_title" msgid="7944156115535366613">"Accugebruik"</string>
diff --git a/packages/SystemUI/res/values-pa/strings.xml b/packages/SystemUI/res/values-pa/strings.xml
index 1039e34..07a0e82 100644
--- a/packages/SystemUI/res/values-pa/strings.xml
+++ b/packages/SystemUI/res/values-pa/strings.xml
@@ -573,6 +573,8 @@
<string name="snooze_option_15_min" msgid="1068727451405610715">"15 ਮਿੰਟ"</string>
<string name="snooze_option_30_min" msgid="867081342535195788">"30 ਮਿੰਟ"</string>
<string name="snooze_option_1_hour" msgid="1098086401880077154">"1 ਘੰਟਾ"</string>
+ <!-- no translation found for snooze_option_2_hour (8332218255658969475) -->
+ <skip />
<string name="snooze_undo" msgid="6074877317002985129">"ਅਣਕੀਤਾ ਕਰੋ"</string>
<string name="snoozed_for_time" msgid="2390718332980204462">"<xliff:g id="TIME_AMOUNT">%1$s</xliff:g> ਲਈ ਸਨੂਜ਼ ਕੀਤਾ ਗਿਆ"</string>
<string name="battery_panel_title" msgid="7944156115535366613">"ਬੈਟਰੀ ਵਰਤੋਂ"</string>
diff --git a/packages/SystemUI/res/values-pl/strings.xml b/packages/SystemUI/res/values-pl/strings.xml
index 91a7c09..03b5ed9 100644
--- a/packages/SystemUI/res/values-pl/strings.xml
+++ b/packages/SystemUI/res/values-pl/strings.xml
@@ -581,6 +581,8 @@
<string name="snooze_option_15_min" msgid="1068727451405610715">"15 min"</string>
<string name="snooze_option_30_min" msgid="867081342535195788">"30 min"</string>
<string name="snooze_option_1_hour" msgid="1098086401880077154">"1 godz."</string>
+ <!-- no translation found for snooze_option_2_hour (8332218255658969475) -->
+ <skip />
<string name="snooze_undo" msgid="6074877317002985129">"COFNIJ"</string>
<string name="snoozed_for_time" msgid="2390718332980204462">"Odłożono na <xliff:g id="TIME_AMOUNT">%1$s</xliff:g>"</string>
<string name="battery_panel_title" msgid="7944156115535366613">"Wykorzystanie baterii"</string>
diff --git a/packages/SystemUI/res/values-pt-rBR/strings.xml b/packages/SystemUI/res/values-pt-rBR/strings.xml
index ab705e7..8ef330b 100644
--- a/packages/SystemUI/res/values-pt-rBR/strings.xml
+++ b/packages/SystemUI/res/values-pt-rBR/strings.xml
@@ -575,6 +575,8 @@
<string name="snooze_option_15_min" msgid="1068727451405610715">"15 minutos"</string>
<string name="snooze_option_30_min" msgid="867081342535195788">"30 minutos"</string>
<string name="snooze_option_1_hour" msgid="1098086401880077154">"Uma hora"</string>
+ <!-- no translation found for snooze_option_2_hour (8332218255658969475) -->
+ <skip />
<string name="snooze_undo" msgid="6074877317002985129">"DESFAZER"</string>
<string name="snoozed_for_time" msgid="2390718332980204462">"Adiada para <xliff:g id="TIME_AMOUNT">%1$s</xliff:g>"</string>
<string name="battery_panel_title" msgid="7944156115535366613">"Uso da bateria"</string>
diff --git a/packages/SystemUI/res/values-pt-rPT/strings.xml b/packages/SystemUI/res/values-pt-rPT/strings.xml
index c5089a4..49f1480 100644
--- a/packages/SystemUI/res/values-pt-rPT/strings.xml
+++ b/packages/SystemUI/res/values-pt-rPT/strings.xml
@@ -26,8 +26,8 @@
<string name="status_bar_no_recent_apps" msgid="7374907845131203189">"Os ecrãs recentes aparecem aqui"</string>
<string name="status_bar_accessibility_dismiss_recents" msgid="4576076075226540105">"Ignorar aplicações recentes"</string>
<plurals name="status_bar_accessibility_recent_apps" formatted="false" msgid="9138535907802238759">
+ <item quantity="one">%d screens in Overview</item>
<item quantity="other">%d ecrãs na Vista geral</item>
- <item quantity="one">1 ecrã na Vista geral</item>
</plurals>
<string name="status_bar_no_notifications_title" msgid="4755261167193833213">"Sem notificações"</string>
<string name="status_bar_ongoing_events_title" msgid="1682504513316879202">"Em curso"</string>
@@ -252,8 +252,8 @@
<string name="accessibility_clear_all" msgid="5235938559247164925">"Limpar todas as notificações."</string>
<string name="notification_group_overflow_indicator" msgid="1863231301642314183">"+ <xliff:g id="NUMBER">%s</xliff:g>"</string>
<plurals name="notification_group_overflow_description" formatted="false" msgid="4579313201268495404">
+ <item quantity="one"><xliff:g id="NUMBER_1">%s</xliff:g> more notifications inside.</item>
<item quantity="other">Mais <xliff:g id="NUMBER_1">%s</xliff:g> notificações no grupo.</item>
- <item quantity="one">Mais <xliff:g id="NUMBER_0">%s</xliff:g> notificação no grupo.</item>
</plurals>
<string name="status_bar_notification_inspect_item_title" msgid="5668348142410115323">"Definições de notificação"</string>
<string name="status_bar_notification_app_settings_title" msgid="5525260160341558869">"Definições do <xliff:g id="APP_NAME">%s</xliff:g>"</string>
@@ -444,29 +444,29 @@
<string name="monitoring_description_managed_profile_ca_certificate" msgid="4683248196789897964">"A sua entidade instalou uma autoridade de certificação no seu perfil de trabalho. O tráfego da sua rede segura pode ser monitorizado ou alterado."</string>
<string name="monitoring_description_ca_certificate" msgid="7886985418413598352">"Está instalada uma autoridade de certificação neste dispositivo. O tráfego da sua rede segura pode ser monitorizado ou alterado."</string>
<string name="monitoring_description_management_network_logging" msgid="7184005419733060736">"O administrador ativou os registos de rede, que monitorizam o tráfego no seu dispositivo."</string>
- <string name="monitoring_description_named_vpn" msgid="7403457334088909254">"Está ligado à rede <xliff:g id="VPN_APP">%1$s</xliff:g>, que pode monitorizar a sua atividade de rede, incluindo emails, aplicações e Websites."</string>
- <string name="monitoring_description_two_named_vpns" msgid="4198511413729213802">"Está ligado às redes <xliff:g id="VPN_APP_0">%1$s</xliff:g> e <xliff:g id="VPN_APP_1">%2$s</xliff:g>, que podem monitorizar a sua atividade de rede, incluindo emails, aplicações e Websites."</string>
- <string name="monitoring_description_managed_profile_named_vpn" msgid="1427905889862420559">"O seu perfil de trabalho está ligado à rede <xliff:g id="VPN_APP">%1$s</xliff:g>, que pode monitorizar a sua atividade de rede, incluindo emails, aplicações e Websites."</string>
- <string name="monitoring_description_personal_profile_named_vpn" msgid="3133980926929069283">"O seu perfil pessoal está ligado à rede <xliff:g id="VPN_APP">%1$s</xliff:g>, que pode monitorizar a sua atividade de rede, incluindo emails, aplicações e Websites."</string>
+ <string name="monitoring_description_named_vpn" msgid="7403457334088909254">"Está ligado à rede <xliff:g id="VPN_APP">%1$s</xliff:g>, que pode monitorizar a sua atividade de rede, incluindo emails, aplicações e Sites."</string>
+ <string name="monitoring_description_two_named_vpns" msgid="4198511413729213802">"Está ligado às redes <xliff:g id="VPN_APP_0">%1$s</xliff:g> e <xliff:g id="VPN_APP_1">%2$s</xliff:g>, que podem monitorizar a sua atividade de rede, incluindo emails, aplicações e Sites."</string>
+ <string name="monitoring_description_managed_profile_named_vpn" msgid="1427905889862420559">"O seu perfil de trabalho está ligado à rede <xliff:g id="VPN_APP">%1$s</xliff:g>, que pode monitorizar a sua atividade de rede, incluindo emails, aplicações e Sites."</string>
+ <string name="monitoring_description_personal_profile_named_vpn" msgid="3133980926929069283">"O seu perfil pessoal está ligado à rede <xliff:g id="VPN_APP">%1$s</xliff:g>, que pode monitorizar a sua atividade de rede, incluindo emails, aplicações e Sites."</string>
<string name="monitoring_description_do_header_generic" msgid="96588491028288691">"O seu dispositivo é gerido pelo <xliff:g id="DEVICE_OWNER_APP">%1$s</xliff:g>."</string>
<string name="monitoring_description_do_header_with_name" msgid="5511133708978206460">"A <xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g> utiliza o <xliff:g id="DEVICE_OWNER_APP">%2$s</xliff:g> para gerir o seu dispositivo."</string>
<string name="monitoring_description_do_body" msgid="3639594537660975895">"O administ. pode monitorizar e gerir definições, acesso empresarial, aplic. e dados associados ao dispositivo, bem como inf. de localiz. do disp."</string>
<string name="monitoring_description_do_learn_more_separator" msgid="3785251953067436862">" "</string>
<string name="monitoring_description_do_learn_more" msgid="1849514470437907421">"Saiba mais"</string>
- <string name="monitoring_description_do_body_vpn" msgid="8255218762488901796">"Está ligado à rede <xliff:g id="VPN_APP">%1$s</xliff:g>, que pode monitorizar a sua atividade de rede, incluindo emails, aplicações e Websites."</string>
+ <string name="monitoring_description_do_body_vpn" msgid="8255218762488901796">"Está ligado à rede <xliff:g id="VPN_APP">%1$s</xliff:g>, que pode monitorizar a sua atividade de rede, incluindo emails, aplicações e Sites."</string>
<string name="monitoring_description_vpn_settings_separator" msgid="1933186756733474388">" "</string>
<string name="monitoring_description_vpn_settings" msgid="8869300202410505143">"Abrir as definições de VPN"</string>
<string name="monitoring_description_ca_cert_settings_separator" msgid="4987350385906393626">" "</string>
<string name="monitoring_description_ca_cert_settings" msgid="5489969458872997092">"Abrir credenciais fidedignas"</string>
<string name="monitoring_description_network_logging" msgid="7223505523384076027">"O seu administrador ativou os registos de rede, que monitorizam o tráfego no seu dispositivo.\n\nPara obter mais informações, contacte o administrador."</string>
- <string name="monitoring_description_vpn" msgid="4445150119515393526">"Concedeu autorização a uma aplicação para configurar uma ligação VPN.\n\nEsta aplicação pode monitorizar a atividade do dispositivo e da rede, incluindo emails, aplicações e Websites."</string>
- <string name="monitoring_description_vpn_profile_owned" msgid="2958019119161161530">"O seu perfil de trabalho é gerido por <xliff:g id="ORGANIZATION">%1$s</xliff:g>.\n\nO seu administrador tem a capacidade de monitorizar a sua atividade da rede, incluindo emails, aplicações e Websites.\n\nPara obter mais informações, contacte o administrador.\n\nAlém disso, está ligado a uma VPN, que pode monitorizar a sua atividade da rede."</string>
+ <string name="monitoring_description_vpn" msgid="4445150119515393526">"Concedeu autorização a uma aplicação para configurar uma ligação VPN.\n\nEsta aplicação pode monitorizar a atividade do dispositivo e da rede, incluindo emails, aplicações e Sites."</string>
+ <string name="monitoring_description_vpn_profile_owned" msgid="2958019119161161530">"O seu perfil de trabalho é gerido por <xliff:g id="ORGANIZATION">%1$s</xliff:g>.\n\nO seu administrador tem a capacidade de monitorizar a sua atividade da rede, incluindo emails, aplicações e Sites.\n\nPara obter mais informações, contacte o administrador.\n\nAlém disso, está ligado a uma VPN, que pode monitorizar a sua atividade da rede."</string>
<string name="legacy_vpn_name" msgid="6604123105765737830">"VPN"</string>
- <string name="monitoring_description_app" msgid="1828472472674709532">"Está associado à aplicação <xliff:g id="APPLICATION">%1$s</xliff:g>, que pode monitorizar a sua atividade de rede, incluindo emails, aplicações e Websites."</string>
- <string name="monitoring_description_app_personal" msgid="484599052118316268">"Está ligado a <xliff:g id="APPLICATION">%1$s</xliff:g>, que pode monitorizar a atividade da rede pessoal, incluindo emails, aplicações e Websites."</string>
- <string name="branded_monitoring_description_app_personal" msgid="2669518213949202599">"Está ligado ao <xliff:g id="APPLICATION">%1$s</xliff:g>, que pode monitorizar a atividade da rede pessoal, incluindo emails, aplicações e Websites."</string>
- <string name="monitoring_description_app_work" msgid="4612997849787922906">"O seu perfil de trabalho é gerido pela <xliff:g id="ORGANIZATION">%1$s</xliff:g>. O perfil está associado à aplicação <xliff:g id="APPLICATION">%2$s</xliff:g>, que pode monitorizar a atividade da rede de trabalho, incluindo emails, aplicações e Websites.\n\nContacte o administrador para obter mais informações."</string>
- <string name="monitoring_description_app_personal_work" msgid="5664165460056859391">"O seu perfil de trabalho é gerido pela <xliff:g id="ORGANIZATION">%1$s</xliff:g>. O perfil está associado à aplicação <xliff:g id="APPLICATION_WORK">%2$s</xliff:g>, que pode monitorizar a atividade da rede de trabalho, incluindo emails, aplicações e Websites.\n\nTambém está associado à aplicação <xliff:g id="APPLICATION_PERSONAL">%3$s</xliff:g>, que pode monitorizar a atividade da rede pessoal."</string>
+ <string name="monitoring_description_app" msgid="1828472472674709532">"Está associado à aplicação <xliff:g id="APPLICATION">%1$s</xliff:g>, que pode monitorizar a sua atividade de rede, incluindo emails, aplicações e Sites."</string>
+ <string name="monitoring_description_app_personal" msgid="484599052118316268">"Está ligado a <xliff:g id="APPLICATION">%1$s</xliff:g>, que pode monitorizar a atividade da rede pessoal, incluindo emails, aplicações e Sites."</string>
+ <string name="branded_monitoring_description_app_personal" msgid="2669518213949202599">"Está ligado ao <xliff:g id="APPLICATION">%1$s</xliff:g>, que pode monitorizar a atividade da rede pessoal, incluindo emails, aplicações e Sites."</string>
+ <string name="monitoring_description_app_work" msgid="4612997849787922906">"O seu perfil de trabalho é gerido pela <xliff:g id="ORGANIZATION">%1$s</xliff:g>. O perfil está associado à aplicação <xliff:g id="APPLICATION">%2$s</xliff:g>, que pode monitorizar a atividade da rede de trabalho, incluindo emails, aplicações e Sites.\n\nContacte o administrador para obter mais informações."</string>
+ <string name="monitoring_description_app_personal_work" msgid="5664165460056859391">"O seu perfil de trabalho é gerido pela <xliff:g id="ORGANIZATION">%1$s</xliff:g>. O perfil está associado à aplicação <xliff:g id="APPLICATION_WORK">%2$s</xliff:g>, que pode monitorizar a atividade da rede de trabalho, incluindo emails, aplicações e Sites.\n\nTambém está associado à aplicação <xliff:g id="APPLICATION_PERSONAL">%3$s</xliff:g>, que pode monitorizar a atividade da rede pessoal."</string>
<string name="keyguard_indication_trust_disabled" msgid="7412534203633528135">"O dispositivo permanecerá bloqueado até ser desbloqueado manualmente"</string>
<string name="hidden_notifications_title" msgid="7139628534207443290">"Receber notificações mais rapidamente"</string>
<string name="hidden_notifications_text" msgid="2326409389088668981">"Ver antes de desbloquear"</string>
@@ -552,13 +552,13 @@
<string name="notification_num_channels" msgid="2048144408999179471">"<xliff:g id="NUMBER">%d</xliff:g> categorias de notificação"</string>
<string name="notification_default_channel_desc" msgid="2506053815870808359">"Esta aplicação não tem categorias de notificação"</string>
<plurals name="notification_num_channels_desc" formatted="false" msgid="5492793452274077663">
+ <item quantity="one">1 out of <xliff:g id="NUMBER_1">%d</xliff:g> notification categories from this app</item>
<item quantity="other">1 de <xliff:g id="NUMBER_1">%d</xliff:g> categorias de notificação desta aplicação</item>
- <item quantity="one">1 de <xliff:g id="NUMBER_0">%d</xliff:g> categoria de notificação desta aplicação</item>
</plurals>
<string name="notification_channels_list_desc_2" msgid="6214732715833946441">"<xliff:g id="CHANNEL_NAME_1">%1$s</xliff:g>, <xliff:g id="CHANNEL_NAME_2">%2$s</xliff:g>"</string>
<plurals name="notification_channels_list_desc_2_and_others" formatted="false" msgid="2747813553355336157">
+ <item quantity="one"><xliff:g id="CHANNEL_NAME_1_3">%1$s</xliff:g>, <xliff:g id="CHANNEL_NAME_2_4">%2$s</xliff:g>, and <xliff:g id="NUMBER_5">%3$d</xliff:g> others</item>
<item quantity="other"><xliff:g id="CHANNEL_NAME_1_3">%1$s</xliff:g>, <xliff:g id="CHANNEL_NAME_2_4">%2$s</xliff:g> e mais <xliff:g id="NUMBER_5">%3$d</xliff:g></item>
- <item quantity="one"><xliff:g id="CHANNEL_NAME_1_0">%1$s</xliff:g>, <xliff:g id="CHANNEL_NAME_2_1">%2$s</xliff:g> e mais <xliff:g id="NUMBER_2">%3$d</xliff:g></item>
</plurals>
<string name="notification_channel_controls_opened_accessibility" msgid="6553950422055908113">"Controlos de notificações da aplicação <xliff:g id="APP_NAME">%1$s</xliff:g> abertos"</string>
<string name="notification_channel_controls_closed_accessibility" msgid="7521619812603693144">"Controlos de notificações da aplicação <xliff:g id="APP_NAME">%1$s</xliff:g> fechados"</string>
@@ -573,6 +573,8 @@
<string name="snooze_option_15_min" msgid="1068727451405610715">"15 minutos"</string>
<string name="snooze_option_30_min" msgid="867081342535195788">"30 minutos"</string>
<string name="snooze_option_1_hour" msgid="1098086401880077154">"1 hora"</string>
+ <!-- no translation found for snooze_option_2_hour (8332218255658969475) -->
+ <skip />
<string name="snooze_undo" msgid="6074877317002985129">"ANULAR"</string>
<string name="snoozed_for_time" msgid="2390718332980204462">"Suspensa por <xliff:g id="TIME_AMOUNT">%1$s</xliff:g>"</string>
<string name="battery_panel_title" msgid="7944156115535366613">"Utiliz. da bateria"</string>
diff --git a/packages/SystemUI/res/values-pt/strings.xml b/packages/SystemUI/res/values-pt/strings.xml
index ab705e7..8ef330b 100644
--- a/packages/SystemUI/res/values-pt/strings.xml
+++ b/packages/SystemUI/res/values-pt/strings.xml
@@ -575,6 +575,8 @@
<string name="snooze_option_15_min" msgid="1068727451405610715">"15 minutos"</string>
<string name="snooze_option_30_min" msgid="867081342535195788">"30 minutos"</string>
<string name="snooze_option_1_hour" msgid="1098086401880077154">"Uma hora"</string>
+ <!-- no translation found for snooze_option_2_hour (8332218255658969475) -->
+ <skip />
<string name="snooze_undo" msgid="6074877317002985129">"DESFAZER"</string>
<string name="snoozed_for_time" msgid="2390718332980204462">"Adiada para <xliff:g id="TIME_AMOUNT">%1$s</xliff:g>"</string>
<string name="battery_panel_title" msgid="7944156115535366613">"Uso da bateria"</string>
diff --git a/packages/SystemUI/res/values-ro/strings.xml b/packages/SystemUI/res/values-ro/strings.xml
index cadce25..29bc5bf 100644
--- a/packages/SystemUI/res/values-ro/strings.xml
+++ b/packages/SystemUI/res/values-ro/strings.xml
@@ -579,6 +579,8 @@
<string name="snooze_option_15_min" msgid="1068727451405610715">"15 minute"</string>
<string name="snooze_option_30_min" msgid="867081342535195788">"30 de minute"</string>
<string name="snooze_option_1_hour" msgid="1098086401880077154">"1 oră"</string>
+ <!-- no translation found for snooze_option_2_hour (8332218255658969475) -->
+ <skip />
<string name="snooze_undo" msgid="6074877317002985129">"ANULAȚI"</string>
<string name="snoozed_for_time" msgid="2390718332980204462">"Amânată <xliff:g id="TIME_AMOUNT">%1$s</xliff:g>"</string>
<string name="battery_panel_title" msgid="7944156115535366613">"Utilizarea bateriei"</string>
diff --git a/packages/SystemUI/res/values-ru/strings.xml b/packages/SystemUI/res/values-ru/strings.xml
index 34939b5..e593f89 100644
--- a/packages/SystemUI/res/values-ru/strings.xml
+++ b/packages/SystemUI/res/values-ru/strings.xml
@@ -583,6 +583,8 @@
<string name="snooze_option_15_min" msgid="1068727451405610715">"15 минут"</string>
<string name="snooze_option_30_min" msgid="867081342535195788">"30 минут"</string>
<string name="snooze_option_1_hour" msgid="1098086401880077154">"1 час"</string>
+ <!-- no translation found for snooze_option_2_hour (8332218255658969475) -->
+ <skip />
<string name="snooze_undo" msgid="6074877317002985129">"ОТМЕНИТЬ"</string>
<string name="snoozed_for_time" msgid="2390718332980204462">"Отложено на <xliff:g id="TIME_AMOUNT">%1$s</xliff:g>"</string>
<string name="battery_panel_title" msgid="7944156115535366613">"Уровень заряда"</string>
diff --git a/packages/SystemUI/res/values-si/strings.xml b/packages/SystemUI/res/values-si/strings.xml
index 7065c83..991be52 100644
--- a/packages/SystemUI/res/values-si/strings.xml
+++ b/packages/SystemUI/res/values-si/strings.xml
@@ -573,6 +573,8 @@
<string name="snooze_option_15_min" msgid="1068727451405610715">"මිනිත්තු 15"</string>
<string name="snooze_option_30_min" msgid="867081342535195788">"මිනිත්තු 30"</string>
<string name="snooze_option_1_hour" msgid="1098086401880077154">"පැය 1"</string>
+ <!-- no translation found for snooze_option_2_hour (8332218255658969475) -->
+ <skip />
<string name="snooze_undo" msgid="6074877317002985129">"අස් කරන්න"</string>
<string name="snoozed_for_time" msgid="2390718332980204462">"<xliff:g id="TIME_AMOUNT">%1$s</xliff:g>ක් මදක් නතර කරන ලදී"</string>
<string name="battery_panel_title" msgid="7944156115535366613">"බැටරි භාවිතය"</string>
diff --git a/packages/SystemUI/res/values-sk/strings.xml b/packages/SystemUI/res/values-sk/strings.xml
index 6e4c33b..33793ce 100644
--- a/packages/SystemUI/res/values-sk/strings.xml
+++ b/packages/SystemUI/res/values-sk/strings.xml
@@ -583,6 +583,8 @@
<string name="snooze_option_15_min" msgid="1068727451405610715">"15 minút"</string>
<string name="snooze_option_30_min" msgid="867081342535195788">"30 minút"</string>
<string name="snooze_option_1_hour" msgid="1098086401880077154">"1 hod."</string>
+ <!-- no translation found for snooze_option_2_hour (8332218255658969475) -->
+ <skip />
<string name="snooze_undo" msgid="6074877317002985129">"SPÄŤ"</string>
<string name="snoozed_for_time" msgid="2390718332980204462">"Stlmené na <xliff:g id="TIME_AMOUNT">%1$s</xliff:g>"</string>
<string name="battery_panel_title" msgid="7944156115535366613">"Využitie batérie"</string>
diff --git a/packages/SystemUI/res/values-sl/strings.xml b/packages/SystemUI/res/values-sl/strings.xml
index 46e6b5f..9e03e42 100644
--- a/packages/SystemUI/res/values-sl/strings.xml
+++ b/packages/SystemUI/res/values-sl/strings.xml
@@ -583,6 +583,8 @@
<string name="snooze_option_15_min" msgid="1068727451405610715">"15 minut"</string>
<string name="snooze_option_30_min" msgid="867081342535195788">"30 minut"</string>
<string name="snooze_option_1_hour" msgid="1098086401880077154">"1 ura"</string>
+ <!-- no translation found for snooze_option_2_hour (8332218255658969475) -->
+ <skip />
<string name="snooze_undo" msgid="6074877317002985129">"RAZVELJAVI"</string>
<string name="snoozed_for_time" msgid="2390718332980204462">"Preloženo za <xliff:g id="TIME_AMOUNT">%1$s</xliff:g>"</string>
<string name="battery_panel_title" msgid="7944156115535366613">"Poraba akumulatorja"</string>
@@ -758,8 +760,8 @@
<string name="notification_channel_screenshot" msgid="6314080179230000938">"Posnetki zaslona"</string>
<string name="notification_channel_general" msgid="4525309436693914482">"Splošna sporočila"</string>
<string name="notification_channel_storage" msgid="3077205683020695313">"Shramba"</string>
- <string name="instant_apps" msgid="6647570248119804907">"Aplikacije brez nameščanja"</string>
- <string name="instant_apps_message" msgid="8116608994995104836">"Aplikacij brez nameščanja ni treba namestiti."</string>
+ <string name="instant_apps" msgid="6647570248119804907">"Nenamestljive aplikacije"</string>
+ <string name="instant_apps_message" msgid="8116608994995104836">"Nenamestljivih aplikacij ni treba namestiti."</string>
<string name="app_info" msgid="6856026610594615344">"Podatki o aplikaciji"</string>
<string name="go_to_web" msgid="1106022723459948514">"Pojdi v splet"</string>
<string name="mobile_data" msgid="7094582042819250762">"Mobilni podatki"</string>
diff --git a/packages/SystemUI/res/values-sq/strings.xml b/packages/SystemUI/res/values-sq/strings.xml
index a68ec87..cbdb5b2 100644
--- a/packages/SystemUI/res/values-sq/strings.xml
+++ b/packages/SystemUI/res/values-sq/strings.xml
@@ -573,6 +573,8 @@
<string name="snooze_option_15_min" msgid="1068727451405610715">"15 minuta"</string>
<string name="snooze_option_30_min" msgid="867081342535195788">"30 minuta"</string>
<string name="snooze_option_1_hour" msgid="1098086401880077154">"1 orë"</string>
+ <!-- no translation found for snooze_option_2_hour (8332218255658969475) -->
+ <skip />
<string name="snooze_undo" msgid="6074877317002985129">"ZHBËJ"</string>
<string name="snoozed_for_time" msgid="2390718332980204462">"U shty për <xliff:g id="TIME_AMOUNT">%1$s</xliff:g>"</string>
<string name="battery_panel_title" msgid="7944156115535366613">"Përdorimi i baterisë"</string>
diff --git a/packages/SystemUI/res/values-sr/strings.xml b/packages/SystemUI/res/values-sr/strings.xml
index 596ef38..5c47907 100644
--- a/packages/SystemUI/res/values-sr/strings.xml
+++ b/packages/SystemUI/res/values-sr/strings.xml
@@ -473,7 +473,7 @@
<string name="hidden_notifications_title" msgid="7139628534207443290">"Брже добијајте обавештења"</string>
<string name="hidden_notifications_text" msgid="2326409389088668981">"Прегледајте их пре откључавања"</string>
<string name="hidden_notifications_cancel" msgid="3690709735122344913">"Не, хвала"</string>
- <string name="hidden_notifications_setup" msgid="41079514801976810">"Подеси"</string>
+ <string name="hidden_notifications_setup" msgid="41079514801976810">"Активирај"</string>
<string name="zen_mode_and_condition" msgid="4462471036429759903">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>. <xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string>
<string name="volume_zen_end_now" msgid="6930243045593601084">"Искључи одмах"</string>
<string name="accessibility_volume_expand" msgid="5946812790999244205">"Прошири"</string>
@@ -577,6 +577,8 @@
<string name="snooze_option_15_min" msgid="1068727451405610715">"15 минута"</string>
<string name="snooze_option_30_min" msgid="867081342535195788">"30 минута"</string>
<string name="snooze_option_1_hour" msgid="1098086401880077154">"1 сат"</string>
+ <!-- no translation found for snooze_option_2_hour (8332218255658969475) -->
+ <skip />
<string name="snooze_undo" msgid="6074877317002985129">"ОПОЗОВИ"</string>
<string name="snoozed_for_time" msgid="2390718332980204462">"Одложено је за <xliff:g id="TIME_AMOUNT">%1$s</xliff:g>"</string>
<string name="battery_panel_title" msgid="7944156115535366613">"Потрошња батерије"</string>
@@ -739,7 +741,7 @@
<string name="lockscreen_unlock_left" msgid="2043092136246951985">"И лева пречица откључава"</string>
<string name="lockscreen_unlock_right" msgid="1529992940510318775">"И десна пречица откључава"</string>
<string name="lockscreen_none" msgid="4783896034844841821">"Ништа"</string>
- <string name="tuner_launch_app" msgid="1527264114781925348">"Покретање <xliff:g id="APP">%1$s</xliff:g>"</string>
+ <string name="tuner_launch_app" msgid="1527264114781925348">"Покрени <xliff:g id="APP">%1$s</xliff:g>"</string>
<string name="tuner_other_apps" msgid="4726596850501162493">"Друге апликације"</string>
<string name="tuner_circle" msgid="2340998864056901350">"Круг"</string>
<string name="tuner_plus" msgid="6792960658533229675">"Плус"</string>
diff --git a/packages/SystemUI/res/values-sv/strings.xml b/packages/SystemUI/res/values-sv/strings.xml
index 685c0a4..967e3a5 100644
--- a/packages/SystemUI/res/values-sv/strings.xml
+++ b/packages/SystemUI/res/values-sv/strings.xml
@@ -573,6 +573,8 @@
<string name="snooze_option_15_min" msgid="1068727451405610715">"15 minuter"</string>
<string name="snooze_option_30_min" msgid="867081342535195788">"30 minuter"</string>
<string name="snooze_option_1_hour" msgid="1098086401880077154">"1 timme"</string>
+ <!-- no translation found for snooze_option_2_hour (8332218255658969475) -->
+ <skip />
<string name="snooze_undo" msgid="6074877317002985129">"ÅNGRA"</string>
<string name="snoozed_for_time" msgid="2390718332980204462">"Snoozad i <xliff:g id="TIME_AMOUNT">%1$s</xliff:g>"</string>
<string name="battery_panel_title" msgid="7944156115535366613">"Batteriförbrukning"</string>
diff --git a/packages/SystemUI/res/values-sw/strings.xml b/packages/SystemUI/res/values-sw/strings.xml
index 9a52d9b..8222074 100644
--- a/packages/SystemUI/res/values-sw/strings.xml
+++ b/packages/SystemUI/res/values-sw/strings.xml
@@ -573,6 +573,8 @@
<string name="snooze_option_15_min" msgid="1068727451405610715">"Dakika 15"</string>
<string name="snooze_option_30_min" msgid="867081342535195788">"Dakika 30"</string>
<string name="snooze_option_1_hour" msgid="1098086401880077154">"Saa 1"</string>
+ <!-- no translation found for snooze_option_2_hour (8332218255658969475) -->
+ <skip />
<string name="snooze_undo" msgid="6074877317002985129">"TENDUA"</string>
<string name="snoozed_for_time" msgid="2390718332980204462">"Imeahirishwa kwa <xliff:g id="TIME_AMOUNT">%1$s</xliff:g>"</string>
<string name="battery_panel_title" msgid="7944156115535366613">"Matumizi ya betri"</string>
diff --git a/packages/SystemUI/res/values-ta/strings.xml b/packages/SystemUI/res/values-ta/strings.xml
index 1c4b7de..eb672e1 100644
--- a/packages/SystemUI/res/values-ta/strings.xml
+++ b/packages/SystemUI/res/values-ta/strings.xml
@@ -573,6 +573,8 @@
<string name="snooze_option_15_min" msgid="1068727451405610715">"15 நிமிடங்கள்"</string>
<string name="snooze_option_30_min" msgid="867081342535195788">"30 நிமிடங்கள்"</string>
<string name="snooze_option_1_hour" msgid="1098086401880077154">"1 மணிநேரம்"</string>
+ <!-- no translation found for snooze_option_2_hour (8332218255658969475) -->
+ <skip />
<string name="snooze_undo" msgid="6074877317002985129">"செயல்தவிர்"</string>
<string name="snoozed_for_time" msgid="2390718332980204462">"உறக்கநிலையில் வைத்திருந்த நேரம்: <xliff:g id="TIME_AMOUNT">%1$s</xliff:g>"</string>
<string name="battery_panel_title" msgid="7944156115535366613">"பேட்டரி உபயோகம்"</string>
diff --git a/packages/SystemUI/res/values-te/strings.xml b/packages/SystemUI/res/values-te/strings.xml
index 2bdabd2..b5470e7 100644
--- a/packages/SystemUI/res/values-te/strings.xml
+++ b/packages/SystemUI/res/values-te/strings.xml
@@ -573,6 +573,8 @@
<string name="snooze_option_15_min" msgid="1068727451405610715">"15 నిమిషాలు"</string>
<string name="snooze_option_30_min" msgid="867081342535195788">"30 నిమిషాలు"</string>
<string name="snooze_option_1_hour" msgid="1098086401880077154">"1 గంట"</string>
+ <!-- no translation found for snooze_option_2_hour (8332218255658969475) -->
+ <skip />
<string name="snooze_undo" msgid="6074877317002985129">"చర్య రద్దు చేయి"</string>
<string name="snoozed_for_time" msgid="2390718332980204462">"<xliff:g id="TIME_AMOUNT">%1$s</xliff:g> వరకు తాత్కాలికంగా ఆపివేయబడింది"</string>
<string name="battery_panel_title" msgid="7944156115535366613">"బ్యాటరీ వినియోగం"</string>
diff --git a/packages/SystemUI/res/values-th/strings.xml b/packages/SystemUI/res/values-th/strings.xml
index 8077d14..f47cfa9 100644
--- a/packages/SystemUI/res/values-th/strings.xml
+++ b/packages/SystemUI/res/values-th/strings.xml
@@ -64,7 +64,7 @@
<string name="usb_debugging_message" msgid="2220143855912376496">"ลายนิ้วมือหลัก RSA ของคอมพิวเตอร์คือ:\n<xliff:g id="FINGERPRINT">%1$s</xliff:g>"</string>
<string name="usb_debugging_always" msgid="303335496705863070">"อนุญาตจากคอมพิวเตอร์เครื่องนี้เสมอ"</string>
<string name="usb_debugging_secondary_user_title" msgid="6353808721761220421">"ไม่อนุญาตให้แก้ไขข้อบกพร่องผ่าน USB"</string>
- <string name="usb_debugging_secondary_user_message" msgid="8572228137833020196">"ผู้ใช้ที่ลงชื่อเข้าใช้อุปกรณ์นี้อยู่ในขณะนี้ไม่สามารถเปิดการแก้ปัญหาผ่าน USB ได้ หากต้องการใช้คุณลักษณะนี้ โปรดเปลี่ยนไปเป็นผู้ใช้ที่เป็นผู้ดูแลระบบ"</string>
+ <string name="usb_debugging_secondary_user_message" msgid="8572228137833020196">"ผู้ใช้ที่ลงชื่อเข้าใช้อุปกรณ์นี้อยู่ในขณะนี้ไม่สามารถเปิดการแก้ปัญหาผ่าน USB ได้ หากต้องการใช้ฟีเจอร์นี้ โปรดเปลี่ยนไปเป็นผู้ใช้ที่เป็นผู้ดูแลระบบ"</string>
<string name="compat_mode_on" msgid="6623839244840638213">"ขยายจนเต็มหน้าจอ"</string>
<string name="compat_mode_off" msgid="4434467572461327898">"ยืดจนเต็มหน้าจอ"</string>
<string name="screenshot_saving_ticker" msgid="7403652894056693515">"กำลังบันทึกภาพหน้าจอ..."</string>
@@ -524,12 +524,12 @@
<string name="accessibility_status_bar_hotspot" msgid="4099381329956402865">"ฮอตสปอต"</string>
<string name="accessibility_managed_profile" msgid="6613641363112584120">"โปรไฟล์งาน"</string>
<string name="tuner_warning_title" msgid="7094689930793031682">"เพลิดเพลินกับบางส่วนแต่ไม่ใช่ทั้งหมด"</string>
- <string name="tuner_warning" msgid="8730648121973575701">"ตัวรับสัญญาณ UI ระบบช่วยให้คุณมีวิธีพิเศษในการปรับแต่งและกำหนดค่าส่วนติดต่อผู้ใช้ Android คุณลักษณะรุ่นทดลองเหล่านี้อาจมีการเปลี่ยนแปลง ขัดข้อง หรือหายไปในเวอร์ชันอนาคต โปรดดำเนินการด้วยความระมัดระวัง"</string>
- <string name="tuner_persistent_warning" msgid="8597333795565621795">"คุณลักษณะรุ่นทดลองเหล่านี้อาจมีการเปลี่ยนแปลง ขัดข้อง หรือหายไปในเวอร์ชันอนาคต โปรดดำเนินการด้วยความระมัดระวัง"</string>
+ <string name="tuner_warning" msgid="8730648121973575701">"ตัวรับสัญญาณ UI ระบบช่วยให้คุณมีวิธีพิเศษในการปรับแต่งและกำหนดค่าส่วนติดต่อผู้ใช้ Android ฟีเจอร์รุ่นทดลองเหล่านี้อาจมีการเปลี่ยนแปลง ขัดข้อง หรือหายไปในเวอร์ชันอนาคต โปรดดำเนินการด้วยความระมัดระวัง"</string>
+ <string name="tuner_persistent_warning" msgid="8597333795565621795">"ฟีเจอร์รุ่นทดลองเหล่านี้อาจมีการเปลี่ยนแปลง ขัดข้อง หรือหายไปในเวอร์ชันอนาคต โปรดดำเนินการด้วยความระมัดระวัง"</string>
<string name="got_it" msgid="2239653834387972602">"รับทราบ"</string>
<string name="tuner_toast" msgid="603429811084428439">"ยินดีด้วย! เพิ่มตัวรับสัญญาณ UI ระบบไปยังการตั้งค่าแล้ว"</string>
<string name="remove_from_settings" msgid="8389591916603406378">"นำออกจากการตั้งค่า"</string>
- <string name="remove_from_settings_prompt" msgid="6069085993355887748">"นำตัวรับสัญญาณ UI ระบบออกจากการตั้งค่าและหยุดใช้คุณลักษณะทั้งหมดของตัวรับสัญญาณใช่ไหม"</string>
+ <string name="remove_from_settings_prompt" msgid="6069085993355887748">"นำตัวรับสัญญาณ UI ระบบออกจากการตั้งค่าและหยุดใช้ฟีเจอร์ทั้งหมดของตัวรับสัญญาณใช่ไหม"</string>
<string name="activity_not_found" msgid="348423244327799974">"ยังไม่ได้ติดตั้งแอปพลิเคชันบนอุปกรณ์ของคุณ"</string>
<string name="clock_seconds" msgid="7689554147579179507">"แสดงวินาทีของนาฬิกา"</string>
<string name="clock_seconds_desc" msgid="6282693067130470675">"แสดงวินาทีของนาฬิกาในแถบสถานะ อาจส่งผลต่ออายุแบตเตอรี"</string>
@@ -573,6 +573,8 @@
<string name="snooze_option_15_min" msgid="1068727451405610715">"15 นาที"</string>
<string name="snooze_option_30_min" msgid="867081342535195788">"30 นาที"</string>
<string name="snooze_option_1_hour" msgid="1098086401880077154">"1 ชั่วโมง"</string>
+ <!-- no translation found for snooze_option_2_hour (8332218255658969475) -->
+ <skip />
<string name="snooze_undo" msgid="6074877317002985129">"เลิกทำ"</string>
<string name="snoozed_for_time" msgid="2390718332980204462">"ปิดเสียงเตือนชั่วคราวไว้เป็นเวลา <xliff:g id="TIME_AMOUNT">%1$s</xliff:g>"</string>
<string name="battery_panel_title" msgid="7944156115535366613">"การใช้งานแบตเตอรี่"</string>
@@ -719,7 +721,7 @@
<string name="pip_phone_dismiss_hint" msgid="6351678169095923899">"ลากลงเพื่อปิด"</string>
<string name="pip_menu_title" msgid="3328510504196964712">"เมนูการแสดงผลหลายแหล่งพร้อมกัน"</string>
<string name="pip_notification_title" msgid="3204024940158161322">"<xliff:g id="NAME">%s</xliff:g> ใช้การแสดงผลหลายแหล่งพร้อมกัน"</string>
- <string name="pip_notification_message" msgid="4171698133469539591">"หากคุณไม่ต้องการให้ <xliff:g id="NAME">%s</xliff:g> ใช้คุณลักษณะนี้ ให้แตะเพื่อเปิดการตั้งค่าแล้วปิดคุณลักษณะ"</string>
+ <string name="pip_notification_message" msgid="4171698133469539591">"หากคุณไม่ต้องการให้ <xliff:g id="NAME">%s</xliff:g> ใช้ฟีเจอร์นี้ ให้แตะเพื่อเปิดการตั้งค่าแล้วปิดฟีเจอร์"</string>
<string name="pip_play" msgid="1417176722760265888">"เล่น"</string>
<string name="pip_pause" msgid="8881063404466476571">"หยุดชั่วคราว"</string>
<string name="pip_skip_to_next" msgid="1948440006726306284">"ข้ามไปรายการถัดไป"</string>
@@ -728,7 +730,7 @@
<string name="thermal_shutdown_message" msgid="9006456746902370523">"ขณะนี้โทรศัพท์ทำงานเป็นปกติ"</string>
<string name="thermal_shutdown_dialog_message" msgid="566347880005304139">"โทรศัพท์ร้อนเกินไปจึงปิดเครื่องเพื่อให้เย็นลง ขณะนี้โทรศัพท์ทำงานเป็นปกติ\n\nโทรศัพท์อาจร้อนเกินไปหากคุณ\n • ใช้แอปที่ใช้ทรัพยากรมาก (เช่น เกม วิดีโอ หรือแอปการนำทาง)\n • ดาวน์โหลดหรืออัปโหลดไฟล์ขนาดใหญ่\n • ใช้โทรศัพท์ในอุณหภูมิที่สูง"</string>
<string name="high_temp_title" msgid="4589508026407318374">"โทรศัพท์เริ่มเครื่องร้อน"</string>
- <string name="high_temp_notif_message" msgid="5642466103153429279">"คุณลักษณะบางอย่างจะใช้งานได้จำกัดขณะโทรศัพท์ลดอุณหภูมิลง"</string>
+ <string name="high_temp_notif_message" msgid="5642466103153429279">"ฟีเจอร์บางอย่างจะใช้งานได้จำกัดขณะโทรศัพท์ลดอุณหภูมิลง"</string>
<string name="high_temp_dialog_message" msgid="6840700639374113553">"โทรศัพท์จะพยายามลดอุณหภูมิลงโดยอัตโนมัติ คุณยังสามารถใช้โทรศัพท์ได้ แต่โทรศัพท์อาจทำงานช้าลง\n\nโทรศัพท์จะทำงานตามปกติเมื่อเย็นลงแล้ว"</string>
<string name="lockscreen_shortcut_left" msgid="2182769107618938629">"ทางลัดทางซ้าย"</string>
<string name="lockscreen_shortcut_right" msgid="3328683699505226536">"ทางลัดทางขวา"</string>
diff --git a/packages/SystemUI/res/values-tl/strings.xml b/packages/SystemUI/res/values-tl/strings.xml
index 194b161..3304ab7 100644
--- a/packages/SystemUI/res/values-tl/strings.xml
+++ b/packages/SystemUI/res/values-tl/strings.xml
@@ -573,6 +573,8 @@
<string name="snooze_option_15_min" msgid="1068727451405610715">"15 minuto"</string>
<string name="snooze_option_30_min" msgid="867081342535195788">"30 minuto"</string>
<string name="snooze_option_1_hour" msgid="1098086401880077154">"1 oras"</string>
+ <!-- no translation found for snooze_option_2_hour (8332218255658969475) -->
+ <skip />
<string name="snooze_undo" msgid="6074877317002985129">"I-UNDO"</string>
<string name="snoozed_for_time" msgid="2390718332980204462">"Na-snooze ng <xliff:g id="TIME_AMOUNT">%1$s</xliff:g>"</string>
<string name="battery_panel_title" msgid="7944156115535366613">"Paggamit ng baterya"</string>
diff --git a/packages/SystemUI/res/values-tr/strings.xml b/packages/SystemUI/res/values-tr/strings.xml
index 7f1d8ff..944316c 100644
--- a/packages/SystemUI/res/values-tr/strings.xml
+++ b/packages/SystemUI/res/values-tr/strings.xml
@@ -573,6 +573,8 @@
<string name="snooze_option_15_min" msgid="1068727451405610715">"15 dakika"</string>
<string name="snooze_option_30_min" msgid="867081342535195788">"30 dakika"</string>
<string name="snooze_option_1_hour" msgid="1098086401880077154">"1 saat"</string>
+ <!-- no translation found for snooze_option_2_hour (8332218255658969475) -->
+ <skip />
<string name="snooze_undo" msgid="6074877317002985129">"GERİ AL"</string>
<string name="snoozed_for_time" msgid="2390718332980204462">"<xliff:g id="TIME_AMOUNT">%1$s</xliff:g> süreyle ertelendi"</string>
<string name="battery_panel_title" msgid="7944156115535366613">"Pil kullanımı"</string>
diff --git a/packages/SystemUI/res/values-uk/strings.xml b/packages/SystemUI/res/values-uk/strings.xml
index 1006eae..5636a87 100644
--- a/packages/SystemUI/res/values-uk/strings.xml
+++ b/packages/SystemUI/res/values-uk/strings.xml
@@ -583,6 +583,8 @@
<string name="snooze_option_15_min" msgid="1068727451405610715">"15 хвилин"</string>
<string name="snooze_option_30_min" msgid="867081342535195788">"30 хвилин"</string>
<string name="snooze_option_1_hour" msgid="1098086401880077154">"1 годину"</string>
+ <!-- no translation found for snooze_option_2_hour (8332218255658969475) -->
+ <skip />
<string name="snooze_undo" msgid="6074877317002985129">"ВІДМІНИТИ"</string>
<string name="snoozed_for_time" msgid="2390718332980204462">"Відкладено на <xliff:g id="TIME_AMOUNT">%1$s</xliff:g>"</string>
<string name="battery_panel_title" msgid="7944156115535366613">"Використання заряду"</string>
diff --git a/packages/SystemUI/res/values-ur/strings.xml b/packages/SystemUI/res/values-ur/strings.xml
index 9f28494..7a5f1c7 100644
--- a/packages/SystemUI/res/values-ur/strings.xml
+++ b/packages/SystemUI/res/values-ur/strings.xml
@@ -573,6 +573,8 @@
<string name="snooze_option_15_min" msgid="1068727451405610715">"15 منٹ"</string>
<string name="snooze_option_30_min" msgid="867081342535195788">"30 منٹ"</string>
<string name="snooze_option_1_hour" msgid="1098086401880077154">"1 گھنٹہ"</string>
+ <!-- no translation found for snooze_option_2_hour (8332218255658969475) -->
+ <skip />
<string name="snooze_undo" msgid="6074877317002985129">"کالعدم کریں"</string>
<string name="snoozed_for_time" msgid="2390718332980204462">"<xliff:g id="TIME_AMOUNT">%1$s</xliff:g> کیلئے اسنوز کیا گیا"</string>
<string name="battery_panel_title" msgid="7944156115535366613">"بیٹری کا استعمال"</string>
diff --git a/packages/SystemUI/res/values-uz/strings.xml b/packages/SystemUI/res/values-uz/strings.xml
index 02f7c43..262225c 100644
--- a/packages/SystemUI/res/values-uz/strings.xml
+++ b/packages/SystemUI/res/values-uz/strings.xml
@@ -201,7 +201,7 @@
<string name="accessibility_quick_settings_airplane_changed_off" msgid="66846307818850664">"Parvoz rejimi o‘chirildi."</string>
<string name="accessibility_quick_settings_airplane_changed_on" msgid="8983005603505087728">"Parvoz rejimi yoqildi."</string>
<string name="accessibility_quick_settings_dnd_priority_on" msgid="1448402297221249355">"“Bezovta qilinmasin” funksiyasi yoqilgan, faqat muhim bildirishnomalar ko‘rsatiladi."</string>
- <string name="accessibility_quick_settings_dnd_none_on" msgid="6882582132662613537">"Bezovta qilinmasin, tinchlik saqlansin"</string>
+ <string name="accessibility_quick_settings_dnd_none_on" msgid="6882582132662613537">"Bezovta qilinmasin, jimjitlik."</string>
<string name="accessibility_quick_settings_dnd_alarms_on" msgid="9152834845587554157">"Bezovta qilinmasin, faqat signallar"</string>
<string name="accessibility_quick_settings_dnd" msgid="6607873236717185815">"Bezovta qilinmasin."</string>
<string name="accessibility_quick_settings_dnd_off" msgid="2371832603753738581">"“Bezovta qilinmasin” funksiyasi o‘chirilgan."</string>
@@ -575,6 +575,8 @@
<string name="snooze_option_15_min" msgid="1068727451405610715">"15 daqiqa"</string>
<string name="snooze_option_30_min" msgid="867081342535195788">"30 daqiqa"</string>
<string name="snooze_option_1_hour" msgid="1098086401880077154">"1 soat"</string>
+ <!-- no translation found for snooze_option_2_hour (8332218255658969475) -->
+ <skip />
<string name="snooze_undo" msgid="6074877317002985129">"BEKOR QILISH"</string>
<string name="snoozed_for_time" msgid="2390718332980204462">"<xliff:g id="TIME_AMOUNT">%1$s</xliff:g> muddatga kechiktirildi"</string>
<string name="battery_panel_title" msgid="7944156115535366613">"Batareya sarfi"</string>
diff --git a/packages/SystemUI/res/values-vi/strings.xml b/packages/SystemUI/res/values-vi/strings.xml
index 167d0a1..1d125f6 100644
--- a/packages/SystemUI/res/values-vi/strings.xml
+++ b/packages/SystemUI/res/values-vi/strings.xml
@@ -575,6 +575,8 @@
<string name="snooze_option_15_min" msgid="1068727451405610715">"15 phút"</string>
<string name="snooze_option_30_min" msgid="867081342535195788">"30 phút"</string>
<string name="snooze_option_1_hour" msgid="1098086401880077154">"1 giờ"</string>
+ <!-- no translation found for snooze_option_2_hour (8332218255658969475) -->
+ <skip />
<string name="snooze_undo" msgid="6074877317002985129">"HOÀN TÁC"</string>
<string name="snoozed_for_time" msgid="2390718332980204462">"Báo lại sau <xliff:g id="TIME_AMOUNT">%1$s</xliff:g>"</string>
<string name="battery_panel_title" msgid="7944156115535366613">"Mức sử dụng pin"</string>
diff --git a/packages/SystemUI/res/values-zh-rCN/strings.xml b/packages/SystemUI/res/values-zh-rCN/strings.xml
index cf9b7d2..600e17d 100644
--- a/packages/SystemUI/res/values-zh-rCN/strings.xml
+++ b/packages/SystemUI/res/values-zh-rCN/strings.xml
@@ -573,6 +573,8 @@
<string name="snooze_option_15_min" msgid="1068727451405610715">"15 分钟"</string>
<string name="snooze_option_30_min" msgid="867081342535195788">"30 分钟"</string>
<string name="snooze_option_1_hour" msgid="1098086401880077154">"1 小时"</string>
+ <!-- no translation found for snooze_option_2_hour (8332218255658969475) -->
+ <skip />
<string name="snooze_undo" msgid="6074877317002985129">"撤消"</string>
<string name="snoozed_for_time" msgid="2390718332980204462">"已延后 <xliff:g id="TIME_AMOUNT">%1$s</xliff:g>"</string>
<string name="battery_panel_title" msgid="7944156115535366613">"电池使用情况"</string>
diff --git a/packages/SystemUI/res/values-zh-rHK/strings.xml b/packages/SystemUI/res/values-zh-rHK/strings.xml
index d123c93..109c33e 100644
--- a/packages/SystemUI/res/values-zh-rHK/strings.xml
+++ b/packages/SystemUI/res/values-zh-rHK/strings.xml
@@ -575,6 +575,8 @@
<string name="snooze_option_15_min" msgid="1068727451405610715">"15 分鐘"</string>
<string name="snooze_option_30_min" msgid="867081342535195788">"30 分鐘"</string>
<string name="snooze_option_1_hour" msgid="1098086401880077154">"1 小時"</string>
+ <!-- no translation found for snooze_option_2_hour (8332218255658969475) -->
+ <skip />
<string name="snooze_undo" msgid="6074877317002985129">"復原"</string>
<string name="snoozed_for_time" msgid="2390718332980204462">"已延後 <xliff:g id="TIME_AMOUNT">%1$s</xliff:g>"</string>
<string name="battery_panel_title" msgid="7944156115535366613">"電池用量"</string>
diff --git a/packages/SystemUI/res/values-zh-rTW/strings.xml b/packages/SystemUI/res/values-zh-rTW/strings.xml
index af7ed48..353d985 100644
--- a/packages/SystemUI/res/values-zh-rTW/strings.xml
+++ b/packages/SystemUI/res/values-zh-rTW/strings.xml
@@ -268,7 +268,7 @@
<string name="ethernet_label" msgid="7967563676324087464">"乙太網路"</string>
<string name="quick_settings_dnd_label" msgid="8735855737575028208">"零打擾"</string>
<string name="quick_settings_dnd_priority_label" msgid="483232950670692036">"僅限優先通知"</string>
- <string name="quick_settings_dnd_alarms_label" msgid="2559229444312445858">"僅允許鬧鐘"</string>
+ <string name="quick_settings_dnd_alarms_label" msgid="2559229444312445858">"僅限鬧鐘"</string>
<string name="quick_settings_dnd_none_label" msgid="5025477807123029478">"完全靜音"</string>
<string name="quick_settings_bluetooth_label" msgid="6304190285170721401">"藍牙"</string>
<string name="quick_settings_bluetooth_multiple_devices_label" msgid="3912245565613684735">"藍牙 (<xliff:g id="NUMBER">%d</xliff:g> 個裝置)"</string>
@@ -369,7 +369,7 @@
<string name="interruption_level_none_with_warning" msgid="5114872171614161084">"完全靜音。這也會關閉螢幕閱讀器的音訊。"</string>
<string name="interruption_level_none" msgid="6000083681244492992">"完全靜音"</string>
<string name="interruption_level_priority" msgid="6426766465363855505">"僅限優先通知"</string>
- <string name="interruption_level_alarms" msgid="5226306993448328896">"僅允許鬧鐘"</string>
+ <string name="interruption_level_alarms" msgid="5226306993448328896">"僅限鬧鐘"</string>
<string name="interruption_level_none_twoline" msgid="3957581548190765889">"完全\n靜音"</string>
<string name="interruption_level_priority_twoline" msgid="1564715335217164124">"僅允許\n優先通知"</string>
<string name="interruption_level_alarms_twoline" msgid="3266909566410106146">"僅允許\n鬧鐘"</string>
@@ -573,6 +573,8 @@
<string name="snooze_option_15_min" msgid="1068727451405610715">"15 分鐘"</string>
<string name="snooze_option_30_min" msgid="867081342535195788">"30 分鐘"</string>
<string name="snooze_option_1_hour" msgid="1098086401880077154">"1 小時"</string>
+ <!-- no translation found for snooze_option_2_hour (8332218255658969475) -->
+ <skip />
<string name="snooze_undo" msgid="6074877317002985129">"復原"</string>
<string name="snoozed_for_time" msgid="2390718332980204462">"已延後 <xliff:g id="TIME_AMOUNT">%1$s</xliff:g>"</string>
<string name="battery_panel_title" msgid="7944156115535366613">"電池用量"</string>
diff --git a/packages/SystemUI/res/values-zu/strings.xml b/packages/SystemUI/res/values-zu/strings.xml
index c1765c6..d81c320 100644
--- a/packages/SystemUI/res/values-zu/strings.xml
+++ b/packages/SystemUI/res/values-zu/strings.xml
@@ -573,6 +573,8 @@
<string name="snooze_option_15_min" msgid="1068727451405610715">"15 amaminithi"</string>
<string name="snooze_option_30_min" msgid="867081342535195788">"30 amaminithi"</string>
<string name="snooze_option_1_hour" msgid="1098086401880077154">"1 ihora"</string>
+ <!-- no translation found for snooze_option_2_hour (8332218255658969475) -->
+ <skip />
<string name="snooze_undo" msgid="6074877317002985129">"HLEHLISA"</string>
<string name="snoozed_for_time" msgid="2390718332980204462">"Kusnuzwe u-<xliff:g id="TIME_AMOUNT">%1$s</xliff:g>"</string>
<string name="battery_panel_title" msgid="7944156115535366613">"Ukusetshenziswa kwebhethri"</string>
diff --git a/packages/SystemUI/res/values/dimens.xml b/packages/SystemUI/res/values/dimens.xml
index 6604b6c..4245b11 100644
--- a/packages/SystemUI/res/values/dimens.xml
+++ b/packages/SystemUI/res/values/dimens.xml
@@ -249,7 +249,6 @@
<dimen name="qs_panel_padding_bottom">0dp</dimen>
<dimen name="qs_detail_header_height">56dp</dimen>
<dimen name="qs_detail_header_padding">0dp</dimen>
- <dimen name="qs_detail_header_bottom_padding">0dp</dimen>
<dimen name="qs_detail_image_width">56dp</dimen>
<dimen name="qs_detail_image_height">56dp</dimen>
<dimen name="qs_detail_image_padding">16dp</dimen>
diff --git a/packages/SystemUI/res/values/strings.xml b/packages/SystemUI/res/values/strings.xml
index c656b17..994a566 100644
--- a/packages/SystemUI/res/values/strings.xml
+++ b/packages/SystemUI/res/values/strings.xml
@@ -1508,6 +1508,8 @@
<string name="snooze_option_30_min">30 minutes</string>
<!-- Notification: Menu row: Snooze options: 1 hour option. [CHAR LIMIT=50]-->
<string name="snooze_option_1_hour">1 hour</string>
+ <!-- Notification: Menu row: Snooze options: 1 hour option. [CHAR LIMIT=50]-->
+ <string name="snooze_option_2_hour">2 hours</string>
<!-- Notification: Menu row: Snooze undo button label. [CHAR LIMIT=50]-->
<string name="snooze_undo">UNDO</string>
diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardStatusView.java b/packages/SystemUI/src/com/android/keyguard/KeyguardStatusView.java
index de462d3..d214d55 100644
--- a/packages/SystemUI/src/com/android/keyguard/KeyguardStatusView.java
+++ b/packages/SystemUI/src/com/android/keyguard/KeyguardStatusView.java
@@ -147,8 +147,10 @@
mClockView.setLayoutParams(layoutParams);
mDateView.setTextSize(TypedValue.COMPLEX_UNIT_PX,
getResources().getDimensionPixelSize(R.dimen.widget_label_font_size));
- mOwnerInfo.setTextSize(TypedValue.COMPLEX_UNIT_PX,
- getResources().getDimensionPixelSize(R.dimen.widget_label_font_size));
+ if (mOwnerInfo != null) {
+ mOwnerInfo.setTextSize(TypedValue.COMPLEX_UNIT_PX,
+ getResources().getDimensionPixelSize(R.dimen.widget_label_font_size));
+ }
}
public void refreshTime() {
diff --git a/packages/SystemUI/src/com/android/systemui/BatteryMeterView.java b/packages/SystemUI/src/com/android/systemui/BatteryMeterView.java
index 9dd39d4..cf8747e 100644
--- a/packages/SystemUI/src/com/android/systemui/BatteryMeterView.java
+++ b/packages/SystemUI/src/com/android/systemui/BatteryMeterView.java
@@ -89,7 +89,7 @@
TypedArray atts = context.obtainStyledAttributes(attrs, R.styleable.BatteryMeterView,
defStyle, 0);
final int frameColor = atts.getColor(R.styleable.BatteryMeterView_frameColor,
- context.getColor(R.color.batterymeter_frame_color));
+ context.getColor(R.color.meter_background_color));
mDrawable = new BatteryMeterDrawableBase(context, frameColor);
atts.recycle();
diff --git a/packages/SystemUI/src/com/android/systemui/RecentsComponent.java b/packages/SystemUI/src/com/android/systemui/RecentsComponent.java
index cdad8ae..44a044b 100644
--- a/packages/SystemUI/src/com/android/systemui/RecentsComponent.java
+++ b/packages/SystemUI/src/com/android/systemui/RecentsComponent.java
@@ -22,9 +22,6 @@
public interface RecentsComponent {
void showRecentApps(boolean triggeredFromAltTab, boolean fromHome);
- void hideRecentApps(boolean triggeredFromAltTab, boolean triggeredFromHomeKey);
- void toggleRecents();
- void preloadRecents();
void showNextAffiliatedTask();
void showPrevAffiliatedTask();
diff --git a/packages/SystemUI/src/com/android/systemui/SwipeHelper.java b/packages/SystemUI/src/com/android/systemui/SwipeHelper.java
index 9c03ea6..74b745f 100644
--- a/packages/SystemUI/src/com/android/systemui/SwipeHelper.java
+++ b/packages/SystemUI/src/com/android/systemui/SwipeHelper.java
@@ -653,15 +653,19 @@
}
public boolean isDismissGesture(MotionEvent ev) {
+ return ev.getActionMasked() == MotionEvent.ACTION_UP
+ && !isFalseGesture(ev) && (swipedFastEnough() || swipedFarEnough())
+ && mCallback.canChildBeDismissed(mCurrView);
+ }
+
+ public boolean isFalseGesture(MotionEvent ev) {
boolean falsingDetected = mCallback.isAntiFalsingNeeded();
if (mFalsingManager.isClassiferEnabled()) {
falsingDetected = falsingDetected && mFalsingManager.isFalseTouch();
} else {
falsingDetected = falsingDetected && !mTouchAboveFalsingThreshold;
}
- return !falsingDetected && (swipedFastEnough() || swipedFarEnough())
- && ev.getActionMasked() == MotionEvent.ACTION_UP
- && mCallback.canChildBeDismissed(mCurrView);
+ return falsingDetected;
}
protected boolean swipedFastEnough() {
diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java b/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java
index 2d7521d..b977dd4 100644
--- a/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java
+++ b/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java
@@ -1827,11 +1827,11 @@
mWakeAndUnlocking = false;
setShowingLocked(false);
+ mDismissCallbackRegistry.notifyDismissSucceeded();
mStatusBarKeyguardViewManager.hide(startTime, fadeoutDuration);
resetKeyguardDonePendingLocked();
mHideAnimationRun = false;
adjustStatusBarLocked();
- mDismissCallbackRegistry.notifyDismissSucceeded();
sendUserPresentBroadcast();
mUpdateMonitor.setKeyguardGoingAway(false /* goingAway */);
}
diff --git a/packages/SystemUI/src/com/android/systemui/pip/BasePipManager.java b/packages/SystemUI/src/com/android/systemui/pip/BasePipManager.java
index 68c8007..36dbb0f 100644
--- a/packages/SystemUI/src/com/android/systemui/pip/BasePipManager.java
+++ b/packages/SystemUI/src/com/android/systemui/pip/BasePipManager.java
@@ -17,12 +17,13 @@
package com.android.systemui.pip;
import android.content.Context;
+import android.content.res.Configuration;
import java.io.PrintWriter;
public interface BasePipManager {
void initialize(Context context);
void showPictureInPictureMenu();
- void onConfigurationChanged();
+ void onConfigurationChanged(Configuration newConfig);
void dump(PrintWriter pw);
}
diff --git a/packages/SystemUI/src/com/android/systemui/pip/PipUI.java b/packages/SystemUI/src/com/android/systemui/pip/PipUI.java
index a1f6553..b7164cb 100644
--- a/packages/SystemUI/src/com/android/systemui/pip/PipUI.java
+++ b/packages/SystemUI/src/com/android/systemui/pip/PipUI.java
@@ -72,7 +72,7 @@
return;
}
- mPipManager.onConfigurationChanged();
+ mPipManager.onConfigurationChanged(newConfig);
}
@Override
diff --git a/packages/SystemUI/src/com/android/systemui/pip/phone/PipManager.java b/packages/SystemUI/src/com/android/systemui/pip/phone/PipManager.java
index 0da4681..0373d77 100644
--- a/packages/SystemUI/src/com/android/systemui/pip/phone/PipManager.java
+++ b/packages/SystemUI/src/com/android/systemui/pip/phone/PipManager.java
@@ -25,6 +25,7 @@
import android.content.ComponentName;
import android.content.Context;
import android.content.pm.ParceledListSlice;
+import android.content.res.Configuration;
import android.graphics.Rect;
import android.os.Handler;
import android.os.RemoteException;
@@ -70,7 +71,7 @@
TaskStackListener mTaskStackListener = new TaskStackListener() {
@Override
public void onActivityPinned(String packageName, int taskId) {
- if (!checkCurrentUserId(false /* debug */)) {
+ if (!checkCurrentUserId(mContext, false /* debug */)) {
return;
}
@@ -85,7 +86,7 @@
@Override
public void onActivityUnpinned() {
- if (!checkCurrentUserId(false /* debug */)) {
+ if (!checkCurrentUserId(mContext, false /* debug */)) {
return;
}
@@ -114,7 +115,7 @@
@Override
public void onPinnedActivityRestartAttempt(boolean clearedTask) {
- if (!checkCurrentUserId(false /* debug */)) {
+ if (!checkCurrentUserId(mContext, false /* debug */)) {
return;
}
@@ -196,7 +197,7 @@
/**
* Updates the PIP per configuration changed.
*/
- public void onConfigurationChanged() {
+ public void onConfigurationChanged(Configuration newConfig) {
mTouchHandler.onConfigurationChanged();
}
diff --git a/packages/SystemUI/src/com/android/systemui/pip/phone/PipMenuActivity.java b/packages/SystemUI/src/com/android/systemui/pip/phone/PipMenuActivity.java
index fbb97b6..013b9ac 100644
--- a/packages/SystemUI/src/com/android/systemui/pip/phone/PipMenuActivity.java
+++ b/packages/SystemUI/src/com/android/systemui/pip/phone/PipMenuActivity.java
@@ -223,9 +223,9 @@
protected void onUserLeaveHint() {
super.onUserLeaveHint();
- // If another task is starting on top of the menu, then finish it so that it can be
+ // If another task is starting on top of the menu, then hide and finish it so that it can be
// recreated on the top next time it starts
- finish();
+ hideMenu();
}
@Override
diff --git a/packages/SystemUI/src/com/android/systemui/pip/phone/PipMenuActivityController.java b/packages/SystemUI/src/com/android/systemui/pip/phone/PipMenuActivityController.java
index 1ccea6f..e310847 100644
--- a/packages/SystemUI/src/com/android/systemui/pip/phone/PipMenuActivityController.java
+++ b/packages/SystemUI/src/com/android/systemui/pip/phone/PipMenuActivityController.java
@@ -27,6 +27,7 @@
import android.content.pm.ParceledListSlice;
import android.graphics.Rect;
import android.os.Bundle;
+import android.os.Debug;
import android.os.Handler;
import android.os.Message;
import android.os.Messenger;
@@ -254,7 +255,9 @@
public void showMenu(int menuState, Rect stackBounds, Rect movementBounds,
boolean allowMenuTimeout) {
if (DEBUG) {
- Log.d(TAG, "showMenu() hasActivity=" + (mToActivityMessenger != null));
+ Log.d(TAG, "showMenu() state=" + menuState
+ + " hasActivity=" + (mToActivityMessenger != null)
+ + " callers=\n" + Debug.getCallers(5, " "));
}
if (mToActivityMessenger != null) {
Bundle data = new Bundle();
@@ -298,7 +301,9 @@
*/
public void hideMenu() {
if (DEBUG) {
- Log.d(TAG, "hideMenu() hasActivity=" + (mToActivityMessenger != null));
+ Log.d(TAG, "hideMenu() state=" + mMenuState
+ + " hasActivity=" + (mToActivityMessenger != null)
+ + " callers=\n" + Debug.getCallers(5, " "));
}
if (mToActivityMessenger != null) {
Message m = Message.obtain();
@@ -321,13 +326,6 @@
}
/**
- * @return the current menu state.
- */
- public int getMenuState() {
- return mMenuState;
- }
-
- /**
* Sets the menu actions to the actions provided by the current PiP activity.
*/
public void setAppActions(ParceledListSlice appActions) {
diff --git a/packages/SystemUI/src/com/android/systemui/pip/phone/PipMotionHelper.java b/packages/SystemUI/src/com/android/systemui/pip/phone/PipMotionHelper.java
index 590e3c6..9fa7ff6 100644
--- a/packages/SystemUI/src/com/android/systemui/pip/phone/PipMotionHelper.java
+++ b/packages/SystemUI/src/com/android/systemui/pip/phone/PipMotionHelper.java
@@ -34,6 +34,7 @@
import android.graphics.Point;
import android.graphics.PointF;
import android.graphics.Rect;
+import android.os.Debug;
import android.os.Handler;
import android.os.RemoteException;
import android.util.Log;
@@ -54,6 +55,7 @@
public class PipMotionHelper {
private static final String TAG = "PipMotionHelper";
+ private static final boolean DEBUG = false;
private static final RectEvaluator RECT_EVALUATOR = new RectEvaluator(new Rect());
@@ -150,6 +152,10 @@
* Resizes the pinned stack back to fullscreen.
*/
void expandPip(boolean skipAnimation) {
+ if (DEBUG) {
+ Log.d(TAG, "expandPip: skipAnimation=" + skipAnimation
+ + " callers=\n" + Debug.getCallers(5, " "));
+ }
cancelAnimations();
mMenuController.hideMenuWithoutResize();
mHandler.post(() -> {
@@ -171,6 +177,9 @@
* Dismisses the pinned stack.
*/
void dismissPip() {
+ if (DEBUG) {
+ Log.d(TAG, "dismissPip: callers=\n" + Debug.getCallers(5, " "));
+ }
cancelAnimations();
mMenuController.hideMenuWithoutResize();
mHandler.post(() -> {
@@ -419,6 +428,10 @@
* Directly resizes the PiP to the given {@param bounds}.
*/
private void resizePipUnchecked(Rect toBounds) {
+ if (DEBUG) {
+ Log.d(TAG, "resizePipUnchecked: toBounds=" + toBounds
+ + " callers=\n" + Debug.getCallers(5, " "));
+ }
if (!toBounds.equals(mBounds)) {
mVsyncChoreographer.scheduleAtSfVsync(() -> {
try {
@@ -435,6 +448,10 @@
* Directly resizes the PiP to the given {@param bounds}.
*/
private void resizeAndAnimatePipUnchecked(Rect toBounds, int duration) {
+ if (DEBUG) {
+ Log.d(TAG, "resizeAndAnimatePipUnchecked: toBounds=" + toBounds
+ + " duration=" + duration + " callers=\n" + Debug.getCallers(5, " "));
+ }
if (!toBounds.equals(mBounds)) {
mHandler.post(() -> {
try {
diff --git a/packages/SystemUI/src/com/android/systemui/pip/phone/PipTouchHandler.java b/packages/SystemUI/src/com/android/systemui/pip/phone/PipTouchHandler.java
index 199b027..854696e 100644
--- a/packages/SystemUI/src/com/android/systemui/pip/phone/PipTouchHandler.java
+++ b/packages/SystemUI/src/com/android/systemui/pip/phone/PipTouchHandler.java
@@ -484,14 +484,15 @@
// Try and restore the PiP to the closest edge, using the saved snap fraction
// if possible
if (resize) {
- // This is a very special case: when the menu is expanded and visible, navigating to
- // another activity can trigger auto-enter PiP, and if the revealed activity has a
- // forced rotation set, then the controller will get updated with the new rotation
- // of the display. However, at the same time, SystemUI will try to hide the menu by
- // creating an animation to the normal bounds which are now stale. In such a case
- // we defer the animation to the normal bounds until after the next
- // onMovementBoundsChanged() call to get the bounds in the new orientation
if (mDeferResizeToNormalBoundsUntilRotation == -1) {
+ // This is a very special case: when the menu is expanded and visible,
+ // navigating to another activity can trigger auto-enter PiP, and if the
+ // revealed activity has a forced rotation set, then the controller will get
+ // updated with the new rotation of the display. However, at the same time,
+ // SystemUI will try to hide the menu by creating an animation to the normal
+ // bounds which are now stale. In such a case we defer the animation to the
+ // normal bounds until after the next onMovementBoundsChanged() call to get the
+ // bounds in the new orientation
try {
int displayRotation = mPinnedStackController.getDisplayRotation();
if (mDisplayRotation != displayRotation) {
@@ -510,6 +511,9 @@
mSavedSnapFraction = -1f;
}
} else {
+ // If resizing is not allowed, then the PiP should be frozen until the transition
+ // ends as well
+ setTouchEnabled(false);
mSavedSnapFraction = -1f;
}
}
@@ -712,9 +716,15 @@
* Updates the current movement bounds based on whether the menu is currently visible.
*/
private void updateMovementBounds(int menuState) {
- mMovementBounds = menuState == MENU_STATE_FULL
+ boolean isMenuExpanded = menuState == MENU_STATE_FULL;
+ mMovementBounds = isMenuExpanded
? mExpandedMovementBounds
: mNormalMovementBounds;
+ try {
+ mPinnedStackController.setMinEdgeSize(isMenuExpanded ? mExpandedShortestEdgeSize : 0);
+ } catch (RemoteException e) {
+ Log.e(TAG, "Could not set minimized state", e);
+ }
}
/**
diff --git a/packages/SystemUI/src/com/android/systemui/pip/tv/PipManager.java b/packages/SystemUI/src/com/android/systemui/pip/tv/PipManager.java
index 1c5da4d..5414aad 100644
--- a/packages/SystemUI/src/com/android/systemui/pip/tv/PipManager.java
+++ b/packages/SystemUI/src/com/android/systemui/pip/tv/PipManager.java
@@ -26,6 +26,7 @@
import android.content.Intent;
import android.content.IntentFilter;
import android.content.pm.ParceledListSlice;
+import android.content.res.Configuration;
import android.content.res.Resources;
import android.graphics.Rect;
import android.media.session.MediaController;
@@ -116,6 +117,7 @@
private Rect mDefaultPipBounds = new Rect();
private Rect mSettingsPipBounds;
private Rect mMenuModePipBounds;
+ private int mLastOrientation = Configuration.ORIENTATION_UNDEFINED;
private boolean mInitialized;
private int mPipTaskId = TASK_ID_NO_PIP;
private ComponentName mPipComponentName;
@@ -237,7 +239,7 @@
}
}
- loadConfigurationsAndApply();
+ loadConfigurationsAndApply(mContext.getResources().getConfiguration());
mMediaSessionManager =
(MediaSessionManager) mContext.getSystemService(Context.MEDIA_SESSION_SERVICE);
@@ -250,7 +252,14 @@
mPipNotification = new PipNotification(context);
}
- private void loadConfigurationsAndApply() {
+ private void loadConfigurationsAndApply(Configuration newConfig) {
+ if (mLastOrientation != newConfig.orientation) {
+ // Don't resize the pinned stack on orientation change. TV does not care about this case
+ // and this could clobber the existing animation to the new bounds calculated by WM.
+ mLastOrientation = newConfig.orientation;
+ return;
+ }
+
Resources res = mContext.getResources();
mSettingsPipBounds = Rect.unflattenFromString(res.getString(
R.string.pip_settings_bounds));
@@ -267,8 +276,8 @@
/**
* Updates the PIP per configuration changed.
*/
- public void onConfigurationChanged() {
- loadConfigurationsAndApply();
+ public void onConfigurationChanged(Configuration newConfig) {
+ loadConfigurationsAndApply(newConfig);
mPipNotification.onConfigurationChanged(mContext);
}
@@ -577,7 +586,7 @@
@Override
public void onTaskStackChanged() {
if (DEBUG) Log.d(TAG, "onTaskStackChanged()");
- if (!checkCurrentUserId(DEBUG)) {
+ if (!checkCurrentUserId(mContext, DEBUG)) {
return;
}
if (getState() != STATE_NO_PIP) {
@@ -614,7 +623,7 @@
@Override
public void onActivityPinned(String packageName, int taskId) {
if (DEBUG) Log.d(TAG, "onActivityPinned()");
- if (!checkCurrentUserId(DEBUG)) {
+ if (!checkCurrentUserId(mContext, DEBUG)) {
return;
}
StackInfo stackInfo = getPinnedStackInfo();
@@ -641,7 +650,7 @@
@Override
public void onPinnedActivityRestartAttempt(boolean clearedTask) {
if (DEBUG) Log.d(TAG, "onPinnedActivityRestartAttempt()");
- if (!checkCurrentUserId(DEBUG)) {
+ if (!checkCurrentUserId(mContext, DEBUG)) {
return;
}
// If PIPed activity is launched again by Launcher or intent, make it fullscreen.
@@ -651,7 +660,7 @@
@Override
public void onPinnedStackAnimationEnded() {
if (DEBUG) Log.d(TAG, "onPinnedStackAnimationEnded()");
- if (!checkCurrentUserId(DEBUG)) {
+ if (!checkCurrentUserId(mContext, DEBUG)) {
return;
}
switch (getState()) {
diff --git a/packages/SystemUI/src/com/android/systemui/pip/tv/PipNotification.java b/packages/SystemUI/src/com/android/systemui/pip/tv/PipNotification.java
index 30240c3..c8f4185 100644
--- a/packages/SystemUI/src/com/android/systemui/pip/tv/PipNotification.java
+++ b/packages/SystemUI/src/com/android/systemui/pip/tv/PipNotification.java
@@ -194,7 +194,7 @@
private void dismissPipNotification() {
mNotified = false;
- mNotificationManager.cancel(SystemMessage.NOTE_TV_PIP);
+ mNotificationManager.cancel(NOTIFICATION_TAG, SystemMessage.NOTE_TV_PIP);
}
private boolean updateMediaControllerMetadata() {
diff --git a/packages/SystemUI/src/com/android/systemui/qs/QSContainerImpl.java b/packages/SystemUI/src/com/android/systemui/qs/QSContainerImpl.java
index 189c04c..0d74b7a 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/QSContainerImpl.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/QSContainerImpl.java
@@ -17,14 +17,11 @@
package com.android.systemui.qs;
import android.content.Context;
-import android.graphics.Canvas;
-import android.graphics.Paint;
import android.graphics.Point;
import android.util.AttributeSet;
import android.view.View;
import android.widget.FrameLayout;
-import com.android.settingslib.Utils;
import com.android.systemui.R;
import com.android.systemui.qs.customize.QSCustomizer;
@@ -44,6 +41,7 @@
private QSFooter mQSFooter;
private int mGutterHeight;
private View mBackground;
+ private float mFullElevation;
public QSContainerImpl(Context context, AttributeSet attrs) {
super(context, attrs);
@@ -59,6 +57,17 @@
mQSFooter = findViewById(R.id.qs_footer);
mBackground = findViewById(R.id.qs_background);
mGutterHeight = getContext().getResources().getDimensionPixelSize(R.dimen.qs_gutter_height);
+ mFullElevation = mQSPanel.getElevation();
+
+ setClickable(true);
+ setImportantForAccessibility(IMPORTANT_FOR_ACCESSIBILITY_NO);
+ }
+
+ @Override
+ public boolean performClick() {
+ // Want to receive clicks so missing QQS tiles doesn't cause collapse, but
+ // don't want to do anything with them.
+ return true;
}
@Override
@@ -85,7 +94,7 @@
@Override
protected void onLayout(boolean changed, int left, int top, int right, int bottom) {
super.onLayout(changed, left, top, right, bottom);
- updateBottom();
+ updateExpansion();
}
/**
@@ -96,27 +105,47 @@
*/
public void setHeightOverride(int heightOverride) {
mHeightOverride = heightOverride;
- updateBottom();
+ updateExpansion();
}
- public void updateBottom() {
+ public void updateExpansion() {
int height = calculateContainerHeight();
- setBottom(getTop() + height + mGutterHeight);
+ int gutterHeight = Math.round(mQsExpansion * mGutterHeight);
+ setBottom(getTop() + height + gutterHeight);
mQSDetail.setBottom(getTop() + height);
- mBackground.setBottom(mQSDetail.getBottom());
+ mBackground.setBottom(getTop() + height);
// Pin QS Footer to the bottom of the panel.
mQSFooter.setTranslationY(height - mQSFooter.getHeight());
+
+ float elevation = mQsExpansion * mFullElevation;
+ mQSDetail.setElevation(elevation);
+ mBackground.setElevation(elevation);
+ mQSFooter.setElevation(elevation);
+ mQSPanel.setElevation(elevation);
}
protected int calculateContainerHeight() {
int heightOverride = mHeightOverride != -1 ? mHeightOverride : getMeasuredHeight();
return mQSCustomizer.isCustomizing() ? mQSCustomizer.getHeight()
- : (int) (mQsExpansion * (heightOverride - mHeader.getHeight()))
+ : Math.round(mQsExpansion * (heightOverride - mHeader.getHeight()))
+ mHeader.getHeight();
}
public void setExpansion(float expansion) {
mQsExpansion = expansion;
- updateBottom();
+ updateExpansion();
+ }
+
+ public void setGutterEnabled(boolean gutterEnabled) {
+ if (gutterEnabled == (mGutterHeight != 0)) {
+ return;
+ }
+ if (gutterEnabled) {
+ mGutterHeight = getContext().getResources().getDimensionPixelSize(
+ R.dimen.qs_gutter_height);
+ } else {
+ mGutterHeight = 0;
+ }
+ updateExpansion();
}
}
diff --git a/packages/SystemUI/src/com/android/systemui/qs/QSFooter.java b/packages/SystemUI/src/com/android/systemui/qs/QSFooter.java
index 063f5df..682c56c 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/QSFooter.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/QSFooter.java
@@ -101,6 +101,8 @@
private boolean mShowEditIcon;
private TouchAnimator mAnimator;
private View mDateTimeGroup;
+ private boolean mKeyguardShowing;
+ private TouchAnimator mAlarmAnimator;
public QSFooter(Context context, AttributeSet attrs) {
super(context, attrs);
@@ -163,13 +165,14 @@
int remaining = (width - numTiles * size) / (numTiles - 1);
int defSpace = mContext.getResources().getDimensionPixelOffset(R.dimen.default_gear_space);
- final Builder builder = new Builder()
+ mAnimator = new Builder()
.addFloat(mSettingsContainer, "translationX", -(remaining - defSpace), 0)
.addFloat(mSettingsButton, "rotation", -120, 0)
- .addFloat(mAlarmStatus, "alpha", 0, 1);
+ .build();
if (mAlarmShowing) {
- builder.addFloat(mDate, "alpha", 1, 0)
+ mAlarmAnimator = new Builder().addFloat(mDate, "alpha", 1, 0)
.addFloat(mDateTimeGroup, "translationX", 0, -mDate.getWidth())
+ .addFloat(mAlarmStatus, "alpha", 0, 1)
.setListener(new ListenerAdapter() {
@Override
public void onAnimationAtStart() {
@@ -180,13 +183,13 @@
public void onAnimationStarted() {
mAlarmStatus.setVisibility(View.VISIBLE);
}
- });
+ }).build();
} else {
+ mAlarmAnimator = null;
mAlarmStatus.setVisibility(View.GONE);
mDate.setAlpha(1);
mDateTimeGroup.setTranslationX(0);
}
- mAnimator = builder.build();
setExpansion(mExpansionAmount);
}
@@ -235,6 +238,7 @@
}
TouchAnimator.Builder animatorBuilder = new TouchAnimator.Builder();
+ animatorBuilder.setStartDelay(QSAnimator.EXPANDED_TILE_DELAY);
if (mShowEditIcon) {
animatorBuilder.addFloat(mEdit, "alpha", 0, 1);
@@ -247,6 +251,11 @@
return animatorBuilder.build();
}
+ public void setKeyguardShowing(boolean keyguardShowing) {
+ mKeyguardShowing = keyguardShowing;
+ setExpansion(mExpansionAmount);
+ }
+
public void setExpanded(boolean expanded) {
if (mExpanded == expanded) return;
mExpanded = expanded;
@@ -274,6 +283,8 @@
public void setExpansion(float headerExpansionFraction) {
mExpansionAmount = headerExpansionFraction;
if (mAnimator != null) mAnimator.setPosition(headerExpansionFraction);
+ if (mAlarmAnimator != null) mAlarmAnimator.setPosition(
+ mKeyguardShowing ? 0 : headerExpansionFraction);
if (mSettingsAlpha != null) {
mSettingsAlpha.setPosition(headerExpansionFraction);
diff --git a/packages/SystemUI/src/com/android/systemui/qs/QSFragment.java b/packages/SystemUI/src/com/android/systemui/qs/QSFragment.java
index 3f090f8..c9c3a7f 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/QSFragment.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/QSFragment.java
@@ -34,7 +34,6 @@
import com.android.systemui.Interpolators;
import com.android.systemui.R;
import com.android.systemui.R.id;
-import com.android.systemui.R.style;
import com.android.systemui.plugins.qs.QS;
import com.android.systemui.qs.customize.QSCustomizer;
import com.android.systemui.statusbar.phone.NotificationsQuickSettingsContainer;
@@ -130,6 +129,11 @@
return mHeader;
}
+ @Override
+ public void setHasNotifications(boolean hasNotifications) {
+ mContainer.setGutterEnabled(hasNotifications);
+ }
+
public void setPanelView(HeightListener panelView) {
mPanelView = panelView;
}
@@ -218,6 +222,7 @@
mQSAnimator.setOnKeyguard(keyguardShowing);
}
+ mFooter.setKeyguardShowing(keyguardShowing);
updateQsState();
}
@@ -307,7 +312,7 @@
public void notifyCustomizeChanged() {
// The customize state changed, so our height changed.
- mContainer.updateBottom();
+ mContainer.updateExpansion();
mQSPanel.setVisibility(!mQSCustomizer.isCustomizing() ? View.VISIBLE : View.INVISIBLE);
mHeader.setVisibility(!mQSCustomizer.isCustomizing() ? View.VISIBLE : View.INVISIBLE);
mFooter.setVisibility(!mQSCustomizer.isCustomizing() ? View.VISIBLE : View.INVISIBLE);
@@ -340,7 +345,7 @@
}
public int getQsMinExpansionHeight() {
- return mHeader.getHeight() + mGutterHeight;
+ return mHeader.getHeight();
}
@Override
diff --git a/packages/SystemUI/src/com/android/systemui/qs/QSHost.java b/packages/SystemUI/src/com/android/systemui/qs/QSHost.java
index 8596b57..84524a6 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/QSHost.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/QSHost.java
@@ -24,6 +24,7 @@
public interface QSHost {
void warn(String message, Throwable t);
void collapsePanels();
+ void forceCollapsePanels();
void openPanels();
Context getContext();
Collection<QSTile> getTiles();
diff --git a/packages/SystemUI/src/com/android/systemui/qs/QSTileHost.java b/packages/SystemUI/src/com/android/systemui/qs/QSTileHost.java
index 9330541..02937d8 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/QSTileHost.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/QSTileHost.java
@@ -143,6 +143,11 @@
}
@Override
+ public void forceCollapsePanels() {
+ mStatusBar.postAnimateForceCollapsePanels();
+ }
+
+ @Override
public void openPanels() {
mStatusBar.postAnimateOpenPanels();
}
diff --git a/packages/SystemUI/src/com/android/systemui/qs/QuickQSPanel.java b/packages/SystemUI/src/com/android/systemui/qs/QuickQSPanel.java
index 8539cb9..00b883a 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/QuickQSPanel.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/QuickQSPanel.java
@@ -60,6 +60,12 @@
mTileLayout = new HeaderTileLayout(context);
mTileLayout.setListening(mListening);
addView((View) mTileLayout, 0 /* Between brightness and footer */);
+ super.setPadding(0, 0, 0, 0);
+ }
+
+ @Override
+ public void setPadding(int left, int top, int right, int bottom) {
+ // Always have no padding.
}
@Override
diff --git a/packages/SystemUI/src/com/android/systemui/qs/QuickStatusBarHeader.java b/packages/SystemUI/src/com/android/systemui/qs/QuickStatusBarHeader.java
index e457d72..abafd64 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/QuickStatusBarHeader.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/QuickStatusBarHeader.java
@@ -23,13 +23,11 @@
import android.util.AttributeSet;
import android.view.View;
import android.widget.RelativeLayout;
-import android.widget.TextClock;
import com.android.settingslib.Utils;
import com.android.systemui.BatteryMeterView;
import com.android.systemui.Dependency;
import com.android.systemui.R;
-import com.android.systemui.R.id;
import com.android.systemui.plugins.ActivityStarter;
import com.android.systemui.qs.QSDetail.Callback;
import com.android.systemui.statusbar.SignalClusterView;
@@ -79,7 +77,7 @@
battery.setForceShowPercent(true);
// Don't show the Wi-Fi indicator here, because it is shown just below in the tile.
SignalClusterView signalCluster = findViewById(R.id.signal_cluster);
- signalCluster.setForceBlockWifi();
+ signalCluster.setQsSignalCluster();
mActivityStarter = Dependency.get(ActivityStarter.class);
}
diff --git a/packages/SystemUI/src/com/android/systemui/qs/external/TileServices.java b/packages/SystemUI/src/com/android/systemui/qs/external/TileServices.java
index d2f3bb6..943a176 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/external/TileServices.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/external/TileServices.java
@@ -204,7 +204,7 @@
if (customTile != null) {
verifyCaller(customTile);
customTile.onDialogShown();
- mHost.collapsePanels();
+ mHost.forceCollapsePanels();
mServices.get(customTile).setShowingDialog(true);
}
}
@@ -224,7 +224,7 @@
CustomTile customTile = getTileForToken(token);
if (customTile != null) {
verifyCaller(customTile);
- mHost.collapsePanels();
+ mHost.forceCollapsePanels();
}
}
diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/BatterySaverTile.java b/packages/SystemUI/src/com/android/systemui/qs/tiles/BatterySaverTile.java
index ecc275d..74cc0ec 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/tiles/BatterySaverTile.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/BatterySaverTile.java
@@ -141,7 +141,7 @@
private final BatteryMeterDrawableBase mDrawable
= new BatteryMeterDrawableBase(
mHost.getContext(),
- mHost.getContext().getColor(R.color.batterymeter_frame_color));
+ mHost.getContext().getColor(R.color.meter_background_color));
private View mCurrentView;
@Override
diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/CastTile.java b/packages/SystemUI/src/com/android/systemui/qs/tiles/CastTile.java
index 6f28838..f0d7d6c 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/tiles/CastTile.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/CastTile.java
@@ -16,33 +16,33 @@
package com.android.systemui.qs.tiles;
+import static android.media.MediaRouter.ROUTE_TYPE_REMOTE_DISPLAY;
+
import android.app.Dialog;
import android.content.BroadcastReceiver;
import android.content.Context;
-import android.content.DialogInterface;
-import android.content.DialogInterface.OnDismissListener;
import android.content.Intent;
import android.content.IntentFilter;
+import android.media.MediaRouter;
import android.os.UserHandle;
import android.provider.Settings;
import android.service.quicksettings.Tile;
-import android.support.v7.app.MediaRouteChooserDialog;
-import android.support.v7.app.MediaRouteControllerDialog;
-import android.support.v7.media.MediaControlIntent;
-import android.support.v7.media.MediaRouteSelector;
import android.util.Log;
import android.view.ContextThemeWrapper;
import android.view.View;
import android.view.View.OnAttachStateChangeListener;
+import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.view.WindowManager;
import android.widget.Button;
+import com.android.internal.app.MediaRouteChooserDialog;
+import com.android.internal.app.MediaRouteControllerDialog;
+import com.android.internal.app.MediaRouteDialogPresenter;
import com.android.internal.logging.MetricsLogger;
import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
import com.android.systemui.Dependency;
import com.android.systemui.R;
-import com.android.systemui.R.style;
import com.android.systemui.plugins.ActivityStarter;
import com.android.systemui.plugins.qs.DetailAdapter;
import com.android.systemui.plugins.qs.QSTile.BooleanState;
@@ -133,19 +133,12 @@
@Override
public void showDetail(boolean show) {
mUiHandler.post(() -> {
- Context context = new ContextThemeWrapper(mContext,
- R.style.Theme_AppCompat_Light_Dialog_Alert);
- if (mState.value) {
- mDialog = new MediaRouteControllerDialog(context);
- } else {
- // Instead of showing detail, show standard media routing UI.
- MediaRouteChooserDialog dialog = new MediaRouteChooserDialog(context);
- MediaRouteSelector selector = new MediaRouteSelector.Builder()
- .addControlCategory(MediaControlIntent.CATEGORY_LIVE_VIDEO)
- .build();
- dialog.setRouteSelector(selector);
- mDialog = dialog;
- }
+ mDialog = MediaRouteDialogPresenter.createDialog(mContext, ROUTE_TYPE_REMOTE_DISPLAY,
+ v -> {
+ mDialog.dismiss();
+ Dependency.get(ActivityStarter.class)
+ .postStartActivityDismissingKeyguard(getLongClickIntent(), 0);
+ });
mDialog.getWindow().setType(WindowManager.LayoutParams.TYPE_STATUS_BAR_PANEL);
mUiHandler.post(() -> mDialog.show());
registerReceiver();
diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/WifiTile.java b/packages/SystemUI/src/com/android/systemui/qs/tiles/WifiTile.java
index 1afce64..76f6e7d 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/tiles/WifiTile.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/WifiTile.java
@@ -353,13 +353,20 @@
private void updateItems() {
if (mItems == null) return;
- if (mSignalCallback.mInfo.enabled) {
- mItems.setEmptyState(R.drawable.ic_qs_wifi_detail_empty,
- R.string.quick_settings_wifi_detail_empty_text);
- } else {
+
+ // Wi-Fi is off
+ if (!mSignalCallback.mInfo.enabled) {
mItems.setEmptyState(R.drawable.ic_qs_wifi_detail_empty,
R.string.wifi_is_off);
+ mItems.setItems(null);
+ return;
}
+
+ // No available access points
+ mItems.setEmptyState(R.drawable.ic_qs_wifi_detail_empty,
+ R.string.quick_settings_wifi_detail_empty_text);
+
+ // Build the list
Item[] items = null;
if (mAccessPoints != null) {
items = new Item[mAccessPoints.length];
diff --git a/packages/SystemUI/src/com/android/systemui/recents/Recents.java b/packages/SystemUI/src/com/android/systemui/recents/Recents.java
index 72dd2da..9ba32b3 100644
--- a/packages/SystemUI/src/com/android/systemui/recents/Recents.java
+++ b/packages/SystemUI/src/com/android/systemui/recents/Recents.java
@@ -19,7 +19,6 @@
import static com.android.systemui.statusbar.phone.StatusBar.SYSTEM_DIALOG_REASON_RECENT_APPS;
import android.app.ActivityManager;
-import android.app.UiModeManager;
import android.content.ComponentName;
import android.content.ContentResolver;
import android.content.Context;
@@ -33,7 +32,6 @@
import android.os.Build;
import android.os.Handler;
import android.os.IBinder;
-import android.os.Looper;
import android.os.RemoteException;
import android.os.SystemProperties;
import android.os.UserHandle;
@@ -41,7 +39,6 @@
import android.util.EventLog;
import android.util.Log;
import android.view.Display;
-import android.view.WindowManager;
import android.widget.Toast;
import com.android.internal.logging.MetricsLogger;
@@ -60,11 +57,12 @@
import com.android.systemui.recents.events.component.ShowUserToastEvent;
import com.android.systemui.recents.events.ui.RecentsDrawnEvent;
import com.android.systemui.recents.misc.SystemServicesProxy;
-import com.android.systemui.recents.model.HighResThumbnailLoader;
import com.android.systemui.recents.model.RecentsTaskLoader;
import com.android.systemui.stackdivider.Divider;
import com.android.systemui.statusbar.CommandQueue;
+import java.io.FileDescriptor;
+import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.Set;
@@ -322,16 +320,11 @@
}
}
- @Override
- public void toggleRecentApps() {
- toggleRecents();
- }
-
/**
* Toggles the Recents activity.
*/
@Override
- public void toggleRecents() {
+ public void toggleRecentApps() {
// Ensure the device has been provisioned before allowing the user to interact with
// recents
if (!isUserSetup()) {
@@ -368,7 +361,7 @@
* Preloads info for the Recents activity.
*/
@Override
- public void preloadRecents() {
+ public void preloadRecentApps() {
// Ensure the device has been provisioned before allowing the user to interact with
// recents
if (!isUserSetup()) {
@@ -792,4 +785,10 @@
}
return false;
}
+
+ @Override
+ public void dump(FileDescriptor fd, PrintWriter pw, String[] args) {
+ pw.println("Recents");
+ pw.println(" currentUserId=" + SystemServicesProxy.getInstance(mContext).getCurrentUser());
+ }
}
diff --git a/packages/SystemUI/src/com/android/systemui/recents/RecentsActivity.java b/packages/SystemUI/src/com/android/systemui/recents/RecentsActivity.java
index dbf0724..7697061 100644
--- a/packages/SystemUI/src/com/android/systemui/recents/RecentsActivity.java
+++ b/packages/SystemUI/src/com/android/systemui/recents/RecentsActivity.java
@@ -114,7 +114,6 @@
private boolean mFinishedOnStartup;
private boolean mIgnoreAltTabRelease;
private boolean mIsVisible;
- private boolean mReceivedNewIntent;
// Top level views
private RecentsView mRecentsView;
@@ -128,9 +127,6 @@
private int mFocusTimerDuration;
private DozeTrigger mIterateTrigger;
private final UserInteractionEvent mUserInteractionEvent = new UserInteractionEvent();
- private final Runnable mSendEnterWindowAnimationCompleteRunnable = () -> {
- EventBus.getDefault().send(new EnterRecentsWindowAnimationCompletedEvent());
- };
/**
* A common Runnable to finish Recents by launching Home with an animation depending on the
@@ -390,7 +386,6 @@
@Override
protected void onNewIntent(Intent intent) {
super.onNewIntent(intent);
- mReceivedNewIntent = true;
// Reload the stack view
reloadStackView();
@@ -469,16 +464,7 @@
@Override
public void onEnterAnimationComplete() {
super.onEnterAnimationComplete();
-
- // Workaround for b/28705801, on first docking, we may receive the enter animation callback
- // before the first layout, so in such cases, send the event on the next frame after all
- // the views are laid out and attached (and registered to the EventBus).
- mHandler.removeCallbacks(mSendEnterWindowAnimationCompleteRunnable);
- if (!mReceivedNewIntent) {
- mHandler.post(mSendEnterWindowAnimationCompleteRunnable);
- } else {
- mSendEnterWindowAnimationCompleteRunnable.run();
- }
+ EventBus.getDefault().send(new EnterRecentsWindowAnimationCompletedEvent());
}
@Override
@@ -516,7 +502,6 @@
// Notify that recents is now hidden
mIsVisible = false;
- mReceivedNewIntent = false;
EventBus.getDefault().send(new RecentsVisibilityChangedEvent(this, false));
MetricsLogger.hidden(this, MetricsEvent.OVERVIEW_ACTIVITY);
Recents.getTaskLoader().getHighResThumbnailLoader().setVisible(false);
diff --git a/packages/SystemUI/src/com/android/systemui/recents/RecentsImpl.java b/packages/SystemUI/src/com/android/systemui/recents/RecentsImpl.java
index e229c90..611169f 100644
--- a/packages/SystemUI/src/com/android/systemui/recents/RecentsImpl.java
+++ b/packages/SystemUI/src/com/android/systemui/recents/RecentsImpl.java
@@ -30,6 +30,7 @@
import android.content.res.Resources;
import android.graphics.Bitmap;
import android.graphics.Canvas;
+import android.graphics.GraphicBuffer;
import android.graphics.Rect;
import android.graphics.RectF;
import android.graphics.drawable.Drawable;
@@ -119,6 +120,11 @@
@Override
public void onTaskStackChangedBackground() {
+ // Check this is for the right user
+ if (!checkCurrentUserId(mContext, false /* debug */)) {
+ return;
+ }
+
// Preloads the next task
RecentsConfiguration config = Recents.getConfiguration();
if (config.svelteLevel == RecentsConfiguration.SVELTE_NONE) {
@@ -161,6 +167,11 @@
@Override
public void onActivityPinned(String packageName, int taskId) {
+ // Check this is for the right user
+ if (!checkCurrentUserId(mContext, false /* debug */)) {
+ return;
+ }
+
// This time needs to be fetched the same way the last active time is fetched in
// {@link TaskRecord#touchActiveTime}
Recents.getConfiguration().getLaunchState().launchedFromPipApp = true;
@@ -172,12 +183,22 @@
@Override
public void onActivityUnpinned() {
+ // Check this is for the right user
+ if (!checkCurrentUserId(mContext, false /* debug */)) {
+ return;
+ }
+
EventBus.getDefault().send(new ActivityUnpinnedEvent());
sLastPipTime = -1;
}
@Override
public void onTaskSnapshotChanged(int taskId, TaskSnapshot snapshot) {
+ // Check this is for the right user
+ if (!checkCurrentUserId(mContext, false /* debug */)) {
+ return;
+ }
+
EventBus.getDefault().send(new TaskSnapshotChangedEvent(taskId, snapshot));
}
}
@@ -219,8 +240,6 @@
}
});
- protected Bitmap mThumbTransitionBitmapCache;
-
public RecentsImpl(Context context) {
mContext = context;
mHandler = new Handler();
@@ -413,30 +432,34 @@
public void preloadRecents() {
// Preload only the raw task list into a new load plan (which will be consumed by the
- // RecentsActivity) only if there is a task to animate to.
- SystemServicesProxy ssp = Recents.getSystemServices();
- MutableBoolean isHomeStackVisible = new MutableBoolean(true);
- if (!ssp.isRecentsActivityVisible(isHomeStackVisible)) {
- ActivityManager.RunningTaskInfo runningTask = ssp.getRunningTask();
- if (runningTask == null) {
- return;
- }
+ // RecentsActivity) only if there is a task to animate to. Post this to ensure that we
+ // don't block the touch feedback on the nav bar button which triggers this.
+ mHandler.post(() -> {
+ SystemServicesProxy ssp = Recents.getSystemServices();
+ MutableBoolean isHomeStackVisible = new MutableBoolean(true);
+ if (!ssp.isRecentsActivityVisible(isHomeStackVisible)) {
+ ActivityManager.RunningTaskInfo runningTask = ssp.getRunningTask();
+ if (runningTask == null) {
+ return;
+ }
- RecentsTaskLoader loader = Recents.getTaskLoader();
- sInstanceLoadPlan = loader.createLoadPlan(mContext);
- loader.preloadTasks(sInstanceLoadPlan, runningTask.id, !isHomeStackVisible.value);
- TaskStack stack = sInstanceLoadPlan.getTaskStack();
- if (stack.getTaskCount() > 0) {
- // Only preload the icon (but not the thumbnail since it may not have been taken for
- // the pausing activity)
- preloadIcon(runningTask.id);
+ RecentsTaskLoader loader = Recents.getTaskLoader();
+ sInstanceLoadPlan = loader.createLoadPlan(mContext);
+ loader.preloadTasks(sInstanceLoadPlan, runningTask.id, !isHomeStackVisible.value);
+ TaskStack stack = sInstanceLoadPlan.getTaskStack();
+ if (stack.getTaskCount() > 0) {
+ // Only preload the icon (but not the thumbnail since it may not have been taken
+ // for the pausing activity)
+ preloadIcon(runningTask.id);
- // At this point, we don't know anything about the stack state. So only calculate
- // the dimensions of the thumbnail that we need for the transition into Recents, but
- // do not draw it until we construct the activity options when we start Recents
- updateHeaderBarLayout(stack, null /* window rect override*/);
+ // At this point, we don't know anything about the stack state. So only
+ // calculate the dimensions of the thumbnail that we need for the transition
+ // into Recents, but do not draw it until we construct the activity options when
+ // we start Recents
+ updateHeaderBarLayout(stack, null /* window rect override*/);
+ }
}
- }
+ });
}
public void cancelPreloadingRecents() {
@@ -751,14 +774,6 @@
}
mHeaderBar.layout(0, 0, taskViewWidth, mTaskBarHeight);
}
-
- // Update the transition bitmap to match the new header bar height
- if (mThumbTransitionBitmapCache == null ||
- (mThumbTransitionBitmapCache.getWidth() != taskViewWidth) ||
- (mThumbTransitionBitmapCache.getHeight() != mTaskBarHeight)) {
- mThumbTransitionBitmapCache = Bitmap.createBitmap(taskViewWidth,
- mTaskBarHeight, Bitmap.Config.ARGB_8888);
- }
}
}
@@ -840,8 +855,7 @@
mTmpTransform = stackLayout.getStackTransformScreenCoordinates(task,
stackScroller.getStackScroll(), mTmpTransform, null,
windowOverrideRect);
- Bitmap thumbnail = drawThumbnailTransitionBitmap(task, mTmpTransform,
- mThumbTransitionBitmapCache);
+ GraphicBuffer thumbnail = drawThumbnailTransitionBitmap(task, mTmpTransform);
Rect toTaskRect = new Rect();
mTmpTransform.rect.round(toTaskRect);
specs.add(new AppTransitionAnimationSpec(task.key.id, thumbnail, toTaskRect));
@@ -863,8 +877,8 @@
() -> {
Rect rect = new Rect();
toTaskRect.round(rect);
- Bitmap thumbnail = drawThumbnailTransitionBitmap(toTask, toTransform,
- mThumbTransitionBitmapCache);
+ GraphicBuffer thumbnail = drawThumbnailTransitionBitmap(toTask,
+ toTransform);
return Lists.newArrayList(new AppTransitionAnimationSpec(
toTask.key.id, thumbnail, rect));
});
@@ -900,19 +914,19 @@
/**
* Draws the header of a task used for the window animation into a bitmap.
*/
- private Bitmap drawThumbnailTransitionBitmap(Task toTask, TaskViewTransform toTransform,
- Bitmap thumbnail) {
+ private GraphicBuffer drawThumbnailTransitionBitmap(Task toTask,
+ TaskViewTransform toTransform) {
SystemServicesProxy ssp = Recents.getSystemServices();
if (toTransform != null && toTask.key != null) {
synchronized (mHeaderBarLock) {
boolean disabledInSafeMode = !toTask.isSystemApp && ssp.isInSafeMode();
- mHeaderBar.onTaskViewSizeChanged((int) toTransform.rect.width(),
- (int) toTransform.rect.height());
+ int width = (int) toTransform.rect.width();
+ int height = (int) toTransform.rect.height();
+ mHeaderBar.onTaskViewSizeChanged(width, height);
if (RecentsDebugFlags.Static.EnableTransitionThumbnailDebugMode) {
- thumbnail.eraseColor(0xFFff0000);
+ return RecentsTransitionHelper.drawViewIntoGraphicBuffer(width, mTaskBarHeight,
+ null, 1f, 0xFFff0000);
} else {
- thumbnail.eraseColor(0);
- Canvas c = new Canvas(thumbnail);
// Workaround for b/27815919, reset the callback so that we do not trigger an
// invalidate on the header bar as a result of updating the icon
Drawable icon = mHeaderBar.getIconView().getDrawable();
@@ -923,11 +937,10 @@
disabledInSafeMode);
mHeaderBar.onTaskDataLoaded();
mHeaderBar.setDimAlpha(toTransform.dimAlpha);
- mHeaderBar.draw(c);
- c.setBitmap(null);
+ return RecentsTransitionHelper.drawViewIntoGraphicBuffer(width, mTaskBarHeight,
+ mHeaderBar, 1f, 0);
}
}
- return thumbnail.createAshmemBitmap();
}
return null;
}
@@ -1039,7 +1052,6 @@
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK
| Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS
| Intent.FLAG_ACTIVITY_TASK_ON_HOME);
- Recents.getSystemServices().startActivityAsUserAsync(intent, opts);
HidePipMenuEvent hideMenuEvent = new HidePipMenuEvent();
hideMenuEvent.addPostAnimationCallback(() -> {
Recents.getSystemServices().startActivityAsUserAsync(intent, opts);
diff --git a/packages/SystemUI/src/com/android/systemui/recents/events/activity/EnterRecentsTaskStackAnimationCompletedEvent.java b/packages/SystemUI/src/com/android/systemui/recents/events/activity/EnterRecentsTaskStackAnimationCompletedEvent.java
deleted file mode 100644
index ee0df87..0000000
--- a/packages/SystemUI/src/com/android/systemui/recents/events/activity/EnterRecentsTaskStackAnimationCompletedEvent.java
+++ /dev/null
@@ -1,26 +0,0 @@
-/*
- * Copyright (C) 2016 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.systemui.recents.events.activity;
-
-import com.android.systemui.recents.events.EventBus;
-
-/**
- * This is sent when the in-app animations into Recents completes.
- */
-public class EnterRecentsTaskStackAnimationCompletedEvent extends EventBus.AnimatedEvent {
- // Simple event
-}
diff --git a/packages/SystemUI/src/com/android/systemui/recents/events/activity/EnterRecentsWindowAnimationCompletedEvent.java b/packages/SystemUI/src/com/android/systemui/recents/events/activity/EnterRecentsWindowAnimationCompletedEvent.java
index 918875a..b31f320 100644
--- a/packages/SystemUI/src/com/android/systemui/recents/events/activity/EnterRecentsWindowAnimationCompletedEvent.java
+++ b/packages/SystemUI/src/com/android/systemui/recents/events/activity/EnterRecentsWindowAnimationCompletedEvent.java
@@ -23,6 +23,6 @@
* we can start in-app animations so that they don't conflict with the window transition into
* Recents.
*/
-public class EnterRecentsWindowAnimationCompletedEvent extends EventBus.AnimatedEvent {
+public class EnterRecentsWindowAnimationCompletedEvent extends EventBus.Event {
// Simple event
}
diff --git a/packages/SystemUI/src/com/android/systemui/recents/misc/SystemServicesProxy.java b/packages/SystemUI/src/com/android/systemui/recents/misc/SystemServicesProxy.java
index a155a71..cbfa0e5 100644
--- a/packages/SystemUI/src/com/android/systemui/recents/misc/SystemServicesProxy.java
+++ b/packages/SystemUI/src/com/android/systemui/recents/misc/SystemServicesProxy.java
@@ -85,7 +85,6 @@
import com.android.internal.app.AssistUtils;
import com.android.internal.os.BackgroundThread;
-import com.android.keyguard.KeyguardUpdateMonitor;
import com.android.systemui.Dependency;
import com.android.systemui.R;
import com.android.systemui.UiOffloadThread;
@@ -95,6 +94,8 @@
import com.android.systemui.recents.RecentsImpl;
import com.android.systemui.recents.model.Task;
import com.android.systemui.recents.model.ThumbnailData;
+import com.android.systemui.statusbar.policy.UserInfoController;
+import com.android.systemui.statusbar.policy.UserInfoController.OnUserInfoChangedListener;
import java.io.IOException;
import java.util.ArrayList;
@@ -102,8 +103,6 @@
import java.util.Iterator;
import java.util.List;
import java.util.Random;
-import java.util.concurrent.ExecutorService;
-import java.util.concurrent.Executors;
/**
* Acts as a shim around the real system services that we need to access data from, and provides
@@ -143,6 +142,7 @@
Display mDisplay;
String mRecentsPackage;
ComponentName mAssistComponent;
+ private int mCurrentUserId;
boolean mIsSafeMode;
boolean mHasFreeformWorkspaceSupport;
@@ -185,9 +185,9 @@
* TaskStackListener should make this call to verify that we don't act on events from other
* user's processes.
*/
- protected final boolean checkCurrentUserId(boolean debug) {
+ protected final boolean checkCurrentUserId(Context context, boolean debug) {
int processUserId = UserHandle.myUserId();
- int currentUserId = KeyguardUpdateMonitor.getCurrentUser();
+ int currentUserId = SystemServicesProxy.getInstance(context).getCurrentUser();
if (processUserId != currentUserId) {
if (debug) {
Log.d(TAG, "UID mismatch. SystemUI is running uid=" + processUserId
@@ -284,6 +284,10 @@
}
};
+ private final UserInfoController.OnUserInfoChangedListener mOnUserInfoChangedListener =
+ (String name, Drawable picture, String userAccount) ->
+ mCurrentUserId = mAm.getCurrentUser();
+
/**
* List of {@link TaskStackListener} registered from {@link #registerTaskStackListener}.
*/
@@ -312,6 +316,7 @@
Settings.Global.getInt(context.getContentResolver(),
DEVELOPMENT_ENABLE_FREEFORM_WINDOWS_SUPPORT, 0) != 0;
mIsSafeMode = mPm.isSafeMode();
+ mCurrentUserId = mAm.getCurrentUser();
// Get the dummy thumbnail width/heights
Resources res = context.getResources();
@@ -329,6 +334,12 @@
// Resolve the assist intent
mAssistComponent = mAssistUtils.getAssistComponentForUser(UserHandle.myUserId());
+ // Since SystemServicesProxy can be accessed from a per-SysUI process component, create a
+ // per-process listener to keep track of the current user id to reduce the number of binder
+ // calls to fetch it.
+ UserInfoController userInfoController = Dependency.get(UserInfoController.class);
+ userInfoController.addCallback(mOnUserInfoChangedListener);
+
if (RecentsDebugFlags.Static.EnableMockTasks) {
// Create a dummy icon
mDummyIcon = Bitmap.createBitmap(1, 1, Bitmap.Config.ARGB_8888);
@@ -1029,15 +1040,11 @@
}
/**
- * Returns the current user id.
+ * Returns the current user id. Used instead of KeyguardUpdateMonitor in SystemUI components
+ * that run in the non-primary SystemUI process.
*/
public int getCurrentUser() {
- if (mAm == null) return 0;
-
- // This must call through ActivityManager, as the SystemServicesProxy can be called in a
- // secondary user's SystemUI process, and KeyguardUpdateMonitor is only updated in the
- // primary user's SystemUI process
- return mAm.getCurrentUser();
+ return mCurrentUserId;
}
/**
diff --git a/packages/SystemUI/src/com/android/systemui/recents/model/RecentsTaskLoadPlan.java b/packages/SystemUI/src/com/android/systemui/recents/model/RecentsTaskLoadPlan.java
index ed09640..93033ea 100644
--- a/packages/SystemUI/src/com/android/systemui/recents/model/RecentsTaskLoadPlan.java
+++ b/packages/SystemUI/src/com/android/systemui/recents/model/RecentsTaskLoadPlan.java
@@ -22,7 +22,6 @@
import android.content.pm.ApplicationInfo;
import android.content.pm.UserInfo;
import android.content.res.Resources;
-import android.graphics.Bitmap;
import android.graphics.drawable.Drawable;
import android.os.UserHandle;
import android.os.UserManager;
@@ -33,15 +32,13 @@
import android.util.SparseBooleanArray;
import android.util.SparseIntArray;
-import com.android.keyguard.KeyguardUpdateMonitor;
import com.android.systemui.Prefs;
import com.android.systemui.R;
import com.android.systemui.recents.Recents;
-import com.android.systemui.recents.RecentsConfiguration;
import com.android.systemui.recents.RecentsDebugFlags;
import com.android.systemui.recents.misc.SystemServicesProxy;
-
import com.android.systemui.recents.views.grid.TaskGridLayoutAlgorithm;
+
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
diff --git a/packages/SystemUI/src/com/android/systemui/recents/views/RecentsTransitionHelper.java b/packages/SystemUI/src/com/android/systemui/recents/views/RecentsTransitionHelper.java
index d7d264e..21dfe8c 100644
--- a/packages/SystemUI/src/com/android/systemui/recents/views/RecentsTransitionHelper.java
+++ b/packages/SystemUI/src/com/android/systemui/recents/views/RecentsTransitionHelper.java
@@ -30,6 +30,7 @@
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Color;
+import android.graphics.GraphicBuffer;
import android.graphics.Rect;
import android.os.Bundle;
import android.os.Handler;
@@ -37,7 +38,11 @@
import android.os.RemoteException;
import android.util.Log;
import android.view.AppTransitionAnimationSpec;
+import android.view.DisplayListCanvas;
import android.view.IAppTransitionAnimationSpecsFuture;
+import android.view.RenderNode;
+import android.view.ThreadedRenderer;
+import android.view.View;
import com.android.internal.annotations.GuardedBy;
import com.android.systemui.recents.Recents;
@@ -264,8 +269,8 @@
Rect bounds) {
mTmpTransform.fillIn(taskView);
Task task = taskView.getTask();
- Bitmap thumbnail = RecentsTransitionHelper.composeTaskBitmap(taskView, mTmpTransform);
- return Collections.singletonList(new AppTransitionAnimationSpec(task.key.id, thumbnail,
+ GraphicBuffer buffer = RecentsTransitionHelper.composeTaskBitmap(taskView, mTmpTransform);
+ return Collections.singletonList(new AppTransitionAnimationSpec(task.key.id, buffer,
bounds));
}
@@ -346,7 +351,7 @@
return new AppTransitionAnimationSpec(task.key.id, null, taskRect);
}
- public static Bitmap composeTaskBitmap(TaskView taskView, TaskViewTransform transform) {
+ public static GraphicBuffer composeTaskBitmap(TaskView taskView, TaskViewTransform transform) {
float scale = transform.scale;
int fromWidth = (int) (transform.rect.width() * scale);
int fromHeight = (int) (transform.rect.height() * scale);
@@ -354,26 +359,17 @@
Log.e(TAG, "Could not compose thumbnail for task: " + taskView.getTask() +
" at transform: " + transform);
- Bitmap b = Bitmap.createBitmap(1, 1, Bitmap.Config.ARGB_8888);
- b.eraseColor(Color.TRANSPARENT);
- return b;
+ return drawViewIntoGraphicBuffer(1, 1, null, 1f, 0x00ffffff);
} else {
- Bitmap b = Bitmap.createBitmap(fromWidth, fromHeight,
- Bitmap.Config.ARGB_8888);
-
if (RecentsDebugFlags.Static.EnableTransitionThumbnailDebugMode) {
- b.eraseColor(0xFFff0000);
+ return drawViewIntoGraphicBuffer(fromWidth, fromHeight, null, 1f, 0xFFff0000);
} else {
- Canvas c = new Canvas(b);
- c.scale(scale, scale);
- taskView.draw(c);
- c.setBitmap(null);
+ return drawViewIntoGraphicBuffer(fromWidth, fromHeight, taskView, scale, 0);
}
- return b.createAshmemBitmap();
}
}
- private static Bitmap composeHeaderBitmap(TaskView taskView,
+ private static GraphicBuffer composeHeaderBitmap(TaskView taskView,
TaskViewTransform transform) {
float scale = transform.scale;
int headerWidth = (int) (transform.rect.width());
@@ -382,16 +378,30 @@
return null;
}
- Bitmap b = Bitmap.createBitmap(headerWidth, headerHeight, Bitmap.Config.ARGB_8888);
if (RecentsDebugFlags.Static.EnableTransitionThumbnailDebugMode) {
- b.eraseColor(0xFFff0000);
+ return drawViewIntoGraphicBuffer(headerWidth, headerHeight, null, 1f, 0xFFff0000);
} else {
- Canvas c = new Canvas(b);
- c.scale(scale, scale);
- taskView.mHeaderView.draw(c);
- c.setBitmap(null);
+ return drawViewIntoGraphicBuffer(headerWidth, headerHeight, taskView.mHeaderView,
+ scale, 0);
}
- return b.createAshmemBitmap();
+ }
+
+ public static GraphicBuffer drawViewIntoGraphicBuffer(int bufferWidth, int bufferHeight,
+ View view, float scale, int eraseColor) {
+ RenderNode node = RenderNode.create("RecentsTransition", null);
+ node.setLeftTopRightBottom(0, 0, bufferWidth, bufferHeight);
+ node.setClipToBounds(false);
+ DisplayListCanvas c = node.start(bufferWidth, bufferHeight);
+ c.scale(scale, scale);
+ if (eraseColor != 0) {
+ c.drawColor(eraseColor);
+ }
+ if (view != null) {
+ view.draw(c);
+ }
+ node.end(c);
+ return ThreadedRenderer.createHardwareBitmap(node, bufferWidth, bufferHeight)
+ .createGraphicBufferHandle();
}
/**
@@ -399,7 +409,7 @@
*/
private static AppTransitionAnimationSpec composeAnimationSpec(TaskStackView stackView,
TaskView taskView, TaskViewTransform transform, boolean addHeaderBitmap) {
- Bitmap b = null;
+ GraphicBuffer b = null;
if (addHeaderBitmap) {
b = composeHeaderBitmap(taskView, transform);
if (b == null) {
diff --git a/packages/SystemUI/src/com/android/systemui/recents/views/RecentsViewTouchHandler.java b/packages/SystemUI/src/com/android/systemui/recents/views/RecentsViewTouchHandler.java
index 2180ec8..46619c2 100644
--- a/packages/SystemUI/src/com/android/systemui/recents/views/RecentsViewTouchHandler.java
+++ b/packages/SystemUI/src/com/android/systemui/recents/views/RecentsViewTouchHandler.java
@@ -138,7 +138,7 @@
}
mVisibleDockStates.clear();
- if (ActivityManager.supportsMultiWindow() && !ssp.hasDockedTask()
+ if (ActivityManager.supportsMultiWindow(mRv.getContext()) && !ssp.hasDockedTask()
&& mDividerSnapAlgorithm.isSplitScreenFeasible()) {
Recents.logDockAttempt(mRv.getContext(), event.task.getTopComponent(),
event.task.resizeMode);
diff --git a/packages/SystemUI/src/com/android/systemui/recents/views/TaskStackView.java b/packages/SystemUI/src/com/android/systemui/recents/views/TaskStackView.java
index 5f9a8f5..6ad6a15 100644
--- a/packages/SystemUI/src/com/android/systemui/recents/views/TaskStackView.java
+++ b/packages/SystemUI/src/com/android/systemui/recents/views/TaskStackView.java
@@ -62,7 +62,6 @@
import com.android.systemui.recents.events.activity.CancelEnterRecentsWindowAnimationEvent;
import com.android.systemui.recents.events.activity.ConfigurationChangedEvent;
import com.android.systemui.recents.events.activity.DismissRecentsToHomeAnimationStarted;
-import com.android.systemui.recents.events.activity.EnterRecentsTaskStackAnimationCompletedEvent;
import com.android.systemui.recents.events.activity.EnterRecentsWindowAnimationCompletedEvent;
import com.android.systemui.recents.events.activity.HideRecentsEvent;
import com.android.systemui.recents.events.activity.HideStackActionButtonEvent;
@@ -97,6 +96,7 @@
import com.android.systemui.recents.events.ui.focus.FocusPreviousTaskViewEvent;
import com.android.systemui.recents.events.ui.focus.NavigateTaskViewEvent;
import com.android.systemui.recents.misc.DozeTrigger;
+import com.android.systemui.recents.misc.ReferenceCountedTrigger;
import com.android.systemui.recents.misc.SystemServicesProxy;
import com.android.systemui.recents.misc.Utilities;
import com.android.systemui.recents.model.Task;
@@ -175,7 +175,11 @@
@ViewDebug.ExportedProperty(category="recents")
private boolean mTaskViewsClipDirty = true;
@ViewDebug.ExportedProperty(category="recents")
- private boolean mAwaitingFirstLayout = true;
+ private boolean mEnterAnimationComplete = false;
+ @ViewDebug.ExportedProperty(category="recents")
+ private boolean mStackReloaded = false;
+ @ViewDebug.ExportedProperty(category="recents")
+ private boolean mFinishedLayoutAfterStackReload = false;
@ViewDebug.ExportedProperty(category="recents")
private boolean mLaunchNextAfterFirstMeasure = false;
@ViewDebug.ExportedProperty(category="recents")
@@ -184,8 +188,6 @@
@ViewDebug.ExportedProperty(category="recents")
private boolean mInMeasureLayout = false;
@ViewDebug.ExportedProperty(category="recents")
- private boolean mEnterAnimationComplete = false;
- @ViewDebug.ExportedProperty(category="recents")
boolean mTouchExplorationEnabled;
@ViewDebug.ExportedProperty(category="recents")
boolean mScreenPinningEnabled;
@@ -355,7 +357,6 @@
// Reset the stack state
readSystemFlags();
mTaskViewsClipDirty = true;
- mEnterAnimationComplete = false;
mUIDozeTrigger.stopDozing();
if (isResumingFromVisible) {
// Animate in the freeform workspace
@@ -370,7 +371,8 @@
// Since we always animate to the same place in (the initial state), always reset the stack
// to the initial state when resuming
- mAwaitingFirstLayout = true;
+ mStackReloaded = true;
+ mFinishedLayoutAfterStackReload = false;
mLaunchNextAfterFirstMeasure = false;
mInitialState = INITIAL_STATE_UPDATE_ALL;
requestLayout();
@@ -1282,13 +1284,13 @@
// TaskViews with the stack so that we can lay them out
boolean resetToInitialState = (width != mLastWidth || height != mLastHeight)
&& mResetToInitialStateWhenResized;
- if (mAwaitingFirstLayout || mInitialState != INITIAL_STATE_UPDATE_NONE
+ if (!mFinishedLayoutAfterStackReload || mInitialState != INITIAL_STATE_UPDATE_NONE
|| resetToInitialState) {
if (mInitialState != INITIAL_STATE_UPDATE_LAYOUT_ONLY || resetToInitialState) {
updateToInitialState();
mResetToInitialStateWhenResized = false;
}
- if (!mAwaitingFirstLayout) {
+ if (mFinishedLayoutAfterStackReload) {
mInitialState = INITIAL_STATE_UPDATE_NONE;
}
}
@@ -1361,10 +1363,15 @@
relayoutTaskViews(AnimationProps.IMMEDIATE);
clipTaskViews();
- if (mAwaitingFirstLayout || !mEnterAnimationComplete) {
- mAwaitingFirstLayout = false;
+ if (!mFinishedLayoutAfterStackReload) {
+ // Prepare the task enter animations (this can be called numerous times)
mInitialState = INITIAL_STATE_UPDATE_NONE;
onFirstLayout();
+
+ if (mStackReloaded) {
+ mFinishedLayoutAfterStackReload = true;
+ tryStartEnterAnimation();
+ }
}
}
@@ -1490,7 +1497,7 @@
updateLayoutAlgorithm(true /* boundScroll */);
// Animate all the tasks into place
- relayoutTaskViews(mAwaitingFirstLayout
+ relayoutTaskViews(!mFinishedLayoutAfterStackReload
? AnimationProps.IMMEDIATE
: new AnimationProps(DEFAULT_SYNC_STACK_DURATION, Interpolators.FAST_OUT_SLOW_IN));
}
@@ -1563,7 +1570,7 @@
@Override
public void onStackTasksUpdated(TaskStack stack) {
- if (mAwaitingFirstLayout) {
+ if (!mFinishedLayoutAfterStackReload) {
return;
}
@@ -1805,7 +1812,7 @@
}
public final void onBusEvent(LaunchNextTaskRequestEvent event) {
- if (mAwaitingFirstLayout) {
+ if (!mFinishedLayoutAfterStackReload) {
mLaunchNextAfterFirstMeasure = true;
return;
}
@@ -2125,39 +2132,45 @@
public final void onBusEvent(EnterRecentsWindowAnimationCompletedEvent event) {
mEnterAnimationComplete = true;
+ tryStartEnterAnimation();
+ }
+
+ private void tryStartEnterAnimation() {
+ if (!mStackReloaded || !mFinishedLayoutAfterStackReload || !mEnterAnimationComplete) {
+ return;
+ }
if (mStack.getTaskCount() > 0) {
// Start the task enter animations
- mAnimationHelper.startEnterAnimation(event.getAnimationTrigger());
+ ReferenceCountedTrigger trigger = new ReferenceCountedTrigger();
+ mAnimationHelper.startEnterAnimation(trigger);
// Add a runnable to the post animation ref counter to clear all the views
- event.addPostAnimationCallback(new Runnable() {
- @Override
- public void run() {
- // Start the dozer to trigger to trigger any UI that shows after a timeout
- if (!Recents.getSystemServices().hasFreeformWorkspaceSupport()) {
- mUIDozeTrigger.startDozing();
- }
+ trigger.addLastDecrementRunnable(() -> {
+ // Start the dozer to trigger to trigger any UI that shows after a timeout
+ if (!Recents.getSystemServices().hasFreeformWorkspaceSupport()) {
+ mUIDozeTrigger.startDozing();
+ }
- // Update the focused state here -- since we only set the focused task without
- // requesting view focus in onFirstLayout(), actually request view focus and
- // animate the focused state if we are alt-tabbing now, after the window enter
- // animation is completed
- if (mFocusedTask != null) {
- RecentsConfiguration config = Recents.getConfiguration();
- RecentsActivityLaunchState launchState = config.getLaunchState();
- setFocusedTask(mStack.indexOfStackTask(mFocusedTask),
- false /* scrollToTask */, launchState.launchedWithAltTab);
- TaskView focusedTaskView = getChildViewForTask(mFocusedTask);
- if (mTouchExplorationEnabled && focusedTaskView != null) {
- focusedTaskView.requestAccessibilityFocus();
- }
+ // Update the focused state here -- since we only set the focused task without
+ // requesting view focus in onFirstLayout(), actually request view focus and
+ // animate the focused state if we are alt-tabbing now, after the window enter
+ // animation is completed
+ if (mFocusedTask != null) {
+ RecentsConfiguration config = Recents.getConfiguration();
+ RecentsActivityLaunchState launchState = config.getLaunchState();
+ setFocusedTask(mStack.indexOfStackTask(mFocusedTask),
+ false /* scrollToTask */, launchState.launchedWithAltTab);
+ TaskView focusedTaskView = getChildViewForTask(mFocusedTask);
+ if (mTouchExplorationEnabled && focusedTaskView != null) {
+ focusedTaskView.requestAccessibilityFocus();
}
-
- EventBus.getDefault().send(new EnterRecentsTaskStackAnimationCompletedEvent());
}
});
}
+
+ // This flag is only used to choreograph the enter animation, so we can reset it here
+ mStackReloaded = false;
}
public final void onBusEvent(UpdateFreeformTaskViewVisibilityEvent event) {
@@ -2235,15 +2248,21 @@
}
public final void onBusEvent(RecentsVisibilityChangedEvent event) {
- if (!event.visible && mTaskViewFocusFrame != null) {
- mTaskViewFocusFrame.moveGridTaskViewFocus(null);
- }
if (!event.visible) {
+ if (mTaskViewFocusFrame != null) {
+ mTaskViewFocusFrame.moveGridTaskViewFocus(null);
+ }
+
List<TaskView> taskViews = new ArrayList<>(getTaskViews());
for (int i = 0; i < taskViews.size(); i++) {
mViewPool.returnViewToPool(taskViews.get(i));
}
clearPrefetchingTask();
+
+ // We can not reset mEnterAnimationComplete in onReload() because when docking the top
+ // task, we can receive the enter animation callback before onReload(), so reset it
+ // here onces Recents is not visible
+ mEnterAnimationComplete = false;
}
}
@@ -2377,7 +2396,7 @@
writer.print(" hasDefRelayout=");
writer.print(mDeferredTaskViewLayoutAnimation != null ? "Y" : "N");
writer.print(" clipDirty="); writer.print(mTaskViewsClipDirty ? "Y" : "N");
- writer.print(" awaitingFirstLayout="); writer.print(mAwaitingFirstLayout ? "Y" : "N");
+ writer.print(" awaitingStackReload="); writer.print(mFinishedLayoutAfterStackReload ? "Y" : "N");
writer.print(" initialState="); writer.print(mInitialState);
writer.print(" inMeasureLayout="); writer.print(mInMeasureLayout ? "Y" : "N");
writer.print(" enterAnimCompleted="); writer.print(mEnterAnimationComplete ? "Y" : "N");
diff --git a/packages/SystemUI/src/com/android/systemui/recents/views/TaskViewAccessibilityDelegate.java b/packages/SystemUI/src/com/android/systemui/recents/views/TaskViewAccessibilityDelegate.java
index 2c3e78f..0c6b6b8 100644
--- a/packages/SystemUI/src/com/android/systemui/recents/views/TaskViewAccessibilityDelegate.java
+++ b/packages/SystemUI/src/com/android/systemui/recents/views/TaskViewAccessibilityDelegate.java
@@ -59,7 +59,7 @@
@Override
public void onInitializeAccessibilityNodeInfo(View host, AccessibilityNodeInfo info) {
super.onInitializeAccessibilityNodeInfo(host, info);
- if (ActivityManager.supportsSplitScreenMultiWindow()
+ if (ActivityManager.supportsSplitScreenMultiWindow(mTaskView.getContext())
&& !Recents.getSystemServices().hasDockedTask()) {
TaskStack.DockState[] dockStates = Recents.getConfiguration()
.getDockStatesForCurrentOrientation();
diff --git a/packages/SystemUI/src/com/android/systemui/stackdivider/DividerView.java b/packages/SystemUI/src/com/android/systemui/stackdivider/DividerView.java
index 0c77036..9e2ec57 100644
--- a/packages/SystemUI/src/com/android/systemui/stackdivider/DividerView.java
+++ b/packages/SystemUI/src/com/android/systemui/stackdivider/DividerView.java
@@ -160,7 +160,7 @@
private boolean mHomeStackResizable;
private boolean mAdjustedForIme;
private DividerState mState;
- private SurfaceFlingerVsyncChoreographer mSfChoreographer;
+ private final SurfaceFlingerVsyncChoreographer mSfChoreographer;
private final Handler mHandler = new Handler() {
@Override
@@ -250,20 +250,22 @@
};
public DividerView(Context context) {
- super(context);
+ this(context, null);
}
public DividerView(Context context, @Nullable AttributeSet attrs) {
- super(context, attrs);
+ this(context, attrs, 0);
}
public DividerView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
- super(context, attrs, defStyleAttr);
+ this(context, attrs, defStyleAttr, 0);
}
public DividerView(Context context, @Nullable AttributeSet attrs, int defStyleAttr,
int defStyleRes) {
super(context, attrs, defStyleAttr, defStyleRes);
+ mSfChoreographer = new SurfaceFlingerVsyncChoreographer(mHandler, context.getDisplay(),
+ Choreographer.getInstance());
}
@Override
@@ -313,8 +315,6 @@
protected void onAttachedToWindow() {
super.onAttachedToWindow();
EventBus.getDefault().register(this);
- mSfChoreographer = new SurfaceFlingerVsyncChoreographer(mHandler, getDisplay(),
- Choreographer.getInstance());
}
@Override
@@ -725,14 +725,21 @@
mMinimizedSnapAlgorithm = null;
mDockedStackMinimized = minimized;
initializeSnapAlgorithm();
- if (!mIsInMinimizeInteraction && minimized) {
- mIsInMinimizeInteraction = true;
- mDividerPositionBeforeMinimized = DockedDividerUtils.calculateMiddlePosition(
- isHorizontalDivision(), mStableInsets, mDisplayWidth, mDisplayHeight,
- mDividerSize);
+ if (mIsInMinimizeInteraction != minimized) {
+ if (minimized) {
+ mIsInMinimizeInteraction = true;
+ mDividerPositionBeforeMinimized = DockedDividerUtils.calculateMiddlePosition(
+ isHorizontalDivision(), mStableInsets, mDisplayWidth, mDisplayHeight,
+ mDividerSize);
- int position = mMinimizedSnapAlgorithm.getMiddleTarget().position;
- resizeStack(position, position, mMinimizedSnapAlgorithm.getMiddleTarget());
+ int position = mMinimizedSnapAlgorithm.getMiddleTarget().position;
+ resizeStack(position, position, mMinimizedSnapAlgorithm.getMiddleTarget());
+ } else {
+ resizeStack(mDividerPositionBeforeMinimized, mDividerPositionBeforeMinimized,
+ mSnapAlgorithm.calculateNonDismissingSnapTarget(
+ mDividerPositionBeforeMinimized));
+ mIsInMinimizeInteraction = false;
+ }
}
}
}
@@ -825,7 +832,10 @@
.setDuration(animDuration)
.start();
mAdjustedForIme = adjustedForIme;
- if (mHomeStackResizable && adjustedForIme) {
+
+ // Only get new position if home stack is resizable, ime is open and not minimized
+ // (including the animation)
+ if (mHomeStackResizable && adjustedForIme && !mIsInMinimizeInteraction) {
mDividerPositionBeforeMinimized = getCurrentPosition();
}
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/ExpandableNotificationRow.java b/packages/SystemUI/src/com/android/systemui/statusbar/ExpandableNotificationRow.java
index 3a39e91..a81b140 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/ExpandableNotificationRow.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/ExpandableNotificationRow.java
@@ -91,6 +91,7 @@
}
private LayoutListener mLayoutListener;
+ private boolean mLowPriorityStateUpdated;
private final NotificationInflater mNotificationInflater;
private int mIconTransformContentShift;
private int mIconTransformContentShiftNoIcon;
@@ -813,10 +814,10 @@
public void onDensityOrFontScaleChanged() {
initDimens();
- if (mIsSummaryWithChildren) {
- if (mChildrenContainer != null) {
- mChildrenContainer.reInflateViews(mExpandClickListener, mEntry.notification);
- }
+ // Let's update our childrencontainer. This is intentionally not guarded with
+ // mIsSummaryWithChildren since we might have had children but not anymore.
+ if (mChildrenContainer != null) {
+ mChildrenContainer.reInflateViews(mExpandClickListener, mEntry.notification);
}
if (mGuts != null) {
View oldGuts = mGuts;
@@ -1121,6 +1122,15 @@
}
}
+
+ public void setLowPriorityStateUpdated(boolean lowPriorityStateUpdated) {
+ mLowPriorityStateUpdated = lowPriorityStateUpdated;
+ }
+
+ public boolean hasLowPriorityStateUpdated() {
+ return mLowPriorityStateUpdated;
+ }
+
public boolean isLowPriority() {
return mIsLowPriority;
}
@@ -1458,9 +1468,11 @@
public void setUserLocked(boolean userLocked) {
mUserLocked = userLocked;
mPrivateLayout.setUserExpanding(userLocked);
- if (mIsSummaryWithChildren) {
+ // This is intentionally not guarded with mIsSummaryWithChildren since we might have had
+ // children but not anymore.
+ if (mChildrenContainer != null) {
mChildrenContainer.setUserLocked(userLocked);
- if (userLocked || !isGroupExpanded()) {
+ if (mIsSummaryWithChildren && (userLocked || !isGroupExpanded())) {
updateBackgroundForGroupState();
}
}
@@ -2189,4 +2201,9 @@
}
}
}
+
+ @VisibleForTesting
+ protected void setChildrenContainer(NotificationChildrenContainer childrenContainer) {
+ mChildrenContainer = childrenContainer;
+ }
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/InflationTask.java b/packages/SystemUI/src/com/android/systemui/statusbar/InflationTask.java
new file mode 100644
index 0000000..22fd37c
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/InflationTask.java
@@ -0,0 +1,32 @@
+/*
+ * Copyright (C) 2017 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.systemui.statusbar;
+
+/**
+ * An interface for running inflation tasks that allows aborting and superseding existing
+ * operations.
+ */
+public interface InflationTask {
+ void abort();
+
+ /**
+ * Supersedes an existing task. i.e another task was superceeded by this.
+ *
+ * @param task the task that was previously running
+ */
+ default void supersedeTask(InflationTask task) {}
+}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationData.java b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationData.java
index f8bad05..1844946 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationData.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationData.java
@@ -24,7 +24,6 @@
import android.content.pm.PackageManager;
import android.content.Context;
import android.graphics.drawable.Icon;
-import android.os.AsyncTask;
import android.os.RemoteException;
import android.os.SystemClock;
import android.service.notification.NotificationListenerService;
@@ -84,7 +83,7 @@
public List<SnoozeCriterion> snoozeCriteria;
private int mCachedContrastColor = COLOR_INVALID;
private int mCachedContrastColorIsFor = COLOR_INVALID;
- private Abortable mRunningTask = null;
+ private InflationTask mRunningTask = null;
public Entry(StatusBarNotification n) {
this.key = n.getKey();
@@ -225,10 +224,14 @@
}
}
- public void setInflationTask(Abortable abortableTask) {
+ public void setInflationTask(InflationTask abortableTask) {
// abort any existing inflation
+ InflationTask existing = mRunningTask;
abortTask();
mRunningTask = abortableTask;
+ if (existing != null && mRunningTask != null) {
+ mRunningTask.supersedeTask(existing);
+ }
}
public void onInflationTaskFinished() {
@@ -236,7 +239,7 @@
}
@VisibleForTesting
- public Abortable getRunningTask() {
+ public InflationTask getRunningTask() {
return mRunningTask;
}
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationInfo.java b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationInfo.java
index 7062216..427708b 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationInfo.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationInfo.java
@@ -221,7 +221,9 @@
boolean nonBlockable = false;
try {
final PackageInfo pkgInfo = pm.getPackageInfo(pkg, PackageManager.GET_SIGNATURES);
- nonBlockable = Utils.isSystemPackage(getResources(), pm, pkgInfo);
+ nonBlockable = Utils.isSystemPackage(getResources(), pm, pkgInfo)
+ && (mSingleNotificationChannel == null
+ || !mSingleNotificationChannel.isBlockableSystem());
} catch (PackageManager.NameNotFoundException e) {
// unlikely.
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationMenuRow.java b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationMenuRow.java
index d4b8920..570de18 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationMenuRow.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationMenuRow.java
@@ -140,7 +140,7 @@
@Override
public void createMenu(ViewGroup parent) {
mParent = (ExpandableNotificationRow) parent;
- createMenuViews();
+ createMenuViews(true /* resetState */);
}
@Override
@@ -164,7 +164,7 @@
// Menu hasn't been created yet, no need to do anything.
return;
}
- createMenuViews();
+ createMenuViews(!isMenuVisible() /* resetState */);
}
@Override
@@ -179,7 +179,7 @@
mParent.removeListener();
}
- private void createMenuViews() {
+ private void createMenuViews(boolean resetState) {
// Filter the menu items based on the notification
if (mParent != null && mParent.getStatusBarNotification() != null) {
int flags = mParent.getStatusBarNotification().getNotification().flags;
@@ -201,7 +201,14 @@
for (int i = 0; i < mMenuItems.size(); i++) {
addMenuView(mMenuItems.get(i), mMenuContainer);
}
- resetState(false /* notify */);
+ if (resetState) {
+ resetState(false /* notify */);
+ } else {
+ mIconsPlaced = false;
+ setMenuLocation();
+ // If the # of items showing changed we need to update the snap position
+ showMenu(mParent, mOnLeft ? getSpaceForMenu() : -getSpaceForMenu(), 0 /* velocity */);
+ }
}
private void resetState(boolean notify) {
@@ -330,7 +337,8 @@
} else {
snapBack(animView, velocity);
}
- } else if ((swipedEnoughToShowMenu() && (!gestureFastEnough || showMenuForSlowOnGoing))
+ } else if (!mSwipeHelper.isFalseGesture(ev)
+ && (swipedEnoughToShowMenu() && (!gestureFastEnough || showMenuForSlowOnGoing))
|| (gestureTowardsMenu && !mSwipeHelper.isDismissGesture(ev))) {
// Menu has not been snapped to previously and this is menu revealing gesture
showMenu(animView, menuSnapTarget, velocity);
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationShelf.java b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationShelf.java
index 78a5194..8368143 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationShelf.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationShelf.java
@@ -165,7 +165,7 @@
openedAmount = Math.min(1.0f, openedAmount);
mShelfState.openedAmount = openedAmount;
mShelfState.clipTopAmount = 0;
- mShelfState.alpha = mAmbientState.isPulsing() ? 0 : 1;
+ mShelfState.alpha = mAmbientState.hasPulsingNotifications() ? 0 : 1;
mShelfState.belowSpeedBump = mAmbientState.getSpeedBumpIndex() == 0;
mShelfState.shadowAlpha = 1.0f;
mShelfState.hideSensitive = false;
@@ -227,7 +227,7 @@
}
ExpandableNotificationRow row = (ExpandableNotificationRow) child;
float notificationClipEnd;
- boolean aboveShelf = row.getTranslationZ() > baseZHeight;
+ boolean aboveShelf = ViewState.getFinalTranslationZ(row) > baseZHeight;
boolean isLastChild = child == lastChild;
float rowTranslationY = row.getTranslationY();
if (isLastChild || aboveShelf || backgroundForceHidden) {
@@ -284,10 +284,15 @@
private void updateNotificationClipHeight(ExpandableNotificationRow row,
float notificationClipEnd) {
float viewEnd = row.getTranslationY() + row.getActualHeight();
+ boolean isPinned = row.isPinned() || row.isHeadsUpAnimatingAway();
if (viewEnd > notificationClipEnd
- && (mAmbientState.isShadeExpanded()
- || (!row.isPinned() && !row.isHeadsUpAnimatingAway()))) {
- row.setClipBottomAmount((int) (viewEnd - notificationClipEnd));
+ && (mAmbientState.isShadeExpanded() || !isPinned)) {
+ int clipBottomAmount = (int) (viewEnd - notificationClipEnd);
+ if (isPinned) {
+ clipBottomAmount = Math.min(row.getIntrinsicHeight() - row.getCollapsedHeight(),
+ clipBottomAmount);
+ }
+ row.setClipBottomAmount(clipBottomAmount);
} else {
row.setClipBottomAmount(0);
}
@@ -381,7 +386,8 @@
? fullTransitionAmount
: transitionAmount;
iconState.clampedAppearAmount = clampedAmount;
- float contentTransformationAmount = isLastChild || iconState.translateContent
+ float contentTransformationAmount = !row.isAboveShelf()
+ && (isLastChild || iconState.translateContent)
? iconTransitionAmount
: 0.0f;
row.setContentTransformationAmount(contentTransformationAmount, isLastChild);
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationSnooze.java b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationSnooze.java
index 8830c5d..8af1628 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationSnooze.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationSnooze.java
@@ -57,7 +57,7 @@
private ViewGroup mSnoozeOptionContainer;
private List<SnoozeOption> mSnoozeOptions;
private int mCollapsedHeight;
-
+ private SnoozeOption mDefaultOption;
private SnoozeOption mSelectedOption;
private boolean mSnoozing;
private boolean mExpanded;
@@ -86,7 +86,7 @@
createOptionViews();
// Default to first option in list
- setSelected(mSnoozeOptions.get(0));
+ setSelected(mDefaultOption);
}
public void setSnoozeOptions(final List<SnoozeCriterion> snoozeList) {
@@ -119,7 +119,9 @@
ArrayList<SnoozeOption> options = new ArrayList<>();
options.add(createOption(R.string.snooze_option_15_min, 15));
options.add(createOption(R.string.snooze_option_30_min, 30));
- options.add(createOption(R.string.snooze_option_1_hour, 60));
+ mDefaultOption = createOption(R.string.snooze_option_1_hour, 60);
+ options.add(mDefaultOption);
+ options.add(createOption(R.string.snooze_option_2_hour, 60 * 2));
return options;
}
@@ -232,7 +234,7 @@
@Override
public View getContentView() {
// Reset the view before use
- setSelected(mSnoozeOptions.get(0));
+ setSelected(mDefaultOption);
return this;
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/SignalClusterView.java b/packages/SystemUI/src/com/android/systemui/statusbar/SignalClusterView.java
index 28a858c..18cc8721 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/SignalClusterView.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/SignalClusterView.java
@@ -121,6 +121,7 @@
private boolean mBlockEthernet;
private boolean mActivityEnabled;
private boolean mForceBlockWifi;
+ private boolean mQsSignal;
public SignalClusterView(Context context) {
this(context, null);
@@ -152,9 +153,10 @@
updateActivityEnabled();
}
- public void setForceBlockWifi() {
+ public void setQsSignalCluster() {
mForceBlockWifi = true;
mBlockWifi = true;
+ mQsSignal = true;
if (isAttachedToWindow()) {
// Re-register to get new callbacks.
mNetworkController.removeCallback(this);
@@ -292,26 +294,30 @@
mWifiStrengthId = statusIcon.icon;
mWifiBadgeId = statusIcon.iconOverlay;
mWifiDescription = statusIcon.contentDescription;
- mWifiIn = activityIn && mActivityEnabled;
- mWifiOut = activityOut && mActivityEnabled;
+ mWifiIn = activityIn && mActivityEnabled && mWifiVisible;
+ mWifiOut = activityOut && mActivityEnabled && mWifiVisible;
apply();
}
@Override
- public void setMobileDataIndicators(IconState statusIcon, IconState qsIcon, int statusType,
+ public void setMobileDataIndicators(IconState icon, IconState qsIcon, int type,
int qsType, boolean activityIn, boolean activityOut, String typeContentDescription,
String description, boolean isWide, int subId, boolean roaming) {
PhoneState state = getState(subId);
if (state == null) {
return;
}
- state.mMobileVisible = statusIcon.visible && !mBlockMobile;
- state.mMobileStrengthId = statusIcon.icon;
- state.mMobileTypeId = statusType;
- state.mMobileDescription = statusIcon.contentDescription;
+ if (mQsSignal && qsIcon != null) {
+ icon = qsIcon;
+ type = qsType;
+ }
+ state.mMobileVisible = icon.visible && !mBlockMobile;
+ state.mMobileStrengthId = icon.icon;
+ state.mMobileTypeId = type;
+ state.mMobileDescription = icon.contentDescription;
state.mMobileTypeDescription = typeContentDescription;
- state.mIsMobileTypeIconWide = statusType != 0 && isWide;
+ state.mIsMobileTypeIconWide = type != 0 && isWide;
state.mRoaming = roaming;
state.mActivityIn = activityIn && mActivityEnabled;
state.mActivityOut = activityOut && mActivityEnabled;
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/StatusBarIconView.java b/packages/SystemUI/src/com/android/systemui/statusbar/StatusBarIconView.java
index c7fbbf9..85475b6 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/StatusBarIconView.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/StatusBarIconView.java
@@ -179,6 +179,10 @@
mIconScale = (float)imageBounds / (float)outerBounds;
}
+ public float getIconScaleFullyDark() {
+ return (float) mStatusBarIconDrawingSizeDark / mStatusBarIconDrawingSize;
+ }
+
public float getIconScale() {
return mIconScale;
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationInflater.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationInflater.java
index f1c26cd..4b08f2b 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationInflater.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationInflater.java
@@ -28,7 +28,7 @@
import com.android.internal.annotations.VisibleForTesting;
import com.android.systemui.R;
-import com.android.systemui.statusbar.Abortable;
+import com.android.systemui.statusbar.InflationTask;
import com.android.systemui.statusbar.ExpandableNotificationRow;
import com.android.systemui.statusbar.NotificationContentView;
import com.android.systemui.statusbar.NotificationData;
@@ -36,6 +36,13 @@
import com.android.systemui.util.Assert;
import java.util.HashMap;
+import java.util.concurrent.BlockingQueue;
+import java.util.concurrent.Executor;
+import java.util.concurrent.LinkedBlockingQueue;
+import java.util.concurrent.ThreadFactory;
+import java.util.concurrent.ThreadPoolExecutor;
+import java.util.concurrent.TimeUnit;
+import java.util.concurrent.atomic.AtomicInteger;
/**
* A utility that inflates the right kind of contentView based on the state
@@ -50,6 +57,7 @@
private static final int FLAG_REINFLATE_HEADS_UP_VIEW = 1<<2;
private static final int FLAG_REINFLATE_PUBLIC_VIEW = 1<<3;
private static final int FLAG_REINFLATE_AMBIENT_VIEW = 1<<4;
+ private static final InflationExecutor EXECUTOR = new InflationExecutor();
private final ExpandableNotificationRow mRow;
private boolean mIsLowPriority;
@@ -122,6 +130,12 @@
*/
@VisibleForTesting
void inflateNotificationViews(int reInflateFlags) {
+ if (mRow.isRemoved()) {
+ // We don't want to reinflate anything for removed notifications. Otherwise views might
+ // be readded to the stack, leading to leaks. This may happen with low-priority groups
+ // where the removal of already removed children can lead to a reinflation.
+ return;
+ }
StatusBarNotification sbn = mRow.getEntry().notification;
new AsyncInflationTask(sbn, reInflateFlags, mRow, mIsLowPriority,
mIsChildInGroup, mUsesIncreasedHeight, mUsesIncreasedHeadsUpHeight, mRedactAmbient,
@@ -330,14 +344,14 @@
cancellationSignal = newContentView.applyAsync(
result.packageContext,
parentLayout,
- null /* executor */,
+ EXECUTOR,
listener,
remoteViewClickHandler);
} else {
cancellationSignal = newContentView.reapplyAsync(
result.packageContext,
existingView,
- null /* executor */,
+ EXECUTOR,
listener,
remoteViewClickHandler);
}
@@ -477,17 +491,17 @@
}
public static class AsyncInflationTask extends AsyncTask<Void, Void, InflationProgress>
- implements InflationCallback, Abortable {
+ implements InflationCallback, InflationTask {
private final StatusBarNotification mSbn;
private final Context mContext;
- private final int mReInflateFlags;
private final boolean mIsLowPriority;
private final boolean mIsChildInGroup;
private final boolean mUsesIncreasedHeight;
private final InflationCallback mCallback;
private final boolean mUsesIncreasedHeadsUpHeight;
private final boolean mRedactAmbient;
+ private int mReInflateFlags;
private ExpandableNotificationRow mRow;
private Exception mError;
private RemoteViews.OnClickHandler mRemoteViewClickHandler;
@@ -500,8 +514,6 @@
InflationCallback callback,
RemoteViews.OnClickHandler remoteViewClickHandler) {
mRow = row;
- NotificationData.Entry entry = row.getEntry();
- entry.setInflationTask(this);
mSbn = notification;
mReInflateFlags = reInflateFlags;
mContext = mRow.getContext();
@@ -512,6 +524,13 @@
mRedactAmbient = redactAmbient;
mRemoteViewClickHandler = remoteViewClickHandler;
mCallback = callback;
+ NotificationData.Entry entry = row.getEntry();
+ entry.setInflationTask(this);
+ }
+
+ @VisibleForTesting
+ public int getReInflateFlags() {
+ return mReInflateFlags;
}
@Override
@@ -572,6 +591,14 @@
}
@Override
+ public void supersedeTask(InflationTask task) {
+ if (task instanceof AsyncInflationTask) {
+ // We want to inflate all flags of the previous task as well
+ mReInflateFlags |= ((AsyncInflationTask) task).mReInflateFlags;
+ }
+ }
+
+ @Override
public void handleInflationException(StatusBarNotification notification, Exception e) {
handleError(e);
}
@@ -604,4 +631,40 @@
public abstract void setResultView(View v);
public abstract RemoteViews getRemoteView();
}
+
+ /**
+ * A custom executor that allows more tasks to be queued. Default values are copied from
+ * AsyncTask
+ */
+ private static class InflationExecutor implements Executor {
+ private static final int CPU_COUNT = Runtime.getRuntime().availableProcessors();
+ // We want at least 2 threads and at most 4 threads in the core pool,
+ // preferring to have 1 less than the CPU count to avoid saturating
+ // the CPU with background work
+ private static final int CORE_POOL_SIZE = Math.max(2, Math.min(CPU_COUNT - 1, 4));
+ private static final int MAXIMUM_POOL_SIZE = CPU_COUNT * 2 + 1;
+ private static final int KEEP_ALIVE_SECONDS = 30;
+
+ private static final ThreadFactory sThreadFactory = new ThreadFactory() {
+ private final AtomicInteger mCount = new AtomicInteger(1);
+
+ public Thread newThread(Runnable r) {
+ return new Thread(r, "InflaterThread #" + mCount.getAndIncrement());
+ }
+ };
+
+ private final ThreadPoolExecutor mExecutor;
+
+ private InflationExecutor() {
+ mExecutor = new ThreadPoolExecutor(
+ CORE_POOL_SIZE, MAXIMUM_POOL_SIZE, KEEP_ALIVE_SECONDS, TimeUnit.SECONDS,
+ new LinkedBlockingQueue<>(), sThreadFactory);
+ mExecutor.allowCoreThreadTimeOut(true);
+ }
+
+ @Override
+ public void execute(Runnable runnable) {
+ mExecutor.execute(runnable);
+ }
+ }
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/RowInflaterTask.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/RowInflaterTask.java
index 1bfc0cc..3491f81 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/RowInflaterTask.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/RowInflaterTask.java
@@ -22,14 +22,14 @@
import android.view.ViewGroup;
import com.android.systemui.R;
-import com.android.systemui.statusbar.Abortable;
+import com.android.systemui.statusbar.InflationTask;
import com.android.systemui.statusbar.ExpandableNotificationRow;
import com.android.systemui.statusbar.NotificationData;
/**
* An inflater task that asynchronously inflates a ExpandableNotificationRow
*/
-public class RowInflaterTask implements Abortable, AsyncLayoutInflater.OnInflateFinishedListener {
+public class RowInflaterTask implements InflationTask, AsyncLayoutInflater.OnInflateFinishedListener {
private RowInflationFinishedListener mListener;
private NotificationData.Entry mEntry;
private boolean mCancelled;
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/VisualStabilityManager.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/VisualStabilityManager.java
index 8dab069..09aff1b 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/VisualStabilityManager.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/VisualStabilityManager.java
@@ -38,6 +38,7 @@
private boolean mReorderingAllowed;
private VisibilityLocationProvider mVisibilityLocationProvider;
private ArraySet<View> mAllowedReorderViews = new ArraySet<>();
+ private ArraySet<View> mLowPriorityReorderingViews = new ArraySet<>();
private ArraySet<View> mAddedChildren = new ArraySet<>();
private boolean mPulsing;
@@ -115,6 +116,9 @@
if (mAddedChildren.contains(row)) {
return true;
}
+ if (mLowPriorityReorderingViews.contains(row)) {
+ return true;
+ }
if (mAllowedReorderViews.contains(row)
&& !mVisibilityLocationProvider.isInVisibleLocation(row)) {
return true;
@@ -130,6 +134,7 @@
public void onReorderingFinished() {
mAllowedReorderViews.clear();
mAddedChildren.clear();
+ mLowPriorityReorderingViews.clear();
}
@Override
@@ -141,6 +146,10 @@
}
}
+ public void onLowPriorityUpdated(NotificationData.Entry entry) {
+ mLowPriorityReorderingViews.add(entry.row);
+ }
+
/**
* Notify the visual stability manager that a new view was added and should be allowed to
* reorder next time.
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/DozeScrimController.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/DozeScrimController.java
index c5f23c5..6b276f8 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/DozeScrimController.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/DozeScrimController.java
@@ -53,6 +53,7 @@
private float mInFrontTarget;
private float mBehindTarget;
private boolean mDozingAborted;
+ private boolean mWakeAndUnlocking;
public DozeScrimController(ScrimController scrimController, Context context) {
mContext = context;
@@ -63,6 +64,7 @@
public void setDozing(boolean dozing, boolean animate) {
if (mDozing == dozing) return;
mDozing = dozing;
+ mWakeAndUnlocking = false;
if (mDozing) {
mDozingAborted = false;
abortAnimations();
@@ -85,6 +87,16 @@
}
}
+ public void setWakeAndUnlocking() {
+ // Immediately abort the doze scrims in case of wake-and-unlock
+ // for pulsing so the Keyguard fade-out animation scrim can take over.
+ if (!mWakeAndUnlocking) {
+ mWakeAndUnlocking = true;
+ mScrimController.setDozeBehindAlpha(0f);
+ mScrimController.setDozeInFrontAlpha(0f);
+ }
+ }
+
/** When dozing, fade screen contents in and out using the front scrim. */
public void pulse(@NonNull DozeHost.PulseCallback callback, int reason) {
if (callback == null) {
@@ -109,7 +121,7 @@
*/
public void abortPulsing() {
cancelPulsing();
- if (mDozing) {
+ if (mDozing && !mWakeAndUnlocking) {
mScrimController.setDozeBehindAlpha(1f);
mScrimController.setDozeInFrontAlpha(
mDozeParameters.getAlwaysOn() && !mDozingAborted ? 0f : 1f);
@@ -244,6 +256,9 @@
}
private void setDozeAlpha(boolean inFront, float alpha) {
+ if (mWakeAndUnlocking) {
+ return;
+ }
if (inFront) {
mScrimController.setDozeInFrontAlpha(alpha);
} else {
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/FingerprintUnlockController.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/FingerprintUnlockController.java
index f216d6c..6cb722f 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/FingerprintUnlockController.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/FingerprintUnlockController.java
@@ -98,7 +98,6 @@
private StatusBar mStatusBar;
private final UnlockMethodCache mUnlockMethodCache;
private final Context mContext;
- private boolean mGoingToSleep;
private int mPendingAuthenticatedUserId = -1;
public FingerprintUnlockController(Context context,
@@ -213,17 +212,19 @@
Trace.endSection();
break;
case MODE_WAKE_AND_UNLOCK_PULSING:
- Trace.beginSection("MODE_WAKE_AND_UNLOCK_PULSING");
- mStatusBar.updateMediaMetaData(false /* metaDataChanged */,
- true /* allowEnterAnimation */);
- // Fall through.
- Trace.endSection();
case MODE_WAKE_AND_UNLOCK:
- Trace.beginSection("MODE_WAKE_AND_UNLOCK");
+ if (mMode == MODE_WAKE_AND_UNLOCK_PULSING) {
+ Trace.beginSection("MODE_WAKE_AND_UNLOCK_PULSING");
+ mStatusBar.updateMediaMetaData(false /* metaDataChanged */,
+ true /* allowEnterAnimation */);
+ } else {
+ Trace.beginSection("MODE_WAKE_AND_UNLOCK");
+ mDozeScrimController.abortDoze();
+ }
mStatusBarWindowManager.setStatusBarFocusable(false);
- mDozeScrimController.abortDoze();
mKeyguardViewMediator.onWakeAndUnlocking();
mScrimController.setWakeAndUnlocking();
+ mDozeScrimController.setWakeAndUnlocking();
if (mStatusBar.getNavigationBarView() != null) {
mStatusBar.getNavigationBarView().setWakeAndUnlocking(true);
}
@@ -302,10 +303,7 @@
}
private void cleanup() {
- mMode = MODE_NONE;
releaseFingerprintWakeLock();
- mStatusBarWindowManager.setForceDozeBrightness(false);
- mStatusBar.notifyFpAuthModeChanged();
}
public void startKeyguardFadingAway() {
@@ -321,6 +319,7 @@
public void finishKeyguardFadingAway() {
mMode = MODE_NONE;
+ mStatusBarWindowManager.setForceDozeBrightness(false);
if (mStatusBar.getNavigationBarView() != null) {
mStatusBar.getNavigationBarView().setWakeAndUnlocking(false);
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardBottomAreaView.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardBottomAreaView.java
index 41a60e2..6fe8827 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardBottomAreaView.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardBottomAreaView.java
@@ -330,7 +330,7 @@
private void updateRightAffordanceIcon() {
IconState state = mRightButton.getIcon();
- mRightAffordanceView.setVisibility(state.isVisible ? View.VISIBLE : View.GONE);
+ mRightAffordanceView.setVisibility(!mDozing && state.isVisible ? View.VISIBLE : View.GONE);
mRightAffordanceView.setImageDrawable(state.drawable, state.tint);
mRightAffordanceView.setContentDescription(state.contentDescription);
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarFragment.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarFragment.java
index 4bfc16b..d047fa9 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarFragment.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarFragment.java
@@ -545,7 +545,7 @@
}
private boolean onLongPressRecents() {
- if (mRecents == null || !ActivityManager.supportsMultiWindow()
+ if (mRecents == null || !ActivityManager.supportsMultiWindow(getContext())
|| !mDivider.getView().getSnapAlgorithm().isSplitScreenFeasible()) {
return false;
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationIconContainer.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationIconContainer.java
index 9000eb4..f94bb0c 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationIconContainer.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationIconContainer.java
@@ -267,6 +267,9 @@
boolean forceOverflow = mSpeedBumpIndex != -1 && i >= mSpeedBumpIndex
&& iconState.iconAppearAmount > 0.0f || i >= maxVisibleIcons;
boolean noOverflowAfter = i == childCount - 1;
+ float drawingScale = mDark && view instanceof StatusBarIconView
+ ? ((StatusBarIconView) view).getIconScaleFullyDark()
+ : 1f;
if (mOpenedAmount != 0.0f) {
noOverflowAfter = noOverflowAfter && !hasAmbient && !forceOverflow;
}
@@ -303,7 +306,7 @@
visualOverflowStart += mVisualOverflowAdaption * (1f - mOpenedAmount);
}
}
- translationX += iconState.iconAppearAmount * view.getWidth();
+ translationX += iconState.iconAppearAmount * view.getWidth() * drawingScale;
}
if (firstOverflowIndex != -1) {
int numDots = 1;
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelView.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelView.java
index 0fa8afa..6aab8e1 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelView.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelView.java
@@ -2401,17 +2401,26 @@
@Override
public void setAlpha(float alpha) {
super.setAlpha(alpha);
- updateFullyVisibleState();
+ updateFullyVisibleState(false /* forceNotFullyVisible */);
+ }
+
+ /**
+ * Must be called before starting a ViewPropertyAnimator alpha animation because those
+ * do NOT call setAlpha and therefore don't properly update the fullyVisibleState.
+ */
+ public void notifyStartFading() {
+ updateFullyVisibleState(true /* forceNotFullyVisible */);
}
@Override
public void setVisibility(int visibility) {
super.setVisibility(visibility);
- updateFullyVisibleState();
+ updateFullyVisibleState(false /* forceNotFullyVisible */);
}
- private void updateFullyVisibleState() {
- mNotificationStackScroller.setParentNotFullyVisible(getAlpha() != 1.0f
+ private void updateFullyVisibleState(boolean forceNotFullyVisible) {
+ mNotificationStackScroller.setParentNotFullyVisible(forceNotFullyVisible
+ || getAlpha() != 1.0f
|| getVisibility() != VISIBLE);
}
@@ -2526,6 +2535,9 @@
public void setNoVisibleNotifications(boolean noNotifications) {
mNoVisibleNotifications = noNotifications;
+ if (mQs != null) {
+ mQs.setHasNotifications(!noNotifications);
+ }
}
public void setPulsing(boolean pulsing) {
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PanelView.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PanelView.java
index e378e871..b1d82b1 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PanelView.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PanelView.java
@@ -34,10 +34,9 @@
import android.widget.FrameLayout;
import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
-import com.android.systemui.DejankUtils;
-import com.android.systemui.EventLogTags;
-import com.android.systemui.Interpolators;
import com.android.keyguard.LatencyTracker;
+import com.android.systemui.DejankUtils;
+import com.android.systemui.Interpolators;
import com.android.systemui.R;
import com.android.systemui.classifier.FalsingManager;
import com.android.systemui.doze.DozeLog;
@@ -56,6 +55,7 @@
private long mDownTime;
private float mMinExpandHeight;
private LockscreenGestureLogger mLockscreenGestureLogger = new LockscreenGestureLogger();
+ private boolean mPanelUpdateWhenAnimatorEnds;
private final void logf(String fmt, Object... args) {
Log.v(TAG, (mViewName != null ? (mViewName + ": ") : "") + String.format(fmt, args));
@@ -225,6 +225,7 @@
if (mTracking) {
onTrackingStopped(true /* expanded */);
}
+ notifyExpandingFinished();
}
}
@@ -507,7 +508,7 @@
@Override
public boolean onInterceptTouchEvent(MotionEvent event) {
- if (mInstantExpanding || !mNotificationsDragEnabled
+ if (mInstantExpanding || !mNotificationsDragEnabled || mTouchDisabled
|| (mMotionAborted && event.getActionMasked() != MotionEvent.ACTION_DOWN)) {
return false;
}
@@ -758,14 +759,14 @@
if (clearAllExpandHack && !mCancelled) {
setExpandedHeightInternal(getMaxPanelHeight());
}
- mHeightAnimator = null;
+ setAnimator(null);
if (!mCancelled) {
notifyExpandingFinished();
}
notifyBarPanelExpansionChanged();
}
});
- mHeightAnimator = animator;
+ setAnimator(animator);
animator.start();
}
@@ -802,15 +803,28 @@
protected void requestPanelHeightUpdate() {
float currentMaxPanelHeight = getMaxPanelHeight();
- // If the user isn't actively poking us, let's update the height
- if ((!mTracking || isTrackingBlocked())
- && mHeightAnimator == null
- && !isFullyCollapsed()
- && currentMaxPanelHeight != mExpandedHeight
- && mPeekAnimator == null
- && !mPeekTouching) {
- setExpandedHeight(currentMaxPanelHeight);
+ if (isFullyCollapsed()) {
+ return;
}
+
+ if (currentMaxPanelHeight == mExpandedHeight) {
+ return;
+ }
+
+ if (mPeekAnimator != null || mPeekTouching) {
+ return;
+ }
+
+ if (mTracking && !isTrackingBlocked()) {
+ return;
+ }
+
+ if (mHeightAnimator != null) {
+ mPanelUpdateWhenAnimatorEnds = true;
+ return;
+ }
+
+ setExpandedHeight(currentMaxPanelHeight);
}
public void setExpandedHeightInternal(float h) {
@@ -833,6 +847,14 @@
}
}
+ // If we are closing the panel and we are almost there due to a slow decelerating
+ // interpolator, abort the animation.
+ if (mExpandedHeight < 1f && mExpandedHeight != 0f && mClosing) {
+ mExpandedHeight = 0f;
+ if (mHeightAnimator != null) {
+ mHeightAnimator.end();
+ }
+ }
mExpandedFraction = Math.min(1f,
fhWithoutOverExpansion == 0 ? 0 : mExpandedHeight / fhWithoutOverExpansion);
onHeightUpdated(mExpandedHeight);
@@ -1054,7 +1076,7 @@
@Override
public void onAnimationEnd(Animator animation) {
if (mCancelled) {
- mHeightAnimator = null;
+ setAnimator(null);
onAnimationFinished.run();
} else {
startUnlockHintAnimationPhase2(onAnimationFinished);
@@ -1062,7 +1084,7 @@
}
});
animator.start();
- mHeightAnimator = animator;
+ setAnimator(animator);
mKeyguardBottomArea.getIndicationArea().animate()
.translationY(-mHintDistance)
.setDuration(250)
@@ -1080,6 +1102,14 @@
.start();
}
+ private void setAnimator(ValueAnimator animator) {
+ mHeightAnimator = animator;
+ if (animator == null && mPanelUpdateWhenAnimatorEnds) {
+ mPanelUpdateWhenAnimatorEnds = false;
+ requestPanelHeightUpdate();
+ }
+ }
+
/**
* Phase 2: Bounce down.
*/
@@ -1090,13 +1120,13 @@
animator.addListener(new AnimatorListenerAdapter() {
@Override
public void onAnimationEnd(Animator animation) {
- mHeightAnimator = null;
+ setAnimator(null);
onAnimationFinished.run();
notifyBarPanelExpansionChanged();
}
});
animator.start();
- mHeightAnimator = animator;
+ setAnimator(animator);
}
private ValueAnimator createHeightAnimator(float targetHeight) {
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBarView.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBarView.java
index 916b603..970d1de 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBarView.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBarView.java
@@ -121,12 +121,12 @@
public void onPanelCollapsed() {
super.onPanelCollapsed();
// Close the status bar in the next frame so we can show the end of the animation.
- DejankUtils.postAfterTraversal(mHideExpandedRunnable);
+ post(mHideExpandedRunnable);
mIsFullyOpenedPanel = false;
}
public void removePendingHideExpandedRunnables() {
- DejankUtils.removeCallbacks(mHideExpandedRunnable);
+ removeCallbacks(mHideExpandedRunnable);
}
@Override
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/SignalDrawable.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/SignalDrawable.java
index a9eb20b..8cd8791 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/SignalDrawable.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/SignalDrawable.java
@@ -30,6 +30,7 @@
import android.graphics.Rect;
import android.graphics.drawable.Drawable;
import android.os.Handler;
+import android.util.LayoutDirection;
import android.util.Log;
import com.android.settingslib.R;
@@ -192,6 +193,13 @@
@Override
public void draw(@NonNull Canvas canvas) {
+ boolean isRtl = getLayoutDirection() == LayoutDirection.RTL;
+ if (isRtl) {
+ canvas.save();
+ // Mirror the drawable
+ canvas.translate(canvas.getWidth(), 0);
+ canvas.scale(-1.0f, 1.0f);
+ }
mFullPath.reset();
mFullPath.setFillType(FillType.WINDING);
float width = getBounds().width();
@@ -250,6 +258,9 @@
}
canvas.drawPath(mXPath, mForegroundPaint);
}
+ if (isRtl) {
+ canvas.restore();
+ }
}
private void drawDot(Path fullPath, Path foregroundPath, float x, float y, float dotSize,
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java
index d798fbf..4e28e90 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java
@@ -759,6 +759,7 @@
mBatteryController = Dependency.get(BatteryController.class);
mAssistManager = Dependency.get(AssistManager.class);
mDeviceProvisionedController = Dependency.get(DeviceProvisionedController.class);
+ mSystemServicesProxy = SystemServicesProxy.getInstance(mContext);
mWindowManager = (WindowManager)mContext.getSystemService(Context.WINDOW_SERVICE);
mDisplay = mWindowManager.getDefaultDisplay();
@@ -1612,9 +1613,16 @@
@Override
public void onAsyncInflationFinished(Entry entry) {
mPendingNotifications.remove(entry.key);
- if (mNotificationData.get(entry.key) == null) {
+ // If there was an async task started after the removal, we don't want to add it back to
+ // the list, otherwise we might get leaks.
+ boolean isNew = mNotificationData.get(entry.key) == null;
+ if (isNew && !entry.row.isRemoved()) {
addEntry(entry);
+ } else if (!isNew && entry.row.hasLowPriorityStateUpdated()) {
+ mVisualStabilityManager.onLowPriorityUpdated(entry);
+ updateNotificationShade();
}
+ entry.row.setLowPriorityStateUpdated(false);
}
private boolean shouldSuppressFullScreenIntent(String key) {
@@ -1762,10 +1770,10 @@
continue;
}
toRemove.add(row);
- toRemove.get(i).setKeepInParent(true);
+ row.setKeepInParent(true);
// we need to set this state earlier as otherwise we might generate some weird
// animations
- toRemove.get(i).setRemoved();
+ row.setRemoved();
}
}
}
@@ -1818,23 +1826,20 @@
// temporarily become children if they were isolated before.
continue;
}
- int vis = ent.notification.getNotification().visibility;
int userId = ent.notification.getUserId();
// Display public version of the notification if we need to redact.
- boolean deviceSensitive = (isLockscreenPublicMode(mCurrentUserId)
- && !userAllowsPrivateNotificationsInPublic(mCurrentUserId));
- boolean userSensitive = deviceSensitive || (isLockscreenPublicMode(userId)
- && !userAllowsPrivateNotificationsInPublic(userId));
- boolean sensitiveNote = vis == Notification.VISIBILITY_PRIVATE;
- boolean sensitivePackage = packageHasVisibilityOverride(ent.notification.getKey());
- boolean sensitive = (sensitiveNote && userSensitive) || sensitivePackage;
- boolean showingPublic = sensitive && isLockscreenPublicMode(userId);
- if (showingPublic) {
+ boolean devicePublic = isLockscreenPublicMode(mCurrentUserId);
+ boolean userPublic = devicePublic || isLockscreenPublicMode(userId);
+ boolean needsRedaction = needsRedaction(ent);
+ boolean sensitive = userPublic && needsRedaction;
+ boolean deviceSensitive = devicePublic
+ && !userAllowsPrivateNotificationsInPublic(mCurrentUserId);
+ if (sensitive) {
updatePublicContentView(ent, ent.notification);
}
ent.row.setSensitive(sensitive, deviceSensitive);
- ent.row.setNeedsRedaction(needsRedaction(ent));
+ ent.row.setNeedsRedaction(needsRedaction);
if (mGroupManager.isChildInGroupWithSummary(ent.row.getStatusBarNotification())) {
ExpandableNotificationRow summary = mGroupManager.getGroupSummary(
ent.row.getStatusBarNotification());
@@ -2876,6 +2881,15 @@
mHandler.post(mAnimateCollapsePanels);
}
+ public void postAnimateForceCollapsePanels() {
+ mHandler.post(new Runnable() {
+ @Override
+ public void run() {
+ animateCollapsePanels(CommandQueue.FLAG_EXCLUDE_NONE, true /* force */);
+ }
+ });
+ }
+
public void postAnimateOpenPanels() {
mHandler.sendEmptyMessage(MSG_OPEN_SETTINGS_PANEL);
}
@@ -4138,6 +4152,7 @@
* fading.
*/
public void fadeKeyguardWhilePulsing() {
+ mNotificationPanel.notifyStartFading();
mNotificationPanel.animate()
.alpha(0f)
.setStartDelay(0)
@@ -4303,7 +4318,12 @@
final int userId = mCurrentProfiles.valueAt(i).id;
boolean isProfilePublic = devicePublic;
if (!devicePublic && userId != mCurrentUserId) {
- if (mStatusBarKeyguardViewManager.isSecure(userId)) {
+ // We can't rely on KeyguardManager#isDeviceLocked() for unified profile challenge
+ // due to a race condition where this code could be called before
+ // TrustManagerService updates its internal records, resulting in an incorrect
+ // state being cached in mLockscreenPublicMode. (b/35951989)
+ if (mLockPatternUtils.isSeparateProfileChallengeEnabled(userId)
+ && mStatusBarKeyguardViewManager.isSecure(userId)) {
isProfilePublic = mKeyguardManager.isDeviceLocked(userId);
}
}
@@ -4356,12 +4376,7 @@
mKeyguardIndicationController.setDozing(mDozing);
mNotificationPanel.setDark(mDozing, animate);
updateQsExpansionEnabled();
-
- // Immediately abort the dozing from the doze scrim controller in case of wake-and-unlock
- // for pulsing so the Keyguard fade-out animation scrim can take over.
- mDozeScrimController.setDozing(mDozing &&
- mFingerprintUnlockController.getMode()
- != FingerprintUnlockController.MODE_WAKE_AND_UNLOCK_PULSING, animate);
+ mDozeScrimController.setDozing(mDozing, animate);
updateRowStates();
Trace.endSection();
}
@@ -4925,7 +4940,6 @@
where.getLocationInWindow(mTmpInt2);
mWakeUpTouchLocation = new PointF(mTmpInt2[0] + where.getWidth() / 2,
mTmpInt2[1] + where.getHeight() / 2);
- mNotificationPanel.setTouchDisabled(false);
mStatusBarKeyguardViewManager.notifyDeviceWakeUpRequested();
mFalsingManager.onScreenOnFromTouch();
}
@@ -5180,6 +5194,7 @@
protected KeyguardManager mKeyguardManager;
private LockPatternUtils mLockPatternUtils;
private DeviceProvisionedController mDeviceProvisionedController;
+ protected SystemServicesProxy mSystemServicesProxy;
// UI-specific methods
@@ -6237,7 +6252,10 @@
StatusBarNotification sbn, ExpandableNotificationRow row) {
row.setNeedsRedaction(needsRedaction(entry));
boolean isLowPriority = mNotificationData.isAmbient(sbn.getKey());
+ boolean isUpdate = mNotificationData.get(entry.key) != null;
+ boolean wasLowPriority = row.isLowPriority();
row.setIsLowPriority(isLowPriority);
+ row.setLowPriorityStateUpdated(isUpdate && (wasLowPriority != isLowPriority));
// bind the click event to the content area
mNotificationClicker.register(row, sbn);
@@ -6801,6 +6819,7 @@
protected boolean shouldPeek(Entry entry, StatusBarNotification sbn) {
if (!mUseHeadsUp || isDeviceInVrMode()) {
+ if (DEBUG) Log.d(TAG, "No peeking: no huns or vr mode");
return false;
}
@@ -6809,8 +6828,7 @@
return false;
}
- boolean inUse = mPowerManager.isScreenOn()
- && !SystemServicesProxy.getInstance(mContext).isDreaming();
+ boolean inUse = mPowerManager.isScreenOn() && !mSystemServicesProxy.isDreaming();
if (!inUse && !isDozing()) {
if (DEBUG) {
@@ -6853,6 +6871,12 @@
}
}
+ // Don't peek notifications that are suppressed due to group alert behavior
+ if (sbn.isGroup() && sbn.getNotification().suppressAlertingDueToGrouping()) {
+ if (DEBUG) Log.d(TAG, "No peeking: suppressed due to group alert behavior");
+ return false;
+ }
+
return true;
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarKeyguardViewManager.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarKeyguardViewManager.java
index 2a69c1e..bb302bb 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarKeyguardViewManager.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarKeyguardViewManager.java
@@ -29,6 +29,7 @@
import com.android.internal.widget.LockPatternUtils;
import com.android.keyguard.KeyguardUpdateMonitor;
+import com.android.keyguard.KeyguardUpdateMonitorCallback;
import com.android.keyguard.ViewMediatorCallback;
import com.android.systemui.DejankUtils;
import com.android.keyguard.LatencyTracker;
@@ -97,12 +98,26 @@
private boolean mDeviceWillWakeUp;
private boolean mDeferScrimFadeOut;
+ private final KeyguardUpdateMonitorCallback mUpdateMonitorCallback =
+ new KeyguardUpdateMonitorCallback() {
+ @Override
+ public void onEmergencyCallAction() {
+
+ // Since we won't get a setOccluded call we have to reset the view manually such that
+ // the bouncer goes away.
+ if (mOccluded) {
+ reset(false /* hideBouncerWhenShowing */);
+ }
+ }
+ };
+
public StatusBarKeyguardViewManager(Context context, ViewMediatorCallback callback,
LockPatternUtils lockPatternUtils) {
mContext = context;
mViewMediatorCallback = callback;
mLockPatternUtils = lockPatternUtils;
mStatusBarWindowManager = Dependency.get(StatusBarWindowManager.class);
+ KeyguardUpdateMonitor.getInstance(context).registerCallback(mUpdateMonitorCallback);
}
public void registerStatusBar(StatusBar statusBar,
@@ -381,6 +396,7 @@
} else {
mScrimController.animateGoingToFullShade(delay, fadeoutDuration);
mStatusBar.finishKeyguardFadingAway();
+ mFingerprintUnlockController.finishKeyguardFadingAway();
}
}
mStatusBarWindowManager.setKeyguardShowing(false);
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarWindowView.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarWindowView.java
index 26e007c..236e008 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarWindowView.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarWindowView.java
@@ -277,7 +277,7 @@
@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {
- if (mService.isDozing() && !mService.isPulsing()) {
+ if (mService.isDozing() && !mStackScrollLayout.hasPulsingNotifications()) {
// Capture all touch events in always-on.
return true;
}
@@ -407,8 +407,9 @@
mFloatingActionMode.finish();
}
cleanupFloatingActionModeViews();
+ mFloatingToolbar = new FloatingToolbar(mContext, mFakeWindow);
final FloatingActionMode mode =
- new FloatingActionMode(mContext, callback, originatingView);
+ new FloatingActionMode(mContext, callback, originatingView, mFloatingToolbar);
mFloatingActionModeOriginatingView = originatingView;
mFloatingToolbarPreDrawListener =
new ViewTreeObserver.OnPreDrawListener() {
@@ -423,8 +424,6 @@
private void setHandledFloatingActionMode(ActionMode mode) {
mFloatingActionMode = mode;
- mFloatingToolbar = new FloatingToolbar(mContext, mFakeWindow);
- ((FloatingActionMode) mFloatingActionMode).setFloatingToolbar(mFloatingToolbar);
mFloatingActionMode.invalidate(); // Will show the floating toolbar if necessary.
mFloatingActionModeOriginatingView.getViewTreeObserver()
.addOnPreDrawListener(mFloatingToolbarPreDrawListener);
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/ExtensionController.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/ExtensionController.java
index eaf8925..78e0028 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/ExtensionController.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/ExtensionController.java
@@ -14,9 +14,6 @@
package com.android.systemui.statusbar.policy;
-import com.android.systemui.Dependency;
-import com.android.systemui.plugins.Plugin;
-
import java.util.Map;
import java.util.function.Consumer;
import java.util.function.Supplier;
@@ -32,6 +29,11 @@
interface Extension<T> {
T get();
void destroy();
+ /**
+ * Triggers the extension to cycle through each of the sources again because something
+ * (like configuration) may have changed.
+ */
+ T reload();
}
interface ExtensionBuilder<T> {
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/ExtensionControllerImpl.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/ExtensionControllerImpl.java
index fefbaa3..cfc1d56 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/ExtensionControllerImpl.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/ExtensionControllerImpl.java
@@ -126,6 +126,12 @@
}
}
+ @Override
+ public T reload() {
+ notifyChanged();
+ return get();
+ }
+
private void notifyChanged() {
for (int i = 0; i < mProducers.size(); i++) {
final T item = mProducers.get(i).get();
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/KeyButtonRipple.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/KeyButtonRipple.java
index 8e51ddb..cc7943b 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/KeyButtonRipple.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/KeyButtonRipple.java
@@ -194,6 +194,11 @@
return true;
}
+ @Override
+ public boolean hasFocusStateSpecified() {
+ return true;
+ }
+
public void setPressed(boolean pressed) {
if (mDark != mLastDark && pressed) {
mRipplePaint = null;
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/MobileSignalController.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/MobileSignalController.java
index 67b5596..03a50a2 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/MobileSignalController.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/MobileSignalController.java
@@ -253,11 +253,6 @@
}
@Override
- public int getQsCurrentIconId() {
- return getCurrentIconId();
- }
-
- @Override
public void notifyListeners(SignalCallback callback) {
MobileIconGroup icons = getIcons();
@@ -276,9 +271,9 @@
String description = null;
// Only send data sim callbacks to QS.
if (mCurrentState.dataSim) {
- qsTypeIcon = showDataIcon ? icons.mQsDataType : 0;
+ qsTypeIcon = showDataIcon ? icons.mDataType : 0;
qsIcon = new IconState(mCurrentState.enabled
- && !mCurrentState.isEmergency, getQsCurrentIconId(), contentDescription);
+ && !mCurrentState.isEmergency, getCurrentIconId(), contentDescription);
description = mCurrentState.isEmergency ? null : mCurrentState.networkName;
}
boolean activityIn = mCurrentState.dataConnected
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/TelephonyIcons.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/TelephonyIcons.java
index aaa0568..d91ae39 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/TelephonyIcons.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/TelephonyIcons.java
@@ -22,16 +22,6 @@
class TelephonyIcons {
//***** Data connection icons
- static final int QS_DATA_G = R.drawable.ic_qs_signal_g;
- static final int QS_DATA_3G = R.drawable.ic_qs_signal_3g;
- static final int QS_DATA_E = R.drawable.ic_qs_signal_e;
- static final int QS_DATA_H = R.drawable.ic_qs_signal_h;
- static final int QS_DATA_1X = R.drawable.ic_qs_signal_1x;
- static final int QS_DATA_4G = R.drawable.ic_qs_signal_4g;
- static final int QS_DATA_4G_PLUS = R.drawable.ic_qs_signal_4g_plus;
- static final int QS_DATA_LTE = R.drawable.ic_qs_signal_lte;
- static final int QS_DATA_LTE_PLUS = R.drawable.ic_qs_signal_lte_plus;
-
static final int FLIGHT_MODE_ICON = R.drawable.stat_sys_airplane_mode;
static final int ICON_LTE = R.drawable.stat_sys_data_fully_connected_lte;
@@ -46,8 +36,6 @@
static final int ICON_DATA_DISABLED = R.drawable.stat_sys_data_disabled;
- static final int QS_ICON_DATA_DISABLED = R.drawable.ic_qs_data_disabled;
-
static final MobileIconGroup CARRIER_NETWORK_CHANGE = new MobileIconGroup(
"CARRIER_NETWORK_CHANGE",
null,
@@ -75,7 +63,7 @@
R.string.accessibility_data_connection_3g,
TelephonyIcons.ICON_3G,
true,
- TelephonyIcons.QS_DATA_3G
+ TelephonyIcons.ICON_3G
);
static final MobileIconGroup WFC = new MobileIconGroup(
@@ -114,7 +102,7 @@
R.string.accessibility_data_connection_edge,
TelephonyIcons.ICON_E,
false,
- TelephonyIcons.QS_DATA_E
+ TelephonyIcons.ICON_E
);
static final MobileIconGroup ONE_X = new MobileIconGroup(
@@ -129,7 +117,7 @@
R.string.accessibility_data_connection_cdma,
TelephonyIcons.ICON_1X,
true,
- TelephonyIcons.QS_DATA_1X
+ TelephonyIcons.ICON_1X
);
static final MobileIconGroup G = new MobileIconGroup(
@@ -144,7 +132,7 @@
R.string.accessibility_data_connection_gprs,
TelephonyIcons.ICON_G,
false,
- TelephonyIcons.QS_DATA_G
+ TelephonyIcons.ICON_G
);
static final MobileIconGroup H = new MobileIconGroup(
@@ -159,7 +147,7 @@
R.string.accessibility_data_connection_3_5g,
TelephonyIcons.ICON_H,
false,
- TelephonyIcons.QS_DATA_H
+ TelephonyIcons.ICON_H
);
static final MobileIconGroup FOUR_G = new MobileIconGroup(
@@ -174,7 +162,7 @@
R.string.accessibility_data_connection_4g,
TelephonyIcons.ICON_4G,
true,
- TelephonyIcons.QS_DATA_4G
+ TelephonyIcons.ICON_4G
);
static final MobileIconGroup FOUR_G_PLUS = new MobileIconGroup(
@@ -189,7 +177,7 @@
R.string.accessibility_data_connection_4g_plus,
TelephonyIcons.ICON_4G_PLUS,
true,
- TelephonyIcons.QS_DATA_4G_PLUS
+ TelephonyIcons.ICON_4G_PLUS
);
static final MobileIconGroup LTE = new MobileIconGroup(
@@ -204,7 +192,7 @@
R.string.accessibility_data_connection_lte,
TelephonyIcons.ICON_LTE,
true,
- TelephonyIcons.QS_DATA_LTE
+ TelephonyIcons.ICON_LTE
);
static final MobileIconGroup LTE_PLUS = new MobileIconGroup(
@@ -219,7 +207,7 @@
R.string.accessibility_data_connection_lte_plus,
TelephonyIcons.ICON_LTE_PLUS,
true,
- TelephonyIcons.QS_DATA_LTE_PLUS
+ TelephonyIcons.ICON_LTE_PLUS
);
static final MobileIconGroup DATA_DISABLED = new MobileIconGroup(
@@ -234,7 +222,7 @@
R.string.accessibility_cell_data_off,
TelephonyIcons.ICON_DATA_DISABLED,
false,
- TelephonyIcons.QS_ICON_DATA_DISABLED
+ TelephonyIcons.ICON_DATA_DISABLED
);
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/UserSwitcherController.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/UserSwitcherController.java
index e1acc9b..e0f4429 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/UserSwitcherController.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/UserSwitcherController.java
@@ -18,6 +18,7 @@
import static com.android.settingslib.RestrictedLockUtils.EnforcedAdmin;
+import android.R.attr;
import android.app.ActivityManager;
import android.app.Dialog;
import android.app.Notification;
@@ -31,6 +32,7 @@
import android.content.pm.UserInfo;
import android.database.ContentObserver;
import android.graphics.Bitmap;
+import android.graphics.PorterDuff.Mode;
import android.graphics.drawable.Drawable;
import android.os.AsyncTask;
import android.os.Handler;
@@ -52,6 +54,7 @@
import com.android.internal.messages.nano.SystemMessageProto.SystemMessage;
import com.android.internal.util.UserIcons;
import com.android.settingslib.RestrictedLockUtils;
+import com.android.settingslib.Utils;
import com.android.systemui.Dependency;
import com.android.systemui.GuestResumeSessionReceiver;
import com.android.systemui.R;
@@ -739,7 +742,12 @@
if (item.isAddUser) {
return context.getDrawable(R.drawable.ic_add_circle_qs);
}
- return UserIcons.getDefaultUserIcon(item.resolveId(), /* light= */ true);
+ Drawable icon = UserIcons.getDefaultUserIcon(item.resolveId(), /* light= */ false);
+ if (item.isGuest) {
+ icon.setColorFilter(Utils.getColorAttr(context, android.R.attr.colorForeground),
+ Mode.SRC_IN);
+ }
+ return icon;
}
public void refresh() {
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/ZenModeControllerImpl.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/ZenModeControllerImpl.java
index e80d3b3..0fd2445 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/ZenModeControllerImpl.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/ZenModeControllerImpl.java
@@ -36,11 +36,13 @@
import android.service.notification.IConditionListener;
import android.service.notification.ZenModeConfig;
import android.service.notification.ZenModeConfig.ZenRule;
+import android.support.annotation.VisibleForTesting;
import android.util.Log;
import android.util.Slog;
import com.android.systemui.qs.GlobalSetting;
import com.android.systemui.settings.CurrentUserTracker;
+import com.android.systemui.util.Utils;
import java.util.ArrayList;
import java.util.LinkedHashMap;
@@ -169,45 +171,32 @@
}
private void fireNextAlarmChanged() {
- for (Callback cb : mCallbacks) {
- cb.onNextAlarmChanged();
- }
+ Utils.safeForeach(mCallbacks, c -> c.onNextAlarmChanged());
}
private void fireEffectsSuppressorChanged() {
- for (Callback cb : mCallbacks) {
- cb.onEffectsSupressorChanged();
- }
+ Utils.safeForeach(mCallbacks, c -> c.onEffectsSupressorChanged());
}
private void fireZenChanged(int zen) {
- for (Callback cb : mCallbacks) {
- cb.onZenChanged(zen);
- }
+ Utils.safeForeach(mCallbacks, c -> c.onZenChanged(zen));
}
private void fireZenAvailableChanged(boolean available) {
- for (Callback cb : mCallbacks) {
- cb.onZenAvailableChanged(available);
- }
+ Utils.safeForeach(mCallbacks, c -> c.onZenAvailableChanged(available));
}
private void fireConditionsChanged(Condition[] conditions) {
- for (Callback cb : mCallbacks) {
- cb.onConditionsChanged(conditions);
- }
+ Utils.safeForeach(mCallbacks, c -> c.onConditionsChanged(conditions));
}
private void fireManualRuleChanged(ZenRule rule) {
- for (Callback cb : mCallbacks) {
- cb.onManualRuleChanged(rule);
- }
+ Utils.safeForeach(mCallbacks, c -> c.onManualRuleChanged(rule));
}
- private void fireConfigChanged(ZenModeConfig config) {
- for (Callback cb : mCallbacks) {
- cb.onConfigChanged(config);
- }
+ @VisibleForTesting
+ protected void fireConfigChanged(ZenModeConfig config) {
+ Utils.safeForeach(mCallbacks, c -> c.onConfigChanged(config));
}
private void updateConditions(Condition[] conditions) {
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/stack/AmbientState.java b/packages/SystemUI/src/com/android/systemui/statusbar/stack/AmbientState.java
index e409b9c..41ef781 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/stack/AmbientState.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/stack/AmbientState.java
@@ -59,7 +59,7 @@
private boolean mPanelTracking;
private boolean mExpansionChanging;
private boolean mPanelFullWidth;
- private boolean mPulsing;
+ private boolean mHasPulsingNotifications;
private boolean mUnlockHintRunning;
public AmbientState(Context context) {
@@ -287,12 +287,12 @@
mPanelTracking = panelTracking;
}
- public boolean isPulsing() {
- return mPulsing;
+ public boolean hasPulsingNotifications() {
+ return mHasPulsingNotifications;
}
- public void setPulsing(boolean pulsing) {
- mPulsing = pulsing;
+ public void setHasPulsingNotifications(boolean hasPulsing) {
+ mHasPulsingNotifications = hasPulsing;
}
public boolean isPanelTracking() {
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/stack/NotificationChildrenContainer.java b/packages/SystemUI/src/com/android/systemui/statusbar/stack/NotificationChildrenContainer.java
index cb1f44e..ff06b5b 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/stack/NotificationChildrenContainer.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/stack/NotificationChildrenContainer.java
@@ -29,6 +29,7 @@
import android.widget.RemoteViews;
import android.widget.TextView;
+import com.android.internal.annotations.VisibleForTesting;
import com.android.systemui.R;
import com.android.systemui.statusbar.CrossFadeHelper;
import com.android.systemui.statusbar.ExpandableNotificationRow;
@@ -299,7 +300,7 @@
mNotificationHeaderWrapper.notifyContentUpdated(mContainingNotification);
recreateLowPriorityHeader(builder);
recreateAmbientHeader(builder);
- resetHeaderVisibilityIfNeeded(mNotificationHeader, calculateDesiredHeader());
+ updateHeaderVisibility(false /* animate */);
updateChildrenHeaderAppearance();
}
@@ -535,8 +536,8 @@
firstOverflowIndex = getMaxAllowedVisibleChildren(true /* likeCollapsed */);
}
- boolean childrenExpanded = !mContainingNotification.isGroupExpansionChanging()
- && mChildrenExpanded;
+ boolean childrenExpandedAndNotAnimating = mChildrenExpanded
+ && !mContainingNotification.isGroupExpansionChanging();
for (int i = 0; i < childCount; i++) {
ExpandableNotificationRow child = mChildren.get(i);
if (!firstChild) {
@@ -544,7 +545,7 @@
yPosition += NotificationUtils.interpolate(mChildPadding, mDividerHeight,
expandFactor);
} else {
- yPosition += childrenExpanded ? mDividerHeight : mChildPadding;
+ yPosition += mChildrenExpanded ? mDividerHeight : mChildPadding;
}
} else {
if (expandingToExpandedGroup) {
@@ -553,7 +554,7 @@
mNotificatonTopPadding + mDividerHeight,
expandFactor);
} else {
- yPosition += childrenExpanded ? mNotificatonTopPadding + mDividerHeight : 0;
+ yPosition += mChildrenExpanded ? mNotificatonTopPadding + mDividerHeight : 0;
}
firstChild = false;
}
@@ -565,7 +566,7 @@
childState.hidden = false;
// When the group is expanded, the children cast the shadows rather than the parent
// so use the parent's elevation here.
- childState.zTranslation = childrenExpanded
+ childState.zTranslation = childrenExpandedAndNotAnimating
? mContainingNotification.getTranslationZ()
: 0;
childState.dimmed = parentState.dimmed;
@@ -619,7 +620,7 @@
mHeaderViewState = new ViewState();
}
mHeaderViewState.initFrom(mNotificationHeader);
- mHeaderViewState.zTranslation = childrenExpanded
+ mHeaderViewState.zTranslation = childrenExpandedAndNotAnimating
? mContainingNotification.getTranslationZ()
: 0;
}
@@ -832,6 +833,11 @@
return mNotificationHeaderLowPriority;
}
+ @VisibleForTesting
+ public ViewGroup getCurrentHeaderView() {
+ return mCurrentHeader;
+ }
+
public void notifyShowAmbientChanged() {
updateHeaderVisibility(false);
}
@@ -868,7 +874,12 @@
desiredHeader.setVisibility(VISIBLE);
}
if (currentHeader != null) {
- getWrapperForView(currentHeader).setVisible(false);
+ // Wrapper can be null if we were a low priority notification
+ // and just destroyed it by calling setIsLowPriority(false)
+ NotificationViewWrapper wrapper = getWrapperForView(currentHeader);
+ if (wrapper != null) {
+ wrapper.setVisible(false);
+ }
currentHeader.setVisibility(INVISIBLE);
}
}
@@ -877,7 +888,7 @@
resetHeaderVisibilityIfNeeded(mNotificationHeaderAmbient, desiredHeader);
resetHeaderVisibilityIfNeeded(mNotificationHeaderLowPriority, desiredHeader);
- mCurrentHeader = currentHeader;
+ mCurrentHeader = desiredHeader;
}
private void resetHeaderVisibilityIfNeeded(View header, View desiredHeader) {
@@ -1223,4 +1234,9 @@
}
return getGroupExpandFraction();
}
+
+ @VisibleForTesting
+ public boolean isUserLocked() {
+ return mUserLocked;
+ }
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/stack/NotificationStackScrollLayout.java b/packages/SystemUI/src/com/android/systemui/statusbar/stack/NotificationStackScrollLayout.java
index 61fed2d..3cc3604 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/stack/NotificationStackScrollLayout.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/stack/NotificationStackScrollLayout.java
@@ -53,7 +53,6 @@
import android.view.WindowInsets;
import android.view.accessibility.AccessibilityEvent;
import android.view.accessibility.AccessibilityNodeInfo;
-import android.view.animation.Animation;
import android.view.animation.AnimationUtils;
import android.view.animation.Interpolator;
import android.widget.OverScroller;
@@ -120,7 +119,7 @@
private boolean mSwipingInProgress;
private int mCurrentStackHeight = Integer.MAX_VALUE;
private final Paint mBackgroundPaint = new Paint();
- private boolean mShouldDrawNotificationBackground;
+ private final boolean mShouldDrawNotificationBackground;
private float mExpandedHeight;
private int mOwnScrollY;
@@ -451,7 +450,8 @@
}
protected void onDraw(Canvas canvas) {
- if (mShouldDrawNotificationBackground && mCurrentBounds.top < mCurrentBounds.bottom) {
+ if (mShouldDrawNotificationBackground && !mAmbientState.isDark()
+ && mCurrentBounds.top < mCurrentBounds.bottom) {
canvas.drawRect(0, mCurrentBounds.top, getWidth(), mCurrentBounds.bottom,
mBackgroundPaint);
}
@@ -815,7 +815,8 @@
*/
private float getAppearEndPosition() {
int appearPosition;
- if (mEmptyShadeView.getVisibility() == GONE) {
+ int notGoneChildCount = getNotGoneChildCount();
+ if (mEmptyShadeView.getVisibility() == GONE && notGoneChildCount != 0) {
int minNotificationsForShelf = 1;
if (mTrackingHeadsUp || mHeadsUpManager.hasPinnedHeadsUp()) {
appearPosition = mHeadsUpManager.getTopHeadsUpPinnedHeight();
@@ -823,7 +824,7 @@
} else {
appearPosition = 0;
}
- if (getNotGoneChildCount() >= minNotificationsForShelf) {
+ if (notGoneChildCount >= minNotificationsForShelf) {
appearPosition += mShelf.getIntrinsicHeight();
}
} else {
@@ -1940,7 +1941,7 @@
int numShownItems = 0;
boolean finish = false;
int maxDisplayedNotifications = mAmbientState.isDark()
- ? (isPulsing() ? 1 : 0)
+ ? (hasPulsingNotifications() ? 1 : 0)
: mMaxDisplayedNotifications;
for (int i = 0; i < getChildCount(); i++) {
@@ -1949,7 +1950,8 @@
&& !expandableView.hasNoContentHeight()) {
boolean limitReached = maxDisplayedNotifications != -1
&& numShownItems >= maxDisplayedNotifications;
- boolean notificationOnAmbientThatIsNotPulsing = isPulsing()
+ boolean notificationOnAmbientThatIsNotPulsing = mAmbientState.isDark()
+ && hasPulsingNotifications()
&& expandableView instanceof ExpandableNotificationRow
&& !isPulsing(((ExpandableNotificationRow) expandableView).getEntry());
if (limitReached || notificationOnAmbientThatIsNotPulsing) {
@@ -2007,7 +2009,7 @@
return false;
}
- private boolean isPulsing() {
+ public boolean hasPulsingNotifications() {
return mPulsing != null;
}
@@ -2219,14 +2221,15 @@
ActivatableNotificationView firstView = mFirstVisibleBackgroundChild;
int top = 0;
if (firstView != null) {
- int finalTranslationY = (int) ViewState.getFinalTranslationY(firstView);
+ // Round Y up to avoid seeing the background during animation
+ int finalTranslationY = (int) Math.ceil(ViewState.getFinalTranslationY(firstView));
if (mAnimateNextBackgroundTop
|| mTopAnimator == null && mCurrentBounds.top == finalTranslationY
|| mTopAnimator != null && mEndAnimationRect.top == finalTranslationY) {
// we're ending up at the same location as we are now, lets just skip the animation
top = finalTranslationY;
} else {
- top = (int) firstView.getTranslationY();
+ top = (int) Math.ceil(firstView.getTranslationY());
}
}
ActivatableNotificationView lastView = mShelf.hasItemsInStableShelf()
@@ -2836,7 +2839,7 @@
}
private void updateNotificationAnimationStates() {
- boolean running = mAnimationsEnabled || isPulsing();
+ boolean running = mAnimationsEnabled || hasPulsingNotifications();
mShelf.setAnimationsEnabled(running);
int childCount = getChildCount();
for (int i = 0; i < childCount; i++) {
@@ -2847,7 +2850,7 @@
}
private void updateAnimationState(View child) {
- updateAnimationState((mAnimationsEnabled || isPulsing())
+ updateAnimationState((mAnimationsEnabled || hasPulsingNotifications())
&& (mIsExpanded || isPinnedHeadsUp(child)), child);
}
@@ -3688,11 +3691,8 @@
* {@link #mAmbientState}'s dark mode is toggled.
*/
private void updateWillNotDraw() {
- if (mAmbientState.isDark()) {
- setWillNotDraw(!DEBUG);
- } else {
- setWillNotDraw(!mShouldDrawNotificationBackground && !DEBUG);
- }
+ boolean willDraw = !mAmbientState.isDark() && mShouldDrawNotificationBackground || DEBUG;
+ setWillNotDraw(!willDraw);
}
private void setBackgroundFadeAmount(float fadeAmount) {
@@ -4119,7 +4119,7 @@
return;
}
mPulsing = pulsing;
- mAmbientState.setPulsing(isPulsing());
+ mAmbientState.setHasPulsingNotifications(hasPulsingNotifications());
updateNotificationAnimationStates();
updateContentHeight();
notifyHeightChangeListener(mShelf);
@@ -4355,6 +4355,10 @@
mStatusBar.setNotificationSnoozed(sbn, snoozeOption);
}
+ public boolean isFalseGesture(MotionEvent ev) {
+ return super.isFalseGesture(ev);
+ }
+
private void handleMenuCoveredOrDismissed() {
if (mMenuExposedView != null && mMenuExposedView == mTranslatingParentView) {
mMenuExposedView = null;
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/stack/StackScrollAlgorithm.java b/packages/SystemUI/src/com/android/systemui/statusbar/stack/StackScrollAlgorithm.java
index b5db78d..5c10e7e 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/stack/StackScrollAlgorithm.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/stack/StackScrollAlgorithm.java
@@ -410,9 +410,10 @@
if (mIsExpanded) {
// Ensure that the heads up is always visible even when scrolled off
clampHunToTop(ambientState, row, childState);
- if (i == 0) {
+ if (i == 0 && row.isAboveShelf()) {
// the first hun can't get off screen.
clampHunToMaxTranslation(ambientState, row, childState);
+ childState.hidden = false;
}
}
if (row.isPinned()) {
@@ -447,10 +448,14 @@
private void clampHunToMaxTranslation(AmbientState ambientState, ExpandableNotificationRow row,
ExpandableViewState childState) {
float newTranslation;
- float bottomPosition = ambientState.getMaxHeadsUpTranslation() - row.getCollapsedHeight();
+ float maxHeadsUpTranslation = ambientState.getMaxHeadsUpTranslation();
+ float maxShelfPosition = ambientState.getInnerHeight() + ambientState.getTopPadding()
+ + ambientState.getStackTranslation();
+ maxHeadsUpTranslation = Math.min(maxHeadsUpTranslation, maxShelfPosition);
+ float bottomPosition = maxHeadsUpTranslation - row.getCollapsedHeight();
newTranslation = Math.min(childState.yTranslation, bottomPosition);
- childState.height = (int) Math.max(childState.height
- - (childState.yTranslation - newTranslation), row.getCollapsedHeight());
+ childState.height = (int) Math.min(childState.height, maxHeadsUpTranslation
+ - newTranslation);
childState.yTranslation = newTranslation;
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/stack/ViewState.java b/packages/SystemUI/src/com/android/systemui/statusbar/stack/ViewState.java
index d664b12..27b730cd 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/stack/ViewState.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/stack/ViewState.java
@@ -657,6 +657,22 @@
}
}
+ /**
+ * Get the end value of the zTranslation animation running on a view or the zTranslation
+ * if no animation is running.
+ */
+ public static float getFinalTranslationZ(View view) {
+ if (view == null) {
+ return 0;
+ }
+ ValueAnimator zAnimator = getChildTag(view, TAG_ANIMATOR_TRANSLATION_Z);
+ if (zAnimator == null) {
+ return view.getTranslationZ();
+ } else {
+ return getChildTag(view, TAG_END_TRANSLATION_Z);
+ }
+ }
+
public static boolean isAnimatingY(View child) {
return getChildTag(child, TAG_ANIMATOR_TRANSLATION_Y) != null;
}
diff --git a/packages/SystemUI/src/com/android/systemui/util/Utils.java b/packages/SystemUI/src/com/android/systemui/util/Utils.java
new file mode 100644
index 0000000..f4aebae
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/util/Utils.java
@@ -0,0 +1,31 @@
+/*
+ * Copyright (C) 2017 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.systemui.util;
+
+import java.util.List;
+import java.util.function.Consumer;
+
+public class Utils {
+
+ /**
+ * Allows lambda iteration over a list. It is done in reverse order so it is safe
+ * to add or remove items during the iteration.
+ */
+ public static <T> void safeForeach(List<T> list, Consumer<T> c) {
+ for (int i = list.size() - 1; i >= 0; i--) {
+ c.accept(list.get(i));
+ }
+ }
+}
diff --git a/packages/SystemUI/src/com/android/systemui/volume/VolumeDialogComponent.java b/packages/SystemUI/src/com/android/systemui/volume/VolumeDialogComponent.java
index 2f9bcff..e86a34a 100644
--- a/packages/SystemUI/src/com/android/systemui/volume/VolumeDialogComponent.java
+++ b/packages/SystemUI/src/com/android/systemui/volume/VolumeDialogComponent.java
@@ -18,26 +18,25 @@
import android.content.Context;
import android.content.Intent;
+import android.content.pm.ActivityInfo;
import android.content.res.Configuration;
import android.media.AudioManager;
import android.media.VolumePolicy;
import android.os.Bundle;
import android.os.Handler;
-import android.view.WindowManager;
import android.view.WindowManager.LayoutParams;
+import com.android.settingslib.applications.InterestingConfigChanges;
import com.android.systemui.plugins.ActivityStarter;
import com.android.systemui.Dependency;
import com.android.systemui.SystemUI;
import com.android.systemui.keyguard.KeyguardViewMediator;
-import com.android.systemui.plugins.PluginDependency;
import com.android.systemui.plugins.PluginDependencyProvider;
-import com.android.systemui.plugins.PluginManager;
import com.android.systemui.plugins.VolumeDialog;
import com.android.systemui.plugins.VolumeDialogController;
import com.android.systemui.qs.tiles.DndTile;
import com.android.systemui.statusbar.policy.ExtensionController;
-import com.android.systemui.statusbar.policy.ZenModeController;
+import com.android.systemui.statusbar.policy.ExtensionController.Extension;
import com.android.systemui.tuner.TunerService;
import java.io.FileDescriptor;
@@ -60,6 +59,9 @@
private final SystemUI mSysui;
private final Context mContext;
private final VolumeDialogControllerImpl mController;
+ private final InterestingConfigChanges mConfigChanges = new InterestingConfigChanges(
+ ActivityInfo.CONFIG_FONT_SCALE);
+ private final Extension mExtension;
private VolumeDialog mDialog;
private VolumePolicy mVolumePolicy = new VolumePolicy(
DEFAULT_VOLUME_DOWN_TO_ENTER_SILENT, // volumeDownToEnterSilent
@@ -76,7 +78,7 @@
// Allow plugins to reference the VolumeDialogController.
Dependency.get(PluginDependencyProvider.class)
.allowPluginDependency(VolumeDialogController.class);
- Dependency.get(ExtensionController.class).newExtension(VolumeDialog.class)
+ mExtension = Dependency.get(ExtensionController.class).newExtension(VolumeDialog.class)
.withPlugin(VolumeDialog.class)
.withDefault(this::createDefault)
.withCallback(dialog -> {
@@ -148,7 +150,9 @@
@Override
public void onConfigurationChanged(Configuration newConfig) {
- // noop
+ if (mConfigChanges.applyNewConfig(mContext.getResources())) {
+ mExtension.reload();
+ }
}
@Override
diff --git a/packages/SystemUI/src/com/android/systemui/volume/ZenModePanel.java b/packages/SystemUI/src/com/android/systemui/volume/ZenModePanel.java
index 51fcdbb..ecdea4f 100644
--- a/packages/SystemUI/src/com/android/systemui/volume/ZenModePanel.java
+++ b/packages/SystemUI/src/com/android/systemui/volume/ZenModePanel.java
@@ -57,7 +57,6 @@
import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
import com.android.systemui.Prefs;
import com.android.systemui.R;
-import com.android.systemui.R.string;
import com.android.systemui.statusbar.policy.ZenModeController;
import java.io.FileDescriptor;
@@ -294,11 +293,6 @@
private void onAttach() {
setExpanded(true);
mAttached = true;
- for (int i = 0; i < mZenRadioGroupContent.getChildCount(); i++) {
- ConditionTag tag = getConditionTagAt(i);
- if (tag != null) tag.rb.setChecked(false);
- mZenRadioGroupContent.getChildAt(i).setTag(null);
- }
mAttachedZen = mController.getZen();
ZenRule manualRule = mController.getManualRule();
mExitCondition = manualRule != null ? manualRule.condition : null;
@@ -311,6 +305,7 @@
setSessionExitCondition(copy(mExitCondition));
updateWidgets();
setRequestingConditions(!mHidden);
+ ensureSelection();
}
private void onDetach() {
@@ -366,9 +361,6 @@
if (expanded == mExpanded) return;
if (DEBUG) Log.d(mTag, "setExpanded " + expanded);
mExpanded = expanded;
- if (mExpanded) {
- ensureSelection();
- }
updateWidgets();
fireExpanded();
}
@@ -464,7 +456,8 @@
ActivityManager.getCurrentUser(), false);
return c;
}
- return null;
+ // If there is a manual rule, but it has no condition listed then it is forever.
+ return forever();
}
private void handleUpdateZen(int zen) {
@@ -491,6 +484,7 @@
final ConditionTag tag = getConditionTagAt(i);
if (tag != null && sameConditionId(tag.condition, mExitCondition)) {
bind(exitCondition, mZenRadioGroupContent.getChildAt(i), i);
+ tag.rb.setChecked(true);
return;
}
}
@@ -498,6 +492,7 @@
exitCondition.id)) {
bind(exitCondition, mZenRadioGroupContent.getChildAt(COUNTDOWN_CONDITION_INDEX),
COUNTDOWN_CONDITION_INDEX);
+ getConditionTagAt(COUNTDOWN_CONDITION_INDEX).rb.setChecked(true);
}
}
diff --git a/packages/SystemUI/tests/src/com/android/AAAPlusPlusVerifySysuiRequiredTestPropertiesTest.java b/packages/SystemUI/tests/src/com/android/AAAPlusPlusVerifySysuiRequiredTestPropertiesTest.java
new file mode 100644
index 0000000..b597868
--- /dev/null
+++ b/packages/SystemUI/tests/src/com/android/AAAPlusPlusVerifySysuiRequiredTestPropertiesTest.java
@@ -0,0 +1,128 @@
+/*
+ * Copyright (C) 2017 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;
+
+import static org.junit.Assert.assertFalse;
+
+import android.support.test.filters.LargeTest;
+import android.support.test.filters.MediumTest;
+import android.support.test.filters.SmallTest;
+import android.support.test.internal.runner.ClassPathScanner;
+import android.support.test.internal.runner.ClassPathScanner.ChainedClassNameFilter;
+import android.support.test.internal.runner.ClassPathScanner.ExternalClassNameFilter;
+import android.support.test.internal.runner.TestLoader;
+import android.testing.AndroidTestingRunner;
+import android.text.TextUtils;
+import android.util.Log;
+
+import com.android.systemui.SysuiBaseFragmentTest;
+import com.android.systemui.SysuiTestCase;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+import java.io.IOException;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.Collections;
+
+/**
+ * This is named AAAPlusPlusVerifySysuiRequiredTestPropertiesTest for two reasons.
+ * a) Its so awesome it deserves an AAA++
+ * b) It should run first to draw attention to itself.
+ *
+ * For trues though: this test verifies that all the sysui tests extend the right classes.
+ * This matters because including tests with different context implementations in the same
+ * test suite causes errors, such as the incorrect settings provider being cached.
+ * For an example, see {@link com.android.systemui.DependencyTest}.
+ */
+@RunWith(AndroidTestingRunner.class)
+@SmallTest
+public class AAAPlusPlusVerifySysuiRequiredTestPropertiesTest extends SysuiTestCase {
+
+ private static final String TAG = "AAA++VerifyTest";
+
+ private static final Class[] BASE_CLS_WHITELIST = {
+ SysuiTestCase.class,
+ SysuiBaseFragmentTest.class,
+ };
+
+ private static final Class[] SUPPORTED_SIZES = {
+ SmallTest.class,
+ MediumTest.class,
+ LargeTest.class,
+ android.test.suitebuilder.annotation.SmallTest.class,
+ android.test.suitebuilder.annotation.MediumTest.class,
+ android.test.suitebuilder.annotation.LargeTest.class,
+ };
+
+ @Test
+ public void testAllClassInheritance() {
+ boolean anyClassWrong = false;
+ TestLoader loader = new TestLoader();
+ for (String className : getClassNamesFromClassPath()) {
+ Class<?> cls = loader.loadIfTest(className);
+ if (cls == null) continue;
+
+ boolean hasParent = false;
+ for (Class<?> parent : BASE_CLS_WHITELIST) {
+ if (parent.isAssignableFrom(cls)) {
+ hasParent = true;
+ break;
+ }
+ }
+ boolean hasSize = hasSize(cls);
+ if (!hasSize) {
+ anyClassWrong = true;
+ Log.e(TAG, cls.getName() + " does not have size annotation, such as @SmallTest");
+ }
+ if (!hasParent) {
+ anyClassWrong = true;
+ Log.e(TAG, cls.getName() + " does not extend any of " + getClsStr());
+ }
+ }
+
+ assertFalse("All sysui test classes must have size and extend one of " + getClsStr(),
+ anyClassWrong);
+ }
+
+ private boolean hasSize(Class<?> cls) {
+ for (int i = 0; i < SUPPORTED_SIZES.length; i++) {
+ if (cls.getDeclaredAnnotation(SUPPORTED_SIZES[i]) != null) return true;
+ }
+ return false;
+ }
+
+ private Collection<String> getClassNamesFromClassPath() {
+ ClassPathScanner scanner = new ClassPathScanner(mContext.getPackageCodePath());
+
+ ChainedClassNameFilter filter = new ChainedClassNameFilter();
+
+ filter.add(new ExternalClassNameFilter());
+ filter.add(s -> s.startsWith("com.android.systemui")
+ || s.startsWith("com.android.keyguard"));
+ try {
+ return scanner.getClassPathEntries(filter);
+ } catch (IOException e) {
+ Log.e(TAG, "Failed to scan classes", e);
+ }
+ return Collections.emptyList();
+ }
+
+ private String getClsStr() {
+ return TextUtils.join(",", Arrays.asList(BASE_CLS_WHITELIST)
+ .stream().map(cls -> cls.getSimpleName()).toArray());
+ }
+}
diff --git a/packages/SystemUI/tests/src/com/android/keyguard/KeyguardClockAccessibilityDelegateTest.java b/packages/SystemUI/tests/src/com/android/keyguard/KeyguardClockAccessibilityDelegateTest.java
index 1c9f813..855adb4 100644
--- a/packages/SystemUI/tests/src/com/android/keyguard/KeyguardClockAccessibilityDelegateTest.java
+++ b/packages/SystemUI/tests/src/com/android/keyguard/KeyguardClockAccessibilityDelegateTest.java
@@ -19,26 +19,26 @@
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
-import android.content.Context;
-import android.support.test.InstrumentationRegistry;
+import android.support.test.filters.SmallTest;
import android.text.TextUtils;
import android.view.accessibility.AccessibilityEvent;
import android.view.accessibility.AccessibilityNodeInfo;
import android.widget.TextView;
+import com.android.systemui.SysuiTestCase;
+
import org.junit.Before;
import org.junit.Test;
import java.util.List;
-public class KeyguardClockAccessibilityDelegateTest {
+@SmallTest
+public class KeyguardClockAccessibilityDelegateTest extends SysuiTestCase {
- private Context mContext;
private TextView mView;
@Before
public void setUp() throws Exception {
- mContext = InstrumentationRegistry.getContext();
mView = new TextView(mContext);
mView.setText(R.string.keyguard_widget_12_hours_format);
mView.setContentDescription(mContext.getString(R.string.keyguard_widget_12_hours_format));
diff --git a/packages/SystemUI/tests/src/com/android/systemui/DependencyTest.java b/packages/SystemUI/tests/src/com/android/systemui/DependencyTest.java
index c297ae8..3426e11 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/DependencyTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/DependencyTest.java
@@ -21,6 +21,7 @@
import static org.mockito.Mockito.verify;
import android.os.Looper;
+import android.support.test.filters.SmallTest;
import com.android.systemui.Dependency.DependencyKey;
import com.android.systemui.statusbar.policy.FlashlightController;
@@ -30,6 +31,7 @@
import java.io.PrintWriter;
+@SmallTest
public class DependencyTest extends SysuiTestCase {
public static final DependencyKey<Dumpable> DUMPABLE = new DependencyKey<>("dumpable");
diff --git a/packages/SystemUI/tests/src/com/android/systemui/SysuiBaseFragmentTest.java b/packages/SystemUI/tests/src/com/android/systemui/SysuiBaseFragmentTest.java
index 15cebc7..8905d72 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/SysuiBaseFragmentTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/SysuiBaseFragmentTest.java
@@ -14,13 +14,18 @@
package com.android.systemui;
+import static org.mockito.Mockito.spy;
+import static org.mockito.Mockito.when;
+
import android.app.Fragment;
+import android.app.Instrumentation;
import android.support.test.InstrumentationRegistry;
import android.testing.BaseFragmentTest;
import com.android.systemui.utils.leaks.LeakCheckedTest;
import com.android.systemui.utils.leaks.LeakCheckedTest.SysuiLeakCheck;
+import org.junit.After;
import org.junit.Before;
import org.junit.Rule;
@@ -33,6 +38,7 @@
protected final TestableDependency mDependency = new TestableDependency(mContext);
protected SysuiTestableContext mSysuiContext;
+ private Instrumentation mRealInstrumentation;
public SysuiBaseFragmentTest(Class<? extends Fragment> cls) {
super(cls);
@@ -44,6 +50,20 @@
SystemUIFactory.createFromConfig(mContext);
// TODO: Figure out another way to give reference to a SysuiTestableContext.
mSysuiContext = (SysuiTestableContext) mContext;
+
+ mRealInstrumentation = InstrumentationRegistry.getInstrumentation();
+ Instrumentation inst = spy(mRealInstrumentation);
+ when(inst.getContext()).thenThrow(new RuntimeException(
+ "SysUI Tests should use SysuiTestCase#getContext or SysuiTestCase#mContext"));
+ when(inst.getTargetContext()).thenThrow(new RuntimeException(
+ "SysUI Tests should use SysuiTestCase#getContext or SysuiTestCase#mContext"));
+ InstrumentationRegistry.registerInstance(inst, InstrumentationRegistry.getArguments());
+ }
+
+ @After
+ public void SysuiTeardown() {
+ InstrumentationRegistry.registerInstance(mRealInstrumentation,
+ InstrumentationRegistry.getArguments());
}
@Override
diff --git a/packages/SystemUI/tests/src/com/android/systemui/SysuiTestCase.java b/packages/SystemUI/tests/src/com/android/systemui/SysuiTestCase.java
index 0aac1c0..361a20f 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/SysuiTestCase.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/SysuiTestCase.java
@@ -15,14 +15,20 @@
*/
package com.android.systemui;
+import static org.mockito.Mockito.spy;
+import static org.mockito.Mockito.when;
+
+import android.app.Instrumentation;
import android.content.Context;
import android.os.Handler;
import android.os.Looper;
import android.os.MessageQueue;
import android.support.test.InstrumentationRegistry;
+import android.support.test.filters.SmallTest;
import android.testing.LeakCheck;
import android.util.Log;
+import org.junit.After;
import org.junit.Before;
import org.junit.Rule;
@@ -41,11 +47,26 @@
public SysuiTestableContext mContext = new SysuiTestableContext(
InstrumentationRegistry.getContext(), getLeakCheck());
public TestableDependency mDependency = new TestableDependency(mContext);
+ private Instrumentation mRealInstrumentation;
@Before
public void SysuiSetup() throws Exception {
System.setProperty("dexmaker.share_classloader", "true");
SystemUIFactory.createFromConfig(mContext);
+
+ mRealInstrumentation = InstrumentationRegistry.getInstrumentation();
+ Instrumentation inst = spy(mRealInstrumentation);
+ when(inst.getContext()).thenThrow(new RuntimeException(
+ "SysUI Tests should use SysuiTestCase#getContext or SysuiTestCase#mContext"));
+ when(inst.getTargetContext()).thenThrow(new RuntimeException(
+ "SysUI Tests should use SysuiTestCase#getContext or SysuiTestCase#mContext"));
+ InstrumentationRegistry.registerInstance(inst, InstrumentationRegistry.getArguments());
+ }
+
+ @After
+ public void SysuiTeardown() {
+ InstrumentationRegistry.registerInstance(mRealInstrumentation,
+ InstrumentationRegistry.getArguments());
}
protected LeakCheck getLeakCheck() {
diff --git a/packages/SystemUI/tests/src/com/android/systemui/doze/DozeMachineTest.java b/packages/SystemUI/tests/src/com/android/systemui/doze/DozeMachineTest.java
index d203602..7519b2d 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/doze/DozeMachineTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/doze/DozeMachineTest.java
@@ -43,6 +43,7 @@
import android.view.Display;
import com.android.internal.hardware.AmbientDisplayConfiguration;
+import com.android.systemui.SysuiTestCase;
import com.android.systemui.util.wakelock.WakeLockFake;
import android.testing.UiThreadTest;
@@ -54,7 +55,7 @@
@SmallTest
@RunWith(AndroidTestingRunner.class)
@UiThreadTest
-public class DozeMachineTest {
+public class DozeMachineTest extends SysuiTestCase {
DozeMachine mMachine;
diff --git a/packages/SystemUI/tests/src/com/android/systemui/doze/DozeScreenStatePreventingAdapterTest.java b/packages/SystemUI/tests/src/com/android/systemui/doze/DozeScreenStatePreventingAdapterTest.java
index ada8ac0..720e9f0 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/doze/DozeScreenStatePreventingAdapterTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/doze/DozeScreenStatePreventingAdapterTest.java
@@ -25,13 +25,14 @@
import android.support.test.filters.SmallTest;
import android.view.Display;
+import com.android.systemui.SysuiTestCase;
import com.android.systemui.statusbar.phone.DozeParameters;
import org.junit.Before;
import org.junit.Test;
@SmallTest
-public class DozeScreenStatePreventingAdapterTest {
+public class DozeScreenStatePreventingAdapterTest extends SysuiTestCase {
private DozeMachine.Service mInner;
private DozeScreenStatePreventingAdapter mWrapper;
diff --git a/packages/SystemUI/tests/src/com/android/systemui/doze/DozeTriggersTest.java b/packages/SystemUI/tests/src/com/android/systemui/doze/DozeTriggersTest.java
index 8934460..97d9080 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/doze/DozeTriggersTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/doze/DozeTriggersTest.java
@@ -32,6 +32,7 @@
import android.support.test.runner.AndroidJUnit4;
import com.android.internal.hardware.AmbientDisplayConfiguration;
+import com.android.systemui.SysuiTestCase;
import com.android.systemui.statusbar.phone.DozeParameters;
import com.android.systemui.util.wakelock.WakeLock;
import com.android.systemui.util.wakelock.WakeLockFake;
@@ -44,8 +45,7 @@
@SmallTest
@RunWith(AndroidJUnit4.class)
-public class DozeTriggersTest {
- private Context mContext;
+public class DozeTriggersTest extends SysuiTestCase {
private DozeTriggers mTriggers;
private DozeMachine mMachine;
private DozeHostFake mHost;
@@ -65,7 +65,6 @@
@Before
public void setUp() throws Exception {
mInstrumentation = InstrumentationRegistry.getInstrumentation();
- mContext = InstrumentationRegistry.getContext();
mMachine = mock(DozeMachine.class);
mHost = new DozeHostFake();
mConfig = DozeConfigurationUtil.createMockConfig();
diff --git a/packages/SystemUI/tests/src/com/android/systemui/keyguard/WorkLockActivityControllerTest.java b/packages/SystemUI/tests/src/com/android/systemui/keyguard/WorkLockActivityControllerTest.java
index 0f2878b..5fb0a3e 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/keyguard/WorkLockActivityControllerTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/keyguard/WorkLockActivityControllerTest.java
@@ -40,6 +40,7 @@
import android.support.test.filters.SmallTest;
import android.support.test.runner.AndroidJUnit4;
+import com.android.systemui.SysuiTestCase;
import com.android.systemui.keyguard.WorkLockActivity;
import com.android.systemui.keyguard.WorkLockActivityController;
import com.android.systemui.recents.misc.SystemServicesProxy;
@@ -58,7 +59,7 @@
*/
@SmallTest
@RunWith(AndroidJUnit4.class)
-public class WorkLockActivityControllerTest {
+public class WorkLockActivityControllerTest extends SysuiTestCase {
private static final int USER_ID = 333;
private static final int TASK_ID = 444;
diff --git a/packages/SystemUI/tests/src/com/android/systemui/keyguard/WorkLockActivityTest.java b/packages/SystemUI/tests/src/com/android/systemui/keyguard/WorkLockActivityTest.java
index 9b868db..9f3573f 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/keyguard/WorkLockActivityTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/keyguard/WorkLockActivityTest.java
@@ -33,6 +33,7 @@
import android.graphics.Color;
import android.os.Looper;
+import com.android.systemui.SysuiTestCase;
import com.android.systemui.keyguard.WorkLockActivity;
import org.junit.Before;
@@ -46,7 +47,7 @@
*/
@SmallTest
@RunWith(AndroidJUnit4.class)
-public class WorkLockActivityTest {
+public class WorkLockActivityTest extends SysuiTestCase {
private static final @UserIdInt int USER_ID = 270;
private static final String TASK_LABEL = "task label";
diff --git a/packages/SystemUI/tests/src/com/android/systemui/plugins/VersionInfoTest.java b/packages/SystemUI/tests/src/com/android/systemui/plugins/VersionInfoTest.java
index 9849800..0b4d9b5 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/plugins/VersionInfoTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/plugins/VersionInfoTest.java
@@ -17,6 +17,8 @@
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
+import android.support.test.filters.SmallTest;
+
import com.android.systemui.SysuiTestCase;
import com.android.systemui.plugins.VersionInfo.InvalidVersionException;
import com.android.systemui.plugins.annotations.Requires;
@@ -28,6 +30,7 @@
import org.junit.Test;
import org.junit.rules.ExpectedException;
+@SmallTest
public class VersionInfoTest extends SysuiTestCase {
@Rule
diff --git a/packages/SystemUI/tests/src/com/android/systemui/qs/QSDetailTest.java b/packages/SystemUI/tests/src/com/android/systemui/qs/QSDetailTest.java
index 8609eeb..7cbe985 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/qs/QSDetailTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/qs/QSDetailTest.java
@@ -23,6 +23,7 @@
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
+import android.support.test.filters.SmallTest;
import android.testing.AndroidTestingRunner;
import android.testing.TestableLooper;
import android.testing.TestableLooper.RunWithLooper;
@@ -37,12 +38,14 @@
import com.android.systemui.plugins.qs.DetailAdapter;
import org.junit.After;
+import org.junit.Ignore;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
@RunWith(AndroidTestingRunner.class)
@RunWithLooper
+@SmallTest
public class QSDetailTest extends SysuiTestCase {
private MetricsLogger mMetricsLogger;
diff --git a/packages/SystemUI/tests/src/com/android/systemui/qs/QSFooterTest.java b/packages/SystemUI/tests/src/com/android/systemui/qs/QSFooterTest.java
index 778ab8e..402b12d 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/qs/QSFooterTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/qs/QSFooterTest.java
@@ -20,6 +20,7 @@
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
+import android.support.test.filters.SmallTest;
import android.testing.AndroidTestingRunner;
import android.testing.TestableLooper;
import android.testing.TestableLooper.RunWithLooper;
@@ -33,11 +34,13 @@
import com.android.systemui.utils.leaks.LeakCheckedTest;
import org.junit.Before;
+import org.junit.Ignore;
import org.junit.Test;
import org.junit.runner.RunWith;
@RunWith(AndroidTestingRunner.class)
@RunWithLooper
+@SmallTest
public class QSFooterTest extends LeakCheckedTest {
private QSFooter mFooter;
diff --git a/packages/SystemUI/tests/src/com/android/systemui/qs/QSFragmentTest.java b/packages/SystemUI/tests/src/com/android/systemui/qs/QSFragmentTest.java
index d81224e..0b7da1f 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/qs/QSFragmentTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/qs/QSFragmentTest.java
@@ -21,6 +21,7 @@
import android.app.FragmentController;
import android.app.FragmentManagerNonConfig;
import android.os.Looper;
+import android.support.test.filters.FlakyTest;
import com.android.internal.logging.MetricsLogger;
import com.android.keyguard.CarrierText;
@@ -28,6 +29,7 @@
import com.android.systemui.R;
import android.os.Parcelable;
+import android.support.test.filters.SmallTest;
import android.testing.AndroidTestingRunner;
import com.android.systemui.SysuiBaseFragmentTest;
@@ -39,6 +41,7 @@
import android.testing.TestableLooper.RunWithLooper;
import org.junit.Before;
+import org.junit.Ignore;
import org.junit.Test;
import org.junit.runner.RunWith;
@@ -48,6 +51,7 @@
@RunWith(AndroidTestingRunner.class)
@RunWithLooper(setAsMainLooper = true)
+@SmallTest
public class QSFragmentTest extends SysuiBaseFragmentTest {
private MetricsLogger mMockMetricsLogger;
diff --git a/packages/SystemUI/tests/src/com/android/systemui/qs/QSPanelTest.java b/packages/SystemUI/tests/src/com/android/systemui/qs/QSPanelTest.java
index 4979684..e5ff866 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/qs/QSPanelTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/qs/QSPanelTest.java
@@ -16,9 +16,10 @@
import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.when;
import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+import android.support.test.filters.SmallTest;
import android.testing.AndroidTestingRunner;
import android.testing.TestableLooper;
import android.testing.TestableLooper.RunWithLooper;
@@ -29,6 +30,7 @@
import com.android.systemui.qs.customize.QSCustomizer;
import org.junit.Before;
+import org.junit.Ignore;
import org.junit.Test;
import org.junit.runner.RunWith;
@@ -36,6 +38,7 @@
@RunWith(AndroidTestingRunner.class)
@RunWithLooper
+@SmallTest
public class QSPanelTest extends SysuiTestCase {
private MetricsLogger mMetricsLogger;
diff --git a/packages/SystemUI/tests/src/com/android/systemui/qs/customize/TileAdapterTest.java b/packages/SystemUI/tests/src/com/android/systemui/qs/customize/TileAdapterTest.java
index 6e7d99e..0239ab0 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/qs/customize/TileAdapterTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/qs/customize/TileAdapterTest.java
@@ -18,6 +18,7 @@
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.verify;
+import android.support.test.filters.SmallTest;
import android.testing.AndroidTestingRunner;
import android.testing.TestableLooper;
import android.testing.TestableLooper.RunWithLooper;
@@ -33,6 +34,7 @@
@RunWith(AndroidTestingRunner.class)
@RunWithLooper
+@SmallTest
public class TileAdapterTest extends SysuiTestCase {
private TileAdapter mTileAdapter;
diff --git a/packages/SystemUI/tests/src/com/android/systemui/qs/tileimpl/QSIconViewImplTest.java b/packages/SystemUI/tests/src/com/android/systemui/qs/tileimpl/QSIconViewImplTest.java
index 59483f2..f9f4f497 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/qs/tileimpl/QSIconViewImplTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/qs/tileimpl/QSIconViewImplTest.java
@@ -24,6 +24,7 @@
import android.content.res.ColorStateList;
import android.graphics.drawable.Drawable;
import android.service.quicksettings.Tile;
+import android.support.test.filters.SmallTest;
import android.testing.AndroidTestingRunner;
import android.testing.UiThreadTest;
import android.widget.ImageView;
@@ -39,6 +40,7 @@
@RunWith(AndroidTestingRunner.class)
@UiThreadTest
+@SmallTest
public class QSIconViewImplTest extends SysuiTestCase {
private QSIconViewImpl mIconView;
diff --git a/packages/SystemUI/tests/src/com/android/systemui/qs/tileimpl/QSTileImplTest.java b/packages/SystemUI/tests/src/com/android/systemui/qs/tileimpl/QSTileImplTest.java
index 9ed9d28..0500a54 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/qs/tileimpl/QSTileImplTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/qs/tileimpl/QSTileImplTest.java
@@ -30,6 +30,7 @@
import android.content.Intent;
import android.metrics.LogMaker;
+import android.support.test.filters.SmallTest;
import android.testing.AndroidTestingRunner;
import android.testing.TestableLooper;
import android.testing.TestableLooper.RunWithLooper;
@@ -48,6 +49,7 @@
@RunWith(AndroidTestingRunner.class)
@RunWithLooper
+@SmallTest
public class QSTileImplTest extends SysuiTestCase {
public static final int POSITION = 14;
diff --git a/packages/SystemUI/tests/src/com/android/systemui/settings/CurrentUserTrackerTest.java b/packages/SystemUI/tests/src/com/android/systemui/settings/CurrentUserTrackerTest.java
index 9e15a05..17d7a41 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/settings/CurrentUserTrackerTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/settings/CurrentUserTrackerTest.java
@@ -17,6 +17,7 @@
package com.android.systemui.settings;
import android.content.Intent;
+import android.support.test.filters.SmallTest;
import com.android.systemui.SysuiTestCase;
@@ -26,6 +27,7 @@
/**
* Testing functionality of the current user tracker
*/
+@SmallTest
public class CurrentUserTrackerTest extends SysuiTestCase {
private CurrentUserTracker mTracker;
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/CommandQueueTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/CommandQueueTest.java
index c13d13b..8cacb4b 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/CommandQueueTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/CommandQueueTest.java
@@ -22,6 +22,7 @@
import android.content.ComponentName;
import android.graphics.Rect;
import android.os.Bundle;
+import android.support.test.filters.SmallTest;
import com.android.internal.statusbar.StatusBarIcon;
import com.android.systemui.SysuiTestCase;
@@ -31,6 +32,7 @@
import org.junit.Before;
import org.junit.Test;
+@SmallTest
public class CommandQueueTest extends SysuiTestCase {
private CommandQueue mCommandQueue;
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/ExpandableNotificationRowTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/ExpandableNotificationRowTest.java
index 5cd092b..1161987 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/ExpandableNotificationRowTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/ExpandableNotificationRowTest.java
@@ -16,31 +16,36 @@
package com.android.systemui.statusbar;
+import static org.mockito.ArgumentMatchers.any;
import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.verify;
import android.content.Context;
import android.support.test.InstrumentationRegistry;
import android.support.test.annotation.UiThreadTest;
+import android.support.test.filters.FlakyTest;
import android.support.test.filters.SmallTest;
import android.support.test.runner.AndroidJUnit4;
import android.view.View;
+import com.android.systemui.statusbar.stack.NotificationChildrenContainer;
+import com.android.systemui.SysuiTestCase;
+
import org.junit.Assert;
import org.junit.Before;
+import org.junit.Ignore;
import org.junit.Test;
import org.junit.runner.RunWith;
@SmallTest
@RunWith(AndroidJUnit4.class)
-public class ExpandableNotificationRowTest {
+public class ExpandableNotificationRowTest extends SysuiTestCase {
- private Context mContext;
private ExpandableNotificationRow mGroup;
private NotificationTestHelper mNotificationTestHelper;
@Before
public void setUp() throws Exception {
- mContext = InstrumentationRegistry.getTargetContext();
mNotificationTestHelper = new NotificationTestHelper(mContext);
mGroup = mNotificationTestHelper.createGroup();
}
@@ -62,4 +67,25 @@
== View.VISIBLE);
}
+ @Test
+ public void testUserLockedResetEvenWhenNoChildren() {
+ mGroup.setUserLocked(true);
+ mGroup.removeAllChildren();
+ mGroup.setUserLocked(false);
+ Assert.assertFalse("The childrencontainer should not be userlocked but is, the state "
+ + "seems out of sync.", mGroup.getChildrenContainer().isUserLocked());
+ }
+
+ @Test
+ public void testReinflatedOnDensityChange() {
+ mGroup.setUserLocked(true);
+ mGroup.removeAllChildren();
+ mGroup.setUserLocked(false);
+ NotificationChildrenContainer mockContainer = mock(NotificationChildrenContainer.class);
+ mGroup.setChildrenContainer(mockContainer);
+ mGroup.onDensityOrFontScaleChanged();
+ verify(mockContainer).reInflateViews(any(), any());
+ }
+
+
}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/NotificationContentViewTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/NotificationContentViewTest.java
index 77f96b8..8dcc408 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/NotificationContentViewTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/NotificationContentViewTest.java
@@ -19,12 +19,14 @@
import android.content.Context;
import android.support.test.InstrumentationRegistry;
import android.support.test.annotation.UiThreadTest;
+import android.support.test.filters.FlakyTest;
import android.support.test.filters.SmallTest;
import android.support.test.runner.AndroidJUnit4;
import android.view.View;
import org.junit.Assert;
import org.junit.Before;
+import org.junit.Ignore;
import org.junit.Test;
import org.junit.runner.RunWith;
@@ -33,17 +35,17 @@
import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.spy;
+import com.android.systemui.SysuiTestCase;
+
@SmallTest
@RunWith(AndroidJUnit4.class)
-public class NotificationContentViewTest {
+public class NotificationContentViewTest extends SysuiTestCase {
NotificationContentView mView;
- Context mContext;
@Before
@UiThreadTest
public void setup() {
- mContext = InstrumentationRegistry.getTargetContext();
mView = new NotificationContentView(mContext, null);
ExpandableNotificationRow row = new ExpandableNotificationRow(mContext, null);
ExpandableNotificationRow mockRow = spy(row);
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/NotificationCustomViewWrapperTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/NotificationCustomViewWrapperTest.java
index f016aa1..fc9b608 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/NotificationCustomViewWrapperTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/NotificationCustomViewWrapperTest.java
@@ -19,31 +19,32 @@
import android.content.Context;
import android.support.test.InstrumentationRegistry;
import android.support.test.annotation.UiThreadTest;
+import android.support.test.filters.FlakyTest;
import android.support.test.filters.SmallTest;
import android.support.test.runner.AndroidJUnit4;
import android.view.View;
import android.widget.RemoteViews;
import com.android.systemui.R;
+import com.android.systemui.SysuiTestCase;
import com.android.systemui.statusbar.notification.NotificationCustomViewWrapper;
import com.android.systemui.statusbar.notification.NotificationViewWrapper;
import org.junit.Assert;
import org.junit.Before;
+import org.junit.Ignore;
import org.junit.Test;
import org.junit.runner.RunWith;
@SmallTest
@RunWith(AndroidJUnit4.class)
-public class NotificationCustomViewWrapperTest {
+public class NotificationCustomViewWrapperTest extends SysuiTestCase {
- private Context mContext;
private ExpandableNotificationRow mRow;
@Before
@UiThreadTest
public void setUp() {
- mContext = InstrumentationRegistry.getTargetContext();
mRow = new ExpandableNotificationRow(mContext, null);
}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/NotificationInfoTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/NotificationInfoTest.java
index c7d5e68..6380847 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/NotificationInfoTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/NotificationInfoTest.java
@@ -16,6 +16,8 @@
package com.android.systemui.statusbar;
+import static android.print.PrintManager.PRINT_SPOOLER_PACKAGE_NAME;
+
import static junit.framework.Assert.assertEquals;
import static junit.framework.Assert.assertFalse;
import static junit.framework.Assert.assertNull;
@@ -74,6 +76,7 @@
@UiThreadTest
public class NotificationInfoTest extends SysuiTestCase {
private static final String TEST_PACKAGE_NAME = "test_package";
+ private static final String TEST_SYSTEM_PACKAGE_NAME = PRINT_SPOOLER_PACKAGE_NAME;
private static final int TEST_UID = 1;
private static final String TEST_CHANNEL = "test_channel";
private static final String TEST_CHANNEL_NAME = "TEST CHANNEL NAME";
@@ -95,11 +98,18 @@
// PackageManager must return a packageInfo and applicationInfo.
final PackageInfo packageInfo = new PackageInfo();
packageInfo.packageName = TEST_PACKAGE_NAME;
- when(mMockPackageManager.getPackageInfo(anyString(), anyInt())).thenReturn(packageInfo);
+ when(mMockPackageManager.getPackageInfo(eq(TEST_PACKAGE_NAME), anyInt()))
+ .thenReturn(packageInfo);
final ApplicationInfo applicationInfo = new ApplicationInfo();
applicationInfo.uid = TEST_UID; // non-zero
when(mMockPackageManager.getApplicationInfo(anyString(), anyInt())).thenReturn(
applicationInfo);
+ final PackageInfo systemPackageInfo = new PackageInfo();
+ systemPackageInfo.packageName = TEST_SYSTEM_PACKAGE_NAME;
+ when(mMockPackageManager.getPackageInfo(eq(TEST_SYSTEM_PACKAGE_NAME), anyInt()))
+ .thenReturn(systemPackageInfo);
+ when(mMockPackageManager.getPackageInfo(eq("android"), anyInt()))
+ .thenReturn(packageInfo);
// Package has one channel by default.
when(mMockINotificationManager.getNumNotificationChannelsForPackage(
@@ -605,6 +615,45 @@
}
@Test
+ public void testEnabledSwitchInvisibleIfNonBlockableSystemChannel() throws Exception {
+ mNotificationChannel.setImportance(NotificationManager.IMPORTANCE_LOW);
+ mNotificationChannel.setBlockableSystem(false);
+ mNotificationInfo.bindNotification(mMockPackageManager, mMockINotificationManager,
+ TEST_SYSTEM_PACKAGE_NAME, Arrays.asList(mNotificationChannel),
+ mNotificationChannel.getImportance(), mSbn, null, null, null,
+ null, null);
+
+ Switch enabledSwitch = (Switch) mNotificationInfo.findViewById(R.id.channel_enabled_switch);
+ assertEquals(View.INVISIBLE, enabledSwitch.getVisibility());
+ }
+
+ @Test
+ public void testEnabledSwitchVisibleIfBlockableSystemChannel() throws Exception {
+ mNotificationChannel.setImportance(NotificationManager.IMPORTANCE_LOW);
+ mNotificationChannel.setBlockableSystem(true);
+ mNotificationInfo.bindNotification(mMockPackageManager, mMockINotificationManager,
+ TEST_SYSTEM_PACKAGE_NAME, Arrays.asList(mNotificationChannel),
+ mNotificationChannel.getImportance(), mSbn, null, null, null,
+ null, null);
+
+ Switch enabledSwitch = (Switch) mNotificationInfo.findViewById(R.id.channel_enabled_switch);
+ assertEquals(View.VISIBLE, enabledSwitch.getVisibility());
+ }
+
+ @Test
+ public void testEnabledSwitchInvisibleIfMultiChannelSummary() throws Exception {
+ mNotificationChannel.setImportance(NotificationManager.IMPORTANCE_LOW);
+ mNotificationChannel.setBlockableSystem(true);
+ mNotificationInfo.bindNotification(mMockPackageManager, mMockINotificationManager,
+ TEST_PACKAGE_NAME, Arrays.asList(mNotificationChannel, mDefaultNotificationChannel),
+ mNotificationChannel.getImportance(), mSbn, null, null, null,
+ null, Collections.singleton(TEST_PACKAGE_NAME));
+
+ Switch enabledSwitch = (Switch) mNotificationInfo.findViewById(R.id.channel_enabled_switch);
+ assertEquals(View.INVISIBLE, enabledSwitch.getVisibility());
+ }
+
+ @Test
public void testNonBlockableAppDoesNotBecomeBlocked() throws Exception {
mNotificationChannel.setImportance(NotificationManager.IMPORTANCE_LOW);
mNotificationInfo.bindNotification(mMockPackageManager, mMockINotificationManager,
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/NotificationMenuRowTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/NotificationMenuRowTest.java
index 9249df6..e0d8042 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/NotificationMenuRowTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/NotificationMenuRowTest.java
@@ -16,6 +16,7 @@
import static junit.framework.Assert.assertTrue;
+import android.support.test.filters.SmallTest;
import android.testing.AndroidTestingRunner;
import android.testing.TestableLooper;
import android.testing.TestableLooper.RunWithLooper;
@@ -30,6 +31,7 @@
@RunWith(AndroidTestingRunner.class)
@RunWithLooper(setAsMainLooper = true)
+@SmallTest
public class NotificationMenuRowTest extends LeakCheckedTest {
@Before
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/SignalClusterViewTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/SignalClusterViewTest.java
new file mode 100644
index 0000000..28a5aa3
--- /dev/null
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/SignalClusterViewTest.java
@@ -0,0 +1,61 @@
+/*
+ * Copyright (C) 2017 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.systemui.statusbar;
+
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.when;
+
+import android.support.test.filters.SmallTest;
+import android.telephony.SubscriptionInfo;
+import android.testing.AndroidTestingRunner;
+import android.testing.TestableLooper.RunWithLooper;
+import android.view.LayoutInflater;
+
+import com.android.systemui.R;
+import com.android.systemui.SysuiTestCase;
+import com.android.systemui.statusbar.policy.NetworkController.IconState;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+import java.util.Arrays;
+
+@RunWith(AndroidTestingRunner.class)
+@RunWithLooper
+@SmallTest
+public class SignalClusterViewTest extends SysuiTestCase {
+
+ private SignalClusterView mSignalCluster;
+
+ @Before
+ public void setup() {
+ mSignalCluster = (SignalClusterView) LayoutInflater.from(mContext)
+ .inflate(R.layout.signal_cluster_view, null);
+ }
+
+ @Test
+ public void testNonDefaultSim() {
+ SubscriptionInfo first = mock(SubscriptionInfo.class);
+ SubscriptionInfo second = mock(SubscriptionInfo.class);
+ when(first.getSubscriptionId()).thenReturn(0);
+ when(second.getSubscriptionId()).thenReturn(1);
+ mSignalCluster.setSubs(Arrays.asList(first, second));
+ mSignalCluster.setQsSignalCluster();
+ mSignalCluster.setMobileDataIndicators(new IconState(true, 0, 0, ""), null, 0, 0,
+ false, false, "", "", false, 1, false);
+ }
+
+}
\ No newline at end of file
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/NotificationInflaterTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/NotificationInflaterTest.java
index 0c5bdea..ee8db88 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/NotificationInflaterTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/NotificationInflaterTest.java
@@ -27,17 +27,21 @@
import android.service.notification.StatusBarNotification;
import android.support.test.InstrumentationRegistry;
import android.support.test.annotation.UiThreadTest;
+import android.support.test.filters.FlakyTest;
import android.support.test.filters.SmallTest;
import android.support.test.runner.AndroidJUnit4;
import android.widget.RemoteViews;
import com.android.systemui.R;
+import com.android.systemui.SysuiTestCase;
import com.android.systemui.statusbar.ExpandableNotificationRow;
import com.android.systemui.statusbar.NotificationData;
import com.android.systemui.statusbar.NotificationTestHelper;
+import com.android.systemui.statusbar.InflationTask;
import org.junit.Assert;
import org.junit.Before;
+import org.junit.Ignore;
import org.junit.Test;
import org.junit.runner.RunWith;
@@ -45,16 +49,14 @@
@SmallTest
@RunWith(AndroidJUnit4.class)
-public class NotificationInflaterTest {
+public class NotificationInflaterTest extends SysuiTestCase {
- private Context mContext;
private NotificationInflater mNotificationInflater;
private Notification.Builder mBuilder;
private ExpandableNotificationRow mRow;
@Before
public void setUp() throws Exception {
- mContext = InstrumentationRegistry.getTargetContext();
mBuilder = new Notification.Builder(mContext).setSmallIcon(
R.drawable.ic_person)
.setContentTitle("Title")
@@ -129,7 +131,29 @@
mRow.getEntry().abortTask();
runThenWaitForInflation(() -> mNotificationInflater.inflateNotificationViews(),
mNotificationInflater);
- Assert.assertNull(mRow.getEntry().getRunningTask() );
+ verify(mRow).onNotificationUpdated();
+ }
+
+ @Test
+ public void testRemovedNotInflated() throws Exception {
+ mRow.setRemoved();
+ mNotificationInflater.inflateNotificationViews();
+ Assert.assertNull(mRow.getEntry().getRunningTask());
+ }
+
+
+ @Test
+ public void testSupersedesExistingTask() throws Exception {
+ mNotificationInflater.inflateNotificationViews();
+ mNotificationInflater.setIsLowPriority(true);
+ mNotificationInflater.setIsChildInGroup(true);
+ InflationTask runningTask = mRow.getEntry().getRunningTask();
+ NotificationInflater.AsyncInflationTask asyncInflationTask =
+ (NotificationInflater.AsyncInflationTask) runningTask;
+ Assert.assertSame("Successive inflations don't inherit the previous flags!",
+ asyncInflationTask.getReInflateFlags(),
+ NotificationInflater.FLAG_REINFLATE_ALL);
+ runningTask.abort();
}
public static void runThenWaitForInflation(Runnable block,
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/NotificationViewWrapperTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/NotificationViewWrapperTest.java
index 7a72afd..ebeb24c8 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/NotificationViewWrapperTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/NotificationViewWrapperTest.java
@@ -18,9 +18,11 @@
import android.content.Context;
import android.support.test.InstrumentationRegistry;
+import android.support.test.filters.SmallTest;
import android.support.test.runner.AndroidJUnit4;
import android.view.View;
+import com.android.systemui.SysuiTestCase;
import com.android.systemui.statusbar.ExpandableNotificationRow;
import org.junit.Before;
@@ -28,14 +30,8 @@
import org.junit.runner.RunWith;
@RunWith(AndroidJUnit4.class)
-public class NotificationViewWrapperTest {
-
- private Context mContext;
-
- @Before
- public void setUp() throws Exception {
- mContext = InstrumentationRegistry.getTargetContext();
- }
+@SmallTest
+public class NotificationViewWrapperTest extends SysuiTestCase {
@Test
public void constructor_doesntUseViewContext() throws Exception {
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/VisualStabilityManagerTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/VisualStabilityManagerTest.java
index e4c43735..95ce0d8 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/VisualStabilityManagerTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/VisualStabilityManagerTest.java
@@ -20,6 +20,7 @@
import android.support.test.runner.AndroidJUnit4;
import android.test.suitebuilder.annotation.SmallTest;
+import com.android.systemui.SysuiTestCase;
import com.android.systemui.statusbar.ExpandableNotificationRow;
import com.android.systemui.statusbar.NotificationData;
import com.android.systemui.statusbar.notification.VisibilityLocationProvider;
@@ -37,7 +38,7 @@
@SmallTest
@RunWith(AndroidJUnit4.class)
-public class VisualStabilityManagerTest {
+public class VisualStabilityManagerTest extends SysuiTestCase {
private VisualStabilityManager mVisualStabilityManager = new VisualStabilityManager();
private VisualStabilityManager.Callback mCallback = mock(VisualStabilityManager.Callback.class);
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/AutoTileManagerTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/AutoTileManagerTest.java
index e41a827..0937ce2 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/AutoTileManagerTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/AutoTileManagerTest.java
@@ -22,6 +22,8 @@
import com.android.internal.app.NightDisplayController;
import com.android.systemui.Prefs;
import com.android.systemui.Prefs.Key;
+
+import android.support.test.filters.SmallTest;
import android.testing.AndroidTestingRunner;
import com.android.systemui.SysuiTestCase;
import com.android.systemui.qs.QSTileHost;
@@ -33,6 +35,7 @@
import org.mockito.Mockito;
@RunWith(AndroidTestingRunner.class)
+@SmallTest
public class AutoTileManagerTest extends SysuiTestCase {
private QSTileHost mQsTileHost;
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/CollapsedStatusBarFragmentTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/CollapsedStatusBarFragmentTest.java
index 6ddbffc..66524cc 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/CollapsedStatusBarFragmentTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/CollapsedStatusBarFragmentTest.java
@@ -21,6 +21,7 @@
import static org.mockito.Mockito.when;
import android.app.StatusBarManager;
+import android.support.test.filters.SmallTest;
import android.view.View;
import android.view.ViewPropertyAnimator;
@@ -39,6 +40,7 @@
@RunWith(AndroidTestingRunner.class)
@RunWithLooper(setAsMainLooper = true)
+@SmallTest
public class CollapsedStatusBarFragmentTest extends SysuiBaseFragmentTest {
private NotificationIconAreaController mMockNotificiationAreaController;
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/DozeParametersTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/DozeParametersTest.java
index ee10440..e89ff97 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/DozeParametersTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/DozeParametersTest.java
@@ -18,6 +18,8 @@
import android.support.test.runner.AndroidJUnit4;
import android.test.suitebuilder.annotation.SmallTest;
+
+import com.android.systemui.SysuiTestCase;
import com.android.systemui.statusbar.phone.DozeParameters.IntInOutMatcher;
import org.junit.Test;
import org.junit.runner.RunWith;
@@ -28,7 +30,7 @@
@SmallTest
@RunWith(AndroidJUnit4.class)
-public class DozeParametersTest {
+public class DozeParametersTest extends SysuiTestCase {
@Test
public void test_inOutMatcher_defaultIn() {
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/NavigationBarFragmentTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/NavigationBarFragmentTest.java
index 53d842a..a120cec 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/NavigationBarFragmentTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/NavigationBarFragmentTest.java
@@ -20,6 +20,7 @@
import android.content.Context;
import android.os.Looper;
+import android.support.test.filters.SmallTest;
import android.testing.AndroidTestingRunner;
import android.testing.LeakCheck.Tracker;
import android.view.Display;
@@ -46,6 +47,7 @@
@RunWith(AndroidTestingRunner.class)
@RunWithLooper(setAsMainLooper = true)
+@SmallTest
public class NavigationBarFragmentTest extends SysuiBaseFragmentTest {
public NavigationBarFragmentTest() {
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarIconControllerTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarIconControllerTest.java
index ecae39a..5db7792 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarIconControllerTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarIconControllerTest.java
@@ -18,6 +18,7 @@
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.verify;
+import android.support.test.filters.SmallTest;
import android.testing.AndroidTestingRunner;
import android.testing.TestableLooper.RunWithLooper;
import android.view.ViewGroup;
@@ -36,6 +37,7 @@
@RunWith(AndroidTestingRunner.class)
@RunWithLooper
+@SmallTest
public class StatusBarIconControllerTest extends LeakCheckedTest {
@Before
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarTest.java
index bf6b394..55ec307 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarTest.java
@@ -16,13 +16,27 @@
package com.android.systemui.statusbar.phone;
+import static android.app.NotificationManager.IMPORTANCE_HIGH;
+
+import static junit.framework.Assert.assertFalse;
+import static junit.framework.Assert.assertTrue;
+
import static org.mockito.Matchers.any;
import static org.mockito.Matchers.anyBoolean;
+import static org.mockito.Matchers.anyString;
import static org.mockito.Mockito.doAnswer;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
+import android.app.Notification;
import android.metrics.LogMaker;
+import android.os.Handler;
+import android.os.HandlerThread;
+import android.os.IPowerManager;
+import android.os.Looper;
+import android.os.PowerManager;
+import android.os.UserHandle;
+import android.service.notification.StatusBarNotification;
import android.support.test.filters.SmallTest;
import android.support.test.metricshelper.MetricsAsserts;
import android.support.test.runner.AndroidJUnit4;
@@ -33,9 +47,11 @@
import com.android.internal.logging.testing.FakeMetricsLogger;
import com.android.keyguard.KeyguardHostView.OnDismissAction;
import com.android.systemui.SysuiTestCase;
+import com.android.systemui.recents.misc.SystemServicesProxy;
import com.android.systemui.statusbar.ActivatableNotificationView;
import com.android.systemui.statusbar.KeyguardIndicationController;
import com.android.systemui.statusbar.NotificationData;
+import com.android.systemui.statusbar.policy.HeadsUpManager;
import com.android.systemui.statusbar.stack.NotificationStackScrollLayout;
import org.junit.Before;
@@ -52,19 +68,34 @@
NotificationStackScrollLayout mStackScroller;
StatusBar mStatusBar;
FakeMetricsLogger mMetricsLogger;
+ HeadsUpManager mHeadsUpManager;
+ NotificationData mNotificationData;
+ PowerManager mPowerManager;
+ SystemServicesProxy mSystemServicesProxy;
private DisplayMetrics mDisplayMetrics = new DisplayMetrics();
@Before
- public void setup() {
+ public void setup() throws Exception {
mStatusBarKeyguardViewManager = mock(StatusBarKeyguardViewManager.class);
mUnlockMethodCache = mock(UnlockMethodCache.class);
mKeyguardIndicationController = mock(KeyguardIndicationController.class);
mStackScroller = mock(NotificationStackScrollLayout.class);
mMetricsLogger = new FakeMetricsLogger();
+ mHeadsUpManager = mock(HeadsUpManager.class);
+ mNotificationData = mock(NotificationData.class);
+ mSystemServicesProxy = mock(SystemServicesProxy.class);
+ IPowerManager powerManagerService = mock(IPowerManager.class);
+ HandlerThread handlerThread = new HandlerThread("TestThread");
+ handlerThread.start();
+ mPowerManager = new PowerManager(mContext, powerManagerService,
+ new Handler(handlerThread.getLooper()));
+ when(powerManagerService.isInteractive()).thenReturn(true);
+
mDependency.injectTestDependency(MetricsLogger.class, mMetricsLogger);
mStatusBar = new TestableStatusBar(mStatusBarKeyguardViewManager, mUnlockMethodCache,
- mKeyguardIndicationController, mStackScroller);
+ mKeyguardIndicationController, mStackScroller, mHeadsUpManager,
+ mNotificationData, mPowerManager, mSystemServicesProxy);
doAnswer(invocation -> {
OnDismissAction onDismissAction = (OnDismissAction) invocation.getArguments()[0];
@@ -210,14 +241,62 @@
.setType(MetricsEvent.TYPE_ACTION));
}
+ @Test
+ public void testShouldPeek_nonSuppressedGroupSummary() {
+ when(mPowerManager.isScreenOn()).thenReturn(true);
+ when(mHeadsUpManager.isSnoozed(anyString())).thenReturn(false);
+ when(mNotificationData.shouldSuppressScreenOn(any())).thenReturn(false);
+ when(mNotificationData.shouldFilterOut(any())).thenReturn(false);
+ when(mSystemServicesProxy.isDreaming()).thenReturn(false);
+ when(mNotificationData.getImportance(any())).thenReturn(IMPORTANCE_HIGH);
+
+ Notification n = new Notification.Builder(getContext(), "a")
+ .setGroup("a")
+ .setGroupSummary(true)
+ .setGroupAlertBehavior(Notification.GROUP_ALERT_SUMMARY)
+ .build();
+ StatusBarNotification sbn = new StatusBarNotification("a", "a", 0, "a", 0, 0, n,
+ UserHandle.of(0), null, 0);
+ NotificationData.Entry entry = new NotificationData.Entry(sbn);
+
+ assertTrue(mStatusBar.shouldPeek(entry, sbn));
+ }
+
+ @Test
+ public void testShouldPeek_suppressedGroupSummary() {
+ when(mPowerManager.isScreenOn()).thenReturn(true);
+ when(mHeadsUpManager.isSnoozed(anyString())).thenReturn(false);
+ when(mNotificationData.shouldSuppressScreenOn(any())).thenReturn(false);
+ when(mNotificationData.shouldFilterOut(any())).thenReturn(false);
+ when(mSystemServicesProxy.isDreaming()).thenReturn(false);
+ when(mNotificationData.getImportance(any())).thenReturn(IMPORTANCE_HIGH);
+
+ Notification n = new Notification.Builder(getContext(), "a")
+ .setGroup("a")
+ .setGroupSummary(true)
+ .setGroupAlertBehavior(Notification.GROUP_ALERT_CHILDREN)
+ .build();
+ StatusBarNotification sbn = new StatusBarNotification("a", "a", 0, "a", 0, 0, n,
+ UserHandle.of(0), null, 0);
+ NotificationData.Entry entry = new NotificationData.Entry(sbn);
+
+ assertFalse(mStatusBar.shouldPeek(entry, sbn));
+ }
+
static class TestableStatusBar extends StatusBar {
public TestableStatusBar(StatusBarKeyguardViewManager man,
UnlockMethodCache unlock, KeyguardIndicationController key,
- NotificationStackScrollLayout stack) {
+ NotificationStackScrollLayout stack, HeadsUpManager hum, NotificationData nd,
+ PowerManager pm, SystemServicesProxy ssp) {
mStatusBarKeyguardViewManager = man;
mUnlockMethodCache = unlock;
mKeyguardIndicationController = key;
mStackScroller = stack;
+ mHeadsUpManager = hum;
+ mNotificationData = nd;
+ mUseHeadsUp = true;
+ mPowerManager = pm;
+ mSystemServicesProxy = ssp;
}
@Override
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/BluetoothControllerImplTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/BluetoothControllerImplTest.java
index f516d74..2eb9560 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/BluetoothControllerImplTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/BluetoothControllerImplTest.java
@@ -20,6 +20,7 @@
import android.bluetooth.BluetoothAdapter;
import android.bluetooth.BluetoothProfile;
+import android.support.test.filters.SmallTest;
import android.testing.AndroidTestingRunner;
import android.testing.TestableLooper;
import android.testing.TestableLooper.RunWithLooper;
@@ -40,6 +41,7 @@
@RunWith(AndroidTestingRunner.class)
@RunWithLooper
+@SmallTest
public class BluetoothControllerImplTest extends SysuiTestCase {
private LocalBluetoothManager mMockBluetoothManager;
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/CallbackHandlerTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/CallbackHandlerTest.java
index 3ed1681..6157d44 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/CallbackHandlerTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/CallbackHandlerTest.java
@@ -20,6 +20,7 @@
import android.telephony.SubscriptionInfo;
import android.test.suitebuilder.annotation.SmallTest;
import com.android.systemui.R;
+import com.android.systemui.SysuiTestCase;
import com.android.systemui.statusbar.policy.NetworkController.EmergencyListener;
import com.android.systemui.statusbar.policy.NetworkController.IconState;
import com.android.systemui.statusbar.policy.NetworkController.SignalCallback;
@@ -40,7 +41,7 @@
@SmallTest
@RunWith(AndroidJUnit4.class)
-public class CallbackHandlerTest {
+public class CallbackHandlerTest extends SysuiTestCase {
private CallbackHandler mHandler;
private HandlerThread mHandlerThread;
@@ -110,7 +111,7 @@
String typeDescription = "Test 1";
String description = "Test 2";
int type = R.drawable.stat_sys_data_fully_connected_1x;
- int qsType = R.drawable.ic_qs_signal_1x;
+ int qsType = type;
boolean wide = true;
int subId = 5;
boolean roaming = true;
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/ExtensionControllerTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/ExtensionControllerTest.java
index 3e79a04..3d79d5b 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/ExtensionControllerTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/ExtensionControllerTest.java
@@ -20,6 +20,8 @@
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.verify;
+import android.support.test.filters.SmallTest;
+
import com.android.systemui.Dependency;
import com.android.systemui.SysuiTestCase;
import com.android.systemui.plugins.OverlayPlugin;
@@ -34,6 +36,7 @@
import java.util.Map;
import java.util.function.Consumer;
+@SmallTest
public class ExtensionControllerTest extends SysuiTestCase {
private PluginManager mPluginManager;
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/KeyButtonViewTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/KeyButtonViewTest.java
index 21fddf2..f859235 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/KeyButtonViewTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/KeyButtonViewTest.java
@@ -21,6 +21,7 @@
import static org.mockito.ArgumentMatchers.argThat;
import android.metrics.LogMaker;
+import android.support.test.filters.SmallTest;
import android.testing.AndroidTestingRunner;
import android.testing.TestableLooper;
import android.testing.TestableLooper.RunWithLooper;
@@ -40,6 +41,7 @@
@RunWith(AndroidTestingRunner.class)
@RunWithLooper
+@SmallTest
public class KeyButtonViewTest extends SysuiTestCase {
private KeyButtonView mKeyButtonView;
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/NetworkControllerBaseTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/NetworkControllerBaseTest.java
index 505e1d8..c233fea 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/NetworkControllerBaseTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/NetworkControllerBaseTest.java
@@ -70,7 +70,7 @@
protected static final int DEFAULT_SIGNAL_STRENGTH = DEFAULT_LEVEL;
protected static final int DEFAULT_QS_SIGNAL_STRENGTH = DEFAULT_LEVEL;
protected static final int DEFAULT_ICON = TelephonyIcons.ICON_3G;
- protected static final int DEFAULT_QS_ICON = TelephonyIcons.QS_DATA_3G;
+ protected static final int DEFAULT_QS_ICON = DEFAULT_ICON;
protected NetworkControllerImpl mNetworkController;
protected MobileSignalController mMobileSignalController;
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/NetworkControllerDataTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/NetworkControllerDataTest.java
index dfe00f9..ac64263 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/NetworkControllerDataTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/NetworkControllerDataTest.java
@@ -25,7 +25,7 @@
setupDefaultSignal();
verifyDataIndicators(TelephonyIcons.ICON_3G,
- TelephonyIcons.QS_DATA_3G);
+ TelephonyIcons.ICON_3G);
}
@Test
@@ -35,7 +35,7 @@
TelephonyManager.NETWORK_TYPE_GSM);
verifyDataIndicators(TelephonyIcons.ICON_G,
- TelephonyIcons.QS_DATA_G);
+ TelephonyIcons.ICON_G);
}
@Test
@@ -45,7 +45,7 @@
TelephonyManager.NETWORK_TYPE_CDMA);
verifyDataIndicators(TelephonyIcons.ICON_1X,
- TelephonyIcons.QS_DATA_1X);
+ TelephonyIcons.ICON_1X);
}
@Test
@@ -55,7 +55,7 @@
TelephonyManager.NETWORK_TYPE_EDGE);
verifyDataIndicators(TelephonyIcons.ICON_E,
- TelephonyIcons.QS_DATA_E);
+ TelephonyIcons.ICON_E);
}
@Test
@@ -65,7 +65,7 @@
TelephonyManager.NETWORK_TYPE_LTE);
verifyDataIndicators(TelephonyIcons.ICON_LTE,
- TelephonyIcons.QS_DATA_LTE);
+ TelephonyIcons.ICON_LTE);
}
@Test
@@ -75,7 +75,7 @@
TelephonyManager.NETWORK_TYPE_HSPA);
verifyDataIndicators(TelephonyIcons.ICON_H,
- TelephonyIcons.QS_DATA_H);
+ TelephonyIcons.ICON_H);
}
@Test
@@ -104,7 +104,7 @@
TelephonyManager.NETWORK_TYPE_LTE);
verifyDataIndicators(TelephonyIcons.ICON_4G,
- TelephonyIcons.QS_DATA_4G);
+ TelephonyIcons.ICON_4G);
}
@Ignore("Flaky")
@@ -117,7 +117,7 @@
setConnectivity(NetworkCapabilities.TRANSPORT_CELLULAR, false, false);
verifyDataIndicators(TelephonyIcons.ICON_DATA_DISABLED,
- TelephonyIcons.QS_ICON_DATA_DISABLED);
+ TelephonyIcons.ICON_DATA_DISABLED);
}
@Test
@@ -148,7 +148,7 @@
mNetworkController.handleConfigurationChanged();
verifyDataIndicators(TelephonyIcons.ICON_4G,
- TelephonyIcons.QS_DATA_4G);
+ TelephonyIcons.ICON_4G);
}
@Test
@@ -158,13 +158,13 @@
TelephonyManager.NETWORK_TYPE_LTE);
verifyDataIndicators(TelephonyIcons.ICON_LTE,
- TelephonyIcons.QS_DATA_LTE);
+ TelephonyIcons.ICON_LTE);
when(mServiceState.getDataNetworkType())
.thenReturn(TelephonyManager.NETWORK_TYPE_HSPA);
updateServiceState();
verifyDataIndicators(TelephonyIcons.ICON_H,
- TelephonyIcons.QS_DATA_H);
+ TelephonyIcons.ICON_H);
}
@Test
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/NetworkControllerSignalTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/NetworkControllerSignalTest.java
index 1627925..aa62075 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/NetworkControllerSignalTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/NetworkControllerSignalTest.java
@@ -214,7 +214,7 @@
verifyLastQsMobileDataIndicators(true,
testStrength,
- TelephonyIcons.QS_DATA_1X, false, false);
+ TelephonyIcons.ICON_1X, false, false);
}
}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/ZenModeControllerImplTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/ZenModeControllerImplTest.java
new file mode 100644
index 0000000..8124bf3
--- /dev/null
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/ZenModeControllerImplTest.java
@@ -0,0 +1,56 @@
+/*
+ * Copyright (C) 2017 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.systemui.statusbar.policy;
+
+import static org.mockito.ArgumentMatchers.eq;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.verify;
+
+import android.os.Handler;
+import android.service.notification.ZenModeConfig;
+import android.support.test.filters.SmallTest;
+import android.testing.AndroidTestingRunner;
+import android.testing.TestableLooper.RunWithLooper;
+
+import com.android.systemui.SysuiTestCase;
+import com.android.systemui.statusbar.policy.ZenModeController.Callback;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+@SmallTest
+@RunWith(AndroidTestingRunner.class)
+@RunWithLooper
+public class ZenModeControllerImplTest extends SysuiTestCase {
+
+ private Callback mCallback;
+
+ @Test
+ public void testRemoveDuringCallback() {
+ ZenModeControllerImpl controller = new ZenModeControllerImpl(mContext, new Handler());
+ mCallback = new Callback() {
+ @Override
+ public void onConfigChanged(ZenModeConfig config) {
+ controller.removeCallback(mCallback);
+ }
+ };
+ controller.addCallback(mCallback);
+ Callback mockCallback = mock(Callback.class);
+ controller.addCallback(mockCallback);
+ controller.fireConfigChanged(null);
+ verify(mockCallback).onConfigChanged(eq(null));
+ }
+
+}
\ No newline at end of file
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/stack/NotificationChildrenContainerTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/stack/NotificationChildrenContainerTest.java
index f051f30..2dd96b6 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/stack/NotificationChildrenContainerTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/stack/NotificationChildrenContainerTest.java
@@ -19,31 +19,32 @@
import android.content.Context;
import android.support.test.InstrumentationRegistry;
import android.support.test.annotation.UiThreadTest;
+import android.support.test.filters.FlakyTest;
import android.support.test.filters.SmallTest;
import android.support.test.runner.AndroidJUnit4;
import android.view.NotificationHeaderView;
import android.view.View;
+import com.android.systemui.SysuiTestCase;
import com.android.systemui.statusbar.ExpandableNotificationRow;
import com.android.systemui.statusbar.NotificationTestHelper;
import org.junit.Assert;
import org.junit.Before;
+import org.junit.Ignore;
import org.junit.Test;
import org.junit.runner.RunWith;
@SmallTest
@RunWith(AndroidJUnit4.class)
-public class NotificationChildrenContainerTest {
+public class NotificationChildrenContainerTest extends SysuiTestCase {
- private Context mContext;
private ExpandableNotificationRow mGroup;
private int mId;
private NotificationTestHelper mNotificationTestHelper;
@Before
public void setUp() throws Exception {
- mContext = InstrumentationRegistry.getTargetContext();
mNotificationTestHelper = new NotificationTestHelper(mContext);
mGroup = mNotificationTestHelper.createGroup();
}
@@ -59,4 +60,12 @@
Assert.assertTrue(lowPriorityHeaderView.getParent() == null);
Assert.assertTrue(childrenContainer.getLowPriorityHeaderView() == null);
}
+
+ @Test
+ public void testRecreateNotificationHeader_hasHeader() {
+ NotificationChildrenContainer childrenContainer = mGroup.getChildrenContainer();
+ childrenContainer.recreateNotificationHeader(null);
+ Assert.assertNotNull("Children container must have a header after recreation",
+ childrenContainer.getCurrentHeaderView());
+ }
}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/util/leak/GarbageMonitorTest.java b/packages/SystemUI/tests/src/com/android/systemui/util/leak/GarbageMonitorTest.java
index 9a825c1..a3b258f 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/util/leak/GarbageMonitorTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/util/leak/GarbageMonitorTest.java
@@ -27,13 +27,15 @@
import android.support.test.filters.SmallTest;
import android.support.test.runner.AndroidJUnit4;
+import com.android.systemui.SysuiTestCase;
+
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
@SmallTest
@RunWith(AndroidJUnit4.class)
-public class GarbageMonitorTest {
+public class GarbageMonitorTest extends SysuiTestCase {
private LeakReporter mLeakReporter;
private TrackedGarbage mTrackedGarbage;
diff --git a/packages/SystemUI/tests/src/com/android/systemui/util/leak/LeakDetectorTest.java b/packages/SystemUI/tests/src/com/android/systemui/util/leak/LeakDetectorTest.java
index 11722fe..f1965a2 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/util/leak/LeakDetectorTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/util/leak/LeakDetectorTest.java
@@ -20,6 +20,7 @@
import android.support.test.filters.SmallTest;
import android.support.test.runner.AndroidJUnit4;
+import com.android.systemui.SysuiTestCase;
import com.android.systemui.util.leak.ReferenceTestUtils.CollectionWaiter;
import org.junit.Before;
@@ -35,7 +36,7 @@
@SmallTest
@RunWith(AndroidJUnit4.class)
-public class LeakDetectorTest {
+public class LeakDetectorTest extends SysuiTestCase {
private LeakDetector mLeakDetector;
diff --git a/packages/SystemUI/tests/src/com/android/systemui/util/leak/LeakReporterTest.java b/packages/SystemUI/tests/src/com/android/systemui/util/leak/LeakReporterTest.java
index 1194849..6711ce8 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/util/leak/LeakReporterTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/util/leak/LeakReporterTest.java
@@ -24,6 +24,7 @@
import static org.mockito.Mockito.verify;
import android.app.NotificationManager;
+import android.support.test.filters.MediumTest;
import android.support.test.runner.AndroidJUnit4;
import com.android.systemui.SysuiTestCase;
@@ -38,6 +39,7 @@
import java.io.PrintWriter;
@RunWith(AndroidJUnit4.class)
+@MediumTest
public class LeakReporterTest extends SysuiTestCase {
private LeakDetector mLeakDetector;
diff --git a/packages/SystemUI/tests/src/com/android/systemui/util/leak/ReferenceTestUtilsTest.java b/packages/SystemUI/tests/src/com/android/systemui/util/leak/ReferenceTestUtilsTest.java
index 9da67b7..b8a3e39 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/util/leak/ReferenceTestUtilsTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/util/leak/ReferenceTestUtilsTest.java
@@ -21,12 +21,14 @@
import android.support.test.filters.SmallTest;
import android.support.test.runner.AndroidJUnit4;
+import com.android.systemui.SysuiTestCase;
+
import org.junit.Test;
import org.junit.runner.RunWith;
@SmallTest
@RunWith(AndroidJUnit4.class)
-public class ReferenceTestUtilsTest {
+public class ReferenceTestUtilsTest extends SysuiTestCase {
@Test
public void testCollectionWaiter_doesntBlockIndefinitely() {
diff --git a/packages/SystemUI/tests/src/com/android/systemui/util/leak/WeakIdentityHashMapTest.java b/packages/SystemUI/tests/src/com/android/systemui/util/leak/WeakIdentityHashMapTest.java
index fb1c1aa..9787df9 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/util/leak/WeakIdentityHashMapTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/util/leak/WeakIdentityHashMapTest.java
@@ -23,6 +23,7 @@
import android.support.test.filters.SmallTest;
import android.support.test.runner.AndroidJUnit4;
+import com.android.systemui.SysuiTestCase;
import com.android.systemui.util.leak.ReferenceTestUtils.CollectionWaiter;
import org.junit.Before;
@@ -31,7 +32,7 @@
@SmallTest
@RunWith(AndroidJUnit4.class)
-public class WeakIdentityHashMapTest {
+public class WeakIdentityHashMapTest extends SysuiTestCase {
WeakIdentityHashMap<Object, Object> mMap;
diff --git a/packages/SystemUI/tests/src/com/android/systemui/util/wakelock/SettableWakeLockTest.java b/packages/SystemUI/tests/src/com/android/systemui/util/wakelock/SettableWakeLockTest.java
index f6692eb..39316ed 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/util/wakelock/SettableWakeLockTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/util/wakelock/SettableWakeLockTest.java
@@ -24,13 +24,15 @@
import android.support.test.filters.SmallTest;
import android.support.test.runner.AndroidJUnit4;
+import com.android.systemui.SysuiTestCase;
+
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
@SmallTest
@RunWith(AndroidJUnit4.class)
-public class SettableWakeLockTest {
+public class SettableWakeLockTest extends SysuiTestCase {
private WakeLockFake mFake;
private SettableWakeLock mSettable;
diff --git a/packages/SystemUI/tests/src/com/android/systemui/util/wakelock/WakeLockTest.java b/packages/SystemUI/tests/src/com/android/systemui/util/wakelock/WakeLockTest.java
index 5394499..d925364 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/util/wakelock/WakeLockTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/util/wakelock/WakeLockTest.java
@@ -25,6 +25,8 @@
import android.support.test.filters.SmallTest;
import android.support.test.runner.AndroidJUnit4;
+import com.android.systemui.SysuiTestCase;
+
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
@@ -32,16 +34,14 @@
@SmallTest
@RunWith(AndroidJUnit4.class)
-public class WakeLockTest {
+public class WakeLockTest extends SysuiTestCase {
WakeLock mWakeLock;
PowerManager.WakeLock mInner;
@Before
public void setUp() {
- Context context = InstrumentationRegistry.getContext();
-
- mInner = WakeLock.createPartialInner(context, WakeLockTest.class.getName());
+ mInner = WakeLock.createPartialInner(mContext, WakeLockTest.class.getName());
mWakeLock = WakeLock.wrap(mInner);
}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/utils/leaks/FakeExtensionController.java b/packages/SystemUI/tests/src/com/android/systemui/utils/leaks/FakeExtensionController.java
index b9d188a..00846dc 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/utils/leaks/FakeExtensionController.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/utils/leaks/FakeExtensionController.java
@@ -97,5 +97,10 @@
public void destroy() {
mTracker.getLeakInfo(mAllocation).clearAllocations();
}
+
+ @Override
+ public T reload() {
+ return null;
+ }
}
}
diff --git a/preloaded-classes b/preloaded-classes
index 493e980..9612231 100644
--- a/preloaded-classes
+++ b/preloaded-classes
@@ -33,9 +33,13 @@
[Landroid.animation.Animator;
[Landroid.animation.Keyframe$FloatKeyframe;
[Landroid.animation.Keyframe$IntKeyframe;
-[Landroid.animation.Keyframe$ObjectKeyframe;
[Landroid.animation.PropertyValuesHolder;
[Landroid.app.LoaderManagerImpl;
+[Landroid.app.Notification$Action;
+[Landroid.app.NotificationChannel;
+[Landroid.app.RemoteInput;
+[Landroid.app.job.JobInfo$TriggerContentUri;
+[Landroid.bluetooth.BluetoothDevice;
[Landroid.content.ContentProviderResult;
[Landroid.content.ContentValues;
[Landroid.content.Intent;
@@ -60,6 +64,9 @@
[Landroid.graphics.Bitmap$Config;
[Landroid.graphics.Bitmap;
[Landroid.graphics.Canvas$EdgeType;
+[Landroid.graphics.ColorSpace$Model;
+[Landroid.graphics.ColorSpace$Named;
+[Landroid.graphics.ColorSpace;
[Landroid.graphics.FontFamily;
[Landroid.graphics.Interpolator$Result;
[Landroid.graphics.Matrix$ScaleToFit;
@@ -69,7 +76,9 @@
[Landroid.graphics.Paint$Style;
[Landroid.graphics.Path$Direction;
[Landroid.graphics.Path$FillType;
+[Landroid.graphics.Point;
[Landroid.graphics.PorterDuff$Mode;
+[Landroid.graphics.Rect;
[Landroid.graphics.Region$Op;
[Landroid.graphics.Shader$TileMode;
[Landroid.graphics.Typeface;
@@ -77,6 +86,13 @@
[Landroid.graphics.drawable.GradientDrawable$Orientation;
[Landroid.graphics.drawable.LayerDrawable$ChildDrawable;
[Landroid.graphics.drawable.RippleForeground;
+[Landroid.graphics.fonts.FontVariationAxis;
+[Landroid.hardware.camera2.marshal.MarshalQueryable;
+[Landroid.hardware.camera2.params.Face;
+[Landroid.hardware.camera2.params.HighSpeedVideoConfiguration;
+[Landroid.hardware.camera2.params.MeteringRectangle;
+[Landroid.hardware.camera2.params.StreamConfiguration;
+[Landroid.hardware.camera2.params.StreamConfigurationDuration;
[Landroid.hardware.soundtrigger.SoundTrigger$ConfidenceLevel;
[Landroid.hardware.soundtrigger.SoundTrigger$Keyphrase;
[Landroid.hardware.soundtrigger.SoundTrigger$KeyphraseRecognitionExtra;
@@ -89,8 +105,6 @@
[Landroid.icu.impl.Trie2$ValueWidth;
[Landroid.icu.impl.UCharacterProperty$BinaryProperty;
[Landroid.icu.impl.UCharacterProperty$IntProperty;
-[Landroid.icu.text.DateFormatSymbols$CalendarDataSink$AliasType;
-[Landroid.icu.text.DateFormatSymbols$CapitalizationContextUsage;
[Landroid.icu.text.DisplayContext$Type;
[Landroid.icu.text.DisplayContext;
[Landroid.icu.text.PluralRules$Operand;
@@ -98,29 +112,37 @@
[Landroid.icu.text.PluralRules$SampleType;
[Landroid.icu.text.TimeZoneNames$NameType;
[Landroid.icu.text.UnicodeSet;
-[Landroid.icu.util.BytesTrie$Result;
[Landroid.icu.util.Currency$CurrencyUsage;
[Landroid.icu.util.ULocale$Category;
[Landroid.icu.util.ULocale;
[Landroid.icu.util.UResourceBundle$RootType;
[Landroid.media.AudioGain;
-[Landroid.media.MediaCodecInfo$CodecProfileLevel;
-[Landroid.net.Network;
+[Landroid.net.IpConfiguration$IpAssignment;
+[Landroid.net.IpConfiguration$ProxySettings;
+[Landroid.net.LocalSocketAddress$Namespace;
[Landroid.net.NetworkInfo$DetailedState;
[Landroid.net.NetworkInfo$State;
+[Landroid.net.NetworkKey;
[Landroid.net.NetworkRequest$Type;
+[Landroid.net.ScoredNetwork;
[Landroid.net.Uri;
+[Landroid.net.wifi.ScanResult$InformationElement;
[Landroid.net.wifi.SupplicantState;
[Landroid.os.AsyncTask$Status;
-[Landroid.os.IBinder;
[Landroid.os.MessageQueue$IdleHandler;
[Landroid.os.Parcel;
[Landroid.os.Parcelable;
[Landroid.os.PatternMatcher;
+[Landroid.os.PersistableBundle;
[Landroid.os.storage.StorageVolume;
+[Landroid.service.notification.StatusBarNotification;
[Landroid.system.StructPollfd;
[Landroid.telephony.TelephonyManager$MultiSimVariants;
[Landroid.text.DynamicLayout$ChangeWatcher;
+[Landroid.text.FontConfig$Alias;
+[Landroid.text.FontConfig$Family;
+[Landroid.text.FontConfig$Font;
+[Landroid.text.Hyphenator$HyphenationData;
[Landroid.text.InputFilter;
[Landroid.text.Layout$Alignment;
[Landroid.text.Layout$Directions;
@@ -142,30 +164,33 @@
[Landroid.text.style.SpellCheckSpan;
[Landroid.text.style.SuggestionSpan;
[Landroid.text.style.TabStopSpan;
-[Landroid.text.style.URLSpan;
[Landroid.text.style.WrapTogetherSpan;
[Landroid.util.LongSparseArray;
+[Landroid.util.Pair;
[Landroid.util.Range;
[Landroid.util.Rational;
+[Landroid.util.Size;
[Landroid.view.Choreographer$CallbackQueue;
[Landroid.view.Display$Mode;
+[Landroid.view.Display;
[Landroid.view.HandlerActionQueue$HandlerAction;
[Landroid.view.MenuItem;
[Landroid.view.View;
-[Landroid.widget.Editor$TextRenderNode;
[Landroid.widget.Editor$TextViewPositionListener;
[Landroid.widget.ImageView$ScaleType;
[Landroid.widget.TextView$BufferType;
[Landroid.widget.TextView$ChangeWatcher;
-[Lcom.android.dex.TableOfContents$Section;
[Lcom.android.internal.policy.PhoneWindow$PanelFeatureState;
+[Lcom.android.internal.telephony.IccCardConstants$State;
[Lcom.android.internal.telephony.PhoneConstants$State;
+[Lcom.android.internal.util.StateMachine$SmHandler$StateInfo;
[Lcom.android.okhttp.CipherSuite;
[Lcom.android.okhttp.ConnectionSpec;
[Lcom.android.okhttp.HttpUrl$Builder$ParseResult;
[Lcom.android.okhttp.Protocol;
[Lcom.android.okhttp.TlsVersion;
[Lcom.android.org.bouncycastle.asn1.ASN1ObjectIdentifier;
+[Lcom.android.org.conscrypt.OpenSSLSignature$EngineType;
[Lcom.android.org.conscrypt.OpenSSLX509CertPath$Encoding;
[Lcom.android.org.conscrypt.OpenSSLX509Certificate;
[Lcom.android.org.conscrypt.ct.CTLogInfo;
@@ -177,7 +202,6 @@
[Ljava.io.IOException;
[Ljava.io.ObjectInputStream$HandleTable$HandleList;
[Ljava.io.ObjectStreamField;
-[Ljava.lang.Boolean;
[Ljava.lang.Byte;
[Ljava.lang.CharSequence;
[Ljava.lang.Character$UnicodeBlock;
@@ -213,6 +237,7 @@
[Ljava.math.RoundingMode;
[Ljava.net.InetAddress;
[Ljava.net.Proxy$Type;
+[Ljava.nio.ByteBuffer;
[Ljava.nio.file.attribute.FileAttribute;
[Ljava.security.CryptoPrimitive;
[Ljava.security.Provider;
@@ -239,6 +264,12 @@
[Ljava.util.concurrent.TimeUnit;
[Ljava.util.logging.Handler;
[Ljava.util.regex.Pattern;
+[Ljava.util.stream.StreamOpFlag$Type;
+[Ljava.util.stream.StreamOpFlag;
+[Ljava.util.stream.StreamShape;
+[Ljavax.crypto.Cipher$InitType;
+[Ljavax.crypto.Cipher$NeedToSet;
+[Ljavax.microedition.khronos.egl.EGLConfig;
[Ljavax.net.ssl.KeyManager;
[Ljavax.net.ssl.TrustManager;
[Ljavax.security.cert.X509Certificate;
@@ -249,6 +280,7 @@
[Lorg.apache.http.Header;
[Lorg.json.JSONStringer$Scope;
[Lorg.kxml2.io.KXmlParser$ValueContext;
+[Lsun.invoke.util.Wrapper;
[Lsun.misc.FDBigInteger;
[Lsun.misc.FormattedFloatingDecimal$Form;
[Lsun.security.jca.ProviderConfig;
@@ -256,7 +288,7 @@
[Lsun.security.pkcs.SignerInfo;
[Lsun.security.util.DerOutputStream;
[Lsun.security.util.DerValue;
-[Lsun.security.util.DisabledAlgorithmConstraints$KeySizeConstraint$Operator;
+[Lsun.security.util.DisabledAlgorithmConstraints$Constraint$Operator;
[Lsun.security.util.ObjectIdentifier;
[Lsun.security.x509.AVA;
[Lsun.security.x509.RDN;
@@ -270,18 +302,25 @@
[[Ljava.lang.Object;
[[Ljava.lang.String;
[[Ljava.lang.annotation.Annotation;
-[[[I
android.R$styleable
android.accounts.Account
android.accounts.Account$1
android.accounts.AccountManager
android.accounts.AccountManager$1
+android.accounts.AccountManager$19
+android.accounts.AccountManager$BaseFutureTask
+android.accounts.AccountManager$BaseFutureTask$1
+android.accounts.AccountManager$BaseFutureTask$Response
+android.accounts.AccountManager$Future2Task
+android.accounts.AccountManagerCallback
android.accounts.AccountManagerFuture
android.accounts.AccountsException
android.accounts.AuthenticatorException
android.accounts.IAccountManager
android.accounts.IAccountManager$Stub
android.accounts.IAccountManager$Stub$Proxy
+android.accounts.IAccountManagerResponse
+android.accounts.IAccountManagerResponse$Stub
android.accounts.OnAccountsUpdateListener
android.accounts.OperationCanceledException
android.animation.AnimationHandler
@@ -303,7 +342,6 @@
android.animation.AnimatorSet$Builder
android.animation.AnimatorSet$Node
android.animation.AnimatorSet$SeekState
-android.animation.ArgbEvaluator
android.animation.FloatEvaluator
android.animation.FloatKeyframeSet
android.animation.IntEvaluator
@@ -311,7 +349,6 @@
android.animation.Keyframe
android.animation.Keyframe$FloatKeyframe
android.animation.Keyframe$IntKeyframe
-android.animation.Keyframe$ObjectKeyframe
android.animation.KeyframeSet
android.animation.Keyframes
android.animation.Keyframes$FloatKeyframes
@@ -335,17 +372,23 @@
android.animation.TypeEvaluator
android.animation.ValueAnimator
android.animation.ValueAnimator$AnimatorUpdateListener
-android.app.-$Lambda$36$c44uHH2WE4sJvw5tZZB6gRzEaHI
-android.app.-$Lambda$39$c44uHH2WE4sJvw5tZZB6gRzEaHI
-android.app.-$Lambda$7$u_rp3dnwvfyMTggc6hVftcuYJ3E
-android.app.ActionBar
-android.app.ActionBar$LayoutParams
+android.app.-$Lambda$9I5WEMsoBc7l4QrNqZ4wx59yuHU
+android.app.-$Lambda$9I5WEMsoBc7l4QrNqZ4wx59yuHU$1
+android.app.-$Lambda$FilBqgnXJrN9Mgyks1XHeAxzSTk
+android.app.-$Lambda$c44uHH2WE4sJvw5tZZB6gRzEaHI
+android.app.-$Lambda$c44uHH2WE4sJvw5tZZB6gRzEaHI$1
android.app.Activity
android.app.Activity$HostCallbacks
android.app.ActivityManager
android.app.ActivityManager$1
+android.app.ActivityManager$RecentTaskInfo
+android.app.ActivityManager$RecentTaskInfo$1
android.app.ActivityManager$RunningAppProcessInfo
android.app.ActivityManager$RunningAppProcessInfo$1
+android.app.ActivityManager$RunningServiceInfo
+android.app.ActivityManager$RunningServiceInfo$1
+android.app.ActivityManager$RunningTaskInfo
+android.app.ActivityManager$RunningTaskInfo$1
android.app.ActivityManager$StackId
android.app.ActivityManager$TaskDescription
android.app.ActivityManager$TaskDescription$1
@@ -353,8 +396,8 @@
android.app.ActivityThread
android.app.ActivityThread$1
android.app.ActivityThread$2
-android.app.ActivityThread$3
android.app.ActivityThread$ActivityClientRecord
+android.app.ActivityThread$ActivityConfigChangeData
android.app.ActivityThread$AppBindData
android.app.ActivityThread$ApplicationThread
android.app.ActivityThread$BindServiceData
@@ -374,38 +417,31 @@
android.app.ActivityThread$StopInfo
android.app.ActivityTransitionState
android.app.AlertDialog
-android.app.AlertDialog$Builder
android.app.AppGlobals
android.app.AppOpsManager
+android.app.AppOpsManager$OnOpChangedListener
android.app.Application
android.app.Application$ActivityLifecycleCallbacks
android.app.ApplicationErrorReport$CrashInfo
android.app.ApplicationLoaders
android.app.ApplicationPackageManager
+android.app.ApplicationPackageManager$OnPermissionsChangeListenerDelegate
android.app.ApplicationPackageManager$ResourceName
-android.app.BackStackRecord
-android.app.BackStackRecord$Op
android.app.ContentProviderHolder
android.app.ContentProviderHolder$1
android.app.ContextImpl
android.app.ContextImpl$ApplicationContentResolver
+android.app.DexLoadReporter
android.app.Dialog
android.app.Dialog$ListenersHandler
-android.app.DialogFragment
android.app.DownloadManager
android.app.Fragment
-android.app.Fragment$1
android.app.FragmentContainer
android.app.FragmentController
android.app.FragmentHostCallback
android.app.FragmentManager
-android.app.FragmentManager$BackStackEntry
android.app.FragmentManagerImpl
android.app.FragmentManagerImpl$1
-android.app.FragmentManagerImpl$OpGenerator
-android.app.FragmentTransaction
-android.app.FragmentTransition
-android.app.FragmentTransition$FragmentContainerTransition
android.app.IActivityManager
android.app.IActivityManager$Stub
android.app.IActivityManager$Stub$Proxy
@@ -426,14 +462,19 @@
android.app.IUiModeManager
android.app.IUiModeManager$Stub
android.app.IUiModeManager$Stub$Proxy
+android.app.IUserSwitchObserver
+android.app.IUserSwitchObserver$Stub
+android.app.IWallpaperManager
+android.app.IWallpaperManager$Stub
+android.app.IWallpaperManagerCallback
+android.app.IWallpaperManagerCallback$Stub
android.app.Instrumentation
android.app.IntentReceiverLeaked
android.app.IntentService
android.app.IntentService$ServiceHandler
+android.app.JobSchedulerImpl
android.app.KeyguardManager
-android.app.ListActivity
android.app.LoadedApk
-android.app.LoadedApk$DexLoadReporter
android.app.LoadedApk$ReceiverDispatcher
android.app.LoadedApk$ReceiverDispatcher$Args
android.app.LoadedApk$ReceiverDispatcher$InnerReceiver
@@ -447,10 +488,24 @@
android.app.LoaderManagerImpl
android.app.NativeActivity
android.app.Notification
+android.app.Notification$1
android.app.Notification$Action
+android.app.Notification$Action$1
+android.app.Notification$BigPictureStyle
android.app.Notification$BigTextStyle
android.app.Notification$Builder
+android.app.Notification$BuilderRemoteViews
+android.app.Notification$DecoratedCustomViewStyle
+android.app.Notification$DecoratedMediaCustomViewStyle
+android.app.Notification$InboxStyle
+android.app.Notification$MediaStyle
+android.app.Notification$MessagingStyle
+android.app.Notification$StandardTemplateParams
android.app.Notification$Style
+android.app.NotificationChannel
+android.app.NotificationChannel$1
+android.app.NotificationChannelGroup
+android.app.NotificationChannelGroup$1
android.app.NotificationManager
android.app.PendingIntent
android.app.PendingIntent$1
@@ -459,6 +514,7 @@
android.app.QueuedWork
android.app.QueuedWork$QueuedWorkHandler
android.app.ReceiverRestrictedContext
+android.app.RemoteInput
android.app.ResourcesManager
android.app.ResourcesManager$1
android.app.ResourcesManager$ActivityResources
@@ -466,6 +522,8 @@
android.app.ResultInfo$1
android.app.Service
android.app.ServiceConnectionLeaked
+android.app.ServiceStartArgs
+android.app.ServiceStartArgs$1
android.app.SharedElementCallback
android.app.SharedElementCallback$1
android.app.SharedPreferencesImpl
@@ -555,12 +613,17 @@
android.app.SystemServiceRegistry$78
android.app.SystemServiceRegistry$79
android.app.SystemServiceRegistry$8
+android.app.SystemServiceRegistry$80
+android.app.SystemServiceRegistry$81
+android.app.SystemServiceRegistry$82
android.app.SystemServiceRegistry$9
android.app.SystemServiceRegistry$CachedServiceFetcher
android.app.SystemServiceRegistry$ServiceFetcher
android.app.SystemServiceRegistry$StaticApplicationContextServiceFetcher
android.app.SystemServiceRegistry$StaticServiceFetcher
android.app.UiModeManager
+android.app.UserSwitchObserver
+android.app.VrManager
android.app.WallpaperManager
android.app.admin.DevicePolicyManager
android.app.admin.IDevicePolicyManager
@@ -569,6 +632,7 @@
android.app.admin.SecurityLog
android.app.admin.SecurityLog$SecurityEvent
android.app.admin.SecurityLog$SecurityEvent$1
+android.app.backup.BackupAgent
android.app.backup.BackupDataInput
android.app.backup.BackupDataInput$EntityHeader
android.app.backup.BackupDataOutput
@@ -578,33 +642,82 @@
android.app.backup.FileBackupHelperBase
android.app.backup.FullBackup
android.app.backup.FullBackupDataOutput
+android.app.backup.IBackupManager
+android.app.backup.IBackupManager$Stub
+android.app.backup.IBackupManager$Stub$Proxy
+android.app.job.IJobCallback
+android.app.job.IJobCallback$Stub
+android.app.job.IJobCallback$Stub$Proxy
+android.app.job.IJobScheduler
+android.app.job.IJobScheduler$Stub
+android.app.job.IJobScheduler$Stub$Proxy
+android.app.job.IJobService
+android.app.job.IJobService$Stub
android.app.job.JobInfo
+android.app.job.JobInfo$1
+android.app.job.JobInfo$Builder
+android.app.job.JobInfo$TriggerContentUri
+android.app.job.JobInfo$TriggerContentUri$1
+android.app.job.JobParameters
+android.app.job.JobParameters$1
android.app.job.JobScheduler
android.app.job.JobService
+android.app.job.JobService$1
+android.app.job.JobServiceEngine
+android.app.job.JobServiceEngine$JobHandler
+android.app.job.JobServiceEngine$JobInterface
android.app.trust.ITrustManager
android.app.trust.ITrustManager$Stub
android.app.trust.ITrustManager$Stub$Proxy
android.app.trust.TrustManager
+android.app.usage.IUsageStatsManager
+android.app.usage.IUsageStatsManager$Stub
android.app.usage.NetworkStatsManager
android.app.usage.StorageStatsManager
+android.app.usage.UsageEvents
+android.app.usage.UsageEvents$1
android.app.usage.UsageStatsManager
android.appwidget.AppWidgetManager
+android.appwidget.AppWidgetProvider
+android.bluetooth.BluetoothActivityEnergyInfo
android.bluetooth.BluetoothAdapter
android.bluetooth.BluetoothAdapter$1
+android.bluetooth.BluetoothDevice
+android.bluetooth.BluetoothDevice$1
+android.bluetooth.BluetoothDevice$2
+android.bluetooth.BluetoothHeadset
+android.bluetooth.BluetoothHeadset$1
+android.bluetooth.BluetoothHeadset$2
+android.bluetooth.BluetoothHeadset$3
android.bluetooth.BluetoothManager
+android.bluetooth.BluetoothProfile
+android.bluetooth.BluetoothProfile$ServiceListener
android.bluetooth.IBluetooth
android.bluetooth.IBluetooth$Stub
android.bluetooth.IBluetooth$Stub$Proxy
+android.bluetooth.IBluetoothA2dp
+android.bluetooth.IBluetoothA2dp$Stub
+android.bluetooth.IBluetoothGatt
+android.bluetooth.IBluetoothGatt$Stub
+android.bluetooth.IBluetoothHeadset
+android.bluetooth.IBluetoothHeadset$Stub
+android.bluetooth.IBluetoothHeadset$Stub$Proxy
android.bluetooth.IBluetoothManager
android.bluetooth.IBluetoothManager$Stub
android.bluetooth.IBluetoothManager$Stub$Proxy
android.bluetooth.IBluetoothManagerCallback
android.bluetooth.IBluetoothManagerCallback$Stub
+android.bluetooth.IBluetoothProfileServiceConnection
+android.bluetooth.IBluetoothProfileServiceConnection$Stub
+android.bluetooth.IBluetoothStateChangeCallback
+android.bluetooth.IBluetoothStateChangeCallback$Stub
+android.companion.CompanionDeviceManager
+android.content.AbstractThreadedSyncAdapter
+android.content.AbstractThreadedSyncAdapter$ISyncAdapterImpl
android.content.ActivityNotFoundException
android.content.BroadcastReceiver
android.content.BroadcastReceiver$PendingResult
android.content.BroadcastReceiver$PendingResult$1
-android.content.ClipData
android.content.ClipboardManager
android.content.ComponentCallbacks
android.content.ComponentCallbacks2
@@ -614,12 +727,10 @@
android.content.ContentProvider$Transport
android.content.ContentProviderClient
android.content.ContentProviderNative
-android.content.ContentProviderOperation
android.content.ContentProviderProxy
android.content.ContentProviderResult
android.content.ContentResolver
android.content.ContentResolver$CursorWrapperInner
-android.content.ContentResolver$ParcelFileDescriptorInner
android.content.ContentUris
android.content.ContentValues
android.content.ContentValues$1
@@ -638,8 +749,13 @@
android.content.IIntentSender
android.content.IIntentSender$Stub
android.content.IIntentSender$Stub$Proxy
+android.content.ISyncAdapter
+android.content.ISyncAdapter$Stub
+android.content.ISyncContext
+android.content.ISyncContext$Stub
android.content.Intent
android.content.Intent$1
+android.content.Intent$FilterComparison
android.content.IntentFilter
android.content.IntentFilter$1
android.content.IntentFilter$MalformedMimeTypeException
@@ -651,6 +767,10 @@
android.content.SharedPreferences
android.content.SharedPreferences$Editor
android.content.SharedPreferences$OnSharedPreferenceChangeListener
+android.content.SyncResult
+android.content.SyncResult$1
+android.content.SyncStats
+android.content.SyncStats$1
android.content.UndoManager
android.content.UndoOwner
android.content.UriMatcher
@@ -658,6 +778,7 @@
android.content.pm.ActivityInfo$1
android.content.pm.ApplicationInfo
android.content.pm.ApplicationInfo$1
+android.content.pm.BaseParceledListSlice
android.content.pm.ComponentInfo
android.content.pm.ConfigurationInfo
android.content.pm.ConfigurationInfo$1
@@ -665,19 +786,24 @@
android.content.pm.FeatureGroupInfo$1
android.content.pm.FeatureInfo
android.content.pm.FeatureInfo$1
+android.content.pm.IOnPermissionsChangeListener
+android.content.pm.IOnPermissionsChangeListener$Stub
+android.content.pm.IPackageInstaller
+android.content.pm.IPackageInstaller$Stub
android.content.pm.IPackageManager
android.content.pm.IPackageManager$Stub
android.content.pm.IPackageManager$Stub$Proxy
+android.content.pm.IShortcutService
+android.content.pm.IShortcutService$Stub
android.content.pm.InstrumentationInfo
android.content.pm.InstrumentationInfo$1
android.content.pm.LauncherApps
android.content.pm.PackageInfo
android.content.pm.PackageInfo$1
-android.content.pm.PackageInstaller
-android.content.pm.PackageInstaller$SessionInfo
android.content.pm.PackageItemInfo
android.content.pm.PackageManager
android.content.pm.PackageManager$NameNotFoundException
+android.content.pm.PackageManager$OnPermissionsChangedListener
android.content.pm.PackageParser$PackageParserException
android.content.pm.ParceledListSlice
android.content.pm.ParceledListSlice$1
@@ -691,6 +817,8 @@
android.content.pm.ResolveInfo$1
android.content.pm.ServiceInfo
android.content.pm.ServiceInfo$1
+android.content.pm.ShortcutInfo
+android.content.pm.ShortcutInfo$1
android.content.pm.ShortcutManager
android.content.pm.Signature
android.content.pm.Signature$1
@@ -703,6 +831,7 @@
android.content.res.ColorStateList
android.content.res.ColorStateList$1
android.content.res.ColorStateList$ColorStateListFactory
+android.content.res.CompatResources
android.content.res.CompatibilityInfo
android.content.res.CompatibilityInfo$1
android.content.res.CompatibilityInfo$2
@@ -764,6 +893,7 @@
android.database.Observable
android.database.SQLException
android.database.sqlite.DatabaseObjectNotClosedException
+android.database.sqlite.SQLiteCantOpenDatabaseException
android.database.sqlite.SQLiteClosable
android.database.sqlite.SQLiteConnection
android.database.sqlite.SQLiteConnection$Operation
@@ -778,13 +908,13 @@
android.database.sqlite.SQLiteCustomFunction
android.database.sqlite.SQLiteDatabase
android.database.sqlite.SQLiteDatabase$1
-android.database.sqlite.SQLiteDatabase$CursorFactory
android.database.sqlite.SQLiteDatabaseConfiguration
android.database.sqlite.SQLiteDatabaseCorruptException
android.database.sqlite.SQLiteDatabaseLockedException
android.database.sqlite.SQLiteDebug
android.database.sqlite.SQLiteDebug$PagerStats
android.database.sqlite.SQLiteDirectCursorDriver
+android.database.sqlite.SQLiteDoneException
android.database.sqlite.SQLiteException
android.database.sqlite.SQLiteGlobal
android.database.sqlite.SQLiteOpenHelper
@@ -795,6 +925,7 @@
android.database.sqlite.SQLiteSession$Transaction
android.database.sqlite.SQLiteStatement
android.database.sqlite.SQLiteStatementInfo
+android.database.sqlite.SQLiteTransactionListener
android.ddm.DdmHandleAppName
android.ddm.DdmHandleExit
android.ddm.DdmHandleHeap
@@ -804,6 +935,13 @@
android.ddm.DdmHandleThread
android.ddm.DdmHandleViewDebug
android.ddm.DdmRegister
+android.graphics.-$Lambda$ZrP-zejiEXAqfwV-MyP5lE9mYC8
+android.graphics.-$Lambda$ZrP-zejiEXAqfwV-MyP5lE9mYC8$1
+android.graphics.-$Lambda$ZrP-zejiEXAqfwV-MyP5lE9mYC8$2
+android.graphics.-$Lambda$ZrP-zejiEXAqfwV-MyP5lE9mYC8$4
+android.graphics.-$Lambda$ZrP-zejiEXAqfwV-MyP5lE9mYC8$6
+android.graphics.-$Lambda$ZrP-zejiEXAqfwV-MyP5lE9mYC8$7
+android.graphics.-$Lambda$ZrP-zejiEXAqfwV-MyP5lE9mYC8$8
android.graphics.BaseCanvas
android.graphics.Bitmap
android.graphics.Bitmap$1
@@ -822,6 +960,13 @@
android.graphics.Color
android.graphics.ColorFilter
android.graphics.ColorMatrixColorFilter
+android.graphics.ColorSpace
+android.graphics.ColorSpace$Lab
+android.graphics.ColorSpace$Model
+android.graphics.ColorSpace$Named
+android.graphics.ColorSpace$Rgb
+android.graphics.ColorSpace$Rgb$TransferParameters
+android.graphics.ColorSpace$Xyz
android.graphics.ComposePathEffect
android.graphics.ComposeShader
android.graphics.CornerPathEffect
@@ -863,7 +1008,6 @@
android.graphics.PathEffect
android.graphics.PathMeasure
android.graphics.Picture
-android.graphics.PixelFormat
android.graphics.Point
android.graphics.Point$1
android.graphics.PointF
@@ -891,6 +1035,7 @@
android.graphics.Typeface
android.graphics.Xfermode
android.graphics.YuvImage
+android.graphics.drawable.AdaptiveIconDrawable
android.graphics.drawable.Animatable
android.graphics.drawable.Animatable2
android.graphics.drawable.AnimatedStateListDrawable
@@ -923,6 +1068,7 @@
android.graphics.drawable.Icon$1
android.graphics.drawable.InsetDrawable
android.graphics.drawable.InsetDrawable$InsetState
+android.graphics.drawable.InsetDrawable$InsetValue
android.graphics.drawable.LayerDrawable
android.graphics.drawable.LayerDrawable$ChildDrawable
android.graphics.drawable.LayerDrawable$LayerState
@@ -948,6 +1094,7 @@
android.graphics.drawable.StateListDrawable
android.graphics.drawable.StateListDrawable$StateListState
android.graphics.drawable.TransitionDrawable
+android.graphics.drawable.TransitionDrawable$TransitionState
android.graphics.drawable.VectorDrawable
android.graphics.drawable.VectorDrawable$VFullPath
android.graphics.drawable.VectorDrawable$VFullPath$1
@@ -978,6 +1125,7 @@
android.graphics.drawable.shapes.OvalShape
android.graphics.drawable.shapes.RectShape
android.graphics.drawable.shapes.Shape
+android.graphics.fonts.FontVariationAxis
android.graphics.pdf.PdfDocument
android.graphics.pdf.PdfEditor
android.graphics.pdf.PdfRenderer
@@ -987,6 +1135,9 @@
android.hardware.ConsumerIrManager
android.hardware.HardwareBuffer
android.hardware.HardwareBuffer$1
+android.hardware.ICameraService
+android.hardware.ICameraService$Stub
+android.hardware.ICameraService$Stub$Proxy
android.hardware.Sensor
android.hardware.SensorEvent
android.hardware.SensorEventListener
@@ -995,14 +1146,88 @@
android.hardware.SerialPort
android.hardware.SystemSensorManager
android.hardware.SystemSensorManager$BaseEventQueue
+android.hardware.SystemSensorManager$SensorEventQueue
+android.hardware.camera2.CameraAccessException
+android.hardware.camera2.CameraCharacteristics
+android.hardware.camera2.CameraCharacteristics$1
+android.hardware.camera2.CameraCharacteristics$2
+android.hardware.camera2.CameraCharacteristics$3
+android.hardware.camera2.CameraCharacteristics$4
+android.hardware.camera2.CameraCharacteristics$5
android.hardware.camera2.CameraCharacteristics$Key
android.hardware.camera2.CameraManager
+android.hardware.camera2.CameraMetadata
+android.hardware.camera2.CaptureRequest
+android.hardware.camera2.CaptureRequest$1
+android.hardware.camera2.CaptureRequest$2
android.hardware.camera2.CaptureRequest$Key
+android.hardware.camera2.CaptureResult
+android.hardware.camera2.CaptureResult$1
+android.hardware.camera2.CaptureResult$2
+android.hardware.camera2.CaptureResult$3
android.hardware.camera2.CaptureResult$Key
android.hardware.camera2.DngCreator
android.hardware.camera2.impl.CameraMetadataNative
+android.hardware.camera2.impl.CameraMetadataNative$1
+android.hardware.camera2.impl.CameraMetadataNative$10
+android.hardware.camera2.impl.CameraMetadataNative$11
+android.hardware.camera2.impl.CameraMetadataNative$12
+android.hardware.camera2.impl.CameraMetadataNative$13
+android.hardware.camera2.impl.CameraMetadataNative$14
+android.hardware.camera2.impl.CameraMetadataNative$15
+android.hardware.camera2.impl.CameraMetadataNative$16
+android.hardware.camera2.impl.CameraMetadataNative$17
+android.hardware.camera2.impl.CameraMetadataNative$18
+android.hardware.camera2.impl.CameraMetadataNative$19
+android.hardware.camera2.impl.CameraMetadataNative$2
+android.hardware.camera2.impl.CameraMetadataNative$3
+android.hardware.camera2.impl.CameraMetadataNative$4
+android.hardware.camera2.impl.CameraMetadataNative$5
+android.hardware.camera2.impl.CameraMetadataNative$6
+android.hardware.camera2.impl.CameraMetadataNative$7
+android.hardware.camera2.impl.CameraMetadataNative$8
+android.hardware.camera2.impl.CameraMetadataNative$9
+android.hardware.camera2.impl.CameraMetadataNative$Key
+android.hardware.camera2.impl.GetCommand
+android.hardware.camera2.impl.SetCommand
android.hardware.camera2.legacy.LegacyCameraDevice
android.hardware.camera2.legacy.PerfMeasurement
+android.hardware.camera2.marshal.MarshalQueryable
+android.hardware.camera2.marshal.MarshalRegistry
+android.hardware.camera2.marshal.impl.MarshalQueryableArray
+android.hardware.camera2.marshal.impl.MarshalQueryableBlackLevelPattern
+android.hardware.camera2.marshal.impl.MarshalQueryableBoolean
+android.hardware.camera2.marshal.impl.MarshalQueryableColorSpaceTransform
+android.hardware.camera2.marshal.impl.MarshalQueryableEnum
+android.hardware.camera2.marshal.impl.MarshalQueryableHighSpeedVideoConfiguration
+android.hardware.camera2.marshal.impl.MarshalQueryableMeteringRectangle
+android.hardware.camera2.marshal.impl.MarshalQueryableNativeByteToInteger
+android.hardware.camera2.marshal.impl.MarshalQueryablePair
+android.hardware.camera2.marshal.impl.MarshalQueryableParcelable
+android.hardware.camera2.marshal.impl.MarshalQueryablePrimitive
+android.hardware.camera2.marshal.impl.MarshalQueryableRange
+android.hardware.camera2.marshal.impl.MarshalQueryableRect
+android.hardware.camera2.marshal.impl.MarshalQueryableReprocessFormatsMap
+android.hardware.camera2.marshal.impl.MarshalQueryableRggbChannelVector
+android.hardware.camera2.marshal.impl.MarshalQueryableSize
+android.hardware.camera2.marshal.impl.MarshalQueryableSizeF
+android.hardware.camera2.marshal.impl.MarshalQueryableStreamConfiguration
+android.hardware.camera2.marshal.impl.MarshalQueryableStreamConfigurationDuration
+android.hardware.camera2.marshal.impl.MarshalQueryableString
+android.hardware.camera2.params.BlackLevelPattern
+android.hardware.camera2.params.ColorSpaceTransform
+android.hardware.camera2.params.Face
+android.hardware.camera2.params.HighSpeedVideoConfiguration
+android.hardware.camera2.params.LensShadingMap
+android.hardware.camera2.params.MeteringRectangle
+android.hardware.camera2.params.ReprocessFormatsMap
+android.hardware.camera2.params.RggbChannelVector
+android.hardware.camera2.params.StreamConfiguration
+android.hardware.camera2.params.StreamConfigurationDuration
+android.hardware.camera2.params.StreamConfigurationMap
+android.hardware.camera2.params.TonemapCurve
+android.hardware.camera2.utils.TypeReference
+android.hardware.camera2.utils.TypeReference$SpecializedTypeReference
android.hardware.display.DisplayManager
android.hardware.display.DisplayManager$DisplayListener
android.hardware.display.DisplayManagerGlobal
@@ -1083,8 +1308,8 @@
android.icu.impl.CacheValue$NullValue
android.icu.impl.CacheValue$SoftValue
android.icu.impl.CacheValue$Strength
-android.icu.impl.CalendarUtil
-android.icu.impl.CalendarUtil$CalendarPreferences
+android.icu.impl.CaseMapImpl
+android.icu.impl.CaseMapImpl$StringContextIterator
android.icu.impl.CharTrie
android.icu.impl.ClassLoaderUtil
android.icu.impl.CurrencyData
@@ -1130,7 +1355,6 @@
android.icu.impl.ICUResourceBundleImpl$ResourceArray
android.icu.impl.ICUResourceBundleImpl$ResourceContainer
android.icu.impl.ICUResourceBundleImpl$ResourceInt
-android.icu.impl.ICUResourceBundleImpl$ResourceIntVector
android.icu.impl.ICUResourceBundleImpl$ResourceString
android.icu.impl.ICUResourceBundleImpl$ResourceTable
android.icu.impl.ICUResourceBundleReader
@@ -1172,7 +1396,6 @@
android.icu.impl.ReplaceableUCharacterIterator
android.icu.impl.RuleCharacterIterator
android.icu.impl.SimpleCache
-android.icu.impl.SimpleFormatterImpl
android.icu.impl.SoftCache
android.icu.impl.StandardPlural
android.icu.impl.StringPrepDataReader
@@ -1189,6 +1412,9 @@
android.icu.impl.Trie2_16
android.icu.impl.UBiDiProps
android.icu.impl.UBiDiProps$IsAcceptable
+android.icu.impl.UCaseProps
+android.icu.impl.UCaseProps$ContextIterator
+android.icu.impl.UCaseProps$IsAcceptable
android.icu.impl.UCharacterProperty
android.icu.impl.UCharacterProperty$1
android.icu.impl.UCharacterProperty$10
@@ -1246,15 +1472,12 @@
android.icu.text.BreakIteratorFactory
android.icu.text.BreakIteratorFactory$BFService
android.icu.text.BreakIteratorFactory$BFService$1RBBreakIteratorFactory
+android.icu.text.CaseMap
+android.icu.text.CaseMap$Upper
android.icu.text.CurrencyDisplayNames
android.icu.text.CurrencyMetaInfo
android.icu.text.CurrencyMetaInfo$CurrencyDigits
android.icu.text.CurrencyMetaInfo$CurrencyFilter
-android.icu.text.DateFormatSymbols
-android.icu.text.DateFormatSymbols$1
-android.icu.text.DateFormatSymbols$CalendarDataSink
-android.icu.text.DateFormatSymbols$CalendarDataSink$AliasType
-android.icu.text.DateFormatSymbols$CapitalizationContextUsage
android.icu.text.DecimalFormat
android.icu.text.DecimalFormat$Unit
android.icu.text.DecimalFormatSymbols
@@ -1322,7 +1545,6 @@
android.icu.text.UnicodeFilter
android.icu.text.UnicodeMatcher
android.icu.text.UnicodeSet
-android.icu.util.BytesTrie$Result
android.icu.util.Currency
android.icu.util.Currency$1
android.icu.util.Currency$CurrencyUsage
@@ -1344,14 +1566,30 @@
android.icu.util.ULocale$Type
android.icu.util.UResourceBundle
android.icu.util.UResourceBundle$RootType
-android.icu.util.UResourceBundleIterator
android.icu.util.UResourceTypeMismatchException
android.icu.util.VersionInfo
+android.location.BatchedLocationCallbackTransport
+android.location.BatchedLocationCallbackTransport$CallbackTransport
android.location.CountryDetector
+android.location.GnssMeasurementCallbackTransport
+android.location.GnssMeasurementCallbackTransport$ListenerTransport
+android.location.GnssNavigationMessageCallbackTransport
+android.location.GnssNavigationMessageCallbackTransport$ListenerTransport
+android.location.IBatchedLocationCallback
+android.location.IBatchedLocationCallback$Stub
+android.location.IGnssMeasurementsListener
+android.location.IGnssMeasurementsListener$Stub
+android.location.IGnssNavigationMessageListener
+android.location.IGnssNavigationMessageListener$Stub
+android.location.ILocationManager
+android.location.ILocationManager$Stub
+android.location.ILocationManager$Stub$Proxy
+android.location.LocalListenerHelper
android.location.Location
-android.location.Location$1
-android.location.Location$2
+android.location.LocationListener
android.location.LocationManager
+android.location.LocationRequest
+android.location.LocationRequest$1
android.media.AudioAttributes
android.media.AudioAttributes$1
android.media.AudioAttributes$Builder
@@ -1396,6 +1634,8 @@
android.media.IPlayer$Stub
android.media.IRecordingConfigDispatcher
android.media.IRecordingConfigDispatcher$Stub
+android.media.IRingtonePlayer
+android.media.IRingtonePlayer$Stub
android.media.Image
android.media.ImageReader
android.media.ImageReader$SurfaceImage
@@ -1403,11 +1643,9 @@
android.media.ImageWriter$WriterSurfaceImage
android.media.JetPlayer
android.media.MediaCodec
-android.media.MediaCodecInfo
-android.media.MediaCodecInfo$CodecCapabilities
-android.media.MediaCodecInfo$CodecProfileLevel
android.media.MediaCodecList
android.media.MediaCrypto
+android.media.MediaDescrambler
android.media.MediaDrm
android.media.MediaExtractor
android.media.MediaFormat
@@ -1415,7 +1653,6 @@
android.media.MediaMetadataRetriever
android.media.MediaMuxer
android.media.MediaPlayer
-android.media.MediaPlayer$OnCompletionListener
android.media.MediaRecorder
android.media.MediaRouter
android.media.MediaScanner
@@ -1423,23 +1660,49 @@
android.media.PlaybackParams
android.media.PlaybackParams$1
android.media.PlayerBase
-android.media.PlayerBase$1
-android.media.PlayerBase$2
+android.media.PlayerBase$IAppOpsCallbackWrapper
+android.media.PlayerBase$IPlayerWrapper
android.media.PlayerBase$PlayerIdCard
android.media.PlayerBase$PlayerIdCard$1
android.media.RemoteDisplay
android.media.ResampleInputStream
+android.media.SoundPool
android.media.SubtitleController$Listener
android.media.ToneGenerator
+android.media.VolumeAutomation
+android.media.VolumeShaper$Configuration
+android.media.VolumeShaper$Configuration$1
+android.media.VolumeShaper$Configuration$Builder
+android.media.VolumeShaper$Operation
+android.media.VolumeShaper$Operation$1
+android.media.VolumeShaper$Operation$Builder
+android.media.VolumeShaper$State
+android.media.VolumeShaper$State$1
android.media.audiopolicy.AudioMix
android.media.audiopolicy.AudioMixingRule
android.media.audiopolicy.AudioMixingRule$AudioMixMatchCriterion
android.media.midi.MidiManager
android.media.projection.MediaProjectionManager
+android.media.session.IActiveSessionsListener
+android.media.session.IActiveSessionsListener$Stub
+android.media.session.ISessionController
+android.media.session.ISessionController$Stub
+android.media.session.ISessionControllerCallback
+android.media.session.ISessionControllerCallback$Stub
+android.media.session.ISessionManager
+android.media.session.ISessionManager$Stub
+android.media.session.MediaController
+android.media.session.MediaController$CallbackStub
+android.media.session.MediaController$TransportControls
+android.media.session.MediaSession$Token
+android.media.session.MediaSession$Token$1
android.media.session.MediaSessionManager
+android.media.session.PlaybackState
+android.media.session.PlaybackState$1
+android.media.session.PlaybackState$CustomAction
+android.media.session.PlaybackState$CustomAction$1
android.media.soundtrigger.SoundTriggerManager
android.media.tv.TvInputManager
-android.metrics.LogMaker
android.mtp.MtpDatabase
android.mtp.MtpDevice
android.mtp.MtpDeviceInfo
@@ -1454,21 +1717,36 @@
android.net.ConnectivityManager$CallbackHandler
android.net.ConnectivityManager$NetworkCallback
android.net.ConnectivityThread
-# Must not be initialized, creates a thread.
-# android.net.ConnectivityThread$Singleton
android.net.Credentials
+android.net.DhcpInfo
+android.net.DhcpInfo$1
android.net.EthernetManager
android.net.IConnectivityManager
android.net.IConnectivityManager$Stub
android.net.IConnectivityManager$Stub$Proxy
+android.net.INetworkPolicyManager
+android.net.INetworkPolicyManager$Stub
+android.net.INetworkScoreService
+android.net.INetworkScoreService$Stub
+android.net.INetworkScoreService$Stub$Proxy
+android.net.INetworkStatsService
+android.net.INetworkStatsService$Stub
+android.net.INetworkStatsService$Stub$Proxy
+android.net.IpConfiguration
+android.net.IpConfiguration$1
+android.net.IpConfiguration$IpAssignment
+android.net.IpConfiguration$ProxySettings
android.net.IpPrefix
android.net.IpPrefix$1
+android.net.IpSecManager
android.net.LinkAddress
android.net.LinkAddress$1
android.net.LinkProperties
android.net.LinkProperties$1
android.net.LocalServerSocket
android.net.LocalSocket
+android.net.LocalSocketAddress
+android.net.LocalSocketAddress$Namespace
android.net.LocalSocketImpl
android.net.LocalSocketImpl$SocketInputStream
android.net.LocalSocketImpl$SocketOutputStream
@@ -1476,16 +1754,20 @@
android.net.Network$1
android.net.NetworkCapabilities
android.net.NetworkCapabilities$1
+android.net.NetworkFactory
android.net.NetworkInfo
android.net.NetworkInfo$1
android.net.NetworkInfo$DetailedState
android.net.NetworkInfo$State
+android.net.NetworkKey
+android.net.NetworkKey$1
android.net.NetworkPolicyManager
android.net.NetworkRequest
android.net.NetworkRequest$1
android.net.NetworkRequest$Builder
android.net.NetworkRequest$Type
android.net.NetworkScoreManager
+android.net.NetworkSpecifier
android.net.NetworkStats
android.net.NetworkStats$1
android.net.NetworkUtils
@@ -1493,6 +1775,14 @@
android.net.ProxyInfo
android.net.RouteInfo
android.net.RouteInfo$1
+android.net.RssiCurve
+android.net.RssiCurve$1
+android.net.SSLCertificateSocketFactory
+android.net.SSLCertificateSocketFactory$1
+android.net.SSLSessionCache
+android.net.ScoredNetwork
+android.net.ScoredNetwork$1
+android.net.StaticIpConfiguration
android.net.TrafficStats
android.net.Uri
android.net.Uri$1
@@ -1507,23 +1797,33 @@
android.net.Uri$PathSegments
android.net.Uri$PathSegmentsBuilder
android.net.Uri$StringUri
+android.net.WifiKey
+android.net.WifiKey$1
android.net.nsd.NsdManager
android.net.wifi.IWifiManager
android.net.wifi.IWifiManager$Stub
android.net.wifi.IWifiManager$Stub$Proxy
+android.net.wifi.ParcelUtil
android.net.wifi.RttManager
+android.net.wifi.ScanResult
+android.net.wifi.ScanResult$1
+android.net.wifi.ScanResult$InformationElement
android.net.wifi.SupplicantState
android.net.wifi.SupplicantState$1
+android.net.wifi.WifiConfiguration
+android.net.wifi.WifiConfiguration$1
+android.net.wifi.WifiConfiguration$NetworkSelectionStatus
+android.net.wifi.WifiEnterpriseConfig
+android.net.wifi.WifiEnterpriseConfig$1
android.net.wifi.WifiInfo
android.net.wifi.WifiInfo$1
android.net.wifi.WifiManager
+android.net.wifi.WifiManager$WifiLock
android.net.wifi.WifiScanner
android.net.wifi.WifiSsid
android.net.wifi.WifiSsid$1
android.net.wifi.aware.WifiAwareManager
android.net.wifi.p2p.WifiP2pManager
-android.nfc.INfcAdapter
-android.nfc.INfcAdapter$Stub
android.nfc.NfcManager
android.opengl.EGL14
android.opengl.EGLConfig
@@ -1545,7 +1845,8 @@
android.opengl.GLUtils
android.opengl.Matrix
android.opengl.Visibility
-android.os.-$Lambda$5$6x30vPJhBKUfNY8tswxuZo3DCe0
+android.os.-$Lambda$6x30vPJhBKUfNY8tswxuZo3DCe0
+android.os.AsyncResult
android.os.AsyncTask$1
android.os.AsyncTask$2
android.os.AsyncTask$3
@@ -1590,10 +1891,15 @@
android.os.HwBlob
android.os.HwParcel
android.os.HwRemoteBinder
+android.os.IBatteryPropertiesRegistrar
+android.os.IBatteryPropertiesRegistrar$Stub
+android.os.IBatteryPropertiesRegistrar$Stub$Proxy
android.os.IBinder
android.os.IBinder$DeathRecipient
android.os.ICancellationSignal
android.os.ICancellationSignal$Stub
+android.os.IDeviceIdleController
+android.os.IDeviceIdleController$Stub
android.os.IHwBinder
android.os.IInterface
android.os.IMessenger
@@ -1605,6 +1911,7 @@
android.os.IPowerManager
android.os.IPowerManager$Stub
android.os.IPowerManager$Stub$Proxy
+android.os.IRemoteCallback
android.os.IServiceManager
android.os.IUserManager
android.os.IUserManager$Stub
@@ -1627,12 +1934,12 @@
android.os.Parcel$1
android.os.ParcelFileDescriptor
android.os.ParcelFileDescriptor$1
-android.os.ParcelFileDescriptor$AutoCloseInputStream
+android.os.ParcelUuid
+android.os.ParcelUuid$1
android.os.Parcelable
android.os.Parcelable$ClassLoaderCreator
android.os.Parcelable$Creator
-android.os.ParcelableParcel
-android.os.ParcelableParcel$1
+android.os.ParcelableException
android.os.PatternMatcher
android.os.PatternMatcher$1
android.os.PersistableBundle
@@ -1642,9 +1949,12 @@
android.os.PowerManager$WakeLock$1
android.os.Process
android.os.RecoverySystem
+android.os.Registrant
+android.os.RemoteCallbackList
android.os.RemoteException
android.os.ResultReceiver
android.os.SELinux
+android.os.Seccomp
android.os.ServiceManager
android.os.ServiceManager$ServiceNotFoundException
android.os.ServiceManagerNative
@@ -1685,43 +1995,52 @@
android.os.Trace
android.os.Trace$1
android.os.UEventObserver
+android.os.UpdateLock
android.os.UserHandle
android.os.UserHandle$1
android.os.UserManager
android.os.Vibrator
+android.os.VintfObject
+android.os.VintfRuntimeInfo
+android.os.WorkSource
+android.os.WorkSource$1
android.os.ZygoteProcess
android.os.ZygoteStartFailedEx
android.os.health.SystemHealthManager
+android.os.storage.IObbActionListener
+android.os.storage.IObbActionListener$Stub
android.os.storage.IStorageManager
android.os.storage.IStorageManager$Stub
android.os.storage.IStorageManager$Stub$Proxy
android.os.storage.StorageManager
+android.os.storage.StorageManager$ObbActionListener
android.os.storage.StorageVolume
android.os.storage.StorageVolume$1
-android.preference.PreferenceActivity
-android.preference.PreferenceFragment$OnPreferenceStartFragmentCallback
android.preference.PreferenceManager
-android.preference.PreferenceManager$OnPreferenceTreeClickListener
android.print.PrintManager
-android.provider.-$Lambda$46$87WmhkvObehVg0OMBzwa_MTVV8g
+android.provider.-$Lambda$87WmhkvObehVg0OMBzwa_MTVV8g
+android.provider.-$Lambda$a7Jyr6j_Mb70hHJ2ssL1AAhKh4c
android.provider.BaseColumns
+android.provider.CalendarContract$CalendarColumns
+android.provider.CalendarContract$CalendarSyncColumns
+android.provider.CalendarContract$EventsColumns
+android.provider.CalendarContract$SyncColumns
android.provider.ContactsContract
android.provider.ContactsContract$CommonDataKinds$BaseTypes
android.provider.ContactsContract$CommonDataKinds$CommonColumns
-android.provider.ContactsContract$CommonDataKinds$Phone
android.provider.ContactsContract$ContactCounts
android.provider.ContactsContract$ContactNameColumns
android.provider.ContactsContract$ContactOptionsColumns
android.provider.ContactsContract$ContactStatusColumns
-android.provider.ContactsContract$Contacts
android.provider.ContactsContract$ContactsColumns
-android.provider.ContactsContract$Data
android.provider.ContactsContract$DataColumns
android.provider.ContactsContract$DataColumnsWithJoins
android.provider.ContactsContract$DataUsageStatColumns
android.provider.ContactsContract$RawContactsColumns
android.provider.ContactsContract$StatusColumns
-android.provider.MediaStore$MediaColumns
+android.provider.Downloads$Impl
+android.provider.FontsContract
+android.provider.FontsContract$1
android.provider.Settings
android.provider.Settings$ContentProviderHolder
android.provider.Settings$GenerationTracker
@@ -1768,6 +2087,12 @@
android.security.net.config.RootTrustManagerFactorySpi
android.security.net.config.SystemCertificateSource
android.security.net.config.TrustedCertificateStoreAdapter
+android.security.net.config.UserCertificateSource
+android.service.notification.StatusBarNotification
+android.service.oemlock.OemLockManager
+android.service.persistentdata.IPersistentDataBlockService
+android.service.persistentdata.IPersistentDataBlockService$Stub
+android.service.persistentdata.IPersistentDataBlockService$Stub$Proxy
android.service.persistentdata.PersistentDataBlockManager
android.system.ErrnoException
android.system.GaiException
@@ -1791,11 +2116,30 @@
android.system.UnixSocketAddress
android.telecom.TelecomManager
android.telephony.CarrierConfigManager
-android.telephony.PhoneNumberUtils
+android.telephony.CellIdentityWcdma
+android.telephony.CellIdentityWcdma$1
+android.telephony.CellInfo
+android.telephony.CellInfo$1
+android.telephony.CellInfoWcdma
+android.telephony.CellInfoWcdma$1
+android.telephony.CellLocation
+android.telephony.CellSignalStrength
+android.telephony.CellSignalStrengthWcdma
+android.telephony.CellSignalStrengthWcdma$1
android.telephony.PhoneStateListener
+android.telephony.PhoneStateListener$1
+android.telephony.PhoneStateListener$IPhoneStateListenerStub
android.telephony.Rlog
android.telephony.ServiceState
+android.telephony.ServiceState$1
+android.telephony.SignalStrength
+android.telephony.SignalStrength$1
+android.telephony.SubscriptionInfo
+android.telephony.SubscriptionInfo$1
android.telephony.SubscriptionManager
+android.telephony.SubscriptionManager$OnSubscriptionsChangedListener
+android.telephony.SubscriptionManager$OnSubscriptionsChangedListener$1
+android.telephony.SubscriptionManager$OnSubscriptionsChangedListener$2
android.telephony.TelephonyManager
android.telephony.TelephonyManager$MultiSimVariants
android.text.AndroidBidi
@@ -1808,20 +2152,13 @@
android.text.Editable
android.text.Editable$Factory
android.text.FontConfig
-android.text.FontConfig$1
android.text.FontConfig$Alias
-android.text.FontConfig$Alias$1
-android.text.FontConfig$Axis
-android.text.FontConfig$Axis$1
android.text.FontConfig$Family
-android.text.FontConfig$Family$1
android.text.FontConfig$Font
-android.text.FontConfig$Font$1
android.text.GetChars
android.text.GraphicsOperations
-android.text.Html
-android.text.Html$HtmlParser
android.text.Hyphenator
+android.text.Hyphenator$HyphenationData
android.text.InputFilter
android.text.InputType
android.text.Layout
@@ -1862,11 +2199,13 @@
android.text.TextUtils
android.text.TextUtils$1
android.text.TextUtils$EllipsizeCallback
+android.text.TextUtils$SimpleStringSplitter
+android.text.TextUtils$StringSplitter
android.text.TextUtils$TruncateAt
android.text.TextWatcher
-android.text.format.DateFormat
-android.text.format.DateUtils
android.text.format.Time
+android.text.format.Time$TimeCalculator
+android.text.format.TimeFormatter
android.text.method.AllCapsTransformationMethod
android.text.method.ArrowKeyMovementMethod
android.text.method.BaseKeyListener
@@ -1887,9 +2226,7 @@
android.text.method.TransformationMethod2
android.text.style.AlignmentSpan
android.text.style.CharacterStyle
-android.text.style.ClickableSpan
android.text.style.EasyEditSpan
-android.text.style.ForegroundColorSpan
android.text.style.LeadingMarginSpan
android.text.style.LineBackgroundSpan
android.text.style.LineHeightSpan
@@ -1900,7 +2237,6 @@
android.text.style.StyleSpan
android.text.style.SuggestionSpan
android.text.style.TabStopSpan
-android.text.style.URLSpan
android.text.style.UpdateAppearance
android.text.style.UpdateLayout
android.text.style.WrapTogetherSpan
@@ -1923,7 +2259,6 @@
android.transition.PathMotion
android.transition.Transition
android.transition.Transition$1
-android.transition.Transition$EpicenterCallback
android.transition.TransitionInflater
android.transition.TransitionManager
android.transition.TransitionSet
@@ -1935,6 +2270,7 @@
android.util.ArrayMap$1
android.util.ArraySet
android.util.ArraySet$1
+android.util.AtomicFile
android.util.AttributeSet
android.util.Base64
android.util.Base64$Coder
@@ -1951,6 +2287,7 @@
android.util.Log
android.util.Log$1
android.util.Log$ImmediateLogWriter
+android.util.Log$TerribleFailure
android.util.Log$TerribleFailureHandler
android.util.LogPrinter
android.util.LongArray
@@ -1959,16 +2296,20 @@
android.util.LruCache
android.util.MapCollections
android.util.MapCollections$ArrayIterator
+android.util.MapCollections$EntrySet
android.util.MapCollections$KeySet
+android.util.MapCollections$MapIterator
+android.util.MapCollections$ValuesCollection
android.util.MathUtils
android.util.MemoryIntArray
android.util.MemoryIntArray$1
+android.util.MergedConfiguration
+android.util.MergedConfiguration$1
android.util.MutableInt
android.util.MutableLong
android.util.Pair
android.util.PathParser
android.util.PathParser$PathData
-android.util.Patterns
android.util.Pools$Pool
android.util.Pools$SimplePool
android.util.Pools$SynchronizedPool
@@ -1983,13 +2324,19 @@
android.util.SparseArray
android.util.SparseBooleanArray
android.util.SparseIntArray
+android.util.SparseLongArray
android.util.StateSet
android.util.SuperNotCalledException
+android.util.TimeUtils
android.util.TypedValue
android.util.Xml
android.util.jar.StrictJarFile
-android.view.-$Lambda$48$iU_USrtPm1XIm5H9QYQvXfBGDE4
-android.view.-$Lambda$49$iU_USrtPm1XIm5H9QYQvXfBGDE4
+android.view.-$Lambda$6k_RnLLpNi5zg27ubDxN4lDdBbk
+android.view.-$Lambda$6k_RnLLpNi5zg27ubDxN4lDdBbk$1
+android.view.-$Lambda$6k_RnLLpNi5zg27ubDxN4lDdBbk$2
+android.view.-$Lambda$6k_RnLLpNi5zg27ubDxN4lDdBbk$3
+android.view.-$Lambda$iU_USrtPm1XIm5H9QYQvXfBGDE4
+android.view.-$Lambda$iU_USrtPm1XIm5H9QYQvXfBGDE4$1
android.view.AbsSavedState
android.view.AbsSavedState$1
android.view.AbsSavedState$2
@@ -2017,11 +2364,12 @@
android.view.DisplayInfo
android.view.DisplayInfo$1
android.view.DisplayListCanvas
-android.view.DragEvent
android.view.FallbackEventHandler
android.view.FocusFinder
android.view.FocusFinder$1
-android.view.FocusFinder$SequentialFocusComparator
+android.view.FocusFinder$FocusSorter
+android.view.FocusFinder$UserSpecifiedFocusComparator
+android.view.FocusFinder$UserSpecifiedFocusComparator$NextFocusGetter
android.view.FrameInfo
android.view.FrameMetrics
android.view.FrameMetricsObserver
@@ -2039,6 +2387,8 @@
android.view.IGraphicsStats
android.view.IGraphicsStats$Stub
android.view.IGraphicsStats$Stub$Proxy
+android.view.IGraphicsStatsCallback
+android.view.IGraphicsStatsCallback$Stub
android.view.IRotationWatcher
android.view.IRotationWatcher$Stub
android.view.IWindow
@@ -2067,7 +2417,6 @@
android.view.KeyCharacterMap
android.view.KeyCharacterMap$1
android.view.KeyCharacterMap$FallbackAction
-android.view.KeyCharacterMap$KeyData
android.view.KeyEvent
android.view.KeyEvent$1
android.view.KeyEvent$Callback
@@ -2095,7 +2444,6 @@
android.view.RenderNodeAnimator$1
android.view.RenderNodeAnimatorSetHelper
android.view.SearchEvent
-android.view.SoundEffectConstants
android.view.SubMenu
android.view.Surface
android.view.Surface$1
@@ -2103,7 +2451,6 @@
android.view.Surface$OutOfResourcesException
android.view.SurfaceControl
android.view.SurfaceControl$PhysicalDisplayInfo
-android.view.SurfaceHolder
android.view.SurfaceHolder$Callback
android.view.SurfaceHolder$Callback2
android.view.SurfaceSession
@@ -2112,6 +2459,7 @@
android.view.ThreadedRenderer
android.view.ThreadedRenderer$DrawCallbacks
android.view.ThreadedRenderer$ProcessInitializer
+android.view.ThreadedRenderer$ProcessInitializer$1
android.view.VelocityTracker
android.view.VelocityTracker$Estimator
android.view.View
@@ -2151,7 +2499,6 @@
android.view.View$TransformationInfo
android.view.View$UnsetPressedState
android.view.ViewConfiguration
-android.view.ViewDebug$HierarchyHandler
android.view.ViewGroup
android.view.ViewGroup$1
android.view.ViewGroup$2
@@ -2159,13 +2506,11 @@
android.view.ViewGroup$MarginLayoutParams
android.view.ViewGroup$OnHierarchyChangeListener
android.view.ViewGroup$TouchTarget
-android.view.ViewGroupOverlay
android.view.ViewManager
android.view.ViewOutlineProvider
android.view.ViewOutlineProvider$1
android.view.ViewOutlineProvider$2
android.view.ViewOutlineProvider$3
-android.view.ViewOverlay
android.view.ViewParent
android.view.ViewPropertyAnimator
android.view.ViewPropertyAnimator$1
@@ -2176,7 +2521,9 @@
android.view.ViewRootImpl$1
android.view.ViewRootImpl$4
android.view.ViewRootImpl$AccessibilityInteractionConnectionManager
+android.view.ViewRootImpl$ActivityConfigCallback
android.view.ViewRootImpl$AsyncInputStage
+android.view.ViewRootImpl$ConfigChangedCallback
android.view.ViewRootImpl$ConsumeBatchedInputImmediatelyRunnable
android.view.ViewRootImpl$ConsumeBatchedInputRunnable
android.view.ViewRootImpl$EarlyPostImeInputStage
@@ -2200,12 +2547,12 @@
android.view.ViewRootImpl$ViewRootHandler
android.view.ViewRootImpl$W
android.view.ViewRootImpl$WindowInputEventReceiver
+android.view.ViewRootImpl$WindowStoppedCallback
android.view.ViewStub
android.view.ViewTreeObserver
android.view.ViewTreeObserver$CopyOnWriteArray
android.view.ViewTreeObserver$CopyOnWriteArray$Access
android.view.ViewTreeObserver$InternalInsetsInfo
-android.view.ViewTreeObserver$OnGlobalFocusChangeListener
android.view.ViewTreeObserver$OnGlobalLayoutListener
android.view.ViewTreeObserver$OnPreDrawListener
android.view.ViewTreeObserver$OnScrollChangedListener
@@ -2223,6 +2570,7 @@
android.view.WindowInsets
android.view.WindowLeaked
android.view.WindowManager
+android.view.WindowManager$BadTokenException
android.view.WindowManager$LayoutParams
android.view.WindowManager$LayoutParams$1
android.view.WindowManagerGlobal
@@ -2235,7 +2583,8 @@
android.view.accessibility.AccessibilityManager$1
android.view.accessibility.AccessibilityManager$AccessibilityStateChangeListener
android.view.accessibility.AccessibilityManager$HighTextContrastChangeListener
-android.view.accessibility.AccessibilityManager$MyHandler
+android.view.accessibility.AccessibilityManager$MyCallback
+android.view.accessibility.AccessibilityManager$TouchExplorationStateChangeListener
android.view.accessibility.AccessibilityNodeInfo
android.view.accessibility.AccessibilityNodeProvider
android.view.accessibility.AccessibilityRecord
@@ -2249,12 +2598,8 @@
android.view.animation.AccelerateInterpolator
android.view.animation.AlphaAnimation
android.view.animation.Animation
-android.view.animation.Animation$1
-android.view.animation.Animation$2
-android.view.animation.Animation$3
android.view.animation.Animation$AnimationListener
android.view.animation.Animation$NoImagePreloadHolder
-android.view.animation.AnimationSet
android.view.animation.AnimationUtils
android.view.animation.AnimationUtils$1
android.view.animation.AnimationUtils$AnimationState
@@ -2263,10 +2608,17 @@
android.view.animation.Interpolator
android.view.animation.LinearInterpolator
android.view.animation.PathInterpolator
-android.view.animation.ScaleAnimation
android.view.animation.Transformation
-android.view.animation.TranslateAnimation
-android.view.autofill.AutoFillManager
+android.view.autofill.AutofillManager
+android.view.autofill.AutofillManager$AutofillClient
+android.view.autofill.AutofillManager$AutofillManagerClient
+android.view.autofill.Helper
+android.view.autofill.IAutoFillManager
+android.view.autofill.IAutoFillManager$Stub
+android.view.autofill.IAutoFillManager$Stub$Proxy
+android.view.autofill.IAutoFillManagerClient
+android.view.autofill.IAutoFillManagerClient$Stub
+android.view.autofill.IAutofillWindowPresenter
android.view.inputmethod.BaseInputConnection
android.view.inputmethod.ComposingText
android.view.inputmethod.CursorAnchorInfo$Builder
@@ -2278,38 +2630,22 @@
android.view.inputmethod.InputMethodManager$ControlledInputConnectionWrapper
android.view.inputmethod.InputMethodManager$FinishedInputEventCallback
android.view.inputmethod.InputMethodManager$H
-android.view.inputmethod.InputMethodManager$ImeInputEventSender
-android.view.inputmethod.InputMethodManager$PendingEvent
android.view.textclassifier.TextClassificationManager
-android.view.textservice.SpellCheckerSubtype
-android.view.textservice.SpellCheckerSubtype$1
android.view.textservice.TextServicesManager
-android.webkit.IWebViewUpdateService
-android.webkit.IWebViewUpdateService$Stub
-android.webkit.IWebViewUpdateService$Stub$Proxy
-android.webkit.MimeTypeMap
-android.webkit.WebView
android.webkit.WebViewFactory
android.webkit.WebViewFactory$MissingWebViewPackageException
-android.webkit.WebViewProviderResponse
-android.webkit.WebViewProviderResponse$1
android.widget.AbsListView
android.widget.AbsListView$AdapterDataSetObserver
android.widget.AbsListView$LayoutParams
android.widget.AbsListView$OnScrollListener
android.widget.AbsListView$RecycleBin
-android.widget.AbsListView$SavedState
-android.widget.AbsListView$SavedState$1
android.widget.AbsSeekBar
android.widget.AbsSpinner
-android.widget.AbsoluteLayout
-android.widget.ActionMenuView$OnMenuItemClickListener
android.widget.Adapter
android.widget.AdapterView
android.widget.AdapterView$AdapterDataSetObserver
android.widget.AdapterView$OnItemClickListener
android.widget.AdapterView$OnItemSelectedListener
-android.widget.ArrayAdapter
android.widget.AutoCompleteTextView
android.widget.BaseAdapter
android.widget.Button
@@ -2317,7 +2653,6 @@
android.widget.Checkable
android.widget.CheckedTextView
android.widget.CompoundButton
-android.widget.CompoundButton$OnCheckedChangeListener
android.widget.EdgeEffect
android.widget.EditText
android.widget.Editor
@@ -2330,15 +2665,12 @@
android.widget.Editor$SpanController
android.widget.Editor$SuggestionHelper
android.widget.Editor$SuggestionHelper$SuggestionSpanComparator
-android.widget.Editor$TextRenderNode
android.widget.Editor$TextViewPositionListener
android.widget.Editor$UndoInputFilter
android.widget.Filter$FilterListener
android.widget.Filterable
-android.widget.ForwardingListener
android.widget.FrameLayout
android.widget.FrameLayout$LayoutParams
-android.widget.HeaderViewListAdapter
android.widget.HorizontalScrollView
android.widget.ImageButton
android.widget.ImageView
@@ -2346,25 +2678,14 @@
android.widget.LinearLayout
android.widget.LinearLayout$LayoutParams
android.widget.ListAdapter
-android.widget.ListPopupWindow
-android.widget.ListPopupWindow$ListSelectorHider
-android.widget.ListPopupWindow$PopupDataSetObserver
-android.widget.ListPopupWindow$PopupScrollListener
-android.widget.ListPopupWindow$PopupTouchInterceptor
-android.widget.ListPopupWindow$ResizePopupRunnable
android.widget.ListView
android.widget.ListView$ArrowScrollFocusResult
android.widget.MultiAutoCompleteTextView
android.widget.OverScroller
android.widget.OverScroller$SplineOverScroller
android.widget.PopupWindow
-android.widget.PopupWindow$1
-android.widget.PopupWindow$2
-android.widget.PopupWindow$OnDismissListener
android.widget.ProgressBar
android.widget.ProgressBar$1
-android.widget.ProgressBar$SavedState
-android.widget.ProgressBar$SavedState$1
android.widget.RadioButton
android.widget.RatingBar
android.widget.RelativeLayout
@@ -2372,9 +2693,20 @@
android.widget.RelativeLayout$DependencyGraph$Node
android.widget.RelativeLayout$LayoutParams
android.widget.RemoteViews
+android.widget.RemoteViews$1
+android.widget.RemoteViews$2
+android.widget.RemoteViews$3
+android.widget.RemoteViews$Action
+android.widget.RemoteViews$ActionException
+android.widget.RemoteViews$BitmapCache
+android.widget.RemoteViews$MemoryUsageCounter
+android.widget.RemoteViews$MutablePair
+android.widget.RemoteViews$OnClickHandler
+android.widget.RemoteViews$ReflectionAction
android.widget.RemoteViews$RemoteView
+android.widget.RemoteViews$RuntimeAction
+android.widget.RemoteViews$SetOnClickPendingIntent
android.widget.RemoteViewsAdapter$RemoteAdapterConnectionCallback
-android.widget.RtlSpacingHelper
android.widget.ScrollBarDrawable
android.widget.ScrollView
android.widget.Scroller
@@ -2389,43 +2721,6 @@
android.widget.TextView$CharWrapper
android.widget.TextView$Drawables
android.widget.TextView$OnEditorActionListener
-android.widget.TextView$SavedState
-android.widget.TextView$SavedState$1
-android.widget.ThemedSpinnerAdapter
-android.widget.Toast
-android.widget.Toolbar
-android.widget.Toolbar$1
-android.widget.Toolbar$2
-android.widget.Toolbar$LayoutParams
-android.widget.WrapperListAdapter
-com.android.dex.ClassData
-com.android.dex.ClassData$Method
-com.android.dex.ClassDef
-com.android.dex.Code
-com.android.dex.Dex
-com.android.dex.Dex$ClassDefIterable
-com.android.dex.Dex$FieldIdTable
-com.android.dex.Dex$MethodIdTable
-com.android.dex.Dex$ProtoIdTable
-com.android.dex.Dex$Section
-com.android.dex.Dex$StringTable
-com.android.dex.Dex$TypeIndexToDescriptorIndexTable
-com.android.dex.Dex$TypeIndexToDescriptorTable
-com.android.dex.DexException
-com.android.dex.DexFormat
-com.android.dex.FieldId
-com.android.dex.Leb128
-com.android.dex.MethodId
-com.android.dex.Mutf8
-com.android.dex.TableOfContents
-com.android.dex.TableOfContents$Section
-com.android.dex.TypeList
-com.android.dex.util.ByteInput
-com.android.dex.util.ByteOutput
-com.android.dex.util.ExceptionWithContext
-com.android.dex.util.FileUtils
-com.android.i18n.phonenumbers.NumberParseException
-com.android.i18n.phonenumbers.PhoneNumberUtil
com.android.internal.R$styleable
com.android.internal.app.IAppOpsCallback
com.android.internal.app.IAppOpsCallback$Stub
@@ -2435,8 +2730,13 @@
com.android.internal.app.IBatteryStats
com.android.internal.app.IBatteryStats$Stub
com.android.internal.app.IBatteryStats$Stub$Proxy
+com.android.internal.app.IVoiceInteractionManagerService
+com.android.internal.app.IVoiceInteractionManagerService$Stub
com.android.internal.app.IVoiceInteractor
com.android.internal.app.IVoiceInteractor$Stub
+com.android.internal.appwidget.IAppWidgetService
+com.android.internal.appwidget.IAppWidgetService$Stub
+com.android.internal.appwidget.IAppWidgetService$Stub$Proxy
com.android.internal.content.NativeLibraryHelper
com.android.internal.content.ReferrerIntent
com.android.internal.content.ReferrerIntent$1
@@ -2448,7 +2748,6 @@
com.android.internal.logging.AndroidConfig
com.android.internal.logging.AndroidHandler
com.android.internal.logging.AndroidHandler$1
-com.android.internal.logging.EventLogTags
com.android.internal.logging.MetricsLogger
com.android.internal.net.NetworkStatsFactory
com.android.internal.os.AndroidPrintStream
@@ -2456,7 +2755,10 @@
com.android.internal.os.BinderInternal$GcWatcher
com.android.internal.os.FuseAppLoop
com.android.internal.os.FuseAppLoop$1
-com.android.internal.os.FuseAppLoop$UnmountedException
+com.android.internal.os.FuseUnavailableMountException
+com.android.internal.os.HandlerCaller
+com.android.internal.os.HandlerCaller$Callback
+com.android.internal.os.HandlerCaller$MyHandler
com.android.internal.os.LoggingPrintStream
com.android.internal.os.LoggingPrintStream$1
com.android.internal.os.PathClassLoaderFactory
@@ -2477,6 +2779,7 @@
com.android.internal.os.ZygoteServer
com.android.internal.policy.DecorContext
com.android.internal.policy.DecorView
+com.android.internal.policy.DecorView$ColorViewAttributes
com.android.internal.policy.DecorView$ColorViewState
com.android.internal.policy.PhoneFallbackEventHandler
com.android.internal.policy.PhoneLayoutInflater
@@ -2486,6 +2789,20 @@
com.android.internal.policy.PhoneWindow$PhoneWindowMenuCallback
com.android.internal.policy.PhoneWindow$RotationWatcher
com.android.internal.policy.PhoneWindow$RotationWatcher$1
+com.android.internal.telecom.ITelecomService
+com.android.internal.telecom.ITelecomService$Stub
+com.android.internal.telephony.ICarrierConfigLoader
+com.android.internal.telephony.ICarrierConfigLoader$Stub
+com.android.internal.telephony.ICarrierConfigLoader$Stub$Proxy
+com.android.internal.telephony.IOnSubscriptionsChangedListener
+com.android.internal.telephony.IOnSubscriptionsChangedListener$Stub
+com.android.internal.telephony.IPhoneStateListener
+com.android.internal.telephony.IPhoneStateListener$Stub
+com.android.internal.telephony.IPhoneSubInfo
+com.android.internal.telephony.IPhoneSubInfo$Stub
+com.android.internal.telephony.IPhoneSubInfo$Stub$Proxy
+com.android.internal.telephony.ISms
+com.android.internal.telephony.ISms$Stub
com.android.internal.telephony.ISub
com.android.internal.telephony.ISub$Stub
com.android.internal.telephony.ISub$Stub$Proxy
@@ -2495,19 +2812,31 @@
com.android.internal.telephony.ITelephonyRegistry
com.android.internal.telephony.ITelephonyRegistry$Stub
com.android.internal.telephony.ITelephonyRegistry$Stub$Proxy
+com.android.internal.telephony.IccCardConstants$State
com.android.internal.telephony.PhoneConstants$State
com.android.internal.textservice.ITextServicesManager
com.android.internal.textservice.ITextServicesManager$Stub
-com.android.internal.textservice.ITextServicesManager$Stub$Proxy
-com.android.internal.transition.EpicenterTranslateClipReveal
-com.android.internal.transition.TransitionConstants
com.android.internal.util.ArrayUtils
+com.android.internal.util.AsyncChannel
+com.android.internal.util.AsyncChannel$DeathMonitor
+com.android.internal.util.BitUtils
+com.android.internal.util.ExponentiallyBucketedHistogram
com.android.internal.util.FastPrintWriter
com.android.internal.util.FastPrintWriter$DummyWriter
com.android.internal.util.FastXmlSerializer
com.android.internal.util.GrowingArrayUtils
+com.android.internal.util.IState
+com.android.internal.util.IntPair
com.android.internal.util.LineBreakBufferedWriter
com.android.internal.util.Preconditions
+com.android.internal.util.State
+com.android.internal.util.StateMachine
+com.android.internal.util.StateMachine$LogRec
+com.android.internal.util.StateMachine$LogRecords
+com.android.internal.util.StateMachine$SmHandler
+com.android.internal.util.StateMachine$SmHandler$HaltingState
+com.android.internal.util.StateMachine$SmHandler$QuittingState
+com.android.internal.util.StateMachine$SmHandler$StateInfo
com.android.internal.util.VirtualRefBasePtr
com.android.internal.util.XmlUtils
com.android.internal.util.XmlUtils$WriteMapCallback
@@ -2530,13 +2859,11 @@
com.android.internal.view.animation.HasNativeInterpolator
com.android.internal.view.animation.NativeInterpolatorFactory
com.android.internal.view.animation.NativeInterpolatorFactoryHelper
-com.android.internal.view.menu.MenuBuilder
com.android.internal.view.menu.MenuBuilder$Callback
-com.android.internal.view.menu.MenuItemImpl
com.android.internal.view.menu.MenuPresenter$Callback
-com.android.internal.view.menu.ShowableListMenu
com.android.internal.widget.BackgroundFallback
com.android.internal.widget.DecorContentParent
+com.android.internal.widget.LockPatternUtils
com.android.okhttp.Address
com.android.okhttp.Authenticator
com.android.okhttp.CacheControl
@@ -2618,6 +2945,8 @@
com.android.okhttp.okio.BufferedSink
com.android.okhttp.okio.BufferedSource
com.android.okhttp.okio.ForwardingTimeout
+com.android.okhttp.okio.GzipSource
+com.android.okhttp.okio.InflaterSource
com.android.okhttp.okio.Okio
com.android.okhttp.okio.Okio$1
com.android.okhttp.okio.Okio$2
@@ -2718,6 +3047,7 @@
com.android.org.conscrypt.AbstractSessionContext
com.android.org.conscrypt.AbstractSessionContext$1
com.android.org.conscrypt.AddressUtils
+com.android.org.conscrypt.ArrayUtils
com.android.org.conscrypt.ByteArray
com.android.org.conscrypt.CertBlacklist
com.android.org.conscrypt.CertificatePriorityComparator
@@ -2728,6 +3058,8 @@
com.android.org.conscrypt.EvpMdRef$MD5
com.android.org.conscrypt.EvpMdRef$SHA1
com.android.org.conscrypt.EvpMdRef$SHA256
+com.android.org.conscrypt.FileClientSessionCache
+com.android.org.conscrypt.FileClientSessionCache$Impl
com.android.org.conscrypt.Hex
com.android.org.conscrypt.JSSEProvider
com.android.org.conscrypt.KeyManagerFactoryImpl
@@ -2741,6 +3073,8 @@
com.android.org.conscrypt.NativeRef$EVP_MD_CTX
com.android.org.conscrypt.NativeRef$EVP_PKEY
com.android.org.conscrypt.OpenSSLBIOInputStream
+com.android.org.conscrypt.OpenSSLContextImpl
+com.android.org.conscrypt.OpenSSLContextImpl$TLSv12
com.android.org.conscrypt.OpenSSLECGroupContext
com.android.org.conscrypt.OpenSSLECPointContext
com.android.org.conscrypt.OpenSSLECPublicKey
@@ -2756,6 +3090,10 @@
com.android.org.conscrypt.OpenSSLRSAPublicKey
com.android.org.conscrypt.OpenSSLRandom
com.android.org.conscrypt.OpenSSLSessionImpl
+com.android.org.conscrypt.OpenSSLSignature
+com.android.org.conscrypt.OpenSSLSignature$EngineType
+com.android.org.conscrypt.OpenSSLSignature$RSAPKCS1Padding
+com.android.org.conscrypt.OpenSSLSignature$SHA1RSA
com.android.org.conscrypt.OpenSSLSocketFactoryImpl
com.android.org.conscrypt.OpenSSLSocketImpl
com.android.org.conscrypt.OpenSSLSocketImpl$SSLInputStream
@@ -2770,9 +3108,11 @@
com.android.org.conscrypt.OpenSSLX509CertificateFactory$Parser
com.android.org.conscrypt.OpenSSLX509CertificateFactory$ParsingException
com.android.org.conscrypt.Platform
+com.android.org.conscrypt.SSLClientSessionCache
com.android.org.conscrypt.SSLParametersImpl
com.android.org.conscrypt.SSLParametersImpl$AliasChooser
com.android.org.conscrypt.SSLParametersImpl$PSKCallbacks
+com.android.org.conscrypt.SSLUtils
com.android.org.conscrypt.ServerSessionContext
com.android.org.conscrypt.TrustManagerFactoryImpl
com.android.org.conscrypt.TrustManagerImpl
@@ -2781,8 +3121,7 @@
com.android.org.conscrypt.TrustedCertificateIndex
com.android.org.conscrypt.TrustedCertificateKeyStoreSpi
com.android.org.conscrypt.TrustedCertificateStore
-com.android.org.conscrypt.TrustedCertificateStore$1
-com.android.org.conscrypt.TrustedCertificateStore$CertSelector
+com.android.org.conscrypt.TrustedCertificateStore$PreloadHolder
com.android.org.conscrypt.ct.CTLogInfo
com.android.org.conscrypt.ct.CTLogStore
com.android.org.conscrypt.ct.CTLogStoreImpl
@@ -2792,16 +3131,20 @@
com.android.org.conscrypt.ct.CTVerifier
com.android.org.conscrypt.ct.KnownLogs
com.android.org.conscrypt.ct.SerializationException
-com.android.org.conscrypt.util.ArrayUtils
com.android.server.NetworkManagementSocketTagger
com.android.server.NetworkManagementSocketTagger$1
com.android.server.NetworkManagementSocketTagger$SocketTags
com.google.android.collect.Lists
com.google.android.collect.Maps
+com.google.android.gles_jni.EGLConfigImpl
+com.google.android.gles_jni.EGLContextImpl
+com.google.android.gles_jni.EGLDisplayImpl
com.google.android.gles_jni.EGLImpl
+com.google.android.gles_jni.EGLSurfaceImpl
com.google.android.gles_jni.GLImpl
dalvik.annotation.optimization.CriticalNative
dalvik.annotation.optimization.FastNative
+dalvik.system.-$Lambda$xxvwQBVHC44UYbpcpA8j0sUqLOo
dalvik.system.BaseDexClassLoader
dalvik.system.BaseDexClassLoader$Reporter
dalvik.system.BlockGuard
@@ -2816,6 +3159,7 @@
dalvik.system.CloseGuard$Reporter
dalvik.system.CloseGuard$Tracker
dalvik.system.DalvikLogHandler
+dalvik.system.DalvikLogging
dalvik.system.DexClassLoader
dalvik.system.DexFile
dalvik.system.DexFile$DFEnum
@@ -2824,7 +3168,6 @@
dalvik.system.DexPathList$NativeLibraryElement
dalvik.system.EmulatedStackFrame
dalvik.system.EmulatedStackFrame$Range
-dalvik.system.InMemoryDexClassLoader$DexData
dalvik.system.PathClassLoader
dalvik.system.SocketTagger
dalvik.system.SocketTagger$1
@@ -2836,7 +3179,6 @@
java.io.BufferedInputStream
java.io.BufferedOutputStream
java.io.BufferedReader
-java.io.BufferedWriter
java.io.ByteArrayInputStream
java.io.ByteArrayOutputStream
java.io.CharArrayWriter
@@ -2854,6 +3196,7 @@
java.io.Externalizable
java.io.File
java.io.File$PathStatus
+java.io.File$TempDirectory
java.io.FileDescriptor
java.io.FileDescriptor$1
java.io.FileFilter
@@ -2863,7 +3206,6 @@
java.io.FileOutputStream
java.io.FileReader
java.io.FileSystem
-java.io.FileWriter
java.io.FilenameFilter
java.io.FilterInputStream
java.io.FilterOutputStream
@@ -2872,7 +3214,6 @@
java.io.InputStream
java.io.InputStreamReader
java.io.InterruptedIOException
-java.io.InvalidClassException
java.io.InvalidObjectException
java.io.ObjectInput
java.io.ObjectInputStream
@@ -2883,17 +3224,8 @@
java.io.ObjectInputStream$ValidationList
java.io.ObjectOutput
java.io.ObjectOutputStream
-java.io.ObjectOutputStream$BlockDataOutputStream
-java.io.ObjectOutputStream$HandleTable
java.io.ObjectOutputStream$PutField
-java.io.ObjectOutputStream$ReplaceTable
java.io.ObjectStreamClass
-java.io.ObjectStreamClass$2
-java.io.ObjectStreamClass$Caches
-java.io.ObjectStreamClass$EntryFuture
-java.io.ObjectStreamClass$FieldReflector
-java.io.ObjectStreamClass$FieldReflectorKey
-java.io.ObjectStreamClass$WeakClassKey
java.io.ObjectStreamConstants
java.io.ObjectStreamException
java.io.ObjectStreamField
@@ -2904,17 +3236,15 @@
java.io.PushbackInputStream
java.io.RandomAccessFile
java.io.Reader
-java.io.SequenceInputStream
java.io.Serializable
java.io.SerializablePermission
java.io.StringReader
java.io.StringWriter
-java.io.UTFDataFormatException
java.io.UnixFileSystem
java.io.UnsupportedEncodingException
java.io.Writer
-java.lang.-$Lambda$250$S9HjrJh0nDg7IyU6wZdPArnZWRQ
-java.lang.-$Lambda$251$S9HjrJh0nDg7IyU6wZdPArnZWRQ
+java.lang.-$Lambda$S9HjrJh0nDg7IyU6wZdPArnZWRQ
+java.lang.-$Lambda$S9HjrJh0nDg7IyU6wZdPArnZWRQ$1
java.lang.AbstractMethodError
java.lang.AbstractStringBuilder
java.lang.AndroidHardcodedSystemProperties
@@ -2980,6 +3310,7 @@
java.lang.Long$LongCache
java.lang.Math
java.lang.Math$RandomNumberGeneratorHolder
+java.lang.NegativeArraySizeException
java.lang.NoClassDefFoundError
java.lang.NoSuchFieldError
java.lang.NoSuchFieldException
@@ -3036,6 +3367,7 @@
java.lang.UnsatisfiedLinkError
java.lang.UnsupportedOperationException
java.lang.VMClassLoader
+java.lang.VerifyError
java.lang.VirtualMachineError
java.lang.Void
java.lang.annotation.Annotation
@@ -3044,18 +3376,22 @@
java.lang.annotation.Inherited
java.lang.annotation.Retention
java.lang.annotation.Target
+java.lang.invoke.CallSite
+java.lang.invoke.ConstantCallSite
java.lang.invoke.MethodHandle
java.lang.invoke.MethodHandleImpl
java.lang.invoke.MethodHandleImpl$HandleInfo
java.lang.invoke.MethodHandleInfo
java.lang.invoke.MethodHandleStatics
java.lang.invoke.MethodHandles
+java.lang.invoke.MethodHandles$Lookup
java.lang.invoke.MethodType
java.lang.invoke.MethodType$ConcurrentWeakInternSet
java.lang.invoke.MethodType$ConcurrentWeakInternSet$WeakEntry
java.lang.invoke.MethodTypeForm
java.lang.invoke.Transformers$BindTo
java.lang.invoke.Transformers$Collector
+java.lang.invoke.Transformers$Construct
java.lang.invoke.Transformers$Spreader
java.lang.invoke.Transformers$Transformer
java.lang.invoke.Transformers$VarargsCollector
@@ -3074,6 +3410,7 @@
java.lang.reflect.Executable
java.lang.reflect.Executable$GenericInfo
java.lang.reflect.Field
+java.lang.reflect.GenericArrayType
java.lang.reflect.GenericDeclaration
java.lang.reflect.InvocationHandler
java.lang.reflect.InvocationTargetException
@@ -3093,12 +3430,14 @@
java.lang.reflect.Proxy$ProxyClassFactory
java.lang.reflect.Type
java.lang.reflect.TypeVariable
+java.lang.reflect.UndeclaredThrowableException
java.lang.reflect.WeakCache
java.lang.reflect.WeakCache$CacheKey
java.lang.reflect.WeakCache$CacheValue
java.lang.reflect.WeakCache$Factory
java.lang.reflect.WeakCache$LookupValue
java.lang.reflect.WeakCache$Value
+java.lang.reflect.WildcardType
java.math.BigDecimal
java.math.BigInt
java.math.BigInteger
@@ -3127,7 +3466,6 @@
java.net.NetworkInterface
java.net.Parts
java.net.PlainSocketImpl
-java.net.ProtocolException
java.net.Proxy
java.net.Proxy$Type
java.net.ProxySelector
@@ -3150,7 +3488,6 @@
java.net.URISyntaxException
java.net.URL
java.net.URLConnection
-java.net.URLDecoder
java.net.URLEncoder
java.net.URLStreamHandler
java.net.URLStreamHandlerFactory
@@ -3195,6 +3532,7 @@
java.nio.channels.InterruptibleChannel
java.nio.channels.MulticastChannel
java.nio.channels.NetworkChannel
+java.nio.channels.OverlappingFileLockException
java.nio.channels.ReadableByteChannel
java.nio.channels.ScatteringByteChannel
java.nio.channels.SeekableByteChannel
@@ -3238,7 +3576,6 @@
java.security.KeyFactory
java.security.KeyFactorySpi
java.security.KeyManagementException
-java.security.KeyPair
java.security.KeyStore
java.security.KeyStore$1
java.security.KeyStoreException
@@ -3318,11 +3655,11 @@
java.security.spec.EllipticCurve
java.security.spec.EncodedKeySpec
java.security.spec.InvalidKeySpecException
+java.security.spec.InvalidParameterSpecException
java.security.spec.KeySpec
java.security.spec.RSAPublicKeySpec
java.security.spec.X509EncodedKeySpec
java.text.AttributedCharacterIterator$Attribute
-java.text.CalendarBuilder
java.text.CharacterIterator
java.text.DateFormat
java.text.DateFormat$Field
@@ -3343,16 +3680,16 @@
java.text.SimpleDateFormat
java.text.StringCharacterIterator
java.time.DateTimeException
-java.util.-$Lambda$181$4EqhxufgNKat19m0CB0-toH_lzo
-java.util.-$Lambda$182$4EqhxufgNKat19m0CB0-toH_lzo
-java.util.-$Lambda$183$4EqhxufgNKat19m0CB0-toH_lzo
-java.util.-$Lambda$184$4EqhxufgNKat19m0CB0-toH_lzo
-java.util.-$Lambda$267$4EqhxufgNKat19m0CB0-toH_lzo
-java.util.-$Lambda$268$4EqhxufgNKat19m0CB0-toH_lzo
-java.util.-$Lambda$291$aUGKT4ItCOku5-JSG-x8Aqj2pJw
-java.util.-$Lambda$292$aUGKT4ItCOku5-JSG-x8Aqj2pJw
-java.util.-$Lambda$293$aUGKT4ItCOku5-JSG-x8Aqj2pJw
-java.util.-$Lambda$294$aUGKT4ItCOku5-JSG-x8Aqj2pJw
+java.util.-$Lambda$4EqhxufgNKat19m0CB0-toH_lzo
+java.util.-$Lambda$4EqhxufgNKat19m0CB0-toH_lzo$1
+java.util.-$Lambda$4EqhxufgNKat19m0CB0-toH_lzo$2
+java.util.-$Lambda$4EqhxufgNKat19m0CB0-toH_lzo$3
+java.util.-$Lambda$4EqhxufgNKat19m0CB0-toH_lzo$4
+java.util.-$Lambda$4EqhxufgNKat19m0CB0-toH_lzo$5
+java.util.-$Lambda$aUGKT4ItCOku5-JSG-x8Aqj2pJw
+java.util.-$Lambda$aUGKT4ItCOku5-JSG-x8Aqj2pJw$1
+java.util.-$Lambda$aUGKT4ItCOku5-JSG-x8Aqj2pJw$2
+java.util.-$Lambda$aUGKT4ItCOku5-JSG-x8Aqj2pJw$3
java.util.AbstractCollection
java.util.AbstractList
java.util.AbstractList$Itr
@@ -3466,6 +3803,7 @@
java.util.Formatter$FormatSpecifier
java.util.Formatter$FormatSpecifierParser
java.util.Formatter$FormatString
+java.util.FormatterClosedException
java.util.GregorianCalendar
java.util.HashMap
java.util.HashMap$EntryIterator
@@ -3482,7 +3820,6 @@
java.util.Hashtable$Enumerator
java.util.Hashtable$HashtableEntry
java.util.IdentityHashMap
-java.util.IdentityHashMap$IdentityHashMapIterator
java.util.IdentityHashMap$KeySet
java.util.IllegalFormatException
java.util.IllformedLocaleException
@@ -3509,6 +3846,7 @@
java.util.Locale$FilteringMode
java.util.Locale$LanguageRange
java.util.Locale$LocaleKey
+java.util.Locale$NoImagePreloadHolder
java.util.Map
java.util.Map$Entry
java.util.MissingResourceException
@@ -3519,6 +3857,7 @@
java.util.PrimitiveIterator
java.util.PrimitiveIterator$OfInt
java.util.PriorityQueue
+java.util.PriorityQueue$Itr
java.util.Properties
java.util.Properties$LineReader
java.util.Queue
@@ -3528,7 +3867,6 @@
java.util.RegularEnumSet
java.util.ResourceBundle
java.util.ResourceBundle$1
-java.util.Scanner
java.util.Set
java.util.SimpleTimeZone
java.util.SortedMap
@@ -3551,10 +3889,15 @@
java.util.TimSort
java.util.TimeZone
java.util.TreeMap
+java.util.TreeMap$AscendingSubMap
+java.util.TreeMap$AscendingSubMap$AscendingEntrySetView
java.util.TreeMap$EntryIterator
java.util.TreeMap$EntrySet
java.util.TreeMap$KeyIterator
java.util.TreeMap$KeySet
+java.util.TreeMap$NavigableSubMap
+java.util.TreeMap$NavigableSubMap$EntrySetView
+java.util.TreeMap$NavigableSubMap$SubMapIterator
java.util.TreeMap$PrivateEntryIterator
java.util.TreeMap$TreeMapEntry
java.util.TreeMap$ValueIterator
@@ -3563,6 +3906,7 @@
java.util.UUID
java.util.UUID$Holder
java.util.Vector
+java.util.Vector$1
java.util.Vector$Itr
java.util.WeakHashMap
java.util.WeakHashMap$Entry
@@ -3571,8 +3915,9 @@
java.util.WeakHashMap$KeyIterator
java.util.WeakHashMap$KeySet
java.util.WeakHashMap$Values
-java.util.concurrent.-$Lambda$269$xR9BLpu6SifNikvFgr4lEiECBsk
+java.util.concurrent.-$Lambda$xR9BLpu6SifNikvFgr4lEiECBsk
java.util.concurrent.AbstractExecutorService
+java.util.concurrent.ArrayBlockingQueue
java.util.concurrent.BlockingQueue
java.util.concurrent.Callable
java.util.concurrent.CancellationException
@@ -3625,6 +3970,8 @@
java.util.concurrent.ConcurrentHashMap$TreeNode
java.util.concurrent.ConcurrentHashMap$ValueIterator
java.util.concurrent.ConcurrentHashMap$ValuesView
+java.util.concurrent.ConcurrentLinkedDeque
+java.util.concurrent.ConcurrentLinkedDeque$Node
java.util.concurrent.ConcurrentLinkedQueue
java.util.concurrent.ConcurrentLinkedQueue$Node
java.util.concurrent.ConcurrentMap
@@ -3673,6 +4020,7 @@
java.util.concurrent.ThreadLocalRandom
java.util.concurrent.ThreadPoolExecutor
java.util.concurrent.ThreadPoolExecutor$AbortPolicy
+java.util.concurrent.ThreadPoolExecutor$DiscardPolicy
java.util.concurrent.ThreadPoolExecutor$Worker
java.util.concurrent.TimeUnit
java.util.concurrent.TimeUnit$1
@@ -3687,6 +4035,7 @@
java.util.concurrent.atomic.AtomicInteger
java.util.concurrent.atomic.AtomicLong
java.util.concurrent.atomic.AtomicReference
+java.util.concurrent.atomic.AtomicReferenceArray
java.util.concurrent.atomic.AtomicReferenceFieldUpdater
java.util.concurrent.atomic.AtomicReferenceFieldUpdater$AtomicReferenceFieldUpdaterImpl
java.util.concurrent.locks.AbstractOwnableSynchronizer
@@ -3706,12 +4055,15 @@
java.util.concurrent.locks.ReentrantReadWriteLock$Sync
java.util.concurrent.locks.ReentrantReadWriteLock$Sync$ThreadLocalHoldCounter
java.util.concurrent.locks.ReentrantReadWriteLock$WriteLock
-java.util.function.-$Lambda$276$1MZdIZ-DL_fjy9l0o8IMJk57T2g
+java.util.function.-$Lambda$1MZdIZ-DL_fjy9l0o8IMJk57T2g
+java.util.function.-$Lambda$VGDeaUHZQIZywZW2ttlyhwk3Cmk
+java.util.function.-$Lambda$VGDeaUHZQIZywZW2ttlyhwk3Cmk$1
java.util.function.BiConsumer
java.util.function.BiFunction
java.util.function.BinaryOperator
java.util.function.Consumer
java.util.function.DoubleBinaryOperator
+java.util.function.DoubleUnaryOperator
java.util.function.Function
java.util.function.IntBinaryOperator
java.util.function.IntConsumer
@@ -3751,6 +4103,7 @@
java.util.logging.LogManager$LoggerWeakRef
java.util.logging.LogManager$RootLogger
java.util.logging.LogManager$SystemLoggerContext
+java.util.logging.LogRecord
java.util.logging.Logger
java.util.logging.Logger$LoggerBundle
java.util.logging.LoggingPermission
@@ -3762,12 +4115,24 @@
java.util.regex.Matcher
java.util.regex.Pattern
java.util.regex.PatternSyntaxException
+java.util.stream.AbstractPipeline
java.util.stream.BaseStream
java.util.stream.DoubleStream
java.util.stream.IntStream
java.util.stream.LongStream
+java.util.stream.PipelineHelper
+java.util.stream.ReferencePipeline
+java.util.stream.ReferencePipeline$Head
+java.util.stream.Sink
+java.util.stream.Sink$ChainedReference
java.util.stream.Stream
+java.util.stream.StreamOpFlag
+java.util.stream.StreamOpFlag$MaskBuilder
+java.util.stream.StreamOpFlag$Type
+java.util.stream.StreamShape
java.util.stream.StreamSupport
+java.util.stream.TerminalOp
+java.util.stream.TerminalSink
java.util.zip.Adler32
java.util.zip.CRC32
java.util.zip.CheckedInputStream
@@ -3790,13 +4155,26 @@
java.util.zip.ZipUtils
javax.crypto.BadPaddingException
javax.crypto.Cipher
+javax.crypto.Cipher$CipherSpiAndProvider
+javax.crypto.Cipher$InitParams
+javax.crypto.Cipher$InitType
+javax.crypto.Cipher$NeedToSet
+javax.crypto.Cipher$SpiAndProviderUpdater
+javax.crypto.Cipher$Transform
+javax.crypto.CipherSpi
javax.crypto.IllegalBlockSizeException
+javax.crypto.JceSecurity
javax.crypto.NoSuchPaddingException
javax.crypto.SecretKey
+javax.crypto.ShortBufferException
javax.crypto.spec.IvParameterSpec
javax.crypto.spec.SecretKeySpec
javax.microedition.khronos.egl.EGL
javax.microedition.khronos.egl.EGL10
+javax.microedition.khronos.egl.EGLConfig
+javax.microedition.khronos.egl.EGLContext
+javax.microedition.khronos.egl.EGLDisplay
+javax.microedition.khronos.egl.EGLSurface
javax.microedition.khronos.opengles.GL
javax.microedition.khronos.opengles.GL10
javax.microedition.khronos.opengles.GL10Ext
@@ -3828,6 +4206,7 @@
javax.net.ssl.SSLSessionContext
javax.net.ssl.SSLSocket
javax.net.ssl.SSLSocketFactory
+javax.net.ssl.SSLSocketFactory$1
javax.net.ssl.TrustManager
javax.net.ssl.TrustManagerFactory
javax.net.ssl.TrustManagerFactory$1
@@ -3865,11 +4244,11 @@
libcore.io.IoTracker$Mode
libcore.io.IoUtils
libcore.io.Libcore
+libcore.io.Linux
libcore.io.Memory
libcore.io.MemoryMappedFile
libcore.io.NioBufferIterator
libcore.io.Os
-libcore.io.Posix
libcore.net.NetworkSecurityPolicy
libcore.net.NetworkSecurityPolicy$DefaultNetworkSecurityPolicy
libcore.net.UriCodec
@@ -3879,9 +4258,11 @@
libcore.reflect.AnnotationFactory
libcore.reflect.AnnotationMember
libcore.reflect.AnnotationMember$DefaultValues
+libcore.reflect.GenericArrayTypeImpl
libcore.reflect.GenericSignatureParser
-libcore.reflect.InternalNames
libcore.reflect.ListOfTypes
+libcore.reflect.ListOfVariables
+libcore.reflect.ParameterizedTypeImpl
libcore.reflect.Types
libcore.util.BasicLruCache
libcore.util.CharsetUtils
@@ -3890,10 +4271,18 @@
libcore.util.NativeAllocationRegistry
libcore.util.NativeAllocationRegistry$CleanerRunner
libcore.util.NativeAllocationRegistry$CleanerThunk
+libcore.util.TimeZoneDataFiles
libcore.util.ZoneInfo
+libcore.util.ZoneInfo$CheckedArithmeticException
+libcore.util.ZoneInfo$OffsetInterval
+libcore.util.ZoneInfo$WallTime
libcore.util.ZoneInfoDB
libcore.util.ZoneInfoDB$TzData
libcore.util.ZoneInfoDB$TzData$1
+org.apache.commons.logging.Log
+org.apache.commons.logging.LogFactory
+org.apache.commons.logging.impl.Jdk14Logger
+org.apache.commons.logging.impl.WeakHashtable
org.apache.harmony.dalvik.NativeTestTarget
org.apache.harmony.dalvik.ddmc.Chunk
org.apache.harmony.dalvik.ddmc.ChunkHandler
@@ -3904,21 +4293,62 @@
org.apache.harmony.xml.ExpatParser
org.apache.http.Header
org.apache.http.HttpEntity
-org.apache.http.HttpEntityEnclosingRequest
+org.apache.http.HttpException
+org.apache.http.HttpHost
org.apache.http.HttpMessage
org.apache.http.HttpRequest
+org.apache.http.HttpRequestInterceptor
org.apache.http.HttpResponse
+org.apache.http.ProtocolException
org.apache.http.ProtocolVersion
org.apache.http.StatusLine
org.apache.http.client.HttpClient
+org.apache.http.client.ResponseHandler
org.apache.http.client.methods.HttpUriRequest
+org.apache.http.client.params.HttpClientParams
+org.apache.http.conn.ClientConnectionManager
+org.apache.http.conn.ClientConnectionOperator
+org.apache.http.conn.ClientConnectionRequest
org.apache.http.conn.ConnectTimeoutException
+org.apache.http.conn.ConnectionReleaseTrigger
+org.apache.http.conn.params.ConnManagerPNames
+org.apache.http.conn.params.ConnManagerParams
+org.apache.http.conn.params.ConnManagerParams$1
+org.apache.http.conn.params.ConnPerRoute
+org.apache.http.conn.scheme.LayeredSocketFactory
+org.apache.http.conn.scheme.PlainSocketFactory
+org.apache.http.conn.scheme.Scheme
+org.apache.http.conn.scheme.SchemeRegistry
+org.apache.http.conn.scheme.SocketFactory
+org.apache.http.conn.ssl.AbstractVerifier
+org.apache.http.conn.ssl.AllowAllHostnameVerifier
+org.apache.http.conn.ssl.BrowserCompatHostnameVerifier
+org.apache.http.conn.ssl.SSLSocketFactory
+org.apache.http.conn.ssl.StrictHostnameVerifier
+org.apache.http.conn.ssl.X509HostnameVerifier
org.apache.http.entity.AbstractHttpEntity
+org.apache.http.impl.client.AbstractHttpClient
+org.apache.http.impl.client.DefaultHttpClient
+org.apache.http.impl.conn.DefaultClientConnectionOperator
+org.apache.http.impl.conn.IdleConnectionHandler
+org.apache.http.impl.conn.tsccm.AbstractConnPool
+org.apache.http.impl.conn.tsccm.ConnPoolByRoute
+org.apache.http.impl.conn.tsccm.RefQueueHandler
+org.apache.http.impl.conn.tsccm.RefQueueWorker
+org.apache.http.impl.conn.tsccm.ThreadSafeClientConnManager
org.apache.http.message.AbstractHttpMessage
org.apache.http.message.BasicHeader
org.apache.http.message.BasicHttpResponse
org.apache.http.message.BasicStatusLine
org.apache.http.message.HeaderGroup
+org.apache.http.params.AbstractHttpParams
+org.apache.http.params.BasicHttpParams
+org.apache.http.params.CoreConnectionPNames
+org.apache.http.params.CoreProtocolPNames
+org.apache.http.params.HttpConnectionParams
+org.apache.http.params.HttpParams
+org.apache.http.params.HttpProtocolParams
+org.apache.http.protocol.HttpContext
org.ccil.cowan.tagsoup.AttributesImpl
org.ccil.cowan.tagsoup.AutoDetector
org.ccil.cowan.tagsoup.Element
@@ -3942,12 +4372,24 @@
org.kxml2.io.KXmlParser
org.kxml2.io.KXmlParser$ValueContext
org.xml.sax.Attributes
+org.xml.sax.ContentHandler
+org.xml.sax.DTDHandler
+org.xml.sax.EntityResolver
+org.xml.sax.ErrorHandler
+org.xml.sax.InputSource
+org.xml.sax.Locator
org.xml.sax.SAXException
+org.xml.sax.SAXNotRecognizedException
+org.xml.sax.SAXNotSupportedException
+org.xml.sax.XMLReader
+org.xml.sax.helpers.DefaultHandler
org.xmlpull.v1.XmlPullParser
org.xmlpull.v1.XmlPullParserException
org.xmlpull.v1.XmlSerializer
sun.invoke.util.BytecodeDescriptor
+sun.invoke.util.VerifyAccess
sun.invoke.util.Wrapper
+sun.invoke.util.Wrapper$Format
sun.misc.Cleaner
sun.misc.CompoundEnumeration
sun.misc.FDBigInteger
@@ -3984,7 +4426,6 @@
sun.nio.ch.DatagramChannelImpl
sun.nio.ch.DatagramDispatcher
sun.nio.ch.DirectBuffer
-sun.nio.ch.EPollArrayWrapper
sun.nio.ch.FileChannelImpl
sun.nio.ch.FileChannelImpl$Unmapper
sun.nio.ch.FileDispatcher
@@ -4004,6 +4445,10 @@
sun.nio.ch.SharedFileLockTable
sun.nio.ch.SharedFileLockTable$FileLockReference
sun.nio.ch.SocketChannelImpl
+sun.nio.ch.Util
+sun.nio.ch.Util$1
+sun.nio.ch.Util$BufferCache
+sun.nio.cs.ArrayDecoder
sun.nio.cs.ArrayEncoder
sun.nio.cs.StreamDecoder
sun.nio.cs.StreamEncoder
@@ -4037,14 +4482,15 @@
sun.security.provider.certpath.PKIXMasterCertPathValidator
sun.security.provider.certpath.PolicyChecker
sun.security.provider.certpath.PolicyNodeImpl
-sun.security.util.-$Lambda$179$Kli5xKA4dAwmFO1sy_hpNWmbfH4
sun.security.util.AbstractAlgorithmConstraints
+sun.security.util.AbstractAlgorithmConstraints$1
sun.security.util.AlgorithmDecomposer
sun.security.util.BitArray
sun.security.util.ByteArrayLexOrder
sun.security.util.ByteArrayTagOrder
sun.security.util.Cache
sun.security.util.Cache$EqualByteArray
+sun.security.util.CertConstraintParameters
sun.security.util.Debug
sun.security.util.DerEncoder
sun.security.util.DerIndefLenConverter
@@ -4053,9 +4499,10 @@
sun.security.util.DerOutputStream
sun.security.util.DerValue
sun.security.util.DisabledAlgorithmConstraints
+sun.security.util.DisabledAlgorithmConstraints$Constraint
+sun.security.util.DisabledAlgorithmConstraints$Constraint$Operator
+sun.security.util.DisabledAlgorithmConstraints$Constraints
sun.security.util.DisabledAlgorithmConstraints$KeySizeConstraint
-sun.security.util.DisabledAlgorithmConstraints$KeySizeConstraint$Operator
-sun.security.util.DisabledAlgorithmConstraints$KeySizeConstraints
sun.security.util.KeyUtil
sun.security.util.Length
sun.security.util.MemoryCache
diff --git a/proto/src/wifi.proto b/proto/src/wifi.proto
index debb157..564d135 100644
--- a/proto/src/wifi.proto
+++ b/proto/src/wifi.proto
@@ -241,6 +241,20 @@
// List of events
repeated StaEvent sta_event_list = 52;
+
+ // Total number of times WiFi HAL crashed.
+ optional int32 num_hal_crashes = 53;
+
+ // Total number of times WiFicond crashed.
+ optional int32 num_wificond_crashes = 54;
+
+ // Indicates the number of times an error was encountered in
+ // Wifi HAL when wifi was turned on.
+ optional int32 num_wifi_on_failure_due_to_hal = 55;
+
+ // Indicates the number of times an error was encountered in
+ // Wificond when wifi was turned on.
+ optional int32 num_wifi_on_failure_due_to_wificond = 56;
}
// Information that gets logged for every WiFi connection.
diff --git a/services/autofill/java/com/android/server/autofill/AutofillManagerService.java b/services/autofill/java/com/android/server/autofill/AutofillManagerService.java
index 93b5ed5..03f25bf 100644
--- a/services/autofill/java/com/android/server/autofill/AutofillManagerService.java
+++ b/services/autofill/java/com/android/server/autofill/AutofillManagerService.java
@@ -711,10 +711,13 @@
ContentResolver resolver = mContext.getContentResolver();
resolver.registerContentObserver(Settings.Secure.getUriFor(
Settings.Secure.AUTOFILL_SERVICE), false, this, UserHandle.USER_ALL);
+ resolver.registerContentObserver(Settings.Secure.getUriFor(
+ Settings.Secure.USER_SETUP_COMPLETE), false, this, UserHandle.USER_ALL);
}
@Override
public void onChange(boolean selfChange, Uri uri, int userId) {
+ if (sVerbose) Slog.v(TAG, "onChange(): uri=" + uri + ", userId=" + userId);
synchronized (mLock) {
updateCachedServiceLocked(userId);
}
diff --git a/services/autofill/java/com/android/server/autofill/AutofillManagerServiceImpl.java b/services/autofill/java/com/android/server/autofill/AutofillManagerServiceImpl.java
index 2cb0bd5..38b796b 100644
--- a/services/autofill/java/com/android/server/autofill/AutofillManagerServiceImpl.java
+++ b/services/autofill/java/com/android/server/autofill/AutofillManagerServiceImpl.java
@@ -51,7 +51,7 @@
import android.service.autofill.FillResponse;
import android.service.autofill.IAutoFillService;
import android.text.TextUtils;
-import android.util.ArrayMap;
+import android.util.ArraySet;
import android.util.LocalLog;
import android.util.Slog;
import android.util.SparseArray;
@@ -99,6 +99,12 @@
*/
private boolean mDisabled;
+ /**
+ * Caches whether the setup completed for the current user.
+ */
+ @GuardedBy("mLock")
+ private boolean mSetupComplete;
+
private final HandlerCaller.Callback mHandlerCallback = (msg) -> {
switch (msg.what) {
case MSG_SERVICE_SAVE:
@@ -171,6 +177,12 @@
}
}
+ private boolean isSetupCompletedLocked() {
+ final String setupComplete = Settings.Secure.getStringForUser(
+ mContext.getContentResolver(), Settings.Secure.USER_SETUP_COMPLETE, mUserId);
+ return "1".equals(setupComplete);
+ }
+
private String getComponentNameFromSettings() {
return Settings.Secure.getStringForUser(
mContext.getContentResolver(), Settings.Secure.AUTOFILL_SERVICE, mUserId);
@@ -178,6 +190,12 @@
void updateLocked(boolean disabled) {
final boolean wasEnabled = isEnabled();
+ if (sVerbose) {
+ Slog.v(TAG, "updateLocked(u=" + mUserId + "): wasEnabled=" + wasEnabled
+ + ", mSetupComplete= " + mSetupComplete
+ + ", disabled=" + disabled + ", mDisabled=" + mDisabled);
+ }
+ mSetupComplete = isSetupCompletedLocked();
mDisabled = disabled;
ComponentName serviceComponent = null;
ServiceInfo serviceInfo = null;
@@ -199,8 +217,9 @@
} else {
mInfo = null;
}
- if (wasEnabled != isEnabled()) {
- if (!isEnabled()) {
+ final boolean isEnabled = isEnabled();
+ if (wasEnabled != isEnabled) {
+ if (!isEnabled) {
final int sessionCount = mSessions.size();
for (int i = sessionCount - 1; i >= 0; i--) {
final Session session = mSessions.valueAt(i);
@@ -447,10 +466,17 @@
if (sVerbose) Slog.v(TAG, "destroyLocked()");
final int numSessions = mSessions.size();
+ final ArraySet<RemoteFillService> remoteFillServices = new ArraySet<>(numSessions);
for (int i = 0; i < numSessions; i++) {
- mSessions.valueAt(i).destroyLocked();
+ final RemoteFillService remoteFillService = mSessions.valueAt(i).destroyLocked();
+ if (remoteFillService != null) {
+ remoteFillServices.add(remoteFillService);
+ }
}
mSessions.clear();
+ for (int i = 0; i < remoteFillServices.size(); i++) {
+ remoteFillServices.valueAt(i).destroy();
+ }
sendStateToClients(true);
}
@@ -534,6 +560,7 @@
pw.print(prefix); pw.print("Default component: ");
pw.println(mContext.getString(R.string.config_defaultAutofillService));
pw.print(prefix); pw.print("Disabled: "); pw.println(mDisabled);
+ pw.print(prefix); pw.print("Setup complete: "); pw.println(mSetupComplete);
pw.print(prefix); pw.print("Last prune: "); pw.println(mLastPrune);
final int size = mSessions.size();
@@ -617,7 +644,7 @@
}
boolean isEnabled() {
- return mInfo != null && !mDisabled;
+ return mSetupComplete && mInfo != null && !mDisabled;
}
@Override
diff --git a/services/autofill/java/com/android/server/autofill/Helper.java b/services/autofill/java/com/android/server/autofill/Helper.java
index 0281f73..86e32e0 100644
--- a/services/autofill/java/com/android/server/autofill/Helper.java
+++ b/services/autofill/java/com/android/server/autofill/Helper.java
@@ -16,7 +16,10 @@
package com.android.server.autofill;
+import android.annotation.Nullable;
import android.os.Bundle;
+import android.util.ArraySet;
+import android.view.autofill.AutofillId;
import java.util.Arrays;
import java.util.Objects;
@@ -68,4 +71,15 @@
append(builder, bundle);
return builder.toString();
}
+
+ @Nullable
+ static AutofillId[] toArray(@Nullable ArraySet<AutofillId> set) {
+ if (set == null) return null;
+
+ final AutofillId[] array = new AutofillId[set.size()];
+ for (int i = 0; i < set.size(); i++) {
+ array[i] = set.valueAt(i);
+ }
+ return array;
+ }
}
diff --git a/services/autofill/java/com/android/server/autofill/Session.java b/services/autofill/java/com/android/server/autofill/Session.java
index 0122301..980a7d4 100644
--- a/services/autofill/java/com/android/server/autofill/Session.java
+++ b/services/autofill/java/com/android/server/autofill/Session.java
@@ -28,6 +28,7 @@
import static com.android.server.autofill.Helper.sDebug;
import static com.android.server.autofill.Helper.sPartitionMaxCount;
import static com.android.server.autofill.Helper.sVerbose;
+import static com.android.server.autofill.Helper.toArray;
import static com.android.server.autofill.ViewState.STATE_AUTOFILLED;
import static com.android.server.autofill.ViewState.STATE_RESTARTED_SESSION;
@@ -57,6 +58,7 @@
import android.service.autofill.SaveInfo;
import android.service.autofill.SaveRequest;
import android.util.ArrayMap;
+import android.util.ArraySet;
import android.util.Slog;
import android.util.SparseArray;
import android.view.autofill.AutofillId;
@@ -172,13 +174,13 @@
public void send(int resultCode, Bundle resultData) throws RemoteException {
final AssistStructure structure = resultData.getParcelable(KEY_STRUCTURE);
if (structure == null) {
- Slog.wtf(TAG, "no assist structure");
+ Slog.e(TAG, "No assist structure - app might have crashed providing it");
return;
}
final Bundle receiverExtras = resultData.getBundle(KEY_RECEIVER_EXTRAS);
if (receiverExtras == null) {
- Slog.wtf(TAG, "No " + KEY_RECEIVER_EXTRAS + " on receiver");
+ Slog.e(TAG, "No receiver extras - app might have crashed providing it");
return;
}
@@ -417,7 +419,7 @@
notifyUnavailableToClient();
}
synchronized (mLock) {
- processResponseLocked(response);
+ processResponseLocked(response, requestFlags);
}
final LogMaker log = (new LogMaker(MetricsEvent.AUTOFILL_REQUEST))
@@ -680,7 +682,6 @@
removeSelf();
return;
}
- resetViewStatesLocked(dataset, ViewState.STATE_WAITING_DATASET_AUTH);
}
final Parcelable result = data.getParcelable(AutofillManager.EXTRA_AUTHENTICATION_RESULT);
@@ -1025,7 +1026,7 @@
case ACTION_START_SESSION:
// View is triggering autofill.
mCurrentViewId = viewState.id;
- viewState.update(value, virtualBounds);
+ viewState.update(value, virtualBounds, flags);
viewState.setState(ViewState.STATE_STARTED_SESSION);
requestNewFillResponseLocked(flags);
break;
@@ -1064,7 +1065,7 @@
}
// If the ViewState is ready to be displayed, onReady() will be called.
- viewState.update(value, virtualBounds);
+ viewState.update(value, virtualBounds, flags);
break;
case ACTION_VIEW_EXITED:
if (mCurrentViewId == viewState.id) {
@@ -1139,15 +1140,20 @@
// Only track the views of the last response as only those are reported back to the
// service, see #showSaveLocked
- ArrayList<AutofillId> trackedViews = new ArrayList<>();
+ final FillResponse response = mResponses.valueAt(getLastResponseIndex());
+
+ ArraySet<AutofillId> trackedViews = null;
boolean saveOnAllViewsInvisible = false;
- SaveInfo saveInfo = mResponses.valueAt(getLastResponseIndex()).getSaveInfo();
+ final SaveInfo saveInfo = response.getSaveInfo();
if (saveInfo != null) {
saveOnAllViewsInvisible =
(saveInfo.getFlags() & SaveInfo.FLAG_SAVE_ON_ALL_VIEWS_INVISIBLE) != 0;
// We only need to track views if we want to save once they become invisible.
if (saveOnAllViewsInvisible) {
+ if (trackedViews == null) {
+ trackedViews = new ArraySet<>();
+ }
if (saveInfo.getRequiredIds() != null) {
Collections.addAll(trackedViews, saveInfo.getRequiredIds());
}
@@ -1158,8 +1164,32 @@
}
}
+ // Must also track that are part of datasets, otherwise the FillUI won't be hidden when
+ // they go away (if they're not savable).
+
+ final ArrayList<Dataset> datasets = response.getDatasets();
+ ArraySet<AutofillId> fillableIds = null;
+ if (datasets != null) {
+ for (int i = 0; i < datasets.size(); i++) {
+ final Dataset dataset = datasets.get(i);
+ final ArrayList<AutofillId> fieldIds = dataset.getFieldIds();
+ if (fieldIds == null) continue;
+
+ for (int j = 0; j < fieldIds.size(); j++) {
+ final AutofillId id = fieldIds.get(j);
+ if (trackedViews == null || !trackedViews.contains(id)) {
+ fillableIds = ArrayUtils.add(fillableIds, id);
+ }
+ }
+ }
+ }
+
try {
- mClient.setTrackedViews(id, trackedViews, saveOnAllViewsInvisible);
+ if (sVerbose) {
+ Slog.v(TAG, "updateTrackedIdsLocked(): " + trackedViews + " => " + fillableIds);
+ }
+ mClient.setTrackedViews(id, toArray(trackedViews), saveOnAllViewsInvisible,
+ toArray(fillableIds));
} catch (RemoteException e) {
Slog.w(TAG, "Cannot set tracked ids", e);
}
@@ -1174,10 +1204,10 @@
// Replace the old response
mResponses.put(newResponse.getRequestId(), newResponse);
// Now process the new response
- processResponseLocked(newResponse);
+ processResponseLocked(newResponse, 0);
}
- private void processResponseLocked(@NonNull FillResponse newResponse) {
+ private void processResponseLocked(@NonNull FillResponse newResponse, int flags) {
// Make sure we are hiding the UI which will be shown
// only if handling the current response requires it.
hideAllUiIfOwnedByMe();
@@ -1185,7 +1215,7 @@
final int requestId = newResponse.getRequestId();
if (sVerbose) {
Slog.v(TAG, "processResponseLocked(): mCurrentViewId=" + mCurrentViewId
- + ", reqId=" + requestId + ", resp=" + newResponse);
+ + ",flags=" + flags + ", reqId=" + requestId + ", resp=" + newResponse);
}
if (mResponses == null) {
@@ -1201,21 +1231,9 @@
return;
}
- final ArrayList<Dataset> datasets = newResponse.getDatasets();
-
- if (datasets != null && datasets.size() == 1) {
- // Check if it its a single response for a manual request, in which case it should
- // be automatically filled
- final FillContext context = getFillContextByRequestIdLocked(requestId);
- if (context != null && (context.getStructure().getFlags() & FLAG_MANUAL_REQUEST) != 0) {
- Slog.d(TAG, "autofilling manual request directly");
- autoFill(requestId, 0, datasets.get(0));
- return;
- }
- }
// Updates the UI, if necessary.
final ViewState currentView = mViewStates.get(mCurrentViewId);
- currentView.maybeCallOnFillReady();
+ currentView.maybeCallOnFillReady(flags);
}
/**
@@ -1301,20 +1319,6 @@
return viewState;
}
- /**
- * Resets the given state from all existing views in the given dataset.
- */
- private void resetViewStatesLocked(@NonNull Dataset dataset, int state) {
- final ArrayList<AutofillId> ids = dataset.getFieldIds();
- for (int j = 0; j < ids.size(); j++) {
- final AutofillId id = ids.get(j);
- final ViewState viewState = mViewStates.get(id);
- if (viewState != null) {
- viewState.resetState(state);
- }
- }
- }
-
void autoFill(int requestId, int datasetIndex, Dataset dataset) {
synchronized (mLock) {
if (mDestroyed) {
@@ -1331,7 +1335,6 @@
}
// ...or handle authentication.
- // TODO(b/37424539): proper implementation
mService.setDatasetAuthenticationSelected(dataset.getId());
setViewStatesLocked(null, dataset, ViewState.STATE_WAITING_DATASET_AUTH, false);
final Intent fillInIntent = createAuthFillInIntent(
@@ -1423,22 +1426,37 @@
return;
}
try {
- if (sDebug) Slog.d(TAG, "autoFillApp(): the buck is on the app: " + dataset);
// Skip null values as a null values means no change
final int entryCount = dataset.getFieldIds().size();
final List<AutofillId> ids = new ArrayList<>(entryCount);
final List<AutofillValue> values = new ArrayList<>(entryCount);
+ boolean waitingDatasetAuth = false;
for (int i = 0; i < entryCount; i++) {
if (dataset.getFieldValues().get(i) == null) {
continue;
}
- ids.add(dataset.getFieldIds().get(i));
+ final AutofillId viewId = dataset.getFieldIds().get(i);
+ ids.add(viewId);
values.add(dataset.getFieldValues().get(i));
+ final ViewState viewState = mViewStates.get(viewId);
+ if (viewState != null
+ && (viewState.getState() & ViewState.STATE_WAITING_DATASET_AUTH) != 0) {
+ if (sVerbose) {
+ Slog.v(TAG, "autofillApp(): view " + viewId + " waiting auth");
+ }
+ waitingDatasetAuth = true;
+ viewState.resetState(ViewState.STATE_WAITING_DATASET_AUTH);
+ }
}
if (!ids.isEmpty()) {
+ if (waitingDatasetAuth) {
+ hideFillUiIfOwnedByMe();
+ }
+ if (sDebug) Slog.d(TAG, "autoFillApp(): the buck is on the app: " + dataset);
+
mClient.autofill(id, ids, values);
+ setViewStatesLocked(null, dataset, ViewState.STATE_AUTOFILLED, false);
}
- setViewStatesLocked(null, dataset, ViewState.STATE_AUTOFILLED, false);
} catch (RemoteException e) {
Slog.w(TAG, "Error autofilling activity: " + e);
}
@@ -1452,15 +1470,15 @@
}
}
- void destroyLocked() {
+ RemoteFillService destroyLocked() {
if (mDestroyed) {
- return;
+ return null;
}
- mRemoteFillService.destroy();
hideAllUiIfOwnedByMe();
mUi.clearCallback(this);
mDestroyed = true;
mMetricsLogger.action(MetricsEvent.AUTOFILL_SESSION_FINISHED, mPackageName);
+ return mRemoteFillService;
}
private void hideAllUiIfOwnedByMe() {
@@ -1484,8 +1502,11 @@
+ id + " destroyed");
return;
}
- destroyLocked();
+ final RemoteFillService remoteFillService = destroyLocked();
mService.removeSessionLocked(id);
+ if (remoteFillService != null) {
+ remoteFillService.destroy();
+ }
}
private int getLastResponseIndex() {
diff --git a/services/autofill/java/com/android/server/autofill/ViewState.java b/services/autofill/java/com/android/server/autofill/ViewState.java
index f87fa19..cd8f4a5 100644
--- a/services/autofill/java/com/android/server/autofill/ViewState.java
+++ b/services/autofill/java/com/android/server/autofill/ViewState.java
@@ -16,6 +16,7 @@
package com.android.server.autofill;
+import static android.service.autofill.FillRequest.FLAG_MANUAL_REQUEST;
import static com.android.server.autofill.Helper.sDebug;
import static com.android.server.autofill.Helper.sVerbose;
@@ -157,7 +158,7 @@
// TODO: refactor / rename / document this method (and maybeCallOnFillReady) to make it clear
// that it can change the value and update the UI; similarly, should replace code that
// directly sets mAutofillValue to use encapsulation.
- void update(@Nullable AutofillValue autofillValue, @Nullable Rect virtualBounds) {
+ void update(@Nullable AutofillValue autofillValue, @Nullable Rect virtualBounds, int flags) {
if (autofillValue != null) {
mCurrentValue = autofillValue;
}
@@ -165,7 +166,7 @@
mVirtualBounds = virtualBounds;
}
- maybeCallOnFillReady();
+ maybeCallOnFillReady(flags);
}
/**
@@ -173,8 +174,8 @@
* Listener#onFillReady(FillResponse, AutofillId, AutofillValue)} if the
* fill UI is ready to be displayed (i.e. when response and bounds are set).
*/
- void maybeCallOnFillReady() {
- if ((mState & (STATE_AUTOFILLED | STATE_WAITING_DATASET_AUTH)) != 0) {
+ void maybeCallOnFillReady(int flags) {
+ if ((mState & STATE_AUTOFILLED) != 0 && (flags & FLAG_MANUAL_REQUEST) == 0) {
if (sDebug) Slog.d(TAG, "Ignoring UI for " + id + " on " + getStateAsString());
return;
}
diff --git a/services/autofill/java/com/android/server/autofill/ui/FillUi.java b/services/autofill/java/com/android/server/autofill/ui/FillUi.java
index d315b3d..d566d3d 100644
--- a/services/autofill/java/com/android/server/autofill/ui/FillUi.java
+++ b/services/autofill/java/com/android/server/autofill/ui/FillUi.java
@@ -158,6 +158,7 @@
final RemoteViews presentation = dataset.getFieldPresentation(index);
final View view;
try {
+ if (sVerbose) Slog.v(TAG, "setting remote view for " + focusedViewId);
view = presentation.apply(context, null, interceptionHandler);
} catch (RuntimeException e) {
Slog.e(TAG, "Error inflating remote views", e);
@@ -203,6 +204,7 @@
return;
}
if (count <= 0) {
+ if (sDebug) Slog.d(TAG, "No dataset matches filter: " + mFilterText);
mCallback.requestHideFillUi();
} else {
if (updateContentSize()) {
@@ -382,6 +384,7 @@
* Shows the window.
*/
public void show(WindowManager.LayoutParams params) {
+ if (sVerbose) Slog.v(TAG, "show(): showing=" + mShowing + ", params="+ params);
try {
if (!mShowing) {
params.accessibilityTitle = mContentView.getContext()
diff --git a/services/core/java/com/android/server/ConnectivityService.java b/services/core/java/com/android/server/ConnectivityService.java
index 7ae4138..4b12bc4 100644
--- a/services/core/java/com/android/server/ConnectivityService.java
+++ b/services/core/java/com/android/server/ConnectivityService.java
@@ -175,6 +175,9 @@
implements PendingIntent.OnFinished {
private static final String TAG = ConnectivityService.class.getSimpleName();
+ public static final String DIAG_ARG = "--diag";
+ public static final String SHORT_ARG = "--short";
+
private static final boolean DBG = true;
private static final boolean VDBG = false;
@@ -1852,7 +1855,7 @@
final IndentingPrintWriter pw = new IndentingPrintWriter(writer, " ");
if (!DumpUtils.checkDumpPermission(mContext, TAG, pw)) return;
- if (argsContain(args, "--diag")) {
+ if (argsContain(args, DIAG_ARG)) {
dumpNetworkDiagnostics(pw);
return;
}
@@ -1938,7 +1941,7 @@
pw.decreaseIndent();
}
- if (argsContain(args, "--short") == false) {
+ if (argsContain(args, SHORT_ARG) == false) {
pw.println();
synchronized (mValidationLogs) {
pw.println("mValidationLogs (most recent first):");
diff --git a/services/core/java/com/android/server/EventLogTags.logtags b/services/core/java/com/android/server/EventLogTags.logtags
index 6502c01..68f8c1b 100644
--- a/services/core/java/com/android/server/EventLogTags.logtags
+++ b/services/core/java/com/android/server/EventLogTags.logtags
@@ -41,14 +41,10 @@
# ---------------------------
# DeviceStorageMonitorService.java
# ---------------------------
-# The disk space free on the /data partition, in bytes
-2744 free_storage_changed (data|2|2)
-# Device low memory notification and disk space free on the /data partition, in bytes at that time
-2745 low_storage (data|2|2)
-# disk space free on the /data, /system, and /cache partitions in bytes
-2746 free_storage_left (data|2|2),(system|2|2),(cache|2|2)
-# file on cache partition was deleted
+# File on cache partition was deleted
2748 cache_file_deleted (path|3)
+# Storage volume state and usable space in bytes
+2749 storage_state (uuid|3),(old_state|1),(new_state|1),(usable|2),(total|2)
# ---------------------------
diff --git a/services/core/java/com/android/server/LocationManagerService.java b/services/core/java/com/android/server/LocationManagerService.java
index 9e054c3..3460419 100644
--- a/services/core/java/com/android/server/LocationManagerService.java
+++ b/services/core/java/com/android/server/LocationManagerService.java
@@ -1727,7 +1727,7 @@
record.mReceiver.mIdentity.mUid,
record.mReceiver.mIdentity.mPackageName,
record.mReceiver.mAllowedResolutionLevel)) {
- LocationRequest locationRequest = record.mRequest;
+ LocationRequest locationRequest = record.mRealRequest;
long interval = locationRequest.getInterval();
if (!isThrottlingExemptLocked(record.mReceiver.mIdentity)) {
@@ -1740,6 +1740,7 @@
}
}
+ record.mRequest = locationRequest;
providerRequest.locationRequests.add(locationRequest);
if (interval < providerRequest.interval) {
providerRequest.reportLocation = true;
@@ -1832,7 +1833,8 @@
private class UpdateRecord {
final String mProvider;
- final LocationRequest mRequest;
+ final LocationRequest mRealRequest; // original request from client
+ LocationRequest mRequest; // possibly throttled version of the request
final Receiver mReceiver;
boolean mIsForegroundUid;
Location mLastFixBroadcast;
@@ -1843,6 +1845,7 @@
*/
UpdateRecord(String provider, LocationRequest request, Receiver receiver) {
mProvider = provider;
+ mRealRequest = request;
mRequest = request;
mReceiver = receiver;
mIsForegroundUid = isImportanceForeground(
@@ -1892,7 +1895,7 @@
public String toString() {
return "UpdateRecord[" + mProvider + " " + mReceiver.mIdentity.mPackageName
+ "(" + mReceiver.mIdentity.mUid + (mIsForegroundUid ? " foreground" : " background")
- + ")" + " " + mRequest + "]";
+ + ")" + " " + mRealRequest + "]";
}
}
@@ -2533,7 +2536,7 @@
}
// Check whether sufficient time has passed
- long minTime = record.mRequest.getFastestInterval();
+ long minTime = record.mRealRequest.getFastestInterval();
long delta = (loc.getElapsedRealtimeNanos() - lastLoc.getElapsedRealtimeNanos())
/ NANOS_PER_MILLI;
if (delta < minTime - MAX_PROVIDER_SCHEDULING_JITTER_MS) {
@@ -2541,7 +2544,7 @@
}
// Check whether sufficient distance has been traveled
- double minDistance = record.mRequest.getSmallestDisplacement();
+ double minDistance = record.mRealRequest.getSmallestDisplacement();
if (minDistance > 0.0) {
if (loc.distanceTo(lastLoc) <= minDistance) {
return false;
@@ -2549,12 +2552,12 @@
}
// Check whether sufficient number of udpates is left
- if (record.mRequest.getNumUpdates() <= 0) {
+ if (record.mRealRequest.getNumUpdates() <= 0) {
return false;
}
// Check whether the expiry date has passed
- return record.mRequest.getExpireAt() >= now;
+ return record.mRealRequest.getExpireAt() >= now;
}
private void handleLocationChangedLocked(Location location, boolean passive) {
@@ -2672,7 +2675,7 @@
Slog.w(TAG, "RemoteException calling onLocationChanged on " + receiver);
receiverDead = true;
}
- r.mRequest.decrementNumUpdates();
+ r.mRealRequest.decrementNumUpdates();
}
}
@@ -2688,7 +2691,7 @@
}
// track expired records
- if (r.mRequest.getNumUpdates() <= 0 || r.mRequest.getExpireAt() < now) {
+ if (r.mRealRequest.getNumUpdates() <= 0 || r.mRealRequest.getExpireAt() < now) {
if (deadUpdateRecords == null) {
deadUpdateRecords = new ArrayList<>();
}
diff --git a/services/core/java/com/android/server/LockSettingsService.java b/services/core/java/com/android/server/LockSettingsService.java
index f7a682a..773a1ee 100644
--- a/services/core/java/com/android/server/LockSettingsService.java
+++ b/services/core/java/com/android/server/LockSettingsService.java
@@ -161,7 +161,7 @@
*/
private static final int[] SYSTEM_CREDENTIAL_UIDS = {
Process.WIFI_UID, Process.VPN_UID,
- Process.ROOT_UID };
+ Process.ROOT_UID, Process.SYSTEM_UID };
// This class manages life cycle events for encrypted users on File Based Encryption (FBE)
// devices. The most basic of these is to show/hide notifications about missing features until
diff --git a/services/core/java/com/android/server/PinnerService.java b/services/core/java/com/android/server/PinnerService.java
index a94bf79..45f9025 100644
--- a/services/core/java/com/android/server/PinnerService.java
+++ b/services/core/java/com/android/server/PinnerService.java
@@ -16,12 +16,15 @@
package com.android.server;
+import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
+import android.content.IntentFilter;
import android.content.pm.ActivityInfo;
import android.content.pm.ApplicationInfo;
import android.content.pm.PackageManager;
import android.content.pm.ResolveInfo;
+import android.net.Uri;
import android.os.Binder;
import android.os.Build;
import android.os.Handler;
@@ -33,6 +36,7 @@
import android.system.Os;
import android.system.OsConstants;
import android.system.StructStat;
+import android.util.ArraySet;
import android.util.Slog;
import com.android.internal.app.ResolverActivity;
@@ -68,6 +72,19 @@
private PinnerHandler mPinnerHandler = null;
+ private final BroadcastReceiver mBroadcastReceiver = new BroadcastReceiver() {
+ @Override
+ public void onReceive(Context context, Intent intent) {
+ // If this user's camera app has been updated, update pinned files accordingly.
+ if (intent.getAction() == Intent.ACTION_PACKAGE_REPLACED) {
+ Uri packageUri = intent.getData();
+ String packageName = packageUri.getSchemeSpecificPart();
+ ArraySet<String> updatedPackages = new ArraySet<>();
+ updatedPackages.add(packageName);
+ update(updatedPackages);
+ }
+ }
+ };
public PinnerService(Context context) {
super(context);
@@ -76,6 +93,11 @@
mShouldPinCamera = context.getResources().getBoolean(
com.android.internal.R.bool.config_pinnerCameraApp);
mPinnerHandler = new PinnerHandler(BackgroundThread.get().getLooper());
+
+ IntentFilter filter = new IntentFilter();
+ filter.addAction(Intent.ACTION_PACKAGE_REPLACED);
+ filter.addDataScheme("package");
+ mContext.registerReceiver(mBroadcastReceiver, filter);
}
@Override
@@ -85,6 +107,7 @@
}
mBinderService = new BinderService();
publishBinderService("pinner", mBinderService);
+ publishLocalService(PinnerService.class, this);
mPinnerHandler.obtainMessage(PinnerHandler.PIN_ONSTART_MSG).sendToTarget();
mPinnerHandler.obtainMessage(PinnerHandler.PIN_CAMERA_MSG, UserHandle.USER_SYSTEM, 0)
@@ -103,6 +126,20 @@
}
/**
+ * Update the currently pinned files.
+ * Specifically, this only updates camera pinning.
+ * The other files pinned in onStart will not need to be updated.
+ */
+ public void update(ArraySet<String> updatedPackages) {
+ ApplicationInfo cameraInfo = getCameraInfo(UserHandle.USER_SYSTEM);
+ if (cameraInfo != null && updatedPackages.contains(cameraInfo.packageName)) {
+ Slog.i(TAG, "Updating pinned files.");
+ mPinnerHandler.obtainMessage(PinnerHandler.PIN_CAMERA_MSG, UserHandle.USER_SYSTEM, 0)
+ .sendToTarget();
+ }
+ }
+
+ /**
* Handler for on start pinning message
*/
private void handlePinOnStart() {
@@ -202,13 +239,10 @@
return cameraResolveInfo.activityInfo.applicationInfo;
}
+ /**
+ * If the camera app is already pinned, unpin and repin it.
+ */
private boolean pinCamera(int userHandle){
- //we may have already pinned a camera app. If we've pinned this
- //camera app, we're done. otherwise, unpin and pin the new app
- if (alreadyPinned(userHandle)){
- return true;
- }
-
ApplicationInfo cameraInfo = getCameraInfo(userHandle);
if (cameraInfo == null) {
return false;
@@ -244,20 +278,22 @@
// get the path to the odex or oat file
String baseCodePath = cameraInfo.getBaseCodePath();
- String odex = null;
+ String[] files = null;
try {
- odex = DexFile.getDexFileOutputPath(baseCodePath, arch);
+ files = DexFile.getDexFileOutputPaths(baseCodePath, arch);
} catch (IOException ioe) {}
- if (odex == null) {
+ if (files == null) {
return true;
}
//not pinning the oat/odex is not a fatal error
- pf = pinFile(odex, 0, 0, MAX_CAMERA_PIN_SIZE);
- if (pf != null) {
- mPinnedCameraFiles.add(pf);
- if (DEBUG) {
- Slog.i(TAG, "Pinned " + pf.mFilename);
+ for (String file : files) {
+ pf = pinFile(file, 0, 0, MAX_CAMERA_PIN_SIZE);
+ if (pf != null) {
+ mPinnedCameraFiles.add(pf);
+ if (DEBUG) {
+ Slog.i(TAG, "Pinned " + pf.mFilename);
+ }
}
}
diff --git a/services/core/java/com/android/server/StorageManagerService.java b/services/core/java/com/android/server/StorageManagerService.java
index cffb158..35b452a 100644
--- a/services/core/java/com/android/server/StorageManagerService.java
+++ b/services/core/java/com/android/server/StorageManagerService.java
@@ -3296,6 +3296,9 @@
final StorageManager storage = mContext.getSystemService(StorageManager.class);
final StorageStatsManager stats = mContext.getSystemService(StorageStatsManager.class);
+ // Apps can't defy reserved space
+ flags &= ~StorageManager.FLAG_ALLOCATE_DEFY_RESERVED;
+
final boolean aggressive = (flags & StorageManager.FLAG_ALLOCATE_AGGRESSIVE) != 0;
if (aggressive) {
mContext.enforceCallingOrSelfPermission(
@@ -3306,24 +3309,31 @@
try {
// In general, apps can allocate as much space as they want, except
// we never let them eat into either the minimum cache space or into
- // the low disk warning space.
+ // the low disk warning space. To avoid user confusion, this logic
+ // should be kept in sync with getFreeBytes().
final File path = storage.findPathForUuid(volumeUuid);
+
+ final long usable = path.getUsableSpace();
+ final long lowReserved = storage.getStorageLowBytes(path);
+ final long fullReserved = storage.getStorageFullBytes(path);
+
if (stats.isQuotaSupported(volumeUuid)) {
+ final long cacheTotal = stats.getCacheBytes(volumeUuid);
+ final long cacheReserved = storage.getStorageCacheBytes(path);
+ final long cacheClearable = Math.max(0, cacheTotal - cacheReserved);
+
if (aggressive) {
- return Math.max(0,
- stats.getFreeBytes(volumeUuid) - storage.getStorageFullBytes(path));
+ return Math.max(0, (usable + cacheTotal) - fullReserved);
} else {
- return Math.max(0,
- stats.getFreeBytes(volumeUuid) - storage.getStorageLowBytes(path)
- - storage.getStorageCacheBytes(path));
+ return Math.max(0, (usable + cacheClearable) - lowReserved);
}
} else {
// When we don't have fast quota information, we ignore cached
// data and only consider unused bytes.
if (aggressive) {
- return Math.max(0, path.getUsableSpace() - storage.getStorageFullBytes(path));
+ return Math.max(0, usable - fullReserved);
} else {
- return Math.max(0, path.getUsableSpace() - storage.getStorageLowBytes(path));
+ return Math.max(0, usable - lowReserved);
}
}
} catch (IOException e) {
@@ -3337,6 +3347,9 @@
public void allocateBytes(String volumeUuid, long bytes, int flags) {
final StorageManager storage = mContext.getSystemService(StorageManager.class);
+ // Apps can't defy reserved space
+ flags &= ~StorageManager.FLAG_ALLOCATE_DEFY_RESERVED;
+
// This method call will enforce FLAG_ALLOCATE_AGGRESSIVE permissions so
// we don't have to enforce them locally
final long allocatableBytes = getAllocatableBytes(volumeUuid, flags);
@@ -3350,7 +3363,11 @@
// Free up enough disk space to satisfy both the requested allocation
// and our low disk warning space.
final File path = storage.findPathForUuid(volumeUuid);
- bytes += storage.getStorageLowBytes(path);
+ if ((flags & StorageManager.FLAG_ALLOCATE_AGGRESSIVE) != 0) {
+ bytes += storage.getStorageFullBytes(path);
+ } else {
+ bytes += storage.getStorageLowBytes(path);
+ }
mPms.freeStorage(volumeUuid, bytes, flags);
} catch (IOException e) {
diff --git a/services/core/java/com/android/server/SystemServiceManager.java b/services/core/java/com/android/server/SystemServiceManager.java
index 10b2609..72ff606 100644
--- a/services/core/java/com/android/server/SystemServiceManager.java
+++ b/services/core/java/com/android/server/SystemServiceManager.java
@@ -164,6 +164,13 @@
}
}
+ /**
+ * @return true if system has completed the boot; false otherwise.
+ */
+ public boolean isBootCompleted() {
+ return mCurrentPhase >= SystemService.PHASE_BOOT_COMPLETED;
+ }
+
public void startUser(final int userHandle) {
Slog.i(TAG, "Calling onStartUser u" + userHandle);
final int serviceLen = mServices.size();
diff --git a/services/core/java/com/android/server/VibratorService.java b/services/core/java/com/android/server/VibratorService.java
index 678ae38..03e9dd2 100644
--- a/services/core/java/com/android/server/VibratorService.java
+++ b/services/core/java/com/android/server/VibratorService.java
@@ -221,12 +221,19 @@
long[] clickEffectTimings = getLongIntArray(context.getResources(),
com.android.internal.R.array.config_virtualKeyVibePattern);
- VibrationEffect clickEffect = VibrationEffect.createWaveform(clickEffectTimings, -1);
+ VibrationEffect clickEffect;
+ if (clickEffectTimings.length == 0) {
+ clickEffect = null;
+ } else if (clickEffectTimings.length == 1) {
+ clickEffect = VibrationEffect.createOneShot(
+ clickEffectTimings[0], VibrationEffect.DEFAULT_AMPLITUDE);
+ } else {
+ clickEffect = VibrationEffect.createWaveform(clickEffectTimings, -1);
+ }
VibrationEffect doubleClickEffect = VibrationEffect.createWaveform(
new long[] {0, 30, 100, 30} /*timings*/, -1);
mFallbackEffects = new VibrationEffect[] { clickEffect, doubleClickEffect };
-
}
public void systemReady() {
@@ -695,7 +702,7 @@
}
}
final int id = prebaked.getId();
- if (id < 0 || id >= mFallbackEffects.length) {
+ if (id < 0 || id >= mFallbackEffects.length || mFallbackEffects[id] == null) {
Slog.w(TAG, "Failed to play prebaked effect, no fallback");
return 0;
}
diff --git a/services/core/java/com/android/server/am/ActivityManagerService.java b/services/core/java/com/android/server/am/ActivityManagerService.java
index 54b28d1..f3ecfeb 100644
--- a/services/core/java/com/android/server/am/ActivityManagerService.java
+++ b/services/core/java/com/android/server/am/ActivityManagerService.java
@@ -4587,9 +4587,9 @@
}
@Override
- public int startActivityIntentSender(IApplicationThread caller, IntentSender intent,
- Intent fillInIntent, String resolvedType, IBinder resultTo, String resultWho,
- int requestCode, int flagsMask, int flagsValues, Bundle bOptions)
+ public int startActivityIntentSender(IApplicationThread caller, IIntentSender target,
+ IBinder whitelistToken, Intent fillInIntent, String resolvedType, IBinder resultTo,
+ String resultWho, int requestCode, int flagsMask, int flagsValues, Bundle bOptions)
throws TransactionTooLargeException {
enforceNotIsolatedCaller("startActivityIntentSender");
// Refuse possible leaked file descriptors
@@ -4597,12 +4597,11 @@
throw new IllegalArgumentException("File descriptors passed in Intent");
}
- IIntentSender sender = intent.getTarget();
- if (!(sender instanceof PendingIntentRecord)) {
+ if (!(target instanceof PendingIntentRecord)) {
throw new IllegalArgumentException("Bad PendingIntent object");
}
- PendingIntentRecord pir = (PendingIntentRecord)sender;
+ PendingIntentRecord pir = (PendingIntentRecord)target;
synchronized (this) {
// If this is coming from the currently resumed activity, it is
@@ -4613,7 +4612,7 @@
mAppSwitchesAllowedTime = 0;
}
}
- int ret = pir.sendInner(0, fillInIntent, resolvedType, null, null, null,
+ int ret = pir.sendInner(0, fillInIntent, resolvedType, whitelistToken, null, null,
resultTo, resultWho, requestCode, flagsMask, flagsValues, bOptions, null);
return ret;
}
@@ -8448,8 +8447,8 @@
synchronized (mPidsSelfLocked) {
proc = mPidsSelfLocked.get(callingPid);
}
- if (proc != null && proc.curProcState
- < ActivityManager.PROCESS_STATE_RECEIVER) {
+ if (proc != null &&
+ !ActivityManager.isProcStateBackground(proc.curProcState)) {
// Whoever is instigating this is in the foreground, so we will allow it
// to go through.
return ActivityManager.APP_START_MODE_NORMAL;
@@ -10590,8 +10589,7 @@
mStackSupervisor.getStack(PINNED_STACK_ID);
if (pinnedStack != null) {
pinnedStack.animateResizePinnedStack(null /* sourceHintBounds */,
- destBounds, animationDuration,
- false /* schedulePipModeChangedOnAnimationEnd */);
+ destBounds, animationDuration, false /* fromFullscreen */);
}
} else {
throw new IllegalArgumentException("Stack: " + stackId
@@ -13547,7 +13545,9 @@
return;
}
if (pr.hasTopUi != hasTopUi) {
- Slog.i(TAG, "Setting hasTopUi=" + hasTopUi + " for pid=" + pid);
+ if (DEBUG_OOM_ADJ) {
+ Slog.d(TAG, "Setting hasTopUi=" + hasTopUi + " for pid=" + pid);
+ }
pr.hasTopUi = hasTopUi;
changed = true;
}
@@ -13924,9 +13924,9 @@
final boolean supportsPictureInPicture =
mContext.getPackageManager().hasSystemFeature(FEATURE_PICTURE_IN_PICTURE);
- final boolean supportsMultiWindow = ActivityManager.supportsMultiWindow();
+ final boolean supportsMultiWindow = ActivityManager.supportsMultiWindow(mContext);
final boolean supportsSplitScreenMultiWindow =
- ActivityManager.supportsSplitScreenMultiWindow();
+ ActivityManager.supportsSplitScreenMultiWindow(mContext);
final boolean supportsMultiDisplay = mContext.getPackageManager()
.hasSystemFeature(FEATURE_ACTIVITIES_ON_SECONDARY_DISPLAYS);
final String debugApp = Settings.Global.getString(resolver, DEBUG_APP);
@@ -20180,6 +20180,11 @@
mTempConfig.setTo(getGlobalConfiguration());
final int changes = mTempConfig.updateFrom(values);
if (changes == 0) {
+ // Since calling to Activity.setRequestedOrientation leads to freezing the window with
+ // setting WindowManagerService.mWaitingForConfig to true, it is important that we call
+ // performDisplayOverrideConfigUpdate in order to send the new display configuration
+ // (even if there are no actual changes) to unfreeze the window.
+ performDisplayOverrideConfigUpdate(values, deferResume, DEFAULT_DISPLAY);
return 0;
}
@@ -20368,20 +20373,19 @@
int displayId) {
mTempConfig.setTo(mStackSupervisor.getDisplayOverrideConfiguration(displayId));
final int changes = mTempConfig.updateFrom(values);
- if (changes == 0) {
- return 0;
- }
+ if (changes != 0) {
+ Slog.i(TAG, "Override config changes=" + Integer.toHexString(changes) + " "
+ + mTempConfig + " for displayId=" + displayId);
+ mStackSupervisor.setDisplayOverrideConfiguration(mTempConfig, displayId);
- Slog.i(TAG, "Override config changes=" + Integer.toHexString(changes) + " " + mTempConfig
- + " for displayId=" + displayId);
- mStackSupervisor.setDisplayOverrideConfiguration(mTempConfig, displayId);
+ final boolean isDensityChange = (changes & ActivityInfo.CONFIG_DENSITY) != 0;
+ if (isDensityChange && displayId == DEFAULT_DISPLAY) {
+ // Reset the unsupported display size dialog.
+ mUiHandler.sendEmptyMessage(SHOW_UNSUPPORTED_DISPLAY_SIZE_DIALOG_MSG);
- final boolean isDensityChange = (changes & ActivityInfo.CONFIG_DENSITY) != 0;
- if (isDensityChange && displayId == DEFAULT_DISPLAY) {
- // Reset the unsupported display size dialog.
- mUiHandler.sendEmptyMessage(SHOW_UNSUPPORTED_DISPLAY_SIZE_DIALOG_MSG);
-
- killAllBackgroundProcessesExcept(N, ActivityManager.PROCESS_STATE_FOREGROUND_SERVICE);
+ killAllBackgroundProcessesExcept(N,
+ ActivityManager.PROCESS_STATE_FOREGROUND_SERVICE);
+ }
}
// Update the configuration with WM first and check if any of the stacks need to be resized
diff --git a/services/core/java/com/android/server/am/ActivityManagerShellCommand.java b/services/core/java/com/android/server/am/ActivityManagerShellCommand.java
index 6eae9e6..d768304 100644
--- a/services/core/java/com/android/server/am/ActivityManagerShellCommand.java
+++ b/services/core/java/com/android/server/am/ActivityManagerShellCommand.java
@@ -2382,7 +2382,7 @@
if (res == null) {
return -1;
}
- pw.println(ActivityManager.supportsMultiWindow());
+ pw.println(ActivityManager.supportsMultiWindow(mInternal.mContext));
return 0;
}
@@ -2391,7 +2391,7 @@
if (res == null) {
return -1;
}
- pw.println(ActivityManager.supportsSplitScreenMultiWindow());
+ pw.println(ActivityManager.supportsSplitScreenMultiWindow(mInternal.mContext));
return 0;
}
diff --git a/services/core/java/com/android/server/am/ActivityRecord.java b/services/core/java/com/android/server/am/ActivityRecord.java
index 55ec3b0..9698a8f 100644
--- a/services/core/java/com/android/server/am/ActivityRecord.java
+++ b/services/core/java/com/android/server/am/ActivityRecord.java
@@ -130,6 +130,7 @@
import android.content.res.CompatibilityInfo;
import android.content.res.Configuration;
import android.graphics.Bitmap;
+import android.graphics.GraphicBuffer;
import android.graphics.Rect;
import android.os.Build;
import android.os.Bundle;
@@ -284,7 +285,6 @@
boolean visible; // does this activity's window need to be shown?
boolean visibleIgnoringKeyguard; // is this activity visible, ignoring the fact that Keyguard
// might hide this activity?
- private boolean mLastSetWindowVisibility; // The last window visibility state that was set.
private boolean mDeferHidingClient; // If true we told WM to defer reporting to the client
// process that it is hidden.
boolean sleeping; // have we told the activity to sleep?
@@ -1420,19 +1420,17 @@
break;
case ANIM_THUMBNAIL_SCALE_UP:
case ANIM_THUMBNAIL_SCALE_DOWN:
- boolean scaleUp = (animationType == ANIM_THUMBNAIL_SCALE_UP);
- service.mWindowManager.overridePendingAppTransitionThumb(
- pendingOptions.getThumbnail(),
+ final boolean scaleUp = (animationType == ANIM_THUMBNAIL_SCALE_UP);
+ final GraphicBuffer buffer = pendingOptions.getThumbnail();
+ service.mWindowManager.overridePendingAppTransitionThumb(buffer,
pendingOptions.getStartX(), pendingOptions.getStartY(),
pendingOptions.getOnAnimationStartListener(),
scaleUp);
if (intent.getSourceBounds() == null) {
intent.setSourceBounds(new Rect(pendingOptions.getStartX(),
pendingOptions.getStartY(),
- pendingOptions.getStartX()
- + pendingOptions.getThumbnail().getWidth(),
- pendingOptions.getStartY()
- + pendingOptions.getThumbnail().getHeight()));
+ pendingOptions.getStartX() + buffer.getWidth(),
+ pendingOptions.getStartY() + buffer.getHeight()));
}
break;
case ANIM_THUMBNAIL_ASPECT_SCALE_UP:
@@ -1589,10 +1587,6 @@
}
void setVisibility(boolean visible) {
- if (mLastSetWindowVisibility == visible) {
- return;
- }
- mLastSetWindowVisibility = visible;
mWindowContainerController.setVisibility(visible, mDeferHidingClient);
mStackSupervisor.mActivityMetricsLogger.notifyVisibilityChanged(this, visible);
}
diff --git a/services/core/java/com/android/server/am/ActivityStack.java b/services/core/java/com/android/server/am/ActivityStack.java
index c56e4ea..9db957c 100644
--- a/services/core/java/com/android/server/am/ActivityStack.java
+++ b/services/core/java/com/android/server/am/ActivityStack.java
@@ -244,7 +244,7 @@
static final int REMOVE_TASK_MODE_MOVING = 1;
// Similar to {@link #REMOVE_TASK_MODE_MOVING} and the task will be added to the top of its new
// stack and the new stack will be on top of all stacks.
- private static final int REMOVE_TASK_MODE_MOVING_TO_TOP = 2;
+ static final int REMOVE_TASK_MODE_MOVING_TO_TOP = 2;
// The height/width divide used when fitting a task within a bounds with method
// {@link #fitWithinBounds}.
@@ -1152,11 +1152,15 @@
void updateActivityApplicationInfoLocked(ApplicationInfo aInfo) {
final String packageName = aInfo.packageName;
+ final int userId = UserHandle.getUserId(aInfo.uid);
+
for (int taskNdx = mTaskHistory.size() - 1; taskNdx >= 0; --taskNdx) {
final List<ActivityRecord> activities = mTaskHistory.get(taskNdx).mActivities;
for (int activityNdx = activities.size() - 1; activityNdx >= 0; --activityNdx) {
- if (packageName.equals(activities.get(activityNdx).packageName)) {
- activities.get(activityNdx).info.applicationInfo = aInfo;
+ final ActivityRecord ar = activities.get(activityNdx);
+
+ if ((userId == ar.userId) && packageName.equals(ar.packageName)) {
+ ar.info.applicationInfo = aInfo;
}
}
}
@@ -4038,6 +4042,9 @@
mStackSupervisor.moveHomeStackTaskToTop(reason);
}
+ // The following block can be executed multiple times if there is more than one overlay.
+ // {@link ActivityStackSupervisor#removeTaskByIdLocked} handles this by reverse lookup
+ // of the task by id and exiting early if not found.
if (onlyHasTaskOverlays) {
// When destroying a task, tell the supervisor to remove it so that any activity it
// has can be cleaned up correctly. This is currently the only place where we remove
@@ -4049,7 +4056,12 @@
mStackSupervisor.removeTaskByIdLocked(task.taskId, false /* killProcess */,
!REMOVE_FROM_RECENTS, PAUSE_IMMEDIATELY);
}
- removeTask(task, reason, REMOVE_TASK_MODE_DESTROYING);
+
+ // We must keep the task around until all activities are destroyed. The following
+ // statement will only execute once since overlays are also considered activities.
+ if (lastActivity) {
+ removeTask(task, reason, REMOVE_TASK_MODE_DESTROYING);
+ }
}
cleanUpActivityServicesLocked(r);
r.removeUriPermissionsLocked();
diff --git a/services/core/java/com/android/server/am/ActivityStackSupervisor.java b/services/core/java/com/android/server/am/ActivityStackSupervisor.java
index 79ea7ba..b55bae9 100644
--- a/services/core/java/com/android/server/am/ActivityStackSupervisor.java
+++ b/services/core/java/com/android/server/am/ActivityStackSupervisor.java
@@ -470,7 +470,7 @@
}
Configuration getDisplayOverrideConfiguration(int displayId) {
- final ActivityDisplay activityDisplay = mActivityDisplays.get(displayId);
+ final ActivityDisplay activityDisplay = getActivityDisplayOrCreateLocked(displayId);
if (activityDisplay == null) {
throw new IllegalArgumentException("No display found with id: " + displayId);
}
@@ -479,7 +479,7 @@
}
void setDisplayOverrideConfiguration(Configuration overrideConfiguration, int displayId) {
- final ActivityDisplay activityDisplay = mActivityDisplays.get(displayId);
+ final ActivityDisplay activityDisplay = getActivityDisplayOrCreateLocked(displayId);
if (activityDisplay == null) {
throw new IllegalArgumentException("No display found with id: " + displayId);
}
@@ -507,7 +507,7 @@
if (displayId == INVALID_DISPLAY) {
return false;
}
- final ActivityDisplay targetDisplay = mActivityDisplays.get(displayId);
+ final ActivityDisplay targetDisplay = getActivityDisplayOrCreateLocked(displayId);
if (targetDisplay == null) {
throw new IllegalArgumentException("No display found with id: " + displayId);
}
@@ -1672,7 +1672,7 @@
if (DEBUG_TASKS) Slog.d(TAG, "Launch on display check: displayId=" + launchDisplayId
+ " callingPid=" + callingPid + " callingUid=" + callingUid);
- final ActivityDisplay activityDisplay = mActivityDisplays.get(launchDisplayId);
+ final ActivityDisplay activityDisplay = getActivityDisplayOrCreateLocked(launchDisplayId);
if (activityDisplay == null) {
Slog.w(TAG, "Launch on display check: display not found");
return false;
@@ -2191,7 +2191,7 @@
* @return Existing stack if there is a valid one, new dynamic stack if it is valid or null.
*/
ActivityStack getValidLaunchStackOnDisplay(int displayId, @NonNull ActivityRecord r) {
- final ActivityDisplay activityDisplay = mActivityDisplays.get(displayId);
+ final ActivityDisplay activityDisplay = getActivityDisplayOrCreateLocked(displayId);
if (activityDisplay == null) {
throw new IllegalArgumentException(
"Display with displayId=" + displayId + " not found.");
@@ -2242,10 +2242,9 @@
for (int i = mTmpOrderedDisplayIds.size() - 1; i >= 0; --i) {
final int displayId = mTmpOrderedDisplayIds.get(i);
- final List<ActivityStack> stacks = mActivityDisplays.get(displayId).mStacks;
- if (stacks == null) {
- continue;
- }
+ // If a display is registered in WM, it must also be available in AM.
+ @SuppressWarnings("ConstantConditions")
+ final List<ActivityStack> stacks = getActivityDisplayOrCreateLocked(displayId).mStacks;
for (int j = stacks.size() - 1; j >= 0; --j) {
final ActivityStack stack = stacks.get(j);
if (stack != currentFocus && stack.isFocusable()
@@ -2576,7 +2575,7 @@
}
ActivityStack createStackOnDisplay(int stackId, int displayId, boolean onTop) {
- final ActivityDisplay activityDisplay = mActivityDisplays.get(displayId);
+ final ActivityDisplay activityDisplay = getActivityDisplayOrCreateLocked(displayId);
if (activityDisplay == null) {
return null;
}
@@ -2808,7 +2807,7 @@
* @param onTop Indicates whether container should be place on top or on bottom.
*/
void moveStackToDisplayLocked(int stackId, int displayId, boolean onTop) {
- final ActivityDisplay activityDisplay = mActivityDisplays.get(displayId);
+ final ActivityDisplay activityDisplay = getActivityDisplayOrCreateLocked(displayId);
if (activityDisplay == null) {
throw new IllegalArgumentException("moveStackToDisplayLocked: Unknown displayId="
+ displayId);
@@ -2986,18 +2985,21 @@
mWindowManager.continueSurfaceLayout();
}
- // The task might have already been running and its visibility needs to be synchronized
- // with the visibility of the stack / windows.
+ // Calculate the default bounds (don't use existing stack bounds as we may have just created
+ // the stack, and schedule the start of the animation into PiP (the bounds animator that
+ // is triggered by this is posted on another thread)
+ final Rect destBounds = stack.getDefaultPictureInPictureBounds(aspectRatio);
+
+ stack.animateResizePinnedStack(sourceHintBounds, destBounds, -1 /* animationDuration */,
+ true /* fromFullscreen */);
+
+ // Update the visibility of all activities after the they have been reparented to the new
+ // stack. This MUST run after the animation above is scheduled to ensure that the windows
+ // drawn signal is scheduled after the bounds animation start call on the bounds animator
+ // thread.
ensureActivitiesVisibleLocked(null, 0, !PRESERVE_WINDOWS);
resumeFocusedStackTopActivityLocked();
- // Calculate the default bounds (don't use existing stack bounds as we may have just created
- // the stack
- final Rect destBounds = stack.getPictureInPictureBounds(aspectRatio,
- false /* useExistingStackBounds */);
-
- stack.animateResizePinnedStack(sourceHintBounds, destBounds, -1 /* animationDuration */,
- true /* schedulePipModeChangedOnAnimationEnd */);
mService.mTaskChangeNotificationController.notifyActivityPinned(r.packageName,
r.getTask().taskId);
}
@@ -3912,25 +3914,44 @@
}
private void handleDisplayAdded(int displayId) {
- boolean newDisplay;
synchronized (mService) {
- newDisplay = mActivityDisplays.get(displayId) == null;
- if (newDisplay) {
- ActivityDisplay activityDisplay = new ActivityDisplay(displayId);
- if (activityDisplay.mDisplay == null) {
- Slog.w(TAG, "Display " + displayId + " gone before initialization complete");
- return;
- }
- mActivityDisplays.put(displayId, activityDisplay);
- calculateDefaultMinimalSizeOfResizeableTasks(activityDisplay);
- mWindowManager.onDisplayAdded(displayId);
- }
+ getActivityDisplayOrCreateLocked(displayId);
}
}
/** Check if display with specified id is added to the list. */
boolean isDisplayAdded(int displayId) {
- return mActivityDisplays.get(displayId) != null;
+ return getActivityDisplayOrCreateLocked(displayId) != null;
+ }
+
+ /**
+ * Get an existing instance of {@link ActivityDisplay} or create new if there is a
+ * corresponding record in display manager.
+ */
+ private ActivityDisplay getActivityDisplayOrCreateLocked(int displayId) {
+ ActivityDisplay activityDisplay = mActivityDisplays.get(displayId);
+ if (activityDisplay != null) {
+ return activityDisplay;
+ }
+ if (mDisplayManager == null) {
+ // The system isn't fully initialized yet.
+ return null;
+ }
+ final Display display = mDisplayManager.getDisplay(displayId);
+ if (display == null) {
+ // The display is not registered in DisplayManager.
+ return null;
+ }
+ // The display hasn't been added to ActivityManager yet, create a new record now.
+ activityDisplay = new ActivityDisplay(displayId);
+ if (activityDisplay.mDisplay == null) {
+ Slog.w(TAG, "Display " + displayId + " gone before initialization complete");
+ return null;
+ }
+ mActivityDisplays.put(displayId, activityDisplay);
+ calculateDefaultMinimalSizeOfResizeableTasks(activityDisplay);
+ mWindowManager.onDisplayAdded(displayId);
+ return activityDisplay;
}
private void calculateDefaultMinimalSizeOfResizeableTasks(ActivityDisplay display) {
@@ -3988,6 +4009,7 @@
info.stackId = stack.mStackId;
info.userId = stack.mCurrentUser;
info.visible = stack.shouldBeVisible(null) == STACK_VISIBLE;
+ // A stack might be not attached to a display.
info.position = display != null
? display.mStacks.indexOf(stack)
: 0;
@@ -4615,7 +4637,7 @@
@Override
public void addToDisplay(int displayId) {
synchronized (mService) {
- ActivityDisplay activityDisplay = mActivityDisplays.get(displayId);
+ final ActivityDisplay activityDisplay = getActivityDisplayOrCreateLocked(displayId);
if (activityDisplay == null) {
return;
}
diff --git a/services/core/java/com/android/server/am/ActivityStarter.java b/services/core/java/com/android/server/am/ActivityStarter.java
index 960351b..07caf9e 100644
--- a/services/core/java/com/android/server/am/ActivityStarter.java
+++ b/services/core/java/com/android/server/am/ActivityStarter.java
@@ -957,7 +957,7 @@
// If we are not able to proceed, disassociate the activity from the task. Leaving an
// activity in an incomplete state can lead to issues, such as performing operations
// without a window container.
- if (ActivityManager.isStartResultFatalError(result)
+ if (!ActivityManager.isStartResultSuccessful(result)
&& mStartActivity.getTask() != null) {
mStartActivity.getTask().removeActivity(mStartActivity);
}
@@ -1051,6 +1051,15 @@
reusedActivity = setTargetStackAndMoveToFrontIfNeeded(reusedActivity);
+ final ActivityRecord outResult =
+ outActivity != null && outActivity.length > 0 ? outActivity[0] : null;
+
+ // When there is a reused activity and the current result is a trampoline activity,
+ // set the reused activity as the result.
+ if (outResult != null && (outResult.finishing || outResult.noDisplay)) {
+ outActivity[0] = reusedActivity;
+ }
+
if ((mStartFlags & START_FLAG_ONLY_IF_NEEDED) != 0) {
// We don't need to start a new activity, and the client said not to do anything
// if that is the case, so this is it! And for paranoia, make sure we have
@@ -1423,7 +1432,13 @@
+ "; forcing " + "Intent.FLAG_ACTIVITY_NEW_TASK for: " + mIntent);
mLaunchFlags |= FLAG_ACTIVITY_NEW_TASK;
mNewTaskInfo = mSourceRecord.info;
- mNewTaskIntent = mSourceRecord.getTask().intent;
+
+ // It is not guaranteed that the source record will have a task associated with it. For,
+ // example, if this method is being called for processing a pending activity launch, it
+ // is possible that the activity has been removed from the task after the launch was
+ // enqueued.
+ final TaskRecord sourceTask = mSourceRecord.getTask();
+ mNewTaskIntent = sourceTask != null ? sourceTask.intent : null;
}
mSourceRecord = null;
mSourceStack = null;
diff --git a/services/core/java/com/android/server/am/BatteryStatsService.java b/services/core/java/com/android/server/am/BatteryStatsService.java
index 11fc40b..c20221b 100644
--- a/services/core/java/com/android/server/am/BatteryStatsService.java
+++ b/services/core/java/com/android/server/am/BatteryStatsService.java
@@ -16,6 +16,10 @@
package com.android.server.am;
+import static com.android.internal.os.BatteryStatsImpl.ExternalStatsSync.UPDATE_CPU;
+import static com.android.internal.os.BatteryStatsImpl.ExternalStatsSync.UPDATE_RADIO;
+import static com.android.internal.os.BatteryStatsImpl.ExternalStatsSync.UPDATE_WIFI;
+
import android.annotation.Nullable;
import android.bluetooth.BluetoothActivityEnergyInfo;
import android.bluetooth.BluetoothAdapter;
@@ -85,6 +89,7 @@
implements PowerManagerInternal.LowPowerModeListener,
BatteryStatsImpl.PlatformIdleStateCallback {
static final String TAG = "BatteryStatsService";
+ static final boolean DBG = false;
/**
* How long to wait on an individual subsystem to return its stats.
@@ -150,11 +155,11 @@
case MSG_WRITE_TO_DISK:
updateExternalStatsSync("write", UPDATE_ALL);
- Slog.d(TAG, "begin writeAsyncLocked");
+ if (DBG) Slog.d(TAG, "begin writeAsyncLocked");
synchronized (mStats) {
mStats.writeAsyncLocked();
}
- Slog.d(TAG, "end writeAsyncLocked");
+ if (DBG) Slog.d(TAG, "end writeAsyncLocked");
break;
}
}
@@ -194,7 +199,7 @@
@Override
public String getPlatformLowPowerStats() {
- Slog.d(TAG, "begin getPlatformLowPowerStats");
+ if (DBG) Slog.d(TAG, "begin getPlatformLowPowerStats");
try {
mUtf8BufferStat.clear();
mUtf16BufferStat.clear();
@@ -210,7 +215,7 @@
mUtf16BufferStat.flip();
return mUtf16BufferStat.toString();
} finally {
- Slog.d(TAG, "end getPlatformLowPowerStats");
+ if (DBG) Slog.d(TAG, "end getPlatformLowPowerStats");
}
}
@@ -228,10 +233,12 @@
public void publish(Context context) {
mContext = context;
- mStats.setRadioScanningTimeout(mContext.getResources().getInteger(
- com.android.internal.R.integer.config_radioScanningTimeout)
- * 1000L);
- mStats.setPowerProfile(new PowerProfile(context));
+ synchronized (mStats) {
+ mStats.setRadioScanningTimeoutLocked(mContext.getResources().getInteger(
+ com.android.internal.R.integer.config_radioScanningTimeout)
+ * 1000L);
+ mStats.setPowerProfileLocked(new PowerProfile(context));
+ }
ServiceManager.addService(BatteryStats.SERVICE_NAME, asBinder());
}
@@ -242,9 +249,11 @@
public void initPowerManagement() {
final PowerManagerInternal powerMgr = LocalServices.getService(PowerManagerInternal.class);
powerMgr.registerLowPowerModeObserver(this);
- mStats.notePowerSaveMode(
- powerMgr.getLowPowerState(ServiceType.BATTERY_STATS)
- .batterySaverEnabled);
+ synchronized (mStats) {
+ mStats.notePowerSaveModeLocked(
+ powerMgr.getLowPowerState(ServiceType.BATTERY_STATS)
+ .batterySaverEnabled);
+ }
(new WakeupReasonThread()).start();
}
@@ -277,7 +286,7 @@
@Override
public void onLowPowerModeChanged(PowerSaveState result) {
synchronized (mStats) {
- mStats.notePowerSaveMode(result.batterySaverEnabled);
+ mStats.notePowerSaveModeLocked(result.batterySaverEnabled);
}
}
@@ -559,11 +568,11 @@
public void noteScreenState(int state) {
enforceCallingPermission();
- Slog.d(TAG, "begin noteScreenState");
+ if (DBG) Slog.d(TAG, "begin noteScreenState");
synchronized (mStats) {
mStats.noteScreenStateLocked(state);
}
- Slog.d(TAG, "end noteScreenState");
+ if (DBG) Slog.d(TAG, "end noteScreenState");
}
public void noteScreenBrightness(int brightness) {
@@ -603,8 +612,13 @@
public void noteMobileRadioPowerState(int powerState, long timestampNs, int uid) {
enforceCallingPermission();
+ boolean update;
synchronized (mStats) {
- mStats.noteMobileRadioPowerState(powerState, timestampNs, uid);
+ update = mStats.noteMobileRadioPowerStateLocked(powerState, timestampNs, uid);
+ }
+
+ if (update) {
+ mHandler.scheduleSync("modem-data", UPDATE_RADIO);
}
}
@@ -716,11 +730,11 @@
public void noteStartCamera(int uid) {
enforceCallingPermission();
- Slog.d(TAG, "begin noteStartCamera");
+ if (DBG) Slog.d(TAG, "begin noteStartCamera");
synchronized (mStats) {
mStats.noteCameraOnLocked(uid);
}
- Slog.d(TAG, "end noteStartCamera");
+ if (DBG) Slog.d(TAG, "end noteStartCamera");
}
public void noteStopCamera(int uid) {
@@ -756,7 +770,7 @@
powerState == DataConnectionRealTimeInfo.DC_POWER_STATE_MEDIUM) ? "active"
: "inactive";
mHandler.scheduleSync("wifi-data: " + type,
- BatteryStatsImpl.ExternalStatsSync.UPDATE_WIFI);
+ UPDATE_WIFI);
}
mStats.noteWifiRadioPowerState(powerState, tsNanos, uid);
}
@@ -914,9 +928,7 @@
@Override
public void noteNetworkStatsEnabled() {
enforceCallingPermission();
- synchronized (mStats) {
- mStats.noteNetworkStatsEnabledLocked();
- }
+ mHandler.scheduleSync("network-stats-enabled", UPDATE_RADIO | UPDATE_WIFI);
}
@Override
@@ -942,10 +954,10 @@
}
@Override
- public void noteBleScanStarted(WorkSource ws) {
+ public void noteBleScanStarted(WorkSource ws, boolean isUnoptimized) {
enforceCallingPermission();
synchronized (mStats) {
- mStats.noteBluetoothScanStartedFromSourceLocked(ws);
+ mStats.noteBluetoothScanStartedFromSourceLocked(ws, isUnoptimized);
}
}
@@ -982,9 +994,7 @@
return;
}
- synchronized (mStats) {
- mStats.updateWifiStateLocked(info);
- }
+ mStats.updateWifiState(info);
}
@Override
@@ -1009,9 +1019,7 @@
return;
}
- synchronized (mStats) {
- mStats.updateMobileRadioStateLocked(SystemClock.elapsedRealtime(), info);
- }
+ mStats.updateMobileRadioState(info);
}
public boolean isOnBattery() {
@@ -1340,23 +1348,23 @@
}
}
}
- Slog.d(TAG, "begin dumpCheckinLocked from UID " + Binder.getCallingUid());
+ if (DBG) Slog.d(TAG, "begin dumpCheckinLocked from UID " + Binder.getCallingUid());
synchronized (mStats) {
mStats.dumpCheckinLocked(mContext, pw, apps, flags, historyStart);
if (writeData) {
mStats.writeAsyncLocked();
}
}
- Slog.d(TAG, "end dumpCheckinLocked");
+ if (DBG) Slog.d(TAG, "end dumpCheckinLocked");
} else {
- Slog.d(TAG, "begin dumpLocked from UID " + Binder.getCallingUid());
+ if (DBG) Slog.d(TAG, "begin dumpLocked from UID " + Binder.getCallingUid());
synchronized (mStats) {
mStats.dumpLocked(mContext, pw, flags, reqUid, historyStart);
if (writeData) {
mStats.writeAsyncLocked();
}
}
- Slog.d(TAG, "end dumpLocked");
+ if (DBG) Slog.d(TAG, "end dumpLocked");
}
}
@@ -1478,15 +1486,15 @@
SynchronousResultReceiver bluetoothReceiver = null;
SynchronousResultReceiver modemReceiver = null;
- Slog.d(TAG, "begin updateExternalStatsSync reason=" + reason);
+ if (DBG) Slog.d(TAG, "begin updateExternalStatsSync reason=" + reason);
synchronized (mExternalStatsLock) {
if (mContext == null) {
// Don't do any work yet.
- Slog.d(TAG, "end updateExternalStatsSync");
+ if (DBG) Slog.d(TAG, "end updateExternalStatsSync");
return;
}
- if ((updateFlags & BatteryStatsImpl.ExternalStatsSync.UPDATE_WIFI) != 0) {
+ if ((updateFlags & UPDATE_WIFI) != 0) {
if (mWifiManager == null) {
mWifiManager = IWifiManager.Stub.asInterface(
ServiceManager.getService(Context.WIFI_SERVICE));
@@ -1549,18 +1557,12 @@
BatteryStats.HistoryItem.EVENT_COLLECT_EXTERNAL_STATS,
reason, 0);
- mStats.updateCpuTimeLocked();
+ if ((updateFlags & UPDATE_CPU) != 0) {
+ mStats.updateCpuTimeLocked(true /* updateCpuFreqData */);
+ }
mStats.updateKernelWakelocksLocked();
mStats.updateKernelMemoryBandwidthLocked();
- if (wifiInfo != null) {
- if (wifiInfo.isValid()) {
- mStats.updateWifiStateLocked(extractDelta(wifiInfo));
- } else {
- Slog.e(TAG, "wifi info is invalid: " + wifiInfo);
- }
- }
-
if (bluetoothInfo != null) {
if (bluetoothInfo.isValid()) {
mStats.updateBluetoothStateLocked(bluetoothInfo);
@@ -1568,18 +1570,25 @@
Slog.e(TAG, "bluetooth info is invalid: " + bluetoothInfo);
}
}
+ }
- if (modemInfo != null) {
- if (modemInfo.isValid()) {
- mStats.updateMobileRadioStateLocked(SystemClock.elapsedRealtime(),
- modemInfo);
- } else {
- Slog.e(TAG, "modem info is invalid: " + modemInfo);
- }
+ if (wifiInfo != null) {
+ if (wifiInfo.isValid()) {
+ mStats.updateWifiState(extractDelta(wifiInfo));
+ } else {
+ Slog.e(TAG, "wifi info is invalid: " + wifiInfo);
+ }
+ }
+
+ if (modemInfo != null) {
+ if (modemInfo.isValid()) {
+ mStats.updateMobileRadioState(modemInfo);
+ } else {
+ Slog.e(TAG, "modem info is invalid: " + modemInfo);
}
}
}
- Slog.d(TAG, "end updateExternalStatsSync");
+ if (DBG) Slog.d(TAG, "end updateExternalStatsSync");
}
/**
@@ -1599,7 +1608,7 @@
return getHealthStatsForUidLocked(requestUid);
}
} catch (Exception ex) {
- Slog.d(TAG, "Crashed while writing for takeUidSnapshot(" + requestUid + ")", ex);
+ Slog.w(TAG, "Crashed while writing for takeUidSnapshot(" + requestUid + ")", ex);
throw ex;
} finally {
Binder.restoreCallingIdentity(ident);
@@ -1629,7 +1638,7 @@
return results;
}
} catch (Exception ex) {
- Slog.d(TAG, "Crashed while writing for takeUidSnapshots("
+ if (DBG) Slog.d(TAG, "Crashed while writing for takeUidSnapshots("
+ Arrays.toString(requestUids) + ") i=" + i, ex);
throw ex;
} finally {
diff --git a/services/core/java/com/android/server/am/KeyguardController.java b/services/core/java/com/android/server/am/KeyguardController.java
index 144eb11..2e0ec0b 100644
--- a/services/core/java/com/android/server/am/KeyguardController.java
+++ b/services/core/java/com/android/server/am/KeyguardController.java
@@ -97,7 +97,7 @@
mKeyguardShowing = showing;
dismissDockedStackIfNeeded();
if (showing) {
- mKeyguardGoingAway = false;
+ setKeyguardGoingAway(false);
mDismissalRequested = false;
}
mStackSupervisor.ensureActivitiesVisibleLocked(null, 0, !PRESERVE_WINDOWS);
@@ -114,7 +114,7 @@
if (mKeyguardShowing) {
mWindowManager.deferSurfaceLayout();
try {
- mKeyguardGoingAway = true;
+ setKeyguardGoingAway(true);
mWindowManager.prepareAppTransition(TRANSIT_KEYGUARD_GOING_AWAY,
false /* alwaysKeepCurrent */, convertTransitFlags(flags),
false /* forceOverride */);
@@ -139,6 +139,11 @@
mWindowManager.dismissKeyguard(callback);
}
+ private void setKeyguardGoingAway(boolean keyguardGoingAway) {
+ mKeyguardGoingAway = keyguardGoingAway;
+ mWindowManager.setKeyguardGoingAway(keyguardGoingAway);
+ }
+
private void failCallback(IKeyguardDismissCallback callback) {
try {
callback.onDismissError();
diff --git a/services/core/java/com/android/server/am/PinnedActivityStack.java b/services/core/java/com/android/server/am/PinnedActivityStack.java
index 34cdb54..2010c24 100644
--- a/services/core/java/com/android/server/am/PinnedActivityStack.java
+++ b/services/core/java/com/android/server/am/PinnedActivityStack.java
@@ -44,18 +44,18 @@
return new PinnedStackWindowController(mStackId, this, displayId, onTop, outBounds);
}
- Rect getPictureInPictureBounds(float aspectRatio, boolean useExistingStackBounds) {
+ Rect getDefaultPictureInPictureBounds(float aspectRatio) {
return getWindowContainerController().getPictureInPictureBounds(aspectRatio,
- useExistingStackBounds);
+ null /* currentStackBounds */);
}
void animateResizePinnedStack(Rect sourceHintBounds, Rect toBounds, int animationDuration,
- boolean schedulePipModeChangedOnAnimationEnd) {
+ boolean fromFullscreen) {
if (skipResizeAnimation(toBounds == null /* toFullscreen */)) {
mService.moveTasksToFullscreenStack(mStackId, true /* onTop */);
} else {
getWindowContainerController().animateResizePinnedStack(toBounds, sourceHintBounds,
- animationDuration, schedulePipModeChangedOnAnimationEnd);
+ animationDuration, fromFullscreen);
}
}
diff --git a/services/core/java/com/android/server/am/ProcessRecord.java b/services/core/java/com/android/server/am/ProcessRecord.java
index b222e3a..53c7f84 100644
--- a/services/core/java/com/android/server/am/ProcessRecord.java
+++ b/services/core/java/com/android/server/am/ProcessRecord.java
@@ -302,6 +302,10 @@
pw.print(" hasAboveClient="); pw.print(hasAboveClient);
pw.print(" treatLikeActivity="); pw.println(treatLikeActivity);
}
+ if (hasTopUi || hasOverlayUi) {
+ pw.print(prefix); pw.print("hasTopUi="); pw.print(hasTopUi);
+ pw.print(" hasOverlayUi="); pw.println(hasOverlayUi);
+ }
if (foregroundServices || forcingToImportant != null) {
pw.print(prefix); pw.print("foregroundServices="); pw.print(foregroundServices);
pw.print(" forcingToImportant="); pw.println(forcingToImportant);
@@ -428,12 +432,6 @@
pw.print(prefix); pw.print(" - "); pw.println(receivers.valueAt(i));
}
}
- if (hasTopUi) {
- pw.print(prefix); pw.print("hasTopUi="); pw.print(hasTopUi);
- }
- if (hasOverlayUi) {
- pw.print(prefix); pw.print("hasOverlayUi="); pw.print(hasOverlayUi);
- }
}
ProcessRecord(BatteryStatsImpl _batteryStats, ApplicationInfo _info,
diff --git a/services/core/java/com/android/server/am/ProcessStatsService.java b/services/core/java/com/android/server/am/ProcessStatsService.java
index deb3b28..39aed7c 100644
--- a/services/core/java/com/android/server/am/ProcessStatsService.java
+++ b/services/core/java/com/android/server/am/ProcessStatsService.java
@@ -233,7 +233,8 @@
updateFile();
}
mLastWriteTime = SystemClock.uptimeMillis();
- Slog.i(TAG, "Prepared write state in " + (SystemClock.uptimeMillis()-now) + "ms");
+ if (DEBUG) Slog.d(TAG, "Prepared write state in "
+ + (SystemClock.uptimeMillis()-now) + "ms");
if (!sync) {
BackgroundThread.getHandler().post(new Runnable() {
@Override public void run() {
diff --git a/services/core/java/com/android/server/am/ProviderMap.java b/services/core/java/com/android/server/am/ProviderMap.java
index a6997f9..32d03da 100644
--- a/services/core/java/com/android/server/am/ProviderMap.java
+++ b/services/core/java/com/android/server/am/ProviderMap.java
@@ -382,18 +382,29 @@
}
/**
- * Invokes IApplicationThread.dumpProvider() on the thread of the specified provider if
- * there is a thread associated with the provider.
+ * Before invoking IApplicationThread.dumpProvider(), print meta information to the print
+ * writer and handle passed flags.
*/
private void dumpProvider(String prefix, FileDescriptor fd, PrintWriter pw,
final ContentProviderRecord r, String[] args, boolean dumpAll) {
+ for (String s: args) {
+ if (!dumpAll && s.contains("--proto")) {
+ if (r.proc != null && r.proc.thread != null) {
+ dumpToTransferPipe(null , fd, pw, r, args);
+ }
+ return;
+ }
+ }
String innerPrefix = prefix + " ";
synchronized (mAm) {
pw.print(prefix); pw.print("PROVIDER ");
- pw.print(r);
- pw.print(" pid=");
- if (r.proc != null) pw.println(r.proc.pid);
- else pw.println("(not running)");
+ pw.print(r);
+ pw.print(" pid=");
+ if (r.proc != null) {
+ pw.println(r.proc.pid);
+ } else {
+ pw.println("(not running)");
+ }
if (dumpAll) {
r.dump(pw, innerPrefix, true);
}
@@ -401,23 +412,32 @@
if (r.proc != null && r.proc.thread != null) {
pw.println(" Client:");
pw.flush();
+ dumpToTransferPipe(" ", fd, pw, r, args);
+ }
+ }
+
+ /**
+ * Invokes IApplicationThread.dumpProvider() on the thread of the specified provider without
+ * any meta string (e.g., provider info, indentation) written to the file descriptor.
+ */
+ private void dumpToTransferPipe(String prefix, FileDescriptor fd, PrintWriter pw,
+ final ContentProviderRecord r, String[] args) {
+ try {
+ TransferPipe tp = new TransferPipe();
try {
- TransferPipe tp = new TransferPipe();
- try {
- r.proc.thread.dumpProvider(
- tp.getWriteFd(), r.provider.asBinder(), args);
- tp.setBufferPrefix(" ");
- // Short timeout, since blocking here can
- // deadlock with the application.
- tp.go(fd, 2000);
- } finally {
- tp.kill();
- }
- } catch (IOException ex) {
- pw.println(" Failure while dumping the provider: " + ex);
- } catch (RemoteException ex) {
- pw.println(" Got a RemoteException while dumping the service");
+ r.proc.thread.dumpProvider(
+ tp.getWriteFd(), r.provider.asBinder(), args);
+ tp.setBufferPrefix(prefix);
+ // Short timeout, since blocking here can
+ // deadlock with the application.
+ tp.go(fd, 2000);
+ } finally {
+ tp.kill();
}
+ } catch (IOException ex) {
+ pw.println(" Failure while dumping the provider: " + ex);
+ } catch (RemoteException ex) {
+ pw.println(" Got a RemoteException while dumping the service");
}
}
}
diff --git a/services/core/java/com/android/server/am/TaskRecord.java b/services/core/java/com/android/server/am/TaskRecord.java
index 7eec945..e81e6d7 100644
--- a/services/core/java/com/android/server/am/TaskRecord.java
+++ b/services/core/java/com/android/server/am/TaskRecord.java
@@ -115,6 +115,7 @@
import static com.android.server.am.ActivityRecord.RECENTS_ACTIVITY_TYPE;
import static com.android.server.am.ActivityRecord.STARTING_WINDOW_SHOWN;
import static com.android.server.am.ActivityStack.REMOVE_TASK_MODE_MOVING;
+import static com.android.server.am.ActivityStack.REMOVE_TASK_MODE_MOVING_TO_TOP;
import static com.android.server.am.ActivityStackSupervisor.PAUSE_IMMEDIATELY;
import static com.android.server.am.ActivityStackSupervisor.PRESERVE_WINDOWS;
@@ -673,8 +674,11 @@
mWindowContainerController.reparent(toStack.getWindowContainerController(), position,
moveStackMode == REPARENT_MOVE_STACK_TO_FRONT);
+ final boolean moveStackToFront = moveStackMode == REPARENT_MOVE_STACK_TO_FRONT
+ || (moveStackMode == REPARENT_KEEP_STACK_AT_FRONT && (wasFocused || wasFront));
// Move the task
- sourceStack.removeTask(this, reason, REMOVE_TASK_MODE_MOVING);
+ sourceStack.removeTask(this, reason, moveStackToFront
+ ? REMOVE_TASK_MODE_MOVING_TO_TOP : REMOVE_TASK_MODE_MOVING);
toStack.addTask(this, position, false /* schedulePictureInPictureModeChange */, reason);
if (schedulePictureInPictureModeChange) {
@@ -693,8 +697,6 @@
// If the task had focus before (or we're requested to move focus), move focus to the
// new stack by moving the stack to the front.
- final boolean moveStackToFront = moveStackMode == REPARENT_MOVE_STACK_TO_FRONT
- || (moveStackMode == REPARENT_KEEP_STACK_AT_FRONT && (wasFocused || wasFront));
if (r != null) {
toStack.moveToFrontAndResumeStateIfNeeded(r, moveStackToFront, wasResumed,
wasPaused, reason);
diff --git a/services/core/java/com/android/server/audio/AudioService.java b/services/core/java/com/android/server/audio/AudioService.java
index e9555f7..e5c3106 100644
--- a/services/core/java/com/android/server/audio/AudioService.java
+++ b/services/core/java/com/android/server/audio/AudioService.java
@@ -3931,7 +3931,7 @@
public int setBluetoothA2dpDeviceConnectionState(BluetoothDevice device, int state, int profile)
{
- if (mAudioHandler.hasMessages(MSG_SET_A2DP_SINK_CONNECTION_STATE)) {
+ if (mAudioHandler.hasMessages(MSG_SET_A2DP_SINK_CONNECTION_STATE, device)) {
return 0;
}
return setBluetoothA2dpDeviceConnectionStateInt(
@@ -5070,7 +5070,7 @@
private void onSetA2dpSinkConnectionState(BluetoothDevice btDevice, int state)
{
- if (DEBUG_VOL) {
+ if (DEBUG_DEVICES) {
Log.d(TAG, "onSetA2dpSinkConnectionState btDevice=" + btDevice+"state=" + state);
}
if (btDevice == null) {
@@ -5173,7 +5173,7 @@
int device = AudioSystem.DEVICE_OUT_BLUETOOTH_A2DP;
synchronized (mConnectedDevices) {
- if (mAudioHandler.hasMessages(MSG_SET_A2DP_SINK_CONNECTION_STATE)) {
+ if (mAudioHandler.hasMessages(MSG_SET_A2DP_SINK_CONNECTION_STATE, btDevice)) {
return;
}
final String key = makeDeviceListKey(device, address);
diff --git a/services/core/java/com/android/server/connectivity/Tethering.java b/services/core/java/com/android/server/connectivity/Tethering.java
index 81a1458..901092e 100644
--- a/services/core/java/com/android/server/connectivity/Tethering.java
+++ b/services/core/java/com/android/server/connectivity/Tethering.java
@@ -20,6 +20,7 @@
import static android.hardware.usb.UsbManager.USB_FUNCTION_RNDIS;
import static android.net.wifi.WifiManager.EXTRA_WIFI_AP_STATE;
import static android.net.wifi.WifiManager.WIFI_AP_STATE_DISABLED;
+import static com.android.server.ConnectivityService.SHORT_ARG;
import android.app.Notification;
import android.app.NotificationManager;
@@ -47,6 +48,7 @@
import android.net.NetworkState;
import android.net.NetworkUtils;
import android.net.RouteInfo;
+import android.net.util.SharedLog;
import android.net.wifi.WifiManager;
import android.os.Binder;
import android.os.Bundle;
@@ -62,7 +64,6 @@
import android.telephony.TelephonyManager;
import android.text.TextUtils;
import android.util.ArrayMap;
-import android.util.LocalLog;
import android.util.Log;
import android.util.SparseArray;
@@ -147,9 +148,7 @@
}
}
- private final static int MAX_LOG_RECORDS = 500;
-
- private final LocalLog mLocalLog = new LocalLog(MAX_LOG_RECORDS);
+ private final SharedLog mLog = new SharedLog(TAG);
// used to synchronize public access to members
private final Object mPublicSync;
@@ -180,7 +179,7 @@
public Tethering(Context context, INetworkManagementService nmService,
INetworkStatsService statsService, INetworkPolicyManager policyManager,
Looper looper, MockableSystemProperties systemProperties) {
- mLocalLog.log("CONSTRUCTED");
+ mLog.mark("constructed");
mContext = context;
mNMService = nmService;
mStatsService = statsService;
@@ -195,9 +194,9 @@
mTetherMasterSM = new TetherMasterSM("TetherMaster", mLooper);
mTetherMasterSM.start();
- mOffloadController = new OffloadController(mTetherMasterSM.getHandler());
+ mOffloadController = new OffloadController(mTetherMasterSM.getHandler(), mLog);
mUpstreamNetworkMonitor = new UpstreamNetworkMonitor(
- mContext, mTetherMasterSM, TetherMasterSM.EVENT_UPSTREAM_CALLBACK);
+ mContext, mTetherMasterSM, TetherMasterSM.EVENT_UPSTREAM_CALLBACK, mLog);
mForwardedDownstreams = new HashSet<>();
mStateReceiver = new StateReceiver();
@@ -1094,7 +1093,7 @@
addState(mSetDnsForwardersErrorState);
mNotifyList = new ArrayList<>();
- mIPv6TetheringCoordinator = new IPv6TetheringCoordinator(mNotifyList);
+ mIPv6TetheringCoordinator = new IPv6TetheringCoordinator(mNotifyList, mLog);
setInitialState(mInitialState);
}
@@ -1141,7 +1140,7 @@
try {
mNMService.setIpForwardingEnabled(true);
} catch (Exception e) {
- mLocalLog.log("ERROR " + e);
+ mLog.e(e);
transitionTo(mSetIpForwardingEnabledErrorState);
return false;
}
@@ -1154,12 +1153,12 @@
mNMService.stopTethering();
mNMService.startTethering(cfg.dhcpRanges);
} catch (Exception ee) {
- mLocalLog.log("ERROR " + ee);
+ mLog.e(ee);
transitionTo(mStartTetheringErrorState);
return false;
}
}
- mLocalLog.log("SET master tether settings: ON");
+ mLog.log("SET master tether settings: ON");
return true;
}
@@ -1167,19 +1166,19 @@
try {
mNMService.stopTethering();
} catch (Exception e) {
- mLocalLog.log("ERROR " + e);
+ mLog.e(e);
transitionTo(mStopTetheringErrorState);
return false;
}
try {
mNMService.setIpForwardingEnabled(false);
} catch (Exception e) {
- mLocalLog.log("ERROR " + e);
+ mLog.e(e);
transitionTo(mSetIpForwardingDisabledErrorState);
return false;
}
transitionTo(mInitialState);
- mLocalLog.log("SET master tether settings: OFF");
+ mLog.log("SET master tether settings: OFF");
return true;
}
@@ -1305,13 +1304,13 @@
}
try {
mNMService.setDnsForwarders(network, dnsServers);
- mLocalLog.log(String.format(
- "SET DNS forwarders: network=%s dnsServers=[%s]",
+ mLog.log(String.format(
+ "SET DNS forwarders: network=%s dnsServers=%s",
network, Arrays.toString(dnsServers)));
} catch (Exception e) {
// TODO: Investigate how this can fail and what exactly
// happens if/when such failures occur.
- mLocalLog.log("ERROR setting DNS forwarders failed, " + e);
+ mLog.e("setting DNS forwarders failed, " + e);
transitionTo(mSetDnsForwardersErrorState);
}
}
@@ -1788,12 +1787,23 @@
pw.println("Log:");
pw.increaseIndent();
- mLocalLog.readOnlyLocalLog().dump(fd, pw, args);
+ if (argsContain(args, SHORT_ARG)) {
+ pw.println("<log removed for brevity>");
+ } else {
+ mLog.dump(fd, pw, args);
+ }
pw.decreaseIndent();
pw.decreaseIndent();
}
+ private static boolean argsContain(String[] args, String target) {
+ for (String arg : args) {
+ if (arg.equals(target)) return true;
+ }
+ return false;
+ }
+
@Override
public void notifyInterfaceStateChange(String iface, TetherInterfaceStateMachine who,
int state, int error) {
@@ -1807,8 +1817,7 @@
}
}
- mLocalLog.log(String.format("OBSERVED iface=%s state=%s error=%s",
- iface, state, error));
+ mLog.log(String.format("OBSERVED iface=%s state=%s error=%s", iface, state, error));
try {
// Notify that we're tethering (or not) this interface.
@@ -1846,8 +1855,8 @@
private void trackNewTetherableInterface(String iface, int interfaceType) {
TetherState tetherState;
tetherState = new TetherState(new TetherInterfaceStateMachine(iface, mLooper,
- interfaceType, mNMService, mStatsService, this,
- new IPv6TetheringInterfaceServices(iface, mNMService)));
+ interfaceType, mLog, mNMService, mStatsService, this,
+ new IPv6TetheringInterfaceServices(iface, mNMService, mLog)));
mTetherStates.put(iface, tetherState);
tetherState.stateMachine.start();
}
diff --git a/services/core/java/com/android/server/connectivity/tethering/IPv6TetheringCoordinator.java b/services/core/java/com/android/server/connectivity/tethering/IPv6TetheringCoordinator.java
index 2485654..518f6c1 100644
--- a/services/core/java/com/android/server/connectivity/tethering/IPv6TetheringCoordinator.java
+++ b/services/core/java/com/android/server/connectivity/tethering/IPv6TetheringCoordinator.java
@@ -25,6 +25,7 @@
import android.net.NetworkState;
import android.net.RouteInfo;
import android.net.util.NetworkConstants;
+import android.net.util.SharedLog;
import android.util.Log;
import java.net.Inet6Address;
@@ -64,6 +65,7 @@
}
private final ArrayList<TetherInterfaceStateMachine> mNotifyList;
+ private final SharedLog mLog;
// NOTE: mActiveDownstreams is a list and not a hash data structure because
// we keep active downstreams in arrival order. This is done so /64s can
// be parceled out on a "first come, first served" basis and a /64 used by
@@ -74,8 +76,10 @@
private short mNextSubnetId;
private NetworkState mUpstreamNetworkState;
- public IPv6TetheringCoordinator(ArrayList<TetherInterfaceStateMachine> notifyList) {
+ public IPv6TetheringCoordinator(ArrayList<TetherInterfaceStateMachine> notifyList,
+ SharedLog log) {
mNotifyList = notifyList;
+ mLog = log.forSubComponent(TAG);
mActiveDownstreams = new LinkedList<>();
mUniqueLocalPrefix = generateUniqueLocalPrefix();
mNextSubnetId = 0;
@@ -115,7 +119,7 @@
if (VDBG) {
Log.d(TAG, "updateUpstreamNetworkState: " + toDebugString(ns));
}
- if (!canTetherIPv6(ns)) {
+ if (!canTetherIPv6(ns, mLog)) {
stopIPv6TetheringOnAllInterfaces();
setUpstreamNetworkState(null);
return;
@@ -150,9 +154,7 @@
null);
}
- if (DBG) {
- Log.d(TAG, "setUpstreamNetworkState: " + toDebugString(mUpstreamNetworkState));
- }
+ mLog.log("setUpstreamNetworkState: " + toDebugString(mUpstreamNetworkState));
}
private void updateIPv6TetheringInterfaces() {
@@ -206,7 +208,7 @@
return null;
}
- private static boolean canTetherIPv6(NetworkState ns) {
+ private static boolean canTetherIPv6(NetworkState ns, SharedLog sharedLog) {
// Broadly speaking:
//
// [1] does the upstream have an IPv6 default route?
@@ -260,13 +262,11 @@
final boolean outcome = canTether && supportedConfiguration;
- if (VDBG) {
- if (ns == null) {
- Log.d(TAG, "No available upstream.");
- } else {
- Log.d(TAG, String.format("IPv6 tethering is %s for upstream: %s",
- (outcome ? "available" : "not available"), toDebugString(ns)));
- }
+ if (ns == null) {
+ sharedLog.log("No available upstream.");
+ } else {
+ sharedLog.log(String.format("IPv6 tethering is %s for upstream: %s",
+ (outcome ? "available" : "not available"), toDebugString(ns)));
}
return outcome;
diff --git a/services/core/java/com/android/server/connectivity/tethering/IPv6TetheringInterfaceServices.java b/services/core/java/com/android/server/connectivity/tethering/IPv6TetheringInterfaceServices.java
index c6a7925..adf4af8 100644
--- a/services/core/java/com/android/server/connectivity/tethering/IPv6TetheringInterfaceServices.java
+++ b/services/core/java/com/android/server/connectivity/tethering/IPv6TetheringInterfaceServices.java
@@ -28,10 +28,10 @@
import android.net.ip.RouterAdvertisementDaemon;
import android.net.ip.RouterAdvertisementDaemon.RaParams;
import android.net.util.NetdService;
+import android.net.util.SharedLog;
import android.os.INetworkManagementService;
import android.os.ServiceSpecificException;
import android.os.RemoteException;
-import android.util.Log;
import android.util.Slog;
import java.net.Inet6Address;
@@ -54,6 +54,7 @@
private final String mIfName;
private final INetworkManagementService mNMService;
+ private final SharedLog mLog;
private NetworkInterface mNetworkInterface;
private byte[] mHwAddr;
@@ -61,9 +62,11 @@
private RouterAdvertisementDaemon mRaDaemon;
private RaParams mLastRaParams;
- public IPv6TetheringInterfaceServices(String ifname, INetworkManagementService nms) {
+ public IPv6TetheringInterfaceServices(
+ String ifname, INetworkManagementService nms, SharedLog log) {
mIfName = ifname;
mNMService = nms;
+ mLog = log.forSubComponent(mIfName);
}
public boolean start() {
@@ -72,12 +75,12 @@
try {
mNetworkInterface = NetworkInterface.getByName(mIfName);
} catch (SocketException e) {
- Log.e(TAG, "Error looking up NetworkInterfaces for " + mIfName, e);
+ mLog.e("Error looking up NetworkInterfaces: " + e);
stop();
return false;
}
if (mNetworkInterface == null) {
- Log.e(TAG, "Failed to find NetworkInterface for " + mIfName);
+ mLog.e("Failed to find NetworkInterface");
stop();
return false;
}
@@ -85,7 +88,7 @@
try {
mHwAddr = mNetworkInterface.getHardwareAddress();
} catch (SocketException e) {
- Log.e(TAG, "Failed to find hardware address for " + mIfName, e);
+ mLog.e("Failed to find hardware address: " + e);
stop();
return false;
}
@@ -161,11 +164,11 @@
try {
final int removalFailures = mNMService.removeRoutesFromLocalNetwork(toBeRemoved);
if (removalFailures > 0) {
- Log.e(TAG, String.format("Failed to remove %d IPv6 routes from local table.",
+ mLog.e(String.format("Failed to remove %d IPv6 routes from local table.",
removalFailures));
}
} catch (RemoteException e) {
- Log.e(TAG, "Failed to remove IPv6 routes from local table: ", e);
+ mLog.e("Failed to remove IPv6 routes from local table: " + e);
}
}
@@ -195,7 +198,7 @@
// error (EEXIST is silently ignored).
mNMService.addInterfaceToLocalNetwork(mIfName, toBeAdded);
} catch (RemoteException e) {
- Log.e(TAG, "Failed to add IPv6 routes to local table: ", e);
+ mLog.e("Failed to add IPv6 routes to local table: " + e);
}
}
}
@@ -206,7 +209,7 @@
final INetd netd = NetdService.getInstance();
if (netd == null) {
if (newDnses != null) newDnses.clear();
- Log.e(TAG, "No netd service instance available; not setting local IPv6 addresses");
+ mLog.e("No netd service instance available; not setting local IPv6 addresses");
return;
}
@@ -217,7 +220,7 @@
try {
netd.interfaceDelAddress(mIfName, dnsString, RFC7421_PREFIX_LENGTH);
} catch (ServiceSpecificException | RemoteException e) {
- Log.e(TAG, "Failed to remove local dns IP: " + dnsString, e);
+ mLog.e("Failed to remove local dns IP " + dnsString + ": " + e);
}
}
}
@@ -234,7 +237,7 @@
try {
netd.interfaceAddAddress(mIfName, dnsString, RFC7421_PREFIX_LENGTH);
} catch (ServiceSpecificException | RemoteException e) {
- Log.e(TAG, "Failed to add local dns IP: " + dnsString, e);
+ mLog.e("Failed to add local dns IP " + dnsString + ": " + e);
newDnses.remove(dns);
}
}
@@ -243,7 +246,7 @@
try {
netd.tetherApplyDnsInterfaces();
} catch (ServiceSpecificException | RemoteException e) {
- Log.e(TAG, "Failed to update local DNS caching server");
+ mLog.e("Failed to update local DNS caching server");
if (newDnses != null) newDnses.clear();
}
}
diff --git a/services/core/java/com/android/server/connectivity/tethering/OffloadController.java b/services/core/java/com/android/server/connectivity/tethering/OffloadController.java
index 220e751..8f21d99 100644
--- a/services/core/java/com/android/server/connectivity/tethering/OffloadController.java
+++ b/services/core/java/com/android/server/connectivity/tethering/OffloadController.java
@@ -18,7 +18,7 @@
import android.net.LinkProperties;
import android.os.Handler;
-import android.util.Log;
+import android.net.util.SharedLog;
/**
* A wrapper around hardware offload interface.
@@ -29,16 +29,18 @@
private static final String TAG = OffloadController.class.getSimpleName();
private final Handler mHandler;
+ private final SharedLog mLog;
private LinkProperties mUpstreamLinkProperties;
- public OffloadController(Handler h) {
+ public OffloadController(Handler h, SharedLog log) {
mHandler = h;
+ mLog = log.forSubComponent(TAG);
}
public void start() {
// TODO: initOffload() and configure callbacks to be handled on our
// preferred Handler.
- Log.d(TAG, "tethering offload not supported");
+ mLog.i("tethering offload not supported");
}
public void stop() {
diff --git a/services/core/java/com/android/server/connectivity/tethering/TetherInterfaceStateMachine.java b/services/core/java/com/android/server/connectivity/tethering/TetherInterfaceStateMachine.java
index d3cfd87..4a1d405 100644
--- a/services/core/java/com/android/server/connectivity/tethering/TetherInterfaceStateMachine.java
+++ b/services/core/java/com/android/server/connectivity/tethering/TetherInterfaceStateMachine.java
@@ -22,6 +22,7 @@
import android.net.LinkAddress;
import android.net.LinkProperties;
import android.net.NetworkUtils;
+import android.net.util.SharedLog;
import android.os.INetworkManagementService;
import android.os.Looper;
import android.os.Message;
@@ -82,6 +83,7 @@
private final State mTetheredState;
private final State mUnavailableState;
+ private final SharedLog mLog;
private final INetworkManagementService mNMService;
private final INetworkStatsService mStatsService;
private final IControlsTethering mTetherController;
@@ -93,10 +95,12 @@
private int mLastError;
private String mMyUpstreamIfaceName; // may change over time
- public TetherInterfaceStateMachine(String ifaceName, Looper looper, int interfaceType,
- INetworkManagementService nMService, INetworkStatsService statsService,
- IControlsTethering tetherController, IPv6TetheringInterfaceServices ipv6Svc) {
+ public TetherInterfaceStateMachine(
+ String ifaceName, Looper looper, int interfaceType, SharedLog log,
+ INetworkManagementService nMService, INetworkStatsService statsService,
+ IControlsTethering tetherController, IPv6TetheringInterfaceServices ipv6Svc) {
super(ifaceName, looper);
+ mLog = log.forSubComponent(ifaceName);
mNMService = nMService;
mStatsService = statsService;
mTetherController = tetherController;
@@ -162,7 +166,7 @@
mNMService.setInterfaceConfig(mIfaceName, ifcg);
}
} catch (Exception e) {
- Log.e(TAG, "Error configuring interface " + mIfaceName, e);
+ mLog.e("Error configuring interface " + e);
return false;
}
@@ -203,7 +207,7 @@
transitionTo(mTetheredState);
break;
default:
- Log.e(TAG, "Invalid tethering interface serving state specified.");
+ mLog.e("Invalid tethering interface serving state specified.");
}
break;
case CMD_INTERFACE_DOWN:
@@ -232,13 +236,13 @@
try {
mNMService.tetherInterface(mIfaceName);
} catch (Exception e) {
- Log.e(TAG, "Error Tethering: " + e.toString());
+ mLog.e("Error Tethering: " + e);
mLastError = ConnectivityManager.TETHER_ERROR_TETHER_IFACE_ERROR;
return;
}
if (!mIPv6TetherSvc.start()) {
- Log.e(TAG, "Failed to start IPv6TetheringInterfaceServices");
+ mLog.e("Failed to start IPv6TetheringInterfaceServices");
// TODO: Make this a fatal error once Bluetooth IPv6 is sorted.
return;
}
@@ -255,7 +259,7 @@
mNMService.untetherInterface(mIfaceName);
} catch (Exception e) {
mLastError = ConnectivityManager.TETHER_ERROR_UNTETHER_IFACE_ERROR;
- Log.e(TAG, "Failed to untether interface: " + e.toString());
+ mLog.e("Failed to untether interface: " + e);
}
configureIfaceIp(false);
@@ -316,7 +320,7 @@
maybeLogMessage(this, message.what);
switch (message.what) {
case CMD_TETHER_REQUESTED:
- Log.e(TAG, "CMD_TETHER_REQUESTED while in local hotspot mode.");
+ mLog.e("CMD_TETHER_REQUESTED while in local-only hotspot mode.");
break;
case CMD_TETHER_CONNECTION_CHANGED:
// Ignored in local hotspot state.
@@ -389,7 +393,7 @@
boolean retValue = true;
switch (message.what) {
case CMD_TETHER_REQUESTED:
- Log.e(TAG, "CMD_TETHER_REQUESTED while already tethering.");
+ mLog.e("CMD_TETHER_REQUESTED while already tethering.");
break;
case CMD_TETHER_CONNECTION_CHANGED:
String newUpstreamIfaceName = (String)(message.obj);
@@ -406,7 +410,7 @@
mNMService.startInterfaceForwarding(mIfaceName,
newUpstreamIfaceName);
} catch (Exception e) {
- Log.e(TAG, "Exception enabling Nat: " + e.toString());
+ mLog.e("Exception enabling NAT: " + e);
cleanupUpstreamInterface(newUpstreamIfaceName);
mLastError = ConnectivityManager.TETHER_ERROR_ENABLE_NAT_ERROR;
transitionTo(mInitialState);
diff --git a/services/core/java/com/android/server/connectivity/tethering/TetheringConfiguration.java b/services/core/java/com/android/server/connectivity/tethering/TetheringConfiguration.java
index 44c61f0..6941193 100644
--- a/services/core/java/com/android/server/connectivity/tethering/TetheringConfiguration.java
+++ b/services/core/java/com/android/server/connectivity/tethering/TetheringConfiguration.java
@@ -163,20 +163,31 @@
}
// Fix up upstream interface types for DUN or mobile. NOTE: independent
- // of the value of |requiresDun|, cell data of one form or another is
+ // of the value of |dunCheck|, cell data of one form or another is
// *always* an upstream, regardless of the upstream interface types
// specified by configuration resources.
if (dunCheck == DUN_REQUIRED) {
if (!upstreamIfaceTypes.contains(TYPE_MOBILE_DUN)) {
upstreamIfaceTypes.add(TYPE_MOBILE_DUN);
}
- } else {
+ } else if (dunCheck == DUN_NOT_REQUIRED) {
if (!upstreamIfaceTypes.contains(TYPE_MOBILE)) {
upstreamIfaceTypes.add(TYPE_MOBILE);
}
if (!upstreamIfaceTypes.contains(TYPE_MOBILE_HIPRI)) {
upstreamIfaceTypes.add(TYPE_MOBILE_HIPRI);
}
+ } else {
+ // Fix upstream interface types for case DUN_UNSPECIFIED.
+ // Do not modify if a cellular interface type is already present in the
+ // upstream interface types. Add TYPE_MOBILE and TYPE_MOBILE_HIPRI if no
+ // cellular interface types are found in the upstream interface types.
+ if (!(upstreamIfaceTypes.contains(TYPE_MOBILE_DUN)
+ || upstreamIfaceTypes.contains(TYPE_MOBILE)
+ || upstreamIfaceTypes.contains(TYPE_MOBILE_HIPRI))) {
+ upstreamIfaceTypes.add(TYPE_MOBILE);
+ upstreamIfaceTypes.add(TYPE_MOBILE_HIPRI);
+ }
}
return upstreamIfaceTypes;
diff --git a/services/core/java/com/android/server/connectivity/tethering/UpstreamNetworkMonitor.java b/services/core/java/com/android/server/connectivity/tethering/UpstreamNetworkMonitor.java
index 97a2d5e..be71490 100644
--- a/services/core/java/com/android/server/connectivity/tethering/UpstreamNetworkMonitor.java
+++ b/services/core/java/com/android/server/connectivity/tethering/UpstreamNetworkMonitor.java
@@ -29,6 +29,7 @@
import android.net.NetworkCapabilities;
import android.net.NetworkRequest;
import android.net.NetworkState;
+import android.net.util.SharedLog;
import android.util.Log;
import com.android.internal.annotations.VisibleForTesting;
@@ -73,6 +74,7 @@
private static final int CALLBACK_MOBILE_REQUEST = 3;
private final Context mContext;
+ private final SharedLog mLog;
private final StateMachine mTarget;
private final Handler mHandler;
private final int mWhat;
@@ -84,16 +86,18 @@
private boolean mDunRequired;
private Network mCurrentDefault;
- public UpstreamNetworkMonitor(Context ctx, StateMachine tgt, int what) {
+ public UpstreamNetworkMonitor(Context ctx, StateMachine tgt, int what, SharedLog log) {
mContext = ctx;
mTarget = tgt;
mHandler = mTarget.getHandler();
mWhat = what;
+ mLog = log.forSubComponent(TAG);
}
@VisibleForTesting
- public UpstreamNetworkMonitor(StateMachine tgt, int what, ConnectivityManager cm) {
- this(null, tgt, what);
+ public UpstreamNetworkMonitor(
+ StateMachine tgt, int what, ConnectivityManager cm, SharedLog log) {
+ this(null, tgt, what, log);
mCM = cm;
}
@@ -136,7 +140,7 @@
public void registerMobileNetworkRequest() {
if (mMobileNetworkCallback != null) {
- Log.e(TAG, "registerMobileNetworkRequest() already registered");
+ mLog.e("registerMobileNetworkRequest() already registered");
return;
}
@@ -156,7 +160,7 @@
// TODO: Change the timeout from 0 (no onUnavailable callback) to some
// moderate callback timeout. This might be useful for updating some UI.
// Additionally, we log a message to aid in any subsequent debugging.
- Log.d(TAG, "requesting mobile upstream network: " + mobileUpstreamRequest);
+ mLog.i("requesting mobile upstream network: " + mobileUpstreamRequest);
cm().requestNetwork(mobileUpstreamRequest, mMobileNetworkCallback, 0, legacyType, mHandler);
}
diff --git a/services/core/java/com/android/server/content/SyncStorageEngine.java b/services/core/java/com/android/server/content/SyncStorageEngine.java
index 069ae73..f804fa1 100644
--- a/services/core/java/com/android/server/content/SyncStorageEngine.java
+++ b/services/core/java/com/android/server/content/SyncStorageEngine.java
@@ -18,6 +18,7 @@
import android.accounts.Account;
import android.accounts.AccountAndUser;
+import android.accounts.AccountManager;
import android.app.backup.BackupManager;
import android.content.ComponentName;
import android.content.ContentResolver;
@@ -27,6 +28,7 @@
import android.content.SyncInfo;
import android.content.SyncRequest;
import android.content.SyncStatusInfo;
+import android.content.pm.PackageManager;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteException;
@@ -350,6 +352,50 @@
void onAuthorityRemoved(EndPoint removedAuthority);
}
+ /**
+ * Validator that maintains a lazy cache of accounts and providers to tell if an authority or
+ * account is valid.
+ */
+ private static class AccountAuthorityValidator {
+ final private AccountManager mAccountManager;
+ final private PackageManager mPackageManager;
+ final private SparseArray<Account[]> mAccountsCache;
+ final private SparseArray<ArrayMap<String, Boolean>> mProvidersPerUserCache;
+
+ AccountAuthorityValidator(Context context) {
+ mAccountManager = context.getSystemService(AccountManager.class);
+ mPackageManager = context.getPackageManager();
+ mAccountsCache = new SparseArray<>();
+ mProvidersPerUserCache = new SparseArray<>();
+ }
+
+ // An account is valid if an installed authenticator has previously created that account
+ // on the device
+ boolean isAccountValid(Account account, int userId) {
+ Account[] accountsForUser = mAccountsCache.get(userId);
+ if (accountsForUser == null) {
+ accountsForUser = mAccountManager.getAccountsAsUser(userId);
+ mAccountsCache.put(userId, accountsForUser);
+ }
+ return ArrayUtils.contains(accountsForUser, account);
+ }
+
+ // An authority is only valid if it has a content provider installed on the system
+ boolean isAuthorityValid(String authority, int userId) {
+ ArrayMap<String, Boolean> authorityMap = mProvidersPerUserCache.get(userId);
+ if (authorityMap == null) {
+ authorityMap = new ArrayMap<>();
+ mProvidersPerUserCache.put(userId, authorityMap);
+ }
+ if (!authorityMap.containsKey(authority)) {
+ authorityMap.put(authority, mPackageManager.resolveContentProviderAsUser(authority,
+ PackageManager.MATCH_DIRECT_BOOT_AWARE
+ | PackageManager.MATCH_DIRECT_BOOT_UNAWARE, userId) != null);
+ }
+ return authorityMap.get(authority);
+ }
+ }
+
// Primary list of all syncable authorities. Also our global lock.
private final SparseArray<AuthorityInfo> mAuthorities =
new SparseArray<AuthorityInfo>();
@@ -1502,12 +1548,13 @@
eventType = parser.next();
AuthorityInfo authority = null;
PeriodicSync periodicSync = null;
+ AccountAuthorityValidator validator = new AccountAuthorityValidator(mContext);
do {
if (eventType == XmlPullParser.START_TAG) {
tagName = parser.getName();
if (parser.getDepth() == 2) {
if ("authority".equals(tagName)) {
- authority = parseAuthority(parser, version);
+ authority = parseAuthority(parser, version, validator);
periodicSync = null;
if (authority != null) {
if (authority.ident > highestAuthorityId) {
@@ -1636,7 +1683,8 @@
mMasterSyncAutomatically.put(userId, listen);
}
- private AuthorityInfo parseAuthority(XmlPullParser parser, int version) {
+ private AuthorityInfo parseAuthority(XmlPullParser parser, int version,
+ AccountAuthorityValidator validator) {
AuthorityInfo authority = null;
int id = -1;
try {
@@ -1676,21 +1724,26 @@
if (Log.isLoggable(TAG_FILE, Log.VERBOSE)) {
Slog.v(TAG_FILE, "Creating authority entry");
}
- EndPoint info = null;
if (accountName != null && authorityName != null) {
- info = new EndPoint(
+ EndPoint info = new EndPoint(
new Account(accountName, accountType),
authorityName, userId);
- }
- if (info != null) {
- authority = getOrCreateAuthorityLocked(info, id, false);
- // If the version is 0 then we are upgrading from a file format that did not
- // know about periodic syncs. In that case don't clear the list since we
- // want the default, which is a daily periodic sync.
- // Otherwise clear out this default list since we will populate it later with
- // the periodic sync descriptions that are read from the configuration file.
- if (version > 0) {
- authority.periodicSyncs.clear();
+ if (validator.isAccountValid(info.account, userId)
+ && validator.isAuthorityValid(authorityName, userId)) {
+ authority = getOrCreateAuthorityLocked(info, id, false);
+ // If the version is 0 then we are upgrading from a file format that did not
+ // know about periodic syncs. In that case don't clear the list since we
+ // want the default, which is a daily periodic sync.
+ // Otherwise clear out this default list since we will populate it later
+ // with
+ // the periodic sync descriptions that are read from the configuration file.
+ if (version > 0) {
+ authority.periodicSyncs.clear();
+ }
+ } else {
+ EventLog.writeEvent(0x534e4554, "35028827", -1,
+ "account:" + info.account + " provider:" + authorityName + " user:"
+ + userId);
}
}
}
diff --git a/services/core/java/com/android/server/display/DisplayPowerController.java b/services/core/java/com/android/server/display/DisplayPowerController.java
index 0ef0561..9dc317a 100644
--- a/services/core/java/com/android/server/display/DisplayPowerController.java
+++ b/services/core/java/com/android/server/display/DisplayPowerController.java
@@ -71,6 +71,7 @@
final class DisplayPowerController implements AutomaticBrightnessController.Callbacks {
private static final String TAG = "DisplayPowerController";
private static final String SCREEN_ON_BLOCKED_TRACE_NAME = "Screen on blocked";
+ private static final String SCREEN_OFF_BLOCKED_TRACE_NAME = "Screen off blocked";
private static final boolean DEBUG = false;
private static final boolean DEBUG_PRETEND_PROXIMITY_SENSOR_ABSENT = false;
@@ -90,6 +91,7 @@
private static final int MSG_UPDATE_POWER_STATE = 1;
private static final int MSG_PROXIMITY_SENSOR_DEBOUNCED = 2;
private static final int MSG_SCREEN_ON_UNBLOCKED = 3;
+ private static final int MSG_SCREEN_OFF_UNBLOCKED = 4;
private static final int PROXIMITY_UNKNOWN = -1;
private static final int PROXIMITY_NEGATIVE = 0;
@@ -105,6 +107,7 @@
private static final int REPORTED_TO_POLICY_SCREEN_OFF = 0;
private static final int REPORTED_TO_POLICY_SCREEN_TURNING_ON = 1;
private static final int REPORTED_TO_POLICY_SCREEN_ON = 2;
+ private static final int REPORTED_TO_POLICY_SCREEN_TURNING_OFF = 3;
private final Object mLock = new Object();
@@ -219,6 +222,7 @@
// The currently active screen on unblocker. This field is non-null whenever
// we are waiting for a callback to release it and unblock the screen.
private ScreenOnUnblocker mPendingScreenOnUnblocker;
+ private ScreenOffUnblocker mPendingScreenOffUnblocker;
// True if we were in the process of turning off the screen.
// This allows us to recover more gracefully from situations where we abort
@@ -230,6 +234,7 @@
// The elapsed real time when the screen on was blocked.
private long mScreenOnBlockStartRealTime;
+ private long mScreenOffBlockStartRealTime;
// Screen state we reported to policy. Must be one of REPORTED_TO_POLICY_SCREEN_* fields.
private int mReportedScreenStateToPolicy;
@@ -810,9 +815,43 @@
}
}
+ private void blockScreenOff() {
+ if (mPendingScreenOffUnblocker == null) {
+ Trace.asyncTraceBegin(Trace.TRACE_TAG_POWER, SCREEN_OFF_BLOCKED_TRACE_NAME, 0);
+ mPendingScreenOffUnblocker = new ScreenOffUnblocker();
+ mScreenOffBlockStartRealTime = SystemClock.elapsedRealtime();
+ Slog.i(TAG, "Blocking screen off");
+ }
+ }
+
+ private void unblockScreenOff() {
+ if (mPendingScreenOffUnblocker != null) {
+ mPendingScreenOffUnblocker = null;
+ long delay = SystemClock.elapsedRealtime() - mScreenOffBlockStartRealTime;
+ Slog.i(TAG, "Unblocked screen off after " + delay + " ms");
+ Trace.asyncTraceEnd(Trace.TRACE_TAG_POWER, SCREEN_OFF_BLOCKED_TRACE_NAME, 0);
+ }
+ }
+
private boolean setScreenState(int state) {
+ final boolean isOff = (state == Display.STATE_OFF);
if (mPowerState.getScreenState() != state) {
- final boolean wasOn = (mPowerState.getScreenState() != Display.STATE_OFF);
+
+ // If we are trying to turn screen off, give policy a chance to do something before we
+ // actually turn the screen off.
+ if (isOff && !mScreenOffBecauseOfProximity) {
+ if (mReportedScreenStateToPolicy == REPORTED_TO_POLICY_SCREEN_ON) {
+ mReportedScreenStateToPolicy = REPORTED_TO_POLICY_SCREEN_TURNING_OFF;
+ blockScreenOff();
+ mWindowManagerPolicy.screenTurningOff(mPendingScreenOffUnblocker);
+ return false;
+ } else if (mPendingScreenOffUnblocker != null) {
+
+ // Abort doing the state change until screen off is unblocked.
+ return false;
+ }
+ }
+
mPowerState.setScreenState(state);
// Tell battery stats about the transition.
@@ -829,13 +868,21 @@
// This surface is essentially the final state of the color fade animation and
// it is only removed once the window manager tells us that the activity has
// finished drawing underneath.
- final boolean isOff = (state == Display.STATE_OFF);
if (isOff && mReportedScreenStateToPolicy != REPORTED_TO_POLICY_SCREEN_OFF
&& !mScreenOffBecauseOfProximity) {
mReportedScreenStateToPolicy = REPORTED_TO_POLICY_SCREEN_OFF;
unblockScreenOn();
mWindowManagerPolicy.screenTurnedOff();
- } else if (!isOff && mReportedScreenStateToPolicy == REPORTED_TO_POLICY_SCREEN_OFF) {
+ } else if (!isOff
+ && mReportedScreenStateToPolicy == REPORTED_TO_POLICY_SCREEN_TURNING_OFF) {
+
+ // We told policy already that screen was turning off, but now we changed our minds.
+ // Complete the full state transition on -> turningOff -> off.
+ unblockScreenOff();
+ mWindowManagerPolicy.screenTurnedOff();
+ mReportedScreenStateToPolicy = REPORTED_TO_POLICY_SCREEN_OFF;
+ }
+ if (!isOff && mReportedScreenStateToPolicy == REPORTED_TO_POLICY_SCREEN_OFF) {
mReportedScreenStateToPolicy = REPORTED_TO_POLICY_SCREEN_TURNING_ON;
if (mPowerState.getColorFadeLevel() == 0.0f) {
blockScreenOn();
@@ -1282,6 +1329,12 @@
updatePowerState();
}
break;
+ case MSG_SCREEN_OFF_UNBLOCKED:
+ if (mPendingScreenOffUnblocker == msg.obj) {
+ unblockScreenOff();
+ updatePowerState();
+ }
+ break;
}
}
}
@@ -1311,4 +1364,14 @@
mHandler.sendMessage(msg);
}
}
+
+ private final class ScreenOffUnblocker implements WindowManagerPolicy.ScreenOffListener {
+
+ @Override
+ public void onScreenOff() {
+ Message msg = mHandler.obtainMessage(MSG_SCREEN_OFF_UNBLOCKED, this);
+ msg.setAsynchronous(true);
+ mHandler.sendMessage(msg);
+ }
+ }
}
diff --git a/services/core/java/com/android/server/dreams/DreamManagerService.java b/services/core/java/com/android/server/dreams/DreamManagerService.java
index dbccc07..1b984a4 100644
--- a/services/core/java/com/android/server/dreams/DreamManagerService.java
+++ b/services/core/java/com/android/server/dreams/DreamManagerService.java
@@ -86,6 +86,7 @@
private boolean mCurrentDreamCanDoze;
private boolean mCurrentDreamIsDozing;
private boolean mCurrentDreamIsWaking;
+ private Runnable mStopDreamRunnable;
private int mCurrentDreamDozeScreenState = Display.STATE_UNKNOWN;
private int mCurrentDreamDozeScreenBrightness = PowerManager.BRIGHTNESS_DEFAULT;
@@ -349,6 +350,11 @@
private void startDreamLocked(final ComponentName name,
final boolean isTest, final boolean canDoze, final int userId) {
+ if (mStopDreamRunnable != null) {
+ mHandler.removeCallbacks(mStopDreamRunnable);
+ mStopDreamRunnable = null;
+ }
+
if (Objects.equal(mCurrentDreamName, name)
&& mCurrentDreamIsTest == isTest
&& mCurrentDreamCanDoze == canDoze
@@ -386,13 +392,15 @@
mCurrentDreamIsWaking = true;
}
- mHandler.post(new Runnable() {
+ mStopDreamRunnable = new Runnable() {
@Override
public void run() {
Slog.i(TAG, "Performing gentle wake from dream.");
mController.stopDream(immediate);
+ mStopDreamRunnable = null;
}
- });
+ };
+ mHandler.post(mStopDreamRunnable);
}
}
diff --git a/services/core/java/com/android/server/emergency/EmergencyAffordanceService.java b/services/core/java/com/android/server/emergency/EmergencyAffordanceService.java
index 98771df..a91fe77 100644
--- a/services/core/java/com/android/server/emergency/EmergencyAffordanceService.java
+++ b/services/core/java/com/android/server/emergency/EmergencyAffordanceService.java
@@ -219,6 +219,7 @@
List<SubscriptionInfo> activeSubscriptionInfoList =
mSubscriptionManager.getActiveSubscriptionInfoList();
if (activeSubscriptionInfoList == null) {
+ setSimNeedsEmergencyAffordance(neededNow);
return neededNow;
}
for (SubscriptionInfo info : activeSubscriptionInfoList) {
diff --git a/services/core/java/com/android/server/fingerprint/AuthenticationClient.java b/services/core/java/com/android/server/fingerprint/AuthenticationClient.java
index 4fc6ddd..5339bac 100644
--- a/services/core/java/com/android/server/fingerprint/AuthenticationClient.java
+++ b/services/core/java/com/android/server/fingerprint/AuthenticationClient.java
@@ -41,8 +41,6 @@
public static final int LOCKOUT_TIMED = 1;
public static final int LOCKOUT_PERMANENT = 2;
- private boolean mAlreadyCancelled;
-
public AuthenticationClient(Context context, long halDeviceId, IBinder token,
IFingerprintServiceReceiver receiver, int targetUserId, int groupId, long opId,
boolean restricted, String owner) {
diff --git a/services/core/java/com/android/server/fingerprint/ClientMonitor.java b/services/core/java/com/android/server/fingerprint/ClientMonitor.java
index 492cd61..1a2e144 100644
--- a/services/core/java/com/android/server/fingerprint/ClientMonitor.java
+++ b/services/core/java/com/android/server/fingerprint/ClientMonitor.java
@@ -44,6 +44,7 @@
private String mOwner;
private Context mContext;
private long mHalDeviceId;
+ protected boolean mAlreadyCancelled;
/**
* @param context context of FingerprintService
diff --git a/services/core/java/com/android/server/fingerprint/EnrollClient.java b/services/core/java/com/android/server/fingerprint/EnrollClient.java
index e1b78a8..6170894 100644
--- a/services/core/java/com/android/server/fingerprint/EnrollClient.java
+++ b/services/core/java/com/android/server/fingerprint/EnrollClient.java
@@ -100,6 +100,10 @@
@Override
public int stop(boolean initiatedByClient) {
+ if (mAlreadyCancelled) {
+ Slog.w(TAG, "stopEnroll: already cancelled!");
+ return 0;
+ }
IBiometricsFingerprint daemon = getFingerprintDaemon();
if (daemon == null) {
Slog.w(TAG, "stopEnrollment: no fingerprint HAL!");
@@ -117,6 +121,7 @@
if (initiatedByClient) {
onError(FingerprintManager.FINGERPRINT_ERROR_CANCELED, 0 /* vendorCode */);
}
+ mAlreadyCancelled = true;
return 0;
}
diff --git a/services/core/java/com/android/server/fingerprint/EnumerateClient.java b/services/core/java/com/android/server/fingerprint/EnumerateClient.java
index 1b8b89c..12827d0 100644
--- a/services/core/java/com/android/server/fingerprint/EnumerateClient.java
+++ b/services/core/java/com/android/server/fingerprint/EnumerateClient.java
@@ -56,6 +56,10 @@
@Override
public int stop(boolean initiatedByClient) {
+ if (mAlreadyCancelled) {
+ Slog.w(TAG, "stopEnumerate: already cancelled!");
+ return 0;
+ }
IBiometricsFingerprint daemon = getFingerprintDaemon();
if (daemon == null) {
Slog.w(TAG, "stopEnumeration: no fingerprint HAL!");
@@ -77,6 +81,7 @@
if (initiatedByClient) {
onError(FingerprintManager.FINGERPRINT_ERROR_CANCELED, 0 /* vendorCode */);
}
+ mAlreadyCancelled = true;
return 0; // success
}
diff --git a/services/core/java/com/android/server/fingerprint/RemovalClient.java b/services/core/java/com/android/server/fingerprint/RemovalClient.java
index 8646107..ffc8488 100644
--- a/services/core/java/com/android/server/fingerprint/RemovalClient.java
+++ b/services/core/java/com/android/server/fingerprint/RemovalClient.java
@@ -59,6 +59,10 @@
@Override
public int stop(boolean initiatedByClient) {
+ if (mAlreadyCancelled) {
+ Slog.w(TAG, "stopRemove: already cancelled!");
+ return 0;
+ }
IBiometricsFingerprint daemon = getFingerprintDaemon();
if (daemon == null) {
Slog.w(TAG, "stopRemoval: no fingerprint HAL!");
@@ -75,6 +79,7 @@
Slog.e(TAG, "stopRemoval failed", e);
return ERROR_ESRCH;
}
+ mAlreadyCancelled = true;
return 0; // success
}
diff --git a/services/core/java/com/android/server/lights/LightsService.java b/services/core/java/com/android/server/lights/LightsService.java
index e07156e..a94ed60 100644
--- a/services/core/java/com/android/server/lights/LightsService.java
+++ b/services/core/java/com/android/server/lights/LightsService.java
@@ -129,10 +129,11 @@
brightnessMode = mLastBrightnessMode;
}
- if ((color != mColor || mode != mMode || onMS != mOnMS || offMS != mOffMS ||
- mBrightnessMode != brightnessMode)) {
+ if (!mInitialized || color != mColor || mode != mMode || onMS != mOnMS ||
+ offMS != mOffMS || mBrightnessMode != brightnessMode) {
if (DEBUG) Slog.v(TAG, "setLight #" + mId + ": color=#"
+ Integer.toHexString(color) + ": brightnessMode=" + brightnessMode);
+ mInitialized = true;
mLastColor = mColor;
mColor = color;
mMode = mode;
@@ -164,6 +165,7 @@
private int mLastColor;
private boolean mVrModeEnabled;
private boolean mUseLowPersistenceForVR;
+ private boolean mInitialized;
}
public LightsService(Context context) {
diff --git a/services/core/java/com/android/server/location/GnssLocationProvider.java b/services/core/java/com/android/server/location/GnssLocationProvider.java
index 85d8986..3fd91dc 100644
--- a/services/core/java/com/android/server/location/GnssLocationProvider.java
+++ b/services/core/java/com/android/server/location/GnssLocationProvider.java
@@ -937,9 +937,9 @@
long time = mNtpTime.getCachedNtpTime();
long timeReference = mNtpTime.getCachedNtpTimeReference();
long certainty = mNtpTime.getCacheCertainty();
- long now = SystemClock.elapsedRealtime();
if (DEBUG) {
+ long now = System.currentTimeMillis();
Log.d(TAG, "NTP server returned: "
+ time + " (" + new Date(time)
+ ") reference: " + timeReference
diff --git a/services/core/java/com/android/server/media/MediaSessionService.java b/services/core/java/com/android/server/media/MediaSessionService.java
index e0017b5..38c6157 100644
--- a/services/core/java/com/android/server/media/MediaSessionService.java
+++ b/services/core/java/com/android/server/media/MediaSessionService.java
@@ -171,19 +171,63 @@
public void updateSession(MediaSessionRecord record) {
synchronized (mLock) {
FullUserRecord user = getFullUserRecordLocked(record.getUserId());
- if (user == null || !user.mPriorityStack.contains(record)) {
- Log.d(TAG, "Unknown session updated. Ignoring.");
+ if (user == null) {
+ Log.w(TAG, "Unknown session updated. Ignoring.");
return;
}
- user.mPriorityStack.onSessionStateChange(record);
if ((record.getFlags() & MediaSession.FLAG_EXCLUSIVE_GLOBAL_PRIORITY) != 0) {
- mGlobalPrioritySession = record;
+ if (mGlobalPrioritySession != record) {
+ Log.d(TAG, "Global priority session is changed from " + mGlobalPrioritySession
+ + " to " + record);
+ mGlobalPrioritySession = record;
+ if (user != null && user.mPriorityStack.contains(record)) {
+ // Handle the global priority session separately.
+ // Otherwise, it will be the media button session even after it becomes
+ // inactive because it has been the lastly played media app.
+ user.mPriorityStack.removeSession(record);
+ }
+ }
+ if (DEBUG_KEY_EVENT) {
+ Log.d(TAG, "Global priority session is updated, active=" + record.isActive());
+ }
user.pushAddressedPlayerChangedLocked();
+ } else {
+ if (!user.mPriorityStack.contains(record)) {
+ Log.w(TAG, "Unknown session updated. Ignoring.");
+ return;
+ }
+ user.mPriorityStack.onSessionStateChange(record);
}
mHandler.postSessionsChanged(record.getUserId());
}
}
+ private List<MediaSessionRecord> getActiveSessionsLocked(int userId) {
+ List<MediaSessionRecord> records;
+ if (userId == UserHandle.USER_ALL) {
+ records = new ArrayList<>();
+ int size = mUserRecords.size();
+ for (int i = 0; i < size; i++) {
+ records.addAll(mUserRecords.valueAt(i).mPriorityStack.getActiveSessions(userId));
+ }
+ } else {
+ FullUserRecord user = getFullUserRecordLocked(userId);
+ if (user == null) {
+ Log.w(TAG, "getSessions failed. Unknown user " + userId);
+ return new ArrayList<>();
+ }
+ records = user.mPriorityStack.getActiveSessions(userId);
+ }
+
+ // Return global priority session at the first whenever it's asked.
+ if (isGlobalPriorityActiveLocked()
+ && (userId == UserHandle.USER_ALL
+ || userId == mGlobalPrioritySession.getUserId())) {
+ records.add(0, mGlobalPrioritySession);
+ }
+ return records;
+ }
+
/**
* Tells the system UI that volume has changed on an active remote session.
*/
@@ -339,16 +383,16 @@
if (DEBUG) {
Log.d(TAG, "Destroying " + session);
}
- int userId = session.getUserId();
- FullUserRecord user = getFullUserRecordLocked(userId);
- if (user != null) {
- user.removeSessionLocked(session);
- }
+ FullUserRecord user = getFullUserRecordLocked(session.getUserId());
if (mGlobalPrioritySession == session) {
mGlobalPrioritySession = null;
if (session.isActive() && user != null) {
user.pushAddressedPlayerChangedLocked();
}
+ } else {
+ if (user != null) {
+ user.mPriorityStack.removeSession(session);
+ }
}
try {
@@ -484,7 +528,7 @@
throw new RuntimeException("Media Session owner died prematurely.", e);
}
- user.addSessionLocked(session);
+ user.mPriorityStack.addSession(session);
mHandler.postSessionsChanged(userId);
if (DEBUG) {
@@ -509,7 +553,7 @@
Log.w(TAG, "pushSessionsChanged failed. No user with id=" + userId);
return;
}
- List<MediaSessionRecord> records = user.mPriorityStack.getActiveSessions(userId);
+ List<MediaSessionRecord> records = getActiveSessionsLocked(userId);
int size = records.size();
ArrayList<MediaSession.Token> tokens = new ArrayList<MediaSession.Token>();
for (int i = 0; i < size; i++) {
@@ -637,14 +681,6 @@
}
}
- public void addSessionLocked(MediaSessionRecord session) {
- mPriorityStack.addSession(session);
- }
-
- public void removeSessionLocked(MediaSessionRecord session) {
- mPriorityStack.removeSession(session);
- }
-
public void dumpLocked(PrintWriter pw, String prefix) {
pw.print(prefix + "Record for full_user=" + mFullUserId);
// Dump managed profile user ids associated with this user.
@@ -816,27 +852,9 @@
int resolvedUserId = verifySessionsRequest(componentName, userId, pid, uid);
ArrayList<IBinder> binders = new ArrayList<IBinder>();
synchronized (mLock) {
- if (resolvedUserId == UserHandle.USER_ALL) {
- int size = mUserRecords.size();
- for (int i = 0; i < size; i++) {
- List<MediaSessionRecord> records =
- mUserRecords.valueAt(i).mPriorityStack.getActiveSessions(
- resolvedUserId);
- for (MediaSessionRecord record : records) {
- binders.add(record.getControllerBinder().asBinder());
- }
- }
- } else {
- FullUserRecord user = getFullUserRecordLocked(resolvedUserId);
- if (user == null) {
- Log.w(TAG, "getSessions failed. Unknown user " + userId);
- return binders;
- }
- List<MediaSessionRecord> records = user.mPriorityStack
- .getActiveSessions(resolvedUserId);
- for (MediaSessionRecord record : records) {
- binders.add(record.getControllerBinder().asBinder());
- }
+ List<MediaSessionRecord> records = getActiveSessionsLocked(resolvedUserId);
+ for (MediaSessionRecord record : records) {
+ binders.add(record.getControllerBinder().asBinder());
}
}
return binders;
@@ -1292,6 +1310,9 @@
synchronized (mLock) {
pw.println(mSessionsListeners.size() + " sessions listeners.");
pw.println("Global priority session is " + mGlobalPrioritySession);
+ if (mGlobalPrioritySession != null) {
+ mGlobalPrioritySession.dump(pw, " ");
+ }
pw.println("User Records:");
int count = mUserRecords.size();
for (int i = 0; i < count; i++) {
diff --git a/services/core/java/com/android/server/media/MediaSessionStack.java b/services/core/java/com/android/server/media/MediaSessionStack.java
index f474769..f03f630 100644
--- a/services/core/java/com/android/server/media/MediaSessionStack.java
+++ b/services/core/java/com/android/server/media/MediaSessionStack.java
@@ -310,7 +310,6 @@
* Get a priority sorted list of sessions. Can filter to only return active
* sessions or sessions.
* <p>Here's the priority order.
- * <li>System priority session (session with FLAG_EXCLUSIVE_GLOBAL_PRIORITY)</li>
* <li>Active sessions whose PlaybackState is active</li>
* <li>Active sessions whose PlaybackState is inactive</li>
* <li>Inactive sessions</li>
@@ -344,13 +343,7 @@
continue;
}
- if (session.isSystemPriority()) {
- // System priority sessions are special and always go at the
- // front. We expect there to only be one of these at a time.
- result.add(0, session);
- lastPlaybackActiveIndex++;
- lastActiveIndex++;
- } else if (session.isPlaybackActive()) {
+ if (session.isPlaybackActive()) {
result.add(lastPlaybackActiveIndex++, session);
lastActiveIndex++;
} else {
diff --git a/services/core/java/com/android/server/notification/ManagedServices.java b/services/core/java/com/android/server/notification/ManagedServices.java
index b8d633f..73a365b 100644
--- a/services/core/java/com/android/server/notification/ManagedServices.java
+++ b/services/core/java/com/android/server/notification/ManagedServices.java
@@ -221,7 +221,9 @@
restoredSettingName(element),
newValue,
userid);
- updateSettingsAccordingToInstalledServices(element, userid);
+ if (mConfig.secureSettingName.equals(element)) {
+ updateSettingsAccordingToInstalledServices(element, userid);
+ }
rebuildRestoredPackages();
}
}
diff --git a/services/core/java/com/android/server/notification/NotificationManagerService.java b/services/core/java/com/android/server/notification/NotificationManagerService.java
index 9cd0dff..3667e16 100644
--- a/services/core/java/com/android/server/notification/NotificationManagerService.java
+++ b/services/core/java/com/android/server/notification/NotificationManagerService.java
@@ -16,6 +16,7 @@
package com.android.server.notification;
+import static android.app.NotificationManager.IMPORTANCE_MIN;
import static android.app.NotificationManager.IMPORTANCE_NONE;
import static android.content.pm.PackageManager.FEATURE_LEANBACK;
import static android.content.pm.PackageManager.FEATURE_TELEVISION;
@@ -90,7 +91,6 @@
import android.content.pm.PackageManager;
import android.content.pm.PackageManager.NameNotFoundException;
import android.content.pm.ParceledListSlice;
-import android.content.pm.UserInfo;
import android.content.res.Resources;
import android.database.ContentObserver;
import android.media.AudioManager;
@@ -114,7 +114,6 @@
import android.os.SystemClock;
import android.os.SystemProperties;
import android.os.UserHandle;
-import android.os.UserManager;
import android.os.Vibrator;
import android.os.VibrationEffect;
import android.provider.Settings;
@@ -473,19 +472,6 @@
out.endDocument();
}
- /** Use this when you actually want to post a notification or toast.
- *
- * Unchecked. Not exposed via Binder, but can be called in the course of enqueue*().
- */
- private boolean noteNotificationOp(String pkg, int uid) {
- if (mAppOps.noteOpNoThrow(AppOpsManager.OP_POST_NOTIFICATION, uid, pkg)
- != AppOpsManager.MODE_ALLOWED) {
- Slog.v(TAG, "notifications are disabled by AppOps for " + pkg);
- return false;
- }
- return true;
- }
-
/** Use this to check if a package can post a notification or toast. */
private boolean checkNotificationOp(String pkg, int uid) {
return mAppOps.checkOp(AppOpsManager.OP_POST_NOTIFICATION, uid, pkg)
@@ -1154,7 +1140,7 @@
final File systemDir = new File(Environment.getDataDirectory(), "system");
mPolicyFile = new AtomicFile(new File(systemDir, "notification_policy.xml"));
- syncBlockDb();
+ loadPolicyFile();
// This is a ManagedServices object that keeps track of the listeners.
mListeners = notificationListeners;
@@ -1267,46 +1253,6 @@
.addFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY), UserHandle.ALL, null);
}
- /**
- * Make sure the XML config and the the AppOps system agree about blocks.
- */
- private void syncBlockDb() {
- loadPolicyFile();
-
- // sync bans from ranker into app opps
- Map<Integer, String> packageBans = mRankingHelper.getPackageBans();
- for(Entry<Integer, String> ban : packageBans.entrySet()) {
- final int uid = ban.getKey();
- final String packageName = ban.getValue();
- setNotificationsEnabledForPackageImpl(packageName, uid, false);
- }
-
- // sync bans from app opps into ranker
- packageBans.clear();
- for (UserInfo user : UserManager.get(getContext()).getUsers()) {
- final int userId = user.getUserHandle().getIdentifier();
- final PackageManager packageManager = getContext().getPackageManager();
- List<PackageInfo> packages = packageManager.getInstalledPackagesAsUser(0, userId);
- final int packageCount = packages.size();
- for (int p = 0; p < packageCount; p++) {
- final String packageName = packages.get(p).packageName;
- try {
- final int uid = packageManager.getPackageUidAsUser(packageName, userId);
- if (!checkNotificationOp(packageName, uid)) {
- packageBans.put(uid, packageName);
- }
- } catch (NameNotFoundException e) {
- // forget you
- }
- }
- }
- for (Entry<Integer, String> ban : packageBans.entrySet()) {
- mRankingHelper.setImportance(ban.getValue(), ban.getKey(), IMPORTANCE_NONE);
- }
-
- savePolicyFile();
- }
-
@Override
public void onBootPhase(int phase) {
if (phase == SystemService.PHASE_SYSTEM_SERVICES_READY) {
@@ -1328,19 +1274,6 @@
}
}
- void setNotificationsEnabledForPackageImpl(String pkg, int uid, boolean enabled) {
- Slog.v(TAG, (enabled?"en":"dis") + "abling notifications for " + pkg);
-
- mAppOps.setMode(AppOpsManager.OP_POST_NOTIFICATION, uid, pkg,
- enabled ? AppOpsManager.MODE_ALLOWED : AppOpsManager.MODE_IGNORED);
-
- // Now, cancel any outstanding notifications that are part of a just-disabled app
- if (ENABLE_BLOCKED_NOTIFICATIONS && !enabled) {
- cancelAllNotificationsInt(MY_UID, MY_PID, pkg, null, 0, 0, true,
- UserHandle.getUserId(uid), REASON_PACKAGE_BANNED, null);
- }
- }
-
private void updateListenerHintsLocked() {
final int hints = calculateHints();
if (hints == mListenerHints) return;
@@ -1521,15 +1454,14 @@
final boolean isPackageSuspended =
isPackageSuspendedForUser(pkg, Binder.getCallingUid());
- if (ENABLE_BLOCKED_TOASTS && (!noteNotificationOp(pkg, Binder.getCallingUid())
- || isPackageSuspended)) {
- if (!isSystemToast) {
- Slog.e(TAG, "Suppressing toast from package " + pkg
- + (isPackageSuspended
- ? " due to package suspended by administrator."
- : " by user request."));
- return;
- }
+ if (ENABLE_BLOCKED_TOASTS && !isSystemToast &&
+ (!areNotificationsEnabledForPackage(pkg, Binder.getCallingUid())
+ || isPackageSuspended)) {
+ Slog.e(TAG, "Suppressing toast from package " + pkg
+ + (isPackageSuspended
+ ? " due to package suspended by administrator."
+ : " by user request."));
+ return;
}
synchronized (mToastQueue) {
@@ -1645,8 +1577,12 @@
public void setNotificationsEnabledForPackage(String pkg, int uid, boolean enabled) {
checkCallerIsSystem();
- setNotificationsEnabledForPackageImpl(pkg, uid, enabled);
mRankingHelper.setEnabled(pkg, uid, enabled);
+ // Now, cancel any outstanding notifications that are part of a just-disabled app
+ if (ENABLE_BLOCKED_NOTIFICATIONS && !enabled) {
+ cancelAllNotificationsInt(MY_UID, MY_PID, pkg, null, 0, 0, true,
+ UserHandle.getUserId(uid), REASON_PACKAGE_BANNED, null);
+ }
savePolicyFile();
}
@@ -1664,8 +1600,8 @@
@Override
public boolean areNotificationsEnabledForPackage(String pkg, int uid) {
checkCallerIsSystemOrSameApp(pkg);
- return (mAppOps.checkOpNoThrow(AppOpsManager.OP_POST_NOTIFICATION, uid, pkg)
- == AppOpsManager.MODE_ALLOWED) && !isPackageSuspendedForUser(pkg, uid);
+
+ return mRankingHelper.getImportance(pkg, uid) != IMPORTANCE_NONE;
}
@Override
@@ -3238,6 +3174,8 @@
final String noChannelStr = "No Channel found for "
+ "pkg=" + pkg
+ ", channelId=" + channelId
+ + ", id=" + id
+ + ", tag=" + tag
+ ", opPkg=" + opPkg
+ ", callingUid=" + callingUid
+ ", userId=" + userId
@@ -3282,10 +3220,12 @@
}
private void doChannelWarningToast(CharSequence toastText) {
- final boolean warningEnabled = Settings.System.getInt(getContext().getContentResolver(),
- Settings.Global.SHOW_NOTIFICATION_CHANNEL_WARNINGS, 0) != 0;
- if (warningEnabled || Build.IS_DEBUGGABLE) {
- Toast toast = Toast.makeText(getContext(), mHandler.getLooper(), toastText, Toast.LENGTH_LONG);
+ final int defaultWarningEnabled = Build.IS_DEBUGGABLE ? 1 : 0;
+ final boolean warningEnabled = Settings.Global.getInt(getContext().getContentResolver(),
+ Settings.Global.SHOW_NOTIFICATION_CHANNEL_WARNINGS, defaultWarningEnabled) != 0;
+ if (warningEnabled) {
+ Toast toast = Toast.makeText(getContext(), mHandler.getLooper(), toastText,
+ Toast.LENGTH_SHORT);
toast.show();
}
}
@@ -3398,8 +3338,7 @@
}
final boolean isBlocked = r.getImportance() == NotificationManager.IMPORTANCE_NONE
- || r.getChannel().getImportance() == NotificationManager.IMPORTANCE_NONE
- || !noteNotificationOp(pkg, callingUid);
+ || r.getChannel().getImportance() == NotificationManager.IMPORTANCE_NONE;
if (isBlocked) {
Slog.e(TAG, "Suppressing notification from package by user request.");
usageStats.registerBlocked(r);
@@ -3721,14 +3660,6 @@
" intercept=" + record.isIntercepted()
);
- final int currentUser;
- final long token = Binder.clearCallingIdentity();
- try {
- currentUser = ActivityManager.getCurrentUser();
- } finally {
- Binder.restoreCallingIdentity(token);
- }
-
// If we're not supposed to beep, vibrate, etc. then don't.
final String disableEffects = disableNotificationEffects(record);
if (disableEffects != null) {
@@ -3738,50 +3669,53 @@
// Remember if this notification already owns the notification channels.
boolean wasBeep = key != null && key.equals(mSoundNotificationKey);
boolean wasBuzz = key != null && key.equals(mVibrateNotificationKey);
-
// These are set inside the conditional if the notification is allowed to make noise.
boolean hasValidVibrate = false;
boolean hasValidSound = false;
- if (disableEffects == null
- && (record.getUserId() == UserHandle.USER_ALL ||
- record.getUserId() == currentUser ||
- mUserProfiles.isCurrentProfile(record.getUserId()))
- && canInterrupt
- && mSystemReady
- && mAudioManager != null) {
- if (DBG) Slog.v(TAG, "Interrupting!");
- Uri soundUri = record.getSound();
- hasValidSound = soundUri != null && !Uri.EMPTY.equals(soundUri);
- long[] vibration = record.getVibration();
- // Demote sound to vibration if vibration missing & phone in vibration mode.
- if (vibration == null
- && hasValidSound
- && (mAudioManager.getRingerModeInternal()
- == AudioManager.RINGER_MODE_VIBRATE)) {
- vibration = mFallbackVibrationPattern;
- }
- hasValidVibrate = vibration != null;
-
- if (!shouldMuteNotificationLocked(record)) {
+ if (isNotificationForCurrentUser(record)) {
+ // If the notification will appear in the status bar, it should send an accessibility
+ // event
+ if (!record.isUpdate && record.getImportance() > IMPORTANCE_MIN) {
sendAccessibilityEvent(notification, record.sbn.getPackageName());
+ }
- if (hasValidSound) {
- mSoundNotificationKey = key;
- if (mInCall) {
- playInCallNotification();
- beep = true;
- } else {
- beep = playSound(record, soundUri);
- }
+ if (disableEffects == null
+ && canInterrupt
+ && mSystemReady
+ && mAudioManager != null) {
+ if (DBG) Slog.v(TAG, "Interrupting!");
+ Uri soundUri = record.getSound();
+ hasValidSound = soundUri != null && !Uri.EMPTY.equals(soundUri);
+ long[] vibration = record.getVibration();
+ // Demote sound to vibration if vibration missing & phone in vibration mode.
+ if (vibration == null
+ && hasValidSound
+ && (mAudioManager.getRingerModeInternal()
+ == AudioManager.RINGER_MODE_VIBRATE)) {
+ vibration = mFallbackVibrationPattern;
}
+ hasValidVibrate = vibration != null;
- final boolean ringerModeSilent =
- mAudioManager.getRingerModeInternal() == AudioManager.RINGER_MODE_SILENT;
- if (!mInCall && hasValidVibrate && !ringerModeSilent) {
- mVibrateNotificationKey = key;
+ if (!shouldMuteNotificationLocked(record)) {
+ if (hasValidSound) {
+ mSoundNotificationKey = key;
+ if (mInCall) {
+ playInCallNotification();
+ beep = true;
+ } else {
+ beep = playSound(record, soundUri);
+ }
+ }
- buzz = playVibration(record, vibration);
+ final boolean ringerModeSilent =
+ mAudioManager.getRingerModeInternal()
+ == AudioManager.RINGER_MODE_SILENT;
+ if (!mInCall && hasValidVibrate && !ringerModeSilent) {
+ mVibrateNotificationKey = key;
+
+ buzz = playVibration(record, vibration);
+ }
}
}
}
@@ -3825,13 +3759,7 @@
return true;
}
if (record.sbn.isGroup()) {
- if (notification.isGroupSummary()
- && notification.getGroupAlertBehavior() == Notification.GROUP_ALERT_CHILDREN) {
- return true;
- } else if (notification.isGroupChild()
- && notification.getGroupAlertBehavior() == Notification.GROUP_ALERT_SUMMARY) {
- return true;
- }
+ return notification.suppressAlertingDueToGrouping();
}
return false;
}
@@ -3881,6 +3809,19 @@
}
}
+ private boolean isNotificationForCurrentUser(NotificationRecord record) {
+ final int currentUser;
+ final long token = Binder.clearCallingIdentity();
+ try {
+ currentUser = ActivityManager.getCurrentUser();
+ } finally {
+ Binder.restoreCallingIdentity(token);
+ }
+ return (record.getUserId() == UserHandle.USER_ALL ||
+ record.getUserId() == currentUser ||
+ mUserProfiles.isCurrentProfile(record.getUserId()));
+ }
+
private void playInCallNotification() {
new Thread() {
@Override
diff --git a/services/core/java/com/android/server/notification/NotificationRecord.java b/services/core/java/com/android/server/notification/NotificationRecord.java
index 803b0dc..95e1db7 100644
--- a/services/core/java/com/android/server/notification/NotificationRecord.java
+++ b/services/core/java/com/android/server/notification/NotificationRecord.java
@@ -45,6 +45,7 @@
import android.util.Slog;
import android.util.TimeUtils;
import android.util.proto.ProtoOutputStream;
+import android.widget.RemoteViews;
import com.android.internal.annotations.VisibleForTesting;
import com.android.internal.logging.MetricsLogger;
@@ -359,8 +360,13 @@
}
}
+ String formatRemoteViews(RemoteViews rv) {
+ if (rv == null) return "null";
+ return String.format("%s/0x%08x (%d bytes): %s",
+ rv.getPackage(), rv.getLayoutId(), rv.estimateMemoryUsage(), rv.toString());
+ }
+
void dump(PrintWriter pw, String prefix, Context baseContext, boolean redact) {
- prefix = prefix + " ";
final Notification notification = sbn.getNotification();
final Icon icon = notification.getSmallIcon();
String iconStr = String.valueOf(icon);
@@ -368,6 +374,7 @@
iconStr += " / " + idDebugString(baseContext, icon.getResPackage(), icon.getResId());
}
pw.println(prefix + this);
+ prefix = prefix + " ";
pw.println(prefix + "uid=" + sbn.getUid() + " userId=" + sbn.getUserId());
pw.println(prefix + "icon=" + iconStr);
pw.println(prefix + "pri=" + notification.priority);
@@ -391,8 +398,11 @@
} else {
pw.println("null");
}
- pw.println(prefix + "contentView=" + notification.contentView);
- pw.println(prefix + String.format("color=0x%08x", notification.color));
+ pw.println(prefix + "contentView=" + formatRemoteViews(notification.contentView));
+ pw.println(prefix + "bigContentView=" + formatRemoteViews(notification.bigContentView));
+ pw.println(prefix + "headsUpContentView="
+ + formatRemoteViews(notification.headsUpContentView));
+ pw.print(prefix + String.format("color=0x%08x", notification.color));
pw.println(prefix + "timeout="
+ TimeUtils.formatForLogging(notification.getTimeoutAfter()));
if (notification.actions != null && notification.actions.length > 0) {
diff --git a/services/core/java/com/android/server/notification/RankingHelper.java b/services/core/java/com/android/server/notification/RankingHelper.java
index f00ef38..2c0cc95 100644
--- a/services/core/java/com/android/server/notification/RankingHelper.java
+++ b/services/core/java/com/android/server/notification/RankingHelper.java
@@ -21,8 +21,6 @@
import com.android.internal.logging.nano.MetricsProto;
import com.android.internal.util.Preconditions;
-import android.annotation.UserIdInt;
-import android.app.ActivityManager;
import android.app.Notification;
import android.app.NotificationChannel;
import android.app.NotificationChannelGroup;
@@ -35,8 +33,6 @@
import android.metrics.LogMaker;
import android.os.Build;
import android.os.UserHandle;
-import android.os.UserManager;
-import android.provider.Settings;
import android.provider.Settings.Secure;
import android.service.notification.NotificationListenerService.Ranking;
import android.text.TextUtils;
@@ -189,6 +185,10 @@
safeInt(parser, ATT_PRIORITY, DEFAULT_PRIORITY),
safeInt(parser, ATT_VISIBILITY, DEFAULT_VISIBILITY),
safeBool(parser, ATT_SHOW_BADGE, DEFAULT_SHOW_BADGE));
+ r.importance = safeInt(parser, ATT_IMPORTANCE, DEFAULT_IMPORTANCE);
+ r.priority = safeInt(parser, ATT_PRIORITY, DEFAULT_PRIORITY);
+ r.visibility = safeInt(parser, ATT_VISIBILITY, DEFAULT_VISIBILITY);
+ r.showBadge = safeBool(parser, ATT_SHOW_BADGE, DEFAULT_SHOW_BADGE);
final int innerDepth = parser.getDepth();
while ((type = parser.next()) != XmlPullParser.END_DOCUMENT
@@ -447,7 +447,9 @@
boolean isGroupSummary = record.getNotification().isGroupSummary();
record.setGlobalSortKey(
String.format("intrsv=%c:grnk=0x%04x:gsmry=%c:%s:rnk=0x%04x",
- record.isRecentlyIntrusive() ? '0' : '1',
+ record.isRecentlyIntrusive()
+ && record.getImportance() > NotificationManager.IMPORTANCE_MIN
+ ? '0' : '1',
groupProxy.getAuthoritativeRank(),
isGroupSummary ? '0' : '1',
groupSortKeyPortion,
@@ -551,7 +553,7 @@
}
NotificationChannel existing = r.channels.get(channel.getId());
- // Keep existing settings, except deleted status and name
+ // Keep most of the existing settings
if (existing != null && fromTargetApp) {
if (existing.isDeleted()) {
existing.setDeleted(false);
@@ -559,12 +561,13 @@
existing.setName(channel.getName().toString());
existing.setDescription(channel.getDescription());
+ existing.setBlockableSystem(channel.isBlockableSystem());
MetricsLogger.action(getChannelLog(channel, pkg));
updateConfig();
return;
}
- if (channel.getImportance() < NotificationManager.IMPORTANCE_MIN
+ if (channel.getImportance() < NotificationManager.IMPORTANCE_NONE
|| channel.getImportance() > NotificationManager.IMPORTANCE_MAX) {
throw new IllegalArgumentException("Invalid importance level");
}
@@ -1115,6 +1118,7 @@
Record fullRecord = getRecord(pkg,
mPm.getPackageUidAsUser(pkg, changeUserId));
if (fullRecord != null) {
+ createDefaultChannelIfNeeded(fullRecord);
deleteDefaultChannelIfNeeded(fullRecord);
}
} catch (NameNotFoundException e) {}
diff --git a/services/core/java/com/android/server/om/OverlayManagerSettings.java b/services/core/java/com/android/server/om/OverlayManagerSettings.java
index 353b710..c059b37 100644
--- a/services/core/java/com/android/server/om/OverlayManagerSettings.java
+++ b/services/core/java/com/android/server/om/OverlayManagerSettings.java
@@ -319,7 +319,7 @@
private static final String ATTR_USER_ID = "userId";
private static final String ATTR_VERSION = "version";
- private static final int CURRENT_VERSION = 2;
+ private static final int CURRENT_VERSION = 3;
public static void restore(@NonNull final ArrayList<SettingsItem> table,
@NonNull final InputStream is) throws IOException, XmlPullParserException {
@@ -350,6 +350,7 @@
switch (oldVersion) {
case 0:
case 1:
+ case 2:
// Throw an exception which will cause the overlay file to be ignored
// and overwritten.
throw new XmlPullParserException("old version " + oldVersion + "; ignoring");
diff --git a/services/core/java/com/android/server/pm/BackgroundDexOptService.java b/services/core/java/com/android/server/pm/BackgroundDexOptService.java
index d364d17..0d1f58a 100644
--- a/services/core/java/com/android/server/pm/BackgroundDexOptService.java
+++ b/services/core/java/com/android/server/pm/BackgroundDexOptService.java
@@ -36,6 +36,8 @@
import android.util.Log;
import com.android.server.pm.dex.DexManager;
+import com.android.server.LocalServices;
+import com.android.server.PinnerService;
import java.io.File;
import java.util.concurrent.atomic.AtomicBoolean;
@@ -175,6 +177,7 @@
mAbortPostBootUpdate.set(false);
+ ArraySet<String> updatedPackages = new ArraySet<>();
for (String pkg : pkgs) {
if (mAbortPostBootUpdate.get()) {
// JobScheduler requested an early abort.
@@ -208,11 +211,15 @@
// Unfortunately this will also means that "pm.dexopt.boot=speed-profile" will
// behave differently than "pm.dexopt.bg-dexopt=speed-profile" but that's a
// trade-off worth doing to save boot time work.
- pm.performDexOpt(pkg,
+ int result = pm.performDexOptWithStatus(pkg,
/* checkProfiles */ false,
PackageManagerService.REASON_BOOT,
/* force */ false);
+ if (result == PackageDexOptimizer.DEX_OPT_PERFORMED) {
+ updatedPackages.add(pkg);
+ }
}
+ notifyPinService(updatedPackages);
// Ran to completion, so we abandon our timeslice and do not reschedule.
jobFinished(jobParams, /* reschedule */ false);
}
@@ -265,6 +272,7 @@
private int optimizePackages(PackageManagerService pm, ArraySet<String> pkgs,
long lowStorageThreshold, boolean is_for_primary_dex,
ArraySet<String> failedPackageNames) {
+ ArraySet<String> updatedPackages = new ArraySet<>();
for (String pkg : pkgs) {
int abort_code = abortIdleOptimizations(lowStorageThreshold);
if (abort_code != OPTIMIZE_CONTINUE) {
@@ -284,14 +292,21 @@
// Optimize package if needed. Note that there can be no race between
// concurrent jobs because PackageDexOptimizer.performDexOpt is synchronized.
- boolean success = is_for_primary_dex
- ? pm.performDexOpt(pkg,
- /* checkProfiles */ true,
- PackageManagerService.REASON_BACKGROUND_DEXOPT,
- /* force */ false)
- : pm.performDexOptSecondary(pkg,
- PackageManagerService.REASON_BACKGROUND_DEXOPT,
- /* force */ false);
+ boolean success;
+ if (is_for_primary_dex) {
+ int result = pm.performDexOptWithStatus(pkg,
+ /* checkProfiles */ true,
+ PackageManagerService.REASON_BACKGROUND_DEXOPT,
+ /* force */ false);
+ success = result != PackageDexOptimizer.DEX_OPT_FAILED;
+ if (result == PackageDexOptimizer.DEX_OPT_PERFORMED) {
+ updatedPackages.add(pkg);
+ }
+ } else {
+ success = pm.performDexOptSecondary(pkg,
+ PackageManagerService.REASON_BACKGROUND_DEXOPT,
+ /* force */ false);
+ }
if (success) {
// Dexopt succeeded, remove package from the list of failing ones.
synchronized (failedPackageNames) {
@@ -299,6 +314,7 @@
}
}
}
+ notifyPinService(updatedPackages);
return OPTIMIZE_PROCESSED;
}
@@ -366,11 +382,14 @@
return false;
}
+ boolean result;
if (params.getJobId() == JOB_POST_BOOT_UPDATE) {
- return runPostBootUpdate(params, pm, pkgs);
+ result = runPostBootUpdate(params, pm, pkgs);
} else {
- return runIdleOptimization(params, pm, pkgs);
+ result = runIdleOptimization(params, pm, pkgs);
}
+
+ return result;
}
@Override
@@ -386,4 +405,12 @@
}
return false;
}
+
+ private void notifyPinService(ArraySet<String> updatedPackages) {
+ PinnerService pinnerService = LocalServices.getService(PinnerService.class);
+ if (pinnerService != null) {
+ Log.i(TAG, "Pinning optimized code " + updatedPackages);
+ pinnerService.update(updatedPackages);
+ }
+ }
}
diff --git a/services/core/java/com/android/server/pm/DefaultPermissionGrantPolicy.java b/services/core/java/com/android/server/pm/DefaultPermissionGrantPolicy.java
index 6625331..ac7b763 100644
--- a/services/core/java/com/android/server/pm/DefaultPermissionGrantPolicy.java
+++ b/services/core/java/com/android/server/pm/DefaultPermissionGrantPolicy.java
@@ -77,8 +77,9 @@
private static final String TAG = "DefaultPermGrantPolicy"; // must be <= 23 chars
private static final boolean DEBUG = false;
- private static final int DEFAULT_FLAGS = PackageManager.MATCH_DIRECT_BOOT_AWARE
- | PackageManager.MATCH_DIRECT_BOOT_UNAWARE;
+ private static final int DEFAULT_FLAGS =
+ PackageManager.MATCH_DIRECT_BOOT_AWARE | PackageManager.MATCH_DIRECT_BOOT_UNAWARE
+ | PackageManager.MATCH_UNINSTALLED_PACKAGES;
private static final String AUDIO_MIME_TYPE = "audio/mpeg";
diff --git a/services/core/java/com/android/server/pm/Installer.java b/services/core/java/com/android/server/pm/Installer.java
index e6e4617..c95b5c5 100644
--- a/services/core/java/com/android/server/pm/Installer.java
+++ b/services/core/java/com/android/server/pm/Installer.java
@@ -395,10 +395,11 @@
}
}
- public void freeCache(String uuid, long freeStorageSize, int flags) throws InstallerException {
+ public void freeCache(String uuid, long targetFreeBytes, long cacheReservedBytes, int flags)
+ throws InstallerException {
if (!checkBeforeRemote()) return;
try {
- mInstalld.freeCache(uuid, freeStorageSize, flags);
+ mInstalld.freeCache(uuid, targetFreeBytes, cacheReservedBytes, flags);
} catch (Exception e) {
throw InstallerException.from(e);
}
diff --git a/services/core/java/com/android/server/pm/InstantAppRegistry.java b/services/core/java/com/android/server/pm/InstantAppRegistry.java
index b165984..211a1c9 100644
--- a/services/core/java/com/android/server/pm/InstantAppRegistry.java
+++ b/services/core/java/com/android/server/pm/InstantAppRegistry.java
@@ -21,6 +21,7 @@
import android.annotation.UserIdInt;
import android.content.Intent;
import android.content.pm.InstantAppInfo;
+import android.content.pm.PackageManager;
import android.content.pm.PackageParser;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
@@ -32,6 +33,8 @@
import android.os.Handler;
import android.os.Looper;
import android.os.Message;
+import android.os.UserHandle;
+import android.os.storage.StorageManager;
import android.provider.Settings;
import android.util.ArrayMap;
import android.util.AtomicFile;
@@ -76,7 +79,16 @@
private static final String LOG_TAG = "InstantAppRegistry";
- private static final long DEFAULT_UNINSTALLED_INSTANT_APP_CACHE_DURATION_MILLIS =
+ static final long DEFAULT_INSTALLED_INSTANT_APP_MIN_CACHE_PERIOD =
+ DEBUG ? 30 * 1000L /* thirty seconds */ : 7 * 24 * 60 * 60 * 1000L; /* one week */
+
+ private static final long DEFAULT_INSTALLED_INSTANT_APP_MAX_CACHE_PERIOD =
+ DEBUG ? 60 * 1000L /* one min */ : 6 * 30 * 24 * 60 * 60 * 1000L; /* six months */
+
+ static final long DEFAULT_UNINSTALLED_INSTANT_APP_MIN_CACHE_PERIOD =
+ DEBUG ? 30 * 1000L /* thirty seconds */ : 7 * 24 * 60 * 60 * 1000L; /* one week */
+
+ private static final long DEFAULT_UNINSTALLED_INSTANT_APP_MAX_CACHE_PERIOD =
DEBUG ? 60 * 1000L /* one min */ : 6 * 30 * 24 * 60 * 60 * 1000L; /* six months */
private static final String INSTANT_APPS_FOLDER = "instant";
@@ -535,46 +547,195 @@
}
}
- public void pruneInstantAppsLPw() {
- // For now we prune only state for uninstalled instant apps
- final long maxCacheDurationMillis = Settings.Global.getLong(
+ void pruneInstantApps() {
+ final long maxInstalledCacheDuration = Settings.Global.getLong(
mService.mContext.getContentResolver(),
- Settings.Global.UNINSTALLED_INSTANT_APP_CACHE_DURATION_MILLIS,
- DEFAULT_UNINSTALLED_INSTANT_APP_CACHE_DURATION_MILLIS);
+ Settings.Global.INSTALLED_INSTANT_APP_MAX_CACHE_PERIOD,
+ DEFAULT_INSTALLED_INSTANT_APP_MAX_CACHE_PERIOD);
- for (int userId : UserManagerService.getInstance().getUserIds()) {
- // Prune in-memory state
- removeUninstalledInstantAppStateLPw((UninstalledInstantAppState state) -> {
- final long elapsedCachingMillis = System.currentTimeMillis() - state.mTimestamp;
- return (elapsedCachingMillis > maxCacheDurationMillis);
- }, userId);
+ final long maxUninstalledCacheDuration = Settings.Global.getLong(
+ mService.mContext.getContentResolver(),
+ Settings.Global.UNINSTALLED_INSTANT_APP_MAX_CACHE_PERIOD,
+ DEFAULT_UNINSTALLED_INSTANT_APP_MAX_CACHE_PERIOD);
- // Prune on-disk state
- File instantAppsDir = getInstantApplicationsDir(userId);
- if (!instantAppsDir.exists()) {
- continue;
- }
- File[] files = instantAppsDir.listFiles();
- if (files == null) {
- continue;
- }
- for (File instantDir : files) {
- if (!instantDir.isDirectory()) {
+ try {
+ pruneInstantApps(Long.MAX_VALUE,
+ maxInstalledCacheDuration, maxUninstalledCacheDuration);
+ } catch (IOException e) {
+ Slog.e(LOG_TAG, "Error pruning installed and uninstalled instant apps", e);
+ }
+ }
+
+ boolean pruneInstalledInstantApps(long neededSpace, long maxInstalledCacheDuration) {
+ try {
+ return pruneInstantApps(neededSpace, maxInstalledCacheDuration, Long.MAX_VALUE);
+ } catch (IOException e) {
+ Slog.e(LOG_TAG, "Error pruning installed instant apps", e);
+ return false;
+ }
+ }
+
+ boolean pruneUninstalledInstantApps(long neededSpace, long maxUninstalledCacheDuration) {
+ try {
+ return pruneInstantApps(neededSpace, Long.MAX_VALUE, maxUninstalledCacheDuration);
+ } catch (IOException e) {
+ Slog.e(LOG_TAG, "Error pruning uninstalled instant apps", e);
+ return false;
+ }
+ }
+
+ /**
+ * Prunes instant apps until there is enough <code>neededSpace</code>. Both
+ * installed and uninstalled instant apps are pruned that are older than
+ * <code>maxInstalledCacheDuration</code> and <code>maxUninstalledCacheDuration</code>
+ * respectively. All times are in milliseconds.
+ *
+ * @param neededSpace The space to ensure is free.
+ * @param maxInstalledCacheDuration The max duration for caching installed apps in millis.
+ * @param maxUninstalledCacheDuration The max duration for caching uninstalled apps in millis.
+ * @return Whether enough space was freed.
+ *
+ * @throws IOException
+ */
+ private boolean pruneInstantApps(long neededSpace, long maxInstalledCacheDuration,
+ long maxUninstalledCacheDuration) throws IOException {
+ final StorageManager storage = mService.mContext.getSystemService(StorageManager.class);
+ final File file = storage.findPathForUuid(StorageManager.UUID_PRIVATE_INTERNAL);
+
+ if (file.getUsableSpace() >= neededSpace) {
+ return true;
+ }
+
+ List<String> packagesToDelete = null;
+
+ final int[] allUsers;
+ final long now = System.currentTimeMillis();
+
+ // Prune first installed instant apps
+ synchronized (mService.mPackages) {
+ allUsers = PackageManagerService.sUserManager.getUserIds();
+
+ final int packageCount = mService.mPackages.size();
+ for (int i = 0; i < packageCount; i++) {
+ final PackageParser.Package pkg = mService.mPackages.valueAt(i);
+ if (now - pkg.getLatestPackageUseTimeInMills() < maxInstalledCacheDuration) {
continue;
}
-
- File metadataFile = new File(instantDir, INSTANT_APP_METADATA_FILE);
- if (!metadataFile.exists()) {
+ if (!(pkg.mExtras instanceof PackageSetting)) {
continue;
}
+ final PackageSetting ps = (PackageSetting) pkg.mExtras;
+ boolean installedOnlyAsInstantApp = false;
+ for (int userId : allUsers) {
+ if (ps.getInstalled(userId)) {
+ if (ps.getInstantApp(userId)) {
+ installedOnlyAsInstantApp = true;
+ } else {
+ installedOnlyAsInstantApp = false;
+ break;
+ }
+ }
+ }
+ if (installedOnlyAsInstantApp) {
+ if (packagesToDelete == null) {
+ packagesToDelete = new ArrayList<>();
+ }
+ packagesToDelete.add(pkg.packageName);
+ }
+ }
- final long elapsedCachingMillis = System.currentTimeMillis()
- - metadataFile.lastModified();
- if (elapsedCachingMillis > maxCacheDurationMillis) {
- deleteDir(instantDir);
+ if (packagesToDelete != null) {
+ packagesToDelete.sort((String lhs, String rhs) -> {
+ final PackageParser.Package lhsPkg = mService.mPackages.get(lhs);
+ final PackageParser.Package rhsPkg = mService.mPackages.get(rhs);
+ if (lhsPkg == null && rhsPkg == null) {
+ return 0;
+ } else if (lhsPkg == null) {
+ return -1;
+ } else if (rhsPkg == null) {
+ return 1;
+ } else {
+ if (lhsPkg.getLatestPackageUseTimeInMills() >
+ rhsPkg.getLatestPackageUseTimeInMills()) {
+ return 1;
+ } else if (lhsPkg.getLatestPackageUseTimeInMills() <
+ rhsPkg.getLatestPackageUseTimeInMills()) {
+ return -1;
+ } else {
+ if (lhsPkg.mExtras instanceof PackageSetting
+ && rhsPkg.mExtras instanceof PackageSetting) {
+ final PackageSetting lhsPs = (PackageSetting) lhsPkg.mExtras;
+ final PackageSetting rhsPs = (PackageSetting) rhsPkg.mExtras;
+ if (lhsPs.firstInstallTime > rhsPs.firstInstallTime) {
+ return 1;
+ } else {
+ return -1;
+ }
+ } else {
+ return 0;
+ }
+ }
+ }
+ });
+ }
+ }
+
+ if (packagesToDelete != null) {
+ final int packageCount = packagesToDelete.size();
+ for (int i = 0; i < packageCount; i++) {
+ final String packageToDelete = packagesToDelete.get(i);
+ if (mService.deletePackageX(packageToDelete, PackageManager.VERSION_CODE_HIGHEST,
+ UserHandle.USER_SYSTEM, PackageManager.DELETE_ALL_USERS)
+ == PackageManager.DELETE_SUCCEEDED) {
+ if (file.getUsableSpace() >= neededSpace) {
+ return true;
+ }
}
}
}
+
+ // Prune uninstalled instant apps
+ synchronized (mService.mPackages) {
+ // TODO: Track last used time for uninstalled instant apps for better pruning
+ for (int userId : UserManagerService.getInstance().getUserIds()) {
+ // Prune in-memory state
+ removeUninstalledInstantAppStateLPw((UninstalledInstantAppState state) -> {
+ final long elapsedCachingMillis = System.currentTimeMillis() - state.mTimestamp;
+ return (elapsedCachingMillis > maxUninstalledCacheDuration);
+ }, userId);
+
+ // Prune on-disk state
+ File instantAppsDir = getInstantApplicationsDir(userId);
+ if (!instantAppsDir.exists()) {
+ continue;
+ }
+ File[] files = instantAppsDir.listFiles();
+ if (files == null) {
+ continue;
+ }
+ for (File instantDir : files) {
+ if (!instantDir.isDirectory()) {
+ continue;
+ }
+
+ File metadataFile = new File(instantDir, INSTANT_APP_METADATA_FILE);
+ if (!metadataFile.exists()) {
+ continue;
+ }
+
+ final long elapsedCachingMillis = System.currentTimeMillis()
+ - metadataFile.lastModified();
+ if (elapsedCachingMillis > maxUninstalledCacheDuration) {
+ deleteDir(instantDir);
+ if (file.getUsableSpace() >= neededSpace) {
+ return true;
+ }
+ }
+ }
+ }
+ }
+
+ return false;
}
private @Nullable List<InstantAppInfo> getInstalledInstantApplicationsLPr(
diff --git a/services/core/java/com/android/server/pm/PackageManagerService.java b/services/core/java/com/android/server/pm/PackageManagerService.java
index b1068ae..99eda86 100644
--- a/services/core/java/com/android/server/pm/PackageManagerService.java
+++ b/services/core/java/com/android/server/pm/PackageManagerService.java
@@ -20,7 +20,6 @@
import static android.Manifest.permission.INSTALL_PACKAGES;
import static android.Manifest.permission.READ_EXTERNAL_STORAGE;
import static android.Manifest.permission.REQUEST_DELETE_PACKAGES;
-import static android.Manifest.permission.REQUEST_INSTALL_PACKAGES;
import static android.Manifest.permission.WRITE_EXTERNAL_STORAGE;
import static android.Manifest.permission.WRITE_MEDIA_STORAGE;
import static android.content.pm.PackageManager.COMPONENT_ENABLED_STATE_DEFAULT;
@@ -100,10 +99,10 @@
import static com.android.server.pm.PermissionsState.PERMISSION_OPERATION_FAILURE;
import static com.android.server.pm.PermissionsState.PERMISSION_OPERATION_SUCCESS;
import static com.android.server.pm.PermissionsState.PERMISSION_OPERATION_SUCCESS_GIDS_CHANGED;
-
import static dalvik.system.DexFile.getNonProfileGuidedCompilerFilter;
import android.Manifest;
+import android.annotation.IntDef;
import android.annotation.NonNull;
import android.annotation.Nullable;
import android.app.ActivityManager;
@@ -126,10 +125,8 @@
import android.content.pm.ActivityInfo;
import android.content.pm.ApplicationInfo;
import android.content.pm.AppsQueryHelper;
-import android.content.pm.ChangedPackages;
-import android.content.pm.ComponentInfo;
-import android.content.pm.InstantAppRequest;
import android.content.pm.AuxiliaryResolveInfo;
+import android.content.pm.ChangedPackages;
import android.content.pm.FallbackCategoryProvider;
import android.content.pm.FeatureInfo;
import android.content.pm.IOnPermissionsChangeListener;
@@ -142,6 +139,7 @@
import android.content.pm.IPackageMoveObserver;
import android.content.pm.IPackageStatsObserver;
import android.content.pm.InstantAppInfo;
+import android.content.pm.InstantAppRequest;
import android.content.pm.InstantAppResolveInfo;
import android.content.pm.InstrumentationInfo;
import android.content.pm.IntentFilterVerificationInfo;
@@ -303,6 +301,8 @@
import java.io.FilenameFilter;
import java.io.IOException;
import java.io.PrintWriter;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
import java.nio.charset.StandardCharsets;
import java.security.DigestInputStream;
import java.security.MessageDigest;
@@ -441,6 +441,21 @@
private static final int[] EMPTY_INT_ARRAY = new int[0];
+ private static final int TYPE_UNKNOWN = 0;
+ private static final int TYPE_ACTIVITY = 1;
+ private static final int TYPE_RECEIVER = 2;
+ private static final int TYPE_SERVICE = 3;
+ private static final int TYPE_PROVIDER = 4;
+ @IntDef(prefix = { "TYPE_" }, value = {
+ TYPE_UNKNOWN,
+ TYPE_ACTIVITY,
+ TYPE_RECEIVER,
+ TYPE_SERVICE,
+ TYPE_PROVIDER,
+ })
+ @Retention(RetentionPolicy.SOURCE)
+ public @interface ComponentType {}
+
/**
* Timeout (in milliseconds) after which the watchdog should declare that
* our handler thread is wedged. The usual default for such things is one
@@ -860,9 +875,9 @@
new ParallelPackageParserCallback();
public static final class SharedLibraryEntry {
- public final String path;
- public final String apk;
- public final SharedLibraryInfo info;
+ public final @Nullable String path;
+ public final @Nullable String apk;
+ public final @NonNull SharedLibraryInfo info;
SharedLibraryEntry(String _path, String _apk, String name, int version, int type,
String declaringPackageName, int declaringPackageVersionCode) {
@@ -1297,6 +1312,9 @@
// Delay time in millisecs
static final int BROADCAST_DELAY = 10 * 1000;
+ private static final long DEFAULT_UNUSED_STATIC_SHARED_LIB_MIN_CACHE_PERIOD =
+ 2 * 60 * 60 * 1000L; /* two hours */
+
static UserManagerService sUserManager;
// Stores a list of users whose package restrictions file needs to be updated
@@ -3086,16 +3104,19 @@
@Override
public boolean isFirstBoot() {
+ // allow instant applications
return mFirstBoot;
}
@Override
public boolean isOnlyCoreApps() {
+ // allow instant applications
return mOnlyCore;
}
@Override
public boolean isUpgrade() {
+ // allow instant applications
return mIsUpgrade;
}
@@ -3189,6 +3210,9 @@
@Override
public @Nullable ComponentName getInstantAppResolverComponent() {
+ if (getInstantAppPackageName(Binder.getCallingUid()) != null) {
+ return null;
+ }
synchronized (mPackages) {
final Pair<ComponentName, String> instantAppResolver = getInstantAppResolverLPr();
if (instantAppResolver == null) {
@@ -3496,17 +3520,27 @@
* system partition.</li>
* </ol>
*/
- private boolean canAccessInstantApps(int callingUid) {
- final boolean isSpecialProcess =
- callingUid == Process.SYSTEM_UID
- || callingUid == Process.SHELL_UID
- || callingUid == 0;
- final boolean allowMatchInstant =
- isSpecialProcess
- || mContext.checkCallingOrSelfPermission(
- android.Manifest.permission.ACCESS_INSTANT_APPS) == PERMISSION_GRANTED;
- return allowMatchInstant;
+ private boolean canViewInstantApps(int callingUid, int userId) {
+ if (callingUid == Process.SYSTEM_UID
+ || callingUid == Process.SHELL_UID
+ || callingUid == Process.ROOT_UID) {
+ return true;
+ }
+ if (mContext.checkCallingOrSelfPermission(
+ android.Manifest.permission.ACCESS_INSTANT_APPS) == PERMISSION_GRANTED) {
+ return true;
+ }
+ if (mContext.checkCallingOrSelfPermission(
+ android.Manifest.permission.VIEW_INSTANT_APPS) == PERMISSION_GRANTED) {
+ final ComponentName homeComponent = getDefaultHomeActivity(userId);
+ if (homeComponent != null
+ && isCallerSameApp(homeComponent.getPackageName(), callingUid)) {
+ return true;
+ }
+ }
+ return false;
}
+
private PackageInfo generatePackageInfo(PackageSetting ps, int flags, int userId) {
if (!sUserManager.exists(userId)) return null;
if (ps == null) {
@@ -3516,32 +3550,15 @@
if (p == null) {
return null;
}
- final int callingUid = Binder.getCallingUid();
+ final int callingUid = Binder.getCallingUid();
// Filter out ephemeral app metadata:
// * The system/shell/root can see metadata for any app
// * An installed app can see metadata for 1) other installed apps
// and 2) ephemeral apps that have explicitly interacted with it
// * Ephemeral apps can only see their own data and exposed installed apps
// * Holding a signature permission allows seeing instant apps
- if (!canAccessInstantApps(callingUid)) {
- final String instantAppPackageName = getInstantAppPackageName(callingUid);
- if (instantAppPackageName != null) {
- // ephemeral apps can only get information on themselves or
- // installed apps that are exposed.
- if (!instantAppPackageName.equals(p.packageName)
- && (ps.getInstantApp(userId) || !p.visibleToInstantApps)) {
- return null;
- }
- } else {
- if (ps.getInstantApp(userId)) {
- // only get access to the ephemeral app if we've been granted access
- final int callingAppId = UserHandle.getAppId(callingUid);
- if (!mInstantAppRegistry.isInstantAccessGranted(
- userId, callingAppId, ps.appId)) {
- return null;
- }
- }
- }
+ if (filterAppAccessLPr(ps, callingUid, userId)) {
+ return null;
}
final PermissionsState permissionsState = ps.getPermissionsState();
@@ -3576,8 +3593,10 @@
@Override
public void checkPackageStartable(String packageName, int userId) {
+ if (getInstantAppPackageName(Binder.getCallingUid()) != null) {
+ throw new SecurityException("Instant applications don't have access to this method");
+ }
final boolean userKeyUnlocked = StorageManager.isUserKeyUnlocked(userId);
-
synchronized (mPackages) {
final PackageSetting ps = mSettings.mPackages.get(packageName);
if (ps == null) {
@@ -3607,12 +3626,16 @@
@Override
public boolean isPackageAvailable(String packageName, int userId) {
if (!sUserManager.exists(userId)) return false;
- enforceCrossUserPermission(Binder.getCallingUid(), userId,
- false /* requireFullPermission */, false /* checkShell */, "is package available");
+ final int callingUid = Binder.getCallingUid();
+ enforceCrossUserPermission(callingUid, userId,
+ false /*requireFullPermission*/, false /*checkShell*/, "is package available");
synchronized (mPackages) {
PackageParser.Package p = mPackages.get(packageName);
if (p != null) {
final PackageSetting ps = (PackageSetting) p.mExtras;
+ if (filterAppAccessLPr(ps, callingUid, userId)) {
+ return false;
+ }
if (ps != null) {
final PackageUserState state = ps.readUserState(userId);
if (state != null) {
@@ -3695,6 +3718,47 @@
return null;
}
+ private boolean isComponentVisibleToInstantApp(@Nullable ComponentName component) {
+ if (isComponentVisibleToInstantApp(component, TYPE_ACTIVITY)) {
+ return true;
+ }
+ if (isComponentVisibleToInstantApp(component, TYPE_SERVICE)) {
+ return true;
+ }
+ if (isComponentVisibleToInstantApp(component, TYPE_PROVIDER)) {
+ return true;
+ }
+ return false;
+ }
+
+ private boolean isComponentVisibleToInstantApp(
+ @Nullable ComponentName component, @ComponentType int type) {
+ if (type == TYPE_ACTIVITY) {
+ final PackageParser.Activity activity = mActivities.mActivities.get(component);
+ return activity != null
+ ? (activity.info.flags & ActivityInfo.FLAG_VISIBLE_TO_INSTANT_APP) != 0
+ : false;
+ } else if (type == TYPE_RECEIVER) {
+ final PackageParser.Activity activity = mReceivers.mActivities.get(component);
+ return activity != null
+ ? (activity.info.flags & ActivityInfo.FLAG_VISIBLE_TO_INSTANT_APP) != 0
+ : false;
+ } else if (type == TYPE_SERVICE) {
+ final PackageParser.Service service = mServices.mServices.get(component);
+ return service != null
+ ? (service.info.flags & ServiceInfo.FLAG_VISIBLE_TO_INSTANT_APP) != 0
+ : false;
+ } else if (type == TYPE_PROVIDER) {
+ final PackageParser.Provider provider = mProviders.mProviders.get(component);
+ return provider != null
+ ? (provider.info.flags & ProviderInfo.FLAG_VISIBLE_TO_INSTANT_APP) != 0
+ : false;
+ } else if (type == TYPE_UNKNOWN) {
+ return isComponentVisibleToInstantApp(component);
+ }
+ return false;
+ }
+
/**
* Returns whether or not access to the application should be filtered.
* <p>
@@ -3703,29 +3767,36 @@
*
* @see #canAccessInstantApps(int)
*/
- private boolean filterAppAccessLPr(@NonNull PackageSetting ps, int callingUid,
- @Nullable ComponentName component, boolean componentVisibleToInstantApp, int userId) {
+ private boolean filterAppAccessLPr(@Nullable PackageSetting ps, int callingUid,
+ @Nullable ComponentName component, @ComponentType int componentType, int userId) {
// if we're in an isolated process, get the real calling UID
if (Process.isIsolated(callingUid)) {
callingUid = mIsolatedOwners.get(callingUid);
}
+ final String instantAppPkgName = getInstantAppPackageName(callingUid);
+ final boolean callerIsInstantApp = instantAppPkgName != null;
+ if (ps == null) {
+ if (callerIsInstantApp) {
+ // pretend the application exists, but, needs to be filtered
+ return true;
+ }
+ return false;
+ }
// if the target and caller are the same application, don't filter
if (isCallerSameApp(ps.name, callingUid)) {
return false;
}
- final String instantAppPkgName = getInstantAppPackageName(callingUid);
- final boolean callerIsInstantApp = instantAppPkgName != null;
if (callerIsInstantApp) {
// request for a specific component; if it hasn't been explicitly exposed, filter
if (component != null) {
- return !componentVisibleToInstantApp;
+ return !isComponentVisibleToInstantApp(component, componentType);
}
// request for application; if no components have been explicitly exposed, filter
- return !ps.pkg.visibleToInstantApps;
+ return ps.getInstantApp(userId) || !ps.pkg.visibleToInstantApps;
}
if (ps.getInstantApp(userId)) {
// caller can see all components of all instant applications, don't filter
- if (canAccessInstantApps(callingUid)) {
+ if (canViewInstantApps(callingUid, userId)) {
return false;
}
// request for a specific instant application component, filter
@@ -3742,8 +3813,8 @@
/**
* @see #filterAppAccessLPr(PackageSetting, int, ComponentName, boolean, int)
*/
- private boolean filterAppAccessLPr(@NonNull PackageSetting ps, int callingUid, int userId) {
- return filterAppAccessLPr(ps, callingUid, null, false, userId);
+ private boolean filterAppAccessLPr(@Nullable PackageSetting ps, int callingUid, int userId) {
+ return filterAppAccessLPr(ps, callingUid, null, TYPE_UNKNOWN, userId);
}
private boolean filterSharedLibPackageLPr(@Nullable PackageSetting ps, int uid, int userId,
@@ -3797,6 +3868,9 @@
@Override
public String[] currentToCanonicalPackageNames(String[] names) {
+ if (getInstantAppPackageName(Binder.getCallingUid()) != null) {
+ return names;
+ }
String[] out = new String[names.length];
// reader
synchronized (mPackages) {
@@ -3810,6 +3884,9 @@
@Override
public String[] canonicalToCurrentPackageNames(String[] names) {
+ if (getInstantAppPackageName(Binder.getCallingUid()) != null) {
+ return names;
+ }
String[] out = new String[names.length];
// reader
synchronized (mPackages) {
@@ -3824,19 +3901,25 @@
@Override
public int getPackageUid(String packageName, int flags, int userId) {
if (!sUserManager.exists(userId)) return -1;
+ final int callingUid = Binder.getCallingUid();
flags = updateFlagsForPackage(flags, userId, packageName);
- enforceCrossUserPermission(Binder.getCallingUid(), userId,
- false /* requireFullPermission */, false /* checkShell */, "get package uid");
+ enforceCrossUserPermission(callingUid, userId,
+ false /*requireFullPermission*/, false /*checkShell*/, "getPackageUid");
// reader
synchronized (mPackages) {
final PackageParser.Package p = mPackages.get(packageName);
if (p != null && p.isMatch(flags)) {
+ PackageSetting ps = (PackageSetting) p.mExtras;
+ if (filterAppAccessLPr(ps, callingUid, userId)) {
+ return -1;
+ }
return UserHandle.getUid(userId, p.applicationInfo.uid);
}
if ((flags & MATCH_KNOWN_PACKAGES) != 0) {
final PackageSetting ps = mSettings.mPackages.get(packageName);
- if (ps != null && ps.isMatch(flags)) {
+ if (ps != null && ps.isMatch(flags)
+ && !filterAppAccessLPr(ps, callingUid, userId)) {
return UserHandle.getUid(userId, ps.appId);
}
}
@@ -3848,23 +3931,27 @@
@Override
public int[] getPackageGids(String packageName, int flags, int userId) {
if (!sUserManager.exists(userId)) return null;
+ final int callingUid = Binder.getCallingUid();
flags = updateFlagsForPackage(flags, userId, packageName);
- enforceCrossUserPermission(Binder.getCallingUid(), userId,
- false /* requireFullPermission */, false /* checkShell */,
- "getPackageGids");
+ enforceCrossUserPermission(callingUid, userId,
+ false /*requireFullPermission*/, false /*checkShell*/, "getPackageGids");
// reader
synchronized (mPackages) {
final PackageParser.Package p = mPackages.get(packageName);
if (p != null && p.isMatch(flags)) {
PackageSetting ps = (PackageSetting) p.mExtras;
+ if (filterAppAccessLPr(ps, callingUid, userId)) {
+ return null;
+ }
// TODO: Shouldn't this be checking for package installed state for userId and
// return null?
return ps.getPermissionsState().computeGids(userId);
}
if ((flags & MATCH_KNOWN_PACKAGES) != 0) {
final PackageSetting ps = mSettings.mPackages.get(packageName);
- if (ps != null && ps.isMatch(flags)) {
+ if (ps != null && ps.isMatch(flags)
+ && !filterAppAccessLPr(ps, callingUid, userId)) {
return ps.getPermissionsState().computeGids(userId);
}
}
@@ -3887,6 +3974,9 @@
@Override
public PermissionInfo getPermissionInfo(String name, int flags) {
+ if (getInstantAppPackageName(Binder.getCallingUid()) != null) {
+ return null;
+ }
// reader
synchronized (mPackages) {
final BasePermission p = mSettings.mPermissions.get(name);
@@ -3900,6 +3990,9 @@
@Override
public @Nullable ParceledListSlice<PermissionInfo> queryPermissionsByGroup(String group,
int flags) {
+ if (getInstantAppPackageName(Binder.getCallingUid()) != null) {
+ return null;
+ }
// reader
synchronized (mPackages) {
if (group != null && !mPermissionGroups.containsKey(group)) {
@@ -3925,6 +4018,9 @@
@Override
public PermissionGroupInfo getPermissionGroupInfo(String name, int flags) {
+ if (getInstantAppPackageName(Binder.getCallingUid()) != null) {
+ return null;
+ }
// reader
synchronized (mPackages) {
return PackageParser.generatePermissionGroupInfo(
@@ -3934,6 +4030,9 @@
@Override
public @NonNull ParceledListSlice<PermissionGroupInfo> getAllPermissionGroups(int flags) {
+ if (getInstantAppPackageName(Binder.getCallingUid()) != null) {
+ return ParceledListSlice.emptyList();
+ }
// reader
synchronized (mPackages) {
final int N = mPermissionGroups.size();
@@ -4059,13 +4158,13 @@
@Override
public void freeStorageAndNotify(final String volumeUuid, final long freeStorageSize,
- final IPackageDataObserver observer) {
+ final int storageFlags, final IPackageDataObserver observer) {
mContext.enforceCallingOrSelfPermission(
android.Manifest.permission.CLEAR_APP_CACHE, null);
mHandler.post(() -> {
boolean success = false;
try {
- freeStorage(volumeUuid, freeStorageSize, 0);
+ freeStorage(volumeUuid, freeStorageSize, storageFlags);
success = true;
} catch (IOException e) {
Slog.w(TAG, e);
@@ -4082,13 +4181,13 @@
@Override
public void freeStorage(final String volumeUuid, final long freeStorageSize,
- final IntentSender pi) {
+ final int storageFlags, final IntentSender pi) {
mContext.enforceCallingOrSelfPermission(
android.Manifest.permission.CLEAR_APP_CACHE, TAG);
mHandler.post(() -> {
boolean success = false;
try {
- freeStorage(volumeUuid, freeStorageSize, 0);
+ freeStorage(volumeUuid, freeStorageSize, storageFlags);
success = true;
} catch (IOException e) {
Slog.w(TAG, e);
@@ -4113,10 +4212,14 @@
if (file.getUsableSpace() >= bytes) return;
if (ENABLE_FREE_CACHE_V2) {
- final boolean aggressive = (storageFlags
- & StorageManager.FLAG_ALLOCATE_AGGRESSIVE) != 0;
final boolean internalVolume = Objects.equals(StorageManager.UUID_PRIVATE_INTERNAL,
volumeUuid);
+ final boolean aggressive = (storageFlags
+ & StorageManager.FLAG_ALLOCATE_AGGRESSIVE) != 0;
+ final boolean defyReserved = (storageFlags
+ & StorageManager.FLAG_ALLOCATE_DEFY_RESERVED) != 0;
+ final long reservedBytes = (aggressive || defyReserved) ? 0
+ : storage.getStorageCacheBytes(file);
// 1. Pre-flight to determine if we have any chance to succeed
// 2. Consider preloaded data (after 1w honeymoon, unless aggressive)
@@ -4134,29 +4237,52 @@
// 4. Consider cached app data (above quotas)
try {
- mInstaller.freeCache(volumeUuid, bytes, Installer.FLAG_FREE_CACHE_V2);
+ mInstaller.freeCache(volumeUuid, bytes, reservedBytes,
+ Installer.FLAG_FREE_CACHE_V2);
} catch (InstallerException ignored) {
}
if (file.getUsableSpace() >= bytes) return;
- // 5. Consider shared libraries with refcount=0 and age>2h
+ // 5. Consider shared libraries with refcount=0 and age>min cache period
+ if (internalVolume && pruneUnusedStaticSharedLibraries(bytes,
+ android.provider.Settings.Global.getLong(mContext.getContentResolver(),
+ Global.UNUSED_STATIC_SHARED_LIB_MIN_CACHE_PERIOD,
+ DEFAULT_UNUSED_STATIC_SHARED_LIB_MIN_CACHE_PERIOD))) {
+ return;
+ }
+
// 6. Consider dexopt output (aggressive only)
- // 7. Consider ephemeral apps not used in last week
+ // TODO: Implement
+
+ // 7. Consider installed instant apps unused longer than min cache period
+ if (internalVolume && mInstantAppRegistry.pruneInstalledInstantApps(bytes,
+ android.provider.Settings.Global.getLong(mContext.getContentResolver(),
+ Global.INSTALLED_INSTANT_APP_MIN_CACHE_PERIOD,
+ InstantAppRegistry.DEFAULT_INSTALLED_INSTANT_APP_MIN_CACHE_PERIOD))) {
+ return;
+ }
// 8. Consider cached app data (below quotas)
try {
- mInstaller.freeCache(volumeUuid, bytes, Installer.FLAG_FREE_CACHE_V2
- | Installer.FLAG_FREE_CACHE_V2_DEFY_QUOTA);
+ mInstaller.freeCache(volumeUuid, bytes, reservedBytes,
+ Installer.FLAG_FREE_CACHE_V2 | Installer.FLAG_FREE_CACHE_V2_DEFY_QUOTA);
} catch (InstallerException ignored) {
}
if (file.getUsableSpace() >= bytes) return;
// 9. Consider DropBox entries
- // 10. Consider ephemeral cookies
+ // TODO: Implement
+ // 10. Consider instant meta-data (uninstalled apps) older that min cache period
+ if (internalVolume && mInstantAppRegistry.pruneUninstalledInstantApps(bytes,
+ android.provider.Settings.Global.getLong(mContext.getContentResolver(),
+ Global.UNINSTALLED_INSTANT_APP_MIN_CACHE_PERIOD,
+ InstantAppRegistry.DEFAULT_UNINSTALLED_INSTANT_APP_MIN_CACHE_PERIOD))) {
+ return;
+ }
} else {
try {
- mInstaller.freeCache(volumeUuid, bytes, 0);
+ mInstaller.freeCache(volumeUuid, bytes, 0, 0);
} catch (InstallerException ignored) {
}
if (file.getUsableSpace() >= bytes) return;
@@ -4165,6 +4291,69 @@
throw new IOException("Failed to free " + bytes + " on storage device at " + file);
}
+ private boolean pruneUnusedStaticSharedLibraries(long neededSpace, long maxCachePeriod)
+ throws IOException {
+ final StorageManager storage = mContext.getSystemService(StorageManager.class);
+ final File volume = storage.findPathForUuid(StorageManager.UUID_PRIVATE_INTERNAL);
+
+ List<VersionedPackage> packagesToDelete = null;
+ final long now = System.currentTimeMillis();
+
+ synchronized (mPackages) {
+ final int[] allUsers = sUserManager.getUserIds();
+ final int libCount = mSharedLibraries.size();
+ for (int i = 0; i < libCount; i++) {
+ final SparseArray<SharedLibraryEntry> versionedLib = mSharedLibraries.valueAt(i);
+ if (versionedLib == null) {
+ continue;
+ }
+ final int versionCount = versionedLib.size();
+ for (int j = 0; j < versionCount; j++) {
+ SharedLibraryInfo libInfo = versionedLib.valueAt(j).info;
+ // Skip packages that are not static shared libs.
+ if (!libInfo.isStatic()) {
+ break;
+ }
+ // Important: We skip static shared libs used for some user since
+ // in such a case we need to keep the APK on the device. The check for
+ // a lib being used for any user is performed by the uninstall call.
+ final VersionedPackage declaringPackage = libInfo.getDeclaringPackage();
+ // Resolve the package name - we use synthetic package names internally
+ final String internalPackageName = resolveInternalPackageNameLPr(
+ declaringPackage.getPackageName(), declaringPackage.getVersionCode());
+ final PackageSetting ps = mSettings.getPackageLPr(internalPackageName);
+ // Skip unused static shared libs cached less than the min period
+ // to prevent pruning a lib needed by a subsequently installed package.
+ if (ps == null || now - ps.lastUpdateTime < maxCachePeriod) {
+ continue;
+ }
+ if (packagesToDelete == null) {
+ packagesToDelete = new ArrayList<>();
+ }
+ packagesToDelete.add(new VersionedPackage(internalPackageName,
+ declaringPackage.getVersionCode()));
+ }
+ }
+ }
+
+ if (packagesToDelete != null) {
+ final int packageCount = packagesToDelete.size();
+ for (int i = 0; i < packageCount; i++) {
+ final VersionedPackage pkgToDelete = packagesToDelete.get(i);
+ // Delete the package synchronously (will fail of the lib used for any user).
+ if (deletePackageX(pkgToDelete.getPackageName(), pkgToDelete.getVersionCode(),
+ UserHandle.USER_SYSTEM, PackageManager.DELETE_ALL_USERS)
+ == PackageManager.DELETE_SUCCEEDED) {
+ if (volume.getUsableSpace() >= neededSpace) {
+ return true;
+ }
+ }
+ }
+ }
+
+ return false;
+ }
+
/**
* Update given flags based on encryption status of current user.
*/
@@ -4321,11 +4510,12 @@
flags |= PackageManager.MATCH_VISIBLE_TO_INSTANT_APP_ONLY;
flags |= PackageManager.MATCH_INSTANT;
} else {
+ final boolean wantMatchInstant = (flags & PackageManager.MATCH_INSTANT) != 0;
final boolean allowMatchInstant =
(wantInstantApps
&& Intent.ACTION_VIEW.equals(intent.getAction())
&& hasWebURI(intent))
- || canAccessInstantApps(callingUid);
+ || (wantMatchInstant && canViewInstantApps(callingUid, userId));
flags &= ~(PackageManager.MATCH_VISIBLE_TO_INSTANT_APP_ONLY
| PackageManager.MATCH_EXPLICITLY_VISIBLE_ONLY);
if (!allowMatchInstant) {
@@ -4367,9 +4557,7 @@
if (a != null && mSettings.isEnabledAndMatchLPr(a.info, flags, userId)) {
PackageSetting ps = mSettings.mPackages.get(component.getPackageName());
if (ps == null) return null;
- final boolean visibleToInstantApp =
- (a.info.flags & ActivityInfo.FLAG_VISIBLE_TO_INSTANT_APP) != 0;
- if (filterAppAccessLPr(ps, callingUid, component, visibleToInstantApp, userId)) {
+ if (filterAppAccessLPr(ps, callingUid, component, TYPE_ACTIVITY, userId)) {
return null;
}
return generateActivityInfo(a, flags, ps.readUserState(userId), userId);
@@ -4390,10 +4578,19 @@
// The resolver supports EVERYTHING!
return true;
}
+ final int callingUid = Binder.getCallingUid();
+ final int callingUserId = UserHandle.getUserId(callingUid);
PackageParser.Activity a = mActivities.mActivities.get(component);
if (a == null) {
return false;
}
+ PackageSetting ps = mSettings.mPackages.get(component.getPackageName());
+ if (ps == null) {
+ return false;
+ }
+ if (filterAppAccessLPr(ps, callingUid, component, TYPE_ACTIVITY, callingUserId)) {
+ return false;
+ }
for (int i=0; i<a.intents.size(); i++) {
if (a.intents.get(i).match(intent.getAction(), resolvedType, intent.getScheme(),
intent.getData(), intent.getCategories(), TAG) >= 0) {
@@ -4407,8 +4604,9 @@
@Override
public ActivityInfo getReceiverInfo(ComponentName component, int flags, int userId) {
if (!sUserManager.exists(userId)) return null;
+ final int callingUid = Binder.getCallingUid();
flags = updateFlagsForComponent(flags, userId, component);
- enforceCrossUserPermission(Binder.getCallingUid(), userId,
+ enforceCrossUserPermission(callingUid, userId,
false /* requireFullPermission */, false /* checkShell */, "get receiver info");
synchronized (mPackages) {
PackageParser.Activity a = mReceivers.mActivities.get(component);
@@ -4417,6 +4615,9 @@
if (a != null && mSettings.isEnabledAndMatchLPr(a.info, flags, userId)) {
PackageSetting ps = mSettings.mPackages.get(component.getPackageName());
if (ps == null) return null;
+ if (filterAppAccessLPr(ps, callingUid, component, TYPE_RECEIVER, userId)) {
+ return null;
+ }
return generateActivityInfo(a, flags, ps.readUserState(userId), userId);
}
}
@@ -4428,6 +4629,9 @@
int flags, int userId) {
if (!sUserManager.exists(userId)) return null;
Preconditions.checkArgumentNonnegative(userId, "userId must be >= 0");
+ if (getInstantAppPackageName(Binder.getCallingUid()) != null) {
+ return null;
+ }
flags = updateFlagsForPackage(flags, userId, null);
@@ -4547,9 +4751,7 @@
if (s != null && mSettings.isEnabledAndMatchLPr(s.info, flags, userId)) {
PackageSetting ps = mSettings.mPackages.get(component.getPackageName());
if (ps == null) return null;
- final boolean visibleToInstantApp =
- (s.info.flags & ServiceInfo.FLAG_VISIBLE_TO_INSTANT_APP) != 0;
- if (filterAppAccessLPr(ps, callingUid, component, visibleToInstantApp, userId)) {
+ if (filterAppAccessLPr(ps, callingUid, component, TYPE_SERVICE, userId)) {
return null;
}
ServiceInfo si = PackageParser.generateServiceInfo(s, flags,
@@ -4577,9 +4779,7 @@
if (p != null && mSettings.isEnabledAndMatchLPr(p.info, flags, userId)) {
PackageSetting ps = mSettings.mPackages.get(component.getPackageName());
if (ps == null) return null;
- final boolean visibleToInstantApp =
- (p.info.flags & ProviderInfo.FLAG_VISIBLE_TO_INSTANT_APP) != 0;
- if (filterAppAccessLPr(ps, callingUid, component, visibleToInstantApp, userId)) {
+ if (filterAppAccessLPr(ps, callingUid, component, TYPE_PROVIDER, userId)) {
return null;
}
ProviderInfo pi = PackageParser.generateProviderInfo(p, flags,
@@ -4595,6 +4795,7 @@
@Override
public String[] getSystemSharedLibraryNames() {
+ // allow instant applications
synchronized (mPackages) {
Set<String> libs = null;
final int libCount = mSharedLibraries.size();
@@ -4638,6 +4839,7 @@
@Override
public @NonNull String getServicesSystemSharedLibraryPackageName() {
+ // allow instant applications
synchronized (mPackages) {
return mServicesSystemSharedLibraryPackageName;
}
@@ -4645,6 +4847,7 @@
@Override
public @NonNull String getSharedSystemSharedLibraryPackageName() {
+ // allow instant applications
synchronized (mPackages) {
return mSharedSystemSharedLibraryPackageName;
}
@@ -4675,6 +4878,9 @@
@Override
public ChangedPackages getChangedPackages(int sequenceNumber, int userId) {
+ if (getInstantAppPackageName(Binder.getCallingUid()) != null) {
+ return null;
+ }
synchronized (mPackages) {
if (sequenceNumber >= mChangedPackagesSequenceNumber) {
return null;
@@ -4698,6 +4904,7 @@
@Override
public @NonNull ParceledListSlice<FeatureInfo> getSystemAvailableFeatures() {
+ // allow instant applications
ArrayList<FeatureInfo> res;
synchronized (mAvailableFeatures) {
res = new ArrayList<>(mAvailableFeatures.size() + 1);
@@ -4713,6 +4920,7 @@
@Override
public boolean hasSystemFeature(String name, int version) {
+ // allow instant applications
synchronized (mAvailableFeatures) {
final FeatureInfo feat = mAvailableFeatures.get(name);
if (feat == null) {
@@ -4728,14 +4936,26 @@
if (!sUserManager.exists(userId)) {
return PackageManager.PERMISSION_DENIED;
}
+ final int callingUid = Binder.getCallingUid();
synchronized (mPackages) {
final PackageParser.Package p = mPackages.get(pkgName);
if (p != null && p.mExtras != null) {
final PackageSetting ps = (PackageSetting) p.mExtras;
+ if (filterAppAccessLPr(ps, callingUid, userId)) {
+ return PackageManager.PERMISSION_DENIED;
+ }
+ final boolean instantApp = ps.getInstantApp(userId);
final PermissionsState permissionsState = ps.getPermissionsState();
if (permissionsState.hasPermission(permName, userId)) {
- return PackageManager.PERMISSION_GRANTED;
+ if (instantApp) {
+ BasePermission bp = mSettings.mPermissions.get(permName);
+ if (bp != null && bp.isInstant()) {
+ return PackageManager.PERMISSION_GRANTED;
+ }
+ } else {
+ return PackageManager.PERMISSION_GRANTED;
+ }
}
// Special case: ACCESS_FINE_LOCATION permission includes ACCESS_COARSE_LOCATION
if (Manifest.permission.ACCESS_COARSE_LOCATION.equals(permName) && permissionsState
@@ -4750,8 +4970,11 @@
@Override
public int checkUidPermission(String permName, int uid) {
+ final int callingUid = Binder.getCallingUid();
+ final int callingUserId = UserHandle.getUserId(callingUid);
+ final boolean isCallerInstantApp = getInstantAppPackageName(callingUid) != null;
+ final boolean isUidInstantApp = getInstantAppPackageName(uid) != null;
final int userId = UserHandle.getUserId(uid);
-
if (!sUserManager.exists(userId)) {
return PackageManager.PERMISSION_DENIED;
}
@@ -4759,10 +4982,27 @@
synchronized (mPackages) {
Object obj = mSettings.getUserIdLPr(UserHandle.getAppId(uid));
if (obj != null) {
- final SettingBase ps = (SettingBase) obj;
- final PermissionsState permissionsState = ps.getPermissionsState();
+ if (obj instanceof SharedUserSetting) {
+ if (isCallerInstantApp) {
+ return PackageManager.PERMISSION_DENIED;
+ }
+ } else if (obj instanceof PackageSetting) {
+ final PackageSetting ps = (PackageSetting) obj;
+ if (filterAppAccessLPr(ps, callingUid, callingUserId)) {
+ return PackageManager.PERMISSION_DENIED;
+ }
+ }
+ final SettingBase settingBase = (SettingBase) obj;
+ final PermissionsState permissionsState = settingBase.getPermissionsState();
if (permissionsState.hasPermission(permName, userId)) {
- return PackageManager.PERMISSION_GRANTED;
+ if (isUidInstantApp) {
+ BasePermission bp = mSettings.mPermissions.get(permName);
+ if (bp != null && bp.isInstant()) {
+ return PackageManager.PERMISSION_GRANTED;
+ }
+ } else {
+ return PackageManager.PERMISSION_GRANTED;
+ }
}
// Special case: ACCESS_FINE_LOCATION permission includes ACCESS_COARSE_LOCATION
if (Manifest.permission.ACCESS_COARSE_LOCATION.equals(permName) && permissionsState
@@ -4799,6 +5039,17 @@
return false;
}
+ final int callingUid = Binder.getCallingUid();
+ if (getInstantAppPackageName(callingUid) != null) {
+ if (!isCallerSameApp(packageName, callingUid)) {
+ return false;
+ }
+ } else {
+ if (isInstantApp(packageName, userId)) {
+ return false;
+ }
+ }
+
final long identity = Binder.clearCallingIdentity();
try {
final int flags = getPermissionFlags(permission, packageName, userId);
@@ -4810,6 +5061,9 @@
@Override
public String getPermissionControllerPackageName() {
+ if (getInstantAppPackageName(Binder.getCallingUid()) != null) {
+ throw new SecurityException("Instant applications don't have access to this method");
+ }
synchronized (mPackages) {
return mRequiredInstallerPackage;
}
@@ -4944,6 +5198,9 @@
}
boolean addPermissionLocked(PermissionInfo info, boolean async) {
+ if (getInstantAppPackageName(Binder.getCallingUid()) != null) {
+ throw new SecurityException("Instant apps can't add permissions");
+ }
if (info.labelRes == 0 && info.nonLocalizedLabel == null) {
throw new SecurityException("Label must be specified in permission");
}
@@ -5003,6 +5260,9 @@
@Override
public void removePermission(String name) {
+ if (getInstantAppPackageName(Binder.getCallingUid()) != null) {
+ throw new SecurityException("Instant applications don't have access to this method");
+ }
synchronized (mPackages) {
checkPermissionTreeLP(name);
BasePermission bp = mSettings.mPermissions.get(name);
@@ -5018,8 +5278,8 @@
}
}
- private static void enforceDeclaredAsUsedAndRuntimeOrDevelopmentPermission(PackageParser.Package pkg,
- BasePermission bp) {
+ private static void enforceDeclaredAsUsedAndRuntimeOrDevelopmentPermission(
+ PackageParser.Package pkg, BasePermission bp) {
int index = pkg.requestedPermissions.indexOf(bp.name);
if (index == -1) {
throw new SecurityException("Package " + pkg.packageName
@@ -5536,6 +5796,9 @@
@Override
public void removeOnPermissionsChangeListener(IOnPermissionsChangeListener listener) {
+ if (getInstantAppPackageName(Binder.getCallingUid()) != null) {
+ throw new SecurityException("Instant applications don't have access to this method");
+ }
synchronized (mPackages) {
mOnPermissionChangeListeners.removeListenerLocked(listener);
}
@@ -5543,6 +5806,7 @@
@Override
public boolean isProtectedBroadcast(String actionName) {
+ // allow instant applications
synchronized (mPackages) {
if (mProtectedBroadcasts.contains(actionName)) {
return true;
@@ -5568,12 +5832,23 @@
|| p2 == null || p2.mExtras == null) {
return PackageManager.SIGNATURE_UNKNOWN_PACKAGE;
}
+ final int callingUid = Binder.getCallingUid();
+ final int callingUserId = UserHandle.getUserId(callingUid);
+ final PackageSetting ps1 = (PackageSetting) p1.mExtras;
+ final PackageSetting ps2 = (PackageSetting) p2.mExtras;
+ if (filterAppAccessLPr(ps1, callingUid, callingUserId)
+ || filterAppAccessLPr(ps2, callingUid, callingUserId)) {
+ return PackageManager.SIGNATURE_UNKNOWN_PACKAGE;
+ }
return compareSignatures(p1.mSignatures, p2.mSignatures);
}
}
@Override
public int checkUidSignatures(int uid1, int uid2) {
+ final int callingUid = Binder.getCallingUid();
+ final int callingUserId = UserHandle.getUserId(callingUid);
+ final boolean isCallerInstantApp = getInstantAppPackageName(callingUid) != null;
// Map to base uids.
uid1 = UserHandle.getAppId(uid1);
uid2 = UserHandle.getAppId(uid2);
@@ -5584,9 +5859,16 @@
Object obj = mSettings.getUserIdLPr(uid1);
if (obj != null) {
if (obj instanceof SharedUserSetting) {
+ if (isCallerInstantApp) {
+ return PackageManager.SIGNATURE_UNKNOWN_PACKAGE;
+ }
s1 = ((SharedUserSetting)obj).signatures.mSignatures;
} else if (obj instanceof PackageSetting) {
- s1 = ((PackageSetting)obj).signatures.mSignatures;
+ final PackageSetting ps = (PackageSetting) obj;
+ if (filterAppAccessLPr(ps, callingUid, callingUserId)) {
+ return PackageManager.SIGNATURE_UNKNOWN_PACKAGE;
+ }
+ s1 = ps.signatures.mSignatures;
} else {
return PackageManager.SIGNATURE_UNKNOWN_PACKAGE;
}
@@ -5596,9 +5878,16 @@
obj = mSettings.getUserIdLPr(uid2);
if (obj != null) {
if (obj instanceof SharedUserSetting) {
+ if (isCallerInstantApp) {
+ return PackageManager.SIGNATURE_UNKNOWN_PACKAGE;
+ }
s2 = ((SharedUserSetting)obj).signatures.mSignatures;
} else if (obj instanceof PackageSetting) {
- s2 = ((PackageSetting)obj).signatures.mSignatures;
+ final PackageSetting ps = (PackageSetting) obj;
+ if (filterAppAccessLPr(ps, callingUid, callingUserId)) {
+ return PackageManager.SIGNATURE_UNKNOWN_PACKAGE;
+ }
+ s2 = ps.signatures.mSignatures;
} else {
return PackageManager.SIGNATURE_UNKNOWN_PACKAGE;
}
@@ -5764,19 +6053,53 @@
@Override
public List<String> getAllPackages() {
+ final int callingUid = Binder.getCallingUid();
+ final int callingUserId = UserHandle.getUserId(callingUid);
synchronized (mPackages) {
- return new ArrayList<String>(mPackages.keySet());
+ if (canViewInstantApps(callingUid, callingUserId)) {
+ return new ArrayList<String>(mPackages.keySet());
+ }
+ final String instantAppPkgName = getInstantAppPackageName(callingUid);
+ final List<String> result = new ArrayList<>();
+ if (instantAppPkgName != null) {
+ // caller is an instant application; filter unexposed applications
+ for (PackageParser.Package pkg : mPackages.values()) {
+ if (!pkg.visibleToInstantApps) {
+ continue;
+ }
+ result.add(pkg.packageName);
+ }
+ } else {
+ // caller is a normal application; filter instant applications
+ for (PackageParser.Package pkg : mPackages.values()) {
+ final PackageSetting ps =
+ pkg.mExtras != null ? (PackageSetting) pkg.mExtras : null;
+ if (ps != null
+ && ps.getInstantApp(callingUserId)
+ && !mInstantAppRegistry.isInstantAccessGranted(
+ callingUserId, UserHandle.getAppId(callingUid), ps.appId)) {
+ continue;
+ }
+ result.add(pkg.packageName);
+ }
+ }
+ return result;
}
}
@Override
public String[] getPackagesForUid(int uid) {
+ final int callingUid = Binder.getCallingUid();
+ final boolean isCallerInstantApp = getInstantAppPackageName(callingUid) != null;
final int userId = UserHandle.getUserId(uid);
uid = UserHandle.getAppId(uid);
// reader
synchronized (mPackages) {
Object obj = mSettings.getUserIdLPr(uid);
if (obj instanceof SharedUserSetting) {
+ if (isCallerInstantApp) {
+ return null;
+ }
final SharedUserSetting sus = (SharedUserSetting) obj;
final int N = sus.packages.size();
String[] res = new String[N];
@@ -5793,7 +6116,7 @@
return res;
} else if (obj instanceof PackageSetting) {
final PackageSetting ps = (PackageSetting) obj;
- if (ps.getInstalled(userId)) {
+ if (ps.getInstalled(userId) && !filterAppAccessLPr(ps, callingUid, userId)) {
return new String[]{ps.name};
}
}
@@ -5803,7 +6126,10 @@
@Override
public String getNameForUid(int uid) {
- // reader
+ final int callingUid = Binder.getCallingUid();
+ if (getInstantAppPackageName(callingUid) != null) {
+ return null;
+ }
synchronized (mPackages) {
Object obj = mSettings.getUserIdLPr(UserHandle.getAppId(uid));
if (obj instanceof SharedUserSetting) {
@@ -5811,6 +6137,9 @@
return sus.name + ":" + sus.userId;
} else if (obj instanceof PackageSetting) {
final PackageSetting ps = (PackageSetting) obj;
+ if (filterAppAccessLPr(ps, callingUid, UserHandle.getUserId(callingUid))) {
+ return null;
+ }
return ps.name;
}
}
@@ -5819,7 +6148,10 @@
@Override
public int getUidForSharedUser(String sharedUserName) {
- if(sharedUserName == null) {
+ if (getInstantAppPackageName(Binder.getCallingUid()) != null) {
+ return -1;
+ }
+ if (sharedUserName == null) {
return -1;
}
// reader
@@ -5839,6 +6171,9 @@
@Override
public int getFlagsForUid(int uid) {
+ if (getInstantAppPackageName(Binder.getCallingUid()) != null) {
+ return 0;
+ }
synchronized (mPackages) {
Object obj = mSettings.getUserIdLPr(UserHandle.getAppId(uid));
if (obj instanceof SharedUserSetting) {
@@ -5854,6 +6189,9 @@
@Override
public int getPrivateFlagsForUid(int uid) {
+ if (getInstantAppPackageName(Binder.getCallingUid()) != null) {
+ return 0;
+ }
synchronized (mPackages) {
Object obj = mSettings.getUserIdLPr(UserHandle.getAppId(uid));
if (obj instanceof SharedUserSetting) {
@@ -5869,6 +6207,9 @@
@Override
public boolean isUidPrivileged(int uid) {
+ if (getInstantAppPackageName(Binder.getCallingUid()) != null) {
+ return false;
+ }
uid = UserHandle.getAppId(uid);
// reader
synchronized (mPackages) {
@@ -5891,6 +6232,9 @@
@Override
public String[] getAppOpPermissionPackages(String permissionName) {
+ if (getInstantAppPackageName(Binder.getCallingUid()) != null) {
+ return null;
+ }
synchronized (mPackages) {
ArraySet<String> pkgs = mAppOpPermissionPackages.get(permissionName);
if (pkgs == null) {
@@ -5956,6 +6300,9 @@
@Override
public void setLastChosenActivity(Intent intent, String resolvedType, int flags,
IntentFilter filter, int match, ComponentName activity) {
+ if (getInstantAppPackageName(Binder.getCallingUid()) != null) {
+ return;
+ }
final int userId = UserHandle.getCallingUserId();
if (DEBUG_PREFERRED) {
Log.v(TAG, "setLastChosenActivity intent=" + intent
@@ -5979,6 +6326,9 @@
@Override
public ResolveInfo getLastChosenActivity(Intent intent, String resolvedType, int flags) {
+ if (getInstantAppPackageName(Binder.getCallingUid()) != null) {
+ return null;
+ }
final int userId = UserHandle.getCallingUserId();
if (DEBUG_PREFERRED) Log.v(TAG, "Querying last chosen activity for " + intent);
final List<ResolveInfo> query = queryIntentActivitiesInternal(intent, resolvedType, flags,
@@ -6440,12 +6790,12 @@
* instant, returns {@code null}.
*/
private String getInstantAppPackageName(int callingUid) {
- // If the caller is an isolated app use the owner's uid for the lookup.
- if (Process.isIsolated(callingUid)) {
- callingUid = mIsolatedOwners.get(callingUid);
- }
- final int appId = UserHandle.getAppId(callingUid);
synchronized (mPackages) {
+ // If the caller is an isolated app use the owner's uid for the lookup.
+ if (Process.isIsolated(callingUid)) {
+ callingUid = mIsolatedOwners.get(callingUid);
+ }
+ final int appId = UserHandle.getAppId(callingUid);
final Object obj = mSettings.getUserIdLPr(appId);
if (obj instanceof PackageSetting) {
final PackageSetting ps = (PackageSetting) obj;
@@ -7360,6 +7710,7 @@
String resolvedType, int flags, int userId) {
if (!sUserManager.exists(userId)) return Collections.emptyList();
final int callingUid = Binder.getCallingUid();
+ final String instantAppPkgName = getInstantAppPackageName(callingUid);
flags = updateFlagsForResolve(flags, userId, intent, callingUid,
false /*includeInstantApps*/);
ComponentName comp = intent.getComponent();
@@ -7370,26 +7721,61 @@
}
}
if (comp != null) {
- List<ResolveInfo> list = new ArrayList<ResolveInfo>(1);
- ActivityInfo ai = getReceiverInfo(comp, flags, userId);
+ final List<ResolveInfo> list = new ArrayList<ResolveInfo>(1);
+ final ActivityInfo ai = getReceiverInfo(comp, flags, userId);
if (ai != null) {
- ResolveInfo ri = new ResolveInfo();
- ri.activityInfo = ai;
- list.add(ri);
+ // When specifying an explicit component, we prevent the activity from being
+ // used when either 1) the calling package is normal and the activity is within
+ // an instant application or 2) the calling package is ephemeral and the
+ // activity is not visible to instant applications.
+ final boolean matchInstantApp =
+ (flags & PackageManager.MATCH_INSTANT) != 0;
+ final boolean matchVisibleToInstantAppOnly =
+ (flags & PackageManager.MATCH_VISIBLE_TO_INSTANT_APP_ONLY) != 0;
+ final boolean matchExplicitlyVisibleOnly =
+ (flags & PackageManager.MATCH_EXPLICITLY_VISIBLE_ONLY) != 0;
+ final boolean isCallerInstantApp =
+ instantAppPkgName != null;
+ final boolean isTargetSameInstantApp =
+ comp.getPackageName().equals(instantAppPkgName);
+ final boolean isTargetInstantApp =
+ (ai.applicationInfo.privateFlags
+ & ApplicationInfo.PRIVATE_FLAG_INSTANT) != 0;
+ final boolean isTargetVisibleToInstantApp =
+ (ai.flags & ActivityInfo.FLAG_VISIBLE_TO_INSTANT_APP) != 0;
+ final boolean isTargetExplicitlyVisibleToInstantApp =
+ isTargetVisibleToInstantApp
+ && (ai.flags & ActivityInfo.FLAG_IMPLICITLY_VISIBLE_TO_INSTANT_APP) == 0;
+ final boolean isTargetHiddenFromInstantApp =
+ !isTargetVisibleToInstantApp
+ || (matchExplicitlyVisibleOnly && !isTargetExplicitlyVisibleToInstantApp);
+ final boolean blockResolution =
+ !isTargetSameInstantApp
+ && ((!matchInstantApp && !isCallerInstantApp && isTargetInstantApp)
+ || (matchVisibleToInstantAppOnly && isCallerInstantApp
+ && isTargetHiddenFromInstantApp));
+ if (!blockResolution) {
+ ResolveInfo ri = new ResolveInfo();
+ ri.activityInfo = ai;
+ list.add(ri);
+ }
}
- return list;
+ return applyPostResolutionFilter(list, instantAppPkgName);
}
// reader
synchronized (mPackages) {
String pkgName = intent.getPackage();
if (pkgName == null) {
- return mReceivers.queryIntent(intent, resolvedType, flags, userId);
+ final List<ResolveInfo> result =
+ mReceivers.queryIntent(intent, resolvedType, flags, userId);
+ return applyPostResolutionFilter(result, instantAppPkgName);
}
final PackageParser.Package pkg = mPackages.get(pkgName);
if (pkg != null) {
- return mReceivers.queryIntentForPackage(intent, resolvedType, flags, pkg.receivers,
- userId);
+ final List<ResolveInfo> result = mReceivers.queryIntentForPackage(
+ intent, resolvedType, flags, pkg.receivers, userId);
+ return applyPostResolutionFilter(result, instantAppPkgName);
}
return Collections.emptyList();
}
@@ -7662,6 +8048,9 @@
@Override
public ParceledListSlice<PackageInfo> getInstalledPackages(int flags, int userId) {
+ if (getInstantAppPackageName(Binder.getCallingUid()) != null) {
+ return ParceledListSlice.emptyList();
+ }
if (!sUserManager.exists(userId)) return ParceledListSlice.emptyList();
flags = updateFlagsForPackage(flags, userId, null);
final boolean listUninstalled = (flags & MATCH_KNOWN_PACKAGES) != 0;
@@ -7776,6 +8165,9 @@
@Override
public ParceledListSlice<ApplicationInfo> getInstalledApplications(int flags, int userId) {
+ if (getInstantAppPackageName(Binder.getCallingUid()) != null) {
+ return ParceledListSlice.emptyList();
+ }
if (!sUserManager.exists(userId)) return ParceledListSlice.emptyList();
flags = updateFlagsForApplication(flags, userId, null);
final boolean listUninstalled = (flags & MATCH_KNOWN_PACKAGES) != 0;
@@ -7839,7 +8231,6 @@
if (HIDE_EPHEMERAL_APIS || isEphemeralDisabled()) {
return null;
}
-
mContext.enforceCallingOrSelfPermission(Manifest.permission.ACCESS_INSTANT_APPS,
"getEphemeralApplications");
enforceCrossUserPermission(Binder.getCallingUid(), userId,
@@ -7863,9 +8254,9 @@
if (HIDE_EPHEMERAL_APIS || isEphemeralDisabled()) {
return false;
}
- int uid = Binder.getCallingUid();
- if (Process.isIsolated(uid)) {
- uid = mIsolatedOwners.get(uid);
+ int callingUid = Binder.getCallingUid();
+ if (Process.isIsolated(callingUid)) {
+ callingUid = mIsolatedOwners.get(callingUid);
}
synchronized (mPackages) {
@@ -7873,12 +8264,10 @@
PackageParser.Package pkg = mPackages.get(packageName);
final boolean returnAllowed =
ps != null
- && (isCallerSameApp(packageName, uid)
- || mContext.checkCallingOrSelfPermission(
- android.Manifest.permission.ACCESS_INSTANT_APPS)
- == PERMISSION_GRANTED
+ && (isCallerSameApp(packageName, callingUid)
+ || canViewInstantApps(callingUid, userId)
|| mInstantAppRegistry.isInstantAccessGranted(
- userId, UserHandle.getAppId(uid), ps.appId));
+ userId, UserHandle.getAppId(callingUid), ps.appId));
if (returnAllowed) {
return ps.getInstantApp(userId);
}
@@ -7949,6 +8338,9 @@
@Override
public @NonNull ParceledListSlice<ApplicationInfo> getPersistentApplications(int flags) {
+ if (getInstantAppPackageName(Binder.getCallingUid()) != null) {
+ return ParceledListSlice.emptyList();
+ }
return new ParceledListSlice<>(getPersistentApplicationsInternal(flags));
}
@@ -8032,6 +8424,9 @@
*/
@Deprecated
public void querySyncProviders(List<String> outNames, List<ProviderInfo> outInfo) {
+ if (getInstantAppPackageName(Binder.getCallingUid()) != null) {
+ return;
+ }
// reader
synchronized (mPackages) {
final Iterator<Map.Entry<String, PackageParser.Provider>> i = mProvidersByAuthority
@@ -8059,11 +8454,11 @@
@Override
public @NonNull ParceledListSlice<ProviderInfo> queryContentProviders(String processName,
int uid, int flags, String metaDataKey) {
+ final int callingUid = Binder.getCallingUid();
final int userId = processName != null ? UserHandle.getUserId(uid)
: UserHandle.getCallingUserId();
if (!sUserManager.exists(userId)) return ParceledListSlice.emptyList();
flags = updateFlagsForComponent(flags, userId, processName);
-
ArrayList<ProviderInfo> finalList = null;
// reader
synchronized (mPackages) {
@@ -8083,7 +8478,11 @@
&& (p.metaData == null || !p.metaData.containsKey(metaDataKey))) {
continue;
}
-
+ final ComponentName component =
+ new ComponentName(p.info.packageName, p.info.name);
+ if (filterAppAccessLPr(ps, callingUid, component, TYPE_PROVIDER, userId)) {
+ continue;
+ }
if (finalList == null) {
finalList = new ArrayList<ProviderInfo>(3);
}
@@ -8105,10 +8504,17 @@
}
@Override
- public InstrumentationInfo getInstrumentationInfo(ComponentName name, int flags) {
+ public InstrumentationInfo getInstrumentationInfo(ComponentName component, int flags) {
// reader
synchronized (mPackages) {
- final PackageParser.Instrumentation i = mInstrumentation.get(name);
+ final int callingUid = Binder.getCallingUid();
+ final int callingUserId = UserHandle.getUserId(callingUid);
+ final PackageSetting ps = mSettings.mPackages.get(component.getPackageName());
+ if (ps == null) return null;
+ if (filterAppAccessLPr(ps, callingUid, component, TYPE_UNKNOWN, callingUserId)) {
+ return null;
+ }
+ final PackageParser.Instrumentation i = mInstrumentation.get(component);
return PackageParser.generateInstrumentationInfo(i, flags);
}
}
@@ -8116,6 +8522,12 @@
@Override
public @NonNull ParceledListSlice<InstrumentationInfo> queryInstrumentation(
String targetPackage, int flags) {
+ final int callingUid = Binder.getCallingUid();
+ final int callingUserId = UserHandle.getUserId(callingUid);
+ final PackageSetting ps = mSettings.mPackages.get(targetPackage);
+ if (filterAppAccessLPr(ps, callingUid, callingUserId)) {
+ return ParceledListSlice.emptyList();
+ }
return new ParceledListSlice<>(queryInstrumentationInternal(targetPackage, flags));
}
@@ -8727,7 +9139,7 @@
*/
private static final void enforceSystemOrRoot(String message) {
final int uid = Binder.getCallingUid();
- if (uid != Process.SYSTEM_UID && uid != 0) {
+ if (uid != Process.SYSTEM_UID && uid != Process.ROOT_UID) {
throw new SecurityException(message);
}
}
@@ -8902,7 +9314,18 @@
@Override
public void notifyPackageUse(String packageName, int reason) {
synchronized (mPackages) {
- PackageParser.Package p = mPackages.get(packageName);
+ final int callingUid = Binder.getCallingUid();
+ final int callingUserId = UserHandle.getUserId(callingUid);
+ if (getInstantAppPackageName(callingUid) != null) {
+ if (!isCallerSameApp(packageName, callingUid)) {
+ return;
+ }
+ } else {
+ if (isInstantApp(packageName, callingUserId)) {
+ return;
+ }
+ }
+ final PackageParser.Package p = mPackages.get(packageName);
if (p == null) {
return;
}
@@ -8925,14 +9348,28 @@
@Override
public boolean performDexOpt(String packageName,
boolean checkProfiles, int compileReason, boolean force) {
- int dexOptStatus = performDexOptTraced(packageName, checkProfiles,
+ return performDexOptWithStatus(packageName, checkProfiles, compileReason, force) !=
+ PackageDexOptimizer.DEX_OPT_FAILED;
+ }
+
+ /**
+ * Perform dexopt on the given package and return one of following result:
+ * {@link PackageDexOptimizer#DEX_OPT_SKIPPED}
+ * {@link PackageDexOptimizer#DEX_OPT_PERFORMED}
+ * {@link PackageDexOptimizer#DEX_OPT_FAILED}
+ */
+ /* package */ int performDexOptWithStatus(String packageName,
+ boolean checkProfiles, int compileReason, boolean force) {
+ return performDexOptTraced(packageName, checkProfiles,
getCompilerFilterForReason(compileReason), force);
- return dexOptStatus != PackageDexOptimizer.DEX_OPT_FAILED;
}
@Override
public boolean performDexOptMode(String packageName,
boolean checkProfiles, String targetCompilerFilter, boolean force) {
+ if (getInstantAppPackageName(Binder.getCallingUid()) != null) {
+ return false;
+ }
int dexOptStatus = performDexOptTraced(packageName, checkProfiles,
targetCompilerFilter, force);
return dexOptStatus != PackageDexOptimizer.DEX_OPT_FAILED;
@@ -9026,6 +9463,9 @@
@Override
public boolean performDexOptSecondary(String packageName, String compilerFilter,
boolean force) {
+ if (getInstantAppPackageName(Binder.getCallingUid()) != null) {
+ return false;
+ }
mDexManager.reconcileSecondaryDexFiles(packageName);
return mDexManager.dexoptSecondaryDex(packageName, compilerFilter, force);
}
@@ -9042,6 +9482,9 @@
*/
@Override
public void reconcileSecondaryDexFiles(String packageName) {
+ if (getInstantAppPackageName(Binder.getCallingUid()) != null) {
+ return;
+ }
mDexManager.reconcileSecondaryDexFiles(packageName);
}
@@ -9056,6 +9499,9 @@
*/
@Override
public boolean runBackgroundDexoptJob() {
+ if (getInstantAppPackageName(Binder.getCallingUid()) != null) {
+ return false;
+ }
return BackgroundDexOptService.runIdleOptimizationsNow(this, mContext);
}
@@ -10297,8 +10743,7 @@
final int versionCount = versionedLib.size();
for (int i = 0; i < versionCount; i++) {
SharedLibraryInfo libInfo = versionedLib.valueAt(i).info;
- // TODO: We will change version code to long, so in the new API it is long
- final int libVersionCode = (int) libInfo.getDeclaringPackage()
+ final int libVersionCode = libInfo.getDeclaringPackage()
.getVersionCode();
if (libInfo.getVersion() < pkg.staticSharedLibVersion) {
minVersionCode = Math.max(minVersionCode, libVersionCode + 1);
@@ -13509,6 +13954,9 @@
@Override
public PackageCleanItem nextPackageToClean(PackageCleanItem lastPackage) {
+ if (getInstantAppPackageName(Binder.getCallingUid()) != null) {
+ return null;
+ }
// writer
synchronized (mPackages) {
if (!isExternalMediaAvailable()) {
@@ -14090,15 +14538,16 @@
@Override
public boolean isPackageSuspendedForUser(String packageName, int userId) {
- enforceCrossUserPermission(Binder.getCallingUid(), userId,
+ final int callingUid = Binder.getCallingUid();
+ enforceCrossUserPermission(callingUid, userId,
true /* requireFullPermission */, false /* checkShell */,
"isPackageSuspendedForUser for user " + userId);
synchronized (mPackages) {
- final PackageSetting pkgSetting = mSettings.mPackages.get(packageName);
- if (pkgSetting == null) {
+ final PackageSetting ps = mSettings.mPackages.get(packageName);
+ if (ps == null || filterAppAccessLPr(ps, callingUid, userId)) {
throw new IllegalArgumentException("Unknown target package: " + packageName);
}
- return pkgSetting.getSuspended(userId);
+ return ps.getSuspended(userId);
}
}
@@ -14423,6 +14872,9 @@
@Override
public int getIntentVerificationStatus(String packageName, int userId) {
+ if (getInstantAppPackageName(Binder.getCallingUid()) != null) {
+ return INTENT_FILTER_DOMAIN_VERIFICATION_STATUS_UNDEFINED;
+ }
synchronized (mPackages) {
return mSettings.getIntentFilterVerificationStatusLPr(packageName, userId);
}
@@ -14446,6 +14898,9 @@
@Override
public @NonNull ParceledListSlice<IntentFilterVerificationInfo> getIntentFilterVerifications(
String packageName) {
+ if (getInstantAppPackageName(Binder.getCallingUid()) != null) {
+ return ParceledListSlice.emptyList();
+ }
synchronized (mPackages) {
return new ParceledListSlice<>(mSettings.getIntentFilterVerificationsLPr(packageName));
}
@@ -14456,11 +14911,20 @@
if (TextUtils.isEmpty(packageName)) {
return ParceledListSlice.emptyList();
}
+ final int callingUid = Binder.getCallingUid();
+ final int callingUserId = UserHandle.getUserId(callingUid);
synchronized (mPackages) {
PackageParser.Package pkg = mPackages.get(packageName);
if (pkg == null || pkg.activities == null) {
return ParceledListSlice.emptyList();
}
+ if (pkg.mExtras == null) {
+ return ParceledListSlice.emptyList();
+ }
+ final PackageSetting ps = (PackageSetting) pkg.mExtras;
+ if (filterAppAccessLPr(ps, callingUid, callingUserId)) {
+ return ParceledListSlice.emptyList();
+ }
final int count = pkg.activities.size();
ArrayList<IntentFilter> result = new ArrayList<>();
for (int n=0; n<count; n++) {
@@ -14490,6 +14954,9 @@
@Override
public String getDefaultBrowserPackageName(int userId) {
+ if (getInstantAppPackageName(Binder.getCallingUid()) != null) {
+ return null;
+ }
synchronized (mPackages) {
return mSettings.getDefaultBrowserPackageNameLPw(userId);
}
@@ -14508,7 +14975,10 @@
@Override
public void setInstallerPackageName(String targetPackage, String installerPackageName) {
- final int uid = Binder.getCallingUid();
+ final int callingUid = Binder.getCallingUid();
+ if (getInstantAppPackageName(callingUid) != null) {
+ return;
+ }
// writer
synchronized (mPackages) {
PackageSetting targetPackageSetting = mSettings.mPackages.get(targetPackage);
@@ -14528,17 +14998,17 @@
}
Signature[] callerSignature;
- Object obj = mSettings.getUserIdLPr(uid);
+ Object obj = mSettings.getUserIdLPr(callingUid);
if (obj != null) {
if (obj instanceof SharedUserSetting) {
callerSignature = ((SharedUserSetting)obj).signatures.mSignatures;
} else if (obj instanceof PackageSetting) {
callerSignature = ((PackageSetting)obj).signatures.mSignatures;
} else {
- throw new SecurityException("Bad object " + obj + " for uid " + uid);
+ throw new SecurityException("Bad object " + obj + " for uid " + callingUid);
}
} else {
- throw new SecurityException("Unknown calling UID: " + uid);
+ throw new SecurityException("Unknown calling UID: " + callingUid);
}
// Verify: can't set installerPackageName to a package that is
@@ -14583,6 +15053,9 @@
@Override
public void setApplicationCategoryHint(String packageName, int categoryHint,
String callerPackageName) {
+ if (getInstantAppPackageName(Binder.getCallingUid()) != null) {
+ throw new SecurityException("Instant applications don't have access to this method");
+ }
mContext.getSystemService(AppOpsManager.class).checkPackage(Binder.getCallingUid(),
callerPackageName);
synchronized (mPackages) {
@@ -15113,7 +15586,7 @@
origin.resolvedPath, isForwardLocked(), packageAbiOverride);
try {
- mInstaller.freeCache(null, sizeBytes + lowThreshold, 0);
+ mInstaller.freeCache(null, sizeBytes + lowThreshold, 0, 0);
pkgLite = mContainerService.getMinimalPackageInfo(origin.resolvedPath,
installFlags, packageAbiOverride);
} catch (InstallerException e) {
@@ -16592,9 +17065,13 @@
}
}
+ @Override
public List<String> getPreviousCodePaths(String packageName) {
+ final List<String> result = new ArrayList<>();
+ if (getInstantAppPackageName(Binder.getCallingUid()) != null) {
+ return result;
+ }
final PackageSetting ps = mSettings.mPackages.get(packageName);
- final List<String> result = new ArrayList<String>();
if (ps != null && ps.oldCodePaths != null) {
result.addAll(ps.oldCodePaths);
}
@@ -18002,7 +18479,7 @@
private boolean isCallerAllowedToSilentlyUninstall(int callingUid, String pkgName) {
if (callingUid == Process.SHELL_UID || callingUid == Process.ROOT_UID
- || callingUid == Process.SYSTEM_UID) {
+ || UserHandle.getAppId(callingUid) == Process.SYSTEM_UID) {
return true;
}
final int callingUserId = UserHandle.getUserId(callingUid);
@@ -18043,6 +18520,11 @@
@Override
public boolean isPackageDeviceAdminOnAnyUser(String packageName) {
+ final int callingUid = Binder.getCallingUid();
+ if (getInstantAppPackageName(callingUid) != null
+ && !isCallerSameApp(packageName, callingUid)) {
+ return false;
+ }
return isPackageDeviceAdmin(packageName, UserHandle.USER_ALL);
}
@@ -18098,7 +18580,7 @@
* persisting settings for later use
* sending a broadcast if necessary
*/
- private int deletePackageX(String packageName, int versionCode, int userId, int deleteFlags) {
+ int deletePackageX(String packageName, int versionCode, int userId, int deleteFlags) {
final PackageRemovedInfo info = new PackageRemovedInfo(this);
final boolean res;
@@ -18141,7 +18623,7 @@
pkg.staticSharedLibVersion);
if (libEntry != null) {
for (int currUserId : allUsers) {
- if (userId != UserHandle.USER_ALL && userId != currUserId) {
+ if (removeUser != UserHandle.USER_ALL && removeUser != currUserId) {
continue;
}
List<VersionedPackage> libClientPackages = getPackagesUsingSharedLibraryLPr(
@@ -18719,11 +19201,7 @@
@Override
public boolean setRequiredForSystemUser(String packageName, boolean systemUserApp) {
- int callingUid = Binder.getCallingUid();
- if (callingUid != Process.SYSTEM_UID && callingUid != Process.ROOT_UID) {
- throw new SecurityException(
- "setRequiredForSystemUser can only be run by the system or root");
- }
+ enforceSystemOrRoot("setRequiredForSystemUser can only be run by the system or root");
synchronized (mPackages) {
PackageSetting ps = mSettings.mPackages.get(packageName);
if (ps == null) {
@@ -19577,18 +20055,21 @@
@Override
public void clearPackagePreferredActivities(String packageName) {
- final int uid = Binder.getCallingUid();
+ final int callingUid = Binder.getCallingUid();
+ if (getInstantAppPackageName(callingUid) != null) {
+ return;
+ }
// writer
synchronized (mPackages) {
PackageParser.Package pkg = mPackages.get(packageName);
- if (pkg == null || pkg.applicationInfo.uid != uid) {
+ if (pkg == null || pkg.applicationInfo.uid != callingUid) {
if (mContext.checkCallingOrSelfPermission(
android.Manifest.permission.SET_PREFERRED_APPLICATIONS)
!= PackageManager.PERMISSION_GRANTED) {
- if (getUidTargetSdkVersionLockedLPr(Binder.getCallingUid())
+ if (getUidTargetSdkVersionLockedLPr(callingUid)
< Build.VERSION_CODES.FROYO) {
Slog.w(TAG, "Ignoring clearPackagePreferredActivities() from uid "
- + Binder.getCallingUid());
+ + callingUid);
return;
}
mContext.enforceCallingOrSelfPermission(
@@ -19711,7 +20192,9 @@
@Override
public int getPreferredActivities(List<IntentFilter> outFilters,
List<ComponentName> outActivities, String packageName) {
-
+ if (getInstantAppPackageName(Binder.getCallingUid()) != null) {
+ return 0;
+ }
int num = 0;
final int userId = UserHandle.getCallingUserId();
// reader
@@ -20280,6 +20763,9 @@
@Override
public ComponentName getHomeActivities(List<ResolveInfo> allHomeCandidates) {
+ if (getInstantAppPackageName(Binder.getCallingUid()) != null) {
+ return null;
+ }
return getHomeActivitiesAsUser(allHomeCandidates, UserHandle.getCallingUserId());
}
@@ -20364,6 +20850,9 @@
@Override
public void setHomeActivity(ComponentName comp, int userId) {
+ if (getInstantAppPackageName(Binder.getCallingUid()) != null) {
+ return;
+ }
ArrayList<ResolveInfo> homeActivities = new ArrayList<>();
getHomeActivitiesAsUser(homeActivities, userId);
@@ -20461,43 +20950,58 @@
+ newState);
}
PackageSetting pkgSetting;
- final int uid = Binder.getCallingUid();
+ final int callingUid = Binder.getCallingUid();
final int permission;
- if (uid == Process.SYSTEM_UID) {
+ if (callingUid == Process.SYSTEM_UID) {
permission = PackageManager.PERMISSION_GRANTED;
} else {
permission = mContext.checkCallingOrSelfPermission(
android.Manifest.permission.CHANGE_COMPONENT_ENABLED_STATE);
}
- enforceCrossUserPermission(uid, userId,
+ enforceCrossUserPermission(callingUid, userId,
false /* requireFullPermission */, true /* checkShell */, "set enabled");
final boolean allowedByPermission = (permission == PackageManager.PERMISSION_GRANTED);
boolean sendNow = false;
boolean isApp = (className == null);
+ final boolean isCallerInstantApp = (getInstantAppPackageName(callingUid) != null);
String componentName = isApp ? packageName : className;
int packageUid = -1;
ArrayList<String> components;
- // writer
+ // reader
synchronized (mPackages) {
pkgSetting = mSettings.mPackages.get(packageName);
if (pkgSetting == null) {
- if (className == null) {
- throw new IllegalArgumentException("Unknown package: " + packageName);
+ if (!isCallerInstantApp) {
+ if (className == null) {
+ throw new IllegalArgumentException("Unknown package: " + packageName);
+ }
+ throw new IllegalArgumentException(
+ "Unknown component: " + packageName + "/" + className);
+ } else {
+ // throw SecurityException to prevent leaking package information
+ throw new SecurityException(
+ "Attempt to change component state; "
+ + "pid=" + Binder.getCallingPid()
+ + ", uid=" + callingUid
+ + (className == null
+ ? ", package=" + packageName
+ : ", component=" + packageName + "/" + className));
}
- throw new IllegalArgumentException(
- "Unknown component: " + packageName + "/" + className);
}
}
// Limit who can change which apps
- if (!UserHandle.isSameApp(uid, pkgSetting.appId)) {
+ if (!UserHandle.isSameApp(callingUid, pkgSetting.appId)) {
// Don't allow apps that don't have permission to modify other apps
if (!allowedByPermission) {
throw new SecurityException(
- "Permission Denial: attempt to change component state from pid="
- + Binder.getCallingPid()
- + ", uid=" + uid + ", package uid=" + pkgSetting.appId);
+ "Attempt to change component state; "
+ + "pid=" + Binder.getCallingPid()
+ + ", uid=" + callingUid
+ + (className == null
+ ? ", package=" + packageName
+ : ", component=" + packageName + "/" + className));
}
// Don't allow changing protected packages.
if (mProtectedPackages.isPackageStateProtected(userId, packageName)) {
@@ -20506,7 +21010,7 @@
}
synchronized (mPackages) {
- if (uid == Process.SHELL_UID
+ if (callingUid == Process.SHELL_UID
&& (pkgSetting.pkgFlags & ApplicationInfo.FLAG_TEST_ONLY) == 0) {
// Shell can only change whole packages between ENABLED and DISABLED_USER states
// unless it is a test package.
@@ -20622,6 +21126,9 @@
@Override
public void flushPackageRestrictionsAsUser(int userId) {
+ if (getInstantAppPackageName(Binder.getCallingUid()) != null) {
+ return;
+ }
if (!sUserManager.exists(userId)) {
return;
}
@@ -20660,16 +21167,19 @@
@Override
public void setPackageStoppedState(String packageName, boolean stopped, int userId) {
if (!sUserManager.exists(userId)) return;
- final int uid = Binder.getCallingUid();
+ final int callingUid = Binder.getCallingUid();
+ if (getInstantAppPackageName(callingUid) != null) {
+ return;
+ }
final int permission = mContext.checkCallingOrSelfPermission(
android.Manifest.permission.CHANGE_COMPONENT_ENABLED_STATE);
final boolean allowedByPermission = (permission == PackageManager.PERMISSION_GRANTED);
- enforceCrossUserPermission(uid, userId,
+ enforceCrossUserPermission(callingUid, userId,
true /* requireFullPermission */, true /* checkShell */, "stop package");
// writer
synchronized (mPackages) {
if (mSettings.setPackageStoppedStateLPw(this, packageName, stopped,
- allowedByPermission, uid, userId)) {
+ allowedByPermission, callingUid, userId)) {
scheduleWritePackageRestrictionsLocked(userId);
}
}
@@ -20677,6 +21187,9 @@
@Override
public String getInstallerPackageName(String packageName) {
+ if (getInstantAppPackageName(Binder.getCallingUid()) != null) {
+ return null;
+ }
// reader
synchronized (mPackages) {
return mSettings.getInstallerPackageNameLPr(packageName);
@@ -20693,24 +21206,30 @@
@Override
public int getApplicationEnabledSetting(String packageName, int userId) {
if (!sUserManager.exists(userId)) return COMPONENT_ENABLED_STATE_DISABLED;
- int uid = Binder.getCallingUid();
- enforceCrossUserPermission(uid, userId,
+ int callingUid = Binder.getCallingUid();
+ enforceCrossUserPermission(callingUid, userId,
false /* requireFullPermission */, false /* checkShell */, "get enabled");
// reader
synchronized (mPackages) {
+ if (filterAppAccessLPr(mSettings.getPackageLPr(packageName), callingUid, userId)) {
+ return COMPONENT_ENABLED_STATE_DISABLED;
+ }
return mSettings.getApplicationEnabledSettingLPr(packageName, userId);
}
}
@Override
- public int getComponentEnabledSetting(ComponentName componentName, int userId) {
+ public int getComponentEnabledSetting(ComponentName component, int userId) {
if (!sUserManager.exists(userId)) return COMPONENT_ENABLED_STATE_DISABLED;
- int uid = Binder.getCallingUid();
- enforceCrossUserPermission(uid, userId,
- false /* requireFullPermission */, false /* checkShell */, "get component enabled");
- // reader
+ int callingUid = Binder.getCallingUid();
+ enforceCrossUserPermission(callingUid, userId,
+ false /*requireFullPermission*/, false /*checkShell*/, "getComponentEnabled");
synchronized (mPackages) {
- return mSettings.getComponentEnabledSettingLPr(componentName, userId);
+ if (filterAppAccessLPr(mSettings.getPackageLPr(component.getPackageName()), callingUid,
+ component, TYPE_UNKNOWN, userId)) {
+ return COMPONENT_ENABLED_STATE_DISABLED;
+ }
+ return mSettings.getComponentEnabledSettingLPr(component, userId);
}
}
@@ -20725,6 +21244,8 @@
@Override
public void systemReady() {
+ enforceSystemOrRoot("Only the system can claim the system is ready");
+
mSystemReady = true;
final ContentResolver resolver = mContext.getContentResolver();
ContentObserver co = new ContentObserver(mHandler) {
@@ -20872,11 +21393,13 @@
@Override
public boolean isSafeMode() {
+ // allow instant applications
return mSafeMode;
}
@Override
public boolean hasSystemUidErrors() {
+ // allow instant applications
return mHasSystemUidErrors;
}
@@ -21838,10 +22361,7 @@
*/
@Override
public void updateExternalMediaStatus(final boolean mediaStatus, final boolean reportStatus) {
- int callingUid = Binder.getCallingUid();
- if (callingUid != 0 && callingUid != Process.SYSTEM_UID) {
- throw new SecurityException("Media status can only be updated by the system");
- }
+ enforceSystemOrRoot("Media status can only be updated by the system");
// reader; this apparently protects mMediaMounted, but should probably
// be a different lock in that case.
synchronized (mPackages) {
@@ -23173,6 +23693,7 @@
@Override
public int getInstallLocation() {
+ // allow instant app access
return android.provider.Settings.Global.getInt(mContext.getContentResolver(),
android.provider.Settings.Global.DEFAULT_INSTALL_LOCATION,
PackageHelper.APP_INSTALL_AUTO);
@@ -23313,11 +23834,13 @@
@Override
@Deprecated
public boolean isPermissionEnforced(String permission) {
+ // allow instant applications
return true;
}
@Override
public boolean isStorageLow() {
+ // allow instant applications
final long token = Binder.clearCallingIdentity();
try {
final DeviceStorageMonitorInternal
@@ -23334,6 +23857,9 @@
@Override
public IPackageInstaller getPackageInstaller() {
+ if (getInstantAppPackageName(Binder.getCallingUid()) != null) {
+ return null;
+ }
return mInstallerService;
}
@@ -23381,13 +23907,22 @@
return null;
}
synchronized(mPackages) {
+ final int callingUid = Binder.getCallingUid();
+ final int callingUserId = UserHandle.getUserId(callingUid);
final PackageParser.Package pkg = mPackages.get(packageName);
if (pkg == null) {
Slog.w(TAG, "KeySet requested for unknown package: " + packageName);
throw new IllegalArgumentException("Unknown package: " + packageName);
}
- if (pkg.applicationInfo.uid != Binder.getCallingUid()
- && Process.SYSTEM_UID != Binder.getCallingUid()) {
+ final PackageSetting ps = (PackageSetting) pkg.mExtras;
+ if (filterAppAccessLPr(ps, callingUid, callingUserId)) {
+ // filter and pretend the package doesn't exist
+ Slog.w(TAG, "KeySet requested for filtered package: " + packageName
+ + ", uid:" + callingUid);
+ throw new IllegalArgumentException("Unknown package: " + packageName);
+ }
+ if (pkg.applicationInfo.uid != callingUid
+ && Process.SYSTEM_UID != callingUid) {
throw new SecurityException("May not access signing KeySet of other apps.");
}
KeySetManagerService ksms = mSettings.mKeySetManagerService;
@@ -23397,6 +23932,9 @@
@Override
public boolean isPackageSignedByKeySet(String packageName, KeySet ks) {
+ if (getInstantAppPackageName(Binder.getCallingUid()) != null) {
+ return false;
+ }
if (packageName == null || ks == null) {
return false;
}
@@ -23417,6 +23955,9 @@
@Override
public boolean isPackageSignedByKeySetExactly(String packageName, KeySet ks) {
+ if (getInstantAppPackageName(Binder.getCallingUid()) != null) {
+ return false;
+ }
if (packageName == null || ks == null) {
return false;
}
@@ -23824,9 +24365,7 @@
@Override
public void pruneInstantApps() {
- synchronized (mPackages) {
- mInstantAppRegistry.pruneInstantAppsLPw();
- }
+ mInstantAppRegistry.pruneInstantApps();
}
@Override
@@ -23956,8 +24495,8 @@
}
@Override
- public boolean canAccessInstantApps(int callingUid) {
- return PackageManagerService.this.canAccessInstantApps(callingUid);
+ public boolean canAccessInstantApps(int callingUid, int userId) {
+ return PackageManagerService.this.canViewInstantApps(callingUid, userId);
}
}
@@ -24015,8 +24554,12 @@
* Logs process start information (including base APK hash) to the security log.
* @hide
*/
+ @Override
public void logAppProcessStartIfNeeded(String processName, int uid, String seinfo,
String apkFile, int pid) {
+ if (getInstantAppPackageName(Binder.getCallingUid()) != null) {
+ return;
+ }
if (!SecurityLog.isLoggingEnabled()) {
return;
}
@@ -24051,11 +24594,15 @@
@Override
public int getInstallReason(String packageName, int userId) {
- enforceCrossUserPermission(Binder.getCallingUid(), userId,
+ final int callingUid = Binder.getCallingUid();
+ enforceCrossUserPermission(callingUid, userId,
true /* requireFullPermission */, false /* checkShell */,
"get install reason");
synchronized (mPackages) {
final PackageSetting ps = mSettings.mPackages.get(packageName);
+ if (filterAppAccessLPr(ps, callingUid, userId)) {
+ return PackageManager.INSTALL_REASON_UNKNOWN;
+ }
if (ps != null) {
return ps.getInstallReason(userId);
}
@@ -24065,6 +24612,9 @@
@Override
public boolean canRequestPackageInstalls(String packageName, int userId) {
+ if (getInstantAppPackageName(Binder.getCallingUid()) != null) {
+ return false;
+ }
return canRequestPackageInstallsInternal(packageName, 0, userId,
true /* throwIfPermNotDeclared*/);
}
@@ -24115,6 +24665,9 @@
@Override
public ComponentName getInstantAppInstallerComponent() {
+ if (getInstantAppPackageName(Binder.getCallingUid()) != null) {
+ return null;
+ }
return mInstantAppInstallerActivity == null
? null : mInstantAppInstallerActivity.getComponentName();
}
diff --git a/services/core/java/com/android/server/pm/Settings.java b/services/core/java/com/android/server/pm/Settings.java
index 44bcff2..24cbdbf 100644
--- a/services/core/java/com/android/server/pm/Settings.java
+++ b/services/core/java/com/android/server/pm/Settings.java
@@ -987,11 +987,11 @@
// Update static shared library dependencies if needed
if (pkg.usesStaticLibraries != null && pkg.usesStaticLibrariesVersions != null
&& pkg.usesStaticLibraries.size() == pkg.usesStaticLibrariesVersions.length) {
- String[] usesStaticLibraries = new String[pkg.usesStaticLibraries.size()];
- pkg.usesStaticLibraries.toArray(usesStaticLibraries);
+ p.usesStaticLibraries = new String[pkg.usesStaticLibraries.size()];
+ pkg.usesStaticLibraries.toArray(p.usesStaticLibraries);
p.usesStaticLibrariesVersions = pkg.usesStaticLibrariesVersions;
} else {
- pkg.usesStaticLibraries = null;
+ p.usesStaticLibraries = null;
p.usesStaticLibrariesVersions = null;
}
addPackageSettingLPw(p, p.sharedUser);
diff --git a/services/core/java/com/android/server/policy/PhoneWindowManager.java b/services/core/java/com/android/server/policy/PhoneWindowManager.java
index 8e058ad..e3bc919 100644
--- a/services/core/java/com/android/server/policy/PhoneWindowManager.java
+++ b/services/core/java/com/android/server/policy/PhoneWindowManager.java
@@ -60,7 +60,6 @@
import static android.view.WindowManager.LayoutParams.PRIVATE_FLAG_FORCE_STATUS_BAR_VISIBLE_TRANSPARENT;
import static android.view.WindowManager.LayoutParams.PRIVATE_FLAG_KEYGUARD;
import static android.view.WindowManager.LayoutParams.PRIVATE_FLAG_SHOW_FOR_ALL_USERS;
-import static android.view.WindowManager.LayoutParams.PRIVATE_FLAG_TASK_SNAPSHOT;
import static android.view.WindowManager.LayoutParams.PRIVATE_FLAG_SYSTEM_ERROR;
import static android.view.WindowManager.LayoutParams.ROTATION_ANIMATION_CROSSFADE;
import static android.view.WindowManager.LayoutParams.ROTATION_ANIMATION_JUMPCUT;
@@ -234,6 +233,7 @@
import com.android.internal.widget.PointerLocationView;
import com.android.server.GestureLauncherService;
import com.android.server.LocalServices;
+import com.android.server.SystemServiceManager;
import com.android.server.policy.keyguard.KeyguardServiceDelegate;
import com.android.server.policy.keyguard.KeyguardServiceDelegate.DrawnListener;
import com.android.server.policy.keyguard.KeyguardStateMonitor.StateCallback;
@@ -476,6 +476,7 @@
boolean mBootMessageNeedsHiding;
KeyguardServiceDelegate mKeyguardDelegate;
+ private boolean mKeyguardBound;
final Runnable mWindowManagerDrawCallback = new Runnable() {
@Override
public void run() {
@@ -530,7 +531,6 @@
boolean mSystemReady;
boolean mSystemBooted;
- private boolean mDeferBindKeyguard;
boolean mHdmiPlugged;
HdmiControl mHdmiControl;
IUiModeManager mUiModeManager;
@@ -1127,16 +1127,25 @@
+ ", mOrientationSensorEnabled=" + mOrientationSensorEnabled
+ ", mKeyguardDrawComplete=" + mKeyguardDrawComplete
+ ", mWindowManagerDrawComplete=" + mWindowManagerDrawComplete);
+ final boolean keyguardGoingAway = mWindowManagerInternal.isKeyguardGoingAway();
+
boolean disable = true;
// Note: We postpone the rotating of the screen until the keyguard as well as the
- // window manager have reported a draw complete.
- if (mScreenOnEarly && mAwake &&
- mKeyguardDrawComplete && mWindowManagerDrawComplete) {
+ // window manager have reported a draw complete or the keyguard is going away in dismiss
+ // mode.
+ if (mScreenOnEarly && mAwake && ((mKeyguardDrawComplete && mWindowManagerDrawComplete)
+ || keyguardGoingAway)) {
if (needSensorRunningLp()) {
disable = false;
//enable listener if not already enabled
if (!mOrientationSensorEnabled) {
- mOrientationListener.enable();
+ // Don't clear the current sensor orientation if the keyguard is going away in
+ // dismiss mode. This allows window manager to use the last sensor reading to
+ // determine the orientation vs. falling back to the last known orientation if
+ // the sensor reading was cleared which can cause it to relaunch the app that
+ // will show in the wrong orientation first before correcting leading to app
+ // launch delays.
+ mOrientationListener.enable(!keyguardGoingAway /* clearCurrentRotation */);
if(localLOGV) Slog.v(TAG, "Enabling listeners");
mOrientationSensorEnabled = true;
}
@@ -2087,6 +2096,13 @@
handleStartTransitionForKeyguardLw(transit, null /* transit */);
}
});
+ mKeyguardDelegate = new KeyguardServiceDelegate(mContext,
+ new StateCallback() {
+ @Override
+ public void onTrustedChanged() {
+ mWindowManagerFuncs.notifyKeyguardTrustedChanged();
+ }
+ });
}
/**
@@ -5325,11 +5341,12 @@
@Override
public void applyPostLayoutPolicyLw(WindowState win, WindowManager.LayoutParams attrs,
WindowState attached, WindowState imeTarget) {
- final boolean visible = win.isVisibleLw() && win.getAttrs().alpha > 0f;
- if (DEBUG_LAYOUT) Slog.i(TAG, "Win " + win + ": isVisible=" + visible);
+ final boolean affectsSystemUi = win.canAffectSystemUiFlags();
+ if (DEBUG_LAYOUT) Slog.i(TAG, "Win " + win + ": affectsSystemUi=" + affectsSystemUi);
applyKeyguardPolicyLw(win, imeTarget);
final int fl = PolicyControl.getWindowFlags(win, attrs);
- if (mTopFullscreenOpaqueWindowState == null && visible && attrs.type == TYPE_INPUT_METHOD) {
+ if (mTopFullscreenOpaqueWindowState == null && affectsSystemUi
+ && attrs.type == TYPE_INPUT_METHOD) {
mForcingShowNavBar = true;
mForcingShowNavBarLayer = win.getSurfaceLayer();
}
@@ -5345,7 +5362,7 @@
boolean appWindow = attrs.type >= FIRST_APPLICATION_WINDOW
&& attrs.type < FIRST_SYSTEM_WINDOW;
final int stackId = win.getStackId();
- if (mTopFullscreenOpaqueWindowState == null && visible) {
+ if (mTopFullscreenOpaqueWindowState == null && affectsSystemUi) {
if ((fl & FLAG_FORCE_NOT_FULLSCREEN) != 0) {
mForceStatusBar = true;
}
@@ -5377,7 +5394,7 @@
}
// Voice interaction overrides both top fullscreen and top docked.
- if (visible && win.getAttrs().type == TYPE_VOICE_INTERACTION) {
+ if (affectsSystemUi && win.getAttrs().type == TYPE_VOICE_INTERACTION) {
if (mTopFullscreenOpaqueWindowState == null) {
mTopFullscreenOpaqueWindowState = win;
if (mTopFullscreenOpaqueOrDimmingWindowState == null) {
@@ -5393,7 +5410,7 @@
}
// Keep track of the window if it's dimming but not necessarily fullscreen.
- if (mTopFullscreenOpaqueOrDimmingWindowState == null && visible
+ if (mTopFullscreenOpaqueOrDimmingWindowState == null && affectsSystemUi
&& win.isDimming() && StackId.normallyFullscreenWindows(stackId)) {
mTopFullscreenOpaqueOrDimmingWindowState = win;
}
@@ -5401,7 +5418,7 @@
// We need to keep track of the top "fullscreen" opaque window for the docked stack
// separately, because both the "real fullscreen" opaque window and the one for the docked
// stack can control View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR.
- if (mTopDockedOpaqueWindowState == null && visible && appWindow && attached == null
+ if (mTopDockedOpaqueWindowState == null && affectsSystemUi && appWindow && attached == null
&& isFullscreen(attrs) && stackId == DOCKED_STACK_ID) {
mTopDockedOpaqueWindowState = win;
if (mTopDockedOpaqueOrDimmingWindowState == null) {
@@ -5411,7 +5428,7 @@
// Also keep track of any windows that are dimming but not necessarily fullscreen in the
// docked stack.
- if (mTopDockedOpaqueOrDimmingWindowState == null && visible && win.isDimming()
+ if (mTopDockedOpaqueOrDimmingWindowState == null && affectsSystemUi && win.isDimming()
&& stackId == DOCKED_STACK_ID) {
mTopDockedOpaqueOrDimmingWindowState = win;
}
@@ -6631,6 +6648,13 @@
reportScreenStateToVrManager(false);
}
+ private long getKeyguardDrawnTimeout() {
+ final boolean bootCompleted =
+ LocalServices.getService(SystemServiceManager.class).isBootCompleted();
+ // Set longer timeout if it has not booted yet to prevent showing empty window.
+ return bootCompleted ? 1000 : 5000;
+ }
+
// Called on the DisplayManager's DisplayPowerController thread.
@Override
public void screenTurningOn(final ScreenOnListener screenOnListener) {
@@ -6646,7 +6670,8 @@
if (mKeyguardDelegate != null) {
mHandler.removeMessages(MSG_KEYGUARD_DRAWN_TIMEOUT);
- mHandler.sendEmptyMessageDelayed(MSG_KEYGUARD_DRAWN_TIMEOUT, 1000);
+ mHandler.sendEmptyMessageDelayed(MSG_KEYGUARD_DRAWN_TIMEOUT,
+ getKeyguardDrawnTimeout());
mKeyguardDelegate.onScreenTurningOn(mKeyguardDrawnCallback);
} else {
if (DEBUG_WAKEUP) Slog.d(TAG,
@@ -6667,6 +6692,11 @@
reportScreenStateToVrManager(true);
}
+ @Override
+ public void screenTurningOff(ScreenOffListener screenOffListener) {
+ mWindowManagerFuncs.screenTurningOff(screenOffListener);
+ }
+
private void reportScreenStateToVrManager(boolean isScreenOn) {
if (mVrManagerInternal == null) {
return;
@@ -7154,16 +7184,26 @@
return out;
}
+ private void bindKeyguard() {
+ synchronized (mLock) {
+ if (mKeyguardBound) {
+ return;
+ }
+ mKeyguardBound = true;
+ }
+ mKeyguardDelegate.bindService(mContext);
+ }
+
+ @Override
+ public void onSystemUiStarted() {
+ bindKeyguard();
+ }
+
/** {@inheritDoc} */
@Override
public void systemReady() {
- mKeyguardDelegate = new KeyguardServiceDelegate(mContext,
- new StateCallback() {
- @Override
- public void onTrustedChanged() {
- mWindowManagerFuncs.notifyKeyguardTrustedChanged();
- }
- });
+ // In normal flow, systemReady is called before other system services are ready.
+ // So it is better not to bind keyguard here.
mKeyguardDelegate.onSystemReady();
mVrManagerInternal = LocalServices.getService(VrManagerInternal.class);
@@ -7173,7 +7213,6 @@
readCameraLensCoverState();
updateUiMode();
- boolean bindKeyguardNow;
synchronized (mLock) {
updateOrientationListenerLp();
mSystemReady = true;
@@ -7183,18 +7222,13 @@
updateSettings();
}
});
-
- bindKeyguardNow = mDeferBindKeyguard;
- if (bindKeyguardNow) {
- // systemBooted ran but wasn't able to bind to the Keyguard, we'll do it now.
- mDeferBindKeyguard = false;
+ // If this happens, for whatever reason, systemReady came later than systemBooted.
+ // And keyguard should be already bound from systemBooted
+ if (mSystemBooted) {
+ mKeyguardDelegate.onBootCompleted();
}
}
- if (bindKeyguardNow) {
- mKeyguardDelegate.bindService(mContext);
- mKeyguardDelegate.onBootCompleted();
- }
mSystemGestures.systemReady();
mImmersiveModeConfirmation.systemReady();
}
@@ -7202,30 +7236,25 @@
/** {@inheritDoc} */
@Override
public void systemBooted() {
- boolean bindKeyguardNow = false;
- synchronized (mLock) {
- // Time to bind Keyguard; take care to only bind it once, either here if ready or
- // in systemReady if not.
- if (mKeyguardDelegate != null) {
- bindKeyguardNow = true;
- } else {
- // Because mKeyguardDelegate is null, we know that the synchronized block in
- // systemReady didn't run yet and setting this will actually have an effect.
- mDeferBindKeyguard = true;
- }
- }
- if (bindKeyguardNow) {
- mKeyguardDelegate.bindService(mContext);
- mKeyguardDelegate.onBootCompleted();
- }
+ bindKeyguard();
synchronized (mLock) {
mSystemBooted = true;
+ if (mSystemReady) {
+ mKeyguardDelegate.onBootCompleted();
+ }
}
startedWakingUp();
screenTurningOn(null);
screenTurnedOn();
}
+ @Override
+ public boolean canDismissBootAnimation() {
+ synchronized (mLock) {
+ return mKeyguardDrawComplete;
+ }
+ }
+
ProgressDialog mBootMsgDialog = null;
/** {@inheritDoc} */
@@ -7670,7 +7699,10 @@
default:
return null;
}
- if (pattern.length == 1) {
+ if (pattern.length == 0) {
+ // No vibration
+ return null;
+ } else if (pattern.length == 1) {
// One-shot vibration
return VibrationEffect.createOneShot(pattern[0], VibrationEffect.DEFAULT_AMPLITUDE);
} else {
diff --git a/services/core/java/com/android/server/policy/WindowOrientationListener.java b/services/core/java/com/android/server/policy/WindowOrientationListener.java
index 8ef0acb..64f64c0 100644
--- a/services/core/java/com/android/server/policy/WindowOrientationListener.java
+++ b/services/core/java/com/android/server/policy/WindowOrientationListener.java
@@ -109,24 +109,37 @@
* {@link #onProposedRotationChanged(int)} when the device orientation changes.
*/
public void enable() {
+ enable(true /* clearCurrentRotation */);
+ }
+
+ /**
+ * Enables the WindowOrientationListener so it will monitor the sensor and call
+ * {@link #onProposedRotationChanged(int)} when the device orientation changes.
+ *
+ * @param clearCurrentRotation True if the current proposed sensor rotation should be cleared as
+ * part of the reset.
+ */
+ public void enable(boolean clearCurrentRotation) {
synchronized (mLock) {
if (mSensor == null) {
Slog.w(TAG, "Cannot detect sensors. Not enabled");
return;
}
- if (mEnabled == false) {
- if (LOG) {
- Slog.d(TAG, "WindowOrientationListener enabled");
- }
- mOrientationJudge.resetLocked();
- if (mSensor.getType() == Sensor.TYPE_ACCELEROMETER) {
- mSensorManager.registerListener(
- mOrientationJudge, mSensor, mRate, DEFAULT_BATCH_LATENCY, mHandler);
- } else {
- mSensorManager.registerListener(mOrientationJudge, mSensor, mRate, mHandler);
- }
- mEnabled = true;
+ if (mEnabled) {
+ return;
}
+ if (LOG) {
+ Slog.d(TAG, "WindowOrientationListener enabled clearCurrentRotation="
+ + clearCurrentRotation);
+ }
+ mOrientationJudge.resetLocked(clearCurrentRotation);
+ if (mSensor.getType() == Sensor.TYPE_ACCELEROMETER) {
+ mSensorManager.registerListener(
+ mOrientationJudge, mSensor, mRate, DEFAULT_BATCH_LATENCY, mHandler);
+ } else {
+ mSensorManager.registerListener(mOrientationJudge, mSensor, mRate, mHandler);
+ }
+ mEnabled = true;
}
}
@@ -278,8 +291,11 @@
* Resets the state of the judge.
*
* Should only be called when holding WindowOrientationListener lock.
+ *
+ * @param clearCurrentRotation True if the current proposed sensor rotation should be
+ * cleared as part of the reset.
*/
- public abstract void resetLocked();
+ public abstract void resetLocked(boolean clearCurrentRotation);
/**
* Dumps internal state of the orientation judge.
@@ -602,7 +618,7 @@
if (LOG) {
Slog.v(TAG, "Resetting orientation listener.");
}
- resetLocked();
+ resetLocked(true /* clearCurrentRotation */);
skipSample = true;
} else {
final float alpha = timeDeltaMS / (FILTER_TIME_CONSTANT_MS + timeDeltaMS);
@@ -778,9 +794,11 @@
}
@Override
- public void resetLocked() {
+ public void resetLocked(boolean clearCurrentRotation) {
mLastFilteredTimestampNanos = Long.MIN_VALUE;
- mProposedRotation = -1;
+ if (clearCurrentRotation) {
+ mProposedRotation = -1;
+ }
mFlatTimestampNanos = Long.MIN_VALUE;
mFlat = false;
mSwingTimestampNanos = Long.MIN_VALUE;
@@ -1015,9 +1033,11 @@
}
@Override
- public void resetLocked() {
- mProposedRotation = -1;
- mDesiredRotation = -1;
+ public void resetLocked(boolean clearCurrentRotation) {
+ if (clearCurrentRotation) {
+ mProposedRotation = -1;
+ mDesiredRotation = -1;
+ }
mTouching = false;
mTouchEndedTimestampNanos = Long.MIN_VALUE;
unscheduleRotationEvaluationLocked();
diff --git a/services/core/java/com/android/server/policy/keyguard/KeyguardServiceDelegate.java b/services/core/java/com/android/server/policy/keyguard/KeyguardServiceDelegate.java
index 1b4eaf5..da90e5a 100644
--- a/services/core/java/com/android/server/policy/keyguard/KeyguardServiceDelegate.java
+++ b/services/core/java/com/android/server/policy/keyguard/KeyguardServiceDelegate.java
@@ -30,7 +30,7 @@
*/
public class KeyguardServiceDelegate {
private static final String TAG = "KeyguardServiceDelegate";
- private static final boolean DEBUG = true;
+ private static final boolean DEBUG = false;
private static final int SCREEN_STATE_OFF = 0;
private static final int SCREEN_STATE_TURNING_ON = 1;
diff --git a/services/core/java/com/android/server/power/PowerManagerService.java b/services/core/java/com/android/server/power/PowerManagerService.java
index a8d19e9..3b5db29 100644
--- a/services/core/java/com/android/server/power/PowerManagerService.java
+++ b/services/core/java/com/android/server/power/PowerManagerService.java
@@ -87,6 +87,7 @@
import com.android.server.RescueParty;
import com.android.server.ServiceThread;
import com.android.server.SystemService;
+import com.android.server.UiThread;
import com.android.server.Watchdog;
import com.android.server.am.BatteryStatsService;
import com.android.server.lights.Light;
@@ -1940,7 +1941,8 @@
&& mLastUserActivityTimeNoChangeLights >= mLastWakeTime) {
nextTimeout = mLastUserActivityTimeNoChangeLights + screenOffTimeout;
if (now < nextTimeout) {
- if (mDisplayPowerRequest.policy == DisplayPowerRequest.POLICY_BRIGHT) {
+ if (mDisplayPowerRequest.policy == DisplayPowerRequest.POLICY_BRIGHT
+ || mDisplayPowerRequest.policy == DisplayPowerRequest.POLICY_VR) {
mUserActivitySummary = USER_ACTIVITY_SCREEN_BRIGHT;
} else if (mDisplayPowerRequest.policy == DisplayPowerRequest.POLICY_DIM) {
mUserActivitySummary = USER_ACTIVITY_SCREEN_DIM;
@@ -2728,9 +2730,9 @@
};
// ShutdownThread must run on a looper capable of displaying the UI.
- Message msg = Message.obtain(mHandler, runnable);
+ Message msg = Message.obtain(UiThread.getHandler(), runnable);
msg.setAsynchronous(true);
- mHandler.sendMessage(msg);
+ UiThread.getHandler().sendMessage(msg);
// PowerManager.reboot() is documented not to return so just wait for the inevitable.
if (wait) {
@@ -3122,10 +3124,6 @@
if (reason == null) {
reason = "";
}
- if (reason.equals(PowerManager.REBOOT_RECOVERY)
- || reason.equals(PowerManager.REBOOT_RECOVERY_UPDATE)) {
- reason = "recovery";
- }
// If the reason is "quiescent", it means that the boot process should proceed
// without turning on the screen/lights.
@@ -3134,6 +3132,15 @@
if (reason.equals(PowerManager.REBOOT_QUIESCENT)) {
sQuiescent = true;
reason = "";
+ } else if (reason.endsWith("," + PowerManager.REBOOT_QUIESCENT)) {
+ sQuiescent = true;
+ reason = reason.substring(0,
+ reason.length() - PowerManager.REBOOT_QUIESCENT.length() - 1);
+ }
+
+ if (reason.equals(PowerManager.REBOOT_RECOVERY)
+ || reason.equals(PowerManager.REBOOT_RECOVERY_UPDATE)) {
+ reason = "recovery";
}
if (sQuiescent) {
diff --git a/services/core/java/com/android/server/storage/DeviceStorageMonitorService.java b/services/core/java/com/android/server/storage/DeviceStorageMonitorService.java
index fbc9e56..88b6d87 100644
--- a/services/core/java/com/android/server/storage/DeviceStorageMonitorService.java
+++ b/services/core/java/com/android/server/storage/DeviceStorageMonitorService.java
@@ -16,71 +16,60 @@
package com.android.server.storage;
-import android.app.NotificationChannel;
-
-import com.android.internal.messages.nano.SystemMessageProto.SystemMessage;
-import com.android.internal.notification.SystemNotificationChannels;
-import com.android.internal.util.DumpUtils;
-import com.android.server.EventLogTags;
-import com.android.server.SystemService;
-import com.android.server.pm.InstructionSets;
+import android.annotation.WorkerThread;
import android.app.Notification;
+import android.app.NotificationChannel;
import android.app.NotificationManager;
import android.app.PendingIntent;
-import android.content.ContentResolver;
import android.content.Context;
import android.content.Intent;
-import android.content.pm.IPackageDataObserver;
-import android.content.pm.IPackageManager;
import android.content.pm.PackageManager;
+import android.net.TrafficStats;
import android.os.Binder;
import android.os.Environment;
import android.os.FileObserver;
import android.os.Handler;
import android.os.Message;
-import android.os.RemoteException;
import android.os.ResultReceiver;
import android.os.ServiceManager;
import android.os.ShellCallback;
import android.os.ShellCommand;
-import android.os.StatFs;
-import android.os.SystemClock;
-import android.os.SystemProperties;
import android.os.UserHandle;
import android.os.storage.StorageManager;
-import android.provider.Settings;
-import android.text.format.Formatter;
-import android.util.EventLog;
+import android.os.storage.VolumeInfo;
+import android.text.format.DateUtils;
+import android.util.ArrayMap;
import android.util.Slog;
-import android.util.TimeUtils;
-import java.io.File;
-import java.io.FileDescriptor;
-import java.io.PrintWriter;
-import java.util.concurrent.atomic.AtomicInteger;
+import com.android.internal.messages.nano.SystemMessageProto.SystemMessage;
+import com.android.internal.notification.SystemNotificationChannels;
+import com.android.internal.util.DumpUtils;
+import com.android.internal.util.IndentingPrintWriter;
+import com.android.server.EventLogTags;
+import com.android.server.IoThread;
+import com.android.server.SystemService;
+import com.android.server.pm.InstructionSets;
+import com.android.server.pm.PackageManagerService;
import dalvik.system.VMRuntime;
+import java.io.File;
+import java.io.FileDescriptor;
+import java.io.IOException;
+import java.io.PrintWriter;
+import java.util.Objects;
+import java.util.UUID;
+import java.util.concurrent.atomic.AtomicInteger;
+
/**
- * This class implements a service to monitor the amount of disk
- * storage space on the device. If the free storage on device is less
- * than a tunable threshold value (a secure settings parameter;
- * default 10%) a low memory notification is displayed to alert the
- * user. If the user clicks on the low memory notification the
- * Application Manager application gets launched to let the user free
- * storage space.
- *
- * Event log events: A low memory event with the free storage on
- * device in bytes is logged to the event log when the device goes low
- * on storage space. The amount of free storage on the device is
- * periodically logged to the event log. The log interval is a secure
- * settings parameter with a default value of 12 hours. When the free
- * storage differential goes below a threshold (again a secure
- * settings parameter with a default value of 2MB), the free memory is
- * logged to the event log.
+ * Service that monitors and maintains free space on storage volumes.
+ * <p>
+ * As the free space on a volume nears the threshold defined by
+ * {@link StorageManager#getStorageLowBytes(File)}, this service will clear out
+ * cached data to keep the disk from entering this low state.
*/
public class DeviceStorageMonitorService extends SystemService {
- static final String TAG = "DeviceStorageMonitorService";
+ private static final String TAG = "DeviceStorageMonitorService";
/**
* Extra for {@link android.content.Intent#ACTION_BATTERY_CHANGED}:
@@ -88,68 +77,75 @@
*/
public static final String EXTRA_SEQUENCE = "seq";
- // TODO: extend to watch and manage caches on all private volumes
+ private static final int MSG_CHECK = 1;
- static final boolean DEBUG = false;
- static final boolean localLOGV = false;
-
- static final int DEVICE_MEMORY_WHAT = 1;
- static final int FORCE_MEMORY_WHAT = 2;
- private static final int MONITOR_INTERVAL = 1; //in minutes
-
- private static final int DEFAULT_FREE_STORAGE_LOG_INTERVAL_IN_MINUTES = 12*60; //in minutes
- private static final long DEFAULT_DISK_FREE_CHANGE_REPORTING_THRESHOLD = 2 * 1024 * 1024; // 2MB
- private static final long DEFAULT_CHECK_INTERVAL = MONITOR_INTERVAL*60*1000;
+ private static final long DEFAULT_LOG_DELTA_BYTES = 64 * TrafficStats.MB_IN_BYTES;
+ private static final long DEFAULT_CHECK_INTERVAL = DateUtils.MINUTE_IN_MILLIS;
// com.android.internal.R.string.low_internal_storage_view_text_no_boot
// hard codes 250MB in the message as the storage space required for the
// boot image.
- private static final long BOOT_IMAGE_STORAGE_REQUIREMENT = 250 * 1024 * 1024;
+ private static final long BOOT_IMAGE_STORAGE_REQUIREMENT = 250 * TrafficStats.MB_IN_BYTES;
- private long mFreeMem; // on /data
- private long mFreeMemAfterLastCacheClear; // on /data
- private long mLastReportedFreeMem;
- private long mLastReportedFreeMemTime;
- boolean mLowMemFlag=false;
- private boolean mMemFullFlag=false;
- private final boolean mIsBootImageOnDisk;
- private final ContentResolver mResolver;
- private final long mTotalMemory; // on /data
- private final StatFs mDataFileStats;
- private final StatFs mSystemFileStats;
- private final StatFs mCacheFileStats;
+ private NotificationManager mNotifManager;
- private static final File DATA_PATH = Environment.getDataDirectory();
- private static final File SYSTEM_PATH = Environment.getRootDirectory();
- private static final File CACHE_PATH = Environment.getDownloadCacheDirectory();
+ /** Sequence number used for testing */
+ private final AtomicInteger mSeq = new AtomicInteger(1);
+ /** Forced level used for testing */
+ private volatile int mForceLevel = State.LEVEL_UNKNOWN;
- private long mThreadStartTime = -1;
- boolean mUpdatesStopped;
- AtomicInteger mSeq = new AtomicInteger(1);
- boolean mClearSucceeded = false;
- boolean mClearingCache;
- private final Intent mStorageLowIntent;
- private final Intent mStorageOkIntent;
- private final Intent mStorageFullIntent;
- private final Intent mStorageNotFullIntent;
- private CachePackageDataObserver mClearCacheObserver;
+ /** Map from storage volume UUID to internal state */
+ private final ArrayMap<UUID, State> mStates = new ArrayMap<>();
+
+ /**
+ * State for a specific storage volume, including the current "level" that
+ * we've alerted the user and apps about.
+ */
+ private static class State {
+ private static final int LEVEL_UNKNOWN = -1;
+ private static final int LEVEL_NORMAL = 0;
+ private static final int LEVEL_LOW = 1;
+ private static final int LEVEL_FULL = 2;
+
+ /** Last "level" that we alerted about */
+ public int level = LEVEL_NORMAL;
+ /** Last {@link File#getUsableSpace()} that we logged about */
+ public long lastUsableBytes = Long.MAX_VALUE;
+
+ /**
+ * Test if the given level transition is "entering" a specific level.
+ * <p>
+ * As an example, a transition from {@link #LEVEL_NORMAL} to
+ * {@link #LEVEL_FULL} is considered to "enter" both {@link #LEVEL_LOW}
+ * and {@link #LEVEL_FULL}.
+ */
+ private static boolean isEntering(int level, int oldLevel, int newLevel) {
+ return newLevel >= level && (oldLevel < level || oldLevel == LEVEL_UNKNOWN);
+ }
+
+ /**
+ * Test if the given level transition is "leaving" a specific level.
+ * <p>
+ * As an example, a transition from {@link #LEVEL_FULL} to
+ * {@link #LEVEL_NORMAL} is considered to "leave" both
+ * {@link #LEVEL_FULL} and {@link #LEVEL_LOW}.
+ */
+ private static boolean isLeaving(int level, int oldLevel, int newLevel) {
+ return newLevel < level && (oldLevel >= level || oldLevel == LEVEL_UNKNOWN);
+ }
+
+ private static String levelToString(int level) {
+ switch (level) {
+ case State.LEVEL_UNKNOWN: return "UNKNOWN";
+ case State.LEVEL_NORMAL: return "NORMAL";
+ case State.LEVEL_LOW: return "LOW";
+ case State.LEVEL_FULL: return "FULL";
+ default: return Integer.toString(level);
+ }
+ }
+ }
+
private CacheFileDeletedObserver mCacheFileDeletedObserver;
- private static final int _TRUE = 1;
- private static final int _FALSE = 0;
- // This is the raw threshold that has been set at which we consider
- // storage to be low.
- long mMemLowThreshold;
- // This is the threshold at which we start trying to flush caches
- // to get below the low threshold limit. It is less than the low
- // threshold; we will allow storage to get a bit beyond the limit
- // before flushing and checking if we are actually low.
- private long mMemCacheStartTrimThreshold;
- // This is the threshold that we try to get to when deleting cache
- // files. This is greater than the low threshold so that we will flush
- // more files than absolutely needed, to reduce the frequency that
- // flushing takes place.
- private long mMemCacheTrimToThreshold;
- private long mMemFullThreshold;
/**
* This string is used for ServiceManager access to this class.
@@ -159,244 +155,107 @@
private static final String TV_NOTIFICATION_CHANNEL_ID = "devicestoragemonitor.tv";
/**
- * Handler that checks the amount of disk space on the device and sends a
- * notification if the device runs low on disk space
- */
- private final Handler mHandler = new Handler() {
+ * Handler that checks the amount of disk space on the device and sends a
+ * notification if the device runs low on disk space
+ */
+ private final Handler mHandler = new Handler(IoThread.get().getLooper()) {
@Override
public void handleMessage(Message msg) {
- //don't handle an invalid message
switch (msg.what) {
- case DEVICE_MEMORY_WHAT:
- checkMemory(msg.arg1 == _TRUE);
- return;
- case FORCE_MEMORY_WHAT:
- forceMemory(msg.arg1, msg.arg2);
- return;
- default:
- Slog.w(TAG, "Will not process invalid message");
+ case MSG_CHECK:
+ check();
return;
}
}
};
- private class CachePackageDataObserver extends IPackageDataObserver.Stub {
- public void onRemoveCompleted(String packageName, boolean succeeded) {
- mClearSucceeded = succeeded;
- mClearingCache = false;
- if(localLOGV) Slog.i(TAG, " Clear succeeded:"+mClearSucceeded
- +", mClearingCache:"+mClearingCache+" Forcing memory check");
- postCheckMemoryMsg(false, 0);
+ private State findOrCreateState(UUID uuid) {
+ State state = mStates.get(uuid);
+ if (state == null) {
+ state = new State();
+ mStates.put(uuid, state);
}
+ return state;
}
- private void restatDataDir() {
- try {
- mDataFileStats.restat(DATA_PATH.getAbsolutePath());
- mFreeMem = (long) mDataFileStats.getAvailableBlocks() *
- mDataFileStats.getBlockSize();
- } catch (IllegalArgumentException e) {
- // use the old value of mFreeMem
- }
- // Allow freemem to be overridden by debug.freemem for testing
- String debugFreeMem = SystemProperties.get("debug.freemem");
- if (!"".equals(debugFreeMem)) {
- mFreeMem = Long.parseLong(debugFreeMem);
- }
- // Read the log interval from secure settings
- long freeMemLogInterval = Settings.Global.getLong(mResolver,
- Settings.Global.SYS_FREE_STORAGE_LOG_INTERVAL,
- DEFAULT_FREE_STORAGE_LOG_INTERVAL_IN_MINUTES)*60*1000;
- //log the amount of free memory in event log
- long currTime = SystemClock.elapsedRealtime();
- if((mLastReportedFreeMemTime == 0) ||
- (currTime-mLastReportedFreeMemTime) >= freeMemLogInterval) {
- mLastReportedFreeMemTime = currTime;
- long mFreeSystem = -1, mFreeCache = -1;
- try {
- mSystemFileStats.restat(SYSTEM_PATH.getAbsolutePath());
- mFreeSystem = (long) mSystemFileStats.getAvailableBlocks() *
- mSystemFileStats.getBlockSize();
- } catch (IllegalArgumentException e) {
- // ignore; report -1
- }
- try {
- mCacheFileStats.restat(CACHE_PATH.getAbsolutePath());
- mFreeCache = (long) mCacheFileStats.getAvailableBlocks() *
- mCacheFileStats.getBlockSize();
- } catch (IllegalArgumentException e) {
- // ignore; report -1
- }
- EventLog.writeEvent(EventLogTags.FREE_STORAGE_LEFT,
- mFreeMem, mFreeSystem, mFreeCache);
- }
- // Read the reporting threshold from secure settings
- long threshold = Settings.Global.getLong(mResolver,
- Settings.Global.DISK_FREE_CHANGE_REPORTING_THRESHOLD,
- DEFAULT_DISK_FREE_CHANGE_REPORTING_THRESHOLD);
- // If mFree changed significantly log the new value
- long delta = mFreeMem - mLastReportedFreeMem;
- if (delta > threshold || delta < -threshold) {
- mLastReportedFreeMem = mFreeMem;
- EventLog.writeEvent(EventLogTags.FREE_STORAGE_CHANGED, mFreeMem);
- }
- }
+ /**
+ * Core logic that checks the storage state of every mounted private volume.
+ * Since this can do heavy I/O, callers should invoke indirectly using
+ * {@link #MSG_CHECK}.
+ */
+ @WorkerThread
+ private void check() {
+ final StorageManager storage = getContext().getSystemService(StorageManager.class);
+ final int seq = mSeq.get();
- private void clearCache() {
- if (mClearCacheObserver == null) {
- // Lazy instantiation
- mClearCacheObserver = new CachePackageDataObserver();
- }
- mClearingCache = true;
- try {
- if (localLOGV) Slog.i(TAG, "Clearing cache");
- IPackageManager.Stub.asInterface(ServiceManager.getService("package")).
- freeStorageAndNotify(null, mMemCacheTrimToThreshold, mClearCacheObserver);
- } catch (RemoteException e) {
- Slog.w(TAG, "Failed to get handle for PackageManger Exception: "+e);
- mClearingCache = false;
- mClearSucceeded = false;
- }
- }
+ // Check every mounted private volume to see if they're low on space
+ for (VolumeInfo vol : storage.getWritablePrivateVolumes()) {
+ final File file = vol.getPath();
+ final long fullBytes = storage.getStorageFullBytes(file);
+ final long lowBytes = storage.getStorageLowBytes(file);
- void forceMemory(int opts, int seq) {
- if ((opts&OPTION_UPDATES_STOPPED) == 0) {
- if (mUpdatesStopped) {
- mUpdatesStopped = false;
- checkMemory(true);
- }
- } else {
- mUpdatesStopped = true;
- final boolean forceLow = (opts&OPTION_STORAGE_LOW) != 0;
- if (mLowMemFlag != forceLow || (opts&OPTION_FORCE_UPDATE) != 0) {
- mLowMemFlag = forceLow;
- if (forceLow) {
- sendNotification(seq);
- } else {
- cancelNotification(seq);
+ // Automatically trim cached data when nearing the low threshold;
+ // when it's within 150% of the threshold, we try trimming usage
+ // back to 200% of the threshold.
+ if (file.getUsableSpace() < (lowBytes * 3) / 2) {
+ final PackageManagerService pms = (PackageManagerService) ServiceManager
+ .getService("package");
+ try {
+ pms.freeStorage(vol.getFsUuid(), lowBytes * 2, 0);
+ } catch (IOException e) {
+ Slog.w(TAG, e);
}
}
- }
- }
- void checkMemory(boolean checkCache) {
- if (mUpdatesStopped) {
- return;
- }
+ // Send relevant broadcasts and show notifications based on any
+ // recently noticed state transitions.
+ final UUID uuid = StorageManager.convert(vol.getFsUuid());
+ final State state = findOrCreateState(uuid);
+ final long totalBytes = file.getTotalSpace();
+ final long usableBytes = file.getUsableSpace();
- //if the thread that was started to clear cache is still running do nothing till its
- //finished clearing cache. Ideally this flag could be modified by clearCache
- // and should be accessed via a lock but even if it does this test will fail now and
- //hopefully the next time this flag will be set to the correct value.
- if (mClearingCache) {
- if(localLOGV) Slog.i(TAG, "Thread already running just skip");
- //make sure the thread is not hung for too long
- long diffTime = System.currentTimeMillis() - mThreadStartTime;
- if(diffTime > (10*60*1000)) {
- Slog.w(TAG, "Thread that clears cache file seems to run for ever");
- }
- } else {
- restatDataDir();
- if (localLOGV) Slog.v(TAG, "freeMemory="+mFreeMem);
-
- //post intent to NotificationManager to display icon if necessary
- if (mFreeMem < mMemLowThreshold) {
- if (checkCache) {
- // We are allowed to clear cache files at this point to
- // try to get down below the limit, because this is not
- // the initial call after a cache clear has been attempted.
- // In this case we will try a cache clear if our free
- // space has gone below the cache clear limit.
- if (mFreeMem < mMemCacheStartTrimThreshold) {
- // We only clear the cache if the free storage has changed
- // a significant amount since the last time.
- if ((mFreeMemAfterLastCacheClear-mFreeMem)
- >= ((mMemLowThreshold-mMemCacheStartTrimThreshold)/4)) {
- // See if clearing cache helps
- // Note that clearing cache is asynchronous and so we do a
- // memory check again once the cache has been cleared.
- mThreadStartTime = System.currentTimeMillis();
- mClearSucceeded = false;
- clearCache();
- }
- }
- } else {
- // This is a call from after clearing the cache. Note
- // the amount of free storage at this point.
- mFreeMemAfterLastCacheClear = mFreeMem;
- if (!mLowMemFlag) {
- // We tried to clear the cache, but that didn't get us
- // below the low storage limit. Tell the user.
- Slog.i(TAG, "Running low on memory. Sending notification");
- sendNotification(0);
- mLowMemFlag = true;
- } else {
- if (localLOGV) Slog.v(TAG, "Running low on memory " +
- "notification already sent. do nothing");
- }
- }
+ int oldLevel = state.level;
+ int newLevel;
+ if (mForceLevel != State.LEVEL_UNKNOWN) {
+ // When in testing mode, use unknown old level to force sending
+ // of any relevant broadcasts.
+ oldLevel = State.LEVEL_UNKNOWN;
+ newLevel = mForceLevel;
+ } else if (usableBytes <= fullBytes) {
+ newLevel = State.LEVEL_FULL;
+ } else if (usableBytes <= lowBytes) {
+ newLevel = State.LEVEL_LOW;
+ } else if (StorageManager.UUID_DEFAULT.equals(uuid) && !isBootImageOnDisk()
+ && usableBytes < BOOT_IMAGE_STORAGE_REQUIREMENT) {
+ newLevel = State.LEVEL_LOW;
} else {
- mFreeMemAfterLastCacheClear = mFreeMem;
- if (mLowMemFlag) {
- Slog.i(TAG, "Memory available. Cancelling notification");
- cancelNotification(0);
- mLowMemFlag = false;
- }
+ newLevel = State.LEVEL_NORMAL;
}
- if (!mLowMemFlag && !mIsBootImageOnDisk && mFreeMem < BOOT_IMAGE_STORAGE_REQUIREMENT) {
- Slog.i(TAG, "No boot image on disk due to lack of space. Sending notification");
- sendNotification(0);
- mLowMemFlag = true;
- }
- if (mFreeMem < mMemFullThreshold) {
- if (!mMemFullFlag) {
- sendFullNotification();
- mMemFullFlag = true;
- }
- } else {
- if (mMemFullFlag) {
- cancelFullNotification();
- mMemFullFlag = false;
- }
- }
- }
- if(localLOGV) Slog.i(TAG, "Posting Message again");
- //keep posting messages to itself periodically
- postCheckMemoryMsg(true, DEFAULT_CHECK_INTERVAL);
- }
- void postCheckMemoryMsg(boolean clearCache, long delay) {
- // Remove queued messages
- mHandler.removeMessages(DEVICE_MEMORY_WHAT);
- mHandler.sendMessageDelayed(mHandler.obtainMessage(DEVICE_MEMORY_WHAT,
- clearCache ?_TRUE : _FALSE, 0),
- delay);
+ // Log whenever we notice drastic storage changes
+ if ((Math.abs(state.lastUsableBytes - usableBytes) > DEFAULT_LOG_DELTA_BYTES)
+ || oldLevel != newLevel) {
+ EventLogTags.writeStorageState(uuid.toString(), oldLevel, newLevel,
+ usableBytes, totalBytes);
+ state.lastUsableBytes = usableBytes;
+ }
+
+ updateNotifications(vol, oldLevel, newLevel);
+ updateBroadcasts(vol, oldLevel, newLevel, seq);
+
+ state.level = newLevel;
+ }
+
+ // Loop around to check again in future; we don't remove messages since
+ // there might be an immediate request pending.
+ if (!mHandler.hasMessages(MSG_CHECK)) {
+ mHandler.sendMessageDelayed(mHandler.obtainMessage(MSG_CHECK),
+ DEFAULT_CHECK_INTERVAL);
+ }
}
public DeviceStorageMonitorService(Context context) {
super(context);
- mLastReportedFreeMemTime = 0;
- mResolver = context.getContentResolver();
- mIsBootImageOnDisk = isBootImageOnDisk();
- //create StatFs object
- mDataFileStats = new StatFs(DATA_PATH.getAbsolutePath());
- mSystemFileStats = new StatFs(SYSTEM_PATH.getAbsolutePath());
- mCacheFileStats = new StatFs(CACHE_PATH.getAbsolutePath());
- //initialize total storage on device
- mTotalMemory = (long)mDataFileStats.getBlockCount() *
- mDataFileStats.getBlockSize();
- mStorageLowIntent = new Intent(Intent.ACTION_DEVICE_STORAGE_LOW);
- mStorageLowIntent.addFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY_BEFORE_BOOT
- | Intent.FLAG_RECEIVER_INCLUDE_BACKGROUND
- | Intent.FLAG_RECEIVER_VISIBLE_TO_INSTANT_APPS);
- mStorageOkIntent = new Intent(Intent.ACTION_DEVICE_STORAGE_OK);
- mStorageOkIntent.addFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY_BEFORE_BOOT
- | Intent.FLAG_RECEIVER_INCLUDE_BACKGROUND
- | Intent.FLAG_RECEIVER_VISIBLE_TO_INSTANT_APPS);
- mStorageFullIntent = new Intent(Intent.ACTION_DEVICE_STORAGE_FULL);
- mStorageFullIntent.addFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY_BEFORE_BOOT);
- mStorageNotFullIntent = new Intent(Intent.ACTION_DEVICE_STORAGE_NOT_FULL);
- mStorageNotFullIntent.addFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY_BEFORE_BOOT);
}
private static boolean isBootImageOnDisk() {
@@ -408,35 +267,20 @@
return true;
}
- /**
- * Initializes the disk space threshold value and posts an empty message to
- * kickstart the process.
- */
@Override
public void onStart() {
- // cache storage thresholds
- Context context = getContext();
- final StorageManager sm = StorageManager.from(context);
- mMemLowThreshold = sm.getStorageLowBytes(DATA_PATH);
- mMemFullThreshold = sm.getStorageFullBytes(DATA_PATH);
-
- mMemCacheStartTrimThreshold = ((mMemLowThreshold*3)+mMemFullThreshold)/4;
- mMemCacheTrimToThreshold = mMemLowThreshold
- + ((mMemLowThreshold-mMemCacheStartTrimThreshold)*2);
- mFreeMemAfterLastCacheClear = mTotalMemory;
- checkMemory(true);
+ final Context context = getContext();
+ mNotifManager = context.getSystemService(NotificationManager.class);
mCacheFileDeletedObserver = new CacheFileDeletedObserver();
mCacheFileDeletedObserver.startWatching();
// Ensure that the notification channel is set up
- NotificationManager notificationMgr =
- (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
PackageManager packageManager = context.getPackageManager();
boolean isTv = packageManager.hasSystemFeature(PackageManager.FEATURE_LEANBACK);
if (isTv) {
- notificationMgr.createNotificationChannel(new NotificationChannel(
+ mNotifManager.createNotificationChannel(new NotificationChannel(
TV_NOTIFICATION_CHANNEL_ID,
context.getString(
com.android.internal.R.string.device_storage_monitor_notification_channel),
@@ -445,23 +289,29 @@
publishBinderService(SERVICE, mRemoteService);
publishLocalService(DeviceStorageMonitorInternal.class, mLocalService);
+
+ // Kick off pass to examine storage state
+ mHandler.removeMessages(MSG_CHECK);
+ mHandler.obtainMessage(MSG_CHECK).sendToTarget();
}
private final DeviceStorageMonitorInternal mLocalService = new DeviceStorageMonitorInternal() {
@Override
public void checkMemory() {
- // force an early check
- postCheckMemoryMsg(true, 0);
+ // Kick off pass to examine storage state
+ mHandler.removeMessages(MSG_CHECK);
+ mHandler.obtainMessage(MSG_CHECK).sendToTarget();
}
@Override
public boolean isMemoryLow() {
- return mLowMemFlag;
+ return Environment.getDataDirectory().getUsableSpace() < getMemoryLowThreshold();
}
@Override
public long getMemoryLowThreshold() {
- return mMemLowThreshold;
+ return getContext().getSystemService(StorageManager.class)
+ .getStorageLowBytes(Environment.getDataDirectory());
}
};
@@ -494,8 +344,6 @@
}
static final int OPTION_FORCE_UPDATE = 1<<0;
- static final int OPTION_UPDATES_STOPPED = 1<<1;
- static final int OPTION_STORAGE_LOW = 1<<2;
int parseOptions(Shell shell) {
String opt;
@@ -518,10 +366,11 @@
int opts = parseOptions(shell);
getContext().enforceCallingOrSelfPermission(
android.Manifest.permission.DEVICE_POWER, null);
+ mForceLevel = State.LEVEL_LOW;
int seq = mSeq.incrementAndGet();
- mHandler.sendMessage(mHandler.obtainMessage(FORCE_MEMORY_WHAT,
- opts | OPTION_UPDATES_STOPPED | OPTION_STORAGE_LOW, seq));
if ((opts & OPTION_FORCE_UPDATE) != 0) {
+ mHandler.removeMessages(MSG_CHECK);
+ mHandler.obtainMessage(MSG_CHECK).sendToTarget();
pw.println(seq);
}
} break;
@@ -529,10 +378,11 @@
int opts = parseOptions(shell);
getContext().enforceCallingOrSelfPermission(
android.Manifest.permission.DEVICE_POWER, null);
+ mForceLevel = State.LEVEL_NORMAL;
int seq = mSeq.incrementAndGet();
- mHandler.sendMessage(mHandler.obtainMessage(FORCE_MEMORY_WHAT,
- opts | OPTION_UPDATES_STOPPED, seq));
if ((opts & OPTION_FORCE_UPDATE) != 0) {
+ mHandler.removeMessages(MSG_CHECK);
+ mHandler.obtainMessage(MSG_CHECK).sendToTarget();
pw.println(seq);
}
} break;
@@ -540,10 +390,11 @@
int opts = parseOptions(shell);
getContext().enforceCallingOrSelfPermission(
android.Manifest.permission.DEVICE_POWER, null);
+ mForceLevel = State.LEVEL_UNKNOWN;
int seq = mSeq.incrementAndGet();
- mHandler.sendMessage(mHandler.obtainMessage(FORCE_MEMORY_WHAT,
- opts, seq));
if ((opts & OPTION_FORCE_UPDATE) != 0) {
+ mHandler.removeMessages(MSG_CHECK);
+ mHandler.obtainMessage(MSG_CHECK).sendToTarget();
pw.println(seq);
}
} break;
@@ -568,145 +419,125 @@
pw.println(" -f: force a storage change broadcast be sent, prints new sequence.");
}
- void dumpImpl(FileDescriptor fd, PrintWriter pw, String[] args) {
+ void dumpImpl(FileDescriptor fd, PrintWriter _pw, String[] args) {
+ final IndentingPrintWriter pw = new IndentingPrintWriter(_pw, " ");
if (args == null || args.length == 0 || "-a".equals(args[0])) {
- final Context context = getContext();
-
- pw.println("Current DeviceStorageMonitor state:");
-
- pw.print(" mFreeMem=");
- pw.print(Formatter.formatFileSize(context, mFreeMem));
- pw.print(" mTotalMemory=");
- pw.println(Formatter.formatFileSize(context, mTotalMemory));
-
- pw.print(" mFreeMemAfterLastCacheClear=");
- pw.println(Formatter.formatFileSize(context, mFreeMemAfterLastCacheClear));
-
- pw.print(" mLastReportedFreeMem=");
- pw.print(Formatter.formatFileSize(context, mLastReportedFreeMem));
- pw.print(" mLastReportedFreeMemTime=");
- TimeUtils.formatDuration(mLastReportedFreeMemTime, SystemClock.elapsedRealtime(), pw);
+ pw.println("Known volumes:");
+ pw.increaseIndent();
+ for (int i = 0; i < mStates.size(); i++) {
+ final UUID uuid = mStates.keyAt(i);
+ final State state = mStates.valueAt(i);
+ if (StorageManager.UUID_DEFAULT.equals(uuid)) {
+ pw.println("Default:");
+ } else {
+ pw.println(uuid + ":");
+ }
+ pw.increaseIndent();
+ pw.printPair("level", State.levelToString(state.level));
+ pw.printPair("lastUsableBytes", state.lastUsableBytes);
+ pw.println();
+ pw.decreaseIndent();
+ }
+ pw.decreaseIndent();
pw.println();
- if (mUpdatesStopped) {
- pw.print(" mUpdatesStopped=");
- pw.print(mUpdatesStopped);
- pw.print(" mSeq=");
- pw.println(mSeq.get());
- } else {
- pw.print(" mClearSucceeded=");
- pw.print(mClearSucceeded);
- pw.print(" mClearingCache=");
- pw.println(mClearingCache);
- }
+ pw.printPair("mSeq", mSeq.get());
+ pw.printPair("mForceState", State.levelToString(mForceLevel));
+ pw.println();
+ pw.println();
- pw.print(" mLowMemFlag=");
- pw.print(mLowMemFlag);
- pw.print(" mMemFullFlag=");
- pw.println(mMemFullFlag);
-
- pw.print(" mMemLowThreshold=");
- pw.print(Formatter.formatFileSize(context, mMemLowThreshold));
- pw.print(" mMemFullThreshold=");
- pw.println(Formatter.formatFileSize(context, mMemFullThreshold));
-
- pw.print(" mMemCacheStartTrimThreshold=");
- pw.print(Formatter.formatFileSize(context, mMemCacheStartTrimThreshold));
- pw.print(" mMemCacheTrimToThreshold=");
- pw.println(Formatter.formatFileSize(context, mMemCacheTrimToThreshold));
-
- pw.print(" mIsBootImageOnDisk="); pw.println(mIsBootImageOnDisk);
} else {
Shell shell = new Shell();
shell.exec(mRemoteService, null, fd, null, args, null, new ResultReceiver(null));
}
}
- /**
- * This method sends a notification to NotificationManager to display
- * an error dialog indicating low disk space and launch the Installer
- * application
- */
- private void sendNotification(int seq) {
+ private void updateNotifications(VolumeInfo vol, int oldLevel, int newLevel) {
final Context context = getContext();
- if(localLOGV) Slog.i(TAG, "Sending low memory notification");
- //log the event to event log with the amount of free storage(in bytes) left on the device
- EventLog.writeEvent(EventLogTags.LOW_STORAGE, mFreeMem);
- // Pack up the values and broadcast them to everyone
- Intent lowMemIntent = new Intent(StorageManager.ACTION_MANAGE_STORAGE);
- lowMemIntent.putExtra("memory", mFreeMem);
- lowMemIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
- NotificationManager notificationMgr =
- (NotificationManager)context.getSystemService(
- Context.NOTIFICATION_SERVICE);
- CharSequence title = context.getText(
- com.android.internal.R.string.low_internal_storage_view_title);
- CharSequence details = context.getText(mIsBootImageOnDisk
- ? com.android.internal.R.string.low_internal_storage_view_text
- : com.android.internal.R.string.low_internal_storage_view_text_no_boot);
- PendingIntent intent = PendingIntent.getActivityAsUser(context, 0, lowMemIntent, 0,
- null, UserHandle.CURRENT);
- Notification notification =
- new Notification.Builder(context, SystemNotificationChannels.ALERTS)
- .setSmallIcon(com.android.internal.R.drawable.stat_notify_disk_full)
- .setTicker(title)
- .setColor(context.getColor(
- com.android.internal.R.color.system_notification_accent_color))
- .setContentTitle(title)
- .setContentText(details)
- .setContentIntent(intent)
- .setStyle(new Notification.BigTextStyle()
- .bigText(details))
- .setVisibility(Notification.VISIBILITY_PUBLIC)
- .setCategory(Notification.CATEGORY_SYSTEM)
- .extend(new Notification.TvExtender()
- .setChannelId(TV_NOTIFICATION_CHANNEL_ID))
- .build();
- notification.flags |= Notification.FLAG_NO_CLEAR;
- notificationMgr.notifyAsUser(null, SystemMessage.NOTE_LOW_STORAGE, notification,
- UserHandle.ALL);
- Intent broadcast = new Intent(mStorageLowIntent);
- if (seq != 0) {
- broadcast.putExtra(EXTRA_SEQUENCE, seq);
+ final UUID uuid = StorageManager.convert(vol.getFsUuid());
+
+ if (State.isEntering(State.LEVEL_LOW, oldLevel, newLevel)) {
+ Intent lowMemIntent = new Intent(StorageManager.ACTION_MANAGE_STORAGE);
+ lowMemIntent.putExtra(StorageManager.EXTRA_UUID, uuid);
+ lowMemIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
+
+ final CharSequence title = context.getText(
+ com.android.internal.R.string.low_internal_storage_view_title);
+
+ final CharSequence details;
+ if (StorageManager.UUID_DEFAULT.equals(uuid)) {
+ details = context.getText(isBootImageOnDisk()
+ ? com.android.internal.R.string.low_internal_storage_view_text
+ : com.android.internal.R.string.low_internal_storage_view_text_no_boot);
+ } else {
+ details = context.getText(
+ com.android.internal.R.string.low_internal_storage_view_text);
+ }
+
+ PendingIntent intent = PendingIntent.getActivityAsUser(context, 0, lowMemIntent, 0,
+ null, UserHandle.CURRENT);
+ Notification notification =
+ new Notification.Builder(context, SystemNotificationChannels.ALERTS)
+ .setSmallIcon(com.android.internal.R.drawable.stat_notify_disk_full)
+ .setTicker(title)
+ .setColor(context.getColor(
+ com.android.internal.R.color.system_notification_accent_color))
+ .setContentTitle(title)
+ .setContentText(details)
+ .setContentIntent(intent)
+ .setStyle(new Notification.BigTextStyle()
+ .bigText(details))
+ .setVisibility(Notification.VISIBILITY_PUBLIC)
+ .setCategory(Notification.CATEGORY_SYSTEM)
+ .extend(new Notification.TvExtender()
+ .setChannelId(TV_NOTIFICATION_CHANNEL_ID))
+ .build();
+ notification.flags |= Notification.FLAG_NO_CLEAR;
+ mNotifManager.notifyAsUser(uuid.toString(), SystemMessage.NOTE_LOW_STORAGE,
+ notification, UserHandle.ALL);
+ } else if (State.isLeaving(State.LEVEL_LOW, oldLevel, newLevel)) {
+ mNotifManager.cancelAsUser(uuid.toString(), SystemMessage.NOTE_LOW_STORAGE,
+ UserHandle.ALL);
}
- context.sendStickyBroadcastAsUser(broadcast, UserHandle.ALL);
}
- /**
- * Cancels low storage notification and sends OK intent.
- */
- private void cancelNotification(int seq) {
- final Context context = getContext();
- if(localLOGV) Slog.i(TAG, "Canceling low memory notification");
- NotificationManager mNotificationMgr =
- (NotificationManager)context.getSystemService(
- Context.NOTIFICATION_SERVICE);
- //cancel notification since memory has been freed
- mNotificationMgr.cancelAsUser(null, SystemMessage.NOTE_LOW_STORAGE, UserHandle.ALL);
-
- context.removeStickyBroadcastAsUser(mStorageLowIntent, UserHandle.ALL);
- Intent broadcast = new Intent(mStorageOkIntent);
- if (seq != 0) {
- broadcast.putExtra(EXTRA_SEQUENCE, seq);
+ private void updateBroadcasts(VolumeInfo vol, int oldLevel, int newLevel, int seq) {
+ if (!Objects.equals(StorageManager.UUID_PRIVATE_INTERNAL, vol.getFsUuid())) {
+ // We don't currently send broadcasts for secondary volumes
+ return;
}
- context.sendBroadcastAsUser(broadcast, UserHandle.ALL);
- }
- /**
- * Send a notification when storage is full.
- */
- private void sendFullNotification() {
- if(localLOGV) Slog.i(TAG, "Sending memory full notification");
- getContext().sendStickyBroadcastAsUser(mStorageFullIntent, UserHandle.ALL);
- }
+ final Intent lowIntent = new Intent(Intent.ACTION_DEVICE_STORAGE_LOW)
+ .addFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY_BEFORE_BOOT
+ | Intent.FLAG_RECEIVER_INCLUDE_BACKGROUND
+ | Intent.FLAG_RECEIVER_VISIBLE_TO_INSTANT_APPS)
+ .putExtra(EXTRA_SEQUENCE, seq);
+ final Intent notLowIntent = new Intent(Intent.ACTION_DEVICE_STORAGE_OK)
+ .addFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY_BEFORE_BOOT
+ | Intent.FLAG_RECEIVER_INCLUDE_BACKGROUND
+ | Intent.FLAG_RECEIVER_VISIBLE_TO_INSTANT_APPS)
+ .putExtra(EXTRA_SEQUENCE, seq);
- /**
- * Cancels memory full notification and sends "not full" intent.
- */
- private void cancelFullNotification() {
- if(localLOGV) Slog.i(TAG, "Canceling memory full notification");
- getContext().removeStickyBroadcastAsUser(mStorageFullIntent, UserHandle.ALL);
- getContext().sendBroadcastAsUser(mStorageNotFullIntent, UserHandle.ALL);
+ if (State.isEntering(State.LEVEL_LOW, oldLevel, newLevel)) {
+ getContext().sendStickyBroadcastAsUser(lowIntent, UserHandle.ALL);
+ } else if (State.isLeaving(State.LEVEL_LOW, oldLevel, newLevel)) {
+ getContext().removeStickyBroadcastAsUser(lowIntent, UserHandle.ALL);
+ getContext().sendBroadcastAsUser(notLowIntent, UserHandle.ALL);
+ }
+
+ final Intent fullIntent = new Intent(Intent.ACTION_DEVICE_STORAGE_FULL)
+ .addFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY_BEFORE_BOOT)
+ .putExtra(EXTRA_SEQUENCE, seq);
+ final Intent notFullIntent = new Intent(Intent.ACTION_DEVICE_STORAGE_NOT_FULL)
+ .addFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY_BEFORE_BOOT)
+ .putExtra(EXTRA_SEQUENCE, seq);
+
+ if (State.isEntering(State.LEVEL_FULL, oldLevel, newLevel)) {
+ getContext().sendStickyBroadcastAsUser(fullIntent, UserHandle.ALL);
+ } else if (State.isLeaving(State.LEVEL_FULL, oldLevel, newLevel)) {
+ getContext().removeStickyBroadcastAsUser(fullIntent, UserHandle.ALL);
+ getContext().sendBroadcastAsUser(notFullIntent, UserHandle.ALL);
+ }
}
private static class CacheFileDeletedObserver extends FileObserver {
diff --git a/services/core/java/com/android/server/storage/FileCollector.java b/services/core/java/com/android/server/storage/FileCollector.java
index 0c119a7..96e3584 100644
--- a/services/core/java/com/android/server/storage/FileCollector.java
+++ b/services/core/java/com/android/server/storage/FileCollector.java
@@ -203,7 +203,13 @@
return 0;
}
- final long sharedDataSize = shared.getPath().getTotalSpace();
+ // In some cases, the path may be null -- we can't determine the size in this case.
+ final File sharedPath = shared.getPath();
+ if (sharedPath == null) {
+ return 0;
+ }
+
+ final long sharedDataSize = sharedPath.getTotalSpace();
long systemSize = sm.getPrimaryStorageSize() - sharedDataSize;
// This case is not exceptional -- we just fallback to the shared data volume in this case.
diff --git a/services/core/java/com/android/server/trust/TrustManagerService.java b/services/core/java/com/android/server/trust/TrustManagerService.java
index 8e06a51..e12dc1d 100644
--- a/services/core/java/com/android/server/trust/TrustManagerService.java
+++ b/services/core/java/com/android/server/trust/TrustManagerService.java
@@ -795,6 +795,10 @@
// coalesce refresh messages.
mHandler.removeMessages(MSG_KEYGUARD_SHOWING_CHANGED);
mHandler.sendEmptyMessage(MSG_KEYGUARD_SHOWING_CHANGED);
+
+ // Make sure handler processes the message before returning, such that isDeviceLocked
+ // after this call will retrieve the correct value.
+ mHandler.runWithScissors(() -> {}, 0);
}
@Override
diff --git a/services/core/java/com/android/server/vr/VrManagerService.java b/services/core/java/com/android/server/vr/VrManagerService.java
index 4044fdb..b937f9d 100644
--- a/services/core/java/com/android/server/vr/VrManagerService.java
+++ b/services/core/java/com/android/server/vr/VrManagerService.java
@@ -96,6 +96,7 @@
public class VrManagerService extends SystemService implements EnabledComponentChangeListener{
public static final String TAG = "VrManagerService";
+ static final boolean DBG = false;
private static final int PENDING_STATE_DELAY_MS = 300;
private static final int EVENT_LOG_SIZE = 32;
@@ -157,7 +158,7 @@
private void setVrModeAllowedLocked(boolean allowed) {
if (mVrModeAllowed != allowed) {
mVrModeAllowed = allowed;
- Slog.i(TAG, "VR mode is " + ((allowed) ? "allowed" : "disallowed"));
+ if (DBG) Slog.d(TAG, "VR mode is " + ((allowed) ? "allowed" : "disallowed"));
if (mVrModeAllowed) {
consumeAndApplyPendingStateLocked();
} else {
diff --git a/services/core/java/com/android/server/wm/AlertWindowNotification.java b/services/core/java/com/android/server/wm/AlertWindowNotification.java
index 50b1520..972623c 100644
--- a/services/core/java/com/android/server/wm/AlertWindowNotification.java
+++ b/services/core/java/com/android/server/wm/AlertWindowNotification.java
@@ -16,14 +16,15 @@
package com.android.server.wm;
+import static android.app.NotificationManager.IMPORTANCE_MIN;
import static android.app.PendingIntent.FLAG_CANCEL_CURRENT;
import static android.content.Context.NOTIFICATION_SERVICE;
import static android.content.Intent.FLAG_ACTIVITY_CLEAR_TASK;
import static android.content.Intent.FLAG_ACTIVITY_NEW_TASK;
import static android.provider.Settings.ACTION_MANAGE_OVERLAY_PERMISSION;
-import static com.android.internal.notification.SystemNotificationChannels.ALERT_WINDOW;
import android.app.Notification;
+import android.app.NotificationChannel;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.content.Context;
@@ -40,7 +41,7 @@
/** Displays an ongoing notification for a process displaying an alert window */
class AlertWindowNotification {
- private static final String TAG_PREFIX = "com.android.server.wm.AlertWindowNotification: ";
+ private static final String CHANNEL_PREFIX = "com.android.server.wm.AlertWindowNotification - ";
private static final int NOTIFICATION_ID = 0;
private static int sNextRequestCode = 0;
@@ -57,7 +58,7 @@
mPackageName = packageName;
mNotificationManager =
(NotificationManager) mService.mContext.getSystemService(NOTIFICATION_SERVICE);
- mNotificationTag = TAG_PREFIX + mPackageName;
+ mNotificationTag = CHANNEL_PREFIX + mPackageName;
mRequestCode = sNextRequestCode++;
mIconUtilities = new IconUtilities(mService.mContext);
}
@@ -99,9 +100,11 @@
final String appName = (aInfo != null)
? pm.getApplicationLabel(aInfo).toString() : mPackageName;
+ createNotificationChannel(context, appName);
+
final String message = context.getString(R.string.alert_windows_notification_message,
appName);
- final Notification.Builder builder = new Notification.Builder(context, ALERT_WINDOW)
+ final Notification.Builder builder = new Notification.Builder(context, mNotificationTag)
.setOngoing(true)
.setContentTitle(
context.getString(R.string.alert_windows_notification_title, appName))
@@ -131,6 +134,18 @@
return PendingIntent.getActivity(context, mRequestCode, intent, FLAG_CANCEL_CURRENT);
}
+ private void createNotificationChannel(Context context, String appName) {
+ final String nameChannel =
+ context.getString(R.string.alert_windows_notification_channel_name, appName);
+ final NotificationChannel channel =
+ new NotificationChannel(mNotificationTag, nameChannel, IMPORTANCE_MIN);
+ channel.enableLights(false);
+ channel.enableVibration(false);
+ channel.setBlockableSystem(true);
+ mNotificationManager.createNotificationChannel(channel);
+ }
+
+
private ApplicationInfo getApplicationInfo(PackageManager pm, String packageName) {
try {
return pm.getApplicationInfo(packageName, 0);
diff --git a/services/core/java/com/android/server/wm/AppTransition.java b/services/core/java/com/android/server/wm/AppTransition.java
index a38addb..9d8f124 100644
--- a/services/core/java/com/android/server/wm/AppTransition.java
+++ b/services/core/java/com/android/server/wm/AppTransition.java
@@ -52,6 +52,7 @@
import android.content.Context;
import android.content.res.Configuration;
import android.graphics.Bitmap;
+import android.graphics.GraphicBuffer;
import android.graphics.Path;
import android.graphics.Rect;
import android.os.Binder;
@@ -346,12 +347,12 @@
mAppTransitionState = APP_STATE_TIMEOUT;
}
- Bitmap getAppTransitionThumbnailHeader(int taskId) {
+ GraphicBuffer getAppTransitionThumbnailHeader(int taskId) {
AppTransitionAnimationSpec spec = mNextAppTransitionAnimationsSpecs.get(taskId);
if (spec == null) {
spec = mDefaultNextAppTransitionAnimationSpec;
}
- return spec != null ? spec.bitmap : null;
+ return spec != null ? spec.buffer : null;
}
/** Returns whether the next thumbnail transition is aspect scaled up. */
@@ -716,9 +717,9 @@
}
private void putDefaultNextAppTransitionCoordinates(int left, int top, int width, int height,
- Bitmap bitmap) {
+ GraphicBuffer buffer) {
mDefaultNextAppTransitionAnimationSpec = new AppTransitionAnimationSpec(-1 /* taskId */,
- bitmap, new Rect(left, top, left + width, top + height));
+ buffer, new Rect(left, top, left + width, top + height));
}
/**
@@ -943,7 +944,7 @@
* when a thumbnail is specified with the pending animation override.
*/
Animation createThumbnailAspectScaleAnimationLocked(Rect appRect, @Nullable Rect contentInsets,
- Bitmap thumbnailHeader, final int taskId, int uiMode, int orientation) {
+ GraphicBuffer thumbnailHeader, final int taskId, int uiMode, int orientation) {
Animation a;
final int thumbWidthI = thumbnailHeader.getWidth();
final float thumbWidth = thumbWidthI > 0 ? thumbWidthI : 1;
@@ -1296,7 +1297,7 @@
* when a thumbnail is specified with the pending animation override.
*/
Animation createThumbnailScaleAnimationLocked(int appWidth, int appHeight, int transit,
- Bitmap thumbnailHeader) {
+ GraphicBuffer thumbnailHeader) {
Animation a;
getDefaultNextAppTransitionStartRect(mTmpRect);
final int thumbWidthI = thumbnailHeader.getWidth();
@@ -1341,7 +1342,7 @@
int transit, int taskId) {
final int appWidth = containingFrame.width();
final int appHeight = containingFrame.height();
- Bitmap thumbnailHeader = getAppTransitionThumbnailHeader(taskId);
+ final GraphicBuffer thumbnailHeader = getAppTransitionThumbnailHeader(taskId);
Animation a;
getDefaultNextAppTransitionStartRect(mTmpRect);
final int thumbWidthI = thumbnailHeader != null ? thumbnailHeader.getWidth() : appWidth;
@@ -1714,7 +1715,7 @@
}
}
- void overridePendingAppTransitionThumb(Bitmap srcThumb, int startX, int startY,
+ void overridePendingAppTransitionThumb(GraphicBuffer srcThumb, int startX, int startY,
IRemoteCallback startedCallback, boolean scaleUp) {
if (isTransitionSet()) {
clear();
@@ -1729,7 +1730,7 @@
}
}
- void overridePendingAppTransitionAspectScaledThumb(Bitmap srcThumb, int startX, int startY,
+ void overridePendingAppTransitionAspectScaledThumb(GraphicBuffer srcThumb, int startX, int startY,
int targetWidth, int targetHeight, IRemoteCallback startedCallback, boolean scaleUp) {
if (isTransitionSet()) {
clear();
@@ -1763,7 +1764,7 @@
// to be set.
Rect rect = spec.rect;
putDefaultNextAppTransitionCoordinates(rect.left, rect.top,
- rect.width(), rect.height(), spec.bitmap);
+ rect.width(), rect.height(), spec.buffer);
}
}
}
diff --git a/services/core/java/com/android/server/wm/AppWindowAnimator.java b/services/core/java/com/android/server/wm/AppWindowAnimator.java
index 65e3ec0..f769261 100644
--- a/services/core/java/com/android/server/wm/AppWindowAnimator.java
+++ b/services/core/java/com/android/server/wm/AppWindowAnimator.java
@@ -78,6 +78,9 @@
// requires that the duration of the two animations are the same.
SurfaceControl thumbnail;
int thumbnailTransactionSeq;
+ // TODO(b/62029108): combine both members into a private one. Create a member function to set
+ // the thumbnail layer to +1 to the highest layer position and replace all setter instances
+ // with this function. Remove all unnecessary calls to both variables in other classes.
int thumbnailLayer;
int thumbnailForceAboveLayer;
Animation thumbnailAnimation;
diff --git a/services/core/java/com/android/server/wm/AppWindowContainerController.java b/services/core/java/com/android/server/wm/AppWindowContainerController.java
index c982f08..1a685eb 100644
--- a/services/core/java/com/android/server/wm/AppWindowContainerController.java
+++ b/services/core/java/com/android/server/wm/AppWindowContainerController.java
@@ -107,7 +107,7 @@
if (DEBUG_STARTING_WINDOW) Slog.v(TAG_WM, "Remove starting " + mContainer
+ ": startingWindow=" + mContainer.startingWindow
+ " startingView=" + mContainer.startingSurface);
- if (mContainer.startingWindow != null) {
+ if (mContainer.startingData != null) {
surface = mContainer.startingSurface;
mContainer.startingData = null;
mContainer.startingSurface = null;
@@ -164,18 +164,16 @@
if (surface != null) {
boolean abort = false;
synchronized(mWindowMap) {
+ // If the window was successfully added, then
+ // we need to remove it.
if (container.removed || container.startingData == null) {
- // If the window was successfully added, then
- // we need to remove it.
- if (container.startingWindow != null) {
- if (DEBUG_STARTING_WINDOW) Slog.v(TAG_WM,
- "Aborted starting " + container
- + ": removed=" + container.removed
- + " startingData=" + container.startingData);
- container.startingWindow = null;
- container.startingData = null;
- abort = true;
- }
+ if (DEBUG_STARTING_WINDOW) Slog.v(TAG_WM,
+ "Aborted starting " + container
+ + ": removed=" + container.removed
+ + " startingData=" + container.startingData);
+ container.startingWindow = null;
+ container.startingData = null;
+ abort = true;
} else {
container.startingSurface = surface;
}
@@ -348,6 +346,24 @@
final AppWindowToken wtoken = mContainer;
+ // Don't set visibility to false if we were already not visible. This prevents WM from
+ // adding the app to the closing app list which doesn't make sense for something that is
+ // already not visible. However, set visibility to true even if we are already visible.
+ // This makes sure the app is added to the opening apps list so that the right
+ // transition can be selected.
+ // TODO: Probably a good idea to separate the concept of opening/closing apps from the
+ // concept of setting visibility...
+ if (!visible && wtoken.hiddenRequested) {
+
+ if (!deferHidingClient && wtoken.mDeferHidingClient) {
+ // We previously deferred telling the client to hide itself when visibility was
+ // initially set to false. Now we would like it to hide, so go ahead and set it.
+ wtoken.mDeferHidingClient = deferHidingClient;
+ wtoken.setClientHidden(true);
+ }
+ return;
+ }
+
if (DEBUG_APP_TRANSITIONS || DEBUG_ORIENTATION) Slog.v(TAG_WM, "setAppVisibility("
+ mToken + ", visible=" + visible + "): " + mService.mAppTransition
+ " hidden=" + wtoken.hidden + " hiddenRequested="
diff --git a/services/core/java/com/android/server/wm/AppWindowToken.java b/services/core/java/com/android/server/wm/AppWindowToken.java
index 17db253..37ebfd3 100644
--- a/services/core/java/com/android/server/wm/AppWindowToken.java
+++ b/services/core/java/com/android/server/wm/AppWindowToken.java
@@ -17,6 +17,7 @@
package com.android.server.wm;
import static android.app.ActivityManager.StackId;
+import static android.app.ActivityManager.StackId.PINNED_STACK_ID;
import static android.content.pm.ActivityInfo.CONFIG_ORIENTATION;
import static android.content.pm.ActivityInfo.CONFIG_SCREEN_SIZE;
import static android.content.pm.ActivityInfo.SCREEN_ORIENTATION_BEHIND;
@@ -51,6 +52,7 @@
import android.annotation.NonNull;
import android.app.Activity;
+import android.app.ActivityManager;
import android.content.res.Configuration;
import android.graphics.Rect;
import android.os.Binder;
@@ -341,7 +343,9 @@
boolean delayed = false;
inPendingTransaction = false;
-
+ // Reset the state of mHiddenSetFromTransferredStartingWindow since visibility is actually
+ // been set by the app now.
+ mHiddenSetFromTransferredStartingWindow = false;
setClientHidden(!visible);
// Allow for state changes and animation to be applied if:
@@ -911,7 +915,11 @@
}
if (mPendingRelaunchCount > 0) {
mPendingRelaunchCount--;
+ } else {
+ // Update keyguard flags upon finishing relaunch.
+ checkKeyguardFlagsChanged();
}
+
updateAllDrawn();
}
@@ -1343,9 +1351,11 @@
}
mService.mH.obtainMessage(NOTIFY_ACTIVITY_DRAWN, token).sendToTarget();
- final TaskStack s = getStack();
- if (s != null) {
- s.onAllWindowsDrawn();
+ // Notify the pinned stack upon all windows drawn. If there was an animation in
+ // progress then this signal will resume that animation.
+ final TaskStack pinnedStack = mDisplayContent.getStackById(PINNED_STACK_ID);
+ if (pinnedStack != null) {
+ pinnedStack.onAllWindowsDrawn();
}
}
}
@@ -1499,6 +1509,12 @@
}
boolean containsDismissKeyguardWindow() {
+ // Window state is transient during relaunch. We are not guaranteed to be frozen during the
+ // entirety of the relaunch.
+ if (isRelaunching()) {
+ return mLastContainsDismissKeyguardWindow;
+ }
+
for (int i = mChildren.size() - 1; i >= 0; i--) {
if ((mChildren.get(i).mAttrs.flags & FLAG_DISMISS_KEYGUARD) != 0) {
return true;
@@ -1508,11 +1524,19 @@
}
boolean containsShowWhenLockedWindow() {
+ // When we are relaunching, it is possible for us to be unfrozen before our previous
+ // windows have been added back. Using the cached value ensures that our previous
+ // showWhenLocked preference is honored until relaunching is complete.
+ if (isRelaunching()) {
+ return mLastContainsShowWhenLockedWindow;
+ }
+
for (int i = mChildren.size() - 1; i >= 0; i--) {
if ((mChildren.get(i).mAttrs.flags & FLAG_SHOW_WHEN_LOCKED) != 0) {
return true;
}
}
+
return false;
}
diff --git a/services/core/java/com/android/server/wm/BoundsAnimationController.java b/services/core/java/com/android/server/wm/BoundsAnimationController.java
index 7f3c89c..410efcd 100644
--- a/services/core/java/com/android/server/wm/BoundsAnimationController.java
+++ b/services/core/java/com/android/server/wm/BoundsAnimationController.java
@@ -139,8 +139,14 @@
private final boolean mSkipAnimationStart;
// True if this animation was canceled by the user, not as a part of a replacing animation
private boolean mSkipAnimationEnd;
+
+ // True if the animation target is animating from the fullscreen. Only one of
+ // {@link mMoveToFullscreen} or {@link mMoveFromFullscreen} can be true at any time in the
+ // animation.
+ private boolean mMoveFromFullscreen;
// True if the animation target should be moved to the fullscreen stack at the end of this
- // animation
+ // animation. Only one of {@link mMoveToFullscreen} or {@link mMoveFromFullscreen} can be
+ // true at any time in the animation.
private boolean mMoveToFullscreen;
// Whether to schedule PiP mode changes on animation start/end
@@ -151,15 +157,21 @@
private final int mFrozenTaskWidth;
private final int mFrozenTaskHeight;
+ // Timeout callback to ensure we continue the animation if waiting for resuming or app
+ // windows drawn fails
+ private final Runnable mResumeRunnable = () -> resume();
+
BoundsAnimator(BoundsAnimationTarget target, Rect from, Rect to,
@SchedulePipModeChangedState int schedulePipModeChangedState,
- boolean moveToFullscreen, boolean replacingExistingAnimation) {
+ boolean moveFromFullscreen, boolean moveToFullscreen,
+ boolean replacingExistingAnimation) {
super();
mTarget = target;
mFrom.set(from);
mTo.set(to);
mSkipAnimationStart = replacingExistingAnimation;
mSchedulePipModeChangedState = schedulePipModeChangedState;
+ mMoveFromFullscreen = moveFromFullscreen;
mMoveToFullscreen = moveToFullscreen;
addUpdateListener(this);
addListener(this);
@@ -177,13 +189,6 @@
}
}
- final Runnable mResumeRunnable = new Runnable() {
- @Override
- public void run() {
- resume();
- }
- };
-
@Override
public void onAnimationStart(Animator animation) {
if (DEBUG) Slog.d(TAG, "onAnimationStart: mTarget=" + mTarget
@@ -199,6 +204,12 @@
if (!mSkipAnimationStart) {
mTarget.onAnimationStart(mSchedulePipModeChangedState ==
SCHEDULE_PIP_MODE_CHANGED_ON_START);
+
+ // When starting an animation from fullscreen, pause here and wait for the
+ // windows-drawn signal before we start the rest of the transition down into PiP.
+ if (mMoveFromFullscreen) {
+ pause();
+ }
}
// Immediately update the task bounds if they have to become larger, but preserve
@@ -213,13 +224,20 @@
// correct logic to make this resize seamless.
if (mMoveToFullscreen) {
pause();
- mHandler.postDelayed(mResumeRunnable, WAIT_FOR_DRAW_TIMEOUT_MS);
}
}
}
@Override
+ public void pause() {
+ if (DEBUG) Slog.d(TAG, "pause: waiting for windows drawn");
+ super.pause();
+ mHandler.postDelayed(mResumeRunnable, WAIT_FOR_DRAW_TIMEOUT_MS);
+ }
+
+ @Override
public void resume() {
+ if (DEBUG) Slog.d(TAG, "resume:");
mHandler.removeCallbacks(mResumeRunnable);
super.resume();
}
@@ -336,15 +354,15 @@
public void animateBounds(final BoundsAnimationTarget target, Rect from, Rect to,
int animationDuration, @SchedulePipModeChangedState int schedulePipModeChangedState,
- boolean moveToFullscreen) {
+ boolean moveFromFullscreen, boolean moveToFullscreen) {
animateBoundsImpl(target, from, to, animationDuration, schedulePipModeChangedState,
- moveToFullscreen);
+ moveFromFullscreen, moveToFullscreen);
}
@VisibleForTesting
BoundsAnimator animateBoundsImpl(final BoundsAnimationTarget target, Rect from, Rect to,
int animationDuration, @SchedulePipModeChangedState int schedulePipModeChangedState,
- boolean moveToFullscreen) {
+ boolean moveFromFullscreen, boolean moveToFullscreen) {
final BoundsAnimator existing = mRunningAnimations.get(target);
final boolean replacing = existing != null;
@@ -387,7 +405,7 @@
existing.cancel();
}
final BoundsAnimator animator = new BoundsAnimator(target, from, to,
- schedulePipModeChangedState, moveToFullscreen, replacing);
+ schedulePipModeChangedState, moveFromFullscreen, moveToFullscreen, replacing);
mRunningAnimations.put(target, animator);
animator.setFloatValues(0f, 1f);
animator.setDuration((animationDuration != -1 ? animationDuration
@@ -397,14 +415,19 @@
return animator;
}
+ public Handler getHandler() {
+ return mHandler;
+ }
+
+ public void onAllWindowsDrawn() {
+ if (DEBUG) Slog.d(TAG, "onAllWindowsDrawn:");
+ mHandler.post(this::resume);
+ }
+
private void resume() {
for (int i = 0; i < mRunningAnimations.size(); i++) {
final BoundsAnimator b = mRunningAnimations.valueAt(i);
b.resume();
}
}
-
- public void onAllWindowsDrawn() {
- mHandler.post(this::resume);
- }
}
diff --git a/services/core/java/com/android/server/wm/DisplayContent.java b/services/core/java/com/android/server/wm/DisplayContent.java
index 4941610..b5476d7 100644
--- a/services/core/java/com/android/server/wm/DisplayContent.java
+++ b/services/core/java/com/android/server/wm/DisplayContent.java
@@ -2903,6 +2903,11 @@
* TYPE_LAYER_MULTIPLIER + TYPE_LAYER_OFFSET;
final MutableBoolean mutableIncludeFullDisplay = new MutableBoolean(includeFullDisplay);
synchronized(mService.mWindowMap) {
+ if (!mService.mPolicy.isScreenOn()) {
+ if (DEBUG_SCREENSHOT) Slog.i(TAG_WM, "Attempted to take screenshot while display"
+ + " was off.");
+ return null;
+ }
// Figure out the part of the screen that is actually the app.
mScreenshotApplicationState.appWin = null;
forAllWindows(w -> {
@@ -3487,10 +3492,15 @@
if (win != null) {
final int req = win.mAttrs.screenOrientation;
- if (DEBUG_ORIENTATION) Slog.v(TAG_WM, win + " forcing orientation to " + req);
if (policy.isKeyguardHostWindow(win.mAttrs)) {
mLastKeyguardForcedOrientation = req;
+ if (mService.mKeyguardGoingAway) {
+ // Keyguard can't affect the orientation if it is going away...
+ mLastWindowForcedOrientation = SCREEN_ORIENTATION_UNSPECIFIED;
+ return SCREEN_ORIENTATION_UNSET;
+ }
}
+ if (DEBUG_ORIENTATION) Slog.v(TAG_WM, win + " forcing orientation to " + req);
return (mLastWindowForcedOrientation = req);
}
diff --git a/services/core/java/com/android/server/wm/DockedStackDividerController.java b/services/core/java/com/android/server/wm/DockedStackDividerController.java
index e300256..2d7fc68 100644
--- a/services/core/java/com/android/server/wm/DockedStackDividerController.java
+++ b/services/core/java/com/android/server/wm/DockedStackDividerController.java
@@ -191,12 +191,16 @@
mTmpRect);
int dividerSize = mDividerWindowWidth - 2 * mDividerInsets;
Configuration configuration = mDisplayContent.getConfiguration();
+ // The offset in the left (landscape)/top (portrait) is calculated with the minimized
+ // offset value with the divider size and any system insets in that direction.
if (configuration.orientation == Configuration.ORIENTATION_PORTRAIT) {
outBounds.set(0, mTaskHeightInMinimizedMode + dividerSize + mTmpRect.top,
di.logicalWidth, di.logicalHeight);
} else {
- outBounds.set(mTaskHeightInMinimizedMode + dividerSize + mTmpRect.left, 0,
- di.logicalWidth, di.logicalHeight);
+ // In landscape append the left position with the statusbar height to match the
+ // minimized size height in portrait mode.
+ outBounds.set(mTaskHeightInMinimizedMode + dividerSize + mTmpRect.left + mTmpRect.top,
+ 0, di.logicalWidth, di.logicalHeight);
}
}
diff --git a/services/core/java/com/android/server/wm/PinnedStackController.java b/services/core/java/com/android/server/wm/PinnedStackController.java
index fc4ec28..9a9e29a 100644
--- a/services/core/java/com/android/server/wm/PinnedStackController.java
+++ b/services/core/java/com/android/server/wm/PinnedStackController.java
@@ -92,17 +92,16 @@
private final Rect mStableInsets = new Rect();
// The size and position information that describes where the pinned stack will go by default.
+ private int mDefaultMinSize;
private int mDefaultStackGravity;
private float mDefaultAspectRatio;
private Point mScreenEdgeInsets;
+ private int mCurrentMinSize;
// The aspect ratio bounds of the PIP.
private float mMinAspectRatio;
private float mMaxAspectRatio;
- // The minimum edge size of the normal PiP bounds.
- private int mMinSize;
-
// Temp vars for calculation
private final DisplayMetrics mTmpMetrics = new DisplayMetrics();
private final Rect mTmpInsets = new Rect();
@@ -124,6 +123,13 @@
}
@Override
+ public void setMinEdgeSize(int minEdgeSize) {
+ mHandler.post(() -> {
+ mCurrentMinSize = Math.max(mDefaultMinSize, minEdgeSize);
+ });
+ }
+
+ @Override
public int getDisplayRotation() {
synchronized (mService.mWindowMap) {
return mDisplayInfo.rotation;
@@ -160,10 +166,12 @@
*/
private void reloadResources() {
final Resources res = mService.mContext.getResources();
- mMinSize = res.getDimensionPixelSize(
+ mDefaultMinSize = res.getDimensionPixelSize(
com.android.internal.R.dimen.default_minimal_size_pip_resizable_task);
+ mCurrentMinSize = mDefaultMinSize;
mDefaultAspectRatio = res.getFloat(
com.android.internal.R.dimen.config_pictureInPictureDefaultAspectRatio);
+ mAspectRatio = mDefaultAspectRatio;
final String screenEdgeInsetsDpString = res.getString(
com.android.internal.R.string.config_defaultPictureInPictureScreenEdgeInsets);
final Size screenEdgeInsetsDp = !screenEdgeInsetsDpString.isEmpty()
@@ -212,11 +220,15 @@
* Returns the current bounds (or the default bounds if there are no current bounds) with the
* specified aspect ratio.
*/
- Rect transformBoundsToAspectRatio(Rect stackBounds, float aspectRatio) {
+ Rect transformBoundsToAspectRatio(Rect stackBounds, float aspectRatio,
+ boolean useCurrentMinEdgeSize) {
// Save the snap fraction, calculate the aspect ratio based on screen size
final float snapFraction = mSnapAlgorithm.getSnapFraction(stackBounds,
getMovementBounds(stackBounds));
- final Size size = getSize(aspectRatio);
+
+ final int minEdgeSize = useCurrentMinEdgeSize ? mCurrentMinSize : mDefaultMinSize;
+ final Size size = mSnapAlgorithm.getSizeForAspectRatio(aspectRatio, minEdgeSize,
+ mDisplayInfo.logicalWidth, mDisplayInfo.logicalHeight);
final int left = (int) (stackBounds.centerX() - size.getWidth() / 2f);
final int top = (int) (stackBounds.centerY() - size.getHeight() / 2f);
stackBounds.set(left, top, left + size.getWidth(), top + size.getHeight());
@@ -228,16 +240,6 @@
}
/**
- * @return the size of the PIP based on the given {@param aspectRatio}.
- */
- Size getSize(float aspectRatio) {
- synchronized (mService.mWindowMap) {
- return mSnapAlgorithm.getSizeForAspectRatio(aspectRatio, mMinSize,
- mDisplayInfo.logicalWidth, mDisplayInfo.logicalHeight);
- }
- }
-
- /**
* @return the default bounds to show the PIP when there is no active PIP.
*/
Rect getDefaultBounds() {
@@ -246,7 +248,8 @@
getInsetBounds(insetBounds);
final Rect defaultBounds = new Rect();
- final Size size = getSize(mDefaultAspectRatio);
+ final Size size = mSnapAlgorithm.getSizeForAspectRatio(mDefaultAspectRatio,
+ mDefaultMinSize, mDisplayInfo.logicalWidth, mDisplayInfo.logicalHeight);
Gravity.apply(mDefaultStackGravity, size.getWidth(), size.getHeight(), insetBounds,
0, mIsImeShowing ? mImeHeight : 0, defaultBounds);
return defaultBounds;
@@ -401,7 +404,8 @@
getInsetBounds(insetBounds);
final Rect normalBounds = getDefaultBounds();
if (isValidPictureInPictureAspectRatio(mAspectRatio)) {
- transformBoundsToAspectRatio(normalBounds, mAspectRatio);
+ transformBoundsToAspectRatio(normalBounds, mAspectRatio,
+ false /* useCurrentMinEdgeSize */);
}
final Rect animatingBounds = mTmpAnimatingBoundsRect;
final TaskStack pinnedStack = mDisplayContent.getStackById(PINNED_STACK_ID);
diff --git a/services/core/java/com/android/server/wm/PinnedStackWindowController.java b/services/core/java/com/android/server/wm/PinnedStackWindowController.java
index b0b93ab..989e8f2 100644
--- a/services/core/java/com/android/server/wm/PinnedStackWindowController.java
+++ b/services/core/java/com/android/server/wm/PinnedStackWindowController.java
@@ -17,7 +17,6 @@
package com.android.server.wm;
import static android.app.ActivityManager.StackId.FULLSCREEN_WORKSPACE_STACK_ID;
-import static android.app.ActivityManager.StackId.PINNED_STACK_ID;
import static com.android.server.wm.BoundsAnimationController.NO_PIP_MODE_CHANGED_CALLBACKS;
import static com.android.server.wm.BoundsAnimationController.SCHEDULE_PIP_MODE_CHANGED_ON_END;
@@ -36,7 +35,8 @@
*/
public class PinnedStackWindowController extends StackWindowController {
- private Rect mTmpBoundsRect = new Rect();
+ private Rect mTmpFromBounds = new Rect();
+ private Rect mTmpToBounds = new Rect();
public PinnedStackWindowController(int stackId, PinnedStackWindowListener listener,
int displayId, boolean onTop, Rect outBounds) {
@@ -44,16 +44,16 @@
}
/**
- * @param useExistingStackBounds Apply {@param aspectRatio} to the existing target stack bounds
- * if possible
+ * @return the {@param currentStackBounds} transformed to the give {@param aspectRatio}. If
+ * {@param currentStackBounds} is null, then the {@param aspectRatio} is applied to the
+ * default bounds.
*/
- public Rect getPictureInPictureBounds(float aspectRatio, boolean useExistingStackBounds) {
+ public Rect getPictureInPictureBounds(float aspectRatio, Rect stackBounds) {
synchronized (mWindowMap) {
if (!mService.mSupportsPictureInPicture || mContainer == null) {
return null;
}
- final Rect stackBounds;
final DisplayContent displayContent = mContainer.getDisplayContent();
if (displayContent == null) {
return null;
@@ -61,18 +61,14 @@
final PinnedStackController pinnedStackController =
displayContent.getPinnedStackController();
- if (useExistingStackBounds) {
- // If the stack exists, then use its final bounds to calculate the new aspect ratio
- // bounds
- stackBounds = new Rect();
- mContainer.getAnimationOrCurrentBounds(stackBounds);
- } else {
- // Otherwise, just calculate the aspect ratio bounds from the default bounds
+ if (stackBounds == null) {
+ // Calculate the aspect ratio bounds from the default bounds
stackBounds = pinnedStackController.getDefaultBounds();
}
if (pinnedStackController.isValidPictureInPictureAspectRatio(aspectRatio)) {
- return pinnedStackController.transformBoundsToAspectRatio(stackBounds, aspectRatio);
+ return pinnedStackController.transformBoundsToAspectRatio(stackBounds, aspectRatio,
+ true /* useCurrentMinEdgeSize */);
} else {
return stackBounds;
}
@@ -83,7 +79,7 @@
* Animates the pinned stack.
*/
public void animateResizePinnedStack(Rect toBounds, Rect sourceHintBounds,
- int animationDuration, boolean schedulePipModeChangedOnAnimationEnd) {
+ int animationDuration, boolean fromFullscreen) {
synchronized (mWindowMap) {
if (mContainer == null) {
throw new IllegalArgumentException("Pinned stack container not found :(");
@@ -98,22 +94,22 @@
NO_PIP_MODE_CHANGED_CALLBACKS;
final boolean toFullscreen = toBounds == null;
if (toFullscreen) {
- if (schedulePipModeChangedOnAnimationEnd) {
+ if (fromFullscreen) {
throw new IllegalArgumentException("Should not defer scheduling PiP mode"
+ " change on animation to fullscreen.");
}
schedulePipModeChangedState = SCHEDULE_PIP_MODE_CHANGED_ON_START;
- mService.getStackBounds(FULLSCREEN_WORKSPACE_STACK_ID, mTmpBoundsRect);
- if (!mTmpBoundsRect.isEmpty()) {
+ mService.getStackBounds(FULLSCREEN_WORKSPACE_STACK_ID, mTmpToBounds);
+ if (!mTmpToBounds.isEmpty()) {
// If there is a fullscreen bounds, use that
- toBounds = new Rect(mTmpBoundsRect);
+ toBounds = new Rect(mTmpToBounds);
} else {
// Otherwise, use the display bounds
toBounds = new Rect();
mContainer.getDisplayContent().getLogicalDisplayRect(toBounds);
}
- } else if (schedulePipModeChangedOnAnimationEnd) {
+ } else if (fromFullscreen) {
schedulePipModeChangedState = SCHEDULE_PIP_MODE_CHANGED_ON_END;
}
@@ -122,13 +118,13 @@
final Rect finalToBounds = toBounds;
final @SchedulePipModeChangedState int finalSchedulePipModeChangedState =
schedulePipModeChangedState;
- UiThread.getHandler().post(() -> {
+ mService.mBoundsAnimationController.getHandler().post(() -> {
if (mContainer == null) {
return;
}
mService.mBoundsAnimationController.animateBounds(mContainer, fromBounds,
finalToBounds, animationDuration, finalSchedulePipModeChangedState,
- toFullscreen);
+ fromFullscreen, toFullscreen);
});
}
}
@@ -142,17 +138,16 @@
return;
}
- final Rect toBounds = getPictureInPictureBounds(aspectRatio,
- true /* useExistingStackBounds */);
- final Rect targetBounds = new Rect();
- mContainer.getAnimationOrCurrentBounds(targetBounds);
final PinnedStackController pinnedStackController =
mContainer.getDisplayContent().getPinnedStackController();
if (Float.compare(aspectRatio, pinnedStackController.getAspectRatio()) != 0) {
- if (!toBounds.equals(targetBounds)) {
- animateResizePinnedStack(toBounds, null /* sourceHintBounds */,
- -1 /* duration */, false /* schedulePipModeChangedOnAnimationEnd */);
+ mContainer.getAnimationOrCurrentBounds(mTmpFromBounds);
+ mTmpToBounds.set(mTmpFromBounds);
+ getPictureInPictureBounds(aspectRatio, mTmpToBounds);
+ if (!mTmpToBounds.equals(mTmpFromBounds)) {
+ animateResizePinnedStack(mTmpToBounds, null /* sourceHintBounds */,
+ -1 /* duration */, false /* fromFullscreen */);
}
pinnedStackController.setAspectRatio(
pinnedStackController.isValidPictureInPictureAspectRatio(aspectRatio)
diff --git a/services/core/java/com/android/server/wm/RootWindowContainer.java b/services/core/java/com/android/server/wm/RootWindowContainer.java
index 233e75b..fb500bc 100644
--- a/services/core/java/com/android/server/wm/RootWindowContainer.java
+++ b/services/core/java/com/android/server/wm/RootWindowContainer.java
@@ -858,14 +858,20 @@
final int privateflags = attrs.privateFlags;
boolean displayHasContent = false;
+ if (DEBUG_KEEP_SCREEN_ON && (attrFlags & FLAG_KEEP_SCREEN_ON) != 0
+ && w != mService.mLastWakeLockHoldingWindow) {
+ Slog.d(TAG_KEEP_SCREEN_ON, "handleNotObscuredLocked: " + w
+ + " has FLAG_KEEP_SCREEN_ON set, hasSurface=" + w.mHasSurface
+ + ", canBeSeen=" + canBeSeen);
+ }
+
if (w.mHasSurface && canBeSeen) {
if ((attrFlags & FLAG_KEEP_SCREEN_ON) != 0) {
mHoldScreen = w.mSession;
mHoldScreenWindow = w;
} else if (DEBUG_KEEP_SCREEN_ON && w == mService.mLastWakeLockHoldingWindow) {
Slog.d(TAG_KEEP_SCREEN_ON, "handleNotObscuredLocked: " + w + " was holding "
- + "screen wakelock but no longer has FLAG_KEEP_SCREEN_ON!!! called by"
- + Debug.getCallers(10));
+ + "screen wakelock but no longer has FLAG_KEEP_SCREEN_ON!!!");
}
if (!syswin && w.mAttrs.screenBrightness >= 0 && mScreenBrightness < 0) {
mScreenBrightness = w.mAttrs.screenBrightness;
diff --git a/services/core/java/com/android/server/wm/Task.java b/services/core/java/com/android/server/wm/Task.java
index 27661e2..818df01 100644
--- a/services/core/java/com/android/server/wm/Task.java
+++ b/services/core/java/com/android/server/wm/Task.java
@@ -41,6 +41,7 @@
import com.android.internal.annotations.VisibleForTesting;
import java.io.PrintWriter;
+import java.util.function.Consumer;
class Task extends WindowContainer<AppWindowToken> implements DimLayer.DimLayerUser {
static final String TAG = TAG_WITH_CLASS_NAME ? "Task" : TAG_WM;
@@ -684,6 +685,11 @@
}
@Override
+ void forAllTasks(Consumer<Task> callback) {
+ callback.accept(this);
+ }
+
+ @Override
public String toString() {
return "{taskId=" + mTaskId + " appTokens=" + mChildren + " mdr=" + mDeferRemoval + "}";
}
diff --git a/services/core/java/com/android/server/wm/TaskSnapshotController.java b/services/core/java/com/android/server/wm/TaskSnapshotController.java
index 1bbe1d0..1f7ef50 100644
--- a/services/core/java/com/android/server/wm/TaskSnapshotController.java
+++ b/services/core/java/com/android/server/wm/TaskSnapshotController.java
@@ -17,21 +17,25 @@
package com.android.server.wm;
import static android.app.ActivityManager.ENABLE_TASK_SNAPSHOTS;
-import static android.graphics.GraphicBuffer.USAGE_HW_TEXTURE;
-import static android.graphics.GraphicBuffer.USAGE_SW_READ_NEVER;
-import static android.graphics.GraphicBuffer.USAGE_SW_WRITE_RARELY;
-import static android.graphics.PixelFormat.RGBA_8888;
+import static android.graphics.Bitmap.Config.ARGB_8888;
+import static android.graphics.Bitmap.Config.HARDWARE;
import android.annotation.Nullable;
import android.app.ActivityManager;
import android.app.ActivityManager.StackId;
import android.app.ActivityManager.TaskSnapshot;
+import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.GraphicBuffer;
import android.graphics.Rect;
import android.os.Environment;
+import android.os.Handler;
import android.util.ArraySet;
+import android.view.DisplayListCanvas;
+import android.view.RenderNode;
+import android.view.ThreadedRenderer;
import android.view.WindowManager.LayoutParams;
+import android.view.WindowManagerPolicy.ScreenOffListener;
import android.view.WindowManagerPolicy.StartingSurface;
import com.google.android.collect.Sets;
@@ -83,6 +87,7 @@
Environment::getDataSystemCeDirectory);
private final TaskSnapshotLoader mLoader = new TaskSnapshotLoader(mPersister);
private final ArraySet<Task> mTmpTasks = new ArraySet<>();
+ private final Handler mHandler = new Handler();
TaskSnapshotController(WindowManagerService service) {
mService = service;
@@ -114,8 +119,13 @@
// We need to take a snapshot of the task if and only if all activities of the task are
// either closing or hidden.
getClosingTasks(closingApps, mTmpTasks);
- for (int i = mTmpTasks.size() - 1; i >= 0; i--) {
- final Task task = mTmpTasks.valueAt(i);
+ snapshotTasks(mTmpTasks);
+
+ }
+
+ private void snapshotTasks(ArraySet<Task> tasks) {
+ for (int i = tasks.size() - 1; i >= 0; i--) {
+ final Task task = tasks.valueAt(i);
final int mode = getSnapshotMode(task);
final TaskSnapshot snapshot;
switch (mode) {
@@ -231,22 +241,25 @@
final int color = task.getTaskDescription().getBackgroundColor();
final int statusBarColor = task.getTaskDescription().getStatusBarColor();
final int navigationBarColor = task.getTaskDescription().getNavigationBarColor();
- final GraphicBuffer buffer = GraphicBuffer.create(mainWindow.getFrameLw().width(),
- mainWindow.getFrameLw().height(),
- RGBA_8888, USAGE_HW_TEXTURE | USAGE_SW_WRITE_RARELY | USAGE_SW_READ_NEVER);
- if (buffer == null) {
- return null;
- }
- final Canvas c = buffer.lockCanvas();
- c.drawColor(color);
final LayoutParams attrs = mainWindow.getAttrs();
final SystemBarBackgroundPainter decorPainter = new SystemBarBackgroundPainter(attrs.flags,
attrs.privateFlags, attrs.systemUiVisibility, statusBarColor, navigationBarColor);
+ final int width = mainWindow.getFrameLw().width();
+ final int height = mainWindow.getFrameLw().height();
+
+ final RenderNode node = RenderNode.create("TaskSnapshotController", null);
+ node.setLeftTopRightBottom(0, 0, width, height);
+ node.setClipToBounds(false);
+ final DisplayListCanvas c = node.start(width, height);
+ c.drawColor(color);
decorPainter.setInsets(mainWindow.mContentInsets, mainWindow.mStableInsets);
decorPainter.drawDecors(c, null /* statusBarExcludeFrame */);
- buffer.unlockCanvasAndPost(c);
- return new TaskSnapshot(buffer, topChild.getConfiguration().orientation,
- mainWindow.mStableInsets, false /* reduced */, 1.0f /* scale */);
+ node.end(c);
+ final Bitmap hwBitmap = ThreadedRenderer.createHardwareBitmap(node, width, height);
+
+ return new TaskSnapshot(hwBitmap.createGraphicBufferHandle(),
+ topChild.getConfiguration().orientation, mainWindow.mStableInsets,
+ false /* reduced */, 1.0f /* scale */);
}
/**
@@ -284,6 +297,33 @@
mPersister.setPaused(paused);
}
+ /**
+ * Called when screen is being turned off.
+ */
+ void screenTurningOff(ScreenOffListener listener) {
+ if (!ENABLE_TASK_SNAPSHOTS || ActivityManager.isLowRamDeviceStatic()) {
+ listener.onScreenOff();
+ return;
+ }
+
+ // We can't take a snapshot when screen is off, so take a snapshot now!
+ mHandler.post(() -> {
+ try {
+ synchronized (mService.mWindowMap) {
+ mTmpTasks.clear();
+ mService.mRoot.forAllTasks(task -> {
+ if (task.isVisible()) {
+ mTmpTasks.add(task);
+ }
+ });
+ snapshotTasks(mTmpTasks);
+ }
+ } finally {
+ listener.onScreenOff();
+ }
+ });
+ }
+
void dump(PrintWriter pw, String prefix) {
mCache.dump(pw, prefix);
}
diff --git a/services/core/java/com/android/server/wm/TaskSnapshotPersister.java b/services/core/java/com/android/server/wm/TaskSnapshotPersister.java
index 866bfc0..297e288 100644
--- a/services/core/java/com/android/server/wm/TaskSnapshotPersister.java
+++ b/services/core/java/com/android/server/wm/TaskSnapshotPersister.java
@@ -39,6 +39,7 @@
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.ArrayDeque;
+import java.util.ArrayList;
/**
* Persists {@link TaskSnapshot}s to disk.
@@ -55,10 +56,13 @@
private static final int QUALITY = 95;
private static final String PROTO_EXTENSION = ".proto";
private static final String BITMAP_EXTENSION = ".jpg";
+ private static final int MAX_STORE_QUEUE_DEPTH = 2;
@GuardedBy("mLock")
private final ArrayDeque<WriteQueueItem> mWriteQueue = new ArrayDeque<>();
@GuardedBy("mLock")
+ private final ArrayDeque<StoreWriteQueueItem> mStoreQueueItems = new ArrayDeque<>();
+ @GuardedBy("mLock")
private boolean mQueueIdling;
@GuardedBy("mLock")
private boolean mPaused;
@@ -153,11 +157,22 @@
@GuardedBy("mLock")
private void sendToQueueLocked(WriteQueueItem item) {
mWriteQueue.offer(item);
+ item.onQueuedLocked();
+ ensureStoreQueueDepthLocked();
if (!mPaused) {
mLock.notifyAll();
}
}
+ @GuardedBy("mLock")
+ private void ensureStoreQueueDepthLocked() {
+ while (mStoreQueueItems.size() > MAX_STORE_QUEUE_DEPTH) {
+ final StoreWriteQueueItem item = mStoreQueueItems.poll();
+ mWriteQueue.remove(item);
+ Slog.i(TAG, "Queue is too deep! Purged item with taskid=" + item.mTaskId);
+ }
+ }
+
private File getDirectory(int userId) {
return new File(mDirectoryResolver.getSystemDirectoryForUser(userId), SNAPSHOTS_DIRNAME);
}
@@ -202,6 +217,9 @@
next = null;
} else {
next = mWriteQueue.poll();
+ if (next != null) {
+ next.onDequeuedLocked();
+ }
}
}
if (next != null) {
@@ -226,6 +244,18 @@
private abstract class WriteQueueItem {
abstract void write();
+
+ /**
+ * Called when this queue item has been put into the queue.
+ */
+ void onQueuedLocked() {
+ }
+
+ /**
+ * Called when this queue item has been taken out of the queue.
+ */
+ void onDequeuedLocked() {
+ }
}
private class StoreWriteQueueItem extends WriteQueueItem {
@@ -240,6 +270,16 @@
}
@Override
+ void onQueuedLocked() {
+ mStoreQueueItems.offer(this);
+ }
+
+ @Override
+ void onDequeuedLocked() {
+ mStoreQueueItems.remove(this);
+ }
+
+ @Override
void write() {
if (!createDirectory(mUserId)) {
Slog.e(TAG, "Unable to create snapshot directory for user dir="
diff --git a/services/core/java/com/android/server/wm/TaskStack.java b/services/core/java/com/android/server/wm/TaskStack.java
index 9d48ce5..eff8ed9 100644
--- a/services/core/java/com/android/server/wm/TaskStack.java
+++ b/services/core/java/com/android/server/wm/TaskStack.java
@@ -738,7 +738,8 @@
// When the home stack is resizable, should always have the same stack and task bounds
if (mStackId == HOME_STACK_ID) {
- if (findHomeTask().isResizeable()) {
+ final Task homeTask = findHomeTask();
+ if (homeTask != null && homeTask.isResizeable()) {
// Calculate the home stack bounds when in docked mode and the home stack is
// resizeable.
getDisplayContent().mDividerControllerLocked
@@ -1488,7 +1489,7 @@
}
void onAllWindowsDrawn() {
- if (!mBoundsAnimating) {
+ if (!mBoundsAnimating && !mBoundsAnimatingRequested) {
return;
}
diff --git a/services/core/java/com/android/server/wm/WindowContainer.java b/services/core/java/com/android/server/wm/WindowContainer.java
index 6d3e0ed..600bc5c 100644
--- a/services/core/java/com/android/server/wm/WindowContainer.java
+++ b/services/core/java/com/android/server/wm/WindowContainer.java
@@ -627,6 +627,17 @@
wrapper.release();
}
+ /**
+ * For all tasks at or below this container call the callback.
+ *
+ * @param callback Callback to be called for every task.
+ */
+ void forAllTasks(Consumer<Task> callback) {
+ for (int i = mChildren.size() - 1; i >= 0; --i) {
+ mChildren.get(i).forAllTasks(callback);
+ }
+ }
+
WindowState getWindow(Predicate<WindowState> callback) {
for (int i = mChildren.size() - 1; i >= 0; --i) {
final WindowState w = mChildren.get(i).getWindow(callback);
diff --git a/services/core/java/com/android/server/wm/WindowLayersController.java b/services/core/java/com/android/server/wm/WindowLayersController.java
index 172ec48..01a3143 100644
--- a/services/core/java/com/android/server/wm/WindowLayersController.java
+++ b/services/core/java/com/android/server/wm/WindowLayersController.java
@@ -257,9 +257,20 @@
w.mLayer = layer;
w.mWinAnimator.mAnimLayer = w.getAnimLayerAdjustment()
+ w.getSpecialWindowAnimLayerAdjustment();
- if (w.mAppToken != null && w.mAppToken.mAppAnimator.thumbnailForceAboveLayer > 0
- && w.mWinAnimator.mAnimLayer > w.mAppToken.mAppAnimator.thumbnailForceAboveLayer) {
- w.mAppToken.mAppAnimator.thumbnailForceAboveLayer = w.mWinAnimator.mAnimLayer;
+ if (w.mAppToken != null && w.mAppToken.mAppAnimator.thumbnailForceAboveLayer > 0) {
+ if (w.mWinAnimator.mAnimLayer > w.mAppToken.mAppAnimator.thumbnailForceAboveLayer) {
+ w.mAppToken.mAppAnimator.thumbnailForceAboveLayer = w.mWinAnimator.mAnimLayer;
+ }
+ // TODO(b/62029108): the entire contents of the if statement should call the refactored
+ // function to set the thumbnail layer for w.AppToken
+ int highestLayer = w.mAppToken.getHighestAnimLayer();
+ if (highestLayer > 0) {
+ if (w.mAppToken.mAppAnimator.thumbnail != null
+ && w.mAppToken.mAppAnimator.thumbnailForceAboveLayer != highestLayer) {
+ w.mAppToken.mAppAnimator.thumbnailForceAboveLayer = highestLayer;
+ w.mAppToken.mAppAnimator.thumbnail.setLayer(highestLayer + 1);
+ }
+ }
}
}
}
diff --git a/services/core/java/com/android/server/wm/WindowManagerDebugConfig.java b/services/core/java/com/android/server/wm/WindowManagerDebugConfig.java
index 8279b51..4da9c06 100644
--- a/services/core/java/com/android/server/wm/WindowManagerDebugConfig.java
+++ b/services/core/java/com/android/server/wm/WindowManagerDebugConfig.java
@@ -52,7 +52,7 @@
static final boolean DEBUG_CONFIGURATION = false;
static final boolean DEBUG_APP_TRANSITIONS = false;
static final boolean DEBUG_STARTING_WINDOW_VERBOSE = false;
- static final boolean DEBUG_STARTING_WINDOW = DEBUG_STARTING_WINDOW_VERBOSE || true;
+ static final boolean DEBUG_STARTING_WINDOW = DEBUG_STARTING_WINDOW_VERBOSE || false;
static final boolean DEBUG_WALLPAPER = false;
static final boolean DEBUG_WALLPAPER_LIGHT = false || DEBUG_WALLPAPER;
static final boolean DEBUG_DRAG = false;
@@ -77,5 +77,5 @@
static final boolean DEBUG_UNKNOWN_APP_VISIBILITY = false;
static final String TAG_KEEP_SCREEN_ON = "DebugKeepScreenOn";
- static final boolean DEBUG_KEEP_SCREEN_ON = false;
+ static final boolean DEBUG_KEEP_SCREEN_ON = true;
}
diff --git a/services/core/java/com/android/server/wm/WindowManagerService.java b/services/core/java/com/android/server/wm/WindowManagerService.java
index c8eb98c..02fdfee 100644
--- a/services/core/java/com/android/server/wm/WindowManagerService.java
+++ b/services/core/java/com/android/server/wm/WindowManagerService.java
@@ -123,6 +123,7 @@
import android.content.res.Configuration;
import android.database.ContentObserver;
import android.graphics.Bitmap;
+import android.graphics.GraphicBuffer;
import android.graphics.Matrix;
import android.graphics.PixelFormat;
import android.graphics.Point;
@@ -203,6 +204,7 @@
import android.view.WindowManagerInternal;
import android.view.WindowManagerPolicy;
import android.view.WindowManagerPolicy.PointerEventListener;
+import android.view.WindowManagerPolicy.ScreenOffListener;
import android.view.animation.Animation;
import android.view.inputmethod.InputMethodManagerInternal;
@@ -348,6 +350,7 @@
private static final int ANIMATION_DURATION_SCALE = 2;
final private KeyguardDisableHandler mKeyguardDisableHandler;
+ boolean mKeyguardGoingAway;
private final BroadcastReceiver mBroadcastReceiver = new BroadcastReceiver() {
@Override
@@ -2628,7 +2631,7 @@
}
@Override
- public void overridePendingAppTransitionThumb(Bitmap srcThumb, int startX,
+ public void overridePendingAppTransitionThumb(GraphicBuffer srcThumb, int startX,
int startY, IRemoteCallback startedCallback, boolean scaleUp) {
synchronized(mWindowMap) {
mAppTransition.overridePendingAppTransitionThumb(srcThumb, startX, startY,
@@ -2637,7 +2640,7 @@
}
@Override
- public void overridePendingAppTransitionAspectScaledThumb(Bitmap srcThumb, int startX,
+ public void overridePendingAppTransitionAspectScaledThumb(GraphicBuffer srcThumb, int startX,
int startY, int targetWidth, int targetHeight, IRemoteCallback startedCallback,
boolean scaleUp) {
synchronized(mWindowMap) {
@@ -2810,6 +2813,11 @@
mH.sendEmptyMessage(H.NOTIFY_KEYGUARD_TRUSTED_CHANGED);
}
+ @Override
+ public void screenTurningOff(ScreenOffListener listener) {
+ mTaskSnapshotController.screenTurningOff(listener);
+ }
+
/**
* Starts deferring layout passes. Useful when doing multiple changes but to optimize
* performance, only one layout pass should be done. This can be called multiple times, and
@@ -2870,6 +2878,12 @@
}
}
+ public void setKeyguardGoingAway(boolean keyguardGoingAway) {
+ synchronized (mWindowMap) {
+ mKeyguardGoingAway = keyguardGoingAway;
+ }
+ }
+
// -------------------------------------------------------------
// Misc IWindowSession methods
// -------------------------------------------------------------
@@ -3335,6 +3349,13 @@
performEnableScreen();
}
+ /**
+ * Called when System UI has been started.
+ */
+ public void onSystemUiStarted() {
+ mPolicy.onSystemUiStarted();
+ }
+
private void performEnableScreen() {
synchronized(mWindowMap) {
if (DEBUG_BOOT) Slog.i(TAG_WM, "performEnableScreen: mDisplayEnabled=" + mDisplayEnabled
@@ -3350,6 +3371,10 @@
return;
}
+ if (!mShowingBootMessages && !mPolicy.canDismissBootAnimation()) {
+ return;
+ }
+
// Don't enable the screen until all existing windows have been drawn.
if (!mForceDisplayEnabled
// TODO(multidisplay): Expand to all displays?
@@ -3363,7 +3388,7 @@
try {
IBinder surfaceFlinger = ServiceManager.getService("SurfaceFlinger");
if (surfaceFlinger != null) {
- //Slog.i(TAG_WM, "******* TELLING SURFACE FLINGER WE ARE BOOTED!");
+ Slog.i(TAG_WM, "******* TELLING SURFACE FLINGER WE ARE BOOTED!");
Parcel data = Parcel.obtain();
data.writeInterfaceToken("android.ui.ISurfaceComposer");
surfaceFlinger.transact(IBinder.FIRST_CALL_TRANSACTION, // BOOT_FINISHED
@@ -3799,20 +3824,22 @@
long origId = Binder.clearCallingIdentity();
try {
- final boolean rotationChanged;
// TODO(multi-display): Update rotation for different displays separately.
- final DisplayContent displayContent = getDefaultDisplayContentLocked();
+ final boolean rotationChanged;
+ final int displayId;
synchronized (mWindowMap) {
+ final DisplayContent displayContent = getDefaultDisplayContentLocked();
rotationChanged = displayContent.updateRotationUnchecked(
false /* inTransaction */);
if (!rotationChanged || forceRelayout) {
- getDefaultDisplayContentLocked().setLayoutNeeded();
+ displayContent.setLayoutNeeded();
mWindowPlacerLocked.performSurfacePlacement();
}
+ displayId = displayContent.getDisplayId();
}
if (rotationChanged || alwaysSendConfiguration) {
- sendNewConfiguration(displayContent.getDisplayId());
+ sendNewConfiguration(displayId);
}
} finally {
Binder.restoreCallingIdentity(origId);
@@ -6440,7 +6467,7 @@
pw.print(" window="); pw.print(mWindowAnimationScaleSetting);
pw.print(" transition="); pw.print(mTransitionAnimationScaleSetting);
pw.print(" animator="); pw.println(mAnimatorDurationScaleSetting);
- pw.print(" mSkipAppTransitionAnimation=");pw.println(mSkipAppTransitionAnimation);
+ pw.print(" mSkipAppTransitionAnimation=");pw.println(mSkipAppTransitionAnimation);
pw.println(" mLayoutToAnim:");
mAppTransition.dump(pw, " ");
}
@@ -6873,9 +6900,11 @@
"registerDockedStackListener()")) {
return;
}
- // TODO(multi-display): The listener is registered on the default display only.
- getDefaultDisplayContentLocked().mDividerControllerLocked.registerDockedStackListener(
- listener);
+ synchronized (mWindowMap) {
+ // TODO(multi-display): The listener is registered on the default display only.
+ getDefaultDisplayContentLocked().mDividerControllerLocked.registerDockedStackListener(
+ listener);
+ }
}
@Override
@@ -7156,6 +7185,11 @@
}
@Override
+ public boolean isKeyguardGoingAway() {
+ return WindowManagerService.this.mKeyguardGoingAway;
+ }
+
+ @Override
public void showGlobalActions() {
WindowManagerService.this.showGlobalActions();
}
diff --git a/services/core/java/com/android/server/wm/WindowState.java b/services/core/java/com/android/server/wm/WindowState.java
index 2ffa152..44a867c 100644
--- a/services/core/java/com/android/server/wm/WindowState.java
+++ b/services/core/java/com/android/server/wm/WindowState.java
@@ -1403,6 +1403,16 @@
|| ((mAppToken != null) && (mAppToken.mAppAnimator.animation != null)));
}
+ // TODO: Another visibility method that was added late in the release to minimize risk.
+ @Override
+ public boolean canAffectSystemUiFlags() {
+ final boolean shown = mWinAnimator.getShown();
+ final boolean exiting = mAnimatingExit || mDestroying
+ || mAppToken != null && mAppToken.hidden;
+ final boolean translucent = mAttrs.alpha == 0.0f;
+ return shown && !exiting && !translucent;
+ }
+
/**
* Like isOnScreen, but returns false if the surface hasn't yet
* been drawn.
@@ -2192,18 +2202,30 @@
}
}
- void prepareWindowToDisplayDuringRelayout(MergedConfiguration mergedConfiguration) {
- if ((mAttrs.softInputMode & SOFT_INPUT_MASK_ADJUST)
- == SOFT_INPUT_ADJUST_RESIZE) {
- mLayoutNeeded = true;
- }
- if (isDrawnLw() && mService.okToDisplay()) {
- mWinAnimator.applyEnterAnimationLocked();
- }
+ void prepareWindowToDisplayDuringRelayout(MergedConfiguration mergedConfiguration,
+ boolean wasVisible) {
+ // We need to turn on screen regardless of visibility.
if ((mAttrs.flags & FLAG_TURN_SCREEN_ON) != 0) {
if (DEBUG_VISIBILITY) Slog.v(TAG, "Relayout window turning screen on: " + this);
mTurnOnScreen = true;
}
+
+ // If we were already visible, skip rest of preparation.
+ if (wasVisible) {
+ if (DEBUG_VISIBILITY) Slog.v(TAG,
+ "Already visible and does not turn on screen, skip preparing: " + this);
+ return;
+ }
+
+ if ((mAttrs.softInputMode & SOFT_INPUT_MASK_ADJUST)
+ == SOFT_INPUT_ADJUST_RESIZE) {
+ mLayoutNeeded = true;
+ }
+
+ if (isDrawnLw() && mService.okToDisplay()) {
+ mWinAnimator.applyEnterAnimationLocked();
+ }
+
if (isConfigChanged()) {
final Configuration globalConfig = mService.mRoot.getConfiguration();
final Configuration overrideConfig = getMergedOverrideConfiguration();
@@ -3397,7 +3419,7 @@
pw.print(prefix); pw.print("mOrientationChanging=");
pw.print(mOrientationChanging);
pw.print(" mAppFreezing="); pw.print(mAppFreezing);
- pw.print(" mTurnOnScreen="); pw.println(mTurnOnScreen);
+ pw.print(" mTurnOnScreen="); pw.print(mTurnOnScreen);
pw.print(" mReportOrientationChanged="); pw.println(mReportOrientationChanged);
}
if (mLastFreezeDuration != 0) {
@@ -4338,9 +4360,9 @@
mLastVisibleLayoutRotation = getDisplayContent().getRotation();
mWinAnimator.mEnteringAnimation = true;
- if (!wasVisible) {
- prepareWindowToDisplayDuringRelayout(mergedConfiguration);
- }
+
+ prepareWindowToDisplayDuringRelayout(mergedConfiguration, wasVisible);
+
if ((attrChanges & FORMAT_CHANGED) != 0) {
// If the format can't be changed in place, preserve the old surface until the app draws
// on the new one. This prevents blinking when we change elevation of freeform and
diff --git a/services/core/java/com/android/server/wm/WindowStateAnimator.java b/services/core/java/com/android/server/wm/WindowStateAnimator.java
index d75afcf..73f8d27 100644
--- a/services/core/java/com/android/server/wm/WindowStateAnimator.java
+++ b/services/core/java/com/android/server/wm/WindowStateAnimator.java
@@ -687,6 +687,7 @@
mSurfaceController = new WindowSurfaceController(mSession.mSurfaceSession,
attrs.getTitle().toString(),
width, height, format, flags, this, windowType, ownerUid);
+ mSurfaceFormat = format;
w.setHasSurface(true);
diff --git a/services/core/java/com/android/server/wm/WindowSurfacePlacer.java b/services/core/java/com/android/server/wm/WindowSurfacePlacer.java
index e576f2f..4442bb8 100644
--- a/services/core/java/com/android/server/wm/WindowSurfacePlacer.java
+++ b/services/core/java/com/android/server/wm/WindowSurfacePlacer.java
@@ -15,6 +15,7 @@
import static com.android.server.wm.AppTransition.TRANSIT_FLAG_KEYGUARD_GOING_AWAY_WITH_WALLPAPER;
import static com.android.server.wm.AppTransition.TRANSIT_KEYGUARD_GOING_AWAY;
import static com.android.server.wm.AppTransition.TRANSIT_KEYGUARD_GOING_AWAY_ON_WALLPAPER;
+import static com.android.server.wm.AppTransition.TRANSIT_NONE;
import static com.android.server.wm.AppTransition.TRANSIT_TASK_CLOSE;
import static com.android.server.wm.AppTransition.TRANSIT_TASK_IN_PLACE;
import static com.android.server.wm.AppTransition.TRANSIT_TASK_OPEN;
@@ -37,8 +38,7 @@
import static com.android.server.wm.WindowManagerService.UPDATE_FOCUS_PLACING_SURFACES;
import android.content.res.Configuration;
-import android.graphics.Bitmap;
-import android.graphics.Canvas;
+import android.graphics.GraphicBuffer;
import android.graphics.PixelFormat;
import android.graphics.Rect;
import android.os.Binder;
@@ -580,6 +580,11 @@
private int maybeUpdateTransitToWallpaper(int transit, boolean openingAppHasWallpaper,
boolean closingAppHasWallpaper) {
+ // Given no app transition pass it through instead of a wallpaper transition
+ if (transit == TRANSIT_NONE) {
+ return TRANSIT_NONE;
+ }
+
// if wallpaper is animating in or out set oldWallpaper to null else to wallpaper
final WindowState wallpaperTarget = mWallpaperControllerLocked.getWallpaperTarget();
final WindowState oldWallpaper = mWallpaperControllerLocked.isWallpaperTargetAnimating()
@@ -669,8 +674,9 @@
return;
}
final int taskId = appToken.getTask().mTaskId;
- Bitmap thumbnailHeader = mService.mAppTransition.getAppTransitionThumbnailHeader(taskId);
- if (thumbnailHeader == null || thumbnailHeader.getConfig() == Bitmap.Config.ALPHA_8) {
+ final GraphicBuffer thumbnailHeader =
+ mService.mAppTransition.getAppTransitionThumbnailHeader(taskId);
+ if (thumbnailHeader == null) {
if (DEBUG_APP_TRANSITIONS) Slog.d(TAG, "No thumbnail header bitmap for: " + taskId);
return;
}
@@ -688,18 +694,17 @@
SurfaceControl surfaceControl = new SurfaceControl(mService.mFxSession,
"thumbnail anim", dirty.width(), dirty.height(),
PixelFormat.TRANSLUCENT, SurfaceControl.HIDDEN,
- appToken.windowType, window.mOwnerUid);
+ appToken.windowType,
+ window != null ? window.mOwnerUid : Binder.getCallingUid());
surfaceControl.setLayerStack(display.getLayerStack());
if (SHOW_TRANSACTIONS) {
Slog.i(TAG, " THUMBNAIL " + surfaceControl + ": CREATE");
}
- // Draw the thumbnail onto the surface
+ // Transfer the thumbnail to the surface
Surface drawSurface = new Surface();
drawSurface.copyFrom(surfaceControl);
- Canvas c = drawSurface.lockCanvas(dirty);
- c.drawBitmap(thumbnailHeader, 0, 0, null);
- drawSurface.unlockCanvasAndPost(c);
+ drawSurface.attachAndQueueBuffer(thumbnailHeader);
drawSurface.release();
// Get the thumbnail animation
diff --git a/services/java/com/android/server/SystemServer.java b/services/java/com/android/server/SystemServer.java
index 0965f03..6f53099 100644
--- a/services/java/com/android/server/SystemServer.java
+++ b/services/java/com/android/server/SystemServer.java
@@ -185,6 +185,8 @@
"com.google.android.clockwork.ThermalObserver";
private static final String WEAR_CONNECTIVITY_SERVICE_CLASS =
"com.google.android.clockwork.connectivity.WearConnectivityService";
+ private static final String WEAR_DISPLAY_SERVICE_CLASS =
+ "com.google.android.clockwork.display.WearDisplayService";
private static final String WEAR_TIME_SERVICE_CLASS =
"com.google.android.clockwork.time.WearTimeService";
private static final String ACCOUNT_SERVICE_CLASS =
@@ -671,7 +673,6 @@
VibratorService vibrator = null;
IStorageManager storageManager = null;
NetworkManagementService networkManagement = null;
- IpSecService ipSecService = null;
NetworkStatsService networkStats = null;
NetworkPolicyManagerService networkPolicy = null;
ConnectivityService connectivity = null;
@@ -1024,15 +1025,6 @@
reportWtf("starting NetworkManagement Service", e);
}
traceEnd();
-
- traceBeginAndSlog("StartIpSecService");
- try {
- ipSecService = IpSecService.create(context);
- ServiceManager.addService(Context.IPSEC_SERVICE, ipSecService);
- } catch (Throwable e) {
- reportWtf("starting IpSec Service", e);
- }
- traceEnd();
}
if (!disableNonCoreServices && !disableTextServices) {
@@ -1509,6 +1501,7 @@
if (!disableNonCoreServices) {
traceBeginAndSlog("StartWearTimeService");
+ mSystemServiceManager.startService(WEAR_DISPLAY_SERVICE_CLASS);
mSystemServiceManager.startService(WEAR_TIME_SERVICE_CLASS);
traceEnd();
}
@@ -1643,7 +1636,7 @@
final TelephonyRegistry telephonyRegistryF = telephonyRegistry;
final MediaRouterService mediaRouterF = mediaRouter;
final MmsServiceBroker mmsServiceF = mmsService;
- final IpSecService ipSecServiceF = ipSecService;
+ final WindowManagerService windowManagerF = wm;
// We now tell the activity manager it is okay to run third party
// code. It will call back into us once it has gotten to the state
@@ -1683,7 +1676,7 @@
traceBeginAndSlog("StartSystemUI");
try {
- startSystemUi(context);
+ startSystemUi(context, windowManagerF);
} catch (Throwable e) {
reportWtf("starting System UI", e);
}
@@ -1707,13 +1700,6 @@
.networkScoreAndNetworkManagementServiceReady();
}
traceEnd();
- traceBeginAndSlog("MakeIpSecServiceReady");
- try {
- if (ipSecServiceF != null) ipSecServiceF.systemReady();
- } catch (Throwable e) {
- reportWtf("making IpSec Service ready", e);
- }
- traceEnd();
traceBeginAndSlog("MakeNetworkStatsServiceReady");
try {
if (networkStatsF != null) networkStatsF.systemReady();
@@ -1837,13 +1823,14 @@
}, BOOT_TIMINGS_TRACE_LOG);
}
- static final void startSystemUi(Context context) {
+ static final void startSystemUi(Context context, WindowManagerService windowManager) {
Intent intent = new Intent();
intent.setComponent(new ComponentName("com.android.systemui",
"com.android.systemui.SystemUIService"));
intent.addFlags(Intent.FLAG_DEBUG_TRIAGED_MISSING);
//Slog.d(TAG, "Starting service: " + intent);
context.startServiceAsUser(intent, UserHandle.SYSTEM);
+ windowManager.onSystemUiStarted();
}
private static void traceBeginAndSlog(String name) {
diff --git a/services/net/java/android/net/util/SharedLog.java b/services/net/java/android/net/util/SharedLog.java
new file mode 100644
index 0000000..343d237
--- /dev/null
+++ b/services/net/java/android/net/util/SharedLog.java
@@ -0,0 +1,132 @@
+/*
+ * Copyright (C) 2017 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 android.net.util;
+
+import android.text.TextUtils;
+import android.util.LocalLog;
+import android.util.Log;
+
+import java.io.FileDescriptor;
+import java.io.PrintWriter;
+import java.util.StringJoiner;
+
+
+/**
+ * Class to centralize logging functionality for tethering.
+ *
+ * All access to class methods other than dump() must be on the same thread.
+ *
+ * @hide
+ */
+public class SharedLog {
+ private final static int DEFAULT_MAX_RECORDS = 500;
+ private final static String COMPONENT_DELIMITER = ".";
+
+ private enum Category {
+ NONE,
+ ERROR,
+ MARK,
+ WARN,
+ };
+
+ private final LocalLog mLocalLog;
+ // The tag to use for output to the system log. This is not output to the
+ // LocalLog because that would be redundant.
+ private final String mTag;
+ // The component (or subcomponent) of a system that is sharing this log.
+ // This can grow in depth if components call forSubComponent() to obtain
+ // their SharedLog instance. The tag is not included in the component for
+ // brevity.
+ private final String mComponent;
+
+ public SharedLog(String tag) {
+ this(DEFAULT_MAX_RECORDS, tag);
+ }
+
+ public SharedLog(int maxRecords, String tag) {
+ this(new LocalLog(maxRecords), tag, tag);
+ }
+
+ private SharedLog(LocalLog localLog, String tag, String component) {
+ mLocalLog = localLog;
+ mTag = tag;
+ mComponent = component;
+ }
+
+ public SharedLog forSubComponent(String component) {
+ if (!isRootLogInstance()) {
+ component = mComponent + COMPONENT_DELIMITER + component;
+ }
+ return new SharedLog(mLocalLog, mTag, component);
+ }
+
+ public void dump(FileDescriptor fd, PrintWriter writer, String[] args) {
+ mLocalLog.readOnlyLocalLog().dump(fd, writer, args);
+ }
+
+ //////
+ // Methods that both log an entry and emit it to the system log.
+ //////
+
+ public void e(Exception e) {
+ Log.e(mTag, record(Category.ERROR, e.toString()));
+ }
+
+ public void e(String msg) {
+ Log.e(mTag, record(Category.ERROR, msg));
+ }
+
+ public void i(String msg) {
+ Log.i(mTag, record(Category.NONE, msg));
+ }
+
+ public void w(String msg) {
+ Log.w(mTag, record(Category.WARN, msg));
+ }
+
+ //////
+ // Methods that only log an entry (and do NOT emit to the system log).
+ //////
+
+ public void log(String msg) {
+ record(Category.NONE, msg);
+ }
+
+ public void mark(String msg) {
+ record(Category.MARK, msg);
+ }
+
+ private String record(Category category, String msg) {
+ final String entry = logLine(category, msg);
+ mLocalLog.log(entry);
+ return entry;
+ }
+
+ private String logLine(Category category, String msg) {
+ final StringJoiner sj = new StringJoiner(" ");
+ if (!isRootLogInstance()) sj.add("[" + mComponent + "]");
+ if (category != Category.NONE) sj.add(category.toString());
+ return sj.add(msg).toString();
+ }
+
+ // Check whether this SharedLog instance is nominally the top level in
+ // a potential hierarchy of shared logs (the root of a tree),
+ // or is a subcomponent within the hierarchy.
+ private boolean isRootLogInstance() {
+ return TextUtils.isEmpty(mComponent) || mComponent.equals(mTag);
+ }
+}
diff --git a/services/tests/notification/src/com/android/server/notification/NotificationChannelTest.java b/services/tests/notification/src/com/android/server/notification/NotificationChannelTest.java
new file mode 100644
index 0000000..3007cb1
--- /dev/null
+++ b/services/tests/notification/src/com/android/server/notification/NotificationChannelTest.java
@@ -0,0 +1,53 @@
+/*
+ * Copyright (C) 2017 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.server.notification;
+
+import static android.app.NotificationManager.IMPORTANCE_DEFAULT;
+
+import static junit.framework.Assert.assertEquals;
+
+import android.app.NotificationChannel;
+import android.os.Parcel;
+import android.support.test.runner.AndroidJUnit4;
+import android.test.suitebuilder.annotation.SmallTest;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+@SmallTest
+@RunWith(AndroidJUnit4.class)
+public class NotificationChannelTest extends NotificationTestCase {
+
+ @Test
+ public void testWriteToParcel() {
+ NotificationChannel channel =
+ new NotificationChannel("1", "one", IMPORTANCE_DEFAULT);
+ Parcel parcel = Parcel.obtain();
+ channel.writeToParcel(parcel, 0);
+ parcel.setDataPosition(0);
+ NotificationChannel channel1 = NotificationChannel.CREATOR.createFromParcel(parcel);
+ assertEquals(channel, channel1);
+ }
+
+ @Test
+ public void testSystemBlockable() {
+ NotificationChannel channel = new NotificationChannel("a", "ab", IMPORTANCE_DEFAULT);
+ assertEquals(false, channel.isBlockableSystem());
+ channel.setBlockableSystem(true);
+ assertEquals(true, channel.isBlockableSystem());
+ }
+}
diff --git a/services/tests/notification/src/com/android/server/notification/RankingHelperTest.java b/services/tests/notification/src/com/android/server/notification/RankingHelperTest.java
index 2c9c114..5a72e6b 100644
--- a/services/tests/notification/src/com/android/server/notification/RankingHelperTest.java
+++ b/services/tests/notification/src/com/android/server/notification/RankingHelperTest.java
@@ -18,6 +18,7 @@
import static android.app.NotificationManager.IMPORTANCE_DEFAULT;
import static android.app.NotificationManager.IMPORTANCE_HIGH;
import static android.app.NotificationManager.IMPORTANCE_LOW;
+import static android.app.NotificationManager.IMPORTANCE_MAX;
import static android.app.NotificationManager.IMPORTANCE_NONE;
import static android.app.NotificationManager.IMPORTANCE_UNSPECIFIED;
@@ -27,6 +28,7 @@
import org.json.JSONArray;
import org.json.JSONObject;
import org.junit.Before;
+import org.junit.Ignore;
import org.junit.Test;
import org.junit.runner.RunWith;
@@ -50,15 +52,11 @@
import android.os.Build;
import android.os.UserHandle;
import android.provider.Settings.Secure;
-import android.service.notification.NotificationListenerService;
import android.service.notification.StatusBarNotification;
import android.support.test.InstrumentationRegistry;
import android.support.test.runner.AndroidJUnit4;
import android.test.suitebuilder.annotation.SmallTest;
-import android.testing.TestableContext;
-import android.testing.TestableSettingsProvider;
import android.util.ArrayMap;
-import android.util.Slog;
import android.util.Xml;
import java.io.BufferedInputStream;
@@ -87,10 +85,10 @@
public class RankingHelperTest extends NotificationTestCase {
private static final String PKG = "com.android.server.notification";
private static final int UID = 0;
- private static final UserHandle USER = UserHandle.getUserHandleForUid(UID);
+ private static final UserHandle USER = UserHandle.of(0);
private static final String UPDATED_PKG = "updatedPkg";
- private static final int UID2 = 1111111;
- private static final UserHandle USER2 = UserHandle.getUserHandleForUid(UID2);
+ private static final int UID2 = 1111;
+ private static final UserHandle USER2 = UserHandle.of(10);
private static final String TEST_CHANNEL_ID = "test_channel_id";
@Mock NotificationUsageStats mUsageStats;
@@ -123,6 +121,7 @@
when(mPm.getApplicationInfoAsUser(eq(PKG), anyInt(), anyInt())).thenReturn(legacy);
when(mPm.getApplicationInfoAsUser(eq(UPDATED_PKG), anyInt(), anyInt())).thenReturn(upgrade);
when(mPm.getPackageUidAsUser(eq(PKG), anyInt())).thenReturn(UID);
+ when(mPm.getPackageUidAsUser(eq(UPDATED_PKG), anyInt())).thenReturn(UID2);
when(mContext.getResources()).thenReturn(
InstrumentationRegistry.getContext().getResources());
when(mContext.getPackageManager()).thenReturn(mPm);
@@ -198,24 +197,21 @@
ByteArrayOutputStream baos = new ByteArrayOutputStream();
serializer.setOutput(new BufferedOutputStream(baos), "utf-8");
serializer.startDocument(null, true);
- serializer.startTag(null, "ranking");
mHelper.writeXml(serializer, forBackup);
- serializer.endTag(null, "ranking");
serializer.endDocument();
serializer.flush();
-
for (String channelId : channelIds) {
mHelper.permanentlyDeleteNotificationChannel(pkg, uid, channelId);
}
return baos;
}
- private void loadStreamXml(ByteArrayOutputStream stream) throws Exception {
+ private void loadStreamXml(ByteArrayOutputStream stream, boolean forRestore) throws Exception {
XmlPullParser parser = Xml.newPullParser();
parser.setInput(new BufferedInputStream(new ByteArrayInputStream(stream.toByteArray())),
null);
parser.nextTag();
- mHelper.readXml(parser, false);
+ mHelper.readXml(parser, forRestore);
}
private void compareChannels(NotificationChannel expected, NotificationChannel actual) {
@@ -322,7 +318,7 @@
channel2.getId(), NotificationChannel.DEFAULT_CHANNEL_ID);
mHelper.onPackagesChanged(true, UserHandle.myUserId(), new String[]{PKG}, new int[]{UID});
- loadStreamXml(baos);
+ loadStreamXml(baos, false);
assertTrue(mHelper.canShowBadge(PKG, UID));
assertEquals(channel1, mHelper.getNotificationChannel(PKG, UID, channel1.getId(), false));
@@ -353,6 +349,76 @@
}
@Test
+ public void testChannelXmlForBackup() throws Exception {
+ NotificationChannelGroup ncg = new NotificationChannelGroup("1", "bye");
+ NotificationChannelGroup ncg2 = new NotificationChannelGroup("2", "hello");
+ NotificationChannel channel1 =
+ new NotificationChannel("id1", "name1", NotificationManager.IMPORTANCE_HIGH);
+ NotificationChannel channel2 =
+ new NotificationChannel("id2", "name2", IMPORTANCE_LOW);
+ channel2.setDescription("descriptions for all");
+ channel2.setSound(new Uri.Builder().scheme("test").build(), mAudioAttributes);
+ channel2.enableLights(true);
+ channel2.setBypassDnd(true);
+ channel2.setLockscreenVisibility(Notification.VISIBILITY_SECRET);
+ channel2.enableVibration(false);
+ channel2.setGroup(ncg.getId());
+ channel2.setLightColor(Color.BLUE);
+ NotificationChannel channel3 = new NotificationChannel("id3", "NAM3", IMPORTANCE_HIGH);
+ channel3.enableVibration(true);
+
+ mHelper.createNotificationChannelGroup(PKG, UID, ncg, true);
+ mHelper.createNotificationChannelGroup(PKG, UID, ncg2, true);
+ mHelper.createNotificationChannel(PKG, UID, channel1, true);
+ mHelper.createNotificationChannel(PKG, UID, channel2, false);
+ mHelper.createNotificationChannel(PKG, UID, channel3, false);
+ mHelper.createNotificationChannel(UPDATED_PKG, UID2, getChannel(), true);
+
+ mHelper.setShowBadge(PKG, UID, true);
+
+ mHelper.setImportance(UPDATED_PKG, UID2, IMPORTANCE_NONE);
+
+ ByteArrayOutputStream baos = writeXmlAndPurge(PKG, UID, true, channel1.getId(),
+ channel2.getId(), channel3.getId(), NotificationChannel.DEFAULT_CHANNEL_ID);
+ mHelper.onPackagesChanged(true, UserHandle.myUserId(), new String[]{PKG, UPDATED_PKG},
+ new int[]{UID, UID2});
+
+ mHelper.setShowBadge(UPDATED_PKG, UID2, true);
+
+ loadStreamXml(baos, true);
+
+ assertEquals(IMPORTANCE_NONE, mHelper.getImportance(UPDATED_PKG, UID2));
+ assertTrue(mHelper.canShowBadge(PKG, UID));
+ assertEquals(channel1, mHelper.getNotificationChannel(PKG, UID, channel1.getId(), false));
+ compareChannels(channel2,
+ mHelper.getNotificationChannel(PKG, UID, channel2.getId(), false));
+ compareChannels(channel3,
+ mHelper.getNotificationChannel(PKG, UID, channel3.getId(), false));
+
+ List<NotificationChannelGroup> actualGroups =
+ mHelper.getNotificationChannelGroups(PKG, UID, false).getList();
+ boolean foundNcg = false;
+ for (NotificationChannelGroup actual : actualGroups) {
+ if (ncg.getId().equals(actual.getId())) {
+ foundNcg = true;
+ compareGroups(ncg, actual);
+ } else if (ncg2.getId().equals(actual.getId())) {
+ compareGroups(ncg2, actual);
+ }
+ }
+ assertTrue(foundNcg);
+
+ boolean foundChannel2Group = false;
+ for (NotificationChannelGroup actual : actualGroups) {
+ if (channel2.getGroup().equals(actual.getChannels().get(0).getGroup())) {
+ foundChannel2Group = true;
+ break;
+ }
+ }
+ assertTrue(foundChannel2Group);
+ }
+
+ @Test
public void testChannelXml_backup() throws Exception {
NotificationChannelGroup ncg = new NotificationChannelGroup("1", "bye");
NotificationChannelGroup ncg2 = new NotificationChannelGroup("2", "hello");
@@ -396,7 +462,7 @@
ByteArrayOutputStream baos = writeXmlAndPurge(PKG, UID, false,
NotificationChannel.DEFAULT_CHANNEL_ID);
- loadStreamXml(baos);
+ loadStreamXml(baos, false);
final NotificationChannel updated = mHelper.getNotificationChannel(PKG, UID,
NotificationChannel.DEFAULT_CHANNEL_ID, false);
@@ -416,7 +482,7 @@
ByteArrayOutputStream baos = writeXmlAndPurge(PKG, UID, false,
NotificationChannel.DEFAULT_CHANNEL_ID);
- loadStreamXml(baos);
+ loadStreamXml(baos, false);
assertEquals(NotificationManager.IMPORTANCE_LOW, mHelper.getNotificationChannel(
PKG, UID, NotificationChannel.DEFAULT_CHANNEL_ID, false).getImportance());
@@ -464,7 +530,7 @@
final ApplicationInfo upgraded = new ApplicationInfo();
upgraded.targetSdkVersion = Build.VERSION_CODES.N_MR1 + 1;
when(mPm.getApplicationInfoAsUser(eq(PKG), anyInt(), anyInt())).thenReturn(upgraded);
- loadStreamXml(baos);
+ loadStreamXml(baos, false);
// Default Channel should be gone.
assertEquals(null, mHelper.getNotificationChannel(PKG, UID,
@@ -482,7 +548,7 @@
final ApplicationInfo upgraded = new ApplicationInfo();
upgraded.targetSdkVersion = Build.VERSION_CODES.N_MR1 + 1;
when(mPm.getApplicationInfoAsUser(eq(PKG), anyInt(), anyInt())).thenReturn(upgraded);
- loadStreamXml(baos);
+ loadStreamXml(baos, false);
// Default Channel should be gone.
assertEquals(null, mHelper.getNotificationChannel(PKG, UID,
@@ -496,7 +562,7 @@
mHelper.createNotificationChannel(PKG, UID,
new NotificationChannel("bananas", "bananas", IMPORTANCE_LOW), true);
- loadStreamXml(baos);
+ loadStreamXml(baos, false);
// Should still have the newly created channel that wasn't in the xml.
assertTrue(mHelper.getNotificationChannel(PKG, UID, "bananas", false) != null);
@@ -511,14 +577,32 @@
}
@Test
- public void testCreateChannel_ImportanceNone() throws Exception {
+ public void testCreateChannel_badImportance() throws Exception {
try {
mHelper.createNotificationChannel(PKG, UID,
- new NotificationChannel("bananas", "bananas", IMPORTANCE_NONE), true);
- fail("Was allowed to create a blocked channel");
+ new NotificationChannel("bananas", "bananas", IMPORTANCE_NONE - 1), true);
+ fail("Was allowed to create a channel with invalid importance");
} catch (IllegalArgumentException e) {
// yay
}
+ try {
+ mHelper.createNotificationChannel(PKG, UID,
+ new NotificationChannel("bananas", "bananas", IMPORTANCE_UNSPECIFIED), true);
+ fail("Was allowed to create a channel with invalid importance");
+ } catch (IllegalArgumentException e) {
+ // yay
+ }
+ try {
+ mHelper.createNotificationChannel(PKG, UID,
+ new NotificationChannel("bananas", "bananas", IMPORTANCE_MAX + 1), true);
+ fail("Was allowed to create a channel with invalid importance");
+ } catch (IllegalArgumentException e) {
+ // yay
+ }
+ mHelper.createNotificationChannel(PKG, UID,
+ new NotificationChannel("bananas", "bananas", IMPORTANCE_NONE), true);
+ mHelper.createNotificationChannel(PKG, UID,
+ new NotificationChannel("bananas", "bananas", IMPORTANCE_MAX), true);
}
@@ -1046,6 +1130,24 @@
}
@Test
+ public void testOnPackageChange_downgradeTargetSdk() throws Exception {
+ // create channel as api 26
+ mHelper.createNotificationChannel(UPDATED_PKG, UID2, getChannel(), true);
+
+ // install new app version targeting 25
+ final ApplicationInfo legacy = new ApplicationInfo();
+ legacy.targetSdkVersion = Build.VERSION_CODES.N_MR1;
+ when(mPm.getApplicationInfoAsUser(eq(UPDATED_PKG), anyInt(), anyInt())).thenReturn(legacy);
+ mHelper.onPackagesChanged(
+ false, UserHandle.USER_SYSTEM, new String[]{UPDATED_PKG}, new int[]{UID2});
+
+ // make sure the default channel was readded
+ //assertEquals(2, mHelper.getNotificationChannels(UPDATED_PKG, UID2, false).getList().size());
+ assertNotNull(mHelper.getNotificationChannel(
+ UPDATED_PKG, UID2, NotificationChannel.DEFAULT_CHANNEL_ID, false));
+ }
+
+ @Test
public void testRecordDefaults() throws Exception {
assertEquals(NotificationManager.IMPORTANCE_UNSPECIFIED, mHelper.getImportance(PKG, UID));
assertEquals(true, mHelper.canShowBadge(PKG, UID));
@@ -1252,5 +1354,4 @@
assertFalse(mHelper.badgingEnabled(USER));
assertTrue(mHelper.badgingEnabled(USER2));
}
-
}
diff --git a/services/tests/servicestests/src/com/android/server/am/ActivityTestsBase.java b/services/tests/servicestests/src/com/android/server/am/ActivityTestsBase.java
index 9cfa542..bac1216 100644
--- a/services/tests/servicestests/src/com/android/server/am/ActivityTestsBase.java
+++ b/services/tests/servicestests/src/com/android/server/am/ActivityTestsBase.java
@@ -235,8 +235,7 @@
if (mStackId == ActivityManager.StackId.PINNED_STACK_ID) {
mStack = new PinnedActivityStack(this, recents, mOnTop) {
@Override
- Rect getPictureInPictureBounds(float aspectRatio,
- boolean useExistingStackBounds) {
+ Rect getDefaultPictureInPictureBounds(float aspectRatio) {
return new Rect(50, 50, 100, 100);
}
};
diff --git a/services/tests/servicestests/src/com/android/server/am/CoreSettingsObserverTest.java b/services/tests/servicestests/src/com/android/server/am/CoreSettingsObserverTest.java
index 19defe1..2f202d98 100644
--- a/services/tests/servicestests/src/com/android/server/am/CoreSettingsObserverTest.java
+++ b/services/tests/servicestests/src/com/android/server/am/CoreSettingsObserverTest.java
@@ -36,6 +36,7 @@
import org.junit.Before;
import org.junit.BeforeClass;
+import org.junit.Ignore;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
@@ -58,6 +59,7 @@
* Run: adb shell am instrument -e class com.android.server.am.CoreSettingsObserverTest -w \
* com.android.frameworks.servicestests/android.support.test.runner.AndroidJUnitRunner
*/
+@Ignore
@SmallTest
@RunWith(AndroidJUnit4.class)
public class CoreSettingsObserverTest {
diff --git a/services/tests/servicestests/src/com/android/server/net/ConnOnActivityStartTest.java b/services/tests/servicestests/src/com/android/server/net/ConnOnActivityStartTest.java
index 9014539..f02cf51 100644
--- a/services/tests/servicestests/src/com/android/server/net/ConnOnActivityStartTest.java
+++ b/services/tests/servicestests/src/com/android/server/net/ConnOnActivityStartTest.java
@@ -54,6 +54,7 @@
import org.junit.AfterClass;
import org.junit.BeforeClass;
+import org.junit.Ignore;
import org.junit.Test;
import org.junit.runner.RunWith;
@@ -78,6 +79,7 @@
* Run: adb shell am instrument -e class com.android.server.net.ConnOnActivityStartTest -w \
* com.android.frameworks.servicestests/android.support.test.runner.AndroidJUnitRunner
*/
+@Ignore
@LargeTest
@RunWith(AndroidJUnit4.class)
public class ConnOnActivityStartTest {
diff --git a/services/tests/servicestests/src/com/android/server/pm/PackageManagerSettingsTests.java b/services/tests/servicestests/src/com/android/server/pm/PackageManagerSettingsTests.java
index 5e4ba7be..25ba66e 100644
--- a/services/tests/servicestests/src/com/android/server/pm/PackageManagerSettingsTests.java
+++ b/services/tests/servicestests/src/com/android/server/pm/PackageManagerSettingsTests.java
@@ -25,9 +25,12 @@
import static org.hamcrest.CoreMatchers.not;
import static org.hamcrest.CoreMatchers.notNullValue;
import static org.hamcrest.CoreMatchers.nullValue;
+import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotSame;
+import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertSame;
import static org.junit.Assert.assertThat;
+import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;
import android.annotation.NonNull;
@@ -37,6 +40,7 @@
import android.content.pm.UserInfo;
import android.os.UserHandle;
import android.os.UserManagerInternal;
+import android.security.keystore.ArrayUtils;
import android.support.test.InstrumentationRegistry;
import android.support.test.runner.AndroidJUnit4;
import android.test.suitebuilder.annotation.SmallTest;
@@ -57,6 +61,7 @@
import java.io.IOException;
import java.security.PublicKey;
import java.util.ArrayList;
+import java.util.Arrays;
import java.util.List;
@RunWith(AndroidJUnit4.class)
@@ -527,6 +532,41 @@
false /*notLaunched*/, false /*stopped*/, true /*installed*/);
}
+ @Test
+ public void testInsertPackageSetting() {
+ final PackageSetting ps = createPackageSetting(0 /*sharedUserId*/, 0 /*pkgFlags*/);
+ final PackageParser.Package pkg = new PackageParser.Package(PACKAGE_NAME);
+ pkg.applicationInfo.setCodePath(ps.codePathString);
+ pkg.applicationInfo.setResourcePath(ps.resourcePathString);
+ final Settings settings =
+ new Settings(InstrumentationRegistry.getContext().getFilesDir(), new Object());
+ pkg.usesStaticLibraries = new ArrayList<>(
+ Arrays.asList("foo.bar1", "foo.bar2", "foo.bar3"));
+ pkg.usesStaticLibrariesVersions = new int[] {2, 4, 6};
+ settings.insertPackageSettingLPw(ps, pkg);
+ assertEquals(pkg, ps.pkg);
+ assertArrayEquals(pkg.usesStaticLibraries.toArray(new String[0]), ps.usesStaticLibraries);
+ assertArrayEquals(pkg.usesStaticLibrariesVersions, ps.usesStaticLibrariesVersions);
+
+ pkg.usesStaticLibraries = null;
+ pkg.usesStaticLibrariesVersions = null;
+ settings.insertPackageSettingLPw(ps, pkg);
+ assertEquals(pkg, ps.pkg);
+ assertNull("Actual: " + Arrays.toString(ps.usesStaticLibraries), ps.usesStaticLibraries);
+ assertNull("Actual: " + Arrays.toString(ps.usesStaticLibrariesVersions),
+ ps.usesStaticLibrariesVersions);
+ }
+
+ private <T> void assertArrayEquals(T[] a, T[] b) {
+ assertTrue("Expected: " + Arrays.toString(a) + ", actual: " + Arrays.toString(b),
+ Arrays.equals(a, b));
+ }
+
+ private void assertArrayEquals(int[] a, int[] b) {
+ assertTrue("Expected: " + Arrays.toString(a) + ", actual: " + Arrays.toString(b),
+ Arrays.equals(a, b));
+ }
+
private void verifyUserState(PackageUserState userState, PackageUserState oldUserState,
boolean userStateChanged) {
verifyUserState(userState, oldUserState, userStateChanged, false /*notLaunched*/,
diff --git a/services/tests/servicestests/src/com/android/server/wm/AppWindowContainerControllerTests.java b/services/tests/servicestests/src/com/android/server/wm/AppWindowContainerControllerTests.java
index da3b9c9..65a5632 100644
--- a/services/tests/servicestests/src/com/android/server/wm/AppWindowContainerControllerTests.java
+++ b/services/tests/servicestests/src/com/android/server/wm/AppWindowContainerControllerTests.java
@@ -19,18 +19,24 @@
import org.junit.Test;
import android.platform.test.annotations.Presubmit;
+import android.platform.test.annotations.SecurityTest;
import android.support.test.InstrumentationRegistry;
import android.support.test.filters.SmallTest;
import android.support.test.runner.AndroidJUnit4;
+import android.view.WindowManager;
import static android.content.pm.ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE;
import static android.content.pm.ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED;
import static android.content.res.Configuration.EMPTY;
+import static android.view.WindowManager.LayoutParams.TYPE_APPLICATION_STARTING;
import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.fail;
+import java.util.function.Consumer;
+
/**
* Test class for {@link AppWindowContainerController}.
*
@@ -90,6 +96,9 @@
assertNull(atoken.startingSurface);
assertNull(atoken.startingWindow);
assertNull(atoken.startingData);
+ atoken.forAllWindows(windowState -> {
+ assertFalse(windowState.getBaseType() == TYPE_APPLICATION_STARTING);
+ }, true);
}
@Test
@@ -108,6 +117,22 @@
}
@Test
+ public void testAddRemoveRace() throws Exception {
+
+ // There was once a race condition between adding and removing starting windows
+ for (int i = 0; i < 1000; i++) {
+ final WindowTestUtils.TestAppWindowContainerController controller =
+ createAppWindowController();
+ controller.addStartingWindow(InstrumentationRegistry.getContext().getPackageName(),
+ android.R.style.Theme, null, "Test", 0, 0, 0, 0, null, true, true, false, true,
+ false);
+ controller.removeStartingWindow();
+ waitUntilHandlersIdle();
+ assertNoStartingWindow(controller.getAppWindowToken(mDisplayContent));
+ }
+ }
+
+ @Test
public void testTransferStartingWindow() throws Exception {
final WindowTestUtils.TestAppWindowContainerController controller1 =
createAppWindowController();
diff --git a/services/tests/servicestests/src/com/android/server/wm/AppWindowTokenTests.java b/services/tests/servicestests/src/com/android/server/wm/AppWindowTokenTests.java
index 46f10c1..36083bf 100644
--- a/services/tests/servicestests/src/com/android/server/wm/AppWindowTokenTests.java
+++ b/services/tests/servicestests/src/com/android/server/wm/AppWindowTokenTests.java
@@ -30,13 +30,15 @@
import static android.content.pm.ActivityInfo.SCREEN_ORIENTATION_REVERSE_LANDSCAPE;
import static android.content.pm.ActivityInfo.SCREEN_ORIENTATION_UNSET;
import static android.view.WindowManager.LayoutParams.FIRST_SUB_WINDOW;
+import static android.view.WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD;
+import static android.view.WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED;
import static android.view.WindowManager.LayoutParams.TYPE_APPLICATION;
import static android.view.WindowManager.LayoutParams.TYPE_APPLICATION_STARTING;
import static android.view.WindowManager.LayoutParams.TYPE_BASE_APPLICATION;
import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertTrue;
-
/**
* Tests for the {@link AppWindowToken} class.
*
@@ -184,4 +186,31 @@
// Can specify orientation if the current orientation candidate is orientation behind.
assertEquals(SCREEN_ORIENTATION_LANDSCAPE, token.getOrientation(SCREEN_ORIENTATION_BEHIND));
}
+
+ @Test
+ public void testKeyguardFlagsDuringRelaunch() throws Exception {
+ final WindowTestUtils.TestAppWindowToken token =
+ new WindowTestUtils.TestAppWindowToken(mDisplayContent);
+ final WindowManager.LayoutParams attrs = new WindowManager.LayoutParams(
+ TYPE_BASE_APPLICATION);
+ attrs.flags |= FLAG_SHOW_WHEN_LOCKED | FLAG_DISMISS_KEYGUARD;
+ attrs.setTitle("AppWindow");
+ final WindowTestUtils.TestWindowState appWindow = createWindowState(attrs, token);
+
+ // Add window with show when locked flag
+ token.addWindow(appWindow);
+ assertTrue(token.containsShowWhenLockedWindow() && token.containsDismissKeyguardWindow());
+
+ // Start relaunching
+ token.startRelaunching();
+ assertTrue(token.containsShowWhenLockedWindow() && token.containsDismissKeyguardWindow());
+
+ // Remove window and make sure that we still report back flag
+ token.removeChild(appWindow);
+ assertTrue(token.containsShowWhenLockedWindow() && token.containsDismissKeyguardWindow());
+
+ // Finish relaunching and ensure flag is now not reported
+ token.finishRelaunching();
+ assertFalse(token.containsShowWhenLockedWindow() || token.containsDismissKeyguardWindow());
+ }
}
diff --git a/services/tests/servicestests/src/com/android/server/wm/BoundsAnimationControllerTests.java b/services/tests/servicestests/src/com/android/server/wm/BoundsAnimationControllerTests.java
index cd7a7c7..ee09f4b 100644
--- a/services/tests/servicestests/src/com/android/server/wm/BoundsAnimationControllerTests.java
+++ b/services/tests/servicestests/src/com/android/server/wm/BoundsAnimationControllerTests.java
@@ -152,8 +152,6 @@
mAwaitingAnimationStart = false;
mAnimationStarted = true;
mSchedulePipModeChangedOnStart = schedulePipModeChangedCallback;
-
- mController.onAllWindowsDrawn();
}
@Override
@@ -207,6 +205,9 @@
throw new IllegalArgumentException("Call restart() to restart an animation");
}
+ boolean fromFullscreen = from.equals(BOUNDS_FULL);
+ boolean toFullscreen = to.equals(BOUNDS_FULL);
+
mTarget.initialize(from);
// Started, not running
@@ -215,6 +216,15 @@
startImpl(from, to);
+ // Ensure that the animator is paused for the all windows drawn signal when animating
+ // to/from fullscreen
+ if (fromFullscreen || toFullscreen) {
+ assertTrue(mAnimator.isPaused());
+ mController.onAllWindowsDrawn();
+ } else {
+ assertTrue(!mAnimator.isPaused());
+ }
+
// Started and running
assertTrue(!mTarget.mAwaitingAnimationStart);
assertTrue(mTarget.mAnimationStarted);
@@ -262,7 +272,7 @@
? SCHEDULE_PIP_MODE_CHANGED_ON_END
: NO_PIP_MODE_CHANGED_CALLBACKS;
mAnimator = mController.animateBoundsImpl(mTarget, from, to, DURATION,
- schedulePipModeChangedState, toFullscreen);
+ schedulePipModeChangedState, fromFullscreen, toFullscreen);
// Original stack bounds, frozen task bounds
assertEquals(mFrom, mTarget.mStackBounds);
diff --git a/services/tests/servicestests/src/com/android/server/wm/TaskSnapshotPersisterLoaderTest.java b/services/tests/servicestests/src/com/android/server/wm/TaskSnapshotPersisterLoaderTest.java
index 8108909..39c0de8 100644
--- a/services/tests/servicestests/src/com/android/server/wm/TaskSnapshotPersisterLoaderTest.java
+++ b/services/tests/servicestests/src/com/android/server/wm/TaskSnapshotPersisterLoaderTest.java
@@ -90,14 +90,42 @@
long ms = SystemClock.elapsedRealtime();
mPersister.persistSnapshot(1, mTestUserId, createSnapshot());
mPersister.persistSnapshot(2, mTestUserId, createSnapshot());
- mPersister.persistSnapshot(3, mTestUserId, createSnapshot());
- mPersister.persistSnapshot(4, mTestUserId, createSnapshot());
- mPersister.persistSnapshot(5, mTestUserId, createSnapshot());
- mPersister.persistSnapshot(6, mTestUserId, createSnapshot());
+ mPersister.removeObsoleteFiles(new ArraySet<>(), new int[] { mTestUserId });
+ mPersister.removeObsoleteFiles(new ArraySet<>(), new int[] { mTestUserId });
+ mPersister.removeObsoleteFiles(new ArraySet<>(), new int[] { mTestUserId });
+ mPersister.removeObsoleteFiles(new ArraySet<>(), new int[] { mTestUserId });
mPersister.waitForQueueEmpty();
assertTrue(SystemClock.elapsedRealtime() - ms > 500);
}
+ /**
+ * Tests that too many store write queue items are being purged.
+ */
+ @Test
+ public void testPurging() {
+ mPersister.persistSnapshot(100, mTestUserId, createSnapshot());
+ mPersister.waitForQueueEmpty();
+ mPersister.setPaused(true);
+ mPersister.persistSnapshot(1, mTestUserId, createSnapshot());
+ mPersister.removeObsoleteFiles(new ArraySet<>(), new int[] { mTestUserId });
+ mPersister.persistSnapshot(2, mTestUserId, createSnapshot());
+ mPersister.persistSnapshot(3, mTestUserId, createSnapshot());
+ mPersister.persistSnapshot(4, mTestUserId, createSnapshot());
+ mPersister.setPaused(false);
+ mPersister.waitForQueueEmpty();
+
+ // Make sure 1,2 were purged but removeObsoleteFiles wasn't.
+ final File[] existsFiles = new File[] {
+ new File(sFilesDir.getPath() + "/snapshots/3.proto"),
+ new File(sFilesDir.getPath() + "/snapshots/4.proto")};
+ final File[] nonExistsFiles = new File[] {
+ new File(sFilesDir.getPath() + "/snapshots/100.proto"),
+ new File(sFilesDir.getPath() + "/snapshots/1.proto"),
+ new File(sFilesDir.getPath() + "/snapshots/1.proto")};
+ assertTrueForFiles(existsFiles, File::exists, " must exist");
+ assertTrueForFiles(nonExistsFiles, file -> !file.exists(), " must not exist");
+ }
+
@Test
public void testGetTaskId() {
RemoveObsoleteFilesQueueItem removeObsoleteFilesQueueItem =
diff --git a/services/tests/servicestests/src/com/android/server/wm/TestWindowManagerPolicy.java b/services/tests/servicestests/src/com/android/server/wm/TestWindowManagerPolicy.java
index be53667..c457cb3 100644
--- a/services/tests/servicestests/src/com/android/server/wm/TestWindowManagerPolicy.java
+++ b/services/tests/servicestests/src/com/android/server/wm/TestWindowManagerPolicy.java
@@ -366,6 +366,11 @@
}
@Override
+ public void screenTurningOff(ScreenOffListener screenOffListener) {
+
+ }
+
+ @Override
public void screenTurnedOff() {
}
@@ -632,5 +637,14 @@
@Override
public void setRecentsVisibilityLw(boolean visible) {
- }
+ }
+
+ @Override
+ public void onSystemUiStarted() {
+ }
+
+ @Override
+ public boolean canDismissBootAnimation() {
+ return true;
+ }
}
diff --git a/services/tests/servicestests/src/com/android/server/wm/WindowStateTests.java b/services/tests/servicestests/src/com/android/server/wm/WindowStateTests.java
index 5f51898..c809c32 100644
--- a/services/tests/servicestests/src/com/android/server/wm/WindowStateTests.java
+++ b/services/tests/servicestests/src/com/android/server/wm/WindowStateTests.java
@@ -16,6 +16,8 @@
package com.android.server.wm;
+import android.util.MergedConfiguration;
+import android.view.WindowManager;
import org.junit.Test;
import org.junit.runner.RunWith;
@@ -204,4 +206,20 @@
assertEquals(mediaChild, windows.pollFirst());
assertTrue(windows.isEmpty());
}
+
+ @Test
+ public void testPrepareWindowToDisplayDuringRelayout() throws Exception {
+ testPrepareWindowToDisplayDuringRelayout(false /*wasVisible*/);
+ testPrepareWindowToDisplayDuringRelayout(true /*wasVisible*/);
+ }
+
+ private void testPrepareWindowToDisplayDuringRelayout(boolean wasVisible) {
+ final WindowState root = createWindow(null, TYPE_APPLICATION, "root");
+ root.mAttrs.flags |= WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON;
+ root.mTurnOnScreen = false;
+
+ root.prepareWindowToDisplayDuringRelayout(new MergedConfiguration(),
+ wasVisible /*wasVisible*/);
+ assertTrue(root.mTurnOnScreen);
+ }
}
diff --git a/services/tests/servicestests/src/com/android/server/wm/WindowTestsBase.java b/services/tests/servicestests/src/com/android/server/wm/WindowTestsBase.java
index 32eee84..6618a69 100644
--- a/services/tests/servicestests/src/com/android/server/wm/WindowTestsBase.java
+++ b/services/tests/servicestests/src/com/android/server/wm/WindowTestsBase.java
@@ -115,6 +115,10 @@
"mChildAppWindowAbove");
mChildAppWindowBelow = createCommonWindow(mAppWindow, TYPE_APPLICATION_MEDIA_OVERLAY,
"mChildAppWindowBelow");
+
+ // Adding a display will cause freezing the display. Make sure to wait until it's unfrozen
+ // to not run into race conditions with the tests.
+ waitUntilHandlersIdle();
}
@After
@@ -135,6 +139,9 @@
mDisplayContent.removeImmediately();
sWm.mInputMethodTarget = null;
}
+
+ // Wait until everything is really cleaned up.
+ waitUntilHandlersIdle();
}
private WindowState createCommonWindow(WindowState parent, int type, String name) {
diff --git a/services/usage/java/com/android/server/usage/StorageStatsService.java b/services/usage/java/com/android/server/usage/StorageStatsService.java
index 16b73d5..562443f 100644
--- a/services/usage/java/com/android/server/usage/StorageStatsService.java
+++ b/services/usage/java/com/android/server/usage/StorageStatsService.java
@@ -62,6 +62,8 @@
import com.android.server.pm.Installer.InstallerException;
import com.android.server.storage.CacheQuotaStrategy;
+import java.io.File;
+import java.io.FileNotFoundException;
import java.io.IOException;
public class StorageStatsService extends IStorageStatsManager.Stub {
@@ -181,29 +183,42 @@
public long getFreeBytes(String volumeUuid, String callingPackage) {
// NOTE: No permissions required
- long cacheBytes = 0;
final long token = Binder.clearCallingIdentity();
try {
+ final File path;
+ try {
+ path = mStorage.findPathForUuid(volumeUuid);
+ } catch (FileNotFoundException e) {
+ throw new ParcelableException(e);
+ }
+
+ // Free space is usable bytes plus any cached data that we're
+ // willing to automatically clear. To avoid user confusion, this
+ // logic should be kept in sync with getAllocatableBytes().
if (isQuotaSupported(volumeUuid, callingPackage)) {
- for (UserInfo user : mUser.getUsers()) {
- final StorageStats stats = queryStatsForUser(volumeUuid, user.id, null);
- cacheBytes += stats.cacheBytes;
- }
+ final long cacheTotal = getCacheBytes(volumeUuid, callingPackage);
+ final long cacheReserved = mStorage.getStorageCacheBytes(path);
+ final long cacheClearable = Math.max(0, cacheTotal - cacheReserved);
+
+ return path.getUsableSpace() + cacheClearable;
+ } else {
+ return path.getUsableSpace();
}
} finally {
Binder.restoreCallingIdentity(token);
}
+ }
- if (volumeUuid == StorageManager.UUID_PRIVATE_INTERNAL) {
- return Environment.getDataDirectory().getFreeSpace() + cacheBytes;
- } else {
- final VolumeInfo vol = mStorage.findVolumeByUuid(volumeUuid);
- if (vol == null) {
- throw new ParcelableException(
- new IOException("Failed to find storage device for UUID " + volumeUuid));
- }
- return vol.getPath().getFreeSpace() + cacheBytes;
+ @Override
+ public long getCacheBytes(String volumeUuid, String callingPackage) {
+ enforcePermission(Binder.getCallingUid(), callingPackage);
+
+ long cacheBytes = 0;
+ for (UserInfo user : mUser.getUsers()) {
+ final StorageStats stats = queryStatsForUser(volumeUuid, user.id, null);
+ cacheBytes += stats.cacheBytes;
}
+ return cacheBytes;
}
@Override
diff --git a/services/usage/java/com/android/server/usage/UsageStatsService.java b/services/usage/java/com/android/server/usage/UsageStatsService.java
index 0de3c7c..073a17e 100644
--- a/services/usage/java/com/android/server/usage/UsageStatsService.java
+++ b/services/usage/java/com/android/server/usage/UsageStatsService.java
@@ -411,8 +411,8 @@
}
}
- private boolean shouldObfuscateInstantAppsForCaller(int callingUid) {
- return !mPackageManagerInternal.canAccessInstantApps(callingUid);
+ private boolean shouldObfuscateInstantAppsForCaller(int callingUid, int userId) {
+ return !mPackageManagerInternal.canAccessInstantApps(callingUid, userId);
}
void clearAppIdleForPackage(String packageName, int userId) {
@@ -831,6 +831,9 @@
final UserUsageStatsService service =
getUserDataAndInitializeIfNeededLocked(userId, timeNow);
List<UsageStats> list = service.queryUsageStats(bucketType, beginTime, endTime);
+ if (list == null) {
+ return null;
+ }
// Mangle instant app names *using their current state (not whether they were ephemeral
// when the data was recorded)*.
@@ -1387,7 +1390,7 @@
}
final boolean obfuscateInstantApps = shouldObfuscateInstantAppsForCaller(
- Binder.getCallingUid());
+ Binder.getCallingUid(), UserHandle.getCallingUserId());
final int userId = UserHandle.getCallingUserId();
final long token = Binder.clearCallingIdentity();
@@ -1432,7 +1435,7 @@
}
final boolean obfuscateInstantApps = shouldObfuscateInstantAppsForCaller(
- Binder.getCallingUid());
+ Binder.getCallingUid(), UserHandle.getCallingUserId());
final int userId = UserHandle.getCallingUserId();
final long token = Binder.clearCallingIdentity();
@@ -1453,7 +1456,7 @@
throw re.rethrowFromSystemServer();
}
final boolean obfuscateInstantApps = shouldObfuscateInstantAppsForCaller(
- Binder.getCallingUid());
+ Binder.getCallingUid(), userId);
final long token = Binder.clearCallingIdentity();
try {
return UsageStatsService.this.isAppIdleFilteredOrParoled(packageName, userId,
diff --git a/services/usb/java/com/android/server/usb/UsbDeviceManager.java b/services/usb/java/com/android/server/usb/UsbDeviceManager.java
index 0a67669..26a406f 100644
--- a/services/usb/java/com/android/server/usb/UsbDeviceManager.java
+++ b/services/usb/java/com/android/server/usb/UsbDeviceManager.java
@@ -63,7 +63,6 @@
import java.util.HashMap;
import java.util.Locale;
import java.util.Map;
-import java.util.Random;
import java.util.Scanner;
import java.util.Set;
@@ -538,7 +537,6 @@
oldFunctions = UsbManager.USB_FUNCTION_NONE;
}
- Slog.i(TAG, "Setting adb to " + String.valueOf(enable));
setEnabledFunctions(oldFunctions, true, mUsbDataUnlocked);
updateAdbNotification();
}
@@ -766,16 +764,15 @@
// send broadcast intent only if the USB state has changed
if (!isUsbStateChanged(intent)) {
- Slog.i(TAG, "skip broadcasting " + intent + " extras: " + intent.getExtras());
+ if (DEBUG) {
+ Slog.d(TAG, "skip broadcasting " + intent + " extras: " + intent.getExtras());
+ }
return;
}
- mBroadcastedIntent = intent;
- Random rand = new Random();
- intent.putExtra("random_tag", rand.nextInt(1000));
- Slog.i(TAG, "broadcasting " + intent + " extras: " + intent.getExtras());
+ if (DEBUG) Slog.d(TAG, "broadcasting " + intent + " extras: " + intent.getExtras());
mContext.sendStickyBroadcastAsUser(intent, UserHandle.ALL);
- intent.removeExtra("random_tag");
+ mBroadcastedIntent = intent;
}
private void updateUsbFunctions() {
@@ -844,7 +841,6 @@
updateUsbNotification();
updateAdbNotification();
if (mBootCompleted) {
- Slog.i(TAG, "update state " + mConnected + " " + mConfigured);
updateUsbStateBroadcastIfNeeded(false);
}
if (UsbManager.containsFunction(mCurrentFunctions,
@@ -854,7 +850,6 @@
if (mBootCompleted) {
if (!mConnected) {
// restore defaults when USB is disconnected
- Slog.i(TAG, "Disconnect, setting usb functions to null");
setEnabledFunctions(null, !mAdbEnabled, false);
}
updateUsbFunctions();
@@ -887,7 +882,6 @@
break;
case MSG_SET_CURRENT_FUNCTIONS:
String functions = (String) msg.obj;
- Slog.i(TAG, "Getting setFunction command for " + functions);
setEnabledFunctions(functions, false, msg.arg1 == 1);
break;
case MSG_UPDATE_USER_RESTRICTIONS:
@@ -895,8 +889,6 @@
final boolean forceRestart = mUsbDataUnlocked
&& isUsbDataTransferActive()
&& !isUsbTransferAllowed();
- Slog.i(TAG, "Updating user restrictions, force restart is "
- + String.valueOf(forceRestart));
setEnabledFunctions(
mCurrentFunctions, forceRestart, mUsbDataUnlocked && !forceRestart);
break;
@@ -911,7 +903,6 @@
updateUsbStateBroadcastIfNeeded(false);
mPendingBootBroadcast = false;
}
- Slog.i(TAG, "Boot complete, setting default functions");
setEnabledFunctions(null, false, false);
if (mCurrentAccessory != null) {
getCurrentSettings().accessoryAttached(mCurrentAccessory);
@@ -929,7 +920,6 @@
Slog.v(TAG, "Current user switched to " + msg.arg1
+ "; resetting USB host stack for MTP or PTP");
// avoid leaking sensitive data from previous user
- Slog.i(TAG, "User Switched, kicking usb stack");
setEnabledFunctions(mCurrentFunctions, true, false);
}
mCurrentUser = msg.arg1;
diff --git a/telecomm/java/android/telecom/Connection.java b/telecomm/java/android/telecom/Connection.java
index dc0c485..f373785 100644
--- a/telecomm/java/android/telecom/Connection.java
+++ b/telecomm/java/android/telecom/Connection.java
@@ -523,6 +523,26 @@
public static final String EVENT_CALL_MERGE_FAILED = "android.telecom.event.CALL_MERGE_FAILED";
/**
+ * Connection event used to inform {@link InCallService}s when the process of merging a
+ * Connection into a conference has begun.
+ * <p>
+ * Sent via {@link #sendConnectionEvent(String, Bundle)}. The {@link Bundle} parameter is
+ * expected to be null when this connection event is used.
+ * @hide
+ */
+ public static final String EVENT_MERGE_START = "android.telecom.event.MERGE_START";
+
+ /**
+ * Connection event used to inform {@link InCallService}s when the process of merging a
+ * Connection into a conference has completed.
+ * <p>
+ * Sent via {@link #sendConnectionEvent(String, Bundle)}. The {@link Bundle} parameter is
+ * expected to be null when this connection event is used.
+ * @hide
+ */
+ public static final String EVENT_MERGE_COMPLETE = "android.telecom.event.MERGE_COMPLETE";
+
+ /**
* Connection event used to inform {@link InCallService}s when a call has been put on hold by
* the remote party.
* <p>
diff --git a/telecomm/java/android/telecom/ConnectionService.java b/telecomm/java/android/telecom/ConnectionService.java
index bf8f8e4..a9655d8 100644
--- a/telecomm/java/android/telecom/ConnectionService.java
+++ b/telecomm/java/android/telecom/ConnectionService.java
@@ -100,6 +100,7 @@
private static final String SESSION_ADD_CS_ADAPTER = "CS.aCSA";
private static final String SESSION_REMOVE_CS_ADAPTER = "CS.rCSA";
private static final String SESSION_CREATE_CONN = "CS.crCo";
+ private static final String SESSION_CREATE_CONN_COMPLETE = "CS.crCoC";
private static final String SESSION_CREATE_CONN_FAILED = "CS.crCoF";
private static final String SESSION_ABORT = "CS.ab";
private static final String SESSION_ANSWER = "CS.an";
@@ -152,6 +153,7 @@
private static final int MSG_ON_START_RTT = 26;
private static final int MSG_ON_STOP_RTT = 27;
private static final int MSG_RTT_UPGRADE_RESPONSE = 28;
+ private static final int MSG_CREATE_CONNECTION_COMPLETE = 29;
private static Connection sNullConnection;
@@ -221,6 +223,19 @@
}
@Override
+ public void createConnectionComplete(String id, Session.Info sessionInfo) {
+ Log.startSession(sessionInfo, SESSION_CREATE_CONN_COMPLETE);
+ try {
+ SomeArgs args = SomeArgs.obtain();
+ args.arg1 = id;
+ args.arg2 = Log.createSubsession();
+ mHandler.obtainMessage(MSG_CREATE_CONNECTION_COMPLETE, args).sendToTarget();
+ } finally {
+ Log.endSession();
+ }
+ }
+
+ @Override
public void createConnectionFailed(
PhoneAccountHandle connectionManagerPhoneAccount,
String callId,
@@ -630,6 +645,33 @@
}
break;
}
+ case MSG_CREATE_CONNECTION_COMPLETE: {
+ SomeArgs args = (SomeArgs) msg.obj;
+ Log.continueSession((Session) args.arg2,
+ SESSION_HANDLER + SESSION_CREATE_CONN_COMPLETE);
+ try {
+ final String id = (String) args.arg1;
+ if (!mAreAccountsInitialized) {
+ Log.d(this, "Enqueueing pre-init request %s", id);
+ mPreInitializationConnectionRequests.add(
+ new android.telecom.Logging.Runnable(
+ SESSION_HANDLER + SESSION_CREATE_CONN_COMPLETE
+ + ".pICR",
+ null /*lock*/) {
+ @Override
+ public void loggedRun() {
+ notifyCreateConnectionComplete(id);
+ }
+ }.prepare());
+ } else {
+ notifyCreateConnectionComplete(id);
+ }
+ } finally {
+ args.recycle();
+ Log.endSession();
+ }
+ break;
+ }
case MSG_CREATE_CONNECTION_FAILED: {
SomeArgs args = (SomeArgs) msg.obj;
Log.continueSession((Session) args.arg3, SESSION_HANDLER +
@@ -1373,6 +1415,17 @@
}
}
+ /**
+ * Called by Telecom when the creation of a new Connection has completed and it is now added
+ * to Telecom.
+ * @param callId The ID of the connection.
+ */
+ private void notifyCreateConnectionComplete(final String callId) {
+ Log.i(this, "notifyCreateConnectionComplete %s", callId);
+ onCreateConnectionComplete(findConnectionForAction(callId,
+ "notifyCreateConnectionComplete"));
+ }
+
private void abort(String callId) {
Log.d(this, "abort %s", callId);
findConnectionForAction(callId, "abort").onAbort();
@@ -1770,10 +1823,28 @@
*/
public final void addExistingConnection(PhoneAccountHandle phoneAccountHandle,
Connection connection) {
+ addExistingConnection(phoneAccountHandle, connection, null /* conference */);
+ }
+
+ /**
+ * Adds a connection created by the {@link ConnectionService} and informs telecom of the new
+ * connection.
+ *
+ * @param phoneAccountHandle The phone account handle for the connection.
+ * @param connection The connection to add.
+ * @param conference The parent conference of the new connection.
+ * @hide
+ */
+ public final void addExistingConnection(PhoneAccountHandle phoneAccountHandle,
+ Connection connection, Conference conference) {
String id = addExistingConnectionInternal(phoneAccountHandle, connection);
if (id != null) {
List<String> emptyList = new ArrayList<>(0);
+ String conferenceId = null;
+ if (conference != null) {
+ conferenceId = mIdByConference.get(conference);
+ }
ParcelableConnection parcelableConnection = new ParcelableConnection(
phoneAccountHandle,
@@ -1794,7 +1865,8 @@
connection.getStatusHints(),
connection.getDisconnectCause(),
emptyList,
- connection.getExtras());
+ connection.getExtras(),
+ conferenceId);
mAdapter.addExistingConnection(id, parcelableConnection);
}
}
@@ -1836,6 +1908,18 @@
}
/**
+ * Called after the {@link Connection} returned by
+ * {@link #onCreateIncomingConnection(PhoneAccountHandle, ConnectionRequest)}
+ * or {@link #onCreateOutgoingConnection(PhoneAccountHandle, ConnectionRequest)} has been
+ * added to the {@link ConnectionService} and sent to Telecom.
+ *
+ * @param connection the {@link Connection}.
+ * @hide
+ */
+ public void onCreateConnectionComplete(Connection connection) {
+ }
+
+ /**
* Called by Telecom to inform the {@link ConnectionService} that its request to create a new
* incoming {@link Connection} was denied.
* <p>
diff --git a/telecomm/java/android/telecom/ParcelableConnection.java b/telecomm/java/android/telecom/ParcelableConnection.java
index e9dba68..434abf5 100644
--- a/telecomm/java/android/telecom/ParcelableConnection.java
+++ b/telecomm/java/android/telecom/ParcelableConnection.java
@@ -51,6 +51,35 @@
private final DisconnectCause mDisconnectCause;
private final List<String> mConferenceableConnectionIds;
private final Bundle mExtras;
+ private String mParentCallId;
+
+ /** @hide */
+ public ParcelableConnection(
+ PhoneAccountHandle phoneAccount,
+ int state,
+ int capabilities,
+ int properties,
+ int supportedAudioRoutes,
+ Uri address,
+ int addressPresentation,
+ String callerDisplayName,
+ int callerDisplayNamePresentation,
+ IVideoProvider videoProvider,
+ int videoState,
+ boolean ringbackRequested,
+ boolean isVoipAudioMode,
+ long connectTimeMillis,
+ StatusHints statusHints,
+ DisconnectCause disconnectCause,
+ List<String> conferenceableConnectionIds,
+ Bundle extras,
+ String parentCallId) {
+ this(phoneAccount, state, capabilities, properties, supportedAudioRoutes, address,
+ addressPresentation, callerDisplayName, callerDisplayNamePresentation,
+ videoProvider, videoState, ringbackRequested, isVoipAudioMode, connectTimeMillis,
+ statusHints, disconnectCause, conferenceableConnectionIds, extras);
+ mParentCallId = parentCallId;
+ }
/** @hide */
public ParcelableConnection(
@@ -90,6 +119,7 @@
mDisconnectCause = disconnectCause;
mConferenceableConnectionIds = conferenceableConnectionIds;
mExtras = extras;
+ mParentCallId = null;
}
public PhoneAccountHandle getPhoneAccount() {
@@ -176,6 +206,10 @@
return mExtras;
}
+ public final String getParentCallId() {
+ return mParentCallId;
+ }
+
@Override
public String toString() {
return new StringBuilder()
@@ -189,6 +223,8 @@
.append(Connection.propertiesToString(mConnectionProperties))
.append(", extras:")
.append(mExtras)
+ .append(", parent:")
+ .append(mParentCallId)
.toString();
}
@@ -218,6 +254,7 @@
Bundle extras = Bundle.setDefusable(source.readBundle(classLoader), true);
int properties = source.readInt();
int supportedAudioRoutes = source.readInt();
+ String parentCallId = source.readString();
return new ParcelableConnection(
phoneAccount,
@@ -237,7 +274,8 @@
statusHints,
disconnectCause,
conferenceableConnectionIds,
- extras);
+ extras,
+ parentCallId);
}
@Override
@@ -274,5 +312,6 @@
destination.writeBundle(mExtras);
destination.writeInt(mConnectionProperties);
destination.writeInt(mSupportedAudioRoutes);
+ destination.writeString(mParentCallId);
}
}
diff --git a/telecomm/java/com/android/internal/telecom/IConnectionService.aidl b/telecomm/java/com/android/internal/telecom/IConnectionService.aidl
index c631d08..e428286 100644
--- a/telecomm/java/com/android/internal/telecom/IConnectionService.aidl
+++ b/telecomm/java/com/android/internal/telecom/IConnectionService.aidl
@@ -47,6 +47,8 @@
boolean isUnknown,
in Session.Info sessionInfo);
+ void createConnectionComplete(String callId, in Session.Info sessionInfo);
+
void createConnectionFailed(in PhoneAccountHandle connectionManagerPhoneAccount, String callId,
in ConnectionRequest request, boolean isIncoming, in Session.Info sessionInfo);
diff --git a/telephony/java/android/telephony/PhoneNumberUtils.java b/telephony/java/android/telephony/PhoneNumberUtils.java
index bc5e4d5..fa7b9b0 100644
--- a/telephony/java/android/telephony/PhoneNumberUtils.java
+++ b/telephony/java/android/telephony/PhoneNumberUtils.java
@@ -1449,6 +1449,11 @@
* @hide
*/
public static boolean isInternationalNumber(String phoneNumber, String defaultCountryIso) {
+ // If no phone number is provided, it can't be international.
+ if (TextUtils.isEmpty(phoneNumber)) {
+ return false;
+ }
+
// If it starts with # or * its not international.
if (phoneNumber.startsWith("#") || phoneNumber.startsWith("*")) {
return false;
diff --git a/tests/HwAccelerationTest/AndroidManifest.xml b/tests/HwAccelerationTest/AndroidManifest.xml
index b4f3d69..9caf9d0 100644
--- a/tests/HwAccelerationTest/AndroidManifest.xml
+++ b/tests/HwAccelerationTest/AndroidManifest.xml
@@ -113,6 +113,15 @@
</activity>
<activity
+ android:name="DrawIntoHwBitmapActivity"
+ android:label="Bitmaps/DrawIntoHwBitmap">
+ <intent-filter>
+ <action android:name="android.intent.action.MAIN" />
+ <category android:name="com.android.test.hwui.TEST" />
+ </intent-filter>
+ </activity>
+
+ <activity
android:name="PathOffsetActivity"
android:label="Path/Offset">
<intent-filter>
diff --git a/tests/HwAccelerationTest/src/com/android/test/hwui/DrawIntoHwBitmapActivity.java b/tests/HwAccelerationTest/src/com/android/test/hwui/DrawIntoHwBitmapActivity.java
new file mode 100644
index 0000000..faabdfc
--- /dev/null
+++ b/tests/HwAccelerationTest/src/com/android/test/hwui/DrawIntoHwBitmapActivity.java
@@ -0,0 +1,65 @@
+/*
+ * Copyright (C) 2017 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.test.hwui;
+
+import static android.graphics.GraphicBuffer.USAGE_HW_TEXTURE;
+import static android.graphics.GraphicBuffer.USAGE_SW_READ_NEVER;
+import static android.graphics.GraphicBuffer.USAGE_SW_WRITE_NEVER;
+import static android.graphics.GraphicBuffer.USAGE_SW_WRITE_RARELY;
+
+import android.app.Activity;
+import android.graphics.Bitmap;
+import android.graphics.Canvas;
+import android.graphics.Color;
+import android.graphics.GraphicBuffer;
+import android.graphics.Paint;
+import android.graphics.PixelFormat;
+import android.graphics.SurfaceTexture;
+import android.os.Bundle;
+import android.view.DisplayListCanvas;
+import android.view.RenderNode;
+import android.view.Surface;
+import android.view.ThreadedRenderer;
+import android.widget.ImageView;
+
+public class DrawIntoHwBitmapActivity extends Activity {
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ ImageView view = new ImageView(this);
+ view.setScaleType(ImageView.ScaleType.CENTER_INSIDE);
+ setContentView(view);
+ view.setImageBitmap(createBitmap());
+ }
+
+ Bitmap createBitmap() {
+ RenderNode node = RenderNode.create("HwuiCanvas", null);
+ node.setLeftTopRightBottom(0, 0, 500, 500);
+ node.setClipToBounds(false);
+ DisplayListCanvas canvas = node.start(500, 500);
+ Paint p = new Paint();
+ p.setColor(Color.BLACK);
+ p.setTextSize(20 * getResources().getDisplayMetrics().density);
+ canvas.drawColor(0xFF2196F3);
+ p.setColor(0xFFBBDEFB);
+ canvas.drawRect(0, 0, 500, 100, p);
+ p.setColor(Color.BLACK);
+ canvas.drawText("Hello, World!", 0, 90, p);
+ node.end(canvas);
+ return ThreadedRenderer.createHardwareBitmap(node, 500, 500);
+ }
+}
diff --git a/tests/net/java/android/net/util/SharedLogTest.java b/tests/net/java/android/net/util/SharedLogTest.java
new file mode 100644
index 0000000..7fd7a63
--- /dev/null
+++ b/tests/net/java/android/net/util/SharedLogTest.java
@@ -0,0 +1,94 @@
+/*
+ * Copyright (C) 2017 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 android.net.util;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+
+import android.support.test.filters.SmallTest;
+import android.support.test.runner.AndroidJUnit4;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+import java.io.ByteArrayOutputStream;
+import java.io.PrintWriter;
+import java.util.ArrayList;
+import java.util.Vector;
+
+@RunWith(AndroidJUnit4.class)
+@SmallTest
+public class SharedLogTest {
+ private static final String TIMESTAMP_PATTERN =
+ "^[0-9][0-9]-[0-9][0-9] [0-9][0-9]:[0-9][0-9]:[0-9][0-9].[0-9][0-9][0-9]";
+ private static final String TIMESTAMP = "mm-dd HH:MM:SS.xxx";
+
+ @Test
+ public void testBasicOperation() {
+ final SharedLog logTop = new SharedLog("top");
+ logTop.mark("first post!");
+
+ final SharedLog logLevel2a = logTop.forSubComponent("twoA");
+ final SharedLog logLevel2b = logTop.forSubComponent("twoB");
+ logLevel2b.e("2b or not 2b");
+ logLevel2a.w("second post?");
+
+ final SharedLog logLevel3 = logLevel2a.forSubComponent("three");
+ logTop.log("still logging");
+ logLevel3.log("3 >> 2");
+ logLevel2a.mark("ok: last post");
+
+ final String[] expected = {
+ TIMESTAMP + " - MARK first post!",
+ TIMESTAMP + " - [twoB] ERROR 2b or not 2b",
+ TIMESTAMP + " - [twoA] WARN second post?",
+ TIMESTAMP + " - still logging",
+ TIMESTAMP + " - [twoA.three] 3 >> 2",
+ TIMESTAMP + " - [twoA] MARK ok: last post",
+ };
+ // Verify the logs are all there and in the correct order.
+ verifyLogLines(expected, logTop);
+
+ // In fact, because they all share the same underlying LocalLog,
+ // every subcomponent SharedLog's dump() is identical.
+ verifyLogLines(expected, logLevel2a);
+ verifyLogLines(expected, logLevel2b);
+ verifyLogLines(expected, logLevel3);
+ }
+
+ private static void verifyLogLines(String[] expected, SharedLog log) {
+ final ByteArrayOutputStream ostream = new ByteArrayOutputStream();
+ final PrintWriter pw = new PrintWriter(ostream, true);
+ log.dump(null, pw, null);
+
+ final String dumpOutput = ostream.toString();
+ assertTrue(dumpOutput != null);
+ assertTrue(!"".equals(dumpOutput));
+
+ final String[] lines = dumpOutput.split("\n");
+ assertEquals(expected.length, lines.length);
+
+ for (int i = 0; i < lines.length; i++) {
+ // Fix up the timestamps.
+ lines[i] = lines[i].replaceAll(TIMESTAMP_PATTERN, TIMESTAMP);
+ }
+
+ for (int i = 0; i < expected.length; i++) {
+ assertEquals(expected[i], lines[i]);
+ }
+ }
+}
diff --git a/tests/net/java/com/android/server/connectivity/tethering/TetherInterfaceStateMachineTest.java b/tests/net/java/com/android/server/connectivity/tethering/TetherInterfaceStateMachineTest.java
index a3f33dc..27e683c 100644
--- a/tests/net/java/com/android/server/connectivity/tethering/TetherInterfaceStateMachineTest.java
+++ b/tests/net/java/com/android/server/connectivity/tethering/TetherInterfaceStateMachineTest.java
@@ -38,6 +38,7 @@
import android.net.ConnectivityManager;
import android.net.INetworkStatsService;
import android.net.InterfaceConfiguration;
+import android.net.util.SharedLog;
import android.os.INetworkManagementService;
import android.os.RemoteException;
import android.os.test.TestLooper;
@@ -63,12 +64,14 @@
@Mock private IControlsTethering mTetherHelper;
@Mock private InterfaceConfiguration mInterfaceConfiguration;
@Mock private IPv6TetheringInterfaceServices mIPv6TetheringInterfaceServices;
+ @Mock private SharedLog mSharedLog;
private final TestLooper mLooper = new TestLooper();
private TetherInterfaceStateMachine mTestedSm;
private void initStateMachine(int interfaceType) throws Exception {
- mTestedSm = new TetherInterfaceStateMachine(IFACE_NAME, mLooper.getLooper(), interfaceType,
+ mTestedSm = new TetherInterfaceStateMachine(
+ IFACE_NAME, mLooper.getLooper(), interfaceType, mSharedLog,
mNMService, mStatsService, mTetherHelper, mIPv6TetheringInterfaceServices);
mTestedSm.start();
// Starting the state machine always puts us in a consistent state and notifies
@@ -90,12 +93,13 @@
@Before public void setUp() throws Exception {
MockitoAnnotations.initMocks(this);
+ when(mSharedLog.forSubComponent(anyString())).thenReturn(mSharedLog);
}
@Test
public void startsOutAvailable() {
mTestedSm = new TetherInterfaceStateMachine(IFACE_NAME, mLooper.getLooper(),
- TETHERING_BLUETOOTH, mNMService, mStatsService, mTetherHelper,
+ TETHERING_BLUETOOTH, mSharedLog, mNMService, mStatsService, mTetherHelper,
mIPv6TetheringInterfaceServices);
mTestedSm.start();
mLooper.dispatchAll();
diff --git a/tests/net/java/com/android/server/connectivity/tethering/TetheringConfigurationTest.java b/tests/net/java/com/android/server/connectivity/tethering/TetheringConfigurationTest.java
index 9fcd1b5..ddceea2 100644
--- a/tests/net/java/com/android/server/connectivity/tethering/TetheringConfigurationTest.java
+++ b/tests/net/java/com/android/server/connectivity/tethering/TetheringConfigurationTest.java
@@ -128,5 +128,8 @@
assertTrue(cfg.preferredUpstreamIfaceTypes.contains(TYPE_MOBILE_DUN));
// Just to prove we haven't clobbered Wi-Fi:
assertTrue(cfg.preferredUpstreamIfaceTypes.contains(TYPE_WIFI));
+ // Check that we have not added new cellular interface types
+ assertFalse(cfg.preferredUpstreamIfaceTypes.contains(TYPE_MOBILE));
+ assertFalse(cfg.preferredUpstreamIfaceTypes.contains(TYPE_MOBILE_HIPRI));
}
}
diff --git a/tests/net/java/com/android/server/connectivity/tethering/UpstreamNetworkMonitorTest.java b/tests/net/java/com/android/server/connectivity/tethering/UpstreamNetworkMonitorTest.java
index c72efb0..9bb392a 100644
--- a/tests/net/java/com/android/server/connectivity/tethering/UpstreamNetworkMonitorTest.java
+++ b/tests/net/java/com/android/server/connectivity/tethering/UpstreamNetworkMonitorTest.java
@@ -25,11 +25,13 @@
import static org.junit.Assert.fail;
import static org.mockito.Mockito.any;
import static org.mockito.Mockito.anyInt;
+import static org.mockito.Mockito.anyString;
import static org.mockito.Mockito.reset;
import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.verifyNoMoreInteractions;
+import static org.mockito.Mockito.when;
import android.content.Context;
import android.os.Handler;
@@ -40,6 +42,7 @@
import android.net.Network;
import android.net.NetworkCapabilities;
import android.net.NetworkRequest;
+import android.net.util.SharedLog;
import android.support.test.filters.SmallTest;
import android.support.test.runner.AndroidJUnit4;
@@ -69,6 +72,7 @@
@Mock private Context mContext;
@Mock private IConnectivityManager mCS;
+ @Mock private SharedLog mLog;
private TestStateMachine mSM;
private TestConnectivityManager mCM;
@@ -78,10 +82,12 @@
MockitoAnnotations.initMocks(this);
reset(mContext);
reset(mCS);
+ reset(mLog);
+ when(mLog.forSubComponent(anyString())).thenReturn(mLog);
mCM = spy(new TestConnectivityManager(mContext, mCS));
mSM = new TestStateMachine();
- mUNM = new UpstreamNetworkMonitor(mSM, EVENT_UNM_UPDATE, (ConnectivityManager) mCM);
+ mUNM = new UpstreamNetworkMonitor(mSM, EVENT_UNM_UPDATE, (ConnectivityManager) mCM, mLog);
}
@After public void tearDown() throws Exception {
diff --git a/tests/testables/src/android/testing/ViewUtils.java b/tests/testables/src/android/testing/ViewUtils.java
index 5a651aa..fca44ae 100644
--- a/tests/testables/src/android/testing/ViewUtils.java
+++ b/tests/testables/src/android/testing/ViewUtils.java
@@ -31,12 +31,10 @@
LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT,
LayoutParams.TYPE_APPLICATION_OVERLAY,
0, PixelFormat.TRANSLUCENT);
- InstrumentationRegistry.getContext()
- .getSystemService(WindowManager.class).addView(view, lp);
+ view.getContext().getSystemService(WindowManager.class).addView(view, lp);
}
public static void detachView(View view) {
- InstrumentationRegistry.getContext()
- .getSystemService(WindowManager.class).removeViewImmediate(view);
+ view.getContext().getSystemService(WindowManager.class).removeViewImmediate(view);
}
}
diff --git a/tools/aapt2/Android.bp b/tools/aapt2/Android.bp
index b460258..b2f1f62 100644
--- a/tools/aapt2/Android.bp
+++ b/tools/aapt2/Android.bp
@@ -99,6 +99,7 @@
"link/PrivateAttributeMover.cpp",
"link/ReferenceLinker.cpp",
"link/TableMerger.cpp",
+ "link/XmlCompatVersioner.cpp",
"link/XmlNamespaceRemover.cpp",
"link/XmlReferenceLinker.cpp",
"optimize/ResourceDeduper.cpp",
@@ -159,7 +160,7 @@
cc_test_host {
name: "aapt2_tests",
srcs: ["**/*_test.cpp"],
- static_libs: ["libaapt2"],
+ static_libs: ["libaapt2", "libgmock"],
defaults: ["aapt_defaults"],
}
diff --git a/tools/aapt2/Debug.h b/tools/aapt2/Debug.h
index 56e2e95..e2456c7 100644
--- a/tools/aapt2/Debug.h
+++ b/tools/aapt2/Debug.h
@@ -37,6 +37,7 @@
const ResourceName& target_style);
static void DumpHex(const void* data, size_t len);
static void DumpXml(xml::XmlResource* doc);
+ static std::string ToString(xml::XmlResource* doc);
};
} // namespace aapt
diff --git a/tools/aapt2/Format.proto b/tools/aapt2/Format.proto
index 0917129..870b735 100644
--- a/tools/aapt2/Format.proto
+++ b/tools/aapt2/Format.proto
@@ -69,6 +69,7 @@
optional Visibility visibility = 1;
optional Source source = 2;
optional string comment = 3;
+ optional bool allow_new = 4;
}
message Entry {
diff --git a/tools/aapt2/Main.cpp b/tools/aapt2/Main.cpp
index e45d142..1d2e3a4 100644
--- a/tools/aapt2/Main.cpp
+++ b/tools/aapt2/Main.cpp
@@ -27,7 +27,7 @@
static const char* sMajorVersion = "2";
// Update minor version whenever a feature or flag is added.
-static const char* sMinorVersion = "15";
+static const char* sMinorVersion = "16";
int PrintVersion() {
std::cerr << "Android Asset Packaging Tool (aapt) " << sMajorVersion << "."
diff --git a/tools/aapt2/Resource.h b/tools/aapt2/Resource.h
index 493f238..0a74c1a 100644
--- a/tools/aapt2/Resource.h
+++ b/tools/aapt2/Resource.h
@@ -388,13 +388,20 @@
struct hash<aapt::ResourceName> {
size_t operator()(const aapt::ResourceName& name) const {
android::hash_t h = 0;
- h = android::JenkinsHashMix(h, hash<string>()(name.package));
+ h = android::JenkinsHashMix(h, static_cast<uint32_t>(hash<string>()(name.package)));
h = android::JenkinsHashMix(h, static_cast<uint32_t>(name.type));
- h = android::JenkinsHashMix(h, hash<string>()(name.entry));
+ h = android::JenkinsHashMix(h, static_cast<uint32_t>(hash<string>()(name.entry)));
return static_cast<size_t>(h);
}
};
+template <>
+struct hash<aapt::ResourceId> {
+ size_t operator()(const aapt::ResourceId& id) const {
+ return id.id;
+ }
+};
+
} // namespace std
#endif // AAPT_RESOURCE_H
diff --git a/tools/aapt2/ResourceParser.cpp b/tools/aapt2/ResourceParser.cpp
index 0d1850f..57ae270 100644
--- a/tools/aapt2/ResourceParser.cpp
+++ b/tools/aapt2/ResourceParser.cpp
@@ -92,14 +92,14 @@
Source source;
ResourceId id;
Maybe<SymbolState> symbol_state;
+ bool allow_new = false;
std::string comment;
std::unique_ptr<Value> value;
std::list<ParsedResource> child_resources;
};
// Recursively adds resources to the ResourceTable.
-static bool AddResourcesToTable(ResourceTable* table, IDiagnostics* diag,
- ParsedResource* res) {
+static bool AddResourcesToTable(ResourceTable* table, IDiagnostics* diag, ParsedResource* res) {
StringPiece trimmed_comment = util::TrimWhitespace(res->comment);
if (trimmed_comment.size() != res->comment.size()) {
// Only if there was a change do we re-assign.
@@ -111,6 +111,7 @@
symbol.state = res->symbol_state.value();
symbol.source = res->source;
symbol.comment = res->comment;
+ symbol.allow_new = res->allow_new;
if (!table->SetSymbolState(res->name, res->id, symbol, diag)) {
return false;
}
@@ -121,8 +122,8 @@
res->value->SetComment(std::move(res->comment));
res->value->SetSource(std::move(res->source));
- if (!table->AddResource(res->name, res->id, res->config, res->product,
- std::move(res->value), diag)) {
+ if (!table->AddResource(res->name, res->id, res->config, res->product, std::move(res->value),
+ diag)) {
return false;
}
}
@@ -849,6 +850,7 @@
ParsedResource* out_resource) {
if (ParseSymbolImpl(parser, out_resource)) {
out_resource->symbol_state = SymbolState::kUndefined;
+ out_resource->allow_new = true;
return true;
}
return false;
diff --git a/tools/aapt2/ResourceParser_test.cpp b/tools/aapt2/ResourceParser_test.cpp
index faa6607..e3abde6 100644
--- a/tools/aapt2/ResourceParser_test.cpp
+++ b/tools/aapt2/ResourceParser_test.cpp
@@ -777,8 +777,7 @@
ASSERT_FALSE(TestParse(input));
}
-TEST_F(ResourceParserTest,
- AddResourcesElementShouldAddEntryWithUndefinedSymbol) {
+TEST_F(ResourceParserTest, AddResourcesElementShouldAddEntryWithUndefinedSymbol) {
std::string input = R"EOF(<add-resource name="bar" type="string" />)EOF";
ASSERT_TRUE(TestParse(input));
@@ -788,6 +787,7 @@
const ResourceEntry* entry = result.value().entry;
ASSERT_NE(nullptr, entry);
EXPECT_EQ(SymbolState::kUndefined, entry->symbol_status.state);
+ EXPECT_TRUE(entry->symbol_status.allow_new);
}
TEST_F(ResourceParserTest, ParseItemElementWithFormat) {
diff --git a/tools/aapt2/ResourceTable.cpp b/tools/aapt2/ResourceTable.cpp
index 1947628..168004f 100644
--- a/tools/aapt2/ResourceTable.cpp
+++ b/tools/aapt2/ResourceTable.cpp
@@ -440,8 +440,7 @@
return true;
}
-bool ResourceTable::SetSymbolState(const ResourceNameRef& name,
- const ResourceId& res_id,
+bool ResourceTable::SetSymbolState(const ResourceNameRef& name, const ResourceId& res_id,
const Symbol& symbol, IDiagnostics* diag) {
return SetSymbolStateImpl(name, res_id, symbol, ValidateName, diag);
}
@@ -489,8 +488,7 @@
diag->Error(DiagMessage(symbol.source)
<< "trying to add resource '" << name << "' with ID " << res_id
<< " but resource already has ID "
- << ResourceId(package->id.value(), type->id.value(),
- entry->id.value()));
+ << ResourceId(package->id.value(), type->id.value(), entry->id.value()));
return false;
}
@@ -505,6 +503,11 @@
type->symbol_status.state = SymbolState::kPublic;
}
+ if (symbol.allow_new) {
+ // This symbol can be added as a new resource when merging (if it belongs to an overlay).
+ entry->symbol_status.allow_new = true;
+ }
+
if (symbol.state == SymbolState::kUndefined &&
entry->symbol_status.state != SymbolState::kUndefined) {
// We can't undefine a symbol (remove its visibility). Ignore.
@@ -517,7 +520,10 @@
return true;
}
- entry->symbol_status = std::move(symbol);
+ // This symbol definition takes precedence, replace.
+ entry->symbol_status.state = symbol.state;
+ entry->symbol_status.source = symbol.source;
+ entry->symbol_status.comment = symbol.comment;
return true;
}
diff --git a/tools/aapt2/ResourceTable.h b/tools/aapt2/ResourceTable.h
index b032121..4295d06 100644
--- a/tools/aapt2/ResourceTable.h
+++ b/tools/aapt2/ResourceTable.h
@@ -50,6 +50,10 @@
struct Symbol {
SymbolState state = SymbolState::kUndefined;
Source source;
+
+ // Whether this entry (originating from an overlay) can be added as a new resource.
+ bool allow_new = false;
+
std::string comment;
};
@@ -223,8 +227,7 @@
bool SetSymbolState(const ResourceNameRef& name, const ResourceId& res_id,
const Symbol& symbol, IDiagnostics* diag);
- bool SetSymbolStateAllowMangled(const ResourceNameRef& name,
- const ResourceId& res_id,
+ bool SetSymbolStateAllowMangled(const ResourceNameRef& name, const ResourceId& res_id,
const Symbol& symbol, IDiagnostics* diag);
struct SearchResult {
diff --git a/tools/aapt2/ResourceUtils.cpp b/tools/aapt2/ResourceUtils.cpp
index 1bb7d9b..818c8ce 100644
--- a/tools/aapt2/ResourceUtils.cpp
+++ b/tools/aapt2/ResourceUtils.cpp
@@ -496,19 +496,17 @@
std::unique_ptr<BinaryPrimitive> TryParseBool(const StringPiece& str) {
if (Maybe<bool> maybe_result = ParseBool(str)) {
- android::Res_value value = {};
- value.dataType = android::Res_value::TYPE_INT_BOOLEAN;
-
- if (maybe_result.value()) {
- value.data = 0xffffffffu;
- } else {
- value.data = 0;
- }
- return util::make_unique<BinaryPrimitive>(value);
+ const uint32_t data = maybe_result.value() ? 0xffffffffu : 0u;
+ return util::make_unique<BinaryPrimitive>(android::Res_value::TYPE_INT_BOOLEAN, data);
}
return {};
}
+std::unique_ptr<BinaryPrimitive> MakeBool(bool val) {
+ return util::make_unique<BinaryPrimitive>(android::Res_value::TYPE_INT_BOOLEAN,
+ val ? 0xffffffffu : 0u);
+}
+
std::unique_ptr<BinaryPrimitive> TryParseInt(const StringPiece& str) {
std::u16string str16 = util::Utf8ToUtf16(str);
android::Res_value value;
diff --git a/tools/aapt2/ResourceUtils.h b/tools/aapt2/ResourceUtils.h
index 48922b7..da0fc8e 100644
--- a/tools/aapt2/ResourceUtils.h
+++ b/tools/aapt2/ResourceUtils.h
@@ -147,6 +147,9 @@
*/
std::unique_ptr<BinaryPrimitive> TryParseBool(const android::StringPiece& str);
+// Returns a boolean BinaryPrimitive.
+std::unique_ptr<BinaryPrimitive> MakeBool(bool val);
+
/*
* Returns a BinaryPrimitve object representing an integer if the string was
* parsed as one.
diff --git a/tools/aapt2/ResourceValues.cpp b/tools/aapt2/ResourceValues.cpp
index 0cb8c67..abfdec4 100644
--- a/tools/aapt2/ResourceValues.cpp
+++ b/tools/aapt2/ResourceValues.cpp
@@ -29,6 +29,11 @@
namespace aapt {
+std::ostream& operator<<(std::ostream& out, const Value& value) {
+ value.Print(&out);
+ return out;
+}
+
template <typename Derived>
void BaseValue<Derived>::Accept(RawValueVisitor* visitor) {
visitor->Visit(static_cast<Derived*>(this));
@@ -333,6 +338,12 @@
}
}
+Attribute::Attribute()
+ : type_mask(0u),
+ min_int(std::numeric_limits<int32_t>::min()),
+ max_int(std::numeric_limits<int32_t>::max()) {
+}
+
Attribute::Attribute(bool w, uint32_t t)
: type_mask(t),
min_int(std::numeric_limits<int32_t>::min()),
@@ -340,6 +351,15 @@
weak_ = w;
}
+std::ostream& operator<<(std::ostream& out, const Attribute::Symbol& s) {
+ if (s.symbol.name) {
+ out << s.symbol.name.value().entry;
+ } else {
+ out << "???";
+ }
+ return out << "=" << s.value;
+}
+
template <typename T>
constexpr T* add_pointer(T& val) {
return &val;
@@ -355,31 +375,27 @@
return false;
}
- if (type_mask != other->type_mask || min_int != other->min_int ||
- max_int != other->max_int) {
+ if (type_mask != other->type_mask || min_int != other->min_int || max_int != other->max_int) {
return false;
}
std::vector<const Symbol*> sorted_a;
std::transform(symbols.begin(), symbols.end(), std::back_inserter(sorted_a),
add_pointer<const Symbol>);
- std::sort(sorted_a.begin(), sorted_a.end(),
- [](const Symbol* a, const Symbol* b) -> bool {
- return a->symbol.name < b->symbol.name;
- });
+ std::sort(sorted_a.begin(), sorted_a.end(), [](const Symbol* a, const Symbol* b) -> bool {
+ return a->symbol.name < b->symbol.name;
+ });
std::vector<const Symbol*> sorted_b;
- std::transform(other->symbols.begin(), other->symbols.end(),
- std::back_inserter(sorted_b), add_pointer<const Symbol>);
- std::sort(sorted_b.begin(), sorted_b.end(),
- [](const Symbol* a, const Symbol* b) -> bool {
- return a->symbol.name < b->symbol.name;
- });
+ std::transform(other->symbols.begin(), other->symbols.end(), std::back_inserter(sorted_b),
+ add_pointer<const Symbol>);
+ std::sort(sorted_b.begin(), sorted_b.end(), [](const Symbol* a, const Symbol* b) -> bool {
+ return a->symbol.name < b->symbol.name;
+ });
return std::equal(sorted_a.begin(), sorted_a.end(), sorted_b.begin(),
[](const Symbol* a, const Symbol* b) -> bool {
- return a->symbol.Equals(&b->symbol) &&
- a->value == b->value;
+ return a->symbol.Equals(&b->symbol) && a->value == b->value;
});
}
@@ -582,14 +598,50 @@
return true;
}
+std::ostream& operator<<(std::ostream& out, const Style::Entry& entry) {
+ if (entry.key.name) {
+ out << entry.key.name.value();
+ } else if (entry.key.id) {
+ out << entry.key.id.value();
+ } else {
+ out << "???";
+ }
+ out << " = " << entry.value;
+ return out;
+}
+
+template <typename T>
+std::vector<T*> ToPointerVec(std::vector<T>& src) {
+ std::vector<T*> dst;
+ dst.reserve(src.size());
+ for (T& in : src) {
+ dst.push_back(&in);
+ }
+ return dst;
+}
+
+template <typename T>
+std::vector<const T*> ToPointerVec(const std::vector<T>& src) {
+ std::vector<const T*> dst;
+ dst.reserve(src.size());
+ for (const T& in : src) {
+ dst.push_back(&in);
+ }
+ return dst;
+}
+
+static bool KeyNameComparator(const Style::Entry* a, const Style::Entry* b) {
+ return a->key.name < b->key.name;
+}
+
bool Style::Equals(const Value* value) const {
const Style* other = ValueCast<Style>(value);
if (!other) {
return false;
}
+
if (bool(parent) != bool(other->parent) ||
- (parent && other->parent &&
- !parent.value().Equals(&other->parent.value()))) {
+ (parent && other->parent && !parent.value().Equals(&other->parent.value()))) {
return false;
}
@@ -597,26 +649,15 @@
return false;
}
- std::vector<const Entry*> sorted_a;
- std::transform(entries.begin(), entries.end(), std::back_inserter(sorted_a),
- add_pointer<const Entry>);
- std::sort(sorted_a.begin(), sorted_a.end(),
- [](const Entry* a, const Entry* b) -> bool {
- return a->key.name < b->key.name;
- });
+ std::vector<const Entry*> sorted_a = ToPointerVec(entries);
+ std::sort(sorted_a.begin(), sorted_a.end(), KeyNameComparator);
- std::vector<const Entry*> sorted_b;
- std::transform(other->entries.begin(), other->entries.end(),
- std::back_inserter(sorted_b), add_pointer<const Entry>);
- std::sort(sorted_b.begin(), sorted_b.end(),
- [](const Entry* a, const Entry* b) -> bool {
- return a->key.name < b->key.name;
- });
+ std::vector<const Entry*> sorted_b = ToPointerVec(other->entries);
+ std::sort(sorted_b.begin(), sorted_b.end(), KeyNameComparator);
return std::equal(sorted_a.begin(), sorted_a.end(), sorted_b.begin(),
[](const Entry* a, const Entry* b) -> bool {
- return a->key.Equals(&b->key) &&
- a->value->Equals(b->value.get());
+ return a->key.Equals(&b->key) && a->value->Equals(b->value.get());
});
}
@@ -627,8 +668,7 @@
style->comment_ = comment_;
style->source_ = source_;
for (auto& entry : entries) {
- style->entries.push_back(
- Entry{entry.key, std::unique_ptr<Item>(entry.value->Clone(new_pool))});
+ style->entries.push_back(Entry{entry.key, std::unique_ptr<Item>(entry.value->Clone(new_pool))});
}
return style;
}
@@ -636,26 +676,73 @@
void Style::Print(std::ostream* out) const {
*out << "(style) ";
if (parent && parent.value().name) {
- if (parent.value().private_reference) {
+ const Reference& parent_ref = parent.value();
+ if (parent_ref.private_reference) {
*out << "*";
}
- *out << parent.value().name.value();
+ *out << parent_ref.name.value();
}
*out << " [" << util::Joiner(entries, ", ") << "]";
}
-static ::std::ostream& operator<<(::std::ostream& out,
- const Style::Entry& value) {
- if (value.key.name) {
- out << value.key.name.value();
- } else if (value.key.id) {
- out << value.key.id.value();
- } else {
- out << "???";
+Style::Entry CloneEntry(const Style::Entry& entry, StringPool* pool) {
+ Style::Entry cloned_entry{entry.key};
+ if (entry.value != nullptr) {
+ cloned_entry.value.reset(entry.value->Clone(pool));
}
- out << " = ";
- value.value->Print(&out);
- return out;
+ return cloned_entry;
+}
+
+void Style::MergeWith(Style* other, StringPool* pool) {
+ if (other->parent) {
+ parent = other->parent;
+ }
+
+ // We can't assume that the entries are sorted alphabetically since they're supposed to be
+ // sorted by Resource Id. Not all Resource Ids may be set though, so we can't sort and merge
+ // them keying off that.
+ //
+ // Instead, sort the entries of each Style by their name in a separate structure. Then merge
+ // those.
+
+ std::vector<Entry*> this_sorted = ToPointerVec(entries);
+ std::sort(this_sorted.begin(), this_sorted.end(), KeyNameComparator);
+
+ std::vector<Entry*> other_sorted = ToPointerVec(other->entries);
+ std::sort(other_sorted.begin(), other_sorted.end(), KeyNameComparator);
+
+ auto this_iter = this_sorted.begin();
+ const auto this_end = this_sorted.end();
+
+ auto other_iter = other_sorted.begin();
+ const auto other_end = other_sorted.end();
+
+ std::vector<Entry> merged_entries;
+ while (this_iter != this_end) {
+ if (other_iter != other_end) {
+ if ((*this_iter)->key.name < (*other_iter)->key.name) {
+ merged_entries.push_back(std::move(**this_iter));
+ ++this_iter;
+ } else {
+ // The other overrides.
+ merged_entries.push_back(CloneEntry(**other_iter, pool));
+ if ((*this_iter)->key.name == (*other_iter)->key.name) {
+ ++this_iter;
+ }
+ ++other_iter;
+ }
+ } else {
+ merged_entries.push_back(std::move(**this_iter));
+ ++this_iter;
+ }
+ }
+
+ while (other_iter != other_end) {
+ merged_entries.push_back(CloneEntry(**other_iter, pool));
+ ++other_iter;
+ }
+
+ entries = std::move(merged_entries);
}
bool Array::Equals(const Value* value) const {
@@ -752,11 +839,6 @@
}
}
-static ::std::ostream& operator<<(::std::ostream& out,
- const std::unique_ptr<Item>& item) {
- return out << *item;
-}
-
bool Styleable::Equals(const Value* value) const {
const Styleable* other = ValueCast<Styleable>(value);
if (!other) {
@@ -804,8 +886,7 @@
void Styleable::MergeWith(Styleable* other) {
// Compare only names, because some References may already have their IDs
- // assigned
- // (framework IDs that don't change).
+ // assigned (framework IDs that don't change).
std::set<Reference, NameOnlyComparator> references;
references.insert(entries.begin(), entries.end());
references.insert(other->entries.begin(), other->entries.end());
diff --git a/tools/aapt2/ResourceValues.h b/tools/aapt2/ResourceValues.h
index c71c738..ac5795f 100644
--- a/tools/aapt2/ResourceValues.h
+++ b/tools/aapt2/ResourceValues.h
@@ -18,6 +18,7 @@
#define AAPT_RESOURCE_VALUES_H
#include <array>
+#include <limits>
#include <ostream>
#include <vector>
@@ -39,7 +40,8 @@
// type specific operations is to check the Value's type() and
// cast it to the appropriate subclass. This isn't super clean,
// but it is the simplest strategy.
-struct Value {
+class Value {
+ public:
virtual ~Value() = default;
// Whether this value is weak and can be overridden without warning or error. Default is false.
@@ -81,6 +83,8 @@
// Human readable printout of this value.
virtual void Print(std::ostream* out) const = 0;
+ friend std::ostream& operator<<(std::ostream& out, const Value& value);
+
protected:
Source source_;
std::string comment_;
@@ -244,6 +248,8 @@
struct Symbol {
Reference symbol;
uint32_t value;
+
+ friend std::ostream& operator<<(std::ostream& out, const Symbol& symbol);
};
uint32_t type_mask;
@@ -251,6 +257,7 @@
int32_t max_int;
std::vector<Symbol> symbols;
+ Attribute();
explicit Attribute(bool w, uint32_t t = 0u);
bool Equals(const Value* value) const override;
@@ -264,6 +271,8 @@
struct Entry {
Reference key;
std::unique_ptr<Item> value;
+
+ friend std::ostream& operator<<(std::ostream& out, const Entry& entry);
};
Maybe<Reference> parent;
@@ -276,6 +285,10 @@
bool Equals(const Value* value) const override;
Style* Clone(StringPool* new_pool) const override;
void Print(std::ostream* out) const override;
+
+ // Merges `style` into this Style. All identical attributes of `style` take precedence, including
+ // the parent, if there is one.
+ void MergeWith(Style* style, StringPool* pool);
};
struct Array : public BaseValue<Array> {
@@ -305,20 +318,15 @@
void MergeWith(Styleable* styleable);
};
-// Stream operator for printing Value objects.
-inline ::std::ostream& operator<<(::std::ostream& out, const Value& value) {
- value.Print(&out);
- return out;
-}
-
-inline ::std::ostream& operator<<(::std::ostream& out,
- const Attribute::Symbol& s) {
- if (s.symbol.name) {
- out << s.symbol.name.value().entry;
+template <typename T>
+typename std::enable_if<std::is_base_of<Value, T>::value, std::ostream&>::type operator<<(
+ std::ostream& out, const std::unique_ptr<T>& value) {
+ if (value == nullptr) {
+ out << "NULL";
} else {
- out << "???";
+ value->Print(&out);
}
- return out << "=" << s.value;
+ return out;
}
} // namespace aapt
diff --git a/tools/aapt2/ResourceValues_test.cpp b/tools/aapt2/ResourceValues_test.cpp
index 6922580..e154d93 100644
--- a/tools/aapt2/ResourceValues_test.cpp
+++ b/tools/aapt2/ResourceValues_test.cpp
@@ -148,4 +148,36 @@
EXPECT_TRUE(a->Equals(b.get()));
}
+TEST(ResourceValuesTest, StyleMerges) {
+ StringPool pool_a;
+ StringPool pool_b;
+
+ std::unique_ptr<Style> a =
+ test::StyleBuilder()
+ .SetParent("android:style/Parent")
+ .AddItem("android:attr/a", util::make_unique<String>(pool_a.MakeRef("FooA")))
+ .AddItem("android:attr/b", util::make_unique<String>(pool_a.MakeRef("FooB")))
+ .Build();
+
+ std::unique_ptr<Style> b =
+ test::StyleBuilder()
+ .SetParent("android:style/OverlayParent")
+ .AddItem("android:attr/c", util::make_unique<String>(pool_b.MakeRef("OverlayFooC")))
+ .AddItem("android:attr/a", util::make_unique<String>(pool_b.MakeRef("OverlayFooA")))
+ .Build();
+
+ a->MergeWith(b.get(), &pool_a);
+
+ StringPool pool;
+ std::unique_ptr<Style> expected =
+ test::StyleBuilder()
+ .SetParent("android:style/OverlayParent")
+ .AddItem("android:attr/a", util::make_unique<String>(pool.MakeRef("OverlayFooA")))
+ .AddItem("android:attr/b", util::make_unique<String>(pool.MakeRef("FooB")))
+ .AddItem("android:attr/c", util::make_unique<String>(pool.MakeRef("OverlayFooC")))
+ .Build();
+
+ EXPECT_TRUE(a->Equals(expected.get()));
+}
+
} // namespace aapt
diff --git a/tools/aapt2/SdkConstants.cpp b/tools/aapt2/SdkConstants.cpp
index e806714..041cb4f 100644
--- a/tools/aapt2/SdkConstants.cpp
+++ b/tools/aapt2/SdkConstants.cpp
@@ -26,9 +26,9 @@
namespace aapt {
static const char* sDevelopmentSdkCodeName = "O";
-static int sDevelopmentSdkLevel = 26;
+static ApiVersion sDevelopmentSdkLevel = 26;
-static const std::vector<std::pair<uint16_t, size_t>> sAttrIdMap = {
+static const std::vector<std::pair<uint16_t, ApiVersion>> sAttrIdMap = {
{0x021c, 1},
{0x021d, 2},
{0x0269, SDK_CUPCAKE},
@@ -48,26 +48,29 @@
{0x03f1, SDK_KITKAT},
{0x03f6, SDK_KITKAT_WATCH},
{0x04ce, SDK_LOLLIPOP},
+ {0x04d8, SDK_LOLLIPOP_MR1},
+ {0x04f1, SDK_MARSHMALLOW},
+ {0x0527, SDK_NOUGAT},
+ {0x0530, SDK_NOUGAT_MR1},
+ {0x0568, SDK_O},
};
-static bool less_entry_id(const std::pair<uint16_t, size_t>& p,
- uint16_t entryId) {
+static bool less_entry_id(const std::pair<uint16_t, ApiVersion>& p, uint16_t entryId) {
return p.first < entryId;
}
-size_t FindAttributeSdkLevel(const ResourceId& id) {
- if (id.package_id() != 0x01 && id.type_id() != 0x01) {
+ApiVersion FindAttributeSdkLevel(const ResourceId& id) {
+ if (id.package_id() != 0x01 || id.type_id() != 0x01) {
return 0;
}
- auto iter = std::lower_bound(sAttrIdMap.begin(), sAttrIdMap.end(),
- id.entry_id(), less_entry_id);
+ auto iter = std::lower_bound(sAttrIdMap.begin(), sAttrIdMap.end(), id.entry_id(), less_entry_id);
if (iter == sAttrIdMap.end()) {
return SDK_LOLLIPOP_MR1;
}
return iter->second;
}
-static const std::unordered_map<std::string, size_t> sAttrMap = {
+static const std::unordered_map<std::string, ApiVersion> sAttrMap = {
{"marqueeRepeatLimit", 2},
{"windowNoDisplay", 3},
{"backgroundDimEnabled", 3},
@@ -729,7 +732,7 @@
{"windowActivityTransitions", 21},
{"colorEdgeEffect", 21}};
-size_t FindAttributeSdkLevel(const ResourceName& name) {
+ApiVersion FindAttributeSdkLevel(const ResourceName& name) {
if (name.package != "android" && name.type != ResourceType::kAttr) {
return 0;
}
@@ -741,9 +744,8 @@
return SDK_LOLLIPOP_MR1;
}
-std::pair<StringPiece, int> GetDevelopmentSdkCodeNameAndVersion() {
- return std::make_pair(StringPiece(sDevelopmentSdkCodeName),
- sDevelopmentSdkLevel);
+std::pair<StringPiece, ApiVersion> GetDevelopmentSdkCodeNameAndVersion() {
+ return std::make_pair(StringPiece(sDevelopmentSdkCodeName), sDevelopmentSdkLevel);
}
} // namespace aapt
diff --git a/tools/aapt2/SdkConstants.h b/tools/aapt2/SdkConstants.h
index c2ee252..e3745e8 100644
--- a/tools/aapt2/SdkConstants.h
+++ b/tools/aapt2/SdkConstants.h
@@ -25,7 +25,9 @@
namespace aapt {
-enum : int {
+using ApiVersion = int;
+
+enum : ApiVersion {
SDK_CUPCAKE = 3,
SDK_DONUT = 4,
SDK_ECLAIR = 5,
@@ -49,12 +51,12 @@
SDK_MARSHMALLOW = 23,
SDK_NOUGAT = 24,
SDK_NOUGAT_MR1 = 25,
- SDK_O = 26, // STOPSHIP Replace with real version
+ SDK_O = 26,
};
-size_t FindAttributeSdkLevel(const ResourceId& id);
-size_t FindAttributeSdkLevel(const ResourceName& name);
-std::pair<android::StringPiece, int> GetDevelopmentSdkCodeNameAndVersion();
+ApiVersion FindAttributeSdkLevel(const ResourceId& id);
+ApiVersion FindAttributeSdkLevel(const ResourceName& name);
+std::pair<android::StringPiece, ApiVersion> GetDevelopmentSdkCodeNameAndVersion();
} // namespace aapt
diff --git a/tools/aapt2/SdkConstants_test.cpp b/tools/aapt2/SdkConstants_test.cpp
index 716d922..61f4d71 100644
--- a/tools/aapt2/SdkConstants_test.cpp
+++ b/tools/aapt2/SdkConstants_test.cpp
@@ -21,18 +21,11 @@
namespace aapt {
TEST(SdkConstantsTest, FirstAttributeIsSdk1) {
- EXPECT_EQ(1u, FindAttributeSdkLevel(ResourceId(0x01010000)));
+ EXPECT_EQ(1, FindAttributeSdkLevel(ResourceId(0x01010000)));
}
-TEST(SdkConstantsTest, AllAttributesAfterLollipopAreLollipopMR1) {
- EXPECT_EQ(SDK_LOLLIPOP, FindAttributeSdkLevel(ResourceId(0x010103f7)));
- EXPECT_EQ(SDK_LOLLIPOP, FindAttributeSdkLevel(ResourceId(0x010104ce)));
-
- EXPECT_EQ(SDK_LOLLIPOP_MR1, FindAttributeSdkLevel(ResourceId(0x010104cf)));
- EXPECT_EQ(SDK_LOLLIPOP_MR1, FindAttributeSdkLevel(ResourceId(0x010104d8)));
-
- EXPECT_EQ(SDK_LOLLIPOP_MR1, FindAttributeSdkLevel(ResourceId(0x010104d9)));
- EXPECT_EQ(SDK_LOLLIPOP_MR1, FindAttributeSdkLevel(ResourceId(0x0101ffff)));
+TEST(SdkConstantsTest, NonFrameworkAttributeIsSdk0) {
+ EXPECT_EQ(0, FindAttributeSdkLevel(ResourceId(0x7f010345)));
}
} // namespace aapt
diff --git a/tools/aapt2/cmd/Compile.cpp b/tools/aapt2/cmd/Compile.cpp
index 5adf04a..e09a3979 100644
--- a/tools/aapt2/cmd/Compile.cpp
+++ b/tools/aapt2/cmd/Compile.cpp
@@ -478,7 +478,8 @@
{
std::string content;
- if (!android::base::ReadFileToString(path_data.source.path, &content)) {
+ if (!android::base::ReadFileToString(path_data.source.path, &content,
+ true /*follow_symlinks*/)) {
context->GetDiagnostics()->Error(DiagMessage(path_data.source)
<< android::base::SystemErrorCodeToString(errno));
return false;
diff --git a/tools/aapt2/cmd/Link.cpp b/tools/aapt2/cmd/Link.cpp
index 8accfa8..740a401 100644
--- a/tools/aapt2/cmd/Link.cpp
+++ b/tools/aapt2/cmd/Link.cpp
@@ -50,6 +50,7 @@
#include "link/ManifestFixer.h"
#include "link/ReferenceLinker.h"
#include "link/TableMerger.h"
+#include "link/XmlCompatVersioner.h"
#include "optimize/ResourceDeduper.h"
#include "optimize/VersionCollapser.h"
#include "process/IResourceTableConsumer.h"
@@ -247,25 +248,20 @@
IAaptContext* context_;
};
-static bool FlattenXml(xml::XmlResource* xml_res, const StringPiece& path,
- Maybe<size_t> max_sdk_level, bool keep_raw_values, IArchiveWriter* writer,
- IAaptContext* context) {
+static bool FlattenXml(IAaptContext* context, xml::XmlResource* xml_res, const StringPiece& path,
+ bool keep_raw_values, IArchiveWriter* writer) {
BigBuffer buffer(1024);
XmlFlattenerOptions options = {};
options.keep_raw_values = keep_raw_values;
- options.max_sdk_level = max_sdk_level;
XmlFlattener flattener(&buffer, options);
if (!flattener.Consume(context, xml_res)) {
return false;
}
if (context->IsVerbose()) {
- DiagMessage msg;
- msg << "writing " << path << " to archive";
- if (max_sdk_level) {
- msg << " maxSdkLevel=" << max_sdk_level.value() << " keepRawValues=" << keep_raw_values;
- }
- context->GetDiagnostics()->Note(msg);
+ context->GetDiagnostics()->Note(DiagMessage(path) << "writing to archive (keep_raw_values="
+ << (keep_raw_values ? "true" : "false")
+ << ")");
}
io::BigBufferInputStream input_stream(&buffer);
@@ -311,12 +307,33 @@
std::unordered_set<std::string> extensions_to_not_compress;
};
+// A sampling of public framework resource IDs.
+struct R {
+ struct attr {
+ enum : uint32_t {
+ paddingLeft = 0x010100d6u,
+ paddingRight = 0x010100d8u,
+ paddingHorizontal = 0x0101053du,
+
+ paddingTop = 0x010100d7u,
+ paddingBottom = 0x010100d9u,
+ paddingVertical = 0x0101053eu,
+
+ layout_marginLeft = 0x010100f7u,
+ layout_marginRight = 0x010100f9u,
+ layout_marginHorizontal = 0x0101053bu,
+
+ layout_marginTop = 0x010100f8u,
+ layout_marginBottom = 0x010100fau,
+ layout_marginVertical = 0x0101053cu,
+ };
+ };
+};
+
class ResourceFileFlattener {
public:
ResourceFileFlattener(const ResourceFileFlattenerOptions& options, IAaptContext* context,
- proguard::KeepSet* keep_set)
- : options_(options), context_(context), keep_set_(keep_set) {
- }
+ proguard::KeepSet* keep_set);
bool Flatten(ResourceTable* table, IArchiveWriter* archive_writer);
@@ -325,7 +342,7 @@
ConfigDescription config;
// The entry this file came from.
- const ResourceEntry* entry;
+ ResourceEntry* entry;
// The file to copy as-is.
io::IFile* file_to_copy;
@@ -335,19 +352,72 @@
// The destination to write this file to.
std::string dst_path;
- bool skip_version = false;
};
uint32_t GetCompressionFlags(const StringPiece& str);
- bool LinkAndVersionXmlFile(ResourceTable* table, FileOperation* file_op,
- std::queue<FileOperation>* out_file_op_queue);
+ std::vector<std::unique_ptr<xml::XmlResource>> LinkAndVersionXmlFile(ResourceTable* table,
+ FileOperation* file_op);
ResourceFileFlattenerOptions options_;
IAaptContext* context_;
proguard::KeepSet* keep_set_;
+ XmlCompatVersioner::Rules rules_;
};
+ResourceFileFlattener::ResourceFileFlattener(const ResourceFileFlattenerOptions& options,
+ IAaptContext* context, proguard::KeepSet* keep_set)
+ : options_(options), context_(context), keep_set_(keep_set) {
+ SymbolTable* symm = context_->GetExternalSymbols();
+
+ // Build up the rules for degrading newer attributes to older ones.
+ // NOTE(adamlesinski): These rules are hardcoded right now, but they should be
+ // generated from the attribute definitions themselves (b/62028956).
+ if (const SymbolTable::Symbol* s = symm->FindById(R::attr::paddingHorizontal)) {
+ std::vector<ReplacementAttr> replacements{
+ {"paddingLeft", R::attr::paddingLeft,
+ Attribute(false, android::ResTable_map::TYPE_DIMENSION)},
+ {"paddingRight", R::attr::paddingRight,
+ Attribute(false, android::ResTable_map::TYPE_DIMENSION)},
+ };
+ rules_[R::attr::paddingHorizontal] =
+ util::make_unique<DegradeToManyRule>(std::move(replacements));
+ }
+
+ if (const SymbolTable::Symbol* s = symm->FindById(R::attr::paddingVertical)) {
+ std::vector<ReplacementAttr> replacements{
+ {"paddingTop", R::attr::paddingTop,
+ Attribute(false, android::ResTable_map::TYPE_DIMENSION)},
+ {"paddingBottom", R::attr::paddingBottom,
+ Attribute(false, android::ResTable_map::TYPE_DIMENSION)},
+ };
+ rules_[R::attr::paddingVertical] =
+ util::make_unique<DegradeToManyRule>(std::move(replacements));
+ }
+
+ if (const SymbolTable::Symbol* s = symm->FindById(R::attr::layout_marginHorizontal)) {
+ std::vector<ReplacementAttr> replacements{
+ {"layout_marginLeft", R::attr::layout_marginLeft,
+ Attribute(false, android::ResTable_map::TYPE_DIMENSION)},
+ {"layout_marginRight", R::attr::layout_marginRight,
+ Attribute(false, android::ResTable_map::TYPE_DIMENSION)},
+ };
+ rules_[R::attr::layout_marginHorizontal] =
+ util::make_unique<DegradeToManyRule>(std::move(replacements));
+ }
+
+ if (const SymbolTable::Symbol* s = symm->FindById(R::attr::layout_marginVertical)) {
+ std::vector<ReplacementAttr> replacements{
+ {"layout_marginTop", R::attr::layout_marginTop,
+ Attribute(false, android::ResTable_map::TYPE_DIMENSION)},
+ {"layout_marginBottom", R::attr::layout_marginBottom,
+ Attribute(false, android::ResTable_map::TYPE_DIMENSION)},
+ };
+ rules_[R::attr::layout_marginVertical] =
+ util::make_unique<DegradeToManyRule>(std::move(replacements));
+ }
+}
+
uint32_t ResourceFileFlattener::GetCompressionFlags(const StringPiece& str) {
if (options_.do_not_compress_anything) {
return 0;
@@ -369,8 +439,20 @@
name == "transitionManager";
}
-bool ResourceFileFlattener::LinkAndVersionXmlFile(ResourceTable* table, FileOperation* file_op,
- std::queue<FileOperation>* out_file_op_queue) {
+static bool IsVectorElement(const std::string& name) {
+ return name == "vector" || name == "animated-vector" || name == "pathInterpolator" ||
+ name == "objectAnimator";
+}
+
+template <typename T>
+std::vector<T> make_singleton_vec(T&& val) {
+ std::vector<T> vec;
+ vec.emplace_back(std::forward<T>(val));
+ return vec;
+}
+
+std::vector<std::unique_ptr<xml::XmlResource>> ResourceFileFlattener::LinkAndVersionXmlFile(
+ ResourceTable* table, FileOperation* file_op) {
xml::XmlResource* doc = file_op->xml_to_flatten.get();
const Source& src = doc->file.source;
@@ -380,107 +462,60 @@
XmlReferenceLinker xml_linker;
if (!xml_linker.Consume(context_, doc)) {
- return false;
+ return {};
}
if (options_.update_proguard_spec && !proguard::CollectProguardRules(src, doc, keep_set_)) {
- return false;
+ return {};
}
if (options_.no_xml_namespaces) {
XmlNamespaceRemover namespace_remover;
if (!namespace_remover.Consume(context_, doc)) {
- return false;
+ return {};
}
}
- if (!options_.no_auto_version) {
- if (options_.no_version_vectors) {
- // Skip this if it is a vector or animated-vector.
- xml::Element* el = xml::FindRootElement(doc);
- if (el && el->namespace_uri.empty()) {
- if (el->name == "vector" || el->name == "animated-vector") {
- // We are NOT going to version this file.
- file_op->skip_version = true;
- return true;
- }
- }
- }
- if (options_.no_version_transitions) {
- // Skip this if it is a transition resource.
- xml::Element* el = xml::FindRootElement(doc);
- if (el && el->namespace_uri.empty()) {
- if (IsTransitionElement(el->name)) {
- // We are NOT going to version this file.
- file_op->skip_version = true;
- return true;
- }
- }
- }
+ if (options_.no_auto_version) {
+ return make_singleton_vec(std::move(file_op->xml_to_flatten));
+ }
- const ConfigDescription& config = file_op->config;
-
- // Find the first SDK level used that is higher than this defined config and
- // not superseded by a lower or equal SDK level resource.
- const int min_sdk_version = context_->GetMinSdkVersion();
- for (int sdk_level : xml_linker.sdk_levels()) {
- if (sdk_level > min_sdk_version && sdk_level > config.sdkVersion) {
- if (!ShouldGenerateVersionedResource(file_op->entry, config, sdk_level)) {
- // If we shouldn't generate a versioned resource, stop checking.
- break;
- }
-
- ResourceFile versioned_file_desc = doc->file;
- versioned_file_desc.config.sdkVersion = (uint16_t)sdk_level;
-
- FileOperation new_file_op;
- new_file_op.xml_to_flatten = util::make_unique<xml::XmlResource>(
- versioned_file_desc, StringPool{}, doc->root->Clone());
- new_file_op.config = versioned_file_desc.config;
- new_file_op.entry = file_op->entry;
- new_file_op.dst_path =
- ResourceUtils::BuildResourceFileName(versioned_file_desc, context_->GetNameMangler());
-
- if (context_->IsVerbose()) {
- context_->GetDiagnostics()->Note(DiagMessage(versioned_file_desc.source)
- << "auto-versioning resource from config '" << config
- << "' -> '" << versioned_file_desc.config << "'");
- }
-
- bool added = table->AddFileReferenceAllowMangled(
- versioned_file_desc.name, versioned_file_desc.config, versioned_file_desc.source,
- new_file_op.dst_path, nullptr, context_->GetDiagnostics());
- if (!added) {
- return false;
- }
-
- out_file_op_queue->push(std::move(new_file_op));
- break;
+ if (options_.no_version_vectors || options_.no_version_transitions) {
+ // Skip this if it is a vector or animated-vector.
+ xml::Element* el = xml::FindRootElement(doc);
+ if (el && el->namespace_uri.empty()) {
+ if ((options_.no_version_vectors && IsVectorElement(el->name)) ||
+ (options_.no_version_transitions && IsTransitionElement(el->name))) {
+ return make_singleton_vec(std::move(file_op->xml_to_flatten));
}
}
}
- return true;
+
+ const ConfigDescription& config = file_op->config;
+ ResourceEntry* entry = file_op->entry;
+
+ XmlCompatVersioner xml_compat_versioner(&rules_);
+ const util::Range<ApiVersion> api_range{config.sdkVersion,
+ FindNextApiVersionForConfig(entry, config)};
+ return xml_compat_versioner.Process(context_, doc, api_range);
}
-/**
- * Do not insert or remove any resources while executing in this function. It
- * will
- * corrupt the iteration order.
- */
bool ResourceFileFlattener::Flatten(ResourceTable* table, IArchiveWriter* archive_writer) {
bool error = false;
std::map<std::pair<ConfigDescription, StringPiece>, FileOperation> config_sorted_files;
for (auto& pkg : table->packages) {
for (auto& type : pkg->types) {
- // Sort by config and name, so that we get better locality in the zip
- // file.
+ // Sort by config and name, so that we get better locality in the zip file.
config_sorted_files.clear();
std::queue<FileOperation> file_operations;
// Populate the queue with all files in the ResourceTable.
for (auto& entry : type->entries) {
for (auto& config_value : entry->values) {
+ // WARNING! Do not insert or remove any resources while executing in this scope. It will
+ // corrupt the iteration order.
+
FileReference* file_ref = ValueCast<FileReference>(config_value->value.get());
if (!file_ref) {
continue;
@@ -497,6 +532,7 @@
file_op.entry = entry.get();
file_op.dst_path = *file_ref->path;
file_op.config = config_value->config;
+ file_op.file_to_copy = file;
const StringPiece src_path = file->GetSource().path;
if (type->type != ResourceType::kRaw &&
@@ -518,68 +554,51 @@
file_op.xml_to_flatten->file.config = config_value->config;
file_op.xml_to_flatten->file.source = file_ref->GetSource();
file_op.xml_to_flatten->file.name = ResourceName(pkg->name, type->type, entry->name);
-
- // Enqueue the XML files to be processed.
- file_operations.push(std::move(file_op));
- } else {
- file_op.file_to_copy = file;
-
- // NOTE(adamlesinski): Explicitly construct a StringPiece here, or
- // else we end up copying the string in the std::make_pair() method,
- // then creating a StringPiece from the copy, which would cause us
- // to end up referencing garbage in the map.
- const StringPiece entry_name(entry->name);
- config_sorted_files[std::make_pair(config_value->config, entry_name)] =
- std::move(file_op);
}
+
+ // NOTE(adamlesinski): Explicitly construct a StringPiece here, or
+ // else we end up copying the string in the std::make_pair() method,
+ // then creating a StringPiece from the copy, which would cause us
+ // to end up referencing garbage in the map.
+ const StringPiece entry_name(entry->name);
+ config_sorted_files[std::make_pair(config_value->config, entry_name)] =
+ std::move(file_op);
}
}
- // Now process the XML queue
- for (; !file_operations.empty(); file_operations.pop()) {
- FileOperation& file_op = file_operations.front();
-
- if (!LinkAndVersionXmlFile(table, &file_op, &file_operations)) {
- error = true;
- continue;
- }
-
- // NOTE(adamlesinski): Explicitly construct a StringPiece here, or else
- // we end up copying the string in the std::make_pair() method, then
- // creating a StringPiece from the copy, which would cause us to end up
- // referencing garbage in the map.
- const StringPiece entry_name(file_op.entry->name);
- config_sorted_files[std::make_pair(file_op.config, entry_name)] = std::move(file_op);
- }
-
- if (error) {
- return false;
- }
-
// Now flatten the sorted values.
for (auto& map_entry : config_sorted_files) {
const ConfigDescription& config = map_entry.first.first;
- const FileOperation& file_op = map_entry.second;
+ FileOperation& file_op = map_entry.second;
if (file_op.xml_to_flatten) {
- Maybe<size_t> max_sdk_level;
- if (!options_.no_auto_version && !file_op.skip_version) {
- max_sdk_level = std::max<size_t>(std::max<size_t>(config.sdkVersion, 1u),
- context_->GetMinSdkVersion());
- }
+ std::vector<std::unique_ptr<xml::XmlResource>> versioned_docs =
+ LinkAndVersionXmlFile(table, &file_op);
+ for (std::unique_ptr<xml::XmlResource>& doc : versioned_docs) {
+ std::string dst_path = file_op.dst_path;
+ if (doc->file.config != file_op.config) {
+ // Only add the new versioned configurations.
+ if (context_->IsVerbose()) {
+ context_->GetDiagnostics()->Note(DiagMessage(doc->file.source)
+ << "auto-versioning resource from config '"
+ << config << "' -> '" << doc->file.config << "'");
+ }
- bool result = FlattenXml(file_op.xml_to_flatten.get(), file_op.dst_path, max_sdk_level,
- options_.keep_raw_values, archive_writer, context_);
- if (!result) {
- error = true;
+ dst_path =
+ ResourceUtils::BuildResourceFileName(doc->file, context_->GetNameMangler());
+ bool result = table->AddFileReferenceAllowMangled(doc->file.name, doc->file.config,
+ doc->file.source, dst_path, nullptr,
+ context_->GetDiagnostics());
+ if (!result) {
+ return false;
+ }
+ }
+ error |= !FlattenXml(context_, doc.get(), dst_path, options_.keep_raw_values,
+ archive_writer);
}
} else {
- bool result =
- io::CopyFileToArchive(context_, file_op.file_to_copy, file_op.dst_path,
- GetCompressionFlags(file_op.dst_path), archive_writer);
- if (!result) {
- error = true;
- }
+ error |= !io::CopyFileToArchive(context_, file_op.file_to_copy, file_op.dst_path,
+ GetCompressionFlags(file_op.dst_path), archive_writer);
}
}
}
@@ -614,7 +633,7 @@
static bool LoadStableIdMap(IDiagnostics* diag, const std::string& path,
std::unordered_map<ResourceName, ResourceId>* out_id_map) {
std::string content;
- if (!android::base::ReadFileToString(path, &content)) {
+ if (!android::base::ReadFileToString(path, &content, true /*follow_symlinks*/)) {
diag->Error(DiagMessage(path) << "failed reading stable ID file");
return false;
}
@@ -1358,8 +1377,7 @@
bool WriteApk(IArchiveWriter* writer, proguard::KeepSet* keep_set, xml::XmlResource* manifest,
ResourceTable* table) {
const bool keep_raw_values = context_->GetPackageType() == PackageType::kStaticLib;
- bool result =
- FlattenXml(manifest, "AndroidManifest.xml", {}, keep_raw_values, writer, context_);
+ bool result = FlattenXml(context_, manifest, "AndroidManifest.xml", keep_raw_values, writer);
if (!result) {
return false;
}
diff --git a/tools/aapt2/cmd/Util.cpp b/tools/aapt2/cmd/Util.cpp
index 14d4260..8741b7b 100644
--- a/tools/aapt2/cmd/Util.cpp
+++ b/tools/aapt2/cmd/Util.cpp
@@ -131,7 +131,7 @@
}
static xml::AaptAttribute CreateAttributeWithId(const ResourceId& id) {
- return xml::AaptAttribute{id, Attribute(true)};
+ return xml::AaptAttribute(Attribute(), id);
}
std::unique_ptr<xml::XmlResource> GenerateSplitManifest(const AppInfo& app_info,
diff --git a/tools/aapt2/flatten/XmlFlattener.cpp b/tools/aapt2/flatten/XmlFlattener.cpp
index e98d2d7..0711749 100644
--- a/tools/aapt2/flatten/XmlFlattener.cpp
+++ b/tools/aapt2/flatten/XmlFlattener.cpp
@@ -194,16 +194,9 @@
// Filter the attributes.
for (xml::Attribute& attr : node->attributes) {
- if (options_.max_sdk_level && attr.compiled_attribute && attr.compiled_attribute.value().id) {
- size_t sdk_level = FindAttributeSdkLevel(attr.compiled_attribute.value().id.value());
- if (sdk_level > options_.max_sdk_level.value()) {
- continue;
- }
+ if (attr.namespace_uri != xml::kSchemaTools) {
+ filtered_attrs_.push_back(&attr);
}
- if (attr.namespace_uri == xml::kSchemaTools) {
- continue;
- }
- filtered_attrs_.push_back(&attr);
}
if (filtered_attrs_.empty()) {
diff --git a/tools/aapt2/flatten/XmlFlattener.h b/tools/aapt2/flatten/XmlFlattener.h
index f5129fd..87557f2 100644
--- a/tools/aapt2/flatten/XmlFlattener.h
+++ b/tools/aapt2/flatten/XmlFlattener.h
@@ -30,11 +30,6 @@
* Keep attribute raw string values along with typed values.
*/
bool keep_raw_values = false;
-
- /**
- * If set, the max SDK level of attribute to flatten. All others are ignored.
- */
- Maybe<size_t> max_sdk_level;
};
class XmlFlattener : public IXmlResourceConsumer {
diff --git a/tools/aapt2/flatten/XmlFlattener_test.cpp b/tools/aapt2/flatten/XmlFlattener_test.cpp
index cfa89bb..f1e903f 100644
--- a/tools/aapt2/flatten/XmlFlattener_test.cpp
+++ b/tools/aapt2/flatten/XmlFlattener_test.cpp
@@ -149,31 +149,6 @@
ASSERT_EQ(android::ResXMLTree::END_DOCUMENT, tree.next());
}
-TEST_F(XmlFlattenerTest, FlattenCompiledXmlAndStripSdk21) {
- std::unique_ptr<xml::XmlResource> doc = test::BuildXmlDom(R"EOF(
- <View xmlns:android="http://schemas.android.com/apk/res/android"
- android:paddingStart="1dp"
- android:colorAccent="#ffffff"/>)EOF");
-
- XmlReferenceLinker linker;
- ASSERT_TRUE(linker.Consume(context_.get(), doc.get()));
- ASSERT_TRUE(linker.sdk_levels().count(17) == 1);
- ASSERT_TRUE(linker.sdk_levels().count(21) == 1);
-
- android::ResXMLTree tree;
- XmlFlattenerOptions options;
- options.max_sdk_level = 17;
- ASSERT_TRUE(Flatten(doc.get(), &tree, options));
-
- while (tree.next() != android::ResXMLTree::START_TAG) {
- ASSERT_NE(tree.getEventType(), android::ResXMLTree::BAD_DOCUMENT);
- ASSERT_NE(tree.getEventType(), android::ResXMLTree::END_DOCUMENT);
- }
-
- ASSERT_EQ(1u, tree.getAttributeCount());
- EXPECT_EQ(uint32_t(0x010103b3), tree.getAttributeNameResID(0));
-}
-
TEST_F(XmlFlattenerTest, FlattenCompiledXmlAndStripOnlyTools) {
std::unique_ptr<xml::XmlResource> doc = test::BuildXmlDom(R"EOF(
<View xmlns:tools="http://schemas.android.com/tools"
@@ -234,13 +209,11 @@
}
const StringPiece16 kPackage = u"package";
- EXPECT_GE(tree.indexOfAttribute(nullptr, 0, kPackage.data(), kPackage.size()),
- 0);
+ EXPECT_GE(tree.indexOfAttribute(nullptr, 0, kPackage.data(), kPackage.size()), 0);
}
TEST_F(XmlFlattenerTest, EmptyStringValueInAttributeIsNotNull) {
- std::unique_ptr<xml::XmlResource> doc =
- test::BuildXmlDom("<View package=\"\"/>");
+ std::unique_ptr<xml::XmlResource> doc = test::BuildXmlDom("<View package=\"\"/>");
android::ResXMLTree tree;
ASSERT_TRUE(Flatten(doc.get(), &tree));
@@ -251,8 +224,7 @@
}
const StringPiece16 kPackage = u"package";
- ssize_t idx =
- tree.indexOfAttribute(nullptr, 0, kPackage.data(), kPackage.size());
+ ssize_t idx = tree.indexOfAttribute(nullptr, 0, kPackage.data(), kPackage.size());
ASSERT_GE(idx, 0);
size_t len;
diff --git a/tools/aapt2/integration-tests/AutoVersionTest/Android.mk b/tools/aapt2/integration-tests/AutoVersionTest/Android.mk
new file mode 100644
index 0000000..012728f
--- /dev/null
+++ b/tools/aapt2/integration-tests/AutoVersionTest/Android.mk
@@ -0,0 +1,23 @@
+#
+# Copyright (C) 2017 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.
+#
+
+LOCAL_PATH := $(call my-dir)
+
+include $(CLEAR_VARS)
+LOCAL_USE_AAPT2 := true
+LOCAL_PACKAGE_NAME := AaptAutoVersionTest
+LOCAL_MODULE_TAGS := tests
+include $(BUILD_PACKAGE)
diff --git a/tools/aapt2/integration-tests/AutoVersionTest/AndroidManifest.xml b/tools/aapt2/integration-tests/AutoVersionTest/AndroidManifest.xml
new file mode 100644
index 0000000..e66d709
--- /dev/null
+++ b/tools/aapt2/integration-tests/AutoVersionTest/AndroidManifest.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2017 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.
+-->
+
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+ package="com.android.aapt.autoversiontest">
+
+ <uses-sdk android:minSdkVersion="7" />
+</manifest>
diff --git a/tools/aapt2/integration-tests/AutoVersionTest/res/layout-v21/layout3.xml b/tools/aapt2/integration-tests/AutoVersionTest/res/layout-v21/layout3.xml
new file mode 100644
index 0000000..bfc5445
--- /dev/null
+++ b/tools/aapt2/integration-tests/AutoVersionTest/res/layout-v21/layout3.xml
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2017 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.
+-->
+
+<View xmlns:android="http://schemas.android.com/apk/res/android"
+ android:paddingVertical="24dp" />
+
diff --git a/tools/aapt2/integration-tests/AutoVersionTest/res/layout/layout.xml b/tools/aapt2/integration-tests/AutoVersionTest/res/layout/layout.xml
new file mode 100644
index 0000000..091a8ce
--- /dev/null
+++ b/tools/aapt2/integration-tests/AutoVersionTest/res/layout/layout.xml
@@ -0,0 +1,35 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2017 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.
+-->
+
+<View xmlns:android="http://schemas.android.com/apk/res/android"
+ android:autoStart="true"
+ android:expandableListViewWhiteStyle="@empty"
+ android:screenSize="large"
+ android:subtitle="Hello"
+ android:resizeMode="none"
+ android:largestWidthLimitDp="999"
+ android:uiOptions="none"
+ android:parentActivityName="Hello"
+ android:paddingStart="999dp"
+ android:requiredForAllUsers="true"
+ android:category="Hello"
+ android:isGame="true"
+ android:colorPrimary="#ffffff"
+ android:revisionCode="999"
+ android:autoVerify="true"
+ android:use32bitAbi="true"
+ android:shortcutId="@+id/id" />
+
diff --git a/tools/aapt2/integration-tests/AutoVersionTest/res/layout/layout2.xml b/tools/aapt2/integration-tests/AutoVersionTest/res/layout/layout2.xml
new file mode 100644
index 0000000..339337a
--- /dev/null
+++ b/tools/aapt2/integration-tests/AutoVersionTest/res/layout/layout2.xml
@@ -0,0 +1,47 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2017 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.
+-->
+
+<View xmlns:android="http://schemas.android.com/apk/res/android"
+ class="foo">
+ <View
+ android:paddingHorizontal="24dp" />
+ <View
+ android:paddingHorizontal="24dp"
+ android:paddingStart="16dp"
+ android:paddingEnd="16dp" />
+ <View
+ android:paddingHorizontal="24dp"
+ android:paddingLeft="16dp"
+ android:paddingRight="16dp" />
+ <View
+ android:paddingVertical="24dp" />
+ <View
+ android:paddingVertical="24dp"
+ android:paddingTop="16dp"
+ android:paddingBottom="16dp" />
+ <View
+ android:layout_marginHorizontal="24dp" />
+ <View
+ android:layout_marginHorizontal="24dp"
+ android:layout_marginStart="16dp"
+ android:layout_marginEnd="16dp" />
+ <View
+ android:layout_marginVertical="24dp" />
+ <View
+ android:layout_marginVertical="24dp"
+ android:layout_marginTop="16dp"
+ android:layout_marginBottom="16dp" />
+</View>
diff --git a/tools/aapt2/integration-tests/AutoVersionTest/res/layout/layout3.xml b/tools/aapt2/integration-tests/AutoVersionTest/res/layout/layout3.xml
new file mode 100644
index 0000000..8025ce1
--- /dev/null
+++ b/tools/aapt2/integration-tests/AutoVersionTest/res/layout/layout3.xml
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2017 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.
+-->
+
+<View xmlns:android="http://schemas.android.com/apk/res/android"
+ android:paddingHorizontal="24dp" />
+
diff --git a/tools/aapt2/integration-tests/AutoVersionTest/res/values-v21/styles.xml b/tools/aapt2/integration-tests/AutoVersionTest/res/values-v21/styles.xml
new file mode 100644
index 0000000..ff13faa
--- /dev/null
+++ b/tools/aapt2/integration-tests/AutoVersionTest/res/values-v21/styles.xml
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2017 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.
+-->
+
+<resources>
+ <style name="Style2">
+ <!-- API 7 -->
+ <item name="android:autoStart">false</item>
+
+ <!-- API 17 -->
+ <item name="android:paddingStart">0dp</item>
+
+ <!-- API 21 -->
+ <item name="android:colorPrimary">#00ff00</item>
+ </style>
+</resources>
diff --git a/tools/aapt2/integration-tests/AutoVersionTest/res/values/styles.xml b/tools/aapt2/integration-tests/AutoVersionTest/res/values/styles.xml
new file mode 100644
index 0000000..c4f09846
--- /dev/null
+++ b/tools/aapt2/integration-tests/AutoVersionTest/res/values/styles.xml
@@ -0,0 +1,84 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2017 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.
+-->
+
+<resources>
+ <style name="Style1">
+ <!-- API 7 -->
+ <item name="android:autoStart">true</item>
+
+ <!-- API 8 -->
+ <item name="android:expandableListViewWhiteStyle">@null</item>
+
+ <!-- API 9 -->
+ <item name="android:screenSize">large</item>
+
+ <!-- API 11 -->
+ <item name="android:subtitle">Hello</item>
+
+ <!-- API 12 -->
+ <item name="android:resizeMode">none</item>
+
+ <!-- API 13 -->
+ <item name="android:largestWidthLimitDp">999</item>
+
+ <!-- API 14 -->
+ <item name="android:uiOptions">none</item>
+
+ <!-- API 16 -->
+ <item name="android:parentActivityName">Hello</item>
+
+ <!-- API 17 -->
+ <item name="android:paddingStart">999dp</item>
+
+ <!-- API 18 -->
+ <item name="android:requiredForAllUsers">true</item>
+
+ <!-- API 19 -->
+ <item name="android:category">Hello</item>
+
+ <!-- API 20 -->
+ <item name="android:isGame">true</item>
+
+ <!-- API 21 -->
+ <item name="android:colorPrimary">#ffffff</item>
+
+ <!-- API 22 -->
+ <item name="android:revisionCode">999</item>
+
+ <!-- API 23 -->
+ <item name="android:autoVerify">true</item>
+
+ <!-- API 24 -->
+ <item name="android:use32bitAbi">true</item>
+
+ <!-- API 25 -->
+ <item name="android:shortcutId">@+id/id</item>
+
+ <!-- API 26 -->
+ <item name="android:paddingHorizontal">999dp</item>
+ </style>
+
+ <style name="Style2">
+ <!-- API 7 -->
+ <item name="android:autoStart">true</item>
+
+ <!-- API 17 -->
+ <item name="android:paddingStart">999dp</item>
+
+ <!-- API 21 -->
+ <item name="android:colorPrimary">#ffffff</item>
+ </style>
+</resources>
diff --git a/tools/aapt2/integration-tests/SymlinkTest/Android.mk b/tools/aapt2/integration-tests/SymlinkTest/Android.mk
new file mode 100644
index 0000000..902fc65
--- /dev/null
+++ b/tools/aapt2/integration-tests/SymlinkTest/Android.mk
@@ -0,0 +1,23 @@
+#
+# Copyright (C) 2017 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.
+#
+
+LOCAL_PATH := $(call my-dir)
+
+include $(CLEAR_VARS)
+LOCAL_USE_AAPT2 := true
+LOCAL_PACKAGE_NAME := AaptSymlinkTest
+LOCAL_MODULE_TAGS := tests
+include $(BUILD_PACKAGE)
diff --git a/tools/aapt2/integration-tests/SymlinkTest/AndroidManifest.xml b/tools/aapt2/integration-tests/SymlinkTest/AndroidManifest.xml
new file mode 100644
index 0000000..abbfa53
--- /dev/null
+++ b/tools/aapt2/integration-tests/SymlinkTest/AndroidManifest.xml
@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2017 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.
+-->
+
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+ package="com.android.aapt.symlinktest" />
diff --git a/tools/aapt2/integration-tests/SymlinkTest/res/drawable/white_3x3.9.png b/tools/aapt2/integration-tests/SymlinkTest/res/drawable/white_3x3.9.png
new file mode 120000
index 0000000..a7e8e2f
--- /dev/null
+++ b/tools/aapt2/integration-tests/SymlinkTest/res/drawable/white_3x3.9.png
@@ -0,0 +1 @@
+../../targets/white_3x3.9.png
\ No newline at end of file
diff --git a/tools/aapt2/integration-tests/SymlinkTest/res/layout/layout.xml b/tools/aapt2/integration-tests/SymlinkTest/res/layout/layout.xml
new file mode 120000
index 0000000..29c30e1
--- /dev/null
+++ b/tools/aapt2/integration-tests/SymlinkTest/res/layout/layout.xml
@@ -0,0 +1 @@
+../../targets/layout.xml
\ No newline at end of file
diff --git a/tools/aapt2/integration-tests/SymlinkTest/res/values/values.xml b/tools/aapt2/integration-tests/SymlinkTest/res/values/values.xml
new file mode 120000
index 0000000..554bb71
--- /dev/null
+++ b/tools/aapt2/integration-tests/SymlinkTest/res/values/values.xml
@@ -0,0 +1 @@
+../../targets/values.xml
\ No newline at end of file
diff --git a/tools/aapt2/integration-tests/SymlinkTest/targets/layout.xml b/tools/aapt2/integration-tests/SymlinkTest/targets/layout.xml
new file mode 100644
index 0000000..e5835ed
--- /dev/null
+++ b/tools/aapt2/integration-tests/SymlinkTest/targets/layout.xml
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2017 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.
+-->
+
+<View xmlns:android="http://schemas.android.com/apk/res/android"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent" />
diff --git a/tools/aapt2/integration-tests/SymlinkTest/targets/values.xml b/tools/aapt2/integration-tests/SymlinkTest/targets/values.xml
new file mode 100644
index 0000000..5b02843
--- /dev/null
+++ b/tools/aapt2/integration-tests/SymlinkTest/targets/values.xml
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2017 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.
+-->
+
+<resources>
+ <bool name="foo">true</bool>
+</resources>
diff --git a/tools/aapt2/integration-tests/SymlinkTest/targets/white_3x3.9.png b/tools/aapt2/integration-tests/SymlinkTest/targets/white_3x3.9.png
new file mode 100644
index 0000000..1a3731b
--- /dev/null
+++ b/tools/aapt2/integration-tests/SymlinkTest/targets/white_3x3.9.png
Binary files differ
diff --git a/tools/aapt2/link/AutoVersioner.cpp b/tools/aapt2/link/AutoVersioner.cpp
index 77471ea..f80c6e9 100644
--- a/tools/aapt2/link/AutoVersioner.cpp
+++ b/tools/aapt2/link/AutoVersioner.cpp
@@ -27,13 +27,15 @@
namespace aapt {
-bool ShouldGenerateVersionedResource(const ResourceEntry* entry,
- const ConfigDescription& config,
- const int sdk_version_to_generate) {
- // We assume the caller is trying to generate a version greater than the
- // current configuration.
+bool ShouldGenerateVersionedResource(const ResourceEntry* entry, const ConfigDescription& config,
+ const ApiVersion sdk_version_to_generate) {
+ // We assume the caller is trying to generate a version greater than the current configuration.
CHECK(sdk_version_to_generate > config.sdkVersion);
+ return sdk_version_to_generate < FindNextApiVersionForConfig(entry, config);
+}
+ApiVersion FindNextApiVersionForConfig(const ResourceEntry* entry,
+ const ConfigDescription& config) {
const auto end_iter = entry->values.end();
auto iter = entry->values.begin();
for (; iter != end_iter; ++iter) {
@@ -46,26 +48,23 @@
CHECK(iter != entry->values.end());
++iter;
- // The next configuration either only varies in sdkVersion, or it is
- // completely different
- // and therefore incompatible. If it is incompatible, we must generate the
- // versioned resource.
+ // The next configuration either only varies in sdkVersion, or it is completely different
+ // and therefore incompatible. If it is incompatible, we must generate the versioned resource.
- // NOTE: The ordering of configurations takes sdkVersion as higher precedence
- // than other
+ // NOTE: The ordering of configurations takes sdkVersion as higher precedence than other
// qualifiers, so we need to iterate through the entire list to be sure there
// are no higher sdk level versions of this resource.
ConfigDescription temp_config(config);
for (; iter != end_iter; ++iter) {
temp_config.sdkVersion = (*iter)->config.sdkVersion;
if (temp_config == (*iter)->config) {
- // The two configs are the same, check the sdk version.
- return sdk_version_to_generate < (*iter)->config.sdkVersion;
+ // The two configs are the same, return the sdkVersion.
+ return (*iter)->config.sdkVersion;
}
}
- // No match was found, so we should generate the versioned resource.
- return true;
+ // Didn't find another config with a different sdk version, so return the highest possible value.
+ return std::numeric_limits<ApiVersion>::max();
}
bool AutoVersioner::Consume(IAaptContext* context, ResourceTable* table) {
@@ -86,7 +85,7 @@
}
if (Style* style = ValueCast<Style>(config_value->value.get())) {
- Maybe<size_t> min_sdk_stripped;
+ Maybe<ApiVersion> min_sdk_stripped;
std::vector<Style::Entry> stripped;
auto iter = style->entries.begin();
@@ -95,17 +94,14 @@
// Find the SDK level that is higher than the configuration
// allows.
- const size_t sdk_level =
- FindAttributeSdkLevel(iter->key.id.value());
- if (sdk_level >
- std::max<size_t>(config_value->config.sdkVersion, 1)) {
+ const ApiVersion sdk_level = FindAttributeSdkLevel(iter->key.id.value());
+ if (sdk_level > std::max<ApiVersion>(config_value->config.sdkVersion, 1)) {
// Record that we are about to strip this.
stripped.emplace_back(std::move(*iter));
// We use the smallest SDK level to generate the new style.
if (min_sdk_stripped) {
- min_sdk_stripped =
- std::min(min_sdk_stripped.value(), sdk_level);
+ min_sdk_stripped = std::min(min_sdk_stripped.value(), sdk_level);
} else {
min_sdk_stripped = sdk_level;
}
@@ -126,10 +122,9 @@
min_sdk_stripped.value())) {
// Let's create a new Style for this versioned resource.
ConfigDescription new_config(config_value->config);
- new_config.sdkVersion = min_sdk_stripped.value();
+ new_config.sdkVersion = static_cast<uint16_t>(min_sdk_stripped.value());
- std::unique_ptr<Style> new_style(
- style->Clone(&table->string_pool));
+ std::unique_ptr<Style> new_style(style->Clone(&table->string_pool));
new_style->SetComment(style->GetComment());
new_style->SetSource(style->GetSource());
@@ -140,8 +135,7 @@
std::make_move_iterator(stripped.end()));
// Insert the new Resource into the correct place.
- entry->FindOrCreateValue(new_config, {})->value =
- std::move(new_style);
+ entry->FindOrCreateValue(new_config, {})->value = std::move(new_style);
}
}
}
diff --git a/tools/aapt2/link/Linkers.h b/tools/aapt2/link/Linkers.h
index d00fa73..5527f90 100644
--- a/tools/aapt2/link/Linkers.h
+++ b/tools/aapt2/link/Linkers.h
@@ -23,6 +23,7 @@
#include "android-base/macros.h"
#include "Resource.h"
+#include "SdkConstants.h"
#include "process/IResourceTableConsumer.h"
#include "xml/XmlDom.h"
@@ -44,9 +45,12 @@
* Determines whether a versioned resource should be created. If a versioned
* resource already exists, it takes precedence.
*/
-bool ShouldGenerateVersionedResource(const ResourceEntry* entry,
- const ConfigDescription& config,
- const int sdk_version_to_generate);
+bool ShouldGenerateVersionedResource(const ResourceEntry* entry, const ConfigDescription& config,
+ const ApiVersion sdk_version_to_generate);
+
+// Finds the next largest ApiVersion of the config which is identical to the given config except
+// for sdkVersion.
+ApiVersion FindNextApiVersionForConfig(const ResourceEntry* entry, const ConfigDescription& config);
class AutoVersioner : public IResourceTableConsumer {
public:
@@ -105,11 +109,10 @@
class ProductFilter : public IResourceTableConsumer {
public:
- using ResourceConfigValueIter =
- std::vector<std::unique_ptr<ResourceConfigValue>>::iterator;
+ using ResourceConfigValueIter = std::vector<std::unique_ptr<ResourceConfigValue>>::iterator;
- explicit ProductFilter(std::unordered_set<std::string> products)
- : products_(products) {}
+ explicit ProductFilter(std::unordered_set<std::string> products) : products_(products) {
+ }
ResourceConfigValueIter SelectProductToKeep(
const ResourceNameRef& name, const ResourceConfigValueIter begin,
@@ -118,19 +121,9 @@
bool Consume(IAaptContext* context, ResourceTable* table) override;
private:
- std::unordered_set<std::string> products_;
-
DISALLOW_COPY_AND_ASSIGN(ProductFilter);
-};
-class XmlAutoVersioner : public IXmlResourceConsumer {
- public:
- XmlAutoVersioner() = default;
-
- bool Consume(IAaptContext* context, xml::XmlResource* resource) override;
-
- private:
- DISALLOW_COPY_AND_ASSIGN(XmlAutoVersioner);
+ std::unordered_set<std::string> products_;
};
/**
@@ -143,8 +136,7 @@
*/
class XmlNamespaceRemover : public IXmlResourceConsumer {
public:
- explicit XmlNamespaceRemover(bool keep_uris = false)
- : keep_uris_(keep_uris){};
+ explicit XmlNamespaceRemover(bool keep_uris = false) : keep_uris_(keep_uris){};
bool Consume(IAaptContext* context, xml::XmlResource* resource) override;
@@ -165,17 +157,8 @@
bool Consume(IAaptContext* context, xml::XmlResource* resource) override;
- /**
- * Once the XmlResource has been consumed, this returns the various SDK levels
- * in which
- * framework attributes used within the XML document were defined.
- */
- inline const std::set<int>& sdk_levels() const { return sdk_levels_found_; }
-
private:
DISALLOW_COPY_AND_ASSIGN(XmlReferenceLinker);
-
- std::set<int> sdk_levels_found_;
};
} // namespace aapt
diff --git a/tools/aapt2/link/ReferenceLinker.cpp b/tools/aapt2/link/ReferenceLinker.cpp
index 833ae69..18498e3 100644
--- a/tools/aapt2/link/ReferenceLinker.cpp
+++ b/tools/aapt2/link/ReferenceLinker.cpp
@@ -274,7 +274,7 @@
if (out_error) *out_error = "is not an attribute";
return {};
}
- return xml::AaptAttribute{symbol->id, *symbol->attribute};
+ return xml::AaptAttribute(*symbol->attribute, symbol->id);
}
void ReferenceLinker::WriteResourceName(DiagMessage* out_msg,
diff --git a/tools/aapt2/link/TableMerger.cpp b/tools/aapt2/link/TableMerger.cpp
index 9311091..10e837c 100644
--- a/tools/aapt2/link/TableMerger.cpp
+++ b/tools/aapt2/link/TableMerger.cpp
@@ -179,32 +179,39 @@
return true;
}
-/**
- * Modified CollisionResolver which will merge Styleables. Used with overlays.
- *
- * Styleables are not actual resources, but they are treated as such during the
- * compilation phase. Styleables don't simply overlay each other, their
- * definitions merge
- * and accumulate. If both values are Styleables, we just merge them into the
- * existing value.
- */
-static ResourceTable::CollisionResult ResolveMergeCollision(Value* existing,
- Value* incoming) {
+// Modified CollisionResolver which will merge Styleables and Styles. Used with overlays.
+//
+// Styleables are not actual resources, but they are treated as such during the
+// compilation phase.
+//
+// Styleables and Styles don't simply overlay each other, their definitions merge
+// and accumulate. If both values are Styleables/Styles, we just merge them into the
+// existing value.
+static ResourceTable::CollisionResult ResolveMergeCollision(Value* existing, Value* incoming,
+ StringPool* pool) {
if (Styleable* existing_styleable = ValueCast<Styleable>(existing)) {
if (Styleable* incoming_styleable = ValueCast<Styleable>(incoming)) {
// Styleables get merged.
existing_styleable->MergeWith(incoming_styleable);
return ResourceTable::CollisionResult::kKeepOriginal;
}
+ } else if (Style* existing_style = ValueCast<Style>(existing)) {
+ if (Style* incoming_style = ValueCast<Style>(incoming)) {
+ // Styles get merged.
+ existing_style->MergeWith(incoming_style, pool);
+ return ResourceTable::CollisionResult::kKeepOriginal;
+ }
}
// Delegate to the default handler.
return ResourceTable::ResolveValueCollision(existing, incoming);
}
-static ResourceTable::CollisionResult MergeConfigValue(
- IAaptContext* context, const ResourceNameRef& res_name, const bool overlay,
- ResourceConfigValue* dst_config_value,
- ResourceConfigValue* src_config_value) {
+static ResourceTable::CollisionResult MergeConfigValue(IAaptContext* context,
+ const ResourceNameRef& res_name,
+ const bool overlay,
+ ResourceConfigValue* dst_config_value,
+ ResourceConfigValue* src_config_value,
+ StringPool* pool) {
using CollisionResult = ResourceTable::CollisionResult;
Value* dst_value = dst_config_value->value.get();
@@ -212,10 +219,9 @@
CollisionResult collision_result;
if (overlay) {
- collision_result = ResolveMergeCollision(dst_value, src_value);
+ collision_result = ResolveMergeCollision(dst_value, src_value, pool);
} else {
- collision_result =
- ResourceTable::ResolveValueCollision(dst_value, src_value);
+ collision_result = ResourceTable::ResolveValueCollision(dst_value, src_value);
}
if (collision_result == CollisionResult::kConflict) {
@@ -224,10 +230,9 @@
}
// Error!
- context->GetDiagnostics()->Error(
- DiagMessage(src_value->GetSource())
- << "resource '" << res_name << "' has a conflicting value for "
- << "configuration (" << src_config_value->config << ")");
+ context->GetDiagnostics()->Error(DiagMessage(src_value->GetSource())
+ << "resource '" << res_name << "' has a conflicting value for "
+ << "configuration (" << src_config_value->config << ")");
context->GetDiagnostics()->Note(DiagMessage(dst_value->GetSource())
<< "originally defined here");
return CollisionResult::kConflict;
@@ -243,8 +248,7 @@
bool error = false;
for (auto& src_type : src_package->types) {
- ResourceTableType* dst_type =
- master_package_->FindOrCreateType(src_type->type);
+ ResourceTableType* dst_type = master_package_->FindOrCreateType(src_type->type);
if (!MergeType(context_, src, dst_type, src_type.get())) {
error = true;
continue;
@@ -253,27 +257,24 @@
for (auto& src_entry : src_type->entries) {
std::string entry_name = src_entry->name;
if (mangle_package) {
- entry_name =
- NameMangler::MangleEntry(src_package->name, src_entry->name);
+ entry_name = NameMangler::MangleEntry(src_package->name, src_entry->name);
}
ResourceEntry* dst_entry;
- if (allow_new_resources) {
+ if (allow_new_resources || src_entry->symbol_status.allow_new) {
dst_entry = dst_type->FindOrCreateEntry(entry_name);
} else {
dst_entry = dst_type->FindEntry(entry_name);
}
- const ResourceNameRef res_name(src_package->name, src_type->type,
- src_entry->name);
+ const ResourceNameRef res_name(src_package->name, src_type->type, src_entry->name);
if (!dst_entry) {
- context_->GetDiagnostics()->Error(
- DiagMessage(src) << "resource " << res_name
- << " does not override an existing resource");
- context_->GetDiagnostics()->Note(
- DiagMessage(src) << "define an <add-resource> tag or use "
- << "--auto-add-overlay");
+ context_->GetDiagnostics()->Error(DiagMessage(src)
+ << "resource " << res_name
+ << " does not override an existing resource");
+ context_->GetDiagnostics()->Note(DiagMessage(src) << "define an <add-resource> tag or use "
+ << "--auto-add-overlay");
error = true;
continue;
}
@@ -291,7 +292,7 @@
if (dst_config_value) {
CollisionResult collision_result =
MergeConfigValue(context_, res_name, overlay, dst_config_value,
- src_config_value.get());
+ src_config_value.get(), &master_table_->string_pool);
if (collision_result == CollisionResult::kConflict) {
error = true;
continue;
@@ -299,25 +300,22 @@
continue;
}
} else {
- dst_config_value = dst_entry->FindOrCreateValue(
- src_config_value->config, src_config_value->product);
+ dst_config_value =
+ dst_entry->FindOrCreateValue(src_config_value->config, src_config_value->product);
}
// Continue if we're taking the new resource.
- if (FileReference* f =
- ValueCast<FileReference>(src_config_value->value.get())) {
+ if (FileReference* f = ValueCast<FileReference>(src_config_value->value.get())) {
std::unique_ptr<FileReference> new_file_ref;
if (mangle_package) {
new_file_ref = CloneAndMangleFile(src_package->name, *f);
} else {
- new_file_ref = std::unique_ptr<FileReference>(
- f->Clone(&master_table_->string_pool));
+ new_file_ref = std::unique_ptr<FileReference>(f->Clone(&master_table_->string_pool));
}
if (callback) {
- if (!callback(res_name, src_config_value->config,
- new_file_ref.get(), f)) {
+ if (!callback(res_name, src_config_value->config, new_file_ref.get(), f)) {
error = true;
continue;
}
@@ -341,18 +339,15 @@
std::string mangled_entry = NameMangler::MangleEntry(package, entry.to_string());
std::string newPath = prefix.to_string() + mangled_entry + suffix.to_string();
std::unique_ptr<FileReference> new_file_ref =
- util::make_unique<FileReference>(
- master_table_->string_pool.MakeRef(newPath));
+ util::make_unique<FileReference>(master_table_->string_pool.MakeRef(newPath));
new_file_ref->SetComment(file_ref.GetComment());
new_file_ref->SetSource(file_ref.GetSource());
return new_file_ref;
}
- return std::unique_ptr<FileReference>(
- file_ref.Clone(&master_table_->string_pool));
+ return std::unique_ptr<FileReference>(file_ref.Clone(&master_table_->string_pool));
}
-bool TableMerger::MergeFileImpl(const ResourceFile& file_desc, io::IFile* file,
- bool overlay) {
+bool TableMerger::MergeFileImpl(const ResourceFile& file_desc, io::IFile* file, bool overlay) {
ResourceTable table;
std::string path = ResourceUtils::BuildResourceFileName(file_desc);
std::unique_ptr<FileReference> file_ref =
diff --git a/tools/aapt2/link/TableMerger_test.cpp b/tools/aapt2/link/TableMerger_test.cpp
index 742f5a7..45b01a4 100644
--- a/tools/aapt2/link/TableMerger_test.cpp
+++ b/tools/aapt2/link/TableMerger_test.cpp
@@ -20,6 +20,14 @@
#include "io/FileSystem.h"
#include "test/Test.h"
+using ::aapt::test::ValueEq;
+using ::testing::Contains;
+using ::testing::NotNull;
+using ::testing::UnorderedElementsAreArray;
+using ::testing::Pointee;
+using ::testing::Field;
+using ::testing::Eq;
+
namespace aapt {
struct TableMergerTest : public ::testing::Test {
@@ -62,26 +70,20 @@
io::FileCollection collection;
ASSERT_TRUE(merger.Merge({}, table_a.get()));
- ASSERT_TRUE(
- merger.MergeAndMangle({}, "com.app.b", table_b.get(), &collection));
+ ASSERT_TRUE(merger.MergeAndMangle({}, "com.app.b", table_b.get(), &collection));
EXPECT_TRUE(merger.merged_packages().count("com.app.b") != 0);
// Entries from com.app.a should not be mangled.
- AAPT_EXPECT_TRUE(
- final_table.FindResource(test::ParseNameOrDie("com.app.a:id/foo")));
- AAPT_EXPECT_TRUE(
- final_table.FindResource(test::ParseNameOrDie("com.app.a:id/bar")));
- AAPT_EXPECT_TRUE(final_table.FindResource(
- test::ParseNameOrDie("com.app.a:styleable/view")));
+ EXPECT_TRUE(final_table.FindResource(test::ParseNameOrDie("com.app.a:id/foo")));
+ EXPECT_TRUE(final_table.FindResource(test::ParseNameOrDie("com.app.a:id/bar")));
+ EXPECT_TRUE(final_table.FindResource(test::ParseNameOrDie("com.app.a:styleable/view")));
// The unmangled name should not be present.
- AAPT_EXPECT_FALSE(
- final_table.FindResource(test::ParseNameOrDie("com.app.b:id/foo")));
+ EXPECT_FALSE(final_table.FindResource(test::ParseNameOrDie("com.app.b:id/foo")));
// Look for the mangled name.
- AAPT_EXPECT_TRUE(final_table.FindResource(
- test::ParseNameOrDie("com.app.a:id/com.app.b$foo")));
+ EXPECT_TRUE(final_table.FindResource(test::ParseNameOrDie("com.app.a:id/com.app.b$foo")));
}
TEST_F(TableMergerTest, MergeFile) {
@@ -100,7 +102,7 @@
FileReference* file = test::GetValueForConfig<FileReference>(
&final_table, "com.app.a:layout/main", test::ParseConfigOrDie("hdpi-v4"));
- ASSERT_NE(nullptr, file);
+ ASSERT_THAT(file, NotNull());
EXPECT_EQ(std::string("res/layout-hdpi-v4/main.xml"), *file->path);
}
@@ -137,17 +139,14 @@
collection.InsertFile("res/xml/file.xml");
ASSERT_TRUE(merger.Merge({}, table_a.get()));
- ASSERT_TRUE(
- merger.MergeAndMangle({}, "com.app.b", table_b.get(), &collection));
+ ASSERT_TRUE(merger.MergeAndMangle({}, "com.app.b", table_b.get(), &collection));
- FileReference* f =
- test::GetValue<FileReference>(&final_table, "com.app.a:xml/file");
- ASSERT_NE(f, nullptr);
+ FileReference* f = test::GetValue<FileReference>(&final_table, "com.app.a:xml/file");
+ ASSERT_THAT(f, NotNull());
EXPECT_EQ(std::string("res/xml/file.xml"), *f->path);
- f = test::GetValue<FileReference>(&final_table,
- "com.app.a:xml/com.app.b$file");
- ASSERT_NE(f, nullptr);
+ f = test::GetValue<FileReference>(&final_table, "com.app.a:xml/com.app.b$file");
+ ASSERT_THAT(f, NotNull());
EXPECT_EQ(std::string("res/xml/com.app.b$file.xml"), *f->path);
}
@@ -171,10 +170,9 @@
ASSERT_TRUE(merger.Merge({}, base.get()));
ASSERT_TRUE(merger.MergeOverlay({}, overlay.get()));
- BinaryPrimitive* foo =
- test::GetValue<BinaryPrimitive>(&final_table, "com.app.a:bool/foo");
- ASSERT_NE(nullptr, foo);
- EXPECT_EQ(0x0u, foo->value.data);
+ BinaryPrimitive* foo = test::GetValue<BinaryPrimitive>(&final_table, "com.app.a:bool/foo");
+ ASSERT_THAT(foo,
+ Pointee(Field(&BinaryPrimitive::value, Field(&android::Res_value::data, Eq(0u)))));
}
TEST_F(TableMergerTest, OverrideSameResourceIdsWithOverlay) {
@@ -248,18 +246,18 @@
TEST_F(TableMergerTest, MergeAddResourceFromOverlay) {
std::unique_ptr<ResourceTable> table_a =
- test::ResourceTableBuilder()
- .SetPackageId("", 0x7f)
- .SetSymbolState("bool/foo", {}, SymbolState::kUndefined)
- .Build();
+ test::ResourceTableBuilder().SetPackageId("", 0x7f).Build();
std::unique_ptr<ResourceTable> table_b =
test::ResourceTableBuilder()
.SetPackageId("", 0x7f)
+ .SetSymbolState("bool/foo", {}, SymbolState::kUndefined, true /*allow new overlay*/)
.AddValue("bool/foo", ResourceUtils::TryParseBool("true"))
.Build();
ResourceTable final_table;
- TableMerger merger(context_.get(), &final_table, TableMergerOptions{});
+ TableMergerOptions options;
+ options.auto_add_overlay = false;
+ TableMerger merger(context_.get(), &final_table, options);
ASSERT_TRUE(merger.Merge({}, table_a.get()));
ASSERT_TRUE(merger.MergeOverlay({}, table_b.get()));
@@ -301,7 +299,7 @@
ASSERT_FALSE(merger.MergeOverlay({}, table_b.get()));
}
-TEST_F(TableMergerTest, OverlaidStyleablesShouldBeMerged) {
+TEST_F(TableMergerTest, OverlaidStyleablesAndStylesShouldBeMerged) {
std::unique_ptr<ResourceTable> table_a =
test::ResourceTableBuilder()
.SetPackageId("com.app.a", 0x7f)
@@ -310,15 +308,27 @@
.AddItem("com.app.a:attr/bar")
.AddItem("com.app.a:attr/foo", ResourceId(0x01010000))
.Build())
+ .AddValue("com.app.a:style/Theme",
+ test::StyleBuilder()
+ .SetParent("com.app.a:style/Parent")
+ .AddItem("com.app.a:attr/bar", util::make_unique<Id>())
+ .AddItem("com.app.a:attr/foo", ResourceUtils::MakeBool(false))
+ .Build())
.Build();
std::unique_ptr<ResourceTable> table_b =
test::ResourceTableBuilder()
.SetPackageId("com.app.a", 0x7f)
- .AddValue("com.app.a:styleable/Foo",
- test::StyleableBuilder()
- .AddItem("com.app.a:attr/bat")
- .AddItem("com.app.a:attr/foo")
+ .AddValue("com.app.a:styleable/Foo", test::StyleableBuilder()
+ .AddItem("com.app.a:attr/bat")
+ .AddItem("com.app.a:attr/foo")
+ .Build())
+ .AddValue("com.app.a:style/Theme",
+ test::StyleBuilder()
+ .SetParent("com.app.a:style/OverlayParent")
+ .AddItem("com.app.a:attr/bat", util::make_unique<Id>())
+ .AddItem("com.app.a:attr/foo", ResourceId(0x01010000),
+ ResourceUtils::MakeBool(true))
.Build())
.Build();
@@ -330,18 +340,29 @@
ASSERT_TRUE(merger.Merge({}, table_a.get()));
ASSERT_TRUE(merger.MergeOverlay({}, table_b.get()));
- Styleable* styleable =
- test::GetValue<Styleable>(&final_table, "com.app.a:styleable/Foo");
- ASSERT_NE(nullptr, styleable);
+ Styleable* styleable = test::GetValue<Styleable>(&final_table, "com.app.a:styleable/Foo");
+ ASSERT_THAT(styleable, NotNull());
std::vector<Reference> expected_refs = {
Reference(test::ParseNameOrDie("com.app.a:attr/bar")),
Reference(test::ParseNameOrDie("com.app.a:attr/bat")),
- Reference(test::ParseNameOrDie("com.app.a:attr/foo"),
- ResourceId(0x01010000)),
+ Reference(test::ParseNameOrDie("com.app.a:attr/foo"), ResourceId(0x01010000)),
};
+ EXPECT_THAT(styleable->entries, UnorderedElementsAreArray(expected_refs));
- EXPECT_EQ(expected_refs, styleable->entries);
+ Style* style = test::GetValue<Style>(&final_table, "com.app.a:style/Theme");
+ ASSERT_THAT(style, NotNull());
+
+ std::vector<Reference> extracted_refs;
+ for (const auto& entry : style->entries) {
+ extracted_refs.push_back(entry.key);
+ }
+ EXPECT_THAT(extracted_refs, UnorderedElementsAreArray(expected_refs));
+
+ const auto expected = ResourceUtils::MakeBool(true);
+ EXPECT_THAT(style->entries, Contains(Field(&Style::Entry::value, Pointee(ValueEq(*expected)))));
+ EXPECT_THAT(style->parent,
+ Eq(make_value(Reference(test::ParseNameOrDie("com.app.a:style/OverlayParent")))));
}
} // namespace aapt
diff --git a/tools/aapt2/link/XmlCompatVersioner.cpp b/tools/aapt2/link/XmlCompatVersioner.cpp
new file mode 100644
index 0000000..f1f4e3b
--- /dev/null
+++ b/tools/aapt2/link/XmlCompatVersioner.cpp
@@ -0,0 +1,179 @@
+/*
+ * Copyright (C) 2017 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.
+ */
+
+#include "link/XmlCompatVersioner.h"
+
+#include <algorithm>
+
+#include "util/Util.h"
+
+namespace aapt {
+
+static xml::Attribute CopyAttr(const xml::Attribute& src, StringPool* out_string_pool) {
+ xml::Attribute dst{src.namespace_uri, src.name, src.value, src.compiled_attribute};
+ if (src.compiled_value != nullptr) {
+ dst.compiled_value.reset(src.compiled_value->Clone(out_string_pool));
+ }
+ return dst;
+}
+
+// Returns false if the attribute is not copied because an existing attribute takes precedence
+// (came from a rule).
+static bool CopyAttribute(const xml::Attribute& src_attr, bool generated, xml::Element* dst_el,
+ StringPool* out_string_pool) {
+ xml::Attribute* dst_attr = dst_el->FindAttribute(src_attr.namespace_uri, src_attr.name);
+ if (dst_attr != nullptr) {
+ if (generated) {
+ // Generated attributes always take precedence.
+ dst_attr->value = src_attr.value;
+ dst_attr->compiled_attribute = src_attr.compiled_attribute;
+ if (src_attr.compiled_value != nullptr) {
+ dst_attr->compiled_value.reset(src_attr.compiled_value->Clone(out_string_pool));
+ }
+ return true;
+ }
+ return false;
+ }
+ dst_el->attributes.push_back(CopyAttr(src_attr, out_string_pool));
+ return true;
+}
+
+void XmlCompatVersioner::ProcessRule(const xml::Element& src_el, const xml::Attribute& src_attr,
+ const ApiVersion& src_attr_version, const IDegradeRule* rule,
+ const util::Range<ApiVersion>& api_range, bool generated,
+ xml::Element* dst_el,
+ std::set<ApiVersion>* out_apis_referenced,
+ StringPool* out_string_pool) {
+ if (src_attr_version <= api_range.start) {
+ // The API is compatible, so don't check the rule and just copy.
+ if (!CopyAttribute(src_attr, generated, dst_el, out_string_pool)) {
+ // TODO(adamlesinski): Log a warning that an attribute was overridden?
+ }
+ return;
+ }
+
+ if (api_range.start >= SDK_LOLLIPOP_MR1) {
+ // Since LOLLIPOP MR1, the framework can handle silently ignoring unknown public attributes,
+ // so we don't need to erase/version them.
+ // Copy.
+ if (!CopyAttribute(src_attr, generated, dst_el, out_string_pool)) {
+ // TODO(adamlesinski): Log a warning that an attribute was overridden?
+ }
+ } else {
+ // We are going to erase this attribute from this XML resource version, but check if
+ // we even need to move it anywhere. A developer may have effectively overwritten it with
+ // a similarly versioned XML resource.
+ if (src_attr_version < api_range.end) {
+ // There is room for another versioned XML resource between this XML resource and the next
+ // versioned XML resource defined by the developer.
+ out_apis_referenced->insert(std::min<ApiVersion>(src_attr_version, SDK_LOLLIPOP_MR1));
+ }
+ }
+
+ if (rule != nullptr) {
+ for (const DegradeResult& result : rule->Degrade(src_el, src_attr, out_string_pool)) {
+ const ResourceId attr_resid = result.attr.compiled_attribute.value().id.value();
+ const ApiVersion attr_version = FindAttributeSdkLevel(attr_resid);
+
+ auto iter = rules_->find(attr_resid);
+ ProcessRule(src_el, result.attr, attr_version,
+ iter != rules_->end() ? iter->second.get() : nullptr, api_range,
+ true /*generated*/, dst_el, out_apis_referenced, out_string_pool);
+ }
+ }
+}
+
+XmlCompatVersioner::XmlCompatVersioner(const Rules* rules) : rules_(rules) {
+}
+
+std::unique_ptr<xml::XmlResource> XmlCompatVersioner::ProcessDoc(
+ ApiVersion target_api, ApiVersion max_api, xml::XmlResource* doc,
+ std::set<ApiVersion>* out_apis_referenced) {
+ const util::Range<ApiVersion> api_range{target_api, max_api};
+
+ std::unique_ptr<xml::XmlResource> cloned_doc = util::make_unique<xml::XmlResource>(doc->file);
+ cloned_doc->file.config.sdkVersion = static_cast<uint16_t>(target_api);
+
+ cloned_doc->root = doc->root->Clone([&](const xml::Element& el, xml::Element* out_el) {
+ for (const auto& attr : el.attributes) {
+ if (!attr.compiled_attribute) {
+ // Just copy if this isn't a compiled attribute.
+ out_el->attributes.push_back(CopyAttr(attr, &cloned_doc->string_pool));
+ continue;
+ }
+
+ const ResourceId attr_resid = attr.compiled_attribute.value().id.value();
+ const ApiVersion attr_version = FindAttributeSdkLevel(attr_resid);
+
+ auto rule = rules_->find(attr_resid);
+ ProcessRule(el, attr, attr_version, rule != rules_->end() ? rule->second.get() : nullptr,
+ api_range, false /*generated*/, out_el, out_apis_referenced,
+ &cloned_doc->string_pool);
+ }
+ });
+ return cloned_doc;
+}
+
+std::vector<std::unique_ptr<xml::XmlResource>> XmlCompatVersioner::Process(
+ IAaptContext* context, xml::XmlResource* doc, util::Range<ApiVersion> api_range) {
+ // Adjust the API range so that it falls after this document and after minSdkVersion.
+ api_range.start = std::max(api_range.start, context->GetMinSdkVersion());
+ api_range.start = std::max(api_range.start, static_cast<ApiVersion>(doc->file.config.sdkVersion));
+
+ std::vector<std::unique_ptr<xml::XmlResource>> versioned_docs;
+ std::set<ApiVersion> apis_referenced;
+ versioned_docs.push_back(ProcessDoc(api_range.start, api_range.end, doc, &apis_referenced));
+
+ // Adjust the sdkVersion of the first XML document back to its original (this only really
+ // makes a difference if the sdk version was below the minSdk to start).
+ versioned_docs.back()->file.config.sdkVersion = doc->file.config.sdkVersion;
+
+ // Iterate from smallest to largest API version.
+ for (ApiVersion api : apis_referenced) {
+ std::set<ApiVersion> dummy;
+ versioned_docs.push_back(ProcessDoc(api, api_range.end, doc, &dummy));
+ }
+ return versioned_docs;
+}
+
+DegradeToManyRule::DegradeToManyRule(std::vector<ReplacementAttr> attrs)
+ : attrs_(std::move(attrs)) {
+}
+
+static inline std::unique_ptr<Item> CloneIfNotNull(const std::unique_ptr<Item>& src,
+ StringPool* out_string_pool) {
+ if (src == nullptr) {
+ return {};
+ }
+ return std::unique_ptr<Item>(src->Clone(out_string_pool));
+}
+
+std::vector<DegradeResult> DegradeToManyRule::Degrade(const xml::Element& src_el,
+ const xml::Attribute& src_attr,
+ StringPool* out_string_pool) const {
+ std::vector<DegradeResult> result;
+ result.reserve(attrs_.size());
+ for (const ReplacementAttr& attr : attrs_) {
+ result.push_back(
+ DegradeResult{xml::Attribute{xml::kSchemaAndroid, attr.name, src_attr.value,
+ xml::AaptAttribute{attr.attr, attr.id},
+ CloneIfNotNull(src_attr.compiled_value, out_string_pool)},
+ FindAttributeSdkLevel(attr.id)});
+ }
+ return result;
+}
+
+} // namespace aapt
diff --git a/tools/aapt2/link/XmlCompatVersioner.h b/tools/aapt2/link/XmlCompatVersioner.h
new file mode 100644
index 0000000..099e23c
--- /dev/null
+++ b/tools/aapt2/link/XmlCompatVersioner.h
@@ -0,0 +1,100 @@
+/*
+ * Copyright (C) 2017 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.
+ */
+
+#ifndef AAPT_LINKER_XMLCOMPATVERSIONER_H
+#define AAPT_LINKER_XMLCOMPATVERSIONER_H
+
+#include <set>
+#include <unordered_map>
+#include <vector>
+
+#include "android-base/macros.h"
+
+#include "Resource.h"
+#include "SdkConstants.h"
+#include "process/IResourceTableConsumer.h"
+#include "util/Util.h"
+#include "xml/XmlDom.h"
+
+namespace aapt {
+
+class IDegradeRule;
+
+struct DegradeResult {
+ xml::Attribute attr;
+ ApiVersion attr_api_version;
+};
+
+class IDegradeRule {
+ public:
+ IDegradeRule() = default;
+ virtual ~IDegradeRule() = default;
+
+ virtual std::vector<DegradeResult> Degrade(const xml::Element& src_el,
+ const xml::Attribute& src_attr,
+ StringPool* out_string_pool) const = 0;
+
+ private:
+ DISALLOW_COPY_AND_ASSIGN(IDegradeRule);
+};
+
+class XmlCompatVersioner {
+ public:
+ using Rules = std::unordered_map<ResourceId, std::unique_ptr<IDegradeRule>>;
+
+ XmlCompatVersioner(const Rules* rules);
+
+ std::vector<std::unique_ptr<xml::XmlResource>> Process(IAaptContext* context,
+ xml::XmlResource* doc,
+ util::Range<ApiVersion> api_range);
+
+ private:
+ DISALLOW_COPY_AND_ASSIGN(XmlCompatVersioner);
+
+ std::unique_ptr<xml::XmlResource> ProcessDoc(ApiVersion target_api, ApiVersion max_api,
+ xml::XmlResource* doc,
+ std::set<ApiVersion>* out_apis_referenced);
+ void ProcessRule(const xml::Element& src_el, const xml::Attribute& src_attr,
+ const ApiVersion& src_attr_version, const IDegradeRule* rule,
+ const util::Range<ApiVersion>& api_range, bool generated, xml::Element* dst_el,
+ std::set<ApiVersion>* out_apis_referenced, StringPool* out_string_pool);
+
+ const Rules* rules_;
+};
+
+struct ReplacementAttr {
+ std::string name;
+ ResourceId id;
+ Attribute attr;
+};
+
+class DegradeToManyRule : public IDegradeRule {
+ public:
+ DegradeToManyRule(std::vector<ReplacementAttr> attrs);
+ virtual ~DegradeToManyRule() = default;
+
+ std::vector<DegradeResult> Degrade(const xml::Element& src_el, const xml::Attribute& src_attr,
+ StringPool* out_string_pool) const override;
+
+ private:
+ DISALLOW_COPY_AND_ASSIGN(DegradeToManyRule);
+
+ std::vector<ReplacementAttr> attrs_;
+};
+
+} // namespace aapt
+
+#endif // AAPT_LINKER_XMLCOMPATVERSIONER_H
diff --git a/tools/aapt2/link/XmlCompatVersioner_test.cpp b/tools/aapt2/link/XmlCompatVersioner_test.cpp
new file mode 100644
index 0000000..ce6605c
--- /dev/null
+++ b/tools/aapt2/link/XmlCompatVersioner_test.cpp
@@ -0,0 +1,320 @@
+/*
+ * Copyright (C) 2017 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.
+ */
+
+#include "link/XmlCompatVersioner.h"
+
+#include "Linkers.h"
+#include "test/Test.h"
+
+namespace aapt {
+
+constexpr auto TYPE_DIMENSION = android::ResTable_map::TYPE_DIMENSION;
+constexpr auto TYPE_STRING = android::ResTable_map::TYPE_STRING;
+
+struct R {
+ struct attr {
+ enum : uint32_t {
+ paddingLeft = 0x010100d6u, // (API 1)
+ paddingRight = 0x010100d8u, // (API 1)
+ progressBarPadding = 0x01010319u, // (API 11)
+ paddingStart = 0x010103b3u, // (API 17)
+ paddingHorizontal = 0x0101053du, // (API 26)
+ };
+ };
+};
+
+class XmlCompatVersionerTest : public ::testing::Test {
+ public:
+ void SetUp() override {
+ context_ =
+ test::ContextBuilder()
+ .SetCompilationPackage("com.app")
+ .SetPackageId(0x7f)
+ .SetPackageType(PackageType::kApp)
+ .SetMinSdkVersion(SDK_GINGERBREAD)
+ .AddSymbolSource(
+ test::StaticSymbolSourceBuilder()
+ .AddPublicSymbol("android:attr/paddingLeft", R::attr::paddingLeft,
+ util::make_unique<Attribute>(false, TYPE_DIMENSION))
+ .AddPublicSymbol("android:attr/paddingRight", R::attr::paddingRight,
+ util::make_unique<Attribute>(false, TYPE_DIMENSION))
+ .AddPublicSymbol("android:attr/progressBarPadding", R::attr::progressBarPadding,
+ util::make_unique<Attribute>(false, TYPE_DIMENSION))
+ .AddPublicSymbol("android:attr/paddingStart", R::attr::paddingStart,
+ util::make_unique<Attribute>(false, TYPE_DIMENSION))
+ .AddPublicSymbol("android:attr/paddingHorizontal", R::attr::paddingHorizontal,
+ util::make_unique<Attribute>(false, TYPE_DIMENSION))
+ .AddSymbol("com.app:attr/foo", ResourceId(0x7f010000),
+ util::make_unique<Attribute>(false, TYPE_STRING))
+ .Build())
+ .Build();
+ }
+
+ protected:
+ std::unique_ptr<IAaptContext> context_;
+};
+
+TEST_F(XmlCompatVersionerTest, NoRulesOnlyStripsAndCopies) {
+ auto doc = test::BuildXmlDomForPackageName(context_.get(), R"EOF(
+ <View xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:app="http://schemas.android.com/apk/res-auto"
+ android:paddingHorizontal="24dp"
+ app:foo="16dp"
+ foo="bar"/>)EOF");
+
+ XmlReferenceLinker linker;
+ ASSERT_TRUE(linker.Consume(context_.get(), doc.get()));
+
+ XmlCompatVersioner::Rules rules;
+ const util::Range<ApiVersion> api_range{SDK_GINGERBREAD, SDK_O + 1};
+
+ XmlCompatVersioner versioner(&rules);
+ std::vector<std::unique_ptr<xml::XmlResource>> versioned_docs =
+ versioner.Process(context_.get(), doc.get(), api_range);
+ ASSERT_EQ(2u, versioned_docs.size());
+
+ xml::Element* el;
+
+ // Source XML file's sdkVersion == 0, so the first one must also have the same sdkVersion.
+ EXPECT_EQ(static_cast<uint16_t>(0), versioned_docs[0]->file.config.sdkVersion);
+ el = xml::FindRootElement(versioned_docs[0].get());
+ ASSERT_NE(nullptr, el);
+ EXPECT_EQ(2u, el->attributes.size());
+ EXPECT_EQ(nullptr, el->FindAttribute(xml::kSchemaAndroid, "paddingHorizontal"));
+ EXPECT_NE(nullptr, el->FindAttribute(xml::kSchemaAuto, "foo"));
+ EXPECT_NE(nullptr, el->FindAttribute({}, "foo"));
+
+ EXPECT_EQ(static_cast<uint16_t>(SDK_LOLLIPOP_MR1), versioned_docs[1]->file.config.sdkVersion);
+ el = xml::FindRootElement(versioned_docs[1].get());
+ ASSERT_NE(nullptr, el);
+ EXPECT_EQ(3u, el->attributes.size());
+ EXPECT_NE(nullptr, el->FindAttribute(xml::kSchemaAndroid, "paddingHorizontal"));
+ EXPECT_NE(nullptr, el->FindAttribute(xml::kSchemaAuto, "foo"));
+ EXPECT_NE(nullptr, el->FindAttribute({}, "foo"));
+}
+
+TEST_F(XmlCompatVersionerTest, SingleRule) {
+ auto doc = test::BuildXmlDomForPackageName(context_.get(), R"EOF(
+ <View xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:app="http://schemas.android.com/apk/res-auto"
+ android:paddingHorizontal="24dp"
+ app:foo="16dp"
+ foo="bar"/>)EOF");
+
+ XmlReferenceLinker linker;
+ ASSERT_TRUE(linker.Consume(context_.get(), doc.get()));
+
+ XmlCompatVersioner::Rules rules;
+ rules[R::attr::paddingHorizontal] =
+ util::make_unique<DegradeToManyRule>(std::vector<ReplacementAttr>(
+ {ReplacementAttr{"paddingLeft", R::attr::paddingLeft, Attribute(false, TYPE_DIMENSION)},
+ ReplacementAttr{"paddingRight", R::attr::paddingRight,
+ Attribute(false, TYPE_DIMENSION)}}));
+
+ const util::Range<ApiVersion> api_range{SDK_GINGERBREAD, SDK_O + 1};
+
+ XmlCompatVersioner versioner(&rules);
+ std::vector<std::unique_ptr<xml::XmlResource>> versioned_docs =
+ versioner.Process(context_.get(), doc.get(), api_range);
+ ASSERT_EQ(2u, versioned_docs.size());
+
+ xml::Element* el;
+
+ EXPECT_EQ(static_cast<uint16_t>(0), versioned_docs[0]->file.config.sdkVersion);
+ el = xml::FindRootElement(versioned_docs[0].get());
+ ASSERT_NE(nullptr, el);
+ EXPECT_EQ(4u, el->attributes.size());
+ EXPECT_EQ(nullptr, el->FindAttribute(xml::kSchemaAndroid, "paddingHorizontal"));
+ EXPECT_NE(nullptr, el->FindAttribute(xml::kSchemaAuto, "foo"));
+ EXPECT_NE(nullptr, el->FindAttribute({}, "foo"));
+
+ xml::Attribute* attr = el->FindAttribute(xml::kSchemaAndroid, "paddingLeft");
+ ASSERT_NE(nullptr, attr);
+ ASSERT_NE(nullptr, attr->compiled_value);
+ ASSERT_TRUE(attr->compiled_attribute);
+
+ attr = el->FindAttribute(xml::kSchemaAndroid, "paddingRight");
+ ASSERT_NE(nullptr, attr);
+ ASSERT_NE(nullptr, attr->compiled_value);
+ ASSERT_TRUE(attr->compiled_attribute);
+
+ EXPECT_EQ(static_cast<uint16_t>(SDK_LOLLIPOP_MR1), versioned_docs[1]->file.config.sdkVersion);
+ el = xml::FindRootElement(versioned_docs[1].get());
+ ASSERT_NE(nullptr, el);
+ EXPECT_EQ(5u, el->attributes.size());
+ EXPECT_NE(nullptr, el->FindAttribute(xml::kSchemaAndroid, "paddingHorizontal"));
+ EXPECT_NE(nullptr, el->FindAttribute(xml::kSchemaAuto, "foo"));
+ EXPECT_NE(nullptr, el->FindAttribute({}, "foo"));
+
+ attr = el->FindAttribute(xml::kSchemaAndroid, "paddingLeft");
+ ASSERT_NE(nullptr, attr);
+ ASSERT_NE(nullptr, attr->compiled_value);
+ ASSERT_TRUE(attr->compiled_attribute);
+
+ attr = el->FindAttribute(xml::kSchemaAndroid, "paddingRight");
+ ASSERT_NE(nullptr, attr);
+ ASSERT_NE(nullptr, attr->compiled_value);
+ ASSERT_TRUE(attr->compiled_attribute);
+}
+
+TEST_F(XmlCompatVersionerTest, ChainedRule) {
+ auto doc = test::BuildXmlDomForPackageName(context_.get(), R"EOF(
+ <View xmlns:android="http://schemas.android.com/apk/res/android"
+ android:paddingHorizontal="24dp" />)EOF");
+
+ XmlReferenceLinker linker;
+ ASSERT_TRUE(linker.Consume(context_.get(), doc.get()));
+
+ XmlCompatVersioner::Rules rules;
+ rules[R::attr::progressBarPadding] =
+ util::make_unique<DegradeToManyRule>(std::vector<ReplacementAttr>(
+ {ReplacementAttr{"paddingLeft", R::attr::paddingLeft, Attribute(false, TYPE_DIMENSION)},
+ ReplacementAttr{"paddingRight", R::attr::paddingRight,
+ Attribute(false, TYPE_DIMENSION)}}));
+ rules[R::attr::paddingHorizontal] =
+ util::make_unique<DegradeToManyRule>(std::vector<ReplacementAttr>({ReplacementAttr{
+ "progressBarPadding", R::attr::progressBarPadding, Attribute(false, TYPE_DIMENSION)}}));
+
+ const util::Range<ApiVersion> api_range{SDK_GINGERBREAD, SDK_O + 1};
+
+ XmlCompatVersioner versioner(&rules);
+ std::vector<std::unique_ptr<xml::XmlResource>> versioned_docs =
+ versioner.Process(context_.get(), doc.get(), api_range);
+ ASSERT_EQ(3u, versioned_docs.size());
+
+ xml::Element* el;
+
+ EXPECT_EQ(static_cast<uint16_t>(0), versioned_docs[0]->file.config.sdkVersion);
+ el = xml::FindRootElement(versioned_docs[0].get());
+ ASSERT_NE(nullptr, el);
+ EXPECT_EQ(2u, el->attributes.size());
+ EXPECT_EQ(nullptr, el->FindAttribute(xml::kSchemaAndroid, "paddingHorizontal"));
+
+ xml::Attribute* attr = el->FindAttribute(xml::kSchemaAndroid, "paddingLeft");
+ ASSERT_NE(nullptr, attr);
+ ASSERT_NE(nullptr, attr->compiled_value);
+ ASSERT_TRUE(attr->compiled_attribute);
+
+ attr = el->FindAttribute(xml::kSchemaAndroid, "paddingRight");
+ ASSERT_NE(nullptr, attr);
+ ASSERT_NE(nullptr, attr->compiled_value);
+ ASSERT_TRUE(attr->compiled_attribute);
+
+ EXPECT_EQ(static_cast<uint16_t>(SDK_HONEYCOMB), versioned_docs[1]->file.config.sdkVersion);
+ el = xml::FindRootElement(versioned_docs[1].get());
+ ASSERT_NE(nullptr, el);
+ EXPECT_EQ(1u, el->attributes.size());
+ EXPECT_EQ(nullptr, el->FindAttribute(xml::kSchemaAndroid, "paddingHorizontal"));
+ EXPECT_EQ(nullptr, el->FindAttribute(xml::kSchemaAndroid, "paddingLeft"));
+ EXPECT_EQ(nullptr, el->FindAttribute(xml::kSchemaAndroid, "paddingRight"));
+
+ attr = el->FindAttribute(xml::kSchemaAndroid, "progressBarPadding");
+ ASSERT_NE(nullptr, attr);
+ ASSERT_NE(nullptr, attr->compiled_value);
+ ASSERT_TRUE(attr->compiled_attribute);
+
+ EXPECT_EQ(static_cast<uint16_t>(SDK_LOLLIPOP_MR1), versioned_docs[2]->file.config.sdkVersion);
+ el = xml::FindRootElement(versioned_docs[2].get());
+ ASSERT_NE(nullptr, el);
+ EXPECT_EQ(2u, el->attributes.size());
+ EXPECT_EQ(nullptr, el->FindAttribute(xml::kSchemaAndroid, "paddingLeft"));
+ EXPECT_EQ(nullptr, el->FindAttribute(xml::kSchemaAndroid, "paddingRight"));
+
+ attr = el->FindAttribute(xml::kSchemaAndroid, "paddingHorizontal");
+ ASSERT_NE(nullptr, attr);
+ ASSERT_NE(nullptr, attr->compiled_value);
+ ASSERT_TRUE(attr->compiled_attribute);
+
+ attr = el->FindAttribute(xml::kSchemaAndroid, "progressBarPadding");
+ ASSERT_NE(nullptr, attr);
+ ASSERT_NE(nullptr, attr->compiled_value);
+ ASSERT_TRUE(attr->compiled_attribute);
+}
+
+TEST_F(XmlCompatVersionerTest, DegradeRuleOverridesExistingAttribute) {
+ auto doc = test::BuildXmlDomForPackageName(context_.get(), R"EOF(
+ <View xmlns:android="http://schemas.android.com/apk/res/android"
+ android:paddingHorizontal="24dp"
+ android:paddingLeft="16dp"
+ android:paddingRight="16dp"/>)EOF");
+
+ XmlReferenceLinker linker;
+ ASSERT_TRUE(linker.Consume(context_.get(), doc.get()));
+
+ Item* padding_horizontal_value = xml::FindRootElement(doc.get())
+ ->FindAttribute(xml::kSchemaAndroid, "paddingHorizontal")
+ ->compiled_value.get();
+ ASSERT_NE(nullptr, padding_horizontal_value);
+
+ XmlCompatVersioner::Rules rules;
+ rules[R::attr::paddingHorizontal] =
+ util::make_unique<DegradeToManyRule>(std::vector<ReplacementAttr>(
+ {ReplacementAttr{"paddingLeft", R::attr::paddingLeft, Attribute(false, TYPE_DIMENSION)},
+ ReplacementAttr{"paddingRight", R::attr::paddingRight,
+ Attribute(false, TYPE_DIMENSION)}}));
+
+ const util::Range<ApiVersion> api_range{SDK_GINGERBREAD, SDK_O + 1};
+
+ XmlCompatVersioner versioner(&rules);
+ std::vector<std::unique_ptr<xml::XmlResource>> versioned_docs =
+ versioner.Process(context_.get(), doc.get(), api_range);
+ ASSERT_EQ(2u, versioned_docs.size());
+
+ xml::Element* el;
+
+ EXPECT_EQ(static_cast<uint16_t>(0), versioned_docs[0]->file.config.sdkVersion);
+ el = xml::FindRootElement(versioned_docs[0].get());
+ ASSERT_NE(nullptr, el);
+ EXPECT_EQ(2u, el->attributes.size());
+ EXPECT_EQ(nullptr, el->FindAttribute(xml::kSchemaAndroid, "paddingHorizontal"));
+
+ xml::Attribute* attr = el->FindAttribute(xml::kSchemaAndroid, "paddingLeft");
+ ASSERT_NE(nullptr, attr);
+ ASSERT_NE(nullptr, attr->compiled_value);
+ ASSERT_TRUE(padding_horizontal_value->Equals(attr->compiled_value.get()));
+ ASSERT_TRUE(attr->compiled_attribute);
+
+ attr = el->FindAttribute(xml::kSchemaAndroid, "paddingRight");
+ ASSERT_NE(nullptr, attr);
+ ASSERT_NE(nullptr, attr->compiled_value);
+ ASSERT_TRUE(padding_horizontal_value->Equals(attr->compiled_value.get()));
+ ASSERT_TRUE(attr->compiled_attribute);
+
+ EXPECT_EQ(static_cast<uint16_t>(SDK_LOLLIPOP_MR1), versioned_docs[1]->file.config.sdkVersion);
+ el = xml::FindRootElement(versioned_docs[1].get());
+ ASSERT_NE(nullptr, el);
+ EXPECT_EQ(3u, el->attributes.size());
+
+ attr = el->FindAttribute(xml::kSchemaAndroid, "paddingHorizontal");
+ ASSERT_NE(nullptr, attr);
+ ASSERT_NE(nullptr, attr->compiled_value);
+ ASSERT_TRUE(padding_horizontal_value->Equals(attr->compiled_value.get()));
+ ASSERT_TRUE(attr->compiled_attribute);
+
+ attr = el->FindAttribute(xml::kSchemaAndroid, "paddingLeft");
+ ASSERT_NE(nullptr, attr);
+ ASSERT_NE(nullptr, attr->compiled_value);
+ ASSERT_TRUE(padding_horizontal_value->Equals(attr->compiled_value.get()));
+ ASSERT_TRUE(attr->compiled_attribute);
+
+ attr = el->FindAttribute(xml::kSchemaAndroid, "paddingRight");
+ ASSERT_NE(nullptr, attr);
+ ASSERT_NE(nullptr, attr->compiled_value);
+ ASSERT_TRUE(padding_horizontal_value->Equals(attr->compiled_value.get()));
+ ASSERT_TRUE(attr->compiled_attribute);
+}
+
+} // namespace aapt
diff --git a/tools/aapt2/link/XmlReferenceLinker.cpp b/tools/aapt2/link/XmlReferenceLinker.cpp
index 94bdccd..721fc26 100644
--- a/tools/aapt2/link/XmlReferenceLinker.cpp
+++ b/tools/aapt2/link/XmlReferenceLinker.cpp
@@ -72,13 +72,13 @@
using xml::PackageAwareVisitor::Visit;
XmlVisitor(const Source& source, const CallSite& callsite, IAaptContext* context,
- SymbolTable* symbols, std::set<int>* sdk_levels_found)
+ SymbolTable* symbols)
: source_(source),
callsite_(callsite),
context_(context),
symbols_(symbols),
- sdk_levels_found_(sdk_levels_found),
- reference_visitor_(callsite, context, symbols, this) {}
+ reference_visitor_(callsite, context, symbols, this) {
+ }
void Visit(xml::Element* el) override {
// The default Attribute allows everything except enums or flags.
@@ -118,22 +118,12 @@
continue;
}
- // Find this compiled attribute's SDK level.
- const xml::AaptAttribute& aapt_attr = attr.compiled_attribute.value();
- if (aapt_attr.id) {
- // Record all SDK levels from which the attributes were defined.
- const size_t sdk_level = FindAttributeSdkLevel(aapt_attr.id.value());
- if (sdk_level > 1) {
- sdk_levels_found_->insert(sdk_level);
- }
- }
- attribute = &aapt_attr.attribute;
+ attribute = &attr.compiled_attribute.value().attribute;
}
attr.compiled_value = ResourceUtils::TryParseItemForAttribute(attr.value, attribute);
if (attr.compiled_value) {
- // With a compiledValue, we must resolve the reference and assign it an
- // ID.
+ // With a compiledValue, we must resolve the reference and assign it an ID.
attr.compiled_value->SetSource(source);
attr.compiled_value->Accept(&reference_visitor_);
} else if ((attribute->type_mask & android::ResTable_map::TYPE_STRING) == 0) {
@@ -164,7 +154,6 @@
IAaptContext* context_;
SymbolTable* symbols_;
- std::set<int>* sdk_levels_found_;
ReferenceVisitor reference_visitor_;
bool error_ = false;
};
@@ -172,10 +161,8 @@
} // namespace
bool XmlReferenceLinker::Consume(IAaptContext* context, xml::XmlResource* resource) {
- sdk_levels_found_.clear();
const CallSite callsite = {resource->file.name};
- XmlVisitor visitor(resource->file.source, callsite, context, context->GetExternalSymbols(),
- &sdk_levels_found_);
+ XmlVisitor visitor(resource->file.source, callsite, context, context->GetExternalSymbols());
if (resource->root) {
resource->root->Accept(&visitor);
return !visitor.HasError();
diff --git a/tools/aapt2/link/XmlReferenceLinker_test.cpp b/tools/aapt2/link/XmlReferenceLinker_test.cpp
index 66ecc15..de81e73 100644
--- a/tools/aapt2/link/XmlReferenceLinker_test.cpp
+++ b/tools/aapt2/link/XmlReferenceLinker_test.cpp
@@ -160,16 +160,6 @@
ASSERT_TRUE(linker.Consume(context_.get(), doc.get()));
}
-TEST_F(XmlReferenceLinkerTest, SdkLevelsAreRecorded) {
- std::unique_ptr<xml::XmlResource> doc = test::BuildXmlDomForPackageName(context_.get(), R"EOF(
- <View xmlns:android="http://schemas.android.com/apk/res/android"
- android:colorAccent="#ffffff" />)EOF");
-
- XmlReferenceLinker linker;
- ASSERT_TRUE(linker.Consume(context_.get(), doc.get()));
- EXPECT_TRUE(linker.sdk_levels().count(21) == 1);
-}
-
TEST_F(XmlReferenceLinkerTest, LinkMangledAttributes) {
std::unique_ptr<xml::XmlResource> doc = test::BuildXmlDomForPackageName(context_.get(), R"EOF(
<View xmlns:support="http://schemas.android.com/apk/res/com.android.support"
diff --git a/tools/aapt2/process/SymbolTable.cpp b/tools/aapt2/process/SymbolTable.cpp
index 1a648bf..882a85b 100644
--- a/tools/aapt2/process/SymbolTable.cpp
+++ b/tools/aapt2/process/SymbolTable.cpp
@@ -237,14 +237,12 @@
}
// We found a resource.
- std::unique_ptr<SymbolTable::Symbol> s = util::make_unique<SymbolTable::Symbol>();
- s->id = id;
+ std::unique_ptr<SymbolTable::Symbol> s = util::make_unique<SymbolTable::Symbol>(id);
// Check to see if it is an attribute.
for (size_t i = 0; i < (size_t)count; i++) {
if (entry[i].map.name.ident == android::ResTable_map::ATTR_TYPE) {
- s->attribute = std::make_shared<Attribute>(false);
- s->attribute->type_mask = entry[i].map.value.data;
+ s->attribute = std::make_shared<Attribute>(false, entry[i].map.value.data);
break;
}
}
diff --git a/tools/aapt2/process/SymbolTable.h b/tools/aapt2/process/SymbolTable.h
index bd252d2..4a2181e 100644
--- a/tools/aapt2/process/SymbolTable.h
+++ b/tools/aapt2/process/SymbolTable.h
@@ -53,16 +53,12 @@
class SymbolTable {
public:
struct Symbol {
- Symbol() : Symbol(Maybe<ResourceId>{}) {}
+ Symbol() = default;
- explicit Symbol(const Maybe<ResourceId>& i) : Symbol(i, nullptr) {}
-
- Symbol(const Maybe<ResourceId>& i, const std::shared_ptr<Attribute>& attr)
- : Symbol(i, attr, false) {}
-
- Symbol(const Maybe<ResourceId>& i, const std::shared_ptr<Attribute>& attr,
- bool pub)
- : id(i), attribute(attr), is_public(pub) {}
+ explicit Symbol(const Maybe<ResourceId>& i, const std::shared_ptr<Attribute>& attr = {},
+ bool pub = false)
+ : id(i), attribute(attr), is_public(pub) {
+ }
Symbol(const Symbol&) = default;
Symbol(Symbol&&) = default;
diff --git a/tools/aapt2/proto/TableProtoDeserializer.cpp b/tools/aapt2/proto/TableProtoDeserializer.cpp
index d93d495..1d0041b 100644
--- a/tools/aapt2/proto/TableProtoDeserializer.cpp
+++ b/tools/aapt2/proto/TableProtoDeserializer.cpp
@@ -32,8 +32,7 @@
public:
using ValueVisitor::Visit;
- explicit ReferenceIdToNameVisitor(
- const std::map<ResourceId, ResourceNameRef>* mapping)
+ explicit ReferenceIdToNameVisitor(const std::map<ResourceId, ResourceNameRef>* mapping)
: mapping_(mapping) {
CHECK(mapping_ != nullptr);
}
@@ -75,13 +74,11 @@
std::map<ResourceId, ResourceNameRef> idIndex;
- ResourceTablePackage* pkg =
- table->CreatePackage(pbPackage.package_name(), id);
+ ResourceTablePackage* pkg = table->CreatePackage(pbPackage.package_name(), id);
for (const pb::Type& pbType : pbPackage.types()) {
const ResourceType* resType = ParseResourceType(pbType.name());
if (!resType) {
- diag_->Error(DiagMessage(source_) << "unknown type '" << pbType.name()
- << "'");
+ diag_->Error(DiagMessage(source_) << "unknown type '" << pbType.name() << "'");
return {};
}
@@ -95,21 +92,20 @@
if (pbEntry.has_symbol_status()) {
const pb::SymbolStatus& pbStatus = pbEntry.symbol_status();
if (pbStatus.has_source()) {
- DeserializeSourceFromPb(pbStatus.source(), *source_pool_,
- &entry->symbol_status.source);
+ DeserializeSourceFromPb(pbStatus.source(), *source_pool_, &entry->symbol_status.source);
}
if (pbStatus.has_comment()) {
entry->symbol_status.comment = pbStatus.comment();
}
- SymbolState visibility =
- DeserializeVisibilityFromPb(pbStatus.visibility());
+ entry->symbol_status.allow_new = pbStatus.allow_new();
+
+ SymbolState visibility = DeserializeVisibilityFromPb(pbStatus.visibility());
entry->symbol_status.state = visibility;
if (visibility == SymbolState::kPublic) {
- // This is a public symbol, we must encode the ID now if there is
- // one.
+ // This is a public symbol, we must encode the ID now if there is one.
if (pbEntry.has_id()) {
entry->id = static_cast<uint16_t>(pbEntry.id());
}
@@ -142,16 +138,15 @@
return {};
}
- ResourceConfigValue* configValue =
- entry->FindOrCreateValue(config, pbConfig.product());
+ ResourceConfigValue* configValue = entry->FindOrCreateValue(config, pbConfig.product());
if (configValue->value) {
// Duplicate config.
diag_->Error(DiagMessage(source_) << "duplicate configuration");
return {};
}
- configValue->value = DeserializeValueFromPb(
- pbConfigValue.value(), config, &table->string_pool);
+ configValue->value =
+ DeserializeValueFromPb(pbConfigValue.value(), config, &table->string_pool);
if (!configValue->value) {
return {};
}
diff --git a/tools/aapt2/proto/TableProtoSerializer.cpp b/tools/aapt2/proto/TableProtoSerializer.cpp
index 7230b55..de10bb8 100644
--- a/tools/aapt2/proto/TableProtoSerializer.cpp
+++ b/tools/aapt2/proto/TableProtoSerializer.cpp
@@ -250,19 +250,16 @@
// Write the SymbolStatus struct.
pb::SymbolStatus* pb_status = pb_entry->mutable_symbol_status();
- pb_status->set_visibility(
- SerializeVisibilityToPb(entry->symbol_status.state));
- SerializeSourceToPb(entry->symbol_status.source, &source_pool,
- pb_status->mutable_source());
+ pb_status->set_visibility(SerializeVisibilityToPb(entry->symbol_status.state));
+ SerializeSourceToPb(entry->symbol_status.source, &source_pool, pb_status->mutable_source());
pb_status->set_comment(entry->symbol_status.comment);
+ pb_status->set_allow_new(entry->symbol_status.allow_new);
for (auto& config_value : entry->values) {
pb::ConfigValue* pb_config_value = pb_entry->add_config_values();
- SerializeConfig(config_value->config,
- pb_config_value->mutable_config());
+ SerializeConfig(config_value->config, pb_config_value->mutable_config());
if (!config_value->product.empty()) {
- pb_config_value->mutable_config()->set_product(
- config_value->product);
+ pb_config_value->mutable_config()->set_product(config_value->product);
}
pb::Value* pb_value = pb_config_value->mutable_value();
diff --git a/tools/aapt2/proto/TableProtoSerializer_test.cpp b/tools/aapt2/proto/TableProtoSerializer_test.cpp
index fdd5197..e6ce6d3 100644
--- a/tools/aapt2/proto/TableProtoSerializer_test.cpp
+++ b/tools/aapt2/proto/TableProtoSerializer_test.cpp
@@ -28,12 +28,11 @@
std::unique_ptr<ResourceTable> table =
test::ResourceTableBuilder()
.SetPackageId("com.app.a", 0x7f)
- .AddFileReference("com.app.a:layout/main", ResourceId(0x7f020000),
- "res/layout/main.xml")
- .AddReference("com.app.a:layout/other", ResourceId(0x7f020001),
- "com.app.a:layout/main")
+ .AddFileReference("com.app.a:layout/main", ResourceId(0x7f020000), "res/layout/main.xml")
+ .AddReference("com.app.a:layout/other", ResourceId(0x7f020001), "com.app.a:layout/main")
.AddString("com.app.a:string/text", {}, "hi")
.AddValue("com.app.a:id/foo", {}, util::make_unique<Id>())
+ .SetSymbolState("com.app.a:bool/foo", {}, SymbolState::kUndefined, true /*allow_new*/)
.Build();
Symbol public_symbol;
@@ -94,21 +93,23 @@
EXPECT_EQ(SymbolState::kPublic, result.value().type->symbol_status.state);
EXPECT_EQ(SymbolState::kPublic, result.value().entry->symbol_status.state);
+ result = new_table->FindResource(test::ParseNameOrDie("com.app.a:bool/foo"));
+ ASSERT_TRUE(result);
+ EXPECT_EQ(SymbolState::kUndefined, result.value().entry->symbol_status.state);
+ EXPECT_TRUE(result.value().entry->symbol_status.allow_new);
+
// Find the product-dependent values
BinaryPrimitive* prim = test::GetValueForConfigAndProduct<BinaryPrimitive>(
- new_table.get(), "com.app.a:integer/one", test::ParseConfigOrDie("land"),
- "");
+ new_table.get(), "com.app.a:integer/one", test::ParseConfigOrDie("land"), "");
ASSERT_NE(nullptr, prim);
EXPECT_EQ(123u, prim->value.data);
prim = test::GetValueForConfigAndProduct<BinaryPrimitive>(
- new_table.get(), "com.app.a:integer/one", test::ParseConfigOrDie("land"),
- "tablet");
+ new_table.get(), "com.app.a:integer/one", test::ParseConfigOrDie("land"), "tablet");
ASSERT_NE(nullptr, prim);
EXPECT_EQ(321u, prim->value.data);
- Reference* actual_ref =
- test::GetValue<Reference>(new_table.get(), "com.app.a:layout/abc");
+ Reference* actual_ref = test::GetValue<Reference>(new_table.get(), "com.app.a:layout/abc");
ASSERT_NE(nullptr, actual_ref);
AAPT_ASSERT_TRUE(actual_ref->name);
AAPT_ASSERT_TRUE(actual_ref->id);
diff --git a/tools/aapt2/readme.md b/tools/aapt2/readme.md
index e92565f..0290e30 100644
--- a/tools/aapt2/readme.md
+++ b/tools/aapt2/readme.md
@@ -1,5 +1,16 @@
# Android Asset Packaging Tool 2.0 (AAPT2) release notes
+## Version 2.17
+### `aapt2 compile ...`
+- Fixed an issue where symlinks would not be followed when compiling PNGs. (bug 62144459)
+- Fixed issue where overlays that declared `<add-resource>` did not compile. (bug 38355988)
+
+## Version 2.16
+### `aapt2 link ...`
+- Versioning of XML files is more intelligent, using a small set of rules to degrade
+ specific newer attributes to backwards compatible versions of them.
+ Ex: `android:paddingHorizontal` degrades to `android:paddingLeft` and `android:paddingRight`.
+
## Version 2.15
### `aapt2 compile ...`
- Add `--no-crunch` option to avoid processing PNGs during the compile phase. Note that this
diff --git a/tools/aapt2/test/Builders.h b/tools/aapt2/test/Builders.h
index 6888cf3..02acedb 100644
--- a/tools/aapt2/test/Builders.h
+++ b/tools/aapt2/test/Builders.h
@@ -117,12 +117,12 @@
}
ResourceTableBuilder& SetSymbolState(const android::StringPiece& name, const ResourceId& id,
- SymbolState state) {
+ SymbolState state, bool allow_new = false) {
ResourceName res_name = ParseNameOrDie(name);
Symbol symbol;
symbol.state = state;
- CHECK(table_->SetSymbolStateAllowMangled(res_name, id, symbol,
- &diagnostics_));
+ symbol.allow_new = allow_new;
+ CHECK(table_->SetSymbolStateAllowMangled(res_name, id, symbol, &diagnostics_));
return *this;
}
diff --git a/tools/aapt2/test/Common.h b/tools/aapt2/test/Common.h
index 248921f..a937de8 100644
--- a/tools/aapt2/test/Common.h
+++ b/tools/aapt2/test/Common.h
@@ -22,12 +22,14 @@
#include "android-base/logging.h"
#include "android-base/macros.h"
#include "androidfw/StringPiece.h"
+#include "gmock/gmock.h"
#include "gtest/gtest.h"
#include "ConfigDescription.h"
#include "Debug.h"
#include "ResourceTable.h"
#include "ResourceUtils.h"
+#include "ResourceValues.h"
#include "ValueVisitor.h"
#include "io/File.h"
#include "process/IResourceTableConsumer.h"
@@ -51,13 +53,11 @@
return;
case Level::Warn:
- std::cerr << actual_msg.source << ": warn: " << actual_msg.message
- << "." << std::endl;
+ std::cerr << actual_msg.source << ": warn: " << actual_msg.message << "." << std::endl;
break;
case Level::Error:
- std::cerr << actual_msg.source << ": error: " << actual_msg.message
- << "." << std::endl;
+ std::cerr << actual_msg.source << ": error: " << actual_msg.message << "." << std::endl;
break;
}
}
@@ -84,11 +84,9 @@
T* GetValueForConfigAndProduct(ResourceTable* table, const android::StringPiece& res_name,
const ConfigDescription& config,
const android::StringPiece& product) {
- Maybe<ResourceTable::SearchResult> result =
- table->FindResource(ParseNameOrDie(res_name));
+ Maybe<ResourceTable::SearchResult> result = table->FindResource(ParseNameOrDie(res_name));
if (result) {
- ResourceConfigValue* config_value =
- result.value().entry->FindValue(config, product);
+ ResourceConfigValue* config_value = result.value().entry->FindValue(config, product);
if (config_value) {
return ValueCast<T>(config_value->value.get());
}
@@ -111,9 +109,13 @@
public:
explicit TestFile(const android::StringPiece& path) : source_(path) {}
- std::unique_ptr<io::IData> OpenAsData() override { return {}; }
+ std::unique_ptr<io::IData> OpenAsData() override {
+ return {};
+ }
- const Source& GetSource() const override { return source_; }
+ const Source& GetSource() const override {
+ return source_;
+ }
private:
DISALLOW_COPY_AND_ASSIGN(TestFile);
@@ -122,6 +124,47 @@
};
} // namespace test
+
+// Workaround gtest bug (https://github.com/google/googletest/issues/443)
+// that does not select base class operator<< for derived class T.
+template <typename T>
+typename std::enable_if<std::is_base_of<Value, T>::value, std::ostream&>::type operator<<(
+ std::ostream& out, const T& value) {
+ value.Print(&out);
+ return out;
+}
+
+template std::ostream& operator<<<Item>(std::ostream&, const Item&);
+template std::ostream& operator<<<Reference>(std::ostream&, const Reference&);
+template std::ostream& operator<<<Id>(std::ostream&, const Id&);
+template std::ostream& operator<<<RawString>(std::ostream&, const RawString&);
+template std::ostream& operator<<<String>(std::ostream&, const String&);
+template std::ostream& operator<<<StyledString>(std::ostream&, const StyledString&);
+template std::ostream& operator<<<FileReference>(std::ostream&, const FileReference&);
+template std::ostream& operator<<<BinaryPrimitive>(std::ostream&, const BinaryPrimitive&);
+template std::ostream& operator<<<Attribute>(std::ostream&, const Attribute&);
+template std::ostream& operator<<<Style>(std::ostream&, const Style&);
+template std::ostream& operator<<<Array>(std::ostream&, const Array&);
+template std::ostream& operator<<<Plural>(std::ostream&, const Plural&);
+
+// Add a print method to Maybe.
+template <typename T>
+void PrintTo(const Maybe<T>& value, std::ostream* out) {
+ if (value) {
+ *out << ::testing::PrintToString(value.value());
+ } else {
+ *out << "Nothing";
+ }
+}
+
+namespace test {
+
+MATCHER_P(ValueEq, a,
+ std::string(negation ? "isn't" : "is") + " equal to " + ::testing::PrintToString(a)) {
+ return arg.Equals(&a);
+}
+
+} // namespace test
} // namespace aapt
#endif /* AAPT_TEST_COMMON_H */
diff --git a/tools/aapt2/test/Test.h b/tools/aapt2/test/Test.h
index ec07432..a24c01c 100644
--- a/tools/aapt2/test/Test.h
+++ b/tools/aapt2/test/Test.h
@@ -17,6 +17,7 @@
#ifndef AAPT_TEST_TEST_H
#define AAPT_TEST_TEST_H
+#include "gmock/gmock.h"
#include "gtest/gtest.h"
#include "test/Builders.h"
diff --git a/tools/aapt2/util/Files.cpp b/tools/aapt2/util/Files.cpp
index d10351b..1bf2594 100644
--- a/tools/aapt2/util/Files.cpp
+++ b/tools/aapt2/util/Files.cpp
@@ -181,12 +181,13 @@
return std::move(filemap);
}
-bool AppendArgsFromFile(const StringPiece& path,
- std::vector<std::string>* out_arglist,
+bool AppendArgsFromFile(const StringPiece& path, std::vector<std::string>* out_arglist,
std::string* out_error) {
std::string contents;
- if (!android::base::ReadFileToString(path.to_string(), &contents)) {
- if (out_error) *out_error = "failed to read argument-list file";
+ if (!android::base::ReadFileToString(path.to_string(), &contents, true /*follow_symlinks*/)) {
+ if (out_error) {
+ *out_error = "failed to read argument-list file";
+ }
return false;
}
diff --git a/tools/aapt2/util/Util.h b/tools/aapt2/util/Util.h
index 30b9af6..386f74b 100644
--- a/tools/aapt2/util/Util.h
+++ b/tools/aapt2/util/Util.h
@@ -44,6 +44,12 @@
namespace aapt {
namespace util {
+template <typename T>
+struct Range {
+ T start;
+ T end;
+};
+
std::vector<std::string> Split(const android::StringPiece& str, char sep);
std::vector<std::string> SplitAndLowercase(const android::StringPiece& str, char sep);
diff --git a/tools/aapt2/xml/XmlDom.cpp b/tools/aapt2/xml/XmlDom.cpp
index 98f5f1d..885ab3e 100644
--- a/tools/aapt2/xml/XmlDom.cpp
+++ b/tools/aapt2/xml/XmlDom.cpp
@@ -356,17 +356,16 @@
return util::make_unique<XmlResource>(ResourceFile{}, std::move(string_pool), std::move(root));
}
-std::unique_ptr<Node> Namespace::Clone() {
+std::unique_ptr<Node> Namespace::Clone(const ElementCloneFunc& el_cloner) {
auto ns = util::make_unique<Namespace>();
ns->comment = comment;
ns->line_number = line_number;
ns->column_number = column_number;
ns->namespace_prefix = namespace_prefix;
ns->namespace_uri = namespace_uri;
-
ns->children.reserve(children.size());
for (const std::unique_ptr<xml::Node>& child : children) {
- ns->AppendChild(child->Clone());
+ ns->AppendChild(child->Clone(el_cloner));
}
return std::move(ns);
}
@@ -412,6 +411,15 @@
return nullptr;
}
+const Attribute* Element::FindAttribute(const StringPiece& ns, const StringPiece& name) const {
+ for (const auto& attr : attributes) {
+ if (ns == attr.namespace_uri && name == attr.name) {
+ return &attr;
+ }
+ }
+ return nullptr;
+}
+
Element* Element::FindChild(const StringPiece& ns, const StringPiece& name) {
return FindChildWithAttribute(ns, name, {}, {}, {});
}
@@ -464,29 +472,23 @@
return elements;
}
-std::unique_ptr<Node> Element::Clone() {
+std::unique_ptr<Node> Element::Clone(const ElementCloneFunc& el_cloner) {
auto el = util::make_unique<Element>();
el->comment = comment;
el->line_number = line_number;
el->column_number = column_number;
el->name = name;
el->namespace_uri = namespace_uri;
-
el->attributes.reserve(attributes.size());
- for (xml::Attribute& attr : attributes) {
- // Don't copy compiled values or attributes.
- el->attributes.push_back(
- xml::Attribute{attr.namespace_uri, attr.name, attr.value});
- }
-
+ el_cloner(*this, el.get());
el->children.reserve(children.size());
for (const std::unique_ptr<xml::Node>& child : children) {
- el->AppendChild(child->Clone());
+ el->AppendChild(child->Clone(el_cloner));
}
return std::move(el);
}
-std::unique_ptr<Node> Text::Clone() {
+std::unique_ptr<Node> Text::Clone(const ElementCloneFunc&) {
auto t = util::make_unique<Text>();
t->comment = comment;
t->line_number = line_number;
diff --git a/tools/aapt2/xml/XmlDom.h b/tools/aapt2/xml/XmlDom.h
index 6950c30..2dc99d6 100644
--- a/tools/aapt2/xml/XmlDom.h
+++ b/tools/aapt2/xml/XmlDom.h
@@ -35,6 +35,8 @@
class RawVisitor;
+class Element;
+
/**
* Base class for all XML nodes.
*/
@@ -51,7 +53,11 @@
void AppendChild(std::unique_ptr<Node> child);
void InsertChild(size_t index, std::unique_ptr<Node> child);
virtual void Accept(RawVisitor* visitor) = 0;
- virtual std::unique_ptr<Node> Clone() = 0;
+
+ using ElementCloneFunc = std::function<void(const Element&, Element*)>;
+
+ // Clones the Node subtree, using the given function to decide how to clone an Element.
+ virtual std::unique_ptr<Node> Clone(const ElementCloneFunc& el_cloner) = 0;
};
/**
@@ -72,12 +78,16 @@
std::string namespace_prefix;
std::string namespace_uri;
- std::unique_ptr<Node> Clone() override;
+ std::unique_ptr<Node> Clone(const ElementCloneFunc& el_cloner) override;
};
struct AaptAttribute {
- Maybe<ResourceId> id;
+ explicit AaptAttribute(const ::aapt::Attribute& attr, const Maybe<ResourceId>& resid = {})
+ : attribute(attr), id(resid) {
+ }
+
aapt::Attribute attribute;
+ Maybe<ResourceId> id;
};
/**
@@ -102,6 +112,8 @@
std::vector<Attribute> attributes;
Attribute* FindAttribute(const android::StringPiece& ns, const android::StringPiece& name);
+ const Attribute* FindAttribute(const android::StringPiece& ns,
+ const android::StringPiece& name) const;
xml::Element* FindChild(const android::StringPiece& ns, const android::StringPiece& name);
xml::Element* FindChildWithAttribute(const android::StringPiece& ns,
const android::StringPiece& name,
@@ -109,7 +121,7 @@
const android::StringPiece& attr_name,
const android::StringPiece& attr_value);
std::vector<xml::Element*> GetChildElements();
- std::unique_ptr<Node> Clone() override;
+ std::unique_ptr<Node> Clone(const ElementCloneFunc& el_cloner) override;
};
/**
@@ -119,7 +131,7 @@
public:
std::string text;
- std::unique_ptr<Node> Clone() override;
+ std::unique_ptr<Node> Clone(const ElementCloneFunc& el_cloner) override;
};
/**
diff --git a/tools/layoutlib/bridge/src/android/view/IWindowManagerImpl.java b/tools/layoutlib/bridge/src/android/view/IWindowManagerImpl.java
index 15fd2ce..deb0e09 100644
--- a/tools/layoutlib/bridge/src/android/view/IWindowManagerImpl.java
+++ b/tools/layoutlib/bridge/src/android/view/IWindowManagerImpl.java
@@ -18,6 +18,7 @@
import android.content.res.Configuration;
import android.graphics.Bitmap;
+import android.graphics.GraphicBuffer;
import android.graphics.Point;
import android.graphics.Rect;
import android.os.Bundle;
@@ -210,13 +211,13 @@
}
@Override
- public void overridePendingAppTransitionThumb(Bitmap srcThumb, int startX, int startY,
+ public void overridePendingAppTransitionThumb(GraphicBuffer srcThumb, int startX, int startY,
IRemoteCallback startedCallback, boolean scaleUp) throws RemoteException {
// TODO Auto-generated method stub
}
@Override
- public void overridePendingAppTransitionAspectScaledThumb(Bitmap srcThumb, int startX,
+ public void overridePendingAppTransitionAspectScaledThumb(GraphicBuffer srcThumb, int startX,
int startY, int targetWidth, int targetHeight, IRemoteCallback startedCallback,
boolean scaleUp) {
// TODO Auto-generated method stub
diff --git a/wifi/java/android/net/wifi/IWifiManager.aidl b/wifi/java/android/net/wifi/IWifiManager.aidl
index d942d05..088cbc6 100644
--- a/wifi/java/android/net/wifi/IWifiManager.aidl
+++ b/wifi/java/android/net/wifi/IWifiManager.aidl
@@ -131,7 +131,7 @@
boolean stopSoftAp();
- int startLocalOnlyHotspot(in Messenger messenger, in IBinder binder);
+ int startLocalOnlyHotspot(in Messenger messenger, in IBinder binder, in String packageName);
void stopLocalOnlyHotspot();
diff --git a/wifi/java/android/net/wifi/WifiManager.java b/wifi/java/android/net/wifi/WifiManager.java
index cda078a..58df4ee 100644
--- a/wifi/java/android/net/wifi/WifiManager.java
+++ b/wifi/java/android/net/wifi/WifiManager.java
@@ -160,6 +160,8 @@
*
* <p>Note: The broadcast is only delivered to registered receivers - no manifest registered
* components will be launched.
+ *
+ * @hide
*/
public static final String ACTION_PASSPOINT_ICON = "android.net.wifi.action.PASSPOINT_ICON";
/**
@@ -167,6 +169,8 @@
* String representation.
*
* Retrieve with {@link android.content.Intent#getLongExtra(String, long)}.
+ *
+ * @hide
*/
public static final String EXTRA_BSSID_LONG = "android.net.wifi.extra.BSSID_LONG";
/**
@@ -174,12 +178,16 @@
*
* Retrieve with {@link android.content.Intent#getParcelableExtra(String)} and cast into
* {@link android.graphics.drawable.Icon}.
+ *
+ * @hide
*/
public static final String EXTRA_ICON = "android.net.wifi.extra.ICON";
/**
* Name of a file.
*
* Retrieve with {@link android.content.Intent#getStringExtra(String)}.
+ *
+ * @hide
*/
public static final String EXTRA_FILENAME = "android.net.wifi.extra.FILENAME";
@@ -195,6 +203,7 @@
* <p>Note: The broadcast is only delivered to registered receivers - no manifest registered
* components will be launched.
*
+ * @hide
*/
public static final String ACTION_PASSPOINT_OSU_PROVIDERS_LIST =
"android.net.wifi.action.PASSPOINT_OSU_PROVIDERS_LIST";
@@ -202,6 +211,8 @@
* Raw binary data of an ANQP (Access Network Query Protocol) element.
*
* Retrieve with {@link android.content.Intent#getByteArrayExtra(String)}.
+ *
+ * @hide
*/
public static final String EXTRA_ANQP_ELEMENT_DATA =
"android.net.wifi.extra.ANQP_ELEMENT_DATA";
@@ -220,6 +231,7 @@
* <p>Note: The broadcast is only delivered to registered receivers - no manifest registered
* components will be launched.
*
+ * @hide
*/
public static final String ACTION_PASSPOINT_DEAUTH_IMMINENT =
"android.net.wifi.action.PASSPOINT_DEAUTH_IMMINENT";
@@ -228,18 +240,24 @@
* {@code true} for ESS.
*
* Retrieve with {@link android.content.Intent#getBooleanExtra(String, boolean)}.
+ *
+ * @hide
*/
public static final String EXTRA_ESS = "android.net.wifi.extra.ESS";
/**
* Delay in seconds.
*
* Retrieve with {@link android.content.Intent#getIntExtra(String, int)}.
+ *
+ * @hide
*/
public static final String EXTRA_DELAY = "android.net.wifi.extra.DELAY";
/**
* String representation of an URL.
*
* Retrieve with {@link android.content.Intent#getStringExtra(String)}.
+ *
+ * @hide
*/
public static final String EXTRA_URL = "android.net.wifi.extra.URL";
@@ -254,8 +272,10 @@
*
* Receiver Required Permission: android.Manifest.permission.ACCESS_WIFI_STATE
*
- ** <p>Note: The broadcast is only delivered to registered receivers - no manifest registered
+ * <p>Note: The broadcast is only delivered to registered receivers - no manifest registered
* components will be launched.
+ *
+ * @hide
*/
public static final String ACTION_PASSPOINT_SUBSCRIPTION_REMEDIATION =
"android.net.wifi.action.PASSPOINT_SUBSCRIPTION_REMEDIATION";
@@ -265,6 +285,8 @@
* 1 - SOAP XML SPP
*
* Retrieve with {@link android.content.Intent#getIntExtra(String, int)}.
+ *
+ * @hide
*/
public static final String EXTRA_SUBSCRIPTION_REMEDIATION_METHOD =
"android.net.wifi.extra.SUBSCRIPTION_REMEDIATION_METHOD";
@@ -383,6 +405,21 @@
@SystemApi
public static final String EXTRA_PREVIOUS_WIFI_AP_STATE = "previous_wifi_state";
/**
+ * The interface used for the softap.
+ *
+ * @hide
+ */
+ public static final String EXTRA_WIFI_AP_INTERFACE_NAME = "wifi_ap_interface_name";
+ /**
+ * The intended ip mode for this softap.
+ * @see #IFACE_IP_MODE_TETHERED
+ * @see #IFACE_IP_MODE_LOCAL_ONLY
+ *
+ * @hide
+ */
+ public static final String EXTRA_WIFI_AP_MODE = "wifi_ap_mode";
+
+ /**
* Wi-Fi AP is currently being disabled. The state will change to
* {@link #WIFI_AP_STATE_DISABLED} if it finishes successfully.
*
@@ -1043,11 +1080,9 @@
* Name). In the case when there is an existing configuration with the same
* FQDN, the new configuration will replace the existing configuration.
*
- * An {@link IllegalArgumentException} will be thrown on failure.
- * An {@link UnsupportedOperationException} will be thrown if Passpoint is not enabled
- * on the device.
- *
* @param config The Passpoint configuration to be added
+ * @throws IllegalArgumentException if configuration is invalid
+ * @throws UnsupportedOperationException if Passpoint is not enabled on the device.
*/
public void addOrUpdatePasspointConfiguration(PasspointConfiguration config) {
try {
@@ -1062,11 +1097,9 @@
/**
* Remove the Passpoint configuration identified by its FQDN (Fully Qualified Domain Name).
*
- * An {@link IllegalArgumentException} will be thrown on failure.
- * An {@link UnsupportedOperationException} will be thrown if Passpoint is not enabled
- * on the device.
- *
* @param fqdn The FQDN of the Passpoint configuration to be removed
+ * @throws IllegalArgumentException if no configuration is associated with the given FQDN.
+ * @throws UnsupportedOperationException if Passpoint is not enabled on the device.
*/
public void removePasspointConfiguration(String fqdn) {
try {
@@ -1083,10 +1116,8 @@
*
* An empty list will be returned when no configurations are installed.
*
- * An {@link UnsupportedOperationException} will be thrown if Passpoint is not enabled
- * on the device.
- *
* @return A list of {@link PasspointConfiguration}
+ * @throws UnsupportedOperationException if Passpoint is not enabled on the device.
*/
public List<PasspointConfiguration> getPasspointConfigurations() {
try {
@@ -1102,11 +1133,11 @@
* {@link #EXTRA_ICON} will indicate the result of the request.
* A missing intent extra {@link #EXTRA_ICON} will indicate a failure.
*
- * An {@link UnsupportedOperationException} will be thrown if Passpoint is not enabled
- * on the device.
- *
* @param bssid The BSSID of the AP
* @param fileName Name of the icon file (remote file) to query from the AP
+ *
+ * @throws UnsupportedOperationException if Passpoint is not enabled on the device.
+ * @hide
*/
public void queryPasspointIcon(long bssid, String fileName) {
try {
@@ -1763,25 +1794,25 @@
}
/**
- * Start AccessPoint mode with the specified
- * configuration. If the radio is already running in
- * AP mode, update the new configuration
- * Note that starting in access point mode disables station
- * mode operation
+ * This call will be deprecated and removed in an upcoming release. It is no longer used to
+ * start WiFi Tethering. Please use {@link ConnectivityManager#startTethering(int, boolean,
+ * ConnectivityManager#OnStartTetheringCallback)} if
+ * the caller has proper permissions. Callers can also use the LocalOnlyHotspot feature for a
+ * hotspot capable of communicating with co-located devices {@link
+ * WifiManager#startLocalOnlyHotspot(LocalOnlyHotspotCallback)}.
+ *
* @param wifiConfig SSID, security and channel details as
* part of WifiConfiguration
- * @return {@code true} if the operation succeeds, {@code false} otherwise
+ * @return {@code false}
*
* @hide
*/
@SystemApi
public boolean setWifiApEnabled(WifiConfiguration wifiConfig, boolean enabled) {
- try {
- mService.setWifiApEnabled(wifiConfig, enabled);
- return true;
- } catch (RemoteException e) {
- throw e.rethrowFromSystemServer();
- }
+ String packageName = mContext.getOpPackageName();
+
+ Log.w(TAG, packageName + " attempted call to setWifiApEnabled: enabled = " + enabled);
+ return false;
}
/**
@@ -1899,7 +1930,9 @@
LocalOnlyHotspotCallbackProxy proxy =
new LocalOnlyHotspotCallbackProxy(this, looper, callback);
try {
- int returnCode = mService.startLocalOnlyHotspot(proxy.getMessenger(), new Binder());
+ String packageName = mContext.getOpPackageName();
+ int returnCode = mService.startLocalOnlyHotspot(
+ proxy.getMessenger(), new Binder(), packageName);
if (returnCode != LocalOnlyHotspotCallback.REQUEST_REGISTERED) {
// Send message to the proxy to make sure we call back on the correct thread
proxy.notifyFailed(returnCode);
diff --git a/wifi/java/android/net/wifi/hotspot2/PasspointConfiguration.java b/wifi/java/android/net/wifi/hotspot2/PasspointConfiguration.java
index f892bb0..71d4173 100644
--- a/wifi/java/android/net/wifi/hotspot2/PasspointConfiguration.java
+++ b/wifi/java/android/net/wifi/hotspot2/PasspointConfiguration.java
@@ -62,16 +62,36 @@
* Configurations under HomeSp subtree.
*/
private HomeSp mHomeSp = null;
+ /**
+ * Set the Home SP (Service Provider) information.
+ *
+ * @param homeSp The Home SP information to set to
+ */
public void setHomeSp(HomeSp homeSp) { mHomeSp = homeSp; }
+ /**
+ * Get the Home SP (Service Provider) information.
+ *
+ * @return Home SP information
+ */
public HomeSp getHomeSp() { return mHomeSp; }
/**
* Configurations under Credential subtree.
*/
private Credential mCredential = null;
+ /**
+ * Set the credential information.
+ *
+ * @param credential The credential information to set to
+ */
public void setCredential(Credential credential) {
mCredential = credential;
}
+ /**
+ * Get the credential information.
+ *
+ * @return credential information
+ */
public Credential getCredential() {
return mCredential;
}
diff --git a/wifi/java/android/net/wifi/hotspot2/pps/Credential.java b/wifi/java/android/net/wifi/hotspot2/pps/Credential.java
index d712feb..e8fcbfd 100644
--- a/wifi/java/android/net/wifi/hotspot2/pps/Credential.java
+++ b/wifi/java/android/net/wifi/hotspot2/pps/Credential.java
@@ -97,9 +97,19 @@
* comparing the realm specified in that hotspot's ANQP element.
*/
private String mRealm = null;
+ /**
+ * Set the realm associated with this credential.
+ *
+ * @param realm The realm to set to
+ */
public void setRealm(String realm) {
mRealm = realm;
}
+ /**
+ * Get the realm associated with this credential.
+ *
+ * @return the realm associated with this credential
+ */
public String getRealm() {
return mRealm;
}
@@ -162,9 +172,19 @@
* Username of the credential.
*/
private String mUsername = null;
+ /**
+ * Set the username associated with this user credential.
+ *
+ * @param username The username to set to
+ */
public void setUsername(String username) {
mUsername = username;
}
+ /**
+ * Get the username associated with this user credential.
+ *
+ * @return the username associated with this user credential
+ */
public String getUsername() {
return mUsername;
}
@@ -173,9 +193,19 @@
* Base64-encoded password.
*/
private String mPassword = null;
+ /**
+ * Set the Base64-encoded password associated with this user credential.
+ *
+ * @param password The password to set to
+ */
public void setPassword(String password) {
mPassword = password;
}
+ /**
+ * Get the Base64-encoded password associated with this user credential.
+ *
+ * @return the Base64-encoded password associated with this user credential
+ */
public String getPassword() {
return mPassword;
}
@@ -233,14 +263,30 @@
/**
* EAP (Extensible Authentication Protocol) method type.
- * Refer to http://www.iana.org/assignments/eap-numbers/eap-numbers.xml#eap-numbers-4
- * for valid values.
+ * Refer to
+ * <a href="http://www.iana.org/assignments/eap-numbers/eap-numbers.xml#eap-numbers-4">
+ * EAP Numbers</a> for valid values.
* Using Integer.MIN_VALUE to indicate unset value.
*/
private int mEapType = Integer.MIN_VALUE;
+ /**
+ * Set the EAP (Extensible Authentication Protocol) method type associated with this
+ * user credential.
+ * Refer to
+ * <a href="http://www.iana.org/assignments/eap-numbers/eap-numbers.xml#eap-numbers-4">
+ * EAP Numbers</a> for valid values.
+ *
+ * @param eapType The EAP method type associated with this user credential
+ */
public void setEapType(int eapType) {
mEapType = eapType;
}
+ /**
+ * Get the EAP (Extensible Authentication Protocol) method type associated with this
+ * user credential.
+ *
+ * @return EAP method type
+ */
public int getEapType() {
return mEapType;
}
@@ -249,9 +295,19 @@
* Non-EAP inner authentication method.
*/
private String mNonEapInnerMethod = null;
+ /**
+ * Set the inner non-EAP method associated with this user credential.
+ *
+ * @param nonEapInnerMethod The non-EAP inner method to set to
+ */
public void setNonEapInnerMethod(String nonEapInnerMethod) {
mNonEapInnerMethod = nonEapInnerMethod;
}
+ /**
+ * Get the inner non-EAP method associated with this user credential.
+ *
+ * @return Non-EAP inner method associated with this user credential
+ */
public String getNonEapInnerMethod() {
return mNonEapInnerMethod;
}
@@ -394,9 +450,19 @@
};
}
private UserCredential mUserCredential = null;
+ /**
+ * Set the user credential information.
+ *
+ * @param userCredential The user credential to set to
+ */
public void setUserCredential(UserCredential userCredential) {
mUserCredential = userCredential;
}
+ /**
+ * Get the user credential information.
+ *
+ * @return user credential information
+ */
public UserCredential getUserCredential() {
return mUserCredential;
}
@@ -421,9 +487,19 @@
* Certificate type.
*/
private String mCertType = null;
+ /**
+ * Set the certificate type associated with this certificate credential.
+ *
+ * @param certType The certificate type to set to
+ */
public void setCertType(String certType) {
mCertType = certType;
}
+ /**
+ * Get the certificate type associated with this certificate credential.
+ *
+ * @return certificate type
+ */
public String getCertType() {
return mCertType;
}
@@ -432,9 +508,19 @@
* The SHA-256 fingerprint of the certificate.
*/
private byte[] mCertSha256Fingerprint = null;
+ /**
+ * Set the certificate SHA-256 fingerprint associated with this certificate credential.
+ *
+ * @param certSha256Fingerprint The certificate fingerprint to set to
+ */
public void setCertSha256Fingerprint(byte[] certSha256Fingerprint) {
mCertSha256Fingerprint = certSha256Fingerprint;
}
+ /**
+ * Get the certificate SHA-256 fingerprint associated with this certificate credential.
+ *
+ * @return certificate SHA-256 fingerprint
+ */
public byte[] getCertSha256Fingerprint() {
return mCertSha256Fingerprint;
}
@@ -530,9 +616,19 @@
};
}
private CertificateCredential mCertCredential = null;
+ /**
+ * Set the certificate credential information.
+ *
+ * @param certCredential The certificate credential to set to
+ */
public void setCertCredential(CertificateCredential certCredential) {
mCertCredential = certCredential;
}
+ /**
+ * Get the certificate credential information.
+ *
+ * @return certificate credential information
+ */
public CertificateCredential getCertCredential() {
return mCertCredential;
}
@@ -553,9 +649,21 @@
* cellular networks
*/
private String mImsi = null;
+ /**
+ * Set the IMSI (International Mobile Subscriber Identity) associated with this SIM
+ * credential.
+ *
+ * @param imsi The IMSI to set to
+ */
public void setImsi(String imsi) {
mImsi = imsi;
}
+ /**
+ * Get the IMSI (International Mobile Subscriber Identity) associated with this SIM
+ * credential.
+ *
+ * @return IMSI associated with this SIM credential
+ */
public String getImsi() {
return mImsi;
}
@@ -567,9 +675,21 @@
* Using Integer.MIN_VALUE to indicate unset value.
*/
private int mEapType = Integer.MIN_VALUE;
+ /**
+ * Set the EAP (Extensible Authentication Protocol) method type associated with this
+ * SIM credential.
+ *
+ * @param eapType The EAP method type to set to
+ */
public void setEapType(int eapType) {
mEapType = eapType;
}
+ /**
+ * Get the EAP (Extensible Authentication Protocol) method type associated with this
+ * SIM credential.
+ *
+ * @return EAP method type associated with this SIM credential
+ */
public int getEapType() {
return mEapType;
}
@@ -704,9 +824,19 @@
}
}
private SimCredential mSimCredential = null;
+ /**
+ * Set the SIM credential information.
+ *
+ * @param simCredential The SIM credential to set to
+ */
public void setSimCredential(SimCredential simCredential) {
mSimCredential = simCredential;
}
+ /**
+ * Get the SIM credential information.
+ *
+ * @return SIM credential information
+ */
public SimCredential getSimCredential() {
return mSimCredential;
}
@@ -715,9 +845,19 @@
* CA (Certificate Authority) X509 certificate.
*/
private X509Certificate mCaCertificate = null;
+ /**
+ * Set the CA (Certification Authority) certificate associated with this credential.
+ *
+ * @param caCertificate The CA certificate to set to
+ */
public void setCaCertificate(X509Certificate caCertificate) {
mCaCertificate = caCertificate;
}
+ /**
+ * Get the CA (Certification Authority) certificate associated with this credential.
+ *
+ * @return CA certificate associated with this credential
+ */
public X509Certificate getCaCertificate() {
return mCaCertificate;
}
@@ -726,9 +866,19 @@
* Client side X509 certificate chain.
*/
private X509Certificate[] mClientCertificateChain = null;
+ /**
+ * Set the client certificate chain associated with this credential.
+ *
+ * @param certificateChain The client certificate chain to set to
+ */
public void setClientCertificateChain(X509Certificate[] certificateChain) {
mClientCertificateChain = certificateChain;
}
+ /**
+ * Get the client certificate chain associated with this credential.
+ *
+ * @return client certificate chain associated with this credential
+ */
public X509Certificate[] getClientCertificateChain() {
return mClientCertificateChain;
}
@@ -737,9 +887,19 @@
* Client side private key.
*/
private PrivateKey mClientPrivateKey = null;
+ /**
+ * Set the client private key associated with this credential.
+ *
+ * @param clientPrivateKey the client private key to set to
+ */
public void setClientPrivateKey(PrivateKey clientPrivateKey) {
mClientPrivateKey = clientPrivateKey;
}
+ /**
+ * Get the client private key associated with this credential.
+ *
+ * @return client private key associated with this credential.
+ */
public PrivateKey getClientPrivateKey() {
return mClientPrivateKey;
}
diff --git a/wifi/java/android/net/wifi/hotspot2/pps/HomeSp.java b/wifi/java/android/net/wifi/hotspot2/pps/HomeSp.java
index 2247860..d829ea8 100644
--- a/wifi/java/android/net/wifi/hotspot2/pps/HomeSp.java
+++ b/wifi/java/android/net/wifi/hotspot2/pps/HomeSp.java
@@ -52,9 +52,19 @@
* FQDN (Fully Qualified Domain Name) of this home service provider.
*/
private String mFqdn = null;
+ /**
+ * Set the FQDN (Fully Qualified Domain Name) associated with this home service provider.
+ *
+ * @param fqdn The FQDN to set to
+ */
public void setFqdn(String fqdn) {
mFqdn = fqdn;
}
+ /**
+ * Get the FQDN (Fully Qualified Domain Name) associated with this home service provider.
+ *
+ * @return the FQDN associated with this home service provider
+ */
public String getFqdn() {
return mFqdn;
}
@@ -63,9 +73,19 @@
* Friendly name of this home service provider.
*/
private String mFriendlyName = null;
+ /**
+ * Set the friendly name associated with this home service provider.
+ *
+ * @param friendlyName The friendly name to set to
+ */
public void setFriendlyName(String friendlyName) {
mFriendlyName = friendlyName;
}
+ /**
+ * Get the friendly name associated with this home service provider.
+ *
+ * @return the friendly name associated with this home service provider
+ */
public String getFriendlyName() {
return mFriendlyName;
}
@@ -184,9 +204,21 @@
* which this provider is a member.
*/
private long[] mRoamingConsortiumOis = null;
+ /**
+ * Set the Organization Identifiers (OIs) identifying a roaming consortium of which this
+ * provider is a member.
+ *
+ * @param roamingConsortiumOis Array of roaming consortium OIs
+ */
public void setRoamingConsortiumOis(long[] roamingConsortiumOis) {
mRoamingConsortiumOis = roamingConsortiumOis;
}
+ /**
+ * Get the Organization Identifiers (OIs) identifying a roaming consortium of which this
+ * provider is a member.
+ *
+ * @return array of roaming consortium OIs
+ */
public long[] getRoamingConsortiumOis() {
return mRoamingConsortiumOis;
}
diff --git a/wifi/java/android/net/wifi/p2p/nsd/WifiP2pServiceResponse.java b/wifi/java/android/net/wifi/p2p/nsd/WifiP2pServiceResponse.java
index a0b5a6e..1020fd2 100644
--- a/wifi/java/android/net/wifi/p2p/nsd/WifiP2pServiceResponse.java
+++ b/wifi/java/android/net/wifi/p2p/nsd/WifiP2pServiceResponse.java
@@ -186,31 +186,23 @@
/**
* Create the list of WifiP2pServiceResponse instance from supplicant event.
*
- * <pre>The format is as follows.
- * P2P-SERV-DISC-RESP <address> <update indicator> <response data>
- * e.g) P2P-SERV-DISC-RESP 02:03:7f:11:62:da 1 0300000101
- *
- * @param supplicantEvent wpa_supplicant event string.
+ * @param srcAddr source address of the service response
+ * @param tlvsBin byte array containing the binary tlvs data
* @return if parse failed, return null
* @hide
*/
- public static List<WifiP2pServiceResponse> newInstance(String supplicantEvent) {
+ public static List<WifiP2pServiceResponse> newInstance(String srcAddr, byte[] tlvsBin) {
+ //updateIndicator not used, and not passed up from supplicant
List<WifiP2pServiceResponse> respList = new ArrayList<WifiP2pServiceResponse>();
- String[] args = supplicantEvent.split(" ");
- if (args.length != 4) {
- return null;
- }
WifiP2pDevice dev = new WifiP2pDevice();
- String srcAddr = args[1];
dev.deviceAddress = srcAddr;
- //String updateIndicator = args[2];//not used.
- byte[] bin = hexStr2Bin(args[3]);
- if (bin == null) {
+ if (tlvsBin == null) {
return null;
}
- DataInputStream dis = new DataInputStream(new ByteArrayInputStream(bin));
+
+ DataInputStream dis = new DataInputStream(new ByteArrayInputStream(tlvsBin));
try {
while (dis.available() > 0) {
/*
diff --git a/wifi/tests/src/android/net/wifi/WifiManagerTest.java b/wifi/tests/src/android/net/wifi/WifiManagerTest.java
index adf897d..b235ccc7 100644
--- a/wifi/tests/src/android/net/wifi/WifiManagerTest.java
+++ b/wifi/tests/src/android/net/wifi/WifiManagerTest.java
@@ -58,6 +58,7 @@
private static final int ERROR_NOT_SET = -1;
private static final int ERROR_TEST_REASON = 5;
+ private static final String TEST_PACKAGE_NAME = "TestPackage";
@Mock Context mContext;
@Mock IWifiManager mWifiService;
@@ -76,6 +77,7 @@
mLooper = new TestLooper();
mHandler = spy(new Handler(mLooper.getLooper()));
when(mContext.getApplicationInfo()).thenReturn(mApplicationInfo);
+ when(mContext.getOpPackageName()).thenReturn(TEST_PACKAGE_NAME);
mWifiServiceMessenger = new Messenger(mHandler);
mWifiManager = new WifiManager(mContext, mWifiService, mLooper.getLooper());
@@ -126,8 +128,8 @@
@Test
public void testCreationAndCloseOfLocalOnlyHotspotReservation() throws Exception {
TestLocalOnlyHotspotCallback callback = new TestLocalOnlyHotspotCallback();
- when(mWifiService.startLocalOnlyHotspot(any(Messenger.class), any(IBinder.class)))
- .thenReturn(REQUEST_REGISTERED);
+ when(mWifiService.startLocalOnlyHotspot(any(Messenger.class), any(IBinder.class),
+ anyString())).thenReturn(REQUEST_REGISTERED);
mWifiManager.startLocalOnlyHotspot(callback, mHandler);
callback.onStarted(mWifiManager.new LocalOnlyHotspotReservation(mApConfig));
@@ -144,8 +146,8 @@
public void testLocalOnlyHotspotReservationCallsStopProperlyInTryWithResources()
throws Exception {
TestLocalOnlyHotspotCallback callback = new TestLocalOnlyHotspotCallback();
- when(mWifiService.startLocalOnlyHotspot(any(Messenger.class), any(IBinder.class)))
- .thenReturn(REQUEST_REGISTERED);
+ when(mWifiService.startLocalOnlyHotspot(any(Messenger.class), any(IBinder.class),
+ anyString())).thenReturn(REQUEST_REGISTERED);
mWifiManager.startLocalOnlyHotspot(callback, mHandler);
callback.onStarted(mWifiManager.new LocalOnlyHotspotReservation(mApConfig));
@@ -304,7 +306,8 @@
TestLocalOnlyHotspotCallback callback = new TestLocalOnlyHotspotCallback();
mWifiManager.startLocalOnlyHotspot(callback, mHandler);
- verify(mWifiService).startLocalOnlyHotspot(any(Messenger.class), any(IBinder.class));
+ verify(mWifiService)
+ .startLocalOnlyHotspot(any(Messenger.class), any(IBinder.class), anyString());
}
/**
@@ -315,7 +318,7 @@
public void testStartLocalOnlyHotspotThrowsSecurityException() throws Exception {
TestLocalOnlyHotspotCallback callback = new TestLocalOnlyHotspotCallback();
doThrow(new SecurityException()).when(mWifiService)
- .startLocalOnlyHotspot(any(Messenger.class), any(IBinder.class));
+ .startLocalOnlyHotspot(any(Messenger.class), any(IBinder.class), anyString());
mWifiManager.startLocalOnlyHotspot(callback, mHandler);
}
@@ -327,7 +330,7 @@
public void testStartLocalOnlyHotspotThrowsIllegalStateException() throws Exception {
TestLocalOnlyHotspotCallback callback = new TestLocalOnlyHotspotCallback();
doThrow(new IllegalStateException()).when(mWifiService)
- .startLocalOnlyHotspot(any(Messenger.class), any(IBinder.class));
+ .startLocalOnlyHotspot(any(Messenger.class), any(IBinder.class), anyString());
mWifiManager.startLocalOnlyHotspot(callback, mHandler);
}
@@ -337,8 +340,8 @@
@Test
public void testCorrectLooperIsUsedForHandler() throws Exception {
TestLocalOnlyHotspotCallback callback = new TestLocalOnlyHotspotCallback();
- when(mWifiService.startLocalOnlyHotspot(any(Messenger.class), any(IBinder.class)))
- .thenReturn(ERROR_INCOMPATIBLE_MODE);
+ when(mWifiService.startLocalOnlyHotspot(any(Messenger.class), any(IBinder.class),
+ anyString())).thenReturn(ERROR_INCOMPATIBLE_MODE);
mWifiManager.startLocalOnlyHotspot(callback, mHandler);
mLooper.dispatchAll();
assertEquals(ERROR_INCOMPATIBLE_MODE, callback.mFailureReason);
@@ -355,8 +358,8 @@
TestLooper altLooper = new TestLooper();
when(mContext.getMainLooper()).thenReturn(altLooper.getLooper());
TestLocalOnlyHotspotCallback callback = new TestLocalOnlyHotspotCallback();
- when(mWifiService.startLocalOnlyHotspot(any(Messenger.class), any(IBinder.class)))
- .thenReturn(ERROR_INCOMPATIBLE_MODE);
+ when(mWifiService.startLocalOnlyHotspot(any(Messenger.class), any(IBinder.class),
+ anyString())).thenReturn(ERROR_INCOMPATIBLE_MODE);
mWifiManager.startLocalOnlyHotspot(callback, null);
altLooper.dispatchAll();
assertEquals(ERROR_INCOMPATIBLE_MODE, callback.mFailureReason);
@@ -374,7 +377,7 @@
TestLooper callbackLooper = new TestLooper();
Handler callbackHandler = new Handler(callbackLooper.getLooper());
when(mWifiService.startLocalOnlyHotspot(mMessengerCaptor.capture(),
- any(IBinder.class))).thenReturn(REQUEST_REGISTERED);
+ any(IBinder.class), anyString())).thenReturn(REQUEST_REGISTERED);
mWifiManager.startLocalOnlyHotspot(callback, callbackHandler);
callbackLooper.dispatchAll();
mLooper.dispatchAll();
@@ -401,7 +404,7 @@
TestLooper callbackLooper = new TestLooper();
Handler callbackHandler = new Handler(callbackLooper.getLooper());
when(mWifiService.startLocalOnlyHotspot(mMessengerCaptor.capture(),
- any(IBinder.class))).thenReturn(REQUEST_REGISTERED);
+ any(IBinder.class), anyString())).thenReturn(REQUEST_REGISTERED);
mWifiManager.startLocalOnlyHotspot(callback, callbackHandler);
callbackLooper.dispatchAll();
mLooper.dispatchAll();
@@ -426,7 +429,7 @@
TestLooper callbackLooper = new TestLooper();
Handler callbackHandler = new Handler(callbackLooper.getLooper());
when(mWifiService.startLocalOnlyHotspot(mMessengerCaptor.capture(),
- any(IBinder.class))).thenReturn(REQUEST_REGISTERED);
+ any(IBinder.class), anyString())).thenReturn(REQUEST_REGISTERED);
mWifiManager.startLocalOnlyHotspot(callback, callbackHandler);
callbackLooper.dispatchAll();
mLooper.dispatchAll();
@@ -449,7 +452,7 @@
TestLooper callbackLooper = new TestLooper();
Handler callbackHandler = new Handler(callbackLooper.getLooper());
when(mWifiService.startLocalOnlyHotspot(mMessengerCaptor.capture(),
- any(IBinder.class))).thenReturn(REQUEST_REGISTERED);
+ any(IBinder.class), anyString())).thenReturn(REQUEST_REGISTERED);
mWifiManager.startLocalOnlyHotspot(callback, callbackHandler);
callbackLooper.dispatchAll();
mLooper.dispatchAll();
@@ -470,8 +473,8 @@
@Test
public void testLocalOnlyHotspotCallbackFullOnIncompatibleMode() throws Exception {
TestLocalOnlyHotspotCallback callback = new TestLocalOnlyHotspotCallback();
- when(mWifiService.startLocalOnlyHotspot(any(Messenger.class), any(IBinder.class)))
- .thenReturn(ERROR_INCOMPATIBLE_MODE);
+ when(mWifiService.startLocalOnlyHotspot(any(Messenger.class), any(IBinder.class),
+ anyString())).thenReturn(ERROR_INCOMPATIBLE_MODE);
mWifiManager.startLocalOnlyHotspot(callback, mHandler);
mLooper.dispatchAll();
assertEquals(ERROR_INCOMPATIBLE_MODE, callback.mFailureReason);
@@ -486,8 +489,8 @@
@Test
public void testLocalOnlyHotspotCallbackFullOnTetheringDisallowed() throws Exception {
TestLocalOnlyHotspotCallback callback = new TestLocalOnlyHotspotCallback();
- when(mWifiService.startLocalOnlyHotspot(any(Messenger.class), any(IBinder.class)))
- .thenReturn(ERROR_TETHERING_DISALLOWED);
+ when(mWifiService.startLocalOnlyHotspot(any(Messenger.class), any(IBinder.class),
+ anyString())).thenReturn(ERROR_TETHERING_DISALLOWED);
mWifiManager.startLocalOnlyHotspot(callback, mHandler);
mLooper.dispatchAll();
assertEquals(ERROR_TETHERING_DISALLOWED, callback.mFailureReason);
@@ -504,7 +507,7 @@
public void testLocalOnlyHotspotCallbackFullOnSecurityException() throws Exception {
TestLocalOnlyHotspotCallback callback = new TestLocalOnlyHotspotCallback();
doThrow(new SecurityException()).when(mWifiService)
- .startLocalOnlyHotspot(any(Messenger.class), any(IBinder.class));
+ .startLocalOnlyHotspot(any(Messenger.class), any(IBinder.class), anyString());
try {
mWifiManager.startLocalOnlyHotspot(callback, mHandler);
} catch (SecurityException e) {
@@ -524,8 +527,8 @@
@Test
public void testLocalOnlyHotspotCallbackFullOnNoChannelError() throws Exception {
TestLocalOnlyHotspotCallback callback = new TestLocalOnlyHotspotCallback();
- when(mWifiService.startLocalOnlyHotspot(any(Messenger.class), any(IBinder.class)))
- .thenReturn(REQUEST_REGISTERED);
+ when(mWifiService.startLocalOnlyHotspot(any(Messenger.class), any(IBinder.class),
+ anyString())).thenReturn(REQUEST_REGISTERED);
mWifiManager.startLocalOnlyHotspot(callback, mHandler);
mLooper.dispatchAll();
//assertEquals(ERROR_NO_CHANNEL, callback.mFailureReason);
@@ -540,8 +543,8 @@
@Test
public void testCancelLocalOnlyHotspotRequestCallsStopOnWifiService() throws Exception {
TestLocalOnlyHotspotCallback callback = new TestLocalOnlyHotspotCallback();
- when(mWifiService.startLocalOnlyHotspot(any(Messenger.class), any(IBinder.class)))
- .thenReturn(REQUEST_REGISTERED);
+ when(mWifiService.startLocalOnlyHotspot(any(Messenger.class), any(IBinder.class),
+ anyString())).thenReturn(REQUEST_REGISTERED);
mWifiManager.startLocalOnlyHotspot(callback, mHandler);
mWifiManager.cancelLocalOnlyHotspotRequest();
verify(mWifiService).stopLocalOnlyHotspot();
@@ -562,8 +565,8 @@
@Test
public void testCallbackAfterLocalOnlyHotspotWasCancelled() throws Exception {
TestLocalOnlyHotspotCallback callback = new TestLocalOnlyHotspotCallback();
- when(mWifiService.startLocalOnlyHotspot(any(Messenger.class), any(IBinder.class)))
- .thenReturn(REQUEST_REGISTERED);
+ when(mWifiService.startLocalOnlyHotspot(any(Messenger.class), any(IBinder.class),
+ anyString())).thenReturn(REQUEST_REGISTERED);
mWifiManager.startLocalOnlyHotspot(callback, mHandler);
mWifiManager.cancelLocalOnlyHotspotRequest();
verify(mWifiService).stopLocalOnlyHotspot();
@@ -581,8 +584,8 @@
@Test
public void testCancelAfterLocalOnlyHotspotCallbackTriggered() throws Exception {
TestLocalOnlyHotspotCallback callback = new TestLocalOnlyHotspotCallback();
- when(mWifiService.startLocalOnlyHotspot(any(Messenger.class), any(IBinder.class)))
- .thenReturn(ERROR_INCOMPATIBLE_MODE);
+ when(mWifiService.startLocalOnlyHotspot(any(Messenger.class), any(IBinder.class),
+ anyString())).thenReturn(ERROR_INCOMPATIBLE_MODE);
mWifiManager.startLocalOnlyHotspot(callback, mHandler);
mLooper.dispatchAll();
assertEquals(ERROR_INCOMPATIBLE_MODE, callback.mFailureReason);
@@ -775,4 +778,13 @@
verify(mWifiService).stopWatchLocalOnlyHotspot();
}
+ /**
+ * Verify that calls to setWifiApEnabled return false.
+ */
+ @Test
+ public void testSetWifiApEnabledReturnsFalse() throws Exception {
+ assertFalse(mWifiManager.setWifiApEnabled(null, true));
+ assertFalse(mWifiManager.setWifiApEnabled(null, false));
+ verify(mWifiService, never()).setWifiApEnabled(any(), anyBoolean());
+ }
}