diff options
338 files changed, 3152 insertions, 1336 deletions
diff --git a/cmds/bootanimation/bootanimation_main.cpp b/cmds/bootanimation/bootanimation_main.cpp index dca7ea6daa3e..3689d5ed937e 100644 --- a/cmds/bootanimation/bootanimation_main.cpp +++ b/cmds/bootanimation/bootanimation_main.cpp @@ -16,12 +16,16 @@ #define LOG_TAG "BootAnimation" +#include <stdint.h> +#include <inttypes.h> + #include <binder/IPCThreadState.h> #include <binder/ProcessState.h> #include <binder/IServiceManager.h> #include <cutils/properties.h> #include <sys/resource.h> #include <utils/Log.h> +#include <utils/SystemClock.h> #include <utils/threads.h> #include "BootAnimation.h" @@ -47,6 +51,26 @@ int main() sp<ProcessState> proc(ProcessState::self()); ProcessState::self()->startThreadPool(); + // TODO: replace this with better waiting logic in future, b/35253872 + int64_t waitStartTime = elapsedRealtime(); + sp<IServiceManager> sm = defaultServiceManager(); + const String16 name("SurfaceFlinger"); + const int SERVICE_WAIT_SLEEP_MS = 100; + const int LOG_PER_RETRIES = 10; + int retry = 0; + while (sm->checkService(name) == nullptr) { + retry++; + if ((retry % LOG_PER_RETRIES) == 0) { + ALOGW("Waiting for SurfaceFlinger, waited for %" PRId64 " ms", + elapsedRealtime() - waitStartTime); + } + usleep(SERVICE_WAIT_SLEEP_MS * 1000); + }; + int64_t totalWaited = elapsedRealtime() - waitStartTime; + if (totalWaited > SERVICE_WAIT_SLEEP_MS) { + ALOGI("Waiting for SurfaceFlinger took %" PRId64 " ms", totalWaited); + } + // create the boot animation object sp<BootAnimation> boot = new BootAnimation(); diff --git a/core/java/android/app/Activity.java b/core/java/android/app/Activity.java index ab035569fea2..b439c1dc02c4 100644 --- a/core/java/android/app/Activity.java +++ b/core/java/android/app/Activity.java @@ -4719,7 +4719,9 @@ public class Activity extends ContextThemeWrapper resolvedType = fillInIntent.resolveTypeIfNeeded(getContentResolver()); } int result = ActivityManager.getService() - .startActivityIntentSender(mMainThread.getApplicationThread(), intent, + .startActivityIntentSender(mMainThread.getApplicationThread(), + intent != null ? intent.getTarget() : null, + intent != null ? intent.getWhitelistToken() : null, fillInIntent, resolvedType, mToken, who, requestCode, flagsMask, flagsValues, options); if (result == ActivityManager.START_CANCELED) { @@ -7447,6 +7449,7 @@ public class Activity extends ContextThemeWrapper } /** @hide */ + @Override @NonNull public View[] findViewsByAccessibilityIdTraversal(@NonNull int[] viewIds) { final View[] views = new View[viewIds.length]; final ArrayList<ViewRootImpl> roots = @@ -7470,6 +7473,25 @@ public class Activity extends ContextThemeWrapper /** @hide */ @Override + @Nullable public View findViewByAccessibilityIdTraversal(int viewId) { + final ArrayList<ViewRootImpl> roots = + WindowManagerGlobal.getInstance().getRootViews(getActivityToken()); + for (int rootNum = 0; rootNum < roots.size(); rootNum++) { + final View rootView = roots.get(rootNum).getView(); + + if (rootView != null) { + final View view = rootView.findViewByAccessibilityIdTraversal(viewId); + if (view != null) { + return view; + } + } + } + + return null; + } + + /** @hide */ + @Override @NonNull public boolean[] getViewVisibility(@NonNull int[] viewIds) { final boolean[] isVisible = new boolean[viewIds.length]; final View views[] = findViewsByAccessibilityIdTraversal(viewIds); diff --git a/core/java/android/app/ActivityThread.java b/core/java/android/app/ActivityThread.java index 928ef7e3863d..01e4ccebe82f 100644 --- a/core/java/android/app/ActivityThread.java +++ b/core/java/android/app/ActivityThread.java @@ -3567,6 +3567,7 @@ public final class ActivityThread { try { if (localLOGV) Slog.v(TAG, "Destroying service " + s); s.onDestroy(); + s.detachAndCleanUp(); Context context = s.getBaseContext(); if (context instanceof ContextImpl) { final String who = s.getClassName(); diff --git a/core/java/android/app/ContextImpl.java b/core/java/android/app/ContextImpl.java index 2de205b40970..268a105b7c6f 100644 --- a/core/java/android/app/ContextImpl.java +++ b/core/java/android/app/ContextImpl.java @@ -925,7 +925,9 @@ class ContextImpl extends Context { resolvedType = fillInIntent.resolveTypeIfNeeded(getContentResolver()); } int result = ActivityManager.getService() - .startActivityIntentSender(mMainThread.getApplicationThread(), intent, + .startActivityIntentSender(mMainThread.getApplicationThread(), + intent != null ? intent.getTarget() : null, + intent != null ? intent.getWhitelistToken() : null, fillInIntent, resolvedType, null, null, 0, flagsMask, flagsValues, options); if (result == ActivityManager.START_CANCELED) { diff --git a/core/java/android/app/FragmentManager.java b/core/java/android/app/FragmentManager.java index 95d55dc2d6e6..3e26e0f39a10 100644 --- a/core/java/android/app/FragmentManager.java +++ b/core/java/android/app/FragmentManager.java @@ -2603,23 +2603,25 @@ final class FragmentManagerImpl extends FragmentManager implements LayoutInflate f.mTargetIndex = f.mTarget != null ? f.mTarget.mIndex : -1; if (DEBUG) Log.v(TAG, "retainNonConfig: keeping retained " + f); } - boolean addedChild = false; + FragmentManagerNonConfig child; if (f.mChildFragmentManager != null) { f.mChildFragmentManager.saveNonConfig(); - FragmentManagerNonConfig child = f.mChildFragmentManager.mSavedNonConfig; - if (child != null) { - if (childFragments == null) { - childFragments = new ArrayList<>(); - for (int j = 0; j < i; j++) { - childFragments.add(null); - } - } - childFragments.add(child); - addedChild = true; + child = f.mChildFragmentManager.mSavedNonConfig; + } else { + // f.mChildNonConfig may be not null, when the parent fragment is + // in the backstack. + child = f.mChildNonConfig; + } + + if (childFragments == null && child != null) { + childFragments = new ArrayList<>(mActive.size()); + for (int j = 0; j < i; j++) { + childFragments.add(null); } } - if (childFragments != null && !addedChild) { - childFragments.add(null); + + if (childFragments != null) { + childFragments.add(child); } } } diff --git a/core/java/android/app/IActivityManager.aidl b/core/java/android/app/IActivityManager.aidl index 9552d1723317..3ac026d70a6f 100644 --- a/core/java/android/app/IActivityManager.aidl +++ b/core/java/android/app/IActivityManager.aidl @@ -236,8 +236,8 @@ interface IActivityManager { Debug.MemoryInfo[] getProcessMemoryInfo(in int[] pids); void killApplicationProcess(in String processName, int uid); int startActivityIntentSender(in IApplicationThread caller, - in IntentSender intent, in Intent fillInIntent, in String resolvedType, - in IBinder resultTo, in String resultWho, int requestCode, + in IIntentSender target, in IBinder whitelistToken, in Intent fillInIntent, + in String resolvedType, in IBinder resultTo, in String resultWho, int requestCode, int flagsMask, int flagsValues, in Bundle options); void overridePendingTransition(in IBinder token, in String packageName, int enterAnim, int exitAnim); diff --git a/core/java/android/app/Service.java b/core/java/android/app/Service.java index 10d6a7b02377..256c47934dc5 100644 --- a/core/java/android/app/Service.java +++ b/core/java/android/app/Service.java @@ -767,7 +767,15 @@ public abstract class Service extends ContextWrapper implements ComponentCallbac mStartCompatibility = getApplicationInfo().targetSdkVersion < Build.VERSION_CODES.ECLAIR; } - + + /** + * @hide + * Clean up any references to avoid leaks. + */ + public final void detachAndCleanUp() { + mToken = null; + } + final String getClassName() { return mClassName; } diff --git a/core/java/android/app/job/JobServiceEngine.java b/core/java/android/app/job/JobServiceEngine.java index b7d759b27c01..b0ec6502c4b1 100644 --- a/core/java/android/app/job/JobServiceEngine.java +++ b/core/java/android/app/job/JobServiceEngine.java @@ -55,21 +55,12 @@ public abstract class JobServiceEngine { */ private static final int MSG_JOB_FINISHED = 2; - /** - * Context we are running in. - */ - private final Service mService; - private final IJobService mBinder; - /** Lock object for {@link #mHandler}. */ - private final Object mHandlerLock = new Object(); - /** * Handler we post jobs to. Responsible for calling into the client logic, and handling the * callback to the system. */ - @GuardedBy("mHandlerLock") JobHandler mHandler; static final class JobInterface extends IJobService.Stub { @@ -189,9 +180,8 @@ public abstract class JobServiceEngine { * @param service The {@link Service} that is creating this engine and in which it will run. */ public JobServiceEngine(Service service) { - mService = service; mBinder = new JobInterface(this); - mHandler = new JobHandler(mService.getMainLooper()); + mHandler = new JobHandler(service.getMainLooper()); } /** diff --git a/core/java/android/content/IntentSender.java b/core/java/android/content/IntentSender.java index 0a456b528b0f..ff127df6ec9b 100644 --- a/core/java/android/content/IntentSender.java +++ b/core/java/android/content/IntentSender.java @@ -361,6 +361,11 @@ public class IntentSender implements Parcelable { } /** @hide */ + public IBinder getWhitelistToken() { + return mWhitelistToken; + } + + /** @hide */ public IntentSender(IIntentSender target) { mTarget = target; } diff --git a/core/java/android/content/pm/PackageManagerInternal.java b/core/java/android/content/pm/PackageManagerInternal.java index 87e6a8465beb..4cee2dfb66cb 100644 --- a/core/java/android/content/pm/PackageManagerInternal.java +++ b/core/java/android/content/pm/PackageManagerInternal.java @@ -343,5 +343,5 @@ public abstract class PackageManagerInternal { public abstract int getUidTargetSdkVersion(int uid); /** Whether the binder caller can access instant apps. */ - public abstract boolean canAccessInstantApps(int callingUid); + public abstract boolean canAccessInstantApps(int callingUid, int userId); } diff --git a/core/java/android/content/res/Resources.java b/core/java/android/content/res/Resources.java index b559604ea14e..e525ab3f1f3e 100644 --- a/core/java/android/content/res/Resources.java +++ b/core/java/android/content/res/Resources.java @@ -1760,7 +1760,9 @@ public class Resources { public final Theme newTheme() { Theme theme = new Theme(); theme.setImpl(mResourcesImpl.newThemeImpl()); - mThemeRefs.add(new WeakReference<>(theme)); + synchronized (mThemeRefs) { + mThemeRefs.add(new WeakReference<>(theme)); + } return theme; } diff --git a/core/java/android/os/BatteryStats.java b/core/java/android/os/BatteryStats.java index 3eea72d5819b..499d6bbdf535 100644 --- a/core/java/android/os/BatteryStats.java +++ b/core/java/android/os/BatteryStats.java @@ -157,6 +157,11 @@ public abstract class BatteryStats implements Parcelable { public static final int BLUETOOTH_SCAN_ON = 19; /** + * A constant indicating an aggregated partial wake lock timer. + */ + public static final int AGGREGATED_WAKE_TYPE_PARTIAL = 20; + + /** * Include all of the data in the stats, including previously saved data. */ public static final int STATS_SINCE_CHARGED = 0; @@ -185,6 +190,7 @@ public abstract class BatteryStats implements Parcelable { * - Background timers and counters for: Sensor, BluetoothScan, WifiScan, Jobs, Syncs. * New in version 21: * - Actual (not just apportioned) Wakelock time is also recorded. + * - Aggregated partial wakelock time (per uid, instead of per wakelock) is recorded. */ static final String CHECKIN_VERSION = "21"; @@ -216,6 +222,10 @@ public abstract class BatteryStats implements Parcelable { // window totalTime, 'w', count, current duration, max duration, total duration // [Currently, full and window wakelocks have durations current = max = total = -1] private static final String WAKELOCK_DATA = "wl"; + // awl line is: + // BATTERY_STATS_CHECKIN_VERSION, uid, which, "awl", + // cumulative partial wakelock duration, cumulative background partial wakelock duration + private static final String AGGREGATED_WAKELOCK_DATA = "awl"; private static final String SYNC_DATA = "sy"; private static final String JOB_DATA = "jb"; private static final String KERNEL_WAKELOCK_DATA = "kwl"; @@ -485,6 +495,13 @@ public abstract class BatteryStats implements Parcelable { } /** + * The cumulative time the uid spent holding any partial wakelocks. This will generally + * differ from summing over the Wakelocks in getWakelockStats since the latter may have + * wakelocks that overlap in time (and therefore over-counts). + */ + public abstract Timer getAggregatedPartialWakelockTimer(); + + /** * Returns a mapping containing sensor statistics. * * @return a Map from Integer sensor ids to Uid.Sensor objects. @@ -495,7 +512,7 @@ public abstract class BatteryStats implements Parcelable { * Returns a mapping containing active process data. */ public abstract SparseArray<? extends Pid> getPidStats(); - + /** * Returns a mapping containing process statistics. * @@ -609,7 +626,7 @@ public abstract class BatteryStats implements Parcelable { static final String[] USER_ACTIVITY_TYPES = { "other", "button", "touch", "accessibility" }; - + public static final int NUM_USER_ACTIVITY_TYPES = 4; public abstract void noteUserActivityLocked(int type); @@ -1259,7 +1276,7 @@ public abstract class BatteryStats implements Parcelable { public static final byte CMD_SHUTDOWN = 8; public byte cmd = CMD_NULL; - + /** * Return whether the command code is a delta data update. */ @@ -1271,13 +1288,13 @@ public abstract class BatteryStats implements Parcelable { public byte batteryStatus; public byte batteryHealth; public byte batteryPlugType; - + public short batteryTemperature; public char batteryVoltage; // The charge of the battery in micro-Ampere-hours. public int batteryChargeUAh; - + // Constants from SCREEN_BRIGHTNESS_* public static final int STATE_BRIGHTNESS_SHIFT = 0; public static final int STATE_BRIGHTNESS_MASK = 0x7; @@ -1458,13 +1475,13 @@ public abstract class BatteryStats implements Parcelable { public HistoryItem() { } - + public HistoryItem(long time, Parcel src) { this.time = time; numReadInts = 2; readFromParcel(src); } - + public int describeContents() { return 0; } @@ -1560,7 +1577,7 @@ public abstract class BatteryStats implements Parcelable { eventCode = EVENT_NONE; eventTag = null; } - + public void setTo(HistoryItem o) { time = o.time; cmd = o.cmd; @@ -1714,7 +1731,7 @@ public abstract class BatteryStats implements Parcelable { public final String shortName; public final String[] values; public final String[] shortValues; - + public BitDescription(int mask, String name, String shortName) { this.mask = mask; this.shift = -1; @@ -1723,7 +1740,7 @@ public abstract class BatteryStats implements Parcelable { this.values = null; this.shortValues = null; } - + public BitDescription(int mask, int shift, String name, String shortName, String[] values, String[] shortValues) { this.mask = mask; @@ -1771,20 +1788,20 @@ public abstract class BatteryStats implements Parcelable { * Return the base time offset for the battery history. */ public abstract long getHistoryBaseTime(); - + /** * Returns the number of times the device has been started. */ public abstract int getStartCount(); - + /** * Returns the time in microseconds that the screen has been on while the device was * running on battery. - * + * * {@hide} */ public abstract long getScreenOnTime(long elapsedRealtimeUs, int which); - + /** * Returns the number of times the screen was turned on. * @@ -1799,11 +1816,11 @@ public abstract class BatteryStats implements Parcelable { public static final int SCREEN_BRIGHTNESS_MEDIUM = 2; public static final int SCREEN_BRIGHTNESS_LIGHT = 3; public static final int SCREEN_BRIGHTNESS_BRIGHT = 4; - + static final String[] SCREEN_BRIGHTNESS_NAMES = { "dark", "dim", "medium", "light", "bright" }; - + static final String[] SCREEN_BRIGHTNESS_SHORT_NAMES = { "0", "1", "2", "3", "4" }; @@ -1813,7 +1830,7 @@ public abstract class BatteryStats implements Parcelable { /** * Returns the time in microseconds that the screen has been on with * the given brightness - * + * * {@hide} */ public abstract long getScreenBrightnessTime(int brightnessBin, @@ -1897,11 +1914,11 @@ public abstract class BatteryStats implements Parcelable { /** * Returns the time in microseconds that the phone has been on while the device was * running on battery. - * + * * {@hide} */ public abstract long getPhoneOnTime(long elapsedRealtimeUs, int which); - + /** * Returns the number of times a phone call was activated. * @@ -1912,7 +1929,7 @@ public abstract class BatteryStats implements Parcelable { /** * Returns the time in microseconds that the phone has been running with * the given signal strength. - * + * * {@hide} */ public abstract long getPhoneSignalStrengthTime(int strengthBin, @@ -1929,7 +1946,7 @@ public abstract class BatteryStats implements Parcelable { /** * Returns the number of times the phone has entered the given signal strength. - * + * * {@hide} */ public abstract int getPhoneSignalStrengthCount(int strengthBin, int which); @@ -1997,13 +2014,13 @@ public abstract class BatteryStats implements Parcelable { "1xrtt", "hsdpa", "hsupa", "hspa", "iden", "evdo_b", "lte", "ehrpd", "hspap", "other" }; - + public static final int NUM_DATA_CONNECTION_TYPES = DATA_CONNECTION_OTHER+1; - + /** * Returns the time in microseconds that the phone has been running with * the given data connection. - * + * * {@hide} */ public abstract long getPhoneDataConnectionTime(int dataType, @@ -2012,7 +2029,7 @@ public abstract class BatteryStats implements Parcelable { /** * Returns the number of times the phone has entered the given data * connection type. - * + * * {@hide} */ public abstract int getPhoneDataConnectionCount(int dataType, int which); @@ -2131,7 +2148,7 @@ public abstract class BatteryStats implements Parcelable { /** * Returns the time in microseconds that wifi has been on while the device was * running on battery. - * + * * {@hide} */ public abstract long getWifiOnTime(long elapsedRealtimeUs, int which); @@ -2322,7 +2339,7 @@ public abstract class BatteryStats implements Parcelable { * Return whether we are currently running on battery. */ public abstract boolean getIsOnBattery(); - + /** * Returns a SparseArray containing the statistics for each uid. */ @@ -2341,13 +2358,13 @@ public abstract class BatteryStats implements Parcelable { * @param curTime the amount of elapsed realtime in microseconds. */ public abstract long getBatteryRealtime(long curTime); - + /** * Returns the battery percentage level at the last time the device was unplugged from power, or - * the last time it booted on battery power. + * the last time it booted on battery power. */ public abstract int getDischargeStartLevel(); - + /** * Returns the current battery percentage level if we are in a discharge cycle, otherwise * returns the level at the last plug event. @@ -2643,7 +2660,7 @@ public abstract class BatteryStats implements Parcelable { final String formatBytesLocked(long bytes) { mFormatBuilder.setLength(0); - + if (bytes < BYTES_PER_KB) { return bytes + "B"; } else if (bytes < BYTES_PER_MB) { @@ -2773,10 +2790,10 @@ public abstract class BatteryStats implements Parcelable { } return false; } - + /** * Checkin version of wakelock printer. Prints simple comma-separated list. - * + * * @param sb a StringBuilder object. * @param timer a Timer object contining the wakelock times. * @param elapsedRealtimeUs the current time in microseconds. @@ -2831,13 +2848,13 @@ public abstract class BatteryStats implements Parcelable { /** * Dump a comma-separated line of values for terse checkin mode. - * + * * @param pw the PageWriter to dump log to * @param category category of data (e.g. "total", "last", "unplugged", "current" ) * @param type type of data (e.g. "wakelock", "sensor", "process", "apk" , "process", "network") * @param args type-dependent data arguments */ - private static final void dumpLine(PrintWriter pw, int uid, String category, String type, + private static final void dumpLine(PrintWriter pw, int uid, String category, String type, Object... args ) { dumpLineHeader(pw, uid, category, type); for (Object arg : args) { @@ -3014,7 +3031,7 @@ public abstract class BatteryStats implements Parcelable { /** * Checkin server version of dump to produce more compact, computer-readable log. - * + * * NOTE: all times are expressed in 'ms'. */ public final void dumpCheckinLocked(Context context, PrintWriter pw, int which, int reqUid, @@ -3047,10 +3064,10 @@ public abstract class BatteryStats implements Parcelable { .getCountLocked(which); final StringBuilder sb = new StringBuilder(128); - + final SparseArray<? extends Uid> uidStats = getUidStats(); final int NU = uidStats.size(); - + final String category = STAT_NAMES[which]; // Dump "battery" stat @@ -3063,11 +3080,11 @@ public abstract class BatteryStats implements Parcelable { getEstimatedBatteryCapacity(), getMinLearnedBatteryCapacity(), getMaxLearnedBatteryCapacity()); - + // Calculate wakelock times across all uids. long fullWakeLockTimeTotal = 0; long partialWakeLockTimeTotal = 0; - + for (int iu = 0; iu < NU; iu++) { final Uid u = uidStats.valueAt(iu); @@ -3138,14 +3155,14 @@ public abstract class BatteryStats implements Parcelable { getDeviceIdlingCount(DEVICE_IDLE_MODE_LIGHT, which), getLongestDeviceIdleModeTime(DEVICE_IDLE_MODE_LIGHT), getLongestDeviceIdleModeTime(DEVICE_IDLE_MODE_DEEP)); - + // Dump screen brightness stats Object[] args = new Object[NUM_SCREEN_BRIGHTNESS_BINS]; for (int i=0; i<NUM_SCREEN_BRIGHTNESS_BINS; i++) { args[i] = getScreenBrightnessTime(i, rawRealtime, which) / 1000; } dumpLine(pw, 0 /* uid */, category, SCREEN_BRIGHTNESS_DATA, args); - + // Dump signal strength stats args = new Object[SignalStrength.NUM_SIGNAL_STRENGTH_BINS]; for (int i=0; i<SignalStrength.NUM_SIGNAL_STRENGTH_BINS; i++) { @@ -3207,7 +3224,7 @@ public abstract class BatteryStats implements Parcelable { dumpLine(pw, 0 /* uid */, category, BATTERY_LEVEL_DATA, getDischargeStartLevel(), getDischargeCurrentLevel()); } - + if (which == STATS_SINCE_UNPLUGGED) { dumpLine(pw, 0 /* uid */, category, BATTERY_DISCHARGE_DATA, getDischargeStartLevel()-getDischargeCurrentLevel(), @@ -3221,7 +3238,7 @@ public abstract class BatteryStats implements Parcelable { getDischargeAmountScreenOffSinceCharge(), dischargeCount / 1000, dischargeScreenOffCount / 1000); } - + if (reqUid < 0) { final Map<String, ? extends Timer> kernelWakelocks = getKernelWakelockStats(); if (kernelWakelocks.size() > 0) { @@ -3244,7 +3261,7 @@ public abstract class BatteryStats implements Parcelable { } } } - + final BatteryStatsHelper helper = new BatteryStatsHelper(context, false, wifiOnly); helper.create(this); helper.refreshStats(which, UserHandle.USER_ALL); @@ -3434,7 +3451,17 @@ public abstract class BatteryStats implements Parcelable { dumpLine(pw, uid /* uid */, category, USER_ACTIVITY_DATA, args); } } - + + if (u.getAggregatedPartialWakelockTimer() != null) { + final Timer timer = u.getAggregatedPartialWakelockTimer(); + // Convert from microseconds to milliseconds with rounding + final long totTimeMs = (timer.getTotalTimeLocked(rawRealtime, which) + 500) / 1000; + final Timer bgTimer = timer.getSubTimer(); + final long bgTimeMs = bgTimer != null ? + (bgTimer.getTotalTimeLocked(rawRealtime, which) + 500) / 1000 : 0; + dumpLine(pw, uid, category, AGGREGATED_WAKELOCK_DATA, totTimeMs, bgTimeMs); + } + final ArrayMap<String, ? extends Uid.Wakelock> wakelocks = u.getWakelockStats(); for (int iw=wakelocks.size()-1; iw>=0; iw--) { final Uid.Wakelock wl = wakelocks.valueAt(iw); @@ -3666,7 +3693,7 @@ public abstract class BatteryStats implements Parcelable { final long chargeTimeRemaining = computeChargeTimeRemaining(rawRealtime); final StringBuilder sb = new StringBuilder(128); - + final SparseArray<? extends Uid> uidStats = getUidStats(); final int NU = uidStats.size(); @@ -3932,7 +3959,7 @@ public abstract class BatteryStats implements Parcelable { } } } - + final long mobileRxTotalBytes = getNetworkActivityBytes(NETWORK_MOBILE_RX_DATA, which); final long mobileTxTotalBytes = getNetworkActivityBytes(NETWORK_MOBILE_TX_DATA, which); final long wifiRxTotalBytes = getNetworkActivityBytes(NETWORK_WIFI_RX_DATA, which); @@ -4161,15 +4188,15 @@ public abstract class BatteryStats implements Parcelable { if (which == STATS_SINCE_UNPLUGGED) { if (getIsOnBattery()) { pw.print(prefix); pw.println(" Device is currently unplugged"); - pw.print(prefix); pw.print(" Discharge cycle start level: "); + pw.print(prefix); pw.print(" Discharge cycle start level: "); pw.println(getDischargeStartLevel()); pw.print(prefix); pw.print(" Discharge cycle current level: "); pw.println(getDischargeCurrentLevel()); } else { pw.print(prefix); pw.println(" Device is currently plugged into power"); - pw.print(prefix); pw.print(" Last discharge cycle start level: "); + pw.print(prefix); pw.print(" Last discharge cycle start level: "); pw.println(getDischargeStartLevel()); - pw.print(prefix); pw.print(" Last discharge cycle end level: "); + pw.print(prefix); pw.print(" Last discharge cycle end level: "); pw.println(getDischargeCurrentLevel()); } pw.print(prefix); pw.print(" Amount discharged while screen on: "); @@ -4450,7 +4477,7 @@ public abstract class BatteryStats implements Parcelable { if (reqUid >= 0 && uid != reqUid && uid != Process.SYSTEM_UID) { continue; } - + final Uid u = uidStats.valueAt(iu); pw.print(prefix); @@ -4538,7 +4565,7 @@ public abstract class BatteryStats implements Parcelable { formatTimeMs(sb, uidWifiRunningTime / 1000); sb.append("("); sb.append(formatRatioLocked(uidWifiRunningTime, whichBatteryRealtime)); sb.append(")\n"); - sb.append(prefix); sb.append(" Full Wifi Lock: "); + sb.append(prefix); sb.append(" Full Wifi Lock: "); formatTimeMs(sb, fullWifiLockOnTime / 1000); sb.append("("); sb.append(formatRatioLocked(fullWifiLockOnTime, whichBatteryRealtime)); sb.append(")\n"); @@ -4690,8 +4717,23 @@ public abstract class BatteryStats implements Parcelable { rawRealtime, which); } if (countWakelock > 1) { - if (totalFullWakelock != 0 || totalPartialWakelock != 0 - || totalWindowWakelock != 0) { + // get unpooled partial wakelock quantities (unlike totalPartialWakelock, which is + // pooled and therefore just a lower bound) + long actualTotalPartialWakelock = 0; + long actualBgPartialWakelock = 0; + if (u.getAggregatedPartialWakelockTimer() != null) { + final Timer aggTimer = u.getAggregatedPartialWakelockTimer(); + // Convert from microseconds to milliseconds with rounding + actualTotalPartialWakelock = + (aggTimer.getTotalTimeLocked(rawRealtime, which) + 500) / 1000; + final Timer bgAggTimer = aggTimer.getSubTimer(); + actualBgPartialWakelock = bgAggTimer != null ? + (bgAggTimer.getTotalTimeLocked(rawRealtime, which) + 500) / 1000 : 0; + } + + if (actualTotalPartialWakelock != 0 || actualBgPartialWakelock != 0 || + totalFullWakelock != 0 || totalPartialWakelock != 0 || + totalWindowWakelock != 0) { sb.setLength(0); sb.append(prefix); sb.append(" TOTAL wake: "); @@ -4707,7 +4749,23 @@ public abstract class BatteryStats implements Parcelable { } needComma = true; formatTimeMs(sb, totalPartialWakelock); - sb.append("partial"); + sb.append("blamed partial"); + } + if (actualTotalPartialWakelock != 0) { + if (needComma) { + sb.append(", "); + } + needComma = true; + formatTimeMs(sb, actualTotalPartialWakelock); + sb.append("actual partial"); + } + if (actualBgPartialWakelock != 0) { + if (needComma) { + sb.append(", "); + } + needComma = true; + formatTimeMs(sb, actualBgPartialWakelock); + sb.append("actual background partial"); } if (totalWindowWakelock != 0) { if (needComma) { diff --git a/core/java/android/os/Build.java b/core/java/android/os/Build.java index 4bad7ab76be6..a2fb9db8c64b 100644 --- a/core/java/android/os/Build.java +++ b/core/java/android/os/Build.java @@ -807,8 +807,20 @@ public class Build { } /** - * Verifies the the current flash of the device is consistent with what + * True if Treble is enabled and required for this device. + * + * @hide + */ + public static final boolean IS_TREBLE_ENABLED = + SystemProperties.getBoolean("ro.treble.enabled", false); + + /** + * Verifies the current flash of the device is consistent with what * was expected at build time. + * + * Treble devices will verify the Vendor Interface (VINTF). A device + * launched without Treble: + * * 1) Checks that device fingerprint is defined and that it matches across * various partitions. * 2) Verifies radio and bootloader partitions are those expected in the build. @@ -819,6 +831,17 @@ public class Build { // Don't care on eng builds. Incremental build may trigger false negative. if (IS_ENG) return true; + if (IS_TREBLE_ENABLED) { + int result = VintfObject.verify(new String[0]); + + if (result != 0) { + Slog.e(TAG, "Vendor interface is incompatible, error=" + + String.valueOf(result)); + } + + return result == 0; + } + final String system = SystemProperties.get("ro.build.fingerprint"); final String vendor = SystemProperties.get("ro.vendor.build.fingerprint"); final String bootimage = SystemProperties.get("ro.bootimage.build.fingerprint"); diff --git a/core/java/android/os/Parcel.java b/core/java/android/os/Parcel.java index 38a539559555..0a5e9a82a9a9 100644 --- a/core/java/android/os/Parcel.java +++ b/core/java/android/os/Parcel.java @@ -429,13 +429,7 @@ public final class Parcel { * @param size The new number of bytes in the Parcel. */ public final void setDataSize(int size) { - // STOPSHIP: Try/catch for exception is for temporary debug. Remove once bug resolved - try { - updateNativeSize(nativeSetDataSize(mNativePtr, size)); - } catch (IllegalArgumentException iae) { - Log.e(TAG,"Caught Exception representing a known bug in Parcel",iae); - Log.wtfStack(TAG, "This flow is using SetDataSize incorrectly"); - } + updateNativeSize(nativeSetDataSize(mNativePtr, size)); } /** diff --git a/core/java/android/view/SurfaceView.java b/core/java/android/view/SurfaceView.java index 2c33b60b98b5..2c9b2e4388f8 100644 --- a/core/java/android/view/SurfaceView.java +++ b/core/java/android/view/SurfaceView.java @@ -138,6 +138,8 @@ public class SurfaceView extends View implements ViewRootImpl.WindowStoppedCallb case DRAW_FINISHED_MSG: { mDrawFinished = true; if (mAttachedToWindow) { + mParent.requestTransparentRegion(SurfaceView.this); + notifyDrawFinished(); invalidate(); } @@ -247,7 +249,6 @@ public class SurfaceView extends View implements ViewRootImpl.WindowStoppedCallb getViewRootImpl().addWindowStoppedCallback(this); mWindowStopped = false; - mParent.requestTransparentRegion(this); mViewVisibility = getVisibility() == VISIBLE; updateRequestedVisibility(); @@ -352,7 +353,7 @@ public class SurfaceView extends View implements ViewRootImpl.WindowStoppedCallb @Override public boolean gatherTransparentRegion(Region region) { - if (isAboveParent()) { + if (isAboveParent() || !mDrawFinished) { return super.gatherTransparentRegion(region); } @@ -678,9 +679,16 @@ public class SurfaceView extends View implements ViewRootImpl.WindowStoppedCallb } finally { mIsCreating = false; if (mSurfaceControl != null && !mSurfaceCreated) { - mSurfaceControl.destroy(); mSurface.release(); - mSurfaceControl = null; + // If we are not in the stopped state, then the destruction of the Surface + // represents a visual change we need to display, and we should go ahead + // and destroy the SurfaceControl. However if we are in the stopped state, + // we can just leave the Surface around so it can be a part of animations, + // and we let the life-time be tied to the parent surface. + if (!mWindowStopped) { + mSurfaceControl.destroy(); + mSurfaceControl = null; + } } } } catch (Exception ex) { diff --git a/core/java/android/view/View.java b/core/java/android/view/View.java index 2d48295673b8..5b51c16a1dfb 100644 --- a/core/java/android/view/View.java +++ b/core/java/android/view/View.java @@ -19794,7 +19794,6 @@ public class View implements Drawable.Callback, KeyEvent.Callback, && (mForegroundInfo == null || mForegroundInfo.mDrawable == null)) { mPrivateFlags |= PFLAG_SKIP_DRAW; } - requestLayout(); invalidate(); } diff --git a/core/java/android/view/WindowManagerPolicy.java b/core/java/android/view/WindowManagerPolicy.java index a32632736ee8..13ffeecd235e 100644 --- a/core/java/android/view/WindowManagerPolicy.java +++ b/core/java/android/view/WindowManagerPolicy.java @@ -401,6 +401,13 @@ public interface WindowManagerPolicy { boolean isAnimatingLw(); /** + * @return Whether the window can affect SystemUI flags, meaning that SystemUI (system bars, + * for example) will be affected by the flags specified in this window. This is the + * case when the surface is on screen but not exiting. + */ + boolean canAffectSystemUiFlags(); + + /** * Is this window considered to be gone for purposes of layout? */ boolean isGoneForLayoutLw(); @@ -1684,4 +1691,16 @@ public interface WindowManagerPolicy { public void onConfigurationChanged(); public boolean shouldRotateSeamlessly(int oldRotation, int newRotation); + + /** + * Called when System UI has been started. + */ + void onSystemUiStarted(); + + /** + * Checks whether the policy is ready for dismissing the boot animation and completing the boot. + * + * @return true if ready; false otherwise. + */ + boolean canDismissBootAnimation(); } diff --git a/core/java/android/view/accessibility/AccessibilityEvent.java b/core/java/android/view/accessibility/AccessibilityEvent.java index 8a13c0cba477..eecfdca8a42a 100644 --- a/core/java/android/view/accessibility/AccessibilityEvent.java +++ b/core/java/android/view/accessibility/AccessibilityEvent.java @@ -618,8 +618,7 @@ public final class AccessibilityEvent extends AccessibilityRecord implements Par public static final int TYPE_WINDOW_CONTENT_CHANGED = 0x00000800; /** - * Represents the event of scrolling a view. This event type is generally not sent directly. - * @see View#onScrollChanged(int, int, int, int) + * Represents the event of scrolling a view. */ public static final int TYPE_VIEW_SCROLLED = 0x00001000; diff --git a/core/java/android/view/autofill/AutofillManager.java b/core/java/android/view/autofill/AutofillManager.java index 39ac39951d23..d8b316e70320 100644 --- a/core/java/android/view/autofill/AutofillManager.java +++ b/core/java/android/view/autofill/AutofillManager.java @@ -186,6 +186,10 @@ public final class AutofillManager { @GuardedBy("mLock") @Nullable private TrackedViews mTrackedViews; + /** Views that are only tracked because they are fillable and could be anchoring the UI. */ + @GuardedBy("mLock") + @Nullable private ArraySet<AutofillId> mFillableIds; + /** @hide */ public interface AutofillClient { /** @@ -238,13 +242,22 @@ public final class AutofillManager { boolean isVisibleForAutofill(); /** - * Find views by traversing the hierarchies of the client. + * Finds views by traversing the hierarchies of the client. * * @param viewIds The accessibility ids of the views to find * - * @return And array containing the views, or {@code null} if not found + * @return And array containing the views (empty if no views found). */ @NonNull View[] findViewsByAccessibilityIdTraversal(@NonNull int[] viewIds); + + /** + * Finds a view by traversing the hierarchies of the client. + * + * @param viewId The accessibility id of the views to find + * + * @return The view, or {@code null} if not found + */ + @Nullable View findViewByAccessibilityIdTraversal(int viewId); } /** @@ -471,8 +484,17 @@ public final class AutofillManager { */ public void notifyViewVisibilityChange(@NonNull View view, boolean isVisible) { synchronized (mLock) { - if (mEnabled && mSessionId != NO_SESSION && mTrackedViews != null) { - mTrackedViews.notifyViewVisibilityChange(view, isVisible); + if (mEnabled && mSessionId != NO_SESSION) { + if (!isVisible && mFillableIds != null) { + final AutofillId id = view.getAutofillId(); + if (mFillableIds.contains(id)) { + if (sDebug) Log.d(TAG, "Hidding UI when view " + id + " became invisible"); + requestHideFillUi(id, view); + } + } + if (mTrackedViews != null) { + mTrackedViews.notifyViewVisibilityChange(view, isVisible); + } } } } @@ -1048,9 +1070,10 @@ public final class AutofillManager { * * @param trackedIds The views to be tracked * @param saveOnAllViewsInvisible Finish the session once all tracked views are invisible. + * @param fillableIds Views that might anchor FillUI. */ - private void setTrackedViews(int sessionId, List<AutofillId> trackedIds, - boolean saveOnAllViewsInvisible) { + private void setTrackedViews(int sessionId, @Nullable AutofillId[] trackedIds, + boolean saveOnAllViewsInvisible, @Nullable AutofillId[] fillableIds) { synchronized (mLock) { if (mEnabled && mSessionId == sessionId) { if (saveOnAllViewsInvisible) { @@ -1058,15 +1081,32 @@ public final class AutofillManager { } else { mTrackedViews = null; } + if (fillableIds != null) { + if (mFillableIds == null) { + mFillableIds = new ArraySet<>(fillableIds.length); + } + for (AutofillId id : fillableIds) { + mFillableIds.add(id); + } + if (sVerbose) { + Log.v(TAG, "setTrackedViews(): fillableIds=" + fillableIds + + ", mFillableIds" + mFillableIds); + } + } } } } - private void requestHideFillUi(int sessionId, AutofillId id) { + private void requestHideFillUi(AutofillId id) { final View anchor = findView(id); + if (sVerbose) Log.v(TAG, "requestHideFillUi(" + id + "): anchor = " + anchor); if (anchor == null) { return; } + requestHideFillUi(id, anchor); + } + + private void requestHideFillUi(AutofillId id, View anchor) { AutofillCallback callback = null; synchronized (mLock) { @@ -1123,6 +1163,18 @@ public final class AutofillManager { * * @return The array of viewIds. */ + // TODO: move to Helper as static method + @NonNull private int[] getViewIds(@NonNull AutofillId[] autofillIds) { + final int numIds = autofillIds.length; + final int[] viewIds = new int[numIds]; + for (int i = 0; i < numIds; i++) { + viewIds[i] = autofillIds[i].getViewId(); + } + + return viewIds; + } + + // TODO: move to Helper as static method @NonNull private int[] getViewIds(@NonNull List<AutofillId> autofillIds) { final int numIds = autofillIds.size(); final int[] viewIds = new int[numIds]; @@ -1147,7 +1199,7 @@ public final class AutofillManager { return null; } - return client.findViewsByAccessibilityIdTraversal(new int[]{autofillId.getViewId()})[0]; + return client.findViewByAccessibilityIdTraversal(autofillId.getViewId()); } /** @hide */ @@ -1173,6 +1225,7 @@ public final class AutofillManager { * * @return {@code true} iff set is not empty and value is in set */ + // TODO: move to Helper as static method private <T> boolean isInSet(@Nullable ArraySet<T> set, T value) { return set != null && set.contains(value); } @@ -1186,6 +1239,7 @@ public final class AutofillManager { * @return The set including the new value. If set was {@code null}, a set containing only * the new value. */ + // TODO: move to Helper as static method @NonNull private <T> ArraySet<T> addToSet(@Nullable ArraySet<T> set, T valueToAdd) { if (set == null) { @@ -1206,6 +1260,7 @@ public final class AutofillManager { * @return The set without the removed value. {@code null} if set was null, or is empty * after removal. */ + // TODO: move to Helper as static method @Nullable private <T> ArraySet<T> removeFromSet(@Nullable ArraySet<T> set, T valueToRemove) { if (set == null) { @@ -1226,11 +1281,8 @@ public final class AutofillManager { * * @param trackedIds The views to be tracked */ - TrackedViews(List<AutofillId> trackedIds) { - mVisibleTrackedIds = null; - mInvisibleTrackedIds = null; - - AutofillClient client = getClientLocked(); + TrackedViews(@Nullable AutofillId[] trackedIds) { + final AutofillClient client = getClientLocked(); if (trackedIds != null && client != null) { final boolean[] isVisible; @@ -1238,12 +1290,12 @@ public final class AutofillManager { isVisible = client.getViewVisibility(getViewIds(trackedIds)); } else { // All false - isVisible = new boolean[trackedIds.size()]; + isVisible = new boolean[trackedIds.length]; } - final int numIds = trackedIds.size(); + final int numIds = trackedIds.length; for (int i = 0; i < numIds; i++) { - final AutofillId id = trackedIds.get(i); + final AutofillId id = trackedIds[i]; if (isVisible[i]) { mVisibleTrackedIds = addToSet(mVisibleTrackedIds, id); @@ -1294,6 +1346,9 @@ public final class AutofillManager { } if (mVisibleTrackedIds == null) { + if (sVerbose) { + Log.v(TAG, "No more visible ids. Invisibile = " + mInvisibleTrackedIds); + } finishSessionLocked(); } } @@ -1473,8 +1528,7 @@ public final class AutofillManager { public void requestHideFillUi(int sessionId, AutofillId id) { final AutofillManager afm = mAfm.get(); if (afm != null) { - afm.mContext.getMainThreadHandler().post( - () -> afm.requestHideFillUi(sessionId, id)); + afm.mContext.getMainThreadHandler().post(() -> afm.requestHideFillUi(id)); } } @@ -1501,12 +1555,12 @@ public final class AutofillManager { } @Override - public void setTrackedViews(int sessionId, List<AutofillId> ids, - boolean saveOnAllViewsInvisible) { + public void setTrackedViews(int sessionId, AutofillId[] ids, + boolean saveOnAllViewsInvisible, AutofillId[] fillableIds) { final AutofillManager afm = mAfm.get(); if (afm != null) { - afm.mContext.getMainThreadHandler().post( - () -> afm.setTrackedViews(sessionId, ids, saveOnAllViewsInvisible) + afm.mContext.getMainThreadHandler().post(() -> + afm.setTrackedViews(sessionId, ids, saveOnAllViewsInvisible, fillableIds) ); } } diff --git a/core/java/android/view/autofill/IAutoFillManagerClient.aidl b/core/java/android/view/autofill/IAutoFillManagerClient.aidl index 1d66f7f7f463..d18b1816e09e 100644 --- a/core/java/android/view/autofill/IAutoFillManagerClient.aidl +++ b/core/java/android/view/autofill/IAutoFillManagerClient.aidl @@ -52,8 +52,8 @@ oneway interface IAutoFillManagerClient { * Sets the views to track. If saveOnAllViewsInvisible is set and all these view are invisible * the session is finished automatically. */ - void setTrackedViews(int sessionId, in List<AutofillId> ids, - boolean saveOnAllViewsInvisible); + void setTrackedViews(int sessionId, in @nullable AutofillId[] savableIds, + boolean saveOnAllViewsInvisible, in @nullable AutofillId[] fillableIds); /** * Requests showing the fill UI. diff --git a/core/java/android/view/textclassifier/TextClassifier.java b/core/java/android/view/textclassifier/TextClassifier.java index 32fae73de46b..ab1d034bb916 100644 --- a/core/java/android/view/textclassifier/TextClassifier.java +++ b/core/java/android/view/textclassifier/TextClassifier.java @@ -67,11 +67,6 @@ public interface TextClassifier { CharSequence text, int startIndex, int endIndex, LocaleList defaultLocales) { return TextClassification.EMPTY; } - - @Override - public LinksInfo getLinks(CharSequence text, int linkMask, LocaleList defaultLocales) { - return LinksInfo.NO_OP; - } }; /** @@ -138,8 +133,10 @@ public interface TextClassifier { * @hide */ @WorkerThread - LinksInfo getLinks( - @NonNull CharSequence text, int linkMask, @Nullable LocaleList defaultLocales); + default LinksInfo getLinks( + @NonNull CharSequence text, int linkMask, @Nullable LocaleList defaultLocales) { + return LinksInfo.NO_OP; + } /** * Logs a TextClassifier event. diff --git a/core/java/android/widget/DatePickerCalendarDelegate.java b/core/java/android/widget/DatePickerCalendarDelegate.java index ca1bf582e603..636519b197e7 100755 --- a/core/java/android/widget/DatePickerCalendarDelegate.java +++ b/core/java/android/widget/DatePickerCalendarDelegate.java @@ -112,6 +112,7 @@ class DatePickerCalendarDelegate extends DatePicker.AbstractDatePickerDelegate { // Set up and attach container. mContainer = (ViewGroup) inflater.inflate(layoutResourceId, mDelegator, false); + mContainer.setSaveFromParentEnabled(false); mDelegator.addView(mContainer); // Set up header views. diff --git a/core/java/android/widget/DatePickerSpinnerDelegate.java b/core/java/android/widget/DatePickerSpinnerDelegate.java index fc2d1faca019..4f9316f881cd 100644 --- a/core/java/android/widget/DatePickerSpinnerDelegate.java +++ b/core/java/android/widget/DatePickerSpinnerDelegate.java @@ -115,7 +115,8 @@ class DatePickerSpinnerDelegate extends AbstractDatePickerDelegate { LayoutInflater inflater = (LayoutInflater) context .getSystemService(Context.LAYOUT_INFLATER_SERVICE); - inflater.inflate(layoutResourceId, mDelegator, true); + final View view = inflater.inflate(layoutResourceId, mDelegator, true); + view.setSaveFromParentEnabled(false); OnValueChangeListener onChangeListener = new OnValueChangeListener() { public void onValueChange(NumberPicker picker, int oldVal, int newVal) { diff --git a/core/java/android/widget/NumberPicker.java b/core/java/android/widget/NumberPicker.java index d456989eb50a..7bdd6dadf415 100644 --- a/core/java/android/widget/NumberPicker.java +++ b/core/java/android/widget/NumberPicker.java @@ -737,7 +737,6 @@ public class NumberPicker extends LinearLayout { mInputText.setFilters(new InputFilter[] { new InputTextFilter() }); - mInputText.setAccessibilityLiveRegion(View.ACCESSIBILITY_LIVE_REGION_POLITE); mInputText.setRawInputType(InputType.TYPE_CLASS_NUMBER); mInputText.setImeOptions(EditorInfo.IME_ACTION_DONE); @@ -771,12 +770,6 @@ public class NumberPicker extends LinearLayout { if (getImportantForAccessibility() == IMPORTANT_FOR_ACCESSIBILITY_AUTO) { setImportantForAccessibility(IMPORTANT_FOR_ACCESSIBILITY_YES); } - - // Should be focusable by default, as the text view whose visibility changes is focusable - if (getFocusable() == View.FOCUSABLE_AUTO) { - setFocusable(View.FOCUSABLE); - setFocusableInTouchMode(true); - } } @Override @@ -863,7 +856,7 @@ public class NumberPicker extends LinearLayout { switch (action) { case MotionEvent.ACTION_DOWN: { removeAllCallbacks(); - hideSoftInput(); + mInputText.setVisibility(View.INVISIBLE); mLastDownOrMoveEventY = mLastDownEventY = event.getY(); mLastDownEventTime = event.getEventTime(); mIgnoreMoveEvents = false; @@ -890,9 +883,11 @@ public class NumberPicker extends LinearLayout { mFlingScroller.forceFinished(true); mAdjustScroller.forceFinished(true); } else if (mLastDownEventY < mTopSelectionDividerTop) { + hideSoftInput(); postChangeCurrentByOneFromLongPress( false, ViewConfiguration.getLongPressTimeout()); } else if (mLastDownEventY > mBottomSelectionDividerBottom) { + hideSoftInput(); postChangeCurrentByOneFromLongPress( true, ViewConfiguration.getLongPressTimeout()); } else { @@ -1125,7 +1120,6 @@ public class NumberPicker extends LinearLayout { @Override public void scrollBy(int x, int y) { int[] selectorIndices = mSelectorIndices; - int startScrollOffset = mCurrentScrollOffset; if (!mWrapSelectorWheel && y > 0 && selectorIndices[SELECTOR_MIDDLE_ITEM_INDEX] <= mMinValue) { mCurrentScrollOffset = mInitialScrollOffset; @@ -1153,9 +1147,6 @@ public class NumberPicker extends LinearLayout { mCurrentScrollOffset = mInitialScrollOffset; } } - if (startScrollOffset != mCurrentScrollOffset) { - onScrollChanged(0, mCurrentScrollOffset, 0, startScrollOffset); - } } @Override @@ -1744,10 +1735,7 @@ public class NumberPicker extends LinearLayout { } int previous = mValue; mValue = current; - // If we're flinging, we'll update the text view at the end when it becomes visible - if (mScrollState != OnScrollListener.SCROLL_STATE_FLING) { - updateInputTextView(); - } + updateInputTextView(); if (notifyChange) { notifyChange(previous, current); } @@ -1764,7 +1752,7 @@ public class NumberPicker extends LinearLayout { */ private void changeValueByOne(boolean increment) { if (mHasSelectorWheel) { - hideSoftInput(); + mInputText.setVisibility(View.INVISIBLE); if (!moveToFinalScrollerPosition(mFlingScroller)) { moveToFinalScrollerPosition(mAdjustScroller); } @@ -1811,8 +1799,9 @@ public class NumberPicker extends LinearLayout { */ private void onScrollerFinished(Scroller scroller) { if (scroller == mFlingScroller) { - ensureScrollWheelAdjusted(); - updateInputTextView(); + if (!ensureScrollWheelAdjusted()) { + updateInputTextView(); + } onScrollStateChange(OnScrollListener.SCROLL_STATE_IDLE); } else { if (mScrollState != OnScrollListener.SCROLL_STATE_TOUCH_SCROLL) { @@ -1948,25 +1937,9 @@ public class NumberPicker extends LinearLayout { */ String text = (mDisplayedValues == null) ? formatNumber(mValue) : mDisplayedValues[mValue - mMinValue]; - if (!TextUtils.isEmpty(text)) { - CharSequence beforeText = mInputText.getText(); - if (!text.equals(beforeText.toString())) { - mInputText.setText(text); - if (mAccessibilityNodeProvider != null) { - AccessibilityEvent event = AccessibilityEvent.obtain( - AccessibilityEvent.TYPE_VIEW_TEXT_CHANGED); - mInputText.onInitializeAccessibilityEvent(event); - mInputText.onPopulateAccessibilityEvent(event); - event.setFromIndex(0); - event.setRemovedCount(beforeText.length()); - event.setAddedCount(text.length()); - event.setBeforeText(beforeText); - event.setSource(NumberPicker.this, - AccessibilityNodeProviderImpl.VIRTUAL_VIEW_ID_INPUT); - requestSendAccessibilityEvent(NumberPicker.this, event); - } - return true; - } + if (!TextUtils.isEmpty(text) && !text.equals(mInputText.getText().toString())) { + mInputText.setText(text); + return true; } return false; diff --git a/core/java/android/widget/SelectionActionModeHelper.java b/core/java/android/widget/SelectionActionModeHelper.java index 3d54fe7d8982..6657c3a78a20 100644 --- a/core/java/android/widget/SelectionActionModeHelper.java +++ b/core/java/android/widget/SelectionActionModeHelper.java @@ -73,7 +73,7 @@ final class SelectionActionModeHelper { // Do not call the TextClassifier if there is no selection. startActionMode(null); } else { - resetTextClassificationHelper(); + resetTextClassificationHelper(true /* resetSelectionTag */); mTextClassificationAsyncTask = new TextClassificationAsyncTask( mEditor.getTextView(), TIMEOUT_DURATION, @@ -92,7 +92,7 @@ final class SelectionActionModeHelper { // Do not call the TextClassifier if there is no selection. invalidateActionMode(null); } else { - resetTextClassificationHelper(); + resetTextClassificationHelper(false /* resetSelectionTag */); mTextClassificationAsyncTask = new TextClassificationAsyncTask( mEditor.getTextView(), TIMEOUT_DURATION, mTextClassificationHelper::classifyText, this::invalidateActionMode) @@ -101,12 +101,12 @@ final class SelectionActionModeHelper { } public void onSelectionAction() { - mSelectionTracker.onSelectionAction(mTextClassificationHelper.getClassifierTag()); + mSelectionTracker.onSelectionAction(mTextClassificationHelper.getSelectionTag()); } public boolean resetSelection(int textIndex) { if (mSelectionTracker.resetSelection( - textIndex, mEditor, mTextClassificationHelper.getClassifierTag())) { + textIndex, mEditor, mTextClassificationHelper.getSelectionTag())) { invalidateActionModeAsync(); return true; } @@ -158,7 +158,7 @@ final class SelectionActionModeHelper { } if (result != null) { mSelectionTracker.onSelectionStarted( - result.mStart, result.mEnd, mTextClassificationHelper.getClassifierTag()); + result.mStart, result.mEnd, mTextClassificationHelper.getSelectionTag()); } } mEditor.setRestartActionModeOnNextRefresh(false); @@ -174,15 +174,15 @@ final class SelectionActionModeHelper { final TextView textView = mEditor.getTextView(); mSelectionTracker.onSelectionUpdated( textView.getSelectionStart(), textView.getSelectionEnd(), - mTextClassificationHelper.getClassifierTag()); + mTextClassificationHelper.getSelectionTag()); mTextClassificationAsyncTask = null; } - private void resetTextClassificationHelper() { + private void resetTextClassificationHelper(boolean resetSelectionTag) { final TextView textView = mEditor.getTextView(); mTextClassificationHelper.reset(textView.getTextClassifier(), textView.getText(), textView.getSelectionStart(), textView.getSelectionEnd(), - textView.getTextLocales()); + resetSelectionTag, textView.getTextLocales()); } /** @@ -195,10 +195,14 @@ final class SelectionActionModeHelper { // Log event: Smart selection happened. private static final String LOG_EVENT_MULTI_SELECTION = "textClassifier_multiSelection"; + private static final String LOG_EVENT_SINGLE_SELECTION = + "textClassifier_singleSelection"; // Log event: Smart selection acted upon. private static final String LOG_EVENT_MULTI_SELECTION_ACTION = "textClassifier_multiSelection_action"; + private static final String LOG_EVENT_SINGLE_SELECTION_ACTION = + "textClassifier_singleSelection_action"; // Log event: Smart selection was reset to original selection. private static final String LOG_EVENT_MULTI_SELECTION_RESET = @@ -207,6 +211,8 @@ final class SelectionActionModeHelper { // Log event: Smart selection was user modified. private static final String LOG_EVENT_MULTI_SELECTION_MODIFIED = "textClassifier_multiSelection_modified"; + private static final String LOG_EVENT_SINGLE_SELECTION_MODIFIED = + "textClassifier_singleSelection_modified"; private final TextClassifier mClassifier; @@ -215,7 +221,8 @@ final class SelectionActionModeHelper { private int mSelectionStart; private int mSelectionEnd; - private boolean mSmartSelectionActive; + private boolean mMultiSelection; + private boolean mClassifierSelection; SelectionTracker(TextClassifier classifier) { mClassifier = classifier; @@ -227,23 +234,26 @@ final class SelectionActionModeHelper { public void setOriginalSelection(int selectionStart, int selectionEnd) { mOriginalStart = selectionStart; mOriginalEnd = selectionEnd; - mSmartSelectionActive = false; + resetSelectionFlags(); } /** - * Called when selection action mode is started. + * Called when selection action mode is started and the results come from a classifier. * If the selection indices are different from the original selection indices, we have a * smart selection. */ public void onSelectionStarted(int selectionStart, int selectionEnd, String logTag) { + mClassifierSelection = !logTag.isEmpty(); mSelectionStart = selectionStart; mSelectionEnd = selectionEnd; // If the started selection is different from the original selection, we have a // smart selection. - mSmartSelectionActive = + mMultiSelection = mSelectionStart != mOriginalStart || mSelectionEnd != mOriginalEnd; - if (mSmartSelectionActive) { + if (mMultiSelection) { mClassifier.logEvent(logTag, LOG_EVENT_MULTI_SELECTION); + } else if (mClassifierSelection) { + mClassifier.logEvent(logTag, LOG_EVENT_SINGLE_SELECTION); } } @@ -254,10 +264,12 @@ final class SelectionActionModeHelper { final boolean selectionChanged = selectionStart != mSelectionStart || selectionEnd != mSelectionEnd; if (selectionChanged) { - if (mSmartSelectionActive) { + if (mMultiSelection) { mClassifier.logEvent(logTag, LOG_EVENT_MULTI_SELECTION_MODIFIED); + } else if (mClassifierSelection) { + mClassifier.logEvent(logTag, LOG_EVENT_SINGLE_SELECTION_MODIFIED); } - mSmartSelectionActive = false; + resetSelectionFlags(); } } @@ -265,15 +277,17 @@ final class SelectionActionModeHelper { * Called when the selection action mode is destroyed. */ public void onSelectionDestroyed() { - mSmartSelectionActive = false; + resetSelectionFlags(); } /** * Logs if the action was taken on a smart selection. */ public void onSelectionAction(String logTag) { - if (mSmartSelectionActive) { + if (mMultiSelection) { mClassifier.logEvent(logTag, LOG_EVENT_MULTI_SELECTION_ACTION); + } else if (mClassifierSelection) { + mClassifier.logEvent(logTag, LOG_EVENT_SINGLE_SELECTION_ACTION); } } @@ -285,16 +299,21 @@ final class SelectionActionModeHelper { */ public boolean resetSelection(int textIndex, Editor editor, String logTag) { final CharSequence text = editor.getTextView().getText(); - if (mSmartSelectionActive + if (mMultiSelection && textIndex >= mSelectionStart && textIndex <= mSelectionEnd && text instanceof Spannable) { // Only allow a reset once. - mSmartSelectionActive = false; + resetSelectionFlags(); mClassifier.logEvent(logTag, LOG_EVENT_MULTI_SELECTION_RESET); return editor.selectCurrentWord(); } return false; } + + private void resetSelectionFlags() { + mMultiSelection = false; + mClassifierSelection = false; + } } /** @@ -372,7 +391,8 @@ final class SelectionActionModeHelper { /** End index relative to mText. */ private int mSelectionEnd; private LocaleList mLocales; - private String mClassifierTag = ""; + /** A tag for the classifier that returned the latest smart selection. */ + private String mSelectionTag = ""; /** Trimmed text starting from mTrimStart in mText. */ private CharSequence mTrimmedText; @@ -392,12 +412,13 @@ final class SelectionActionModeHelper { TextClassificationHelper(TextClassifier textClassifier, CharSequence text, int selectionStart, int selectionEnd, LocaleList locales) { - reset(textClassifier, text, selectionStart, selectionEnd, locales); + reset(textClassifier, text, selectionStart, selectionEnd, true, locales); } @UiThread public void reset(TextClassifier textClassifier, - CharSequence text, int selectionStart, int selectionEnd, LocaleList locales) { + CharSequence text, int selectionStart, int selectionEnd, + boolean resetSelectionTag, LocaleList locales) { mTextClassifier = Preconditions.checkNotNull(textClassifier); mText = Preconditions.checkNotNull(text).toString(); mLastClassificationText = null; // invalidate. @@ -405,6 +426,9 @@ final class SelectionActionModeHelper { mSelectionStart = selectionStart; mSelectionEnd = selectionEnd; mLocales = locales; + if (resetSelectionTag) { + mSelectionTag = ""; + } } @WorkerThread @@ -437,12 +461,12 @@ final class SelectionActionModeHelper { mTrimmedText, mRelativeStart, mRelativeEnd, mLocales); mSelectionStart = Math.max(0, sel.getSelectionStartIndex() + mTrimStart); mSelectionEnd = Math.min(mText.length(), sel.getSelectionEndIndex() + mTrimStart); - mClassifierTag = sel.getSourceClassifier(); + mSelectionTag = sel.getSourceClassifier(); return classifyText(); } - String getClassifierTag() { - return mClassifierTag; + String getSelectionTag() { + return mSelectionTag; } private void trimText() { diff --git a/core/java/android/widget/TextView.java b/core/java/android/widget/TextView.java index 8542bec0113b..2f1f8906e232 100644 --- a/core/java/android/widget/TextView.java +++ b/core/java/android/widget/TextView.java @@ -746,17 +746,17 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener // Default value for the step size in pixels. private static final int DEFAULT_AUTO_SIZE_GRANULARITY_IN_PX = 1; // Use this to specify that any of the auto-size configuration int values have not been set. - private static final int UNSET_AUTO_SIZE_UNIFORM_CONFIGURATION_VALUE = -1; + private static final float UNSET_AUTO_SIZE_UNIFORM_CONFIGURATION_VALUE = -1f; // Auto-size text type. private int mAutoSizeTextType = AUTO_SIZE_TEXT_TYPE_NONE; // Specify if auto-size text is needed. private boolean mNeedsAutoSizeText = false; // Step size for auto-sizing in pixels. - private int mAutoSizeStepGranularityInPx = UNSET_AUTO_SIZE_UNIFORM_CONFIGURATION_VALUE; + private float mAutoSizeStepGranularityInPx = UNSET_AUTO_SIZE_UNIFORM_CONFIGURATION_VALUE; // Minimum text size for auto-sizing in pixels. - private int mAutoSizeMinTextSizeInPx = UNSET_AUTO_SIZE_UNIFORM_CONFIGURATION_VALUE; + private float mAutoSizeMinTextSizeInPx = UNSET_AUTO_SIZE_UNIFORM_CONFIGURATION_VALUE; // Maximum text size for auto-sizing in pixels. - private int mAutoSizeMaxTextSizeInPx = UNSET_AUTO_SIZE_UNIFORM_CONFIGURATION_VALUE; + private float mAutoSizeMaxTextSizeInPx = UNSET_AUTO_SIZE_UNIFORM_CONFIGURATION_VALUE; // Contains a (specified or computed) distinct sorted set of text sizes in pixels to pick from // when auto-sizing text. private int[] mAutoSizeTextSizesInPx = EmptyArray.INT; @@ -987,9 +987,9 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener CharSequence text = ""; CharSequence hint = null; boolean password = false; - int autoSizeMinTextSizeInPx = UNSET_AUTO_SIZE_UNIFORM_CONFIGURATION_VALUE; - int autoSizeMaxTextSizeInPx = UNSET_AUTO_SIZE_UNIFORM_CONFIGURATION_VALUE; - int autoSizeStepGranularityInPx = UNSET_AUTO_SIZE_UNIFORM_CONFIGURATION_VALUE; + float autoSizeMinTextSizeInPx = UNSET_AUTO_SIZE_UNIFORM_CONFIGURATION_VALUE; + float autoSizeMaxTextSizeInPx = UNSET_AUTO_SIZE_UNIFORM_CONFIGURATION_VALUE; + float autoSizeStepGranularityInPx = UNSET_AUTO_SIZE_UNIFORM_CONFIGURATION_VALUE; int inputType = EditorInfo.TYPE_NULL; a = theme.obtainStyledAttributes( attrs, com.android.internal.R.styleable.TextView, defStyleAttr, defStyleRes); @@ -1363,17 +1363,17 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener break; case com.android.internal.R.styleable.TextView_autoSizeStepGranularity: - autoSizeStepGranularityInPx = a.getDimensionPixelSize(attr, + autoSizeStepGranularityInPx = a.getDimension(attr, UNSET_AUTO_SIZE_UNIFORM_CONFIGURATION_VALUE); break; case com.android.internal.R.styleable.TextView_autoSizeMinTextSize: - autoSizeMinTextSizeInPx = a.getDimensionPixelSize(attr, + autoSizeMinTextSizeInPx = a.getDimension(attr, UNSET_AUTO_SIZE_UNIFORM_CONFIGURATION_VALUE); break; case com.android.internal.R.styleable.TextView_autoSizeMaxTextSize: - autoSizeMaxTextSizeInPx = a.getDimensionPixelSize(attr, + autoSizeMaxTextSizeInPx = a.getDimension(attr, UNSET_AUTO_SIZE_UNIFORM_CONFIGURATION_VALUE); break; @@ -1653,6 +1653,7 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener ? (val.data == 0 ? NOT_FOCUSABLE : FOCUSABLE) : val.data; } + break; case com.android.internal.R.styleable.View_clickable: clickable = a.getBoolean(attr, clickable); @@ -1691,14 +1692,14 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener final DisplayMetrics displayMetrics = getResources().getDisplayMetrics(); if (autoSizeMinTextSizeInPx == UNSET_AUTO_SIZE_UNIFORM_CONFIGURATION_VALUE) { - autoSizeMinTextSizeInPx = (int) TypedValue.applyDimension( + autoSizeMinTextSizeInPx = TypedValue.applyDimension( TypedValue.COMPLEX_UNIT_SP, DEFAULT_AUTO_SIZE_MIN_TEXT_SIZE_IN_SP, displayMetrics); } if (autoSizeMaxTextSizeInPx == UNSET_AUTO_SIZE_UNIFORM_CONFIGURATION_VALUE) { - autoSizeMaxTextSizeInPx = (int) TypedValue.applyDimension( + autoSizeMaxTextSizeInPx = TypedValue.applyDimension( TypedValue.COMPLEX_UNIT_SP, DEFAULT_AUTO_SIZE_MAX_TEXT_SIZE_IN_SP, displayMetrics); @@ -1743,11 +1744,11 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener break; case AUTO_SIZE_TEXT_TYPE_UNIFORM: final DisplayMetrics displayMetrics = getResources().getDisplayMetrics(); - final int autoSizeMinTextSizeInPx = (int) TypedValue.applyDimension( + final float autoSizeMinTextSizeInPx = TypedValue.applyDimension( TypedValue.COMPLEX_UNIT_SP, DEFAULT_AUTO_SIZE_MIN_TEXT_SIZE_IN_SP, displayMetrics); - final int autoSizeMaxTextSizeInPx = (int) TypedValue.applyDimension( + final float autoSizeMaxTextSizeInPx = TypedValue.applyDimension( TypedValue.COMPLEX_UNIT_SP, DEFAULT_AUTO_SIZE_MAX_TEXT_SIZE_IN_SP, displayMetrics); @@ -1796,11 +1797,11 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener int autoSizeMaxTextSize, int autoSizeStepGranularity, int unit) { if (supportsAutoSizeText()) { final DisplayMetrics displayMetrics = getResources().getDisplayMetrics(); - final int autoSizeMinTextSizeInPx = (int) TypedValue.applyDimension( + final float autoSizeMinTextSizeInPx = TypedValue.applyDimension( unit, autoSizeMinTextSize, displayMetrics); - final int autoSizeMaxTextSizeInPx = (int) TypedValue.applyDimension( + final float autoSizeMaxTextSizeInPx = TypedValue.applyDimension( unit, autoSizeMaxTextSize, displayMetrics); - final int autoSizeStepGranularityInPx = (int) TypedValue.applyDimension( + final float autoSizeStepGranularityInPx = TypedValue.applyDimension( unit, autoSizeStepGranularity, displayMetrics); validateAndSetAutoSizeTextTypeUniformConfiguration(autoSizeMinTextSizeInPx, @@ -1842,8 +1843,8 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener final DisplayMetrics displayMetrics = getResources().getDisplayMetrics(); // Convert all to sizes to pixels. for (int i = 0; i < presetSizesLength; i++) { - presetSizesInPx[i] = (int) TypedValue.applyDimension(unit, presetSizes[i], - displayMetrics); + presetSizesInPx[i] = Math.round(TypedValue.applyDimension(unit, + presetSizes[i], displayMetrics)); } } @@ -1885,7 +1886,7 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener * @see #setAutoSizeTextTypeUniformWithConfiguration(int, int, int, int) */ public int getAutoSizeStepGranularity() { - return mAutoSizeStepGranularityInPx; + return Math.round(mAutoSizeStepGranularityInPx); } /** @@ -1898,7 +1899,7 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener * @see #setAutoSizeTextTypeUniformWithPresetSizes(int[], int) */ public int getAutoSizeMinTextSize() { - return mAutoSizeMinTextSizeInPx; + return Math.round(mAutoSizeMinTextSizeInPx); } /** @@ -1911,7 +1912,7 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener * @see #setAutoSizeTextTypeUniformWithPresetSizes(int[], int) */ public int getAutoSizeMaxTextSize() { - return mAutoSizeMaxTextSizeInPx; + return Math.round(mAutoSizeMaxTextSizeInPx); } /** @@ -1954,8 +1955,8 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener * * @throws IllegalArgumentException if any of the params are invalid */ - private void validateAndSetAutoSizeTextTypeUniformConfiguration(int autoSizeMinTextSizeInPx, - int autoSizeMaxTextSizeInPx, int autoSizeStepGranularityInPx) { + private void validateAndSetAutoSizeTextTypeUniformConfiguration(float autoSizeMinTextSizeInPx, + float autoSizeMaxTextSizeInPx, float autoSizeStepGranularityInPx) { // First validate. if (autoSizeMinTextSizeInPx <= 0) { throw new IllegalArgumentException("Minimum auto-size text size (" @@ -2021,18 +2022,19 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener // Calculate sizes to choose from based on the current auto-size configuration. int autoSizeValuesLength = (int) Math.ceil( (mAutoSizeMaxTextSizeInPx - mAutoSizeMinTextSizeInPx) - / (float) mAutoSizeStepGranularityInPx); + / mAutoSizeStepGranularityInPx); // Also reserve a slot for the max size if it fits. if ((mAutoSizeMaxTextSizeInPx - mAutoSizeMinTextSizeInPx) % mAutoSizeStepGranularityInPx == 0) { autoSizeValuesLength++; } - mAutoSizeTextSizesInPx = new int[autoSizeValuesLength]; - int sizeToAdd = mAutoSizeMinTextSizeInPx; + int[] autoSizeTextSizesInPx = new int[autoSizeValuesLength]; + float sizeToAdd = mAutoSizeMinTextSizeInPx; for (int i = 0; i < autoSizeValuesLength; i++) { - mAutoSizeTextSizesInPx[i] = sizeToAdd; + autoSizeTextSizesInPx[i] = Math.round(sizeToAdd); sizeToAdd += mAutoSizeStepGranularityInPx; } + mAutoSizeTextSizesInPx = cleanupAutoSizePresetSizes(autoSizeTextSizesInPx); } mNeedsAutoSizeText = true; diff --git a/core/java/android/widget/TimePickerClockDelegate.java b/core/java/android/widget/TimePickerClockDelegate.java index 05d0f960131f..d3c83eefbe1f 100644 --- a/core/java/android/widget/TimePickerClockDelegate.java +++ b/core/java/android/widget/TimePickerClockDelegate.java @@ -137,6 +137,7 @@ class TimePickerClockDelegate extends TimePicker.AbstractTimePickerDelegate { final int layoutResourceId = a.getResourceId(R.styleable.TimePicker_internalLayout, R.layout.time_picker_material); final View mainView = inflater.inflate(layoutResourceId, delegator); + mainView.setSaveFromParentEnabled(false); mRadialTimePickerHeader = mainView.findViewById(R.id.time_header); mRadialTimePickerHeader.setOnTouchListener(new NearestTouchDelegate()); diff --git a/core/java/android/widget/TimePickerSpinnerDelegate.java b/core/java/android/widget/TimePickerSpinnerDelegate.java index 813c30e344c0..7a7d9a948dcc 100644 --- a/core/java/android/widget/TimePickerSpinnerDelegate.java +++ b/core/java/android/widget/TimePickerSpinnerDelegate.java @@ -83,7 +83,8 @@ class TimePickerSpinnerDelegate extends TimePicker.AbstractTimePickerDelegate { a.recycle(); final LayoutInflater inflater = LayoutInflater.from(mContext); - inflater.inflate(layoutResourceId, mDelegator, true); + final View view = inflater.inflate(layoutResourceId, mDelegator, true); + view.setSaveFromParentEnabled(false); // hour mHourSpinner = delegator.findViewById(R.id.hour); diff --git a/core/java/com/android/internal/notification/SystemNotificationChannels.java b/core/java/com/android/internal/notification/SystemNotificationChannels.java index d279746294b3..797cf2b6de56 100644 --- a/core/java/com/android/internal/notification/SystemNotificationChannels.java +++ b/core/java/com/android/internal/notification/SystemNotificationChannels.java @@ -47,7 +47,6 @@ public class SystemNotificationChannels { public static String RETAIL_MODE = "RETAIL_MODE"; public static String USB = "USB"; public static String FOREGROUND_SERVICE = "FOREGROUND_SERVICE"; - public static String ALERT_WINDOW = "ALERT_WINDOW"; public static void createAll(Context context) { final NotificationManager nm = context.getSystemService(NotificationManager.class); @@ -138,11 +137,6 @@ public class SystemNotificationChannels { context.getString(R.string.notification_channel_foreground_service), NotificationManager.IMPORTANCE_MIN)); - channelsList.add(new NotificationChannel( - ALERT_WINDOW, - context.getString(R.string.alert_windows_notification_channel_name), - NotificationManager.IMPORTANCE_MIN)); - nm.createNotificationChannels(channelsList); } diff --git a/core/java/com/android/internal/os/BatteryStatsImpl.java b/core/java/com/android/internal/os/BatteryStatsImpl.java index 25d5fae12191..17ef77c41da2 100644 --- a/core/java/com/android/internal/os/BatteryStatsImpl.java +++ b/core/java/com/android/internal/os/BatteryStatsImpl.java @@ -116,7 +116,7 @@ public class BatteryStatsImpl extends BatteryStats { private static final int MAGIC = 0xBA757475; // 'BATSTATS' // Current on-disk Parcel version - private static final int VERSION = 157 + (USE_OLD_HISTORY ? 1000 : 0); + private static final int VERSION = 158 + (USE_OLD_HISTORY ? 1000 : 0); // Maximum number of items we will record in the history. private static final int MAX_HISTORY_ITEMS = 2000; @@ -185,7 +185,7 @@ public class BatteryStatsImpl extends BatteryStats { switch (msg.what) { case MSG_UPDATE_WAKELOCKS: synchronized (BatteryStatsImpl.this) { - updateCpuTimeLocked(); + updateCpuTimeLocked(false /* updateCpuFreqData */); } if (cb != null) { cb.batteryNeedsCpuUpdate(); @@ -3467,8 +3467,8 @@ public class BatteryStatsImpl extends BatteryStats { boolean batteryStatusChanged = mOnBatteryTimeBase.setRunning(unplugged, uptime, realtime); if (batteryStatusChanged) { - for (int i=0; i<mUidStats.size(); i++) { - mUidStats.valueAt(i).updateBgTimeBase(uptime, realtime); + for (int i = 0; i < mUidStats.size(); i++) { + mUidStats.valueAt(i).updateOnBatteryBgTimeBase(uptime, realtime); } } @@ -3480,8 +3480,11 @@ public class BatteryStatsImpl extends BatteryStats { Slog.d(TAG, "Updating cpu time because screen is now " + (unpluggedScreenOff ? "off" : "on")); } - updateCpuTimeLocked(); + updateCpuTimeLocked(true /* updateCpuFreqData */); mOnBatteryScreenOffTimeBase.setRunning(unpluggedScreenOff, uptime, realtime); + for (int i = 0; i < mUidStats.size(); i++) { + mUidStats.valueAt(i).updateOnBatteryScreenOffBgTimeBase(uptime, realtime); + } } } @@ -5581,6 +5584,8 @@ public class BatteryStatsImpl extends BatteryStats { /** TimeBase for when uid is in background and device is on battery. */ @VisibleForTesting(visibility = VisibleForTesting.Visibility.PACKAGE) public final TimeBase mOnBatteryBackgroundTimeBase; + @VisibleForTesting(visibility = VisibleForTesting.Visibility.PACKAGE) + public final TimeBase mOnBatteryScreenOffBackgroundTimeBase; boolean mWifiRunning; StopwatchTimer mWifiRunningTimer; @@ -5603,6 +5608,8 @@ public class BatteryStatsImpl extends BatteryStats { StopwatchTimer mFlashlightTurnedOnTimer; StopwatchTimer mCameraTurnedOnTimer; StopwatchTimer mForegroundActivityTimer; + /** Total time spent by the uid holding any partial wakelocks. */ + DualTimer mAggregatedPartialWakelockTimer; DualTimer mBluetoothScanTimer; Counter mBluetoothScanResultCounter; @@ -5704,6 +5711,10 @@ public class BatteryStatsImpl extends BatteryStats { mOnBatteryBackgroundTimeBase.init(mBsi.mClocks.uptimeMillis() * 1000, mBsi.mClocks.elapsedRealtime() * 1000); + mOnBatteryScreenOffBackgroundTimeBase = new TimeBase(); + mOnBatteryScreenOffBackgroundTimeBase.init(mBsi.mClocks.uptimeMillis() * 1000, + mBsi.mClocks.elapsedRealtime() * 1000); + mUserCpuTime = new LongSamplingCounter(mBsi.mOnBatteryTimeBase); mSystemCpuTime = new LongSamplingCounter(mBsi.mOnBatteryTimeBase); @@ -5774,6 +5785,11 @@ public class BatteryStatsImpl extends BatteryStats { } @Override + public Timer getAggregatedPartialWakelockTimer() { + return mAggregatedPartialWakelockTimer; + } + + @Override public ArrayMap<String, ? extends BatteryStats.Uid.Wakelock> getWakelockStats() { return mWakelockStats.getMap(); } @@ -6062,6 +6078,15 @@ public class BatteryStatsImpl extends BatteryStats { return mForegroundActivityTimer; } + public DualTimer createAggregatedPartialWakelockTimerLocked() { + if (mAggregatedPartialWakelockTimer == null) { + mAggregatedPartialWakelockTimer = new DualTimer(mBsi.mClocks, this, + AGGREGATED_WAKE_TYPE_PARTIAL, null, + mBsi.mOnBatteryScreenOffTimeBase, mOnBatteryScreenOffBackgroundTimeBase); + } + return mAggregatedPartialWakelockTimer; + } + public DualTimer createBluetoothScanTimerLocked() { if (mBluetoothScanTimer == null) { mBluetoothScanTimer = new DualTimer(mBsi.mClocks, Uid.this, BLUETOOTH_SCAN_ON, @@ -6504,6 +6529,7 @@ public class BatteryStatsImpl extends BatteryStats { active |= !resetTimerIfNotNull(mFlashlightTurnedOnTimer, false); active |= !resetTimerIfNotNull(mCameraTurnedOnTimer, false); active |= !resetTimerIfNotNull(mForegroundActivityTimer, false); + active |= !resetTimerIfNotNull(mAggregatedPartialWakelockTimer, false); active |= !resetTimerIfNotNull(mBluetoothScanTimer, false); if (mBluetoothScanResultCounter != null) { mBluetoothScanResultCounter.reset(false); @@ -6656,6 +6682,8 @@ public class BatteryStatsImpl extends BatteryStats { mOnBatteryBackgroundTimeBase.reset(mBsi.mClocks.elapsedRealtime() * 1000, mBsi.mClocks.uptimeMillis() * 1000); + mOnBatteryScreenOffBackgroundTimeBase.reset(mBsi.mClocks.elapsedRealtime() * 1000, + mBsi.mClocks.uptimeMillis() * 1000); if (!active) { if (mWifiRunningTimer != null) { @@ -6695,6 +6723,10 @@ public class BatteryStatsImpl extends BatteryStats { mForegroundActivityTimer.detach(); mForegroundActivityTimer = null; } + if (mAggregatedPartialWakelockTimer != null) { + mAggregatedPartialWakelockTimer.detach(); + mAggregatedPartialWakelockTimer = null; + } if (mBluetoothScanTimer != null) { mBluetoothScanTimer.detach(); mBluetoothScanTimer = null; @@ -6760,6 +6792,7 @@ public class BatteryStatsImpl extends BatteryStats { void writeToParcelLocked(Parcel out, long uptimeUs, long elapsedRealtimeUs) { mOnBatteryBackgroundTimeBase.writeToParcel(out, uptimeUs, elapsedRealtimeUs); + mOnBatteryScreenOffBackgroundTimeBase.writeToParcel(out, uptimeUs, elapsedRealtimeUs); final ArrayMap<String, Wakelock> wakeStats = mWakelockStats.getMap(); int NW = wakeStats.size(); @@ -6874,6 +6907,12 @@ public class BatteryStatsImpl extends BatteryStats { } else { out.writeInt(0); } + if (mAggregatedPartialWakelockTimer != null) { + out.writeInt(1); + mAggregatedPartialWakelockTimer.writeToParcel(out, elapsedRealtimeUs); + } else { + out.writeInt(0); + } if (mBluetoothScanTimer != null) { out.writeInt(1); mBluetoothScanTimer.writeToParcel(out, elapsedRealtimeUs); @@ -6987,6 +7026,7 @@ public class BatteryStatsImpl extends BatteryStats { void readFromParcelLocked(TimeBase timeBase, TimeBase screenOffTimeBase, Parcel in) { mOnBatteryBackgroundTimeBase.readFromParcel(in); + mOnBatteryScreenOffBackgroundTimeBase.readFromParcel(in); int numWakelocks = in.readInt(); mWakelockStats.clear(); @@ -7113,6 +7153,14 @@ public class BatteryStatsImpl extends BatteryStats { mForegroundActivityTimer = null; } if (in.readInt() != 0) { + mAggregatedPartialWakelockTimer = new DualTimer(mBsi.mClocks, this, + AGGREGATED_WAKE_TYPE_PARTIAL, null, + mBsi.mOnBatteryScreenOffTimeBase, mOnBatteryScreenOffBackgroundTimeBase, + in); + } else { + mAggregatedPartialWakelockTimer = null; + } + if (in.readInt() != 0) { mBluetoothScanTimer = new DualTimer(mBsi.mClocks, Uid.this, BLUETOOTH_SCAN_ON, mBsi.mBluetoothScanOnTimers, mBsi.mOnBatteryTimeBase, mOnBatteryBackgroundTimeBase, in); @@ -8224,15 +8272,25 @@ public class BatteryStatsImpl extends BatteryStats { mProcessStateTimer[uidRunningState].startRunningLocked(elapsedRealtimeMs); } - updateBgTimeBase(uptimeMs * 1000, elapsedRealtimeMs * 1000); + updateOnBatteryBgTimeBase(uptimeMs * 1000, elapsedRealtimeMs * 1000); + updateOnBatteryScreenOffBgTimeBase(uptimeMs * 1000, elapsedRealtimeMs * 1000); } - public boolean updateBgTimeBase(long uptimeUs, long realtimeUs) { + /** Whether to consider Uid to be in the background for background timebase purposes. */ + public boolean isInBackground() { // Note that PROCESS_STATE_CACHED and ActivityManager.PROCESS_STATE_NONEXISTENT is // also considered to be 'background' for our purposes, because it's not foreground. - boolean isBgAndUnplugged = mBsi.mOnBatteryTimeBase.isRunning() - && mProcessState >= PROCESS_STATE_BACKGROUND; - return mOnBatteryBackgroundTimeBase.setRunning(isBgAndUnplugged, uptimeUs, realtimeUs); + return mProcessState >= PROCESS_STATE_BACKGROUND; + } + + public boolean updateOnBatteryBgTimeBase(long uptimeUs, long realtimeUs) { + boolean on = mBsi.mOnBatteryTimeBase.isRunning() && isInBackground(); + return mOnBatteryBackgroundTimeBase.setRunning(on, uptimeUs, realtimeUs); + } + + public boolean updateOnBatteryScreenOffBgTimeBase(long uptimeUs, long realtimeUs) { + boolean on = mBsi.mOnBatteryScreenOffTimeBase.isRunning() && isInBackground(); + return mOnBatteryScreenOffBackgroundTimeBase.setRunning(on, uptimeUs, realtimeUs); } public SparseArray<? extends Pid> getPidStats() { @@ -8363,10 +8421,13 @@ public class BatteryStatsImpl extends BatteryStats { if (wl != null) { wl.getStopwatchTimer(type).startRunningLocked(elapsedRealtimeMs); } - if (pid >= 0 && type == WAKE_TYPE_PARTIAL) { - Pid p = getPidStatsLocked(pid); - if (p.mWakeNesting++ == 0) { - p.mWakeStartMs = elapsedRealtimeMs; + if (type == WAKE_TYPE_PARTIAL) { + createAggregatedPartialWakelockTimerLocked().startRunningLocked(elapsedRealtimeMs); + if (pid >= 0) { + Pid p = getPidStatsLocked(pid); + if (p.mWakeNesting++ == 0) { + p.mWakeStartMs = elapsedRealtimeMs; + } } } } @@ -8376,12 +8437,17 @@ public class BatteryStatsImpl extends BatteryStats { if (wl != null) { wl.getStopwatchTimer(type).stopRunningLocked(elapsedRealtimeMs); } - if (pid >= 0 && type == WAKE_TYPE_PARTIAL) { - Pid p = mPids.get(pid); - if (p != null && p.mWakeNesting > 0) { - if (p.mWakeNesting-- == 1) { - p.mWakeSumMs += elapsedRealtimeMs - p.mWakeStartMs; - p.mWakeStartMs = 0; + if (type == WAKE_TYPE_PARTIAL) { + if (mAggregatedPartialWakelockTimer != null) { + mAggregatedPartialWakelockTimer.stopRunningLocked(elapsedRealtimeMs); + } + if (pid >= 0) { + Pid p = mPids.get(pid); + if (p != null && p.mWakeNesting > 0) { + if (p.mWakeNesting-- == 1) { + p.mWakeSumMs += elapsedRealtimeMs - p.mWakeStartMs; + p.mWakeStartMs = 0; + } } } } @@ -9936,7 +10002,7 @@ public class BatteryStatsImpl extends BatteryStats { * and we are on battery with screen off, we give more of the cpu time to those apps holding * wakelocks. If the screen is on, we just assign the actual cpu time an app used. */ - public void updateCpuTimeLocked() { + public void updateCpuTimeLocked(boolean updateCpuFreqData) { if (mPowerProfile == null) { return; } @@ -10051,7 +10117,9 @@ public class BatteryStatsImpl extends BatteryStats { } }); - readKernelUidCpuFreqTimesLocked(); + if (updateCpuFreqData) { + readKernelUidCpuFreqTimesLocked(); + } final long elapse = (mClocks.elapsedRealtime() - startTimeMs); if (DEBUG_ENERGY_CPU || (elapse >= 100)) { @@ -11265,6 +11333,7 @@ public class BatteryStatsImpl extends BatteryStats { mUidStats.put(uid, u); u.mOnBatteryBackgroundTimeBase.readSummaryFromParcel(in); + u.mOnBatteryScreenOffBackgroundTimeBase.readSummaryFromParcel(in); u.mWifiRunning = false; if (in.readInt() != 0) { @@ -11305,6 +11374,9 @@ public class BatteryStatsImpl extends BatteryStats { u.createForegroundActivityTimerLocked().readSummaryFromParcelLocked(in); } if (in.readInt() != 0) { + u.createAggregatedPartialWakelockTimerLocked().readSummaryFromParcelLocked(in); + } + if (in.readInt() != 0) { u.createBluetoothScanTimerLocked().readSummaryFromParcelLocked(in); } if (in.readInt() != 0) { @@ -11641,6 +11713,7 @@ public class BatteryStatsImpl extends BatteryStats { Uid u = mUidStats.valueAt(iu); u.mOnBatteryBackgroundTimeBase.writeSummaryToParcel(out, NOW_SYS, NOWREAL_SYS); + u.mOnBatteryScreenOffBackgroundTimeBase.writeSummaryToParcel(out, NOW_SYS, NOWREAL_SYS); if (u.mWifiRunningTimer != null) { out.writeInt(1); @@ -11704,6 +11777,12 @@ public class BatteryStatsImpl extends BatteryStats { } else { out.writeInt(0); } + if (u.mAggregatedPartialWakelockTimer != null) { + out.writeInt(1); + u.mAggregatedPartialWakelockTimer.writeSummaryFromParcelLocked(out, NOWREAL_SYS); + } else { + out.writeInt(0); + } if (u.mBluetoothScanTimer != null) { out.writeInt(1); u.mBluetoothScanTimer.writeSummaryFromParcelLocked(out, NOWREAL_SYS); diff --git a/core/java/com/android/internal/os/ZygoteConnection.java b/core/java/com/android/internal/os/ZygoteConnection.java index a9bec4123fd2..2013ac09d8e2 100644 --- a/core/java/com/android/internal/os/ZygoteConnection.java +++ b/core/java/com/android/internal/os/ZygoteConnection.java @@ -762,14 +762,6 @@ class ZygoteConnection { public static void applyInvokeWithSystemProperty(Arguments args) { if (args.invokeWith == null && args.niceName != null) { String property = "wrap." + args.niceName; - if (property.length() > 31) { - // Properties with a trailing "." are illegal. - if (property.charAt(30) != '.') { - property = property.substring(0, 31); - } else { - property = property.substring(0, 30); - } - } args.invokeWith = SystemProperties.get(property); if (args.invokeWith != null && args.invokeWith.length() == 0) { args.invokeWith = null; diff --git a/core/java/com/android/internal/policy/DecorView.java b/core/java/com/android/internal/policy/DecorView.java index 9823431270d4..ba3aa36067d5 100644 --- a/core/java/com/android/internal/policy/DecorView.java +++ b/core/java/com/android/internal/policy/DecorView.java @@ -1759,8 +1759,9 @@ public class DecorView extends FrameLayout implements RootViewSurfaceTaker, Wind mFloatingActionMode.finish(); } cleanupFloatingActionModeViews(); + mFloatingToolbar = new FloatingToolbar(mContext, mWindow); final FloatingActionMode mode = - new FloatingActionMode(mContext, callback, originatingView); + new FloatingActionMode(mContext, callback, originatingView, mFloatingToolbar); mFloatingActionModeOriginatingView = originatingView; mFloatingToolbarPreDrawListener = new ViewTreeObserver.OnPreDrawListener() { @@ -1775,8 +1776,6 @@ public class DecorView extends FrameLayout implements RootViewSurfaceTaker, Wind private void setHandledFloatingActionMode(ActionMode mode) { mFloatingActionMode = mode; - mFloatingToolbar = new FloatingToolbar(mContext, mWindow); - ((FloatingActionMode) mFloatingActionMode).setFloatingToolbar(mFloatingToolbar); mFloatingActionMode.invalidate(); // Will show the floating toolbar if necessary. mFloatingActionModeOriginatingView.getViewTreeObserver() .addOnPreDrawListener(mFloatingToolbarPreDrawListener); diff --git a/core/java/com/android/internal/view/FloatingActionMode.java b/core/java/com/android/internal/view/FloatingActionMode.java index effe21902f91..ff211b6c2d62 100644 --- a/core/java/com/android/internal/view/FloatingActionMode.java +++ b/core/java/com/android/internal/view/FloatingActionMode.java @@ -16,6 +16,7 @@ package com.android.internal.view; +import android.annotation.NonNull; import android.content.Context; import android.graphics.Point; import android.graphics.Rect; @@ -36,26 +37,26 @@ import com.android.internal.widget.FloatingToolbar; import java.util.Arrays; -public class FloatingActionMode extends ActionMode { +public final class FloatingActionMode extends ActionMode { private static final int MAX_HIDE_DURATION = 3000; private static final int MOVING_HIDE_DELAY = 50; - private final Context mContext; - private final ActionMode.Callback2 mCallback; - private final MenuBuilder mMenu; - private final Rect mContentRect; - private final Rect mContentRectOnScreen; - private final Rect mPreviousContentRectOnScreen; - private final int[] mViewPositionOnScreen; - private final int[] mPreviousViewPositionOnScreen; - private final int[] mRootViewPositionOnScreen; - private final Rect mViewRectOnScreen; - private final Rect mPreviousViewRectOnScreen; - private final Rect mScreenRect; - private final View mOriginatingView; + @NonNull private final Context mContext; + @NonNull private final ActionMode.Callback2 mCallback; + @NonNull private final MenuBuilder mMenu; + @NonNull private final Rect mContentRect; + @NonNull private final Rect mContentRectOnScreen; + @NonNull private final Rect mPreviousContentRectOnScreen; + @NonNull private final int[] mViewPositionOnScreen; + @NonNull private final int[] mPreviousViewPositionOnScreen; + @NonNull private final int[] mRootViewPositionOnScreen; + @NonNull private final Rect mViewRectOnScreen; + @NonNull private final Rect mPreviousViewRectOnScreen; + @NonNull private final Rect mScreenRect; + @NonNull private final View mOriginatingView; + @NonNull private final Point mDisplaySize; private final int mBottomAllowance; - private final Point mDisplaySize; private final Runnable mMovingOff = new Runnable() { public void run() { @@ -75,11 +76,12 @@ public class FloatingActionMode extends ActionMode { } }; - private FloatingToolbar mFloatingToolbar; - private FloatingToolbarVisibilityHelper mFloatingToolbarVisibilityHelper; + @NonNull private FloatingToolbar mFloatingToolbar; + @NonNull private FloatingToolbarVisibilityHelper mFloatingToolbarVisibilityHelper; public FloatingActionMode( - Context context, ActionMode.Callback2 callback, View originatingView) { + Context context, ActionMode.Callback2 callback, + View originatingView, FloatingToolbar floatingToolbar) { mContext = Preconditions.checkNotNull(context); mCallback = Preconditions.checkNotNull(callback); mMenu = new MenuBuilder(context).setDefaultShowAsAction( @@ -110,17 +112,13 @@ public class FloatingActionMode extends ActionMode { mBottomAllowance = context.getResources() .getDimensionPixelSize(R.dimen.content_rect_bottom_clip_allowance); mDisplaySize = new Point(); + setFloatingToolbar(Preconditions.checkNotNull(floatingToolbar)); } - public void setFloatingToolbar(FloatingToolbar floatingToolbar) { + private void setFloatingToolbar(FloatingToolbar floatingToolbar) { mFloatingToolbar = floatingToolbar .setMenu(mMenu) - .setOnMenuItemClickListener(new MenuItem.OnMenuItemClickListener() { - @Override - public boolean onMenuItemClick(MenuItem item) { - return mMenu.performItemAction(item, 0); - } - }); + .setOnMenuItemClickListener(item -> mMenu.performItemAction(item, 0)); mFloatingToolbarVisibilityHelper = new FloatingToolbarVisibilityHelper(mFloatingToolbar); mFloatingToolbarVisibilityHelper.activate(); } @@ -142,21 +140,17 @@ public class FloatingActionMode extends ActionMode { @Override public void invalidate() { - checkToolbarInitialized(); mCallback.onPrepareActionMode(this, mMenu); invalidateContentRect(); // Will re-layout and show the toolbar if necessary. } @Override public void invalidateContentRect() { - checkToolbarInitialized(); mCallback.onGetContentRect(this, mOriginatingView, mContentRect); repositionToolbar(); } public void updateViewLocationInWindow() { - checkToolbarInitialized(); - mOriginatingView.getLocationOnScreen(mViewPositionOnScreen); mOriginatingView.getRootView().getLocationOnScreen(mRootViewPositionOnScreen); mOriginatingView.getGlobalVisibleRect(mViewRectOnScreen); @@ -172,8 +166,6 @@ public class FloatingActionMode extends ActionMode { } private void repositionToolbar() { - checkToolbarInitialized(); - mContentRectOnScreen.set(mContentRect); // Offset the content rect into screen coordinates, taking into account any transformations @@ -235,8 +227,6 @@ public class FloatingActionMode extends ActionMode { @Override public void hide(long duration) { - checkToolbarInitialized(); - if (duration == ActionMode.DEFAULT_HIDE_DURATION) { duration = ViewConfiguration.getDefaultActionModeHideDuration(); } @@ -253,14 +243,12 @@ public class FloatingActionMode extends ActionMode { @Override public void onWindowFocusChanged(boolean hasWindowFocus) { - checkToolbarInitialized(); mFloatingToolbarVisibilityHelper.setWindowFocused(hasWindowFocus); mFloatingToolbarVisibilityHelper.updateToolbarVisibility(); } @Override public void finish() { - checkToolbarInitialized(); reset(); mCallback.onDestroyActionMode(this); } @@ -290,14 +278,6 @@ public class FloatingActionMode extends ActionMode { return new MenuInflater(mContext); } - /** - * @throws IllegalStateException - */ - private void checkToolbarInitialized() { - Preconditions.checkState(mFloatingToolbar != null); - Preconditions.checkState(mFloatingToolbarVisibilityHelper != null); - } - private void reset() { mFloatingToolbar.dismiss(); mFloatingToolbarVisibilityHelper.deactivate(); diff --git a/core/java/com/android/internal/widget/FloatingToolbar.java b/core/java/com/android/internal/widget/FloatingToolbar.java index 8c71cf7006ff..40796e156e49 100644 --- a/core/java/com/android/internal/widget/FloatingToolbar.java +++ b/core/java/com/android/internal/widget/FloatingToolbar.java @@ -52,7 +52,6 @@ import android.view.animation.AnimationSet; import android.view.animation.Transformation; import android.view.animation.AnimationUtils; import android.view.animation.Interpolator; -import android.widget.AdapterView; import android.widget.ArrayAdapter; import android.widget.ImageButton; import android.widget.ImageView; @@ -67,6 +66,7 @@ import java.util.List; import com.android.internal.R; import com.android.internal.util.Preconditions; +import java.util.Objects; /** * A floating toolbar for showing contextual menu items. @@ -82,12 +82,7 @@ public final class FloatingToolbar { public static final String FLOATING_TOOLBAR_TAG = "floating_toolbar"; private static final MenuItem.OnMenuItemClickListener NO_OP_MENUITEM_CLICK_LISTENER = - new MenuItem.OnMenuItemClickListener() { - @Override - public boolean onMenuItemClick(MenuItem item) { - return false; - } - }; + item -> false; private final Context mContext; private final Window mWindow; @@ -97,7 +92,7 @@ public final class FloatingToolbar { private final Rect mPreviousContentRect = new Rect(); private Menu mMenu; - private List<Object> mShowingMenuItems = new ArrayList<Object>(); + private List<MenuItem> mShowingMenuItems = new ArrayList<>(); private MenuItem.OnMenuItemClickListener mMenuItemClickListener = NO_OP_MENUITEM_CLICK_LISTENER; private int mSuggestedWidth; @@ -237,7 +232,7 @@ public final class FloatingToolbar { if (!isCurrentlyShowing(menuItems) || mWidthChanged) { mPopup.dismiss(); mPopup.layoutMenuItems(menuItems, mMenuItemClickListener, mSuggestedWidth); - mShowingMenuItems = getShowingMenuItemsReferences(menuItems); + mShowingMenuItems = menuItems; } if (!mPopup.isShowing()) { mPopup.show(mContentRect); @@ -252,7 +247,23 @@ public final class FloatingToolbar { * Returns true if this floating toolbar is currently showing the specified menu items. */ private boolean isCurrentlyShowing(List<MenuItem> menuItems) { - return mShowingMenuItems.equals(getShowingMenuItemsReferences(menuItems)); + if (mShowingMenuItems == null || menuItems.size() != mShowingMenuItems.size()) { + return false; + } + + final int size = menuItems.size(); + for (int i = 0; i < size; i++) { + final MenuItem menuItem = menuItems.get(i); + final MenuItem showingItem = mShowingMenuItems.get(i); + if (menuItem.getItemId() != showingItem.getItemId() + || !TextUtils.equals(menuItem.getTitle(), showingItem.getTitle()) + || !Objects.equals(menuItem.getIcon(), showingItem.getIcon()) + || menuItem.getGroupId() != showingItem.getGroupId()) { + return false; + } + } + + return true; } /** @@ -260,7 +271,7 @@ public final class FloatingToolbar { * This method is recursive. */ private List<MenuItem> getVisibleAndEnabledMenuItems(Menu menu) { - List<MenuItem> menuItems = new ArrayList<MenuItem>(); + List<MenuItem> menuItems = new ArrayList<>(); for (int i = 0; (menu != null) && (i < menu.size()); i++) { MenuItem menuItem = menu.getItem(i); if (menuItem.isVisible() && menuItem.isEnabled()) { @@ -305,22 +316,6 @@ public final class FloatingToolbar { } } - private List<Object> getShowingMenuItemsReferences(List<MenuItem> menuItems) { - List<Object> references = new ArrayList<Object>(); - for (MenuItem menuItem : menuItems) { - if (menuItem.getItemId() != Menu.NONE) { - references.add(menuItem.getItemId()); - } else if (!TextUtils.isEmpty(menuItem.getTitle())) { - references.add(menuItem.getTitle()); - } else if (menuItem.getIcon() != null){ - references.add(menuItem.getIcon()); - } else { - references.add(menuItem); - } - } - return references; - } - private void registerOrientationHandler() { unregisterOrientationHandler(); mWindow.getDecorView().addOnLayoutChangeListener(mOrientationChangeHandler); @@ -383,19 +378,15 @@ public final class FloatingToolbar { private final Point mCoordsOnWindow = new Point(); // popup window coordinates. /* Temporary data holders. Reset values before using. */ private final int[] mTmpCoords = new int[2]; - private final Rect mTmpRect = new Rect(); private final Region mTouchableRegion = new Region(); private final ViewTreeObserver.OnComputeInternalInsetsListener mInsetsComputer = - new ViewTreeObserver.OnComputeInternalInsetsListener() { - public void onComputeInternalInsets( - ViewTreeObserver.InternalInsetsInfo info) { - info.contentInsets.setEmpty(); - info.visibleInsets.setEmpty(); - info.touchableRegion.set(mTouchableRegion); - info.setTouchableInsets(ViewTreeObserver.InternalInsetsInfo - .TOUCHABLE_INSETS_REGION); - } + info -> { + info.contentInsets.setEmpty(); + info.visibleInsets.setEmpty(); + info.touchableRegion.set(mTouchableRegion); + info.setTouchableInsets( + ViewTreeObserver.InternalInsetsInfo.TOUCHABLE_INSETS_REGION); }; private final int mLineHeight; @@ -1407,18 +1398,15 @@ public final class FloatingToolbar { final ImageButton overflowButton = (ImageButton) LayoutInflater.from(mContext) .inflate(R.layout.floating_popup_overflow_button, null); overflowButton.setImageDrawable(mOverflow); - overflowButton.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - if (mIsOverflowOpen) { - overflowButton.setImageDrawable(mToOverflow); - mToOverflow.start(); - closeOverflow(); - } else { - overflowButton.setImageDrawable(mToArrow); - mToArrow.start(); - openOverflow(); - } + overflowButton.setOnClickListener(v -> { + if (mIsOverflowOpen) { + overflowButton.setImageDrawable(mToOverflow); + mToOverflow.start(); + closeOverflow(); + } else { + overflowButton.setImageDrawable(mToArrow); + mToArrow.start(); + openOverflow(); } }); return overflowButton; @@ -1441,13 +1429,10 @@ public final class FloatingToolbar { }; overflowPanel.setAdapter(adapter); - overflowPanel.setOnItemClickListener(new AdapterView.OnItemClickListener() { - @Override - public void onItemClick(AdapterView<?> parent, View view, int position, long id) { - MenuItem menuItem = (MenuItem) overflowPanel.getAdapter().getItem(position); - if (mOnMenuItemClickListener != null) { - mOnMenuItemClickListener.onMenuItemClick(menuItem); - } + overflowPanel.setOnItemClickListener((parent, view, position, id) -> { + MenuItem menuItem = (MenuItem) overflowPanel.getAdapter().getItem(position); + if (mOnMenuItemClickListener != null) { + mOnMenuItemClickListener.onMenuItemClick(menuItem); } }); @@ -1479,12 +1464,9 @@ public final class FloatingToolbar { public void onAnimationEnd(Animation animation) { // Posting this because it seems like this is called before the animation // actually ends. - mContentContainer.post(new Runnable() { - @Override - public void run() { - setPanelsStatesAtRestingPosition(); - setContentAreaAsTouchableSurface(); - } + mContentContainer.post(() -> { + setPanelsStatesAtRestingPosition(); + setContentAreaAsTouchableSurface(); }); } diff --git a/core/jni/android/graphics/Shader.cpp b/core/jni/android/graphics/Shader.cpp index 214d97c213e4..5f803da4b23f 100644 --- a/core/jni/android/graphics/Shader.cpp +++ b/core/jni/android/graphics/Shader.cpp @@ -50,11 +50,14 @@ static jint Color_HSVToColor(JNIEnv* env, jobject, jint alpha, jfloatArray hsvAr /////////////////////////////////////////////////////////////////////////////////////////////// -static void Shader_safeUnref(JNIEnv* env, jobject o, jlong shaderHandle) { - SkShader* shader = reinterpret_cast<SkShader*>(shaderHandle); +static void Shader_safeUnref(SkShader* shader) { SkSafeUnref(shader); } +static jlong Shader_getNativeFinalizer(JNIEnv*, jobject) { + return static_cast<jlong>(reinterpret_cast<uintptr_t>(&Shader_safeUnref)); +} + /////////////////////////////////////////////////////////////////////////////////////////////// static jlong BitmapShader_constructor(JNIEnv* env, jobject o, jlong matrixPtr, jobject jbitmap, @@ -284,7 +287,7 @@ static const JNINativeMethod gColorMethods[] = { }; static const JNINativeMethod gShaderMethods[] = { - { "nativeSafeUnref", "(J)V", (void*)Shader_safeUnref }, + { "nativeGetFinalizer", "()J", (void*)Shader_getNativeFinalizer }, }; static const JNINativeMethod gBitmapShaderMethods[] = { diff --git a/core/jni/android_os_Parcel.cpp b/core/jni/android_os_Parcel.cpp index 56f68d4ecd05..d740a76f8c2e 100644 --- a/core/jni/android_os_Parcel.cpp +++ b/core/jni/android_os_Parcel.cpp @@ -119,11 +119,7 @@ static jlong android_os_Parcel_setDataSize(JNIEnv* env, jclass clazz, jlong nati Parcel* parcel = reinterpret_cast<Parcel*>(nativePtr); if (parcel != NULL) { const status_t err = parcel->setDataSize(size); - //STOPSHIP: check for BADFLO is for a temporary debug using wtf. Remove once bug resolved. - if (err == UNKNOWN_ERROR + 0xBADF10) { - jniThrowExceptionFmt(env, "java/lang/IllegalArgumentException", - "Attempt to resize (size = %d) Parcel would corrupt object memory", size); - } else if (err != NO_ERROR) { + if (err != NO_ERROR) { signalExceptionForError(env, clazz, err); } return parcel->getOpenAshmemSize(); diff --git a/core/jni/com_android_internal_os_Zygote.cpp b/core/jni/com_android_internal_os_Zygote.cpp index 6000fb56299d..d73e7dd50140 100644 --- a/core/jni/com_android_internal_os_Zygote.cpp +++ b/core/jni/com_android_internal_os_Zygote.cpp @@ -27,6 +27,7 @@ #include <fcntl.h> #include <grp.h> #include <inttypes.h> +#include <malloc.h> #include <mntent.h> #include <paths.h> #include <signal.h> @@ -519,6 +520,9 @@ static pid_t ForkAndSpecializeCommon(JNIEnv* env, uid_t uid, gid_t gid, jintArra // The child process. gMallocLeakZygoteChild = 1; + // Set the jemalloc decay time to 1. + mallopt(M_DECAY_TIME, 1); + // Clean up any descriptors which must be closed immediately DetachDescriptors(env, fdsToClose); diff --git a/core/res/AndroidManifest.xml b/core/res/AndroidManifest.xml index 18cfc990f205..8ed76de6bc1b 100644 --- a/core/res/AndroidManifest.xml +++ b/core/res/AndroidManifest.xml @@ -3317,12 +3317,16 @@ confirmation UI for full backup/restore --> <uses-permission android:name="android.permission.CONFIRM_FULL_BACKUP"/> - - <!-- Allows the holder to access the instant applications on the device. + <!-- Allows the holder to access and manage instant applications on the device. @hide --> <permission android:name="android.permission.ACCESS_INSTANT_APPS" android:protectionLevel="signature|installer|verifier" /> + <!-- Allows the holder to view the instant applications on the device. + @hide --> + <permission android:name="android.permission.VIEW_INSTANT_APPS" + android:protectionLevel="signature|preinstalled" /> + <!-- Allows receiving the usage of media resource e.g. video/audio codec and graphic memory. @hide --> diff --git a/core/res/res/values-af/strings.xml b/core/res/res/values-af/strings.xml index 600b8fe69e18..d78a980d66fa 100644 --- a/core/res/res/values-af/strings.xml +++ b/core/res/res/values-af/strings.xml @@ -1204,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="7684862527629252655">"Programaktiwiteit"</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_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 c42da996a7cb..475167e859a6 100644 --- a/core/res/res/values-am/strings.xml +++ b/core/res/res/values-am/strings.xml @@ -1204,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="7684862527629252655">"የመተግበሪያ እንቅስቃሴ"</string> + <string name="alert_windows_notification_channel_name" msgid="3116610965549449803">"<xliff:g id="NAME">%s</xliff:g> በሌሎች መተግበሪያዎች ላይ እያሳየ ነው"</string> <string name="alert_windows_notification_title" msgid="3697657294867638947">"<xliff:g id="NAME">%s</xliff:g> በሌሎች መተግበሪያዎች ላይ እያሳየ ነው"</string> <string name="alert_windows_notification_message" msgid="8917232109522912560">"<xliff:g id="NAME">%s</xliff:g> ይህን ባህሪ እንዲጠቀም ካልፈለጉ ቅንብሮችን ለመክፈት መታ ያድርጉና ያጥፉት።"</string> <string name="alert_windows_notification_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 1c1d821b775c..3c42334be445 100644 --- a/core/res/res/values-ar/strings.xml +++ b/core/res/res/values-ar/strings.xml @@ -1292,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="7684862527629252655">"نشاط التطبيقات"</string> + <string name="alert_windows_notification_channel_name" msgid="3116610965549449803">"جارٍ عرض <xliff:g id="NAME">%s</xliff:g> فوق تطبيقات أخرى"</string> <string name="alert_windows_notification_title" msgid="3697657294867638947">"يتم عرض <xliff:g id="NAME">%s</xliff:g> فوق التطبيقات الأخرى."</string> <string name="alert_windows_notification_message" msgid="8917232109522912560">"إذا كنت لا تريد أن يستخدم <xliff:g id="NAME">%s</xliff:g> هذه الميزة، فانقر لفتح الإعدادات، ثم اختر تعطيلها."</string> <string name="alert_windows_notification_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 41fa6bd075d6..f9c699c88ac7 100644 --- a/core/res/res/values-az/strings.xml +++ b/core/res/res/values-az/strings.xml @@ -1204,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="7684862527629252655">"Tətbiq fəaliyyəti"</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_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 3d278fb78406..b7bdb69249b4 100644 --- a/core/res/res/values-b+sr+Latn/strings.xml +++ b/core/res/res/values-b+sr+Latn/strings.xml @@ -1226,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="7684862527629252655">"Aktivnosti u aplikacijama"</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_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> diff --git a/core/res/res/values-be/strings.xml b/core/res/res/values-be/strings.xml index a233114392f3..65158032514c 100644 --- a/core/res/res/values-be/strings.xml +++ b/core/res/res/values-be/strings.xml @@ -1248,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="7684862527629252655">"Актыўнасць праграмы"</string> + <string name="alert_windows_notification_channel_name" msgid="3116610965549449803">"<xliff:g id="NAME">%s</xliff:g> паказваецца паверх іншых праграм"</string> <string name="alert_windows_notification_title" msgid="3697657294867638947">"<xliff:g id="NAME">%s</xliff:g> паказв. паверх іншых праграм"</string> <string name="alert_windows_notification_message" msgid="8917232109522912560">"Калі вы не хочаце, каб праграма <xliff:g id="NAME">%s</xliff:g> выкарыстоўвала гэту функцыю, дакраніцеся, каб адкрыць налады і адключыць гэта."</string> <string name="alert_windows_notification_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 65ce3b85e621..ba640b57834f 100644 --- a/core/res/res/values-bg/strings.xml +++ b/core/res/res/values-bg/strings.xml @@ -1204,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="7684862527629252655">"Активност в приложенията"</string> + <string name="alert_windows_notification_channel_name" msgid="3116610965549449803">"<xliff:g id="NAME">%s</xliff:g> се показва върху други приложения"</string> <string name="alert_windows_notification_title" msgid="3697657294867638947">"<xliff:g id="NAME">%s</xliff:g> се показва в/у други прилож."</string> <string name="alert_windows_notification_message" msgid="8917232109522912560">"Ако не искате <xliff:g id="NAME">%s</xliff:g> да използва тази функция, докоснете, за да отворите настройките, и я изключете."</string> <string name="alert_windows_notification_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 657bfc91586d..ec7bc7d13f27 100644 --- a/core/res/res/values-bn/strings.xml +++ b/core/res/res/values-bn/strings.xml @@ -1205,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="7684862527629252655">"অ্যাপের কার্যকলাপ"</string> + <string name="alert_windows_notification_channel_name" msgid="3116610965549449803">"<xliff:g id="NAME">%s</xliff:g> অন্যান্য অ্যাপ্লিকেশানের ওপরেও প্রদর্শিত"</string> <string name="alert_windows_notification_title" msgid="3697657294867638947">"<xliff:g id="NAME">%s</xliff:g> অন্যান্য অ্যাপের ওপর প্রদর্শিত হচ্ছে"</string> <string name="alert_windows_notification_message" msgid="8917232109522912560">"<xliff:g id="NAME">%s</xliff:g> কে এই বৈশিষ্ট্যটি ব্যবহার করতে দিতে না চাইলে, ট্যাপ করে সেটিংসে যান ও বৈশিষ্ট্যটি বন্ধ করে দিন।"</string> <string name="alert_windows_notification_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 14744f92d404..649cadd400d4 100644 --- a/core/res/res/values-bs/strings.xml +++ b/core/res/res/values-bs/strings.xml @@ -447,7 +447,7 @@ <string name="permlab_accessNetworkState" msgid="4951027964348974773">"prikaz mrežnih veza"</string> <string name="permdesc_accessNetworkState" msgid="8318964424675960975">"Omogućava aplikaciji pregled informacija o mrežnim vezama, npr. koje mreže postoje i koje su povezane."</string> <string name="permlab_createNetworkSockets" msgid="7934516631384168107">"ima potpuni pristup mreži"</string> - <string name="permdesc_createNetworkSockets" msgid="3403062187779724185">"Omogućava aplikaciji kreiranje spojnih tačaka sa mrežom i korištenje prilagođenih mrežnih protokola. Preglednik i druge aplikacije omogućavaju slanje podataka na internet, tako da ova dozvola nije potrebna za vršenje te radnje."</string> + <string name="permdesc_createNetworkSockets" msgid="3403062187779724185">"Omogućava aplikaciji kreiranje spojnih tačaka sa mrežom i korištenje prilagođenih mrežnih protokola. Preglednik i druge aplikacije omogućavaju slanje podataka na internet, tako da ovo odobrenje nije potrebno za vršenje te radnje."</string> <string name="permlab_changeNetworkState" msgid="958884291454327309">"izmjene povezivanja na mrežu"</string> <string name="permdesc_changeNetworkState" msgid="6789123912476416214">"Dozvoljava aplikaciji izmjenu stanja mrežne povezanosti."</string> <string name="permlab_changeTetherState" msgid="5952584964373017960">"izmjene podijeljenog povezivanja"</string> @@ -848,7 +848,7 @@ <string name="permdesc_setAlarm" msgid="316392039157473848">"Dozvoljava aplikaciji postavljanje alarma u instaliranom budilniku. Moguće je da neki budilnici neće primijeniti ovu funkciju."</string> <string name="permlab_addVoicemail" msgid="5525660026090959044">"dodavanje govorne pošte"</string> <string name="permdesc_addVoicemail" msgid="6604508651428252437">"Dozvoljava aplikaciji dodavanje poruka u vašu ulaznu govornu poštu."</string> - <string name="permlab_writeGeolocationPermissions" msgid="5962224158955273932">"izmjena geolokacijskih dozvola preglednika"</string> + <string name="permlab_writeGeolocationPermissions" msgid="5962224158955273932">"izmjena geolokacijskih odobrenja preglednika"</string> <string name="permdesc_writeGeolocationPermissions" msgid="1083743234522638747">"Dozvoljava aplikaciji mijenjanje geolokacijskih odobrenja preglednika. Zlonamjerne aplikacije mogu to iskoristiti i dozvoliti slanje informacija o lokaciji proizvoljnim web lokcacijama."</string> <string name="save_password_message" msgid="767344687139195790">"Želite li da preglednik zapamti ovu lozinku?"</string> <string name="save_password_notnow" msgid="6389675316706699758">"Ne sada"</string> @@ -1204,7 +1204,7 @@ <string name="date_time_done" msgid="2507683751759308828">"Gotovo"</string> <string name="perms_new_perm_prefix" msgid="8257740710754301407"><font size="12" fgcolor="#ff33b5e5">"NOVO: "</font></string> <string name="perms_description_app" msgid="5139836143293299417">"Aplikacija <xliff:g id="APP_NAME">%1$s</xliff:g> omogućava."</string> - <string name="no_permissions" msgid="7283357728219338112">"Nisu potrebne dozvole"</string> + <string name="no_permissions" msgid="7283357728219338112">"Nisu potrebna odobrenja"</string> <string name="perm_costs_money" msgid="4902470324142151116">"ovo se možda dodatno plaća"</string> <string name="dlg_ok" msgid="7376953167039865701">"Uredu"</string> <string name="usb_charging_notification_title" msgid="6895185153353640787">"Ovaj uređaj se puni preko USB-a"</string> @@ -1231,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="7684862527629252655">"Aktivnost aplikacija"</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_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 d8e2387ac3c5..c644866b7e7a 100644 --- a/core/res/res/values-ca/strings.xml +++ b/core/res/res/values-ca/strings.xml @@ -1204,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="7684862527629252655">"Activitat en aplicacions"</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_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> diff --git a/core/res/res/values-cs/strings.xml b/core/res/res/values-cs/strings.xml index dedb67dbc306..e33b3df65cbd 100644 --- a/core/res/res/values-cs/strings.xml +++ b/core/res/res/values-cs/strings.xml @@ -1248,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="7684862527629252655">"Aktivita v aplikacích"</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_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 33a510c8d7c0..cdb8a2b4073f 100644 --- a/core/res/res/values-da/strings.xml +++ b/core/res/res/values-da/strings.xml @@ -1204,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="7684862527629252655">"Appaktivitet"</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_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 273b965c137d..58f32040b933 100644 --- a/core/res/res/values-de/strings.xml +++ b/core/res/res/values-de/strings.xml @@ -1204,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="7684862527629252655">"App-Aktivitäten"</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_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 a166ddb02354..780c69dd96b1 100644 --- a/core/res/res/values-el/strings.xml +++ b/core/res/res/values-el/strings.xml @@ -1204,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="7684862527629252655">"Δραστηριότητα εφαρμογών"</string> + <string name="alert_windows_notification_channel_name" msgid="3116610965549449803">"Η εφαρμογή <xliff:g id="NAME">%s</xliff:g> προβάλλεται πάνω από άλλες εφαρμογές"</string> <string name="alert_windows_notification_title" msgid="3697657294867638947">"Η εφαρμογή <xliff:g id="NAME">%s</xliff:g> επικαλύπτει άλλες"</string> <string name="alert_windows_notification_message" msgid="8917232109522912560">"Εάν δεν θέλετε να χρησιμοποιείται αυτή η λειτουργία από την εφαρμογή <xliff:g id="NAME">%s</xliff:g>, πατήστε για να ανοίξετε τις ρυθμίσεις και απενεργοποιήστε την."</string> <string name="alert_windows_notification_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 c9b7076d597a..2d823eac1b92 100644 --- a/core/res/res/values-en-rAU/strings.xml +++ b/core/res/res/values-en-rAU/strings.xml @@ -1204,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="7684862527629252655">"App activity"</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_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 c9b7076d597a..2d823eac1b92 100644 --- a/core/res/res/values-en-rGB/strings.xml +++ b/core/res/res/values-en-rGB/strings.xml @@ -1204,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="7684862527629252655">"App activity"</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_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 c9b7076d597a..2d823eac1b92 100644 --- a/core/res/res/values-en-rIN/strings.xml +++ b/core/res/res/values-en-rIN/strings.xml @@ -1204,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="7684862527629252655">"App activity"</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_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 b634bf72b32d..45584b501ff8 100644 --- a/core/res/res/values-es-rUS/strings.xml +++ b/core/res/res/values-es-rUS/strings.xml @@ -1204,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="7684862527629252655">"Actividad en apps"</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_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 af146e54425f..926ee47e2849 100644 --- a/core/res/res/values-es/strings.xml +++ b/core/res/res/values-es/strings.xml @@ -1204,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="7684862527629252655">"Actividad en aplicaciones"</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_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 945abb823927..7e690be4d83e 100644 --- a/core/res/res/values-et/strings.xml +++ b/core/res/res/values-et/strings.xml @@ -1204,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="7684862527629252655">"Rakenduse tegevus"</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_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 b21f45706e4e..140747998b22 100644 --- a/core/res/res/values-eu/strings.xml +++ b/core/res/res/values-eu/strings.xml @@ -864,7 +864,7 @@ <string name="searchview_description_query" msgid="5911778593125355124">"Bilaketa-kontsulta"</string> <string name="searchview_description_clear" msgid="1330281990951833033">"Garbitu kontsulta"</string> <string name="searchview_description_submit" msgid="2688450133297983542">"Bidali kontsulta"</string> - <string name="searchview_description_voice" msgid="2453203695674994440">"Ahots bidezko bilaketa"</string> + <string name="searchview_description_voice" msgid="2453203695674994440">"Ahozko bilaketa"</string> <string name="enable_explore_by_touch_warning_title" msgid="7460694070309730149">"\"Arakatu ukituta\" eginbidea gaitu nahi duzu?"</string> <string name="enable_explore_by_touch_warning_message" product="tablet" msgid="8655887539089910577">"<xliff:g id="ACCESSIBILITY_SERVICE_NAME">%1$s</xliff:g> zerbitzuak \"Arakatu ukituta\" eginbidea gaitu nahi du. Eginbide hori aktibatuta dagoenean, hatzaren azpian duzunaren azalpena ikus edo entzun dezakezu, edo tabletarekin elkarrekintzan aritzeko keinuak egin ditzakezu."</string> <string name="enable_explore_by_touch_warning_message" product="default" msgid="2708199672852373195">"<xliff:g id="ACCESSIBILITY_SERVICE_NAME">%1$s</xliff:g> zerbitzuak \"Arakatu ukituta\" eginbidea gaitu nahi du. Eginbide hori aktibatuta dagoenean, hatzaren azpian duzunaren azalpena ikus edo entzun dezakezu, edo telefonoarekin elkarrekintzan aritzeko keinuak egin ditzakezu."</string> @@ -1205,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="7684862527629252655">"Aplikazioetako jarduerak"</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_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 72734fc9fdfc..8b894eeca86f 100644 --- a/core/res/res/values-fa/strings.xml +++ b/core/res/res/values-fa/strings.xml @@ -1204,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="7684862527629252655">"فعالیت برنامه"</string> + <string name="alert_windows_notification_channel_name" msgid="3116610965549449803">"<xliff:g id="NAME">%s</xliff:g> روی برنامههای دیگر نشان داده میشود"</string> <string name="alert_windows_notification_title" msgid="3697657294867638947">"<xliff:g id="NAME">%s</xliff:g> روی برنامههای دیگر نشان داده میشود"</string> <string name="alert_windows_notification_message" msgid="8917232109522912560">"اگر نمیخواهید <xliff:g id="NAME">%s</xliff:g> از این قابلیت استفاده کند، با ضربه زدن، تنظیمات را باز کنید و قابلیت را خاموش کنید."</string> <string name="alert_windows_notification_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 d1eedbe45367..af1a06167e9e 100644 --- a/core/res/res/values-fi/strings.xml +++ b/core/res/res/values-fi/strings.xml @@ -1204,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="7684862527629252655">"Sovellustoiminta"</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_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 d258d221da8a..ba2c01e993b5 100644 --- a/core/res/res/values-fr-rCA/strings.xml +++ b/core/res/res/values-fr-rCA/strings.xml @@ -1204,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="7684862527629252655">"Activité des applications"</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_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 cc7aa6dc624e..12c68667be6e 100644 --- a/core/res/res/values-fr/strings.xml +++ b/core/res/res/values-fr/strings.xml @@ -1204,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="7684862527629252655">"Activité dans les applications"</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_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 a8083bce959e..68998c395c6a 100644 --- a/core/res/res/values-gl/strings.xml +++ b/core/res/res/values-gl/strings.xml @@ -1205,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="7684862527629252655">"Actividade das aplicacións"</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_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 dfd6dcc4a656..7cae6b623eb4 100644 --- a/core/res/res/values-gu/strings.xml +++ b/core/res/res/values-gu/strings.xml @@ -1205,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="7684862527629252655">"ઍપ્લિકેશન પ્રવૃત્તિ"</string> + <string name="alert_windows_notification_channel_name" msgid="3116610965549449803">"<xliff:g id="NAME">%s</xliff:g> અન્ય ઍપ્લિકેશનોની ઉપર પ્રદર્શિત થઈ રહ્યું છે"</string> <string name="alert_windows_notification_title" msgid="3697657294867638947">"<xliff:g id="NAME">%s</xliff:g> અન્ય ઍપ્લિકેશનો પર દેખાઈ છે"</string> <string name="alert_windows_notification_message" msgid="8917232109522912560">"જો તમે નથી ઇચ્છતા કે <xliff:g id="NAME">%s</xliff:g> આ સુવિધાનો ઉપયોગ કરે, તો સેટિંગ્સ ખોલવા માટે ટૅપ કરો અને તેને બંધ કરો."</string> <string name="alert_windows_notification_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 ae7dab24dbb4..224710d7c9a7 100644 --- a/core/res/res/values-hi/strings.xml +++ b/core/res/res/values-hi/strings.xml @@ -1204,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="7684862527629252655">"ऐप्लिकेशन गतिविधि"</string> + <string name="alert_windows_notification_channel_name" msgid="3116610965549449803">"<xliff:g id="NAME">%s</xliff:g> अन्य ऐप्लिकेशन के ऊपर दिखाई दे रहा है"</string> <string name="alert_windows_notification_title" msgid="3697657294867638947">"<xliff:g id="NAME">%s</xliff:g> अन्य ऐप पर दिखाई दे रहा है"</string> <string name="alert_windows_notification_message" msgid="8917232109522912560">"अगर आप नहीं चाहते कि <xliff:g id="NAME">%s</xliff:g> इस सुविधा का उपयोग करे, तो सेटिंग खोलने और उसे बंद करने के लिए टैप करें."</string> <string name="alert_windows_notification_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 fc2a1d17ed67..61d186203a7f 100644 --- a/core/res/res/values-hr/strings.xml +++ b/core/res/res/values-hr/strings.xml @@ -1226,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="7684862527629252655">"Aktivnost aplikacije"</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_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 fd4b9818a5fc..e5105b822fc7 100644 --- a/core/res/res/values-hu/strings.xml +++ b/core/res/res/values-hu/strings.xml @@ -1204,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="7684862527629252655">"Alkalmazástevékenység"</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_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 0a32f5811b77..215d83a14f09 100644 --- a/core/res/res/values-hy/strings.xml +++ b/core/res/res/values-hy/strings.xml @@ -1204,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="7684862527629252655">"Հավելվածների պատմություն"</string> + <string name="alert_windows_notification_channel_name" msgid="3116610965549449803">"<xliff:g id="NAME">%s</xliff:g> հավելվածը ցուցադրվում է այլ հավելվածների վերևում"</string> <string name="alert_windows_notification_title" msgid="3697657294867638947">"<xliff:g id="NAME">%s</xliff:g> հավելվածը ցուցադրվում է այլ հավելվածների վերևում"</string> <string name="alert_windows_notification_message" msgid="8917232109522912560">"Եթե չեք ցանկանում, որ <xliff:g id="NAME">%s</xliff:g>-ն օգտագործի այս գործառույթը, հպեք՝ կարգավորումները բացելու և այն անջատելու համար։"</string> <string name="alert_windows_notification_turn_off_action" msgid="3367294525884949878">"ԱՆՋԱՏԵԼ"</string> @@ -1301,7 +1301,7 @@ <string name="submit" msgid="1602335572089911941">"Ուղարկել"</string> <string name="car_mode_disable_notification_title" msgid="3164768212003864316">"Մեքենայի ռեժիմը միացված է"</string> <string name="car_mode_disable_notification_message" msgid="6301524980144350051">"Հպեք` մեքենայի ռեժիմից դուրս գալու համար:"</string> - <string name="tethered_notification_title" msgid="3146694234398202601">"Մուտքը կամ թեժ կետը ակտիվ է"</string> + <string name="tethered_notification_title" msgid="3146694234398202601">"Մոդեմի ռեժիմը միացված է"</string> <string name="tethered_notification_message" msgid="2113628520792055377">"Հպեք՝ կարգավորելու համար:"</string> <string name="back_button_label" msgid="2300470004503343439">"Հետ"</string> <string name="next_button_label" msgid="1080555104677992408">"Հաջորդը"</string> diff --git a/core/res/res/values-in/strings.xml b/core/res/res/values-in/strings.xml index db98b4da3a42..c9a89428d0ab 100644 --- a/core/res/res/values-in/strings.xml +++ b/core/res/res/values-in/strings.xml @@ -1204,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="7684862527629252655">"Aktivitas aplikasi"</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_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 d179f572fe4f..9e8e022378c1 100644 --- a/core/res/res/values-is/strings.xml +++ b/core/res/res/values-is/strings.xml @@ -1205,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="7684862527629252655">"Forritavirkni"</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_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 11245ea48c52..975bb57c6b3b 100644 --- a/core/res/res/values-it/strings.xml +++ b/core/res/res/values-it/strings.xml @@ -1204,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="7684862527629252655">"Attività app"</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_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 21fa22cb2477..6eafaaf8c32a 100644 --- a/core/res/res/values-iw/strings.xml +++ b/core/res/res/values-iw/strings.xml @@ -1248,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="7684862527629252655">"פעילות באפליקציות"</string> + <string name="alert_windows_notification_channel_name" msgid="3116610965549449803">"תצוגה של <xliff:g id="NAME">%s</xliff:g> מעל אפליקציות אחרות"</string> <string name="alert_windows_notification_title" msgid="3697657294867638947">"<xliff:g id="NAME">%s</xliff:g> מוצגת מעל אפליקציות אחרות"</string> <string name="alert_windows_notification_message" msgid="8917232109522912560">"אם אינך רוצה ש-<xliff:g id="NAME">%s</xliff:g> תשתמש בתכונה הזו, הקש כדי לפתוח את ההגדרות ולכבות אותה."</string> <string name="alert_windows_notification_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 7fbd10848a6f..2a3d9e149555 100644 --- a/core/res/res/values-ja/strings.xml +++ b/core/res/res/values-ja/strings.xml @@ -1204,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="7684862527629252655">"アプリのアクティビティ"</string> + <string name="alert_windows_notification_channel_name" msgid="3116610965549449803">"<xliff:g id="NAME">%s</xliff:g>を他のアプリの上に重ねて表示"</string> <string name="alert_windows_notification_title" msgid="3697657294867638947">"<xliff:g id="NAME">%s</xliff:g>が他のアプリの上に表示されています"</string> <string name="alert_windows_notification_message" msgid="8917232109522912560">"<xliff:g id="NAME">%s</xliff:g>でこの機能を使用しない場合は、タップして設定を開いて 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 3e7b2850479b..1c3f9704eecb 100644 --- a/core/res/res/values-ka/strings.xml +++ b/core/res/res/values-ka/strings.xml @@ -1204,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="7684862527629252655">"აპებში აქტივობა"</string> + <string name="alert_windows_notification_channel_name" msgid="3116610965549449803">"<xliff:g id="NAME">%s</xliff:g> ნაჩვენებია სხვა აპების ინტერფეისის გადაფარვით"</string> <string name="alert_windows_notification_title" msgid="3697657294867638947">"<xliff:g id="NAME">%s</xliff:g> ნაჩვენებია სხვა აპების ინტერფეისის გადაფარვით"</string> <string name="alert_windows_notification_message" msgid="8917232109522912560">"თუ არ გსურთ <xliff:g id="NAME">%s</xliff:g>-ის მიერ ამ ფუნქციის გამოყენება, შეეხეთ პარამეტრების გასახსნელად და გამორთეთ."</string> <string name="alert_windows_notification_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 812763cccbd9..4e11c56dc1c5 100644 --- a/core/res/res/values-kk/strings.xml +++ b/core/res/res/values-kk/strings.xml @@ -1205,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="7684862527629252655">"Қолданба белсенділігі"</string> + <string name="alert_windows_notification_channel_name" msgid="3116610965549449803">"<xliff:g id="NAME">%s</xliff:g> басқа қолданбалардың үстінен шықты"</string> <string name="alert_windows_notification_title" msgid="3697657294867638947">"<xliff:g id="NAME">%s</xliff:g> басқа қолданбалардың үстінен көрсетіледі"</string> <string name="alert_windows_notification_message" msgid="8917232109522912560">"<xliff:g id="NAME">%s</xliff:g> деген пайдаланушының бұл функцияны пайдалануына жол бермеу үшін параметрлерді түртіп ашыңыз да, оларды өшіріңіз."</string> <string name="alert_windows_notification_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 85c2a02f9ddf..6994d7fc6d9c 100644 --- a/core/res/res/values-km/strings.xml +++ b/core/res/res/values-km/strings.xml @@ -1206,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="7684862527629252655">"សកម្មភាពកម្មវិធី"</string> + <string name="alert_windows_notification_channel_name" msgid="3116610965549449803">"<xliff:g id="NAME">%s</xliff:g> កំពុងបង្ហាញពីលើកម្មវិធីផ្សេងទៀត"</string> <string name="alert_windows_notification_title" msgid="3697657294867638947">"<xliff:g id="NAME">%s</xliff:g> កំពុងបង្ហាញពីលើកម្មវិធីផ្សេងទៀត"</string> <string name="alert_windows_notification_message" msgid="8917232109522912560">"ប្រសិនបើអ្នកមិនចង់ឲ្យ <xliff:g id="NAME">%s</xliff:g> ប្រើមុខងារនេះទេ សូមចុចដើម្បីបើកការកំណត់ រួចបិទវា។"</string> <string name="alert_windows_notification_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 02a3f9491aa9..b3f42d1062c6 100644 --- a/core/res/res/values-kn/strings.xml +++ b/core/res/res/values-kn/strings.xml @@ -1205,8 +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> - <!-- no translation found for alert_windows_notification_channel_name (7684862527629252655) --> - <skip /> + <string name="alert_windows_notification_channel_name" msgid="3116610965549449803">"<xliff:g id="NAME">%s</xliff:g> ಇತರ ಅಪ್ಲಿಕೇಶನ್ಗಳ ಮೂಲಕ ಪ್ರದರ್ಶಿಸುತ್ತಿದೆ"</string> <string name="alert_windows_notification_title" msgid="3697657294867638947">"<xliff:g id="NAME">%s</xliff:g> ಇತರವುಗಳ ಮೇಲೆ ಪ್ರದರ್ಶಿಸುತ್ತಿದೆ"</string> <string name="alert_windows_notification_message" msgid="8917232109522912560">"<xliff:g id="NAME">%s</xliff:g> ಈ ವೈಶಿಷ್ಟ್ಯ ಬಳಸುವುದನ್ನು ನೀವು ಬಯಸದಿದ್ದರೆ, ಸೆಟ್ಟಿಂಗ್ಗಳನ್ನು ತೆರೆದು, ಅದನ್ನು ಆಫ್ ಮಾಡಲು ಟ್ಯಾಪ್ ಮಾಡಿ."</string> <string name="alert_windows_notification_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 97545c15e657..e7f9a7f2cdf4 100644 --- a/core/res/res/values-ko/strings.xml +++ b/core/res/res/values-ko/strings.xml @@ -1204,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="7684862527629252655">"앱 활동"</string> + <string name="alert_windows_notification_channel_name" msgid="3116610965549449803">"<xliff:g id="NAME">%s</xliff:g>이(가) 다른 앱 위에 표시됨"</string> <string name="alert_windows_notification_title" msgid="3697657294867638947">"<xliff:g id="NAME">%s</xliff:g>이(가) 다른 앱 위에 표시됨"</string> <string name="alert_windows_notification_message" msgid="8917232109522912560">"<xliff:g id="NAME">%s</xliff:g>에서 이 기능이 사용되는 것을 원하지 않는 경우 탭하여 설정을 열고 기능을 사용 중지하세요."</string> <string name="alert_windows_notification_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 a5912631d0cb..d627e61a9409 100644 --- a/core/res/res/values-ky/strings.xml +++ b/core/res/res/values-ky/strings.xml @@ -1205,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="7684862527629252655">"Колдонмодогу аракеттер"</string> + <string name="alert_windows_notification_channel_name" msgid="3116610965549449803">"<xliff:g id="NAME">%s</xliff:g> колдонмосун башка терезелердин үстүнөн көрсөтүү"</string> <string name="alert_windows_notification_title" msgid="3697657294867638947">"<xliff:g id="NAME">%s</xliff:g>: башка колдонмолордун үстүнөн"</string> <string name="alert_windows_notification_message" msgid="8917232109522912560">"Эгер <xliff:g id="NAME">%s</xliff:g> колдонмосу бул функцияны пайдаланбасын десеңиз, жөндөөлөрдү ачып туруп, аны өчүрүп коюңуз."</string> <string name="alert_windows_notification_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 98e790715c30..5dc58f6e0cdb 100644 --- a/core/res/res/values-lo/strings.xml +++ b/core/res/res/values-lo/strings.xml @@ -1204,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="7684862527629252655">"ກິດຈະກຳແອັບ"</string> + <string name="alert_windows_notification_channel_name" msgid="3116610965549449803">"<xliff:g id="NAME">%s</xliff:g> ກຳລັງສະແດງຜົນຢູເທິງແອັບອື່ນຢູ່"</string> <string name="alert_windows_notification_title" msgid="3697657294867638947">"<xliff:g id="NAME">%s</xliff:g> ກຳລັງສະແດງຜົນບັງແອັບອື່ນຢູ່"</string> <string name="alert_windows_notification_message" msgid="8917232109522912560">"ຫາກທ່ານບໍ່ຕ້ອງການ <xliff:g id="NAME">%s</xliff:g> ໃຫ້ໃຊ້ຄຸນສົມບັດນີ້, ໃຫ້ແຕະເພື່ອເປີດການຕັ້ງຄ່າ ແລ້ວປິດມັນໄວ້."</string> <string name="alert_windows_notification_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 7e518089dc1b..14de0a2cd6a8 100644 --- a/core/res/res/values-lt/strings.xml +++ b/core/res/res/values-lt/strings.xml @@ -1248,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="7684862527629252655">"Programų veikla"</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_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 6ca2131539e1..b19174751c56 100644 --- a/core/res/res/values-lv/strings.xml +++ b/core/res/res/values-lv/strings.xml @@ -1226,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="7684862527629252655">"Darbības lietotnēs"</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_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 fd333d6d9752..2e115fc260ea 100644 --- a/core/res/res/values-mk/strings.xml +++ b/core/res/res/values-mk/strings.xml @@ -1205,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="7684862527629252655">"Активност на апликациите"</string> + <string name="alert_windows_notification_channel_name" msgid="3116610965549449803">"<xliff:g id="NAME">%s</xliff:g> се прикажува врз други апликации"</string> <string name="alert_windows_notification_title" msgid="3697657294867638947">"<xliff:g id="NAME">%s</xliff:g> се прикажува врз апликации"</string> <string name="alert_windows_notification_message" msgid="8917232109522912560">"Ако не сакате <xliff:g id="NAME">%s</xliff:g> да ја користи функцијава, допрете за да ги отворите поставките и исклучете ја."</string> <string name="alert_windows_notification_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 46b38ad3cbdd..8bc3ff88116e 100644 --- a/core/res/res/values-ml/strings.xml +++ b/core/res/res/values-ml/strings.xml @@ -1205,8 +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> - <!-- no translation found for alert_windows_notification_channel_name (7684862527629252655) --> - <skip /> + <string name="alert_windows_notification_channel_name" msgid="3116610965549449803">"<xliff:g id="NAME">%s</xliff:g> മറ്റ് ആപ്പുകൾക്ക് മുകളിൽ പ്രദർശിപ്പിക്കുന്നു"</string> <string name="alert_windows_notification_title" msgid="3697657294867638947">"<xliff:g id="NAME">%s</xliff:g> മറ്റ് ആപ്പുകൾക്ക് മുകളിൽ പ്രദർശിപ്പിക്കുന്നു"</string> <string name="alert_windows_notification_message" msgid="8917232109522912560">"<xliff:g id="NAME">%s</xliff:g> ഈ ഫീച്ചർ ഉപയോഗിക്കുന്നതിൽ നിങ്ങൾക്ക് താൽപ്പര്യമില്ലെങ്കിൽ, ടാപ്പുചെയ്ത് ക്രമീകരണം തുറന്ന് അത് ഓഫാക്കുക."</string> <string name="alert_windows_notification_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 5e7f70e97d98..8309d7744bee 100644 --- a/core/res/res/values-mn/strings.xml +++ b/core/res/res/values-mn/strings.xml @@ -1204,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="7684862527629252655">"Аппын үйл ажиллагаа"</string> + <string name="alert_windows_notification_channel_name" msgid="3116610965549449803">"Бусад апп дээгүүр <xliff:g id="NAME">%s</xliff:g>-г харуулж байна"</string> <string name="alert_windows_notification_title" msgid="3697657294867638947">"<xliff:g id="NAME">%s</xliff:g>-г бусад апп дээр харуулж байна"</string> <string name="alert_windows_notification_message" msgid="8917232109522912560">"Та <xliff:g id="NAME">%s</xliff:g>-д энэ онцлогийг ашиглахыг хүсэхгүй байгаа бол тохиргоог нээгээд, унтраана уу."</string> <string name="alert_windows_notification_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 849c6beae439..c0bc82cd01db 100644 --- a/core/res/res/values-mr/strings.xml +++ b/core/res/res/values-mr/strings.xml @@ -1205,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="7684862527629252655">"अॅप क्रियाकलाप"</string> + <string name="alert_windows_notification_channel_name" msgid="3116610965549449803">"<xliff:g id="NAME">%s</xliff:g> इतर अॅप्सवर प्रदर्शित करीत आहे"</string> <string name="alert_windows_notification_title" msgid="3697657294867638947">"<xliff:g id="NAME">%s</xliff:g> अन्य अॅप्सवर प्रदर्शित करीत आहे"</string> <string name="alert_windows_notification_message" msgid="8917232109522912560">"<xliff:g id="NAME">%s</xliff:g> ने हे वैशिष्ट्य वापरू नये असे आपण इच्छित असल्यास, सेटिंग्ज उघडण्यासाठी टॅप करा आणि ते बंद करा."</string> <string name="alert_windows_notification_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 e3c5e88b2ca3..8c4bb4c15646 100644 --- a/core/res/res/values-ms/strings.xml +++ b/core/res/res/values-ms/strings.xml @@ -1204,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="7684862527629252655">"Aktiviti apl"</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_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 88b812bcb660..f5a1429d9b9c 100644 --- a/core/res/res/values-my/strings.xml +++ b/core/res/res/values-my/strings.xml @@ -1205,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="7684862527629252655">"အက်ပ်လုပ်ဆောင်ချက်"</string> + <string name="alert_windows_notification_channel_name" msgid="3116610965549449803">"<xliff:g id="NAME">%s</xliff:g> သည် အခြားအက်ပ်များအပေါ်တွင် ပြပါသည်"</string> <string name="alert_windows_notification_title" msgid="3697657294867638947">"<xliff:g id="NAME">%s</xliff:g> ကို အခြားအက်ပ်များပေါ်တွင် မြင်နေရပါသည်။"</string> <string name="alert_windows_notification_message" msgid="8917232109522912560">"<xliff:g id="NAME">%s</xliff:g> ကို ဤဝန်ဆောင်မှုအား အသုံးမပြုစေလိုလျှင် ဆက်တင်ကို တို့၍ ဖွင့်ပြီး ၎င်းကို ပိတ်လိုက်ပါ။"</string> <string name="alert_windows_notification_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 e804b074c311..59723290f293 100644 --- a/core/res/res/values-nb/strings.xml +++ b/core/res/res/values-nb/strings.xml @@ -1204,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="7684862527629252655">"Appaktivitet"</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_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 c97113346b0c..72839361b98a 100644 --- a/core/res/res/values-ne/strings.xml +++ b/core/res/res/values-ne/strings.xml @@ -1210,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="7684862527629252655">"अनुप्रयोगको गतिविधि"</string> + <string name="alert_windows_notification_channel_name" msgid="3116610965549449803">"<xliff:g id="NAME">%s</xliff:g> अन्य अनुप्रयोगहरूमा देखिँदैछ"</string> <string name="alert_windows_notification_title" msgid="3697657294867638947">"<xliff:g id="NAME">%s</xliff:g> अन्य अनुप्रयोगहरूमा देखिँदैछ"</string> <string name="alert_windows_notification_message" msgid="8917232109522912560">"तपाईं <xliff:g id="NAME">%s</xliff:g> ले यो विशेषता प्रयोग नगरेको चाहनुहुन्न भने सेटिङहरू खोली यसलाई निष्क्रिय पार्न ट्याप गर्नुहोस्।"</string> <string name="alert_windows_notification_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 b34c4d0d9635..09cfa7097b0b 100644 --- a/core/res/res/values-nl/strings.xml +++ b/core/res/res/values-nl/strings.xml @@ -1204,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="7684862527629252655">"App-activiteit"</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_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> diff --git a/core/res/res/values-pa/strings.xml b/core/res/res/values-pa/strings.xml index d5c5d9c567fd..c89224d89d9f 100644 --- a/core/res/res/values-pa/strings.xml +++ b/core/res/res/values-pa/strings.xml @@ -1205,8 +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> - <!-- no translation found for alert_windows_notification_channel_name (7684862527629252655) --> - <skip /> + <string name="alert_windows_notification_channel_name" msgid="3116610965549449803">"<xliff:g id="NAME">%s</xliff:g> ਐਪ ਹੋਰ ਐਪਾਂ ਦੇ ਉੱਤੇ ਹੈ"</string> <string name="alert_windows_notification_title" msgid="3697657294867638947">"<xliff:g id="NAME">%s</xliff:g> ਐਪ ਹੋਰਾਂ ਐਪਾਂ ਦੇ ਉੱਤੇ ਹੈ।"</string> <string name="alert_windows_notification_message" msgid="8917232109522912560">"ਜੇ ਤੁਸੀਂ ਨਹੀਂ ਚਾਹੁੰਦੇ ਕਿ <xliff:g id="NAME">%s</xliff:g> ਐਪ ਇਸ ਵਿਸ਼ੇਸ਼ਤਾ ਦੀ ਵਰਤੋਂ ਕਰੇ, ਤਾਂ ਸੈਟਿੰਗਾਂ ਖੋਲ੍ਹਣ ਲਈ ਟੈਪ ਕਰੋ ਅਤੇ ਇਸਨੂੰ ਬੰਦ ਕਰੋ।"</string> <string name="alert_windows_notification_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 c1ef118931e0..cac8e58374f2 100644 --- a/core/res/res/values-pl/strings.xml +++ b/core/res/res/values-pl/strings.xml @@ -773,7 +773,7 @@ <string name="lockscreen_glogin_submit_button" msgid="7130893694795786300">"Zaloguj się"</string> <string name="lockscreen_glogin_invalid_input" msgid="1364051473347485908">"Błędna nazwa użytkownika lub hasło."</string> <string name="lockscreen_glogin_account_recovery_hint" msgid="1696924763690379073">"Nie pamiętasz nazwy użytkownika lub hasła?\nOdwiedź stronę "<b>"google.com/accounts/recovery"</b></string> - <string name="lockscreen_glogin_checking_password" msgid="7114627351286933867">"Sprawdzanie…"</string> + <string name="lockscreen_glogin_checking_password" msgid="7114627351286933867">"Sprawdzam…"</string> <string name="lockscreen_unlock_label" msgid="737440483220667054">"Odblokuj"</string> <string name="lockscreen_sound_on_label" msgid="9068877576513425970">"Włącz dźwięk"</string> <string name="lockscreen_sound_off_label" msgid="996822825154319026">"Wyłącz dźwięk"</string> @@ -1248,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="7684862527629252655">"Aktywność w aplikacjach"</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_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> diff --git a/core/res/res/values-pt-rBR/strings.xml b/core/res/res/values-pt-rBR/strings.xml index 99a67d918c59..fe6b766ccc1d 100644 --- a/core/res/res/values-pt-rBR/strings.xml +++ b/core/res/res/values-pt-rBR/strings.xml @@ -1204,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="7684862527629252655">"Atividade de apps"</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_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 a151733ff702..4c04879aa6d1 100644 --- a/core/res/res/values-pt-rPT/strings.xml +++ b/core/res/res/values-pt-rPT/strings.xml @@ -63,8 +63,8 @@ <string name="needPuk2" msgid="4526033371987193070">"Introduza o PUK2 para desbloquear o cartão SIM."</string> <string name="enablePin" msgid="209412020907207950">"Ação sem êxito. Ative o bloqueio do SIM/RUIM."</string> <plurals name="pinpuk_attempts" formatted="false" msgid="1251012001539225582"> + <item quantity="one">You have <xliff:g id="NUMBER_1">%d</xliff:g> remaining attempts before SIM is locked.</item> <item quantity="other">Tem mais <xliff:g id="NUMBER_1">%d</xliff:g> tentativas antes de o cartão SIM ficar bloqueado.</item> - <item quantity="one">Tem mais <xliff:g id="NUMBER_0">%d</xliff:g> tentativa antes de o cartão SIM ficar bloqueado.</item> </plurals> <string name="imei" msgid="2625429890869005782">"IMEI"</string> <string name="meid" msgid="4841221237681254195">"MEID"</string> @@ -179,8 +179,8 @@ <string name="low_memory" product="tv" msgid="516619861191025923">"O armazenamento da TV está cheio. Elimine alguns ficheiros para libertar espaço."</string> <string name="low_memory" product="default" msgid="3475999286680000541">"O armazenamento do telemóvel está cheio. Elimine alguns ficheiros para libertar espaço."</string> <plurals name="ssl_ca_cert_warning" formatted="false" msgid="5106721205300213569"> + <item quantity="one">Certificate authorities installed</item> <item quantity="other">Autoridades de certificação instaladas</item> - <item quantity="one">Autoridade de certificação instalada</item> </plurals> <string name="ssl_ca_cert_noti_by_unknown" msgid="4475437862189850602">"Por um terceiro desconhecido"</string> <string name="ssl_ca_cert_noti_by_administrator" msgid="3541729986326153557">"Pelo administrador do seu perfil de trabalho"</string> @@ -235,8 +235,8 @@ <string name="bugreport_option_full_title" msgid="6354382025840076439">"Relatório completo"</string> <string name="bugreport_option_full_summary" msgid="7210859858969115745">"Utilize esta opção para uma interferência mínima do sistema quando o dispositivo não responder ou estiver demasiado lento, ou quando precisar de todas as secções de relatório. Não permite introduzir mais detalhes ou tirar capturas de ecrã adicionais."</string> <plurals name="bugreport_countdown" formatted="false" msgid="6878900193900090368"> + <item quantity="one">Taking screenshot for bug report in <xliff:g id="NUMBER_1">%d</xliff:g> seconds.</item> <item quantity="other">A tirar uma captura de ecrã do relatório de erro dentro de <xliff:g id="NUMBER_1">%d</xliff:g> segundos.</item> - <item quantity="one">A tirar uma captura de ecrã do relatório de erro dentro de <xliff:g id="NUMBER_0">%d</xliff:g> segundo.</item> </plurals> <string name="global_action_toggle_silent_mode" msgid="8219525344246810925">"Modo silencioso"</string> <string name="global_action_silent_mode_on_status" msgid="3289841937003758806">"Som desativado"</string> @@ -871,8 +871,8 @@ <string name="oneMonthDurationPast" msgid="7396384508953779925">"Há 1 mês"</string> <string name="beforeOneMonthDurationPast" msgid="909134546836499826">"Há mais de 1 mês"</string> <plurals name="last_num_days" formatted="false" msgid="5104533550723932025"> + <item quantity="one">Last <xliff:g id="COUNT_1">%d</xliff:g> days</item> <item quantity="other">Últimos <xliff:g id="COUNT_1">%d</xliff:g> dias</item> - <item quantity="one">Último <xliff:g id="COUNT_0">%d</xliff:g> dia</item> </plurals> <string name="last_month" msgid="3959346739979055432">"Último mês"</string> <string name="older" msgid="5211975022815554840">"Mais antiga"</string> @@ -893,68 +893,68 @@ <string name="years" msgid="6881577717993213522">"anos"</string> <string name="now_string_shortest" msgid="8912796667087856402">"agora"</string> <plurals name="duration_minutes_shortest" formatted="false" msgid="3957499975064245495"> + <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g>m</item> <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>m</item> - <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g>m</item> </plurals> <plurals name="duration_hours_shortest" formatted="false" msgid="3552182110578602356"> + <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g>h</item> <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>h</item> - <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g>h</item> </plurals> <plurals name="duration_days_shortest" formatted="false" msgid="5213655532597081640"> + <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g>d</item> <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>d</item> - <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g>d</item> </plurals> <plurals name="duration_years_shortest" formatted="false" msgid="7848711145196397042"> + <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g>y</item> <item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g>a</item> - <item quantity="one"><xliff:g id="COUNT_0">%d</xliff:g>a</item> </plurals> <plurals name="duration_minutes_shortest_future" formatted="false" msgid="3277614521231489951"> + <item quantity="one">in <xliff:g id="COUNT_1">%d</xliff:g>m</item> <item quantity="other">dentro de <xliff:g id="COUNT_1">%d</xliff:g>m</item> - <item quantity="one">dentro de <xliff:g id="COUNT_0">%d</xliff:g>m</item> </plurals> <plurals name="duration_hours_shortest_future" formatted="false" msgid="2152452368397489370"> + <item quantity="one">in <xliff:g id="COUNT_1">%d</xliff:g>h</item> <item quantity="other">dentro de <xliff:g id="COUNT_1">%d</xliff:g>h</item> - <item quantity="one">dentro de <xliff:g id="COUNT_0">%d</xliff:g>h</item> </plurals> <plurals name="duration_days_shortest_future" formatted="false" msgid="8088331502820295701"> + <item quantity="one">in <xliff:g id="COUNT_1">%d</xliff:g>d</item> <item quantity="other">dentro de <xliff:g id="COUNT_1">%d</xliff:g>d</item> - <item quantity="one">dentro de <xliff:g id="COUNT_0">%d</xliff:g>d</item> </plurals> <plurals name="duration_years_shortest_future" formatted="false" msgid="2317006667145250301"> + <item quantity="one">in <xliff:g id="COUNT_1">%d</xliff:g>y</item> <item quantity="other">dentro de <xliff:g id="COUNT_1">%d</xliff:g>a</item> - <item quantity="one">dentro de <xliff:g id="COUNT_0">%d</xliff:g>a</item> </plurals> <plurals name="duration_minutes_relative" formatted="false" msgid="3178131706192980192"> + <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g> minutes ago</item> <item quantity="other">há <xliff:g id="COUNT_1">%d</xliff:g> minutos</item> - <item quantity="one">há <xliff:g id="COUNT_0">%d</xliff:g> minuto</item> </plurals> <plurals name="duration_hours_relative" formatted="false" msgid="676894109982008411"> + <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g> hours ago</item> <item quantity="other">há <xliff:g id="COUNT_1">%d</xliff:g> horas</item> - <item quantity="one">há <xliff:g id="COUNT_0">%d</xliff:g> hora</item> </plurals> <plurals name="duration_days_relative" formatted="false" msgid="2203515825765397130"> + <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g> days ago</item> <item quantity="other">há <xliff:g id="COUNT_1">%d</xliff:g> dias</item> - <item quantity="one">há <xliff:g id="COUNT_0">%d</xliff:g> dia</item> </plurals> <plurals name="duration_years_relative" formatted="false" msgid="4820062134188885734"> + <item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g> years ago</item> <item quantity="other">há <xliff:g id="COUNT_1">%d</xliff:g> anos</item> - <item quantity="one">há <xliff:g id="COUNT_0">%d</xliff:g> ano</item> </plurals> <plurals name="duration_minutes_relative_future" formatted="false" msgid="4655043589817680966"> + <item quantity="one">in <xliff:g id="COUNT_1">%d</xliff:g> minutes</item> <item quantity="other">dentro de <xliff:g id="COUNT_1">%d</xliff:g> minutos</item> - <item quantity="one">dentro <xliff:g id="COUNT_0">%d</xliff:g> minuto</item> </plurals> <plurals name="duration_hours_relative_future" formatted="false" msgid="8084579714205223891"> + <item quantity="one">in <xliff:g id="COUNT_1">%d</xliff:g> hours</item> <item quantity="other">dentro de <xliff:g id="COUNT_1">%d</xliff:g> horas</item> - <item quantity="one">dentro de <xliff:g id="COUNT_0">%d</xliff:g> hora</item> </plurals> <plurals name="duration_days_relative_future" formatted="false" msgid="333215369363433992"> + <item quantity="one">in <xliff:g id="COUNT_1">%d</xliff:g> days</item> <item quantity="other">dentro de <xliff:g id="COUNT_1">%d</xliff:g> dias</item> - <item quantity="one">dentro de <xliff:g id="COUNT_0">%d</xliff:g> dia</item> </plurals> <plurals name="duration_years_relative_future" formatted="false" msgid="8644862986413104011"> + <item quantity="one">in <xliff:g id="COUNT_1">%d</xliff:g> years</item> <item quantity="other">dentro de <xliff:g id="COUNT_1">%d</xliff:g> anos</item> - <item quantity="one">dentro de <xliff:g id="COUNT_0">%d</xliff:g> ano</item> </plurals> <string name="VideoView_error_title" msgid="3534509135438353077">"Problema com o vídeo"</string> <string name="VideoView_error_text_invalid_progressive_playback" msgid="3186670335938670444">"Este vídeo não é válido para transmissão em fluxo contínuo neste aparelho."</string> @@ -1102,12 +1102,12 @@ <string name="ringtone_picker_title_notification" msgid="4837740874822788802">"Sons de notificação"</string> <string name="ringtone_unknown" msgid="3914515995813061520">"Desconhecido"</string> <plurals name="wifi_available" formatted="false" msgid="7900333017752027322"> + <item quantity="one">Wi-Fi networks available</item> <item quantity="other">Redes Wi-Fi disponíveis</item> - <item quantity="one">Rede Wi-Fi disponível</item> </plurals> <plurals name="wifi_available_detailed" formatted="false" msgid="1140699367193975606"> + <item quantity="one">Open Wi-Fi networks available</item> <item quantity="other">Redes Wi-Fi abertas disponíveis</item> - <item quantity="one">Rede Wi-Fi aberta disponível</item> </plurals> <string name="wifi_available_sign_in" msgid="9157196203958866662">"Iniciar sessão na rede Wi-Fi"</string> <string name="network_available_sign_in" msgid="1848877297365446605">"Início de sessão na rede"</string> @@ -1204,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="7684862527629252655">"Atividade de aplicações"</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_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> @@ -1309,8 +1309,8 @@ <string name="no_matches" msgid="8129421908915840737">"Sem correspondências"</string> <string name="find_on_page" msgid="1946799233822820384">"Localizar na página"</string> <plurals name="matches_found" formatted="false" msgid="1210884353962081884"> + <item quantity="one"><xliff:g id="INDEX">%d</xliff:g> of <xliff:g id="TOTAL">%d</xliff:g></item> <item quantity="other"><xliff:g id="INDEX">%d</xliff:g> de <xliff:g id="TOTAL">%d</xliff:g></item> - <item quantity="one">1 correspondência</item> </plurals> <string name="action_mode_done" msgid="7217581640461922289">"Concluído"</string> <string name="progress_erasing" product="nosdcard" msgid="4521573321524340058">"A apagar memória de armazenamento USB..."</string> @@ -1595,8 +1595,8 @@ <string name="restr_pin_error_doesnt_match" msgid="2224214190906994548">"Os PINs não correspondem. Tente novamente."</string> <string name="restr_pin_error_too_short" msgid="8173982756265777792">"O PIN é demasiado pequeno. Deve ter, no mínimo, 4 dígitos."</string> <plurals name="restr_pin_countdown" formatted="false" msgid="9061246974881224688"> + <item quantity="one">Try again in <xliff:g id="COUNT">%d</xliff:g> seconds</item> <item quantity="other">Tente novamente dentro de <xliff:g id="COUNT">%d</xliff:g> segundos</item> - <item quantity="one">Tente novamente dentro de 1 segundo</item> </plurals> <string name="restr_pin_try_later" msgid="973144472490532377">"Tente novamente mais tarde"</string> <string name="immersive_cling_title" msgid="8394201622932303336">"Visualização de ecrã inteiro"</string> @@ -1628,36 +1628,36 @@ <string name="data_saver_enable_title" msgid="4674073932722787417">"Ativar a Poupança de dados?"</string> <string name="data_saver_enable_button" msgid="7147735965247211818">"Ativar"</string> <plurals name="zen_mode_duration_minutes_summary" formatted="false" msgid="4367877408072000848"> + <item quantity="one">For %1$d minutes (until <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item> <item quantity="other">Durante %1$d minutos (até às <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item> - <item quantity="one">Durante um minuto (até às <xliff:g id="FORMATTEDTIME_0">%2$s</xliff:g>)</item> </plurals> <plurals name="zen_mode_duration_minutes_summary_short" formatted="false" msgid="6830154222366042597"> + <item quantity="one">For %1$d min (until <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item> <item quantity="other">Durante %1$d min (até às <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item> - <item quantity="one">Durante 1 min (até às <xliff:g id="FORMATTEDTIME_0">%2$s</xliff:g>)</item> </plurals> <plurals name="zen_mode_duration_hours_summary" formatted="false" msgid="8152974162096743862"> + <item quantity="one">For %1$d hours (until <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item> <item quantity="other">Durante %1$d horas (até às <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item> - <item quantity="one">Durante uma hora (até às <xliff:g id="FORMATTEDTIME_0">%2$s</xliff:g>)</item> </plurals> <plurals name="zen_mode_duration_hours_summary_short" formatted="false" msgid="4787552595253082371"> + <item quantity="one">For %1$d hr (until <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item> <item quantity="other">Durante %1$d h (até às <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item> - <item quantity="one">Durante 1 h (até às <xliff:g id="FORMATTEDTIME_0">%2$s</xliff:g>)</item> </plurals> <plurals name="zen_mode_duration_minutes" formatted="false" msgid="5127407202506485571"> + <item quantity="one">For %d minutes</item> <item quantity="other">Durante %d minutos</item> - <item quantity="one">Durante um minuto</item> </plurals> <plurals name="zen_mode_duration_minutes_short" formatted="false" msgid="2199350154433426128"> + <item quantity="one">For %d min</item> <item quantity="other">Durante %d min</item> - <item quantity="one">Durante 1 min</item> </plurals> <plurals name="zen_mode_duration_hours" formatted="false" msgid="3938821308277433854"> + <item quantity="one">For %d hours</item> <item quantity="other">Durante %d horas</item> - <item quantity="one">Durante uma hora</item> </plurals> <plurals name="zen_mode_duration_hours_short" formatted="false" msgid="6748277774662434217"> + <item quantity="one">For %d hr</item> <item quantity="other">Durante %d h</item> - <item quantity="one">Durante 1 h</item> </plurals> <string name="zen_mode_until" msgid="7336308492289875088">"Até às <xliff:g id="FORMATTEDTIME">%1$s</xliff:g>"</string> <string name="zen_mode_alarm" msgid="9128205721301330797">"Até <xliff:g id="FORMATTEDTIME">%1$s</xliff:g> (próximo alarme)"</string> @@ -1692,8 +1692,8 @@ <string name="close_button_text" msgid="3937902162644062866">"Fechar"</string> <string name="notification_messaging_title_template" msgid="3452480118762691020">"<xliff:g id="CONVERSATION_TITLE">%1$s</xliff:g>: <xliff:g id="SENDER_NAME">%2$s</xliff:g>"</string> <plurals name="selected_count" formatted="false" msgid="7187339492915744615"> + <item quantity="one"><xliff:g id="COUNT_1">%1$d</xliff:g> selected</item> <item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> selecionados</item> - <item quantity="one"><xliff:g id="COUNT_0">%1$d</xliff:g> selecionado</item> </plurals> <string name="default_notification_channel_label" msgid="5929663562028088222">"Sem categoria"</string> <string name="importance_from_user" msgid="7318955817386549931">"Definiu a importância destas notificações."</string> @@ -1756,8 +1756,8 @@ <string name="autofill_error_cannot_autofill" msgid="7402758580060110371">"Não é possível preencher automaticamente o conteúdo"</string> <string name="autofill_picker_no_suggestions" msgid="3908514303773350735">"Sem sugestões do preenchimento automático"</string> <plurals name="autofill_picker_some_suggestions" formatted="false" msgid="5506565809835815274"> + <item quantity="one"><xliff:g id="COUNT">%1$s</xliff:g> autofill suggestions</item> <item quantity="other"><xliff:g id="COUNT">%1$s</xliff:g> sugestões do preenchimento automático</item> - <item quantity="one">Uma sugestão do preenchimento automático</item> </plurals> <string name="autofill_save_title" msgid="3345527308992082601">"Pretende guardar no <b><xliff:g id="LABEL">%1$s</xliff:g></b>?"</string> <string name="autofill_save_title_with_type" msgid="8637809388029313305">"Pretende guardar <xliff:g id="TYPE">%1$s</xliff:g> no <b><xliff:g id="LABEL">%2$s</xliff:g></b>?"</string> diff --git a/core/res/res/values-pt/strings.xml b/core/res/res/values-pt/strings.xml index 99a67d918c59..fe6b766ccc1d 100644 --- a/core/res/res/values-pt/strings.xml +++ b/core/res/res/values-pt/strings.xml @@ -1204,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="7684862527629252655">"Atividade de apps"</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_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 6420a32034f5..835c9ac2212d 100644 --- a/core/res/res/values-ro/strings.xml +++ b/core/res/res/values-ro/strings.xml @@ -1226,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="7684862527629252655">"Activitate din aplicații"</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_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 ca0eded18ace..69fe42f642e7 100644 --- a/core/res/res/values-ru/strings.xml +++ b/core/res/res/values-ru/strings.xml @@ -1248,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="7684862527629252655">"История приложений"</string> + <string name="alert_windows_notification_channel_name" msgid="3116610965549449803">"<xliff:g id="NAME">%s</xliff:g>: поверх других приложений"</string> <string name="alert_windows_notification_title" msgid="3697657294867638947">"<xliff:g id="NAME">%s</xliff:g>: поверх других приложений"</string> <string name="alert_windows_notification_message" msgid="8917232109522912560">"Чтобы отключить эту функцию для приложения <xliff:g id="NAME">%s</xliff:g>, перейдите в настройки."</string> <string name="alert_windows_notification_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 c35e85211ef1..373fe0750287 100644 --- a/core/res/res/values-si/strings.xml +++ b/core/res/res/values-si/strings.xml @@ -1206,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="7684862527629252655">"යෙදුම් ක්රියාකාරකම"</string> + <string name="alert_windows_notification_channel_name" msgid="3116610965549449803">"අනෙක් යෙදුම්වලට උඩින් <xliff:g id="NAME">%s</xliff:g> සංදර්ශනය කරමින්"</string> <string name="alert_windows_notification_title" msgid="3697657294867638947">"අනෙක් යෙදුම්වලට උඩින් <xliff:g id="NAME">%s</xliff:g> දිස් වේ"</string> <string name="alert_windows_notification_message" msgid="8917232109522912560">"ඔබට <xliff:g id="NAME">%s</xliff:g> මෙම විශේෂාංගය භාවිත කිරීමට අවශ්ය නැති නම්, සැකසීම් විවෘත කිරීමට තට්ටු කර එය ක්රියාවිරහිත කරන්න."</string> <string name="alert_windows_notification_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 37f50b5ac69a..4352a369151b 100644 --- a/core/res/res/values-sk/strings.xml +++ b/core/res/res/values-sk/strings.xml @@ -1248,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="7684862527629252655">"Aktivita v aplikáciách"</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_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 b47ad167c2f7..c6f44041f5be 100644 --- a/core/res/res/values-sl/strings.xml +++ b/core/res/res/values-sl/strings.xml @@ -1248,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="7684862527629252655">"Dejavnost v aplikacijah"</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_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 b82ae9618580..70a3efbff948 100644 --- a/core/res/res/values-sq/strings.xml +++ b/core/res/res/values-sq/strings.xml @@ -1205,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="7684862527629252655">"Aktiviteti i aplikacionit"</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_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 7854a917ff3d..f46505bfe268 100644 --- a/core/res/res/values-sr/strings.xml +++ b/core/res/res/values-sr/strings.xml @@ -1226,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="7684862527629252655">"Активности у апликацијама"</string> + <string name="alert_windows_notification_channel_name" msgid="3116610965549449803">"Апликација <xliff:g id="NAME">%s</xliff:g> се приказује преко других апликација"</string> <string name="alert_windows_notification_title" msgid="3697657294867638947">"<xliff:g id="NAME">%s</xliff:g> се приказује преко других аплик."</string> <string name="alert_windows_notification_message" msgid="8917232109522912560">"Ако не желите ову функцију за <xliff:g id="NAME">%s</xliff:g>, додирните да бисте отворили подешавања и искључили је."</string> <string name="alert_windows_notification_turn_off_action" msgid="3367294525884949878">"ИСКЉУЧИ"</string> diff --git a/core/res/res/values-sv/strings.xml b/core/res/res/values-sv/strings.xml index c7fec34df0b0..a3fb08538f41 100644 --- a/core/res/res/values-sv/strings.xml +++ b/core/res/res/values-sv/strings.xml @@ -1204,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="7684862527629252655">"Appaktivitet"</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_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 6ec9c9f35c07..ce4a469c7bba 100644 --- a/core/res/res/values-sw/strings.xml +++ b/core/res/res/values-sw/strings.xml @@ -81,7 +81,7 @@ <string name="CnirMmi" msgid="3062102121430548731">"Kupiga nambari kumezuiwa"</string> <string name="ThreeWCMmi" msgid="9051047170321190368">"Upigaji simu kwa njia tatu"</string> <string name="RuacMmi" msgid="7827887459138308886">"Ukataaji wa simu zinazokera zisizohitajika"</string> - <string name="CndMmi" msgid="3116446237081575808">"Uwasilishaji nambari ya kupiga simu"</string> + <string name="CndMmi" msgid="3116446237081575808">"Kuonyeshwa kwa nambari inayopiga"</string> <string name="DndMmi" msgid="1265478932418334331">"Usisumbue"</string> <string name="CLIRDefaultOnNextCallOn" msgid="429415409145781923">"Chaguo-msingi za ID ya mpigaji simu za kutozuia. Simu ifuatayo: Imezuiliwa"</string> <string name="CLIRDefaultOnNextCallOff" msgid="3092918006077864624">"Chaguo-msingi za kitambulisho cha mpigaji simu huwa kuzuiwa. Simu ifuatayo: Haijazuiliwa"</string> @@ -1202,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="7684862527629252655">"Shughuli za programu"</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_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 32a1e839dcb3..f45789bc5da5 100644 --- a/core/res/res/values-ta/strings.xml +++ b/core/res/res/values-ta/strings.xml @@ -1205,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="7684862527629252655">"பயன்பாட்டுச் செயல்பாடு"</string> + <string name="alert_windows_notification_channel_name" msgid="3116610965549449803">"<xliff:g id="NAME">%s</xliff:g> பிற பயன்பாடுகளின் மீது தோன்றுகிறது"</string> <string name="alert_windows_notification_title" msgid="3697657294867638947">"<xliff:g id="NAME">%s</xliff:g> பிற ஆப்ஸின் மீது தோன்றுகிறது"</string> <string name="alert_windows_notification_message" msgid="8917232109522912560">"<xliff:g id="NAME">%s</xliff:g> இந்த அம்சத்தைப் பயன்படுத்த வேண்டாம் என நினைத்தால், அமைப்புகளைத் திறந்து அதை முடக்க, தட்டவும்."</string> <string name="alert_windows_notification_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 10b53856fa88..68065b9a0a53 100644 --- a/core/res/res/values-te/strings.xml +++ b/core/res/res/values-te/strings.xml @@ -1205,8 +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> - <!-- no translation found for alert_windows_notification_channel_name (7684862527629252655) --> - <skip /> + <string name="alert_windows_notification_channel_name" msgid="3116610965549449803">"<xliff:g id="NAME">%s</xliff:g> ఇతర అనువర్తనాలలో చూపబడుతోంది"</string> <string name="alert_windows_notification_title" msgid="3697657294867638947">"<xliff:g id="NAME">%s</xliff:g> ఇతర అనువర్తనాలలో చూపబడుతోంది"</string> <string name="alert_windows_notification_message" msgid="8917232109522912560">"<xliff:g id="NAME">%s</xliff:g> ఈ లక్షణాన్ని ఉపయోగించకూడదు అని మీరు అనుకుంటే, సెట్టింగ్లను తెరవడానికి నొక్కి, దీన్ని ఆఫ్ చేయండి."</string> <string name="alert_windows_notification_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 6ae45b2c9e9f..51d932d16560 100644 --- a/core/res/res/values-th/strings.xml +++ b/core/res/res/values-th/strings.xml @@ -1204,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="7684862527629252655">"กิจกรรมแอป"</string> + <string name="alert_windows_notification_channel_name" msgid="3116610965549449803">"<xliff:g id="NAME">%s</xliff:g> แสดงทับแอปอื่นๆ"</string> <string name="alert_windows_notification_title" msgid="3697657294867638947">"<xliff:g id="NAME">%s</xliff:g> กำลังแสดงทับแอปอื่นๆ"</string> <string name="alert_windows_notification_message" msgid="8917232109522912560">"หากคุณไม่ต้องการให้ <xliff:g id="NAME">%s</xliff:g> ใช้คุณลักษณะนี้ ให้แตะเพื่อเปิดการตั้งค่าแล้วปิดคุณลักษณะ"</string> <string name="alert_windows_notification_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 b4cf33a1eb5a..ee01ff2ae0e9 100644 --- a/core/res/res/values-tl/strings.xml +++ b/core/res/res/values-tl/strings.xml @@ -1204,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="7684862527629252655">"Aktibidad sa app"</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_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 f833c4e8f76c..bbae91af0f2c 100644 --- a/core/res/res/values-tr/strings.xml +++ b/core/res/res/values-tr/strings.xml @@ -1204,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="7684862527629252655">"Uygulama etkinliği"</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_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 fe0efb48109c..f187c03a034f 100644 --- a/core/res/res/values-uk/strings.xml +++ b/core/res/res/values-uk/strings.xml @@ -1248,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="7684862527629252655">"Активність додатків"</string> + <string name="alert_windows_notification_channel_name" msgid="3116610965549449803">"Додаток <xliff:g id="NAME">%s</xliff:g> відображається поверх інших додатків"</string> <string name="alert_windows_notification_title" msgid="3697657294867638947">"<xliff:g id="NAME">%s</xliff:g> відображається поверх інших додатків"</string> <string name="alert_windows_notification_message" msgid="8917232109522912560">"Щоб у додатку <xliff:g id="NAME">%s</xliff:g> не працювала ця функція, вимкніть її в налаштуваннях."</string> <string name="alert_windows_notification_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 3e8c2b35adee..310bddd6bb08 100644 --- a/core/res/res/values-ur/strings.xml +++ b/core/res/res/values-ur/strings.xml @@ -1205,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="7684862527629252655">"ایپ کی سرگرمی"</string> + <string name="alert_windows_notification_channel_name" msgid="3116610965549449803">"<xliff:g id="NAME">%s</xliff:g> کو دیگر ایپس پر دکھایا کیا جا رہا ہے"</string> <string name="alert_windows_notification_title" msgid="3697657294867638947">"<xliff:g id="NAME">%s</xliff:g> دیگر ایپس پر ڈسپلے ہو رہی ہے"</string> <string name="alert_windows_notification_message" msgid="8917232109522912560">"اگر آپ نہیں چاہتے ہیں کہ <xliff:g id="NAME">%s</xliff:g> اس خصوصیت کا استعمال کرے تو ترتیبات کھولنے کیلئے تھپتھپائیں اور اسے بند کریں۔"</string> <string name="alert_windows_notification_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 812338dbf2d6..bd53da5541b8 100644 --- a/core/res/res/values-uz/strings.xml +++ b/core/res/res/values-uz/strings.xml @@ -1205,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="7684862527629252655">"Ilova tarixi"</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_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 ec777b5e0899..655bdc74582d 100644 --- a/core/res/res/values-vi/strings.xml +++ b/core/res/res/values-vi/strings.xml @@ -1204,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="7684862527629252655">"Hoạt động ứng dụng"</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_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-watch/config.xml b/core/res/res/values-watch/config.xml index 98dc4cfeaa89..f26d6ed10c0c 100644 --- a/core/res/res/values-watch/config.xml +++ b/core/res/res/values-watch/config.xml @@ -63,11 +63,8 @@ Set to true for watch devices. --> <bool name="config_focusScrollContainersInTouchMode">true</bool> - <!-- The small screens of watch devices makes multi-window support undesireable. --> - <bool name="config_supportsMultiWindow">false</bool> + <!-- Enable generic multi-window in order to support Activity in virtual display. --> + <bool name="config_supportsMultiWindow">true</bool> + <bool name="config_supportsMultiDisplay">true</bool> <bool name="config_supportsSplitScreenMultiWindow">false</bool> - - <!-- Disable Multi-Display because of small screen space and lack of external display connection - options. --> - <bool name="config_supportsMultiDisplay">false</bool> </resources> diff --git a/core/res/res/values-watch/styles_material.xml b/core/res/res/values-watch/styles_material.xml index 0053c12d9d84..fd881026ca6b 100644 --- a/core/res/res/values-watch/styles_material.xml +++ b/core/res/res/values-watch/styles_material.xml @@ -95,7 +95,7 @@ please see styles_device_defaults.xml. </style> <style name="DialogWindowTitle.Material"> - <item name="maxLines">@empty</item> + <item name="maxLines">@null</item> <item name="scrollHorizontally">false</item> <item name="textAppearance">@style/TextAppearance.Material.DialogWindowTitle</item> <item name="gravity">center_horizontal|top</item> diff --git a/core/res/res/values-zh-rCN/strings.xml b/core/res/res/values-zh-rCN/strings.xml index 24f86b3cda73..c19e3d26d3e8 100644 --- a/core/res/res/values-zh-rCN/strings.xml +++ b/core/res/res/values-zh-rCN/strings.xml @@ -1204,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="7684862527629252655">"应用活动"</string> + <string name="alert_windows_notification_channel_name" msgid="3116610965549449803">"<xliff:g id="NAME">%s</xliff:g>正在其他应用的上层显示内容"</string> <string name="alert_windows_notification_title" msgid="3697657294867638947">"<xliff:g id="NAME">%s</xliff:g>正在其他应用的上层显示内容"</string> <string name="alert_windows_notification_message" msgid="8917232109522912560">"如果您不想让<xliff:g id="NAME">%s</xliff:g>使用此功能,请点按以打开设置,然后关闭此功能。"</string> <string name="alert_windows_notification_turn_off_action" msgid="3367294525884949878">"关闭"</string> diff --git a/core/res/res/values-zh-rHK/strings.xml b/core/res/res/values-zh-rHK/strings.xml index 6a1039db2761..415c1ac93830 100644 --- a/core/res/res/values-zh-rHK/strings.xml +++ b/core/res/res/values-zh-rHK/strings.xml @@ -1204,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="7684862527629252655">"應用程式活動"</string> + <string name="alert_windows_notification_channel_name" msgid="3116610965549449803">"「<xliff:g id="NAME">%s</xliff:g>」目前可顯示在其他應用程式上面"</string> <string name="alert_windows_notification_title" msgid="3697657294867638947">"「<xliff:g id="NAME">%s</xliff:g>」正在其他應用程式上顯示內容"</string> <string name="alert_windows_notification_message" msgid="8917232109522912560">"如果您不想「<xliff:g id="NAME">%s</xliff:g>」使用此功能,請輕按以開啟設定,然後停用此功能。"</string> <string name="alert_windows_notification_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 35185a0fe923..36f9a9ec5b7d 100644 --- a/core/res/res/values-zh-rTW/strings.xml +++ b/core/res/res/values-zh-rTW/strings.xml @@ -1204,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="7684862527629252655">"應用程式活動"</string> + <string name="alert_windows_notification_channel_name" msgid="3116610965549449803">"「<xliff:g id="NAME">%s</xliff:g>」在其他應用程式上顯示內容"</string> <string name="alert_windows_notification_title" msgid="3697657294867638947">"「<xliff:g id="NAME">%s</xliff:g>」正在其他應用程式上顯示內容"</string> <string name="alert_windows_notification_message" msgid="8917232109522912560">"如果你不想讓「<xliff:g id="NAME">%s</xliff:g>」使用這項功能,請輕觸開啟設定頁面,然後停用此功能。"</string> <string name="alert_windows_notification_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 aefe4bea8dad..ff3593187a34 100644 --- a/core/res/res/values-zu/strings.xml +++ b/core/res/res/values-zu/strings.xml @@ -1204,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="7684862527629252655">"Umsebenzi wohlelo lokusebenza"</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_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/res/res/values/strings.xml b/core/res/res/values/strings.xml index fcabe3199f69..f747d3dfcba3 100644 --- a/core/res/res/values/strings.xml +++ b/core/res/res/values/strings.xml @@ -3225,7 +3225,7 @@ <skip /> <!-- Name of notification channel the system post notification to inform the use about apps that are drawing ui on-top of other apps (alert-windows) [CHAR LIMIT=NONE] --> - <string name="alert_windows_notification_channel_name">App activity</string> + <string name="alert_windows_notification_channel_name"><xliff:g id="name" example="Google Maps">%s</xliff:g> displaying over other apps</string> <!-- Notification title when an application is displaying ui on-top of other apps [CHAR LIMIT=30] --> <string name="alert_windows_notification_title"><xliff:g id="name" example="Google Maps">%s</xliff:g> is displaying over other apps</string> diff --git a/core/tests/coretests/src/android/transition/FadeTransitionTest.java b/core/tests/coretests/src/android/transition/FadeTransitionTest.java index 7e7e8151cc50..0140a04269b6 100644 --- a/core/tests/coretests/src/android/transition/FadeTransitionTest.java +++ b/core/tests/coretests/src/android/transition/FadeTransitionTest.java @@ -50,7 +50,7 @@ public class FadeTransitionTest extends ActivityInstrumentationTestCase2<Animato TransitionLatch latch = setVisibilityInTransition(fadeOut, R.id.square1, View.INVISIBLE); assertTrue(latch.startLatch.await(200, TimeUnit.MILLISECONDS)); assertEquals(View.VISIBLE, square1.getVisibility()); - Thread.sleep(100); + waitForAnimation(); assertFalse(square1.getTransitionAlpha() == 0 || square1.getTransitionAlpha() == 1); assertTrue(latch.endLatch.await(400, TimeUnit.MILLISECONDS)); assertEquals(1.0f, square1.getTransitionAlpha()); @@ -60,7 +60,7 @@ public class FadeTransitionTest extends ActivityInstrumentationTestCase2<Animato latch = setVisibilityInTransition(fadeIn, R.id.square1, View.VISIBLE); assertTrue(latch.startLatch.await(200, TimeUnit.MILLISECONDS)); assertEquals(View.VISIBLE, square1.getVisibility()); - Thread.sleep(100); + waitForAnimation(); final float transitionAlpha = square1.getTransitionAlpha(); assertTrue("expecting transitionAlpha to be between 0 and 1. Was " + transitionAlpha, transitionAlpha > 0 && transitionAlpha < 1); @@ -77,7 +77,7 @@ public class FadeTransitionTest extends ActivityInstrumentationTestCase2<Animato fadeOut.addListener(fadeOutValueCheck); TransitionLatch outLatch = setVisibilityInTransition(fadeOut, R.id.square1, View.INVISIBLE); assertTrue(outLatch.startLatch.await(200, TimeUnit.MILLISECONDS)); - Thread.sleep(100); + waitForAnimation(); Fade fadeIn = new Fade(Fade.MODE_IN); FadeValueCheck fadeInValueCheck = new FadeValueCheck(square1); @@ -110,7 +110,7 @@ public class FadeTransitionTest extends ActivityInstrumentationTestCase2<Animato fadeIn.addListener(fadeInValueCheck); TransitionLatch inLatch = setVisibilityInTransition(fadeIn, R.id.square1, View.VISIBLE); assertTrue(inLatch.startLatch.await(200, TimeUnit.MILLISECONDS)); - Thread.sleep(100); + waitForAnimation(); Fade fadeOut = new Fade(Fade.MODE_OUT); FadeValueCheck fadeOutValueCheck = new FadeValueCheck(square1); @@ -145,6 +145,23 @@ public class FadeTransitionTest extends ActivityInstrumentationTestCase2<Animato return latch; } + /** + * Waits for two animation frames to ensure animation values change. + */ + private void waitForAnimation() throws InterruptedException { + final CountDownLatch latch = new CountDownLatch(2); + mActivity.getWindow().getDecorView().postOnAnimation(new Runnable() { + @Override + public void run() { + latch.countDown(); + if (latch.getCount() > 0) { + mActivity.getWindow().getDecorView().postOnAnimation(this); + } + } + }); + assertTrue(latch.await(1, TimeUnit.SECONDS)); + } + public static class TransitionLatch implements TransitionListener { public CountDownLatch startLatch = new CountDownLatch(1); public CountDownLatch endLatch = new CountDownLatch(1); diff --git a/core/tests/coretests/src/android/widget/TextViewActivityTest.java b/core/tests/coretests/src/android/widget/TextViewActivityTest.java index ebab129a70e6..5a7bca4d44f5 100644 --- a/core/tests/coretests/src/android/widget/TextViewActivityTest.java +++ b/core/tests/coretests/src/android/widget/TextViewActivityTest.java @@ -50,14 +50,11 @@ import static org.hamcrest.Matchers.is; import android.content.ClipData; import android.content.ClipboardManager; -import android.text.TextUtils; -import android.text.Spanned; import android.support.test.espresso.NoMatchingViewException; import android.support.test.espresso.ViewAssertion; import android.view.ActionMode; import android.view.Menu; import android.view.MenuItem; -import android.view.View; import android.view.textclassifier.TextClassificationManager; import android.view.textclassifier.TextClassifier; import android.widget.espresso.CustomViewActions.RelativeCoordinatesProvider; @@ -72,8 +69,6 @@ import android.view.KeyEvent; import com.android.frameworks.coretests.R; -import junit.framework.AssertionFailedError; - /** * Tests the TextView widget from an Activity */ @@ -694,6 +689,51 @@ public class TextViewActivityTest extends ActivityInstrumentationTestCase2<TextV assertFalse(textView.hasTransientState()); } + public void testResetMenuItemTitle() throws Exception { + getActivity().getSystemService(TextClassificationManager.class).setTextClassifier(null); + final TextView textView = (TextView) getActivity().findViewById(R.id.textview); + final int itemId = 1; + final String title1 = " AFIGBO"; + final int index = title1.indexOf('I'); + final String title2 = title1.substring(index); + final String[] title = new String[]{title1}; + textView.post(() -> textView.setCustomSelectionActionModeCallback( + new ActionMode.Callback() { + @Override + public boolean onCreateActionMode(ActionMode actionMode, Menu menu) { + return true; + } + + @Override + public boolean onPrepareActionMode(ActionMode actionMode, Menu menu) { + menu.removeItem(itemId); + menu.add(Menu.NONE /* group */, itemId, 0 /* order */, title[0]); + return true; + } + + @Override + public boolean onActionItemClicked(ActionMode actionMode, MenuItem menuItem) { + return false; + } + + @Override + public void onDestroyActionMode(ActionMode actionMode) { + } + })); + onView(withId(R.id.textview)).perform(replaceText(title1)); + onView(withId(R.id.textview)).perform(longPressOnTextAtIndex(index)); + sleepForFloatingToolbarPopup(); + assertFloatingToolbarContainsItem(title1); + + // Change the menu item title. + title[0] = title2; + // Change the selection to invalidate the action mode without restarting it. + onHandleView(com.android.internal.R.id.selection_start_handle) + .perform(dragHandle(textView, Handle.SELECTION_START, index)); + sleepForFloatingToolbarPopup(); + assertFloatingToolbarContainsItem(title2); + } + public void testAssistItemIsAtIndexZero() throws Exception { getActivity().getSystemService(TextClassificationManager.class).setTextClassifier(null); final TextView textView = (TextView) getActivity().findViewById(R.id.textview); diff --git a/core/tests/coretests/src/com/android/internal/os/BatteryStatsBackgroundStatsTest.java b/core/tests/coretests/src/com/android/internal/os/BatteryStatsBackgroundStatsTest.java index d8de70c75972..9aabdbb2c8f0 100644 --- a/core/tests/coretests/src/com/android/internal/os/BatteryStatsBackgroundStatsTest.java +++ b/core/tests/coretests/src/com/android/internal/os/BatteryStatsBackgroundStatsTest.java @@ -100,6 +100,55 @@ public class BatteryStatsBackgroundStatsTest extends TestCase { assertEquals(227_000, bgtb.computeRealtime(cur, STATS_SINCE_CHARGED)); } + /** Test that BatteryStatsImpl.Uid.mOnBatteryScreenOffBackgroundTimeBase works correctly. */ + @SmallTest + public void testScreenOffBgTimeBase() throws Exception { + final MockClocks clocks = new MockClocks(); // holds realtime and uptime in ms + MockBatteryStatsImpl bi = new MockBatteryStatsImpl(clocks); + long cur = 0; // realtime in us + + BatteryStatsImpl.TimeBase bgtb = bi.getOnBatteryScreenOffBackgroundTimeBase(UID); + + // battery=off, screen=off, background=off + cur = (clocks.realtime = clocks.uptime = 100) * 1000; + bi.noteUidProcessStateLocked(UID, ActivityManager.PROCESS_STATE_IMPORTANT_FOREGROUND); + bi.updateTimeBasesLocked(false, false, cur, cur); + assertFalse(bgtb.isRunning()); + + // battery=on, screen=off, background=off + cur = (clocks.realtime = clocks.uptime = 200) * 1000; + bi.updateTimeBasesLocked(true, false, cur, cur); + assertFalse(bgtb.isRunning()); + + // battery=on, screen=on, background=off + cur = (clocks.realtime = clocks.uptime = 300) * 1000; + bi.updateTimeBasesLocked(true, true, cur, cur); + assertFalse(bgtb.isRunning()); + + // battery=on, screen=on, background=on + // Only during this period should the timebase progress + cur = (clocks.realtime = clocks.uptime = 400) * 1000; + bi.noteUidProcessStateLocked(UID, ActivityManager.PROCESS_STATE_IMPORTANT_BACKGROUND); + assertTrue(bgtb.isRunning()); + + // battery=on, screen=off, background=on + cur = (clocks.realtime = clocks.uptime = 550) * 1000; + bi.updateTimeBasesLocked(true, false, cur, cur); + assertFalse(bgtb.isRunning()); + + // battery=off, screen=off, background=on + cur = (clocks.realtime = clocks.uptime = 660) * 1000; + bi.updateTimeBasesLocked(false, false, cur, cur); + assertFalse(bgtb.isRunning()); + + // battery=off, screen=off, background=off + cur = (clocks.realtime = clocks.uptime = 770) * 1000; + bi.noteUidProcessStateLocked(UID, ActivityManager.PROCESS_STATE_IMPORTANT_FOREGROUND); + assertFalse(bgtb.isRunning()); + + assertEquals(150_000, bgtb.computeRealtime(cur, STATS_SINCE_CHARGED)); + } + @SmallTest public void testWifiScan() throws Exception { final MockClocks clocks = new MockClocks(); diff --git a/core/tests/coretests/src/com/android/internal/os/BatteryStatsNoteTest.java b/core/tests/coretests/src/com/android/internal/os/BatteryStatsNoteTest.java index e374e11b15f3..06ca18d072e7 100644 --- a/core/tests/coretests/src/com/android/internal/os/BatteryStatsNoteTest.java +++ b/core/tests/coretests/src/com/android/internal/os/BatteryStatsNoteTest.java @@ -16,7 +16,10 @@ package com.android.internal.os; import static android.os.BatteryStats.STATS_SINCE_CHARGED; +import static android.os.BatteryStats.WAKE_TYPE_PARTIAL; +import android.app.ActivityManager; +import android.os.BatteryStats; import android.os.WorkSource; import android.support.test.filters.SmallTest; @@ -29,7 +32,7 @@ public class BatteryStatsNoteTest extends TestCase{ private static final int UID = 10500; private static final WorkSource WS = new WorkSource(UID); - /** Test that BatteryStatsImpl.Uid.noteBluetoothScanResultsLocked. */ + /** Test BatteryStatsImpl.Uid.noteBluetoothScanResultLocked. */ @SmallTest public void testNoteBluetoothScanResultLocked() throws Exception { MockBatteryStatsImpl bi = new MockBatteryStatsImpl(new MockClocks()); @@ -41,4 +44,30 @@ public class BatteryStatsNoteTest extends TestCase{ bi.getUidStats().get(UID).getBluetoothScanResultCounter() .getCountLocked(STATS_SINCE_CHARGED)); } + + /** Test BatteryStatsImpl.Uid.noteStartWakeLocked. */ + @SmallTest + public void testNoteStartWakeLocked() throws Exception { + final MockClocks clocks = new MockClocks(); // holds realtime and uptime in ms + MockBatteryStatsImpl bi = new MockBatteryStatsImpl(clocks); + + int pid = 10; + String name = "name"; + + bi.updateTimeBasesLocked(true, true, 0, 0); + bi.noteUidProcessStateLocked(UID, ActivityManager.PROCESS_STATE_TOP); + bi.getUidStatsLocked(UID).noteStartWakeLocked(pid, name, WAKE_TYPE_PARTIAL, clocks.realtime); + + clocks.realtime = clocks.uptime = 100; + bi.noteUidProcessStateLocked(UID, ActivityManager.PROCESS_STATE_IMPORTANT_BACKGROUND); + + clocks.realtime = clocks.uptime = 220; + bi.getUidStatsLocked(UID).noteStopWakeLocked(pid, name, WAKE_TYPE_PARTIAL, clocks.realtime); + + BatteryStats.Timer aggregTimer = bi.getUidStats().get(UID).getAggregatedPartialWakelockTimer(); + long actualTime = aggregTimer.getTotalTimeLocked(300_000, STATS_SINCE_CHARGED); + long bgTime = aggregTimer.getSubTimer().getTotalTimeLocked(300_000, STATS_SINCE_CHARGED); + assertEquals(220_000, actualTime); + assertEquals(120_000, bgTime); + } } diff --git a/core/tests/coretests/src/com/android/internal/os/MockBatteryStatsImpl.java b/core/tests/coretests/src/com/android/internal/os/MockBatteryStatsImpl.java index 65f898c62815..a123fce0748c 100644 --- a/core/tests/coretests/src/com/android/internal/os/MockBatteryStatsImpl.java +++ b/core/tests/coretests/src/com/android/internal/os/MockBatteryStatsImpl.java @@ -44,5 +44,9 @@ public class MockBatteryStatsImpl extends BatteryStatsImpl { public TimeBase getOnBatteryBackgroundTimeBase(int uid) { return getUidStatsLocked(uid).mOnBatteryBackgroundTimeBase; } + + public TimeBase getOnBatteryScreenOffBackgroundTimeBase(int uid) { + return getUidStatsLocked(uid).mOnBatteryScreenOffBackgroundTimeBase; + } } diff --git a/graphics/java/android/graphics/ComposeShader.java b/graphics/java/android/graphics/ComposeShader.java index 0b1141a0e505..70a5f53ae1e0 100644 --- a/graphics/java/android/graphics/ComposeShader.java +++ b/graphics/java/android/graphics/ComposeShader.java @@ -76,8 +76,9 @@ public class ComposeShader extends Shader { mShaderA.getNativeInstance(), mShaderB.getNativeInstance(), mPorterDuffMode); } + /** @hide */ @Override - void verifyNativeInstance() { + protected void verifyNativeInstance() { if (mShaderA.getNativeInstance() != mNativeInstanceShaderA || mShaderB.getNativeInstance() != mNativeInstanceShaderB) { // Child shader native instance has been updated, diff --git a/graphics/java/android/graphics/Shader.java b/graphics/java/android/graphics/Shader.java index 8410ab2a1e02..0209cea4e2e5 100644 --- a/graphics/java/android/graphics/Shader.java +++ b/graphics/java/android/graphics/Shader.java @@ -19,6 +19,8 @@ package android.graphics; import android.annotation.NonNull; import android.annotation.Nullable; +import libcore.util.NativeAllocationRegistry; + /** * Shader is the based class for objects that return horizontal spans of colors * during drawing. A subclass of Shader is installed in a Paint calling @@ -26,6 +28,12 @@ import android.annotation.Nullable; * drawn with that paint will get its color(s) from the shader. */ public class Shader { + + private static class NoImagePreloadHolder { + public static final NativeAllocationRegistry sRegistry = new NativeAllocationRegistry( + Shader.class.getClassLoader(), nativeGetFinalizer(), 50); + } + /** * @deprecated Use subclass constructors directly instead. */ @@ -37,6 +45,8 @@ public class Shader { * is called - otherwise may be out of date with java setters/properties. */ private long mNativeInstance; + // Runnable to do immediate destruction + private Runnable mCleaner; /** * Current matrix - always set to null if local matrix is identity. @@ -80,7 +90,8 @@ public class Shader { /** * Set the shader's local matrix. Passing null will reset the shader's - * matrix to identity. + * matrix to identity. If the matrix has scale value as 0, the drawing + * result is undefined. * * @param localM The shader's new local matrix, or null to specify identity */ @@ -105,9 +116,11 @@ public class Shader { return 0; } - void discardNativeInstance() { + /** @hide */ + protected final void discardNativeInstance() { if (mNativeInstance != 0) { - nativeSafeUnref(mNativeInstance); + mCleaner.run(); + mCleaner = null; mNativeInstance = 0; } } @@ -115,20 +128,9 @@ public class Shader { /** * Callback for subclasses to call {@link #discardNativeInstance()} if the most recently * constructed native instance is no longer valid. + * @hide */ - void verifyNativeInstance() { - } - - @Override - protected void finalize() throws Throwable { - try { - if (mNativeInstance != 0) { - nativeSafeUnref(mNativeInstance); - } - mNativeInstance = -1; - } finally { - super.finalize(); - } + protected void verifyNativeInstance() { } /** @@ -150,20 +152,20 @@ public class Shader { /** * @hide */ - public long getNativeInstance() { - if (mNativeInstance == -1) { - throw new IllegalStateException("attempting to use a finalized Shader"); - } - + public final long getNativeInstance() { // verify mNativeInstance is valid verifyNativeInstance(); if (mNativeInstance == 0) { mNativeInstance = createNativeInstance(mLocalMatrix == null ? 0 : mLocalMatrix.native_instance); + mCleaner = NoImagePreloadHolder.sRegistry.registerNativeAllocation( + this, mNativeInstance); } return mNativeInstance; } - private static native void nativeSafeUnref(long nativeInstance); + private static native long nativeGetFinalizer(); + } + diff --git a/graphics/java/android/graphics/drawable/RippleDrawable.java b/graphics/java/android/graphics/drawable/RippleDrawable.java index bfd0604a7c3f..8f314c9c36aa 100644 --- a/graphics/java/android/graphics/drawable/RippleDrawable.java +++ b/graphics/java/android/graphics/drawable/RippleDrawable.java @@ -58,11 +58,11 @@ import java.util.Arrays; * mask using {@code setId(..., android.R.id.mask)} or an existing mask layer * may be replaced using {@code setDrawableByLayerId(android.R.id.mask, ...)}. * <pre> - * <code><!-- A red ripple masked against an opaque rectangle. --/> - * <ripple android:color="#ffff0000"> - * <item android:id="@android:id/mask" + * <code><!-- A red ripple masked against an opaque rectangle. --/> + * <ripple android:color="#ffff0000"> + * <item android:id="@android:id/mask" * android:drawable="@android:color/white" /> - * </ripple></code> + * </ripple></code> * </pre> * <p> * If a mask layer is set, the ripple effect will be masked against that layer @@ -71,15 +71,15 @@ import java.util.Arrays; * If no mask layer is set, the ripple effect is masked against the composite * of the child layers. * <pre> - * <code><!-- A green ripple drawn atop a black rectangle. --/> - * <ripple android:color="#ff00ff00"> - * <item android:drawable="@android:color/black" /> - * </ripple> + * <code><!-- A green ripple drawn atop a black rectangle. --/> + * <ripple android:color="#ff00ff00"> + * <item android:drawable="@android:color/black" /> + * </ripple> * - * <!-- A blue ripple drawn atop a drawable resource. --/> - * <ripple android:color="#ff0000ff"> - * <item android:drawable="@drawable/my_drawable" /> - * </ripple></code> + * <!-- A blue ripple drawn atop a drawable resource. --/> + * <ripple android:color="#ff0000ff"> + * <item android:drawable="@drawable/my_drawable" /> + * </ripple></code> * </pre> * <p> * If no child layers or mask is specified and the ripple is set as a View @@ -87,8 +87,8 @@ import java.util.Arrays; * background within the View's hierarchy. In this case, the drawing region * may extend outside of the Drawable bounds. * <pre> - * <code><!-- An unbounded red ripple. --/> - * <ripple android:color="#ffff0000" /></code> + * <code><!-- An unbounded red ripple. --/> + * <ripple android:color="#ffff0000" /></code> * </pre> * * @attr ref android.R.styleable#RippleDrawable_color diff --git a/libs/hwui/Caches.cpp b/libs/hwui/Caches.cpp index a0366dee3218..2fdfcd42a1e1 100644 --- a/libs/hwui/Caches.cpp +++ b/libs/hwui/Caches.cpp @@ -223,7 +223,6 @@ void Caches::dumpMemoryUsage(String8 &log) { /////////////////////////////////////////////////////////////////////////////// void Caches::clearGarbage() { - textureCache.clearGarbage(); pathCache.clearGarbage(); patchCache.clearGarbage(); } diff --git a/libs/hwui/TextureCache.cpp b/libs/hwui/TextureCache.cpp index 63a6a2c8c89c..710cdd9286e8 100644 --- a/libs/hwui/TextureCache.cpp +++ b/libs/hwui/TextureCache.cpp @@ -191,25 +191,14 @@ Texture* TextureCache::get(Bitmap* bitmap) { return texture; } -void TextureCache::releaseTexture(uint32_t pixelRefStableID) { - Mutex::Autolock _l(mLock); - mGarbage.push_back(pixelRefStableID); -} - -void TextureCache::clearGarbage() { - Mutex::Autolock _l(mLock); - size_t count = mGarbage.size(); - for (size_t i = 0; i < count; i++) { - uint32_t pixelRefId = mGarbage[i]; - auto hardwareIter = mHardwareTextures.find(pixelRefId); - if (hardwareIter == mHardwareTextures.end()) { - mCache.remove(pixelRefId); - } else { - hardwareIter->second->deleteTexture(); - mHardwareTextures.erase(hardwareIter); - } +bool TextureCache::destroyTexture(uint32_t pixelRefStableID) { + auto hardwareIter = mHardwareTextures.find(pixelRefStableID); + if (hardwareIter != mHardwareTextures.end()) { + hardwareIter->second->deleteTexture(); + mHardwareTextures.erase(hardwareIter); + return true; } - mGarbage.clear(); + return mCache.remove(pixelRefStableID); } void TextureCache::clear() { diff --git a/libs/hwui/TextureCache.h b/libs/hwui/TextureCache.h index db4ff39aed83..776ff8a03fd1 100644 --- a/libs/hwui/TextureCache.h +++ b/libs/hwui/TextureCache.h @@ -94,14 +94,10 @@ public: Texture* get(Bitmap* bitmap); /** - * Removes the texture associated with the specified pixelRef. This is meant - * to be called from threads that are not the EGL context thread. + * Removes the texture associated with the specified pixelRef. Must be called from RenderThread + * Returns true if a texture was destroyed, false if no texture with that id was found */ - ANDROID_API void releaseTexture(uint32_t pixelRefStableID); - /** - * Process deferred removals. - */ - void clearGarbage(); + bool destroyTexture(uint32_t pixelRefStableID); /** * Clears the cache. This causes all textures to be deleted. @@ -139,9 +135,7 @@ private: bool mDebugEnabled; - std::vector<uint32_t> mGarbage; std::unordered_map<uint32_t, std::unique_ptr<Texture>> mHardwareTextures; - mutable Mutex mLock; }; // class TextureCache }; // namespace uirenderer diff --git a/libs/hwui/hwui/Bitmap.cpp b/libs/hwui/hwui/Bitmap.cpp index d765584a7530..bb1e674d4861 100644 --- a/libs/hwui/hwui/Bitmap.cpp +++ b/libs/hwui/hwui/Bitmap.cpp @@ -416,9 +416,7 @@ Bitmap::~Bitmap() { } - if (android::uirenderer::Caches::hasInstance()) { - android::uirenderer::Caches::getInstance().textureCache.releaseTexture(getStableID()); - } + android::uirenderer::renderthread::RenderProxy::onBitmapDestroyed(getStableID()); } bool Bitmap::hasHardwareMipMap() const { @@ -486,7 +484,13 @@ void Bitmap::setAlphaType(SkAlphaType alphaType) { void Bitmap::getSkBitmap(SkBitmap* outBitmap) { outBitmap->setHasHardwareMipMap(mHasHardwareMipMap); if (isHardware()) { - outBitmap->allocPixels(info()); + if (uirenderer::Properties::isSkiaEnabled()) { + // TODO: add color correctness for Skia pipeline - pass null color space for now + outBitmap->allocPixels(SkImageInfo::Make(info().width(), info().height(), + info().colorType(), info().alphaType(), nullptr)); + } else { + outBitmap->allocPixels(info()); + } uirenderer::renderthread::RenderProxy::copyGraphicBufferInto(graphicBuffer(), outBitmap); return; } @@ -495,9 +499,13 @@ void Bitmap::getSkBitmap(SkBitmap* outBitmap) { } void Bitmap::getSkBitmapForShaders(SkBitmap* outBitmap) { - outBitmap->setInfo(info(), rowBytes()); - outBitmap->setPixelRef(this); - outBitmap->setHasHardwareMipMap(mHasHardwareMipMap); + if (isHardware() && uirenderer::Properties::isSkiaEnabled()) { + getSkBitmap(outBitmap); + } else { + outBitmap->setInfo(info(), rowBytes()); + outBitmap->setPixelRef(this); + outBitmap->setHasHardwareMipMap(mHasHardwareMipMap); + } } void Bitmap::getBounds(SkRect* bounds) const { diff --git a/libs/hwui/renderstate/RenderState.cpp b/libs/hwui/renderstate/RenderState.cpp index c8833d2a7489..ed96d49bbc15 100644 --- a/libs/hwui/renderstate/RenderState.cpp +++ b/libs/hwui/renderstate/RenderState.cpp @@ -122,6 +122,13 @@ void RenderState::flush(Caches::FlushMode mode) { mCaches->flush(mode); } +void RenderState::onBitmapDestroyed(uint32_t pixelRefId) { + if (mCaches && mCaches->textureCache.destroyTexture(pixelRefId)) { + glFlush(); + GL_CHECKPOINT(MODERATE); + } +} + void RenderState::setViewport(GLsizei width, GLsizei height) { mViewportWidth = width; mViewportHeight = height; diff --git a/libs/hwui/renderstate/RenderState.h b/libs/hwui/renderstate/RenderState.h index f78bf7a4e088..787946f79f6b 100644 --- a/libs/hwui/renderstate/RenderState.h +++ b/libs/hwui/renderstate/RenderState.h @@ -63,6 +63,7 @@ public: void onVkContextDestroyed(); void flush(Caches::FlushMode flushMode); + void onBitmapDestroyed(uint32_t pixelRefId); void setViewport(GLsizei width, GLsizei height); void getViewport(GLsizei* outWidth, GLsizei* outHeight); diff --git a/libs/hwui/renderthread/RenderProxy.cpp b/libs/hwui/renderthread/RenderProxy.cpp index a1f1717e6b96..eed523810403 100644 --- a/libs/hwui/renderthread/RenderProxy.cpp +++ b/libs/hwui/renderthread/RenderProxy.cpp @@ -24,6 +24,7 @@ #include "renderthread/EglManager.h" #include "renderthread/RenderTask.h" #include "renderthread/RenderThread.h" +#include "renderstate/RenderState.h" #include "utils/Macros.h" #include "utils/TimeUtils.h" @@ -693,6 +694,20 @@ int RenderProxy::copyGraphicBufferInto(GraphicBuffer* buffer, SkBitmap* bitmap) } } +CREATE_BRIDGE2(onBitmapDestroyed, RenderThread* thread, uint32_t pixelRefId) { + args->thread->renderState().onBitmapDestroyed(args->pixelRefId); + return nullptr; +} + +void RenderProxy::onBitmapDestroyed(uint32_t pixelRefId) { + if (!RenderThread::hasInstance()) return; + SETUP_TASK(onBitmapDestroyed); + RenderThread& thread = RenderThread::getInstance(); + args->thread = &thread; + args->pixelRefId = pixelRefId; + thread.queue(task); +} + void RenderProxy::post(RenderTask* task) { mRenderThread.queue(task); } diff --git a/libs/hwui/renderthread/RenderProxy.h b/libs/hwui/renderthread/RenderProxy.h index a60ed55c70d2..b21772cd88de 100644 --- a/libs/hwui/renderthread/RenderProxy.h +++ b/libs/hwui/renderthread/RenderProxy.h @@ -135,6 +135,8 @@ public: static sk_sp<Bitmap> allocateHardwareBitmap(SkBitmap& bitmap); static int copyGraphicBufferInto(GraphicBuffer* buffer, SkBitmap* bitmap); + + static void onBitmapDestroyed(uint32_t pixelRefId); private: RenderThread& mRenderThread; CanvasContext* mContext; diff --git a/packages/CompanionDeviceManager/src/com/android/companiondevicemanager/DeviceChooserActivity.java b/packages/CompanionDeviceManager/src/com/android/companiondevicemanager/DeviceChooserActivity.java index b145290d0ce6..0cf21d236041 100644 --- a/packages/CompanionDeviceManager/src/com/android/companiondevicemanager/DeviceChooserActivity.java +++ b/packages/CompanionDeviceManager/src/com/android/companiondevicemanager/DeviceChooserActivity.java @@ -93,9 +93,9 @@ public class DeviceChooserActivity extends Activity { } @Override - protected void onPause() { - super.onPause(); - if (!isFinishing()) { + protected void onStop() { + super.onStop(); + if (!isFinishing() && !isChangingConfigurations()) { cancel(); } } diff --git a/packages/SettingsLib/res/color/batterymeter_frame_color.xml b/packages/SettingsLib/res/color/meter_background_color.xml index 34de5489a28b..34de5489a28b 100644 --- a/packages/SettingsLib/res/color/batterymeter_frame_color.xml +++ b/packages/SettingsLib/res/color/meter_background_color.xml diff --git a/packages/SettingsLib/res/color/batterymeter_charge_color.xml b/packages/SettingsLib/res/color/meter_consumed_color.xml index 15944c3a2a07..15944c3a2a07 100644 --- a/packages/SettingsLib/res/color/batterymeter_charge_color.xml +++ b/packages/SettingsLib/res/color/meter_consumed_color.xml diff --git a/packages/SettingsLib/res/layout/restricted_switch_preference.xml b/packages/SettingsLib/res/layout/restricted_switch_preference.xml index 0e4ef6b7a92d..64b47b6b68a9 100644 --- a/packages/SettingsLib/res/layout/restricted_switch_preference.xml +++ b/packages/SettingsLib/res/layout/restricted_switch_preference.xml @@ -27,7 +27,7 @@ android:id="@+id/icon_container" android:layout_width="wrap_content" android:layout_height="wrap_content" - android:minWidth="60dp" + android:minWidth="56dp" android:gravity="start|center_vertical" android:orientation="horizontal" android:paddingEnd="12dp" diff --git a/packages/SettingsLib/res/values-af/strings.xml b/packages/SettingsLib/res/values-af/strings.xml index e89b21aed295..4f5281251314 100644 --- a/packages/SettingsLib/res/values-af/strings.xml +++ b/packages/SettingsLib/res/values-af/strings.xml @@ -272,6 +272,10 @@ <string name="app_process_limit_title" msgid="4280600650253107163">"Agtergrondproses-limiet"</string> <string name="show_all_anrs" msgid="28462979638729082">"Wys alle ANRe"</string> <string name="show_all_anrs_summary" msgid="641908614413544127">"Wys Program reageer nie-dialoog vir agtergrond programme"</string> + <!-- no translation found for show_notification_channel_warnings (1399948193466922683) --> + <skip /> + <!-- no translation found for show_notification_channel_warnings_summary (5536803251863694895) --> + <skip /> <string name="force_allow_on_external" msgid="3215759785081916381">"Programme verplig ekstern toegelaat"</string> <string name="force_allow_on_external_summary" msgid="3640752408258034689">"Maak dat enige program in eksterne berging geskryf kan word, ongeag manifeswaardes"</string> <string name="force_resizable_activities" msgid="8615764378147824985">"Verplig verstelbare groottes vir aktiwiteite"</string> diff --git a/packages/SettingsLib/res/values-am/strings.xml b/packages/SettingsLib/res/values-am/strings.xml index d8150d197125..465e253de9d9 100644 --- a/packages/SettingsLib/res/values-am/strings.xml +++ b/packages/SettingsLib/res/values-am/strings.xml @@ -272,6 +272,10 @@ <string name="app_process_limit_title" msgid="4280600650253107163">"የዳራ አሂድ ወሰን"</string> <string name="show_all_anrs" msgid="28462979638729082">"ሁሉንም ANRs አሳይ"</string> <string name="show_all_anrs_summary" msgid="641908614413544127">"ለዳራ መተግበሪያዎች ምላሽ የማይሰጥ መገናኛ ትግበራ አሳይ"</string> + <!-- no translation found for show_notification_channel_warnings (1399948193466922683) --> + <skip /> + <!-- no translation found for show_notification_channel_warnings_summary (5536803251863694895) --> + <skip /> <string name="force_allow_on_external" msgid="3215759785081916381">"በውጫዊ ላይ ሃይል ይፈቀዳል"</string> <string name="force_allow_on_external_summary" msgid="3640752408258034689">"የዝርዝር ሰነዶች እሴቶች ግምት ውስጥ ሳያስገባ ማንኛውም መተግበሪያ ወደ ውጫዊ ማከማቻው ለመጻፍ ብቁ ያደርጋል"</string> <string name="force_resizable_activities" msgid="8615764378147824985">"እንቅስቃሴዎች ዳግመኛ እንዲመጣጠኑ አስገድድ"</string> diff --git a/packages/SettingsLib/res/values-ar/strings.xml b/packages/SettingsLib/res/values-ar/strings.xml index 034653ffb54a..a4ee8fd5568c 100644 --- a/packages/SettingsLib/res/values-ar/strings.xml +++ b/packages/SettingsLib/res/values-ar/strings.xml @@ -272,6 +272,10 @@ <string name="app_process_limit_title" msgid="4280600650253107163">"حد العمليات بالخلفية"</string> <string name="show_all_anrs" msgid="28462979638729082">"عرض جميع رسائل ANR"</string> <string name="show_all_anrs_summary" msgid="641908614413544127">"عرض مربع الحوار \"التطبيق لا يستجيب\" مع تطبيقات الخلفية"</string> + <!-- no translation found for show_notification_channel_warnings (1399948193466922683) --> + <skip /> + <!-- no translation found for show_notification_channel_warnings_summary (5536803251863694895) --> + <skip /> <string name="force_allow_on_external" msgid="3215759785081916381">"فرض السماح للتطبيقات على الخارجي"</string> <string name="force_allow_on_external_summary" msgid="3640752408258034689">"تأهيل أي تطبيق بحيث تتم كتابته على وحدة تخزين خارجية، بغض النظر عن قيم البيان"</string> <string name="force_resizable_activities" msgid="8615764378147824985">"فرض إمكانية تغيير على الأنشطة"</string> diff --git a/packages/SettingsLib/res/values-az/strings.xml b/packages/SettingsLib/res/values-az/strings.xml index 603f6918d89d..690e589e229e 100644 --- a/packages/SettingsLib/res/values-az/strings.xml +++ b/packages/SettingsLib/res/values-az/strings.xml @@ -272,6 +272,10 @@ <string name="app_process_limit_title" msgid="4280600650253107163">"Fon prosesi limiti"</string> <string name="show_all_anrs" msgid="28462979638729082">"Bütün ANRları göstər"</string> <string name="show_all_anrs_summary" msgid="641908614413544127">"Arxa tətbiqlər dialoquna cavab verməyən tətbiqi göstər"</string> + <!-- no translation found for show_notification_channel_warnings (1399948193466922683) --> + <skip /> + <!-- no translation found for show_notification_channel_warnings_summary (5536803251863694895) --> + <skip /> <string name="force_allow_on_external" msgid="3215759785081916381">"Tətbiqlərə xaricdən məcburi icazə"</string> <string name="force_allow_on_external_summary" msgid="3640752408258034689">"Seçilmiş hər hansı tətbiqi bəyannamə dəyərlərindən aslı olmayaraq xarici yaddaşa yazılabilən edir."</string> <string name="force_resizable_activities" msgid="8615764378147824985">"Ölçü dəyişdirmək üçün məcburi fəaliyyətlər"</string> diff --git a/packages/SettingsLib/res/values-b+sr+Latn/strings.xml b/packages/SettingsLib/res/values-b+sr+Latn/strings.xml index 70c6e471999c..e59dac6e1c52 100644 --- a/packages/SettingsLib/res/values-b+sr+Latn/strings.xml +++ b/packages/SettingsLib/res/values-b+sr+Latn/strings.xml @@ -272,6 +272,10 @@ <string name="app_process_limit_title" msgid="4280600650253107163">"Ograničenje pozadinskih procesa"</string> <string name="show_all_anrs" msgid="28462979638729082">"Prikaži sve ANR-ove"</string> <string name="show_all_anrs_summary" msgid="641908614413544127">"Prikaži dijalog Aplikacija ne reaguje za aplikacije u pozadini"</string> + <!-- no translation found for show_notification_channel_warnings (1399948193466922683) --> + <skip /> + <!-- no translation found for show_notification_channel_warnings_summary (5536803251863694895) --> + <skip /> <string name="force_allow_on_external" msgid="3215759785081916381">"Prinudno dozvoli aplikacije u spoljnoj"</string> <string name="force_allow_on_external_summary" msgid="3640752408258034689">"Omogućava upisivanje svih aplikacija u spoljnu memoriju, bez obzira na vrednosti manifesta"</string> <string name="force_resizable_activities" msgid="8615764378147824985">"Prinudno omogući promenu veličine aktivnosti"</string> diff --git a/packages/SettingsLib/res/values-be/strings.xml b/packages/SettingsLib/res/values-be/strings.xml index f8eec7f237c2..b1ec867876c3 100644 --- a/packages/SettingsLib/res/values-be/strings.xml +++ b/packages/SettingsLib/res/values-be/strings.xml @@ -272,6 +272,10 @@ <string name="app_process_limit_title" msgid="4280600650253107163">"Ліміт фонавага працэсу"</string> <string name="show_all_anrs" msgid="28462979638729082">"Паказаць усе ANRS"</string> <string name="show_all_anrs_summary" msgid="641908614413544127">"Паказаць дыялогавае акно \"Праграма не адказвае\" для фонавых прыкладанняў"</string> + <!-- no translation found for show_notification_channel_warnings (1399948193466922683) --> + <skip /> + <!-- no translation found for show_notification_channel_warnings_summary (5536803251863694895) --> + <skip /> <string name="force_allow_on_external" msgid="3215759785081916381">"Прымусова дазволіць праграмы на вонкавым сховішчы"</string> <string name="force_allow_on_external_summary" msgid="3640752408258034689">"Робіць любую праграму даступнай для запісу на вонкавае сховішча, незалежна ад значэнняў маніфеста"</string> <string name="force_resizable_activities" msgid="8615764378147824985">"Зрабіць вокны дзеянняў даступнымі для змены памеру"</string> diff --git a/packages/SettingsLib/res/values-bg/strings.xml b/packages/SettingsLib/res/values-bg/strings.xml index 53c50b91dc81..a8039eb0a8bc 100644 --- a/packages/SettingsLib/res/values-bg/strings.xml +++ b/packages/SettingsLib/res/values-bg/strings.xml @@ -272,6 +272,10 @@ <string name="app_process_limit_title" msgid="4280600650253107163">"Лимит за фонови процеси"</string> <string name="show_all_anrs" msgid="28462979638729082">"Всички нереагиращи прил."</string> <string name="show_all_anrs_summary" msgid="641908614413544127">"Диалог. прозорец „НП“ за приложения на заден план"</string> + <!-- no translation found for show_notification_channel_warnings (1399948193466922683) --> + <skip /> + <!-- no translation found for show_notification_channel_warnings_summary (5536803251863694895) --> + <skip /> <string name="force_allow_on_external" msgid="3215759785081916381">"Външно хран.: Принуд. разрешаване на приложенията"</string> <string name="force_allow_on_external_summary" msgid="3640752408258034689">"Прави всички приложения да отговарят на условията да бъдат записвани във външното хранилище независимо от стойностите в манифеста"</string> <string name="force_resizable_activities" msgid="8615764378147824985">"Възможност за преоразмеряване на активностите"</string> diff --git a/packages/SettingsLib/res/values-bn/strings.xml b/packages/SettingsLib/res/values-bn/strings.xml index 841c96eeda9b..3f0de25ba7f2 100644 --- a/packages/SettingsLib/res/values-bn/strings.xml +++ b/packages/SettingsLib/res/values-bn/strings.xml @@ -272,6 +272,10 @@ <string name="app_process_limit_title" msgid="4280600650253107163">"পশ্চাদপট প্রক্রিয়ার সীমা"</string> <string name="show_all_anrs" msgid="28462979638729082">"সব ANR দেখান"</string> <string name="show_all_anrs_summary" msgid="641908614413544127">"পশ্চাদপটের অ্যাপ্লিকেশানগুলির জন্য অ্যাপ্লিকেশান কোনো প্রতিক্রিয়া দিচ্ছে না এমন কথোপকথন দেখান"</string> + <!-- no translation found for show_notification_channel_warnings (1399948193466922683) --> + <skip /> + <!-- no translation found for show_notification_channel_warnings_summary (5536803251863694895) --> + <skip /> <string name="force_allow_on_external" msgid="3215759785081916381">"বহিরাগততে বলপূর্বক মঞ্জুরি"</string> <string name="force_allow_on_external_summary" msgid="3640752408258034689">"ম্যানিফেস্ট মানগুলি নির্বিশেষে যেকোনো অ্যাপ্লিকেশানকে বাহ্যিক সঞ্চয়স্থানে লেখার উপযুক্ত বানায়"</string> <string name="force_resizable_activities" msgid="8615764378147824985">"আকার পরিবর্তনযোগ্য করার জন্য ক্রিয়াকলাপগুলিকে জোর করুন"</string> diff --git a/packages/SettingsLib/res/values-bs/strings.xml b/packages/SettingsLib/res/values-bs/strings.xml index 451a1ff51186..f91a8a8f559c 100644 --- a/packages/SettingsLib/res/values-bs/strings.xml +++ b/packages/SettingsLib/res/values-bs/strings.xml @@ -272,6 +272,10 @@ <string name="app_process_limit_title" msgid="4280600650253107163">"Ograničenje procesa u pozadini"</string> <string name="show_all_anrs" msgid="28462979638729082">"Prikaži sve ANR-ove"</string> <string name="show_all_anrs_summary" msgid="641908614413544127">"Prik. dijalog Aplikacija ne reagira za apl. u poz."</string> + <!-- no translation found for show_notification_channel_warnings (1399948193466922683) --> + <skip /> + <!-- no translation found for show_notification_channel_warnings_summary (5536803251863694895) --> + <skip /> <string name="force_allow_on_external" msgid="3215759785081916381">"Nametni aplikacije na vanjskoj pohrani"</string> <string name="force_allow_on_external_summary" msgid="3640752408258034689">"Omogućava da svaka aplikacija bude pogodna za upisivanje na vanjsku pohranu, bez obzira na prikazane vrijednosti"</string> <string name="force_resizable_activities" msgid="8615764378147824985">"Nametni aktivnostima mijenjanje veličina"</string> diff --git a/packages/SettingsLib/res/values-ca/strings.xml b/packages/SettingsLib/res/values-ca/strings.xml index 2a4db1d51694..99c5d37bd2c5 100644 --- a/packages/SettingsLib/res/values-ca/strings.xml +++ b/packages/SettingsLib/res/values-ca/strings.xml @@ -272,6 +272,10 @@ <string name="app_process_limit_title" msgid="4280600650253107163">"Límita processos en segon pla"</string> <string name="show_all_anrs" msgid="28462979638729082">"Tots els errors sense resposta"</string> <string name="show_all_anrs_summary" msgid="641908614413544127">"Informa que una aplicació en segon pla no respon"</string> + <!-- no translation found for show_notification_channel_warnings (1399948193466922683) --> + <skip /> + <!-- no translation found for show_notification_channel_warnings_summary (5536803251863694895) --> + <skip /> <string name="force_allow_on_external" msgid="3215759785081916381">"Força permís d\'aplicacions a l\'emmagatzem. extern"</string> <string name="force_allow_on_external_summary" msgid="3640752408258034689">"Permet que qualsevol aplicació es pugui escriure en un dispositiu d’emmagatzematge extern, independentment dels valors definits"</string> <string name="force_resizable_activities" msgid="8615764378147824985">"Força l\'ajust de la mida de les activitats"</string> diff --git a/packages/SettingsLib/res/values-cs/strings.xml b/packages/SettingsLib/res/values-cs/strings.xml index 673d51b7fb46..7b3fb86ff72d 100644 --- a/packages/SettingsLib/res/values-cs/strings.xml +++ b/packages/SettingsLib/res/values-cs/strings.xml @@ -272,6 +272,10 @@ <string name="app_process_limit_title" msgid="4280600650253107163">"Omezení procesů na pozadí"</string> <string name="show_all_anrs" msgid="28462979638729082">"Zobrazit všechny ANR"</string> <string name="show_all_anrs_summary" msgid="641908614413544127">"Zobrazovat dialog „Aplikace neodpovídá“ pro aplikace na pozadí"</string> + <!-- no translation found for show_notification_channel_warnings (1399948193466922683) --> + <skip /> + <!-- no translation found for show_notification_channel_warnings_summary (5536803251863694895) --> + <skip /> <string name="force_allow_on_external" msgid="3215759785081916381">"Vynutit povolení aplikací na externím úložišti"</string> <string name="force_allow_on_external_summary" msgid="3640752408258034689">"Každou aplikaci bude možné zapsat do externího úložiště, bez ohledu na hodnoty manifestu"</string> <string name="force_resizable_activities" msgid="8615764378147824985">"Vynutit možnost změny velikosti aktivit"</string> diff --git a/packages/SettingsLib/res/values-da/strings.xml b/packages/SettingsLib/res/values-da/strings.xml index aa0becf5190e..6ccf45baf308 100644 --- a/packages/SettingsLib/res/values-da/strings.xml +++ b/packages/SettingsLib/res/values-da/strings.xml @@ -272,6 +272,10 @@ <string name="app_process_limit_title" msgid="4280600650253107163">"Grænse for baggrundsprocesser"</string> <string name="show_all_anrs" msgid="28462979638729082">"Vis alle \"Appen svarer ikke\""</string> <string name="show_all_anrs_summary" msgid="641908614413544127">"Vis \"Appen svarer ikke\" for baggrundsapps"</string> + <!-- no translation found for show_notification_channel_warnings (1399948193466922683) --> + <skip /> + <!-- no translation found for show_notification_channel_warnings_summary (5536803251863694895) --> + <skip /> <string name="force_allow_on_external" msgid="3215759785081916381">"Gennemtving tilladelse til eksternt lager"</string> <string name="force_allow_on_external_summary" msgid="3640752408258034689">"Gør det muligt at overføre enhver app til et eksternt lager uafhængigt af manifestværdier"</string> <string name="force_resizable_activities" msgid="8615764378147824985">"Tving aktiviteter til at kunne tilpasses"</string> diff --git a/packages/SettingsLib/res/values-de/strings.xml b/packages/SettingsLib/res/values-de/strings.xml index 0a2cf3353a32..db58ab2886f9 100644 --- a/packages/SettingsLib/res/values-de/strings.xml +++ b/packages/SettingsLib/res/values-de/strings.xml @@ -272,6 +272,10 @@ <string name="app_process_limit_title" msgid="4280600650253107163">"Hintergrundprozesslimit"</string> <string name="show_all_anrs" msgid="28462979638729082">"Alle ANRS anzeigen"</string> <string name="show_all_anrs_summary" msgid="641908614413544127">"Dialogfeld \"App antwortet nicht\" für Hintergrund-Apps anzeigen"</string> + <!-- no translation found for show_notification_channel_warnings (1399948193466922683) --> + <skip /> + <!-- no translation found for show_notification_channel_warnings_summary (5536803251863694895) --> + <skip /> <string name="force_allow_on_external" msgid="3215759785081916381">"Externe Speichernutzung von Apps erlauben"</string> <string name="force_allow_on_external_summary" msgid="3640752408258034689">"Ermöglicht es jeder qualifizierten App, Daten auf externen Speicher zu schreiben, unabhängig von den Manifestwerten"</string> <string name="force_resizable_activities" msgid="8615764378147824985">"Anpassen der Größe von Aktivitäten erzwingen"</string> diff --git a/packages/SettingsLib/res/values-el/strings.xml b/packages/SettingsLib/res/values-el/strings.xml index 24d3bf4c2ca2..cde206669b31 100644 --- a/packages/SettingsLib/res/values-el/strings.xml +++ b/packages/SettingsLib/res/values-el/strings.xml @@ -272,6 +272,10 @@ <string name="app_process_limit_title" msgid="4280600650253107163">"Όριο διεργασ. παρασκηνίου"</string> <string name="show_all_anrs" msgid="28462979638729082">"Εμφάνιση όλων των ANR"</string> <string name="show_all_anrs_summary" msgid="641908614413544127">"Εμφ.του παραθ. \"Η εφαρμ.δεν αποκρ.\" για εφ.παρασκ."</string> + <!-- no translation found for show_notification_channel_warnings (1399948193466922683) --> + <skip /> + <!-- no translation found for show_notification_channel_warnings_summary (5536803251863694895) --> + <skip /> <string name="force_allow_on_external" msgid="3215759785081916381">"Να επιτρέπονται υποχρεωτικά εφαρμογές σε εξωτ.συσ."</string> <string name="force_allow_on_external_summary" msgid="3640752408258034689">"Κάνει κάθε εφαρμογή κατάλληλη για εγγραφή σε εξωτερικό αποθηκευτικό χώρο, ανεξάρτητα από τις τιμές του μανιφέστου"</string> <string name="force_resizable_activities" msgid="8615764378147824985">"Αναγκαστική δυνατότητα αλλαγής μεγέθους δραστηριοτήτων"</string> diff --git a/packages/SettingsLib/res/values-en-rAU/strings.xml b/packages/SettingsLib/res/values-en-rAU/strings.xml index 6b9daf7b7085..b25254575d7c 100644 --- a/packages/SettingsLib/res/values-en-rAU/strings.xml +++ b/packages/SettingsLib/res/values-en-rAU/strings.xml @@ -272,6 +272,10 @@ <string name="app_process_limit_title" msgid="4280600650253107163">"Background process limit"</string> <string name="show_all_anrs" msgid="28462979638729082">"Show all ANRs"</string> <string name="show_all_anrs_summary" msgid="641908614413544127">"Show App Not Responding dialogue for background apps"</string> + <!-- no translation found for show_notification_channel_warnings (1399948193466922683) --> + <skip /> + <!-- no translation found for show_notification_channel_warnings_summary (5536803251863694895) --> + <skip /> <string name="force_allow_on_external" msgid="3215759785081916381">"Force allow apps on external"</string> <string name="force_allow_on_external_summary" msgid="3640752408258034689">"Makes any app eligible to be written to external storage, regardless of manifest values"</string> <string name="force_resizable_activities" msgid="8615764378147824985">"Force activities to be re-sizable"</string> diff --git a/packages/SettingsLib/res/values-en-rGB/strings.xml b/packages/SettingsLib/res/values-en-rGB/strings.xml index 6b9daf7b7085..b25254575d7c 100644 --- a/packages/SettingsLib/res/values-en-rGB/strings.xml +++ b/packages/SettingsLib/res/values-en-rGB/strings.xml @@ -272,6 +272,10 @@ <string name="app_process_limit_title" msgid="4280600650253107163">"Background process limit"</string> <string name="show_all_anrs" msgid="28462979638729082">"Show all ANRs"</string> <string name="show_all_anrs_summary" msgid="641908614413544127">"Show App Not Responding dialogue for background apps"</string> + <!-- no translation found for show_notification_channel_warnings (1399948193466922683) --> + <skip /> + <!-- no translation found for show_notification_channel_warnings_summary (5536803251863694895) --> + <skip /> <string name="force_allow_on_external" msgid="3215759785081916381">"Force allow apps on external"</string> <string name="force_allow_on_external_summary" msgid="3640752408258034689">"Makes any app eligible to be written to external storage, regardless of manifest values"</string> <string name="force_resizable_activities" msgid="8615764378147824985">"Force activities to be re-sizable"</string> diff --git a/packages/SettingsLib/res/values-en-rIN/strings.xml b/packages/SettingsLib/res/values-en-rIN/strings.xml index 6b9daf7b7085..b25254575d7c 100644 --- a/packages/SettingsLib/res/values-en-rIN/strings.xml +++ b/packages/SettingsLib/res/values-en-rIN/strings.xml @@ -272,6 +272,10 @@ <string name="app_process_limit_title" msgid="4280600650253107163">"Background process limit"</string> <string name="show_all_anrs" msgid="28462979638729082">"Show all ANRs"</string> <string name="show_all_anrs_summary" msgid="641908614413544127">"Show App Not Responding dialogue for background apps"</string> + <!-- no translation found for show_notification_channel_warnings (1399948193466922683) --> + <skip /> + <!-- no translation found for show_notification_channel_warnings_summary (5536803251863694895) --> + <skip /> <string name="force_allow_on_external" msgid="3215759785081916381">"Force allow apps on external"</string> <string name="force_allow_on_external_summary" msgid="3640752408258034689">"Makes any app eligible to be written to external storage, regardless of manifest values"</string> <string name="force_resizable_activities" msgid="8615764378147824985">"Force activities to be re-sizable"</string> diff --git a/packages/SettingsLib/res/values-es-rUS/strings.xml b/packages/SettingsLib/res/values-es-rUS/strings.xml index 1464d442533c..03d8cea9b160 100644 --- a/packages/SettingsLib/res/values-es-rUS/strings.xml +++ b/packages/SettingsLib/res/values-es-rUS/strings.xml @@ -272,6 +272,10 @@ <string name="app_process_limit_title" msgid="4280600650253107163">"Límite de procesos en segundo plano"</string> <string name="show_all_anrs" msgid="28462979638729082">"Errores sin respuesta"</string> <string name="show_all_anrs_summary" msgid="641908614413544127">"Mostrar diálogo cuando las aplic. en 2do plano no responden"</string> + <!-- no translation found for show_notification_channel_warnings (1399948193466922683) --> + <skip /> + <!-- no translation found for show_notification_channel_warnings_summary (5536803251863694895) --> + <skip /> <string name="force_allow_on_external" msgid="3215759785081916381">"Forzar permisos en almacenamiento externo"</string> <string name="force_allow_on_external_summary" msgid="3640752408258034689">"Cualquier app puede escribirse en un almacenamiento externo, sin importar los valores del manifiesto"</string> <string name="force_resizable_activities" msgid="8615764378147824985">"Forzar actividades para que cambien de tamaño"</string> diff --git a/packages/SettingsLib/res/values-es/strings.xml b/packages/SettingsLib/res/values-es/strings.xml index 39d4a7609bda..00dbf9c86df3 100644 --- a/packages/SettingsLib/res/values-es/strings.xml +++ b/packages/SettingsLib/res/values-es/strings.xml @@ -272,6 +272,10 @@ <string name="app_process_limit_title" msgid="4280600650253107163">"Límitar procesos en segundo plano"</string> <string name="show_all_anrs" msgid="28462979638729082">"Errores sin respuesta"</string> <string name="show_all_anrs_summary" msgid="641908614413544127">"Informar de que una aplicación en segundo plano no responde"</string> + <!-- no translation found for show_notification_channel_warnings (1399948193466922683) --> + <skip /> + <!-- no translation found for show_notification_channel_warnings_summary (5536803251863694895) --> + <skip /> <string name="force_allow_on_external" msgid="3215759785081916381">"Forzar permiso de aplicaciones de forma externa"</string> <string name="force_allow_on_external_summary" msgid="3640752408258034689">"Hace que cualquier aplicación se pueda escribir en un dispositivo de almacenamiento externo, independientemente de los valores definidos"</string> <string name="force_resizable_activities" msgid="8615764378147824985">"Forzar el ajuste de tamaño de las actividades"</string> diff --git a/packages/SettingsLib/res/values-et/strings.xml b/packages/SettingsLib/res/values-et/strings.xml index 36d19effba1c..4d0f5f653a18 100644 --- a/packages/SettingsLib/res/values-et/strings.xml +++ b/packages/SettingsLib/res/values-et/strings.xml @@ -272,6 +272,10 @@ <string name="app_process_limit_title" msgid="4280600650253107163">"Taustaprotsesside piir"</string> <string name="show_all_anrs" msgid="28462979638729082">"Näita kõiki ANR-e"</string> <string name="show_all_anrs_summary" msgid="641908614413544127">"Kuva taustarakendustele dial. Rakendus ei reageeri"</string> + <!-- no translation found for show_notification_channel_warnings (1399948193466922683) --> + <skip /> + <!-- no translation found for show_notification_channel_warnings_summary (5536803251863694895) --> + <skip /> <string name="force_allow_on_external" msgid="3215759785081916381">"Luba rakendused välises salvestusruumis"</string> <string name="force_allow_on_external_summary" msgid="3640752408258034689">"Lubab mis tahes rakendusi kirjutada välisesse salvestusruumi manifesti väärtustest olenemata"</string> <string name="force_resizable_activities" msgid="8615764378147824985">"Muuda tegevuste suurused muudetavaks"</string> diff --git a/packages/SettingsLib/res/values-eu/strings.xml b/packages/SettingsLib/res/values-eu/strings.xml index fd20d47eecb9..6ed2d75af9f5 100644 --- a/packages/SettingsLib/res/values-eu/strings.xml +++ b/packages/SettingsLib/res/values-eu/strings.xml @@ -272,6 +272,10 @@ <string name="app_process_limit_title" msgid="4280600650253107163">"Atzeko planoko prozesuen muga"</string> <string name="show_all_anrs" msgid="28462979638729082">"Erakutsi ANR guztiak"</string> <string name="show_all_anrs_summary" msgid="641908614413544127">"\"Erantzunik ez\" mezua atz. planoko aplikazioetarako"</string> + <!-- no translation found for show_notification_channel_warnings (1399948193466922683) --> + <skip /> + <!-- no translation found for show_notification_channel_warnings_summary (5536803251863694895) --> + <skip /> <string name="force_allow_on_external" msgid="3215759785081916381">"Behartu aplikazioak onartzea kanpoko biltegian"</string> <string name="force_allow_on_external_summary" msgid="3640752408258034689">"Aplikazioek kanpoko memorian idatz dezakete, manifestuaren balioak kontuan izan gabe"</string> <string name="force_resizable_activities" msgid="8615764378147824985">"Behartu jardueren tamaina doitu ahal izatea"</string> diff --git a/packages/SettingsLib/res/values-fa/strings.xml b/packages/SettingsLib/res/values-fa/strings.xml index 65fe22ca14af..bb10b381d508 100644 --- a/packages/SettingsLib/res/values-fa/strings.xml +++ b/packages/SettingsLib/res/values-fa/strings.xml @@ -272,6 +272,10 @@ <string name="app_process_limit_title" msgid="4280600650253107163">"محدودیت پردازش در پسزمینه"</string> <string name="show_all_anrs" msgid="28462979638729082">"نمایش تمام ANRها"</string> <string name="show_all_anrs_summary" msgid="641908614413544127">"نمایش گفتگوی \"برنامه پاسخ نمیدهد\" برای برنامههای پسزمینه"</string> + <!-- no translation found for show_notification_channel_warnings (1399948193466922683) --> + <skip /> + <!-- no translation found for show_notification_channel_warnings_summary (5536803251863694895) --> + <skip /> <string name="force_allow_on_external" msgid="3215759785081916381">"اجازه اجباری به برنامههای دستگاه ذخیره خارجی"</string> <string name="force_allow_on_external_summary" msgid="3640752408258034689">"بدون توجه به مقادیر مانیفست، هر برنامهای را برای نوشتن در حافظه خارجی واجد شرایط میکند"</string> <string name="force_resizable_activities" msgid="8615764378147824985">"اجبار فعالیتها به قابل تغییر اندازه بودن"</string> diff --git a/packages/SettingsLib/res/values-fi/strings.xml b/packages/SettingsLib/res/values-fi/strings.xml index d306e2300dbd..7dd2e5837bc4 100644 --- a/packages/SettingsLib/res/values-fi/strings.xml +++ b/packages/SettingsLib/res/values-fi/strings.xml @@ -272,6 +272,10 @@ <string name="app_process_limit_title" msgid="4280600650253107163">"Taustaprosessi"</string> <string name="show_all_anrs" msgid="28462979638729082">"Näytä kaikki ANR:t"</string> <string name="show_all_anrs_summary" msgid="641908614413544127">"Näytä Sovellus ei vastaa -ikkuna taustasovell."</string> + <!-- no translation found for show_notification_channel_warnings (1399948193466922683) --> + <skip /> + <!-- no translation found for show_notification_channel_warnings_summary (5536803251863694895) --> + <skip /> <string name="force_allow_on_external" msgid="3215759785081916381">"Salli aina ulkoinen tallennus"</string> <string name="force_allow_on_external_summary" msgid="3640752408258034689">"Mahdollistaa sovelluksen tietojen tallentamisen ulkoiseen tallennustilaan luetteloarvoista riippumatta."</string> <string name="force_resizable_activities" msgid="8615764378147824985">"Pakota kaikki toiminnot hyväksymään koon muutos"</string> diff --git a/packages/SettingsLib/res/values-fr-rCA/strings.xml b/packages/SettingsLib/res/values-fr-rCA/strings.xml index f85158105793..5641d7c576b1 100644 --- a/packages/SettingsLib/res/values-fr-rCA/strings.xml +++ b/packages/SettingsLib/res/values-fr-rCA/strings.xml @@ -272,6 +272,10 @@ <string name="app_process_limit_title" msgid="4280600650253107163">"Limite processus arr.-plan"</string> <string name="show_all_anrs" msgid="28462979638729082">"Afficher tous les messages «L\'application ne répond pas»"</string> <string name="show_all_anrs_summary" msgid="641908614413544127">"Afficher « L\'application ne répond plus » pour applis en arrière-plan"</string> + <!-- no translation found for show_notification_channel_warnings (1399948193466922683) --> + <skip /> + <!-- no translation found for show_notification_channel_warnings_summary (5536803251863694895) --> + <skip /> <string name="force_allow_on_external" msgid="3215759785081916381">"Forcer l\'autor. d\'applis sur stockage externe"</string> <string name="force_allow_on_external_summary" msgid="3640752408258034689">"Rend possible l\'enregistrement de toute application sur un espace de stockage externe, indépendamment des valeurs du fichier manifeste"</string> <string name="force_resizable_activities" msgid="8615764378147824985">"Forcer les activités à être redimensionnables"</string> diff --git a/packages/SettingsLib/res/values-fr/strings.xml b/packages/SettingsLib/res/values-fr/strings.xml index c69f3243797f..b0b532f555a8 100644 --- a/packages/SettingsLib/res/values-fr/strings.xml +++ b/packages/SettingsLib/res/values-fr/strings.xml @@ -272,6 +272,10 @@ <string name="app_process_limit_title" msgid="4280600650253107163">"Limite processus arr.-plan"</string> <string name="show_all_anrs" msgid="28462979638729082">"Afficher tous les messages ANR"</string> <string name="show_all_anrs_summary" msgid="641908614413544127">"Afficher \"L\'application ne répond plus\" pour applis en arrière-plan"</string> + <!-- no translation found for show_notification_channel_warnings (1399948193466922683) --> + <skip /> + <!-- no translation found for show_notification_channel_warnings_summary (5536803251863694895) --> + <skip /> <string name="force_allow_on_external" msgid="3215759785081916381">"Forcer disponibilité stockage externe pour applis"</string> <string name="force_allow_on_external_summary" msgid="3640752408258034689">"Rend possible l\'enregistrement de toute application sur un espace de stockage externe, indépendamment des valeurs du fichier manifeste."</string> <string name="force_resizable_activities" msgid="8615764378147824985">"Forcer possibilité de redimensionner les activités"</string> diff --git a/packages/SettingsLib/res/values-gl/strings.xml b/packages/SettingsLib/res/values-gl/strings.xml index 399199da74c2..81a1ca943133 100644 --- a/packages/SettingsLib/res/values-gl/strings.xml +++ b/packages/SettingsLib/res/values-gl/strings.xml @@ -272,6 +272,10 @@ <string name="app_process_limit_title" msgid="4280600650253107163">"Límite proceso 2º plano"</string> <string name="show_all_anrs" msgid="28462979638729082">"Mostrar todos os ANR"</string> <string name="show_all_anrs_summary" msgid="641908614413544127">"Informa que aplicación segundo plano non responde"</string> + <!-- no translation found for show_notification_channel_warnings (1399948193466922683) --> + <skip /> + <!-- no translation found for show_notification_channel_warnings_summary (5536803251863694895) --> + <skip /> <string name="force_allow_on_external" msgid="3215759785081916381">"Forzar permiso de aplicacións de forma externa"</string> <string name="force_allow_on_external_summary" msgid="3640752408258034689">"Permite que calquera aplicación apta se poida escribir nun almacenamento externo, independentemente dos valores expresados"</string> <string name="force_resizable_activities" msgid="8615764378147824985">"Forzar o axuste do tamaño das actividades"</string> diff --git a/packages/SettingsLib/res/values-gu/strings.xml b/packages/SettingsLib/res/values-gu/strings.xml index df9eda94154c..e4e1507d79ef 100644 --- a/packages/SettingsLib/res/values-gu/strings.xml +++ b/packages/SettingsLib/res/values-gu/strings.xml @@ -272,6 +272,10 @@ <string name="app_process_limit_title" msgid="4280600650253107163">"પૃષ્ઠભૂમિ પ્રક્રિયા સીમા"</string> <string name="show_all_anrs" msgid="28462979638729082">"બધા ANR બતાવો"</string> <string name="show_all_anrs_summary" msgid="641908614413544127">"પૃષ્ઠભૂમિ ઍપ્લિકેશનો માટે ઍપ્લિકેશન પ્રતિસાદ આપતી નથી સંવાદ બતાવો"</string> + <!-- no translation found for show_notification_channel_warnings (1399948193466922683) --> + <skip /> + <!-- no translation found for show_notification_channel_warnings_summary (5536803251863694895) --> + <skip /> <string name="force_allow_on_external" msgid="3215759785081916381">"બાહ્ય પર એપ્લિકેશનોને મંજૂરી આપવાની ફરજ પાડો"</string> <string name="force_allow_on_external_summary" msgid="3640752408258034689">"મેનિફેસ્ટ મૂલ્યોને ધ્યાનમાં લીધા સિવાય, કોઈપણ ઍપ્લિકેશનને બાહ્ય સ્ટોરેજ પર લખાવા માટે લાયક બનાવે છે"</string> <string name="force_resizable_activities" msgid="8615764378147824985">"પ્રવૃત્તિઓને ફરીથી કદ યોગ્ય થવા માટે ફરજ પાડો"</string> diff --git a/packages/SettingsLib/res/values-hi/strings.xml b/packages/SettingsLib/res/values-hi/strings.xml index c729027623ae..936e7755df8d 100644 --- a/packages/SettingsLib/res/values-hi/strings.xml +++ b/packages/SettingsLib/res/values-hi/strings.xml @@ -272,6 +272,10 @@ <string name="app_process_limit_title" msgid="4280600650253107163">"पृष्ठभूमि प्रक्रिया सीमा"</string> <string name="show_all_anrs" msgid="28462979638729082">"सभी ANR दिखाएं"</string> <string name="show_all_anrs_summary" msgid="641908614413544127">"पृष्ठभूमि ऐप्स के लिए ऐप्स प्रतिसाद नहीं दे रहा डॉयलॉग दिखाएं"</string> + <!-- no translation found for show_notification_channel_warnings (1399948193466922683) --> + <skip /> + <!-- no translation found for show_notification_channel_warnings_summary (5536803251863694895) --> + <skip /> <string name="force_allow_on_external" msgid="3215759785081916381">"ऐप्स को बाहरी मेमोरी पर बाध्य करें"</string> <string name="force_allow_on_external_summary" msgid="3640752408258034689">"इससे कोई भी ऐप्लिकेशन, मेनिफेस्ट मानों को अनदेखा करके, बाहरी मेमोरी पर लिखने योग्य बन जाता है"</string> <string name="force_resizable_activities" msgid="8615764378147824985">"आकार बदले जाने के लिए गतिविधियों को बाध्य करें"</string> diff --git a/packages/SettingsLib/res/values-hr/strings.xml b/packages/SettingsLib/res/values-hr/strings.xml index e94b6df09c50..be4ac19cd35d 100644 --- a/packages/SettingsLib/res/values-hr/strings.xml +++ b/packages/SettingsLib/res/values-hr/strings.xml @@ -272,6 +272,10 @@ <string name="app_process_limit_title" msgid="4280600650253107163">"Ograničenje pozadinskog procesa"</string> <string name="show_all_anrs" msgid="28462979638729082">"Prikaži sve ANR-ove"</string> <string name="show_all_anrs_summary" msgid="641908614413544127">"Prikaz dijaloga o pozad. aplik. koja ne odgovara"</string> + <!-- no translation found for show_notification_channel_warnings (1399948193466922683) --> + <skip /> + <!-- no translation found for show_notification_channel_warnings_summary (5536803251863694895) --> + <skip /> <string name="force_allow_on_external" msgid="3215759785081916381">"Prisilno dopusti aplikacije u vanjskoj pohrani"</string> <string name="force_allow_on_external_summary" msgid="3640752408258034689">"Aplikacije se mogu zapisivati u vanjsku pohranu neovisno o vrijednostima manifesta"</string> <string name="force_resizable_activities" msgid="8615764378147824985">"Nametni mogućnost promjene veličine za aktivnosti"</string> diff --git a/packages/SettingsLib/res/values-hu/strings.xml b/packages/SettingsLib/res/values-hu/strings.xml index d06417f38375..b791178bcfc1 100644 --- a/packages/SettingsLib/res/values-hu/strings.xml +++ b/packages/SettingsLib/res/values-hu/strings.xml @@ -272,6 +272,10 @@ <string name="app_process_limit_title" msgid="4280600650253107163">"Háttérfolyamat-korlátozás"</string> <string name="show_all_anrs" msgid="28462979638729082">"Összes ANR mutatása"</string> <string name="show_all_anrs_summary" msgid="641908614413544127">"Az Alkalmazás nem válaszol ablak megjelenítése"</string> + <!-- no translation found for show_notification_channel_warnings (1399948193466922683) --> + <skip /> + <!-- no translation found for show_notification_channel_warnings_summary (5536803251863694895) --> + <skip /> <string name="force_allow_on_external" msgid="3215759785081916381">"Külső tárhely alkalmazásainak engedélyezése"</string> <string name="force_allow_on_external_summary" msgid="3640752408258034689">"Lehetővé teszi bármely alkalmazás külső tárhelyre való írását a jegyzékértékektől függetlenül"</string> <string name="force_resizable_activities" msgid="8615764378147824985">"Tevékenységek átméretezésének kényszerítése"</string> diff --git a/packages/SettingsLib/res/values-hy/strings.xml b/packages/SettingsLib/res/values-hy/strings.xml index 8dd85c3c80e4..da34cccd2af9 100644 --- a/packages/SettingsLib/res/values-hy/strings.xml +++ b/packages/SettingsLib/res/values-hy/strings.xml @@ -91,11 +91,11 @@ <string name="process_kernel_label" msgid="3916858646836739323">"Android OS"</string> <string name="data_usage_uninstalled_apps" msgid="614263770923231598">"Հեռացված ծրագրեր"</string> <string name="data_usage_uninstalled_apps_users" msgid="7986294489899813194">"Հեռացված հավելվածներն ու օգտատերերը"</string> - <string name="tether_settings_title_usb" msgid="6688416425801386511">"USB միացում"</string> + <string name="tether_settings_title_usb" msgid="6688416425801386511">"USB մոդեմ"</string> <string name="tether_settings_title_wifi" msgid="3277144155960302049">"Դյուրակիր թեժ կետ"</string> - <string name="tether_settings_title_bluetooth" msgid="355855408317564420">"Bluetooth-ը կապվում է"</string> - <string name="tether_settings_title_usb_bluetooth" msgid="5355828977109785001">"Միացում"</string> - <string name="tether_settings_title_all" msgid="8356136101061143841">"Միացում և շարժական թեժ կետ"</string> + <string name="tether_settings_title_bluetooth" msgid="355855408317564420">"Bluetooth մոդեմ"</string> + <string name="tether_settings_title_usb_bluetooth" msgid="5355828977109785001">"Մոդեմի ռեժիմ"</string> + <string name="tether_settings_title_all" msgid="8356136101061143841">"Մոդեմի ռեժիմ"</string> <string name="managed_user_title" msgid="8109605045406748842">"Բոլոր աշխատանքային հավելվածները"</string> <string name="user_guest" msgid="8475274842845401871">"Հյուր"</string> <string name="unknown" msgid="1592123443519355854">"Անհայտ"</string> @@ -149,7 +149,7 @@ <string name="development_settings_summary" msgid="1815795401632854041">"Կարգավորել ընտրանքները ծրագրի ծրագրավորման համար"</string> <string name="development_settings_not_available" msgid="4308569041701535607">"Ծրագրավորման ընտրանքներն այլևս հասանելի չեն այս օգտատիրոջ"</string> <string name="vpn_settings_not_available" msgid="956841430176985598">"VPN-ի կարգավորումները հասանելի չեն այս օգտատիրոջը"</string> - <string name="tethering_settings_not_available" msgid="6765770438438291012">"Միակցման կարգավորումները հասանելի չեն այս օգտատիրոջը"</string> + <string name="tethering_settings_not_available" msgid="6765770438438291012">"Այս օգտատերը չի կարող փոխել մոդեմի ռեժիմի կարգավորումները"</string> <string name="apn_settings_not_available" msgid="7873729032165324000">"Մատչման կետի անվան կարգավորումները հասանելի չեն այս օգտատիրոջը"</string> <string name="enable_adb" msgid="7982306934419797485">"USB վրիպազերծում"</string> <string name="enable_adb_summary" msgid="4881186971746056635">"Կարգաբերել ռեժիմը, երբ USB-ն միացված է"</string> @@ -272,6 +272,10 @@ <string name="app_process_limit_title" msgid="4280600650253107163">"Հետնաշերտի գործընթացի սահմանաչափ"</string> <string name="show_all_anrs" msgid="28462979638729082">"Ցույց տալ բոլոր ANR-երը"</string> <string name="show_all_anrs_summary" msgid="641908614413544127">"Ցուցադրել այն ծրագիրը, որը չի արձագանքում երկխոսությունը հետնաշերտի ծրագրերի համար"</string> + <!-- no translation found for show_notification_channel_warnings (1399948193466922683) --> + <skip /> + <!-- no translation found for show_notification_channel_warnings_summary (5536803251863694895) --> + <skip /> <string name="force_allow_on_external" msgid="3215759785081916381">"Միշտ թույլատրել ծրագրեր արտաքին պահեստում"</string> <string name="force_allow_on_external_summary" msgid="3640752408258034689">"Թույլ է տալիս ցանկացած հավելված պահել արտաքին սարքում՝ մանիֆեստի արժեքներից անկախ"</string> <string name="force_resizable_activities" msgid="8615764378147824985">"Ստիպել, որ ակտիվությունների չափերը լինեն փոփոխելի"</string> diff --git a/packages/SettingsLib/res/values-in/strings.xml b/packages/SettingsLib/res/values-in/strings.xml index 9e7355beddc6..13407fe79c48 100644 --- a/packages/SettingsLib/res/values-in/strings.xml +++ b/packages/SettingsLib/res/values-in/strings.xml @@ -272,6 +272,10 @@ <string name="app_process_limit_title" msgid="4280600650253107163">"Batas proses latar blkg"</string> <string name="show_all_anrs" msgid="28462979638729082">"Tampilkan semua ANR"</string> <string name="show_all_anrs_summary" msgid="641908614413544127">"Tmplkn dialog Apl Tidak Merespons utk apl ltr blkg"</string> + <!-- no translation found for show_notification_channel_warnings (1399948193466922683) --> + <skip /> + <!-- no translation found for show_notification_channel_warnings_summary (5536803251863694895) --> + <skip /> <string name="force_allow_on_external" msgid="3215759785081916381">"Paksa izinkan aplikasi di eksternal"</string> <string name="force_allow_on_external_summary" msgid="3640752408258034689">"Membuat semua aplikasi dapat ditulis ke penyimpanan eksternal, terlepas dari nilai manifes"</string> <string name="force_resizable_activities" msgid="8615764378147824985">"Paksa aktivitas agar ukurannya dapat diubah"</string> diff --git a/packages/SettingsLib/res/values-is/strings.xml b/packages/SettingsLib/res/values-is/strings.xml index d4fde8a1796e..6457e71306a6 100644 --- a/packages/SettingsLib/res/values-is/strings.xml +++ b/packages/SettingsLib/res/values-is/strings.xml @@ -272,6 +272,10 @@ <string name="app_process_limit_title" msgid="4280600650253107163">"Takmörkun á bakgrunnsvinnslum"</string> <string name="show_all_anrs" msgid="28462979638729082">"Öll forrit sem svara ekki"</string> <string name="show_all_anrs_summary" msgid="641908614413544127">"Sýna „Forrit svarar ekki“ fyrir bakgrunnsforrit"</string> + <!-- no translation found for show_notification_channel_warnings (1399948193466922683) --> + <skip /> + <!-- no translation found for show_notification_channel_warnings_summary (5536803251863694895) --> + <skip /> <string name="force_allow_on_external" msgid="3215759785081916381">"Þvinga fram leyfi forrita í ytri geymslu"</string> <string name="force_allow_on_external_summary" msgid="3640752408258034689">"Gerir öll forrit skrifanleg í ytra geymslurými, óháð gildum í upplýsingaskrá"</string> <string name="force_resizable_activities" msgid="8615764378147824985">"Þvinga breytanlega stærð virkni"</string> diff --git a/packages/SettingsLib/res/values-it/strings.xml b/packages/SettingsLib/res/values-it/strings.xml index 0ebe77e54991..518273018044 100644 --- a/packages/SettingsLib/res/values-it/strings.xml +++ b/packages/SettingsLib/res/values-it/strings.xml @@ -272,6 +272,10 @@ <string name="app_process_limit_title" msgid="4280600650253107163">"Limite processi background"</string> <string name="show_all_anrs" msgid="28462979638729082">"Mostra tutti errori ANR"</string> <string name="show_all_anrs_summary" msgid="641908614413544127">"Mostra finestra ANR per applicazioni in background"</string> + <!-- no translation found for show_notification_channel_warnings (1399948193466922683) --> + <skip /> + <!-- no translation found for show_notification_channel_warnings_summary (5536803251863694895) --> + <skip /> <string name="force_allow_on_external" msgid="3215759785081916381">"Forza autorizzazione app su memoria esterna"</string> <string name="force_allow_on_external_summary" msgid="3640752408258034689">"Consente l\'installazione di qualsiasi app su memoria esterna, indipendentemente dai valori manifest"</string> <string name="force_resizable_activities" msgid="8615764378147824985">"Imponi formato modificabile alle attività"</string> diff --git a/packages/SettingsLib/res/values-iw/strings.xml b/packages/SettingsLib/res/values-iw/strings.xml index 182d819d1991..249fac472996 100644 --- a/packages/SettingsLib/res/values-iw/strings.xml +++ b/packages/SettingsLib/res/values-iw/strings.xml @@ -272,6 +272,10 @@ <string name="app_process_limit_title" msgid="4280600650253107163">"מגבלה של תהליכים ברקע"</string> <string name="show_all_anrs" msgid="28462979638729082">"הצג את כל פריטי ה-ANR"</string> <string name="show_all_anrs_summary" msgid="641908614413544127">"הצג תיבת דו-שיח של \'אפליקציה לא מגיבה\' עבור אפליקציות שפועלות ברקע"</string> + <!-- no translation found for show_notification_channel_warnings (1399948193466922683) --> + <skip /> + <!-- no translation found for show_notification_channel_warnings_summary (5536803251863694895) --> + <skip /> <string name="force_allow_on_external" msgid="3215759785081916381">"אילוץ הרשאת אפליקציות באחסון חיצוני"</string> <string name="force_allow_on_external_summary" msgid="3640752408258034689">"מאפשר כתיבה של כל אפליקציה באחסון חיצוני, ללא התחשבות בערכי המניפסט"</string> <string name="force_resizable_activities" msgid="8615764378147824985">"אלץ יכולת קביעת גודל של הפעילויות"</string> diff --git a/packages/SettingsLib/res/values-ja/strings.xml b/packages/SettingsLib/res/values-ja/strings.xml index 440b04d8d120..8837e9734d3e 100644 --- a/packages/SettingsLib/res/values-ja/strings.xml +++ b/packages/SettingsLib/res/values-ja/strings.xml @@ -272,6 +272,10 @@ <string name="app_process_limit_title" msgid="4280600650253107163">"バックグラウンドプロセスの上限"</string> <string name="show_all_anrs" msgid="28462979638729082">"すべてのANRを表示"</string> <string name="show_all_anrs_summary" msgid="641908614413544127">"バックグラウンドアプリが応答しない場合に通知する"</string> + <!-- no translation found for show_notification_channel_warnings (1399948193466922683) --> + <skip /> + <!-- no translation found for show_notification_channel_warnings_summary (5536803251863694895) --> + <skip /> <string name="force_allow_on_external" msgid="3215759785081916381">"外部ストレージへのアプリの書き込みを許可"</string> <string name="force_allow_on_external_summary" msgid="3640752408258034689">"マニフェストの値に関係なく、すべてのアプリを外部ストレージに書き込めるようになります"</string> <string name="force_resizable_activities" msgid="8615764378147824985">"アクティビティをサイズ変更可能にする"</string> diff --git a/packages/SettingsLib/res/values-ka/strings.xml b/packages/SettingsLib/res/values-ka/strings.xml index 08e644950e22..81416a0ae0b2 100644 --- a/packages/SettingsLib/res/values-ka/strings.xml +++ b/packages/SettingsLib/res/values-ka/strings.xml @@ -272,6 +272,10 @@ <string name="app_process_limit_title" msgid="4280600650253107163">"ფონური პროცესების ლიმიტი"</string> <string name="show_all_anrs" msgid="28462979638729082">"ყველა ANR-ის ჩვენება"</string> <string name="show_all_anrs_summary" msgid="641908614413544127">"შეტყობინების ჩვენება, როცა ფონური აპლიკაცია არ პასუხობს"</string> + <!-- no translation found for show_notification_channel_warnings (1399948193466922683) --> + <skip /> + <!-- no translation found for show_notification_channel_warnings_summary (5536803251863694895) --> + <skip /> <string name="force_allow_on_external" msgid="3215759785081916381">"აპების დაშვება გარე მეხსიერებაში"</string> <string name="force_allow_on_external_summary" msgid="3640752408258034689">"აპები ჩაიწერება გარე მეხსიერებაზე აღწერის ფაილების მნიშვნელობების მიუხედავად"</string> <string name="force_resizable_activities" msgid="8615764378147824985">"ზომაცვლადი აქტივობების იძულება"</string> diff --git a/packages/SettingsLib/res/values-kk/strings.xml b/packages/SettingsLib/res/values-kk/strings.xml index cc8b6624a90a..66b4a0e2cb51 100644 --- a/packages/SettingsLib/res/values-kk/strings.xml +++ b/packages/SettingsLib/res/values-kk/strings.xml @@ -272,6 +272,10 @@ <string name="app_process_limit_title" msgid="4280600650253107163">"Фондық үрдіс шектеуі"</string> <string name="show_all_anrs" msgid="28462979638729082">"Барлық ANR (қолданба жауап бермеді) хабарларын көрсетіңіз"</string> <string name="show_all_anrs_summary" msgid="641908614413544127">"Фондық қолданбалардың жауап бермегенін көрсету"</string> + <!-- no translation found for show_notification_channel_warnings (1399948193466922683) --> + <skip /> + <!-- no translation found for show_notification_channel_warnings_summary (5536803251863694895) --> + <skip /> <string name="force_allow_on_external" msgid="3215759785081916381">"Сыртқыда қолданбаларға мәжбүрлеп рұқсат ету"</string> <string name="force_allow_on_external_summary" msgid="3640752408258034689">"Манифест мәндеріне қарамастан кез келген қолданбаны сыртқы жадқа жазуға жарамды етеді"</string> <string name="force_resizable_activities" msgid="8615764378147824985">"Әрекеттерді өлшемін өзгертуге болатын етуге мәжбүрлеу"</string> diff --git a/packages/SettingsLib/res/values-km/strings.xml b/packages/SettingsLib/res/values-km/strings.xml index 917415cac630..1adc4320dc4a 100644 --- a/packages/SettingsLib/res/values-km/strings.xml +++ b/packages/SettingsLib/res/values-km/strings.xml @@ -272,6 +272,10 @@ <string name="app_process_limit_title" msgid="4280600650253107163">"ដែនកំណត់ដំណើរការក្នុងផ្ទៃខាងក្រោយ"</string> <string name="show_all_anrs" msgid="28462979638729082">"បង្ហាញ ANRs ទាំងអស់"</string> <string name="show_all_anrs_summary" msgid="641908614413544127">"បង្ហាញប្រអប់កម្មវិធីមិនឆ្លើយតបសម្រាប់កម្មវិធីផ្ទៃខាងក្រោយ"</string> + <!-- no translation found for show_notification_channel_warnings (1399948193466922683) --> + <skip /> + <!-- no translation found for show_notification_channel_warnings_summary (5536803251863694895) --> + <skip /> <string name="force_allow_on_external" msgid="3215759785081916381">"បង្ខំឲ្យអនុញ្ញាតកម្មវិធីលើឧបករណ៍ផ្ទុកខាងក្រៅ"</string> <string name="force_allow_on_external_summary" msgid="3640752408258034689">"ធ្វើឲ្យកម្មវិធីទាំងឡាយមានសិទ្ធិសរសេរទៅកាន់ឧបករណ៍ផ្ទុកខាងក្រៅ ដោយមិនគិតពីតម្លៃជាក់លាក់"</string> <string name="force_resizable_activities" msgid="8615764378147824985">"បង្ខំឲ្យសកម្មភាពអាចប្តូរទំហំបាន"</string> diff --git a/packages/SettingsLib/res/values-kn/strings.xml b/packages/SettingsLib/res/values-kn/strings.xml index 0120658ab35f..c545da7d0098 100644 --- a/packages/SettingsLib/res/values-kn/strings.xml +++ b/packages/SettingsLib/res/values-kn/strings.xml @@ -272,6 +272,10 @@ <string name="app_process_limit_title" msgid="4280600650253107163">"ಹಿನ್ನೆಲೆ ಪ್ರಕ್ರಿಯೆ ಮಿತಿ"</string> <string name="show_all_anrs" msgid="28462979638729082">"ಎಲ್ಲ ANR ಗಳನ್ನು ತೋರಿಸು"</string> <string name="show_all_anrs_summary" msgid="641908614413544127">"ಹಿನ್ನೆಲೆ ಅಪ್ಲಿಕೇಶನ್ಗಳಿಗಾಗಿ ಅಪ್ಲಿಕೇಶನ್ ಪ್ರತಿಕ್ರಿಯಿಸುತ್ತಿಲ್ಲ ಎಂಬ ಸಂಭಾಷಣೆ ತೋರಿಸು"</string> + <!-- no translation found for show_notification_channel_warnings (1399948193466922683) --> + <skip /> + <!-- no translation found for show_notification_channel_warnings_summary (5536803251863694895) --> + <skip /> <string name="force_allow_on_external" msgid="3215759785081916381">"ಬಾಹ್ಯವಾಗಿ ಅಪ್ಲಿಕೇಶನ್ಗಳನ್ನು ಒತ್ತಾಯವಾಗಿ ಅನುಮತಿಸಿ"</string> <string name="force_allow_on_external_summary" msgid="3640752408258034689">"ಮ್ಯಾನಿಫೆಸ್ಟ್ ಮೌಲ್ಯಗಳು ಯಾವುದೇ ಆಗಿದ್ದರೂ, ಬಾಹ್ಯ ಸಂಗ್ರಹಣೆಗೆ ಬರೆಯಲು ಯಾವುದೇ ಅಪ್ಲಿಕೇಶನ್ ಅನ್ನು ಅರ್ಹಗೊಳಿಸುತ್ತದೆ"</string> <string name="force_resizable_activities" msgid="8615764378147824985">"ಚಟುವಟಿಕೆಗಳನ್ನು ಮರುಗಾತ್ರಗೊಳಿಸುವಂತೆ ಒತ್ತಾಯ ಮಾಡಿ"</string> diff --git a/packages/SettingsLib/res/values-ko/strings.xml b/packages/SettingsLib/res/values-ko/strings.xml index c5f842ec78f0..bbaeed7bf902 100644 --- a/packages/SettingsLib/res/values-ko/strings.xml +++ b/packages/SettingsLib/res/values-ko/strings.xml @@ -272,6 +272,10 @@ <string name="app_process_limit_title" msgid="4280600650253107163">"백그라운드 프로세스 수 제한"</string> <string name="show_all_anrs" msgid="28462979638729082">"모든 ANR 보기"</string> <string name="show_all_anrs_summary" msgid="641908614413544127">"백그라운드 앱에 대해 앱 응답 없음 대화상자 표시"</string> + <!-- no translation found for show_notification_channel_warnings (1399948193466922683) --> + <skip /> + <!-- no translation found for show_notification_channel_warnings_summary (5536803251863694895) --> + <skip /> <string name="force_allow_on_external" msgid="3215759785081916381">"외부에서 앱 강제 허용"</string> <string name="force_allow_on_external_summary" msgid="3640752408258034689">"매니페스트 값과 관계없이 모든 앱이 외부 저장소에 작성되도록 허용"</string> <string name="force_resizable_activities" msgid="8615764378147824985">"활동의 크기가 조정 가능하도록 설정"</string> diff --git a/packages/SettingsLib/res/values-ky/strings.xml b/packages/SettingsLib/res/values-ky/strings.xml index 492f71d05281..66f376970b22 100644 --- a/packages/SettingsLib/res/values-ky/strings.xml +++ b/packages/SettingsLib/res/values-ky/strings.xml @@ -272,6 +272,10 @@ <string name="app_process_limit_title" msgid="4280600650253107163">"Фондогу процесстер чеги"</string> <string name="show_all_anrs" msgid="28462979638729082">"Бардык ANR\'лерди көрсөтүү"</string> <string name="show_all_anrs_summary" msgid="641908614413544127">"Фондогу колдонмолорго Колдонмо Жооп Бербейт деп көрсөтүү"</string> + <!-- no translation found for show_notification_channel_warnings (1399948193466922683) --> + <skip /> + <!-- no translation found for show_notification_channel_warnings_summary (5536803251863694895) --> + <skip /> <string name="force_allow_on_external" msgid="3215759785081916381">"Тышкы сактагычка сактоого уруксат берүү"</string> <string name="force_allow_on_external_summary" msgid="3640752408258034689">"Манифест маанилерине карабастан бардык колдонмолорду тышкы сактагычка сактоого уруксат берет"</string> <string name="force_resizable_activities" msgid="8615764378147824985">"Аракеттердин өлчөмүн өзгөртүүнү мажбурлоо"</string> diff --git a/packages/SettingsLib/res/values-lo/strings.xml b/packages/SettingsLib/res/values-lo/strings.xml index 5abd2a6cadf7..c909cbb6859e 100644 --- a/packages/SettingsLib/res/values-lo/strings.xml +++ b/packages/SettingsLib/res/values-lo/strings.xml @@ -272,6 +272,10 @@ <string name="app_process_limit_title" msgid="4280600650253107163">"ການຈຳກັດໂປຣເຊສໃນພື້ນຫຼັງ"</string> <string name="show_all_anrs" msgid="28462979638729082">"ສະແດງ ANRs ທັງຫມົດ"</string> <string name="show_all_anrs_summary" msgid="641908614413544127">"ສະແດງໜ້າຈໍແອັບຯທີ່ບໍ່ຕອບສະໜອງສຳລັບແອັບຯພື້ນຫຼັງ"</string> + <!-- no translation found for show_notification_channel_warnings (1399948193466922683) --> + <skip /> + <!-- no translation found for show_notification_channel_warnings_summary (5536803251863694895) --> + <skip /> <string name="force_allow_on_external" msgid="3215759785081916381">"ບັງຄັບອະນຸຍາດແອັບຢູ່ພາຍນອກ"</string> <string name="force_allow_on_external_summary" msgid="3640752408258034689">"ເຮັດໃຫ້ທຸກແອັບມີສິດໄດ້ຮັບການຂຽນໃສ່ພື້ນທີ່ຈັດເກັບຂໍ້ມູນພາຍນອກ, ໂດຍບໍ່ຄຳນຶງເຖິງຄ່າ manifest"</string> <string name="force_resizable_activities" msgid="8615764378147824985">"ບັງຄັງໃຫ້ກິດຈະກຳປ່ຽນຂະໜາດໄດ້"</string> diff --git a/packages/SettingsLib/res/values-lt/strings.xml b/packages/SettingsLib/res/values-lt/strings.xml index 830abf018c70..274ce9ad374f 100644 --- a/packages/SettingsLib/res/values-lt/strings.xml +++ b/packages/SettingsLib/res/values-lt/strings.xml @@ -272,6 +272,10 @@ <string name="app_process_limit_title" msgid="4280600650253107163">"Fono procesų apribojimas"</string> <string name="show_all_anrs" msgid="28462979638729082">"Rodyti visus ANR"</string> <string name="show_all_anrs_summary" msgid="641908614413544127">"Fon. programose rodyti dialogo langą „Neatsako“"</string> + <!-- no translation found for show_notification_channel_warnings (1399948193466922683) --> + <skip /> + <!-- no translation found for show_notification_channel_warnings_summary (5536803251863694895) --> + <skip /> <string name="force_allow_on_external" msgid="3215759785081916381">"Priverstinai leisti programas išorinėje atmintin."</string> <string name="force_allow_on_external_summary" msgid="3640752408258034689">"Nustatoma, kad visas programas būtų galima įrašyti į išorinę saugyklą, nepaisant aprašo verčių"</string> <string name="force_resizable_activities" msgid="8615764378147824985">"Priv. nust., kad veiksm. b. g. atl. kelių d. lang."</string> diff --git a/packages/SettingsLib/res/values-lv/strings.xml b/packages/SettingsLib/res/values-lv/strings.xml index 57499545d4a5..e760d780dd6c 100644 --- a/packages/SettingsLib/res/values-lv/strings.xml +++ b/packages/SettingsLib/res/values-lv/strings.xml @@ -272,6 +272,10 @@ <string name="app_process_limit_title" msgid="4280600650253107163">"Fona procesu ierobežojums"</string> <string name="show_all_anrs" msgid="28462979638729082">"Rādīt visus ANR"</string> <string name="show_all_anrs_summary" msgid="641908614413544127">"Rādīt fona lietotņu dialoglodz. Lietotne nereaģē"</string> + <!-- no translation found for show_notification_channel_warnings (1399948193466922683) --> + <skip /> + <!-- no translation found for show_notification_channel_warnings_summary (5536803251863694895) --> + <skip /> <string name="force_allow_on_external" msgid="3215759785081916381">"Lietotņu piespiedu atļaušana ārējā krātuvē"</string> <string name="force_allow_on_external_summary" msgid="3640752408258034689">"Ļauj jebkuru lietotni ierakstīt ārējā krātuvē neatkarīgi no manifesta vērtības."</string> <string name="force_resizable_activities" msgid="8615764378147824985">"Pielāgot darbības"</string> diff --git a/packages/SettingsLib/res/values-mk/strings.xml b/packages/SettingsLib/res/values-mk/strings.xml index 88b36753e6c7..19794519c81d 100644 --- a/packages/SettingsLib/res/values-mk/strings.xml +++ b/packages/SettingsLib/res/values-mk/strings.xml @@ -272,6 +272,10 @@ <string name="app_process_limit_title" msgid="4280600650253107163">"Граница на процес во зад."</string> <string name="show_all_anrs" msgid="28462979638729082">"Прикажи ги сите ANR"</string> <string name="show_all_anrs_summary" msgid="641908614413544127">"Прикажи „Апл. не реагира“ за. апл. во заднина"</string> + <!-- no translation found for show_notification_channel_warnings (1399948193466922683) --> + <skip /> + <!-- no translation found for show_notification_channel_warnings_summary (5536803251863694895) --> + <skip /> <string name="force_allow_on_external" msgid="3215759785081916381">"Принуд. дозволете апликации на надворешна меморија"</string> <string name="force_allow_on_external_summary" msgid="3640752408258034689">"Прави секоја апликација да биде подобна за запишување на надворешна меморија, независно од вредностите на манифестот"</string> <string name="force_resizable_activities" msgid="8615764378147824985">"Принуди ги активностите да ја менуваат големината"</string> diff --git a/packages/SettingsLib/res/values-ml/strings.xml b/packages/SettingsLib/res/values-ml/strings.xml index 3ed642d8635d..06a9dc16d915 100644 --- a/packages/SettingsLib/res/values-ml/strings.xml +++ b/packages/SettingsLib/res/values-ml/strings.xml @@ -272,6 +272,10 @@ <string name="app_process_limit_title" msgid="4280600650253107163">"പശ്ചാത്തല പ്രോസസ്സ് പരിധി"</string> <string name="show_all_anrs" msgid="28462979638729082">"എല്ലാ ANR-കളും ദൃശ്യമാക്കുക"</string> <string name="show_all_anrs_summary" msgid="641908614413544127">"പശ്ചാത്തല അപ്ലിക്കേഷനുകൾക്ക് അപ്ലിക്കേഷൻ പ്രതികരിക്കുന്നില്ല എന്ന ഡയലോഗ് കാണിക്കുക"</string> + <!-- no translation found for show_notification_channel_warnings (1399948193466922683) --> + <skip /> + <!-- no translation found for show_notification_channel_warnings_summary (5536803251863694895) --> + <skip /> <string name="force_allow_on_external" msgid="3215759785081916381">"ബാഹ്യമായതിൽ നിർബന്ധിച്ച് അനുവദിക്കുക"</string> <string name="force_allow_on_external_summary" msgid="3640752408258034689">"മാനിഫെസ്റ്റ് മൂല്യങ്ങൾ പരിഗണിക്കാതെ, ബാഹ്യ സ്റ്റോറേജിലേക്ക് എഴുതപ്പെടുന്നതിന് ഏതൊരു ആപ്പിനെയും യോഗ്യമാക്കുന്നു"</string> <string name="force_resizable_activities" msgid="8615764378147824985">"വലിപ്പം മാറ്റാൻ പ്രവർത്തനങ്ങളെ നിർബന്ധിക്കുക"</string> diff --git a/packages/SettingsLib/res/values-mn/strings.xml b/packages/SettingsLib/res/values-mn/strings.xml index 12c528124618..f400f5a63d50 100644 --- a/packages/SettingsLib/res/values-mn/strings.xml +++ b/packages/SettingsLib/res/values-mn/strings.xml @@ -272,6 +272,10 @@ <string name="app_process_limit_title" msgid="4280600650253107163">"Далд процессын хязгаар"</string> <string name="show_all_anrs" msgid="28462979638729082">"Бүх ANRs харуулах"</string> <string name="show_all_anrs_summary" msgid="641908614413544127">"Далд апп-уудад Апп Хариу Өгөхгүй байна гэснийг харуулах"</string> + <!-- no translation found for show_notification_channel_warnings (1399948193466922683) --> + <skip /> + <!-- no translation found for show_notification_channel_warnings_summary (5536803251863694895) --> + <skip /> <string name="force_allow_on_external" msgid="3215759785081916381">"Аппыг гадаад санах ойд хадгалахыг зөвшөөрөх"</string> <string name="force_allow_on_external_summary" msgid="3640752408258034689">"Манифест утгыг нь үл хамааран дурын апп-г гадаад санах ойд бичих боломжтой болгодог"</string> <string name="force_resizable_activities" msgid="8615764378147824985">"Үйл ажиллагааны хэмжээг өөрчилж болохуйц болгох"</string> diff --git a/packages/SettingsLib/res/values-mr/strings.xml b/packages/SettingsLib/res/values-mr/strings.xml index a45648efb71f..10632e050155 100644 --- a/packages/SettingsLib/res/values-mr/strings.xml +++ b/packages/SettingsLib/res/values-mr/strings.xml @@ -272,6 +272,10 @@ <string name="app_process_limit_title" msgid="4280600650253107163">"पार्श्वभूमी प्रक्रिया मर्यादा"</string> <string name="show_all_anrs" msgid="28462979638729082">"सर्व ANR दर्शवा"</string> <string name="show_all_anrs_summary" msgid="641908614413544127">"पार्श्वभूमी अॅप्ससाठी अॅप प्रतिसाद देत नाही संवाद दर्शवा"</string> + <!-- no translation found for show_notification_channel_warnings (1399948193466922683) --> + <skip /> + <!-- no translation found for show_notification_channel_warnings_summary (5536803251863694895) --> + <skip /> <string name="force_allow_on_external" msgid="3215759785081916381">"बाह्यवर अॅप्सना अनुमती देण्याची सक्ती करा"</string> <string name="force_allow_on_external_summary" msgid="3640752408258034689">"मॅनिफेस्ट मूल्यांकडे दुर्लक्ष करून, कोणत्याही अॅपला बाह्य संचयनावर लेखन केले जाण्यासाठी पात्र बनविते"</string> <string name="force_resizable_activities" msgid="8615764378147824985">"क्रियाकलापाचा आकार बदलण्यायोग्य होण्याची सक्ती करा"</string> diff --git a/packages/SettingsLib/res/values-ms/strings.xml b/packages/SettingsLib/res/values-ms/strings.xml index 6ca514bb9833..cc6a935a3238 100644 --- a/packages/SettingsLib/res/values-ms/strings.xml +++ b/packages/SettingsLib/res/values-ms/strings.xml @@ -272,6 +272,10 @@ <string name="app_process_limit_title" msgid="4280600650253107163">"Had proses latar belakang"</string> <string name="show_all_anrs" msgid="28462979638729082">"Tunjukkan semua ANR"</string> <string name="show_all_anrs_summary" msgid="641908614413544127">"Tunjukkan dialog Aplikasi Tidak Memberi Maklum Balas untuk aplikasi latar belakang"</string> + <!-- no translation found for show_notification_channel_warnings (1399948193466922683) --> + <skip /> + <!-- no translation found for show_notification_channel_warnings_summary (5536803251863694895) --> + <skip /> <string name="force_allow_on_external" msgid="3215759785081916381">"Benarkan apl secara paksa pada storan luaran"</string> <string name="force_allow_on_external_summary" msgid="3640752408258034689">"Menjadikan sebarang apl layak ditulis ke storan luaran, tanpa mengambil kira nilai manifes"</string> <string name="force_resizable_activities" msgid="8615764378147824985">"Paksa aktiviti supaya boleh diubah saiz"</string> diff --git a/packages/SettingsLib/res/values-my/strings.xml b/packages/SettingsLib/res/values-my/strings.xml index c2e8a94fe33d..3e718006a103 100644 --- a/packages/SettingsLib/res/values-my/strings.xml +++ b/packages/SettingsLib/res/values-my/strings.xml @@ -272,6 +272,10 @@ <string name="app_process_limit_title" msgid="4280600650253107163">"နောက်ခံလုပ်ငန်းစဉ်ကန့်သတ်ခြင်း"</string> <string name="show_all_anrs" msgid="28462979638729082">"ANRsအားလုံးအား ပြသရန်"</string> <string name="show_all_anrs_summary" msgid="641908614413544127">"နောက်ခံအပ်ပလီကေးရှင်းအတွက်တုံ့ပြန်မှုမရှိပြရန်"</string> + <!-- no translation found for show_notification_channel_warnings (1399948193466922683) --> + <skip /> + <!-- no translation found for show_notification_channel_warnings_summary (5536803251863694895) --> + <skip /> <string name="force_allow_on_external" msgid="3215759785081916381">"အပြင်မှာ အတင်း ခွင့်ပြုရန်"</string> <string name="force_allow_on_external_summary" msgid="3640752408258034689">"တိကျစွာ သတ်မှတ်ထားသည့်တန်ဖိုးများရှိသော်လည်း၊ ပြင်ပသိုလှောင်ခန်းများသို့ မည်သည့်အက်ပ်ကိုမဆို ဝင်ရောက်ခွင့်ပြုပါ"</string> <string name="force_resizable_activities" msgid="8615764378147824985">"လုပ်ဆောင်ချက်များ ဆိုက်ညှိရနိုင်ရန် လုပ်ခိုင်းပါ"</string> diff --git a/packages/SettingsLib/res/values-nb/strings.xml b/packages/SettingsLib/res/values-nb/strings.xml index 409ccab20ab0..61ce9cb4df64 100644 --- a/packages/SettingsLib/res/values-nb/strings.xml +++ b/packages/SettingsLib/res/values-nb/strings.xml @@ -272,6 +272,10 @@ <string name="app_process_limit_title" msgid="4280600650253107163">"Bakgrunnsprosessgrense"</string> <string name="show_all_anrs" msgid="28462979638729082">"Vis alle ANR-er"</string> <string name="show_all_anrs_summary" msgid="641908614413544127">"Vis Appen svarer ikke-dialog for bakgrunnsapper"</string> + <!-- no translation found for show_notification_channel_warnings (1399948193466922683) --> + <skip /> + <!-- no translation found for show_notification_channel_warnings_summary (5536803251863694895) --> + <skip /> <string name="force_allow_on_external" msgid="3215759785081916381">"Tving frem tillatelse for ekstern lagring av apper"</string> <string name="force_allow_on_external_summary" msgid="3640752408258034689">"Dette gjør at alle apper kan lagres på eksterne lagringsmedier – uavhengig av manifestverdier"</string> <string name="force_resizable_activities" msgid="8615764378147824985">"Tving aktiviteter til å kunne endre størrelse"</string> diff --git a/packages/SettingsLib/res/values-ne/strings.xml b/packages/SettingsLib/res/values-ne/strings.xml index 2f61e8c0cb45..e87cf2ff3e8b 100644 --- a/packages/SettingsLib/res/values-ne/strings.xml +++ b/packages/SettingsLib/res/values-ne/strings.xml @@ -272,6 +272,10 @@ <string name="app_process_limit_title" msgid="4280600650253107163">"पृष्ठभूमि प्रक्रिया सीमा"</string> <string name="show_all_anrs" msgid="28462979638729082">"सबै ANRs देखाउनुहोस्"</string> <string name="show_all_anrs_summary" msgid="641908614413544127">"पृष्ठभूमि अनुप्रयोगका लागि जवाफ नदिइरहेका अनुप्रयोगहरू देखाउनुहोस्"</string> + <!-- no translation found for show_notification_channel_warnings (1399948193466922683) --> + <skip /> + <!-- no translation found for show_notification_channel_warnings_summary (5536803251863694895) --> + <skip /> <string name="force_allow_on_external" msgid="3215759785081916381">"बाह्यमा बल प्रयोगको अनुमति प्राप्त अनुप्रयोगहरू"</string> <string name="force_allow_on_external_summary" msgid="3640752408258034689">"म्यानिफेेस्टका मानहरूको ख्याल नगरी कुनै पनि अनुप्रयोगलाई बाह्य भण्डारणमा लेख्न सकिने खाले बनाउँछ"</string> <string name="force_resizable_activities" msgid="8615764378147824985">"गतिविधिहरू रिसाइज गर्नको लागि बाध्य गर्नुहोस्"</string> diff --git a/packages/SettingsLib/res/values-nl/strings.xml b/packages/SettingsLib/res/values-nl/strings.xml index 77e311eefb22..b98ea2bece6e 100644 --- a/packages/SettingsLib/res/values-nl/strings.xml +++ b/packages/SettingsLib/res/values-nl/strings.xml @@ -272,6 +272,10 @@ <string name="app_process_limit_title" msgid="4280600650253107163">"Achtergrondproceslimiet"</string> <string name="show_all_anrs" msgid="28462979638729082">"Alle ANR\'s weergeven"</string> <string name="show_all_anrs_summary" msgid="641908614413544127">"\'App reageert niet\' weerg. voor apps op achtergr."</string> + <!-- no translation found for show_notification_channel_warnings (1399948193466922683) --> + <skip /> + <!-- no translation found for show_notification_channel_warnings_summary (5536803251863694895) --> + <skip /> <string name="force_allow_on_external" msgid="3215759785081916381">"Toestaan van apps op externe opslag afdwingen"</string> <string name="force_allow_on_external_summary" msgid="3640752408258034689">"Hiermee komt elke app in aanmerking voor schrijven naar externe opslag, ongeacht de manifestwaarden"</string> <string name="force_resizable_activities" msgid="8615764378147824985">"Formaat activiteiten geforceerd aanpasbaar maken"</string> diff --git a/packages/SettingsLib/res/values-pa/strings.xml b/packages/SettingsLib/res/values-pa/strings.xml index 8534e8568013..08dd09d7606a 100644 --- a/packages/SettingsLib/res/values-pa/strings.xml +++ b/packages/SettingsLib/res/values-pa/strings.xml @@ -272,6 +272,10 @@ <string name="app_process_limit_title" msgid="4280600650253107163">"ਪਿਛੋਕੜ ਪ੍ਰਕਿਰਿਆ ਸੀਮਾ"</string> <string name="show_all_anrs" msgid="28462979638729082">"ਸਾਰੇ ANR ਦਿਖਾਓ"</string> <string name="show_all_anrs_summary" msgid="641908614413544127">"ਪਿਛੋਕੜ ਐਪਸ ਲਈ ਐਪਸ ਜਵਾਬ ਨਹੀਂ ਦੇ ਰਹੇ ਡਾਇਲੌਗ ਦਿਖਾਓ"</string> + <!-- no translation found for show_notification_channel_warnings (1399948193466922683) --> + <skip /> + <!-- no translation found for show_notification_channel_warnings_summary (5536803251863694895) --> + <skip /> <string name="force_allow_on_external" msgid="3215759785081916381">"ਐਪਸ ਨੂੰ ਬਾਹਰਲੇ ਤੇ ਜ਼ਬਰਦਸਤੀ ਆਗਿਆ ਦਿਓ"</string> <string name="force_allow_on_external_summary" msgid="3640752408258034689">"ਮੈਨੀਫੈਸਟ ਮੁੱਲਾਂ ਦੀ ਪਰਵਾਹ ਕੀਤੇ ਬਿਨਾਂ, ਕਿਸੇ ਵੀ ਐਪ ਨੂੰ ਬਾਹਰੀ ਸਟੋਰੇਜ \'ਤੇ ਲਿਖਣ ਦੇ ਯੋਗ ਬਣਾਉਂਦੀ ਹੈ"</string> <string name="force_resizable_activities" msgid="8615764378147824985">"ਮੁੜ-ਆਕਾਰ ਬਦਲਣ ਲਈ ਸਰਗਰਮੀਆਂ \'ਤੇ ਜ਼ੋਰ ਦਿਓ"</string> diff --git a/packages/SettingsLib/res/values-pl/strings.xml b/packages/SettingsLib/res/values-pl/strings.xml index 762404227b2d..e559c693e38f 100644 --- a/packages/SettingsLib/res/values-pl/strings.xml +++ b/packages/SettingsLib/res/values-pl/strings.xml @@ -272,6 +272,10 @@ <string name="app_process_limit_title" msgid="4280600650253107163">"Limit procesów w tle"</string> <string name="show_all_anrs" msgid="28462979638729082">"Pokaż wszystkie ANR"</string> <string name="show_all_anrs_summary" msgid="641908614413544127">"Pokaż okno Aplikacja Nie Reaguje dla aplikacji w tle"</string> + <!-- no translation found for show_notification_channel_warnings (1399948193466922683) --> + <skip /> + <!-- no translation found for show_notification_channel_warnings_summary (5536803251863694895) --> + <skip /> <string name="force_allow_on_external" msgid="3215759785081916381">"Wymuś zezwalanie na aplikacje w pamięci zewn."</string> <string name="force_allow_on_external_summary" msgid="3640752408258034689">"Pozwala na zapis aplikacji w pamięci zewnętrznej niezależnie od wartości w pliku manifestu"</string> <string name="force_resizable_activities" msgid="8615764378147824985">"Wymuś zmianę rozmiaru okien aktywności"</string> diff --git a/packages/SettingsLib/res/values-pt-rBR/strings.xml b/packages/SettingsLib/res/values-pt-rBR/strings.xml index 80b899004a60..cce80ed195c3 100644 --- a/packages/SettingsLib/res/values-pt-rBR/strings.xml +++ b/packages/SettingsLib/res/values-pt-rBR/strings.xml @@ -272,6 +272,10 @@ <string name="app_process_limit_title" msgid="4280600650253107163">"Limite do proc. 2º plano"</string> <string name="show_all_anrs" msgid="28462979638729082">"Mostrar todos os ANRS"</string> <string name="show_all_anrs_summary" msgid="641908614413544127">"Exibir \"App não responde\" para app em 2º plano"</string> + <!-- no translation found for show_notification_channel_warnings (1399948193466922683) --> + <skip /> + <!-- no translation found for show_notification_channel_warnings_summary (5536803251863694895) --> + <skip /> <string name="force_allow_on_external" msgid="3215759785081916381">"Forçar permissão de apps em armazenamento externo"</string> <string name="force_allow_on_external_summary" msgid="3640752408258034689">"Qualifica apps para gravação em armazenamento externo, independentemente de valores de manifestos"</string> <string name="force_resizable_activities" msgid="8615764378147824985">"Forçar atividades a serem redimensionáveis"</string> diff --git a/packages/SettingsLib/res/values-pt-rPT/strings.xml b/packages/SettingsLib/res/values-pt-rPT/strings.xml index 0059cdd721f0..8124c4b294eb 100644 --- a/packages/SettingsLib/res/values-pt-rPT/strings.xml +++ b/packages/SettingsLib/res/values-pt-rPT/strings.xml @@ -272,6 +272,10 @@ <string name="app_process_limit_title" msgid="4280600650253107163">"Limite proc. em 2º plano"</string> <string name="show_all_anrs" msgid="28462979638729082">"Mostrar todos os ANR"</string> <string name="show_all_anrs_summary" msgid="641908614413544127">"Mostrar erro \"Aplic. não Resp.\" p/ aplic. 2º plano"</string> + <!-- no translation found for show_notification_channel_warnings (1399948193466922683) --> + <skip /> + <!-- no translation found for show_notification_channel_warnings_summary (5536803251863694895) --> + <skip /> <string name="force_allow_on_external" msgid="3215759785081916381">"Forçar perm. de aplicações no armazenamento ext."</string> <string name="force_allow_on_external_summary" msgid="3640752408258034689">"Torna qualquer aplicação elegível para ser gravada no armazenamento externo, independentemente dos valores do manifesto"</string> <string name="force_resizable_activities" msgid="8615764378147824985">"Forçar as atividades a serem redimensionáveis"</string> diff --git a/packages/SettingsLib/res/values-pt/strings.xml b/packages/SettingsLib/res/values-pt/strings.xml index 80b899004a60..cce80ed195c3 100644 --- a/packages/SettingsLib/res/values-pt/strings.xml +++ b/packages/SettingsLib/res/values-pt/strings.xml @@ -272,6 +272,10 @@ <string name="app_process_limit_title" msgid="4280600650253107163">"Limite do proc. 2º plano"</string> <string name="show_all_anrs" msgid="28462979638729082">"Mostrar todos os ANRS"</string> <string name="show_all_anrs_summary" msgid="641908614413544127">"Exibir \"App não responde\" para app em 2º plano"</string> + <!-- no translation found for show_notification_channel_warnings (1399948193466922683) --> + <skip /> + <!-- no translation found for show_notification_channel_warnings_summary (5536803251863694895) --> + <skip /> <string name="force_allow_on_external" msgid="3215759785081916381">"Forçar permissão de apps em armazenamento externo"</string> <string name="force_allow_on_external_summary" msgid="3640752408258034689">"Qualifica apps para gravação em armazenamento externo, independentemente de valores de manifestos"</string> <string name="force_resizable_activities" msgid="8615764378147824985">"Forçar atividades a serem redimensionáveis"</string> diff --git a/packages/SettingsLib/res/values-ro/strings.xml b/packages/SettingsLib/res/values-ro/strings.xml index 0ae7049ab002..3a174de1bff5 100644 --- a/packages/SettingsLib/res/values-ro/strings.xml +++ b/packages/SettingsLib/res/values-ro/strings.xml @@ -272,6 +272,10 @@ <string name="app_process_limit_title" msgid="4280600650253107163">"Limită procese fundal"</string> <string name="show_all_anrs" msgid="28462979638729082">"Afișați toate elem. ANR"</string> <string name="show_all_anrs_summary" msgid="641908614413544127">"Aplicații din fundal: afișați Aplicația nu răspunde"</string> + <!-- no translation found for show_notification_channel_warnings (1399948193466922683) --> + <skip /> + <!-- no translation found for show_notification_channel_warnings_summary (5536803251863694895) --> + <skip /> <string name="force_allow_on_external" msgid="3215759785081916381">"Forțați accesul aplicațiilor la stocarea externă"</string> <string name="force_allow_on_external_summary" msgid="3640752408258034689">"Face orice aplicație eligibilă să fie scrisă în stocarea externă, indiferent de valorile manifestului"</string> <string name="force_resizable_activities" msgid="8615764378147824985">"Forțați redimensionarea activităților"</string> diff --git a/packages/SettingsLib/res/values-ru/strings.xml b/packages/SettingsLib/res/values-ru/strings.xml index cc82236ea637..cd8d95611182 100644 --- a/packages/SettingsLib/res/values-ru/strings.xml +++ b/packages/SettingsLib/res/values-ru/strings.xml @@ -272,6 +272,10 @@ <string name="app_process_limit_title" msgid="4280600650253107163">"Лимит фоновых процессов"</string> <string name="show_all_anrs" msgid="28462979638729082">"Все ANR"</string> <string name="show_all_anrs_summary" msgid="641908614413544127">"Уведомлять о том, что приложение не отвечает"</string> + <!-- no translation found for show_notification_channel_warnings (1399948193466922683) --> + <skip /> + <!-- no translation found for show_notification_channel_warnings_summary (5536803251863694895) --> + <skip /> <string name="force_allow_on_external" msgid="3215759785081916381">"Разрешить сохранение на внешние накопители"</string> <string name="force_allow_on_external_summary" msgid="3640752408258034689">"Разрешить сохранение приложений на внешних накопителях (независимо от значений в манифесте)"</string> <string name="force_resizable_activities" msgid="8615764378147824985">"Изменение размера в многооконном режиме"</string> diff --git a/packages/SettingsLib/res/values-si/strings.xml b/packages/SettingsLib/res/values-si/strings.xml index 16233088b8fd..592c2f9885ba 100644 --- a/packages/SettingsLib/res/values-si/strings.xml +++ b/packages/SettingsLib/res/values-si/strings.xml @@ -272,6 +272,10 @@ <string name="app_process_limit_title" msgid="4280600650253107163">"පසුබිම් ක්රියාවලි සීමාව"</string> <string name="show_all_anrs" msgid="28462979638729082">"සියලුම ANR පෙන්වන්න"</string> <string name="show_all_anrs_summary" msgid="641908614413544127">"පසුබිම් යෙදුම් වලට යෙදුම ප්රතිචාර නොදක්වයි කවුළුව පෙන්වන්න"</string> + <!-- no translation found for show_notification_channel_warnings (1399948193466922683) --> + <skip /> + <!-- no translation found for show_notification_channel_warnings_summary (5536803251863694895) --> + <skip /> <string name="force_allow_on_external" msgid="3215759785081916381">"බාහිර මත යෙදුම් ඉඩ දීම බල කරන්න"</string> <string name="force_allow_on_external_summary" msgid="3640752408258034689">"මැනිෆෙස්ට් අගයන් නොසලකා, ඕනෑම යෙදුමක් බාහිර ගබඩාවට ලිවීමට සුදුසුකම් ලබා දෙයි"</string> <string name="force_resizable_activities" msgid="8615764378147824985">"ක්රියාකාරකම් ප්රතිප්රමාණ කළ හැකි බවට බල කරන්න"</string> diff --git a/packages/SettingsLib/res/values-sk/strings.xml b/packages/SettingsLib/res/values-sk/strings.xml index 028d561e7c00..d5c40611f132 100644 --- a/packages/SettingsLib/res/values-sk/strings.xml +++ b/packages/SettingsLib/res/values-sk/strings.xml @@ -272,6 +272,10 @@ <string name="app_process_limit_title" msgid="4280600650253107163">"Limit procesov na pozadí"</string> <string name="show_all_anrs" msgid="28462979638729082">"Zobrazovať všetky ANR"</string> <string name="show_all_anrs_summary" msgid="641908614413544127">"Zobrazovať dialóg „Aplikácia neodpovedá“ aj pre aplikácie na pozadí"</string> + <!-- no translation found for show_notification_channel_warnings (1399948193466922683) --> + <skip /> + <!-- no translation found for show_notification_channel_warnings_summary (5536803251863694895) --> + <skip /> <string name="force_allow_on_external" msgid="3215759785081916381">"Vynútiť povolenie aplikácií na externom úložisku"</string> <string name="force_allow_on_external_summary" msgid="3640752408258034689">"Umožňuje zapísať akúkoľvek aplikáciu do externého úložiska bez ohľadu na hodnoty v manifeste"</string> <string name="force_resizable_activities" msgid="8615764378147824985">"Vynútiť možnosť zmeny veľkosti aktivít"</string> diff --git a/packages/SettingsLib/res/values-sl/strings.xml b/packages/SettingsLib/res/values-sl/strings.xml index 085621a0adab..4e0085c12703 100644 --- a/packages/SettingsLib/res/values-sl/strings.xml +++ b/packages/SettingsLib/res/values-sl/strings.xml @@ -272,6 +272,10 @@ <string name="app_process_limit_title" msgid="4280600650253107163">"Omejitev postopkov v ozadju"</string> <string name="show_all_anrs" msgid="28462979638729082">"Pokaži okna neodzivanj"</string> <string name="show_all_anrs_summary" msgid="641908614413544127">"Prikaz pogovornega okna za neodzivanje aplikacije v ozadju"</string> + <!-- no translation found for show_notification_channel_warnings (1399948193466922683) --> + <skip /> + <!-- no translation found for show_notification_channel_warnings_summary (5536803251863694895) --> + <skip /> <string name="force_allow_on_external" msgid="3215759785081916381">"Vsili omogočanje aplikacij v zunanji shrambi"</string> <string name="force_allow_on_external_summary" msgid="3640752408258034689">"Poskrbi, da je ne glede na vrednosti v manifestu mogoče vsako aplikacijo zapisati v zunanjo shrambo"</string> <string name="force_resizable_activities" msgid="8615764378147824985">"Vsili povečanje velikosti za aktivnosti"</string> diff --git a/packages/SettingsLib/res/values-sq/strings.xml b/packages/SettingsLib/res/values-sq/strings.xml index c9398a50a4fd..e8340bf00e6d 100644 --- a/packages/SettingsLib/res/values-sq/strings.xml +++ b/packages/SettingsLib/res/values-sq/strings.xml @@ -272,6 +272,10 @@ <string name="app_process_limit_title" msgid="4280600650253107163">"Kufizimi i proceseve në sfond"</string> <string name="show_all_anrs" msgid="28462979638729082">"Shfaq raportet ANR"</string> <string name="show_all_anrs_summary" msgid="641908614413544127">"Shfaq raportet ANR (Aplikacioni nuk përgjigjet) për aplikacionet në sfond"</string> + <!-- no translation found for show_notification_channel_warnings (1399948193466922683) --> + <skip /> + <!-- no translation found for show_notification_channel_warnings_summary (5536803251863694895) --> + <skip /> <string name="force_allow_on_external" msgid="3215759785081916381">"Detyro lejimin në hapësirën e jashtme"</string> <string name="force_allow_on_external_summary" msgid="3640752408258034689">"Bën që çdo aplikacion të jetë i përshtatshëm për t\'u shkruar në hapësirën ruajtëse të jashtme, pavarësisht nga vlerat e manifestit"</string> <string name="force_resizable_activities" msgid="8615764378147824985">"Detyro madhësinë e ndryshueshme për aktivitetet"</string> diff --git a/packages/SettingsLib/res/values-sr/strings.xml b/packages/SettingsLib/res/values-sr/strings.xml index 15ba747c7b1c..63ceb736ea17 100644 --- a/packages/SettingsLib/res/values-sr/strings.xml +++ b/packages/SettingsLib/res/values-sr/strings.xml @@ -272,6 +272,10 @@ <string name="app_process_limit_title" msgid="4280600650253107163">"Ограничење позадинских процеса"</string> <string name="show_all_anrs" msgid="28462979638729082">"Прикажи све ANR-ове"</string> <string name="show_all_anrs_summary" msgid="641908614413544127">"Прикажи дијалог Апликација не реагује за апликације у позадини"</string> + <!-- no translation found for show_notification_channel_warnings (1399948193466922683) --> + <skip /> + <!-- no translation found for show_notification_channel_warnings_summary (5536803251863694895) --> + <skip /> <string name="force_allow_on_external" msgid="3215759785081916381">"Принудно дозволи апликације у спољној"</string> <string name="force_allow_on_external_summary" msgid="3640752408258034689">"Омогућава уписивање свих апликација у спољну меморију, без обзира на вредности манифеста"</string> <string name="force_resizable_activities" msgid="8615764378147824985">"Принудно омогући промену величине активности"</string> diff --git a/packages/SettingsLib/res/values-sv/strings.xml b/packages/SettingsLib/res/values-sv/strings.xml index cfae5aef3f1b..1f2ca2377bed 100644 --- a/packages/SettingsLib/res/values-sv/strings.xml +++ b/packages/SettingsLib/res/values-sv/strings.xml @@ -272,6 +272,10 @@ <string name="app_process_limit_title" msgid="4280600650253107163">"Begränsa bakgrundsprocess"</string> <string name="show_all_anrs" msgid="28462979638729082">"Visa alla som inte svarar"</string> <string name="show_all_anrs_summary" msgid="641908614413544127">"Visa dialogrutan om att appen inte svarar för bakgrundsappar"</string> + <!-- no translation found for show_notification_channel_warnings (1399948193466922683) --> + <skip /> + <!-- no translation found for show_notification_channel_warnings_summary (5536803251863694895) --> + <skip /> <string name="force_allow_on_external" msgid="3215759785081916381">"Tillåt appar i externt lagringsutrymme"</string> <string name="force_allow_on_external_summary" msgid="3640752408258034689">"Allar appar kan skrivas till extern lagring, oavsett manifestvärden"</string> <string name="force_resizable_activities" msgid="8615764378147824985">"Framtvinga storleksanpassning för aktiviteter"</string> diff --git a/packages/SettingsLib/res/values-sw/strings.xml b/packages/SettingsLib/res/values-sw/strings.xml index ef431344375f..4d75fbccf361 100644 --- a/packages/SettingsLib/res/values-sw/strings.xml +++ b/packages/SettingsLib/res/values-sw/strings.xml @@ -234,7 +234,7 @@ <string name="debug_monitoring_category" msgid="7640508148375798343">"Ufuatiliaji"</string> <string name="strict_mode" msgid="1938795874357830695">"Modi makinifu imewezeshwa"</string> <string name="strict_mode_summary" msgid="142834318897332338">"Mulika skrini wakati programu zinafanya uendeshaji mrefu kwenye mnyororo mkuu"</string> - <string name="pointer_location" msgid="6084434787496938001">"Mahali pa pointa"</string> + <string name="pointer_location" msgid="6084434787496938001">"Mahali pa kiashiria"</string> <string name="pointer_location_summary" msgid="840819275172753713">"Kuegeshwa kwa skrini ikionyesha data ya mguso ya sasa"</string> <string name="show_touches" msgid="2642976305235070316">"Onyesha unapogonga"</string> <string name="show_touches_summary" msgid="6101183132903926324">"Onyesha maoni ya picha unapogonga"</string> @@ -272,6 +272,10 @@ <string name="app_process_limit_title" msgid="4280600650253107163">"Kiwango cha mchakato wa mandari nyuma"</string> <string name="show_all_anrs" msgid="28462979638729082">"Onyesha ANR zote"</string> <string name="show_all_anrs_summary" msgid="641908614413544127">"Onyesha kisanduku kidadisi cha Programu Haiitikii kwa programu za usuli"</string> + <!-- no translation found for show_notification_channel_warnings (1399948193466922683) --> + <skip /> + <!-- no translation found for show_notification_channel_warnings_summary (5536803251863694895) --> + <skip /> <string name="force_allow_on_external" msgid="3215759785081916381">"Lazima uruhusu programu kwenye hifadhi ya nje"</string> <string name="force_allow_on_external_summary" msgid="3640752408258034689">"Huruhusu programu yoyote iwekwe kwenye hifadhi ya nje, bila kujali thamani za faili ya maelezo"</string> <string name="force_resizable_activities" msgid="8615764378147824985">"Lazimisha shughuli ziweze kubadilishwa ukubwa"</string> diff --git a/packages/SettingsLib/res/values-ta/strings.xml b/packages/SettingsLib/res/values-ta/strings.xml index e09db515c041..47f75860a4eb 100644 --- a/packages/SettingsLib/res/values-ta/strings.xml +++ b/packages/SettingsLib/res/values-ta/strings.xml @@ -272,6 +272,10 @@ <string name="app_process_limit_title" msgid="4280600650253107163">"பின்புலச் செயல்முறை வரம்பு"</string> <string name="show_all_anrs" msgid="28462979638729082">"எல்லா ANRகளையும் காட்டு"</string> <string name="show_all_anrs_summary" msgid="641908614413544127">"பின்புலப் பயன்பாடுகளுக்குப் பயன்பாடு பதிலளிக்கவில்லை என்ற உரையாடலைக் காட்டு"</string> + <!-- no translation found for show_notification_channel_warnings (1399948193466922683) --> + <skip /> + <!-- no translation found for show_notification_channel_warnings_summary (5536803251863694895) --> + <skip /> <string name="force_allow_on_external" msgid="3215759785081916381">"பயன்பாடுகளை வெளிப்புறச் சேமிப்பிடத்தில் அனுமதி"</string> <string name="force_allow_on_external_summary" msgid="3640752408258034689">"மேனிஃபெஸ்ட் மதிப்புகளைப் பொருட்படுத்தாமல், எல்லா பயன்பாட்டையும் வெளிப்புறச் சேமிப்பிடத்தில் எழுத அனுமதிக்கும்"</string> <string name="force_resizable_activities" msgid="8615764378147824985">"செயல்பாடுகளை அளவுமாறக்கூடியதாக அமை"</string> diff --git a/packages/SettingsLib/res/values-te/strings.xml b/packages/SettingsLib/res/values-te/strings.xml index dabf7edadd13..1a7ad4d8ef24 100644 --- a/packages/SettingsLib/res/values-te/strings.xml +++ b/packages/SettingsLib/res/values-te/strings.xml @@ -272,6 +272,10 @@ <string name="app_process_limit_title" msgid="4280600650253107163">"నేపథ్య ప్రాసెస్ పరిమితి"</string> <string name="show_all_anrs" msgid="28462979638729082">"అన్ని ANRలను చూపు"</string> <string name="show_all_anrs_summary" msgid="641908614413544127">"నేపథ్య అనువర్తనాల కోసం అనువర్తనం ప్రతిస్పందించడం లేదు డైలాగ్ను చూపు"</string> + <!-- no translation found for show_notification_channel_warnings (1399948193466922683) --> + <skip /> + <!-- no translation found for show_notification_channel_warnings_summary (5536803251863694895) --> + <skip /> <string name="force_allow_on_external" msgid="3215759785081916381">"అనువర్తనాలను బాహ్య నిల్వలో నిర్బంధంగా అనుమతించు"</string> <string name="force_allow_on_external_summary" msgid="3640752408258034689">"ఏ అనువర్తనాన్ని అయినా మానిఫెస్ట్ విలువలతో సంబంధం లేకుండా బాహ్య నిల్వలో వ్రాయడానికి అనుమతిస్తుంది"</string> <string name="force_resizable_activities" msgid="8615764378147824985">"కార్యాచరణలను పరిమాణం మార్చగలిగేలా నిర్బంధించు"</string> diff --git a/packages/SettingsLib/res/values-th/strings.xml b/packages/SettingsLib/res/values-th/strings.xml index 9a265f5316bc..aa0296c6616e 100644 --- a/packages/SettingsLib/res/values-th/strings.xml +++ b/packages/SettingsLib/res/values-th/strings.xml @@ -272,6 +272,10 @@ <string name="app_process_limit_title" msgid="4280600650253107163">"ขีดจำกัดกระบวนการพื้นหลัง"</string> <string name="show_all_anrs" msgid="28462979638729082">"แสดง ANR ทั้งหมด"</string> <string name="show_all_anrs_summary" msgid="641908614413544127">"แสดงหน้าต่างแอปไม่ตอบสนอง สำหรับแอปพื้นหลัง"</string> + <!-- no translation found for show_notification_channel_warnings (1399948193466922683) --> + <skip /> + <!-- no translation found for show_notification_channel_warnings_summary (5536803251863694895) --> + <skip /> <string name="force_allow_on_external" msgid="3215759785081916381">"บังคับให้แอปสามารถใช้ที่เก็บภายนอก"</string> <string name="force_allow_on_external_summary" msgid="3640752408258034689">"ทำให้สามารถเขียนแอปใดๆ ก็ตามไปยังพื้นที่เก็บข้อมูลภายนอกได้ โดยไม่คำนึงถึงค่าในไฟล์ Manifest"</string> <string name="force_resizable_activities" msgid="8615764378147824985">"บังคับให้กิจกรรมปรับขนาดได้"</string> diff --git a/packages/SettingsLib/res/values-tl/strings.xml b/packages/SettingsLib/res/values-tl/strings.xml index c46ac78da289..988a88bd08c7 100644 --- a/packages/SettingsLib/res/values-tl/strings.xml +++ b/packages/SettingsLib/res/values-tl/strings.xml @@ -272,6 +272,10 @@ <string name="app_process_limit_title" msgid="4280600650253107163">"Limitasyon ng proseso sa background"</string> <string name="show_all_anrs" msgid="28462979638729082">"Ipakita ang lahat ng ANR"</string> <string name="show_all_anrs_summary" msgid="641908614413544127">"App Not Responding dialog para sa background apps"</string> + <!-- no translation found for show_notification_channel_warnings (1399948193466922683) --> + <skip /> + <!-- no translation found for show_notification_channel_warnings_summary (5536803251863694895) --> + <skip /> <string name="force_allow_on_external" msgid="3215759785081916381">"Pwersahang payagan ang mga app sa external"</string> <string name="force_allow_on_external_summary" msgid="3640752408258034689">"Ginagawang kwalipikado ang anumang app na mailagay sa external na storage, anuman ang mga value ng manifest"</string> <string name="force_resizable_activities" msgid="8615764378147824985">"Sapilitang gawing resizable ang mga aktibidad"</string> diff --git a/packages/SettingsLib/res/values-tr/strings.xml b/packages/SettingsLib/res/values-tr/strings.xml index 696b20917c2d..5eff6c3afd60 100644 --- a/packages/SettingsLib/res/values-tr/strings.xml +++ b/packages/SettingsLib/res/values-tr/strings.xml @@ -272,6 +272,10 @@ <string name="app_process_limit_title" msgid="4280600650253107163">"Arka plan işlem sınırı"</string> <string name="show_all_anrs" msgid="28462979638729082">"Tüm ANR\'leri göster"</string> <string name="show_all_anrs_summary" msgid="641908614413544127">"Arka plan uygulamalar için Uygulama Yanıt Vermiyor mesajını göster"</string> + <!-- no translation found for show_notification_channel_warnings (1399948193466922683) --> + <skip /> + <!-- no translation found for show_notification_channel_warnings_summary (5536803251863694895) --> + <skip /> <string name="force_allow_on_external" msgid="3215759785081916381">"Harici birimdeki uygulamalara izin vermeye zorla"</string> <string name="force_allow_on_external_summary" msgid="3640752408258034689">"Manifest değerlerinden bağımsız olarak uygulamaları harici depolamaya yazmak için uygun hale getirir"</string> <string name="force_resizable_activities" msgid="8615764378147824985">"Etkinlikleri yeniden boyutlandırılabilmeye zorla"</string> diff --git a/packages/SettingsLib/res/values-uk/strings.xml b/packages/SettingsLib/res/values-uk/strings.xml index d3f137f94626..419a8c00c692 100644 --- a/packages/SettingsLib/res/values-uk/strings.xml +++ b/packages/SettingsLib/res/values-uk/strings.xml @@ -272,6 +272,10 @@ <string name="app_process_limit_title" msgid="4280600650253107163">"Обмеження фон. процесів"</string> <string name="show_all_anrs" msgid="28462979638729082">"Показувати всі ANR"</string> <string name="show_all_anrs_summary" msgid="641908614413544127">"Сповіщати, коли додаток не відповідає"</string> + <!-- no translation found for show_notification_channel_warnings (1399948193466922683) --> + <skip /> + <!-- no translation found for show_notification_channel_warnings_summary (5536803251863694895) --> + <skip /> <string name="force_allow_on_external" msgid="3215759785081916381">"Примусово записувати додатки в зовнішню пам’ять"</string> <string name="force_allow_on_external_summary" msgid="3640752408258034689">"Можна записувати додатки в зовнішню пам’ять, незалежно від значень у маніфесті"</string> <string name="force_resizable_activities" msgid="8615764378147824985">"Примусово масштабувати активність"</string> diff --git a/packages/SettingsLib/res/values-ur/strings.xml b/packages/SettingsLib/res/values-ur/strings.xml index 3fceb9868f0e..55f71324d470 100644 --- a/packages/SettingsLib/res/values-ur/strings.xml +++ b/packages/SettingsLib/res/values-ur/strings.xml @@ -272,6 +272,10 @@ <string name="app_process_limit_title" msgid="4280600650253107163">"پس منظر پروسیس کی حد"</string> <string name="show_all_anrs" msgid="28462979638729082">"سبھی ANRs کو دکھائیں"</string> <string name="show_all_anrs_summary" msgid="641908614413544127">"پس منظر کی ایپس کیلئے ایپ جواب نہیں دے رہی ہے ڈائلاگ دکھائیں"</string> + <!-- no translation found for show_notification_channel_warnings (1399948193466922683) --> + <skip /> + <!-- no translation found for show_notification_channel_warnings_summary (5536803251863694895) --> + <skip /> <string name="force_allow_on_external" msgid="3215759785081916381">"بیرونی پر ایپس کو زبردستی اجازت دیں"</string> <string name="force_allow_on_external_summary" msgid="3640752408258034689">"manifest اقدار سے قطع نظر، کسی بھی ایپ کو بیرونی اسٹوریج پر لکھے جانے کا اہل بناتا ہے"</string> <string name="force_resizable_activities" msgid="8615764378147824985">"سرگرمیوں کو ری سائز ایبل بنائیں"</string> diff --git a/packages/SettingsLib/res/values-uz/strings.xml b/packages/SettingsLib/res/values-uz/strings.xml index ad9dc3a85e59..4b53da5f6efc 100644 --- a/packages/SettingsLib/res/values-uz/strings.xml +++ b/packages/SettingsLib/res/values-uz/strings.xml @@ -272,6 +272,10 @@ <string name="app_process_limit_title" msgid="4280600650253107163">"Fondagi jarayonlarni cheklash"</string> <string name="show_all_anrs" msgid="28462979638729082">"Hamma ANR"</string> <string name="show_all_anrs_summary" msgid="641908614413544127">"Ilova javob bermayotgani haqida xabar qilish"</string> + <!-- no translation found for show_notification_channel_warnings (1399948193466922683) --> + <skip /> + <!-- no translation found for show_notification_channel_warnings_summary (5536803251863694895) --> + <skip /> <string name="force_allow_on_external" msgid="3215759785081916381">"Tashqi xotira qurilmasidagi ilova dasturlariga majburiy ruxsat berish"</string> <string name="force_allow_on_external_summary" msgid="3640752408258034689">"Manifest qiymatidan qat’i nazar istalgan ilovani tashqi xotiraga saqlash imkonini beradi"</string> <string name="force_resizable_activities" msgid="8615764378147824985">"Harakatlarni moslashuvchan o‘lchamga keltirish"</string> diff --git a/packages/SettingsLib/res/values-vi/strings.xml b/packages/SettingsLib/res/values-vi/strings.xml index 910e66c8bcf6..a6a54d0a0609 100644 --- a/packages/SettingsLib/res/values-vi/strings.xml +++ b/packages/SettingsLib/res/values-vi/strings.xml @@ -272,6 +272,10 @@ <string name="app_process_limit_title" msgid="4280600650253107163">"Giới hạn quá trình nền"</string> <string name="show_all_anrs" msgid="28462979638729082">"Hiển thị tất cả ANR"</string> <string name="show_all_anrs_summary" msgid="641908614413544127">"Hiện hộp thoại Ứng dụng ko đáp ứng cho ứng dụng nền"</string> + <!-- no translation found for show_notification_channel_warnings (1399948193466922683) --> + <skip /> + <!-- no translation found for show_notification_channel_warnings_summary (5536803251863694895) --> + <skip /> <string name="force_allow_on_external" msgid="3215759785081916381">"Buộc cho phép các ứng dụng trên bộ nhớ ngoài"</string> <string name="force_allow_on_external_summary" msgid="3640752408258034689">"Giúp mọi ứng dụng đủ điều kiện để được ghi vào bộ nhớ ngoài, bất kể giá trị tệp kê khai là gì"</string> <string name="force_resizable_activities" msgid="8615764378147824985">"Buộc các hoạt động có thể thay đổi kích thước"</string> diff --git a/packages/SettingsLib/res/values-zh-rCN/strings.xml b/packages/SettingsLib/res/values-zh-rCN/strings.xml index b224c23a7400..41c5f60d18da 100644 --- a/packages/SettingsLib/res/values-zh-rCN/strings.xml +++ b/packages/SettingsLib/res/values-zh-rCN/strings.xml @@ -272,6 +272,10 @@ <string name="app_process_limit_title" msgid="4280600650253107163">"后台进程限制"</string> <string name="show_all_anrs" msgid="28462979638729082">"显示所有“应用无响应”(ANR)"</string> <string name="show_all_anrs_summary" msgid="641908614413544127">"为后台应用显示“应用无响应”对话框"</string> + <!-- no translation found for show_notification_channel_warnings (1399948193466922683) --> + <skip /> + <!-- no translation found for show_notification_channel_warnings_summary (5536803251863694895) --> + <skip /> <string name="force_allow_on_external" msgid="3215759785081916381">"强制允许将应用写入外部存储设备"</string> <string name="force_allow_on_external_summary" msgid="3640752408258034689">"允许将任何应用写入外部存储设备(无论清单值是什么)"</string> <string name="force_resizable_activities" msgid="8615764378147824985">"强制将活动设为可调整大小"</string> diff --git a/packages/SettingsLib/res/values-zh-rHK/strings.xml b/packages/SettingsLib/res/values-zh-rHK/strings.xml index 03081af1b1f1..00748b0322d6 100644 --- a/packages/SettingsLib/res/values-zh-rHK/strings.xml +++ b/packages/SettingsLib/res/values-zh-rHK/strings.xml @@ -272,6 +272,10 @@ <string name="app_process_limit_title" msgid="4280600650253107163">"背景處理程序限制"</string> <string name="show_all_anrs" msgid="28462979638729082">"顯示所有 ANR"</string> <string name="show_all_anrs_summary" msgid="641908614413544127">"顯示背景應用程式的「應用程式無回應」對話框"</string> + <!-- no translation found for show_notification_channel_warnings (1399948193466922683) --> + <skip /> + <!-- no translation found for show_notification_channel_warnings_summary (5536803251863694895) --> + <skip /> <string name="force_allow_on_external" msgid="3215759785081916381">"強制允許應用程式寫入到外部儲存空間"</string> <string name="force_allow_on_external_summary" msgid="3640752408258034689">"在任何資訊清單值下,允許將所有符合資格的應用程式寫入到外部儲存完間"</string> <string name="force_resizable_activities" msgid="8615764378147824985">"強制可變更活動尺寸"</string> diff --git a/packages/SettingsLib/res/values-zh-rTW/strings.xml b/packages/SettingsLib/res/values-zh-rTW/strings.xml index 050c5567287b..3988edd27e74 100644 --- a/packages/SettingsLib/res/values-zh-rTW/strings.xml +++ b/packages/SettingsLib/res/values-zh-rTW/strings.xml @@ -272,6 +272,10 @@ <string name="app_process_limit_title" msgid="4280600650253107163">"背景處理程序限制"</string> <string name="show_all_anrs" msgid="28462979638729082">"顯示所有無回應程式"</string> <string name="show_all_anrs_summary" msgid="641908614413544127">"為背景應用程式顯示「應用程式無回應」對話方塊"</string> + <!-- no translation found for show_notification_channel_warnings (1399948193466922683) --> + <skip /> + <!-- no translation found for show_notification_channel_warnings_summary (5536803251863694895) --> + <skip /> <string name="force_allow_on_external" msgid="3215759785081916381">"強制允許將應用程式寫入外部儲存空間"</string> <string name="force_allow_on_external_summary" msgid="3640752408258034689">"允許將任何應用程式寫入外部儲存空間 (無論資訊清單值為何)"</string> <string name="force_resizable_activities" msgid="8615764378147824985">"將活動強制設為可調整大小"</string> diff --git a/packages/SettingsLib/res/values-zu/strings.xml b/packages/SettingsLib/res/values-zu/strings.xml index d2a5743a1919..11dfdccdb31e 100644 --- a/packages/SettingsLib/res/values-zu/strings.xml +++ b/packages/SettingsLib/res/values-zu/strings.xml @@ -272,6 +272,10 @@ <string name="app_process_limit_title" msgid="4280600650253107163">"Isilinganiso senqubo yesithombe sanemuva"</string> <string name="show_all_anrs" msgid="28462979638729082">"Bonisa wonke ama-ANR"</string> <string name="show_all_anrs_summary" msgid="641908614413544127">"Boniso idayalogi Yohlelo Lokusebenza Olungasabeli kwizinhlelo zokusebenza zasemuva"</string> + <!-- no translation found for show_notification_channel_warnings (1399948193466922683) --> + <skip /> + <!-- no translation found for show_notification_channel_warnings_summary (5536803251863694895) --> + <skip /> <string name="force_allow_on_external" msgid="3215759785081916381">"Phoqelela ukuvumela izinhlelo zokusebenza ngaphandle"</string> <string name="force_allow_on_external_summary" msgid="3640752408258034689">"Yenza noma uluphi uhlelo lokusebenza lifaneleke ukuthi libhalwe kusitoreji sangaphandle, ngaphandle kwamavelu we-manifest"</string> <string name="force_resizable_activities" msgid="8615764378147824985">"Imisebenzi yamandla izonikezwa usayizi omusha"</string> diff --git a/packages/SettingsLib/res/values/strings.xml b/packages/SettingsLib/res/values/strings.xml index 044392cc4ad6..4921be1c9367 100644 --- a/packages/SettingsLib/res/values/strings.xml +++ b/packages/SettingsLib/res/values/strings.xml @@ -684,6 +684,12 @@ <string name="show_all_anrs_summary">Show App Not Responding dialog for background apps</string> + <!-- UI debug setting: show all ANRs? [CHAR LIMIT=25] --> + <string name="show_notification_channel_warnings">Show notification channel warnings</string> + <!-- UI debug setting: show all ANRs summary [CHAR LIMIT=50] --> + <string name="show_notification_channel_warnings_summary">Displays on-screen warning when an app posts a notification without a valid channel</string> + + <!-- UI debug setting: force allow apps on external storage [CHAR LIMIT=50] --> <string name="force_allow_on_external">Force allow apps on external</string> <!-- UI debug setting: force allow on external summary [CHAR LIMIT=150] --> diff --git a/packages/SettingsLib/src/com/android/settingslib/graph/BatteryMeterDrawableBase.java b/packages/SettingsLib/src/com/android/settingslib/graph/BatteryMeterDrawableBase.java index 3a2397f671e0..3d50f2362cf2 100755 --- a/packages/SettingsLib/src/com/android/settingslib/graph/BatteryMeterDrawableBase.java +++ b/packages/SettingsLib/src/com/android/settingslib/graph/BatteryMeterDrawableBase.java @@ -141,7 +141,7 @@ public class BatteryMeterDrawableBase extends Drawable { mWarningTextPaint.setColor(mColors[1]); } - mChargeColor = Utils.getDefaultColor(mContext, R.color.batterymeter_charge_color); + mChargeColor = Utils.getDefaultColor(mContext, R.color.meter_consumed_color); mBoltPaint = new Paint(Paint.ANTI_ALIAS_FLAG); mBoltPaint.setColor(Utils.getDefaultColor(mContext, R.color.batterymeter_bolt_color)); diff --git a/packages/SettingsLib/src/com/android/settingslib/wifi/AccessPoint.java b/packages/SettingsLib/src/com/android/settingslib/wifi/AccessPoint.java index eb513e170286..b3565eab79c9 100644 --- a/packages/SettingsLib/src/com/android/settingslib/wifi/AccessPoint.java +++ b/packages/SettingsLib/src/com/android/settingslib/wifi/AccessPoint.java @@ -521,7 +521,8 @@ public class AccessPoint implements Comparable<AccessPoint> { public boolean isMetered() { return mIsScoredNetworkMetered || (mConfig != null && mConfig.meteredHint) - || (mInfo != null && mInfo.getMeteredHint()); + || (mInfo != null && mInfo.getMeteredHint() + || (mNetworkInfo != null && mNetworkInfo.isMetered())); } public NetworkInfo getNetworkInfo() { diff --git a/packages/SettingsLib/tests/integ/src/com/android/settingslib/wifi/AccessPointTest.java b/packages/SettingsLib/tests/integ/src/com/android/settingslib/wifi/AccessPointTest.java index 56cb0a3f682d..801844be87cd 100644 --- a/packages/SettingsLib/tests/integ/src/com/android/settingslib/wifi/AccessPointTest.java +++ b/packages/SettingsLib/tests/integ/src/com/android/settingslib/wifi/AccessPointTest.java @@ -18,7 +18,6 @@ package com.android.settingslib.wifi; import static com.google.common.truth.Truth.assertThat; import static com.google.common.truth.Truth.assertWithMessage; -import static org.junit.Assert.assertTrue; import static org.mockito.Mockito.any; import static org.mockito.Mockito.when; @@ -237,7 +236,7 @@ public class AccessPointTest { homeSp.setFriendlyName("Test Provider"); config.setHomeSp(homeSp); AccessPoint ap = new AccessPoint(mContext, config); - assertTrue(ap.isPasspointConfig()); + assertThat(ap.isPasspointConfig()).isTrue(); } @Test @@ -254,8 +253,8 @@ public class AccessPointTest { wifiInfo.setNetworkId(configuration.networkId); accessPoint.update(configuration, wifiInfo, networkInfo); - assertTrue(accessPoint.isMetered()); - }; + assertThat(accessPoint.isMetered()).isTrue(); + } @Test public void testIsMetered_returnTrueWhenWifiInfoIsMetered() { @@ -271,8 +270,25 @@ public class AccessPointTest { wifiInfo.setMeteredHint(true); accessPoint.update(configuration, wifiInfo, networkInfo); - assertTrue(accessPoint.isMetered()); - }; + assertThat(accessPoint.isMetered()).isTrue(); + } + + @Test + public void testIsMetered_returnTrueWhenNetworkInfoIsMetered() { + WifiConfiguration configuration = createWifiConfiguration(); + + NetworkInfo networkInfo = + new NetworkInfo(ConnectivityManager.TYPE_WIFI, 2, "WIFI", "WIFI_SUBTYPE"); + networkInfo.setMetered(true); + AccessPoint accessPoint = new AccessPoint(mContext, configuration); + WifiInfo wifiInfo = new WifiInfo(); + wifiInfo.setSSID(WifiSsid.createFromAsciiEncoded(configuration.SSID)); + wifiInfo.setBSSID(configuration.BSSID); + wifiInfo.setNetworkId(configuration.networkId); + accessPoint.update(configuration, wifiInfo, networkInfo); + + assertThat(accessPoint.isMetered()).isTrue(); + } @Test public void testIsMetered_returnTrueWhenScoredNetworkIsMetered() { @@ -286,8 +302,24 @@ public class AccessPointTest { true /* metered */)); ap.update(mWifiNetworkScoreCache, false /* scoringUiEnabled */); - assertTrue(ap.isMetered()); - }; + assertThat(ap.isMetered()).isTrue(); + } + + @Test + public void testIsMetered_returnFalseByDefault() { + WifiConfiguration configuration = createWifiConfiguration(); + + NetworkInfo networkInfo = + new NetworkInfo(ConnectivityManager.TYPE_WIFI, 2, "WIFI", "WIFI_SUBTYPE"); + AccessPoint accessPoint = new AccessPoint(mContext, configuration); + WifiInfo wifiInfo = new WifiInfo(); + wifiInfo.setSSID(WifiSsid.createFromAsciiEncoded(configuration.SSID)); + wifiInfo.setBSSID(configuration.BSSID); + wifiInfo.setNetworkId(configuration.networkId); + accessPoint.update(configuration, wifiInfo, networkInfo); + + assertThat(accessPoint.isMetered()).isFalse(); + } private AccessPoint createAccessPointWithScanResultCache() { Bundle bundle = new Bundle(); @@ -400,7 +432,7 @@ public class AccessPointTest { String providerFriendlyName = "Test Provider"; AccessPoint ap = new TestAccessPointBuilder(mContext).setFqdn(fqdn) .setProviderFriendlyName(providerFriendlyName).build(); - assertTrue(ap.isPasspointConfig()); + assertThat(ap.isPasspointConfig()).isTrue(); assertThat(ap.getPasspointFqdn()).isEqualTo(fqdn); assertThat(ap.getConfigName()).isEqualTo(providerFriendlyName); } diff --git a/packages/Shell/src/com/android/shell/BugreportProgressService.java b/packages/Shell/src/com/android/shell/BugreportProgressService.java index 415bf9a0470b..05625c7d5a0c 100644 --- a/packages/Shell/src/com/android/shell/BugreportProgressService.java +++ b/packages/Shell/src/com/android/shell/BugreportProgressService.java @@ -981,6 +981,8 @@ public class BugreportProgressService extends Service { // Since we may be launched behind lockscreen, make sure that ChooserActivity doesn't finish // itself in onStop. chooserIntent.putExtra(ChooserActivity.EXTRA_PRIVATE_RETAIN_IN_ON_STOP, true); + // Starting the activity from a service. + chooserIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); context.startActivity(chooserIntent); } diff --git a/packages/Shell/tests/src/com/android/shell/BugreportReceiverTest.java b/packages/Shell/tests/src/com/android/shell/BugreportReceiverTest.java index 823b9b1023a3..8bfcc74f7b04 100644 --- a/packages/Shell/tests/src/com/android/shell/BugreportReceiverTest.java +++ b/packages/Shell/tests/src/com/android/shell/BugreportReceiverTest.java @@ -355,7 +355,7 @@ public class BugreportReceiverTest { assertProgressNotification(NEW_NAME, 00.00f); Bundle extras = sendBugreportFinishedAndGetSharedIntent(ID, mPlainTextPath, - mScreenshotPath); + mScreenshotPath, TITLE); assertActionSendMultiple(extras, BUGREPORT_CONTENT, SCREENSHOT_CONTENT, ID, PID, TITLE, NEW_NAME, TITLE, mDescription, 0, RENAMED_SCREENSHOTS); @@ -410,7 +410,7 @@ public class BugreportReceiverTest { assertProgressNotification(NEW_NAME, 00.00f); Bundle extras = sendBugreportFinishedAndGetSharedIntent(ID, - plainText? mPlainTextPath : mZipPath, mScreenshotPath); + plainText? mPlainTextPath : mZipPath, mScreenshotPath, TITLE); assertActionSendMultiple(extras, BUGREPORT_CONTENT, SCREENSHOT_CONTENT, ID, PID, TITLE, NEW_NAME, TITLE, mDescription, 0, RENAMED_SCREENSHOTS); @@ -465,7 +465,7 @@ public class BugreportReceiverTest { sendBugreportStarted(ID2, PID2, NAME2, 1000); sendBugreportFinished(ID, mZipPath, mScreenshotPath); - Bundle extras = acceptBugreportAndGetSharedIntent(ID); + Bundle extras = acceptBugreportAndGetSharedIntent(TITLE); detailsUi = new DetailsUi(mUiBot, ID2, NAME2); detailsUi.assertName(NAME2); @@ -479,7 +479,7 @@ public class BugreportReceiverTest { // Must use a different zip file otherwise it will fail because zip already contains // title.txt and description.txt entries. - extras = sendBugreportFinishedAndGetSharedIntent(ID2, mZipPath2, NO_SCREENSHOT); + extras = sendBugreportFinishedAndGetSharedIntent(ID2, mZipPath2, NO_SCREENSHOT, TITLE2); assertActionSendMultiple(extras, BUGREPORT_CONTENT, NO_SCREENSHOT, ID2, PID2, TITLE2, NEW_NAME2, TITLE2, DESCRIPTION2, 0, RENAMED_SCREENSHOTS); @@ -568,7 +568,7 @@ public class BugreportReceiverTest { // Send notification and click on share. sendBugreportFinished(NO_ID, mPlainTextPath, null); - acceptBugreport(NO_ID); + mUiBot.clickOnNotification(mContext.getString(R.string.bugreport_finished_title, NO_ID)); // Handle the warning mUiBot.getVisibleObject(mContext.getString(R.string.bugreport_confirm)); @@ -725,13 +725,26 @@ public class BugreportReceiverTest { return acceptBugreportAndGetSharedIntent(id); } + // TODO: document / merge these 3 sendBugreportFinishedAndGetSharedIntent methods + private Bundle sendBugreportFinishedAndGetSharedIntent(int id, String bugreportPath, + String screenshotPath, String notificationTitle) { + sendBugreportFinished(id, bugreportPath, screenshotPath); + return acceptBugreportAndGetSharedIntent(notificationTitle); + } + /** * Accepts the notification to share the finished bugreport and waits for the result. * * @return extras sent in the shared intent. */ private Bundle acceptBugreportAndGetSharedIntent(int id) { - acceptBugreport(id); + final String notificationTitle = mContext.getString(R.string.bugreport_finished_title, id); + return acceptBugreportAndGetSharedIntent(notificationTitle); + } + + // TODO: document and/or merge these 2 acceptBugreportAndGetSharedIntent methods + private Bundle acceptBugreportAndGetSharedIntent(String notificationTitle) { + mUiBot.clickOnNotification(notificationTitle); mUiBot.chooseActivity(UI_NAME); return mListener.getExtras(); } @@ -744,13 +757,6 @@ public class BugreportReceiverTest { } /** - * Accepts the notification to share the finished bugreport. - */ - private void acceptBugreport(int id) { - mUiBot.clickOnNotification(mContext.getString(R.string.bugreport_finished_title, id)); - } - - /** * Sends a "bugreport finished" intent. */ private void sendBugreportFinished(int id, String bugreportPath, String screenshotPath) { diff --git a/packages/SystemUI/res-keyguard/layout/keyguard_status_area.xml b/packages/SystemUI/res-keyguard/layout/keyguard_status_area.xml index 8fe283519861..ed415b8efdac 100644 --- a/packages/SystemUI/res-keyguard/layout/keyguard_status_area.xml +++ b/packages/SystemUI/res-keyguard/layout/keyguard_status_area.xml @@ -30,7 +30,6 @@ android:layout_height="wrap_content" android:textColor="@color/clock_white" style="@style/widget_label" - android:textAllCaps="true" android:letterSpacing="0.15" android:gravity="center" /> @@ -41,7 +40,6 @@ android:drawableStart="@drawable/ic_access_alarms_big" android:textColor="@color/clock_gray" android:letterSpacing="0.15" - android:textAllCaps="true" style="@style/widget_label" android:layout_marginStart="6dp" android:gravity="center" diff --git a/packages/SystemUI/res-keyguard/values-h560dp/dimens.xml b/packages/SystemUI/res-keyguard/values-h560dp/dimens.xml index 469ce520133e..3fb86d03a167 100644 --- a/packages/SystemUI/res-keyguard/values-h560dp/dimens.xml +++ b/packages/SystemUI/res-keyguard/values-h560dp/dimens.xml @@ -16,5 +16,5 @@ --> <resources> - <dimen name="widget_big_font_size">84dp</dimen> + <dimen name="widget_big_font_size">64dp</dimen> </resources>
\ No newline at end of file diff --git a/packages/SystemUI/res-keyguard/values-h650dp/dimens.xml b/packages/SystemUI/res-keyguard/values-h650dp/dimens.xml index cb89cb46fc3e..3fb86d03a167 100644 --- a/packages/SystemUI/res-keyguard/values-h650dp/dimens.xml +++ b/packages/SystemUI/res-keyguard/values-h650dp/dimens.xml @@ -16,5 +16,5 @@ --> <resources> - <dimen name="widget_big_font_size">88dp</dimen> + <dimen name="widget_big_font_size">64dp</dimen> </resources>
\ No newline at end of file diff --git a/packages/SystemUI/res-keyguard/values-pt-rPT/strings.xml b/packages/SystemUI/res-keyguard/values-pt-rPT/strings.xml index 83ba8bf9f40e..7e208c217401 100644 --- a/packages/SystemUI/res-keyguard/values-pt-rPT/strings.xml +++ b/packages/SystemUI/res-keyguard/values-pt-rPT/strings.xml @@ -91,13 +91,13 @@ <string name="kg_failed_attempts_almost_at_login" product="default" msgid="8364140853305528449">"Desenhou a sequência de desbloqueio incorretamente <xliff:g id="NUMBER_0">%1$d</xliff:g> vezes. Após mais <xliff:g id="NUMBER_1">%2$d</xliff:g> tentativas sem êxito, ser-lhe-á pedido para desbloquear o telemóvel através de uma conta de email.\n\n Tente novamente dentro de <xliff:g id="NUMBER_2">%3$d</xliff:g> segundos."</string> <string name="kg_password_wrong_pin_code_pukked" msgid="3389829202093674267">"Código PIN do cartão SIM incorreto. Tem de contactar o seu operador para desbloquear o dispositivo."</string> <plurals name="kg_password_wrong_pin_code" formatted="false" msgid="4314341367727055967"> + <item quantity="one">Incorrect SIM PIN code, you have <xliff:g id="NUMBER_1">%d</xliff:g> remaining attempts.</item> <item quantity="other">Código PIN do cartão SIM incorreto. Tem mais <xliff:g id="NUMBER_1">%d</xliff:g> tentativas.</item> - <item quantity="one">Código PIN do cartão SIM incorreto. Tem mais <xliff:g id="NUMBER_0">%d</xliff:g> tentativa antes de precisar de contactar o seu operador para desbloquear o dispositivo.</item> </plurals> <string name="kg_password_wrong_puk_code_dead" msgid="3329017604125179374">"Cartão SIM inutilizável. Contacte o seu operador."</string> <plurals name="kg_password_wrong_puk_code" formatted="false" msgid="2287504898931957513"> + <item quantity="one">Incorrect SIM PUK code, you have <xliff:g id="NUMBER_1">%d</xliff:g> remaining attempts before SIM becomes permanently unusable.</item> <item quantity="other">Código PUK do cartão SIM incorreto. Tem mais <xliff:g id="NUMBER_1">%d</xliff:g> tentativas antes de o cartão SIM ficar permanentemente inutilizável.</item> - <item quantity="one">Código PUK do cartão SIM incorreto. Tem mais <xliff:g id="NUMBER_0">%d</xliff:g> tentativa antes de o cartão SIM ficar permanentemente inutilizável.</item> </plurals> <string name="kg_password_pin_failed" msgid="8769990811451236223">"Falha ao introduzir o PIN do cartão SIM!"</string> <string name="kg_password_puk_failed" msgid="1331621440873439974">"Falha ao introduzir o PUK do cartão SIM!"</string> @@ -117,16 +117,16 @@ <string name="kg_prompt_reason_device_admin" msgid="3452168247888906179">"Dispositivo bloqueado pelo administrador"</string> <string name="kg_prompt_reason_user_request" msgid="8236951765212462286">"O dispositivo foi bloqueado manualmente"</string> <plurals name="kg_prompt_reason_time_pattern" formatted="false" msgid="71299470072448533"> + <item quantity="one">Device hasn\'t been unlocked for <xliff:g id="NUMBER_1">%d</xliff:g> hours. Confirm pattern.</item> <item quantity="other">O dispositivo não é desbloqueado há <xliff:g id="NUMBER_1">%d</xliff:g> horas. Confirme o padrão.</item> - <item quantity="one">O dispositivo não é desbloqueado há <xliff:g id="NUMBER_0">%d</xliff:g> hora. Confirme o padrão.</item> </plurals> <plurals name="kg_prompt_reason_time_pin" formatted="false" msgid="34586942088144385"> + <item quantity="one">Device hasn\'t been unlocked for <xliff:g id="NUMBER_1">%d</xliff:g> hours. Confirm PIN.</item> <item quantity="other">O dispositivo não é desbloqueado há <xliff:g id="NUMBER_1">%d</xliff:g> horas. Confirme o PIN.</item> - <item quantity="one">O dispositivo não é desbloqueado há <xliff:g id="NUMBER_0">%d</xliff:g> hora. Confirme o PIN.</item> </plurals> <plurals name="kg_prompt_reason_time_password" formatted="false" msgid="257297696215346527"> + <item quantity="one">Device hasn\'t been unlocked for <xliff:g id="NUMBER_1">%d</xliff:g> hours. Confirm password.</item> <item quantity="other">O dispositivo não é desbloqueado há <xliff:g id="NUMBER_1">%d</xliff:g> horas. Confirme a palavra-passe.</item> - <item quantity="one">O dispositivo não é desbloqueado há <xliff:g id="NUMBER_0">%d</xliff:g> hora. Confirme a palavra-passe.</item> </plurals> <string name="fingerprint_not_recognized" msgid="348813995267914625">"Não reconhecido"</string> </resources> diff --git a/packages/SystemUI/res-keyguard/values-sw600dp/dimens.xml b/packages/SystemUI/res-keyguard/values-sw600dp/dimens.xml index a3b01b6acfe4..9e788bec49cd 100644 --- a/packages/SystemUI/res-keyguard/values-sw600dp/dimens.xml +++ b/packages/SystemUI/res-keyguard/values-sw600dp/dimens.xml @@ -26,7 +26,7 @@ <dimen name="keyguard_security_view_margin">12dp</dimen> <!-- Overload default clock widget parameters --> - <dimen name="widget_big_font_size">110dp</dimen> + <dimen name="widget_big_font_size">100dp</dimen> <dimen name="widget_label_font_size">16sp</dimen> <dimen name="bottom_text_spacing_digital">-1dp</dimen> diff --git a/packages/SystemUI/res-keyguard/values-sw720dp/dimens.xml b/packages/SystemUI/res-keyguard/values-sw720dp/dimens.xml index 210c7eb61908..7eb63d7b100a 100644 --- a/packages/SystemUI/res-keyguard/values-sw720dp/dimens.xml +++ b/packages/SystemUI/res-keyguard/values-sw720dp/dimens.xml @@ -24,5 +24,5 @@ <!-- Height of the sliding KeyguardSecurityContainer (includes 2x keyguard_security_view_margin) --> <dimen name="keyguard_security_height">420dp</dimen> - <dimen name="widget_big_font_size">122dp</dimen> + <dimen name="widget_big_font_size">100dp</dimen> </resources> diff --git a/packages/SystemUI/res-keyguard/values/dimens.xml b/packages/SystemUI/res-keyguard/values/dimens.xml index 7b952be2f7f3..3ca6e6944a32 100644 --- a/packages/SystemUI/res-keyguard/values/dimens.xml +++ b/packages/SystemUI/res-keyguard/values/dimens.xml @@ -41,7 +41,7 @@ <!-- Default clock parameters --> <dimen name="bottom_text_spacing_digital">-1dp</dimen> <dimen name="widget_label_font_size">14sp</dimen> - <dimen name="widget_big_font_size">78dp</dimen> + <dimen name="widget_big_font_size">64dp</dimen> <!-- The y translation to apply at the start in appear animations. --> <dimen name="appear_y_translation_start">32dp</dimen> diff --git a/packages/SystemUI/res/layout/qs_panel.xml b/packages/SystemUI/res/layout/qs_panel.xml index fb47bbc370e1..fb4ac044486d 100644 --- a/packages/SystemUI/res/layout/qs_panel.xml +++ b/packages/SystemUI/res/layout/qs_panel.xml @@ -35,6 +35,7 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:elevation="4dp" + android:background="#00000000" android:layout_marginBottom="48dp" /> <include layout="@layout/quick_status_bar_expanded_header" /> diff --git a/packages/SystemUI/res/layout/quick_status_bar_expanded_header.xml b/packages/SystemUI/res/layout/quick_status_bar_expanded_header.xml index 65344b703035..2502d414ef43 100644 --- a/packages/SystemUI/res/layout/quick_status_bar_expanded_header.xml +++ b/packages/SystemUI/res/layout/quick_status_bar_expanded_header.xml @@ -24,6 +24,7 @@ android:layout_height="@dimen/status_bar_header_height" android:layout_gravity="@integer/notification_panel_layout_gravity" android:baselineAligned="false" + android:background="#00000000" android:elevation="4dp" android:clickable="false" android:clipChildren="false" diff --git a/packages/SystemUI/res/values-fr/strings.xml b/packages/SystemUI/res/values-fr/strings.xml index 18b9357f56c9..811b16ce37bf 100644 --- a/packages/SystemUI/res/values-fr/strings.xml +++ b/packages/SystemUI/res/values-fr/strings.xml @@ -719,8 +719,8 @@ <string name="pip_phone_minimize" msgid="1079119422589131792">"Réduire"</string> <string name="pip_phone_close" msgid="8416647892889710330">"Fermer"</string> <string name="pip_phone_dismiss_hint" msgid="6351678169095923899">"Faire glisser vers le bas pour ignorer"</string> - <string name="pip_menu_title" msgid="3328510504196964712">"Menu PIP"</string> - <string name="pip_notification_title" msgid="3204024940158161322">"<xliff:g id="NAME">%s</xliff:g> est en mode PIP"</string> + <string name="pip_menu_title" msgid="3328510504196964712">"Menu Picture-in-picture"</string> + <string name="pip_notification_title" msgid="3204024940158161322">"<xliff:g id="NAME">%s</xliff:g> est en mode Picture-in-picture"</string> <string name="pip_notification_message" msgid="4171698133469539591">"Si vous ne voulez pas que l\'application <xliff:g id="NAME">%s</xliff:g> utilise cette fonctionnalité, appuyez ici pour ouvrir les paramètres et la désactiver."</string> <string name="pip_play" msgid="1417176722760265888">"Lecture"</string> <string name="pip_pause" msgid="8881063404466476571">"Suspendre"</string> diff --git a/packages/SystemUI/res/values-fr/strings_tv.xml b/packages/SystemUI/res/values-fr/strings_tv.xml index 3c0ad7a10bbe..43579afce308 100644 --- a/packages/SystemUI/res/values-fr/strings_tv.xml +++ b/packages/SystemUI/res/values-fr/strings_tv.xml @@ -19,7 +19,7 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="notification_channel_tv_pip" msgid="134047986446577723">"Picture-in-Picture"</string> + <string name="notification_channel_tv_pip" msgid="134047986446577723">"Picture-in-Picture (PIP)"</string> <string name="pip_notification_unknown_title" msgid="6289156118095849438">"(Programme sans titre)"</string> <string name="pip_close" msgid="3480680679023423574">"Fermer mode PIP"</string> <string name="pip_fullscreen" msgid="8604643018538487816">"Plein écran"</string> diff --git a/packages/SystemUI/res/values-gl/strings.xml b/packages/SystemUI/res/values-gl/strings.xml index ff3dba4917b6..7481d1aea66d 100644 --- a/packages/SystemUI/res/values-gl/strings.xml +++ b/packages/SystemUI/res/values-gl/strings.xml @@ -719,8 +719,8 @@ <string name="pip_phone_minimize" msgid="1079119422589131792">"Minimizar"</string> <string name="pip_phone_close" msgid="8416647892889710330">"Pechar"</string> <string name="pip_phone_dismiss_hint" msgid="6351678169095923899">"Arrastra cara abaixo para ignorar"</string> - <string name="pip_menu_title" msgid="3328510504196964712">"Menú de imaxe superposta"</string> - <string name="pip_notification_title" msgid="3204024940158161322">"<xliff:g id="NAME">%s</xliff:g> está na imaxe superposta"</string> + <string name="pip_menu_title" msgid="3328510504196964712">"Menú de pantalla superposta"</string> + <string name="pip_notification_title" msgid="3204024940158161322">"<xliff:g id="NAME">%s</xliff:g> está na pantalla superposta"</string> <string name="pip_notification_message" msgid="4171698133469539591">"Se non queres que <xliff:g id="NAME">%s</xliff:g> utilice esta función, toca para abrir a configuración e desactivala."</string> <string name="pip_play" msgid="1417176722760265888">"Reproducir"</string> <string name="pip_pause" msgid="8881063404466476571">"Pausar"</string> diff --git a/packages/SystemUI/res/values-gl/strings_tv.xml b/packages/SystemUI/res/values-gl/strings_tv.xml index c7f0ce1ef992..87a636c60b29 100644 --- a/packages/SystemUI/res/values-gl/strings_tv.xml +++ b/packages/SystemUI/res/values-gl/strings_tv.xml @@ -19,7 +19,7 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> - <string name="notification_channel_tv_pip" msgid="134047986446577723">"Imaxe superposta"</string> + <string name="notification_channel_tv_pip" msgid="134047986446577723">"Pantalla superposta"</string> <string name="pip_notification_unknown_title" msgid="6289156118095849438">"(Programa sen título)"</string> <string name="pip_close" msgid="3480680679023423574">"Pechar PIP"</string> <string name="pip_fullscreen" msgid="8604643018538487816">"Pantalla completa"</string> diff --git a/packages/SystemUI/res/values-hi/strings.xml b/packages/SystemUI/res/values-hi/strings.xml index 9567c9163672..92bc82e033d0 100644 --- a/packages/SystemUI/res/values-hi/strings.xml +++ b/packages/SystemUI/res/values-hi/strings.xml @@ -470,7 +470,7 @@ <string name="keyguard_indication_trust_disabled" msgid="7412534203633528135">"जब तक कि आप मैन्युअल रूप से अनलॉक नहीं करते तब तक डिवाइस लॉक रहेगा"</string> <string name="hidden_notifications_title" msgid="7139628534207443290">"सूचनाएं अधिक तेज़ी से प्राप्त करें"</string> <string name="hidden_notifications_text" msgid="2326409389088668981">"आपके द्वारा उन्हें अनलॉक किए जाने से पहले देखें"</string> - <string name="hidden_notifications_cancel" msgid="3690709735122344913">"नहीं धन्यवाद"</string> + <string name="hidden_notifications_cancel" msgid="3690709735122344913">"रहने दें"</string> <string name="hidden_notifications_setup" msgid="41079514801976810">"सेट करें"</string> <string name="zen_mode_and_condition" msgid="4462471036429759903">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>. <xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string> <string name="volume_zen_end_now" msgid="6930243045593601084">"अभी बंद करें"</string> diff --git a/packages/SystemUI/res/values-hy/strings.xml b/packages/SystemUI/res/values-hy/strings.xml index 4d1fc9fc5c85..1189b0535af6 100644 --- a/packages/SystemUI/res/values-hy/strings.xml +++ b/packages/SystemUI/res/values-hy/strings.xml @@ -155,7 +155,7 @@ <string name="accessibility_cell_data" msgid="5326139158682385073">"Բջջային ինտերնետ"</string> <string name="accessibility_cell_data_on" msgid="5927098403452994422">"Բջջային տվյալները միացված են"</string> <string name="accessibility_cell_data_off" msgid="443267573897409704">"Բջջային տվյալներն անջատված են"</string> - <string name="accessibility_bluetooth_tether" msgid="4102784498140271969">"Bluetooth-ը կապվում է:"</string> + <string name="accessibility_bluetooth_tether" msgid="4102784498140271969">"Bluetooth մոդեմ"</string> <string name="accessibility_airplane_mode" msgid="834748999790763092">"Ինքնաթիռի ռեժիմ"</string> <string name="accessibility_vpn_on" msgid="5993385083262856059">"Միացնել VPN-ը։"</string> <string name="accessibility_no_sims" msgid="3957997018324995781">"SIM քարտ չկա:"</string> @@ -311,7 +311,7 @@ <string name="quick_settings_done" msgid="3402999958839153376">"Պատրաստ է"</string> <string name="quick_settings_connected" msgid="1722253542984847487">"Կապակցված է"</string> <string name="quick_settings_connecting" msgid="47623027419264404">"Միանում է..."</string> - <string name="quick_settings_tethering_label" msgid="7153452060448575549">"Միացում"</string> + <string name="quick_settings_tethering_label" msgid="7153452060448575549">"Մոդեմի ռեժիմ"</string> <string name="quick_settings_hotspot_label" msgid="6046917934974004879">"Թեժ կետ"</string> <string name="quick_settings_notifications_label" msgid="4818156442169154523">"Ծանուցումներ"</string> <string name="quick_settings_flashlight_label" msgid="2133093497691661546">"Լապտեր"</string> diff --git a/packages/SystemUI/res/values-ko/strings.xml b/packages/SystemUI/res/values-ko/strings.xml index c4f8e7b38375..273b39051fcb 100644 --- a/packages/SystemUI/res/values-ko/strings.xml +++ b/packages/SystemUI/res/values-ko/strings.xml @@ -750,8 +750,8 @@ <string name="notification_channel_screenshot" msgid="6314080179230000938">"스크린샷"</string> <string name="notification_channel_general" msgid="4525309436693914482">"일반 메시지"</string> <string name="notification_channel_storage" msgid="3077205683020695313">"저장소"</string> - <string name="instant_apps" msgid="6647570248119804907">"빠른 실행 앱"</string> - <string name="instant_apps_message" msgid="8116608994995104836">"빠른 실행 앱은 설치가 필요하지 않습니다."</string> + <string name="instant_apps" msgid="6647570248119804907">"인스턴트 앱"</string> + <string name="instant_apps_message" msgid="8116608994995104836">"인스턴트 앱은 설치가 필요하지 않습니다."</string> <string name="app_info" msgid="6856026610594615344">"앱 정보"</string> <string name="go_to_web" msgid="1106022723459948514">"웹으로 이동"</string> <string name="mobile_data" msgid="7094582042819250762">"모바일 데이터"</string> diff --git a/packages/SystemUI/res/values-pt-rPT/strings.xml b/packages/SystemUI/res/values-pt-rPT/strings.xml index c5089a452f76..74089b2982cf 100644 --- a/packages/SystemUI/res/values-pt-rPT/strings.xml +++ b/packages/SystemUI/res/values-pt-rPT/strings.xml @@ -26,8 +26,8 @@ <string name="status_bar_no_recent_apps" msgid="7374907845131203189">"Os ecrãs recentes aparecem aqui"</string> <string name="status_bar_accessibility_dismiss_recents" msgid="4576076075226540105">"Ignorar aplicações recentes"</string> <plurals name="status_bar_accessibility_recent_apps" formatted="false" msgid="9138535907802238759"> + <item quantity="one">%d screens in Overview</item> <item quantity="other">%d ecrãs na Vista geral</item> - <item quantity="one">1 ecrã na Vista geral</item> </plurals> <string name="status_bar_no_notifications_title" msgid="4755261167193833213">"Sem notificações"</string> <string name="status_bar_ongoing_events_title" msgid="1682504513316879202">"Em curso"</string> @@ -252,8 +252,8 @@ <string name="accessibility_clear_all" msgid="5235938559247164925">"Limpar todas as notificações."</string> <string name="notification_group_overflow_indicator" msgid="1863231301642314183">"+ <xliff:g id="NUMBER">%s</xliff:g>"</string> <plurals name="notification_group_overflow_description" formatted="false" msgid="4579313201268495404"> + <item quantity="one"><xliff:g id="NUMBER_1">%s</xliff:g> more notifications inside.</item> <item quantity="other">Mais <xliff:g id="NUMBER_1">%s</xliff:g> notificações no grupo.</item> - <item quantity="one">Mais <xliff:g id="NUMBER_0">%s</xliff:g> notificação no grupo.</item> </plurals> <string name="status_bar_notification_inspect_item_title" msgid="5668348142410115323">"Definições de notificação"</string> <string name="status_bar_notification_app_settings_title" msgid="5525260160341558869">"Definições do <xliff:g id="APP_NAME">%s</xliff:g>"</string> @@ -552,13 +552,13 @@ <string name="notification_num_channels" msgid="2048144408999179471">"<xliff:g id="NUMBER">%d</xliff:g> categorias de notificação"</string> <string name="notification_default_channel_desc" msgid="2506053815870808359">"Esta aplicação não tem categorias de notificação"</string> <plurals name="notification_num_channels_desc" formatted="false" msgid="5492793452274077663"> + <item quantity="one">1 out of <xliff:g id="NUMBER_1">%d</xliff:g> notification categories from this app</item> <item quantity="other">1 de <xliff:g id="NUMBER_1">%d</xliff:g> categorias de notificação desta aplicação</item> - <item quantity="one">1 de <xliff:g id="NUMBER_0">%d</xliff:g> categoria de notificação desta aplicação</item> </plurals> <string name="notification_channels_list_desc_2" msgid="6214732715833946441">"<xliff:g id="CHANNEL_NAME_1">%1$s</xliff:g>, <xliff:g id="CHANNEL_NAME_2">%2$s</xliff:g>"</string> <plurals name="notification_channels_list_desc_2_and_others" formatted="false" msgid="2747813553355336157"> + <item quantity="one"><xliff:g id="CHANNEL_NAME_1_3">%1$s</xliff:g>, <xliff:g id="CHANNEL_NAME_2_4">%2$s</xliff:g>, and <xliff:g id="NUMBER_5">%3$d</xliff:g> others</item> <item quantity="other"><xliff:g id="CHANNEL_NAME_1_3">%1$s</xliff:g>, <xliff:g id="CHANNEL_NAME_2_4">%2$s</xliff:g> e mais <xliff:g id="NUMBER_5">%3$d</xliff:g></item> - <item quantity="one"><xliff:g id="CHANNEL_NAME_1_0">%1$s</xliff:g>, <xliff:g id="CHANNEL_NAME_2_1">%2$s</xliff:g> e mais <xliff:g id="NUMBER_2">%3$d</xliff:g></item> </plurals> <string name="notification_channel_controls_opened_accessibility" msgid="6553950422055908113">"Controlos de notificações da aplicação <xliff:g id="APP_NAME">%1$s</xliff:g> abertos"</string> <string name="notification_channel_controls_closed_accessibility" msgid="7521619812603693144">"Controlos de notificações da aplicação <xliff:g id="APP_NAME">%1$s</xliff:g> fechados"</string> diff --git a/packages/SystemUI/src/com/android/systemui/BatteryMeterView.java b/packages/SystemUI/src/com/android/systemui/BatteryMeterView.java index 9dd39d432527..cf8747e19e85 100644 --- a/packages/SystemUI/src/com/android/systemui/BatteryMeterView.java +++ b/packages/SystemUI/src/com/android/systemui/BatteryMeterView.java @@ -89,7 +89,7 @@ public class BatteryMeterView extends LinearLayout implements TypedArray atts = context.obtainStyledAttributes(attrs, R.styleable.BatteryMeterView, defStyle, 0); final int frameColor = atts.getColor(R.styleable.BatteryMeterView_frameColor, - context.getColor(R.color.batterymeter_frame_color)); + context.getColor(R.color.meter_background_color)); mDrawable = new BatteryMeterDrawableBase(context, frameColor); atts.recycle(); diff --git a/packages/SystemUI/src/com/android/systemui/RecentsComponent.java b/packages/SystemUI/src/com/android/systemui/RecentsComponent.java index cdad8aedff21..44a044bc4ce4 100644 --- a/packages/SystemUI/src/com/android/systemui/RecentsComponent.java +++ b/packages/SystemUI/src/com/android/systemui/RecentsComponent.java @@ -22,9 +22,6 @@ import android.view.View; public interface RecentsComponent { void showRecentApps(boolean triggeredFromAltTab, boolean fromHome); - void hideRecentApps(boolean triggeredFromAltTab, boolean triggeredFromHomeKey); - void toggleRecents(); - void preloadRecents(); void showNextAffiliatedTask(); void showPrevAffiliatedTask(); diff --git a/packages/SystemUI/src/com/android/systemui/pip/BasePipManager.java b/packages/SystemUI/src/com/android/systemui/pip/BasePipManager.java index 68c80073d240..36dbb0f3061b 100644 --- a/packages/SystemUI/src/com/android/systemui/pip/BasePipManager.java +++ b/packages/SystemUI/src/com/android/systemui/pip/BasePipManager.java @@ -17,12 +17,13 @@ package com.android.systemui.pip; import android.content.Context; +import android.content.res.Configuration; import java.io.PrintWriter; public interface BasePipManager { void initialize(Context context); void showPictureInPictureMenu(); - void onConfigurationChanged(); + void onConfigurationChanged(Configuration newConfig); void dump(PrintWriter pw); } diff --git a/packages/SystemUI/src/com/android/systemui/pip/PipUI.java b/packages/SystemUI/src/com/android/systemui/pip/PipUI.java index a1f6553aa7d5..b7164cbb3271 100644 --- a/packages/SystemUI/src/com/android/systemui/pip/PipUI.java +++ b/packages/SystemUI/src/com/android/systemui/pip/PipUI.java @@ -72,7 +72,7 @@ public class PipUI extends SystemUI implements CommandQueue.Callbacks { return; } - mPipManager.onConfigurationChanged(); + mPipManager.onConfigurationChanged(newConfig); } @Override diff --git a/packages/SystemUI/src/com/android/systemui/pip/phone/PipManager.java b/packages/SystemUI/src/com/android/systemui/pip/phone/PipManager.java index 0da468114890..0373d77940d7 100644 --- a/packages/SystemUI/src/com/android/systemui/pip/phone/PipManager.java +++ b/packages/SystemUI/src/com/android/systemui/pip/phone/PipManager.java @@ -25,6 +25,7 @@ import android.app.IActivityManager; import android.content.ComponentName; import android.content.Context; import android.content.pm.ParceledListSlice; +import android.content.res.Configuration; import android.graphics.Rect; import android.os.Handler; import android.os.RemoteException; @@ -70,7 +71,7 @@ public class PipManager implements BasePipManager { TaskStackListener mTaskStackListener = new TaskStackListener() { @Override public void onActivityPinned(String packageName, int taskId) { - if (!checkCurrentUserId(false /* debug */)) { + if (!checkCurrentUserId(mContext, false /* debug */)) { return; } @@ -85,7 +86,7 @@ public class PipManager implements BasePipManager { @Override public void onActivityUnpinned() { - if (!checkCurrentUserId(false /* debug */)) { + if (!checkCurrentUserId(mContext, false /* debug */)) { return; } @@ -114,7 +115,7 @@ public class PipManager implements BasePipManager { @Override public void onPinnedActivityRestartAttempt(boolean clearedTask) { - if (!checkCurrentUserId(false /* debug */)) { + if (!checkCurrentUserId(mContext, false /* debug */)) { return; } @@ -196,7 +197,7 @@ public class PipManager implements BasePipManager { /** * Updates the PIP per configuration changed. */ - public void onConfigurationChanged() { + public void onConfigurationChanged(Configuration newConfig) { mTouchHandler.onConfigurationChanged(); } diff --git a/packages/SystemUI/src/com/android/systemui/pip/tv/PipManager.java b/packages/SystemUI/src/com/android/systemui/pip/tv/PipManager.java index 1c5da4d12b0c..5414aad0a63f 100644 --- a/packages/SystemUI/src/com/android/systemui/pip/tv/PipManager.java +++ b/packages/SystemUI/src/com/android/systemui/pip/tv/PipManager.java @@ -26,6 +26,7 @@ import android.content.Context; import android.content.Intent; import android.content.IntentFilter; import android.content.pm.ParceledListSlice; +import android.content.res.Configuration; import android.content.res.Resources; import android.graphics.Rect; import android.media.session.MediaController; @@ -116,6 +117,7 @@ public class PipManager implements BasePipManager { private Rect mDefaultPipBounds = new Rect(); private Rect mSettingsPipBounds; private Rect mMenuModePipBounds; + private int mLastOrientation = Configuration.ORIENTATION_UNDEFINED; private boolean mInitialized; private int mPipTaskId = TASK_ID_NO_PIP; private ComponentName mPipComponentName; @@ -237,7 +239,7 @@ public class PipManager implements BasePipManager { } } - loadConfigurationsAndApply(); + loadConfigurationsAndApply(mContext.getResources().getConfiguration()); mMediaSessionManager = (MediaSessionManager) mContext.getSystemService(Context.MEDIA_SESSION_SERVICE); @@ -250,7 +252,14 @@ public class PipManager implements BasePipManager { mPipNotification = new PipNotification(context); } - private void loadConfigurationsAndApply() { + private void loadConfigurationsAndApply(Configuration newConfig) { + if (mLastOrientation != newConfig.orientation) { + // Don't resize the pinned stack on orientation change. TV does not care about this case + // and this could clobber the existing animation to the new bounds calculated by WM. + mLastOrientation = newConfig.orientation; + return; + } + Resources res = mContext.getResources(); mSettingsPipBounds = Rect.unflattenFromString(res.getString( R.string.pip_settings_bounds)); @@ -267,8 +276,8 @@ public class PipManager implements BasePipManager { /** * Updates the PIP per configuration changed. */ - public void onConfigurationChanged() { - loadConfigurationsAndApply(); + public void onConfigurationChanged(Configuration newConfig) { + loadConfigurationsAndApply(newConfig); mPipNotification.onConfigurationChanged(mContext); } @@ -577,7 +586,7 @@ public class PipManager implements BasePipManager { @Override public void onTaskStackChanged() { if (DEBUG) Log.d(TAG, "onTaskStackChanged()"); - if (!checkCurrentUserId(DEBUG)) { + if (!checkCurrentUserId(mContext, DEBUG)) { return; } if (getState() != STATE_NO_PIP) { @@ -614,7 +623,7 @@ public class PipManager implements BasePipManager { @Override public void onActivityPinned(String packageName, int taskId) { if (DEBUG) Log.d(TAG, "onActivityPinned()"); - if (!checkCurrentUserId(DEBUG)) { + if (!checkCurrentUserId(mContext, DEBUG)) { return; } StackInfo stackInfo = getPinnedStackInfo(); @@ -641,7 +650,7 @@ public class PipManager implements BasePipManager { @Override public void onPinnedActivityRestartAttempt(boolean clearedTask) { if (DEBUG) Log.d(TAG, "onPinnedActivityRestartAttempt()"); - if (!checkCurrentUserId(DEBUG)) { + if (!checkCurrentUserId(mContext, DEBUG)) { return; } // If PIPed activity is launched again by Launcher or intent, make it fullscreen. @@ -651,7 +660,7 @@ public class PipManager implements BasePipManager { @Override public void onPinnedStackAnimationEnded() { if (DEBUG) Log.d(TAG, "onPinnedStackAnimationEnded()"); - if (!checkCurrentUserId(DEBUG)) { + if (!checkCurrentUserId(mContext, DEBUG)) { return; } switch (getState()) { diff --git a/packages/SystemUI/src/com/android/systemui/pip/tv/PipNotification.java b/packages/SystemUI/src/com/android/systemui/pip/tv/PipNotification.java index 30240c36b1d9..c8f418554904 100644 --- a/packages/SystemUI/src/com/android/systemui/pip/tv/PipNotification.java +++ b/packages/SystemUI/src/com/android/systemui/pip/tv/PipNotification.java @@ -194,7 +194,7 @@ public class PipNotification { private void dismissPipNotification() { mNotified = false; - mNotificationManager.cancel(SystemMessage.NOTE_TV_PIP); + mNotificationManager.cancel(NOTIFICATION_TAG, SystemMessage.NOTE_TV_PIP); } private boolean updateMediaControllerMetadata() { diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/BatterySaverTile.java b/packages/SystemUI/src/com/android/systemui/qs/tiles/BatterySaverTile.java index ecc275db46b6..74cc0ecca2bc 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/tiles/BatterySaverTile.java +++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/BatterySaverTile.java @@ -141,7 +141,7 @@ public class BatterySaverTile extends QSTileImpl<BooleanState> implements private final BatteryMeterDrawableBase mDrawable = new BatteryMeterDrawableBase( mHost.getContext(), - mHost.getContext().getColor(R.color.batterymeter_frame_color)); + mHost.getContext().getColor(R.color.meter_background_color)); private View mCurrentView; @Override diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/CastTile.java b/packages/SystemUI/src/com/android/systemui/qs/tiles/CastTile.java index 6f2883850c5b..f0d7d6c87833 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/tiles/CastTile.java +++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/CastTile.java @@ -16,33 +16,33 @@ package com.android.systemui.qs.tiles; +import static android.media.MediaRouter.ROUTE_TYPE_REMOTE_DISPLAY; + import android.app.Dialog; import android.content.BroadcastReceiver; import android.content.Context; -import android.content.DialogInterface; -import android.content.DialogInterface.OnDismissListener; import android.content.Intent; import android.content.IntentFilter; +import android.media.MediaRouter; import android.os.UserHandle; import android.provider.Settings; import android.service.quicksettings.Tile; -import android.support.v7.app.MediaRouteChooserDialog; -import android.support.v7.app.MediaRouteControllerDialog; -import android.support.v7.media.MediaControlIntent; -import android.support.v7.media.MediaRouteSelector; import android.util.Log; import android.view.ContextThemeWrapper; import android.view.View; import android.view.View.OnAttachStateChangeListener; +import android.view.View.OnClickListener; import android.view.ViewGroup; import android.view.WindowManager; import android.widget.Button; +import com.android.internal.app.MediaRouteChooserDialog; +import com.android.internal.app.MediaRouteControllerDialog; +import com.android.internal.app.MediaRouteDialogPresenter; import com.android.internal.logging.MetricsLogger; import com.android.internal.logging.nano.MetricsProto.MetricsEvent; import com.android.systemui.Dependency; import com.android.systemui.R; -import com.android.systemui.R.style; import com.android.systemui.plugins.ActivityStarter; import com.android.systemui.plugins.qs.DetailAdapter; import com.android.systemui.plugins.qs.QSTile.BooleanState; @@ -133,19 +133,12 @@ public class CastTile extends QSTileImpl<BooleanState> { @Override public void showDetail(boolean show) { mUiHandler.post(() -> { - Context context = new ContextThemeWrapper(mContext, - R.style.Theme_AppCompat_Light_Dialog_Alert); - if (mState.value) { - mDialog = new MediaRouteControllerDialog(context); - } else { - // Instead of showing detail, show standard media routing UI. - MediaRouteChooserDialog dialog = new MediaRouteChooserDialog(context); - MediaRouteSelector selector = new MediaRouteSelector.Builder() - .addControlCategory(MediaControlIntent.CATEGORY_LIVE_VIDEO) - .build(); - dialog.setRouteSelector(selector); - mDialog = dialog; - } + mDialog = MediaRouteDialogPresenter.createDialog(mContext, ROUTE_TYPE_REMOTE_DISPLAY, + v -> { + mDialog.dismiss(); + Dependency.get(ActivityStarter.class) + .postStartActivityDismissingKeyguard(getLongClickIntent(), 0); + }); mDialog.getWindow().setType(WindowManager.LayoutParams.TYPE_STATUS_BAR_PANEL); mUiHandler.post(() -> mDialog.show()); registerReceiver(); diff --git a/packages/SystemUI/src/com/android/systemui/recents/Recents.java b/packages/SystemUI/src/com/android/systemui/recents/Recents.java index 72dd2da1d3ab..9ba32b354d8f 100644 --- a/packages/SystemUI/src/com/android/systemui/recents/Recents.java +++ b/packages/SystemUI/src/com/android/systemui/recents/Recents.java @@ -19,7 +19,6 @@ package com.android.systemui.recents; import static com.android.systemui.statusbar.phone.StatusBar.SYSTEM_DIALOG_REASON_RECENT_APPS; import android.app.ActivityManager; -import android.app.UiModeManager; import android.content.ComponentName; import android.content.ContentResolver; import android.content.Context; @@ -33,7 +32,6 @@ import android.hardware.display.DisplayManager; import android.os.Build; import android.os.Handler; import android.os.IBinder; -import android.os.Looper; import android.os.RemoteException; import android.os.SystemProperties; import android.os.UserHandle; @@ -41,7 +39,6 @@ import android.provider.Settings; import android.util.EventLog; import android.util.Log; import android.view.Display; -import android.view.WindowManager; import android.widget.Toast; import com.android.internal.logging.MetricsLogger; @@ -60,11 +57,12 @@ import com.android.systemui.recents.events.component.ScreenPinningRequestEvent; import com.android.systemui.recents.events.component.ShowUserToastEvent; import com.android.systemui.recents.events.ui.RecentsDrawnEvent; import com.android.systemui.recents.misc.SystemServicesProxy; -import com.android.systemui.recents.model.HighResThumbnailLoader; import com.android.systemui.recents.model.RecentsTaskLoader; import com.android.systemui.stackdivider.Divider; import com.android.systemui.statusbar.CommandQueue; +import java.io.FileDescriptor; +import java.io.PrintWriter; import java.util.ArrayList; import java.util.HashSet; import java.util.Set; @@ -322,16 +320,11 @@ public class Recents extends SystemUI } } - @Override - public void toggleRecentApps() { - toggleRecents(); - } - /** * Toggles the Recents activity. */ @Override - public void toggleRecents() { + public void toggleRecentApps() { // Ensure the device has been provisioned before allowing the user to interact with // recents if (!isUserSetup()) { @@ -368,7 +361,7 @@ public class Recents extends SystemUI * Preloads info for the Recents activity. */ @Override - public void preloadRecents() { + public void preloadRecentApps() { // Ensure the device has been provisioned before allowing the user to interact with // recents if (!isUserSetup()) { @@ -792,4 +785,10 @@ public class Recents extends SystemUI } return false; } + + @Override + public void dump(FileDescriptor fd, PrintWriter pw, String[] args) { + pw.println("Recents"); + pw.println(" currentUserId=" + SystemServicesProxy.getInstance(mContext).getCurrentUser()); + } } diff --git a/packages/SystemUI/src/com/android/systemui/recents/RecentsActivity.java b/packages/SystemUI/src/com/android/systemui/recents/RecentsActivity.java index dbf07247d610..76970610bc75 100644 --- a/packages/SystemUI/src/com/android/systemui/recents/RecentsActivity.java +++ b/packages/SystemUI/src/com/android/systemui/recents/RecentsActivity.java @@ -114,7 +114,6 @@ public class RecentsActivity extends Activity implements ViewTreeObserver.OnPreD private boolean mFinishedOnStartup; private boolean mIgnoreAltTabRelease; private boolean mIsVisible; - private boolean mReceivedNewIntent; // Top level views private RecentsView mRecentsView; @@ -128,9 +127,6 @@ public class RecentsActivity extends Activity implements ViewTreeObserver.OnPreD private int mFocusTimerDuration; private DozeTrigger mIterateTrigger; private final UserInteractionEvent mUserInteractionEvent = new UserInteractionEvent(); - private final Runnable mSendEnterWindowAnimationCompleteRunnable = () -> { - EventBus.getDefault().send(new EnterRecentsWindowAnimationCompletedEvent()); - }; /** * A common Runnable to finish Recents by launching Home with an animation depending on the @@ -390,7 +386,6 @@ public class RecentsActivity extends Activity implements ViewTreeObserver.OnPreD @Override protected void onNewIntent(Intent intent) { super.onNewIntent(intent); - mReceivedNewIntent = true; // Reload the stack view reloadStackView(); @@ -469,16 +464,7 @@ public class RecentsActivity extends Activity implements ViewTreeObserver.OnPreD @Override public void onEnterAnimationComplete() { super.onEnterAnimationComplete(); - - // Workaround for b/28705801, on first docking, we may receive the enter animation callback - // before the first layout, so in such cases, send the event on the next frame after all - // the views are laid out and attached (and registered to the EventBus). - mHandler.removeCallbacks(mSendEnterWindowAnimationCompleteRunnable); - if (!mReceivedNewIntent) { - mHandler.post(mSendEnterWindowAnimationCompleteRunnable); - } else { - mSendEnterWindowAnimationCompleteRunnable.run(); - } + EventBus.getDefault().send(new EnterRecentsWindowAnimationCompletedEvent()); } @Override @@ -516,7 +502,6 @@ public class RecentsActivity extends Activity implements ViewTreeObserver.OnPreD // Notify that recents is now hidden mIsVisible = false; - mReceivedNewIntent = false; EventBus.getDefault().send(new RecentsVisibilityChangedEvent(this, false)); MetricsLogger.hidden(this, MetricsEvent.OVERVIEW_ACTIVITY); Recents.getTaskLoader().getHighResThumbnailLoader().setVisible(false); diff --git a/packages/SystemUI/src/com/android/systemui/recents/RecentsImpl.java b/packages/SystemUI/src/com/android/systemui/recents/RecentsImpl.java index e229c90e7827..e2e9b1b7d76f 100644 --- a/packages/SystemUI/src/com/android/systemui/recents/RecentsImpl.java +++ b/packages/SystemUI/src/com/android/systemui/recents/RecentsImpl.java @@ -119,6 +119,11 @@ public class RecentsImpl implements ActivityOptions.OnAnimationFinishedListener @Override public void onTaskStackChangedBackground() { + // Check this is for the right user + if (!checkCurrentUserId(mContext, false /* debug */)) { + return; + } + // Preloads the next task RecentsConfiguration config = Recents.getConfiguration(); if (config.svelteLevel == RecentsConfiguration.SVELTE_NONE) { @@ -161,6 +166,11 @@ public class RecentsImpl implements ActivityOptions.OnAnimationFinishedListener @Override public void onActivityPinned(String packageName, int taskId) { + // Check this is for the right user + if (!checkCurrentUserId(mContext, false /* debug */)) { + return; + } + // This time needs to be fetched the same way the last active time is fetched in // {@link TaskRecord#touchActiveTime} Recents.getConfiguration().getLaunchState().launchedFromPipApp = true; @@ -172,12 +182,22 @@ public class RecentsImpl implements ActivityOptions.OnAnimationFinishedListener @Override public void onActivityUnpinned() { + // Check this is for the right user + if (!checkCurrentUserId(mContext, false /* debug */)) { + return; + } + EventBus.getDefault().send(new ActivityUnpinnedEvent()); sLastPipTime = -1; } @Override public void onTaskSnapshotChanged(int taskId, TaskSnapshot snapshot) { + // Check this is for the right user + if (!checkCurrentUserId(mContext, false /* debug */)) { + return; + } + EventBus.getDefault().send(new TaskSnapshotChangedEvent(taskId, snapshot)); } } @@ -413,30 +433,34 @@ public class RecentsImpl implements ActivityOptions.OnAnimationFinishedListener public void preloadRecents() { // Preload only the raw task list into a new load plan (which will be consumed by the - // RecentsActivity) only if there is a task to animate to. - SystemServicesProxy ssp = Recents.getSystemServices(); - MutableBoolean isHomeStackVisible = new MutableBoolean(true); - if (!ssp.isRecentsActivityVisible(isHomeStackVisible)) { - ActivityManager.RunningTaskInfo runningTask = ssp.getRunningTask(); - if (runningTask == null) { - return; - } + // RecentsActivity) only if there is a task to animate to. Post this to ensure that we + // don't block the touch feedback on the nav bar button which triggers this. + mHandler.post(() -> { + SystemServicesProxy ssp = Recents.getSystemServices(); + MutableBoolean isHomeStackVisible = new MutableBoolean(true); + if (!ssp.isRecentsActivityVisible(isHomeStackVisible)) { + ActivityManager.RunningTaskInfo runningTask = ssp.getRunningTask(); + if (runningTask == null) { + return; + } - RecentsTaskLoader loader = Recents.getTaskLoader(); - sInstanceLoadPlan = loader.createLoadPlan(mContext); - loader.preloadTasks(sInstanceLoadPlan, runningTask.id, !isHomeStackVisible.value); - TaskStack stack = sInstanceLoadPlan.getTaskStack(); - if (stack.getTaskCount() > 0) { - // Only preload the icon (but not the thumbnail since it may not have been taken for - // the pausing activity) - preloadIcon(runningTask.id); - - // At this point, we don't know anything about the stack state. So only calculate - // the dimensions of the thumbnail that we need for the transition into Recents, but - // do not draw it until we construct the activity options when we start Recents - updateHeaderBarLayout(stack, null /* window rect override*/); + RecentsTaskLoader loader = Recents.getTaskLoader(); + sInstanceLoadPlan = loader.createLoadPlan(mContext); + loader.preloadTasks(sInstanceLoadPlan, runningTask.id, !isHomeStackVisible.value); + TaskStack stack = sInstanceLoadPlan.getTaskStack(); + if (stack.getTaskCount() > 0) { + // Only preload the icon (but not the thumbnail since it may not have been taken + // for the pausing activity) + preloadIcon(runningTask.id); + + // At this point, we don't know anything about the stack state. So only + // calculate the dimensions of the thumbnail that we need for the transition + // into Recents, but do not draw it until we construct the activity options when + // we start Recents + updateHeaderBarLayout(stack, null /* window rect override*/); + } } - } + }); } public void cancelPreloadingRecents() { @@ -1039,7 +1063,6 @@ public class RecentsImpl implements ActivityOptions.OnAnimationFinishedListener intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS | Intent.FLAG_ACTIVITY_TASK_ON_HOME); - Recents.getSystemServices().startActivityAsUserAsync(intent, opts); HidePipMenuEvent hideMenuEvent = new HidePipMenuEvent(); hideMenuEvent.addPostAnimationCallback(() -> { Recents.getSystemServices().startActivityAsUserAsync(intent, opts); diff --git a/packages/SystemUI/src/com/android/systemui/recents/events/activity/EnterRecentsTaskStackAnimationCompletedEvent.java b/packages/SystemUI/src/com/android/systemui/recents/events/activity/EnterRecentsTaskStackAnimationCompletedEvent.java deleted file mode 100644 index ee0df87a6ed5..000000000000 --- a/packages/SystemUI/src/com/android/systemui/recents/events/activity/EnterRecentsTaskStackAnimationCompletedEvent.java +++ /dev/null @@ -1,26 +0,0 @@ -/* - * Copyright (C) 2016 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.android.systemui.recents.events.activity; - -import com.android.systemui.recents.events.EventBus; - -/** - * This is sent when the in-app animations into Recents completes. - */ -public class EnterRecentsTaskStackAnimationCompletedEvent extends EventBus.AnimatedEvent { - // Simple event -} diff --git a/packages/SystemUI/src/com/android/systemui/recents/events/activity/EnterRecentsWindowAnimationCompletedEvent.java b/packages/SystemUI/src/com/android/systemui/recents/events/activity/EnterRecentsWindowAnimationCompletedEvent.java index 918875a2561b..b31f32090ac7 100644 --- a/packages/SystemUI/src/com/android/systemui/recents/events/activity/EnterRecentsWindowAnimationCompletedEvent.java +++ b/packages/SystemUI/src/com/android/systemui/recents/events/activity/EnterRecentsWindowAnimationCompletedEvent.java @@ -23,6 +23,6 @@ import com.android.systemui.recents.events.EventBus; * we can start in-app animations so that they don't conflict with the window transition into * Recents. */ -public class EnterRecentsWindowAnimationCompletedEvent extends EventBus.AnimatedEvent { +public class EnterRecentsWindowAnimationCompletedEvent extends EventBus.Event { // Simple event } diff --git a/packages/SystemUI/src/com/android/systemui/recents/misc/SystemServicesProxy.java b/packages/SystemUI/src/com/android/systemui/recents/misc/SystemServicesProxy.java index a155a71d442c..cbfa0e58add1 100644 --- a/packages/SystemUI/src/com/android/systemui/recents/misc/SystemServicesProxy.java +++ b/packages/SystemUI/src/com/android/systemui/recents/misc/SystemServicesProxy.java @@ -85,7 +85,6 @@ import 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; @@ -95,6 +94,8 @@ import com.android.systemui.recents.RecentsDebugFlags; import com.android.systemui.recents.RecentsImpl; import com.android.systemui.recents.model.Task; import com.android.systemui.recents.model.ThumbnailData; +import com.android.systemui.statusbar.policy.UserInfoController; +import com.android.systemui.statusbar.policy.UserInfoController.OnUserInfoChangedListener; import java.io.IOException; import java.util.ArrayList; @@ -102,8 +103,6 @@ import java.util.Collections; import java.util.Iterator; import java.util.List; import java.util.Random; -import java.util.concurrent.ExecutorService; -import java.util.concurrent.Executors; /** * Acts as a shim around the real system services that we need to access data from, and provides @@ -143,6 +142,7 @@ public class SystemServicesProxy { Display mDisplay; String mRecentsPackage; ComponentName mAssistComponent; + private int mCurrentUserId; boolean mIsSafeMode; boolean mHasFreeformWorkspaceSupport; @@ -185,9 +185,9 @@ public class SystemServicesProxy { * TaskStackListener should make this call to verify that we don't act on events from other * user's processes. */ - protected final boolean checkCurrentUserId(boolean debug) { + protected final boolean checkCurrentUserId(Context context, boolean debug) { int processUserId = UserHandle.myUserId(); - int currentUserId = KeyguardUpdateMonitor.getCurrentUser(); + int currentUserId = SystemServicesProxy.getInstance(context).getCurrentUser(); if (processUserId != currentUserId) { if (debug) { Log.d(TAG, "UID mismatch. SystemUI is running uid=" + processUserId @@ -284,6 +284,10 @@ public class SystemServicesProxy { } }; + private final UserInfoController.OnUserInfoChangedListener mOnUserInfoChangedListener = + (String name, Drawable picture, String userAccount) -> + mCurrentUserId = mAm.getCurrentUser(); + /** * List of {@link TaskStackListener} registered from {@link #registerTaskStackListener}. */ @@ -312,6 +316,7 @@ public class SystemServicesProxy { Settings.Global.getInt(context.getContentResolver(), DEVELOPMENT_ENABLE_FREEFORM_WINDOWS_SUPPORT, 0) != 0; mIsSafeMode = mPm.isSafeMode(); + mCurrentUserId = mAm.getCurrentUser(); // Get the dummy thumbnail width/heights Resources res = context.getResources(); @@ -329,6 +334,12 @@ public class SystemServicesProxy { // Resolve the assist intent mAssistComponent = mAssistUtils.getAssistComponentForUser(UserHandle.myUserId()); + // Since SystemServicesProxy can be accessed from a per-SysUI process component, create a + // per-process listener to keep track of the current user id to reduce the number of binder + // calls to fetch it. + UserInfoController userInfoController = Dependency.get(UserInfoController.class); + userInfoController.addCallback(mOnUserInfoChangedListener); + if (RecentsDebugFlags.Static.EnableMockTasks) { // Create a dummy icon mDummyIcon = Bitmap.createBitmap(1, 1, Bitmap.Config.ARGB_8888); @@ -1029,15 +1040,11 @@ public class SystemServicesProxy { } /** - * Returns the current user id. + * Returns the current user id. Used instead of KeyguardUpdateMonitor in SystemUI components + * that run in the non-primary SystemUI process. */ public int getCurrentUser() { - if (mAm == null) return 0; - - // This must call through ActivityManager, as the SystemServicesProxy can be called in a - // secondary user's SystemUI process, and KeyguardUpdateMonitor is only updated in the - // primary user's SystemUI process - return mAm.getCurrentUser(); + return mCurrentUserId; } /** diff --git a/packages/SystemUI/src/com/android/systemui/recents/model/RecentsTaskLoadPlan.java b/packages/SystemUI/src/com/android/systemui/recents/model/RecentsTaskLoadPlan.java index ed096401c03f..93033eae0db1 100644 --- a/packages/SystemUI/src/com/android/systemui/recents/model/RecentsTaskLoadPlan.java +++ b/packages/SystemUI/src/com/android/systemui/recents/model/RecentsTaskLoadPlan.java @@ -22,7 +22,6 @@ import android.content.pm.ActivityInfo; import android.content.pm.ApplicationInfo; import android.content.pm.UserInfo; import android.content.res.Resources; -import android.graphics.Bitmap; import android.graphics.drawable.Drawable; import android.os.UserHandle; import android.os.UserManager; @@ -33,15 +32,13 @@ import android.util.SparseArray; import android.util.SparseBooleanArray; import android.util.SparseIntArray; -import com.android.keyguard.KeyguardUpdateMonitor; import com.android.systemui.Prefs; import com.android.systemui.R; import com.android.systemui.recents.Recents; -import com.android.systemui.recents.RecentsConfiguration; import com.android.systemui.recents.RecentsDebugFlags; import com.android.systemui.recents.misc.SystemServicesProxy; - import com.android.systemui.recents.views.grid.TaskGridLayoutAlgorithm; + import java.util.ArrayList; import java.util.Collections; import java.util.List; diff --git a/packages/SystemUI/src/com/android/systemui/recents/views/TaskStackView.java b/packages/SystemUI/src/com/android/systemui/recents/views/TaskStackView.java index 5f9a8f5cdd7c..6ad6a15b615a 100644 --- a/packages/SystemUI/src/com/android/systemui/recents/views/TaskStackView.java +++ b/packages/SystemUI/src/com/android/systemui/recents/views/TaskStackView.java @@ -62,7 +62,6 @@ import com.android.systemui.recents.events.EventBus; import com.android.systemui.recents.events.activity.CancelEnterRecentsWindowAnimationEvent; import com.android.systemui.recents.events.activity.ConfigurationChangedEvent; import com.android.systemui.recents.events.activity.DismissRecentsToHomeAnimationStarted; -import com.android.systemui.recents.events.activity.EnterRecentsTaskStackAnimationCompletedEvent; import com.android.systemui.recents.events.activity.EnterRecentsWindowAnimationCompletedEvent; import com.android.systemui.recents.events.activity.HideRecentsEvent; import com.android.systemui.recents.events.activity.HideStackActionButtonEvent; @@ -97,6 +96,7 @@ import com.android.systemui.recents.events.ui.focus.FocusNextTaskViewEvent; import com.android.systemui.recents.events.ui.focus.FocusPreviousTaskViewEvent; import com.android.systemui.recents.events.ui.focus.NavigateTaskViewEvent; import com.android.systemui.recents.misc.DozeTrigger; +import com.android.systemui.recents.misc.ReferenceCountedTrigger; import com.android.systemui.recents.misc.SystemServicesProxy; import com.android.systemui.recents.misc.Utilities; import com.android.systemui.recents.model.Task; @@ -175,7 +175,11 @@ public class TaskStackView extends FrameLayout implements TaskStack.TaskStackCal @ViewDebug.ExportedProperty(category="recents") private boolean mTaskViewsClipDirty = true; @ViewDebug.ExportedProperty(category="recents") - private boolean mAwaitingFirstLayout = true; + private boolean mEnterAnimationComplete = false; + @ViewDebug.ExportedProperty(category="recents") + private boolean mStackReloaded = false; + @ViewDebug.ExportedProperty(category="recents") + private boolean mFinishedLayoutAfterStackReload = false; @ViewDebug.ExportedProperty(category="recents") private boolean mLaunchNextAfterFirstMeasure = false; @ViewDebug.ExportedProperty(category="recents") @@ -184,8 +188,6 @@ public class TaskStackView extends FrameLayout implements TaskStack.TaskStackCal @ViewDebug.ExportedProperty(category="recents") private boolean mInMeasureLayout = false; @ViewDebug.ExportedProperty(category="recents") - private boolean mEnterAnimationComplete = false; - @ViewDebug.ExportedProperty(category="recents") boolean mTouchExplorationEnabled; @ViewDebug.ExportedProperty(category="recents") boolean mScreenPinningEnabled; @@ -355,7 +357,6 @@ public class TaskStackView extends FrameLayout implements TaskStack.TaskStackCal // Reset the stack state readSystemFlags(); mTaskViewsClipDirty = true; - mEnterAnimationComplete = false; mUIDozeTrigger.stopDozing(); if (isResumingFromVisible) { // Animate in the freeform workspace @@ -370,7 +371,8 @@ public class TaskStackView extends FrameLayout implements TaskStack.TaskStackCal // Since we always animate to the same place in (the initial state), always reset the stack // to the initial state when resuming - mAwaitingFirstLayout = true; + mStackReloaded = true; + mFinishedLayoutAfterStackReload = false; mLaunchNextAfterFirstMeasure = false; mInitialState = INITIAL_STATE_UPDATE_ALL; requestLayout(); @@ -1282,13 +1284,13 @@ public class TaskStackView extends FrameLayout implements TaskStack.TaskStackCal // TaskViews with the stack so that we can lay them out boolean resetToInitialState = (width != mLastWidth || height != mLastHeight) && mResetToInitialStateWhenResized; - if (mAwaitingFirstLayout || mInitialState != INITIAL_STATE_UPDATE_NONE + if (!mFinishedLayoutAfterStackReload || mInitialState != INITIAL_STATE_UPDATE_NONE || resetToInitialState) { if (mInitialState != INITIAL_STATE_UPDATE_LAYOUT_ONLY || resetToInitialState) { updateToInitialState(); mResetToInitialStateWhenResized = false; } - if (!mAwaitingFirstLayout) { + if (mFinishedLayoutAfterStackReload) { mInitialState = INITIAL_STATE_UPDATE_NONE; } } @@ -1361,10 +1363,15 @@ public class TaskStackView extends FrameLayout implements TaskStack.TaskStackCal relayoutTaskViews(AnimationProps.IMMEDIATE); clipTaskViews(); - if (mAwaitingFirstLayout || !mEnterAnimationComplete) { - mAwaitingFirstLayout = false; + if (!mFinishedLayoutAfterStackReload) { + // Prepare the task enter animations (this can be called numerous times) mInitialState = INITIAL_STATE_UPDATE_NONE; onFirstLayout(); + + if (mStackReloaded) { + mFinishedLayoutAfterStackReload = true; + tryStartEnterAnimation(); + } } } @@ -1490,7 +1497,7 @@ public class TaskStackView extends FrameLayout implements TaskStack.TaskStackCal updateLayoutAlgorithm(true /* boundScroll */); // Animate all the tasks into place - relayoutTaskViews(mAwaitingFirstLayout + relayoutTaskViews(!mFinishedLayoutAfterStackReload ? AnimationProps.IMMEDIATE : new AnimationProps(DEFAULT_SYNC_STACK_DURATION, Interpolators.FAST_OUT_SLOW_IN)); } @@ -1563,7 +1570,7 @@ public class TaskStackView extends FrameLayout implements TaskStack.TaskStackCal @Override public void onStackTasksUpdated(TaskStack stack) { - if (mAwaitingFirstLayout) { + if (!mFinishedLayoutAfterStackReload) { return; } @@ -1805,7 +1812,7 @@ public class TaskStackView extends FrameLayout implements TaskStack.TaskStackCal } public final void onBusEvent(LaunchNextTaskRequestEvent event) { - if (mAwaitingFirstLayout) { + if (!mFinishedLayoutAfterStackReload) { mLaunchNextAfterFirstMeasure = true; return; } @@ -2125,39 +2132,45 @@ public class TaskStackView extends FrameLayout implements TaskStack.TaskStackCal public final void onBusEvent(EnterRecentsWindowAnimationCompletedEvent event) { mEnterAnimationComplete = true; + tryStartEnterAnimation(); + } + + private void tryStartEnterAnimation() { + if (!mStackReloaded || !mFinishedLayoutAfterStackReload || !mEnterAnimationComplete) { + return; + } if (mStack.getTaskCount() > 0) { // Start the task enter animations - mAnimationHelper.startEnterAnimation(event.getAnimationTrigger()); + ReferenceCountedTrigger trigger = new ReferenceCountedTrigger(); + mAnimationHelper.startEnterAnimation(trigger); // Add a runnable to the post animation ref counter to clear all the views - event.addPostAnimationCallback(new Runnable() { - @Override - public void run() { - // Start the dozer to trigger to trigger any UI that shows after a timeout - if (!Recents.getSystemServices().hasFreeformWorkspaceSupport()) { - mUIDozeTrigger.startDozing(); - } + trigger.addLastDecrementRunnable(() -> { + // Start the dozer to trigger to trigger any UI that shows after a timeout + if (!Recents.getSystemServices().hasFreeformWorkspaceSupport()) { + mUIDozeTrigger.startDozing(); + } - // Update the focused state here -- since we only set the focused task without - // requesting view focus in onFirstLayout(), actually request view focus and - // animate the focused state if we are alt-tabbing now, after the window enter - // animation is completed - if (mFocusedTask != null) { - RecentsConfiguration config = Recents.getConfiguration(); - RecentsActivityLaunchState launchState = config.getLaunchState(); - setFocusedTask(mStack.indexOfStackTask(mFocusedTask), - false /* scrollToTask */, launchState.launchedWithAltTab); - TaskView focusedTaskView = getChildViewForTask(mFocusedTask); - if (mTouchExplorationEnabled && focusedTaskView != null) { - focusedTaskView.requestAccessibilityFocus(); - } + // Update the focused state here -- since we only set the focused task without + // requesting view focus in onFirstLayout(), actually request view focus and + // animate the focused state if we are alt-tabbing now, after the window enter + // animation is completed + if (mFocusedTask != null) { + RecentsConfiguration config = Recents.getConfiguration(); + RecentsActivityLaunchState launchState = config.getLaunchState(); + setFocusedTask(mStack.indexOfStackTask(mFocusedTask), + false /* scrollToTask */, launchState.launchedWithAltTab); + TaskView focusedTaskView = getChildViewForTask(mFocusedTask); + if (mTouchExplorationEnabled && focusedTaskView != null) { + focusedTaskView.requestAccessibilityFocus(); } - - EventBus.getDefault().send(new EnterRecentsTaskStackAnimationCompletedEvent()); } }); } + + // This flag is only used to choreograph the enter animation, so we can reset it here + mStackReloaded = false; } public final void onBusEvent(UpdateFreeformTaskViewVisibilityEvent event) { @@ -2235,15 +2248,21 @@ public class TaskStackView extends FrameLayout implements TaskStack.TaskStackCal } public final void onBusEvent(RecentsVisibilityChangedEvent event) { - if (!event.visible && mTaskViewFocusFrame != null) { - mTaskViewFocusFrame.moveGridTaskViewFocus(null); - } if (!event.visible) { + if (mTaskViewFocusFrame != null) { + mTaskViewFocusFrame.moveGridTaskViewFocus(null); + } + List<TaskView> taskViews = new ArrayList<>(getTaskViews()); for (int i = 0; i < taskViews.size(); i++) { mViewPool.returnViewToPool(taskViews.get(i)); } clearPrefetchingTask(); + + // We can not reset mEnterAnimationComplete in onReload() because when docking the top + // task, we can receive the enter animation callback before onReload(), so reset it + // here onces Recents is not visible + mEnterAnimationComplete = false; } } @@ -2377,7 +2396,7 @@ public class TaskStackView extends FrameLayout implements TaskStack.TaskStackCal writer.print(" hasDefRelayout="); writer.print(mDeferredTaskViewLayoutAnimation != null ? "Y" : "N"); writer.print(" clipDirty="); writer.print(mTaskViewsClipDirty ? "Y" : "N"); - writer.print(" awaitingFirstLayout="); writer.print(mAwaitingFirstLayout ? "Y" : "N"); + writer.print(" awaitingStackReload="); writer.print(mFinishedLayoutAfterStackReload ? "Y" : "N"); writer.print(" initialState="); writer.print(mInitialState); writer.print(" inMeasureLayout="); writer.print(mInMeasureLayout ? "Y" : "N"); writer.print(" enterAnimCompleted="); writer.print(mEnterAnimationComplete ? "Y" : "N"); diff --git a/packages/SystemUI/src/com/android/systemui/stackdivider/DividerView.java b/packages/SystemUI/src/com/android/systemui/stackdivider/DividerView.java index 0c7703663810..012accda7b84 100644 --- a/packages/SystemUI/src/com/android/systemui/stackdivider/DividerView.java +++ b/packages/SystemUI/src/com/android/systemui/stackdivider/DividerView.java @@ -725,14 +725,21 @@ public class DividerView extends FrameLayout implements OnTouchListener, mMinimizedSnapAlgorithm = null; mDockedStackMinimized = minimized; initializeSnapAlgorithm(); - if (!mIsInMinimizeInteraction && minimized) { - mIsInMinimizeInteraction = true; - mDividerPositionBeforeMinimized = DockedDividerUtils.calculateMiddlePosition( - isHorizontalDivision(), mStableInsets, mDisplayWidth, mDisplayHeight, - mDividerSize); - - int position = mMinimizedSnapAlgorithm.getMiddleTarget().position; - resizeStack(position, position, mMinimizedSnapAlgorithm.getMiddleTarget()); + if (mIsInMinimizeInteraction != minimized) { + if (minimized) { + mIsInMinimizeInteraction = true; + mDividerPositionBeforeMinimized = DockedDividerUtils.calculateMiddlePosition( + isHorizontalDivision(), mStableInsets, mDisplayWidth, mDisplayHeight, + mDividerSize); + + int position = mMinimizedSnapAlgorithm.getMiddleTarget().position; + resizeStack(position, position, mMinimizedSnapAlgorithm.getMiddleTarget()); + } else { + resizeStack(mDividerPositionBeforeMinimized, mDividerPositionBeforeMinimized, + mSnapAlgorithm.calculateNonDismissingSnapTarget( + mDividerPositionBeforeMinimized)); + mIsInMinimizeInteraction = false; + } } } } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/ExpandableNotificationRow.java b/packages/SystemUI/src/com/android/systemui/statusbar/ExpandableNotificationRow.java index 3a39e9111be4..35425004c27b 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/ExpandableNotificationRow.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/ExpandableNotificationRow.java @@ -813,10 +813,10 @@ public class ExpandableNotificationRow extends ActivatableNotificationView public void onDensityOrFontScaleChanged() { initDimens(); - if (mIsSummaryWithChildren) { - if (mChildrenContainer != null) { - mChildrenContainer.reInflateViews(mExpandClickListener, mEntry.notification); - } + // Let's update our childrencontainer. This is intentionally not guarded with + // mIsSummaryWithChildren since we might have had children but not anymore. + if (mChildrenContainer != null) { + mChildrenContainer.reInflateViews(mExpandClickListener, mEntry.notification); } if (mGuts != null) { View oldGuts = mGuts; @@ -1458,9 +1458,11 @@ public class ExpandableNotificationRow extends ActivatableNotificationView public void setUserLocked(boolean userLocked) { mUserLocked = userLocked; mPrivateLayout.setUserExpanding(userLocked); - if (mIsSummaryWithChildren) { + // This is intentionally not guarded with mIsSummaryWithChildren since we might have had + // children but not anymore. + if (mChildrenContainer != null) { mChildrenContainer.setUserLocked(userLocked); - if (userLocked || !isGroupExpanded()) { + if (mIsSummaryWithChildren && (userLocked || !isGroupExpanded())) { updateBackgroundForGroupState(); } } @@ -2189,4 +2191,9 @@ public class ExpandableNotificationRow extends ActivatableNotificationView } } } + + @VisibleForTesting + protected void setChildrenContainer(NotificationChildrenContainer childrenContainer) { + mChildrenContainer = childrenContainer; + } } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationShelf.java b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationShelf.java index 78a5194ffd4b..5cb3c1f1f7cd 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationShelf.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationShelf.java @@ -227,7 +227,7 @@ public class NotificationShelf extends ActivatableNotificationView implements } ExpandableNotificationRow row = (ExpandableNotificationRow) child; float notificationClipEnd; - boolean aboveShelf = row.getTranslationZ() > baseZHeight; + boolean aboveShelf = ViewState.getFinalTranslationZ(row) > baseZHeight; boolean isLastChild = child == lastChild; float rowTranslationY = row.getTranslationY(); if (isLastChild || aboveShelf || backgroundForceHidden) { @@ -284,10 +284,15 @@ public class NotificationShelf extends ActivatableNotificationView implements private void updateNotificationClipHeight(ExpandableNotificationRow row, float notificationClipEnd) { float viewEnd = row.getTranslationY() + row.getActualHeight(); + boolean isPinned = row.isPinned() || row.isHeadsUpAnimatingAway(); if (viewEnd > notificationClipEnd - && (mAmbientState.isShadeExpanded() - || (!row.isPinned() && !row.isHeadsUpAnimatingAway()))) { - row.setClipBottomAmount((int) (viewEnd - notificationClipEnd)); + && (mAmbientState.isShadeExpanded() || !isPinned)) { + int clipBottomAmount = (int) (viewEnd - notificationClipEnd); + if (isPinned) { + clipBottomAmount = Math.min(row.getIntrinsicHeight() - row.getCollapsedHeight(), + clipBottomAmount); + } + row.setClipBottomAmount(clipBottomAmount); } else { row.setClipBottomAmount(0); } @@ -381,7 +386,8 @@ public class NotificationShelf extends ActivatableNotificationView implements ? fullTransitionAmount : transitionAmount; iconState.clampedAppearAmount = clampedAmount; - float contentTransformationAmount = isLastChild || iconState.translateContent + float contentTransformationAmount = !row.isAboveShelf() + && (isLastChild || iconState.translateContent) ? iconTransitionAmount : 0.0f; row.setContentTransformationAmount(contentTransformationAmount, isLastChild); diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/DozeScrimController.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/DozeScrimController.java index c5f23c5e066a..6b276f8691e3 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/DozeScrimController.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/DozeScrimController.java @@ -53,6 +53,7 @@ public class DozeScrimController { private float mInFrontTarget; private float mBehindTarget; private boolean mDozingAborted; + private boolean mWakeAndUnlocking; public DozeScrimController(ScrimController scrimController, Context context) { mContext = context; @@ -63,6 +64,7 @@ public class DozeScrimController { public void setDozing(boolean dozing, boolean animate) { if (mDozing == dozing) return; mDozing = dozing; + mWakeAndUnlocking = false; if (mDozing) { mDozingAborted = false; abortAnimations(); @@ -85,6 +87,16 @@ public class DozeScrimController { } } + public void setWakeAndUnlocking() { + // Immediately abort the doze scrims in case of wake-and-unlock + // for pulsing so the Keyguard fade-out animation scrim can take over. + if (!mWakeAndUnlocking) { + mWakeAndUnlocking = true; + mScrimController.setDozeBehindAlpha(0f); + mScrimController.setDozeInFrontAlpha(0f); + } + } + /** When dozing, fade screen contents in and out using the front scrim. */ public void pulse(@NonNull DozeHost.PulseCallback callback, int reason) { if (callback == null) { @@ -109,7 +121,7 @@ public class DozeScrimController { */ public void abortPulsing() { cancelPulsing(); - if (mDozing) { + if (mDozing && !mWakeAndUnlocking) { mScrimController.setDozeBehindAlpha(1f); mScrimController.setDozeInFrontAlpha( mDozeParameters.getAlwaysOn() && !mDozingAborted ? 0f : 1f); @@ -244,6 +256,9 @@ public class DozeScrimController { } private void setDozeAlpha(boolean inFront, float alpha) { + if (mWakeAndUnlocking) { + return; + } if (inFront) { mScrimController.setDozeInFrontAlpha(alpha); } else { diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/FingerprintUnlockController.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/FingerprintUnlockController.java index f216d6c4480f..6cb722fa65ce 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/FingerprintUnlockController.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/FingerprintUnlockController.java @@ -98,7 +98,6 @@ public class FingerprintUnlockController extends KeyguardUpdateMonitorCallback { private StatusBar mStatusBar; private final UnlockMethodCache mUnlockMethodCache; private final Context mContext; - private boolean mGoingToSleep; private int mPendingAuthenticatedUserId = -1; public FingerprintUnlockController(Context context, @@ -213,17 +212,19 @@ public class FingerprintUnlockController extends KeyguardUpdateMonitorCallback { Trace.endSection(); break; case MODE_WAKE_AND_UNLOCK_PULSING: - Trace.beginSection("MODE_WAKE_AND_UNLOCK_PULSING"); - mStatusBar.updateMediaMetaData(false /* metaDataChanged */, - true /* allowEnterAnimation */); - // Fall through. - Trace.endSection(); case MODE_WAKE_AND_UNLOCK: - Trace.beginSection("MODE_WAKE_AND_UNLOCK"); + if (mMode == MODE_WAKE_AND_UNLOCK_PULSING) { + Trace.beginSection("MODE_WAKE_AND_UNLOCK_PULSING"); + mStatusBar.updateMediaMetaData(false /* metaDataChanged */, + true /* allowEnterAnimation */); + } else { + Trace.beginSection("MODE_WAKE_AND_UNLOCK"); + mDozeScrimController.abortDoze(); + } mStatusBarWindowManager.setStatusBarFocusable(false); - mDozeScrimController.abortDoze(); mKeyguardViewMediator.onWakeAndUnlocking(); mScrimController.setWakeAndUnlocking(); + mDozeScrimController.setWakeAndUnlocking(); if (mStatusBar.getNavigationBarView() != null) { mStatusBar.getNavigationBarView().setWakeAndUnlocking(true); } @@ -302,10 +303,7 @@ public class FingerprintUnlockController extends KeyguardUpdateMonitorCallback { } private void cleanup() { - mMode = MODE_NONE; releaseFingerprintWakeLock(); - mStatusBarWindowManager.setForceDozeBrightness(false); - mStatusBar.notifyFpAuthModeChanged(); } public void startKeyguardFadingAway() { @@ -321,6 +319,7 @@ public class FingerprintUnlockController extends KeyguardUpdateMonitorCallback { public void finishKeyguardFadingAway() { mMode = MODE_NONE; + mStatusBarWindowManager.setForceDozeBrightness(false); if (mStatusBar.getNavigationBarView() != null) { mStatusBar.getNavigationBarView().setWakeAndUnlocking(false); } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelView.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelView.java index 0fa8afadea6c..af2f7e98bb1b 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelView.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelView.java @@ -2401,17 +2401,26 @@ public class NotificationPanelView extends PanelView implements @Override public void setAlpha(float alpha) { super.setAlpha(alpha); - updateFullyVisibleState(); + updateFullyVisibleState(false /* forceNotFullyVisible */); + } + + /** + * Must be called before starting a ViewPropertyAnimator alpha animation because those + * do NOT call setAlpha and therefore don't properly update the fullyVisibleState. + */ + public void notifyStartFading() { + updateFullyVisibleState(true /* forceNotFullyVisible */); } @Override public void setVisibility(int visibility) { super.setVisibility(visibility); - updateFullyVisibleState(); + updateFullyVisibleState(false /* forceNotFullyVisible */); } - private void updateFullyVisibleState() { - mNotificationStackScroller.setParentNotFullyVisible(getAlpha() != 1.0f + private void updateFullyVisibleState(boolean forceNotFullyVisible) { + mNotificationStackScroller.setParentNotFullyVisible(forceNotFullyVisible + || getAlpha() != 1.0f || getVisibility() != VISIBLE); } 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 9d1d03859f81..4b1d7d7e4508 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PanelView.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PanelView.java @@ -224,6 +224,7 @@ public abstract class PanelView extends FrameLayout { if (mTracking) { onTrackingStopped(true /* expanded */); } + notifyExpandingFinished(); } } 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 d798fbf416df..699d367b6da4 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java @@ -4138,6 +4138,7 @@ public class StatusBar extends SystemUI implements DemoMode, * fading. */ public void fadeKeyguardWhilePulsing() { + mNotificationPanel.notifyStartFading(); mNotificationPanel.animate() .alpha(0f) .setStartDelay(0) @@ -4356,12 +4357,7 @@ public class StatusBar extends SystemUI implements DemoMode, mKeyguardIndicationController.setDozing(mDozing); mNotificationPanel.setDark(mDozing, animate); updateQsExpansionEnabled(); - - // Immediately abort the dozing from the doze scrim controller in case of wake-and-unlock - // for pulsing so the Keyguard fade-out animation scrim can take over. - mDozeScrimController.setDozing(mDozing && - mFingerprintUnlockController.getMode() - != FingerprintUnlockController.MODE_WAKE_AND_UNLOCK_PULSING, animate); + mDozeScrimController.setDozing(mDozing, animate); updateRowStates(); Trace.endSection(); } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarKeyguardViewManager.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarKeyguardViewManager.java index 2a69c1e663bb..bb302bb21da4 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarKeyguardViewManager.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarKeyguardViewManager.java @@ -29,6 +29,7 @@ import android.view.WindowManagerGlobal; import com.android.internal.widget.LockPatternUtils; import com.android.keyguard.KeyguardUpdateMonitor; +import com.android.keyguard.KeyguardUpdateMonitorCallback; import com.android.keyguard.ViewMediatorCallback; import com.android.systemui.DejankUtils; import com.android.keyguard.LatencyTracker; @@ -97,12 +98,26 @@ public class StatusBarKeyguardViewManager implements RemoteInputController.Callb private boolean mDeviceWillWakeUp; private boolean mDeferScrimFadeOut; + private final KeyguardUpdateMonitorCallback mUpdateMonitorCallback = + new KeyguardUpdateMonitorCallback() { + @Override + public void onEmergencyCallAction() { + + // Since we won't get a setOccluded call we have to reset the view manually such that + // the bouncer goes away. + if (mOccluded) { + reset(false /* hideBouncerWhenShowing */); + } + } + }; + public StatusBarKeyguardViewManager(Context context, ViewMediatorCallback callback, LockPatternUtils lockPatternUtils) { mContext = context; mViewMediatorCallback = callback; mLockPatternUtils = lockPatternUtils; mStatusBarWindowManager = Dependency.get(StatusBarWindowManager.class); + KeyguardUpdateMonitor.getInstance(context).registerCallback(mUpdateMonitorCallback); } public void registerStatusBar(StatusBar statusBar, @@ -381,6 +396,7 @@ public class StatusBarKeyguardViewManager implements RemoteInputController.Callb } else { mScrimController.animateGoingToFullShade(delay, fadeoutDuration); mStatusBar.finishKeyguardFadingAway(); + mFingerprintUnlockController.finishKeyguardFadingAway(); } } mStatusBarWindowManager.setKeyguardShowing(false); diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarWindowView.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarWindowView.java index 26e007c42df8..f050be4720b7 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarWindowView.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarWindowView.java @@ -407,8 +407,9 @@ public class StatusBarWindowView extends FrameLayout { mFloatingActionMode.finish(); } cleanupFloatingActionModeViews(); + mFloatingToolbar = new FloatingToolbar(mContext, mFakeWindow); final FloatingActionMode mode = - new FloatingActionMode(mContext, callback, originatingView); + new FloatingActionMode(mContext, callback, originatingView, mFloatingToolbar); mFloatingActionModeOriginatingView = originatingView; mFloatingToolbarPreDrawListener = new ViewTreeObserver.OnPreDrawListener() { @@ -423,8 +424,6 @@ public class StatusBarWindowView extends FrameLayout { private void setHandledFloatingActionMode(ActionMode mode) { mFloatingActionMode = mode; - mFloatingToolbar = new FloatingToolbar(mContext, mFakeWindow); - ((FloatingActionMode) mFloatingActionMode).setFloatingToolbar(mFloatingToolbar); mFloatingActionMode.invalidate(); // Will show the floating toolbar if necessary. mFloatingActionModeOriginatingView.getViewTreeObserver() .addOnPreDrawListener(mFloatingToolbarPreDrawListener); diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/stack/NotificationChildrenContainer.java b/packages/SystemUI/src/com/android/systemui/statusbar/stack/NotificationChildrenContainer.java index cb1f44ededa7..0dbd1d6cc74a 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/stack/NotificationChildrenContainer.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/stack/NotificationChildrenContainer.java @@ -29,6 +29,7 @@ import android.view.ViewGroup; import android.widget.RemoteViews; import android.widget.TextView; +import com.android.internal.annotations.VisibleForTesting; import com.android.systemui.R; import com.android.systemui.statusbar.CrossFadeHelper; import com.android.systemui.statusbar.ExpandableNotificationRow; @@ -535,8 +536,8 @@ public class NotificationChildrenContainer extends ViewGroup { firstOverflowIndex = getMaxAllowedVisibleChildren(true /* likeCollapsed */); } - boolean childrenExpanded = !mContainingNotification.isGroupExpansionChanging() - && mChildrenExpanded; + boolean childrenExpandedAndNotAnimating = mChildrenExpanded + && !mContainingNotification.isGroupExpansionChanging(); for (int i = 0; i < childCount; i++) { ExpandableNotificationRow child = mChildren.get(i); if (!firstChild) { @@ -544,7 +545,7 @@ public class NotificationChildrenContainer extends ViewGroup { yPosition += NotificationUtils.interpolate(mChildPadding, mDividerHeight, expandFactor); } else { - yPosition += childrenExpanded ? mDividerHeight : mChildPadding; + yPosition += mChildrenExpanded ? mDividerHeight : mChildPadding; } } else { if (expandingToExpandedGroup) { @@ -553,7 +554,7 @@ public class NotificationChildrenContainer extends ViewGroup { mNotificatonTopPadding + mDividerHeight, expandFactor); } else { - yPosition += childrenExpanded ? mNotificatonTopPadding + mDividerHeight : 0; + yPosition += mChildrenExpanded ? mNotificatonTopPadding + mDividerHeight : 0; } firstChild = false; } @@ -565,7 +566,7 @@ public class NotificationChildrenContainer extends ViewGroup { childState.hidden = false; // When the group is expanded, the children cast the shadows rather than the parent // so use the parent's elevation here. - childState.zTranslation = childrenExpanded + childState.zTranslation = childrenExpandedAndNotAnimating ? mContainingNotification.getTranslationZ() : 0; childState.dimmed = parentState.dimmed; @@ -619,7 +620,7 @@ public class NotificationChildrenContainer extends ViewGroup { mHeaderViewState = new ViewState(); } mHeaderViewState.initFrom(mNotificationHeader); - mHeaderViewState.zTranslation = childrenExpanded + mHeaderViewState.zTranslation = childrenExpandedAndNotAnimating ? mContainingNotification.getTranslationZ() : 0; } @@ -1223,4 +1224,9 @@ public class NotificationChildrenContainer extends ViewGroup { } return getGroupExpandFraction(); } + + @VisibleForTesting + public boolean isUserLocked() { + return mUserLocked; + } } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/stack/StackScrollAlgorithm.java b/packages/SystemUI/src/com/android/systemui/statusbar/stack/StackScrollAlgorithm.java index b5db78d128ff..12a8783becf2 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/stack/StackScrollAlgorithm.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/stack/StackScrollAlgorithm.java @@ -410,7 +410,7 @@ public class StackScrollAlgorithm { if (mIsExpanded) { // Ensure that the heads up is always visible even when scrolled off clampHunToTop(ambientState, row, childState); - if (i == 0) { + if (i == 0 && row.isAboveShelf()) { // the first hun can't get off screen. clampHunToMaxTranslation(ambientState, row, childState); } @@ -447,10 +447,14 @@ public class StackScrollAlgorithm { private void clampHunToMaxTranslation(AmbientState ambientState, ExpandableNotificationRow row, ExpandableViewState childState) { float newTranslation; - float bottomPosition = ambientState.getMaxHeadsUpTranslation() - row.getCollapsedHeight(); + float maxHeadsUpTranslation = ambientState.getMaxHeadsUpTranslation(); + float maxShelfPosition = ambientState.getInnerHeight() + ambientState.getTopPadding() + + ambientState.getStackTranslation(); + maxHeadsUpTranslation = Math.min(maxHeadsUpTranslation, maxShelfPosition); + float bottomPosition = maxHeadsUpTranslation - row.getCollapsedHeight(); newTranslation = Math.min(childState.yTranslation, bottomPosition); - childState.height = (int) Math.max(childState.height - - (childState.yTranslation - newTranslation), row.getCollapsedHeight()); + childState.height = (int) Math.min(childState.height, maxHeadsUpTranslation + - newTranslation); childState.yTranslation = newTranslation; } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/stack/ViewState.java b/packages/SystemUI/src/com/android/systemui/statusbar/stack/ViewState.java index d664b1239519..27b730cdb6c7 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/stack/ViewState.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/stack/ViewState.java @@ -657,6 +657,22 @@ public class ViewState { } } + /** + * Get the end value of the zTranslation animation running on a view or the zTranslation + * if no animation is running. + */ + public static float getFinalTranslationZ(View view) { + if (view == null) { + return 0; + } + ValueAnimator zAnimator = getChildTag(view, TAG_ANIMATOR_TRANSLATION_Z); + if (zAnimator == null) { + return view.getTranslationZ(); + } else { + return getChildTag(view, TAG_END_TRANSLATION_Z); + } + } + public static boolean isAnimatingY(View child) { return getChildTag(child, TAG_ANIMATOR_TRANSLATION_Y) != null; } diff --git a/packages/SystemUI/tests/src/com/android/systemui/qs/QSDetailTest.java b/packages/SystemUI/tests/src/com/android/systemui/qs/QSDetailTest.java index 8609eeb7e6b4..0a945ab23618 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/qs/QSDetailTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/qs/QSDetailTest.java @@ -23,6 +23,7 @@ import static org.mockito.Mockito.mock; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; +import android.support.test.filters.FlakyTest; import android.testing.AndroidTestingRunner; import android.testing.TestableLooper; import android.testing.TestableLooper.RunWithLooper; @@ -37,12 +38,14 @@ import com.android.systemui.plugins.ActivityStarter; import com.android.systemui.plugins.qs.DetailAdapter; import org.junit.After; +import org.junit.Ignore; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; @RunWith(AndroidTestingRunner.class) @RunWithLooper +@FlakyTest public class QSDetailTest extends SysuiTestCase { private MetricsLogger mMetricsLogger; diff --git a/packages/SystemUI/tests/src/com/android/systemui/qs/QSFooterTest.java b/packages/SystemUI/tests/src/com/android/systemui/qs/QSFooterTest.java index 778ab8ef3bee..09c5725ed72c 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/qs/QSFooterTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/qs/QSFooterTest.java @@ -20,6 +20,7 @@ import static org.mockito.Mockito.never; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; +import android.support.test.filters.FlakyTest; import android.testing.AndroidTestingRunner; import android.testing.TestableLooper; import android.testing.TestableLooper.RunWithLooper; @@ -33,11 +34,13 @@ import com.android.systemui.statusbar.policy.DeviceProvisionedController; import com.android.systemui.utils.leaks.LeakCheckedTest; import org.junit.Before; +import org.junit.Ignore; import org.junit.Test; import org.junit.runner.RunWith; @RunWith(AndroidTestingRunner.class) @RunWithLooper +@FlakyTest public class QSFooterTest extends LeakCheckedTest { private QSFooter mFooter; diff --git a/packages/SystemUI/tests/src/com/android/systemui/qs/QSFragmentTest.java b/packages/SystemUI/tests/src/com/android/systemui/qs/QSFragmentTest.java index d81224e8507d..601d4e235ffb 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/qs/QSFragmentTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/qs/QSFragmentTest.java @@ -21,6 +21,7 @@ import static org.mockito.Mockito.mock; import android.app.FragmentController; import android.app.FragmentManagerNonConfig; import android.os.Looper; +import android.support.test.filters.FlakyTest; import com.android.internal.logging.MetricsLogger; import com.android.keyguard.CarrierText; @@ -39,6 +40,7 @@ import android.testing.TestableLooper; import android.testing.TestableLooper.RunWithLooper; import org.junit.Before; +import org.junit.Ignore; import org.junit.Test; import org.junit.runner.RunWith; @@ -48,6 +50,7 @@ import android.widget.FrameLayout; @RunWith(AndroidTestingRunner.class) @RunWithLooper(setAsMainLooper = true) +@FlakyTest public class QSFragmentTest extends SysuiBaseFragmentTest { private MetricsLogger mMockMetricsLogger; diff --git a/packages/SystemUI/tests/src/com/android/systemui/qs/QSPanelTest.java b/packages/SystemUI/tests/src/com/android/systemui/qs/QSPanelTest.java index 49796843af6e..5f6fc33d6e34 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/qs/QSPanelTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/qs/QSPanelTest.java @@ -19,6 +19,7 @@ import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; import static org.mockito.Mockito.verify; +import android.support.test.filters.FlakyTest; import android.testing.AndroidTestingRunner; import android.testing.TestableLooper; import android.testing.TestableLooper.RunWithLooper; @@ -29,6 +30,7 @@ import com.android.systemui.SysuiTestCase; import com.android.systemui.qs.customize.QSCustomizer; import org.junit.Before; +import org.junit.Ignore; import org.junit.Test; import org.junit.runner.RunWith; @@ -36,6 +38,7 @@ import java.util.Collections; @RunWith(AndroidTestingRunner.class) @RunWithLooper +@FlakyTest public class QSPanelTest extends SysuiTestCase { private MetricsLogger mMetricsLogger; diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/ExpandableNotificationRowTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/ExpandableNotificationRowTest.java index 5cd092bc8b53..a3a0a6f2c8d8 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/ExpandableNotificationRowTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/ExpandableNotificationRowTest.java @@ -16,22 +16,29 @@ package com.android.systemui.statusbar; +import static org.mockito.ArgumentMatchers.any; import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.verify; import android.content.Context; import android.support.test.InstrumentationRegistry; import android.support.test.annotation.UiThreadTest; +import android.support.test.filters.FlakyTest; import android.support.test.filters.SmallTest; import android.support.test.runner.AndroidJUnit4; import android.view.View; +import com.android.systemui.statusbar.stack.NotificationChildrenContainer; + import org.junit.Assert; import org.junit.Before; +import org.junit.Ignore; import org.junit.Test; import org.junit.runner.RunWith; @SmallTest @RunWith(AndroidJUnit4.class) +@FlakyTest public class ExpandableNotificationRowTest { private Context mContext; @@ -62,4 +69,25 @@ public class ExpandableNotificationRowTest { == View.VISIBLE); } + @Test + public void testUserLockedResetEvenWhenNoChildren() { + mGroup.setUserLocked(true); + mGroup.removeAllChildren(); + mGroup.setUserLocked(false); + Assert.assertFalse("The childrencontainer should not be userlocked but is, the state " + + "seems out of sync.", mGroup.getChildrenContainer().isUserLocked()); + } + + @Test + public void testReinflatedOnDensityChange() { + mGroup.setUserLocked(true); + mGroup.removeAllChildren(); + mGroup.setUserLocked(false); + NotificationChildrenContainer mockContainer = mock(NotificationChildrenContainer.class); + mGroup.setChildrenContainer(mockContainer); + mGroup.onDensityOrFontScaleChanged(); + verify(mockContainer).reInflateViews(any(), any()); + } + + } diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/NotificationContentViewTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/NotificationContentViewTest.java index 77f96b8a7b19..fecf90181fa2 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/NotificationContentViewTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/NotificationContentViewTest.java @@ -19,12 +19,14 @@ package com.android.systemui.statusbar; import android.content.Context; import android.support.test.InstrumentationRegistry; import android.support.test.annotation.UiThreadTest; +import android.support.test.filters.FlakyTest; import android.support.test.filters.SmallTest; import android.support.test.runner.AndroidJUnit4; import android.view.View; import org.junit.Assert; import org.junit.Before; +import org.junit.Ignore; import org.junit.Test; import org.junit.runner.RunWith; @@ -35,6 +37,7 @@ import static org.mockito.Mockito.spy; @SmallTest @RunWith(AndroidJUnit4.class) +@FlakyTest public class NotificationContentViewTest { NotificationContentView mView; diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/NotificationCustomViewWrapperTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/NotificationCustomViewWrapperTest.java index f016aa1bedf8..00f2b1872a91 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/NotificationCustomViewWrapperTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/NotificationCustomViewWrapperTest.java @@ -19,6 +19,7 @@ package com.android.systemui.statusbar; import android.content.Context; import android.support.test.InstrumentationRegistry; import android.support.test.annotation.UiThreadTest; +import android.support.test.filters.FlakyTest; import android.support.test.filters.SmallTest; import android.support.test.runner.AndroidJUnit4; import android.view.View; @@ -30,11 +31,13 @@ import com.android.systemui.statusbar.notification.NotificationViewWrapper; import org.junit.Assert; import org.junit.Before; +import org.junit.Ignore; import org.junit.Test; import org.junit.runner.RunWith; @SmallTest @RunWith(AndroidJUnit4.class) +@FlakyTest public class NotificationCustomViewWrapperTest { private Context mContext; diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/NotificationInflaterTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/NotificationInflaterTest.java index 0c5bdeacbd4e..f9f40a6a69b0 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/NotificationInflaterTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/NotificationInflaterTest.java @@ -27,6 +27,7 @@ import android.content.Context; import android.service.notification.StatusBarNotification; import android.support.test.InstrumentationRegistry; import android.support.test.annotation.UiThreadTest; +import android.support.test.filters.FlakyTest; import android.support.test.filters.SmallTest; import android.support.test.runner.AndroidJUnit4; import android.widget.RemoteViews; @@ -38,6 +39,7 @@ import com.android.systemui.statusbar.NotificationTestHelper; import org.junit.Assert; import org.junit.Before; +import org.junit.Ignore; import org.junit.Test; import org.junit.runner.RunWith; @@ -45,6 +47,7 @@ import java.util.concurrent.CountDownLatch; @SmallTest @RunWith(AndroidJUnit4.class) +@FlakyTest public class NotificationInflaterTest { private Context mContext; diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/stack/NotificationChildrenContainerTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/stack/NotificationChildrenContainerTest.java index f051f3043224..4932ba145536 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/stack/NotificationChildrenContainerTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/stack/NotificationChildrenContainerTest.java @@ -19,6 +19,7 @@ package com.android.systemui.statusbar.stack; import android.content.Context; import android.support.test.InstrumentationRegistry; import android.support.test.annotation.UiThreadTest; +import android.support.test.filters.FlakyTest; import android.support.test.filters.SmallTest; import android.support.test.runner.AndroidJUnit4; import android.view.NotificationHeaderView; @@ -29,11 +30,13 @@ import com.android.systemui.statusbar.NotificationTestHelper; import org.junit.Assert; import org.junit.Before; +import org.junit.Ignore; import org.junit.Test; import org.junit.runner.RunWith; @SmallTest @RunWith(AndroidJUnit4.class) +@FlakyTest public class NotificationChildrenContainerTest { private Context mContext; diff --git a/proto/src/wifi.proto b/proto/src/wifi.proto index debb1578451a..564d1355c7a1 100644 --- a/proto/src/wifi.proto +++ b/proto/src/wifi.proto @@ -241,6 +241,20 @@ message WifiLog { // List of events repeated StaEvent sta_event_list = 52; + + // Total number of times WiFi HAL crashed. + optional int32 num_hal_crashes = 53; + + // Total number of times WiFicond crashed. + optional int32 num_wificond_crashes = 54; + + // Indicates the number of times an error was encountered in + // Wifi HAL when wifi was turned on. + optional int32 num_wifi_on_failure_due_to_hal = 55; + + // Indicates the number of times an error was encountered in + // Wificond when wifi was turned on. + optional int32 num_wifi_on_failure_due_to_wificond = 56; } // Information that gets logged for every WiFi connection. diff --git a/services/autofill/java/com/android/server/autofill/Helper.java b/services/autofill/java/com/android/server/autofill/Helper.java index 0281f73d5b40..86e32e041a96 100644 --- a/services/autofill/java/com/android/server/autofill/Helper.java +++ b/services/autofill/java/com/android/server/autofill/Helper.java @@ -16,7 +16,10 @@ package com.android.server.autofill; +import android.annotation.Nullable; import android.os.Bundle; +import android.util.ArraySet; +import android.view.autofill.AutofillId; import java.util.Arrays; import java.util.Objects; @@ -68,4 +71,15 @@ public final class Helper { append(builder, bundle); return builder.toString(); } + + @Nullable + static AutofillId[] toArray(@Nullable ArraySet<AutofillId> set) { + if (set == null) return null; + + final AutofillId[] array = new AutofillId[set.size()]; + for (int i = 0; i < set.size(); i++) { + array[i] = set.valueAt(i); + } + return array; + } } diff --git a/services/autofill/java/com/android/server/autofill/Session.java b/services/autofill/java/com/android/server/autofill/Session.java index 0122301b8bad..f3ca075b7f8e 100644 --- a/services/autofill/java/com/android/server/autofill/Session.java +++ b/services/autofill/java/com/android/server/autofill/Session.java @@ -28,6 +28,7 @@ import static android.view.autofill.AutofillManager.ACTION_VIEW_EXITED; import static com.android.server.autofill.Helper.sDebug; import static com.android.server.autofill.Helper.sPartitionMaxCount; import static com.android.server.autofill.Helper.sVerbose; +import static com.android.server.autofill.Helper.toArray; import static com.android.server.autofill.ViewState.STATE_AUTOFILLED; import static com.android.server.autofill.ViewState.STATE_RESTARTED_SESSION; @@ -57,6 +58,7 @@ import android.service.autofill.FillResponse; import android.service.autofill.SaveInfo; import android.service.autofill.SaveRequest; import android.util.ArrayMap; +import android.util.ArraySet; import android.util.Slog; import android.util.SparseArray; import android.view.autofill.AutofillId; @@ -172,13 +174,13 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState public void send(int resultCode, Bundle resultData) throws RemoteException { final AssistStructure structure = resultData.getParcelable(KEY_STRUCTURE); if (structure == null) { - Slog.wtf(TAG, "no assist structure"); + Slog.e(TAG, "No assist structure - app might have crashed providing it"); return; } final Bundle receiverExtras = resultData.getBundle(KEY_RECEIVER_EXTRAS); if (receiverExtras == null) { - Slog.wtf(TAG, "No " + KEY_RECEIVER_EXTRAS + " on receiver"); + Slog.e(TAG, "No receiver extras - app might have crashed providing it"); return; } @@ -1139,15 +1141,20 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState // Only track the views of the last response as only those are reported back to the // service, see #showSaveLocked - ArrayList<AutofillId> trackedViews = new ArrayList<>(); + final FillResponse response = mResponses.valueAt(getLastResponseIndex()); + + ArraySet<AutofillId> trackedViews = null; boolean saveOnAllViewsInvisible = false; - SaveInfo saveInfo = mResponses.valueAt(getLastResponseIndex()).getSaveInfo(); + final SaveInfo saveInfo = response.getSaveInfo(); if (saveInfo != null) { saveOnAllViewsInvisible = (saveInfo.getFlags() & SaveInfo.FLAG_SAVE_ON_ALL_VIEWS_INVISIBLE) != 0; // We only need to track views if we want to save once they become invisible. if (saveOnAllViewsInvisible) { + if (trackedViews == null) { + trackedViews = new ArraySet<>(); + } if (saveInfo.getRequiredIds() != null) { Collections.addAll(trackedViews, saveInfo.getRequiredIds()); } @@ -1158,8 +1165,32 @@ final class Session implements RemoteFillService.FillServiceCallbacks, ViewState } } + // Must also track that are part of datasets, otherwise the FillUI won't be hidden when + // they go away (if they're not savable). + + final ArrayList<Dataset> datasets = response.getDatasets(); + ArraySet<AutofillId> fillableIds = null; + if (datasets != null) { + for (int i = 0; i < datasets.size(); i++) { + final Dataset dataset = datasets.get(i); + final ArrayList<AutofillId> fieldIds = dataset.getFieldIds(); + if (fieldIds == null) continue; + + for (int j = 0; j < fieldIds.size(); j++) { + final AutofillId id = fieldIds.get(j); + if (trackedViews == null || !trackedViews.contains(id)) { + fillableIds = ArrayUtils.add(fillableIds, id); + } + } + } + } + try { - mClient.setTrackedViews(id, trackedViews, saveOnAllViewsInvisible); + if (sVerbose) { + Slog.v(TAG, "updateTrackedIdsLocked(): " + trackedViews + " => " + fillableIds); + } + mClient.setTrackedViews(id, toArray(trackedViews), saveOnAllViewsInvisible, + toArray(fillableIds)); } catch (RemoteException e) { Slog.w(TAG, "Cannot set tracked ids", e); } diff --git a/services/core/java/com/android/server/LockSettingsService.java b/services/core/java/com/android/server/LockSettingsService.java index f7a682a6baf0..773a1ee466fa 100644 --- a/services/core/java/com/android/server/LockSettingsService.java +++ b/services/core/java/com/android/server/LockSettingsService.java @@ -161,7 +161,7 @@ public class LockSettingsService extends ILockSettings.Stub { */ private static final int[] SYSTEM_CREDENTIAL_UIDS = { Process.WIFI_UID, Process.VPN_UID, - Process.ROOT_UID }; + Process.ROOT_UID, Process.SYSTEM_UID }; // This class manages life cycle events for encrypted users on File Based Encryption (FBE) // devices. The most basic of these is to show/hide notifications about missing features until diff --git a/services/core/java/com/android/server/PinnerService.java b/services/core/java/com/android/server/PinnerService.java index e3ebf4d3a7ee..45f90253a2aa 100644 --- a/services/core/java/com/android/server/PinnerService.java +++ b/services/core/java/com/android/server/PinnerService.java @@ -16,12 +16,15 @@ package com.android.server; +import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; +import android.content.IntentFilter; import android.content.pm.ActivityInfo; import android.content.pm.ApplicationInfo; import android.content.pm.PackageManager; import android.content.pm.ResolveInfo; +import android.net.Uri; import android.os.Binder; import android.os.Build; import android.os.Handler; @@ -33,6 +36,7 @@ import android.system.ErrnoException; import android.system.Os; import android.system.OsConstants; import android.system.StructStat; +import android.util.ArraySet; import android.util.Slog; import com.android.internal.app.ResolverActivity; @@ -68,6 +72,19 @@ public final class PinnerService extends SystemService { private PinnerHandler mPinnerHandler = null; + private final BroadcastReceiver mBroadcastReceiver = new BroadcastReceiver() { + @Override + public void onReceive(Context context, Intent intent) { + // If this user's camera app has been updated, update pinned files accordingly. + if (intent.getAction() == Intent.ACTION_PACKAGE_REPLACED) { + Uri packageUri = intent.getData(); + String packageName = packageUri.getSchemeSpecificPart(); + ArraySet<String> updatedPackages = new ArraySet<>(); + updatedPackages.add(packageName); + update(updatedPackages); + } + } + }; public PinnerService(Context context) { super(context); @@ -76,6 +93,11 @@ public final class PinnerService extends SystemService { mShouldPinCamera = context.getResources().getBoolean( com.android.internal.R.bool.config_pinnerCameraApp); mPinnerHandler = new PinnerHandler(BackgroundThread.get().getLooper()); + + IntentFilter filter = new IntentFilter(); + filter.addAction(Intent.ACTION_PACKAGE_REPLACED); + filter.addDataScheme("package"); + mContext.registerReceiver(mBroadcastReceiver, filter); } @Override @@ -85,6 +107,7 @@ public final class PinnerService extends SystemService { } mBinderService = new BinderService(); publishBinderService("pinner", mBinderService); + publishLocalService(PinnerService.class, this); mPinnerHandler.obtainMessage(PinnerHandler.PIN_ONSTART_MSG).sendToTarget(); mPinnerHandler.obtainMessage(PinnerHandler.PIN_CAMERA_MSG, UserHandle.USER_SYSTEM, 0) @@ -103,6 +126,20 @@ public final class PinnerService extends SystemService { } /** + * Update the currently pinned files. + * Specifically, this only updates camera pinning. + * The other files pinned in onStart will not need to be updated. + */ + public void update(ArraySet<String> updatedPackages) { + ApplicationInfo cameraInfo = getCameraInfo(UserHandle.USER_SYSTEM); + if (cameraInfo != null && updatedPackages.contains(cameraInfo.packageName)) { + Slog.i(TAG, "Updating pinned files."); + mPinnerHandler.obtainMessage(PinnerHandler.PIN_CAMERA_MSG, UserHandle.USER_SYSTEM, 0) + .sendToTarget(); + } + } + + /** * Handler for on start pinning message */ private void handlePinOnStart() { @@ -202,13 +239,10 @@ public final class PinnerService extends SystemService { return cameraResolveInfo.activityInfo.applicationInfo; } + /** + * If the camera app is already pinned, unpin and repin it. + */ private boolean pinCamera(int userHandle){ - //we may have already pinned a camera app. If we've pinned this - //camera app, we're done. otherwise, unpin and pin the new app - if (alreadyPinned(userHandle)){ - return true; - } - ApplicationInfo cameraInfo = getCameraInfo(userHandle); if (cameraInfo == null) { return false; diff --git a/services/core/java/com/android/server/SystemServiceManager.java b/services/core/java/com/android/server/SystemServiceManager.java index 10b26092f387..72ff6068cd68 100644 --- a/services/core/java/com/android/server/SystemServiceManager.java +++ b/services/core/java/com/android/server/SystemServiceManager.java @@ -164,6 +164,13 @@ public class SystemServiceManager { } } + /** + * @return true if system has completed the boot; false otherwise. + */ + public boolean isBootCompleted() { + return mCurrentPhase >= SystemService.PHASE_BOOT_COMPLETED; + } + public void startUser(final int userHandle) { Slog.i(TAG, "Calling onStartUser u" + userHandle); final int serviceLen = mServices.size(); diff --git a/services/core/java/com/android/server/VibratorService.java b/services/core/java/com/android/server/VibratorService.java index 678ae38514a3..9fa66243d2b7 100644 --- a/services/core/java/com/android/server/VibratorService.java +++ b/services/core/java/com/android/server/VibratorService.java @@ -221,7 +221,13 @@ public class VibratorService extends IVibratorService.Stub long[] clickEffectTimings = getLongIntArray(context.getResources(), com.android.internal.R.array.config_virtualKeyVibePattern); - VibrationEffect clickEffect = VibrationEffect.createWaveform(clickEffectTimings, -1); + VibrationEffect clickEffect; + if (clickEffectTimings.length == 1) { + clickEffect = VibrationEffect.createOneShot( + clickEffectTimings[0], VibrationEffect.DEFAULT_AMPLITUDE); + } else { + clickEffect = VibrationEffect.createWaveform(clickEffectTimings, -1); + } VibrationEffect doubleClickEffect = VibrationEffect.createWaveform( new long[] {0, 30, 100, 30} /*timings*/, -1); diff --git a/services/core/java/com/android/server/am/ActivityManagerService.java b/services/core/java/com/android/server/am/ActivityManagerService.java index 54b28d1584e0..bb6637d102d7 100644 --- a/services/core/java/com/android/server/am/ActivityManagerService.java +++ b/services/core/java/com/android/server/am/ActivityManagerService.java @@ -4587,9 +4587,9 @@ public class ActivityManagerService extends IActivityManager.Stub } @Override - public int startActivityIntentSender(IApplicationThread caller, IntentSender intent, - Intent fillInIntent, String resolvedType, IBinder resultTo, String resultWho, - int requestCode, int flagsMask, int flagsValues, Bundle bOptions) + public int startActivityIntentSender(IApplicationThread caller, IIntentSender target, + IBinder whitelistToken, Intent fillInIntent, String resolvedType, IBinder resultTo, + String resultWho, int requestCode, int flagsMask, int flagsValues, Bundle bOptions) throws TransactionTooLargeException { enforceNotIsolatedCaller("startActivityIntentSender"); // Refuse possible leaked file descriptors @@ -4597,12 +4597,11 @@ public class ActivityManagerService extends IActivityManager.Stub throw new IllegalArgumentException("File descriptors passed in Intent"); } - IIntentSender sender = intent.getTarget(); - if (!(sender instanceof PendingIntentRecord)) { + if (!(target instanceof PendingIntentRecord)) { throw new IllegalArgumentException("Bad PendingIntent object"); } - PendingIntentRecord pir = (PendingIntentRecord)sender; + PendingIntentRecord pir = (PendingIntentRecord)target; synchronized (this) { // If this is coming from the currently resumed activity, it is @@ -4613,7 +4612,7 @@ public class ActivityManagerService extends IActivityManager.Stub mAppSwitchesAllowedTime = 0; } } - int ret = pir.sendInner(0, fillInIntent, resolvedType, null, null, null, + int ret = pir.sendInner(0, fillInIntent, resolvedType, whitelistToken, null, null, resultTo, resultWho, requestCode, flagsMask, flagsValues, bOptions, null); return ret; } diff --git a/services/core/java/com/android/server/am/ActivityRecord.java b/services/core/java/com/android/server/am/ActivityRecord.java index 55ec3b0d890d..5636e197aaee 100644 --- a/services/core/java/com/android/server/am/ActivityRecord.java +++ b/services/core/java/com/android/server/am/ActivityRecord.java @@ -284,7 +284,6 @@ final class ActivityRecord extends ConfigurationContainer implements AppWindowCo boolean visible; // does this activity's window need to be shown? boolean visibleIgnoringKeyguard; // is this activity visible, ignoring the fact that Keyguard // might hide this activity? - private boolean mLastSetWindowVisibility; // The last window visibility state that was set. private boolean mDeferHidingClient; // If true we told WM to defer reporting to the client // process that it is hidden. boolean sleeping; // have we told the activity to sleep? @@ -1589,10 +1588,6 @@ final class ActivityRecord extends ConfigurationContainer implements AppWindowCo } void setVisibility(boolean visible) { - if (mLastSetWindowVisibility == visible) { - return; - } - mLastSetWindowVisibility = visible; mWindowContainerController.setVisibility(visible, mDeferHidingClient); mStackSupervisor.mActivityMetricsLogger.notifyVisibilityChanged(this, visible); } diff --git a/services/core/java/com/android/server/am/ActivityStarter.java b/services/core/java/com/android/server/am/ActivityStarter.java index 960351b21f63..7ed07e0e931a 100644 --- a/services/core/java/com/android/server/am/ActivityStarter.java +++ b/services/core/java/com/android/server/am/ActivityStarter.java @@ -957,7 +957,7 @@ class ActivityStarter { // If we are not able to proceed, disassociate the activity from the task. Leaving an // activity in an incomplete state can lead to issues, such as performing operations // without a window container. - if (ActivityManager.isStartResultFatalError(result) + if (!ActivityManager.isStartResultSuccessful(result) && mStartActivity.getTask() != null) { mStartActivity.getTask().removeActivity(mStartActivity); } @@ -1051,6 +1051,15 @@ class ActivityStarter { reusedActivity = setTargetStackAndMoveToFrontIfNeeded(reusedActivity); + final ActivityRecord outResult = + outActivity != null && outActivity.length > 0 ? outActivity[0] : null; + + // When there is a reused activity and the current result is a trampoline activity, + // set the reused activity as the result. + if (outResult != null && (outResult.finishing || outResult.noDisplay)) { + outActivity[0] = reusedActivity; + } + if ((mStartFlags & START_FLAG_ONLY_IF_NEEDED) != 0) { // We don't need to start a new activity, and the client said not to do anything // if that is the case, so this is it! And for paranoia, make sure we have diff --git a/services/core/java/com/android/server/am/BatteryStatsService.java b/services/core/java/com/android/server/am/BatteryStatsService.java index 11fc40b04734..243906260593 100644 --- a/services/core/java/com/android/server/am/BatteryStatsService.java +++ b/services/core/java/com/android/server/am/BatteryStatsService.java @@ -16,6 +16,8 @@ package com.android.server.am; +import static com.android.internal.os.BatteryStatsImpl.ExternalStatsSync.UPDATE_CPU; + import android.annotation.Nullable; import android.bluetooth.BluetoothActivityEnergyInfo; import android.bluetooth.BluetoothAdapter; @@ -1549,7 +1551,9 @@ public final class BatteryStatsService extends IBatteryStats.Stub BatteryStats.HistoryItem.EVENT_COLLECT_EXTERNAL_STATS, reason, 0); - mStats.updateCpuTimeLocked(); + if ((updateFlags & UPDATE_CPU) != 0) { + mStats.updateCpuTimeLocked(true /* updateCpuFreqData */); + } mStats.updateKernelWakelocksLocked(); mStats.updateKernelMemoryBandwidthLocked(); diff --git a/services/core/java/com/android/server/audio/AudioService.java b/services/core/java/com/android/server/audio/AudioService.java index e9555f7870d7..e5c31061feab 100644 --- a/services/core/java/com/android/server/audio/AudioService.java +++ b/services/core/java/com/android/server/audio/AudioService.java @@ -3931,7 +3931,7 @@ public class AudioService extends IAudioService.Stub public int setBluetoothA2dpDeviceConnectionState(BluetoothDevice device, int state, int profile) { - if (mAudioHandler.hasMessages(MSG_SET_A2DP_SINK_CONNECTION_STATE)) { + if (mAudioHandler.hasMessages(MSG_SET_A2DP_SINK_CONNECTION_STATE, device)) { return 0; } return setBluetoothA2dpDeviceConnectionStateInt( @@ -5070,7 +5070,7 @@ public class AudioService extends IAudioService.Stub private void onSetA2dpSinkConnectionState(BluetoothDevice btDevice, int state) { - if (DEBUG_VOL) { + if (DEBUG_DEVICES) { Log.d(TAG, "onSetA2dpSinkConnectionState btDevice=" + btDevice+"state=" + state); } if (btDevice == null) { @@ -5173,7 +5173,7 @@ public class AudioService extends IAudioService.Stub int device = AudioSystem.DEVICE_OUT_BLUETOOTH_A2DP; synchronized (mConnectedDevices) { - if (mAudioHandler.hasMessages(MSG_SET_A2DP_SINK_CONNECTION_STATE)) { + if (mAudioHandler.hasMessages(MSG_SET_A2DP_SINK_CONNECTION_STATE, btDevice)) { return; } final String key = makeDeviceListKey(device, address); diff --git a/services/core/java/com/android/server/connectivity/tethering/TetheringConfiguration.java b/services/core/java/com/android/server/connectivity/tethering/TetheringConfiguration.java index 44c61f0160e7..69411936eb1a 100644 --- a/services/core/java/com/android/server/connectivity/tethering/TetheringConfiguration.java +++ b/services/core/java/com/android/server/connectivity/tethering/TetheringConfiguration.java @@ -163,20 +163,31 @@ public class TetheringConfiguration { } // Fix up upstream interface types for DUN or mobile. NOTE: independent - // of the value of |requiresDun|, cell data of one form or another is + // of the value of |dunCheck|, cell data of one form or another is // *always* an upstream, regardless of the upstream interface types // specified by configuration resources. if (dunCheck == DUN_REQUIRED) { if (!upstreamIfaceTypes.contains(TYPE_MOBILE_DUN)) { upstreamIfaceTypes.add(TYPE_MOBILE_DUN); } - } else { + } else if (dunCheck == DUN_NOT_REQUIRED) { if (!upstreamIfaceTypes.contains(TYPE_MOBILE)) { upstreamIfaceTypes.add(TYPE_MOBILE); } if (!upstreamIfaceTypes.contains(TYPE_MOBILE_HIPRI)) { upstreamIfaceTypes.add(TYPE_MOBILE_HIPRI); } + } else { + // Fix upstream interface types for case DUN_UNSPECIFIED. + // Do not modify if a cellular interface type is already present in the + // upstream interface types. Add TYPE_MOBILE and TYPE_MOBILE_HIPRI if no + // cellular interface types are found in the upstream interface types. + if (!(upstreamIfaceTypes.contains(TYPE_MOBILE_DUN) + || upstreamIfaceTypes.contains(TYPE_MOBILE) + || upstreamIfaceTypes.contains(TYPE_MOBILE_HIPRI))) { + upstreamIfaceTypes.add(TYPE_MOBILE); + upstreamIfaceTypes.add(TYPE_MOBILE_HIPRI); + } } return upstreamIfaceTypes; diff --git a/services/core/java/com/android/server/content/SyncStorageEngine.java b/services/core/java/com/android/server/content/SyncStorageEngine.java index 069ae7394319..f804fa1cff3e 100644 --- a/services/core/java/com/android/server/content/SyncStorageEngine.java +++ b/services/core/java/com/android/server/content/SyncStorageEngine.java @@ -18,6 +18,7 @@ package com.android.server.content; import android.accounts.Account; import android.accounts.AccountAndUser; +import android.accounts.AccountManager; import android.app.backup.BackupManager; import android.content.ComponentName; import android.content.ContentResolver; @@ -27,6 +28,7 @@ import android.content.PeriodicSync; import android.content.SyncInfo; import android.content.SyncRequest; import android.content.SyncStatusInfo; +import android.content.pm.PackageManager; import android.database.Cursor; import android.database.sqlite.SQLiteDatabase; import android.database.sqlite.SQLiteException; @@ -350,6 +352,50 @@ public class SyncStorageEngine extends Handler { void onAuthorityRemoved(EndPoint removedAuthority); } + /** + * Validator that maintains a lazy cache of accounts and providers to tell if an authority or + * account is valid. + */ + private static class AccountAuthorityValidator { + final private AccountManager mAccountManager; + final private PackageManager mPackageManager; + final private SparseArray<Account[]> mAccountsCache; + final private SparseArray<ArrayMap<String, Boolean>> mProvidersPerUserCache; + + AccountAuthorityValidator(Context context) { + mAccountManager = context.getSystemService(AccountManager.class); + mPackageManager = context.getPackageManager(); + mAccountsCache = new SparseArray<>(); + mProvidersPerUserCache = new SparseArray<>(); + } + + // An account is valid if an installed authenticator has previously created that account + // on the device + boolean isAccountValid(Account account, int userId) { + Account[] accountsForUser = mAccountsCache.get(userId); + if (accountsForUser == null) { + accountsForUser = mAccountManager.getAccountsAsUser(userId); + mAccountsCache.put(userId, accountsForUser); + } + return ArrayUtils.contains(accountsForUser, account); + } + + // An authority is only valid if it has a content provider installed on the system + boolean isAuthorityValid(String authority, int userId) { + ArrayMap<String, Boolean> authorityMap = mProvidersPerUserCache.get(userId); + if (authorityMap == null) { + authorityMap = new ArrayMap<>(); + mProvidersPerUserCache.put(userId, authorityMap); + } + if (!authorityMap.containsKey(authority)) { + authorityMap.put(authority, mPackageManager.resolveContentProviderAsUser(authority, + PackageManager.MATCH_DIRECT_BOOT_AWARE + | PackageManager.MATCH_DIRECT_BOOT_UNAWARE, userId) != null); + } + return authorityMap.get(authority); + } + } + // Primary list of all syncable authorities. Also our global lock. private final SparseArray<AuthorityInfo> mAuthorities = new SparseArray<AuthorityInfo>(); @@ -1502,12 +1548,13 @@ public class SyncStorageEngine extends Handler { eventType = parser.next(); AuthorityInfo authority = null; PeriodicSync periodicSync = null; + AccountAuthorityValidator validator = new AccountAuthorityValidator(mContext); do { if (eventType == XmlPullParser.START_TAG) { tagName = parser.getName(); if (parser.getDepth() == 2) { if ("authority".equals(tagName)) { - authority = parseAuthority(parser, version); + authority = parseAuthority(parser, version, validator); periodicSync = null; if (authority != null) { if (authority.ident > highestAuthorityId) { @@ -1636,7 +1683,8 @@ public class SyncStorageEngine extends Handler { mMasterSyncAutomatically.put(userId, listen); } - private AuthorityInfo parseAuthority(XmlPullParser parser, int version) { + private AuthorityInfo parseAuthority(XmlPullParser parser, int version, + AccountAuthorityValidator validator) { AuthorityInfo authority = null; int id = -1; try { @@ -1676,21 +1724,26 @@ public class SyncStorageEngine extends Handler { if (Log.isLoggable(TAG_FILE, Log.VERBOSE)) { Slog.v(TAG_FILE, "Creating authority entry"); } - EndPoint info = null; if (accountName != null && authorityName != null) { - info = new EndPoint( + EndPoint info = new EndPoint( new Account(accountName, accountType), authorityName, userId); - } - if (info != null) { - authority = getOrCreateAuthorityLocked(info, id, false); - // If the version is 0 then we are upgrading from a file format that did not - // know about periodic syncs. In that case don't clear the list since we - // want the default, which is a daily periodic sync. - // Otherwise clear out this default list since we will populate it later with - // the periodic sync descriptions that are read from the configuration file. - if (version > 0) { - authority.periodicSyncs.clear(); + if (validator.isAccountValid(info.account, userId) + && validator.isAuthorityValid(authorityName, userId)) { + authority = getOrCreateAuthorityLocked(info, id, false); + // If the version is 0 then we are upgrading from a file format that did not + // know about periodic syncs. In that case don't clear the list since we + // want the default, which is a daily periodic sync. + // Otherwise clear out this default list since we will populate it later + // with + // the periodic sync descriptions that are read from the configuration file. + if (version > 0) { + authority.periodicSyncs.clear(); + } + } else { + EventLog.writeEvent(0x534e4554, "35028827", -1, + "account:" + info.account + " provider:" + authorityName + " user:" + + userId); } } } diff --git a/services/core/java/com/android/server/dreams/DreamManagerService.java b/services/core/java/com/android/server/dreams/DreamManagerService.java index dbccc0765b73..1b984a418257 100644 --- a/services/core/java/com/android/server/dreams/DreamManagerService.java +++ b/services/core/java/com/android/server/dreams/DreamManagerService.java @@ -86,6 +86,7 @@ public final class DreamManagerService extends SystemService { private boolean mCurrentDreamCanDoze; private boolean mCurrentDreamIsDozing; private boolean mCurrentDreamIsWaking; + private Runnable mStopDreamRunnable; private int mCurrentDreamDozeScreenState = Display.STATE_UNKNOWN; private int mCurrentDreamDozeScreenBrightness = PowerManager.BRIGHTNESS_DEFAULT; @@ -349,6 +350,11 @@ public final class DreamManagerService extends SystemService { private void startDreamLocked(final ComponentName name, final boolean isTest, final boolean canDoze, final int userId) { + if (mStopDreamRunnable != null) { + mHandler.removeCallbacks(mStopDreamRunnable); + mStopDreamRunnable = null; + } + if (Objects.equal(mCurrentDreamName, name) && mCurrentDreamIsTest == isTest && mCurrentDreamCanDoze == canDoze @@ -386,13 +392,15 @@ public final class DreamManagerService extends SystemService { mCurrentDreamIsWaking = true; } - mHandler.post(new Runnable() { + mStopDreamRunnable = new Runnable() { @Override public void run() { Slog.i(TAG, "Performing gentle wake from dream."); mController.stopDream(immediate); + mStopDreamRunnable = null; } - }); + }; + mHandler.post(mStopDreamRunnable); } } diff --git a/services/core/java/com/android/server/emergency/EmergencyAffordanceService.java b/services/core/java/com/android/server/emergency/EmergencyAffordanceService.java index 98771dfa1f33..a91fe773a5cf 100644 --- a/services/core/java/com/android/server/emergency/EmergencyAffordanceService.java +++ b/services/core/java/com/android/server/emergency/EmergencyAffordanceService.java @@ -219,6 +219,7 @@ public class EmergencyAffordanceService extends SystemService { List<SubscriptionInfo> activeSubscriptionInfoList = mSubscriptionManager.getActiveSubscriptionInfoList(); if (activeSubscriptionInfoList == null) { + setSimNeedsEmergencyAffordance(neededNow); return neededNow; } for (SubscriptionInfo info : activeSubscriptionInfoList) { diff --git a/services/core/java/com/android/server/location/GnssLocationProvider.java b/services/core/java/com/android/server/location/GnssLocationProvider.java index 85d89865a074..3fd91dc3b3d5 100644 --- a/services/core/java/com/android/server/location/GnssLocationProvider.java +++ b/services/core/java/com/android/server/location/GnssLocationProvider.java @@ -937,9 +937,9 @@ public class GnssLocationProvider implements LocationProviderInterface { long time = mNtpTime.getCachedNtpTime(); long timeReference = mNtpTime.getCachedNtpTimeReference(); long certainty = mNtpTime.getCacheCertainty(); - long now = SystemClock.elapsedRealtime(); if (DEBUG) { + long now = System.currentTimeMillis(); Log.d(TAG, "NTP server returned: " + time + " (" + new Date(time) + ") reference: " + timeReference diff --git a/services/core/java/com/android/server/media/MediaSessionService.java b/services/core/java/com/android/server/media/MediaSessionService.java index e0017b502ee0..38c615791d9f 100644 --- a/services/core/java/com/android/server/media/MediaSessionService.java +++ b/services/core/java/com/android/server/media/MediaSessionService.java @@ -171,19 +171,63 @@ public class MediaSessionService extends SystemService implements Monitor { public void updateSession(MediaSessionRecord record) { synchronized (mLock) { FullUserRecord user = getFullUserRecordLocked(record.getUserId()); - if (user == null || !user.mPriorityStack.contains(record)) { - Log.d(TAG, "Unknown session updated. Ignoring."); + if (user == null) { + Log.w(TAG, "Unknown session updated. Ignoring."); return; } - user.mPriorityStack.onSessionStateChange(record); if ((record.getFlags() & MediaSession.FLAG_EXCLUSIVE_GLOBAL_PRIORITY) != 0) { - mGlobalPrioritySession = record; + if (mGlobalPrioritySession != record) { + Log.d(TAG, "Global priority session is changed from " + mGlobalPrioritySession + + " to " + record); + mGlobalPrioritySession = record; + if (user != null && user.mPriorityStack.contains(record)) { + // Handle the global priority session separately. + // Otherwise, it will be the media button session even after it becomes + // inactive because it has been the lastly played media app. + user.mPriorityStack.removeSession(record); + } + } + if (DEBUG_KEY_EVENT) { + Log.d(TAG, "Global priority session is updated, active=" + record.isActive()); + } user.pushAddressedPlayerChangedLocked(); + } else { + if (!user.mPriorityStack.contains(record)) { + Log.w(TAG, "Unknown session updated. Ignoring."); + return; + } + user.mPriorityStack.onSessionStateChange(record); } mHandler.postSessionsChanged(record.getUserId()); } } + private List<MediaSessionRecord> getActiveSessionsLocked(int userId) { + List<MediaSessionRecord> records; + if (userId == UserHandle.USER_ALL) { + records = new ArrayList<>(); + int size = mUserRecords.size(); + for (int i = 0; i < size; i++) { + records.addAll(mUserRecords.valueAt(i).mPriorityStack.getActiveSessions(userId)); + } + } else { + FullUserRecord user = getFullUserRecordLocked(userId); + if (user == null) { + Log.w(TAG, "getSessions failed. Unknown user " + userId); + return new ArrayList<>(); + } + records = user.mPriorityStack.getActiveSessions(userId); + } + + // Return global priority session at the first whenever it's asked. + if (isGlobalPriorityActiveLocked() + && (userId == UserHandle.USER_ALL + || userId == mGlobalPrioritySession.getUserId())) { + records.add(0, mGlobalPrioritySession); + } + return records; + } + /** * Tells the system UI that volume has changed on an active remote session. */ @@ -339,16 +383,16 @@ public class MediaSessionService extends SystemService implements Monitor { if (DEBUG) { Log.d(TAG, "Destroying " + session); } - int userId = session.getUserId(); - FullUserRecord user = getFullUserRecordLocked(userId); - if (user != null) { - user.removeSessionLocked(session); - } + FullUserRecord user = getFullUserRecordLocked(session.getUserId()); if (mGlobalPrioritySession == session) { mGlobalPrioritySession = null; if (session.isActive() && user != null) { user.pushAddressedPlayerChangedLocked(); } + } else { + if (user != null) { + user.mPriorityStack.removeSession(session); + } } try { @@ -484,7 +528,7 @@ public class MediaSessionService extends SystemService implements Monitor { throw new RuntimeException("Media Session owner died prematurely.", e); } - user.addSessionLocked(session); + user.mPriorityStack.addSession(session); mHandler.postSessionsChanged(userId); if (DEBUG) { @@ -509,7 +553,7 @@ public class MediaSessionService extends SystemService implements Monitor { Log.w(TAG, "pushSessionsChanged failed. No user with id=" + userId); return; } - List<MediaSessionRecord> records = user.mPriorityStack.getActiveSessions(userId); + List<MediaSessionRecord> records = getActiveSessionsLocked(userId); int size = records.size(); ArrayList<MediaSession.Token> tokens = new ArrayList<MediaSession.Token>(); for (int i = 0; i < size; i++) { @@ -637,14 +681,6 @@ public class MediaSessionService extends SystemService implements Monitor { } } - public void addSessionLocked(MediaSessionRecord session) { - mPriorityStack.addSession(session); - } - - public void removeSessionLocked(MediaSessionRecord session) { - mPriorityStack.removeSession(session); - } - public void dumpLocked(PrintWriter pw, String prefix) { pw.print(prefix + "Record for full_user=" + mFullUserId); // Dump managed profile user ids associated with this user. @@ -816,27 +852,9 @@ public class MediaSessionService extends SystemService implements Monitor { int resolvedUserId = verifySessionsRequest(componentName, userId, pid, uid); ArrayList<IBinder> binders = new ArrayList<IBinder>(); synchronized (mLock) { - if (resolvedUserId == UserHandle.USER_ALL) { - int size = mUserRecords.size(); - for (int i = 0; i < size; i++) { - List<MediaSessionRecord> records = - mUserRecords.valueAt(i).mPriorityStack.getActiveSessions( - resolvedUserId); - for (MediaSessionRecord record : records) { - binders.add(record.getControllerBinder().asBinder()); - } - } - } else { - FullUserRecord user = getFullUserRecordLocked(resolvedUserId); - if (user == null) { - Log.w(TAG, "getSessions failed. Unknown user " + userId); - return binders; - } - List<MediaSessionRecord> records = user.mPriorityStack - .getActiveSessions(resolvedUserId); - for (MediaSessionRecord record : records) { - binders.add(record.getControllerBinder().asBinder()); - } + List<MediaSessionRecord> records = getActiveSessionsLocked(resolvedUserId); + for (MediaSessionRecord record : records) { + binders.add(record.getControllerBinder().asBinder()); } } return binders; @@ -1292,6 +1310,9 @@ public class MediaSessionService extends SystemService implements Monitor { synchronized (mLock) { pw.println(mSessionsListeners.size() + " sessions listeners."); pw.println("Global priority session is " + mGlobalPrioritySession); + if (mGlobalPrioritySession != null) { + mGlobalPrioritySession.dump(pw, " "); + } pw.println("User Records:"); int count = mUserRecords.size(); for (int i = 0; i < count; i++) { diff --git a/services/core/java/com/android/server/media/MediaSessionStack.java b/services/core/java/com/android/server/media/MediaSessionStack.java index f474769bfd31..f03f630d0e57 100644 --- a/services/core/java/com/android/server/media/MediaSessionStack.java +++ b/services/core/java/com/android/server/media/MediaSessionStack.java @@ -310,7 +310,6 @@ class MediaSessionStack { * Get a priority sorted list of sessions. Can filter to only return active * sessions or sessions. * <p>Here's the priority order. - * <li>System priority session (session with FLAG_EXCLUSIVE_GLOBAL_PRIORITY)</li> * <li>Active sessions whose PlaybackState is active</li> * <li>Active sessions whose PlaybackState is inactive</li> * <li>Inactive sessions</li> @@ -344,13 +343,7 @@ class MediaSessionStack { continue; } - if (session.isSystemPriority()) { - // System priority sessions are special and always go at the - // front. We expect there to only be one of these at a time. - result.add(0, session); - lastPlaybackActiveIndex++; - lastActiveIndex++; - } else if (session.isPlaybackActive()) { + if (session.isPlaybackActive()) { result.add(lastPlaybackActiveIndex++, session); lastActiveIndex++; } else { diff --git a/services/core/java/com/android/server/notification/NotificationManagerService.java b/services/core/java/com/android/server/notification/NotificationManagerService.java index 9cd0dff53991..cb1742ea64ec 100644 --- a/services/core/java/com/android/server/notification/NotificationManagerService.java +++ b/services/core/java/com/android/server/notification/NotificationManagerService.java @@ -1521,15 +1521,13 @@ public class NotificationManagerService extends SystemService { final boolean isPackageSuspended = isPackageSuspendedForUser(pkg, Binder.getCallingUid()); - if (ENABLE_BLOCKED_TOASTS && (!noteNotificationOp(pkg, Binder.getCallingUid()) - || isPackageSuspended)) { - if (!isSystemToast) { - Slog.e(TAG, "Suppressing toast from package " + pkg - + (isPackageSuspended - ? " due to package suspended by administrator." - : " by user request.")); - return; - } + if (ENABLE_BLOCKED_TOASTS && !isSystemToast && + (!noteNotificationOp(pkg, Binder.getCallingUid()) || isPackageSuspended)) { + Slog.e(TAG, "Suppressing toast from package " + pkg + + (isPackageSuspended + ? " due to package suspended by administrator." + : " by user request.")); + return; } synchronized (mToastQueue) { @@ -3238,6 +3236,8 @@ public class NotificationManagerService extends SystemService { final String noChannelStr = "No Channel found for " + "pkg=" + pkg + ", channelId=" + channelId + + ", id=" + id + + ", tag=" + tag + ", opPkg=" + opPkg + ", callingUid=" + callingUid + ", userId=" + userId @@ -3282,10 +3282,12 @@ public class NotificationManagerService extends SystemService { } private void doChannelWarningToast(CharSequence toastText) { - final boolean warningEnabled = Settings.System.getInt(getContext().getContentResolver(), - Settings.Global.SHOW_NOTIFICATION_CHANNEL_WARNINGS, 0) != 0; - if (warningEnabled || Build.IS_DEBUGGABLE) { - Toast toast = Toast.makeText(getContext(), mHandler.getLooper(), toastText, Toast.LENGTH_LONG); + final int defaultWarningEnabled = Build.IS_DEBUGGABLE ? 1 : 0; + final boolean warningEnabled = Settings.Global.getInt(getContext().getContentResolver(), + Settings.Global.SHOW_NOTIFICATION_CHANNEL_WARNINGS, defaultWarningEnabled) != 0; + if (warningEnabled) { + Toast toast = Toast.makeText(getContext(), mHandler.getLooper(), toastText, + Toast.LENGTH_LONG); toast.show(); } } diff --git a/services/core/java/com/android/server/notification/RankingHelper.java b/services/core/java/com/android/server/notification/RankingHelper.java index f00ef386ba59..55cb2f3ffba9 100644 --- a/services/core/java/com/android/server/notification/RankingHelper.java +++ b/services/core/java/com/android/server/notification/RankingHelper.java @@ -1115,6 +1115,7 @@ public class RankingHelper implements RankingConfig { Record fullRecord = getRecord(pkg, mPm.getPackageUidAsUser(pkg, changeUserId)); if (fullRecord != null) { + createDefaultChannelIfNeeded(fullRecord); deleteDefaultChannelIfNeeded(fullRecord); } } catch (NameNotFoundException e) {} diff --git a/services/core/java/com/android/server/om/OverlayManagerSettings.java b/services/core/java/com/android/server/om/OverlayManagerSettings.java index 353b710138ae..c059b3784743 100644 --- a/services/core/java/com/android/server/om/OverlayManagerSettings.java +++ b/services/core/java/com/android/server/om/OverlayManagerSettings.java @@ -319,7 +319,7 @@ final class OverlayManagerSettings { private static final String ATTR_USER_ID = "userId"; private static final String ATTR_VERSION = "version"; - private static final int CURRENT_VERSION = 2; + private static final int CURRENT_VERSION = 3; public static void restore(@NonNull final ArrayList<SettingsItem> table, @NonNull final InputStream is) throws IOException, XmlPullParserException { @@ -350,6 +350,7 @@ final class OverlayManagerSettings { switch (oldVersion) { case 0: case 1: + case 2: // Throw an exception which will cause the overlay file to be ignored // and overwritten. throw new XmlPullParserException("old version " + oldVersion + "; ignoring"); diff --git a/services/core/java/com/android/server/pm/BackgroundDexOptService.java b/services/core/java/com/android/server/pm/BackgroundDexOptService.java index d364d17fa764..0d1f58ae8a59 100644 --- a/services/core/java/com/android/server/pm/BackgroundDexOptService.java +++ b/services/core/java/com/android/server/pm/BackgroundDexOptService.java @@ -36,6 +36,8 @@ import android.util.ArraySet; import android.util.Log; import com.android.server.pm.dex.DexManager; +import com.android.server.LocalServices; +import com.android.server.PinnerService; import java.io.File; import java.util.concurrent.atomic.AtomicBoolean; @@ -175,6 +177,7 @@ public class BackgroundDexOptService extends JobService { mAbortPostBootUpdate.set(false); + ArraySet<String> updatedPackages = new ArraySet<>(); for (String pkg : pkgs) { if (mAbortPostBootUpdate.get()) { // JobScheduler requested an early abort. @@ -208,11 +211,15 @@ public class BackgroundDexOptService extends JobService { // Unfortunately this will also means that "pm.dexopt.boot=speed-profile" will // behave differently than "pm.dexopt.bg-dexopt=speed-profile" but that's a // trade-off worth doing to save boot time work. - pm.performDexOpt(pkg, + int result = pm.performDexOptWithStatus(pkg, /* checkProfiles */ false, PackageManagerService.REASON_BOOT, /* force */ false); + if (result == PackageDexOptimizer.DEX_OPT_PERFORMED) { + updatedPackages.add(pkg); + } } + notifyPinService(updatedPackages); // Ran to completion, so we abandon our timeslice and do not reschedule. jobFinished(jobParams, /* reschedule */ false); } @@ -265,6 +272,7 @@ public class BackgroundDexOptService extends JobService { private int optimizePackages(PackageManagerService pm, ArraySet<String> pkgs, long lowStorageThreshold, boolean is_for_primary_dex, ArraySet<String> failedPackageNames) { + ArraySet<String> updatedPackages = new ArraySet<>(); for (String pkg : pkgs) { int abort_code = abortIdleOptimizations(lowStorageThreshold); if (abort_code != OPTIMIZE_CONTINUE) { @@ -284,14 +292,21 @@ public class BackgroundDexOptService extends JobService { // Optimize package if needed. Note that there can be no race between // concurrent jobs because PackageDexOptimizer.performDexOpt is synchronized. - boolean success = is_for_primary_dex - ? pm.performDexOpt(pkg, - /* checkProfiles */ true, - PackageManagerService.REASON_BACKGROUND_DEXOPT, - /* force */ false) - : pm.performDexOptSecondary(pkg, - PackageManagerService.REASON_BACKGROUND_DEXOPT, - /* force */ false); + boolean success; + if (is_for_primary_dex) { + int result = pm.performDexOptWithStatus(pkg, + /* checkProfiles */ true, + PackageManagerService.REASON_BACKGROUND_DEXOPT, + /* force */ false); + success = result != PackageDexOptimizer.DEX_OPT_FAILED; + if (result == PackageDexOptimizer.DEX_OPT_PERFORMED) { + updatedPackages.add(pkg); + } + } else { + success = pm.performDexOptSecondary(pkg, + PackageManagerService.REASON_BACKGROUND_DEXOPT, + /* force */ false); + } if (success) { // Dexopt succeeded, remove package from the list of failing ones. synchronized (failedPackageNames) { @@ -299,6 +314,7 @@ public class BackgroundDexOptService extends JobService { } } } + notifyPinService(updatedPackages); return OPTIMIZE_PROCESSED; } @@ -366,11 +382,14 @@ public class BackgroundDexOptService extends JobService { return false; } + boolean result; if (params.getJobId() == JOB_POST_BOOT_UPDATE) { - return runPostBootUpdate(params, pm, pkgs); + result = runPostBootUpdate(params, pm, pkgs); } else { - return runIdleOptimization(params, pm, pkgs); + result = runIdleOptimization(params, pm, pkgs); } + + return result; } @Override @@ -386,4 +405,12 @@ public class BackgroundDexOptService extends JobService { } return false; } + + private void notifyPinService(ArraySet<String> updatedPackages) { + PinnerService pinnerService = LocalServices.getService(PinnerService.class); + if (pinnerService != null) { + Log.i(TAG, "Pinning optimized code " + updatedPackages); + pinnerService.update(updatedPackages); + } + } } diff --git a/services/core/java/com/android/server/pm/PackageManagerService.java b/services/core/java/com/android/server/pm/PackageManagerService.java index b1068ae70d80..1b32a932ec50 100644 --- a/services/core/java/com/android/server/pm/PackageManagerService.java +++ b/services/core/java/com/android/server/pm/PackageManagerService.java @@ -20,7 +20,6 @@ import static android.Manifest.permission.DELETE_PACKAGES; import static android.Manifest.permission.INSTALL_PACKAGES; import static android.Manifest.permission.READ_EXTERNAL_STORAGE; import static android.Manifest.permission.REQUEST_DELETE_PACKAGES; -import static android.Manifest.permission.REQUEST_INSTALL_PACKAGES; import static android.Manifest.permission.WRITE_EXTERNAL_STORAGE; import static android.Manifest.permission.WRITE_MEDIA_STORAGE; import static android.content.pm.PackageManager.COMPONENT_ENABLED_STATE_DEFAULT; @@ -100,10 +99,10 @@ import static com.android.server.pm.PackageManagerServiceCompilerMapping.getDefa import static com.android.server.pm.PermissionsState.PERMISSION_OPERATION_FAILURE; import static com.android.server.pm.PermissionsState.PERMISSION_OPERATION_SUCCESS; import static com.android.server.pm.PermissionsState.PERMISSION_OPERATION_SUCCESS_GIDS_CHANGED; - import static dalvik.system.DexFile.getNonProfileGuidedCompilerFilter; import android.Manifest; +import android.annotation.IntDef; import android.annotation.NonNull; import android.annotation.Nullable; import android.app.ActivityManager; @@ -126,10 +125,8 @@ import android.content.ServiceConnection; import android.content.pm.ActivityInfo; import android.content.pm.ApplicationInfo; import android.content.pm.AppsQueryHelper; -import android.content.pm.ChangedPackages; -import android.content.pm.ComponentInfo; -import android.content.pm.InstantAppRequest; import android.content.pm.AuxiliaryResolveInfo; +import android.content.pm.ChangedPackages; import android.content.pm.FallbackCategoryProvider; import android.content.pm.FeatureInfo; import android.content.pm.IOnPermissionsChangeListener; @@ -142,6 +139,7 @@ import android.content.pm.IPackageManager; import android.content.pm.IPackageMoveObserver; import android.content.pm.IPackageStatsObserver; import android.content.pm.InstantAppInfo; +import android.content.pm.InstantAppRequest; import android.content.pm.InstantAppResolveInfo; import android.content.pm.InstrumentationInfo; import android.content.pm.IntentFilterVerificationInfo; @@ -303,6 +301,8 @@ import java.io.FileReader; import java.io.FilenameFilter; import java.io.IOException; import java.io.PrintWriter; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; import java.nio.charset.StandardCharsets; import java.security.DigestInputStream; import java.security.MessageDigest; @@ -441,6 +441,21 @@ public class PackageManagerService extends IPackageManager.Stub private static final int[] EMPTY_INT_ARRAY = new int[0]; + private static final int TYPE_UNKNOWN = 0; + private static final int TYPE_ACTIVITY = 1; + private static final int TYPE_RECEIVER = 2; + private static final int TYPE_SERVICE = 3; + private static final int TYPE_PROVIDER = 4; + @IntDef(prefix = { "TYPE_" }, value = { + TYPE_UNKNOWN, + TYPE_ACTIVITY, + TYPE_RECEIVER, + TYPE_SERVICE, + TYPE_PROVIDER, + }) + @Retention(RetentionPolicy.SOURCE) + public @interface ComponentType {} + /** * Timeout (in milliseconds) after which the watchdog should declare that * our handler thread is wedged. The usual default for such things is one @@ -3086,16 +3101,19 @@ public class PackageManagerService extends IPackageManager.Stub @Override public boolean isFirstBoot() { + // allow instant applications return mFirstBoot; } @Override public boolean isOnlyCoreApps() { + // allow instant applications return mOnlyCore; } @Override public boolean isUpgrade() { + // allow instant applications return mIsUpgrade; } @@ -3189,6 +3207,9 @@ public class PackageManagerService extends IPackageManager.Stub @Override public @Nullable ComponentName getInstantAppResolverComponent() { + if (getInstantAppPackageName(Binder.getCallingUid()) != null) { + return null; + } synchronized (mPackages) { final Pair<ComponentName, String> instantAppResolver = getInstantAppResolverLPr(); if (instantAppResolver == null) { @@ -3496,17 +3517,27 @@ public class PackageManagerService extends IPackageManager.Stub * system partition.</li> * </ol> */ - private boolean canAccessInstantApps(int callingUid) { - final boolean isSpecialProcess = - callingUid == Process.SYSTEM_UID - || callingUid == Process.SHELL_UID - || callingUid == 0; - final boolean allowMatchInstant = - isSpecialProcess - || mContext.checkCallingOrSelfPermission( - android.Manifest.permission.ACCESS_INSTANT_APPS) == PERMISSION_GRANTED; - return allowMatchInstant; + private boolean canViewInstantApps(int callingUid, int userId) { + if (callingUid == Process.SYSTEM_UID + || callingUid == Process.SHELL_UID + || callingUid == Process.ROOT_UID) { + return true; + } + if (mContext.checkCallingOrSelfPermission( + android.Manifest.permission.ACCESS_INSTANT_APPS) == PERMISSION_GRANTED) { + return true; + } + if (mContext.checkCallingOrSelfPermission( + android.Manifest.permission.VIEW_INSTANT_APPS) == PERMISSION_GRANTED) { + final ComponentName homeComponent = getDefaultHomeActivity(userId); + if (homeComponent != null + && isCallerSameApp(homeComponent.getPackageName(), callingUid)) { + return true; + } + } + return false; } + private PackageInfo generatePackageInfo(PackageSetting ps, int flags, int userId) { if (!sUserManager.exists(userId)) return null; if (ps == null) { @@ -3516,32 +3547,15 @@ public class PackageManagerService extends IPackageManager.Stub if (p == null) { return null; } - final int callingUid = Binder.getCallingUid(); + final int callingUid = Binder.getCallingUid(); // Filter out ephemeral app metadata: // * The system/shell/root can see metadata for any app // * An installed app can see metadata for 1) other installed apps // and 2) ephemeral apps that have explicitly interacted with it // * Ephemeral apps can only see their own data and exposed installed apps // * Holding a signature permission allows seeing instant apps - if (!canAccessInstantApps(callingUid)) { - final String instantAppPackageName = getInstantAppPackageName(callingUid); - if (instantAppPackageName != null) { - // ephemeral apps can only get information on themselves or - // installed apps that are exposed. - if (!instantAppPackageName.equals(p.packageName) - && (ps.getInstantApp(userId) || !p.visibleToInstantApps)) { - return null; - } - } else { - if (ps.getInstantApp(userId)) { - // only get access to the ephemeral app if we've been granted access - final int callingAppId = UserHandle.getAppId(callingUid); - if (!mInstantAppRegistry.isInstantAccessGranted( - userId, callingAppId, ps.appId)) { - return null; - } - } - } + if (filterAppAccessLPr(ps, callingUid, userId)) { + return null; } final PermissionsState permissionsState = ps.getPermissionsState(); @@ -3576,8 +3590,10 @@ public class PackageManagerService extends IPackageManager.Stub @Override public void checkPackageStartable(String packageName, int userId) { + if (getInstantAppPackageName(Binder.getCallingUid()) != null) { + throw new SecurityException("Instant applications don't have access to this method"); + } final boolean userKeyUnlocked = StorageManager.isUserKeyUnlocked(userId); - synchronized (mPackages) { final PackageSetting ps = mSettings.mPackages.get(packageName); if (ps == null) { @@ -3607,12 +3623,16 @@ public class PackageManagerService extends IPackageManager.Stub @Override public boolean isPackageAvailable(String packageName, int userId) { if (!sUserManager.exists(userId)) return false; - enforceCrossUserPermission(Binder.getCallingUid(), userId, - false /* requireFullPermission */, false /* checkShell */, "is package available"); + final int callingUid = Binder.getCallingUid(); + enforceCrossUserPermission(callingUid, userId, + false /*requireFullPermission*/, false /*checkShell*/, "is package available"); synchronized (mPackages) { PackageParser.Package p = mPackages.get(packageName); if (p != null) { final PackageSetting ps = (PackageSetting) p.mExtras; + if (filterAppAccessLPr(ps, callingUid, userId)) { + return false; + } if (ps != null) { final PackageUserState state = ps.readUserState(userId); if (state != null) { @@ -3695,6 +3715,47 @@ public class PackageManagerService extends IPackageManager.Stub return null; } + private boolean isComponentVisibleToInstantApp(@Nullable ComponentName component) { + if (isComponentVisibleToInstantApp(component, TYPE_ACTIVITY)) { + return true; + } + if (isComponentVisibleToInstantApp(component, TYPE_SERVICE)) { + return true; + } + if (isComponentVisibleToInstantApp(component, TYPE_PROVIDER)) { + return true; + } + return false; + } + + private boolean isComponentVisibleToInstantApp( + @Nullable ComponentName component, @ComponentType int type) { + if (type == TYPE_ACTIVITY) { + final PackageParser.Activity activity = mActivities.mActivities.get(component); + return activity != null + ? (activity.info.flags & ActivityInfo.FLAG_VISIBLE_TO_INSTANT_APP) != 0 + : false; + } else if (type == TYPE_RECEIVER) { + final PackageParser.Activity activity = mReceivers.mActivities.get(component); + return activity != null + ? (activity.info.flags & ActivityInfo.FLAG_VISIBLE_TO_INSTANT_APP) != 0 + : false; + } else if (type == TYPE_SERVICE) { + final PackageParser.Service service = mServices.mServices.get(component); + return service != null + ? (service.info.flags & ServiceInfo.FLAG_VISIBLE_TO_INSTANT_APP) != 0 + : false; + } else if (type == TYPE_PROVIDER) { + final PackageParser.Provider provider = mProviders.mProviders.get(component); + return provider != null + ? (provider.info.flags & ProviderInfo.FLAG_VISIBLE_TO_INSTANT_APP) != 0 + : false; + } else if (type == TYPE_UNKNOWN) { + return isComponentVisibleToInstantApp(component); + } + return false; + } + /** * Returns whether or not access to the application should be filtered. * <p> @@ -3703,29 +3764,36 @@ public class PackageManagerService extends IPackageManager.Stub * * @see #canAccessInstantApps(int) */ - private boolean filterAppAccessLPr(@NonNull PackageSetting ps, int callingUid, - @Nullable ComponentName component, boolean componentVisibleToInstantApp, int userId) { + private boolean filterAppAccessLPr(@Nullable PackageSetting ps, int callingUid, + @Nullable ComponentName component, @ComponentType int componentType, int userId) { // if we're in an isolated process, get the real calling UID if (Process.isIsolated(callingUid)) { callingUid = mIsolatedOwners.get(callingUid); } + final String instantAppPkgName = getInstantAppPackageName(callingUid); + final boolean callerIsInstantApp = instantAppPkgName != null; + if (ps == null) { + if (callerIsInstantApp) { + // pretend the application exists, but, needs to be filtered + return true; + } + return false; + } // if the target and caller are the same application, don't filter if (isCallerSameApp(ps.name, callingUid)) { return false; } - final String instantAppPkgName = getInstantAppPackageName(callingUid); - final boolean callerIsInstantApp = instantAppPkgName != null; if (callerIsInstantApp) { // request for a specific component; if it hasn't been explicitly exposed, filter if (component != null) { - return !componentVisibleToInstantApp; + return !isComponentVisibleToInstantApp(component, componentType); } // request for application; if no components have been explicitly exposed, filter - return !ps.pkg.visibleToInstantApps; + return ps.getInstantApp(userId) || !ps.pkg.visibleToInstantApps; } if (ps.getInstantApp(userId)) { // caller can see all components of all instant applications, don't filter - if (canAccessInstantApps(callingUid)) { + if (canViewInstantApps(callingUid, userId)) { return false; } // request for a specific instant application component, filter @@ -3742,8 +3810,8 @@ public class PackageManagerService extends IPackageManager.Stub /** * @see #filterAppAccessLPr(PackageSetting, int, ComponentName, boolean, int) */ - private boolean filterAppAccessLPr(@NonNull PackageSetting ps, int callingUid, int userId) { - return filterAppAccessLPr(ps, callingUid, null, false, userId); + private boolean filterAppAccessLPr(@Nullable PackageSetting ps, int callingUid, int userId) { + return filterAppAccessLPr(ps, callingUid, null, TYPE_UNKNOWN, userId); } private boolean filterSharedLibPackageLPr(@Nullable PackageSetting ps, int uid, int userId, @@ -3797,6 +3865,9 @@ public class PackageManagerService extends IPackageManager.Stub @Override public String[] currentToCanonicalPackageNames(String[] names) { + if (getInstantAppPackageName(Binder.getCallingUid()) != null) { + return names; + } String[] out = new String[names.length]; // reader synchronized (mPackages) { @@ -3810,6 +3881,9 @@ public class PackageManagerService extends IPackageManager.Stub @Override public String[] canonicalToCurrentPackageNames(String[] names) { + if (getInstantAppPackageName(Binder.getCallingUid()) != null) { + return names; + } String[] out = new String[names.length]; // reader synchronized (mPackages) { @@ -3824,19 +3898,25 @@ public class PackageManagerService extends IPackageManager.Stub @Override public int getPackageUid(String packageName, int flags, int userId) { if (!sUserManager.exists(userId)) return -1; + final int callingUid = Binder.getCallingUid(); flags = updateFlagsForPackage(flags, userId, packageName); - enforceCrossUserPermission(Binder.getCallingUid(), userId, - false /* requireFullPermission */, false /* checkShell */, "get package uid"); + enforceCrossUserPermission(callingUid, userId, + false /*requireFullPermission*/, false /*checkShell*/, "getPackageUid"); // reader synchronized (mPackages) { final PackageParser.Package p = mPackages.get(packageName); if (p != null && p.isMatch(flags)) { + PackageSetting ps = (PackageSetting) p.mExtras; + if (filterAppAccessLPr(ps, callingUid, userId)) { + return -1; + } return UserHandle.getUid(userId, p.applicationInfo.uid); } if ((flags & MATCH_KNOWN_PACKAGES) != 0) { final PackageSetting ps = mSettings.mPackages.get(packageName); - if (ps != null && ps.isMatch(flags)) { + if (ps != null && ps.isMatch(flags) + && !filterAppAccessLPr(ps, callingUid, userId)) { return UserHandle.getUid(userId, ps.appId); } } @@ -3848,23 +3928,27 @@ public class PackageManagerService extends IPackageManager.Stub @Override public int[] getPackageGids(String packageName, int flags, int userId) { if (!sUserManager.exists(userId)) return null; + final int callingUid = Binder.getCallingUid(); flags = updateFlagsForPackage(flags, userId, packageName); - enforceCrossUserPermission(Binder.getCallingUid(), userId, - false /* requireFullPermission */, false /* checkShell */, - "getPackageGids"); + enforceCrossUserPermission(callingUid, userId, + false /*requireFullPermission*/, false /*checkShell*/, "getPackageGids"); // reader synchronized (mPackages) { final PackageParser.Package p = mPackages.get(packageName); if (p != null && p.isMatch(flags)) { PackageSetting ps = (PackageSetting) p.mExtras; + if (filterAppAccessLPr(ps, callingUid, userId)) { + return null; + } // TODO: Shouldn't this be checking for package installed state for userId and // return null? return ps.getPermissionsState().computeGids(userId); } if ((flags & MATCH_KNOWN_PACKAGES) != 0) { final PackageSetting ps = mSettings.mPackages.get(packageName); - if (ps != null && ps.isMatch(flags)) { + if (ps != null && ps.isMatch(flags) + && !filterAppAccessLPr(ps, callingUid, userId)) { return ps.getPermissionsState().computeGids(userId); } } @@ -3887,6 +3971,9 @@ public class PackageManagerService extends IPackageManager.Stub @Override public PermissionInfo getPermissionInfo(String name, int flags) { + if (getInstantAppPackageName(Binder.getCallingUid()) != null) { + return null; + } // reader synchronized (mPackages) { final BasePermission p = mSettings.mPermissions.get(name); @@ -3900,6 +3987,9 @@ public class PackageManagerService extends IPackageManager.Stub @Override public @Nullable ParceledListSlice<PermissionInfo> queryPermissionsByGroup(String group, int flags) { + if (getInstantAppPackageName(Binder.getCallingUid()) != null) { + return null; + } // reader synchronized (mPackages) { if (group != null && !mPermissionGroups.containsKey(group)) { @@ -3925,6 +4015,9 @@ public class PackageManagerService extends IPackageManager.Stub @Override public PermissionGroupInfo getPermissionGroupInfo(String name, int flags) { + if (getInstantAppPackageName(Binder.getCallingUid()) != null) { + return null; + } // reader synchronized (mPackages) { return PackageParser.generatePermissionGroupInfo( @@ -3934,6 +4027,9 @@ public class PackageManagerService extends IPackageManager.Stub @Override public @NonNull ParceledListSlice<PermissionGroupInfo> getAllPermissionGroups(int flags) { + if (getInstantAppPackageName(Binder.getCallingUid()) != null) { + return ParceledListSlice.emptyList(); + } // reader synchronized (mPackages) { final int N = mPermissionGroups.size(); @@ -4321,11 +4417,12 @@ public class PackageManagerService extends IPackageManager.Stub flags |= PackageManager.MATCH_VISIBLE_TO_INSTANT_APP_ONLY; flags |= PackageManager.MATCH_INSTANT; } else { + final boolean wantMatchInstant = (flags & PackageManager.MATCH_INSTANT) != 0; final boolean allowMatchInstant = (wantInstantApps && Intent.ACTION_VIEW.equals(intent.getAction()) && hasWebURI(intent)) - || canAccessInstantApps(callingUid); + || (wantMatchInstant && canViewInstantApps(callingUid, userId)); flags &= ~(PackageManager.MATCH_VISIBLE_TO_INSTANT_APP_ONLY | PackageManager.MATCH_EXPLICITLY_VISIBLE_ONLY); if (!allowMatchInstant) { @@ -4367,9 +4464,7 @@ 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)) { + if (filterAppAccessLPr(ps, callingUid, component, TYPE_ACTIVITY, userId)) { return null; } return generateActivityInfo(a, flags, ps.readUserState(userId), userId); @@ -4390,10 +4485,19 @@ public class PackageManagerService extends IPackageManager.Stub // The resolver supports EVERYTHING! return true; } + final int callingUid = Binder.getCallingUid(); + final int callingUserId = UserHandle.getUserId(callingUid); PackageParser.Activity a = mActivities.mActivities.get(component); if (a == null) { return false; } + PackageSetting ps = mSettings.mPackages.get(component.getPackageName()); + if (ps == null) { + return false; + } + if (filterAppAccessLPr(ps, callingUid, component, TYPE_ACTIVITY, callingUserId)) { + return false; + } for (int i=0; i<a.intents.size(); i++) { if (a.intents.get(i).match(intent.getAction(), resolvedType, intent.getScheme(), intent.getData(), intent.getCategories(), TAG) >= 0) { @@ -4407,8 +4511,9 @@ public class PackageManagerService extends IPackageManager.Stub @Override public ActivityInfo getReceiverInfo(ComponentName component, int flags, int userId) { if (!sUserManager.exists(userId)) return null; + final int callingUid = Binder.getCallingUid(); flags = updateFlagsForComponent(flags, userId, component); - enforceCrossUserPermission(Binder.getCallingUid(), userId, + enforceCrossUserPermission(callingUid, userId, false /* requireFullPermission */, false /* checkShell */, "get receiver info"); synchronized (mPackages) { PackageParser.Activity a = mReceivers.mActivities.get(component); @@ -4417,6 +4522,9 @@ 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; + if (filterAppAccessLPr(ps, callingUid, component, TYPE_RECEIVER, userId)) { + return null; + } return generateActivityInfo(a, flags, ps.readUserState(userId), userId); } } @@ -4428,6 +4536,9 @@ public class PackageManagerService extends IPackageManager.Stub int flags, int userId) { if (!sUserManager.exists(userId)) return null; Preconditions.checkArgumentNonnegative(userId, "userId must be >= 0"); + if (getInstantAppPackageName(Binder.getCallingUid()) != null) { + return null; + } flags = updateFlagsForPackage(flags, userId, null); @@ -4547,9 +4658,7 @@ 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)) { + if (filterAppAccessLPr(ps, callingUid, component, TYPE_SERVICE, userId)) { return null; } ServiceInfo si = PackageParser.generateServiceInfo(s, flags, @@ -4577,9 +4686,7 @@ 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)) { + if (filterAppAccessLPr(ps, callingUid, component, TYPE_PROVIDER, userId)) { return null; } ProviderInfo pi = PackageParser.generateProviderInfo(p, flags, @@ -4595,6 +4702,7 @@ public class PackageManagerService extends IPackageManager.Stub @Override public String[] getSystemSharedLibraryNames() { + // allow instant applications synchronized (mPackages) { Set<String> libs = null; final int libCount = mSharedLibraries.size(); @@ -4638,6 +4746,7 @@ public class PackageManagerService extends IPackageManager.Stub @Override public @NonNull String getServicesSystemSharedLibraryPackageName() { + // allow instant applications synchronized (mPackages) { return mServicesSystemSharedLibraryPackageName; } @@ -4645,6 +4754,7 @@ public class PackageManagerService extends IPackageManager.Stub @Override public @NonNull String getSharedSystemSharedLibraryPackageName() { + // allow instant applications synchronized (mPackages) { return mSharedSystemSharedLibraryPackageName; } @@ -4675,6 +4785,9 @@ public class PackageManagerService extends IPackageManager.Stub @Override public ChangedPackages getChangedPackages(int sequenceNumber, int userId) { + if (getInstantAppPackageName(Binder.getCallingUid()) != null) { + return null; + } synchronized (mPackages) { if (sequenceNumber >= mChangedPackagesSequenceNumber) { return null; @@ -4698,6 +4811,7 @@ public class PackageManagerService extends IPackageManager.Stub @Override public @NonNull ParceledListSlice<FeatureInfo> getSystemAvailableFeatures() { + // allow instant applications ArrayList<FeatureInfo> res; synchronized (mAvailableFeatures) { res = new ArrayList<>(mAvailableFeatures.size() + 1); @@ -4713,6 +4827,7 @@ public class PackageManagerService extends IPackageManager.Stub @Override public boolean hasSystemFeature(String name, int version) { + // allow instant applications synchronized (mAvailableFeatures) { final FeatureInfo feat = mAvailableFeatures.get(name); if (feat == null) { @@ -4728,11 +4843,15 @@ public class PackageManagerService extends IPackageManager.Stub if (!sUserManager.exists(userId)) { return PackageManager.PERMISSION_DENIED; } + final int callingUid = Binder.getCallingUid(); synchronized (mPackages) { final PackageParser.Package p = mPackages.get(pkgName); if (p != null && p.mExtras != null) { final PackageSetting ps = (PackageSetting) p.mExtras; + if (filterAppAccessLPr(ps, callingUid, userId)) { + return PackageManager.PERMISSION_DENIED; + } final PermissionsState permissionsState = ps.getPermissionsState(); if (permissionsState.hasPermission(permName, userId)) { return PackageManager.PERMISSION_GRANTED; @@ -4750,8 +4869,10 @@ public class PackageManagerService extends IPackageManager.Stub @Override public int checkUidPermission(String permName, int uid) { + final int callingUid = Binder.getCallingUid(); + final int callingUserId = UserHandle.getUserId(callingUid); + final boolean isCallerInstantApp = getInstantAppPackageName(callingUid) != null; final int userId = UserHandle.getUserId(uid); - if (!sUserManager.exists(userId)) { return PackageManager.PERMISSION_DENIED; } @@ -4759,8 +4880,18 @@ public class PackageManagerService extends IPackageManager.Stub synchronized (mPackages) { Object obj = mSettings.getUserIdLPr(UserHandle.getAppId(uid)); if (obj != null) { - final SettingBase ps = (SettingBase) obj; - final PermissionsState permissionsState = ps.getPermissionsState(); + if (obj instanceof SharedUserSetting) { + if (isCallerInstantApp) { + return PackageManager.PERMISSION_DENIED; + } + } else if (obj instanceof PackageSetting) { + final PackageSetting ps = (PackageSetting) obj; + if (filterAppAccessLPr(ps, callingUid, callingUserId)) { + return PackageManager.PERMISSION_DENIED; + } + } + final SettingBase settingBase = (SettingBase) obj; + final PermissionsState permissionsState = settingBase.getPermissionsState(); if (permissionsState.hasPermission(permName, userId)) { return PackageManager.PERMISSION_GRANTED; } @@ -4799,6 +4930,17 @@ public class PackageManagerService extends IPackageManager.Stub return false; } + final int callingUid = Binder.getCallingUid(); + if (getInstantAppPackageName(callingUid) != null) { + if (!isCallerSameApp(packageName, callingUid)) { + return false; + } + } else { + if (isInstantApp(packageName, userId)) { + return false; + } + } + final long identity = Binder.clearCallingIdentity(); try { final int flags = getPermissionFlags(permission, packageName, userId); @@ -4810,6 +4952,9 @@ public class PackageManagerService extends IPackageManager.Stub @Override public String getPermissionControllerPackageName() { + if (getInstantAppPackageName(Binder.getCallingUid()) != null) { + throw new SecurityException("Instant applications don't have access to this method"); + } synchronized (mPackages) { return mRequiredInstallerPackage; } @@ -4944,6 +5089,9 @@ public class PackageManagerService extends IPackageManager.Stub } boolean addPermissionLocked(PermissionInfo info, boolean async) { + if (getInstantAppPackageName(Binder.getCallingUid()) != null) { + throw new SecurityException("Instant apps can't add permissions"); + } if (info.labelRes == 0 && info.nonLocalizedLabel == null) { throw new SecurityException("Label must be specified in permission"); } @@ -5003,6 +5151,9 @@ public class PackageManagerService extends IPackageManager.Stub @Override public void removePermission(String name) { + if (getInstantAppPackageName(Binder.getCallingUid()) != null) { + throw new SecurityException("Instant applications don't have access to this method"); + } synchronized (mPackages) { checkPermissionTreeLP(name); BasePermission bp = mSettings.mPermissions.get(name); @@ -5018,8 +5169,8 @@ public class PackageManagerService extends IPackageManager.Stub } } - private static void enforceDeclaredAsUsedAndRuntimeOrDevelopmentPermission(PackageParser.Package pkg, - BasePermission bp) { + private static void enforceDeclaredAsUsedAndRuntimeOrDevelopmentPermission( + PackageParser.Package pkg, BasePermission bp) { int index = pkg.requestedPermissions.indexOf(bp.name); if (index == -1) { throw new SecurityException("Package " + pkg.packageName @@ -5536,6 +5687,9 @@ public class PackageManagerService extends IPackageManager.Stub @Override public void removeOnPermissionsChangeListener(IOnPermissionsChangeListener listener) { + if (getInstantAppPackageName(Binder.getCallingUid()) != null) { + throw new SecurityException("Instant applications don't have access to this method"); + } synchronized (mPackages) { mOnPermissionChangeListeners.removeListenerLocked(listener); } @@ -5543,6 +5697,7 @@ public class PackageManagerService extends IPackageManager.Stub @Override public boolean isProtectedBroadcast(String actionName) { + // allow instant applications synchronized (mPackages) { if (mProtectedBroadcasts.contains(actionName)) { return true; @@ -5568,12 +5723,23 @@ public class PackageManagerService extends IPackageManager.Stub || p2 == null || p2.mExtras == null) { return PackageManager.SIGNATURE_UNKNOWN_PACKAGE; } + final int callingUid = Binder.getCallingUid(); + final int callingUserId = UserHandle.getUserId(callingUid); + final PackageSetting ps1 = (PackageSetting) p1.mExtras; + final PackageSetting ps2 = (PackageSetting) p2.mExtras; + if (filterAppAccessLPr(ps1, callingUid, callingUserId) + || filterAppAccessLPr(ps2, callingUid, callingUserId)) { + return PackageManager.SIGNATURE_UNKNOWN_PACKAGE; + } return compareSignatures(p1.mSignatures, p2.mSignatures); } } @Override public int checkUidSignatures(int uid1, int uid2) { + final int callingUid = Binder.getCallingUid(); + final int callingUserId = UserHandle.getUserId(callingUid); + final boolean isCallerInstantApp = getInstantAppPackageName(callingUid) != null; // Map to base uids. uid1 = UserHandle.getAppId(uid1); uid2 = UserHandle.getAppId(uid2); @@ -5584,9 +5750,16 @@ public class PackageManagerService extends IPackageManager.Stub Object obj = mSettings.getUserIdLPr(uid1); if (obj != null) { if (obj instanceof SharedUserSetting) { + if (isCallerInstantApp) { + return PackageManager.SIGNATURE_UNKNOWN_PACKAGE; + } s1 = ((SharedUserSetting)obj).signatures.mSignatures; } else if (obj instanceof PackageSetting) { - s1 = ((PackageSetting)obj).signatures.mSignatures; + final PackageSetting ps = (PackageSetting) obj; + if (filterAppAccessLPr(ps, callingUid, callingUserId)) { + return PackageManager.SIGNATURE_UNKNOWN_PACKAGE; + } + s1 = ps.signatures.mSignatures; } else { return PackageManager.SIGNATURE_UNKNOWN_PACKAGE; } @@ -5596,9 +5769,16 @@ public class PackageManagerService extends IPackageManager.Stub obj = mSettings.getUserIdLPr(uid2); if (obj != null) { if (obj instanceof SharedUserSetting) { + if (isCallerInstantApp) { + return PackageManager.SIGNATURE_UNKNOWN_PACKAGE; + } s2 = ((SharedUserSetting)obj).signatures.mSignatures; } else if (obj instanceof PackageSetting) { - s2 = ((PackageSetting)obj).signatures.mSignatures; + final PackageSetting ps = (PackageSetting) obj; + if (filterAppAccessLPr(ps, callingUid, callingUserId)) { + return PackageManager.SIGNATURE_UNKNOWN_PACKAGE; + } + s2 = ps.signatures.mSignatures; } else { return PackageManager.SIGNATURE_UNKNOWN_PACKAGE; } @@ -5764,19 +5944,53 @@ public class PackageManagerService extends IPackageManager.Stub @Override public List<String> getAllPackages() { + final int callingUid = Binder.getCallingUid(); + final int callingUserId = UserHandle.getUserId(callingUid); synchronized (mPackages) { - return new ArrayList<String>(mPackages.keySet()); + if (canViewInstantApps(callingUid, callingUserId)) { + return new ArrayList<String>(mPackages.keySet()); + } + final String instantAppPkgName = getInstantAppPackageName(callingUid); + final List<String> result = new ArrayList<>(); + if (instantAppPkgName != null) { + // caller is an instant application; filter unexposed applications + for (PackageParser.Package pkg : mPackages.values()) { + if (!pkg.visibleToInstantApps) { + continue; + } + result.add(pkg.packageName); + } + } else { + // caller is a normal application; filter instant applications + for (PackageParser.Package pkg : mPackages.values()) { + final PackageSetting ps = + pkg.mExtras != null ? (PackageSetting) pkg.mExtras : null; + if (ps != null + && ps.getInstantApp(callingUserId) + && !mInstantAppRegistry.isInstantAccessGranted( + callingUserId, UserHandle.getAppId(callingUid), ps.appId)) { + continue; + } + result.add(pkg.packageName); + } + } + return result; } } @Override public String[] getPackagesForUid(int uid) { + final int callingUid = Binder.getCallingUid(); + final boolean isCallerInstantApp = getInstantAppPackageName(callingUid) != null; final int userId = UserHandle.getUserId(uid); uid = UserHandle.getAppId(uid); // reader synchronized (mPackages) { Object obj = mSettings.getUserIdLPr(uid); if (obj instanceof SharedUserSetting) { + if (isCallerInstantApp) { + return null; + } final SharedUserSetting sus = (SharedUserSetting) obj; final int N = sus.packages.size(); String[] res = new String[N]; @@ -5793,7 +6007,7 @@ public class PackageManagerService extends IPackageManager.Stub return res; } else if (obj instanceof PackageSetting) { final PackageSetting ps = (PackageSetting) obj; - if (ps.getInstalled(userId)) { + if (ps.getInstalled(userId) && !filterAppAccessLPr(ps, callingUid, userId)) { return new String[]{ps.name}; } } @@ -5803,7 +6017,10 @@ public class PackageManagerService extends IPackageManager.Stub @Override public String getNameForUid(int uid) { - // reader + final int callingUid = Binder.getCallingUid(); + if (getInstantAppPackageName(callingUid) != null) { + return null; + } synchronized (mPackages) { Object obj = mSettings.getUserIdLPr(UserHandle.getAppId(uid)); if (obj instanceof SharedUserSetting) { @@ -5811,6 +6028,9 @@ public class PackageManagerService extends IPackageManager.Stub return sus.name + ":" + sus.userId; } else if (obj instanceof PackageSetting) { final PackageSetting ps = (PackageSetting) obj; + if (filterAppAccessLPr(ps, callingUid, UserHandle.getUserId(callingUid))) { + return null; + } return ps.name; } } @@ -5819,7 +6039,10 @@ public class PackageManagerService extends IPackageManager.Stub @Override public int getUidForSharedUser(String sharedUserName) { - if(sharedUserName == null) { + if (getInstantAppPackageName(Binder.getCallingUid()) != null) { + return -1; + } + if (sharedUserName == null) { return -1; } // reader @@ -5839,6 +6062,9 @@ public class PackageManagerService extends IPackageManager.Stub @Override public int getFlagsForUid(int uid) { + if (getInstantAppPackageName(Binder.getCallingUid()) != null) { + return 0; + } synchronized (mPackages) { Object obj = mSettings.getUserIdLPr(UserHandle.getAppId(uid)); if (obj instanceof SharedUserSetting) { @@ -5854,6 +6080,9 @@ public class PackageManagerService extends IPackageManager.Stub @Override public int getPrivateFlagsForUid(int uid) { + if (getInstantAppPackageName(Binder.getCallingUid()) != null) { + return 0; + } synchronized (mPackages) { Object obj = mSettings.getUserIdLPr(UserHandle.getAppId(uid)); if (obj instanceof SharedUserSetting) { @@ -5869,6 +6098,9 @@ public class PackageManagerService extends IPackageManager.Stub @Override public boolean isUidPrivileged(int uid) { + if (getInstantAppPackageName(Binder.getCallingUid()) != null) { + return false; + } uid = UserHandle.getAppId(uid); // reader synchronized (mPackages) { @@ -5891,6 +6123,9 @@ public class PackageManagerService extends IPackageManager.Stub @Override public String[] getAppOpPermissionPackages(String permissionName) { + if (getInstantAppPackageName(Binder.getCallingUid()) != null) { + return null; + } synchronized (mPackages) { ArraySet<String> pkgs = mAppOpPermissionPackages.get(permissionName); if (pkgs == null) { @@ -5956,6 +6191,9 @@ public class PackageManagerService extends IPackageManager.Stub @Override public void setLastChosenActivity(Intent intent, String resolvedType, int flags, IntentFilter filter, int match, ComponentName activity) { + if (getInstantAppPackageName(Binder.getCallingUid()) != null) { + return; + } final int userId = UserHandle.getCallingUserId(); if (DEBUG_PREFERRED) { Log.v(TAG, "setLastChosenActivity intent=" + intent @@ -5979,6 +6217,9 @@ public class PackageManagerService extends IPackageManager.Stub @Override public ResolveInfo getLastChosenActivity(Intent intent, String resolvedType, int flags) { + if (getInstantAppPackageName(Binder.getCallingUid()) != null) { + return null; + } final int userId = UserHandle.getCallingUserId(); if (DEBUG_PREFERRED) Log.v(TAG, "Querying last chosen activity for " + intent); final List<ResolveInfo> query = queryIntentActivitiesInternal(intent, resolvedType, flags, @@ -6440,12 +6681,12 @@ public class PackageManagerService extends IPackageManager.Stub * instant, returns {@code null}. */ private String getInstantAppPackageName(int callingUid) { - // If the caller is an isolated app use the owner's uid for the lookup. - if (Process.isIsolated(callingUid)) { - callingUid = mIsolatedOwners.get(callingUid); - } - final int appId = UserHandle.getAppId(callingUid); synchronized (mPackages) { + // If the caller is an isolated app use the owner's uid for the lookup. + if (Process.isIsolated(callingUid)) { + callingUid = mIsolatedOwners.get(callingUid); + } + final int appId = UserHandle.getAppId(callingUid); final Object obj = mSettings.getUserIdLPr(appId); if (obj instanceof PackageSetting) { final PackageSetting ps = (PackageSetting) obj; @@ -7360,6 +7601,7 @@ public class PackageManagerService extends IPackageManager.Stub String resolvedType, int flags, int userId) { if (!sUserManager.exists(userId)) return Collections.emptyList(); final int callingUid = Binder.getCallingUid(); + final String instantAppPkgName = getInstantAppPackageName(callingUid); flags = updateFlagsForResolve(flags, userId, intent, callingUid, false /*includeInstantApps*/); ComponentName comp = intent.getComponent(); @@ -7370,26 +7612,61 @@ public class PackageManagerService extends IPackageManager.Stub } } if (comp != null) { - List<ResolveInfo> list = new ArrayList<ResolveInfo>(1); - ActivityInfo ai = getReceiverInfo(comp, flags, userId); + final List<ResolveInfo> list = new ArrayList<ResolveInfo>(1); + final ActivityInfo ai = getReceiverInfo(comp, flags, userId); if (ai != null) { - ResolveInfo ri = new ResolveInfo(); - ri.activityInfo = ai; - list.add(ri); + // When specifying an explicit component, we prevent the activity from being + // used when either 1) the calling package is normal and the activity is within + // an instant application or 2) the calling package is ephemeral and the + // activity is not visible to instant applications. + final boolean matchInstantApp = + (flags & PackageManager.MATCH_INSTANT) != 0; + final boolean matchVisibleToInstantAppOnly = + (flags & PackageManager.MATCH_VISIBLE_TO_INSTANT_APP_ONLY) != 0; + final boolean matchExplicitlyVisibleOnly = + (flags & PackageManager.MATCH_EXPLICITLY_VISIBLE_ONLY) != 0; + final boolean isCallerInstantApp = + instantAppPkgName != null; + final boolean isTargetSameInstantApp = + comp.getPackageName().equals(instantAppPkgName); + final boolean isTargetInstantApp = + (ai.applicationInfo.privateFlags + & ApplicationInfo.PRIVATE_FLAG_INSTANT) != 0; + final boolean isTargetVisibleToInstantApp = + (ai.flags & ActivityInfo.FLAG_VISIBLE_TO_INSTANT_APP) != 0; + final boolean isTargetExplicitlyVisibleToInstantApp = + isTargetVisibleToInstantApp + && (ai.flags & ActivityInfo.FLAG_IMPLICITLY_VISIBLE_TO_INSTANT_APP) == 0; + final boolean isTargetHiddenFromInstantApp = + !isTargetVisibleToInstantApp + || (matchExplicitlyVisibleOnly && !isTargetExplicitlyVisibleToInstantApp); + final boolean blockResolution = + !isTargetSameInstantApp + && ((!matchInstantApp && !isCallerInstantApp && isTargetInstantApp) + || (matchVisibleToInstantAppOnly && isCallerInstantApp + && isTargetHiddenFromInstantApp)); + if (!blockResolution) { + ResolveInfo ri = new ResolveInfo(); + ri.activityInfo = ai; + list.add(ri); + } } - return list; + return applyPostResolutionFilter(list, instantAppPkgName); } // reader synchronized (mPackages) { String pkgName = intent.getPackage(); if (pkgName == null) { - return mReceivers.queryIntent(intent, resolvedType, flags, userId); + final List<ResolveInfo> result = + mReceivers.queryIntent(intent, resolvedType, flags, userId); + return applyPostResolutionFilter(result, instantAppPkgName); } final PackageParser.Package pkg = mPackages.get(pkgName); if (pkg != null) { - return mReceivers.queryIntentForPackage(intent, resolvedType, flags, pkg.receivers, - userId); + final List<ResolveInfo> result = mReceivers.queryIntentForPackage( + intent, resolvedType, flags, pkg.receivers, userId); + return applyPostResolutionFilter(result, instantAppPkgName); } return Collections.emptyList(); } @@ -7662,6 +7939,9 @@ public class PackageManagerService extends IPackageManager.Stub @Override public ParceledListSlice<PackageInfo> getInstalledPackages(int flags, int userId) { + if (getInstantAppPackageName(Binder.getCallingUid()) != null) { + return ParceledListSlice.emptyList(); + } if (!sUserManager.exists(userId)) return ParceledListSlice.emptyList(); flags = updateFlagsForPackage(flags, userId, null); final boolean listUninstalled = (flags & MATCH_KNOWN_PACKAGES) != 0; @@ -7776,6 +8056,9 @@ public class PackageManagerService extends IPackageManager.Stub @Override public ParceledListSlice<ApplicationInfo> getInstalledApplications(int flags, int userId) { + if (getInstantAppPackageName(Binder.getCallingUid()) != null) { + return ParceledListSlice.emptyList(); + } if (!sUserManager.exists(userId)) return ParceledListSlice.emptyList(); flags = updateFlagsForApplication(flags, userId, null); final boolean listUninstalled = (flags & MATCH_KNOWN_PACKAGES) != 0; @@ -7839,7 +8122,6 @@ public class PackageManagerService extends IPackageManager.Stub if (HIDE_EPHEMERAL_APIS || isEphemeralDisabled()) { return null; } - mContext.enforceCallingOrSelfPermission(Manifest.permission.ACCESS_INSTANT_APPS, "getEphemeralApplications"); enforceCrossUserPermission(Binder.getCallingUid(), userId, @@ -7863,9 +8145,9 @@ public class PackageManagerService extends IPackageManager.Stub if (HIDE_EPHEMERAL_APIS || isEphemeralDisabled()) { return false; } - int uid = Binder.getCallingUid(); - if (Process.isIsolated(uid)) { - uid = mIsolatedOwners.get(uid); + int callingUid = Binder.getCallingUid(); + if (Process.isIsolated(callingUid)) { + callingUid = mIsolatedOwners.get(callingUid); } synchronized (mPackages) { @@ -7873,12 +8155,10 @@ public class PackageManagerService extends IPackageManager.Stub PackageParser.Package pkg = mPackages.get(packageName); final boolean returnAllowed = ps != null - && (isCallerSameApp(packageName, uid) - || mContext.checkCallingOrSelfPermission( - android.Manifest.permission.ACCESS_INSTANT_APPS) - == PERMISSION_GRANTED + && (isCallerSameApp(packageName, callingUid) + || canViewInstantApps(callingUid, userId) || mInstantAppRegistry.isInstantAccessGranted( - userId, UserHandle.getAppId(uid), ps.appId)); + userId, UserHandle.getAppId(callingUid), ps.appId)); if (returnAllowed) { return ps.getInstantApp(userId); } @@ -7949,6 +8229,9 @@ public class PackageManagerService extends IPackageManager.Stub @Override public @NonNull ParceledListSlice<ApplicationInfo> getPersistentApplications(int flags) { + if (getInstantAppPackageName(Binder.getCallingUid()) != null) { + return ParceledListSlice.emptyList(); + } return new ParceledListSlice<>(getPersistentApplicationsInternal(flags)); } @@ -8032,6 +8315,9 @@ public class PackageManagerService extends IPackageManager.Stub */ @Deprecated public void querySyncProviders(List<String> outNames, List<ProviderInfo> outInfo) { + if (getInstantAppPackageName(Binder.getCallingUid()) != null) { + return; + } // reader synchronized (mPackages) { final Iterator<Map.Entry<String, PackageParser.Provider>> i = mProvidersByAuthority @@ -8059,11 +8345,11 @@ public class PackageManagerService extends IPackageManager.Stub @Override public @NonNull ParceledListSlice<ProviderInfo> queryContentProviders(String processName, int uid, int flags, String metaDataKey) { + final int callingUid = Binder.getCallingUid(); final int userId = processName != null ? UserHandle.getUserId(uid) : UserHandle.getCallingUserId(); if (!sUserManager.exists(userId)) return ParceledListSlice.emptyList(); flags = updateFlagsForComponent(flags, userId, processName); - ArrayList<ProviderInfo> finalList = null; // reader synchronized (mPackages) { @@ -8083,7 +8369,11 @@ public class PackageManagerService extends IPackageManager.Stub && (p.metaData == null || !p.metaData.containsKey(metaDataKey))) { continue; } - + final ComponentName component = + new ComponentName(p.info.packageName, p.info.name); + if (filterAppAccessLPr(ps, callingUid, component, TYPE_PROVIDER, userId)) { + continue; + } if (finalList == null) { finalList = new ArrayList<ProviderInfo>(3); } @@ -8105,10 +8395,17 @@ public class PackageManagerService extends IPackageManager.Stub } @Override - public InstrumentationInfo getInstrumentationInfo(ComponentName name, int flags) { + public InstrumentationInfo getInstrumentationInfo(ComponentName component, int flags) { // reader synchronized (mPackages) { - final PackageParser.Instrumentation i = mInstrumentation.get(name); + final int callingUid = Binder.getCallingUid(); + final int callingUserId = UserHandle.getUserId(callingUid); + final PackageSetting ps = mSettings.mPackages.get(component.getPackageName()); + if (ps == null) return null; + if (filterAppAccessLPr(ps, callingUid, component, TYPE_UNKNOWN, callingUserId)) { + return null; + } + final PackageParser.Instrumentation i = mInstrumentation.get(component); return PackageParser.generateInstrumentationInfo(i, flags); } } @@ -8116,6 +8413,12 @@ public class PackageManagerService extends IPackageManager.Stub @Override public @NonNull ParceledListSlice<InstrumentationInfo> queryInstrumentation( String targetPackage, int flags) { + final int callingUid = Binder.getCallingUid(); + final int callingUserId = UserHandle.getUserId(callingUid); + final PackageSetting ps = mSettings.mPackages.get(targetPackage); + if (filterAppAccessLPr(ps, callingUid, callingUserId)) { + return ParceledListSlice.emptyList(); + } return new ParceledListSlice<>(queryInstrumentationInternal(targetPackage, flags)); } @@ -8727,7 +9030,7 @@ public class PackageManagerService extends IPackageManager.Stub */ private static final void enforceSystemOrRoot(String message) { final int uid = Binder.getCallingUid(); - if (uid != Process.SYSTEM_UID && uid != 0) { + if (uid != Process.SYSTEM_UID && uid != Process.ROOT_UID) { throw new SecurityException(message); } } @@ -8902,7 +9205,18 @@ public class PackageManagerService extends IPackageManager.Stub @Override public void notifyPackageUse(String packageName, int reason) { synchronized (mPackages) { - PackageParser.Package p = mPackages.get(packageName); + final int callingUid = Binder.getCallingUid(); + final int callingUserId = UserHandle.getUserId(callingUid); + if (getInstantAppPackageName(callingUid) != null) { + if (!isCallerSameApp(packageName, callingUid)) { + return; + } + } else { + if (isInstantApp(packageName, callingUserId)) { + return; + } + } + final PackageParser.Package p = mPackages.get(packageName); if (p == null) { return; } @@ -8925,14 +9239,28 @@ public class PackageManagerService extends IPackageManager.Stub @Override public boolean performDexOpt(String packageName, boolean checkProfiles, int compileReason, boolean force) { - int dexOptStatus = performDexOptTraced(packageName, checkProfiles, + return performDexOptWithStatus(packageName, checkProfiles, compileReason, force) != + PackageDexOptimizer.DEX_OPT_FAILED; + } + + /** + * Perform dexopt on the given package and return one of following result: + * {@link PackageDexOptimizer#DEX_OPT_SKIPPED} + * {@link PackageDexOptimizer#DEX_OPT_PERFORMED} + * {@link PackageDexOptimizer#DEX_OPT_FAILED} + */ + /* package */ int performDexOptWithStatus(String packageName, + boolean checkProfiles, int compileReason, boolean force) { + return performDexOptTraced(packageName, checkProfiles, getCompilerFilterForReason(compileReason), force); - return dexOptStatus != PackageDexOptimizer.DEX_OPT_FAILED; } @Override public boolean performDexOptMode(String packageName, boolean checkProfiles, String targetCompilerFilter, boolean force) { + if (getInstantAppPackageName(Binder.getCallingUid()) != null) { + return false; + } int dexOptStatus = performDexOptTraced(packageName, checkProfiles, targetCompilerFilter, force); return dexOptStatus != PackageDexOptimizer.DEX_OPT_FAILED; @@ -9026,6 +9354,9 @@ public class PackageManagerService extends IPackageManager.Stub @Override public boolean performDexOptSecondary(String packageName, String compilerFilter, boolean force) { + if (getInstantAppPackageName(Binder.getCallingUid()) != null) { + return false; + } mDexManager.reconcileSecondaryDexFiles(packageName); return mDexManager.dexoptSecondaryDex(packageName, compilerFilter, force); } @@ -9042,6 +9373,9 @@ public class PackageManagerService extends IPackageManager.Stub */ @Override public void reconcileSecondaryDexFiles(String packageName) { + if (getInstantAppPackageName(Binder.getCallingUid()) != null) { + return; + } mDexManager.reconcileSecondaryDexFiles(packageName); } @@ -9056,6 +9390,9 @@ public class PackageManagerService extends IPackageManager.Stub */ @Override public boolean runBackgroundDexoptJob() { + if (getInstantAppPackageName(Binder.getCallingUid()) != null) { + return false; + } return BackgroundDexOptService.runIdleOptimizationsNow(this, mContext); } @@ -13509,6 +13846,9 @@ public class PackageManagerService extends IPackageManager.Stub @Override public PackageCleanItem nextPackageToClean(PackageCleanItem lastPackage) { + if (getInstantAppPackageName(Binder.getCallingUid()) != null) { + return null; + } // writer synchronized (mPackages) { if (!isExternalMediaAvailable()) { @@ -14090,15 +14430,16 @@ public class PackageManagerService extends IPackageManager.Stub @Override public boolean isPackageSuspendedForUser(String packageName, int userId) { - enforceCrossUserPermission(Binder.getCallingUid(), userId, + final int callingUid = Binder.getCallingUid(); + enforceCrossUserPermission(callingUid, userId, true /* requireFullPermission */, false /* checkShell */, "isPackageSuspendedForUser for user " + userId); synchronized (mPackages) { - final PackageSetting pkgSetting = mSettings.mPackages.get(packageName); - if (pkgSetting == null) { + final PackageSetting ps = mSettings.mPackages.get(packageName); + if (ps == null || filterAppAccessLPr(ps, callingUid, userId)) { throw new IllegalArgumentException("Unknown target package: " + packageName); } - return pkgSetting.getSuspended(userId); + return ps.getSuspended(userId); } } @@ -14423,6 +14764,9 @@ public class PackageManagerService extends IPackageManager.Stub @Override public int getIntentVerificationStatus(String packageName, int userId) { + if (getInstantAppPackageName(Binder.getCallingUid()) != null) { + return INTENT_FILTER_DOMAIN_VERIFICATION_STATUS_UNDEFINED; + } synchronized (mPackages) { return mSettings.getIntentFilterVerificationStatusLPr(packageName, userId); } @@ -14446,6 +14790,9 @@ public class PackageManagerService extends IPackageManager.Stub @Override public @NonNull ParceledListSlice<IntentFilterVerificationInfo> getIntentFilterVerifications( String packageName) { + if (getInstantAppPackageName(Binder.getCallingUid()) != null) { + return ParceledListSlice.emptyList(); + } synchronized (mPackages) { return new ParceledListSlice<>(mSettings.getIntentFilterVerificationsLPr(packageName)); } @@ -14456,11 +14803,20 @@ public class PackageManagerService extends IPackageManager.Stub if (TextUtils.isEmpty(packageName)) { return ParceledListSlice.emptyList(); } + final int callingUid = Binder.getCallingUid(); + final int callingUserId = UserHandle.getUserId(callingUid); synchronized (mPackages) { PackageParser.Package pkg = mPackages.get(packageName); if (pkg == null || pkg.activities == null) { return ParceledListSlice.emptyList(); } + if (pkg.mExtras == null) { + return ParceledListSlice.emptyList(); + } + final PackageSetting ps = (PackageSetting) pkg.mExtras; + if (filterAppAccessLPr(ps, callingUid, callingUserId)) { + return ParceledListSlice.emptyList(); + } final int count = pkg.activities.size(); ArrayList<IntentFilter> result = new ArrayList<>(); for (int n=0; n<count; n++) { @@ -14490,6 +14846,9 @@ public class PackageManagerService extends IPackageManager.Stub @Override public String getDefaultBrowserPackageName(int userId) { + if (getInstantAppPackageName(Binder.getCallingUid()) != null) { + return null; + } synchronized (mPackages) { return mSettings.getDefaultBrowserPackageNameLPw(userId); } @@ -14508,7 +14867,10 @@ public class PackageManagerService extends IPackageManager.Stub @Override public void setInstallerPackageName(String targetPackage, String installerPackageName) { - final int uid = Binder.getCallingUid(); + final int callingUid = Binder.getCallingUid(); + if (getInstantAppPackageName(callingUid) != null) { + return; + } // writer synchronized (mPackages) { PackageSetting targetPackageSetting = mSettings.mPackages.get(targetPackage); @@ -14528,17 +14890,17 @@ public class PackageManagerService extends IPackageManager.Stub } Signature[] callerSignature; - Object obj = mSettings.getUserIdLPr(uid); + Object obj = mSettings.getUserIdLPr(callingUid); if (obj != null) { if (obj instanceof SharedUserSetting) { callerSignature = ((SharedUserSetting)obj).signatures.mSignatures; } else if (obj instanceof PackageSetting) { callerSignature = ((PackageSetting)obj).signatures.mSignatures; } else { - throw new SecurityException("Bad object " + obj + " for uid " + uid); + throw new SecurityException("Bad object " + obj + " for uid " + callingUid); } } else { - throw new SecurityException("Unknown calling UID: " + uid); + throw new SecurityException("Unknown calling UID: " + callingUid); } // Verify: can't set installerPackageName to a package that is @@ -14583,6 +14945,9 @@ public class PackageManagerService extends IPackageManager.Stub @Override public void setApplicationCategoryHint(String packageName, int categoryHint, String callerPackageName) { + if (getInstantAppPackageName(Binder.getCallingUid()) != null) { + throw new SecurityException("Instant applications don't have access to this method"); + } mContext.getSystemService(AppOpsManager.class).checkPackage(Binder.getCallingUid(), callerPackageName); synchronized (mPackages) { @@ -16592,9 +16957,13 @@ public class PackageManagerService extends IPackageManager.Stub } } + @Override public List<String> getPreviousCodePaths(String packageName) { + final List<String> result = new ArrayList<>(); + if (getInstantAppPackageName(Binder.getCallingUid()) != null) { + return result; + } final PackageSetting ps = mSettings.mPackages.get(packageName); - final List<String> result = new ArrayList<String>(); if (ps != null && ps.oldCodePaths != null) { result.addAll(ps.oldCodePaths); } @@ -18043,6 +18412,11 @@ public class PackageManagerService extends IPackageManager.Stub @Override public boolean isPackageDeviceAdminOnAnyUser(String packageName) { + final int callingUid = Binder.getCallingUid(); + if (getInstantAppPackageName(callingUid) != null + && !isCallerSameApp(packageName, callingUid)) { + return false; + } return isPackageDeviceAdmin(packageName, UserHandle.USER_ALL); } @@ -18719,11 +19093,7 @@ public class PackageManagerService extends IPackageManager.Stub @Override public boolean setRequiredForSystemUser(String packageName, boolean systemUserApp) { - int callingUid = Binder.getCallingUid(); - if (callingUid != Process.SYSTEM_UID && callingUid != Process.ROOT_UID) { - throw new SecurityException( - "setRequiredForSystemUser can only be run by the system or root"); - } + enforceSystemOrRoot("setRequiredForSystemUser can only be run by the system or root"); synchronized (mPackages) { PackageSetting ps = mSettings.mPackages.get(packageName); if (ps == null) { @@ -19577,18 +19947,21 @@ public class PackageManagerService extends IPackageManager.Stub @Override public void clearPackagePreferredActivities(String packageName) { - final int uid = Binder.getCallingUid(); + final int callingUid = Binder.getCallingUid(); + if (getInstantAppPackageName(callingUid) != null) { + return; + } // writer synchronized (mPackages) { PackageParser.Package pkg = mPackages.get(packageName); - if (pkg == null || pkg.applicationInfo.uid != uid) { + if (pkg == null || pkg.applicationInfo.uid != callingUid) { if (mContext.checkCallingOrSelfPermission( android.Manifest.permission.SET_PREFERRED_APPLICATIONS) != PackageManager.PERMISSION_GRANTED) { - if (getUidTargetSdkVersionLockedLPr(Binder.getCallingUid()) + if (getUidTargetSdkVersionLockedLPr(callingUid) < Build.VERSION_CODES.FROYO) { Slog.w(TAG, "Ignoring clearPackagePreferredActivities() from uid " - + Binder.getCallingUid()); + + callingUid); return; } mContext.enforceCallingOrSelfPermission( @@ -19711,7 +20084,9 @@ public class PackageManagerService extends IPackageManager.Stub @Override public int getPreferredActivities(List<IntentFilter> outFilters, List<ComponentName> outActivities, String packageName) { - + if (getInstantAppPackageName(Binder.getCallingUid()) != null) { + return 0; + } int num = 0; final int userId = UserHandle.getCallingUserId(); // reader @@ -20280,6 +20655,9 @@ Slog.v(TAG, ":: stepped forward, applying functor at tag " + parser.getName()); @Override public ComponentName getHomeActivities(List<ResolveInfo> allHomeCandidates) { + if (getInstantAppPackageName(Binder.getCallingUid()) != null) { + return null; + } return getHomeActivitiesAsUser(allHomeCandidates, UserHandle.getCallingUserId()); } @@ -20364,6 +20742,9 @@ Slog.v(TAG, ":: stepped forward, applying functor at tag " + parser.getName()); @Override public void setHomeActivity(ComponentName comp, int userId) { + if (getInstantAppPackageName(Binder.getCallingUid()) != null) { + return; + } ArrayList<ResolveInfo> homeActivities = new ArrayList<>(); getHomeActivitiesAsUser(homeActivities, userId); @@ -20461,43 +20842,58 @@ Slog.v(TAG, ":: stepped forward, applying functor at tag " + parser.getName()); + newState); } PackageSetting pkgSetting; - final int uid = Binder.getCallingUid(); + final int callingUid = Binder.getCallingUid(); final int permission; - if (uid == Process.SYSTEM_UID) { + if (callingUid == Process.SYSTEM_UID) { permission = PackageManager.PERMISSION_GRANTED; } else { permission = mContext.checkCallingOrSelfPermission( android.Manifest.permission.CHANGE_COMPONENT_ENABLED_STATE); } - enforceCrossUserPermission(uid, userId, + enforceCrossUserPermission(callingUid, userId, false /* requireFullPermission */, true /* checkShell */, "set enabled"); final boolean allowedByPermission = (permission == PackageManager.PERMISSION_GRANTED); boolean sendNow = false; boolean isApp = (className == null); + final boolean isCallerInstantApp = (getInstantAppPackageName(callingUid) != null); String componentName = isApp ? packageName : className; int packageUid = -1; ArrayList<String> components; - // writer + // reader synchronized (mPackages) { pkgSetting = mSettings.mPackages.get(packageName); if (pkgSetting == null) { - if (className == null) { - throw new IllegalArgumentException("Unknown package: " + packageName); + if (!isCallerInstantApp) { + if (className == null) { + throw new IllegalArgumentException("Unknown package: " + packageName); + } + throw new IllegalArgumentException( + "Unknown component: " + packageName + "/" + className); + } else { + // throw SecurityException to prevent leaking package information + throw new SecurityException( + "Attempt to change component state; " + + "pid=" + Binder.getCallingPid() + + ", uid=" + callingUid + + (className == null + ? ", package=" + packageName + : ", component=" + packageName + "/" + className)); } - throw new IllegalArgumentException( - "Unknown component: " + packageName + "/" + className); } } // Limit who can change which apps - if (!UserHandle.isSameApp(uid, pkgSetting.appId)) { + if (!UserHandle.isSameApp(callingUid, pkgSetting.appId)) { // Don't allow apps that don't have permission to modify other apps if (!allowedByPermission) { throw new SecurityException( - "Permission Denial: attempt to change component state from pid=" - + Binder.getCallingPid() - + ", uid=" + uid + ", package uid=" + pkgSetting.appId); + "Attempt to change component state; " + + "pid=" + Binder.getCallingPid() + + ", uid=" + callingUid + + (className == null + ? ", package=" + packageName + : ", component=" + packageName + "/" + className)); } // Don't allow changing protected packages. if (mProtectedPackages.isPackageStateProtected(userId, packageName)) { @@ -20506,7 +20902,7 @@ Slog.v(TAG, ":: stepped forward, applying functor at tag " + parser.getName()); } synchronized (mPackages) { - if (uid == Process.SHELL_UID + if (callingUid == Process.SHELL_UID && (pkgSetting.pkgFlags & ApplicationInfo.FLAG_TEST_ONLY) == 0) { // Shell can only change whole packages between ENABLED and DISABLED_USER states // unless it is a test package. @@ -20622,6 +21018,9 @@ Slog.v(TAG, ":: stepped forward, applying functor at tag " + parser.getName()); @Override public void flushPackageRestrictionsAsUser(int userId) { + if (getInstantAppPackageName(Binder.getCallingUid()) != null) { + return; + } if (!sUserManager.exists(userId)) { return; } @@ -20660,16 +21059,19 @@ Slog.v(TAG, ":: stepped forward, applying functor at tag " + parser.getName()); @Override public void setPackageStoppedState(String packageName, boolean stopped, int userId) { if (!sUserManager.exists(userId)) return; - final int uid = Binder.getCallingUid(); + final int callingUid = Binder.getCallingUid(); + if (getInstantAppPackageName(callingUid) != null) { + return; + } final int permission = mContext.checkCallingOrSelfPermission( android.Manifest.permission.CHANGE_COMPONENT_ENABLED_STATE); final boolean allowedByPermission = (permission == PackageManager.PERMISSION_GRANTED); - enforceCrossUserPermission(uid, userId, + enforceCrossUserPermission(callingUid, userId, true /* requireFullPermission */, true /* checkShell */, "stop package"); // writer synchronized (mPackages) { if (mSettings.setPackageStoppedStateLPw(this, packageName, stopped, - allowedByPermission, uid, userId)) { + allowedByPermission, callingUid, userId)) { scheduleWritePackageRestrictionsLocked(userId); } } @@ -20677,6 +21079,9 @@ Slog.v(TAG, ":: stepped forward, applying functor at tag " + parser.getName()); @Override public String getInstallerPackageName(String packageName) { + if (getInstantAppPackageName(Binder.getCallingUid()) != null) { + return null; + } // reader synchronized (mPackages) { return mSettings.getInstallerPackageNameLPr(packageName); @@ -20693,24 +21098,30 @@ Slog.v(TAG, ":: stepped forward, applying functor at tag " + parser.getName()); @Override public int getApplicationEnabledSetting(String packageName, int userId) { if (!sUserManager.exists(userId)) return COMPONENT_ENABLED_STATE_DISABLED; - int uid = Binder.getCallingUid(); - enforceCrossUserPermission(uid, userId, + int callingUid = Binder.getCallingUid(); + enforceCrossUserPermission(callingUid, userId, false /* requireFullPermission */, false /* checkShell */, "get enabled"); // reader synchronized (mPackages) { + if (filterAppAccessLPr(mSettings.getPackageLPr(packageName), callingUid, userId)) { + return COMPONENT_ENABLED_STATE_DISABLED; + } return mSettings.getApplicationEnabledSettingLPr(packageName, userId); } } @Override - public int getComponentEnabledSetting(ComponentName componentName, int userId) { + public int getComponentEnabledSetting(ComponentName component, int userId) { if (!sUserManager.exists(userId)) return COMPONENT_ENABLED_STATE_DISABLED; - int uid = Binder.getCallingUid(); - enforceCrossUserPermission(uid, userId, - false /* requireFullPermission */, false /* checkShell */, "get component enabled"); - // reader + int callingUid = Binder.getCallingUid(); + enforceCrossUserPermission(callingUid, userId, + false /*requireFullPermission*/, false /*checkShell*/, "getComponentEnabled"); synchronized (mPackages) { - return mSettings.getComponentEnabledSettingLPr(componentName, userId); + if (filterAppAccessLPr(mSettings.getPackageLPr(component.getPackageName()), callingUid, + component, TYPE_UNKNOWN, userId)) { + return COMPONENT_ENABLED_STATE_DISABLED; + } + return mSettings.getComponentEnabledSettingLPr(component, userId); } } @@ -20725,6 +21136,8 @@ Slog.v(TAG, ":: stepped forward, applying functor at tag " + parser.getName()); @Override public void systemReady() { + enforceSystemOrRoot("Only the system can claim the system is ready"); + mSystemReady = true; final ContentResolver resolver = mContext.getContentResolver(); ContentObserver co = new ContentObserver(mHandler) { @@ -20872,11 +21285,13 @@ Slog.v(TAG, ":: stepped forward, applying functor at tag " + parser.getName()); @Override public boolean isSafeMode() { + // allow instant applications return mSafeMode; } @Override public boolean hasSystemUidErrors() { + // allow instant applications return mHasSystemUidErrors; } @@ -21838,10 +22253,7 @@ Slog.v(TAG, ":: stepped forward, applying functor at tag " + parser.getName()); */ @Override public void updateExternalMediaStatus(final boolean mediaStatus, final boolean reportStatus) { - int callingUid = Binder.getCallingUid(); - if (callingUid != 0 && callingUid != Process.SYSTEM_UID) { - throw new SecurityException("Media status can only be updated by the system"); - } + enforceSystemOrRoot("Media status can only be updated by the system"); // reader; this apparently protects mMediaMounted, but should probably // be a different lock in that case. synchronized (mPackages) { @@ -23173,6 +23585,7 @@ Slog.v(TAG, ":: stepped forward, applying functor at tag " + parser.getName()); @Override public int getInstallLocation() { + // allow instant app access return android.provider.Settings.Global.getInt(mContext.getContentResolver(), android.provider.Settings.Global.DEFAULT_INSTALL_LOCATION, PackageHelper.APP_INSTALL_AUTO); @@ -23313,11 +23726,13 @@ Slog.v(TAG, ":: stepped forward, applying functor at tag " + parser.getName()); @Override @Deprecated public boolean isPermissionEnforced(String permission) { + // allow instant applications return true; } @Override public boolean isStorageLow() { + // allow instant applications final long token = Binder.clearCallingIdentity(); try { final DeviceStorageMonitorInternal @@ -23334,6 +23749,9 @@ Slog.v(TAG, ":: stepped forward, applying functor at tag " + parser.getName()); @Override public IPackageInstaller getPackageInstaller() { + if (getInstantAppPackageName(Binder.getCallingUid()) != null) { + return null; + } return mInstallerService; } @@ -23381,13 +23799,22 @@ Slog.v(TAG, ":: stepped forward, applying functor at tag " + parser.getName()); return null; } synchronized(mPackages) { + final int callingUid = Binder.getCallingUid(); + final int callingUserId = UserHandle.getUserId(callingUid); final PackageParser.Package pkg = mPackages.get(packageName); if (pkg == null) { Slog.w(TAG, "KeySet requested for unknown package: " + packageName); throw new IllegalArgumentException("Unknown package: " + packageName); } - if (pkg.applicationInfo.uid != Binder.getCallingUid() - && Process.SYSTEM_UID != Binder.getCallingUid()) { + final PackageSetting ps = (PackageSetting) pkg.mExtras; + if (filterAppAccessLPr(ps, callingUid, callingUserId)) { + // filter and pretend the package doesn't exist + Slog.w(TAG, "KeySet requested for filtered package: " + packageName + + ", uid:" + callingUid); + throw new IllegalArgumentException("Unknown package: " + packageName); + } + if (pkg.applicationInfo.uid != callingUid + && Process.SYSTEM_UID != callingUid) { throw new SecurityException("May not access signing KeySet of other apps."); } KeySetManagerService ksms = mSettings.mKeySetManagerService; @@ -23397,6 +23824,9 @@ Slog.v(TAG, ":: stepped forward, applying functor at tag " + parser.getName()); @Override public boolean isPackageSignedByKeySet(String packageName, KeySet ks) { + if (getInstantAppPackageName(Binder.getCallingUid()) != null) { + return false; + } if (packageName == null || ks == null) { return false; } @@ -23417,6 +23847,9 @@ Slog.v(TAG, ":: stepped forward, applying functor at tag " + parser.getName()); @Override public boolean isPackageSignedByKeySetExactly(String packageName, KeySet ks) { + if (getInstantAppPackageName(Binder.getCallingUid()) != null) { + return false; + } if (packageName == null || ks == null) { return false; } @@ -23956,8 +24389,8 @@ Slog.v(TAG, ":: stepped forward, applying functor at tag " + parser.getName()); } @Override - public boolean canAccessInstantApps(int callingUid) { - return PackageManagerService.this.canAccessInstantApps(callingUid); + public boolean canAccessInstantApps(int callingUid, int userId) { + return PackageManagerService.this.canViewInstantApps(callingUid, userId); } } @@ -24015,8 +24448,12 @@ Slog.v(TAG, ":: stepped forward, applying functor at tag " + parser.getName()); * Logs process start information (including base APK hash) to the security log. * @hide */ + @Override public void logAppProcessStartIfNeeded(String processName, int uid, String seinfo, String apkFile, int pid) { + if (getInstantAppPackageName(Binder.getCallingUid()) != null) { + return; + } if (!SecurityLog.isLoggingEnabled()) { return; } @@ -24051,11 +24488,15 @@ Slog.v(TAG, ":: stepped forward, applying functor at tag " + parser.getName()); @Override public int getInstallReason(String packageName, int userId) { - enforceCrossUserPermission(Binder.getCallingUid(), userId, + final int callingUid = Binder.getCallingUid(); + enforceCrossUserPermission(callingUid, userId, true /* requireFullPermission */, false /* checkShell */, "get install reason"); synchronized (mPackages) { final PackageSetting ps = mSettings.mPackages.get(packageName); + if (filterAppAccessLPr(ps, callingUid, userId)) { + return PackageManager.INSTALL_REASON_UNKNOWN; + } if (ps != null) { return ps.getInstallReason(userId); } @@ -24065,6 +24506,9 @@ Slog.v(TAG, ":: stepped forward, applying functor at tag " + parser.getName()); @Override public boolean canRequestPackageInstalls(String packageName, int userId) { + if (getInstantAppPackageName(Binder.getCallingUid()) != null) { + return false; + } return canRequestPackageInstallsInternal(packageName, 0, userId, true /* throwIfPermNotDeclared*/); } @@ -24115,6 +24559,9 @@ Slog.v(TAG, ":: stepped forward, applying functor at tag " + parser.getName()); @Override public ComponentName getInstantAppInstallerComponent() { + if (getInstantAppPackageName(Binder.getCallingUid()) != null) { + return null; + } return mInstantAppInstallerActivity == null ? null : mInstantAppInstallerActivity.getComponentName(); } diff --git a/services/core/java/com/android/server/pm/Settings.java b/services/core/java/com/android/server/pm/Settings.java index 44bcff25b53c..24cbdbff9153 100644 --- a/services/core/java/com/android/server/pm/Settings.java +++ b/services/core/java/com/android/server/pm/Settings.java @@ -987,11 +987,11 @@ final class Settings { // Update static shared library dependencies if needed if (pkg.usesStaticLibraries != null && pkg.usesStaticLibrariesVersions != null && pkg.usesStaticLibraries.size() == pkg.usesStaticLibrariesVersions.length) { - String[] usesStaticLibraries = new String[pkg.usesStaticLibraries.size()]; - pkg.usesStaticLibraries.toArray(usesStaticLibraries); + p.usesStaticLibraries = new String[pkg.usesStaticLibraries.size()]; + pkg.usesStaticLibraries.toArray(p.usesStaticLibraries); p.usesStaticLibrariesVersions = pkg.usesStaticLibrariesVersions; } else { - pkg.usesStaticLibraries = null; + p.usesStaticLibraries = null; p.usesStaticLibrariesVersions = null; } addPackageSettingLPw(p, p.sharedUser); diff --git a/services/core/java/com/android/server/policy/PhoneWindowManager.java b/services/core/java/com/android/server/policy/PhoneWindowManager.java index 78727c056288..8b8e3c471006 100644 --- a/services/core/java/com/android/server/policy/PhoneWindowManager.java +++ b/services/core/java/com/android/server/policy/PhoneWindowManager.java @@ -234,6 +234,7 @@ import com.android.internal.util.ScreenShapeHelper; import com.android.internal.widget.PointerLocationView; import com.android.server.GestureLauncherService; import com.android.server.LocalServices; +import com.android.server.SystemServiceManager; import com.android.server.policy.keyguard.KeyguardServiceDelegate; import com.android.server.policy.keyguard.KeyguardServiceDelegate.DrawnListener; import com.android.server.policy.keyguard.KeyguardStateMonitor.StateCallback; @@ -476,6 +477,7 @@ public class PhoneWindowManager implements WindowManagerPolicy { boolean mBootMessageNeedsHiding; KeyguardServiceDelegate mKeyguardDelegate; + private boolean mKeyguardBound; final Runnable mWindowManagerDrawCallback = new Runnable() { @Override public void run() { @@ -530,7 +532,6 @@ public class PhoneWindowManager implements WindowManagerPolicy { boolean mSystemReady; boolean mSystemBooted; - private boolean mDeferBindKeyguard; boolean mHdmiPlugged; HdmiControl mHdmiControl; IUiModeManager mUiModeManager; @@ -2087,6 +2088,13 @@ public class PhoneWindowManager implements WindowManagerPolicy { handleStartTransitionForKeyguardLw(transit, null /* transit */); } }); + mKeyguardDelegate = new KeyguardServiceDelegate(mContext, + new StateCallback() { + @Override + public void onTrustedChanged() { + mWindowManagerFuncs.notifyKeyguardTrustedChanged(); + } + }); } /** @@ -5325,11 +5333,12 @@ public class PhoneWindowManager implements WindowManagerPolicy { @Override public void applyPostLayoutPolicyLw(WindowState win, WindowManager.LayoutParams attrs, WindowState attached, WindowState imeTarget) { - final boolean visible = win.isVisibleLw() && win.getAttrs().alpha > 0f; - if (DEBUG_LAYOUT) Slog.i(TAG, "Win " + win + ": isVisible=" + visible); + final boolean affectsSystemUi = win.canAffectSystemUiFlags(); + if (DEBUG_LAYOUT) Slog.i(TAG, "Win " + win + ": affectsSystemUi=" + affectsSystemUi); applyKeyguardPolicyLw(win, imeTarget); final int fl = PolicyControl.getWindowFlags(win, attrs); - if (mTopFullscreenOpaqueWindowState == null && visible && attrs.type == TYPE_INPUT_METHOD) { + if (mTopFullscreenOpaqueWindowState == null && affectsSystemUi + && attrs.type == TYPE_INPUT_METHOD) { mForcingShowNavBar = true; mForcingShowNavBarLayer = win.getSurfaceLayer(); } @@ -5345,7 +5354,7 @@ public class PhoneWindowManager implements WindowManagerPolicy { boolean appWindow = attrs.type >= FIRST_APPLICATION_WINDOW && attrs.type < FIRST_SYSTEM_WINDOW; final int stackId = win.getStackId(); - if (mTopFullscreenOpaqueWindowState == null && visible) { + if (mTopFullscreenOpaqueWindowState == null && affectsSystemUi) { if ((fl & FLAG_FORCE_NOT_FULLSCREEN) != 0) { mForceStatusBar = true; } @@ -5377,7 +5386,7 @@ public class PhoneWindowManager implements WindowManagerPolicy { } // Voice interaction overrides both top fullscreen and top docked. - if (visible && win.getAttrs().type == TYPE_VOICE_INTERACTION) { + if (affectsSystemUi && win.getAttrs().type == TYPE_VOICE_INTERACTION) { if (mTopFullscreenOpaqueWindowState == null) { mTopFullscreenOpaqueWindowState = win; if (mTopFullscreenOpaqueOrDimmingWindowState == null) { @@ -5393,7 +5402,7 @@ public class PhoneWindowManager implements WindowManagerPolicy { } // Keep track of the window if it's dimming but not necessarily fullscreen. - if (mTopFullscreenOpaqueOrDimmingWindowState == null && visible + if (mTopFullscreenOpaqueOrDimmingWindowState == null && affectsSystemUi && win.isDimming() && StackId.normallyFullscreenWindows(stackId)) { mTopFullscreenOpaqueOrDimmingWindowState = win; } @@ -5401,7 +5410,7 @@ public class PhoneWindowManager implements WindowManagerPolicy { // We need to keep track of the top "fullscreen" opaque window for the docked stack // separately, because both the "real fullscreen" opaque window and the one for the docked // stack can control View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR. - if (mTopDockedOpaqueWindowState == null && visible && appWindow && attached == null + if (mTopDockedOpaqueWindowState == null && affectsSystemUi && appWindow && attached == null && isFullscreen(attrs) && stackId == DOCKED_STACK_ID) { mTopDockedOpaqueWindowState = win; if (mTopDockedOpaqueOrDimmingWindowState == null) { @@ -5411,7 +5420,7 @@ public class PhoneWindowManager implements WindowManagerPolicy { // Also keep track of any windows that are dimming but not necessarily fullscreen in the // docked stack. - if (mTopDockedOpaqueOrDimmingWindowState == null && visible && win.isDimming() + if (mTopDockedOpaqueOrDimmingWindowState == null && affectsSystemUi && win.isDimming() && stackId == DOCKED_STACK_ID) { mTopDockedOpaqueOrDimmingWindowState = win; } @@ -6631,6 +6640,13 @@ public class PhoneWindowManager implements WindowManagerPolicy { reportScreenStateToVrManager(false); } + private long getKeyguardDrawnTimeout() { + final boolean bootCompleted = + LocalServices.getService(SystemServiceManager.class).isBootCompleted(); + // Set longer timeout if it has not booted yet to prevent showing empty window. + return bootCompleted ? 1000 : 5000; + } + // Called on the DisplayManager's DisplayPowerController thread. @Override public void screenTurningOn(final ScreenOnListener screenOnListener) { @@ -6646,7 +6662,8 @@ public class PhoneWindowManager implements WindowManagerPolicy { if (mKeyguardDelegate != null) { mHandler.removeMessages(MSG_KEYGUARD_DRAWN_TIMEOUT); - mHandler.sendEmptyMessageDelayed(MSG_KEYGUARD_DRAWN_TIMEOUT, 1000); + mHandler.sendEmptyMessageDelayed(MSG_KEYGUARD_DRAWN_TIMEOUT, + getKeyguardDrawnTimeout()); mKeyguardDelegate.onScreenTurningOn(mKeyguardDrawnCallback); } else { if (DEBUG_WAKEUP) Slog.d(TAG, @@ -7159,16 +7176,26 @@ public class PhoneWindowManager implements WindowManagerPolicy { return out; } + private void bindKeyguard() { + synchronized (mLock) { + if (mKeyguardBound) { + return; + } + mKeyguardBound = true; + } + mKeyguardDelegate.bindService(mContext); + } + + @Override + public void onSystemUiStarted() { + bindKeyguard(); + } + /** {@inheritDoc} */ @Override public void systemReady() { - mKeyguardDelegate = new KeyguardServiceDelegate(mContext, - new StateCallback() { - @Override - public void onTrustedChanged() { - mWindowManagerFuncs.notifyKeyguardTrustedChanged(); - } - }); + // In normal flow, systemReady is called before other system services are ready. + // So it is better not to bind keyguard here. mKeyguardDelegate.onSystemReady(); mVrManagerInternal = LocalServices.getService(VrManagerInternal.class); @@ -7178,7 +7205,6 @@ public class PhoneWindowManager implements WindowManagerPolicy { readCameraLensCoverState(); updateUiMode(); - boolean bindKeyguardNow; synchronized (mLock) { updateOrientationListenerLp(); mSystemReady = true; @@ -7188,18 +7214,13 @@ public class PhoneWindowManager implements WindowManagerPolicy { updateSettings(); } }); - - bindKeyguardNow = mDeferBindKeyguard; - if (bindKeyguardNow) { - // systemBooted ran but wasn't able to bind to the Keyguard, we'll do it now. - mDeferBindKeyguard = false; + // If this happens, for whatever reason, systemReady came later than systemBooted. + // And keyguard should be already bound from systemBooted + if (mSystemBooted) { + mKeyguardDelegate.onBootCompleted(); } } - if (bindKeyguardNow) { - mKeyguardDelegate.bindService(mContext); - mKeyguardDelegate.onBootCompleted(); - } mSystemGestures.systemReady(); mImmersiveModeConfirmation.systemReady(); } @@ -7207,30 +7228,25 @@ public class PhoneWindowManager implements WindowManagerPolicy { /** {@inheritDoc} */ @Override public void systemBooted() { - boolean bindKeyguardNow = false; - synchronized (mLock) { - // Time to bind Keyguard; take care to only bind it once, either here if ready or - // in systemReady if not. - if (mKeyguardDelegate != null) { - bindKeyguardNow = true; - } else { - // Because mKeyguardDelegate is null, we know that the synchronized block in - // systemReady didn't run yet and setting this will actually have an effect. - mDeferBindKeyguard = true; - } - } - if (bindKeyguardNow) { - mKeyguardDelegate.bindService(mContext); - mKeyguardDelegate.onBootCompleted(); - } + bindKeyguard(); synchronized (mLock) { mSystemBooted = true; + if (mSystemReady) { + mKeyguardDelegate.onBootCompleted(); + } } startedWakingUp(); screenTurningOn(null); screenTurnedOn(); } + @Override + public boolean canDismissBootAnimation() { + synchronized (mLock) { + return mKeyguardDrawComplete; + } + } + ProgressDialog mBootMsgDialog = null; /** {@inheritDoc} */ diff --git a/services/core/java/com/android/server/wm/AlertWindowNotification.java b/services/core/java/com/android/server/wm/AlertWindowNotification.java index 50b1520f32a4..7ed3eac10d11 100644 --- a/services/core/java/com/android/server/wm/AlertWindowNotification.java +++ b/services/core/java/com/android/server/wm/AlertWindowNotification.java @@ -16,14 +16,15 @@ package com.android.server.wm; +import static android.app.NotificationManager.IMPORTANCE_MIN; import static android.app.PendingIntent.FLAG_CANCEL_CURRENT; import static android.content.Context.NOTIFICATION_SERVICE; import static android.content.Intent.FLAG_ACTIVITY_CLEAR_TASK; import static android.content.Intent.FLAG_ACTIVITY_NEW_TASK; import static android.provider.Settings.ACTION_MANAGE_OVERLAY_PERMISSION; -import static com.android.internal.notification.SystemNotificationChannels.ALERT_WINDOW; import android.app.Notification; +import android.app.NotificationChannel; import android.app.NotificationManager; import android.app.PendingIntent; import android.content.Context; @@ -40,7 +41,7 @@ import com.android.server.policy.IconUtilities; /** Displays an ongoing notification for a process displaying an alert window */ class AlertWindowNotification { - private static final String TAG_PREFIX = "com.android.server.wm.AlertWindowNotification: "; + private static final String CHANNEL_PREFIX = "com.android.server.wm.AlertWindowNotification - "; private static final int NOTIFICATION_ID = 0; private static int sNextRequestCode = 0; @@ -57,7 +58,7 @@ class AlertWindowNotification { mPackageName = packageName; mNotificationManager = (NotificationManager) mService.mContext.getSystemService(NOTIFICATION_SERVICE); - mNotificationTag = TAG_PREFIX + mPackageName; + mNotificationTag = CHANNEL_PREFIX + mPackageName; mRequestCode = sNextRequestCode++; mIconUtilities = new IconUtilities(mService.mContext); } @@ -99,9 +100,11 @@ class AlertWindowNotification { final String appName = (aInfo != null) ? pm.getApplicationLabel(aInfo).toString() : mPackageName; + createNotificationChannelIfNeeded(context, appName); + final String message = context.getString(R.string.alert_windows_notification_message, appName); - final Notification.Builder builder = new Notification.Builder(context, ALERT_WINDOW) + final Notification.Builder builder = new Notification.Builder(context, mNotificationTag) .setOngoing(true) .setContentTitle( context.getString(R.string.alert_windows_notification_title, appName)) @@ -131,6 +134,20 @@ class AlertWindowNotification { return PendingIntent.getActivity(context, mRequestCode, intent, FLAG_CANCEL_CURRENT); } + private void createNotificationChannelIfNeeded(Context context, String appName) { + if (mNotificationManager.getNotificationChannel(mNotificationTag) != null) { + return; + } + final String nameChannel = + context.getString(R.string.alert_windows_notification_channel_name, appName); + final NotificationChannel channel = + new NotificationChannel(mNotificationTag, nameChannel, IMPORTANCE_MIN); + channel.enableLights(false); + channel.enableVibration(false); + mNotificationManager.createNotificationChannel(channel); + } + + private ApplicationInfo getApplicationInfo(PackageManager pm, String packageName) { try { return pm.getApplicationInfo(packageName, 0); diff --git a/services/core/java/com/android/server/wm/AppWindowAnimator.java b/services/core/java/com/android/server/wm/AppWindowAnimator.java index 65e3ec015bc6..f76926113ef8 100644 --- a/services/core/java/com/android/server/wm/AppWindowAnimator.java +++ b/services/core/java/com/android/server/wm/AppWindowAnimator.java @@ -78,6 +78,9 @@ public class AppWindowAnimator { // requires that the duration of the two animations are the same. SurfaceControl thumbnail; int thumbnailTransactionSeq; + // TODO(b/62029108): combine both members into a private one. Create a member function to set + // the thumbnail layer to +1 to the highest layer position and replace all setter instances + // with this function. Remove all unnecessary calls to both variables in other classes. int thumbnailLayer; int thumbnailForceAboveLayer; Animation thumbnailAnimation; diff --git a/services/core/java/com/android/server/wm/AppWindowContainerController.java b/services/core/java/com/android/server/wm/AppWindowContainerController.java index c982f081d624..1a685eb0bd94 100644 --- a/services/core/java/com/android/server/wm/AppWindowContainerController.java +++ b/services/core/java/com/android/server/wm/AppWindowContainerController.java @@ -107,7 +107,7 @@ public class AppWindowContainerController if (DEBUG_STARTING_WINDOW) Slog.v(TAG_WM, "Remove starting " + mContainer + ": startingWindow=" + mContainer.startingWindow + " startingView=" + mContainer.startingSurface); - if (mContainer.startingWindow != null) { + if (mContainer.startingData != null) { surface = mContainer.startingSurface; mContainer.startingData = null; mContainer.startingSurface = null; @@ -164,18 +164,16 @@ public class AppWindowContainerController if (surface != null) { boolean abort = false; synchronized(mWindowMap) { + // If the window was successfully added, then + // we need to remove it. if (container.removed || container.startingData == null) { - // If the window was successfully added, then - // we need to remove it. - if (container.startingWindow != null) { - if (DEBUG_STARTING_WINDOW) Slog.v(TAG_WM, - "Aborted starting " + container - + ": removed=" + container.removed - + " startingData=" + container.startingData); - container.startingWindow = null; - container.startingData = null; - abort = true; - } + if (DEBUG_STARTING_WINDOW) Slog.v(TAG_WM, + "Aborted starting " + container + + ": removed=" + container.removed + + " startingData=" + container.startingData); + container.startingWindow = null; + container.startingData = null; + abort = true; } else { container.startingSurface = surface; } @@ -348,6 +346,24 @@ public class AppWindowContainerController final AppWindowToken wtoken = mContainer; + // Don't set visibility to false if we were already not visible. This prevents WM from + // adding the app to the closing app list which doesn't make sense for something that is + // already not visible. However, set visibility to true even if we are already visible. + // This makes sure the app is added to the opening apps list so that the right + // transition can be selected. + // TODO: Probably a good idea to separate the concept of opening/closing apps from the + // concept of setting visibility... + if (!visible && wtoken.hiddenRequested) { + + if (!deferHidingClient && wtoken.mDeferHidingClient) { + // We previously deferred telling the client to hide itself when visibility was + // initially set to false. Now we would like it to hide, so go ahead and set it. + wtoken.mDeferHidingClient = deferHidingClient; + wtoken.setClientHidden(true); + } + return; + } + if (DEBUG_APP_TRANSITIONS || DEBUG_ORIENTATION) Slog.v(TAG_WM, "setAppVisibility(" + mToken + ", visible=" + visible + "): " + mService.mAppTransition + " hidden=" + wtoken.hidden + " hiddenRequested=" diff --git a/services/core/java/com/android/server/wm/AppWindowToken.java b/services/core/java/com/android/server/wm/AppWindowToken.java index 17db253adb16..f0e0e1487131 100644 --- a/services/core/java/com/android/server/wm/AppWindowToken.java +++ b/services/core/java/com/android/server/wm/AppWindowToken.java @@ -341,7 +341,9 @@ class AppWindowToken extends WindowToken implements WindowManagerService.AppFree boolean delayed = false; inPendingTransaction = false; - + // Reset the state of mHiddenSetFromTransferredStartingWindow since visibility is actually + // been set by the app now. + mHiddenSetFromTransferredStartingWindow = false; setClientHidden(!visible); // Allow for state changes and animation to be applied if: diff --git a/services/core/java/com/android/server/wm/DockedStackDividerController.java b/services/core/java/com/android/server/wm/DockedStackDividerController.java index e3002563a6fd..2d7fc6883292 100644 --- a/services/core/java/com/android/server/wm/DockedStackDividerController.java +++ b/services/core/java/com/android/server/wm/DockedStackDividerController.java @@ -191,12 +191,16 @@ public class DockedStackDividerController implements DimLayerUser { mTmpRect); int dividerSize = mDividerWindowWidth - 2 * mDividerInsets; Configuration configuration = mDisplayContent.getConfiguration(); + // The offset in the left (landscape)/top (portrait) is calculated with the minimized + // offset value with the divider size and any system insets in that direction. if (configuration.orientation == Configuration.ORIENTATION_PORTRAIT) { outBounds.set(0, mTaskHeightInMinimizedMode + dividerSize + mTmpRect.top, di.logicalWidth, di.logicalHeight); } else { - outBounds.set(mTaskHeightInMinimizedMode + dividerSize + mTmpRect.left, 0, - di.logicalWidth, di.logicalHeight); + // In landscape append the left position with the statusbar height to match the + // minimized size height in portrait mode. + outBounds.set(mTaskHeightInMinimizedMode + dividerSize + mTmpRect.left + mTmpRect.top, + 0, di.logicalWidth, di.logicalHeight); } } diff --git a/services/core/java/com/android/server/wm/TaskSnapshotController.java b/services/core/java/com/android/server/wm/TaskSnapshotController.java index 24cb464b5993..b2667781b955 100644 --- a/services/core/java/com/android/server/wm/TaskSnapshotController.java +++ b/services/core/java/com/android/server/wm/TaskSnapshotController.java @@ -17,15 +17,14 @@ package com.android.server.wm; import static android.app.ActivityManager.ENABLE_TASK_SNAPSHOTS; -import static android.graphics.GraphicBuffer.USAGE_HW_TEXTURE; -import static android.graphics.GraphicBuffer.USAGE_SW_READ_NEVER; -import static android.graphics.GraphicBuffer.USAGE_SW_WRITE_RARELY; -import static android.graphics.PixelFormat.RGBA_8888; +import static android.graphics.Bitmap.Config.ARGB_8888; +import static android.graphics.Bitmap.Config.HARDWARE; import android.annotation.Nullable; import android.app.ActivityManager; import android.app.ActivityManager.StackId; import android.app.ActivityManager.TaskSnapshot; +import android.graphics.Bitmap; import android.graphics.Canvas; import android.graphics.GraphicBuffer; import android.graphics.Rect; @@ -42,7 +41,6 @@ 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 @@ -240,22 +238,22 @@ class TaskSnapshotController { final int color = task.getTaskDescription().getBackgroundColor(); final int statusBarColor = task.getTaskDescription().getStatusBarColor(); final int navigationBarColor = task.getTaskDescription().getNavigationBarColor(); - final GraphicBuffer buffer = GraphicBuffer.create(mainWindow.getFrameLw().width(), - mainWindow.getFrameLw().height(), - RGBA_8888, USAGE_HW_TEXTURE | USAGE_SW_WRITE_RARELY | USAGE_SW_READ_NEVER); - if (buffer == null) { - return null; - } - final Canvas c = buffer.lockCanvas(); + final Bitmap b = Bitmap.createBitmap(mainWindow.getFrameLw().width(), + mainWindow.getFrameLw().height(), ARGB_8888); + final Canvas c = new Canvas(b); c.drawColor(color); final LayoutParams attrs = mainWindow.getAttrs(); final SystemBarBackgroundPainter decorPainter = new SystemBarBackgroundPainter(attrs.flags, attrs.privateFlags, attrs.systemUiVisibility, statusBarColor, navigationBarColor); decorPainter.setInsets(mainWindow.mContentInsets, mainWindow.mStableInsets); decorPainter.drawDecors(c, null /* statusBarExcludeFrame */); - buffer.unlockCanvasAndPost(c); - return new TaskSnapshot(buffer, topChild.getConfiguration().orientation, - mainWindow.mStableInsets, false /* reduced */, 1.0f /* scale */); + + // Flush writer. + c.setBitmap(null); + final Bitmap hwBitmap = b.copy(HARDWARE, false /* isMutable */); + return new TaskSnapshot(hwBitmap.createGraphicBufferHandle(), + topChild.getConfiguration().orientation, mainWindow.mStableInsets, + false /* reduced */, 1.0f /* scale */); } /** diff --git a/services/core/java/com/android/server/wm/TaskStack.java b/services/core/java/com/android/server/wm/TaskStack.java index 9d48ce58bb2a..d189ff87f351 100644 --- a/services/core/java/com/android/server/wm/TaskStack.java +++ b/services/core/java/com/android/server/wm/TaskStack.java @@ -738,7 +738,8 @@ public class TaskStack extends WindowContainer<Task> implements DimLayer.DimLaye // When the home stack is resizable, should always have the same stack and task bounds if (mStackId == HOME_STACK_ID) { - if (findHomeTask().isResizeable()) { + final Task homeTask = findHomeTask(); + if (homeTask != null && homeTask.isResizeable()) { // Calculate the home stack bounds when in docked mode and the home stack is // resizeable. getDisplayContent().mDividerControllerLocked diff --git a/services/core/java/com/android/server/wm/WindowLayersController.java b/services/core/java/com/android/server/wm/WindowLayersController.java index 172ec4871b48..01a3143a7b22 100644 --- a/services/core/java/com/android/server/wm/WindowLayersController.java +++ b/services/core/java/com/android/server/wm/WindowLayersController.java @@ -257,9 +257,20 @@ class WindowLayersController { w.mLayer = layer; w.mWinAnimator.mAnimLayer = w.getAnimLayerAdjustment() + w.getSpecialWindowAnimLayerAdjustment(); - if (w.mAppToken != null && w.mAppToken.mAppAnimator.thumbnailForceAboveLayer > 0 - && w.mWinAnimator.mAnimLayer > w.mAppToken.mAppAnimator.thumbnailForceAboveLayer) { - w.mAppToken.mAppAnimator.thumbnailForceAboveLayer = w.mWinAnimator.mAnimLayer; + if (w.mAppToken != null && w.mAppToken.mAppAnimator.thumbnailForceAboveLayer > 0) { + if (w.mWinAnimator.mAnimLayer > w.mAppToken.mAppAnimator.thumbnailForceAboveLayer) { + w.mAppToken.mAppAnimator.thumbnailForceAboveLayer = w.mWinAnimator.mAnimLayer; + } + // TODO(b/62029108): the entire contents of the if statement should call the refactored + // function to set the thumbnail layer for w.AppToken + int highestLayer = w.mAppToken.getHighestAnimLayer(); + if (highestLayer > 0) { + if (w.mAppToken.mAppAnimator.thumbnail != null + && w.mAppToken.mAppAnimator.thumbnailForceAboveLayer != highestLayer) { + w.mAppToken.mAppAnimator.thumbnailForceAboveLayer = highestLayer; + w.mAppToken.mAppAnimator.thumbnail.setLayer(highestLayer + 1); + } + } } } } diff --git a/services/core/java/com/android/server/wm/WindowManagerService.java b/services/core/java/com/android/server/wm/WindowManagerService.java index a2ae430bacec..a15891bc6414 100644 --- a/services/core/java/com/android/server/wm/WindowManagerService.java +++ b/services/core/java/com/android/server/wm/WindowManagerService.java @@ -3341,6 +3341,13 @@ public class WindowManagerService extends IWindowManager.Stub performEnableScreen(); } + /** + * Called when System UI has been started. + */ + public void onSystemUiStarted() { + mPolicy.onSystemUiStarted(); + } + private void performEnableScreen() { synchronized(mWindowMap) { if (DEBUG_BOOT) Slog.i(TAG_WM, "performEnableScreen: mDisplayEnabled=" + mDisplayEnabled @@ -3356,6 +3363,10 @@ public class WindowManagerService extends IWindowManager.Stub return; } + if (!mShowingBootMessages && !mPolicy.canDismissBootAnimation()) { + return; + } + // Don't enable the screen until all existing windows have been drawn. if (!mForceDisplayEnabled // TODO(multidisplay): Expand to all displays? @@ -3369,7 +3380,7 @@ public class WindowManagerService extends IWindowManager.Stub try { IBinder surfaceFlinger = ServiceManager.getService("SurfaceFlinger"); if (surfaceFlinger != null) { - //Slog.i(TAG_WM, "******* TELLING SURFACE FLINGER WE ARE BOOTED!"); + Slog.i(TAG_WM, "******* TELLING SURFACE FLINGER WE ARE BOOTED!"); Parcel data = Parcel.obtain(); data.writeInterfaceToken("android.ui.ISurfaceComposer"); surfaceFlinger.transact(IBinder.FIRST_CALL_TRANSACTION, // BOOT_FINISHED diff --git a/services/core/java/com/android/server/wm/WindowState.java b/services/core/java/com/android/server/wm/WindowState.java index 2ffa15206cb6..acd7703836d1 100644 --- a/services/core/java/com/android/server/wm/WindowState.java +++ b/services/core/java/com/android/server/wm/WindowState.java @@ -1403,6 +1403,16 @@ class WindowState extends WindowContainer<WindowState> implements WindowManagerP || ((mAppToken != null) && (mAppToken.mAppAnimator.animation != null))); } + // TODO: Another visibility method that was added late in the release to minimize risk. + @Override + public boolean canAffectSystemUiFlags() { + final boolean shown = mWinAnimator.getShown(); + final boolean exiting = mAnimatingExit || mDestroying + || mAppToken != null && mAppToken.hidden; + final boolean translucent = mAttrs.alpha == 0.0f; + return shown && !exiting && !translucent; + } + /** * Like isOnScreen, but returns false if the surface hasn't yet * been drawn. diff --git a/services/core/java/com/android/server/wm/WindowSurfacePlacer.java b/services/core/java/com/android/server/wm/WindowSurfacePlacer.java index e576f2f4e9ed..4a1a7052a8b0 100644 --- a/services/core/java/com/android/server/wm/WindowSurfacePlacer.java +++ b/services/core/java/com/android/server/wm/WindowSurfacePlacer.java @@ -15,6 +15,7 @@ import static com.android.server.wm.AppTransition.TRANSIT_FLAG_KEYGUARD_GOING_AW import static com.android.server.wm.AppTransition.TRANSIT_FLAG_KEYGUARD_GOING_AWAY_WITH_WALLPAPER; import static com.android.server.wm.AppTransition.TRANSIT_KEYGUARD_GOING_AWAY; import static com.android.server.wm.AppTransition.TRANSIT_KEYGUARD_GOING_AWAY_ON_WALLPAPER; +import static com.android.server.wm.AppTransition.TRANSIT_NONE; import static com.android.server.wm.AppTransition.TRANSIT_TASK_CLOSE; import static com.android.server.wm.AppTransition.TRANSIT_TASK_IN_PLACE; import static com.android.server.wm.AppTransition.TRANSIT_TASK_OPEN; @@ -580,6 +581,11 @@ class WindowSurfacePlacer { private int maybeUpdateTransitToWallpaper(int transit, boolean openingAppHasWallpaper, boolean closingAppHasWallpaper) { + // Given no app transition pass it through instead of a wallpaper transition + if (transit == TRANSIT_NONE) { + return TRANSIT_NONE; + } + // if wallpaper is animating in or out set oldWallpaper to null else to wallpaper final WindowState wallpaperTarget = mWallpaperControllerLocked.getWallpaperTarget(); final WindowState oldWallpaper = mWallpaperControllerLocked.isWallpaperTargetAnimating() diff --git a/services/java/com/android/server/SystemServer.java b/services/java/com/android/server/SystemServer.java index 0965f03c27e9..1d44a205ac10 100644 --- a/services/java/com/android/server/SystemServer.java +++ b/services/java/com/android/server/SystemServer.java @@ -671,7 +671,6 @@ public final class SystemServer { VibratorService vibrator = null; IStorageManager storageManager = null; NetworkManagementService networkManagement = null; - IpSecService ipSecService = null; NetworkStatsService networkStats = null; NetworkPolicyManagerService networkPolicy = null; ConnectivityService connectivity = null; @@ -1024,15 +1023,6 @@ public final class SystemServer { reportWtf("starting NetworkManagement Service", e); } traceEnd(); - - traceBeginAndSlog("StartIpSecService"); - try { - ipSecService = IpSecService.create(context); - ServiceManager.addService(Context.IPSEC_SERVICE, ipSecService); - } catch (Throwable e) { - reportWtf("starting IpSec Service", e); - } - traceEnd(); } if (!disableNonCoreServices && !disableTextServices) { @@ -1643,7 +1633,7 @@ public final class SystemServer { final TelephonyRegistry telephonyRegistryF = telephonyRegistry; final MediaRouterService mediaRouterF = mediaRouter; final MmsServiceBroker mmsServiceF = mmsService; - final IpSecService ipSecServiceF = ipSecService; + final WindowManagerService windowManagerF = wm; // We now tell the activity manager it is okay to run third party // code. It will call back into us once it has gotten to the state @@ -1683,7 +1673,7 @@ public final class SystemServer { traceBeginAndSlog("StartSystemUI"); try { - startSystemUi(context); + startSystemUi(context, windowManagerF); } catch (Throwable e) { reportWtf("starting System UI", e); } @@ -1707,13 +1697,6 @@ public final class SystemServer { .networkScoreAndNetworkManagementServiceReady(); } traceEnd(); - traceBeginAndSlog("MakeIpSecServiceReady"); - try { - if (ipSecServiceF != null) ipSecServiceF.systemReady(); - } catch (Throwable e) { - reportWtf("making IpSec Service ready", e); - } - traceEnd(); traceBeginAndSlog("MakeNetworkStatsServiceReady"); try { if (networkStatsF != null) networkStatsF.systemReady(); @@ -1837,13 +1820,14 @@ public final class SystemServer { }, BOOT_TIMINGS_TRACE_LOG); } - static final void startSystemUi(Context context) { + static final void startSystemUi(Context context, WindowManagerService windowManager) { Intent intent = new Intent(); intent.setComponent(new ComponentName("com.android.systemui", "com.android.systemui.SystemUIService")); intent.addFlags(Intent.FLAG_DEBUG_TRIAGED_MISSING); //Slog.d(TAG, "Starting service: " + intent); context.startServiceAsUser(intent, UserHandle.SYSTEM); + windowManager.onSystemUiStarted(); } private static void traceBeginAndSlog(String name) { diff --git a/services/tests/notification/src/com/android/server/notification/RankingHelperTest.java b/services/tests/notification/src/com/android/server/notification/RankingHelperTest.java index 2c9c11403905..06b5821b50d2 100644 --- a/services/tests/notification/src/com/android/server/notification/RankingHelperTest.java +++ b/services/tests/notification/src/com/android/server/notification/RankingHelperTest.java @@ -123,6 +123,7 @@ public class RankingHelperTest extends NotificationTestCase { when(mPm.getApplicationInfoAsUser(eq(PKG), anyInt(), anyInt())).thenReturn(legacy); when(mPm.getApplicationInfoAsUser(eq(UPDATED_PKG), anyInt(), anyInt())).thenReturn(upgrade); when(mPm.getPackageUidAsUser(eq(PKG), anyInt())).thenReturn(UID); + when(mPm.getPackageUidAsUser(eq(UPDATED_PKG), anyInt())).thenReturn(UID2); when(mContext.getResources()).thenReturn( InstrumentationRegistry.getContext().getResources()); when(mContext.getPackageManager()).thenReturn(mPm); @@ -1046,6 +1047,24 @@ public class RankingHelperTest extends NotificationTestCase { } @Test + public void testOnPackageChange_downgradeTargetSdk() throws Exception { + // create channel as api 26 + mHelper.createNotificationChannel(UPDATED_PKG, UID2, getChannel(), true); + + // install new app version targeting 25 + final ApplicationInfo legacy = new ApplicationInfo(); + legacy.targetSdkVersion = Build.VERSION_CODES.N_MR1; + when(mPm.getApplicationInfoAsUser(eq(UPDATED_PKG), anyInt(), anyInt())).thenReturn(legacy); + mHelper.onPackagesChanged( + false, UserHandle.USER_SYSTEM, new String[]{UPDATED_PKG}, new int[]{UID2}); + + // make sure the default channel was readded + //assertEquals(2, mHelper.getNotificationChannels(UPDATED_PKG, UID2, false).getList().size()); + assertNotNull(mHelper.getNotificationChannel( + UPDATED_PKG, UID2, NotificationChannel.DEFAULT_CHANNEL_ID, false)); + } + + @Test public void testRecordDefaults() throws Exception { assertEquals(NotificationManager.IMPORTANCE_UNSPECIFIED, mHelper.getImportance(PKG, UID)); assertEquals(true, mHelper.canShowBadge(PKG, UID)); diff --git a/services/tests/servicestests/src/com/android/server/am/CoreSettingsObserverTest.java b/services/tests/servicestests/src/com/android/server/am/CoreSettingsObserverTest.java index 19defe158122..2f202d98647f 100644 --- a/services/tests/servicestests/src/com/android/server/am/CoreSettingsObserverTest.java +++ b/services/tests/servicestests/src/com/android/server/am/CoreSettingsObserverTest.java @@ -36,6 +36,7 @@ import com.android.server.AppOpsService; import org.junit.Before; import org.junit.BeforeClass; +import org.junit.Ignore; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.Mock; @@ -58,6 +59,7 @@ import java.io.File; * Run: adb shell am instrument -e class com.android.server.am.CoreSettingsObserverTest -w \ * com.android.frameworks.servicestests/android.support.test.runner.AndroidJUnitRunner */ +@Ignore @SmallTest @RunWith(AndroidJUnit4.class) public class CoreSettingsObserverTest { diff --git a/services/tests/servicestests/src/com/android/server/net/ConnOnActivityStartTest.java b/services/tests/servicestests/src/com/android/server/net/ConnOnActivityStartTest.java index 901453976f05..f02cf5183e2f 100644 --- a/services/tests/servicestests/src/com/android/server/net/ConnOnActivityStartTest.java +++ b/services/tests/servicestests/src/com/android/server/net/ConnOnActivityStartTest.java @@ -54,6 +54,7 @@ import libcore.io.IoUtils; import org.junit.AfterClass; import org.junit.BeforeClass; +import org.junit.Ignore; import org.junit.Test; import org.junit.runner.RunWith; @@ -78,6 +79,7 @@ import java.util.concurrent.TimeUnit; * Run: adb shell am instrument -e class com.android.server.net.ConnOnActivityStartTest -w \ * com.android.frameworks.servicestests/android.support.test.runner.AndroidJUnitRunner */ +@Ignore @LargeTest @RunWith(AndroidJUnit4.class) public class ConnOnActivityStartTest { diff --git a/services/tests/servicestests/src/com/android/server/pm/PackageManagerSettingsTests.java b/services/tests/servicestests/src/com/android/server/pm/PackageManagerSettingsTests.java index 5e4ba7bec713..25ba66ef17db 100644 --- a/services/tests/servicestests/src/com/android/server/pm/PackageManagerSettingsTests.java +++ b/services/tests/servicestests/src/com/android/server/pm/PackageManagerSettingsTests.java @@ -25,9 +25,12 @@ import static org.hamcrest.CoreMatchers.is; import static org.hamcrest.CoreMatchers.not; import static org.hamcrest.CoreMatchers.notNullValue; import static org.hamcrest.CoreMatchers.nullValue; +import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotSame; +import static org.junit.Assert.assertNull; import static org.junit.Assert.assertSame; import static org.junit.Assert.assertThat; +import static org.junit.Assert.assertTrue; import static org.junit.Assert.fail; import android.annotation.NonNull; @@ -37,6 +40,7 @@ import android.content.pm.PackageUserState; import android.content.pm.UserInfo; import android.os.UserHandle; import android.os.UserManagerInternal; +import android.security.keystore.ArrayUtils; import android.support.test.InstrumentationRegistry; import android.support.test.runner.AndroidJUnit4; import android.test.suitebuilder.annotation.SmallTest; @@ -57,6 +61,7 @@ import java.io.FileOutputStream; import java.io.IOException; import java.security.PublicKey; import java.util.ArrayList; +import java.util.Arrays; import java.util.List; @RunWith(AndroidJUnit4.class) @@ -527,6 +532,41 @@ public class PackageManagerSettingsTests { false /*notLaunched*/, false /*stopped*/, true /*installed*/); } + @Test + public void testInsertPackageSetting() { + final PackageSetting ps = createPackageSetting(0 /*sharedUserId*/, 0 /*pkgFlags*/); + final PackageParser.Package pkg = new PackageParser.Package(PACKAGE_NAME); + pkg.applicationInfo.setCodePath(ps.codePathString); + pkg.applicationInfo.setResourcePath(ps.resourcePathString); + final Settings settings = + new Settings(InstrumentationRegistry.getContext().getFilesDir(), new Object()); + pkg.usesStaticLibraries = new ArrayList<>( + Arrays.asList("foo.bar1", "foo.bar2", "foo.bar3")); + pkg.usesStaticLibrariesVersions = new int[] {2, 4, 6}; + settings.insertPackageSettingLPw(ps, pkg); + assertEquals(pkg, ps.pkg); + assertArrayEquals(pkg.usesStaticLibraries.toArray(new String[0]), ps.usesStaticLibraries); + assertArrayEquals(pkg.usesStaticLibrariesVersions, ps.usesStaticLibrariesVersions); + + pkg.usesStaticLibraries = null; + pkg.usesStaticLibrariesVersions = null; + settings.insertPackageSettingLPw(ps, pkg); + assertEquals(pkg, ps.pkg); + assertNull("Actual: " + Arrays.toString(ps.usesStaticLibraries), ps.usesStaticLibraries); + assertNull("Actual: " + Arrays.toString(ps.usesStaticLibrariesVersions), + ps.usesStaticLibrariesVersions); + } + + private <T> void assertArrayEquals(T[] a, T[] b) { + assertTrue("Expected: " + Arrays.toString(a) + ", actual: " + Arrays.toString(b), + Arrays.equals(a, b)); + } + + private void assertArrayEquals(int[] a, int[] b) { + assertTrue("Expected: " + Arrays.toString(a) + ", actual: " + Arrays.toString(b), + Arrays.equals(a, b)); + } + private void verifyUserState(PackageUserState userState, PackageUserState oldUserState, boolean userStateChanged) { verifyUserState(userState, oldUserState, userStateChanged, false /*notLaunched*/, diff --git a/services/tests/servicestests/src/com/android/server/wm/AppWindowContainerControllerTests.java b/services/tests/servicestests/src/com/android/server/wm/AppWindowContainerControllerTests.java index da3b9c9e9298..65a56327bb24 100644 --- a/services/tests/servicestests/src/com/android/server/wm/AppWindowContainerControllerTests.java +++ b/services/tests/servicestests/src/com/android/server/wm/AppWindowContainerControllerTests.java @@ -19,18 +19,24 @@ package com.android.server.wm; import org.junit.Test; import android.platform.test.annotations.Presubmit; +import android.platform.test.annotations.SecurityTest; import android.support.test.InstrumentationRegistry; import android.support.test.filters.SmallTest; import android.support.test.runner.AndroidJUnit4; +import android.view.WindowManager; import static android.content.pm.ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE; import static android.content.pm.ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED; import static android.content.res.Configuration.EMPTY; +import static android.view.WindowManager.LayoutParams.TYPE_APPLICATION_STARTING; import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertNull; import static org.junit.Assert.fail; +import java.util.function.Consumer; + /** * Test class for {@link AppWindowContainerController}. * @@ -90,6 +96,9 @@ public class AppWindowContainerControllerTests extends WindowTestsBase { assertNull(atoken.startingSurface); assertNull(atoken.startingWindow); assertNull(atoken.startingData); + atoken.forAllWindows(windowState -> { + assertFalse(windowState.getBaseType() == TYPE_APPLICATION_STARTING); + }, true); } @Test @@ -108,6 +117,22 @@ public class AppWindowContainerControllerTests extends WindowTestsBase { } @Test + public void testAddRemoveRace() throws Exception { + + // There was once a race condition between adding and removing starting windows + for (int i = 0; i < 1000; i++) { + final WindowTestUtils.TestAppWindowContainerController controller = + createAppWindowController(); + controller.addStartingWindow(InstrumentationRegistry.getContext().getPackageName(), + android.R.style.Theme, null, "Test", 0, 0, 0, 0, null, true, true, false, true, + false); + controller.removeStartingWindow(); + waitUntilHandlersIdle(); + assertNoStartingWindow(controller.getAppWindowToken(mDisplayContent)); + } + } + + @Test public void testTransferStartingWindow() throws Exception { final WindowTestUtils.TestAppWindowContainerController controller1 = createAppWindowController(); diff --git a/services/tests/servicestests/src/com/android/server/wm/TestWindowManagerPolicy.java b/services/tests/servicestests/src/com/android/server/wm/TestWindowManagerPolicy.java index 623d77ba57ed..c457cb30a2d3 100644 --- a/services/tests/servicestests/src/com/android/server/wm/TestWindowManagerPolicy.java +++ b/services/tests/servicestests/src/com/android/server/wm/TestWindowManagerPolicy.java @@ -637,5 +637,14 @@ class TestWindowManagerPolicy implements WindowManagerPolicy { @Override public void setRecentsVisibilityLw(boolean visible) { - } + } + + @Override + public void onSystemUiStarted() { + } + + @Override + public boolean canDismissBootAnimation() { + return true; + } } diff --git a/services/usage/java/com/android/server/usage/UsageStatsService.java b/services/usage/java/com/android/server/usage/UsageStatsService.java index 0de3c7c75016..073a17eacd3a 100644 --- a/services/usage/java/com/android/server/usage/UsageStatsService.java +++ b/services/usage/java/com/android/server/usage/UsageStatsService.java @@ -411,8 +411,8 @@ public class UsageStatsService extends SystemService implements } } - private boolean shouldObfuscateInstantAppsForCaller(int callingUid) { - return !mPackageManagerInternal.canAccessInstantApps(callingUid); + private boolean shouldObfuscateInstantAppsForCaller(int callingUid, int userId) { + return !mPackageManagerInternal.canAccessInstantApps(callingUid, userId); } void clearAppIdleForPackage(String packageName, int userId) { @@ -831,6 +831,9 @@ public class UsageStatsService extends SystemService implements final UserUsageStatsService service = getUserDataAndInitializeIfNeededLocked(userId, timeNow); List<UsageStats> list = service.queryUsageStats(bucketType, beginTime, endTime); + if (list == null) { + return null; + } // Mangle instant app names *using their current state (not whether they were ephemeral // when the data was recorded)*. @@ -1387,7 +1390,7 @@ public class UsageStatsService extends SystemService implements } final boolean obfuscateInstantApps = shouldObfuscateInstantAppsForCaller( - Binder.getCallingUid()); + Binder.getCallingUid(), UserHandle.getCallingUserId()); final int userId = UserHandle.getCallingUserId(); final long token = Binder.clearCallingIdentity(); @@ -1432,7 +1435,7 @@ public class UsageStatsService extends SystemService implements } final boolean obfuscateInstantApps = shouldObfuscateInstantAppsForCaller( - Binder.getCallingUid()); + Binder.getCallingUid(), UserHandle.getCallingUserId()); final int userId = UserHandle.getCallingUserId(); final long token = Binder.clearCallingIdentity(); @@ -1453,7 +1456,7 @@ public class UsageStatsService extends SystemService implements throw re.rethrowFromSystemServer(); } final boolean obfuscateInstantApps = shouldObfuscateInstantAppsForCaller( - Binder.getCallingUid()); + Binder.getCallingUid(), userId); final long token = Binder.clearCallingIdentity(); try { return UsageStatsService.this.isAppIdleFilteredOrParoled(packageName, userId, diff --git a/services/usb/java/com/android/server/usb/UsbDeviceManager.java b/services/usb/java/com/android/server/usb/UsbDeviceManager.java index 0a67669fc8cf..26a406fd8fe8 100644 --- a/services/usb/java/com/android/server/usb/UsbDeviceManager.java +++ b/services/usb/java/com/android/server/usb/UsbDeviceManager.java @@ -63,7 +63,6 @@ import java.io.IOException; import java.util.HashMap; import java.util.Locale; import java.util.Map; -import java.util.Random; import java.util.Scanner; import java.util.Set; @@ -538,7 +537,6 @@ public class UsbDeviceManager { oldFunctions = UsbManager.USB_FUNCTION_NONE; } - Slog.i(TAG, "Setting adb to " + String.valueOf(enable)); setEnabledFunctions(oldFunctions, true, mUsbDataUnlocked); updateAdbNotification(); } @@ -766,16 +764,15 @@ public class UsbDeviceManager { // send broadcast intent only if the USB state has changed if (!isUsbStateChanged(intent)) { - Slog.i(TAG, "skip broadcasting " + intent + " extras: " + intent.getExtras()); + if (DEBUG) { + Slog.d(TAG, "skip broadcasting " + intent + " extras: " + intent.getExtras()); + } return; } - mBroadcastedIntent = intent; - Random rand = new Random(); - intent.putExtra("random_tag", rand.nextInt(1000)); - Slog.i(TAG, "broadcasting " + intent + " extras: " + intent.getExtras()); + if (DEBUG) Slog.d(TAG, "broadcasting " + intent + " extras: " + intent.getExtras()); mContext.sendStickyBroadcastAsUser(intent, UserHandle.ALL); - intent.removeExtra("random_tag"); + mBroadcastedIntent = intent; } private void updateUsbFunctions() { @@ -844,7 +841,6 @@ public class UsbDeviceManager { updateUsbNotification(); updateAdbNotification(); if (mBootCompleted) { - Slog.i(TAG, "update state " + mConnected + " " + mConfigured); updateUsbStateBroadcastIfNeeded(false); } if (UsbManager.containsFunction(mCurrentFunctions, @@ -854,7 +850,6 @@ public class UsbDeviceManager { if (mBootCompleted) { if (!mConnected) { // restore defaults when USB is disconnected - Slog.i(TAG, "Disconnect, setting usb functions to null"); setEnabledFunctions(null, !mAdbEnabled, false); } updateUsbFunctions(); @@ -887,7 +882,6 @@ public class UsbDeviceManager { break; case MSG_SET_CURRENT_FUNCTIONS: String functions = (String) msg.obj; - Slog.i(TAG, "Getting setFunction command for " + functions); setEnabledFunctions(functions, false, msg.arg1 == 1); break; case MSG_UPDATE_USER_RESTRICTIONS: @@ -895,8 +889,6 @@ public class UsbDeviceManager { final boolean forceRestart = mUsbDataUnlocked && isUsbDataTransferActive() && !isUsbTransferAllowed(); - Slog.i(TAG, "Updating user restrictions, force restart is " - + String.valueOf(forceRestart)); setEnabledFunctions( mCurrentFunctions, forceRestart, mUsbDataUnlocked && !forceRestart); break; @@ -911,7 +903,6 @@ public class UsbDeviceManager { updateUsbStateBroadcastIfNeeded(false); mPendingBootBroadcast = false; } - Slog.i(TAG, "Boot complete, setting default functions"); setEnabledFunctions(null, false, false); if (mCurrentAccessory != null) { getCurrentSettings().accessoryAttached(mCurrentAccessory); @@ -929,7 +920,6 @@ public class UsbDeviceManager { Slog.v(TAG, "Current user switched to " + msg.arg1 + "; resetting USB host stack for MTP or PTP"); // avoid leaking sensitive data from previous user - Slog.i(TAG, "User Switched, kicking usb stack"); setEnabledFunctions(mCurrentFunctions, true, false); } mCurrentUser = msg.arg1; diff --git a/telecomm/java/android/telecom/ConnectionService.java b/telecomm/java/android/telecom/ConnectionService.java index bf8f8e4e723e..1ffc83fef55d 100644 --- a/telecomm/java/android/telecom/ConnectionService.java +++ b/telecomm/java/android/telecom/ConnectionService.java @@ -100,6 +100,7 @@ public abstract class ConnectionService extends Service { private static final String SESSION_ADD_CS_ADAPTER = "CS.aCSA"; private static final String SESSION_REMOVE_CS_ADAPTER = "CS.rCSA"; private static final String SESSION_CREATE_CONN = "CS.crCo"; + private static final String SESSION_CREATE_CONN_COMPLETE = "CS.crCoC"; private static final String SESSION_CREATE_CONN_FAILED = "CS.crCoF"; private static final String SESSION_ABORT = "CS.ab"; private static final String SESSION_ANSWER = "CS.an"; @@ -152,6 +153,7 @@ public abstract class ConnectionService extends Service { private static final int MSG_ON_START_RTT = 26; private static final int MSG_ON_STOP_RTT = 27; private static final int MSG_RTT_UPGRADE_RESPONSE = 28; + private static final int MSG_CREATE_CONNECTION_COMPLETE = 29; private static Connection sNullConnection; @@ -221,6 +223,19 @@ public abstract class ConnectionService extends Service { } @Override + public void createConnectionComplete(String id, Session.Info sessionInfo) { + Log.startSession(sessionInfo, SESSION_CREATE_CONN_COMPLETE); + try { + SomeArgs args = SomeArgs.obtain(); + args.arg1 = id; + args.arg2 = Log.createSubsession(); + mHandler.obtainMessage(MSG_CREATE_CONNECTION_COMPLETE, args).sendToTarget(); + } finally { + Log.endSession(); + } + } + + @Override public void createConnectionFailed( PhoneAccountHandle connectionManagerPhoneAccount, String callId, @@ -630,6 +645,33 @@ public abstract class ConnectionService extends Service { } break; } + case MSG_CREATE_CONNECTION_COMPLETE: { + SomeArgs args = (SomeArgs) msg.obj; + Log.continueSession((Session) args.arg2, + SESSION_HANDLER + SESSION_CREATE_CONN_COMPLETE); + try { + final String id = (String) args.arg1; + if (!mAreAccountsInitialized) { + Log.d(this, "Enqueueing pre-init request %s", id); + mPreInitializationConnectionRequests.add( + new android.telecom.Logging.Runnable( + SESSION_HANDLER + SESSION_CREATE_CONN_COMPLETE + + ".pICR", + null /*lock*/) { + @Override + public void loggedRun() { + notifyCreateConnectionComplete(id); + } + }.prepare()); + } else { + notifyCreateConnectionComplete(id); + } + } finally { + args.recycle(); + Log.endSession(); + } + break; + } case MSG_CREATE_CONNECTION_FAILED: { SomeArgs args = (SomeArgs) msg.obj; Log.continueSession((Session) args.arg3, SESSION_HANDLER + @@ -1373,6 +1415,17 @@ public abstract class ConnectionService extends Service { } } + /** + * Called by Telecom when the creation of a new Connection has completed and it is now added + * to Telecom. + * @param callId The ID of the connection. + */ + private void notifyCreateConnectionComplete(final String callId) { + Log.i(this, "notifyCreateConnectionComplete %s", callId); + onCreateConnectionComplete(findConnectionForAction(callId, + "notifyCreateConnectionComplete")); + } + private void abort(String callId) { Log.d(this, "abort %s", callId); findConnectionForAction(callId, "abort").onAbort(); @@ -1836,6 +1889,18 @@ public abstract class ConnectionService extends Service { } /** + * Called after the {@link Connection} returned by + * {@link #onCreateIncomingConnection(PhoneAccountHandle, ConnectionRequest)} + * or {@link #onCreateOutgoingConnection(PhoneAccountHandle, ConnectionRequest)} has been + * added to the {@link ConnectionService} and sent to Telecom. + * + * @param connection the {@link Connection}. + * @hide + */ + public void onCreateConnectionComplete(Connection connection) { + } + + /** * Called by Telecom to inform the {@link ConnectionService} that its request to create a new * incoming {@link Connection} was denied. * <p> diff --git a/telecomm/java/com/android/internal/telecom/IConnectionService.aidl b/telecomm/java/com/android/internal/telecom/IConnectionService.aidl index c631d085f6e7..e428286ad1e3 100644 --- a/telecomm/java/com/android/internal/telecom/IConnectionService.aidl +++ b/telecomm/java/com/android/internal/telecom/IConnectionService.aidl @@ -47,6 +47,8 @@ oneway interface IConnectionService { boolean isUnknown, in Session.Info sessionInfo); + void createConnectionComplete(String callId, in Session.Info sessionInfo); + void createConnectionFailed(in PhoneAccountHandle connectionManagerPhoneAccount, String callId, in ConnectionRequest request, boolean isIncoming, in Session.Info sessionInfo); diff --git a/tests/net/java/com/android/server/connectivity/tethering/TetheringConfigurationTest.java b/tests/net/java/com/android/server/connectivity/tethering/TetheringConfigurationTest.java index 9fcd1b52b8fe..ddceea20ad21 100644 --- a/tests/net/java/com/android/server/connectivity/tethering/TetheringConfigurationTest.java +++ b/tests/net/java/com/android/server/connectivity/tethering/TetheringConfigurationTest.java @@ -128,5 +128,8 @@ public class TetheringConfigurationTest { assertTrue(cfg.preferredUpstreamIfaceTypes.contains(TYPE_MOBILE_DUN)); // Just to prove we haven't clobbered Wi-Fi: assertTrue(cfg.preferredUpstreamIfaceTypes.contains(TYPE_WIFI)); + // Check that we have not added new cellular interface types + assertFalse(cfg.preferredUpstreamIfaceTypes.contains(TYPE_MOBILE)); + assertFalse(cfg.preferredUpstreamIfaceTypes.contains(TYPE_MOBILE_HIPRI)); } } diff --git a/wifi/java/android/net/wifi/IWifiManager.aidl b/wifi/java/android/net/wifi/IWifiManager.aidl index d942d056a316..088cbc6d4a4c 100644 --- a/wifi/java/android/net/wifi/IWifiManager.aidl +++ b/wifi/java/android/net/wifi/IWifiManager.aidl @@ -131,7 +131,7 @@ interface IWifiManager boolean stopSoftAp(); - int startLocalOnlyHotspot(in Messenger messenger, in IBinder binder); + int startLocalOnlyHotspot(in Messenger messenger, in IBinder binder, in String packageName); void stopLocalOnlyHotspot(); diff --git a/wifi/java/android/net/wifi/WifiManager.java b/wifi/java/android/net/wifi/WifiManager.java index cda078ab9b2b..25d61af4fabf 100644 --- a/wifi/java/android/net/wifi/WifiManager.java +++ b/wifi/java/android/net/wifi/WifiManager.java @@ -1899,7 +1899,9 @@ public class WifiManager { LocalOnlyHotspotCallbackProxy proxy = new LocalOnlyHotspotCallbackProxy(this, looper, callback); try { - int returnCode = mService.startLocalOnlyHotspot(proxy.getMessenger(), new Binder()); + String packageName = mContext.getOpPackageName(); + int returnCode = mService.startLocalOnlyHotspot( + proxy.getMessenger(), new Binder(), packageName); if (returnCode != LocalOnlyHotspotCallback.REQUEST_REGISTERED) { // Send message to the proxy to make sure we call back on the correct thread proxy.notifyFailed(returnCode); diff --git a/wifi/java/android/net/wifi/p2p/nsd/WifiP2pServiceResponse.java b/wifi/java/android/net/wifi/p2p/nsd/WifiP2pServiceResponse.java index a0b5a6e6bad9..1020fd2cd507 100644 --- a/wifi/java/android/net/wifi/p2p/nsd/WifiP2pServiceResponse.java +++ b/wifi/java/android/net/wifi/p2p/nsd/WifiP2pServiceResponse.java @@ -186,31 +186,23 @@ public class WifiP2pServiceResponse implements Parcelable { /** * Create the list of WifiP2pServiceResponse instance from supplicant event. * - * <pre>The format is as follows. - * P2P-SERV-DISC-RESP <address> <update indicator> <response data> - * e.g) P2P-SERV-DISC-RESP 02:03:7f:11:62:da 1 0300000101 - * - * @param supplicantEvent wpa_supplicant event string. + * @param srcAddr source address of the service response + * @param tlvsBin byte array containing the binary tlvs data * @return if parse failed, return null * @hide */ - public static List<WifiP2pServiceResponse> newInstance(String supplicantEvent) { + public static List<WifiP2pServiceResponse> newInstance(String srcAddr, byte[] tlvsBin) { + //updateIndicator not used, and not passed up from supplicant List<WifiP2pServiceResponse> respList = new ArrayList<WifiP2pServiceResponse>(); - String[] args = supplicantEvent.split(" "); - if (args.length != 4) { - return null; - } WifiP2pDevice dev = new WifiP2pDevice(); - String srcAddr = args[1]; dev.deviceAddress = srcAddr; - //String updateIndicator = args[2];//not used. - byte[] bin = hexStr2Bin(args[3]); - if (bin == null) { + if (tlvsBin == null) { return null; } - DataInputStream dis = new DataInputStream(new ByteArrayInputStream(bin)); + + DataInputStream dis = new DataInputStream(new ByteArrayInputStream(tlvsBin)); try { while (dis.available() > 0) { /* diff --git a/wifi/tests/src/android/net/wifi/WifiManagerTest.java b/wifi/tests/src/android/net/wifi/WifiManagerTest.java index adf897d29751..84ac1183c897 100644 --- a/wifi/tests/src/android/net/wifi/WifiManagerTest.java +++ b/wifi/tests/src/android/net/wifi/WifiManagerTest.java @@ -58,6 +58,7 @@ public class WifiManagerTest { private static final int ERROR_NOT_SET = -1; private static final int ERROR_TEST_REASON = 5; + private static final String TEST_PACKAGE_NAME = "TestPackage"; @Mock Context mContext; @Mock IWifiManager mWifiService; @@ -76,6 +77,7 @@ public class WifiManagerTest { mLooper = new TestLooper(); mHandler = spy(new Handler(mLooper.getLooper())); when(mContext.getApplicationInfo()).thenReturn(mApplicationInfo); + when(mContext.getOpPackageName()).thenReturn(TEST_PACKAGE_NAME); mWifiServiceMessenger = new Messenger(mHandler); mWifiManager = new WifiManager(mContext, mWifiService, mLooper.getLooper()); @@ -126,8 +128,8 @@ public class WifiManagerTest { @Test public void testCreationAndCloseOfLocalOnlyHotspotReservation() throws Exception { TestLocalOnlyHotspotCallback callback = new TestLocalOnlyHotspotCallback(); - when(mWifiService.startLocalOnlyHotspot(any(Messenger.class), any(IBinder.class))) - .thenReturn(REQUEST_REGISTERED); + when(mWifiService.startLocalOnlyHotspot(any(Messenger.class), any(IBinder.class), + anyString())).thenReturn(REQUEST_REGISTERED); mWifiManager.startLocalOnlyHotspot(callback, mHandler); callback.onStarted(mWifiManager.new LocalOnlyHotspotReservation(mApConfig)); @@ -144,8 +146,8 @@ public class WifiManagerTest { public void testLocalOnlyHotspotReservationCallsStopProperlyInTryWithResources() throws Exception { TestLocalOnlyHotspotCallback callback = new TestLocalOnlyHotspotCallback(); - when(mWifiService.startLocalOnlyHotspot(any(Messenger.class), any(IBinder.class))) - .thenReturn(REQUEST_REGISTERED); + when(mWifiService.startLocalOnlyHotspot(any(Messenger.class), any(IBinder.class), + anyString())).thenReturn(REQUEST_REGISTERED); mWifiManager.startLocalOnlyHotspot(callback, mHandler); callback.onStarted(mWifiManager.new LocalOnlyHotspotReservation(mApConfig)); @@ -304,7 +306,8 @@ public class WifiManagerTest { TestLocalOnlyHotspotCallback callback = new TestLocalOnlyHotspotCallback(); mWifiManager.startLocalOnlyHotspot(callback, mHandler); - verify(mWifiService).startLocalOnlyHotspot(any(Messenger.class), any(IBinder.class)); + verify(mWifiService) + .startLocalOnlyHotspot(any(Messenger.class), any(IBinder.class), anyString()); } /** @@ -315,7 +318,7 @@ public class WifiManagerTest { public void testStartLocalOnlyHotspotThrowsSecurityException() throws Exception { TestLocalOnlyHotspotCallback callback = new TestLocalOnlyHotspotCallback(); doThrow(new SecurityException()).when(mWifiService) - .startLocalOnlyHotspot(any(Messenger.class), any(IBinder.class)); + .startLocalOnlyHotspot(any(Messenger.class), any(IBinder.class), anyString()); mWifiManager.startLocalOnlyHotspot(callback, mHandler); } @@ -327,7 +330,7 @@ public class WifiManagerTest { public void testStartLocalOnlyHotspotThrowsIllegalStateException() throws Exception { TestLocalOnlyHotspotCallback callback = new TestLocalOnlyHotspotCallback(); doThrow(new IllegalStateException()).when(mWifiService) - .startLocalOnlyHotspot(any(Messenger.class), any(IBinder.class)); + .startLocalOnlyHotspot(any(Messenger.class), any(IBinder.class), anyString()); mWifiManager.startLocalOnlyHotspot(callback, mHandler); } @@ -337,8 +340,8 @@ public class WifiManagerTest { @Test public void testCorrectLooperIsUsedForHandler() throws Exception { TestLocalOnlyHotspotCallback callback = new TestLocalOnlyHotspotCallback(); - when(mWifiService.startLocalOnlyHotspot(any(Messenger.class), any(IBinder.class))) - .thenReturn(ERROR_INCOMPATIBLE_MODE); + when(mWifiService.startLocalOnlyHotspot(any(Messenger.class), any(IBinder.class), + anyString())).thenReturn(ERROR_INCOMPATIBLE_MODE); mWifiManager.startLocalOnlyHotspot(callback, mHandler); mLooper.dispatchAll(); assertEquals(ERROR_INCOMPATIBLE_MODE, callback.mFailureReason); @@ -355,8 +358,8 @@ public class WifiManagerTest { TestLooper altLooper = new TestLooper(); when(mContext.getMainLooper()).thenReturn(altLooper.getLooper()); TestLocalOnlyHotspotCallback callback = new TestLocalOnlyHotspotCallback(); - when(mWifiService.startLocalOnlyHotspot(any(Messenger.class), any(IBinder.class))) - .thenReturn(ERROR_INCOMPATIBLE_MODE); + when(mWifiService.startLocalOnlyHotspot(any(Messenger.class), any(IBinder.class), + anyString())).thenReturn(ERROR_INCOMPATIBLE_MODE); mWifiManager.startLocalOnlyHotspot(callback, null); altLooper.dispatchAll(); assertEquals(ERROR_INCOMPATIBLE_MODE, callback.mFailureReason); @@ -374,7 +377,7 @@ public class WifiManagerTest { TestLooper callbackLooper = new TestLooper(); Handler callbackHandler = new Handler(callbackLooper.getLooper()); when(mWifiService.startLocalOnlyHotspot(mMessengerCaptor.capture(), - any(IBinder.class))).thenReturn(REQUEST_REGISTERED); + any(IBinder.class), anyString())).thenReturn(REQUEST_REGISTERED); mWifiManager.startLocalOnlyHotspot(callback, callbackHandler); callbackLooper.dispatchAll(); mLooper.dispatchAll(); @@ -401,7 +404,7 @@ public class WifiManagerTest { TestLooper callbackLooper = new TestLooper(); Handler callbackHandler = new Handler(callbackLooper.getLooper()); when(mWifiService.startLocalOnlyHotspot(mMessengerCaptor.capture(), - any(IBinder.class))).thenReturn(REQUEST_REGISTERED); + any(IBinder.class), anyString())).thenReturn(REQUEST_REGISTERED); mWifiManager.startLocalOnlyHotspot(callback, callbackHandler); callbackLooper.dispatchAll(); mLooper.dispatchAll(); @@ -426,7 +429,7 @@ public class WifiManagerTest { TestLooper callbackLooper = new TestLooper(); Handler callbackHandler = new Handler(callbackLooper.getLooper()); when(mWifiService.startLocalOnlyHotspot(mMessengerCaptor.capture(), - any(IBinder.class))).thenReturn(REQUEST_REGISTERED); + any(IBinder.class), anyString())).thenReturn(REQUEST_REGISTERED); mWifiManager.startLocalOnlyHotspot(callback, callbackHandler); callbackLooper.dispatchAll(); mLooper.dispatchAll(); @@ -449,7 +452,7 @@ public class WifiManagerTest { TestLooper callbackLooper = new TestLooper(); Handler callbackHandler = new Handler(callbackLooper.getLooper()); when(mWifiService.startLocalOnlyHotspot(mMessengerCaptor.capture(), - any(IBinder.class))).thenReturn(REQUEST_REGISTERED); + any(IBinder.class), anyString())).thenReturn(REQUEST_REGISTERED); mWifiManager.startLocalOnlyHotspot(callback, callbackHandler); callbackLooper.dispatchAll(); mLooper.dispatchAll(); @@ -470,8 +473,8 @@ public class WifiManagerTest { @Test public void testLocalOnlyHotspotCallbackFullOnIncompatibleMode() throws Exception { TestLocalOnlyHotspotCallback callback = new TestLocalOnlyHotspotCallback(); - when(mWifiService.startLocalOnlyHotspot(any(Messenger.class), any(IBinder.class))) - .thenReturn(ERROR_INCOMPATIBLE_MODE); + when(mWifiService.startLocalOnlyHotspot(any(Messenger.class), any(IBinder.class), + anyString())).thenReturn(ERROR_INCOMPATIBLE_MODE); mWifiManager.startLocalOnlyHotspot(callback, mHandler); mLooper.dispatchAll(); assertEquals(ERROR_INCOMPATIBLE_MODE, callback.mFailureReason); @@ -486,8 +489,8 @@ public class WifiManagerTest { @Test public void testLocalOnlyHotspotCallbackFullOnTetheringDisallowed() throws Exception { TestLocalOnlyHotspotCallback callback = new TestLocalOnlyHotspotCallback(); - when(mWifiService.startLocalOnlyHotspot(any(Messenger.class), any(IBinder.class))) - .thenReturn(ERROR_TETHERING_DISALLOWED); + when(mWifiService.startLocalOnlyHotspot(any(Messenger.class), any(IBinder.class), + anyString())).thenReturn(ERROR_TETHERING_DISALLOWED); mWifiManager.startLocalOnlyHotspot(callback, mHandler); mLooper.dispatchAll(); assertEquals(ERROR_TETHERING_DISALLOWED, callback.mFailureReason); @@ -504,7 +507,7 @@ public class WifiManagerTest { public void testLocalOnlyHotspotCallbackFullOnSecurityException() throws Exception { TestLocalOnlyHotspotCallback callback = new TestLocalOnlyHotspotCallback(); doThrow(new SecurityException()).when(mWifiService) - .startLocalOnlyHotspot(any(Messenger.class), any(IBinder.class)); + .startLocalOnlyHotspot(any(Messenger.class), any(IBinder.class), anyString()); try { mWifiManager.startLocalOnlyHotspot(callback, mHandler); } catch (SecurityException e) { @@ -524,8 +527,8 @@ public class WifiManagerTest { @Test public void testLocalOnlyHotspotCallbackFullOnNoChannelError() throws Exception { TestLocalOnlyHotspotCallback callback = new TestLocalOnlyHotspotCallback(); - when(mWifiService.startLocalOnlyHotspot(any(Messenger.class), any(IBinder.class))) - .thenReturn(REQUEST_REGISTERED); + when(mWifiService.startLocalOnlyHotspot(any(Messenger.class), any(IBinder.class), + anyString())).thenReturn(REQUEST_REGISTERED); mWifiManager.startLocalOnlyHotspot(callback, mHandler); mLooper.dispatchAll(); //assertEquals(ERROR_NO_CHANNEL, callback.mFailureReason); @@ -540,8 +543,8 @@ public class WifiManagerTest { @Test public void testCancelLocalOnlyHotspotRequestCallsStopOnWifiService() throws Exception { TestLocalOnlyHotspotCallback callback = new TestLocalOnlyHotspotCallback(); - when(mWifiService.startLocalOnlyHotspot(any(Messenger.class), any(IBinder.class))) - .thenReturn(REQUEST_REGISTERED); + when(mWifiService.startLocalOnlyHotspot(any(Messenger.class), any(IBinder.class), + anyString())).thenReturn(REQUEST_REGISTERED); mWifiManager.startLocalOnlyHotspot(callback, mHandler); mWifiManager.cancelLocalOnlyHotspotRequest(); verify(mWifiService).stopLocalOnlyHotspot(); @@ -562,8 +565,8 @@ public class WifiManagerTest { @Test public void testCallbackAfterLocalOnlyHotspotWasCancelled() throws Exception { TestLocalOnlyHotspotCallback callback = new TestLocalOnlyHotspotCallback(); - when(mWifiService.startLocalOnlyHotspot(any(Messenger.class), any(IBinder.class))) - .thenReturn(REQUEST_REGISTERED); + when(mWifiService.startLocalOnlyHotspot(any(Messenger.class), any(IBinder.class), + anyString())).thenReturn(REQUEST_REGISTERED); mWifiManager.startLocalOnlyHotspot(callback, mHandler); mWifiManager.cancelLocalOnlyHotspotRequest(); verify(mWifiService).stopLocalOnlyHotspot(); @@ -581,8 +584,8 @@ public class WifiManagerTest { @Test public void testCancelAfterLocalOnlyHotspotCallbackTriggered() throws Exception { TestLocalOnlyHotspotCallback callback = new TestLocalOnlyHotspotCallback(); - when(mWifiService.startLocalOnlyHotspot(any(Messenger.class), any(IBinder.class))) - .thenReturn(ERROR_INCOMPATIBLE_MODE); + when(mWifiService.startLocalOnlyHotspot(any(Messenger.class), any(IBinder.class), + anyString())).thenReturn(ERROR_INCOMPATIBLE_MODE); mWifiManager.startLocalOnlyHotspot(callback, mHandler); mLooper.dispatchAll(); assertEquals(ERROR_INCOMPATIBLE_MODE, callback.mFailureReason); |