diff options
178 files changed, 2212 insertions, 825 deletions
diff --git a/apct-tests/perftests/core/res/font/samplefont.ttf b/apct-tests/perftests/core/res/font/samplefont.ttf Binary files differnew file mode 100644 index 000000000000..b8302d4ea30f --- /dev/null +++ b/apct-tests/perftests/core/res/font/samplefont.ttf 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 000000000000..40fa26805772 --- /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 000000000000..b226446c8e2e --- /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 000000000000..3689a640a77a --- /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 000000000000..5f236f559826 --- /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 000000000000..0331fa579922 --- /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 5d1f6f01dcb1..7ab325f79dc7 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 000000000000..4b6da6ba345a --- /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/core/java/android/app/Notification.java b/core/java/android/app/Notification.java index 8a15b1fd1316..3ed174b2d46f 100644 --- a/core/java/android/app/Notification.java +++ b/core/java/android/app/Notification.java @@ -1112,6 +1112,16 @@ public class Notification implements Parcelable @SystemApi public static final String EXTRA_SUBSTITUTE_APP_NAME = "android.substName"; + /** + * This is set on the notification shown by the activity manager about all apps + * running in the background. It indicates that the notification should be shown + * only if any of the given apps do not already have a {@link #FLAG_FOREGROUND_SERVICE} + * notification currently visible to the user. This is a string array of all + * package names of the apps. + * @hide + */ + public static final String EXTRA_FOREGROUND_APPS = "android.foregroundApps"; + private Icon mSmallIcon; private Icon mLargeIcon; diff --git a/core/java/android/content/res/ResourcesImpl.java b/core/java/android/content/res/ResourcesImpl.java index bdfef8326fdf..b3adf82c75a4 100644 --- a/core/java/android/content/res/ResourcesImpl.java +++ b/core/java/android/content/res/ResourcesImpl.java @@ -772,6 +772,10 @@ public class ResourcesImpl { } 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/view/SurfaceView.java b/core/java/android/view/SurfaceView.java index 9cea4ed12392..2c33b60b98b5 100644 --- a/core/java/android/view/SurfaceView.java +++ b/core/java/android/view/SurfaceView.java @@ -856,7 +856,7 @@ public class SurfaceView extends View implements ViewRootImpl.WindowStoppedCallb */ @Deprecated public void setWindowType(int type) { - if (getContext().getApplicationInfo().targetSdkVersion > Build.VERSION_CODES.N_MR1) { + if (getContext().getApplicationInfo().targetSdkVersion >= Build.VERSION_CODES.O) { throw new UnsupportedOperationException( "SurfaceView#setWindowType() has never been a public API."); } diff --git a/core/java/android/view/ViewTreeObserver.java b/core/java/android/view/ViewTreeObserver.java index e4d4e7b8b8c5..0973d0aa9b90 100644 --- a/core/java/android/view/ViewTreeObserver.java +++ b/core/java/android/view/ViewTreeObserver.java @@ -334,7 +334,7 @@ public final class ViewTreeObserver { */ ViewTreeObserver(Context context) { sIllegalOnDrawModificationIsFatal = - context.getApplicationInfo().targetSdkVersion > Build.VERSION_CODES.N_MR1; + context.getApplicationInfo().targetSdkVersion >= Build.VERSION_CODES.O; } /** diff --git a/core/java/android/view/WindowManagerPolicy.java b/core/java/android/view/WindowManagerPolicy.java index 030c78b7f4b6..a32632736ee8 100644 --- a/core/java/android/view/WindowManagerPolicy.java +++ b/core/java/android/view/WindowManagerPolicy.java @@ -589,6 +589,13 @@ public interface WindowManagerPolicy { * 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 +1274,15 @@ public interface WindowManagerPolicy { 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 +1292,13 @@ public interface WindowManagerPolicy { } /** + * 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(); diff --git a/core/java/android/webkit/UserPackage.java b/core/java/android/webkit/UserPackage.java index f53b5d6a7cd7..892008948e87 100644 --- a/core/java/android/webkit/UserPackage.java +++ b/core/java/android/webkit/UserPackage.java @@ -83,8 +83,7 @@ public class UserPackage { * supported by the current framework version. */ public static boolean hasCorrectTargetSdkVersion(PackageInfo packageInfo) { - // TODO(gsennton) use Build.VERSION_CODES.O when that has been updated. - return packageInfo.applicationInfo.targetSdkVersion > Build.VERSION_CODES.N_MR1; + return packageInfo.applicationInfo.targetSdkVersion >= Build.VERSION_CODES.O; } public UserInfo getUserInfo() { diff --git a/core/java/android/widget/DayPickerView.java b/core/java/android/widget/DayPickerView.java index be0967f162c4..cfd1445ea3f8 100644 --- a/core/java/android/widget/DayPickerView.java +++ b/core/java/android/widget/DayPickerView.java @@ -16,7 +16,7 @@ package android.widget; -import static android.os.Build.VERSION_CODES.N_MR1; +import static android.os.Build.VERSION_CODES.O; import android.annotation.Nullable; import android.content.Context; @@ -302,7 +302,7 @@ class DayPickerView extends ViewGroup { getTempCalendarForTime(timeInMillis); final int targetSdkVersion = mContext.getApplicationInfo().targetSdkVersion; - if (targetSdkVersion > N_MR1) { + if (targetSdkVersion >= O) { if (mTempCalendar.before(mMinDate) || mTempCalendar.after(mMaxDate)) { throw new IllegalArgumentException("timeInMillis must be between the values of " + "getMinDate() and getMaxDate()"); diff --git a/core/java/android/widget/TextView.java b/core/java/android/widget/TextView.java index 77f27d983e17..8542bec0113b 100644 --- a/core/java/android/widget/TextView.java +++ b/core/java/android/widget/TextView.java @@ -11227,8 +11227,10 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener return true; case DragEvent.ACTION_DRAG_LOCATION: - final int offset = getOffsetForPosition(event.getX(), event.getY()); - Selection.setSelection((Spannable) mText, offset); + if (mText instanceof Spannable) { + final int offset = getOffsetForPosition(event.getX(), event.getY()); + Selection.setSelection((Spannable) mText, offset); + } return true; case DragEvent.ACTION_DROP: diff --git a/core/java/com/android/internal/os/BatteryStatsImpl.java b/core/java/com/android/internal/os/BatteryStatsImpl.java index b9d3a30ecd95..25d5fae12191 100644 --- a/core/java/com/android/internal/os/BatteryStatsImpl.java +++ b/core/java/com/android/internal/os/BatteryStatsImpl.java @@ -967,14 +967,15 @@ public class BatteryStatsImpl extends BatteryStats { } } + @VisibleForTesting public static class LongSamplingCounterArray extends LongCounterArray implements TimeBaseObs { final TimeBase mTimeBase; - long[] mCounts; - long[] mLoadedCounts; - long[] mUnpluggedCounts; - long[] mPluggedCounts; + public long[] mCounts; + public long[] mLoadedCounts; + public long[] mUnpluggedCounts; + public long[] mPluggedCounts; - LongSamplingCounterArray(TimeBase timeBase, Parcel in) { + private LongSamplingCounterArray(TimeBase timeBase, Parcel in) { mTimeBase = timeBase; mPluggedCounts = in.createLongArray(); mCounts = copyArray(mPluggedCounts, mCounts); @@ -983,12 +984,12 @@ public class BatteryStatsImpl extends BatteryStats { timeBase.add(this); } - LongSamplingCounterArray(TimeBase timeBase) { + public LongSamplingCounterArray(TimeBase timeBase) { mTimeBase = timeBase; timeBase.add(this); } - public void writeToParcel(Parcel out) { + private void writeToParcel(Parcel out) { out.writeLongArray(mCounts); out.writeLongArray(mLoadedCounts); out.writeLongArray(mUnpluggedCounts); @@ -1024,7 +1025,7 @@ public class BatteryStatsImpl extends BatteryStats { + " mPluggedCounts=" + Arrays.toString(mPluggedCounts)); } - void addCountLocked(long[] counts) { + public void addCountLocked(long[] counts) { if (counts == null) { return; } @@ -1039,7 +1040,7 @@ public class BatteryStatsImpl extends BatteryStats { /** * Clear state of this counter. */ - void reset(boolean detachIfReset) { + public void reset(boolean detachIfReset) { fillArray(mCounts, 0); fillArray(mLoadedCounts, 0); fillArray(mPluggedCounts, 0); @@ -1049,21 +1050,60 @@ public class BatteryStatsImpl extends BatteryStats { } } - void detach() { + public void detach() { mTimeBase.remove(this); } - void writeSummaryFromParcelLocked(Parcel out) { + private void writeSummaryToParcelLocked(Parcel out) { out.writeLongArray(mCounts); } - void readSummaryFromParcelLocked(Parcel in) { + private void readSummaryFromParcelLocked(Parcel in) { mCounts = in.createLongArray(); mLoadedCounts = copyArray(mCounts, mLoadedCounts); mUnpluggedCounts = copyArray(mCounts, mUnpluggedCounts); mPluggedCounts = copyArray(mCounts, mPluggedCounts); } + public static void writeToParcel(Parcel out, LongSamplingCounterArray counterArray) { + if (counterArray != null) { + out.writeInt(1); + counterArray.writeToParcel(out); + } else { + out.writeInt(0); + } + } + + public static LongSamplingCounterArray readFromParcel(Parcel in, TimeBase timeBase) { + if (in.readInt() != 0) { + return new LongSamplingCounterArray(timeBase, in); + } else { + return null; + } + } + + public static void writeSummaryToParcelLocked(Parcel out, + LongSamplingCounterArray counterArray) { + if (counterArray != null) { + out.writeInt(1); + counterArray.writeSummaryToParcelLocked(out); + } else { + out.writeInt(0); + } + } + + public static LongSamplingCounterArray readSummaryFromParcelLocked(Parcel in, + TimeBase timeBase) { + if (in.readInt() != 0) { + final LongSamplingCounterArray counterArray + = new LongSamplingCounterArray(timeBase); + counterArray.readSummaryFromParcelLocked(in); + return counterArray; + } else { + return null; + } + } + private void fillArray(long[] a, long val) { if (a != null) { Arrays.fill(a, val); @@ -6927,18 +6967,8 @@ public class BatteryStatsImpl extends BatteryStats { out.writeInt(0); } - if (mCpuFreqTimeMs != null) { - out.writeInt(1); - mCpuFreqTimeMs.writeToParcel(out); - } else { - out.writeInt(0); - } - if (mScreenOffCpuFreqTimeMs != null) { - out.writeInt(1); - mScreenOffCpuFreqTimeMs.writeToParcel(out); - } else { - out.writeInt(0); - } + LongSamplingCounterArray.writeToParcel(out, mCpuFreqTimeMs); + LongSamplingCounterArray.writeToParcel(out, mScreenOffCpuFreqTimeMs); if (mMobileRadioApWakeupCount != null) { out.writeInt(1); @@ -7187,17 +7217,9 @@ public class BatteryStatsImpl extends BatteryStats { mCpuClusterSpeed = null; } - if (in.readInt() != 0) { - mCpuFreqTimeMs = new LongSamplingCounterArray(mBsi.mOnBatteryTimeBase, in); - } else { - mCpuFreqTimeMs = null; - } - if (in.readInt() != 0) { - mScreenOffCpuFreqTimeMs = new LongSamplingCounterArray( - mBsi.mOnBatteryScreenOffTimeBase, in); - } else { - mScreenOffCpuFreqTimeMs = null; - } + mCpuFreqTimeMs = LongSamplingCounterArray.readFromParcel(in, mBsi.mOnBatteryTimeBase); + mScreenOffCpuFreqTimeMs = LongSamplingCounterArray.readFromParcel( + in, mBsi.mOnBatteryScreenOffTimeBase); if (in.readInt() != 0) { mMobileRadioApWakeupCount = new LongSamplingCounter(mBsi.mOnBatteryTimeBase, in); @@ -11355,19 +11377,10 @@ public class BatteryStatsImpl extends BatteryStats { u.mCpuClusterSpeed = null; } - if (in.readInt() != 0) { - u.mCpuFreqTimeMs = new LongSamplingCounterArray(mOnBatteryTimeBase); - u.mCpuFreqTimeMs.readSummaryFromParcelLocked(in); - } else { - u.mCpuFreqTimeMs = null; - } - if (in.readInt() != 0) { - u.mScreenOffCpuFreqTimeMs = new LongSamplingCounterArray( - mOnBatteryScreenOffTimeBase); - u.mScreenOffCpuFreqTimeMs.readSummaryFromParcelLocked(in); - } else { - u.mScreenOffCpuFreqTimeMs = null; - } + u.mCpuFreqTimeMs = LongSamplingCounterArray.readSummaryFromParcelLocked( + in, mOnBatteryTimeBase); + u.mScreenOffCpuFreqTimeMs = LongSamplingCounterArray.readSummaryFromParcelLocked( + in, mOnBatteryScreenOffTimeBase); if (in.readInt() != 0) { u.mMobileRadioApWakeupCount = new LongSamplingCounter(mOnBatteryTimeBase); @@ -11765,18 +11778,8 @@ public class BatteryStatsImpl extends BatteryStats { out.writeInt(0); } - if (u.mCpuFreqTimeMs != null) { - out.writeInt(1); - u.mCpuFreqTimeMs.writeSummaryFromParcelLocked(out); - } else { - out.writeInt(0); - } - if (u.mScreenOffCpuFreqTimeMs != null) { - out.writeInt(1); - u.mScreenOffCpuFreqTimeMs.writeSummaryFromParcelLocked(out); - } else { - out.writeInt(0); - } + LongSamplingCounterArray.writeSummaryToParcelLocked(out, u.mCpuFreqTimeMs); + LongSamplingCounterArray.writeSummaryToParcelLocked(out, u.mScreenOffCpuFreqTimeMs); if (u.mMobileRadioApWakeupCount != null) { out.writeInt(1); diff --git a/core/java/com/android/internal/policy/DecorView.java b/core/java/com/android/internal/policy/DecorView.java index 1b83708559ed..9823431270d4 100644 --- a/core/java/com/android/internal/policy/DecorView.java +++ b/core/java/com/android/internal/policy/DecorView.java @@ -296,7 +296,11 @@ public class DecorView extends FrameLayout implements RootViewSurfaceTaker, Wind @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 diff --git a/core/java/com/android/internal/widget/BackgroundFallback.java b/core/java/com/android/internal/widget/BackgroundFallback.java index 4adba4db4f2e..309f80cb0d52 100644 --- a/core/java/com/android/internal/widget/BackgroundFallback.java +++ b/core/java/com/android/internal/widget/BackgroundFallback.java @@ -39,14 +39,22 @@ public class BackgroundFallback { 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/res/res/anim/lock_screen_behind_enter.xml b/core/res/res/anim/lock_screen_behind_enter.xml index c96e2809d8a9..c1d26e339a22 100644 --- a/core/res/res/anim/lock_screen_behind_enter.xml +++ b/core/res/res/anim/lock_screen_behind_enter.xml @@ -17,8 +17,7 @@ <set xmlns:android="http://schemas.android.com/apk/res/android" android:detachWallpaper="true" - android:shareInterpolator="false" - android:startOffset="100"> + android:shareInterpolator="false"> <translate android:fromYDelta="110%p" android:toYDelta="0" android:fillEnabled="true" android:fillBefore="true" android:fillAfter="true" diff --git a/core/res/res/anim/lock_screen_behind_enter_fade_in.xml b/core/res/res/anim/lock_screen_behind_enter_fade_in.xml index 94e40a868ed3..e9475f52d22a 100644 --- a/core/res/res/anim/lock_screen_behind_enter_fade_in.xml +++ b/core/res/res/anim/lock_screen_behind_enter_fade_in.xml @@ -22,6 +22,5 @@ android:interpolator="@interpolator/linear" android:fromAlpha="0" android:toAlpha="1" android:fillEnabled="true" android:fillBefore="true" android:fillAfter="true" - android:duration="250" - android:startOffset="100"> + android:duration="250"> </alpha>
\ No newline at end of file diff --git a/core/res/res/anim/lock_screen_behind_enter_wallpaper.xml b/core/res/res/anim/lock_screen_behind_enter_wallpaper.xml index 660b66258fed..50156fbf7a02 100644 --- a/core/res/res/anim/lock_screen_behind_enter_wallpaper.xml +++ b/core/res/res/anim/lock_screen_behind_enter_wallpaper.xml @@ -16,12 +16,12 @@ --> <set xmlns:android="http://schemas.android.com/apk/res/android" - android:detachWallpaper="true" android:shareInterpolator="false" android:startOffset="100"> + android:detachWallpaper="true" android:shareInterpolator="false" > <alpha android:fromAlpha="0.0" android:toAlpha="1.0" android:fillEnabled="true" android:fillBefore="true" android:interpolator="@interpolator/decelerate_quint" - android:duration="400"/> + android:duration="300"/> <translate android:fromYDelta="11%p" android:toYDelta="0" android:fillEnabled="true" android:fillBefore="true" android:fillAfter="true" diff --git a/core/res/res/anim/lock_screen_wallpaper_exit.xml b/core/res/res/anim/lock_screen_wallpaper_exit.xml index 49d0327b662f..ba8741a25704 100644 --- a/core/res/res/anim/lock_screen_wallpaper_exit.xml +++ b/core/res/res/anim/lock_screen_wallpaper_exit.xml @@ -16,12 +16,12 @@ --> <set xmlns:android="http://schemas.android.com/apk/res/android" - android:shareInterpolator="false" android:startOffset="100"> + android:shareInterpolator="false"> <alpha android:fromAlpha="1.0" android:toAlpha="0.0" android:fillEnabled="true" android:fillBefore="true" android:fillAfter="true" android:interpolator="@interpolator/fast_out_linear_in" - android:duration="150"/> + android:duration="200"/> <!-- Empty animation so the animation has same duration as lock_screen_behind_enter animation --> diff --git a/core/res/res/values-af/strings.xml b/core/res/res/values-af/strings.xml index bafd40d1b945..600b8fe69e18 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"> @@ -1205,7 +1204,7 @@ <string name="select_keyboard_layout_notification_message" msgid="8084622969903004900">"Tik om taal en uitleg te kies"</string> <string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string> <string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string> - <string name="alert_windows_notification_channel_name" msgid="3116610965549449803">"<xliff:g id="NAME">%s</xliff:g> word bo-oor ander programme gewys"</string> + <string name="alert_windows_notification_channel_name" msgid="7684862527629252655">"Programaktiwiteit"</string> <string name="alert_windows_notification_title" msgid="3697657294867638947">"<xliff:g id="NAME">%s</xliff:g> wys bo-oor ander programme"</string> <string name="alert_windows_notification_message" msgid="8917232109522912560">"As jy nie wil hê dat <xliff:g id="NAME">%s</xliff:g> hierdie kenmerk gebruik nie, tik om instellings oop te maak en skakel dit af."</string> <string name="alert_windows_notification_turn_off_action" msgid="3367294525884949878">"SKAKEL AF"</string> diff --git a/core/res/res/values-am/strings.xml b/core/res/res/values-am/strings.xml index d91c18570b9d..c42da996a7cb 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"> @@ -1205,7 +1204,7 @@ <string name="select_keyboard_layout_notification_message" msgid="8084622969903004900">"ቋንቋ እና አቀማመጥን ለመምረጥ መታ ያድርጉ"</string> <string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string> <string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string> - <string name="alert_windows_notification_channel_name" msgid="3116610965549449803">"<xliff:g id="NAME">%s</xliff:g> በሌሎች መተግበሪያዎች ላይ እያሳየ ነው"</string> + <string name="alert_windows_notification_channel_name" msgid="7684862527629252655">"የመተግበሪያ እንቅስቃሴ"</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_turn_off_action" msgid="3367294525884949878">"አጥፋ"</string> diff --git a/core/res/res/values-ar/strings.xml b/core/res/res/values-ar/strings.xml index 26463336c6d9..1c1d821b775c 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"> @@ -1293,7 +1292,7 @@ <string name="select_keyboard_layout_notification_message" msgid="8084622969903004900">"انقر لاختيار لغة وتنسيق"</string> <string name="fast_scroll_alphabet" msgid="5433275485499039199">" أ ب ت ث ج ح خ د ذ ر ز س ش ص ض ط ظ ع غ ف ق ك ل م ن ه و ي"</string> <string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789 أ ب ت ث ج ح خ د ذ ر ز س ش ص ض ط ظ ع غ ف ق ك ل م ن ه و ي"</string> - <string name="alert_windows_notification_channel_name" msgid="3116610965549449803">"جارٍ عرض <xliff:g id="NAME">%s</xliff:g> فوق تطبيقات أخرى"</string> + <string name="alert_windows_notification_channel_name" msgid="7684862527629252655">"نشاط التطبيقات"</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_turn_off_action" msgid="3367294525884949878">"إيقاف"</string> diff --git a/core/res/res/values-az/strings.xml b/core/res/res/values-az/strings.xml index a4a3881036b4..41fa6bd075d6 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"> @@ -1205,7 +1204,7 @@ <string name="select_keyboard_layout_notification_message" msgid="8084622969903004900">"Dil və tərtibatı seçmək üçün tıklayın"</string> <string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCÇDEƏFGĞHXIİJKQLMNOÖPRSŞTUÜVYZ"</string> <string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789ABCÇDEƏFGĞHİIJKLMNOÖPQRSŞTUÜVWXYZ"</string> - <string name="alert_windows_notification_channel_name" msgid="3116610965549449803">"<xliff:g id="NAME">%s</xliff:g> digər tətbiqlər üzərindən göstərilir"</string> + <string name="alert_windows_notification_channel_name" msgid="7684862527629252655">"Tətbiq fəaliyyəti"</string> <string name="alert_windows_notification_title" msgid="3697657294867638947">"<xliff:g id="NAME">%s</xliff:g> tətbiq üzərindən göstərilir"</string> <string name="alert_windows_notification_message" msgid="8917232109522912560">"<xliff:g id="NAME">%s</xliff:g> adlı şəxsin bu funksiyadan istifadə etməyini istəmirsinizsə, ayarları açmaq və deaktiv etmək üçün klikləyin."</string> <string name="alert_windows_notification_turn_off_action" msgid="3367294525884949878">"DEAKTİV EDİN"</string> diff --git a/core/res/res/values-b+sr+Latn/strings.xml b/core/res/res/values-b+sr+Latn/strings.xml index ebb5cd073daa..3d278fb78406 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"> @@ -1227,7 +1226,7 @@ <string name="select_keyboard_layout_notification_message" msgid="8084622969903004900">"Dodirnite da biste izabrali jezik i raspored"</string> <string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string> <string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string> - <string name="alert_windows_notification_channel_name" msgid="3116610965549449803">"Aplikacija <xliff:g id="NAME">%s</xliff:g> se prikazuje preko drugih aplikacija"</string> + <string name="alert_windows_notification_channel_name" msgid="7684862527629252655">"Aktivnosti u aplikacijama"</string> <string name="alert_windows_notification_title" msgid="3697657294867638947">"<xliff:g id="NAME">%s</xliff:g> se prikazuje preko drugih aplik."</string> <string name="alert_windows_notification_message" msgid="8917232109522912560">"Ako ne želite ovu funkciju za <xliff:g id="NAME">%s</xliff:g>, dodirnite da biste otvorili podešavanja i isključili je."</string> <string name="alert_windows_notification_turn_off_action" msgid="3367294525884949878">"ISKLJUČI"</string> @@ -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 32cec8831f1a..a233114392f3 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"> @@ -1249,7 +1248,7 @@ <string name="select_keyboard_layout_notification_message" msgid="8084622969903004900">"Дакраніцеся, каб выбраць мову і раскладку"</string> <string name="fast_scroll_alphabet" msgid="5433275485499039199">" АБВГДЕЁЖЗІЙКЛМНОПРСТУЎФХЦЧШ\'ЫЬЭЮЯ"</string> <string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string> - <string name="alert_windows_notification_channel_name" msgid="3116610965549449803">"<xliff:g id="NAME">%s</xliff:g> паказваецца паверх іншых праграм"</string> + <string name="alert_windows_notification_channel_name" msgid="7684862527629252655">"Актыўнасць праграмы"</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_turn_off_action" msgid="3367294525884949878">"АДКЛЮЧЫЦЬ"</string> diff --git a/core/res/res/values-bg/strings.xml b/core/res/res/values-bg/strings.xml index e72b2f9e150e..65ce3b85e621 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"> @@ -1206,7 +1204,7 @@ <string name="select_keyboard_layout_notification_message" msgid="8084622969903004900">"Докоснете, за да изберете език и подредба"</string> <string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string> <string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string> - <string name="alert_windows_notification_channel_name" msgid="3116610965549449803">"<xliff:g id="NAME">%s</xliff:g> се показва върху други приложения"</string> + <string name="alert_windows_notification_channel_name" msgid="7684862527629252655">"Активност в приложенията"</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_turn_off_action" msgid="3367294525884949878">"ИЗКЛЮЧВАНЕ"</string> diff --git a/core/res/res/values-bn/strings.xml b/core/res/res/values-bn/strings.xml index 954c910291bd..657bfc91586d 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"> @@ -1207,7 +1205,7 @@ <string name="select_keyboard_layout_notification_message" msgid="8084622969903004900">"ভাষা এবং লেআউট নির্বাচন করুন আলতো চাপ দিন"</string> <string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string> <string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string> - <string name="alert_windows_notification_channel_name" msgid="3116610965549449803">"<xliff:g id="NAME">%s</xliff:g> অন্যান্য অ্যাপ্লিকেশানের ওপরেও প্রদর্শিত"</string> + <string name="alert_windows_notification_channel_name" msgid="7684862527629252655">"অ্যাপের কার্যকলাপ"</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_turn_off_action" msgid="3367294525884949878">"বন্ধ করুন"</string> diff --git a/core/res/res/values-bs/strings.xml b/core/res/res/values-bs/strings.xml index 101afb74019b..14744f92d404 100644 --- a/core/res/res/values-bs/strings.xml +++ b/core/res/res/values-bs/strings.xml @@ -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"> @@ -1232,7 +1231,7 @@ <string name="select_keyboard_layout_notification_message" msgid="8084622969903004900">"Dodirnite za odabir jezika i rasporeda"</string> <string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string> <string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string> - <string name="alert_windows_notification_channel_name" msgid="3116610965549449803">"Aplikacija <xliff:g id="NAME">%s</xliff:g> prekriva ostale aplikacije"</string> + <string name="alert_windows_notification_channel_name" msgid="7684862527629252655">"Aktivnost aplikacija"</string> <string name="alert_windows_notification_title" msgid="3697657294867638947">"Aplikacija <xliff:g id="NAME">%s</xliff:g> prekriva druge apl."</string> <string name="alert_windows_notification_message" msgid="8917232109522912560">"Ako ne želite da <xliff:g id="NAME">%s</xliff:g> koristi ovu funkciju, dodirnite da otvorite postavke i isključite je."</string> <string name="alert_windows_notification_turn_off_action" msgid="3367294525884949878">"ISKLJUČI"</string> diff --git a/core/res/res/values-ca/strings.xml b/core/res/res/values-ca/strings.xml index e928cd98b859..d8e2387ac3c5 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> @@ -1205,7 +1204,7 @@ <string name="select_keyboard_layout_notification_message" msgid="8084622969903004900">"Toca per seleccionar l\'idioma i el disseny"</string> <string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string> <string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string> - <string name="alert_windows_notification_channel_name" msgid="3116610965549449803">"S\'està superposant <xliff:g id="NAME">%s</xliff:g> a altres aplicacions"</string> + <string name="alert_windows_notification_channel_name" msgid="7684862527629252655">"Activitat en aplicacions"</string> <string name="alert_windows_notification_title" msgid="3697657294867638947">"<xliff:g id="NAME">%s</xliff:g> s\'està superposant a altres apps"</string> <string name="alert_windows_notification_message" msgid="8917232109522912560">"Si no vols que <xliff:g id="NAME">%s</xliff:g> utilitzi aquesta funció, toca per obrir la configuració i desactiva-la."</string> <string name="alert_windows_notification_turn_off_action" msgid="3367294525884949878">"DESACTIVA"</string> @@ -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 5b5dbcfba2fd..dedb67dbc306 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"> @@ -1249,7 +1248,7 @@ <string name="select_keyboard_layout_notification_message" msgid="8084622969903004900">"Klepnutím vyberte jazyk a rozvržení"</string> <string name="fast_scroll_alphabet" msgid="5433275485499039199">" AÁBCČDĎEÉĚFGHCHIÍJKLMNŇOÓPQRŘSŠTŤUÚVWXYÝZŽ"</string> <string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789AÁBCČDĎEÉĚFGHCHIÍJKLMNŇOÓPQRŘSŠTŤUÚVWXYÝZŽ"</string> - <string name="alert_windows_notification_channel_name" msgid="3116610965549449803">"Aplikace <xliff:g id="NAME">%s</xliff:g> se zobrazuje přes ostatní aplikace"</string> + <string name="alert_windows_notification_channel_name" msgid="7684862527629252655">"Aktivita v aplikacích"</string> <string name="alert_windows_notification_title" msgid="3697657294867638947">"<xliff:g id="NAME">%s</xliff:g> se zobrazuje přes ostatní aplikace"</string> <string name="alert_windows_notification_message" msgid="8917232109522912560">"Pokud nechcete, aby aplikace <xliff:g id="NAME">%s</xliff:g> tuto funkci používala, klepnutím otevřete nastavení a funkci vypněte."</string> <string name="alert_windows_notification_turn_off_action" msgid="3367294525884949878">"VYPNOUT"</string> diff --git a/core/res/res/values-da/strings.xml b/core/res/res/values-da/strings.xml index 441a25b2b088..33a510c8d7c0 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"> @@ -1205,7 +1204,7 @@ <string name="select_keyboard_layout_notification_message" msgid="8084622969903004900">"Tryk for at vælge sprog og layout"</string> <string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string> <string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string> - <string name="alert_windows_notification_channel_name" msgid="3116610965549449803">"<xliff:g id="NAME">%s</xliff:g> vises over andre apps"</string> + <string name="alert_windows_notification_channel_name" msgid="7684862527629252655">"Appaktivitet"</string> <string name="alert_windows_notification_title" msgid="3697657294867638947">"<xliff:g id="NAME">%s</xliff:g> vises over andre apps"</string> <string name="alert_windows_notification_message" msgid="8917232109522912560">"Hvis du ikke ønsker, at <xliff:g id="NAME">%s</xliff:g> skal benytte denne funktion, kan du åbne indstillingerne og deaktivere den."</string> <string name="alert_windows_notification_turn_off_action" msgid="3367294525884949878">"SLÅ FRA"</string> diff --git a/core/res/res/values-de/strings.xml b/core/res/res/values-de/strings.xml index c158ad5d3b85..273b965c137d 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"> @@ -1205,7 +1204,7 @@ <string name="select_keyboard_layout_notification_message" msgid="8084622969903004900">"Zum Auswählen von Sprache und Layout tippen"</string> <string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string> <string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string> - <string name="alert_windows_notification_channel_name" msgid="3116610965549449803">"<xliff:g id="NAME">%s</xliff:g> wird über anderen Apps angezeigt"</string> + <string name="alert_windows_notification_channel_name" msgid="7684862527629252655">"App-Aktivitäten"</string> <string name="alert_windows_notification_title" msgid="3697657294867638947">"<xliff:g id="NAME">%s</xliff:g> wird über anderen Apps angezeigt"</string> <string name="alert_windows_notification_message" msgid="8917232109522912560">"Wenn du nicht möchtest, dass <xliff:g id="NAME">%s</xliff:g> diese Funktion verwendet, tippe, um die Einstellungen zu öffnen und die Funktion zu deaktivieren."</string> <string name="alert_windows_notification_turn_off_action" msgid="3367294525884949878">"DEAKTIVIEREN"</string> diff --git a/core/res/res/values-el/strings.xml b/core/res/res/values-el/strings.xml index 10db204b9e2c..a166ddb02354 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"> @@ -1205,7 +1204,7 @@ <string name="select_keyboard_layout_notification_message" msgid="8084622969903004900">"Πατήστε για να επιλέξετε γλώσσα και διάταξη"</string> <string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string> <string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string> - <string name="alert_windows_notification_channel_name" msgid="3116610965549449803">"Η εφαρμογή <xliff:g id="NAME">%s</xliff:g> προβάλλεται πάνω από άλλες εφαρμογές"</string> + <string name="alert_windows_notification_channel_name" msgid="7684862527629252655">"Δραστηριότητα εφαρμογών"</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_turn_off_action" msgid="3367294525884949878">"ΑΠΕΝΕΡΓΟΠΟΙΗΣΗ"</string> diff --git a/core/res/res/values-en-rAU/strings.xml b/core/res/res/values-en-rAU/strings.xml index 8a1b42cd3a80..c9b7076d597a 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"> @@ -1205,7 +1204,7 @@ <string name="select_keyboard_layout_notification_message" msgid="8084622969903004900">"Tap to select language and layout"</string> <string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string> <string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string> - <string name="alert_windows_notification_channel_name" msgid="3116610965549449803">"<xliff:g id="NAME">%s</xliff:g> displaying over other apps"</string> + <string name="alert_windows_notification_channel_name" msgid="7684862527629252655">"App activity"</string> <string name="alert_windows_notification_title" msgid="3697657294867638947">"<xliff:g id="NAME">%s</xliff:g> is displaying over other apps"</string> <string name="alert_windows_notification_message" msgid="8917232109522912560">"If you don’t want <xliff:g id="NAME">%s</xliff:g> to use this feature, tap to open settings and turn it off."</string> <string name="alert_windows_notification_turn_off_action" msgid="3367294525884949878">"TURN OFF"</string> diff --git a/core/res/res/values-en-rGB/strings.xml b/core/res/res/values-en-rGB/strings.xml index 8a1b42cd3a80..c9b7076d597a 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"> @@ -1205,7 +1204,7 @@ <string name="select_keyboard_layout_notification_message" msgid="8084622969903004900">"Tap to select language and layout"</string> <string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string> <string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string> - <string name="alert_windows_notification_channel_name" msgid="3116610965549449803">"<xliff:g id="NAME">%s</xliff:g> displaying over other apps"</string> + <string name="alert_windows_notification_channel_name" msgid="7684862527629252655">"App activity"</string> <string name="alert_windows_notification_title" msgid="3697657294867638947">"<xliff:g id="NAME">%s</xliff:g> is displaying over other apps"</string> <string name="alert_windows_notification_message" msgid="8917232109522912560">"If you don’t want <xliff:g id="NAME">%s</xliff:g> to use this feature, tap to open settings and turn it off."</string> <string name="alert_windows_notification_turn_off_action" msgid="3367294525884949878">"TURN OFF"</string> diff --git a/core/res/res/values-en-rIN/strings.xml b/core/res/res/values-en-rIN/strings.xml index 8a1b42cd3a80..c9b7076d597a 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"> @@ -1205,7 +1204,7 @@ <string name="select_keyboard_layout_notification_message" msgid="8084622969903004900">"Tap to select language and layout"</string> <string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string> <string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string> - <string name="alert_windows_notification_channel_name" msgid="3116610965549449803">"<xliff:g id="NAME">%s</xliff:g> displaying over other apps"</string> + <string name="alert_windows_notification_channel_name" msgid="7684862527629252655">"App activity"</string> <string name="alert_windows_notification_title" msgid="3697657294867638947">"<xliff:g id="NAME">%s</xliff:g> is displaying over other apps"</string> <string name="alert_windows_notification_message" msgid="8917232109522912560">"If you don’t want <xliff:g id="NAME">%s</xliff:g> to use this feature, tap to open settings and turn it off."</string> <string name="alert_windows_notification_turn_off_action" msgid="3367294525884949878">"TURN OFF"</string> diff --git a/core/res/res/values-es-rUS/strings.xml b/core/res/res/values-es-rUS/strings.xml index ba5af6d65188..b634bf72b32d 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"> @@ -1205,7 +1204,7 @@ <string name="select_keyboard_layout_notification_message" msgid="8084622969903004900">"Presiona para seleccionar el idioma y el diseño"</string> <string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string> <string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string> - <string name="alert_windows_notification_channel_name" msgid="3116610965549449803">"<xliff:g id="NAME">%s</xliff:g> se muestra sobre otras apps"</string> + <string name="alert_windows_notification_channel_name" msgid="7684862527629252655">"Actividad en apps"</string> <string name="alert_windows_notification_title" msgid="3697657294867638947">"<xliff:g id="NAME">%s</xliff:g> se muestra sobre otras apps"</string> <string name="alert_windows_notification_message" msgid="8917232109522912560">"Si no quieres que <xliff:g id="NAME">%s</xliff:g> use esta función, presiona para abrir la configuración y desactivarla."</string> <string name="alert_windows_notification_turn_off_action" msgid="3367294525884949878">"DESACTIVAR"</string> diff --git a/core/res/res/values-es/strings.xml b/core/res/res/values-es/strings.xml index 9369ee52c1f3..af146e54425f 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"> @@ -1205,7 +1204,7 @@ <string name="select_keyboard_layout_notification_message" msgid="8084622969903004900">"Toca para seleccionar el idioma y el diseño"</string> <string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string> <string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string> - <string name="alert_windows_notification_channel_name" msgid="3116610965549449803">"<xliff:g id="NAME">%s</xliff:g> se muestra sobre otras aplicaciones"</string> + <string name="alert_windows_notification_channel_name" msgid="7684862527629252655">"Actividad en aplicaciones"</string> <string name="alert_windows_notification_title" msgid="3697657294867638947">"<xliff:g id="NAME">%s</xliff:g> se muestra sobre otras apps"</string> <string name="alert_windows_notification_message" msgid="8917232109522912560">"Si no quieres que <xliff:g id="NAME">%s</xliff:g> utilice esta función, toca la notificación para abrir los ajustes y desactivarla."</string> <string name="alert_windows_notification_turn_off_action" msgid="3367294525884949878">"DESACTIVAR"</string> diff --git a/core/res/res/values-et/strings.xml b/core/res/res/values-et/strings.xml index d85a37f30759..945abb823927 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"> @@ -1205,7 +1204,7 @@ <string name="select_keyboard_layout_notification_message" msgid="8084622969903004900">"Puudutage keele ja paigutuse valimiseks"</string> <string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSŠZŽTUVWÕÄÖÜXY"</string> <string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789ABCDEFGHIJKLMNOPQRSŠZŽTUVWÕÄÖÜXY"</string> - <string name="alert_windows_notification_channel_name" msgid="3116610965549449803">"Rakendus <xliff:g id="NAME">%s</xliff:g> kuvatakse teiste rakenduste peal"</string> + <string name="alert_windows_notification_channel_name" msgid="7684862527629252655">"Rakenduse tegevus"</string> <string name="alert_windows_notification_title" msgid="3697657294867638947">"<xliff:g id="NAME">%s</xliff:g> kuvat. teiste rakenduste peal"</string> <string name="alert_windows_notification_message" msgid="8917232109522912560">"Kui te ei soovi, et rakendus <xliff:g id="NAME">%s</xliff:g> seda funktsiooni kasutaks, puudutage seadete avamiseks ja lülitage see välja."</string> <string name="alert_windows_notification_turn_off_action" msgid="3367294525884949878">"LÜLITA VÄLJA"</string> diff --git a/core/res/res/values-eu/strings.xml b/core/res/res/values-eu/strings.xml index 2abdeef748ef..b21f45706e4e 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"> @@ -1206,7 +1205,7 @@ <string name="select_keyboard_layout_notification_message" msgid="8084622969903004900">"Hizkuntza eta diseinua hautatzeko, sakatu hau"</string> <string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string> <string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string> - <string name="alert_windows_notification_channel_name" msgid="3116610965549449803">"<xliff:g id="NAME">%s</xliff:g> aplikazioen gainean agertzea"</string> + <string name="alert_windows_notification_channel_name" msgid="7684862527629252655">"Aplikazioetako jarduerak"</string> <string name="alert_windows_notification_title" msgid="3697657294867638947">"Besteen gainean agertzen da <xliff:g id="NAME">%s</xliff:g>"</string> <string name="alert_windows_notification_message" msgid="8917232109522912560">"Ez baduzu nahi <xliff:g id="NAME">%s</xliff:g> zerbitzuak eginbide hori erabiltzea, sakatu hau ezarpenak ireki eta aukera desaktibatzeko."</string> <string name="alert_windows_notification_turn_off_action" msgid="3367294525884949878">"DESAKTIBATU"</string> diff --git a/core/res/res/values-fa/strings.xml b/core/res/res/values-fa/strings.xml index 319a5a18823e..72734fc9fdfc 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"> @@ -1206,7 +1204,7 @@ <string name="select_keyboard_layout_notification_message" msgid="8084622969903004900">"برای انتخاب زبان و چیدمان ضربه بزنید"</string> <string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string> <string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string> - <string name="alert_windows_notification_channel_name" msgid="3116610965549449803">"<xliff:g id="NAME">%s</xliff:g> روی برنامههای دیگر نشان داده میشود"</string> + <string name="alert_windows_notification_channel_name" msgid="7684862527629252655">"فعالیت برنامه"</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_turn_off_action" msgid="3367294525884949878">"خاموش کردن"</string> diff --git a/core/res/res/values-fi/strings.xml b/core/res/res/values-fi/strings.xml index f8fd2b3a7782..d1eedbe45367 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"> @@ -1205,7 +1204,7 @@ <string name="select_keyboard_layout_notification_message" msgid="8084622969903004900">"Valitse kieli ja asettelu koskettamalla."</string> <string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSTUVWXYZÅÄÖ"</string> <string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string> - <string name="alert_windows_notification_channel_name" msgid="3116610965549449803">"<xliff:g id="NAME">%s</xliff:g> näkyy muiden sovellusten päällä"</string> + <string name="alert_windows_notification_channel_name" msgid="7684862527629252655">"Sovellustoiminta"</string> <string name="alert_windows_notification_title" msgid="3697657294867638947">"<xliff:g id="NAME">%s</xliff:g> näkyy sovellusten päällä"</string> <string name="alert_windows_notification_message" msgid="8917232109522912560">"Jos et halua, että <xliff:g id="NAME">%s</xliff:g> voi käyttää tätä ominaisuutta, avaa asetukset napauttamalla ja poista se käytöstä."</string> <string name="alert_windows_notification_turn_off_action" msgid="3367294525884949878">"POISTA KÄYTÖSTÄ"</string> diff --git a/core/res/res/values-fr-rCA/strings.xml b/core/res/res/values-fr-rCA/strings.xml index 15071e9520e5..d258d221da8a 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"> @@ -1206,7 +1204,7 @@ <string name="select_keyboard_layout_notification_message" msgid="8084622969903004900">"Touchez pour sélectionner la langue et la configuration du clavier"</string> <string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string> <string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string> - <string name="alert_windows_notification_channel_name" msgid="3116610965549449803">"<xliff:g id="NAME">%s</xliff:g> affiche du contenu par-dessus d\'autres applications"</string> + <string name="alert_windows_notification_channel_name" msgid="7684862527629252655">"Activité des applications"</string> <string name="alert_windows_notification_title" msgid="3697657294867638947">"<xliff:g id="NAME">%s</xliff:g> aff. contenu par-dessus applis"</string> <string name="alert_windows_notification_message" msgid="8917232109522912560">"Si vous ne voulez pas que <xliff:g id="NAME">%s</xliff:g> utilise cette fonctionnalités, touchez l\'écran pour ouvrir les paramètres, puis désactivez-la."</string> <string name="alert_windows_notification_turn_off_action" msgid="3367294525884949878">"DÉSACTIVER"</string> diff --git a/core/res/res/values-fr/strings.xml b/core/res/res/values-fr/strings.xml index 6a1b8b7aee73..cc7aa6dc624e 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"> @@ -1205,7 +1204,7 @@ <string name="select_keyboard_layout_notification_message" msgid="8084622969903004900">"Appuyer pour sélectionner la langue et la disposition"</string> <string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string> <string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string> - <string name="alert_windows_notification_channel_name" msgid="3116610965549449803">"<xliff:g id="NAME">%s</xliff:g> est affichée sur les autres applications"</string> + <string name="alert_windows_notification_channel_name" msgid="7684862527629252655">"Activité dans les applications"</string> <string name="alert_windows_notification_title" msgid="3697657294867638947">"<xliff:g id="NAME">%s</xliff:g> s\'affiche sur autres applis"</string> <string name="alert_windows_notification_message" msgid="8917232109522912560">"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="alert_windows_notification_turn_off_action" msgid="3367294525884949878">"DÉSACTIVER"</string> diff --git a/core/res/res/values-gl/strings.xml b/core/res/res/values-gl/strings.xml index cfbb5c3a1e8e..a8083bce959e 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"> @@ -1206,7 +1205,7 @@ <string name="select_keyboard_layout_notification_message" msgid="8084622969903004900">"Toca para seleccionar o idioma e o deseño"</string> <string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNÑOPQRSTUVWXYZ"</string> <string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789ABCDEFGHIJKLMNÑOPQRSTUVWXYZ"</string> - <string name="alert_windows_notification_channel_name" msgid="3116610965549449803">"Mostrando <xliff:g id="NAME">%s</xliff:g> sobre outras aplicacións"</string> + <string name="alert_windows_notification_channel_name" msgid="7684862527629252655">"Actividade das aplicacións"</string> <string name="alert_windows_notification_title" msgid="3697657294867638947">"<xliff:g id="NAME">%s</xliff:g> móstrase sobre outras aplicacións"</string> <string name="alert_windows_notification_message" msgid="8917232109522912560">"Se non queres que <xliff:g id="NAME">%s</xliff:g> utilice esta función, toca para abrir a configuración e desactívaa."</string> <string name="alert_windows_notification_turn_off_action" msgid="3367294525884949878">"DESACTIVAR"</string> diff --git a/core/res/res/values-gu/strings.xml b/core/res/res/values-gu/strings.xml index e78dfa902c67..dfd6dcc4a656 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"> @@ -1206,7 +1205,7 @@ <string name="select_keyboard_layout_notification_message" msgid="8084622969903004900">"ભાષા અને લેઆઉટ પસંદ કરવા માટે ટૅપ કરો"</string> <string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string> <string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string> - <string name="alert_windows_notification_channel_name" msgid="3116610965549449803">"<xliff:g id="NAME">%s</xliff:g> અન્ય ઍપ્લિકેશનોની ઉપર પ્રદર્શિત થઈ રહ્યું છે"</string> + <string name="alert_windows_notification_channel_name" msgid="7684862527629252655">"ઍપ્લિકેશન પ્રવૃત્તિ"</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_turn_off_action" msgid="3367294525884949878">"બંધ કરો"</string> diff --git a/core/res/res/values-hi/strings.xml b/core/res/res/values-hi/strings.xml index 30be4d5c5319..ae7dab24dbb4 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"> @@ -1205,7 +1204,7 @@ <string name="select_keyboard_layout_notification_message" msgid="8084622969903004900">"भाषा और लेआउट चुनने के लिए टैप करें"</string> <string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string> <string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string> - <string name="alert_windows_notification_channel_name" msgid="3116610965549449803">"<xliff:g id="NAME">%s</xliff:g> अन्य ऐप्लिकेशन के ऊपर दिखाई दे रहा है"</string> + <string name="alert_windows_notification_channel_name" msgid="7684862527629252655">"ऐप्लिकेशन गतिविधि"</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_turn_off_action" msgid="3367294525884949878">"बंद करें"</string> diff --git a/core/res/res/values-hr/strings.xml b/core/res/res/values-hr/strings.xml index 9eaf0273cf63..fc2a1d17ed67 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"> @@ -1227,7 +1226,7 @@ <string name="select_keyboard_layout_notification_message" msgid="8084622969903004900">"Dodirnite da biste odabrali jezik i raspored"</string> <string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string> <string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string> - <string name="alert_windows_notification_channel_name" msgid="3116610965549449803">"Aplikacija <xliff:g id="NAME">%s</xliff:g> prikazuje se preko drugih aplikacija"</string> + <string name="alert_windows_notification_channel_name" msgid="7684862527629252655">"Aktivnost aplikacije"</string> <string name="alert_windows_notification_title" msgid="3697657294867638947">"Apl. <xliff:g id="NAME">%s</xliff:g> zakriva druge aplikacije"</string> <string name="alert_windows_notification_message" msgid="8917232109522912560">"Ako ne želite da aplikacija <xliff:g id="NAME">%s</xliff:g> upotrebljava tu značajku, dodirnite da biste otvorili postavke i isključili je."</string> <string name="alert_windows_notification_turn_off_action" msgid="3367294525884949878">"ISKLJUČI"</string> diff --git a/core/res/res/values-hu/strings.xml b/core/res/res/values-hu/strings.xml index 1270eb3ed445..fd4b9818a5fc 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"> @@ -1206,7 +1204,7 @@ <string name="select_keyboard_layout_notification_message" msgid="8084622969903004900">"Koppintson a nyelv és a billentyűzetkiosztás kiválasztásához"</string> <string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string> <string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string> - <string name="alert_windows_notification_channel_name" msgid="3116610965549449803">"A(z) <xliff:g id="NAME">%s</xliff:g> a többi alkalmazás felett jelenik meg"</string> + <string name="alert_windows_notification_channel_name" msgid="7684862527629252655">"Alkalmazástevékenység"</string> <string name="alert_windows_notification_title" msgid="3697657294867638947">"<xliff:g id="NAME">%s</xliff:g> – a többi alkalmazás felett"</string> <string name="alert_windows_notification_message" msgid="8917232109522912560">"Ha nem szeretné, hogy a(z) <xliff:g id="NAME">%s</xliff:g> használja ezt a funkciót, koppintson a beállítások megnyitásához, és kapcsolja ki."</string> <string name="alert_windows_notification_turn_off_action" msgid="3367294525884949878">"KIKAPCSOLÁS"</string> diff --git a/core/res/res/values-hy/strings.xml b/core/res/res/values-hy/strings.xml index 28a01c020931..0a32f5811b77 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"> @@ -1205,7 +1204,7 @@ <string name="select_keyboard_layout_notification_message" msgid="8084622969903004900">"Հպեք՝ լեզուն և դասավորությունն ընտրելու համար"</string> <string name="fast_scroll_alphabet" msgid="5433275485499039199">" ԱԲԳԴԵԶԷԸԹԺԻԼԽԾԿՀՁՂՃՄՅՆՇՈՉՊՋՌՍՎՏՐՑՈՒՓՔԵւՕՖ"</string> <string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string> - <string name="alert_windows_notification_channel_name" msgid="3116610965549449803">"<xliff:g id="NAME">%s</xliff:g> հավելվածը ցուցադրվում է այլ հավելվածների վերևում"</string> + <string name="alert_windows_notification_channel_name" msgid="7684862527629252655">"Հավելվածների պատմություն"</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_turn_off_action" msgid="3367294525884949878">"ԱՆՋԱՏԵԼ"</string> diff --git a/core/res/res/values-in/strings.xml b/core/res/res/values-in/strings.xml index e7d160b08b11..db98b4da3a42 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> @@ -1205,7 +1204,7 @@ <string name="select_keyboard_layout_notification_message" msgid="8084622969903004900">"Ketuk untuk memilih bahasa dan tata letak"</string> <string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string> <string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string> - <string name="alert_windows_notification_channel_name" msgid="3116610965549449803">"<xliff:g id="NAME">%s</xliff:g> ditampilkan di atas aplikasi lain"</string> + <string name="alert_windows_notification_channel_name" msgid="7684862527629252655">"Aktivitas aplikasi"</string> <string name="alert_windows_notification_title" msgid="3697657294867638947">"<xliff:g id="NAME">%s</xliff:g> ditampilkan di atas aplikasi lain"</string> <string name="alert_windows_notification_message" msgid="8917232109522912560">"Jika Anda tidak ingin <xliff:g id="NAME">%s</xliff:g> menggunakan fitur ini, tap untuk membuka setelan dan menonaktifkannya."</string> <string name="alert_windows_notification_turn_off_action" msgid="3367294525884949878">"NONAKTIFKAN"</string> diff --git a/core/res/res/values-is/strings.xml b/core/res/res/values-is/strings.xml index 8313cba124d3..d179f572fe4f 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"> @@ -1206,7 +1205,7 @@ <string name="select_keyboard_layout_notification_message" msgid="8084622969903004900">"Ýttu til að velja tungumál og útlit"</string> <string name="fast_scroll_alphabet" msgid="5433275485499039199">" AÁBCDÐEÉFGHIÍJKLMNOÓPQRSTUÚVWXYÝZÞÆÖ"</string> <string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789AÁBCDÐEÉFGHIÍJKLMNOÓPQRSTUÚVWXYÝZÞÆÖ"</string> - <string name="alert_windows_notification_channel_name" msgid="3116610965549449803">"<xliff:g id="NAME">%s</xliff:g> birtist yfir öðrum forritum"</string> + <string name="alert_windows_notification_channel_name" msgid="7684862527629252655">"Forritavirkni"</string> <string name="alert_windows_notification_title" msgid="3697657294867638947">"<xliff:g id="NAME">%s</xliff:g> birtist yfir öðrum forritum"</string> <string name="alert_windows_notification_message" msgid="8917232109522912560">"Ef þú vilt ekki að <xliff:g id="NAME">%s</xliff:g> noti þennan eiginleika skaltu ýta til að opna stillingarnar og slökkva á því."</string> <string name="alert_windows_notification_turn_off_action" msgid="3367294525884949878">"SLÖKKVA"</string> diff --git a/core/res/res/values-it/strings.xml b/core/res/res/values-it/strings.xml index 53c00b2988a4..11245ea48c52 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"> @@ -1205,7 +1204,7 @@ <string name="select_keyboard_layout_notification_message" msgid="8084622969903004900">"Tocca per selezionare la lingua e il layout"</string> <string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string> <string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string> - <string name="alert_windows_notification_channel_name" msgid="3116610965549449803">"App <xliff:g id="NAME">%s</xliff:g> visualizzata sopra altre app"</string> + <string name="alert_windows_notification_channel_name" msgid="7684862527629252655">"Attività app"</string> <string name="alert_windows_notification_title" msgid="3697657294867638947">"App <xliff:g id="NAME">%s</xliff:g> mostrata sopra altre app"</string> <string name="alert_windows_notification_message" msgid="8917232109522912560">"Se non desideri che l\'app <xliff:g id="NAME">%s</xliff:g> utilizzi questa funzione, tocca per aprire le impostazioni e disattivarla."</string> <string name="alert_windows_notification_turn_off_action" msgid="3367294525884949878">"DISATTIVA"</string> diff --git a/core/res/res/values-iw/strings.xml b/core/res/res/values-iw/strings.xml index 7761209f94d9..21fa22cb2477 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"> @@ -1249,7 +1248,7 @@ <string name="select_keyboard_layout_notification_message" msgid="8084622969903004900">"הקש כדי לבחור שפה ופריסה"</string> <string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string> <string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string> - <string name="alert_windows_notification_channel_name" msgid="3116610965549449803">"תצוגה של <xliff:g id="NAME">%s</xliff:g> מעל אפליקציות אחרות"</string> + <string name="alert_windows_notification_channel_name" msgid="7684862527629252655">"פעילות באפליקציות"</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_turn_off_action" msgid="3367294525884949878">"כבה"</string> diff --git a/core/res/res/values-ja/strings.xml b/core/res/res/values-ja/strings.xml index b3af1098d83a..7fbd10848a6f 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"> @@ -1205,7 +1204,7 @@ <string name="select_keyboard_layout_notification_message" msgid="8084622969903004900">"タップして言語とレイアウトを選択してください"</string> <string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string> <string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string> - <string name="alert_windows_notification_channel_name" msgid="3116610965549449803">"<xliff:g id="NAME">%s</xliff:g>を他のアプリの上に重ねて表示"</string> + <string name="alert_windows_notification_channel_name" msgid="7684862527629252655">"アプリのアクティビティ"</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>でこの機能を使用しない場合は、タップして設定を開いて OFF にしてください。"</string> <string name="alert_windows_notification_turn_off_action" msgid="3367294525884949878">"OFF にする"</string> diff --git a/core/res/res/values-ka/strings.xml b/core/res/res/values-ka/strings.xml index 1301220aba88..3e7b2850479b 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"> @@ -1206,7 +1204,7 @@ <string name="select_keyboard_layout_notification_message" msgid="8084622969903004900">"შეეხეთ ენისა და განლაგების ასარჩევად"</string> <string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string> <string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string> - <string name="alert_windows_notification_channel_name" msgid="3116610965549449803">"<xliff:g id="NAME">%s</xliff:g> ნაჩვენებია სხვა აპების ინტერფეისის გადაფარვით"</string> + <string name="alert_windows_notification_channel_name" msgid="7684862527629252655">"აპებში აქტივობა"</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_turn_off_action" msgid="3367294525884949878">"გამორთვა"</string> diff --git a/core/res/res/values-kk/strings.xml b/core/res/res/values-kk/strings.xml index 4c9cd5d71519..812763cccbd9 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"> @@ -1206,7 +1205,7 @@ <string name="select_keyboard_layout_notification_message" msgid="8084622969903004900">"Тіл мен пернетақта схемасын таңдау үшін түртіңіз"</string> <string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string> <string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string> - <string name="alert_windows_notification_channel_name" msgid="3116610965549449803">"<xliff:g id="NAME">%s</xliff:g> басқа қолданбалардың үстінен шықты"</string> + <string name="alert_windows_notification_channel_name" msgid="7684862527629252655">"Қолданба белсенділігі"</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_turn_off_action" msgid="3367294525884949878">"ӨШІРУ"</string> diff --git a/core/res/res/values-km/strings.xml b/core/res/res/values-km/strings.xml index 213f30577f09..85c2a02f9ddf 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"> @@ -1207,7 +1206,7 @@ <string name="select_keyboard_layout_notification_message" msgid="8084622969903004900">"ប៉ះដើម្បីជ្រើសភាសា និងប្លង់"</string> <string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string> <string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string> - <string name="alert_windows_notification_channel_name" msgid="3116610965549449803">"<xliff:g id="NAME">%s</xliff:g> កំពុងបង្ហាញពីលើកម្មវិធីផ្សេងទៀត"</string> + <string name="alert_windows_notification_channel_name" msgid="7684862527629252655">"សកម្មភាពកម្មវិធី"</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_turn_off_action" msgid="3367294525884949878">"បិទ"</string> diff --git a/core/res/res/values-kn/strings.xml b/core/res/res/values-kn/strings.xml index 9a6e89a2c2a4..02a3f9491aa9 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"> @@ -1207,7 +1205,8 @@ <string name="select_keyboard_layout_notification_message" msgid="8084622969903004900">"ಭಾಷೆ ಮತ್ತು ವಿನ್ಯಾಸವನ್ನು ಆಯ್ಕೆ ಮಾಡಲು ಟ್ಯಾಪ್ ಮಾಡಿ"</string> <string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string> <string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string> - <string name="alert_windows_notification_channel_name" msgid="3116610965549449803">"<xliff:g id="NAME">%s</xliff:g> ಇತರ ಅಪ್ಲಿಕೇಶನ್ಗಳ ಮೂಲಕ ಪ್ರದರ್ಶಿಸುತ್ತಿದೆ"</string> + <!-- no translation found for alert_windows_notification_channel_name (7684862527629252655) --> + <skip /> <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_turn_off_action" msgid="3367294525884949878">"ಆಫ್ ಮಾಡಿ"</string> diff --git a/core/res/res/values-ko/strings.xml b/core/res/res/values-ko/strings.xml index cc7aff394c14..97545c15e657 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> @@ -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"> @@ -1206,7 +1204,7 @@ <string name="select_keyboard_layout_notification_message" msgid="8084622969903004900">"탭하여 언어와 레이아웃을 선택하세요."</string> <string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string> <string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string> - <string name="alert_windows_notification_channel_name" msgid="3116610965549449803">"<xliff:g id="NAME">%s</xliff:g>이(가) 다른 앱 위에 표시됨"</string> + <string name="alert_windows_notification_channel_name" msgid="7684862527629252655">"앱 활동"</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_turn_off_action" msgid="3367294525884949878">"사용 중지"</string> diff --git a/core/res/res/values-ky/strings.xml b/core/res/res/values-ky/strings.xml index 0f5f403c4821..a5912631d0cb 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"> @@ -1206,7 +1205,7 @@ <string name="select_keyboard_layout_notification_message" msgid="8084622969903004900">"Тил жана калып тандоо үчүн таптап коюңуз"</string> <string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string> <string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string> - <string name="alert_windows_notification_channel_name" msgid="3116610965549449803">"<xliff:g id="NAME">%s</xliff:g> колдонмосун башка терезелердин үстүнөн көрсөтүү"</string> + <string name="alert_windows_notification_channel_name" msgid="7684862527629252655">"Колдонмодогу аракеттер"</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_turn_off_action" msgid="3367294525884949878">"ӨЧҮРҮҮ"</string> diff --git a/core/res/res/values-lo/strings.xml b/core/res/res/values-lo/strings.xml index f6eb279b42a1..98e790715c30 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"> @@ -1205,7 +1204,7 @@ <string name="select_keyboard_layout_notification_message" msgid="8084622969903004900">"ແຕະເພື່ອເລືອກພາສາ ແລະ ໂຄງແປ້ນພິມ"</string> <string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string> <string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string> - <string name="alert_windows_notification_channel_name" msgid="3116610965549449803">"<xliff:g id="NAME">%s</xliff:g> ກຳລັງສະແດງຜົນຢູເທິງແອັບອື່ນຢູ່"</string> + <string name="alert_windows_notification_channel_name" msgid="7684862527629252655">"ກິດຈະກຳແອັບ"</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_turn_off_action" msgid="3367294525884949878">"ປິດໄວ້"</string> diff --git a/core/res/res/values-lt/strings.xml b/core/res/res/values-lt/strings.xml index 7838067b4a04..7e518089dc1b 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"> @@ -1249,7 +1248,7 @@ <string name="select_keyboard_layout_notification_message" msgid="8084622969903004900">"Palieskite, kad pasirinktumėte kalbą ir išdėstymą"</string> <string name="fast_scroll_alphabet" msgid="5433275485499039199">" AĄBCČDEĘĖFGHIĮYJKLMNOPRSŠTUŲŪVZŽ"</string> <string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789AĄBCČDEĘĖFGHIĮYJKLMNOPRSŠTUŲŪVZŽ"</string> - <string name="alert_windows_notification_channel_name" msgid="3116610965549449803">"<xliff:g id="NAME">%s</xliff:g> rodomi virš kitų programų"</string> + <string name="alert_windows_notification_channel_name" msgid="7684862527629252655">"Programų veikla"</string> <string name="alert_windows_notification_title" msgid="3697657294867638947">"<xliff:g id="NAME">%s</xliff:g> rodomi virš kitų programų."</string> <string name="alert_windows_notification_message" msgid="8917232109522912560">"Jei nenorite, kad <xliff:g id="NAME">%s</xliff:g> naudotų šią funkciją, palietę atidarykite nustatymus ir išjunkite ją."</string> <string name="alert_windows_notification_turn_off_action" msgid="3367294525884949878">"IŠJUNGTI"</string> diff --git a/core/res/res/values-lv/strings.xml b/core/res/res/values-lv/strings.xml index b71a22029bf3..6ca2131539e1 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"> @@ -1227,7 +1226,7 @@ <string name="select_keyboard_layout_notification_message" msgid="8084622969903004900">"Pieskarieties, lai atlasītu valodu un izkārtojumu"</string> <string name="fast_scroll_alphabet" msgid="5433275485499039199">" AĀBCČDEĒFGĢHIĪJKĶLĻMNŅOPRSŠTUŪVZŽ"</string> <string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789AĀBCČDEĒFGĢHIĪJKĶLĻMNŅOPRSŠTUŪVZŽ"</string> - <string name="alert_windows_notification_channel_name" msgid="3116610965549449803">"Lietotne <xliff:g id="NAME">%s</xliff:g> tiek rādīta pāri citām lietotnēm"</string> + <string name="alert_windows_notification_channel_name" msgid="7684862527629252655">"Darbības lietotnēs"</string> <string name="alert_windows_notification_title" msgid="3697657294867638947">"Lietotne <xliff:g id="NAME">%s</xliff:g> pāri citām lietotnēm"</string> <string name="alert_windows_notification_message" msgid="8917232109522912560">"Ja nevēlaties lietotnē <xliff:g id="NAME">%s</xliff:g> izmantot šo funkciju, pieskarieties, lai atvērtu iestatījumus un to izslēgtu."</string> <string name="alert_windows_notification_turn_off_action" msgid="3367294525884949878">"IZSLĒGT"</string> diff --git a/core/res/res/values-mk/strings.xml b/core/res/res/values-mk/strings.xml index febacb26b61b..fd333d6d9752 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"> @@ -1206,7 +1205,7 @@ <string name="select_keyboard_layout_notification_message" msgid="8084622969903004900">"Допрете за избирање јазик и распоред"</string> <string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string> <string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string> - <string name="alert_windows_notification_channel_name" msgid="3116610965549449803">"<xliff:g id="NAME">%s</xliff:g> се прикажува врз други апликации"</string> + <string name="alert_windows_notification_channel_name" msgid="7684862527629252655">"Активност на апликациите"</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_turn_off_action" msgid="3367294525884949878">"ИСКЛУЧИ"</string> diff --git a/core/res/res/values-ml/strings.xml b/core/res/res/values-ml/strings.xml index 03e21aab85e9..46b38ad3cbdd 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"> @@ -1207,7 +1205,8 @@ <string name="select_keyboard_layout_notification_message" msgid="8084622969903004900">"ഭാഷയും ലേഔട്ടും തിരഞ്ഞെടുക്കുന്നതിന് ടാപ്പുചെയ്യുക"</string> <string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string> <string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string> - <string name="alert_windows_notification_channel_name" msgid="3116610965549449803">"<xliff:g id="NAME">%s</xliff:g> മറ്റ് ആപ്പുകൾക്ക് മുകളിൽ പ്രദർശിപ്പിക്കുന്നു"</string> + <!-- no translation found for alert_windows_notification_channel_name (7684862527629252655) --> + <skip /> <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_turn_off_action" msgid="3367294525884949878">"ഓഫാക്കുക"</string> diff --git a/core/res/res/values-mn/strings.xml b/core/res/res/values-mn/strings.xml index 7a8e82120623..5e7f70e97d98 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"> @@ -1205,7 +1204,7 @@ <string name="select_keyboard_layout_notification_message" msgid="8084622969903004900">"Хэл болон бүдүүвчийг сонгохын тулд дарна уу"</string> <string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string> <string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string> - <string name="alert_windows_notification_channel_name" msgid="3116610965549449803">"Бусад апп дээгүүр <xliff:g id="NAME">%s</xliff:g>-г харуулж байна"</string> + <string name="alert_windows_notification_channel_name" msgid="7684862527629252655">"Аппын үйл ажиллагаа"</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_turn_off_action" msgid="3367294525884949878">"УНТРААХ"</string> diff --git a/core/res/res/values-mr/strings.xml b/core/res/res/values-mr/strings.xml index d44f90033b91..849c6beae439 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"> @@ -1206,7 +1205,7 @@ <string name="select_keyboard_layout_notification_message" msgid="8084622969903004900">"भाषा आणि लेआउट निवडण्यासाठी टॅप करा"</string> <string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string> <string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string> - <string name="alert_windows_notification_channel_name" msgid="3116610965549449803">"<xliff:g id="NAME">%s</xliff:g> इतर अॅप्सवर प्रदर्शित करीत आहे"</string> + <string name="alert_windows_notification_channel_name" msgid="7684862527629252655">"अॅप क्रियाकलाप"</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_turn_off_action" msgid="3367294525884949878">"बंद करा"</string> diff --git a/core/res/res/values-ms/strings.xml b/core/res/res/values-ms/strings.xml index 4f0f55754908..e3c5e88b2ca3 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"> @@ -1206,7 +1204,7 @@ <string name="select_keyboard_layout_notification_message" msgid="8084622969903004900">"Ketik untuk memilih bahasa dan susun atur"</string> <string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string> <string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string> - <string name="alert_windows_notification_channel_name" msgid="3116610965549449803">"<xliff:g id="NAME">%s</xliff:g> dipaparkan di atas apl lain"</string> + <string name="alert_windows_notification_channel_name" msgid="7684862527629252655">"Aktiviti apl"</string> <string name="alert_windows_notification_title" msgid="3697657294867638947">"<xliff:g id="NAME">%s</xliff:g> dipaparkan di atas apl lain"</string> <string name="alert_windows_notification_message" msgid="8917232109522912560">"Jika anda tidak mahu <xliff:g id="NAME">%s</xliff:g> menggunakan ciri ini, ketik untuk membuka tetapan dan matikannya."</string> <string name="alert_windows_notification_turn_off_action" msgid="3367294525884949878">"MATIKAN"</string> diff --git a/core/res/res/values-my/strings.xml b/core/res/res/values-my/strings.xml index f801df5e0a1c..88b812bcb660 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"> @@ -1206,7 +1205,7 @@ <string name="select_keyboard_layout_notification_message" msgid="8084622969903004900">"ဘာသာစကားနှင့် အသွင်အပြင်ရွေးချယ်ရန် တို့ပါ"</string> <string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string> <string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string> - <string name="alert_windows_notification_channel_name" msgid="3116610965549449803">"<xliff:g id="NAME">%s</xliff:g> သည် အခြားအက်ပ်များအပေါ်တွင် ပြပါသည်"</string> + <string name="alert_windows_notification_channel_name" msgid="7684862527629252655">"အက်ပ်လုပ်ဆောင်ချက်"</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_turn_off_action" msgid="3367294525884949878">"ပိတ်ပါ"</string> diff --git a/core/res/res/values-nb/strings.xml b/core/res/res/values-nb/strings.xml index f9b73e0e2913..e804b074c311 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"> @@ -1206,7 +1204,7 @@ <string name="select_keyboard_layout_notification_message" msgid="8084622969903004900">"Trykk for å velge språk og layout"</string> <string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSTUVWXYZÆØÅ"</string> <string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZÆØÅ"</string> - <string name="alert_windows_notification_channel_name" msgid="3116610965549449803">"<xliff:g id="NAME">%s</xliff:g> vises over andre apper"</string> + <string name="alert_windows_notification_channel_name" msgid="7684862527629252655">"Appaktivitet"</string> <string name="alert_windows_notification_title" msgid="3697657294867638947">"<xliff:g id="NAME">%s</xliff:g> vises over andre apper"</string> <string name="alert_windows_notification_message" msgid="8917232109522912560">"Hvis du ikke vil at <xliff:g id="NAME">%s</xliff:g> skal bruke denne funksjonen, kan du trykke for å åpne innstillingene og slå den av."</string> <string name="alert_windows_notification_turn_off_action" msgid="3367294525884949878">"SLÅ AV"</string> diff --git a/core/res/res/values-ne/strings.xml b/core/res/res/values-ne/strings.xml index 30c6e8cc269a..c97113346b0c 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"> @@ -1212,7 +1210,7 @@ <string name="select_keyboard_layout_notification_message" msgid="8084622969903004900">"भाषा र लेआउट चयन गर्न ट्याप गर्नुहोस्"</string> <string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string> <string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string> - <string name="alert_windows_notification_channel_name" msgid="3116610965549449803">"<xliff:g id="NAME">%s</xliff:g> अन्य अनुप्रयोगहरूमा देखिँदैछ"</string> + <string name="alert_windows_notification_channel_name" msgid="7684862527629252655">"अनुप्रयोगको गतिविधि"</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_turn_off_action" msgid="3367294525884949878">"निष्क्रिय पार्नुहोस्"</string> diff --git a/core/res/res/values-nl/strings.xml b/core/res/res/values-nl/strings.xml index f10245134746..b34c4d0d9635 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"> @@ -1205,7 +1204,7 @@ <string name="select_keyboard_layout_notification_message" msgid="8084622969903004900">"Tik om een taal en indeling te selecteren"</string> <string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string> <string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string> - <string name="alert_windows_notification_channel_name" msgid="3116610965549449803">"<xliff:g id="NAME">%s</xliff:g> wordt weergegeven over andere apps"</string> + <string name="alert_windows_notification_channel_name" msgid="7684862527629252655">"App-activiteit"</string> <string name="alert_windows_notification_title" msgid="3697657294867638947">"<xliff:g id="NAME">%s</xliff:g> wordt weergegeven over apps"</string> <string name="alert_windows_notification_message" msgid="8917232109522912560">"Als je niet wilt dat <xliff:g id="NAME">%s</xliff:g> deze functie gebruikt, tik je om de instellingen te openen en schakel je de functie uit."</string> <string name="alert_windows_notification_turn_off_action" msgid="3367294525884949878">"UITSCHAKELEN"</string> @@ -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 4a4bb627991c..d5c5d9c567fd 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"> @@ -1207,7 +1205,8 @@ <string name="select_keyboard_layout_notification_message" msgid="8084622969903004900">"ਭਾਸ਼ਾ ਅਤੇ ਖਾਕਾ ਚੁਣਨ ਲਈ ਟੈਪ ਕਰੋ"</string> <string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string> <string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string> - <string name="alert_windows_notification_channel_name" msgid="3116610965549449803">"<xliff:g id="NAME">%s</xliff:g> ਐਪ ਹੋਰ ਐਪਾਂ ਦੇ ਉੱਤੇ ਹੈ"</string> + <!-- no translation found for alert_windows_notification_channel_name (7684862527629252655) --> + <skip /> <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_turn_off_action" msgid="3367294525884949878">"ਬੰਦ ਕਰੋ"</string> diff --git a/core/res/res/values-pl/strings.xml b/core/res/res/values-pl/strings.xml index 72cc52a48b2a..c1ef118931e0 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"> @@ -1249,7 +1248,7 @@ <string name="select_keyboard_layout_notification_message" msgid="8084622969903004900">"Kliknij, by wybrać język i układ"</string> <string name="fast_scroll_alphabet" msgid="5433275485499039199">" AĄBCĆDEĘFGHIJKLŁMNŃOÓPQRSŚTUVWXYZŹŻ"</string> <string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string> - <string name="alert_windows_notification_channel_name" msgid="3116610965549449803">"Wyświetlanie aplikacji <xliff:g id="NAME">%s</xliff:g> nad innymi"</string> + <string name="alert_windows_notification_channel_name" msgid="7684862527629252655">"Aktywność w aplikacjach"</string> <string name="alert_windows_notification_title" msgid="3697657294867638947">"Aplikacja <xliff:g id="NAME">%s</xliff:g> jest nad innymi"</string> <string name="alert_windows_notification_message" msgid="8917232109522912560">"Jeśli nie chcesz, by aplikacja <xliff:g id="NAME">%s</xliff:g> korzystała z tej funkcji, otwórz ustawienia i ją wyłącz."</string> <string name="alert_windows_notification_turn_off_action" msgid="3367294525884949878">"WYŁĄCZ"</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 7157dabcafa3..99a67d918c59 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"> @@ -1206,7 +1204,7 @@ <string name="select_keyboard_layout_notification_message" msgid="8084622969903004900">"Toque para selecionar o idioma e o layout"</string> <string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string> <string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string> - <string name="alert_windows_notification_channel_name" msgid="3116610965549449803">"<xliff:g id="NAME">%s</xliff:g> exibido sobre outros apps"</string> + <string name="alert_windows_notification_channel_name" msgid="7684862527629252655">"Atividade de apps"</string> <string name="alert_windows_notification_title" msgid="3697657294867638947">"<xliff:g id="NAME">%s</xliff:g> exibido sobre outros apps."</string> <string name="alert_windows_notification_message" msgid="8917232109522912560">"Se você não deseja que o <xliff:g id="NAME">%s</xliff:g> use este recurso, toque para abrir as configurações e desativá-lo."</string> <string name="alert_windows_notification_turn_off_action" msgid="3367294525884949878">"DESATIVAR"</string> diff --git a/core/res/res/values-pt-rPT/strings.xml b/core/res/res/values-pt-rPT/strings.xml index 026a866a4597..a151733ff702 100644 --- a/core/res/res/values-pt-rPT/strings.xml +++ b/core/res/res/values-pt-rPT/strings.xml @@ -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"> @@ -1205,7 +1204,7 @@ <string name="select_keyboard_layout_notification_message" msgid="8084622969903004900">"Toque para selecionar o idioma e o esquema"</string> <string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string> <string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string> - <string name="alert_windows_notification_channel_name" msgid="3116610965549449803">"A aplicação <xliff:g id="NAME">%s</xliff:g> sobrepõe-se a outras aplicações"</string> + <string name="alert_windows_notification_channel_name" msgid="7684862527629252655">"Atividade de aplicações"</string> <string name="alert_windows_notification_title" msgid="3697657294867638947">"O <xliff:g id="NAME">%s</xliff:g> sobrepõe-se a outras aplic."</string> <string name="alert_windows_notification_message" msgid="8917232109522912560">"Se não pretende que a aplicação <xliff:g id="NAME">%s</xliff:g> utilize esta funcionalidade, toque para abrir as definições e desative-a."</string> <string name="alert_windows_notification_turn_off_action" msgid="3367294525884949878">"DESATIVAR"</string> diff --git a/core/res/res/values-pt/strings.xml b/core/res/res/values-pt/strings.xml index 7157dabcafa3..99a67d918c59 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"> @@ -1206,7 +1204,7 @@ <string name="select_keyboard_layout_notification_message" msgid="8084622969903004900">"Toque para selecionar o idioma e o layout"</string> <string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string> <string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string> - <string name="alert_windows_notification_channel_name" msgid="3116610965549449803">"<xliff:g id="NAME">%s</xliff:g> exibido sobre outros apps"</string> + <string name="alert_windows_notification_channel_name" msgid="7684862527629252655">"Atividade de apps"</string> <string name="alert_windows_notification_title" msgid="3697657294867638947">"<xliff:g id="NAME">%s</xliff:g> exibido sobre outros apps."</string> <string name="alert_windows_notification_message" msgid="8917232109522912560">"Se você não deseja que o <xliff:g id="NAME">%s</xliff:g> use este recurso, toque para abrir as configurações e desativá-lo."</string> <string name="alert_windows_notification_turn_off_action" msgid="3367294525884949878">"DESATIVAR"</string> diff --git a/core/res/res/values-ro/strings.xml b/core/res/res/values-ro/strings.xml index 1a3e0c574e41..6420a32034f5 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"> @@ -1227,7 +1226,7 @@ <string name="select_keyboard_layout_notification_message" msgid="8084622969903004900">"Atingeți pentru a selecta limba și aspectul"</string> <string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string> <string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string> - <string name="alert_windows_notification_channel_name" msgid="3116610965549449803">"<xliff:g id="NAME">%s</xliff:g> se afișează peste alte aplicații"</string> + <string name="alert_windows_notification_channel_name" msgid="7684862527629252655">"Activitate din aplicații"</string> <string name="alert_windows_notification_title" msgid="3697657294867638947">"<xliff:g id="NAME">%s</xliff:g> se afișează peste aplicații"</string> <string name="alert_windows_notification_message" msgid="8917232109522912560">"Dacă nu doriți ca <xliff:g id="NAME">%s</xliff:g> să utilizeze această funcție, atingeți pentru a deschide setările și dezactivați-o."</string> <string name="alert_windows_notification_turn_off_action" msgid="3367294525884949878">"DEZACTIVAȚI"</string> diff --git a/core/res/res/values-ru/strings.xml b/core/res/res/values-ru/strings.xml index ab91c0a7fc7f..ca0eded18ace 100644 --- a/core/res/res/values-ru/strings.xml +++ b/core/res/res/values-ru/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"> @@ -1249,7 +1248,7 @@ <string name="select_keyboard_layout_notification_message" msgid="8084622969903004900">"Нажмите, чтобы выбрать язык и раскладку"</string> <string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string> <string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string> - <string name="alert_windows_notification_channel_name" msgid="3116610965549449803">"<xliff:g id="NAME">%s</xliff:g>: поверх других приложений"</string> + <string name="alert_windows_notification_channel_name" msgid="7684862527629252655">"История приложений"</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_turn_off_action" msgid="3367294525884949878">"ОТКЛЮЧИТЬ"</string> diff --git a/core/res/res/values-si/strings.xml b/core/res/res/values-si/strings.xml index 71466bcbf772..c35e85211ef1 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"> @@ -1207,7 +1206,7 @@ <string name="select_keyboard_layout_notification_message" msgid="8084622969903004900">"භාෂාව හා පිරිසැලසුම තේරීමට තට්ටු කරන්න"</string> <string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string> <string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string> - <string name="alert_windows_notification_channel_name" msgid="3116610965549449803">"අනෙක් යෙදුම්වලට උඩින් <xliff:g id="NAME">%s</xliff:g> සංදර්ශනය කරමින්"</string> + <string name="alert_windows_notification_channel_name" msgid="7684862527629252655">"යෙදුම් ක්රියාකාරකම"</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_turn_off_action" msgid="3367294525884949878">"ක්රියා විරහිත කරන්න"</string> diff --git a/core/res/res/values-sk/strings.xml b/core/res/res/values-sk/strings.xml index 08efcd94f7ca..37f50b5ac69a 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"> @@ -1250,7 +1248,7 @@ <string name="select_keyboard_layout_notification_message" msgid="8084622969903004900">"Klepnutím vyberte jazyk a rozloženie"</string> <string name="fast_scroll_alphabet" msgid="5433275485499039199">" AÁÄBCČDĎDZDŽEÉFGHCHIÍJKLĽMNŇOÓÔPRŔSŠTŤUÚVWXYÝZŽ"</string> <string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string> - <string name="alert_windows_notification_channel_name" msgid="3116610965549449803">"<xliff:g id="NAME">%s</xliff:g> sa zobrazuje cez iné aplikácie"</string> + <string name="alert_windows_notification_channel_name" msgid="7684862527629252655">"Aktivita v aplikáciách"</string> <string name="alert_windows_notification_title" msgid="3697657294867638947">"<xliff:g id="NAME">%s</xliff:g> sa zobrazuje cez iné aplikácie"</string> <string name="alert_windows_notification_message" msgid="8917232109522912560">"Ak nechcete, aby aplikácia <xliff:g id="NAME">%s</xliff:g> používala túto funkciu, klepnutím otvorte nastavenia a vypnite ju."</string> <string name="alert_windows_notification_turn_off_action" msgid="3367294525884949878">"VYPNÚŤ"</string> diff --git a/core/res/res/values-sl/strings.xml b/core/res/res/values-sl/strings.xml index 9aa39e91971d..b47ad167c2f7 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"> @@ -1249,7 +1248,7 @@ <string name="select_keyboard_layout_notification_message" msgid="8084622969903004900">"Dotaknite se, če želite izbrati jezik in postavitev."</string> <string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string> <string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string> - <string name="alert_windows_notification_channel_name" msgid="3116610965549449803">"<xliff:g id="NAME">%s</xliff:g> prekriva druge aplikacije"</string> + <string name="alert_windows_notification_channel_name" msgid="7684862527629252655">"Dejavnost v aplikacijah"</string> <string name="alert_windows_notification_title" msgid="3697657294867638947">"<xliff:g id="NAME">%s</xliff:g> prekriva druge aplikacije"</string> <string name="alert_windows_notification_message" msgid="8917232109522912560">"Če ne želite, da aplikacija <xliff:g id="NAME">%s</xliff:g> uporablja to funkcijo, se dotaknite, da odprete nastavitve, in funkcijo izklopite."</string> <string name="alert_windows_notification_turn_off_action" msgid="3367294525884949878">"IZKLOP"</string> diff --git a/core/res/res/values-sq/strings.xml b/core/res/res/values-sq/strings.xml index b9b8e98f24f3..b82ae9618580 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"> @@ -1206,7 +1205,7 @@ <string name="select_keyboard_layout_notification_message" msgid="8084622969903004900">"Trokit për të zgjedhur gjuhën dhe strukturën"</string> <string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string> <string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string> - <string name="alert_windows_notification_channel_name" msgid="3116610965549449803">"<xliff:g id="NAME">%s</xliff:g> afishohet mbi aplikacionet e tjera"</string> + <string name="alert_windows_notification_channel_name" msgid="7684862527629252655">"Aktiviteti i aplikacionit"</string> <string name="alert_windows_notification_title" msgid="3697657294867638947">"<xliff:g id="NAME">%s</xliff:g> shfaqet mbi apl. e tjera"</string> <string name="alert_windows_notification_message" msgid="8917232109522912560">"Nëse nuk dëshiron që <xliff:g id="NAME">%s</xliff:g> ta përdorë këtë funksion, trokit për të hapur cilësimet dhe për ta çaktivizuar."</string> <string name="alert_windows_notification_turn_off_action" msgid="3367294525884949878">"ÇAKTIVIZO"</string> diff --git a/core/res/res/values-sr/strings.xml b/core/res/res/values-sr/strings.xml index b85df9f2ef7b..7854a917ff3d 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"> @@ -1227,7 +1226,7 @@ <string name="select_keyboard_layout_notification_message" msgid="8084622969903004900">"Додирните да бисте изабрали језик и распоред"</string> <string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string> <string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string> - <string name="alert_windows_notification_channel_name" msgid="3116610965549449803">"Апликација <xliff:g id="NAME">%s</xliff:g> се приказује преко других апликација"</string> + <string name="alert_windows_notification_channel_name" msgid="7684862527629252655">"Активности у апликацијама"</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_turn_off_action" msgid="3367294525884949878">"ИСКЉУЧИ"</string> @@ -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 c6865a168311..c7fec34df0b0 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"> @@ -1206,7 +1204,7 @@ <string name="select_keyboard_layout_notification_message" msgid="8084622969903004900">"Tryck om du vill välja språk och layout"</string> <string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string> <string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string> - <string name="alert_windows_notification_channel_name" msgid="3116610965549449803">"<xliff:g id="NAME">%s</xliff:g> visas över andra appar"</string> + <string name="alert_windows_notification_channel_name" msgid="7684862527629252655">"Appaktivitet"</string> <string name="alert_windows_notification_title" msgid="3697657294867638947">"<xliff:g id="NAME">%s</xliff:g> visas över andra appar"</string> <string name="alert_windows_notification_message" msgid="8917232109522912560">"Om du inte vill att den här funktionen används för <xliff:g id="NAME">%s</xliff:g> öppnar du inställningarna genom att trycka. Sedan inaktiverar du funktionen."</string> <string name="alert_windows_notification_turn_off_action" msgid="3367294525884949878">"INAKTIVERA"</string> diff --git a/core/res/res/values-sw/strings.xml b/core/res/res/values-sw/strings.xml index 55da8d9069c8..6ec9c9f35c07 100644 --- a/core/res/res/values-sw/strings.xml +++ b/core/res/res/values-sw/strings.xml @@ -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"> @@ -1203,7 +1202,7 @@ <string name="select_keyboard_layout_notification_message" msgid="8084622969903004900">"Gonga ili uchague lugha na muundo"</string> <string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string> <string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string> - <string name="alert_windows_notification_channel_name" msgid="3116610965549449803">"<xliff:g id="NAME">%s</xliff:g> inachomoza juu ya programu zingine"</string> + <string name="alert_windows_notification_channel_name" msgid="7684862527629252655">"Shughuli za programu"</string> <string name="alert_windows_notification_title" msgid="3697657294867638947">"<xliff:g id="NAME">%s</xliff:g> inachomoza juu ya programu zingine."</string> <string name="alert_windows_notification_message" msgid="8917232109522912560">"Ikiwa hutaki <xliff:g id="NAME">%s</xliff:g> kutumia kipengele hiki, gonga ili ufungue mipangilio na ukizime."</string> <string name="alert_windows_notification_turn_off_action" msgid="3367294525884949878">"ZIMA"</string> diff --git a/core/res/res/values-ta/strings.xml b/core/res/res/values-ta/strings.xml index 6cbfba53b3e5..32a1e839dcb3 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"> @@ -1206,7 +1205,7 @@ <string name="select_keyboard_layout_notification_message" msgid="8084622969903004900">"மொழியையும் தளவமைப்பையும் தேர்ந்தெடுக்க, தட்டவும்"</string> <string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string> <string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string> - <string name="alert_windows_notification_channel_name" msgid="3116610965549449803">"<xliff:g id="NAME">%s</xliff:g> பிற பயன்பாடுகளின் மீது தோன்றுகிறது"</string> + <string name="alert_windows_notification_channel_name" msgid="7684862527629252655">"பயன்பாட்டுச் செயல்பாடு"</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_turn_off_action" msgid="3367294525884949878">"முடக்கு"</string> diff --git a/core/res/res/values-te/strings.xml b/core/res/res/values-te/strings.xml index b3e5e4a3b97a..10b53856fa88 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"> @@ -1207,7 +1205,8 @@ <string name="select_keyboard_layout_notification_message" msgid="8084622969903004900">"భాష మరియు లేఅవుట్ను ఎంచుకోవడానికి నొక్కండి"</string> <string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string> <string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string> - <string name="alert_windows_notification_channel_name" msgid="3116610965549449803">"<xliff:g id="NAME">%s</xliff:g> ఇతర అనువర్తనాలలో చూపబడుతోంది"</string> + <!-- no translation found for alert_windows_notification_channel_name (7684862527629252655) --> + <skip /> <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_turn_off_action" msgid="3367294525884949878">"ఆఫ్ చేయి"</string> diff --git a/core/res/res/values-th/strings.xml b/core/res/res/values-th/strings.xml index c2ae15e87111..6ae45b2c9e9f 100644 --- a/core/res/res/values-th/strings.xml +++ b/core/res/res/values-th/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"> @@ -1205,7 +1204,7 @@ <string name="select_keyboard_layout_notification_message" msgid="8084622969903004900">"แตะเพื่อเลือกภาษาและรูปแบบ"</string> <string name="fast_scroll_alphabet" msgid="5433275485499039199">" กขฃคฅฆงจฉชซฌญฎฏฐฑฒณดตถทธนบปผฝพฟภมยรลวศษสหฬอฮ"</string> <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_channel_name" msgid="7684862527629252655">"กิจกรรมแอป"</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_turn_off_action" msgid="3367294525884949878">"ปิด"</string> diff --git a/core/res/res/values-tl/strings.xml b/core/res/res/values-tl/strings.xml index 2ef0c7ae01a4..b4cf33a1eb5a 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"> @@ -1205,7 +1204,7 @@ <string name="select_keyboard_layout_notification_message" msgid="8084622969903004900">"I-tap upang pumili ng wika at layout"</string> <string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string> <string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string> - <string name="alert_windows_notification_channel_name" msgid="3116610965549449803">"Ipinapakita sa itaas ng iba pang app ang <xliff:g id="NAME">%s</xliff:g>."</string> + <string name="alert_windows_notification_channel_name" msgid="7684862527629252655">"Aktibidad sa app"</string> <string name="alert_windows_notification_title" msgid="3697657294867638947">"Nasa ibabaw ng ibang app ang <xliff:g id="NAME">%s</xliff:g>"</string> <string name="alert_windows_notification_message" msgid="8917232109522912560">"Kung ayaw mong gamitin ng <xliff:g id="NAME">%s</xliff:g> ang feature na ito, i-tap upang buksan ang mga setting at i-off ito."</string> <string name="alert_windows_notification_turn_off_action" msgid="3367294525884949878">"I-OFF"</string> diff --git a/core/res/res/values-tr/strings.xml b/core/res/res/values-tr/strings.xml index c3b2001ce515..f833c4e8f76c 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"> @@ -1206,7 +1204,7 @@ <string name="select_keyboard_layout_notification_message" msgid="8084622969903004900">"Dili ve düzeni seçmek için dokunun"</string> <string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string> <string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string> - <string name="alert_windows_notification_channel_name" msgid="3116610965549449803">"<xliff:g id="NAME">%s</xliff:g>, diğer uygulamaların üzerinde görüntüleniyor"</string> + <string name="alert_windows_notification_channel_name" msgid="7684862527629252655">"Uygulama etkinliği"</string> <string name="alert_windows_notification_title" msgid="3697657294867638947">"<xliff:g id="NAME">%s</xliff:g>, diğer uygulamaların üzerinde gösteriliyor"</string> <string name="alert_windows_notification_message" msgid="8917232109522912560">"<xliff:g id="NAME">%s</xliff:g> uygulamasının bu özelliği kullanmasını istemiyorsanız dokunarak ayarları açın ve özelliği kapatın."</string> <string name="alert_windows_notification_turn_off_action" msgid="3367294525884949878">"KAPAT"</string> diff --git a/core/res/res/values-uk/strings.xml b/core/res/res/values-uk/strings.xml index a5a289cbfe1b..fe0efb48109c 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"> @@ -1249,7 +1248,7 @@ <string name="select_keyboard_layout_notification_message" msgid="8084622969903004900">"Торкніться, щоб вибрати мову та розкладку"</string> <string name="fast_scroll_alphabet" msgid="5433275485499039199">" АБВГҐДЕЄЖЗИІЇЙКЛМНОПРСТУФХЦЧШЩЬЮЯ"</string> <string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789АБВГҐДЕЄЖЗИІЇЙКЛМНОПРСТУФХЦЧШЩЬЮЯ"</string> - <string name="alert_windows_notification_channel_name" msgid="3116610965549449803">"Додаток <xliff:g id="NAME">%s</xliff:g> відображається поверх інших додатків"</string> + <string name="alert_windows_notification_channel_name" msgid="7684862527629252655">"Активність додатків"</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_turn_off_action" msgid="3367294525884949878">"ВИМКНУТИ"</string> diff --git a/core/res/res/values-ur/strings.xml b/core/res/res/values-ur/strings.xml index c16c0c6f3fa8..3e8c2b35adee 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"> @@ -1207,7 +1205,7 @@ <string name="select_keyboard_layout_notification_message" msgid="8084622969903004900">"زبان اور لے آؤٹ منتخب کرنے کیلئے تھپتھپائیں"</string> <string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string> <string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string> - <string name="alert_windows_notification_channel_name" msgid="3116610965549449803">"<xliff:g id="NAME">%s</xliff:g> کو دیگر ایپس پر دکھایا کیا جا رہا ہے"</string> + <string name="alert_windows_notification_channel_name" msgid="7684862527629252655">"ایپ کی سرگرمی"</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_turn_off_action" msgid="3367294525884949878">"آف کریں"</string> diff --git a/core/res/res/values-uz/strings.xml b/core/res/res/values-uz/strings.xml index b2ea94537859..812338dbf2d6 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"> @@ -1206,7 +1205,7 @@ <string name="select_keyboard_layout_notification_message" msgid="8084622969903004900">"Til va sxemani belgilash uchun bosing"</string> <string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string> <string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string> - <string name="alert_windows_notification_channel_name" msgid="3116610965549449803">"<xliff:g id="NAME">%s</xliff:g> boshqa ilovalar ustidan ochilgan"</string> + <string name="alert_windows_notification_channel_name" msgid="7684862527629252655">"Ilova tarixi"</string> <string name="alert_windows_notification_title" msgid="3697657294867638947">"<xliff:g id="NAME">%s</xliff:g> boshqa ilovalar ustidan ochilgan"</string> <string name="alert_windows_notification_message" msgid="8917232109522912560">"<xliff:g id="NAME">%s</xliff:g> ilovasi uchun bu funksiyani sozlamalar orqali o‘chirib qo‘yish mumkin."</string> <string name="alert_windows_notification_turn_off_action" msgid="3367294525884949878">"O‘CHIRIB QO‘YISH"</string> diff --git a/core/res/res/values-vi/strings.xml b/core/res/res/values-vi/strings.xml index 504ef5fae40d..ec777b5e0899 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"> @@ -1205,7 +1204,7 @@ <string name="select_keyboard_layout_notification_message" msgid="8084622969903004900">"Nhấn để chọn ngôn ngữ và bố cục"</string> <string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string> <string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string> - <string name="alert_windows_notification_channel_name" msgid="3116610965549449803">"<xliff:g id="NAME">%s</xliff:g> hiển thị trên các ứng dụng khác"</string> + <string name="alert_windows_notification_channel_name" msgid="7684862527629252655">"Hoạt động ứng dụng"</string> <string name="alert_windows_notification_title" msgid="3697657294867638947">"<xliff:g id="NAME">%s</xliff:g> hiển thị trên ứng dụng khác"</string> <string name="alert_windows_notification_message" msgid="8917232109522912560">"Nếu bạn không muốn <xliff:g id="NAME">%s</xliff:g> sử dụng tính năng này, hãy nhấn để mở cài đặt và tắt tính năng này."</string> <string name="alert_windows_notification_turn_off_action" msgid="3367294525884949878">"TẮT"</string> diff --git a/core/res/res/values-zh-rCN/strings.xml b/core/res/res/values-zh-rCN/strings.xml index d195de8b5865..24f86b3cda73 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> @@ -1206,7 +1204,7 @@ <string name="select_keyboard_layout_notification_message" msgid="8084622969903004900">"点按即可选择语言和布局"</string> <string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string> <string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string> - <string name="alert_windows_notification_channel_name" msgid="3116610965549449803">"<xliff:g id="NAME">%s</xliff:g>正在其他应用的上层显示内容"</string> + <string name="alert_windows_notification_channel_name" msgid="7684862527629252655">"应用活动"</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_turn_off_action" msgid="3367294525884949878">"关闭"</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 4eed27c5be9f..6a1039db2761 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"> @@ -1206,7 +1204,7 @@ <string name="select_keyboard_layout_notification_message" msgid="8084622969903004900">"輕按即可選取語言和鍵盤配置"</string> <string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string> <string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string> - <string name="alert_windows_notification_channel_name" msgid="3116610965549449803">"「<xliff:g id="NAME">%s</xliff:g>」目前可顯示在其他應用程式上面"</string> + <string name="alert_windows_notification_channel_name" msgid="7684862527629252655">"應用程式活動"</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_turn_off_action" msgid="3367294525884949878">"關閉"</string> diff --git a/core/res/res/values-zh-rTW/strings.xml b/core/res/res/values-zh-rTW/strings.xml index 0c4ffad1ed77..35185a0fe923 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"> @@ -1206,7 +1204,7 @@ <string name="select_keyboard_layout_notification_message" msgid="8084622969903004900">"輕觸即可選取語言和版面配置"</string> <string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string> <string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string> - <string name="alert_windows_notification_channel_name" msgid="3116610965549449803">"「<xliff:g id="NAME">%s</xliff:g>」在其他應用程式上顯示內容"</string> + <string name="alert_windows_notification_channel_name" msgid="7684862527629252655">"應用程式活動"</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_turn_off_action" msgid="3367294525884949878">"關閉"</string> diff --git a/core/res/res/values-zu/strings.xml b/core/res/res/values-zu/strings.xml index 2ce9696e1da0..aefe4bea8dad 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"> @@ -1205,7 +1204,7 @@ <string name="select_keyboard_layout_notification_message" msgid="8084622969903004900">"Thepha ukuze ukhethe ulimi nesakhiwo"</string> <string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string> <string name="fast_scroll_numeric_alphabet" msgid="4030170524595123610">" 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string> - <string name="alert_windows_notification_channel_name" msgid="3116610965549449803">"<xliff:g id="NAME">%s</xliff:g> ukubonisa ngaphezu kwezinye izinhlelo zokusebenza"</string> + <string name="alert_windows_notification_channel_name" msgid="7684862527629252655">"Umsebenzi wohlelo lokusebenza"</string> <string name="alert_windows_notification_title" msgid="3697657294867638947">"<xliff:g id="NAME">%s</xliff:g> ibonisa ngaphezu kwezinye izinhlelo zokusebenza"</string> <string name="alert_windows_notification_message" msgid="8917232109522912560">"Uma ungafuni ukuthi i-<xliff:g id="NAME">%s</xliff:g> isebenzise lesi sici, thepha ukuze uvule izilungiselelo bese usivale."</string> <string name="alert_windows_notification_turn_off_action" msgid="3367294525884949878">"VALA"</string> diff --git a/core/tests/coretests/src/com/android/internal/os/KernelUidCpuFreqTimeReaderTest.java b/core/tests/coretests/src/com/android/internal/os/KernelUidCpuFreqTimeReaderTest.java index ad8221b470ae..620acaecd010 100644 --- a/core/tests/coretests/src/com/android/internal/os/KernelUidCpuFreqTimeReaderTest.java +++ b/core/tests/coretests/src/com/android/internal/os/KernelUidCpuFreqTimeReaderTest.java @@ -18,6 +18,7 @@ package com.android.internal.os; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.verifyNoMoreInteractions; +import static org.mockito.Mockito.verifyZeroInteractions; import static org.mockito.Mockito.when; import android.support.test.filters.SmallTest; @@ -27,6 +28,7 @@ import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.Mock; +import org.mockito.Mockito; import org.mockito.MockitoAnnotations; import java.io.BufferedReader; @@ -70,18 +72,70 @@ public class KernelUidCpuFreqTimeReaderTest { times[i][j] = uids[i] * freqs[j] * 10; } } - final String[] uidsTimesLines = getUidTimesLines(uids, times); - final String[] lines = new String[uidsTimesLines.length + 1]; - System.arraycopy(uidsTimesLines, 0, lines, 0, uidsTimesLines.length); - lines[uidsTimesLines.length] = null; when(mBufferedReader.readLine()) - .thenReturn(getFreqsLine(freqs), lines); + .thenReturn(getFreqsLine(freqs), getUidTimesLines(uids, times)); mKernelUidCpuFreqTimeReader.readDelta(mBufferedReader, mCallback); verify(mCallback).onCpuFreqs(freqs); for (int i = 0; i < uids.length; ++i) { verify(mCallback).onUidCpuFreqTime(uids[i], times[i]); } verifyNoMoreInteractions(mCallback); + + // Verify that a second call will only return deltas. + Mockito.reset(mCallback, mBufferedReader); + final long[][] newTimes1 = new long[uids.length][freqs.length]; + for (int i = 0; i < uids.length; ++i) { + for (int j = 0; j < freqs.length; ++j) { + newTimes1[i][j] = (times[i][j] + uids[i] + freqs[j]) * 10; + } + } + when(mBufferedReader.readLine()) + .thenReturn(getFreqsLine(freqs), getUidTimesLines(uids, newTimes1)); + mKernelUidCpuFreqTimeReader.readDelta(mBufferedReader, mCallback); + verify(mCallback).onCpuFreqs(freqs); + for (int i = 0; i < uids.length; ++i) { + verify(mCallback).onUidCpuFreqTime(uids[i], subtract(newTimes1[i], times[i])); + } + verifyNoMoreInteractions(mCallback); + + // Verify that calling with a null callback doesn't result in any crashes + Mockito.reset(mCallback, mBufferedReader); + final long[][] newTimes2 = new long[uids.length][freqs.length]; + for (int i = 0; i < uids.length; ++i) { + for (int j = 0; j < freqs.length; ++j) { + newTimes2[i][j] = (newTimes1[i][j] + uids[i] * freqs[j]) * 10; + } + } + when(mBufferedReader.readLine()) + .thenReturn(getFreqsLine(freqs), getUidTimesLines(uids, newTimes2)); + mKernelUidCpuFreqTimeReader.readDelta(mBufferedReader, null); + verifyZeroInteractions(mCallback); + + // Verify that the readDelta call will only return deltas when + // the previous call had null callback. + Mockito.reset(mCallback, mBufferedReader); + final long[][] newTimes3 = new long[uids.length][freqs.length]; + for (int i = 0; i < uids.length; ++i) { + for (int j = 0; j < freqs.length; ++j) { + newTimes3[i][j] = (newTimes2[i][j] * (uids[i] + freqs[j])) * 10; + } + } + when(mBufferedReader.readLine()) + .thenReturn(getFreqsLine(freqs), getUidTimesLines(uids, newTimes3)); + mKernelUidCpuFreqTimeReader.readDelta(mBufferedReader, mCallback); + verify(mCallback).onCpuFreqs(freqs); + for (int i = 0; i < uids.length; ++i) { + verify(mCallback).onUidCpuFreqTime(uids[i], subtract(newTimes3[i], newTimes2[i])); + } + verifyNoMoreInteractions(mCallback); + } + + private long[] subtract(long[] a1, long[] a2) { + long[] val = new long[a1.length]; + for (int i = 0; i < val.length; ++i) { + val[i] = a1[i] - a2[i]; + } + return val; } private String getFreqsLine(long[] freqs) { @@ -94,7 +148,7 @@ public class KernelUidCpuFreqTimeReaderTest { } private String[] getUidTimesLines(int[] uids, long[][] times) { - final String[] lines = new String[uids.length]; + final String[] lines = new String[uids.length + 1]; final StringBuilder sb = new StringBuilder(); for (int i = 0; i < uids.length; ++i) { sb.setLength(0); @@ -104,6 +158,7 @@ public class KernelUidCpuFreqTimeReaderTest { } lines[i] = sb.toString(); } + lines[uids.length] = null; return lines; } } diff --git a/core/tests/coretests/src/com/android/internal/os/LongSamplingCounterArrayTest.java b/core/tests/coretests/src/com/android/internal/os/LongSamplingCounterArrayTest.java new file mode 100644 index 000000000000..4a23f408e745 --- /dev/null +++ b/core/tests/coretests/src/com/android/internal/os/LongSamplingCounterArrayTest.java @@ -0,0 +1,217 @@ +/* + * 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 static android.os.BatteryStats.STATS_SINCE_CHARGED; + +import static com.android.internal.os.BatteryStatsImpl.LongSamplingCounterArray; +import static com.android.internal.os.BatteryStatsImpl.TimeBase; + +import static org.junit.Assert.assertTrue; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.verifyNoMoreInteractions; +import static org.mockito.Mockito.verifyZeroInteractions; +import static org.mockito.Mockito.when; + +import android.os.Parcel; +import android.support.test.filters.SmallTest; +import android.support.test.runner.AndroidJUnit4; + +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.Mock; +import org.mockito.Mockito; +import org.mockito.MockitoAnnotations; + +import java.util.Arrays; + +/** + * Test class for {@link BatteryStatsImpl.LongSamplingCounterArray}. + * + * To run the tests, use + * + * runtest -c com.android.internal.os.LongSamplingCounterArrayTest frameworks-core + * + * or the following steps: + * + * Build: m FrameworksCoreTests + * Install: adb install -r \ + * ${ANDROID_PRODUCT_OUT}/data/app/FrameworksCoreTests/FrameworksCoreTests.apk + * Run: adb shell am instrument -e class com.android.internal.os.LongSamplingCounterArrayTest -w \ + * com.android.frameworks.coretests/android.support.test.runner.AndroidJUnitRunner + */ +@SmallTest +@RunWith(AndroidJUnit4.class) +public class LongSamplingCounterArrayTest { + + private static final long[] COUNTS = {1111, 2222, 3333, 4444}; + private static final long[] LOADED_COUNTS = {5555, 6666, 7777, 8888}; + private static final long[] PLUGGED_COUNTS = {9999, 11111, 22222, 33333}; + private static final long[] UNPLUGGED_COUNTS = {44444, 55555, 66666, 77777}; + private static final long[] ZEROES = {0, 0, 0, 0}; + + @Mock private TimeBase mTimeBase; + private LongSamplingCounterArray mCounterArray; + + @Before + public void setUp() { + MockitoAnnotations.initMocks(this); + mCounterArray = new LongSamplingCounterArray(mTimeBase); + Mockito.reset(mTimeBase); + } + + @Test + public void testReadWriteParcel() { + final Parcel parcel = Parcel.obtain(); + initializeCounterArrayWithDefaultValues(); + LongSamplingCounterArray.writeToParcel(parcel, mCounterArray); + parcel.setDataPosition(0); + + // Now clear counterArray and verify values are read from parcel correctly. + updateCounts(null, null, null, null); + mCounterArray = LongSamplingCounterArray.readFromParcel(parcel, mTimeBase); + assertArrayEquals(COUNTS, mCounterArray.mCounts, "Unexpected counts"); + assertArrayEquals(LOADED_COUNTS, mCounterArray.mLoadedCounts, "Unexpected loadedCounts"); + assertArrayEquals(COUNTS, mCounterArray.mPluggedCounts, "Unexpected pluggedCounts"); + assertArrayEquals(UNPLUGGED_COUNTS, mCounterArray.mUnpluggedCounts, + "Unexpected unpluggedCounts"); + parcel.recycle(); + } + + @Test + public void testReadWriteSummaryParcel() { + final Parcel parcel = Parcel.obtain(); + initializeCounterArrayWithDefaultValues(); + LongSamplingCounterArray.writeSummaryToParcelLocked(parcel, mCounterArray); + parcel.setDataPosition(0); + + // Now clear counterArray and verify values are read from parcel correctly. + updateCounts(null, null, null, null); + mCounterArray = LongSamplingCounterArray.readSummaryFromParcelLocked(parcel, mTimeBase); + assertArrayEquals(COUNTS, mCounterArray.mCounts, "Unexpected counts"); + assertArrayEquals(COUNTS, mCounterArray.mLoadedCounts, "Unexpected loadedCounts"); + assertArrayEquals(COUNTS, mCounterArray.mPluggedCounts, "Unexpected pluggedCounts"); + assertArrayEquals(COUNTS, mCounterArray.mUnpluggedCounts, "Unexpected unpluggedCounts"); + parcel.recycle(); + } + + @Test + public void testOnTimeStarted() { + initializeCounterArrayWithDefaultValues(); + mCounterArray.onTimeStarted(0, 0, 0); + assertArrayEquals(PLUGGED_COUNTS, mCounterArray.mCounts, "Unexpected counts"); + assertArrayEquals(LOADED_COUNTS, mCounterArray.mLoadedCounts, "Unexpected loadedCounts"); + assertArrayEquals(PLUGGED_COUNTS, mCounterArray.mPluggedCounts, "Unexpected pluggedCounts"); + assertArrayEquals(PLUGGED_COUNTS, mCounterArray.mUnpluggedCounts, + "Unexpected unpluggedCounts"); + } + + @Test + public void testOnTimeStopped() { + initializeCounterArrayWithDefaultValues(); + mCounterArray.onTimeStopped(0, 0, 0); + assertArrayEquals(COUNTS, mCounterArray.mCounts, "Unexpected counts"); + assertArrayEquals(LOADED_COUNTS, mCounterArray.mLoadedCounts, "Unexpected loadedCounts"); + assertArrayEquals(COUNTS, mCounterArray.mPluggedCounts, "Unexpected pluggedCounts"); + assertArrayEquals(UNPLUGGED_COUNTS, mCounterArray.mUnpluggedCounts, + "Unexpected unpluggedCounts"); + } + + @Test + public void testGetCountsLocked() { + initializeCounterArrayWithDefaultValues(); + + when(mTimeBase.isRunning()).thenReturn(false); + long[] actualVal = mCounterArray.getCountsLocked(STATS_SINCE_CHARGED); + long[] expectedVal = PLUGGED_COUNTS; + assertArrayEquals(expectedVal, actualVal, "Unexpected values"); + + when(mTimeBase.isRunning()).thenReturn(true); + actualVal = mCounterArray.getCountsLocked(STATS_SINCE_CHARGED); + expectedVal = COUNTS; + assertArrayEquals(expectedVal, actualVal, "Unexpected values"); + } + + @Test + public void testAddCountLocked() { + final long[] deltas = {123, 234, 345, 456}; + mCounterArray.addCountLocked(deltas); + assertArrayEquals(deltas, mCounterArray.mCounts, "Unexpected counts"); + assertArrayEquals(null, mCounterArray.mLoadedCounts, "Unexpected loadedCounts"); + assertArrayEquals(null, mCounterArray.mPluggedCounts, "Unexpected pluggedCounts"); + assertArrayEquals(null, mCounterArray.mUnpluggedCounts, "Unexpected unpluggedCounts"); + + initializeCounterArrayWithDefaultValues(); + final long[] newCounts = new long[deltas.length]; + for (int i = 0; i < deltas.length; ++i) { + newCounts[i] = COUNTS[i] + deltas[i]; + } + mCounterArray.addCountLocked(deltas); + assertArrayEquals(newCounts, mCounterArray.mCounts, "Unexpected counts"); + assertArrayEquals(LOADED_COUNTS, mCounterArray.mLoadedCounts, "Unexpected loadedCounts"); + assertArrayEquals(PLUGGED_COUNTS, mCounterArray.mPluggedCounts, "Unexpected pluggedCounts"); + assertArrayEquals(UNPLUGGED_COUNTS, mCounterArray.mUnpluggedCounts, + "Unexpected unpluggedCounts"); + } + + @Test + public void testReset() { + initializeCounterArrayWithDefaultValues(); + // Test with detachIfReset=false + mCounterArray.reset(false /* detachIfReset */); + assertArrayEquals(ZEROES, mCounterArray.mCounts, "Unexpected counts"); + assertArrayEquals(ZEROES, mCounterArray.mLoadedCounts, "Unexpected loadedCounts"); + assertArrayEquals(ZEROES, mCounterArray.mPluggedCounts, "Unexpected pluggedCounts"); + assertArrayEquals(ZEROES, mCounterArray.mUnpluggedCounts, "Unexpected unpluggedCounts"); + verifyZeroInteractions(mTimeBase); + + initializeCounterArrayWithDefaultValues(); + // Test with detachIfReset=true + mCounterArray.reset(true /* detachIfReset */); + assertArrayEquals(ZEROES, mCounterArray.mCounts, "Unexpected counts"); + assertArrayEquals(ZEROES, mCounterArray.mLoadedCounts, "Unexpected loadedCounts"); + assertArrayEquals(ZEROES, mCounterArray.mPluggedCounts, "Unexpected pluggedCounts"); + assertArrayEquals(ZEROES, mCounterArray.mUnpluggedCounts, "Unexpected unpluggedCounts"); + verify(mTimeBase).remove(mCounterArray); + verifyNoMoreInteractions(mTimeBase); + } + + @Test + public void testDetach() { + mCounterArray.detach(); + verify(mTimeBase).remove(mCounterArray); + verifyNoMoreInteractions(mTimeBase); + } + + private void initializeCounterArrayWithDefaultValues() { + updateCounts(COUNTS, LOADED_COUNTS, PLUGGED_COUNTS, UNPLUGGED_COUNTS); + } + + private void assertArrayEquals(long[] expected, long[] actual, String msg) { + assertTrue(msg + ", expected: " + Arrays.toString(expected) + + ", actual: " + Arrays.toString(actual), Arrays.equals(expected, actual)); + } + + private void updateCounts(long[] counts, long[] loadedCounts, + long[] pluggedCounts, long[] unpluggedCounts) { + mCounterArray.mCounts = counts; + mCounterArray.mLoadedCounts = loadedCounts; + mCounterArray.mPluggedCounts = pluggedCounts; + mCounterArray.mUnpluggedCounts = unpluggedCounts; + } +} diff --git a/media/java/android/media/AudioFocusRequest.java b/media/java/android/media/AudioFocusRequest.java index b1dc3ad13f12..9841815a52d1 100644 --- a/media/java/android/media/AudioFocusRequest.java +++ b/media/java/android/media/AudioFocusRequest.java @@ -40,7 +40,7 @@ import android.os.Looper; * <p>When an application requests audio focus, it expresses its intention to “own” audio focus to * play audio. Let’s review the different types of focus requests, the return value after a request, * and the responses to a loss. - * <br><b>Note:<b> applications should not play anything until granted focus. + * <p class="note">Note: applications should not play anything until granted focus.</p> * * <h3>The different types of focus requests</h3> * <p>There are four focus request types. A successful focus request with each will yield different @@ -77,9 +77,10 @@ import android.os.Looper; * * <p>An {@code AudioFocusRequest} instance always contains one of the four types of requests * explained above. It is passed when building an {@code AudioFocusRequest} instance with its - * builder in the {@link Builder} constructor {@link Builder#Builder(int)}, or with - * {@link Builder#setFocusGain(int)} after copying an existing instance with - * {@link Builder#Builder(AudioFocusRequest)}. + * builder in the {@link Builder} constructor + * {@link AudioFocusRequest.Builder#AudioFocusRequest.Builder(int)}, or + * with {@link AudioFocusRequest.Builder#setFocusGain(int)} after copying an existing instance with + * {@link AudioFocusRequest.Builder#AudioFocusRequest.Builder(AudioFocusRequest)}. * * <h3>Qualifying your focus request</h3> * <h4>Use case requiring a focus request</h4> @@ -105,10 +106,11 @@ import android.os.Looper; * <h4>Pausing vs ducking</h4> * <p>When an application requested audio focus with * {@link AudioManager#AUDIOFOCUS_GAIN_TRANSIENT_MAY_DUCK}, the system will duck the current focus - * owner. Note that this behavior is <b>new for Android O<b>, whereas applications targeting SDK - * up to API 25, applications had to implement the ducking themselves when they received a focus + * owner. + * <p class="note">Note: this behavior is <b>new for Android O</b>, whereas applications targeting + * SDK level up to API 25 had to implement the ducking themselves when they received a focus * loss of {@link AudioManager#AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK}. - * <br>But ducking is not always the behavior expected by the user. A typical example is when the + * <p>But ducking is not always the behavior expected by the user. A typical example is when the * device plays driving directions while the user is listening to an audio book or podcast, and * expects the audio playback to pause, instead of duck, as it is hard to understand a navigation * prompt and spoken content at the same time. Therefore the system will not automatically duck @@ -126,7 +128,92 @@ import android.os.Looper; * speech, you can also declare so with {@link Builder#setWillPauseWhenDucked(boolean)}, which will * cause the system to call your focus listener instead of automatically ducking. * + * <h4>Example</h4> + * <p>The example below covers the following steps to be found in any application that would play + * audio, and use audio focus. Here we play an audio book, and our application is intended to pause + * rather than duck when it loses focus. These steps consist in: + * <ul> + * <li>Creating {@code AudioAttributes} to be used for the playback and the focus request.</li> + * <li>Configuring and creating the {@code AudioFocusRequest} instance that defines the intended + * focus behaviors.</li> + * <li>Requesting audio focus and checking the return code to see if playback can happen right + * away, or is delayed.</li> + * <li>Implementing a focus change listener to respond to focus gains and losses.</li> + * </ul> + * <p> + * <pre class="prettyprint"> + * // initialization of the audio attributes and focus request + * mAudioManager = (AudioManager) Context.getSystemService(Context.AUDIO_SERVICE); + * mPlaybackAttributes = new AudioAttributes.Builder() + * .setUsage(AudioAttributes.USAGE_MEDIA) + * .setContentType(AudioAttributes.CONTENT_TYPE_SPEECH) + * .build(); + * mFocusRequest = new AudioFocusRequest.Builder(AudioManager.AUDIOFOCUS_GAIN) + * .setAudioAttributes(mPlaybackAttributes) + * .setAcceptsDelayedFocusGain(true) + * .setWillPauseWhenDucked(true) + * .setOnAudioFocusChangeListener(this, mMyHandler) + * .build(); + * mMediaPlayer = new MediaPlayer(); + * mMediaPlayer.setAudioAttributes(mPlaybackAttributes); + * final Object mFocusLock = new Object(); + * + * boolean mPlaybackDelayed = false; + * + * // requesting audio focus + * int res = mAudioManager.requestAudioFocus(mFocusRequest); + * synchronized (mFocusLock) { + * if (res == AUDIOFOCUS_REQUEST_FAILED) { + * mPlaybackDelayed = false; + * } else if (res == AUDIOFOCUS_REQUEST_GRANTED) { + * mPlaybackDelayed = false; + * playbackNow(); + * } else if (res == AUDIOFOCUS_REQUEST_DELAYED) { + * mPlaybackDelayed = true; + * } + * } + * + * // implementation of the OnAudioFocusChangeListener + * @Override + * public void onAudioFocusChange(int focusChange) { + * switch (focusChange) { + * case AudioManager.AUDIOFOCUS_GAIN: + * if (mPlaybackDelayed || mResumeOnFocusGain) { + * synchronized (mFocusLock) { + * mPlaybackDelayed = false; + * mResumeOnFocusGain = false; + * } + * playbackNow(); + * } + * break; + * case AudioManager.AUDIOFOCUS_LOSS: + * synchronized (mFocusLock) { + * // this is not a transient loss, we shouldn't automatically resume for now + * mResumeOnFocusGain = false; + * mPlaybackDelayed = false; + * } + * pausePlayback(); + * break; + * case AudioManager.AUDIOFOCUS_LOSS_TRANSIENT: + * case AudioManager.AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK: + * // we handle all transient losses the same way because we never duck audio books + * synchronized (mFocusLock) { + * // we should only resume if playback was interrupted + * mResumeOnFocusGain = mMediaPlayer.isPlaying(); + * mPlaybackDelayed = false; + * } + * pausePlayback(); + * break; + * } + * } + * + * // Important: + * // Also set "mResumeOnFocusGain" to false when the user pauses or stops playback: this way your + * // application doesn't automatically restart when it gains focus, even though the user had + * // stopped it. + * </pre> */ + public final class AudioFocusRequest { // default attributes for the request when not specified @@ -244,36 +331,15 @@ public final class AudioFocusRequest { /** * Builder class for {@link AudioFocusRequest} objects. - * <p> Here is an example where {@code Builder} is used to define the - * {@link AudioFocusRequest} for requesting audio focus: - * - * <pre class="prettyprint"> - * mAudioManager = (AudioManager) Context.getSystemService(Context.AUDIO_SERVICE); - * mPlaybackAttributes = new AudioAttributes.Builder() - * .setUsage(AudioAttributes.USAGE_GAME) - * .setContentType(AudioAttributes.CONTENT_TYPE_MUSIC) - * .build(); - * mFocusRequest = new AudioFocusRequest.Builder(AudioManager.AUDIOFOCUS_GAIN) - * .setAudioAttributes(mPlaybackAttributes) - * .setAcceptsDelayedFocusGain(true) - * .setOnAudioFocusChangeListener(mMyFocusListener, mMyHandler) - * .build(); - * mMediaPlayer = new MediaPlayer(); - * ... - * mMediaPlayer.setAudioAttributes(mPlaybackAttributes); - * ... - * boolean mPlaybackAuthorized = true;; - * int res = mAudioManager.requestAudioFocus(mFocusRequest); - * if (res == AUDIOFOCUS_REQUEST_FAILED) { - * mPlaybackAuthorized = false; - * cancelPlayback(); - * } else if (res == AUDIOFOCUS_REQUEST_DELAYED) { - * playbackDelayed(); - * } else { // res == AUDIOFOCUS_REQUEST_GRANTED - * playbackNow(); - * } - * </pre> - * + * <p>See {@link AudioFocusRequest} for an example of building an instance with this builder. + * <br>The default values for the instance to be built are: + * <table> + * <tr><td>focus listener and handler</td><td>none</td></tr> + * <tr><td>{@code AudioAttributes}</td><td>attributes with usage set to + * {@link AudioAttributes#USAGE_MEDIA}</td></tr> + * <tr><td>pauses on duck</td><td>false</td></tr> + * <tr><td>supports delayed focus grant</td><td>false</td></tr> + * </table> */ public static final class Builder { private OnAudioFocusChangeListener mFocusListener; diff --git a/media/java/android/media/VolumeAutomation.java b/media/java/android/media/VolumeAutomation.java index dff8801f95f2..ff2e6459f1f2 100644 --- a/media/java/android/media/VolumeAutomation.java +++ b/media/java/android/media/VolumeAutomation.java @@ -31,9 +31,9 @@ public interface VolumeAutomation { * @param configuration the {@link VolumeShaper.Configuration configuration} * that specifies the curve and duration to use. * @return a {@code VolumeShaper} object - * @throws IllegalArgumentException if the configuration is not allowed by the player. - * @throws IllegalStateException if too many VolumeShapers are requested or the state of - * the player does not permit its creation (e.g. player is released). + * @throws IllegalArgumentException if the {@code configuration} is not allowed by the player. + * @throws IllegalStateException if too many {@code VolumeShaper}s are requested + * or the state of the player does not permit its creation (e.g. player is released). */ public @NonNull VolumeShaper createVolumeShaper( @NonNull VolumeShaper.Configuration configuration); diff --git a/media/java/android/media/VolumeShaper.java b/media/java/android/media/VolumeShaper.java index 8f4721f94e72..306870650343 100644 --- a/media/java/android/media/VolumeShaper.java +++ b/media/java/android/media/VolumeShaper.java @@ -31,8 +31,16 @@ import java.util.Objects; /** * The {@code VolumeShaper} class is used to automatically control audio volume during media * playback, allowing simple implementation of transition effects and ducking. + * It is created from implementations of {@code VolumeAutomation}, + * such as {@code MediaPlayer} and {@code AudioTrack} (referred to as "players" below), + * by {@link MediaPlayer#createVolumeShaper} or {@link AudioTrack#createVolumeShaper}. * - * The {@link VolumeShaper} appears as an additional scaling on the audio output, + * A {@code VolumeShaper} is intended for short volume changes. + * If the audio output sink changes during + * a {@code VolumeShaper} transition, the precise curve position may be lost, and the + * {@code VolumeShaper} may advance to the end of the curve for the new audio output sink. + * + * The {@code VolumeShaper} appears as an additional scaling on the audio output, * and adjusts independently of track or stream volume controls. */ public final class VolumeShaper implements AutoCloseable { @@ -52,7 +60,19 @@ public final class VolumeShaper implements AutoCloseable { /** * Applies the {@link VolumeShaper.Operation} to the {@code VolumeShaper}. + * + * Applying {@link VolumeShaper.Operation#PLAY} after {@code PLAY} + * or {@link VolumeShaper.Operation#REVERSE} after + * {@code REVERSE} has no effect. + * + * Applying {@link VolumeShaper.Operation#PLAY} when the player + * hasn't started will synchronously start the {@code VolumeShaper} when + * playback begins. + * * @param operation the {@code operation} to apply. + * @throws IllegalStateException if the player is uninitialized or if there + * is a critical failure. In that case, the {@code VolumeShaper} should be + * recreated. */ public void apply(@NonNull Operation operation) { /* void */ applyPlayer(new VolumeShaper.Configuration(mId), operation); @@ -65,11 +85,24 @@ public final class VolumeShaper implements AutoCloseable { * This allows the user to change the volume shape * while the existing {@code VolumeShaper} is in effect. * + * The effect of {@code replace()} is similar to an atomic close of + * the existing {@code VolumeShaper} and creation of a new {@code VolumeShaper}. + * + * If the {@code operation} is {@link VolumeShaper.Operation#PLAY} then the + * new curve starts immediately. + * + * If the {@code operation} is + * {@link VolumeShaper.Operation#REVERSE}, then the new curve will + * be delayed until {@code PLAY} is applied. + * * @param configuration the new {@code configuration} to use. - * @param operation the operation to apply to the {@code VolumeShaper} + * @param operation the {@code operation} to apply to the {@code VolumeShaper} * @param join if true, match the start volume of the * new {@code configuration} to the current volume of the existing * {@code VolumeShaper}, to avoid discontinuity. + * @throws IllegalStateException if the player is uninitialized or if there + * is a critical failure. In that case, the {@code VolumeShaper} should be + * recreated. */ public void replace( @NonNull Configuration configuration, @NonNull Operation operation, boolean join) { @@ -81,7 +114,14 @@ public final class VolumeShaper implements AutoCloseable { /** * Returns the current volume scale attributable to the {@code VolumeShaper}. * + * This is the last volume from the {@code VolumeShaper} used for the player, + * or the initial volume if the {@code VolumeShaper} hasn't been started with + * {@link VolumeShaper.Operation#PLAY}. + * * @return the volume, linearly represented as a value between 0.f and 1.f. + * @throws IllegalStateException if the player is uninitialized or if there + * is a critical failure. In that case, the {@code VolumeShaper} should be + * recreated. */ public float getVolume() { return getStatePlayer(mId).getVolume(); @@ -89,7 +129,14 @@ public final class VolumeShaper implements AutoCloseable { /** * Releases the {@code VolumeShaper} object; any volume scale due to the - * {@code VolumeShaper} is removed. + * {@code VolumeShaper} is removed after closing. + * + * If the volume does not reach 1.f when the {@code VolumeShaper} is closed + * (or finalized), there may be an abrupt change of volume. + * + * {@code close()} may be safely called after a prior {@code close()}. + * This class implements the Java {@code AutoClosable} interface and + * may be used with try-with-resources. */ @Override public void close() { @@ -107,11 +154,11 @@ public final class VolumeShaper implements AutoCloseable { @Override protected void finalize() { - close(); // ensure we remove the native volume shaper + close(); // ensure we remove the native VolumeShaper } /** - * Internal call to apply the configuration and operation to the Player. + * Internal call to apply the {@code configuration} and {@code operation} to the player. * Returns a valid shaper id or throws the appropriate exception. * @param configuration * @param operation @@ -137,7 +184,7 @@ public final class VolumeShaper implements AutoCloseable { // Due to RPC handling, we translate integer codes to exceptions right before // delivering to the user. if (id == VOLUME_SHAPER_INVALID_OPERATION) { - throw new IllegalStateException("player or volume shaper deallocated"); + throw new IllegalStateException("player or VolumeShaper deallocated"); } else { throw new IllegalArgumentException("invalid configuration or operation: " + id); } @@ -146,9 +193,9 @@ public final class VolumeShaper implements AutoCloseable { } /** - * Internal call to retrieve the current VolumeShaper state. + * Internal call to retrieve the current {@code VolumeShaper} state. * @param id - * @return the current {@vode VolumeShaper.State} + * @return the current {@code VolumeShaper.State} * @throws IllegalStateException if the player has been deallocated or is uninitialized. */ private @NonNull VolumeShaper.State getStatePlayer(int id) { @@ -180,6 +227,9 @@ public final class VolumeShaper implements AutoCloseable { * by {@link VolumeShaper#replace(Configuration, Operation, boolean) * VolumeShaper.replace(Configuration, Operation, boolean)} * to replace an existing {@code configuration}. + * <p> + * The {@link AudioTrack} and {@link MediaPlayer} classes implement + * the {@link VolumeAutomation} interface. */ public static final class Configuration implements Parcelable { private static final int MAXIMUM_CURVE_POINTS = 16; @@ -485,7 +535,7 @@ public final class VolumeShaper implements AutoCloseable { /** * @hide - * Constructs a volume shaper from an id. + * Constructs a {@code VolumeShaper} from an id. * * This is an opaque handle for controlling a {@code VolumeShaper} that has * already been sent to a player. The {@code id} is returned from the @@ -756,7 +806,7 @@ public final class VolumeShaper implements AutoCloseable { /** * Sets the interpolator type. * - * If omitted the interplator type is {@link #INTERPOLATOR_TYPE_CUBIC}. + * If omitted the default interpolator type is {@link #INTERPOLATOR_TYPE_CUBIC}. * * @param interpolatorType method of interpolation used for the volume curve. * One of {@link #INTERPOLATOR_TYPE_STEP}, @@ -802,7 +852,7 @@ public final class VolumeShaper implements AutoCloseable { } /** - * Sets the volume shaper duration in milliseconds. + * Sets the {@code VolumeShaper} duration in milliseconds. * * If omitted, the default duration is 1 second. * @@ -1059,13 +1109,13 @@ public final class VolumeShaper implements AutoCloseable { /** * Defer playback until next operation is sent. This is used - * when starting a VolumeShaper effect. + * when starting a {@code VolumeShaper} effect. */ private static final int FLAG_DEFER = 1 << 3; /** * Use the id specified in the configuration, creating - * VolumeShaper as needed; the configuration should be + * {@code VolumeShaper} as needed; the configuration should be * TYPE_SCALE. */ private static final int FLAG_CREATE_IF_NEEDED = 1 << 4; @@ -1074,18 +1124,20 @@ public final class VolumeShaper implements AutoCloseable { private final int mFlags; private final int mReplaceId; + private final float mXOffset; @Override public String toString() { return "VolumeShaper.Operation{" + "mFlags = 0x" + Integer.toHexString(mFlags).toUpperCase() + ", mReplaceId = " + mReplaceId + + ", mXOffset = " + mXOffset + "}"; } @Override public int hashCode() { - return Objects.hash(mFlags, mReplaceId); + return Objects.hash(mFlags, mReplaceId, mXOffset); } @Override @@ -1093,10 +1145,10 @@ public final class VolumeShaper implements AutoCloseable { if (!(o instanceof Operation)) return false; if (o == this) return true; final Operation other = (Operation) o; - // if xOffset (native field only) is brought into Java - // we need to do proper NaN comparison as that is allowed. + return mFlags == other.mFlags - && mReplaceId == other.mReplaceId; + && mReplaceId == other.mReplaceId + && Float.compare(mXOffset, other.mXOffset) == 0; } @Override @@ -1109,7 +1161,7 @@ public final class VolumeShaper implements AutoCloseable { // this needs to match the native VolumeShaper.Operation parceling dest.writeInt(mFlags); dest.writeInt(mReplaceId); - dest.writeFloat(Float.NaN); // xOffset (ignored at Java level) + dest.writeFloat(mXOffset); } public static final Parcelable.Creator<VolumeShaper.Operation> CREATOR @@ -1119,11 +1171,12 @@ public final class VolumeShaper implements AutoCloseable { // this needs to match the native VolumeShaper.Operation parceling final int flags = p.readInt(); final int replaceId = p.readInt(); - final float xOffset = p.readFloat(); // ignored at Java level + final float xOffset = p.readFloat(); return new VolumeShaper.Operation( flags - , replaceId); + , replaceId + , xOffset); } @Override @@ -1132,9 +1185,10 @@ public final class VolumeShaper implements AutoCloseable { } }; - private Operation(@Flag int flags, int replaceId) { + private Operation(@Flag int flags, int replaceId, float xOffset) { mFlags = flags; mReplaceId = replaceId; + mXOffset = xOffset; } /** @@ -1146,6 +1200,7 @@ public final class VolumeShaper implements AutoCloseable { public static final class Builder { int mFlags; int mReplaceId; + float mXOffset; /** * Constructs a new {@code Builder} with the defaults. @@ -1153,23 +1208,27 @@ public final class VolumeShaper implements AutoCloseable { public Builder() { mFlags = 0; mReplaceId = -1; + mXOffset = Float.NaN; } /** - * Constructs a new Builder from a given {@code VolumeShaper.Operation} + * Constructs a new {@code Builder} from a given {@code VolumeShaper.Operation} * @param operation the {@code VolumeShaper.operation} whose data will be - * reused in the new Builder. + * reused in the new {@code Builder}. */ public Builder(@NonNull VolumeShaper.Operation operation) { mReplaceId = operation.mReplaceId; mFlags = operation.mFlags; + mXOffset = operation.mXOffset; } /** - * Replaces the previous {@code VolumeShaper} specified by id. - * It has no other effect if the {@code VolumeShaper} is - * already expired. - * @param id the id of the previous {@code VolumeShaper}. + * Replaces the previous {@code VolumeShaper} specified by {@code id}. + * + * The {@code VolumeShaper} specified by the {@code id} is removed + * if it exists. The configuration should be TYPE_SCALE. + * + * @param id the {@code id} of the previous {@code VolumeShaper}. * @param join if true, match the volume of the previous * shaper to the start volume of the new {@code VolumeShaper}. * @return the same {@code Builder} instance. @@ -1194,8 +1253,9 @@ public final class VolumeShaper implements AutoCloseable { } /** - * Terminates the VolumeShaper. - * Do not call directly, use {@link VolumeShaper#release()}. + * Terminates the {@code VolumeShaper}. + * + * Do not call directly, use {@link VolumeShaper#close()}. * @return the same {@code Builder} instance. */ public @NonNull Builder terminate() { @@ -1214,8 +1274,12 @@ public final class VolumeShaper implements AutoCloseable { /** * Use the id specified in the configuration, creating - * VolumeShaper as needed; the configuration should be + * {@code VolumeShaper} only as needed; the configuration should be * TYPE_SCALE. + * + * If the {@code VolumeShaper} with the same id already exists + * then the operation has no effect. + * * @return the same {@code Builder} instance. */ public @NonNull Builder createIfNeeded() { @@ -1224,6 +1288,28 @@ public final class VolumeShaper implements AutoCloseable { } /** + * Sets the {@code xOffset} to use for the {@code VolumeShaper}. + * + * The {@code xOffset} is the position on the volume curve, + * and setting takes effect when the {@code VolumeShaper} is used next. + * + * @param xOffset a value between (or equal to) 0.f and 1.f, or Float.NaN to ignore. + * @return the same {@code Builder} instance. + * @throws IllegalArgumentException if {@code xOffset} is not between 0.f and 1.f, + * or a Float.NaN. + */ + public @NonNull Builder setXOffset(float xOffset) { + if (xOffset < -0.f) { + throw new IllegalArgumentException("Negative xOffset not allowed"); + } else if (xOffset > 1.f) { + throw new IllegalArgumentException("xOffset > 1.f not allowed"); + } + // Float.NaN passes through + mXOffset = xOffset; + return this; + } + + /** * Sets the operation flag. Do not call this directly but one of the * other builder methods. * @@ -1245,7 +1331,7 @@ public final class VolumeShaper implements AutoCloseable { * @return a new {@code VolumeShaper.Operation} object */ public @NonNull Operation build() { - return new Operation(mFlags, mReplaceId); + return new Operation(mFlags, mReplaceId, mXOffset); } } // Operation.Builder } // Operation @@ -1316,15 +1402,18 @@ public final class VolumeShaper implements AutoCloseable { /** * Gets the volume of the {@link VolumeShaper.State}. + * @return linear volume between 0.f and 1.f. */ public float getVolume() { return mVolume; } /** - * Gets the elapsed ms of the {@link VolumeShaper.State} + * Gets the {@code xOffset} position on the normalized curve + * of the {@link VolumeShaper.State}. + * @return the curve x position between 0.f and 1.f. */ - public double getXOffset() { + public float getXOffset() { return mXOffset; } } // State diff --git a/media/jni/android_media_VolumeShaper.h b/media/jni/android_media_VolumeShaper.h index 73498a2b44aa..1a13ffa24c43 100644 --- a/media/jni/android_media_VolumeShaper.h +++ b/media/jni/android_media_VolumeShaper.h @@ -40,6 +40,7 @@ struct VolumeShaperHelper { jmethodID opConstructId; jfieldID opFlagsId; jfieldID opReplaceIdId; + jfieldID opXOffsetId; // VolumeShaper.State jclass stClazz; @@ -74,9 +75,10 @@ struct VolumeShaperHelper { if (opClazz == nullptr) { return; } - opConstructId = env->GetMethodID(opClazz, "<init>", "(II)V"); + opConstructId = env->GetMethodID(opClazz, "<init>", "(IIF)V"); opFlagsId = env->GetFieldID(opClazz, "mFlags", "I"); opReplaceIdId = env->GetFieldID(opClazz, "mReplaceId", "I"); + opXOffsetId = env->GetFieldID(opClazz, "mXOffset", "F"); env->DeleteLocalRef(lclazz); lclazz = env->FindClass("android/media/VolumeShaper$State"); @@ -179,17 +181,20 @@ struct VolumeShaperHelper { VolumeShaper::Operation::Flag flags = (VolumeShaper::Operation::Flag)env->GetIntField(joperation, fields.opFlagsId); int replaceId = env->GetIntField(joperation, fields.opReplaceIdId); + float xOffset = env->GetFloatField(joperation, fields.opXOffsetId); - sp<VolumeShaper::Operation> operation = new VolumeShaper::Operation(flags, replaceId); + sp<VolumeShaper::Operation> operation = + new VolumeShaper::Operation(flags, replaceId, xOffset); return operation; } static jobject convertOperationToJobject( JNIEnv *env, const fields_t &fields, const sp<VolumeShaper::Operation> &operation) { // prepare constructor args - jvalue args[2]; + jvalue args[3]; args[0].i = (jint)operation->getFlags(); args[1].i = (jint)operation->getReplaceId(); + args[2].f = (jfloat)operation->getXOffset(); jobject joperation = env->NewObjectA(fields.opClazz, fields.opConstructId, args); return joperation; diff --git a/packages/SettingsLib/res/values-gl/strings.xml b/packages/SettingsLib/res/values-gl/strings.xml index 3250d03e9269..399199da74c2 100644 --- a/packages/SettingsLib/res/values-gl/strings.xml +++ b/packages/SettingsLib/res/values-gl/strings.xml @@ -109,7 +109,7 @@ <string name="tts_default_pitch_title" msgid="6135942113172488671">"Ton"</string> <string name="tts_default_pitch_summary" msgid="1944885882882650009">"Afecta ao ton da voz sintetizada"</string> <string name="tts_default_lang_title" msgid="8018087612299820556">"Idioma"</string> - <string name="tts_lang_use_system" msgid="2679252467416513208">"Utilizar idioma do sistema"</string> + <string name="tts_lang_use_system" msgid="2679252467416513208">"Utiliza o idioma do sistema"</string> <string name="tts_lang_not_selected" msgid="7395787019276734765">"Idioma non seleccionado"</string> <string name="tts_default_lang_summary" msgid="5219362163902707785">"Define a voz específica do idioma para o texto falado"</string> <string name="tts_play_example_title" msgid="7094780383253097230">"Escoitar un exemplo"</string> diff --git a/packages/SettingsLib/src/com/android/settingslib/bluetooth/A2dpProfile.java b/packages/SettingsLib/src/com/android/settingslib/bluetooth/A2dpProfile.java index db9f7b876789..7268d00bade1 100755 --- a/packages/SettingsLib/src/com/android/settingslib/bluetooth/A2dpProfile.java +++ b/packages/SettingsLib/src/com/android/settingslib/bluetooth/A2dpProfile.java @@ -101,9 +101,9 @@ public class A2dpProfile implements LocalBluetoothProfile { mLocalAdapter = adapter; mDeviceManager = deviceManager; mProfileManager = profileManager; + mWrapperFactory = new BluetoothA2dpWrapperImpl.Factory(); mLocalAdapter.getProfileProxy(context, new A2dpServiceListener(), BluetoothProfile.A2DP); - mWrapperFactory = new BluetoothA2dpWrapperImpl.Factory(); } @VisibleForTesting diff --git a/packages/SystemUI/AndroidManifest.xml b/packages/SystemUI/AndroidManifest.xml index 5460304e8678..79b02a5286e0 100644 --- a/packages/SystemUI/AndroidManifest.xml +++ b/packages/SystemUI/AndroidManifest.xml @@ -187,6 +187,9 @@ <!-- to access ResolverRankerServices --> <uses-permission android:name="android.permission.BIND_RESOLVER_RANKER_SERVICE" /> + <!-- to access instant apps --> + <uses-permission android:name="android.permission.ACCESS_INSTANT_APPS" /> + <application android:name=".SystemUIApplication" android:persistent="true" diff --git a/packages/SystemUI/res/values-b+sr+Latn/strings.xml b/packages/SystemUI/res/values-b+sr+Latn/strings.xml index 1cde01253fef..29a5e194c472 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> @@ -739,7 +739,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-sl/strings.xml b/packages/SystemUI/res/values-sl/strings.xml index 46e6b5f12c1a..b0e770fbdd6c 100644 --- a/packages/SystemUI/res/values-sl/strings.xml +++ b/packages/SystemUI/res/values-sl/strings.xml @@ -758,8 +758,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-sr/strings.xml b/packages/SystemUI/res/values-sr/strings.xml index 596ef388bdf8..f4b488422d66 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> @@ -739,7 +739,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/src/com/android/systemui/Dependency.java b/packages/SystemUI/src/com/android/systemui/Dependency.java index f4d4a9ff327d..0cf8ff05932f 100644 --- a/packages/SystemUI/src/com/android/systemui/Dependency.java +++ b/packages/SystemUI/src/com/android/systemui/Dependency.java @@ -264,6 +264,8 @@ public class Dependency extends SystemUI { mProviders.put(AccessibilityManagerWrapper.class, () -> new AccessibilityManagerWrapper(mContext)); + mProviders.put(UiOffloadThread.class, UiOffloadThread::new); + // Put all dependencies above here so the factory can override them if it wants. SystemUIFactory.getInstance().injectDependencies(mProviders, mContext); } diff --git a/packages/SystemUI/src/com/android/systemui/UiOffloadThread.java b/packages/SystemUI/src/com/android/systemui/UiOffloadThread.java new file mode 100644 index 000000000000..82fd9b304195 --- /dev/null +++ b/packages/SystemUI/src/com/android/systemui/UiOffloadThread.java @@ -0,0 +1,34 @@ +/* + * 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; + +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; +import java.util.concurrent.Future; + +/** + * Thread that offloads work from the UI thread but that is still perceptible to the user, so the + * priority is the same as the main thread. + */ +public class UiOffloadThread { + + private final ExecutorService mExecutorService = Executors.newSingleThreadExecutor(); + + public Future<?> submit(Runnable runnable) { + return mExecutorService.submit(runnable); + } +} diff --git a/packages/SystemUI/src/com/android/systemui/classifier/FalsingManager.java b/packages/SystemUI/src/com/android/systemui/classifier/FalsingManager.java index 1abea37519e6..a129acea40b0 100644 --- a/packages/SystemUI/src/com/android/systemui/classifier/FalsingManager.java +++ b/packages/SystemUI/src/com/android/systemui/classifier/FalsingManager.java @@ -30,7 +30,10 @@ import android.provider.Settings; import android.view.MotionEvent; import android.view.accessibility.AccessibilityManager; +import com.android.systemui.Dependency; +import com.android.systemui.UiOffloadThread; import com.android.systemui.analytics.DataCollector; +import com.android.systemui.recents.misc.SystemServicesProxy; import com.android.systemui.statusbar.StatusBarState; import java.io.PrintWriter; @@ -63,6 +66,7 @@ public class FalsingManager implements SensorEventListener { private final DataCollector mDataCollector; private final HumanInteractionClassifier mHumanInteractionClassifier; private final AccessibilityManager mAccessibilityManager; + private final UiOffloadThread mUiOffloadThread; private static FalsingManager sInstance = null; @@ -86,6 +90,7 @@ public class FalsingManager implements SensorEventListener { mAccessibilityManager = context.getSystemService(AccessibilityManager.class); mDataCollector = DataCollector.getInstance(mContext); mHumanInteractionClassifier = HumanInteractionClassifier.getInstance(mContext); + mUiOffloadThread = Dependency.get(UiOffloadThread.class); mScreenOn = context.getSystemService(PowerManager.class).isInteractive(); mContext.getContentResolver().registerContentObserver( @@ -130,7 +135,11 @@ public class FalsingManager implements SensorEventListener { private void sessionExitpoint(boolean force) { if (mSessionActive && (force || !shouldSessionBeActive())) { mSessionActive = false; - mSensorManager.unregisterListener(this); + + // This can be expensive, and doesn't need to happen on the main thread. + mUiOffloadThread.submit(() -> { + mSensorManager.unregisterListener(this); + }); } } @@ -154,7 +163,11 @@ public class FalsingManager implements SensorEventListener { for (int sensorType : sensors) { Sensor s = mSensorManager.getDefaultSensor(sensorType); if (s != null) { - mSensorManager.registerListener(this, s, SensorManager.SENSOR_DELAY_GAME); + + // This can be expensive, and doesn't need to happen on the main thread. + mUiOffloadThread.submit(() -> { + mSensorManager.registerListener(this, s, SensorManager.SENSOR_DELAY_GAME); + }); } } } diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/DismissCallbackRegistry.java b/packages/SystemUI/src/com/android/systemui/keyguard/DismissCallbackRegistry.java index 262d29d1acd1..745f312a29b4 100644 --- a/packages/SystemUI/src/com/android/systemui/keyguard/DismissCallbackRegistry.java +++ b/packages/SystemUI/src/com/android/systemui/keyguard/DismissCallbackRegistry.java @@ -17,6 +17,10 @@ package com.android.systemui.keyguard; import com.android.internal.policy.IKeyguardDismissCallback; +import com.android.systemui.Dependency; +import com.android.systemui.UiOffloadThread; +import com.android.systemui.recents.Recents; +import com.android.systemui.recents.misc.SystemServicesProxy; import java.util.ArrayList; @@ -26,6 +30,7 @@ import java.util.ArrayList; public class DismissCallbackRegistry { private final ArrayList<DismissCallbackWrapper> mDismissCallbacks = new ArrayList<>(); + private final UiOffloadThread mUiOffloadThread = Dependency.get(UiOffloadThread.class); public void addCallback(IKeyguardDismissCallback callback) { mDismissCallbacks.add(new DismissCallbackWrapper(callback)); @@ -33,14 +38,16 @@ public class DismissCallbackRegistry { public void notifyDismissCancelled() { for (int i = mDismissCallbacks.size() - 1; i >= 0; i--) { - mDismissCallbacks.get(i).notifyDismissCancelled(); + DismissCallbackWrapper callback = mDismissCallbacks.get(i); + mUiOffloadThread.submit(callback::notifyDismissCancelled); } mDismissCallbacks.clear(); } public void notifyDismissSucceeded() { for (int i = mDismissCallbacks.size() - 1; i >= 0; i--) { - mDismissCallbacks.get(i).notifyDismissSucceeded(); + DismissCallbackWrapper callback = mDismissCallbacks.get(i); + mUiOffloadThread.submit(callback::notifyDismissSucceeded); } mDismissCallbacks.clear(); } diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java b/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java index f618a2c55e7d..b977dd46d27e 100644 --- a/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java +++ b/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java @@ -51,6 +51,7 @@ import android.os.Trace; import android.os.UserHandle; import android.os.UserManager; import android.provider.Settings; +import android.provider.Settings.System; import android.telephony.SubscriptionManager; import android.telephony.TelephonyManager; import android.util.EventLog; @@ -76,9 +77,13 @@ import com.android.keyguard.KeyguardUpdateMonitor; import com.android.keyguard.KeyguardUpdateMonitorCallback; import com.android.keyguard.LatencyTracker; import com.android.keyguard.ViewMediatorCallback; +import com.android.systemui.Dependency; import com.android.systemui.SystemUI; import com.android.systemui.SystemUIFactory; +import com.android.systemui.UiOffloadThread; import com.android.systemui.classifier.FalsingManager; +import com.android.systemui.recents.Recents; +import com.android.systemui.recents.misc.SystemServicesProxy; import com.android.systemui.statusbar.phone.FingerprintUnlockController; import com.android.systemui.statusbar.phone.StatusBar; import com.android.systemui.statusbar.phone.ScrimController; @@ -195,6 +200,7 @@ public class KeyguardViewMediator extends SystemUI { private AlarmManager mAlarmManager; private AudioManager mAudioManager; private StatusBarManager mStatusBarManager; + private final UiOffloadThread mUiOffloadThread = Dependency.get(UiOffloadThread.class); private boolean mSystemReady; private boolean mBootCompleted; @@ -1199,18 +1205,20 @@ public class KeyguardViewMediator extends SystemUI { updateInputRestrictedLocked(); } } + private void updateInputRestrictedLocked() { boolean inputRestricted = isInputRestricted(); if (mInputRestricted != inputRestricted) { mInputRestricted = inputRestricted; int size = mKeyguardStateCallbacks.size(); for (int i = size - 1; i >= 0; i--) { + final IKeyguardStateCallback callback = mKeyguardStateCallbacks.get(i); try { - mKeyguardStateCallbacks.get(i).onInputRestrictedStateChanged(inputRestricted); + callback.onInputRestrictedStateChanged(inputRestricted); } catch (RemoteException e) { Slog.w(TAG, "Failed to call onDeviceProvisioned", e); if (e instanceof DeadObjectException) { - mKeyguardStateCallbacks.remove(i); + mKeyguardStateCallbacks.remove(callback); } } } @@ -1569,9 +1577,11 @@ public class KeyguardViewMediator extends SystemUI { private void handleKeyguardDone() { Trace.beginSection("KeyguardViewMediator#handleKeyguardDone"); final int currentUser = KeyguardUpdateMonitor.getCurrentUser(); - if (mLockPatternUtils.isSecure(currentUser)) { - mLockPatternUtils.getDevicePolicyManager().reportKeyguardDismissed(currentUser); - } + mUiOffloadThread.submit(() -> { + if (mLockPatternUtils.isSecure(currentUser)) { + mLockPatternUtils.getDevicePolicyManager().reportKeyguardDismissed(currentUser); + } + }); if (DEBUG) Log.d(TAG, "handleKeyguardDone"); synchronized (this) { resetKeyguardDonePendingLocked(); @@ -1611,10 +1621,12 @@ public class KeyguardViewMediator extends SystemUI { final UserHandle currentUser = new UserHandle(currentUserId); final UserManager um = (UserManager) mContext.getSystemService( Context.USER_SERVICE); - for (int profileId : um.getProfileIdsWithDisabled(currentUser.getIdentifier())) { - mContext.sendBroadcastAsUser(USER_PRESENT_INTENT, UserHandle.of(profileId)); - } - getLockPatternUtils().userPresent(currentUserId); + mUiOffloadThread.submit(() -> { + for (int profileId : um.getProfileIdsWithDisabled(currentUser.getIdentifier())) { + mContext.sendBroadcastAsUser(USER_PRESENT_INTENT, UserHandle.of(profileId)); + } + getLockPatternUtils().userPresent(currentUserId); + }); } else { mBootSendUserPresent = true; } @@ -1659,11 +1671,18 @@ public class KeyguardViewMediator extends SystemUI { if (mAudioManager == null) return; mUiSoundsStreamType = mAudioManager.getUiSoundsStreamType(); } - // If the stream is muted, don't play the sound - if (mAudioManager.isStreamMute(mUiSoundsStreamType)) return; - mLockSoundStreamId = mLockSounds.play(soundId, - mLockSoundVolume, mLockSoundVolume, 1/*priortiy*/, 0/*loop*/, 1.0f/*rate*/); + mUiOffloadThread.submit(() -> { + // If the stream is muted, don't play the sound + if (mAudioManager.isStreamMute(mUiSoundsStreamType)) return; + + int id = mLockSounds.play(soundId, + mLockSoundVolume, mLockSoundVolume, 1/*priortiy*/, 0/*loop*/, 1.0f/*rate*/); + synchronized (this) { + mLockSoundStreamId = id; + } + }); + } } @@ -1671,13 +1690,13 @@ public class KeyguardViewMediator extends SystemUI { playSound(mTrustedSoundId); } - private void updateActivityLockScreenState() { - Trace.beginSection("KeyguardViewMediator#updateActivityLockScreenState"); - try { - ActivityManager.getService().setLockScreenShown(mShowing); - } catch (RemoteException e) { - } - Trace.endSection(); + private void updateActivityLockScreenState(boolean showing) { + mUiOffloadThread.submit(() -> { + try { + ActivityManager.getService().setLockScreenShown(showing); + } catch (RemoteException e) { + } + }); } /** @@ -1808,11 +1827,11 @@ public class KeyguardViewMediator extends SystemUI { mWakeAndUnlocking = false; setShowingLocked(false); + mDismissCallbackRegistry.notifyDismissSucceeded(); mStatusBarKeyguardViewManager.hide(startTime, fadeoutDuration); resetKeyguardDonePendingLocked(); mHideAnimationRun = false; adjustStatusBarLocked(); - mDismissCallbackRegistry.notifyDismissSucceeded(); sendUserPresentBroadcast(); mUpdateMonitor.setKeyguardGoingAway(false /* goingAway */); } @@ -1846,7 +1865,10 @@ public class KeyguardViewMediator extends SystemUI { } if (!(mContext instanceof Activity)) { - mStatusBarManager.disable(flags); + final int finalFlags = flags; + mUiOffloadThread.submit(() -> { + mStatusBarManager.disable(finalFlags); + }); } } } @@ -2044,18 +2066,21 @@ public class KeyguardViewMediator extends SystemUI { mShowing = showing; int size = mKeyguardStateCallbacks.size(); for (int i = size - 1; i >= 0; i--) { + IKeyguardStateCallback callback = mKeyguardStateCallbacks.get(i); try { - mKeyguardStateCallbacks.get(i).onShowingStateChanged(showing); + callback.onShowingStateChanged(showing); } catch (RemoteException e) { Slog.w(TAG, "Failed to call onShowingStateChanged", e); if (e instanceof DeadObjectException) { - mKeyguardStateCallbacks.remove(i); + mKeyguardStateCallbacks.remove(callback); } } } updateInputRestrictedLocked(); - mTrustManager.reportKeyguardShowingChanged(); - updateActivityLockScreenState(); + mUiOffloadThread.submit(() -> { + mTrustManager.reportKeyguardShowingChanged(); + }); + updateActivityLockScreenState(showing); } } 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 fbb97b65f958..013b9ac70118 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 @@ public class PipMenuActivity extends Activity { 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 1ccea6f684df..e310847943c5 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.Intent; 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 class PipMenuActivityController { 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 class PipMenuActivityController { */ 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 @@ public class PipMenuActivityController { } /** - * @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 590e3c62e82a..9fa7ff61a13d 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.content.Context; 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 @@ import java.io.PrintWriter; 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 @@ public class PipMotionHelper { * 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 @@ public class PipMotionHelper { * 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 @@ public class PipMotionHelper { * 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 @@ public class PipMotionHelper { * 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 199b027d098b..c35fdd5c5781 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 @@ public class PipTouchHandler { // 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 @@ public class PipTouchHandler { mSavedSnapFraction = -1f; } } else { + // If resizing is not allowed, then the PiP should be frozen until the transition + // ends as well + setTouchEnabled(false); mSavedSnapFraction = -1f; } } 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 6707c15ce84a..a155a71d442c 100644 --- a/packages/SystemUI/src/com/android/systemui/recents/misc/SystemServicesProxy.java +++ b/packages/SystemUI/src/com/android/systemui/recents/misc/SystemServicesProxy.java @@ -86,7 +86,9 @@ import android.view.accessibility.AccessibilityManager; 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; import com.android.systemui.pip.tv.PipMenuActivity; import com.android.systemui.recents.Recents; import com.android.systemui.recents.RecentsDebugFlags; @@ -152,7 +154,8 @@ public class SystemServicesProxy { Canvas mBgProtectionCanvas; private final Handler mHandler = new H(); - private final ExecutorService mOnewayExecutor = Executors.newSingleThreadExecutor(); + + private final UiOffloadThread mUiOffloadThread = Dependency.get(UiOffloadThread.class); /** * An abstract class to track task stack changes. @@ -784,7 +787,7 @@ public class SystemServicesProxy { * Sends a message to close other system windows. */ public void sendCloseSystemWindows(String reason) { - mOnewayExecutor.submit(() -> { + mUiOffloadThread.submit(() -> { try { mIam.closeSystemDialogs(reason); } catch (RemoteException e) { @@ -1139,7 +1142,7 @@ public class SystemServicesProxy { } public void startActivityAsUserAsync(Intent intent, ActivityOptions opts) { - mOnewayExecutor.submit(() -> mContext.startActivityAsUser(intent, + mUiOffloadThread.submit(() -> mContext.startActivityAsUser(intent, opts != null ? opts.toBundle() : null, UserHandle.CURRENT)); } @@ -1167,7 +1170,7 @@ public class SystemServicesProxy { // Execute this from another thread such that we can do other things (like caching the // bitmap for the thumbnail) while AM is busy starting our activity. - mOnewayExecutor.submit(() -> { + mUiOffloadThread.submit(() -> { try { mIam.startActivityFromRecents( taskKey.id, finalOptions == null ? null : finalOptions.toBundle()); @@ -1309,7 +1312,7 @@ public class SystemServicesProxy { } public void awakenDreamsAsync() { - mOnewayExecutor.submit(() -> { + mUiOffloadThread.submit(() -> { try { mDreamManager.awaken(); } catch (RemoteException e) { @@ -1320,7 +1323,7 @@ public class SystemServicesProxy { public void updateOverviewLastStackActiveTimeAsync(long newLastStackActiveTime, int currentUserId) { - mOnewayExecutor.submit(() -> { + mUiOffloadThread.submit(() -> { Settings.Secure.putLongForUser(mContext.getContentResolver(), Secure.OVERVIEW_LAST_STACK_ACTIVE_TIME, newLastStackActiveTime, currentUserId); }); diff --git a/packages/SystemUI/src/com/android/systemui/recents/model/RecentsTaskLoader.java b/packages/SystemUI/src/com/android/systemui/recents/model/RecentsTaskLoader.java index c5a292f2da26..15e1739f41ce 100644 --- a/packages/SystemUI/src/com/android/systemui/recents/model/RecentsTaskLoader.java +++ b/packages/SystemUI/src/com/android/systemui/recents/model/RecentsTaskLoader.java @@ -103,6 +103,7 @@ class BackgroundTaskLoader implements Runnable { Bitmap mDefaultThumbnail; BitmapDrawable mDefaultIcon; + boolean mStarted; boolean mCancelled; boolean mWaitingOnLoadQueue; @@ -122,16 +123,21 @@ class BackgroundTaskLoader implements Runnable { android.os.Process.THREAD_PRIORITY_BACKGROUND); mLoadThread.start(); mLoadThreadHandler = new Handler(mLoadThread.getLooper()); - mLoadThreadHandler.post(this); } /** Restarts the loader thread */ void start(Context context) { mContext = context; mCancelled = false; - // Notify the load thread to start loading - synchronized(mLoadThread) { - mLoadThread.notifyAll(); + if (!mStarted) { + // Start loading on the load thread + mStarted = true; + mLoadThreadHandler.post(this); + } else { + // Notify the load thread to start loading again + synchronized (mLoadThread) { + mLoadThread.notifyAll(); + } } } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/KeyguardIndicationController.java b/packages/SystemUI/src/com/android/systemui/statusbar/KeyguardIndicationController.java index 092408961eab..1691e135ae32 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/KeyguardIndicationController.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/KeyguardIndicationController.java @@ -270,7 +270,7 @@ public class KeyguardIndicationController { return; } - if (!mUserManager.isUserUnlocked(ActivityManager.getCurrentUser())) { + if (!mUserManager.isUserUnlocked(KeyguardUpdateMonitor.getCurrentUser())) { mTextView.switchIndication(com.android.internal.R.string.lockscreen_storage_locked); mTextView.setTextColor(Color.WHITE); @@ -365,6 +365,9 @@ public class KeyguardIndicationController { }; public void setDozing(boolean dozing) { + if (mDozing == dozing) { + return; + } mDozing = dozing; updateIndication(); updateDisclosure(); diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardBouncer.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardBouncer.java index 21240118e5c6..95f32bb1d07b 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardBouncer.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardBouncer.java @@ -18,6 +18,7 @@ package com.android.systemui.statusbar.phone; import android.app.ActivityManager; import android.content.Context; +import android.os.Handler; import android.os.UserHandle; import android.os.UserManager; import android.util.Slog; @@ -55,6 +56,7 @@ public class KeyguardBouncer { protected final ViewGroup mContainer; private final FalsingManager mFalsingManager; private final DismissCallbackRegistry mDismissCallbackRegistry; + private final Handler mHandler; protected KeyguardHostView mKeyguardView; protected ViewGroup mRoot; private boolean mShowingSoon; @@ -66,6 +68,7 @@ public class KeyguardBouncer { mBouncerPromptReason = mCallback.getBouncerPromptReason(); } }; + private final Runnable mRemoveViewRunnable = this::removeView; public KeyguardBouncer(Context context, ViewMediatorCallback callback, LockPatternUtils lockPatternUtils, ViewGroup container, @@ -77,6 +80,7 @@ public class KeyguardBouncer { KeyguardUpdateMonitor.getInstance(mContext).registerCallback(mUpdateMonitorCallback); mFalsingManager = FalsingManager.getInstance(mContext); mDismissCallbackRegistry = dismissCallbackRegistry; + mHandler = new Handler(); } public void show(boolean resetSecuritySelection) { @@ -179,10 +183,14 @@ public class KeyguardBouncer { mKeyguardView.cancelDismissAction(); mKeyguardView.cleanUp(); } - if (destroyView) { - removeView(); - } else if (mRoot != null) { + if (mRoot != null) { mRoot.setVisibility(View.INVISIBLE); + if (destroyView) { + + // We have a ViewFlipper that unregisters a broadcast when being detached, which may + // be slow because of AM lock contention during unlocking. We can delay it a bit. + mHandler.postDelayed(mRemoveViewRunnable, 50); + } } } @@ -226,6 +234,7 @@ public class KeyguardBouncer { } protected void ensureView() { + mHandler.removeCallbacks(mRemoveViewRunnable); if (mRoot == null) { inflateView(); } @@ -233,6 +242,7 @@ public class KeyguardBouncer { protected void inflateView() { removeView(); + mHandler.removeCallbacks(mRemoveViewRunnable); mRoot = (ViewGroup) LayoutInflater.from(mContext).inflate(R.layout.keyguard_bouncer, null); mKeyguardView = (KeyguardHostView) mRoot.findViewById(R.id.keyguard_host_view); mKeyguardView.setLockPatternUtils(mLockPatternUtils); diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationIconAreaController.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationIconAreaController.java index 45812042412c..52838b052bd4 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationIconAreaController.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationIconAreaController.java @@ -128,8 +128,7 @@ public class NotificationIconAreaController implements DarkReceiver { protected boolean shouldShowNotificationIcon(NotificationData.Entry entry, NotificationData notificationData, boolean showAmbient) { - if (notificationData.isAmbient(entry.key) && !showAmbient - && !NotificationData.showNotificationEvenIfUnprovisioned(entry.notification)) { + if (notificationData.isAmbient(entry.key) && !showAmbient) { return false; } if (!StatusBar.isTopLevelChild(entry)) { 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 e378e871394c..9d1d03859f81 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.view.animation.Interpolator; import android.widget.FrameLayout; import com.android.internal.logging.nano.MetricsProto.MetricsEvent; +import com.android.keyguard.LatencyTracker; import com.android.systemui.DejankUtils; -import com.android.systemui.EventLogTags; import com.android.systemui.Interpolators; -import com.android.keyguard.LatencyTracker; import com.android.systemui.R; import com.android.systemui.classifier.FalsingManager; import com.android.systemui.doze.DozeLog; @@ -833,6 +832,14 @@ public abstract class PanelView extends FrameLayout { } } + // 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); diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBarPolicy.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBarPolicy.java index 41fb5f7c220c..f3ba5aaf887d 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBarPolicy.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBarPolicy.java @@ -58,6 +58,7 @@ import com.android.systemui.Dependency; import com.android.systemui.DockedStackExistsListener; import com.android.systemui.R; import com.android.systemui.SysUiServiceProvider; +import com.android.systemui.UiOffloadThread; import com.android.systemui.qs.tiles.DndTile; import com.android.systemui.qs.tiles.RotationLockTile; import com.android.systemui.recents.misc.SystemServicesProxy; @@ -128,6 +129,7 @@ public class PhoneStatusBarPolicy implements Callback, Callbacks, private final KeyguardMonitor mKeyguardMonitor; private final LocationController mLocationController; private final ArraySet<Pair<String, Integer>> mCurrentNotifs = new ArraySet<>(); + private final UiOffloadThread mUiOffloadThread = Dependency.get(UiOffloadThread.class); // Assume it's all good unless we hear otherwise. We don't always seem // to get broadcasts that it *is* there. @@ -472,30 +474,38 @@ public class PhoneStatusBarPolicy implements Callback, Callbacks, } private void updateManagedProfile() { - try { - final boolean showIcon; - final int userId = ActivityManager.getService().getLastResumedActivityUserId(); - if (mUserManager.isManagedProfile(userId) && !mKeyguardMonitor.isShowing()) { - showIcon = true; - mIconController.setIcon(mSlotManagedProfile, - R.drawable.stat_sys_managed_profile_status, - mContext.getString(R.string.accessibility_managed_profile)); - } else if (mManagedProfileInQuietMode) { - showIcon = true; - mIconController.setIcon(mSlotManagedProfile, - R.drawable.stat_sys_managed_profile_status_off, - mContext.getString(R.string.accessibility_managed_profile)); - } else { - showIcon = false; - } - if (mManagedProfileIconVisible != showIcon) { - mIconController.setIconVisibility(mSlotManagedProfile, showIcon); - mManagedProfileIconVisible = showIcon; + // getLastResumedActivityUserId needds to acquire the AM lock, which may be contended in + // some cases. Since it doesn't really matter here whether it's updated in this frame + // or in the next one, we call this method from our UI offload thread. + mUiOffloadThread.submit(() -> { + final int userId; + try { + userId = ActivityManager.getService().getLastResumedActivityUserId(); + boolean isManagedProfile = mUserManager.isManagedProfile(userId); + mHandler.post(() -> { + final boolean showIcon; + if (isManagedProfile && !mKeyguardMonitor.isShowing()) { + showIcon = true; + mIconController.setIcon(mSlotManagedProfile, + R.drawable.stat_sys_managed_profile_status, + mContext.getString(R.string.accessibility_managed_profile)); + } else if (mManagedProfileInQuietMode) { + showIcon = true; + mIconController.setIcon(mSlotManagedProfile, + R.drawable.stat_sys_managed_profile_status_off, + mContext.getString(R.string.accessibility_managed_profile)); + } else { + showIcon = false; + } + if (mManagedProfileIconVisible != showIcon) { + mIconController.setIconVisibility(mSlotManagedProfile, showIcon); + mManagedProfileIconVisible = showIcon; + } + }); + } catch (RemoteException e) { + Log.w(TAG, "updateManagedProfile: ", e); } - } catch (RemoteException ex) { - Log.w(TAG, "updateManagedProfile: ", ex); - // ignore - } + }); } private void updateForegroundInstantApps() { @@ -503,26 +513,22 @@ public class PhoneStatusBarPolicy implements Callback, Callbacks, ArraySet<Pair<String, Integer>> notifs = new ArraySet<>(mCurrentNotifs); IPackageManager pm = AppGlobals.getPackageManager(); mCurrentNotifs.clear(); - try { - ArraySet<Integer> stacksToCheck = new ArraySet<>(); - int[] STACKS_TO_CHECK = new int[]{ - StackId.FULLSCREEN_WORKSPACE_STACK_ID, - StackId.DOCKED_STACK_ID, - }; - int focusedId = ActivityManager.getService().getFocusedStackId(); - if (focusedId == StackId.FULLSCREEN_WORKSPACE_STACK_ID - || focusedId == StackId.FULLSCREEN_WORKSPACE_STACK_ID) { - checkStack(StackId.FULLSCREEN_WORKSPACE_STACK_ID, notifs, noMan, pm); - } - if (mDockedStackExists) { - checkStack(StackId.DOCKED_STACK_ID, notifs, noMan, pm); + mUiOffloadThread.submit(() -> { + try { + int focusedId = ActivityManager.getService().getFocusedStackId(); + if (focusedId == StackId.FULLSCREEN_WORKSPACE_STACK_ID) { + checkStack(StackId.FULLSCREEN_WORKSPACE_STACK_ID, notifs, noMan, pm); + } + if (mDockedStackExists) { + checkStack(StackId.DOCKED_STACK_ID, notifs, noMan, pm); + } + } catch (RemoteException e) { + e.rethrowFromSystemServer(); } - } catch (RemoteException e) { - e.rethrowFromSystemServer(); - } - // Cancel all the leftover notifications that don't have a foreground process anymore. - notifs.forEach(v -> noMan.cancelAsUser(v.first, SystemMessage.NOTE_INSTANT_APPS, - new UserHandle(v.second))); + // Cancel all the leftover notifications that don't have a foreground process anymore. + notifs.forEach(v -> noMan.cancelAsUser(v.first, SystemMessage.NOTE_INSTANT_APPS, + new UserHandle(v.second))); + }); } private void checkStack(int stackId, ArraySet<Pair<String, Integer>> notifs, 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 916b603f54fa..970d1de251d5 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 class PhoneStatusBarView extends PanelBar { 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/StatusBar.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java index 01bcd61952ff..d798fbf416df 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java @@ -83,6 +83,7 @@ import android.os.RemoteException; import android.os.ServiceManager; import android.os.SystemClock; import android.os.SystemProperties; +import android.os.SystemService; import android.os.Trace; import android.os.UserHandle; import android.os.UserManager; @@ -131,6 +132,7 @@ import com.android.systemui.Interpolators; import com.android.systemui.Prefs; import com.android.systemui.R; import com.android.systemui.SystemUIFactory; +import com.android.systemui.UiOffloadThread; import com.android.systemui.assist.AssistManager; import com.android.systemui.classifier.FalsingLog; import com.android.systemui.classifier.FalsingManager; @@ -537,6 +539,7 @@ public class StatusBar extends SystemUI implements DemoMode, private ViewMediatorCallback mKeyguardViewMediatorCallback; protected ScrimController mScrimController; protected DozeScrimController mDozeScrimController; + private final UiOffloadThread mUiOffloadThread = Dependency.get(UiOffloadThread.class); private final Runnable mAutohide = new Runnable() { @Override @@ -4339,7 +4342,7 @@ public class StatusBar extends SystemUI implements DemoMode, checkBarModes(); updateMediaMetaData(false, mState != StatusBarState.KEYGUARD); mKeyguardMonitor.notifyKeyguardState(mStatusBarKeyguardViewManager.isShowing(), - mStatusBarKeyguardViewManager.isSecure(), + mUnlockMethodCache.isMethodSecure(), mStatusBarKeyguardViewManager.isOccluded()); Trace.endSection(); } @@ -6884,11 +6887,13 @@ public class StatusBar extends SystemUI implements DemoMode, @Override public void logNotificationExpansion(String key, boolean userAction, boolean expanded) { - try { - mBarService.onNotificationExpansionChanged(key, userAction, expanded); - } catch (RemoteException e) { - // Ignore. - } + mUiOffloadThread.submit(() -> { + try { + mBarService.onNotificationExpansionChanged(key, userAction, expanded); + } catch (RemoteException e) { + // Ignore. + } + }); } public boolean isKeyguardSecure() { diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/KeyguardMonitorImpl.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/KeyguardMonitorImpl.java index d6c080ad1f44..7bce33a2950d 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/KeyguardMonitorImpl.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/KeyguardMonitorImpl.java @@ -124,13 +124,11 @@ public class KeyguardMonitorImpl extends KeyguardUpdateMonitorCallback mKeyguardFadingAway = true; mKeyguardFadingAwayDelay = delay; mKeyguardFadingAwayDuration = fadeoutDuration; - notifyKeyguardChanged(); } public void notifyKeyguardDoneFading() { mKeyguardFadingAway = false; mKeyguardGoingAway = false; - notifyKeyguardChanged(); } @Override 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 53671a19a846..e1acc9b256d6 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/UserSwitcherController.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/UserSwitcherController.java @@ -872,7 +872,14 @@ public class UserSwitcherController { private final KeyguardMonitor.Callback mCallback = new KeyguardMonitor.Callback() { @Override public void onKeyguardShowingChanged() { - notifyAdapters(); + + // When Keyguard is going away, we don't need to update our items immediately which + // helps making the transition faster. + if (!mKeyguardMonitor.isShowing()) { + mHandler.post(UserSwitcherController.this::notifyAdapters); + } else { + notifyAdapters(); + } } }; diff --git a/packages/SystemUI/tests/src/com/android/systemui/SysuiTestCase.java b/packages/SystemUI/tests/src/com/android/systemui/SysuiTestCase.java index aadae0f22c17..0aac1c01e175 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/SysuiTestCase.java +++ b/packages/SystemUI/tests/src/com/android/systemui/SysuiTestCase.java @@ -21,15 +21,21 @@ import android.os.Looper; import android.os.MessageQueue; import android.support.test.InstrumentationRegistry; import android.testing.LeakCheck; +import android.util.Log; import org.junit.Before; import org.junit.Rule; +import java.util.concurrent.ExecutionException; +import java.util.concurrent.Future; + /** * Base class that does System UI specific setup. */ public abstract class SysuiTestCase { + private static final String TAG = "SysuiTestCase"; + private Handler mHandler; @Rule public SysuiTestableContext mContext = new SysuiTestableContext( @@ -57,6 +63,15 @@ public abstract class SysuiTestCase { waitForIdleSync(mHandler); } + protected void waitForUiOffloadThread() { + Future<?> future = Dependency.get(UiOffloadThread.class).submit(() -> {}); + try { + future.get(); + } catch (InterruptedException | ExecutionException e) { + Log.e(TAG, "Failed to wait for ui offload thread.", e); + } + } + public static void waitForIdleSync(Handler h) { validateThread(h.getLooper()); Idler idler = new Idler(null); diff --git a/packages/SystemUI/tests/src/com/android/systemui/keyguard/DismissCallbackRegistryTest.java b/packages/SystemUI/tests/src/com/android/systemui/keyguard/DismissCallbackRegistryTest.java index 131a70b2c109..308670dc7cfb 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/keyguard/DismissCallbackRegistryTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/keyguard/DismissCallbackRegistryTest.java @@ -23,6 +23,8 @@ import android.support.test.filters.SmallTest; import android.support.test.runner.AndroidJUnit4; import com.android.internal.policy.IKeyguardDismissCallback; +import com.android.systemui.SysuiTestCase; +import com.android.systemui.UiOffloadThread; import org.junit.Before; import org.junit.Test; @@ -35,7 +37,7 @@ import org.mockito.MockitoAnnotations; */ @SmallTest @RunWith(AndroidJUnit4.class) -public class DismissCallbackRegistryTest { +public class DismissCallbackRegistryTest extends SysuiTestCase { private final DismissCallbackRegistry mDismissCallbackRegistry = new DismissCallbackRegistry(); private @Mock IKeyguardDismissCallback mMockCallback; @@ -50,6 +52,7 @@ public class DismissCallbackRegistryTest { public void testCancelled() throws Exception { mDismissCallbackRegistry.addCallback(mMockCallback); mDismissCallbackRegistry.notifyDismissCancelled(); + waitForUiOffloadThread(); verify(mMockCallback).onDismissCancelled(); } @@ -58,6 +61,7 @@ public class DismissCallbackRegistryTest { mDismissCallbackRegistry.addCallback(mMockCallback); mDismissCallbackRegistry.addCallback(mMockCallback2); mDismissCallbackRegistry.notifyDismissCancelled(); + waitForUiOffloadThread(); verify(mMockCallback).onDismissCancelled(); verify(mMockCallback2).onDismissCancelled(); } @@ -66,6 +70,7 @@ public class DismissCallbackRegistryTest { public void testSucceeded() throws Exception { mDismissCallbackRegistry.addCallback(mMockCallback); mDismissCallbackRegistry.notifyDismissSucceeded(); + waitForUiOffloadThread(); verify(mMockCallback).onDismissSucceeded(); } @@ -74,6 +79,7 @@ public class DismissCallbackRegistryTest { mDismissCallbackRegistry.addCallback(mMockCallback); mDismissCallbackRegistry.addCallback(mMockCallback2); mDismissCallbackRegistry.notifyDismissSucceeded(); + waitForUiOffloadThread(); verify(mMockCallback).onDismissSucceeded(); verify(mMockCallback2).onDismissSucceeded(); } @@ -83,6 +89,7 @@ public class DismissCallbackRegistryTest { mDismissCallbackRegistry.addCallback(mMockCallback); mDismissCallbackRegistry.notifyDismissSucceeded(); mDismissCallbackRegistry.notifyDismissSucceeded(); + waitForUiOffloadThread(); verify(mMockCallback, times(1)).onDismissSucceeded(); } } diff --git a/services/core/java/com/android/server/BluetoothManagerService.java b/services/core/java/com/android/server/BluetoothManagerService.java index b65f54ecbda7..61057dd25444 100644 --- a/services/core/java/com/android/server/BluetoothManagerService.java +++ b/services/core/java/com/android/server/BluetoothManagerService.java @@ -1697,7 +1697,7 @@ class BluetoothManagerService extends IBluetoothManager.Stub { mHandler.removeMessages(MESSAGE_USER_SWITCHED); /* disable and enable BT when detect a user switch */ - if (mEnable && mBluetooth != null) { + if (mBluetooth != null && isEnabled()) { try { mBluetoothLock.readLock().lock(); if (mBluetooth != null) { @@ -1766,6 +1766,8 @@ class BluetoothManagerService extends IBluetoothManager.Stub { mState = BluetoothAdapter.STATE_OFF; // enable addActiveLog(REASON_USER_SWITCH, true); + // mEnable flag could have been reset on disableBLE. Reenable it. + mEnable = true; handleEnable(mQuietEnable); } else if (mBinding || mBluetooth != null) { Message userMsg = mHandler.obtainMessage(MESSAGE_USER_SWITCHED); diff --git a/services/core/java/com/android/server/PinnerService.java b/services/core/java/com/android/server/PinnerService.java index a94bf79fcb30..e3ebf4d3a7ee 100644 --- a/services/core/java/com/android/server/PinnerService.java +++ b/services/core/java/com/android/server/PinnerService.java @@ -244,20 +244,22 @@ public final class PinnerService extends SystemService { // 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/am/ActiveServices.java b/services/core/java/com/android/server/am/ActiveServices.java index 5e0350858052..2680b425ff3c 100644 --- a/services/core/java/com/android/server/am/ActiveServices.java +++ b/services/core/java/com/android/server/am/ActiveServices.java @@ -780,7 +780,8 @@ public final class ActiveServices { smap.removeMessages(ServiceMap.MSG_UPDATE_FOREGROUND_APPS); if (nextUpdateTime < Long.MAX_VALUE) { Message msg = smap.obtainMessage(); - smap.sendMessageAtTime(msg, nextUpdateTime); + smap.sendMessageAtTime(msg, nextUpdateTime + + SystemClock.uptimeMillis() - SystemClock.elapsedRealtime()); } } if (!smap.mActiveForegroundAppsChanged) { @@ -811,30 +812,35 @@ public final class ActiveServices { Intent intent; String title; String msg; + String[] pkgs; if (active.size() == 1) { intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS); intent.setData(Uri.fromParts("package", active.get(0).mPackageName, null)); title = context.getString( R.string.foreground_service_app_in_background, active.get(0).mLabel); msg = context.getString(R.string.foreground_service_tap_for_details); + pkgs = new String[] { active.get(0).mPackageName }; } else { intent = new Intent(Settings.ACTION_FOREGROUND_SERVICES_SETTINGS); - String[] pkgs = new String[active.size()]; + pkgs = new String[active.size()]; for (int i = 0; i < active.size(); i++) { pkgs[i] = active.get(i).mPackageName; } intent.putExtra("packages", pkgs); title = context.getString( R.string.foreground_service_apps_in_background, active.size()); - msg = active.get(0).mLabel.toString(); + msg = active.get(0).mLabel.toString(); for (int i = 1; i < active.size(); i++) { msg = context.getString(R.string.foreground_service_multiple_separator, msg, active.get(i).mLabel); } } + Bundle notificationBundle = new Bundle(); + notificationBundle.putStringArray(Notification.EXTRA_FOREGROUND_APPS, pkgs); Notification.Builder n = new Notification.Builder(context, SystemNotificationChannels.FOREGROUND_SERVICE) + .addExtras(notificationBundle) .setSmallIcon(R.drawable.ic_check_circle_24px) .setOngoing(true) .setShowWhen(false) @@ -854,10 +860,11 @@ public final class ActiveServices { } } - private void requestUpdateActiveForegroundAppsLocked(ServiceMap smap, long time) { + private void requestUpdateActiveForegroundAppsLocked(ServiceMap smap, long timeElapsed) { Message msg = smap.obtainMessage(ServiceMap.MSG_UPDATE_FOREGROUND_APPS); - if (time != 0) { - smap.sendMessageAtTime(msg, time); + if (timeElapsed != 0) { + smap.sendMessageAtTime(msg, + timeElapsed + SystemClock.uptimeMillis() - SystemClock.elapsedRealtime()); } else { smap.mActiveForegroundAppsChanged = true; smap.sendMessage(msg); @@ -909,6 +916,9 @@ public final class ActiveServices { if (changed) { requestUpdateActiveForegroundAppsLocked(smap, nowElapsed + mAm.mConstants.FOREGROUND_SERVICE_UI_MIN_TIME); + } else if (smap.mActiveForegroundApps.size() > 0) { + // Just being paranoid. + requestUpdateActiveForegroundAppsLocked(smap, 0); } } } diff --git a/services/core/java/com/android/server/am/ActivityStarter.java b/services/core/java/com/android/server/am/ActivityStarter.java index a2eec5c4bfae..960351b21f63 100644 --- a/services/core/java/com/android/server/am/ActivityStarter.java +++ b/services/core/java/com/android/server/am/ActivityStarter.java @@ -533,11 +533,12 @@ class ActivityStarter { auxiliaryResponse, originalIntent, resolvedType, callingPackage, verificationBundle, userId); } - return InstantAppResolver.buildEphemeralInstallerIntent(originalIntent, - auxiliaryResponse.failureIntent, callingPackage, verificationBundle, - resolvedType, userId, auxiliaryResponse.packageName, - auxiliaryResponse.splitName, auxiliaryResponse.versionCode, - auxiliaryResponse.token, auxiliaryResponse.needsPhaseTwo); + return InstantAppResolver.buildEphemeralInstallerIntent( + Intent.ACTION_INSTALL_INSTANT_APP_PACKAGE, originalIntent, + auxiliaryResponse.failureIntent, callingPackage, verificationBundle, + resolvedType, userId, auxiliaryResponse.packageName, auxiliaryResponse.splitName, + auxiliaryResponse.versionCode, auxiliaryResponse.token, + auxiliaryResponse.needsPhaseTwo); } void postStartActivityProcessing( diff --git a/services/core/java/com/android/server/audio/PlaybackActivityMonitor.java b/services/core/java/com/android/server/audio/PlaybackActivityMonitor.java index dcd58e7601cd..702cbbed17de 100644 --- a/services/core/java/com/android/server/audio/PlaybackActivityMonitor.java +++ b/services/core/java/com/android/server/audio/PlaybackActivityMonitor.java @@ -67,6 +67,10 @@ public final class PlaybackActivityMonitor .createIfNeeded() .build(); + // like a PLAY_CREATE_IF_NEEDED operation but with a skip to the end of the ramp + private static final VolumeShaper.Operation PLAY_SKIP_RAMP = + new VolumeShaper.Operation.Builder(PLAY_CREATE_IF_NEEDED).setXOffset(1.0f).build(); + private final ArrayList<PlayMonitorClient> mClients = new ArrayList<PlayMonitorClient>(); // a public client is one that needs an anonymized version of the playback configurations, we // keep track of whether there is at least one to know when we need to create the list of @@ -487,17 +491,19 @@ public final class PlaybackActivityMonitor private static final class DuckingManager { private final HashMap<Integer, DuckedApp> mDuckers = new HashMap<Integer, DuckedApp>(); - void duckUid(int uid, ArrayList<AudioPlaybackConfiguration> apcsToDuck) { + synchronized void duckUid(int uid, ArrayList<AudioPlaybackConfiguration> apcsToDuck) { + if (DEBUG) { Log.v(TAG, "DuckingManager: duckUid() uid:"+ uid); } if (!mDuckers.containsKey(uid)) { mDuckers.put(uid, new DuckedApp(uid)); } final DuckedApp da = mDuckers.get(uid); for (AudioPlaybackConfiguration apc : apcsToDuck) { - da.addDuck(apc); + da.addDuck(apc, false /*skipRamp*/); } } - void unduckUid(int uid, HashMap<Integer, AudioPlaybackConfiguration> players) { + synchronized void unduckUid(int uid, HashMap<Integer, AudioPlaybackConfiguration> players) { + if (DEBUG) { Log.v(TAG, "DuckingManager: unduckUid() uid:"+ uid); } final DuckedApp da = mDuckers.remove(uid); if (da == null) { return; @@ -506,25 +512,27 @@ public final class PlaybackActivityMonitor } // pre-condition: apc.getPlayerState() == AudioPlaybackConfiguration.PLAYER_STATE_STARTED - void checkDuck(@NonNull AudioPlaybackConfiguration apc) { + synchronized void checkDuck(@NonNull AudioPlaybackConfiguration apc) { + if (DEBUG) { Log.v(TAG, "DuckingManager: checkDuck() player piid:" + + apc.getPlayerInterfaceId()+ " uid:"+ apc.getClientUid()); } final DuckedApp da = mDuckers.get(apc.getClientUid()); if (da == null) { return; } - // FIXME here the player needs to be put in a state that is the same as if it - // had been ducked as it starts. At the moment, this works already for linked - // players, as is the case in gapless playback. - da.addDuck(apc); + da.addDuck(apc, true /*skipRamp*/); } - void dump(PrintWriter pw) { + synchronized void dump(PrintWriter pw) { for (DuckedApp da : mDuckers.values()) { da.dump(pw); } } - void removeReleased(@NonNull AudioPlaybackConfiguration apc) { - final DuckedApp da = mDuckers.get(apc.getClientUid()); + synchronized void removeReleased(@NonNull AudioPlaybackConfiguration apc) { + final int uid = apc.getClientUid(); + if (DEBUG) { Log.v(TAG, "DuckingManager: removedReleased() player piid: " + + apc.getPlayerInterfaceId() + " uid:" + uid); } + final DuckedApp da = mDuckers.get(uid); if (da == null) { return; } @@ -550,20 +558,21 @@ public final class PlaybackActivityMonitor // pre-conditions: // * apc != null // * apc.getPlayerState() == AudioPlaybackConfiguration.PLAYER_STATE_STARTED - void addDuck(@NonNull AudioPlaybackConfiguration apc) { + void addDuck(@NonNull AudioPlaybackConfiguration apc, boolean skipRamp) { final int piid = new Integer(apc.getPlayerInterfaceId()); if (mDuckedPlayers.contains(piid)) { - if (DEBUG) { Log.v(TAG, "player " + piid + " already ducked"); } + if (DEBUG) { Log.v(TAG, "player piid:" + piid + " already ducked"); } return; } try { - Log.v(TAG, "ducking player " + apc.getPlayerInterfaceId() + " uid:" + mUid); + Log.v(TAG, "ducking (skipRamp=" + skipRamp + ") player piid:" + + apc.getPlayerInterfaceId() + " uid:" + mUid); apc.getPlayerProxy().applyVolumeShaper( DUCK_VSHAPE, - PLAY_CREATE_IF_NEEDED); + skipRamp ? PLAY_SKIP_RAMP : PLAY_CREATE_IF_NEEDED); mDuckedPlayers.add(piid); } catch (Exception e) { - Log.e(TAG, "Error ducking player " + piid + " uid:" + mUid, e); + Log.e(TAG, "Error ducking player piid:" + piid + " uid:" + mUid, e); } } @@ -577,13 +586,13 @@ public final class PlaybackActivityMonitor DUCK_ID, VolumeShaper.Operation.REVERSE); } catch (Exception e) { - Log.e(TAG, "Error unducking player " + piid + " uid:" + mUid, e); + Log.e(TAG, "Error unducking player piid:" + piid + " uid:" + mUid, e); } } else { // this piid was in the list of ducked players, but wasn't found if (DEBUG) { - Log.v(TAG, "Error unducking player " + piid + ", player not found for" - + " uid " + mUid); + Log.v(TAG, "Error unducking player piid:" + piid + + ", player not found for uid " + mUid); } } } diff --git a/services/core/java/com/android/server/connectivity/NetworkMonitor.java b/services/core/java/com/android/server/connectivity/NetworkMonitor.java index 96f6f2d82c4c..11296aba8451 100644 --- a/services/core/java/com/android/server/connectivity/NetworkMonitor.java +++ b/services/core/java/com/android/server/connectivity/NetworkMonitor.java @@ -960,14 +960,18 @@ public class NetworkMonitor extends StateMachine { return result; } } - // Otherwise wait until https probe completes and use its result. + // Otherwise wait until http and https probes completes and use their results. try { + httpProbe.join(); + if (httpProbe.result().isPortal()) { + return httpProbe.result(); + } httpsProbe.join(); + return httpsProbe.result(); } catch (InterruptedException e) { - validationLog("Error: https probe wait interrupted!"); + validationLog("Error: http or https probe wait interrupted!"); return CaptivePortalProbeResult.FAILED; } - return httpsProbe.result(); } private URL makeURL(String url) { diff --git a/services/core/java/com/android/server/display/DisplayPowerController.java b/services/core/java/com/android/server/display/DisplayPowerController.java index 0ef0561fe14f..9dc317ad38ac 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 @@ import java.io.PrintWriter; 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 @@ final class DisplayPowerController implements AutomaticBrightnessController.Call 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 @@ final class DisplayPowerController implements AutomaticBrightnessController.Call 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 @@ final class DisplayPowerController implements AutomaticBrightnessController.Call // 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 @@ final class DisplayPowerController implements AutomaticBrightnessController.Call // 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 @@ final class DisplayPowerController implements AutomaticBrightnessController.Call } } + 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 @@ final class DisplayPowerController implements AutomaticBrightnessController.Call // 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 @@ final class DisplayPowerController implements AutomaticBrightnessController.Call updatePowerState(); } break; + case MSG_SCREEN_OFF_UNBLOCKED: + if (mPendingScreenOffUnblocker == msg.obj) { + unblockScreenOff(); + updatePowerState(); + } + break; } } } @@ -1311,4 +1364,14 @@ final class DisplayPowerController implements AutomaticBrightnessController.Call 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/location/GnssLocationProvider.java b/services/core/java/com/android/server/location/GnssLocationProvider.java index 51bebb0963c9..85d89865a074 100644 --- a/services/core/java/com/android/server/location/GnssLocationProvider.java +++ b/services/core/java/com/android/server/location/GnssLocationProvider.java @@ -937,7 +937,7 @@ public class GnssLocationProvider implements LocationProviderInterface { long time = mNtpTime.getCachedNtpTime(); long timeReference = mNtpTime.getCachedNtpTimeReference(); long certainty = mNtpTime.getCacheCertainty(); - long now = System.currentTimeMillis(); + long now = SystemClock.elapsedRealtime(); if (DEBUG) { Log.d(TAG, "NTP server returned: " @@ -1444,7 +1444,8 @@ public class GnssLocationProvider implements LocationProviderInterface { // reset SV count to zero updateStatus(LocationProvider.TEMPORARILY_UNAVAILABLE, 0); - mFixRequestTime = System.currentTimeMillis(); + mFixRequestTime = SystemClock.elapsedRealtime(); + if (!hasCapability(GPS_CAPABILITY_SCHEDULING)) { // set timer to give up if we do not receive a fix within NO_FIX_TIMEOUT // and our fix interval is not short @@ -1514,7 +1515,7 @@ public class GnssLocationProvider implements LocationProviderInterface { } } - mLastFixTime = System.currentTimeMillis(); + mLastFixTime = SystemClock.elapsedRealtime(); // report time to first fix if (mTimeToFirstFix == 0 && hasLatLong) { mTimeToFirstFix = (int)(mLastFixTime - mFixRequestTime); @@ -1629,7 +1630,7 @@ public class GnssLocationProvider implements LocationProviderInterface { updateStatus(mStatus, usedInFixCount); if (mNavigating && mStatus == LocationProvider.AVAILABLE && mLastFixTime > 0 && - System.currentTimeMillis() - mLastFixTime > RECENT_FIX_TIMEOUT) { + SystemClock.elapsedRealtime() - mLastFixTime > RECENT_FIX_TIMEOUT) { // send an intent to notify that the GPS is no longer receiving fixes. Intent intent = new Intent(LocationManager.GPS_FIX_CHANGE_ACTION); intent.putExtra(LocationManager.EXTRA_GPS_ENABLED, false); diff --git a/services/core/java/com/android/server/notification/NotificationRecord.java b/services/core/java/com/android/server/notification/NotificationRecord.java index 5a5e658d3714..803b0dc0ee5e 100644 --- a/services/core/java/com/android/server/notification/NotificationRecord.java +++ b/services/core/java/com/android/server/notification/NotificationRecord.java @@ -153,7 +153,7 @@ public final class NotificationRecord { final ApplicationInfo applicationInfo = mContext.getPackageManager().getApplicationInfoAsUser(sbn.getPackageName(), 0, UserHandle.getUserId(sbn.getUid())); - if (applicationInfo.targetSdkVersion <= Build.VERSION_CODES.N_MR1) { + if (applicationInfo.targetSdkVersion < Build.VERSION_CODES.O) { return true; } } diff --git a/services/core/java/com/android/server/notification/RankingHelper.java b/services/core/java/com/android/server/notification/RankingHelper.java index e184f839e805..f00ef386ba59 100644 --- a/services/core/java/com/android/server/notification/RankingHelper.java +++ b/services/core/java/com/android/server/notification/RankingHelper.java @@ -286,7 +286,7 @@ public class RankingHelper implements RankingConfig { private boolean shouldHaveDefaultChannel(Record r) throws NameNotFoundException { final int userId = UserHandle.getUserId(r.uid); final ApplicationInfo applicationInfo = mPm.getApplicationInfoAsUser(r.pkg, 0, userId); - if (applicationInfo.targetSdkVersion > Build.VERSION_CODES.N_MR1) { + if (applicationInfo.targetSdkVersion >= Build.VERSION_CODES.O) { // O apps should not have the default channel. return false; } diff --git a/services/core/java/com/android/server/pm/EphemeralResolverConnection.java b/services/core/java/com/android/server/pm/EphemeralResolverConnection.java index 1de3936dce5d..562ab3319d64 100644 --- a/services/core/java/com/android/server/pm/EphemeralResolverConnection.java +++ b/services/core/java/com/android/server/pm/EphemeralResolverConnection.java @@ -96,7 +96,7 @@ final class EphemeralResolverConnection implements DeathRecipient { return mGetEphemeralResolveInfoCaller .getEphemeralResolveInfoList(target, hashPrefix, token); } catch (TimeoutException e) { - throw new ConnectionException(ConnectionException.FAILURE_BIND); + throw new ConnectionException(ConnectionException.FAILURE_CALL); } catch (RemoteException ignore) { } } finally { diff --git a/services/core/java/com/android/server/pm/InstantAppResolver.java b/services/core/java/com/android/server/pm/InstantAppResolver.java index 85be4a2c6482..34cc6e37d996 100644 --- a/services/core/java/com/android/server/pm/InstantAppResolver.java +++ b/services/core/java/com/android/server/pm/InstantAppResolver.java @@ -182,6 +182,7 @@ public abstract class InstantAppResolver { failureIntent = null; } final Intent installerIntent = buildEphemeralInstallerIntent( + Intent.ACTION_RESOLVE_INSTANT_APP_PACKAGE, requestObj.origIntent, failureIntent, requestObj.callingPackage, @@ -226,6 +227,7 @@ public abstract class InstantAppResolver { * Builds and returns an intent to launch the instant installer. */ public static Intent buildEphemeralInstallerIntent( + @NonNull String action, @NonNull Intent origIntent, @NonNull Intent failureIntent, @NonNull String callingPackage, @@ -239,7 +241,7 @@ public abstract class InstantAppResolver { boolean needsPhaseTwo) { // Construct the intent that launches the instant installer int flags = origIntent.getFlags(); - final Intent intent = new Intent(); + final Intent intent = new Intent(action); intent.setFlags(flags | Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK diff --git a/services/core/java/com/android/server/pm/PackageManagerService.java b/services/core/java/com/android/server/pm/PackageManagerService.java index cdf504730940..b1068ae70d80 100644 --- a/services/core/java/com/android/server/pm/PackageManagerService.java +++ b/services/core/java/com/android/server/pm/PackageManagerService.java @@ -3512,7 +3512,7 @@ public class PackageManagerService extends IPackageManager.Stub if (ps == null) { return null; } - final PackageParser.Package p = ps.pkg; + PackageParser.Package p = ps.pkg; if (p == null) { return null; } @@ -3640,8 +3640,9 @@ public class PackageManagerService extends IPackageManager.Stub private PackageInfo getPackageInfoInternal(String packageName, int versionCode, int flags, int userId) { if (!sUserManager.exists(userId)) return null; + final int callingUid = Binder.getCallingUid(); flags = updateFlagsForPackage(flags, userId, packageName); - enforceCrossUserPermission(Binder.getCallingUid(), userId, + enforceCrossUserPermission(callingUid, userId, false /* requireFullPermission */, false /* checkShell */, "get package info"); // reader @@ -3653,7 +3654,10 @@ public class PackageManagerService extends IPackageManager.Stub if (matchFactoryOnly) { final PackageSetting ps = mSettings.getDisabledSystemPkgLPr(packageName); if (ps != null) { - if (filterSharedLibPackageLPr(ps, Binder.getCallingUid(), userId, flags)) { + if (filterSharedLibPackageLPr(ps, callingUid, userId, flags)) { + return null; + } + if (filterAppAccessLPr(ps, callingUid, userId)) { return null; } return generatePackageInfo(ps, flags, userId); @@ -3667,15 +3671,22 @@ public class PackageManagerService extends IPackageManager.Stub if (DEBUG_PACKAGE_INFO) Log.v(TAG, "getPackageInfo " + packageName + ": " + p); if (p != null) { - if (filterSharedLibPackageLPr((PackageSetting) p.mExtras, - Binder.getCallingUid(), userId, flags)) { + final PackageSetting ps = (PackageSetting) p.mExtras; + if (filterSharedLibPackageLPr(ps, callingUid, userId, flags)) { + return null; + } + if (ps != null && filterAppAccessLPr(ps, callingUid, userId)) { return null; } return generatePackageInfo((PackageSetting)p.mExtras, flags, userId); } if (!matchFactoryOnly && (flags & MATCH_KNOWN_PACKAGES) != 0) { final PackageSetting ps = mSettings.mPackages.get(packageName); - if (filterSharedLibPackageLPr(ps, Binder.getCallingUid(), userId, flags)) { + if (ps == null) return null; + if (filterSharedLibPackageLPr(ps, callingUid, userId, flags)) { + return null; + } + if (filterAppAccessLPr(ps, callingUid, userId)) { return null; } return generatePackageInfo(ps, flags, userId); @@ -3684,6 +3695,57 @@ public class PackageManagerService extends IPackageManager.Stub return null; } + /** + * Returns whether or not access to the application should be filtered. + * <p> + * Access may be limited based upon whether the calling or target applications + * are instant applications. + * + * @see #canAccessInstantApps(int) + */ + private boolean filterAppAccessLPr(@NonNull PackageSetting ps, int callingUid, + @Nullable ComponentName component, boolean componentVisibleToInstantApp, int userId) { + // if we're in an isolated process, get the real calling UID + if (Process.isIsolated(callingUid)) { + callingUid = mIsolatedOwners.get(callingUid); + } + // 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; + } + // request for application; if no components have been explicitly exposed, filter + return !ps.pkg.visibleToInstantApps; + } + if (ps.getInstantApp(userId)) { + // caller can see all components of all instant applications, don't filter + if (canAccessInstantApps(callingUid)) { + return false; + } + // request for a specific instant application component, filter + if (component != null) { + return true; + } + // request for an instant application; if the caller hasn't been granted access, filter + return !mInstantAppRegistry.isInstantAccessGranted( + userId, UserHandle.getAppId(callingUid), ps.appId); + } + return false; + } + + /** + * @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 filterSharedLibPackageLPr(@Nullable PackageSetting ps, int uid, int userId, int flags) { // Callers can access only the libs they depend on, otherwise they need to explicitly @@ -3892,6 +3954,9 @@ public class PackageManagerService extends IPackageManager.Stub if (filterSharedLibPackageLPr(ps, uid, userId, flags)) { return null; } + if (filterAppAccessLPr(ps, uid, userId)) { + return null; + } if (ps.pkg == null) { final PackageInfo pInfo = generatePackageInfo(ps, flags, userId); if (pInfo != null) { @@ -3933,6 +3998,9 @@ public class PackageManagerService extends IPackageManager.Stub if (filterSharedLibPackageLPr(ps, Binder.getCallingUid(), userId, flags)) { return null; } + if (filterAppAccessLPr(ps, Binder.getCallingUid(), userId)) { + return null; + } // Note: isEnabledLP() does not apply here - always return info ApplicationInfo ai = PackageParser.generateApplicationInfo( p, flags, ps.readUserState(userId), userId); @@ -4232,15 +4300,15 @@ public class PackageManagerService extends IPackageManager.Stub */ int updateFlagsForResolve(int flags, int userId, Intent intent, int callingUid) { return updateFlagsForResolve(flags, userId, intent, callingUid, - false /*includeInstantApps*/, false /*onlyExposedExplicitly*/); + false /*wantInstantApps*/, false /*onlyExposedExplicitly*/); } int updateFlagsForResolve(int flags, int userId, Intent intent, int callingUid, - boolean includeInstantApps) { + boolean wantInstantApps) { return updateFlagsForResolve(flags, userId, intent, callingUid, - includeInstantApps, false /*onlyExposedExplicitly*/); + wantInstantApps, false /*onlyExposedExplicitly*/); } int updateFlagsForResolve(int flags, int userId, Intent intent, int callingUid, - boolean includeInstantApps, boolean onlyExposedExplicitly) { + boolean wantInstantApps, boolean onlyExposedExplicitly) { // Safe mode means we shouldn't match any third-party components if (mSafeMode) { flags |= PackageManager.MATCH_SYSTEM_ONLY; @@ -4253,18 +4321,11 @@ public class PackageManagerService extends IPackageManager.Stub flags |= PackageManager.MATCH_VISIBLE_TO_INSTANT_APP_ONLY; flags |= PackageManager.MATCH_INSTANT; } else { - // Otherwise, prevent leaking ephemeral components - final boolean isSpecialProcess = - callingUid == Process.SYSTEM_UID - || callingUid == Process.SHELL_UID - || callingUid == 0; final boolean allowMatchInstant = - (includeInstantApps + (wantInstantApps && Intent.ACTION_VIEW.equals(intent.getAction()) && hasWebURI(intent)) - || isSpecialProcess - || mContext.checkCallingOrSelfPermission( - android.Manifest.permission.ACCESS_INSTANT_APPS) == PERMISSION_GRANTED; + || canAccessInstantApps(callingUid); flags &= ~(PackageManager.MATCH_VISIBLE_TO_INSTANT_APP_ONLY | PackageManager.MATCH_EXPLICITLY_VISIBLE_ONLY); if (!allowMatchInstant) { @@ -4295,8 +4356,9 @@ public class PackageManagerService extends IPackageManager.Stub @Override public ActivityInfo getActivityInfo(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 activity info"); synchronized (mPackages) { PackageParser.Activity a = mActivities.mActivities.get(component); @@ -4305,6 +4367,11 @@ public class PackageManagerService extends IPackageManager.Stub 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)) { + return null; + } return generateActivityInfo(a, flags, ps.readUserState(userId), userId); } if (mResolveComponentName.equals(component)) { @@ -4469,8 +4536,9 @@ public class PackageManagerService extends IPackageManager.Stub @Override public ServiceInfo getServiceInfo(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 service info"); synchronized (mPackages) { PackageParser.Service s = mServices.mServices.get(component); @@ -4479,6 +4547,11 @@ public class PackageManagerService extends IPackageManager.Stub 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)) { + return null; + } ServiceInfo si = PackageParser.generateServiceInfo(s, flags, ps.readUserState(userId), userId); if (si != null) { @@ -4493,8 +4566,9 @@ public class PackageManagerService extends IPackageManager.Stub @Override public ProviderInfo getProviderInfo(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 provider info"); synchronized (mPackages) { PackageParser.Provider p = mProviders.mProviders.get(component); @@ -4503,6 +4577,11 @@ public class PackageManagerService extends IPackageManager.Stub 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)) { + return null; + } ProviderInfo pi = PackageParser.generateProviderInfo(p, flags, ps.readUserState(userId), userId); if (pi != null) { @@ -17447,17 +17526,24 @@ public class PackageManagerService extends IPackageManager.Stub } } - Trace.traceBegin(TRACE_TAG_PACKAGE_MANAGER, "dexopt"); - // Do not run PackageDexOptimizer through the local performDexOpt - // method because `pkg` may not be in `mPackages` yet. - // - // Also, don't fail application installs if the dexopt step fails. - mPackageDexOptimizer.performDexOpt(pkg, pkg.usesLibraryFiles, - null /* instructionSets */, false /* checkProfiles */, - getCompilerFilterForReason(REASON_INSTALL), - getOrCreateCompilerPackageStats(pkg), - mDexManager.isUsedByOtherApps(pkg.packageName)); - Trace.traceEnd(TRACE_TAG_PACKAGE_MANAGER); + // dexopt can take some time to complete, so, for instant apps, we skip this + // step during installation. Instead, we'll take extra time the first time the + // instant app starts. It's preferred to do it this way to provide continuous + // progress to the user instead of mysteriously blocking somewhere in the + // middle of running an instant app. + if (!instantApp) { + Trace.traceBegin(TRACE_TAG_PACKAGE_MANAGER, "dexopt"); + // Do not run PackageDexOptimizer through the local performDexOpt + // method because `pkg` may not be in `mPackages` yet. + // + // Also, don't fail application installs if the dexopt step fails. + mPackageDexOptimizer.performDexOpt(pkg, pkg.usesLibraryFiles, + null /* instructionSets */, false /* checkProfiles */, + getCompilerFilterForReason(REASON_INSTALL), + getOrCreateCompilerPackageStats(pkg), + mDexManager.isUsedByOtherApps(pkg.packageName)); + Trace.traceEnd(TRACE_TAG_PACKAGE_MANAGER); + } // Notify BackgroundDexOptService that the package has been changed. // If this is an update of a package which used to fail to compile, diff --git a/services/core/java/com/android/server/policy/PhoneWindowManager.java b/services/core/java/com/android/server/policy/PhoneWindowManager.java index 8e058ad8574b..78727c056288 100644 --- a/services/core/java/com/android/server/policy/PhoneWindowManager.java +++ b/services/core/java/com/android/server/policy/PhoneWindowManager.java @@ -6667,6 +6667,11 @@ public class PhoneWindowManager implements WindowManagerPolicy { reportScreenStateToVrManager(true); } + @Override + public void screenTurningOff(ScreenOffListener screenOffListener) { + mWindowManagerFuncs.screenTurningOff(screenOffListener); + } + private void reportScreenStateToVrManager(boolean isScreenOn) { if (mVrManagerInternal == null) { return; diff --git a/services/core/java/com/android/server/trust/TrustManagerService.java b/services/core/java/com/android/server/trust/TrustManagerService.java index 8e06a51238ee..e12dc1d59a72 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 @@ public class TrustManagerService extends SystemService { // 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/wm/AppWindowContainerController.java b/services/core/java/com/android/server/wm/AppWindowContainerController.java index 5545e2b770ee..c982f081d624 100644 --- a/services/core/java/com/android/server/wm/AppWindowContainerController.java +++ b/services/core/java/com/android/server/wm/AppWindowContainerController.java @@ -19,6 +19,7 @@ package com.android.server.wm; import static android.content.pm.ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED; import static android.view.WindowManager.LayoutParams.FLAG_SHOW_WALLPAPER; import static com.android.server.wm.AppTransition.TRANSIT_UNSET; +import static com.android.server.wm.WindowManagerDebugConfig.DEBUG; import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_ADD_REMOVE; import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_APP_TRANSITIONS; import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_ORIENTATION; @@ -98,18 +99,27 @@ public class AppWindowContainerController private final Runnable mRemoveStartingWindow = () -> { StartingSurface surface = null; synchronized (mWindowMap) { - if (DEBUG_STARTING_WINDOW) Slog.v(TAG_WM, "Remove starting " + mContainer - + ": startingWindow=" + mContainer.startingWindow - + " startingView=" + mContainer.startingSurface); if (mContainer == null) { + if (DEBUG_STARTING_WINDOW) Slog.v(TAG_WM, "mContainer was null while trying to" + + " remove starting window"); return; } + if (DEBUG_STARTING_WINDOW) Slog.v(TAG_WM, "Remove starting " + mContainer + + ": startingWindow=" + mContainer.startingWindow + + " startingView=" + mContainer.startingSurface); if (mContainer.startingWindow != null) { surface = mContainer.startingSurface; mContainer.startingData = null; mContainer.startingSurface = null; mContainer.startingWindow = null; mContainer.startingDisplayed = false; + if (surface == null && DEBUG_STARTING_WINDOW) { + Slog.v(TAG_WM, "startingWindow was set but startingSurface==null, couldn't " + + "remove"); + } + } else if (DEBUG_STARTING_WINDOW) { + Slog.v(TAG_WM, "Tried to remove starting window but startingWindow was null:" + + mContainer); } } if (surface != null) { @@ -127,6 +137,8 @@ public class AppWindowContainerController synchronized (mWindowMap) { if (mContainer == null) { + if (DEBUG_STARTING_WINDOW) Slog.v(TAG_WM, "mContainer was null while trying to" + + " add starting window"); return; } startingData = mContainer.startingData; @@ -135,6 +147,8 @@ public class AppWindowContainerController if (startingData == null) { // Animation has been canceled... do nothing. + if (DEBUG_STARTING_WINDOW) Slog.v(TAG_WM, "startingData was nulled out before handling" + + " mAddStartingWindow: " + mContainer); return; } @@ -174,6 +188,8 @@ public class AppWindowContainerController if (abort) { surface.remove(); } + } else if (DEBUG_STARTING_WINDOW) { + Slog.v(TAG_WM, "Surface returned was null: " + mContainer); } }; @@ -450,7 +466,9 @@ public class AppWindowContainerController boolean allowTaskSnapshot, boolean activityCreated) { synchronized(mWindowMap) { if (DEBUG_STARTING_WINDOW) Slog.v(TAG_WM, "setAppStartingWindow: token=" + mToken - + " pkg=" + pkg + " transferFrom=" + transferFrom); + + " pkg=" + pkg + " transferFrom=" + transferFrom + " newTask=" + newTask + + " taskSwitch=" + taskSwitch + " processRunning=" + processRunning + + " allowTaskSnapshot=" + allowTaskSnapshot); if (mContainer == null) { Slog.w(TAG_WM, "Attempted to set icon of non-existing app token: " + mToken); @@ -536,7 +554,7 @@ public class AppWindowContainerController return false; } - if (DEBUG_STARTING_WINDOW) Slog.v(TAG_WM, "Creating StartingData"); + if (DEBUG_STARTING_WINDOW) Slog.v(TAG_WM, "Creating SplashScreenStartingData"); mContainer.startingData = new SplashScreenStartingData(mService, pkg, theme, compatInfo, nonLocalizedLabel, labelRes, icon, logo, windowFlags, mContainer.getMergedOverrideConfiguration()); @@ -574,6 +592,7 @@ public class AppWindowContainerController return false; } + if (DEBUG_STARTING_WINDOW) Slog.v(TAG_WM, "Creating SnapshotStartingData"); mContainer.startingData = new SnapshotStartingData(mService, snapshot); scheduleAddStartingWindow(); return true; @@ -583,6 +602,8 @@ public class AppWindowContainerController synchronized (mWindowMap) { if (mHandler.hasCallbacks(mRemoveStartingWindow)) { // Already scheduled. + if (DEBUG_STARTING_WINDOW) Slog.v(TAG_WM, "Trying to remove starting window but " + + "already scheduled"); return; } @@ -597,8 +618,7 @@ public class AppWindowContainerController return; } - if (DEBUG_STARTING_WINDOW) Slog.v(TAG_WM, Debug.getCallers(1) - + ": Schedule remove starting " + mContainer + if (DEBUG_STARTING_WINDOW) Slog.v(TAG_WM, "Schedule remove starting " + mContainer + " startingWindow=" + mContainer.startingWindow); mHandler.post(mRemoveStartingWindow); } diff --git a/services/core/java/com/android/server/wm/AppWindowToken.java b/services/core/java/com/android/server/wm/AppWindowToken.java index 57b0fe2c04d9..17db253adb16 100644 --- a/services/core/java/com/android/server/wm/AppWindowToken.java +++ b/services/core/java/com/android/server/wm/AppWindowToken.java @@ -38,6 +38,7 @@ import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_FOCUS_LIGHT; import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_LAYOUT_REPEATS; import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_ORIENTATION; import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_STARTING_WINDOW; +import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_STARTING_WINDOW_VERBOSE; import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_TOKEN_MOVEMENT; import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_VISIBILITY; import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_WINDOW_MOVEMENT; @@ -53,7 +54,6 @@ import android.app.Activity; import android.content.res.Configuration; import android.graphics.Rect; import android.os.Binder; -import android.os.Build; import android.os.Debug; import android.os.IBinder; import android.os.SystemClock; @@ -155,6 +155,9 @@ class AppWindowToken extends WindowToken implements WindowManagerService.AppFree StartingSurface startingSurface; boolean startingDisplayed; boolean startingMoved; + // True if the hidden state of this token was forced to false due to a transferred starting + // window. + private boolean mHiddenSetFromTransferredStartingWindow; boolean firstWindowDrawn; private final WindowState.UpdateReportedVisibilityResults mReportedVisibilityResults = new WindowState.UpdateReportedVisibilityResults(); @@ -185,7 +188,7 @@ class AppWindowToken extends WindowToken implements WindowManagerService.AppFree ArrayDeque<Rect> mFrozenBounds = new ArrayDeque<>(); ArrayDeque<Configuration> mFrozenMergedConfig = new ArrayDeque<>(); - private boolean mDisbalePreviewScreenshots; + private boolean mDisablePreviewScreenshots; Task mLastParent; @@ -790,14 +793,22 @@ class AppWindowToken extends WindowToken implements WindowManagerService.AppFree if (getController() != null) { getController().removeStartingWindow(); } - } else if (mChildren.size() == 0 && startingData != null) { + } else if (mChildren.size() == 0) { // If this is the last window and we had requested a starting transition window, // well there is no point now. if (DEBUG_STARTING_WINDOW) Slog.v(TAG_WM, "Nulling last startingData"); startingData = null; + if (mHiddenSetFromTransferredStartingWindow) { + // We set the hidden state to false for the token from a transferred starting window. + // We now reset it back to true since the starting window was the last window in the + // token. + hidden = true; + } } else if (mChildren.size() == 1 && startingSurface != null && !isRelaunching()) { // If this is the last window except for a starting transition window, // we need to get rid of the starting transition. + if (DEBUG_STARTING_WINDOW) Slog.v(TAG_WM, "Last window, removing starting window " + + win); if (getController() != null) { getController().removeStartingWindow(); } @@ -1171,6 +1182,7 @@ class AppWindowToken extends WindowToken implements WindowManagerService.AppFree "Removing starting " + tStartingWindow + " from " + fromToken); fromToken.removeChild(tStartingWindow); fromToken.postWindowRemoveStartingWindowCleanup(tStartingWindow); + fromToken.mHiddenSetFromTransferredStartingWindow = false; addWindow(tStartingWindow); // Propagate other interesting state between the tokens. If the old token is displayed, @@ -1186,6 +1198,7 @@ class AppWindowToken extends WindowToken implements WindowManagerService.AppFree if (!fromToken.hidden) { hidden = false; hiddenRequested = false; + mHiddenSetFromTransferredStartingWindow = true; } setClientHidden(fromToken.mClientHidden); fromToken.mAppAnimator.transferCurrentAnimation( @@ -1362,7 +1375,7 @@ class AppWindowToken extends WindowToken implements WindowManagerService.AppFree * windows in this app token where not considered drawn as of the last pass. */ boolean updateDrawnWindowStates(WindowState w) { - if (DEBUG_STARTING_WINDOW && w == startingWindow) { + if (DEBUG_STARTING_WINDOW_VERBOSE && w == startingWindow) { Slog.d(TAG, "updateWindows: starting " + w + " isOnScreen=" + w.isOnScreen() + " allDrawn=" + allDrawn + " freezingScreen=" + mAppAnimator.freezingScreen); } @@ -1544,7 +1557,7 @@ class AppWindowToken extends WindowToken implements WindowManagerService.AppFree * See {@link Activity#setDisablePreviewScreenshots}. */ void setDisablePreviewScreenshots(boolean disable) { - mDisbalePreviewScreenshots = disable; + mDisablePreviewScreenshots = disable; } /** @@ -1556,7 +1569,7 @@ class AppWindowToken extends WindowToken implements WindowManagerService.AppFree * screenshot. */ boolean shouldUseAppThemeSnapshot() { - return mDisbalePreviewScreenshots || forAllWindows(w -> (w.mAttrs.flags & FLAG_SECURE) != 0, + return mDisablePreviewScreenshots || forAllWindows(w -> (w.mAttrs.flags & FLAG_SECURE) != 0, true /* topToBottom */); } @@ -1604,11 +1617,13 @@ class AppWindowToken extends WindowToken implements WindowManagerService.AppFree pw.print(" mIsExiting="); pw.println(mIsExiting); } if (startingWindow != null || startingSurface != null - || startingDisplayed || startingMoved) { + || startingDisplayed || startingMoved || mHiddenSetFromTransferredStartingWindow) { pw.print(prefix); pw.print("startingWindow="); pw.print(startingWindow); pw.print(" startingSurface="); pw.print(startingSurface); pw.print(" startingDisplayed="); pw.print(startingDisplayed); - pw.print(" startingMoved="); pw.println(startingMoved); + pw.print(" startingMoved="); pw.print(startingMoved); + pw.println(" mHiddenSetFromTransferredStartingWindow=" + + mHiddenSetFromTransferredStartingWindow); } if (!mFrozenBounds.isEmpty()) { pw.print(prefix); pw.print("mFrozenBounds="); pw.println(mFrozenBounds); diff --git a/services/core/java/com/android/server/wm/DisplayContent.java b/services/core/java/com/android/server/wm/DisplayContent.java index bbf7d9ff8a52..221e7957ef35 100644 --- a/services/core/java/com/android/server/wm/DisplayContent.java +++ b/services/core/java/com/android/server/wm/DisplayContent.java @@ -1899,6 +1899,11 @@ class DisplayContent extends WindowContainer<DisplayContent.DisplayChildWindowCo return true; } + /** @return 'true' if removal of this display content is deferred due to active animation. */ + boolean isRemovalDeferred() { + return mDeferredRemoval; + } + boolean animateForIme(float interpolatedValue, float animationTarget, float dividerAnimationTarget) { boolean updated = false; @@ -2898,6 +2903,11 @@ class DisplayContent extends WindowContainer<DisplayContent.DisplayChildWindowCo * 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 -> { diff --git a/services/core/java/com/android/server/wm/RootWindowContainer.java b/services/core/java/com/android/server/wm/RootWindowContainer.java index be3558b3f52f..233e75bbfec7 100644 --- a/services/core/java/com/android/server/wm/RootWindowContainer.java +++ b/services/core/java/com/android/server/wm/RootWindowContainer.java @@ -181,7 +181,12 @@ class RootWindowContainer extends WindowContainer<DisplayContent> { final int size = mChildren.size(); for (int i = 0; i < size; ++i) { - displaysInFocusOrder.put(i, mChildren.get(i).getDisplayId()); + final DisplayContent displayContent = mChildren.get(i); + if (displayContent.isRemovalDeferred()) { + // Don't report displays that are going to be removed soon. + continue; + } + displaysInFocusOrder.put(i, displayContent.getDisplayId()); } } diff --git a/services/core/java/com/android/server/wm/Task.java b/services/core/java/com/android/server/wm/Task.java index 27661e2ef045..818df018d2fd 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 android.view.Surface; 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 @@ class Task extends WindowContainer<AppWindowToken> implements DimLayer.DimLayerU } @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 1bbe1d0c9a93..24cb464b5993 100644 --- a/services/core/java/com/android/server/wm/TaskSnapshotController.java +++ b/services/core/java/com/android/server/wm/TaskSnapshotController.java @@ -30,8 +30,10 @@ 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.WindowManager.LayoutParams; +import android.view.WindowManagerPolicy.ScreenOffListener; import android.view.WindowManagerPolicy.StartingSurface; import com.google.android.collect.Sets; @@ -40,6 +42,7 @@ import com.android.internal.annotations.VisibleForTesting; import com.android.server.wm.TaskSnapshotSurface.SystemBarBackgroundPainter; import java.io.PrintWriter; +import java.util.function.Consumer; /** * When an app token becomes invisible, we take a snapshot (bitmap) of the corresponding task and @@ -83,6 +86,7 @@ class TaskSnapshotController { 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 +118,13 @@ class TaskSnapshotController { // 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) { @@ -284,6 +293,33 @@ class TaskSnapshotController { 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 866bfc015a5f..297e2880a455 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.File; 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 @@ class TaskSnapshotPersister { 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 @@ class TaskSnapshotPersister { @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 @@ class TaskSnapshotPersister { next = null; } else { next = mWriteQueue.poll(); + if (next != null) { + next.onDequeuedLocked(); + } } } if (next != null) { @@ -226,6 +244,18 @@ class TaskSnapshotPersister { 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 @@ class TaskSnapshotPersister { } @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/TaskSnapshotSurface.java b/services/core/java/com/android/server/wm/TaskSnapshotSurface.java index 5e7b9100af4e..3a116bb10d98 100644 --- a/services/core/java/com/android/server/wm/TaskSnapshotSurface.java +++ b/services/core/java/com/android/server/wm/TaskSnapshotSurface.java @@ -39,6 +39,7 @@ import static com.android.internal.policy.DecorView.STATUS_BAR_COLOR_VIEW_ATTRIB import static com.android.internal.policy.DecorView.getColorViewLeftInset; import static com.android.internal.policy.DecorView.getColorViewTopInset; import static com.android.internal.policy.DecorView.getNavigationBarRect; +import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_STARTING_WINDOW; import static com.android.server.wm.WindowManagerDebugConfig.TAG_WITH_CLASS_NAME; import static com.android.server.wm.WindowManagerDebugConfig.TAG_WM; @@ -113,7 +114,7 @@ class TaskSnapshotSurface implements StartingSurface { private final Rect mStableInsets = new Rect(); private final Rect mContentInsets = new Rect(); private final Rect mFrame = new Rect(); - private final TaskSnapshot mSnapshot; + private TaskSnapshot mSnapshot; private final CharSequence mTitle; private boolean mHasDrawn; private long mShownTime; @@ -232,10 +233,14 @@ class TaskSnapshotSurface implements StartingSurface { final long now = SystemClock.uptimeMillis(); if (mSizeMismatch && now - mShownTime < SIZE_MISMATCH_MINIMUM_TIME_MS) { mHandler.postAtTime(this::remove, mShownTime + SIZE_MISMATCH_MINIMUM_TIME_MS); + if (DEBUG_STARTING_WINDOW) { + Slog.v(TAG, "Defer removing snapshot surface in " + (now - mShownTime) + "ms"); + } return; } } try { + if (DEBUG_STARTING_WINDOW) Slog.v(TAG, "Removing snapshot surface"); mSession.remove(mWindow); } catch (RemoteException e) { // Local call. @@ -254,6 +259,8 @@ class TaskSnapshotSurface implements StartingSurface { private void drawSnapshot() { final GraphicBuffer buffer = mSnapshot.getSnapshot(); + if (DEBUG_STARTING_WINDOW) Slog.v(TAG, "Drawing snapshot surface sizeMismatch=" + + mSizeMismatch); if (mSizeMismatch) { // The dimensions of the buffer and the window don't match, so attaching the buffer // will fail. Better create a child window with the exact dimensions and fill the parent @@ -267,6 +274,9 @@ class TaskSnapshotSurface implements StartingSurface { mHasDrawn = true; } reportDrawn(); + + // In case window manager leaks us, make sure we don't retain the snapshot. + mSnapshot = null; } private void drawSizeMatchSnapshot(GraphicBuffer buffer) { diff --git a/services/core/java/com/android/server/wm/WindowContainer.java b/services/core/java/com/android/server/wm/WindowContainer.java index ca8c48440d0e..600bc5c47062 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 @@ class WindowContainer<E extends WindowContainer> implements Comparable<WindowCon 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); @@ -655,39 +666,44 @@ class WindowContainer<E extends WindowContainer> implements Comparable<WindowCon final LinkedList<WindowContainer> thisParentChain = mTmpChain1; final LinkedList<WindowContainer> otherParentChain = mTmpChain2; - getParents(thisParentChain); - other.getParents(otherParentChain); - - // Find the common ancestor of both containers. - WindowContainer commonAncestor = null; - WindowContainer thisTop = thisParentChain.peekLast(); - WindowContainer otherTop = otherParentChain.peekLast(); - while (thisTop != null && otherTop != null && thisTop == otherTop) { - commonAncestor = thisParentChain.removeLast(); - otherParentChain.removeLast(); - thisTop = thisParentChain.peekLast(); - otherTop = otherParentChain.peekLast(); - } - - // Containers don't belong to the same hierarchy??? - if (commonAncestor == null) { - throw new IllegalArgumentException("No in the same hierarchy this=" - + thisParentChain + " other=" + otherParentChain); - } - - // Children are always considered greater than their parents, so if one of the containers - // we are comparing it the parent of the other then whichever is the child is greater. - if (commonAncestor == this) { - return -1; - } else if (commonAncestor == other) { - return 1; - } - - // The position of the first non-common ancestor in the common ancestor list determines - // which is greater the which. - final WindowList<WindowContainer> list = commonAncestor.mChildren; - return list.indexOf(thisParentChain.peekLast()) > list.indexOf(otherParentChain.peekLast()) - ? 1 : -1; + try { + getParents(thisParentChain); + other.getParents(otherParentChain); + + // Find the common ancestor of both containers. + WindowContainer commonAncestor = null; + WindowContainer thisTop = thisParentChain.peekLast(); + WindowContainer otherTop = otherParentChain.peekLast(); + while (thisTop != null && otherTop != null && thisTop == otherTop) { + commonAncestor = thisParentChain.removeLast(); + otherParentChain.removeLast(); + thisTop = thisParentChain.peekLast(); + otherTop = otherParentChain.peekLast(); + } + + // Containers don't belong to the same hierarchy??? + if (commonAncestor == null) { + throw new IllegalArgumentException("No in the same hierarchy this=" + + thisParentChain + " other=" + otherParentChain); + } + + // Children are always considered greater than their parents, so if one of the containers + // we are comparing it the parent of the other then whichever is the child is greater. + if (commonAncestor == this) { + return -1; + } else if (commonAncestor == other) { + return 1; + } + + // The position of the first non-common ancestor in the common ancestor list determines + // which is greater the which. + final WindowList<WindowContainer> list = commonAncestor.mChildren; + return list.indexOf(thisParentChain.peekLast()) > list.indexOf(otherParentChain.peekLast()) + ? 1 : -1; + } finally { + mTmpChain1.clear(); + mTmpChain2.clear(); + } } private void getParents(LinkedList<WindowContainer> parents) { diff --git a/services/core/java/com/android/server/wm/WindowManagerDebugConfig.java b/services/core/java/com/android/server/wm/WindowManagerDebugConfig.java index 1b61fca5e25c..8279b5167766 100644 --- a/services/core/java/com/android/server/wm/WindowManagerDebugConfig.java +++ b/services/core/java/com/android/server/wm/WindowManagerDebugConfig.java @@ -51,7 +51,8 @@ public class WindowManagerDebugConfig { static final boolean DEBUG_APP_ORIENTATION = false; static final boolean DEBUG_CONFIGURATION = false; static final boolean DEBUG_APP_TRANSITIONS = false; - static final boolean DEBUG_STARTING_WINDOW = false; + static final boolean DEBUG_STARTING_WINDOW_VERBOSE = false; + static final boolean DEBUG_STARTING_WINDOW = DEBUG_STARTING_WINDOW_VERBOSE || true; static final boolean DEBUG_WALLPAPER = false; static final boolean DEBUG_WALLPAPER_LIGHT = false || DEBUG_WALLPAPER; static final boolean DEBUG_DRAG = false; diff --git a/services/core/java/com/android/server/wm/WindowManagerService.java b/services/core/java/com/android/server/wm/WindowManagerService.java index 6be79004d8f9..a2ae430bacec 100644 --- a/services/core/java/com/android/server/wm/WindowManagerService.java +++ b/services/core/java/com/android/server/wm/WindowManagerService.java @@ -203,6 +203,7 @@ import android.view.WindowManagerGlobal; 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; @@ -1521,7 +1522,7 @@ public class WindowManagerService extends IWindowManager.Stub // Try using the target SDK of the root window if (attachedWindow != null) { return attachedWindow.mAppToken != null - && attachedWindow.mAppToken.mTargetSdk > Build.VERSION_CODES.N_MR1; + && attachedWindow.mAppToken.mTargetSdk >= Build.VERSION_CODES.O; } else { // Otherwise, look at the package try { @@ -1532,7 +1533,7 @@ public class WindowManagerService extends IWindowManager.Stub throw new SecurityException("Package " + packageName + " not in UID " + callingUid); } - if (appInfo.targetSdkVersion > Build.VERSION_CODES.N_MR1) { + if (appInfo.targetSdkVersion >= Build.VERSION_CODES.O) { return true; } } catch (PackageManager.NameNotFoundException e) { @@ -2810,6 +2811,11 @@ public class WindowManagerService extends IWindowManager.Stub 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 diff --git a/services/core/java/com/android/server/wm/WindowState.java b/services/core/java/com/android/server/wm/WindowState.java index 344c61660e00..2ffa15206cb6 100644 --- a/services/core/java/com/android/server/wm/WindowState.java +++ b/services/core/java/com/android/server/wm/WindowState.java @@ -80,6 +80,7 @@ import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_ORIENTATION; import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_POWER; import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_RESIZE; import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_STARTING_WINDOW; +import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_STARTING_WINDOW_VERBOSE; import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_SURFACE_TRACE; import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_VISIBILITY; import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_WALLPAPER_LIGHT; @@ -138,6 +139,7 @@ import com.android.internal.util.ToBooleanFunction; import com.android.server.input.InputWindowHandle; import java.io.PrintWriter; +import java.lang.ref.WeakReference; import java.util.ArrayList; import java.util.Comparator; import java.util.LinkedList; @@ -170,7 +172,7 @@ class WindowState extends WindowContainer<WindowState> implements WindowManagerP final int mOwnerUid; /** The owner has {@link android.Manifest.permission#INTERNAL_SYSTEM_WINDOW} */ final boolean mOwnerCanAddInternalSystemWindow; - final IWindowId mWindowId; + final WindowId mWindowId; WindowToken mToken; // The same object as mToken if this is an app window and null for non-app windows. AppWindowToken mAppToken; @@ -587,20 +589,7 @@ class WindowState extends WindowContainer<WindowState> implements WindowManagerP mAppToken = mToken.asAppWindowToken(); mOwnerUid = ownerId; mOwnerCanAddInternalSystemWindow = ownerCanAddInternalSystemWindow; - mWindowId = new IWindowId.Stub() { - @Override - public void registerFocusObserver(IWindowFocusObserver observer) { - WindowState.this.registerFocusObserver(observer); - } - @Override - public void unregisterFocusObserver(IWindowFocusObserver observer) { - WindowState.this.unregisterFocusObserver(observer); - } - @Override - public boolean isFocused() { - return WindowState.this.isFocused(); - } - }; + mWindowId = new WindowId(this); mAttrs.copyFrom(a); mViewVisibility = viewVisibility; mPolicy = mService.mPolicy; @@ -1306,7 +1295,7 @@ class WindowState extends WindowContainer<WindowState> implements WindowManagerP * otherwise. */ boolean wouldBeVisibleIfPolicyIgnored() { - return mHasSurface && mPolicyVisibility && !isParentWindowHidden() + return mHasSurface && !isParentWindowHidden() && !mAnimatingExit && !mDestroying && (!mIsWallpaper || mWallpaperVisible); } @@ -3797,7 +3786,7 @@ class WindowState extends WindowContainer<WindowState> implements WindowManagerP private void logPerformShow(String prefix) { if (DEBUG_VISIBILITY - || (DEBUG_STARTING_WINDOW && mAttrs.type == TYPE_APPLICATION_STARTING)) { + || (DEBUG_STARTING_WINDOW_VERBOSE && mAttrs.type == TYPE_APPLICATION_STARTING)) { Slog.v(TAG, prefix + this + ": mDrawState=" + mWinAnimator.drawStateToString() + " readyForDisplay=" + isReadyForDisplay() @@ -4435,6 +4424,40 @@ class WindowState extends WindowContainer<WindowState> implements WindowManagerP } } + private static final class WindowId extends IWindowId.Stub { + private final WeakReference<WindowState> mOuter; + + private WindowId(WindowState outer) { + + // Use a weak reference for the outer class. This is important to prevent the following + // leak: Since we send this class to the client process, binder will keep it alive as + // long as the client keeps it alive. Now, if the window is removed, we need to clear + // out our reference so even though this class is kept alive we don't leak WindowState, + // which can keep a whole lot of classes alive. + mOuter = new WeakReference<>(outer); + } + + @Override + public void registerFocusObserver(IWindowFocusObserver observer) { + final WindowState outer = mOuter.get(); + if (outer != null) { + outer.registerFocusObserver(observer); + } + } + @Override + public void unregisterFocusObserver(IWindowFocusObserver observer) { + final WindowState outer = mOuter.get(); + if (outer != null) { + outer.unregisterFocusObserver(observer); + } + } + @Override + public boolean isFocused() { + final WindowState outer = mOuter.get(); + return outer != null && outer.isFocused(); + } + } + boolean usesRelativeZOrdering() { if (!isChildWindow()) { return false; diff --git a/services/core/java/com/android/server/wm/WindowStateAnimator.java b/services/core/java/com/android/server/wm/WindowStateAnimator.java index e1c6bc39ca41..d75afcf357a8 100644 --- a/services/core/java/com/android/server/wm/WindowStateAnimator.java +++ b/services/core/java/com/android/server/wm/WindowStateAnimator.java @@ -30,6 +30,7 @@ import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_LAYERS; import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_LAYOUT_REPEATS; import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_ORIENTATION; import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_STARTING_WINDOW; +import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_STARTING_WINDOW_VERBOSE; import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_SURFACE_TRACE; import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_VISIBILITY; import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_WALLPAPER; @@ -519,7 +520,7 @@ class WindowStateAnimator { // This must be called while inside a transaction. boolean commitFinishDrawingLocked() { - if (DEBUG_STARTING_WINDOW && + if (DEBUG_STARTING_WINDOW_VERBOSE && mWin.mAttrs.type == WindowManager.LayoutParams.TYPE_APPLICATION_STARTING) { Slog.i(TAG, "commitFinishDrawingLocked: " + mWin + " cur mDrawState=" + drawStateToString()); diff --git a/services/tests/notification/src/com/android/server/notification/NotificationRecordTest.java b/services/tests/notification/src/com/android/server/notification/NotificationRecordTest.java index 267d2a6d5c4f..081278381f91 100644 --- a/services/tests/notification/src/com/android/server/notification/NotificationRecordTest.java +++ b/services/tests/notification/src/com/android/server/notification/NotificationRecordTest.java @@ -99,7 +99,7 @@ public class NotificationRecordTest extends NotificationTestCase { when(mMockContext.getPackageManager()).thenReturn(mPm); legacy.targetSdkVersion = Build.VERSION_CODES.N_MR1; - upgrade.targetSdkVersion = Build.VERSION_CODES.N_MR1 + 1; + upgrade.targetSdkVersion = Build.VERSION_CODES.O; try { when(mPm.getApplicationInfoAsUser(eq(pkg), anyInt(), anyInt())).thenReturn(legacy); when(mPm.getApplicationInfoAsUser(eq(pkg2), anyInt(), anyInt())).thenReturn(upgrade); 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 cb0ee2566bee..2c9c11403905 100644 --- a/services/tests/notification/src/com/android/server/notification/RankingHelperTest.java +++ b/services/tests/notification/src/com/android/server/notification/RankingHelperTest.java @@ -119,7 +119,7 @@ public class RankingHelperTest extends NotificationTestCase { final ApplicationInfo legacy = new ApplicationInfo(); legacy.targetSdkVersion = Build.VERSION_CODES.N_MR1; final ApplicationInfo upgrade = new ApplicationInfo(); - upgrade.targetSdkVersion = Build.VERSION_CODES.N_MR1 + 1; + upgrade.targetSdkVersion = Build.VERSION_CODES.O; 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); diff --git a/services/tests/servicestests/src/com/android/server/wm/DisplayContentTests.java b/services/tests/servicestests/src/com/android/server/wm/DisplayContentTests.java index f9254ad8180b..856e94055ed5 100644 --- a/services/tests/servicestests/src/com/android/server/wm/DisplayContentTests.java +++ b/services/tests/servicestests/src/com/android/server/wm/DisplayContentTests.java @@ -34,6 +34,7 @@ import android.content.res.Configuration; import android.platform.test.annotations.Presubmit; import android.support.test.filters.SmallTest; import android.support.test.runner.AndroidJUnit4; +import android.util.SparseIntArray; import java.util.Arrays; import java.util.LinkedList; @@ -239,7 +240,7 @@ public class DisplayContentTests extends WindowTestsBase { @Test @Ignore public void testFocusedWindowMultipleDisplays() throws Exception { - // Create a focusable window and check that focus is calcualted correctly + // Create a focusable window and check that focus is calculated correctly final WindowState window1 = createWindow(null, TYPE_BASE_APPLICATION, mDisplayContent, "window1"); assertEquals(window1, sWm.mRoot.computeFocusedWindow()); @@ -310,6 +311,24 @@ public class DisplayContentTests extends WindowTestsBase { assertEquals(afterStackCount - 1, mDisplayContent.getStaskPosById(PINNED_STACK_ID)); } + /** + * Test that WM does not report displays to AM that are pending to be removed. + */ + @Test + public void testDontReportDeferredRemoval() { + // Create a display and add an animating window to it. + final DisplayContent dc = createNewDisplay(); + final WindowState window = createWindow(null /* parent */, TYPE_BASE_APPLICATION, dc, "w"); + window.mAnimatingExit = true; + // Request display removal, it should be deferred. + dc.removeIfPossible(); + // Request ordered display ids from WM. + final SparseIntArray orderedDisplayIds = new SparseIntArray(); + sWm.getDisplaysInFocusOrder(orderedDisplayIds); + // Make sure that display that is marked for removal is not reported. + assertEquals(-1, orderedDisplayIds.indexOfValue(dc.getDisplayId())); + } + private static void verifySizes(DisplayContent displayContent, int expectedBaseWidth, int expectedBaseHeight, int expectedBaseDensity) { assertEquals(displayContent.mBaseDisplayWidth, expectedBaseWidth); 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 8108909152bb..39c0de82e821 100644 --- a/services/tests/servicestests/src/com/android/server/wm/TaskSnapshotPersisterLoaderTest.java +++ b/services/tests/servicestests/src/com/android/server/wm/TaskSnapshotPersisterLoaderTest.java @@ -90,12 +90,40 @@ public class TaskSnapshotPersisterLoaderTest extends TaskSnapshotPersisterTestBa long ms = SystemClock.elapsedRealtime(); mPersister.persistSnapshot(1, mTestUserId, createSnapshot()); mPersister.persistSnapshot(2, 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.persistSnapshot(5, mTestUserId, createSnapshot()); - mPersister.persistSnapshot(6, mTestUserId, createSnapshot()); + mPersister.setPaused(false); mPersister.waitForQueueEmpty(); - assertTrue(SystemClock.elapsedRealtime() - ms > 500); + + // 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 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 be53667084d7..623d77ba57ed 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 @@ class TestWindowManagerPolicy implements WindowManagerPolicy { } @Override + public void screenTurningOff(ScreenOffListener screenOffListener) { + + } + + @Override public void screenTurnedOff() { } diff --git a/tools/aapt2/ResourceParser.cpp b/tools/aapt2/ResourceParser.cpp index 90f713b67985..0d1850fed26a 100644 --- a/tools/aapt2/ResourceParser.cpp +++ b/tools/aapt2/ResourceParser.cpp @@ -34,40 +34,41 @@ using android::StringPiece; namespace aapt { -constexpr const char* sXliffNamespaceUri = - "urn:oasis:names:tc:xliff:document:1.2"; +constexpr const char* sXliffNamespaceUri = "urn:oasis:names:tc:xliff:document:1.2"; -/** - * Returns true if the element is <skip> or <eat-comment> and can be safely - * ignored. - */ -static bool ShouldIgnoreElement(const StringPiece& ns, - const StringPiece& name) { +// Returns true if the element is <skip> or <eat-comment> and can be safely ignored. +static bool ShouldIgnoreElement(const StringPiece& ns, const StringPiece& name) { return ns.empty() && (name == "skip" || name == "eat-comment"); } -static uint32_t ParseFormatType(const StringPiece& piece) { - if (piece == "reference") +static uint32_t ParseFormatTypeNoEnumsOrFlags(const StringPiece& piece) { + if (piece == "reference") { return android::ResTable_map::TYPE_REFERENCE; - else if (piece == "string") + } else if (piece == "string") { return android::ResTable_map::TYPE_STRING; - else if (piece == "integer") + } else if (piece == "integer") { return android::ResTable_map::TYPE_INTEGER; - else if (piece == "boolean") + } else if (piece == "boolean") { return android::ResTable_map::TYPE_BOOLEAN; - else if (piece == "color") + } else if (piece == "color") { return android::ResTable_map::TYPE_COLOR; - else if (piece == "float") + } else if (piece == "float") { return android::ResTable_map::TYPE_FLOAT; - else if (piece == "dimension") + } else if (piece == "dimension") { return android::ResTable_map::TYPE_DIMENSION; - else if (piece == "fraction") + } else if (piece == "fraction") { return android::ResTable_map::TYPE_FRACTION; - else if (piece == "enum") + } + return 0; +} + +static uint32_t ParseFormatType(const StringPiece& piece) { + if (piece == "enum") { return android::ResTable_map::TYPE_ENUM; - else if (piece == "flags") + } else if (piece == "flags") { return android::ResTable_map::TYPE_FLAGS; - return 0; + } + return ParseFormatTypeNoEnumsOrFlags(piece); } static uint32_t ParseFormatAttribute(const StringPiece& str) { @@ -83,9 +84,7 @@ static uint32_t ParseFormatAttribute(const StringPiece& str) { return mask; } -/** - * A parsed resource ready to be added to the ResourceTable. - */ +// A parsed resource ready to be added to the ResourceTable. struct ParsedResource { ResourceName name; ConfigDescription config; @@ -416,8 +415,7 @@ bool ResourceParser::ParseResource(xml::XmlPullParser* parser, can_be_bag = false; // Items have their type encoded in the type attribute. - if (Maybe<StringPiece> maybe_type = - xml::FindNonEmptyAttribute(parser, "type")) { + if (Maybe<StringPiece> maybe_type = xml::FindNonEmptyAttribute(parser, "type")) { resource_type = maybe_type.value().to_string(); } else { diag_->Error(DiagMessage(source_.WithLine(parser->line_number())) @@ -425,13 +423,11 @@ bool ResourceParser::ParseResource(xml::XmlPullParser* parser, return false; } - if (Maybe<StringPiece> maybe_format = - xml::FindNonEmptyAttribute(parser, "format")) { + if (Maybe<StringPiece> maybe_format = xml::FindNonEmptyAttribute(parser, "format")) { // An explicit format for this resource was specified. The resource will - // retain - // its type in its name, but the accepted value for this type is + // retain its type in its name, but the accepted value for this type is // overridden. - resource_format = ParseFormatType(maybe_format.value()); + resource_format = ParseFormatTypeNoEnumsOrFlags(maybe_format.value()); if (!resource_format) { diag_->Error(DiagMessage(out_resource->source) << "'" << maybe_format.value() @@ -1157,21 +1153,25 @@ bool ResourceParser::ParseStyle(const ResourceType type, xml::XmlPullParser* par return true; } -bool ResourceParser::ParseArray(xml::XmlPullParser* parser, - ParsedResource* out_resource) { - return ParseArrayImpl(parser, out_resource, android::ResTable_map::TYPE_ANY); +bool ResourceParser::ParseArray(xml::XmlPullParser* parser, ParsedResource* out_resource) { + uint32_t resource_format = android::ResTable_map::TYPE_ANY; + if (Maybe<StringPiece> format_attr = xml::FindNonEmptyAttribute(parser, "format")) { + resource_format = ParseFormatTypeNoEnumsOrFlags(format_attr.value()); + if (resource_format == 0u) { + diag_->Error(DiagMessage(source_.WithLine(parser->line_number())) + << "'" << format_attr.value() << "' is an invalid format"); + return false; + } + } + return ParseArrayImpl(parser, out_resource, resource_format); } -bool ResourceParser::ParseIntegerArray(xml::XmlPullParser* parser, - ParsedResource* out_resource) { - return ParseArrayImpl(parser, out_resource, - android::ResTable_map::TYPE_INTEGER); +bool ResourceParser::ParseIntegerArray(xml::XmlPullParser* parser, ParsedResource* out_resource) { + return ParseArrayImpl(parser, out_resource, android::ResTable_map::TYPE_INTEGER); } -bool ResourceParser::ParseStringArray(xml::XmlPullParser* parser, - ParsedResource* out_resource) { - return ParseArrayImpl(parser, out_resource, - android::ResTable_map::TYPE_STRING); +bool ResourceParser::ParseStringArray(xml::XmlPullParser* parser, ParsedResource* out_resource) { + return ParseArrayImpl(parser, out_resource, android::ResTable_map::TYPE_STRING); } bool ResourceParser::ParseArrayImpl(xml::XmlPullParser* parser, diff --git a/tools/aapt2/ResourceParser_test.cpp b/tools/aapt2/ResourceParser_test.cpp index 8062c2e6afea..faa660729237 100644 --- a/tools/aapt2/ResourceParser_test.cpp +++ b/tools/aapt2/ResourceParser_test.cpp @@ -571,14 +571,39 @@ TEST_F(ResourceParserTest, ParseArray) { } TEST_F(ResourceParserTest, ParseStringArray) { - std::string input = - "<string-array name=\"foo\">\n" - " <item>\"Werk\"</item>\n" - "</string-array>\n"; + std::string input = R"EOF( + <string-array name="foo"> + <item>"Werk"</item>" + </string-array>)EOF"; ASSERT_TRUE(TestParse(input)); EXPECT_NE(nullptr, test::GetValue<Array>(&table_, "array/foo")); } +TEST_F(ResourceParserTest, ParseArrayWithFormat) { + std::string input = R"EOF( + <array name="foo" format="string"> + <item>100</item> + </array>)EOF"; + ASSERT_TRUE(TestParse(input)); + + Array* array = test::GetValue<Array>(&table_, "array/foo"); + ASSERT_NE(nullptr, array); + + ASSERT_EQ(1u, array->items.size()); + + String* str = ValueCast<String>(array->items[0].get()); + ASSERT_NE(nullptr, str); + EXPECT_EQ(std::string("100"), *str->value); +} + +TEST_F(ResourceParserTest, ParseArrayWithBadFormat) { + std::string input = R"EOF( + <array name="foo" format="integer"> + <item>Hi</item> + </array>)EOF"; + ASSERT_FALSE(TestParse(input)); +} + TEST_F(ResourceParserTest, ParsePlural) { std::string input = "<plurals name=\"foo\">\n" diff --git a/tools/aapt2/cmd/Compile.cpp b/tools/aapt2/cmd/Compile.cpp index c192d698b500..5adf04a4dcbb 100644 --- a/tools/aapt2/cmd/Compile.cpp +++ b/tools/aapt2/cmd/Compile.cpp @@ -372,6 +372,8 @@ static bool IsValidFile(IAaptContext* context, const StringPiece& input_path) { if (file_type == file::FileType::kDirectory) { context->GetDiagnostics()->Error(DiagMessage(input_path) << "resource file cannot be a directory"); + } else if (file_type == file::FileType::kNonexistant) { + context->GetDiagnostics()->Error(DiagMessage(input_path) << "file not found"); } else { context->GetDiagnostics()->Error(DiagMessage(input_path) << "not a valid resource file"); @@ -488,7 +490,7 @@ static bool CompilePng(IAaptContext* context, const CompileOptions& options, // Ensure that we only keep the chunks we care about if we end up // using the original PNG instead of the crunched one. PngChunkFilter png_chunk_filter(content); - std::unique_ptr<Image> image = ReadPng(context, &png_chunk_filter); + std::unique_ptr<Image> image = ReadPng(context, path_data.source, &png_chunk_filter); if (!image) { return false; } diff --git a/tools/aapt2/compile/Png.h b/tools/aapt2/compile/Png.h index e4255e714744..7ca1f0ec7800 100644 --- a/tools/aapt2/compile/Png.h +++ b/tools/aapt2/compile/Png.h @@ -69,7 +69,12 @@ class PngChunkFilter : public io::InputStream { bool Rewind() override; size_t ByteCount() const override { return window_start_; } - bool HadError() const override { return error_; } + bool HadError() const override { + return !error_msg_.empty(); + } + std::string GetError() const override { + return error_msg_; + } private: DISALLOW_COPY_AND_ASSIGN(PngChunkFilter); @@ -79,13 +84,13 @@ class PngChunkFilter : public io::InputStream { android::StringPiece data_; size_t window_start_ = 0; size_t window_end_ = 0; - bool error_ = false; + std::string error_msg_; }; /** * Reads a PNG from the InputStream into memory as an RGBA Image. */ -std::unique_ptr<Image> ReadPng(IAaptContext* context, io::InputStream* in); +std::unique_ptr<Image> ReadPng(IAaptContext* context, const Source& source, io::InputStream* in); /** * Writes the RGBA Image, with optional 9-patch meta-data, into the OutputStream diff --git a/tools/aapt2/compile/PngChunkFilter.cpp b/tools/aapt2/compile/PngChunkFilter.cpp index f9043b5a109a..7073c134ad79 100644 --- a/tools/aapt2/compile/PngChunkFilter.cpp +++ b/tools/aapt2/compile/PngChunkFilter.cpp @@ -16,11 +16,13 @@ #include "compile/Png.h" +#include "android-base/stringprintf.h" #include "androidfw/StringPiece.h" #include "io/Io.h" using android::StringPiece; +using android::base::StringPrintf; namespace aapt { @@ -73,7 +75,7 @@ PngChunkFilter::PngChunkFilter(const StringPiece& data) : data_(data) { window_start_ = 0; window_end_ = kPngSignatureSize; } else { - error_ = true; + error_msg_ = "PNG does not start with PNG signature"; } } @@ -90,7 +92,7 @@ bool PngChunkFilter::ConsumeWindow(const void** buffer, size_t* len) { } bool PngChunkFilter::Next(const void** buffer, size_t* len) { - if (error_) { + if (HadError()) { return false; } @@ -106,16 +108,21 @@ bool PngChunkFilter::Next(const void** buffer, size_t* len) { const size_t kMinChunkHeaderSize = 3 * sizeof(uint32_t); // Is there enough room for a chunk header? - if (data_.size() - window_start_ < kMinChunkHeaderSize) { - error_ = true; + if (data_.size() - window_end_ < kMinChunkHeaderSize) { + error_msg_ = StringPrintf("Not enough space for a PNG chunk @ byte %zu/%zu", window_end_, + data_.size()); return false; } // Verify the chunk length. const uint32_t chunk_len = Peek32LE(data_.data() + window_end_); - if (((uint64_t)chunk_len) + ((uint64_t)window_end_) + sizeof(uint32_t) > data_.size()) { + if ((size_t)chunk_len > data_.size() - window_end_ - kMinChunkHeaderSize) { // Overflow. - error_ = true; + const uint32_t chunk_type = Peek32LE(data_.data() + window_end_ + sizeof(uint32_t)); + error_msg_ = StringPrintf( + "PNG chunk type %08x is too large: chunk length is %zu but chunk " + "starts at byte %zu/%zu", + chunk_type, (size_t)chunk_len, window_end_ + kMinChunkHeaderSize, data_.size()); return false; } @@ -124,6 +131,16 @@ bool PngChunkFilter::Next(const void** buffer, size_t* len) { if (IsPngChunkWhitelisted(chunk_type)) { // Advance the window to include this chunk. window_end_ += kMinChunkHeaderSize + chunk_len; + + // Special case the IEND chunk, which MUST appear last and libpng stops parsing once it hits + // such a chunk (let's do the same). + if (chunk_type == kPngChunkIEND) { + // Truncate the data to the end of this chunk. There may be garbage trailing after + // (b/38169876) + data_ = data_.substr(0, window_end_); + break; + } + } else { // We want to strip this chunk. If we accumulated a window, // we must return the window now. @@ -145,14 +162,14 @@ bool PngChunkFilter::Next(const void** buffer, size_t* len) { } void PngChunkFilter::BackUp(size_t count) { - if (error_) { + if (HadError()) { return; } window_start_ -= count; } bool PngChunkFilter::Rewind() { - if (error_) { + if (HadError()) { return false; } window_start_ = 0; diff --git a/tools/aapt2/compile/PngCrunch.cpp b/tools/aapt2/compile/PngCrunch.cpp index ae98afcd3cc3..42443d8d58b0 100644 --- a/tools/aapt2/compile/PngCrunch.cpp +++ b/tools/aapt2/compile/PngCrunch.cpp @@ -73,6 +73,11 @@ static void LogWarning(png_structp png_ptr, png_const_charp warning_msg) { static void LogError(png_structp png_ptr, png_const_charp error_msg) { IDiagnostics* diag = (IDiagnostics*)png_get_error_ptr(png_ptr); diag->Error(DiagMessage() << error_msg); + + // Causes libpng to longjmp to the spot where setjmp was set. This is how libpng does + // error handling. If this custom error handler method were to return, libpng would, by + // default, print the error message to stdout and call the same png_longjmp method. + png_longjmp(png_ptr, 1); } static void ReadDataFromStream(png_structp png_ptr, png_bytep buffer, png_size_t len) { @@ -82,7 +87,12 @@ static void ReadDataFromStream(png_structp png_ptr, png_bytep buffer, png_size_t size_t in_len; if (!in->Next(&in_buffer, &in_len)) { if (in->HadError()) { - std::string err = in->GetError(); + std::stringstream error_msg_builder; + error_msg_builder << "failed reading from input"; + if (!in->GetError().empty()) { + error_msg_builder << ": " << in->GetError(); + } + std::string err = error_msg_builder.str(); png_error(png_ptr, err.c_str()); } return; @@ -103,6 +113,11 @@ static void WriteDataToStream(png_structp png_ptr, png_bytep buffer, png_size_t while (len > 0) { if (!out->Next(&out_buffer, &out_len)) { if (out->HadError()) { + std::stringstream err_msg_builder; + err_msg_builder << "failed writing to output"; + if (!out->GetError().empty()) { + err_msg_builder << ": " << out->GetError(); + } std::string err = out->GetError(); png_error(png_ptr, err.c_str()); } @@ -126,7 +141,7 @@ static void WriteDataToStream(png_structp png_ptr, png_bytep buffer, png_size_t } } -std::unique_ptr<Image> ReadPng(IAaptContext* context, io::InputStream* in) { +std::unique_ptr<Image> ReadPng(IAaptContext* context, const Source& source, io::InputStream* in) { // Read the first 8 bytes of the file looking for the PNG signature. // Bail early if it does not match. const png_byte* signature; @@ -163,6 +178,9 @@ std::unique_ptr<Image> ReadPng(IAaptContext* context, io::InputStream* in) { return {}; } + // Create a diagnostics that has the source information encoded. + SourcePathDiagnostics source_diag(source, context->GetDiagnostics()); + // Automatically release PNG resources at end of scope. PngReadStructDeleter png_read_deleter(read_ptr, info_ptr); @@ -174,7 +192,7 @@ std::unique_ptr<Image> ReadPng(IAaptContext* context, io::InputStream* in) { } // Handle warnings ourselves via IDiagnostics. - png_set_error_fn(read_ptr, (png_voidp)context->GetDiagnostics(), LogError, LogWarning); + png_set_error_fn(read_ptr, (png_voidp)&source_diag, LogError, LogWarning); // Set up the read functions which read from our custom data sources. png_set_read_fn(read_ptr, (png_voidp)in, ReadDataFromStream); @@ -231,8 +249,8 @@ std::unique_ptr<Image> ReadPng(IAaptContext* context, io::InputStream* in) { // something // that can always be represented by 9-patch. if (width > std::numeric_limits<int32_t>::max() || height > std::numeric_limits<int32_t>::max()) { - context->GetDiagnostics()->Error( - DiagMessage() << "PNG image dimensions are too large: " << width << "x" << height); + source_diag.Error(DiagMessage() + << "PNG image dimensions are too large: " << width << "x" << height); return {}; } diff --git a/wifi/java/android/net/wifi/WifiManager.java b/wifi/java/android/net/wifi/WifiManager.java index e59b74f0bf60..cda078ab9b2b 100644 --- a/wifi/java/android/net/wifi/WifiManager.java +++ b/wifi/java/android/net/wifi/WifiManager.java @@ -452,6 +452,15 @@ public class WifiManager { public static final int SAP_START_FAILURE_NO_CHANNEL = 1; /** + * Interface IP mode unspecified. + * + * @see updateInterfaceIpState(String, int) + * + * @hide + */ + public static final int IFACE_IP_MODE_UNSPECIFIED = -1; + + /** * Interface IP mode for configuration error. * * @see updateInterfaceIpState(String, int) |