diff options
132 files changed, 1072 insertions, 422 deletions
diff --git a/Android.mk b/Android.mk index fb08395dce6c..61df64e3892b 100644 --- a/Android.mk +++ b/Android.mk @@ -75,6 +75,7 @@ LOCAL_SRC_FILES += \ core/java/android/app/IAppTask.aidl \ core/java/android/app/ITaskStackListener.aidl \ core/java/android/app/IBackupAgent.aidl \ + core/java/android/app/IEphemeralResolver.aidl \ core/java/android/app/IInstrumentationWatcher.aidl \ core/java/android/app/INotificationManager.aidl \ core/java/android/app/IProcessObserver.aidl \ @@ -305,7 +306,6 @@ LOCAL_SRC_FILES += \ core/java/com/android/internal/app/IAppOpsService.aidl \ core/java/com/android/internal/app/IAssistScreenshotReceiver.aidl \ core/java/com/android/internal/app/IBatteryStats.aidl \ - core/java/com/android/internal/app/IEphemeralResolver.aidl \ core/java/com/android/internal/app/ISoundTriggerService.aidl \ core/java/com/android/internal/app/IVoiceInteractionManagerService.aidl \ core/java/com/android/internal/app/IVoiceInteractionSessionListener.aidl \ diff --git a/api/system-current.txt b/api/system-current.txt index 6cd602057e3e..4f512a08816d 100644 --- a/api/system-current.txt +++ b/api/system-current.txt @@ -4525,6 +4525,15 @@ package android.app { field public static final int VISIBILITY_VISIBLE_NOTIFY_ONLY_COMPLETION = 3; // 0x3 } + public abstract class EphemeralResolverService extends android.app.Service { + ctor public EphemeralResolverService(); + method public final void attachBaseContext(android.content.Context); + method public final android.os.IBinder onBind(android.content.Intent); + method public abstract java.util.List<android.content.pm.EphemeralResolveInfo> onEphemeralResolveInfoList(int[], int); + field public static final java.lang.String EXTRA_RESOLVE_INFO = "android.app.extra.RESOLVE_INFO"; + field public static final java.lang.String EXTRA_SEQUENCE = "android.app.extra.SEQUENCE"; + } + public class ExpandableListActivity extends android.app.Activity implements android.widget.ExpandableListView.OnChildClickListener android.widget.ExpandableListView.OnGroupCollapseListener android.widget.ExpandableListView.OnGroupExpandListener android.view.View.OnCreateContextMenuListener { ctor public ExpandableListActivity(); method public android.widget.ExpandableListAdapter getExpandableListAdapter(); diff --git a/core/java/com/android/internal/app/EphemeralResolveInfo.aidl b/core/java/android/app/EphemeralResolveInfo.aidl index 529527bd394b..db71d250ade2 100644 --- a/core/java/com/android/internal/app/EphemeralResolveInfo.aidl +++ b/core/java/android/app/EphemeralResolveInfo.aidl @@ -14,6 +14,6 @@ ** limitations under the License. */ -package com.android.internal.app; +package android.app; parcelable EphemeralResolveInfo; diff --git a/core/java/com/android/internal/app/EphemeralResolverService.java b/core/java/android/app/EphemeralResolverService.java index 68724a7fc4d2..ba791085d617 100644 --- a/core/java/com/android/internal/app/EphemeralResolverService.java +++ b/core/java/android/app/EphemeralResolverService.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package com.android.internal.app; +package android.app; import android.annotation.SystemApi; import android.app.Service; @@ -37,9 +37,9 @@ import java.util.List; */ @SystemApi public abstract class EphemeralResolverService extends Service { - public static final String EXTRA_RESOLVE_INFO = "com.android.internal.app.RESOLVE_INFO"; - public static final String EXTRA_SEQUENCE = "com.android.internal.app.SEQUENCE"; - private static final String EXTRA_PREFIX = "com.android.internal.app.PREFIX"; + public static final String EXTRA_RESOLVE_INFO = "android.app.extra.RESOLVE_INFO"; + public static final String EXTRA_SEQUENCE = "android.app.extra.SEQUENCE"; + private static final String EXTRA_PREFIX = "android.app.PREFIX"; private Handler mHandler; /** @@ -50,11 +50,11 @@ public abstract class EphemeralResolverService extends Service { * be used when comparing against the digest prefixes as all bits might * not be set. */ - protected abstract List<EphemeralResolveInfo> getEphemeralResolveInfoList( + public abstract List<EphemeralResolveInfo> onEphemeralResolveInfoList( int digestPrefix[], int prefixMask); @Override - protected final void attachBaseContext(Context base) { + public final void attachBaseContext(Context base) { super.attachBaseContext(base); mHandler = new ServiceHandler(base.getMainLooper()); } @@ -91,7 +91,7 @@ public abstract class EphemeralResolverService extends Service { final IRemoteCallback callback = (IRemoteCallback) message.obj; final int[] digestPrefix = message.getData().getIntArray(EXTRA_PREFIX); final List<EphemeralResolveInfo> resolveInfo = - getEphemeralResolveInfoList(digestPrefix, message.arg1); + onEphemeralResolveInfoList(digestPrefix, message.arg1); final Bundle data = new Bundle(); data.putInt(EXTRA_SEQUENCE, message.arg2); data.putParcelableList(EXTRA_RESOLVE_INFO, resolveInfo); diff --git a/core/java/com/android/internal/app/IEphemeralResolver.aidl b/core/java/android/app/IEphemeralResolver.aidl index 9ff1322765f4..ee869eaa7936 100644 --- a/core/java/com/android/internal/app/IEphemeralResolver.aidl +++ b/core/java/android/app/IEphemeralResolver.aidl @@ -14,11 +14,11 @@ * limitations under the License. */ -package com.android.internal.app; +package android.app; -import android.content.Intent; import android.os.IRemoteCallback; +/** @hide */ oneway interface IEphemeralResolver { void getEphemeralResolveInfoList(IRemoteCallback callback, in int[] digestPrefix, int prefixMask, int sequence); diff --git a/core/java/android/app/Notification.java b/core/java/android/app/Notification.java index 4802b29bdeec..6e01922d20bf 100644 --- a/core/java/android/app/Notification.java +++ b/core/java/android/app/Notification.java @@ -4424,9 +4424,15 @@ public class Notification implements Parcelable // mN.mLargeIcon // 2. !mBigLargeIconSet -> mN.mLargeIcon applies Icon oldLargeIcon = null; + Bitmap largeIconLegacy = null; if (mBigLargeIconSet) { oldLargeIcon = mBuilder.mN.mLargeIcon; mBuilder.mN.mLargeIcon = mBigLargeIcon; + // The legacy largeIcon might not allow us to clear the image, as it's taken in + // replacement if the other one is null. Because we're restoring these legacy icons + // for old listeners, this is in general non-null. + largeIconLegacy = mBuilder.mN.largeIcon; + mBuilder.mN.largeIcon = null; } RemoteViews contentView = getStandardView(mBuilder.getBigPictureLayoutResource()); @@ -4438,6 +4444,7 @@ public class Notification implements Parcelable if (mBigLargeIconSet) { mBuilder.mN.mLargeIcon = oldLargeIcon; + mBuilder.mN.largeIcon = largeIconLegacy; } contentView.setImageViewBitmap(R.id.big_picture, mPicture); diff --git a/core/java/android/app/backup/FullBackup.java b/core/java/android/app/backup/FullBackup.java index 478024d7d27c..76828eeba785 100644 --- a/core/java/android/app/backup/FullBackup.java +++ b/core/java/android/app/backup/FullBackup.java @@ -21,6 +21,8 @@ import android.content.pm.PackageManager; import android.content.res.XmlResourceParser; import android.os.ParcelFileDescriptor; import android.os.Process; +import android.os.storage.StorageManager; +import android.os.storage.StorageVolume; import android.system.ErrnoException; import android.system.Os; import android.text.TextUtils; @@ -223,8 +225,12 @@ public class FullBackup { final int mFullBackupContent; final PackageManager mPackageManager; + final StorageManager mStorageManager; final String mPackageName; + // lazy initialized, only when needed + private StorageVolume[] mVolumes = null; + /** * Parse out the semantic domains into the correct physical location. */ @@ -260,16 +266,41 @@ public class FullBackup { } else { return null; } + } else if (domainToken.startsWith(FullBackup.SHARED_PREFIX)) { + return sharedDomainToPath(domainToken); } // Not a supported location Log.i(TAG, "Unrecognized domain " + domainToken); return null; - } catch (IOException e) { + } catch (Exception e) { Log.i(TAG, "Error reading directory for domain: " + domainToken); return null; } } + + private String sharedDomainToPath(String domain) throws IOException { + // already known to start with SHARED_PREFIX, so we just look after that + final String volume = domain.substring(FullBackup.SHARED_PREFIX.length()); + final StorageVolume[] volumes = getVolumeList(); + final int volNum = Integer.parseInt(volume); + if (volNum < mVolumes.length) { + return volumes[volNum].getPathFile().getCanonicalPath(); + } + return null; + } + + private StorageVolume[] getVolumeList() { + if (mStorageManager != null) { + if (mVolumes == null) { + mVolumes = mStorageManager.getVolumeList(); + } + } else { + Log.e(TAG, "Unable to access Storage Manager"); + } + return mVolumes; + } + /** * A map of domain -> list of canonical file names in that domain that are to be included. * We keep track of the domain so that we can go through the file system in order later on. @@ -283,6 +314,7 @@ public class FullBackup { BackupScheme(Context context) { mFullBackupContent = context.getApplicationInfo().fullBackupContent; + mStorageManager = (StorageManager) context.getSystemService(Context.STORAGE_SERVICE); mPackageManager = context.getPackageManager(); mPackageName = context.getPackageName(); diff --git a/core/java/android/os/BatteryStats.java b/core/java/android/os/BatteryStats.java index f0cc3905e991..a0c2efd407ba 100644 --- a/core/java/android/os/BatteryStats.java +++ b/core/java/android/os/BatteryStats.java @@ -30,6 +30,8 @@ import android.content.pm.ApplicationInfo; import android.telephony.SignalStrength; import android.text.format.DateFormat; import android.util.ArrayMap; +import android.util.Log; +import android.util.LongSparseArray; import android.util.MutableBoolean; import android.util.Pair; import android.util.Printer; @@ -47,6 +49,7 @@ import com.android.internal.os.BatteryStatsHelper; * @hide */ public abstract class BatteryStats implements Parcelable { + private static final String TAG = "BatteryStats"; private static final boolean LOCAL_LOGV = false; @@ -175,8 +178,11 @@ public abstract class BatteryStats implements Parcelable { /** * Current version of checkin data format. + * + * New in version 19: + * - Wakelock data (wl) gets current and max times. */ - static final String CHECKIN_VERSION = "18"; + static final String CHECKIN_VERSION = "19"; /** * Old version, we hit 9 and ran out of room, need to remove. @@ -352,6 +358,32 @@ public abstract class BatteryStats implements Parcelable { public abstract long getTimeSinceMarkLocked(long elapsedRealtimeUs); /** + * Returns the max duration if it is being tracked. + * Not all Timer subclasses track the max duration and the current duration. + + */ + public long getMaxDurationMsLocked(long elapsedRealtimeMs) { + return -1; + } + + /** + * Returns the current time the timer has been active, if it is being tracked. + * Not all Timer subclasses track the max duration and the current duration. + */ + public long getCurrentDurationMsLocked(long elapsedRealtimeMs) { + return -1; + } + + /** + * Returns whether the timer is currently running. Some types of timers + * (e.g. BatchTimers) don't know whether the event is currently active, + * and report false. + */ + public boolean isRunningLocked() { + return false; + } + + /** * Temporary for debugging. */ public abstract void logState(Printer pw, String prefix); @@ -2558,6 +2590,22 @@ public abstract class BatteryStats implements Parcelable { sb.append('('); sb.append(count); sb.append(" times)"); + final long maxDurationMs = timer.getMaxDurationMsLocked(elapsedRealtimeUs/1000); + if (maxDurationMs >= 0) { + sb.append(" max="); + sb.append(maxDurationMs); + } + if (timer.isRunningLocked()) { + final long currentMs = timer.getCurrentDurationMsLocked(elapsedRealtimeUs/1000); + if (currentMs >= 0) { + sb.append(" (running for "); + sb.append(currentMs); + sb.append("ms)"); + } else { + sb.append(" (running)"); + } + } + return ", "; } } @@ -2565,6 +2613,7 @@ public abstract class BatteryStats implements Parcelable { } /** + * Prints details about a timer, if its total time was greater than 0. * * @param pw a PrintWriter object to print to. * @param sb a StringBuilder object. @@ -2573,24 +2622,40 @@ public abstract class BatteryStats implements Parcelable { * @param which which one of STATS_SINCE_CHARGED, STATS_SINCE_UNPLUGGED, or STATS_CURRENT. * @param prefix a String to be prepended to each line of output. * @param type the name of the timer. + * @return true if anything was printed. */ private static final boolean printTimer(PrintWriter pw, StringBuilder sb, Timer timer, - long rawRealtime, int which, String prefix, String type) { + long rawRealtimeUs, int which, String prefix, String type) { if (timer != null) { // Convert from microseconds to milliseconds with rounding - final long totalTime = (timer.getTotalTimeLocked( - rawRealtime, which) + 500) / 1000; + final long totalTimeMs = (timer.getTotalTimeLocked( + rawRealtimeUs, which) + 500) / 1000; final int count = timer.getCountLocked(which); - if (totalTime != 0) { + if (totalTimeMs != 0) { sb.setLength(0); sb.append(prefix); sb.append(" "); sb.append(type); sb.append(": "); - formatTimeMs(sb, totalTime); + formatTimeMs(sb, totalTimeMs); sb.append("realtime ("); sb.append(count); sb.append(" times)"); + final long maxDurationMs = timer.getMaxDurationMsLocked(rawRealtimeUs/1000); + if (maxDurationMs >= 0) { + sb.append(" max="); + sb.append(maxDurationMs); + } + if (timer.isRunningLocked()) { + final long currentMs = timer.getCurrentDurationMsLocked(rawRealtimeUs/1000); + if (currentMs >= 0) { + sb.append(" (running for "); + sb.append(currentMs); + sb.append("ms)"); + } else { + sb.append(" (running)"); + } + } pw.println(sb.toString()); return true; } @@ -2613,15 +2678,23 @@ public abstract class BatteryStats implements Parcelable { long elapsedRealtimeUs, String name, int which, String linePrefix) { long totalTimeMicros = 0; int count = 0; + long max = -1; + long current = -1; if (timer != null) { totalTimeMicros = timer.getTotalTimeLocked(elapsedRealtimeUs, which); count = timer.getCountLocked(which); + current = timer.getCurrentDurationMsLocked(elapsedRealtimeUs/1000); + max = timer.getMaxDurationMsLocked(elapsedRealtimeUs/1000); } sb.append(linePrefix); sb.append((totalTimeMicros + 500) / 1000); // microseconds to milliseconds with rounding sb.append(','); sb.append(name != null ? name + "," : ""); sb.append(count); + sb.append(','); + sb.append(current); + sb.append(','); + sb.append(max); return ","; } diff --git a/core/java/android/view/View.java b/core/java/android/view/View.java index 0cdf5e115e3a..e7553ec943ec 100644 --- a/core/java/android/view/View.java +++ b/core/java/android/view/View.java @@ -9888,6 +9888,9 @@ public class View implements Drawable.Callback, KeyEvent.Callback, public void dispatchFinishTemporaryDetach() { onFinishTemporaryDetach(); mPrivateFlags3 &= ~PFLAG3_TEMPORARY_DETACH; + if (hasWindowFocus() && hasFocus()) { + InputMethodManager.getInstance().focusIn(this); + } } /** diff --git a/core/java/android/view/WindowManager.java b/core/java/android/view/WindowManager.java index fe2423093c88..1b37ed47c392 100644 --- a/core/java/android/view/WindowManager.java +++ b/core/java/android/view/WindowManager.java @@ -636,7 +636,7 @@ public interface WindowManager extends ViewManager { /** * Window type: shares similar characteristics with {@link #TYPE_DREAM}. The layer is - * reserved for screenshot region selection. + * reserved for screenshot region selection. These windows must not take input focus. * @hide */ public static final int TYPE_SCREENSHOT = FIRST_SYSTEM_WINDOW + 36; diff --git a/core/java/android/view/WindowManagerPolicy.java b/core/java/android/view/WindowManagerPolicy.java index 9a8c8a86499a..17d306eb8857 100644 --- a/core/java/android/view/WindowManagerPolicy.java +++ b/core/java/android/view/WindowManagerPolicy.java @@ -136,6 +136,12 @@ public interface WindowManagerPolicy { throws RemoteException; /** + * @return true if windows with FLAG_DISMISS_KEYGUARD should be allowed to show even if + * the keyguard is locked. + */ + boolean canShowDismissingWindowWhileLockedLw(); + + /** * Interface to the Window Manager state associated with a particular * window. You can hold on to an instance of this interface from the call * to prepareAddWindow() until removeWindow(). diff --git a/core/java/com/android/internal/os/BatteryStatsImpl.java b/core/java/com/android/internal/os/BatteryStatsImpl.java index 17635aefe6ac..7fb92aef30bd 100644 --- a/core/java/com/android/internal/os/BatteryStatsImpl.java +++ b/core/java/com/android/internal/os/BatteryStatsImpl.java @@ -108,7 +108,7 @@ public class BatteryStatsImpl extends BatteryStats { private static final int MAGIC = 0xBA757475; // 'BATSTATS' // Current on-disk Parcel version - private static final int VERSION = 148 + (USE_OLD_HISTORY ? 1000 : 0); + private static final int VERSION = 149 + (USE_OLD_HISTORY ? 1000 : 0); // Maximum number of items we will record in the history. private static final int MAX_HISTORY_ITEMS = 2000; @@ -1566,6 +1566,186 @@ public class BatteryStatsImpl extends BatteryStats { } } + + /** + * A StopwatchTimer that also tracks the total and max individual + * time spent active according to the given timebase. Whereas + * StopwatchTimer apportions the time amongst all in the pool, + * the total and max durations are not apportioned. + */ + public static class DurationTimer extends StopwatchTimer { + /** + * The time (in ms) that the timer was last acquired or the time base + * last (re-)started. Increasing the nesting depth does not reset this time. + * + * -1 if the timer is currently not running or the time base is not running. + * + * If written to a parcel, the start time is reset, as is mNesting in the base class + * StopwatchTimer. + */ + long mStartTimeMs = -1; + + /** + * The longest time period (in ms) that the timer has been active. + */ + long mMaxDurationMs; + + /** + * The total time (in ms) that that the timer has been active since reset(). + */ + long mCurrentDurationMs; + + public DurationTimer(Clocks clocks, Uid uid, int type, ArrayList<StopwatchTimer> timerPool, + TimeBase timeBase, Parcel in) { + super(clocks, uid, type, timerPool, timeBase, in); + mMaxDurationMs = in.readLong(); + } + + public DurationTimer(Clocks clocks, Uid uid, int type, ArrayList<StopwatchTimer> timerPool, + TimeBase timeBase) { + super(clocks, uid, type, timerPool, timeBase); + } + + @Override + public void writeToParcel(Parcel out, long elapsedRealtimeUs) { + super.writeToParcel(out, elapsedRealtimeUs); + out.writeLong(mMaxDurationMs); + } + + /** + * Write the summary to the parcel. + * + * Since the time base is probably meaningless after we come back, reading + * from this will have the effect of stopping the timer. So here all we write + * is the max duration. + */ + @Override + public void writeSummaryFromParcelLocked(Parcel out, long elapsedRealtimeUs) { + super.writeSummaryFromParcelLocked(out, elapsedRealtimeUs); + out.writeLong(mMaxDurationMs); + } + + /** + * Read the summary parcel. + * + * Has the side effect of stopping the timer. + */ + @Override + public void readSummaryFromParcelLocked(Parcel in) { + super.readSummaryFromParcelLocked(in); + mMaxDurationMs = in.readLong(); + mStartTimeMs = -1; + mCurrentDurationMs = 0; + } + + /** + * The TimeBase time started (again). + * + * If the timer is also running, store the start time. + */ + public void onTimeStarted(long elapsedRealtimeUs, long baseUptime, long baseRealtime) { + super.onTimeStarted(elapsedRealtimeUs, baseUptime, baseRealtime); + if (mNesting > 0) { + mStartTimeMs = mTimeBase.getRealtime(mClocks.elapsedRealtime()*1000) / 1000; + } + } + + /** + * The TimeBase stopped running. + * + * If the timer is running, add the duration into mCurrentDurationMs. + */ + @Override + public void onTimeStopped(long elapsedRealtimeUs, long baseUptime, long baseRealtime) { + super.onTimeStopped(elapsedRealtimeUs, baseUptime, baseRealtime); + if (mNesting > 0) { + mCurrentDurationMs += (elapsedRealtimeUs / 1000) - mStartTimeMs; + } + mStartTimeMs = -1; + } + + @Override + public void logState(Printer pw, String prefix) { + super.logState(pw, prefix); + } + + @Override + public void startRunningLocked(long elapsedRealtimeMs) { + super.startRunningLocked(elapsedRealtimeMs); + if (mNesting == 1 && mTimeBase.isRunning()) { + // Just started + mStartTimeMs = mTimeBase.getRealtime(mClocks.elapsedRealtime()*1000) / 1000; + } + } + + /** + * Decrements the mNesting ref-count on this timer. + * + * If it actually stopped (mNesting went to 0), then possibly update + * mMaxDuration if the current duration was the longest ever. + */ + @Override + public void stopRunningLocked(long elapsedRealtimeMs) { + super.stopRunningLocked(elapsedRealtimeMs); + if (mNesting == 0) { + final long durationMs = getCurrentDurationMsLocked(elapsedRealtimeMs); + if (durationMs > mMaxDurationMs) { + mMaxDurationMs = durationMs; + } + mStartTimeMs = -1; + mCurrentDurationMs = 0; + } + } + + @Override + public boolean reset(boolean detachIfReset) { + boolean result = super.reset(detachIfReset); + mMaxDurationMs = 0; + mCurrentDurationMs = 0; + if (mNesting > 0) { + mStartTimeMs = mTimeBase.getRealtime(mClocks.elapsedRealtime()*1000) / 1000; + } else { + mStartTimeMs = -1; + } + return result; + } + + /** + * Returns the max duration that this timer has ever seen. + * + * Note that this time is NOT split between the timers in the timer group that + * this timer is attached to. It is the TOTAL time. + */ + @Override + public long getMaxDurationMsLocked(long elapsedRealtimeMs) { + if (mNesting > 0) { + final long durationMs = getCurrentDurationMsLocked(elapsedRealtimeMs); + if (durationMs > mMaxDurationMs) { + return durationMs; + } + } + return mMaxDurationMs; + } + + /** + * Returns the time since the timer was started. + * + * Note that this time is NOT split between the timers in the timer group that + * this timer is attached to. It is the TOTAL time. + */ + @Override + public long getCurrentDurationMsLocked(long elapsedRealtimeMs) { + long durationMs = mCurrentDurationMs; + if (mNesting > 0) { + if (mTimeBase.isRunning()) { + durationMs += (mTimeBase.getRealtime(elapsedRealtimeMs*1000)/1000) + - mStartTimeMs; + } + } + return durationMs; + } + } + /** * State for keeping track of timing information. */ @@ -6535,7 +6715,7 @@ public class BatteryStatsImpl extends BatteryStats { /** * How long (in ms) this uid has been keeping the device partially awake. */ - StopwatchTimer mTimerPartial; + DurationTimer mTimerPartial; /** * How long (in ms) this uid has been keeping the device fully awake. @@ -6564,8 +6744,8 @@ public class BatteryStatsImpl extends BatteryStats { * @param in the Parcel to be read from. * return a new Timer, or null. */ - private StopwatchTimer readTimerFromParcel(int type, ArrayList<StopwatchTimer> pool, - TimeBase timeBase, Parcel in) { + private StopwatchTimer readStopwatchTimerFromParcel(int type, + ArrayList<StopwatchTimer> pool, TimeBase timeBase, Parcel in) { if (in.readInt() == 0) { return null; } @@ -6573,6 +6753,22 @@ public class BatteryStatsImpl extends BatteryStats { return new StopwatchTimer(mBsi.mClocks, mUid, type, pool, timeBase, in); } + /** + * Reads a possibly null Timer from a Parcel. The timer is associated with the + * proper timer pool from the given BatteryStatsImpl object. + * + * @param in the Parcel to be read from. + * return a new Timer, or null. + */ + private DurationTimer readDurationTimerFromParcel(int type, + ArrayList<StopwatchTimer> pool, TimeBase timeBase, Parcel in) { + if (in.readInt() == 0) { + return null; + } + + return new DurationTimer(mBsi.mClocks, mUid, type, pool, timeBase, in); + } + boolean reset() { boolean wlactive = false; if (mTimerFull != null) { @@ -6609,11 +6805,14 @@ public class BatteryStatsImpl extends BatteryStats { } void readFromParcelLocked(TimeBase timeBase, TimeBase screenOffTimeBase, Parcel in) { - mTimerPartial = readTimerFromParcel(WAKE_TYPE_PARTIAL, + mTimerPartial = readDurationTimerFromParcel(WAKE_TYPE_PARTIAL, mBsi.mPartialTimers, screenOffTimeBase, in); - mTimerFull = readTimerFromParcel(WAKE_TYPE_FULL, mBsi.mFullTimers, timeBase, in); - mTimerWindow = readTimerFromParcel(WAKE_TYPE_WINDOW, mBsi.mWindowTimers, timeBase, in); - mTimerDraw = readTimerFromParcel(WAKE_TYPE_DRAW, mBsi.mDrawTimers, timeBase, in); + mTimerFull = readStopwatchTimerFromParcel(WAKE_TYPE_FULL, + mBsi.mFullTimers, timeBase, in); + mTimerWindow = readStopwatchTimerFromParcel(WAKE_TYPE_WINDOW, + mBsi.mWindowTimers, timeBase, in); + mTimerDraw = readStopwatchTimerFromParcel(WAKE_TYPE_DRAW, + mBsi.mDrawTimers, timeBase, in); } void writeToParcelLocked(Parcel out, long elapsedRealtimeUs) { @@ -6635,40 +6834,43 @@ public class BatteryStatsImpl extends BatteryStats { } public StopwatchTimer getStopwatchTimer(int type) { - StopwatchTimer t; switch (type) { - case WAKE_TYPE_PARTIAL: - t = mTimerPartial; + case WAKE_TYPE_PARTIAL: { + DurationTimer t = mTimerPartial; if (t == null) { - t = new StopwatchTimer(mBsi.mClocks, mUid, WAKE_TYPE_PARTIAL, + t = new DurationTimer(mBsi.mClocks, mUid, WAKE_TYPE_PARTIAL, mBsi.mPartialTimers, mBsi.mOnBatteryScreenOffTimeBase); mTimerPartial = t; } return t; - case WAKE_TYPE_FULL: - t = mTimerFull; + } + case WAKE_TYPE_FULL: { + StopwatchTimer t = mTimerFull; if (t == null) { t = new StopwatchTimer(mBsi.mClocks, mUid, WAKE_TYPE_FULL, mBsi.mFullTimers, mBsi.mOnBatteryTimeBase); mTimerFull = t; } return t; - case WAKE_TYPE_WINDOW: - t = mTimerWindow; + } + case WAKE_TYPE_WINDOW: { + StopwatchTimer t = mTimerWindow; if (t == null) { t = new StopwatchTimer(mBsi.mClocks, mUid, WAKE_TYPE_WINDOW, mBsi.mWindowTimers, mBsi.mOnBatteryTimeBase); mTimerWindow = t; } return t; - case WAKE_TYPE_DRAW: - t = mTimerDraw; + } + case WAKE_TYPE_DRAW: { + StopwatchTimer t = mTimerDraw; if (t == null) { t = new StopwatchTimer(mBsi.mClocks, mUid, WAKE_TYPE_DRAW, mBsi.mDrawTimers, mBsi.mOnBatteryTimeBase); mTimerDraw = t; } return t; + } default: throw new IllegalArgumentException("type=" + type); } diff --git a/core/java/com/android/internal/policy/IKeyguardService.aidl b/core/java/com/android/internal/policy/IKeyguardService.aidl index 171a264eea8b..83d75fba80f9 100644 --- a/core/java/com/android/internal/policy/IKeyguardService.aidl +++ b/core/java/com/android/internal/policy/IKeyguardService.aidl @@ -34,7 +34,7 @@ oneway interface IKeyguardService { void addStateMonitorCallback(IKeyguardStateCallback callback); void verifyUnlock(IKeyguardExitCallback callback); void keyguardDone(boolean authenticated, boolean wakeup); - void dismiss(); + void dismiss(boolean allowWhileOccluded); void onDreamingStarted(); void onDreamingStopped(); diff --git a/core/java/com/android/internal/policy/IKeyguardStateCallback.aidl b/core/java/com/android/internal/policy/IKeyguardStateCallback.aidl index db3b40b29903..419b1f8feac7 100644 --- a/core/java/com/android/internal/policy/IKeyguardStateCallback.aidl +++ b/core/java/com/android/internal/policy/IKeyguardStateCallback.aidl @@ -19,4 +19,5 @@ interface IKeyguardStateCallback { void onShowingStateChanged(boolean showing); void onSimSecureStateChanged(boolean simSecure); void onInputRestrictedStateChanged(boolean inputRestricted); + void onTrustedChanged(boolean trusted); }
\ No newline at end of file diff --git a/core/jni/android_graphics_drawable_AnimatedVectorDrawable.cpp b/core/jni/android_graphics_drawable_AnimatedVectorDrawable.cpp index 47252ad54468..ade718b9e6b8 100644 --- a/core/jni/android_graphics_drawable_AnimatedVectorDrawable.cpp +++ b/core/jni/android_graphics_drawable_AnimatedVectorDrawable.cpp @@ -83,11 +83,13 @@ static AnimationListener* createAnimationListener(JNIEnv* env, jobject finishLis } static void addAnimator(JNIEnv*, jobject, jlong animatorSetPtr, jlong propertyHolderPtr, - jlong interpolatorPtr, jlong startDelay, jlong duration, jint repeatCount) { + jlong interpolatorPtr, jlong startDelay, jlong duration, jint repeatCount, + jint repeatMode) { PropertyValuesAnimatorSet* set = reinterpret_cast<PropertyValuesAnimatorSet*>(animatorSetPtr); PropertyValuesHolder* holder = reinterpret_cast<PropertyValuesHolder*>(propertyHolderPtr); Interpolator* interpolator = reinterpret_cast<Interpolator*>(interpolatorPtr); - set->addPropertyAnimator(holder, interpolator, startDelay, duration, repeatCount); + RepeatMode mode = static_cast<RepeatMode>(repeatMode); + set->addPropertyAnimator(holder, interpolator, startDelay, duration, repeatCount, mode); } static jlong createAnimatorSet(JNIEnv*, jobject) { @@ -185,7 +187,7 @@ static void reset(JNIEnv*, jobject, jlong animatorSetPtr) { static const JNINativeMethod gMethods[] = { {"nCreateAnimatorSet", "()J", (void*)createAnimatorSet}, {"nSetVectorDrawableTarget", "(JJ)V", (void*)setVectorDrawableTarget}, - {"nAddAnimator", "(JJJJJI)V", (void*)addAnimator}, + {"nAddAnimator", "(JJJJJII)V", (void*)addAnimator}, {"nCreateGroupPropertyHolder", "!(JIFF)J", (void*)createGroupPropertyHolder}, {"nCreatePathDataPropertyHolder", "!(JJJ)J", (void*)createPathDataPropertyHolder}, {"nCreatePathColorPropertyHolder", "!(JIII)J", (void*)createPathColorPropertyHolder}, diff --git a/core/res/res/values-af/strings.xml b/core/res/res/values-af/strings.xml index ac59838a1394..bd92ab6fee3f 100644 --- a/core/res/res/values-af/strings.xml +++ b/core/res/res/values-af/strings.xml @@ -1023,8 +1023,7 @@ <string name="android_upgrading_title" msgid="1584192285441405746">"Android gradeer tans op..."</string> <string name="android_start_title" msgid="8418054686415318207">"Android begin tans …"</string> <string name="android_upgrading_fstrim" msgid="8036718871534640010">"Optimeer tans berging."</string> - <!-- no translation found for android_upgrading_notification_title (8428357096969413169) --> - <skip /> + <string name="android_upgrading_notification_title" msgid="8428357096969413169">"Voltooi tans Android-opdatering …"</string> <string name="android_upgrading_notification_body" msgid="5761201379457064286">"Sommige programme sal dalk nie behoorlik werk voordat die opgradering voltooi is nie"</string> <string name="app_upgrading_toast" msgid="3008139776215597053">"<xliff:g id="APPLICATION">%1$s</xliff:g> gradeer tans op …"</string> <string name="android_upgrading_apk" msgid="7904042682111526169">"Optimeer program <xliff:g id="NUMBER_0">%1$d</xliff:g> van <xliff:g id="NUMBER_1">%2$d</xliff:g>."</string> diff --git a/core/res/res/values-am/strings.xml b/core/res/res/values-am/strings.xml index 264c4adad9d3..98fcebbeed16 100644 --- a/core/res/res/values-am/strings.xml +++ b/core/res/res/values-am/strings.xml @@ -1023,8 +1023,7 @@ <string name="android_upgrading_title" msgid="1584192285441405746">"Android እያሻሻለ ነው..."</string> <string name="android_start_title" msgid="8418054686415318207">"Android በመጀመር ላይ ነው…"</string> <string name="android_upgrading_fstrim" msgid="8036718871534640010">"ማከማቻን በማመቻቸት ላይ።"</string> - <!-- no translation found for android_upgrading_notification_title (8428357096969413169) --> - <skip /> + <string name="android_upgrading_notification_title" msgid="8428357096969413169">"የAndroid ዝማኔን በመጨረስ ላይ…"</string> <string name="android_upgrading_notification_body" msgid="5761201379457064286">"አንዳንድ መተግበሪያዎች ማላቁ እስኪጠናቀቅ ድረስ በአግባቡ ላይሰሩ ይችላሉ"</string> <string name="app_upgrading_toast" msgid="3008139776215597053">"<xliff:g id="APPLICATION">%1$s</xliff:g> በማላቅ ላይ…"</string> <string name="android_upgrading_apk" msgid="7904042682111526169">"መተግበሪያዎች በአግባቡ በመጠቀም ላይ <xliff:g id="NUMBER_0">%1$d</xliff:g> ከ <xliff:g id="NUMBER_1">%2$d</xliff:g> ፡፡"</string> diff --git a/core/res/res/values-ar/strings.xml b/core/res/res/values-ar/strings.xml index 28a3d1bf0595..32df247ef4aa 100644 --- a/core/res/res/values-ar/strings.xml +++ b/core/res/res/values-ar/strings.xml @@ -1115,8 +1115,7 @@ <string name="android_upgrading_title" msgid="1584192285441405746">"جارٍ ترقية Android..."</string> <string name="android_start_title" msgid="8418054686415318207">"جارٍ تشغيل Android…"</string> <string name="android_upgrading_fstrim" msgid="8036718871534640010">"جارٍ تحسين السعة التخزينية."</string> - <!-- no translation found for android_upgrading_notification_title (8428357096969413169) --> - <skip /> + <string name="android_upgrading_notification_title" msgid="8428357096969413169">"جارٍ إتمام تحديث Android…"</string> <string name="android_upgrading_notification_body" msgid="5761201379457064286">"قد لا تعمل بعض التطبيقات بشكل مناسب إلا بعد انتهاء الترقية"</string> <string name="app_upgrading_toast" msgid="3008139776215597053">"جارٍ ترقية <xliff:g id="APPLICATION">%1$s</xliff:g>…"</string> <string name="android_upgrading_apk" msgid="7904042682111526169">"جارٍ تحسين التطبيق <xliff:g id="NUMBER_0">%1$d</xliff:g> من <xliff:g id="NUMBER_1">%2$d</xliff:g>."</string> diff --git a/core/res/res/values-b+sr+Latn/strings.xml b/core/res/res/values-b+sr+Latn/strings.xml index 84f1fa6b158b..ad74e2e15286 100644 --- a/core/res/res/values-b+sr+Latn/strings.xml +++ b/core/res/res/values-b+sr+Latn/strings.xml @@ -1046,8 +1046,7 @@ <string name="android_upgrading_title" msgid="1584192285441405746">"Android se nadograđuje…"</string> <string name="android_start_title" msgid="8418054686415318207">"Android se pokreće…"</string> <string name="android_upgrading_fstrim" msgid="8036718871534640010">"Memorija se optimizuje."</string> - <!-- no translation found for android_upgrading_notification_title (8428357096969413169) --> - <skip /> + <string name="android_upgrading_notification_title" msgid="8428357096969413169">"Dovršavamo ažuriranje Android-a…"</string> <string name="android_upgrading_notification_body" msgid="5761201379457064286">"Neke aplikacije možda neće ispravno funkcionisati dok se nadogradnja ne dovrši"</string> <string name="app_upgrading_toast" msgid="3008139776215597053">"<xliff:g id="APPLICATION">%1$s</xliff:g> se nadograđuje…"</string> <string name="android_upgrading_apk" msgid="7904042682111526169">"Optimizovanje aplikacije <xliff:g id="NUMBER_0">%1$d</xliff:g> od <xliff:g id="NUMBER_1">%2$d</xliff:g>."</string> diff --git a/core/res/res/values-be-rBY/strings.xml b/core/res/res/values-be-rBY/strings.xml index 79b6a1dd14c8..237820c69c21 100644 --- a/core/res/res/values-be-rBY/strings.xml +++ b/core/res/res/values-be-rBY/strings.xml @@ -1069,8 +1069,7 @@ <string name="android_upgrading_title" msgid="1584192285441405746">"Абнаўленне Android..."</string> <string name="android_start_title" msgid="8418054686415318207">"Android запускаецца..."</string> <string name="android_upgrading_fstrim" msgid="8036718871534640010">"Аптымізацыя сховішча."</string> - <!-- no translation found for android_upgrading_notification_title (8428357096969413169) --> - <skip /> + <string name="android_upgrading_notification_title" msgid="8428357096969413169">"Абнаўленне Android завяршаецца…"</string> <string name="android_upgrading_notification_body" msgid="5761201379457064286">"Пэўныя праграмы могуць не працаваць належным чынам, пакуль не скончыцца абнаўленне"</string> <string name="app_upgrading_toast" msgid="3008139776215597053">"<xliff:g id="APPLICATION">%1$s</xliff:g> абнаўляецца…"</string> <string name="android_upgrading_apk" msgid="7904042682111526169">"Аптымізацыя прыкладання <xliff:g id="NUMBER_0">%1$d</xliff:g> з <xliff:g id="NUMBER_1">%2$d</xliff:g>."</string> diff --git a/core/res/res/values-bg/strings.xml b/core/res/res/values-bg/strings.xml index 2f262de356d9..098a1a5662a6 100644 --- a/core/res/res/values-bg/strings.xml +++ b/core/res/res/values-bg/strings.xml @@ -1023,8 +1023,7 @@ <string name="android_upgrading_title" msgid="1584192285441405746">"Android се надстройва..."</string> <string name="android_start_title" msgid="8418054686415318207">"Android се стартира…"</string> <string name="android_upgrading_fstrim" msgid="8036718871534640010">"Хранилището се оптимизира."</string> - <!-- no translation found for android_upgrading_notification_title (8428357096969413169) --> - <skip /> + <string name="android_upgrading_notification_title" msgid="8428357096969413169">"Актуализацията на Android приключва…"</string> <string name="android_upgrading_notification_body" msgid="5761201379457064286">"Някои приложения може да не работят правилно, докато надстройването не завърши"</string> <string name="app_upgrading_toast" msgid="3008139776215597053">"<xliff:g id="APPLICATION">%1$s</xliff:g> се надстройва…"</string> <string name="android_upgrading_apk" msgid="7904042682111526169">"Оптимизира се приложение <xliff:g id="NUMBER_0">%1$d</xliff:g> от <xliff:g id="NUMBER_1">%2$d</xliff:g>."</string> diff --git a/core/res/res/values-bn-rBD/strings.xml b/core/res/res/values-bn-rBD/strings.xml index c41f4a7f9723..c9e921a48195 100644 --- a/core/res/res/values-bn-rBD/strings.xml +++ b/core/res/res/values-bn-rBD/strings.xml @@ -1023,8 +1023,7 @@ <string name="android_upgrading_title" msgid="1584192285441405746">"Android আপগ্রেড করা হচ্ছে..."</string> <string name="android_start_title" msgid="8418054686415318207">"Android চালু হচ্ছে…"</string> <string name="android_upgrading_fstrim" msgid="8036718871534640010">"সঞ্চয়স্থান অপ্টিমাইজ করা হচ্ছে৷"</string> - <!-- no translation found for android_upgrading_notification_title (8428357096969413169) --> - <skip /> + <string name="android_upgrading_notification_title" msgid="8428357096969413169">"Android আপডেট সম্পন্ন করা হচ্ছে…"</string> <string name="android_upgrading_notification_body" msgid="5761201379457064286">"আপগ্রেড সম্পন্ন না হওয়া পর্যন্ত কিছু অ্যাপ্লিকেশান সঠিকভাবে কাজ নাও করতে পারে"</string> <string name="app_upgrading_toast" msgid="3008139776215597053">"<xliff:g id="APPLICATION">%1$s</xliff:g> আপগ্রেড করা হচ্ছে…"</string> <string name="android_upgrading_apk" msgid="7904042682111526169">"<xliff:g id="NUMBER_1">%2$d</xliff:g>টির মধ্যে <xliff:g id="NUMBER_0">%1$d</xliff:g>টি অ্যাপ্লিকেশান অপ্টিমাইজ করা হচ্ছে৷"</string> diff --git a/core/res/res/values-bs-rBA/strings.xml b/core/res/res/values-bs-rBA/strings.xml index b1cf0a598f70..20104a6d900b 100644 --- a/core/res/res/values-bs-rBA/strings.xml +++ b/core/res/res/values-bs-rBA/strings.xml @@ -1048,8 +1048,7 @@ <string name="android_upgrading_title" msgid="1584192285441405746">"Nadogradnja sistema Android u toku..."</string> <string name="android_start_title" msgid="8418054686415318207">"Android se pokreće..."</string> <string name="android_upgrading_fstrim" msgid="8036718871534640010">"Optimiziranje pohrane."</string> - <!-- no translation found for android_upgrading_notification_title (8428357096969413169) --> - <skip /> + <string name="android_upgrading_notification_title" msgid="8428357096969413169">"Dovršava se ažuriranje Androida…"</string> <string name="android_upgrading_notification_body" msgid="5761201379457064286">"Neke aplikacije možda neće raditi ispravno dok traje nadogradnja"</string> <string name="app_upgrading_toast" msgid="3008139776215597053">"Aplikacija <xliff:g id="APPLICATION">%1$s</xliff:g> se nadograđuje…"</string> <string name="android_upgrading_apk" msgid="7904042682111526169">"Optimiziranje aplikacije <xliff:g id="NUMBER_0">%1$d</xliff:g> od <xliff:g id="NUMBER_1">%2$d</xliff:g>."</string> @@ -1166,8 +1165,8 @@ <string name="usb_midi_notification_title" msgid="4850904915889144654">"USB za MIDI"</string> <string name="usb_accessory_notification_title" msgid="7848236974087653666">"Uspostavljena veza sa USB pohranom"</string> <string name="usb_notification_message" msgid="3370903770828407960">"Dodirnite za više opcija."</string> - <string name="adb_active_notification_title" msgid="6729044778949189918">"Uređaj za USB otklanjanje grešaka povezan"</string> - <string name="adb_active_notification_message" msgid="4948470599328424059">"Dodirnite da onemogućite otklanjanje grešaka preko USB veze."</string> + <string name="adb_active_notification_title" msgid="6729044778949189918">"Otklanjanje grešaka putem uređaja spojenog na USB je uspostavljeno"</string> + <string name="adb_active_notification_message" msgid="4948470599328424059">"Dodirnite da onemogućite otklanjanje grešaka putem uređaja spojenog na USB."</string> <string name="taking_remote_bugreport_notification_title" msgid="6742483073875060934">"Prijem izvještaja o grešci..."</string> <string name="share_remote_bugreport_notification_title" msgid="4987095013583691873">"Podijeliti izvještaj o grešci?"</string> <string name="sharing_remote_bugreport_notification_title" msgid="7572089031496651372">"Dijeljenje izvještaja o grešci..."</string> diff --git a/core/res/res/values-ca/strings.xml b/core/res/res/values-ca/strings.xml index bc555800f245..eeed89204aee 100644 --- a/core/res/res/values-ca/strings.xml +++ b/core/res/res/values-ca/strings.xml @@ -1023,8 +1023,7 @@ <string name="android_upgrading_title" msgid="1584192285441405746">"Android s\'està actualitzant..."</string> <string name="android_start_title" msgid="8418054686415318207">"S\'està iniciant Android…"</string> <string name="android_upgrading_fstrim" msgid="8036718871534640010">"S\'està optimitzant l\'emmagatzematge."</string> - <!-- no translation found for android_upgrading_notification_title (8428357096969413169) --> - <skip /> + <string name="android_upgrading_notification_title" msgid="8428357096969413169">"S\'està acabant d\'actualitzar Android…"</string> <string name="android_upgrading_notification_body" msgid="5761201379457064286">"Pot ser que algunes aplicacions no funcionin correctament fins que no es completi l\'actualització"</string> <string name="app_upgrading_toast" msgid="3008139776215597053">"S\'està actualitzant <xliff:g id="APPLICATION">%1$s</xliff:g>…"</string> <string name="android_upgrading_apk" msgid="7904042682111526169">"S\'està optimitzant l\'aplicació <xliff:g id="NUMBER_0">%1$d</xliff:g> de <xliff:g id="NUMBER_1">%2$d</xliff:g>."</string> diff --git a/core/res/res/values-cs/strings.xml b/core/res/res/values-cs/strings.xml index 857d33d89566..df8bffdc4aa8 100644 --- a/core/res/res/values-cs/strings.xml +++ b/core/res/res/values-cs/strings.xml @@ -1069,8 +1069,7 @@ <string name="android_upgrading_title" msgid="1584192285441405746">"Android se upgraduje..."</string> <string name="android_start_title" msgid="8418054686415318207">"Spouštění systému Android…"</string> <string name="android_upgrading_fstrim" msgid="8036718871534640010">"Probíhá optimalizace úložiště."</string> - <!-- no translation found for android_upgrading_notification_title (8428357096969413169) --> - <skip /> + <string name="android_upgrading_notification_title" msgid="8428357096969413169">"Dokončování aktualizace Androidu…"</string> <string name="android_upgrading_notification_body" msgid="5761201379457064286">"Před dokončením upgradu nemusí některé aplikace fungovat správně"</string> <string name="app_upgrading_toast" msgid="3008139776215597053">"Aplikace <xliff:g id="APPLICATION">%1$s</xliff:g> se upgraduje…"</string> <string name="android_upgrading_apk" msgid="7904042682111526169">"Optimalizování aplikace <xliff:g id="NUMBER_0">%1$d</xliff:g> z <xliff:g id="NUMBER_1">%2$d</xliff:g>."</string> diff --git a/core/res/res/values-da/strings.xml b/core/res/res/values-da/strings.xml index 49d5ac6c3dfc..731c84746c6a 100644 --- a/core/res/res/values-da/strings.xml +++ b/core/res/res/values-da/strings.xml @@ -1023,8 +1023,7 @@ <string name="android_upgrading_title" msgid="1584192285441405746">"Android opgraderes..."</string> <string name="android_start_title" msgid="8418054686415318207">"Android starter..."</string> <string name="android_upgrading_fstrim" msgid="8036718871534640010">"Lageret optimeres."</string> - <!-- no translation found for android_upgrading_notification_title (8428357096969413169) --> - <skip /> + <string name="android_upgrading_notification_title" msgid="8428357096969413169">"Afslutter Android-opdateringen…"</string> <string name="android_upgrading_notification_body" msgid="5761201379457064286">"Nogle apps fungerer muligvis ikke korrekt, før opgraderingen er gennemført"</string> <string name="app_upgrading_toast" msgid="3008139776215597053">"<xliff:g id="APPLICATION">%1$s</xliff:g> opgraderer…"</string> <string name="android_upgrading_apk" msgid="7904042682111526169">"Optimerer app <xliff:g id="NUMBER_0">%1$d</xliff:g> ud af <xliff:g id="NUMBER_1">%2$d</xliff:g>."</string> diff --git a/core/res/res/values-de/strings.xml b/core/res/res/values-de/strings.xml index 4d3830b17fde..c478607cfca4 100644 --- a/core/res/res/values-de/strings.xml +++ b/core/res/res/values-de/strings.xml @@ -1023,8 +1023,7 @@ <string name="android_upgrading_title" msgid="1584192285441405746">"Android wird aktualisiert..."</string> <string name="android_start_title" msgid="8418054686415318207">"Android wird gestartet…"</string> <string name="android_upgrading_fstrim" msgid="8036718871534640010">"Speicher wird optimiert"</string> - <!-- no translation found for android_upgrading_notification_title (8428357096969413169) --> - <skip /> + <string name="android_upgrading_notification_title" msgid="8428357096969413169">"Android-Update wird beendet…"</string> <string name="android_upgrading_notification_body" msgid="5761201379457064286">"Einige Apps funktionieren unter Umständen nicht richtig, bis das Upgrade abgeschlossen ist"</string> <string name="app_upgrading_toast" msgid="3008139776215597053">"Für <xliff:g id="APPLICATION">%1$s</xliff:g> wird gerade ein Upgrade ausgeführt…"</string> <string name="android_upgrading_apk" msgid="7904042682111526169">"App <xliff:g id="NUMBER_0">%1$d</xliff:g> von <xliff:g id="NUMBER_1">%2$d</xliff:g> wird optimiert..."</string> diff --git a/core/res/res/values-el/strings.xml b/core/res/res/values-el/strings.xml index 062fcbfd77e2..3c6e83217e89 100644 --- a/core/res/res/values-el/strings.xml +++ b/core/res/res/values-el/strings.xml @@ -1023,8 +1023,7 @@ <string name="android_upgrading_title" msgid="1584192285441405746">"Το Android αναβαθμίζεται..."</string> <string name="android_start_title" msgid="8418054686415318207">"Εκκίνηση Android…"</string> <string name="android_upgrading_fstrim" msgid="8036718871534640010">"Βελτιστοποίηση αποθηκευτικού χώρου."</string> - <!-- no translation found for android_upgrading_notification_title (8428357096969413169) --> - <skip /> + <string name="android_upgrading_notification_title" msgid="8428357096969413169">"Ολοκλήρωση ενημέρωσης Android…"</string> <string name="android_upgrading_notification_body" msgid="5761201379457064286">"Ορισμένες εφαρμογές ενδέχεται να μην λειτουργούν σωστά μέχρι την ολοκλήρωση της αναβάθμισης"</string> <string name="app_upgrading_toast" msgid="3008139776215597053">"Η εφαρμογή <xliff:g id="APPLICATION">%1$s</xliff:g> αναβαθμίζεται…"</string> <string name="android_upgrading_apk" msgid="7904042682111526169">"Βελτιστοποίηση της εφαρμογής <xliff:g id="NUMBER_0">%1$d</xliff:g> από <xliff:g id="NUMBER_1">%2$d</xliff:g>."</string> diff --git a/core/res/res/values-es-rUS/strings.xml b/core/res/res/values-es-rUS/strings.xml index 425ce3531399..136902b57799 100644 --- a/core/res/res/values-es-rUS/strings.xml +++ b/core/res/res/values-es-rUS/strings.xml @@ -1023,8 +1023,7 @@ <string name="android_upgrading_title" msgid="1584192285441405746">"Android se está actualizando..."</string> <string name="android_start_title" msgid="8418054686415318207">"Iniciando Android…"</string> <string name="android_upgrading_fstrim" msgid="8036718871534640010">"Optimizando almacenamiento"</string> - <!-- no translation found for android_upgrading_notification_title (8428357096969413169) --> - <skip /> + <string name="android_upgrading_notification_title" msgid="8428357096969413169">"Finalizando actualización de Android…"</string> <string name="android_upgrading_notification_body" msgid="5761201379457064286">"Es posible que algunas apps no funcionen correctamente hasta que termine la actualización"</string> <string name="app_upgrading_toast" msgid="3008139776215597053">"Se está actualizando <xliff:g id="APPLICATION">%1$s</xliff:g>…"</string> <string name="android_upgrading_apk" msgid="7904042682111526169">"Optimizando la aplicación <xliff:g id="NUMBER_0">%1$d</xliff:g> de <xliff:g id="NUMBER_1">%2$d</xliff:g>"</string> diff --git a/core/res/res/values-es/strings.xml b/core/res/res/values-es/strings.xml index 395684266e6f..c4ebb02128fd 100644 --- a/core/res/res/values-es/strings.xml +++ b/core/res/res/values-es/strings.xml @@ -1023,8 +1023,7 @@ <string name="android_upgrading_title" msgid="1584192285441405746">"Actualizando Android"</string> <string name="android_start_title" msgid="8418054686415318207">"Android se está iniciando…"</string> <string name="android_upgrading_fstrim" msgid="8036718871534640010">"Optimizando almacenamiento."</string> - <!-- no translation found for android_upgrading_notification_title (8428357096969413169) --> - <skip /> + <string name="android_upgrading_notification_title" msgid="8428357096969413169">"Terminando de actualizar Android…"</string> <string name="android_upgrading_notification_body" msgid="5761201379457064286">"Es posible que algunas aplicaciones no funcionen correctamente hasta que finalice la actualización"</string> <string name="app_upgrading_toast" msgid="3008139776215597053">"<xliff:g id="APPLICATION">%1$s</xliff:g> se está actualizando…"</string> <string name="android_upgrading_apk" msgid="7904042682111526169">"Optimizando aplicación <xliff:g id="NUMBER_0">%1$d</xliff:g> de <xliff:g id="NUMBER_1">%2$d</xliff:g>..."</string> diff --git a/core/res/res/values-et-rEE/strings.xml b/core/res/res/values-et-rEE/strings.xml index 388edd897f36..89223795d2bd 100644 --- a/core/res/res/values-et-rEE/strings.xml +++ b/core/res/res/values-et-rEE/strings.xml @@ -1023,8 +1023,7 @@ <string name="android_upgrading_title" msgid="1584192285441405746">"Android viiakse üle uuemale versioonile ..."</string> <string name="android_start_title" msgid="8418054686415318207">"Android käivitub ..."</string> <string name="android_upgrading_fstrim" msgid="8036718871534640010">"Salvestusruumi optimeerimine."</string> - <!-- no translation found for android_upgrading_notification_title (8428357096969413169) --> - <skip /> + <string name="android_upgrading_notification_title" msgid="8428357096969413169">"Androidi värskenduse lõpetamine …"</string> <string name="android_upgrading_notification_body" msgid="5761201379457064286">"Mõned rakendused ei pruugi enne uuemale versioonile ülemineku lõpetamist korralikult töötada"</string> <string name="app_upgrading_toast" msgid="3008139776215597053">"Rakenduse <xliff:g id="APPLICATION">%1$s</xliff:g> versiooni uuendatakse …"</string> <string name="android_upgrading_apk" msgid="7904042682111526169">"<xliff:g id="NUMBER_0">%1$d</xliff:g>. rakenduse <xliff:g id="NUMBER_1">%2$d</xliff:g>-st optimeerimine."</string> diff --git a/core/res/res/values-fa/strings.xml b/core/res/res/values-fa/strings.xml index edabde3a6c23..5976ad134191 100644 --- a/core/res/res/values-fa/strings.xml +++ b/core/res/res/values-fa/strings.xml @@ -1023,8 +1023,7 @@ <string name="android_upgrading_title" msgid="1584192285441405746">"Android در حال ارتقا است..."</string> <string name="android_start_title" msgid="8418054686415318207">"Android در حال راهاندازی است..."</string> <string name="android_upgrading_fstrim" msgid="8036718871534640010">"بهینهسازی فضای ذخیرهسازی."</string> - <!-- no translation found for android_upgrading_notification_title (8428357096969413169) --> - <skip /> + <string name="android_upgrading_notification_title" msgid="8428357096969413169">"درحال پایان بهروزرسانی Android…"</string> <string name="android_upgrading_notification_body" msgid="5761201379457064286">"تا پایان ارتقا، ممکن است برخی از برنامهها بهدرستی کار نکنند."</string> <string name="app_upgrading_toast" msgid="3008139776215597053">"<xliff:g id="APPLICATION">%1$s</xliff:g> درحال ارتقا است...."</string> <string name="android_upgrading_apk" msgid="7904042682111526169">"در حال بهینهسازی برنامهٔ <xliff:g id="NUMBER_0">%1$d</xliff:g> از <xliff:g id="NUMBER_1">%2$d</xliff:g>."</string> diff --git a/core/res/res/values-fi/strings.xml b/core/res/res/values-fi/strings.xml index 054f5c4ce4c8..b22175040dd7 100644 --- a/core/res/res/values-fi/strings.xml +++ b/core/res/res/values-fi/strings.xml @@ -1023,8 +1023,7 @@ <string name="android_upgrading_title" msgid="1584192285441405746">"Androidia päivitetään…"</string> <string name="android_start_title" msgid="8418054686415318207">"Android käynnistyy…"</string> <string name="android_upgrading_fstrim" msgid="8036718871534640010">"Optimoidaan tallennustilaa."</string> - <!-- no translation found for android_upgrading_notification_title (8428357096969413169) --> - <skip /> + <string name="android_upgrading_notification_title" msgid="8428357096969413169">"Viimeistellään Android-päivitystä…"</string> <string name="android_upgrading_notification_body" msgid="5761201379457064286">"Kaikki sovellukset eivät ehkä toimi oikein, ennen kuin päivitys on valmis."</string> <string name="app_upgrading_toast" msgid="3008139776215597053">"<xliff:g id="APPLICATION">%1$s</xliff:g> päivittyy…"</string> <string name="android_upgrading_apk" msgid="7904042682111526169">"Optimoidaan sovellusta <xliff:g id="NUMBER_0">%1$d</xliff:g>/<xliff:g id="NUMBER_1">%2$d</xliff:g>."</string> diff --git a/core/res/res/values-fr-rCA/strings.xml b/core/res/res/values-fr-rCA/strings.xml index 3d2ea6acd876..f0d988848fd9 100644 --- a/core/res/res/values-fr-rCA/strings.xml +++ b/core/res/res/values-fr-rCA/strings.xml @@ -1023,8 +1023,7 @@ <string name="android_upgrading_title" msgid="1584192285441405746">"Mise à jour d\'Android…"</string> <string name="android_start_title" msgid="8418054686415318207">"Android en cours de démarrage..."</string> <string name="android_upgrading_fstrim" msgid="8036718871534640010">"Optimisation du stockage."</string> - <!-- no translation found for android_upgrading_notification_title (8428357096969413169) --> - <skip /> + <string name="android_upgrading_notification_title" msgid="8428357096969413169">"Finalisation de la mise à jour d\'Android…"</string> <string name="android_upgrading_notification_body" msgid="5761201379457064286">"Il se peut que certaines applications ne fonctionnent pas correctement jusqu\'à ce que la mise à niveau soit terminée"</string> <string name="app_upgrading_toast" msgid="3008139776215597053">"Mise à niveau de <xliff:g id="APPLICATION">%1$s</xliff:g> en cours…"</string> <string name="android_upgrading_apk" msgid="7904042682111526169">"Optimisation de l\'application <xliff:g id="NUMBER_0">%1$d</xliff:g> sur <xliff:g id="NUMBER_1">%2$d</xliff:g>…"</string> diff --git a/core/res/res/values-fr/strings.xml b/core/res/res/values-fr/strings.xml index 29dcc576d078..6600f0926c1a 100644 --- a/core/res/res/values-fr/strings.xml +++ b/core/res/res/values-fr/strings.xml @@ -1023,8 +1023,7 @@ <string name="android_upgrading_title" msgid="1584192285441405746">"Mise à jour d\'Android…"</string> <string name="android_start_title" msgid="8418054686415318207">"Démarrage d\'Android en cours"</string> <string name="android_upgrading_fstrim" msgid="8036718871534640010">"Optimisation du stockage en cours…"</string> - <!-- no translation found for android_upgrading_notification_title (8428357096969413169) --> - <skip /> + <string name="android_upgrading_notification_title" msgid="8428357096969413169">"Finalisation de la mise à jour Android…"</string> <string name="android_upgrading_notification_body" msgid="5761201379457064286">"Certaines applications peuvent ne pas fonctionner correctement jusqu\'à ce que la mise à jour soit terminée."</string> <string name="app_upgrading_toast" msgid="3008139776215597053">"Mise à jour de l\'application <xliff:g id="APPLICATION">%1$s</xliff:g>…"</string> <string name="android_upgrading_apk" msgid="7904042682111526169">"Optimisation de l\'application <xliff:g id="NUMBER_0">%1$d</xliff:g> sur <xliff:g id="NUMBER_1">%2$d</xliff:g>…"</string> diff --git a/core/res/res/values-gl-rES/strings.xml b/core/res/res/values-gl-rES/strings.xml index 6a28f592b1aa..8023edffdb47 100644 --- a/core/res/res/values-gl-rES/strings.xml +++ b/core/res/res/values-gl-rES/strings.xml @@ -1023,8 +1023,7 @@ <string name="android_upgrading_title" msgid="1584192285441405746">"Estase actualizando Android…"</string> <string name="android_start_title" msgid="8418054686415318207">"Estase iniciando Android…"</string> <string name="android_upgrading_fstrim" msgid="8036718871534640010">"Optimizando almacenamento."</string> - <!-- no translation found for android_upgrading_notification_title (8428357096969413169) --> - <skip /> + <string name="android_upgrading_notification_title" msgid="8428357096969413169">"Finalizando a actualización de Android…"</string> <string name="android_upgrading_notification_body" msgid="5761201379457064286">"É posible que algunhas aplicacións non funcionen correctamente ata que finalice o proceso de actualización"</string> <string name="app_upgrading_toast" msgid="3008139776215597053">"Actualizando <xliff:g id="APPLICATION">%1$s</xliff:g>…"</string> <string name="android_upgrading_apk" msgid="7904042682111526169">"Optimizando aplicación <xliff:g id="NUMBER_0">%1$d</xliff:g> de <xliff:g id="NUMBER_1">%2$d</xliff:g>."</string> diff --git a/core/res/res/values-gu-rIN/strings.xml b/core/res/res/values-gu-rIN/strings.xml index 31bbe4594718..5c3bf93b551a 100644 --- a/core/res/res/values-gu-rIN/strings.xml +++ b/core/res/res/values-gu-rIN/strings.xml @@ -1023,8 +1023,7 @@ <string name="android_upgrading_title" msgid="1584192285441405746">"Android અપગ્રેડ થઈ રહ્યું છે..."</string> <string name="android_start_title" msgid="8418054686415318207">"Android પ્રારંભ થઈ રહ્યું છે…"</string> <string name="android_upgrading_fstrim" msgid="8036718871534640010">"સંગ્રહ ઓપ્ટિમાઇઝ કરી રહ્યું છે."</string> - <!-- no translation found for android_upgrading_notification_title (8428357096969413169) --> - <skip /> + <string name="android_upgrading_notification_title" msgid="8428357096969413169">"Android અપડેટ સમાપ્ત કરી રહ્યાં છે…"</string> <string name="android_upgrading_notification_body" msgid="5761201379457064286">"અપગ્રેડ સમાપ્ત ન થાય ત્યાં સુધી કેટલીક ઍપ્લિકેશનો કદાચ યોગ્ય રીતે કામ ન કરે"</string> <string name="app_upgrading_toast" msgid="3008139776215597053">"<xliff:g id="APPLICATION">%1$s</xliff:g> અપગ્રેડ થઈ રહી છે…"</string> <string name="android_upgrading_apk" msgid="7904042682111526169">"<xliff:g id="NUMBER_1">%2$d</xliff:g> માંથી <xliff:g id="NUMBER_0">%1$d</xliff:g> ઍપ્લિકેશન ઓપ્ટિમાઇઝ કરી રહ્યું છે."</string> diff --git a/core/res/res/values-hi/strings.xml b/core/res/res/values-hi/strings.xml index ab0a42f9eba5..bea243b7e241 100644 --- a/core/res/res/values-hi/strings.xml +++ b/core/res/res/values-hi/strings.xml @@ -1023,8 +1023,7 @@ <string name="android_upgrading_title" msgid="1584192285441405746">"Android अपग्रेड हो रहा है..."</string> <string name="android_start_title" msgid="8418054686415318207">"Android प्रारंभ हो रहा है…"</string> <string name="android_upgrading_fstrim" msgid="8036718871534640010">"मेमोरी ऑप्टिमाइज़ हो रही है."</string> - <!-- no translation found for android_upgrading_notification_title (8428357096969413169) --> - <skip /> + <string name="android_upgrading_notification_title" msgid="8428357096969413169">"Android अपडेट समाप्त हो रहा है…"</string> <string name="android_upgrading_notification_body" msgid="5761201379457064286">"जब तक अपग्रेड पूरा नहीं हो जाता, तब तक संभव है कि कुछ ऐप्लिकेशन ठीक से कार्य ना करें"</string> <string name="app_upgrading_toast" msgid="3008139776215597053">"<xliff:g id="APPLICATION">%1$s</xliff:g> अपग्रेड हो रहा है…"</string> <string name="android_upgrading_apk" msgid="7904042682111526169">"<xliff:g id="NUMBER_1">%2$d</xliff:g> में से <xliff:g id="NUMBER_0">%1$d</xliff:g> ऐप्स अनुकूलित हो रहा है."</string> diff --git a/core/res/res/values-hr/strings.xml b/core/res/res/values-hr/strings.xml index 0beaaea39123..b181f6d40e83 100644 --- a/core/res/res/values-hr/strings.xml +++ b/core/res/res/values-hr/strings.xml @@ -1046,8 +1046,7 @@ <string name="android_upgrading_title" msgid="1584192285441405746">"Android se nadograđuje…"</string> <string name="android_start_title" msgid="8418054686415318207">"Pokretanje Androida..."</string> <string name="android_upgrading_fstrim" msgid="8036718871534640010">"Optimiziranje pohrane."</string> - <!-- no translation found for android_upgrading_notification_title (8428357096969413169) --> - <skip /> + <string name="android_upgrading_notification_title" msgid="8428357096969413169">"Dovršavanje ažuriranja Androida…"</string> <string name="android_upgrading_notification_body" msgid="5761201379457064286">"Neke aplikacije možda neće funkcionirati pravilno dok nadogradnja ne završi"</string> <string name="app_upgrading_toast" msgid="3008139776215597053">"Nadogradnja aplikacije <xliff:g id="APPLICATION">%1$s</xliff:g>…"</string> <string name="android_upgrading_apk" msgid="7904042682111526169">"Optimiziranje aplikacije <xliff:g id="NUMBER_0">%1$d</xliff:g> od <xliff:g id="NUMBER_1">%2$d</xliff:g>."</string> diff --git a/core/res/res/values-hu/strings.xml b/core/res/res/values-hu/strings.xml index c1c04ad1474a..aea12a60f2ae 100644 --- a/core/res/res/values-hu/strings.xml +++ b/core/res/res/values-hu/strings.xml @@ -1023,8 +1023,7 @@ <string name="android_upgrading_title" msgid="1584192285441405746">"Android frissítése folyamatban..."</string> <string name="android_start_title" msgid="8418054686415318207">"Az Android indítása…"</string> <string name="android_upgrading_fstrim" msgid="8036718871534640010">"Tárhely-optimalizálás."</string> - <!-- no translation found for android_upgrading_notification_title (8428357096969413169) --> - <skip /> + <string name="android_upgrading_notification_title" msgid="8428357096969413169">"Az Android frissítésének befejezése…"</string> <string name="android_upgrading_notification_body" msgid="5761201379457064286">"A frissítés befejezéséig előfordulhat, hogy egyes alkalmazások nem megfelelően működnek."</string> <string name="app_upgrading_toast" msgid="3008139776215597053">"A(z) <xliff:g id="APPLICATION">%1$s</xliff:g> frissítése folyamatban van"</string> <string name="android_upgrading_apk" msgid="7904042682111526169">"Alkalmazás optimalizálása: <xliff:g id="NUMBER_0">%1$d</xliff:g>/<xliff:g id="NUMBER_1">%2$d</xliff:g>."</string> diff --git a/core/res/res/values-hy-rAM/strings.xml b/core/res/res/values-hy-rAM/strings.xml index 4f03608c79d6..ba97468da436 100644 --- a/core/res/res/values-hy-rAM/strings.xml +++ b/core/res/res/values-hy-rAM/strings.xml @@ -1023,8 +1023,7 @@ <string name="android_upgrading_title" msgid="1584192285441405746">"Android-ը նորացվում է..."</string> <string name="android_start_title" msgid="8418054686415318207">"Android-ը մեկնարկում է…"</string> <string name="android_upgrading_fstrim" msgid="8036718871534640010">"Պահեստի օպտիմալացում:"</string> - <!-- no translation found for android_upgrading_notification_title (8428357096969413169) --> - <skip /> + <string name="android_upgrading_notification_title" msgid="8428357096969413169">"Android-ի թարմացումն ավարտվում է…"</string> <string name="android_upgrading_notification_body" msgid="5761201379457064286">"Հնարավոր է՝ որոշ հավելվածներ մինչև նորացման ավարտը ճիշտ չաշխատեն"</string> <string name="app_upgrading_toast" msgid="3008139776215597053">"<xliff:g id="APPLICATION">%1$s</xliff:g> հավելվածը նորացվում է…"</string> <string name="android_upgrading_apk" msgid="7904042682111526169">"Օպտիմալացվում է հավելված <xliff:g id="NUMBER_0">%1$d</xliff:g>-ը <xliff:g id="NUMBER_1">%2$d</xliff:g>-ից:"</string> diff --git a/core/res/res/values-is-rIS/strings.xml b/core/res/res/values-is-rIS/strings.xml index 55e14c49d09a..a897ba87cc27 100644 --- a/core/res/res/values-is-rIS/strings.xml +++ b/core/res/res/values-is-rIS/strings.xml @@ -1023,8 +1023,7 @@ <string name="android_upgrading_title" msgid="1584192285441405746">"Android er að uppfæra…"</string> <string name="android_start_title" msgid="8418054686415318207">"Android er að ræsast…"</string> <string name="android_upgrading_fstrim" msgid="8036718871534640010">"Fínstillir geymslu."</string> - <!-- no translation found for android_upgrading_notification_title (8428357096969413169) --> - <skip /> + <string name="android_upgrading_notification_title" msgid="8428357096969413169">"Lýkur við Android uppfærslu…"</string> <string name="android_upgrading_notification_body" msgid="5761201379457064286">"Hugsanlega virka sum forrit ekki fyrr en uppfærslunni lýkur"</string> <string name="app_upgrading_toast" msgid="3008139776215597053">"<xliff:g id="APPLICATION">%1$s</xliff:g> uppfærir…"</string> <string name="android_upgrading_apk" msgid="7904042682111526169">"Fínstillir forrit <xliff:g id="NUMBER_0">%1$d</xliff:g> af <xliff:g id="NUMBER_1">%2$d</xliff:g>."</string> diff --git a/core/res/res/values-it/strings.xml b/core/res/res/values-it/strings.xml index 0fb42a86e4a9..9cd74dc808e8 100644 --- a/core/res/res/values-it/strings.xml +++ b/core/res/res/values-it/strings.xml @@ -1023,8 +1023,7 @@ <string name="android_upgrading_title" msgid="1584192285441405746">"Aggiornamento di Android..."</string> <string name="android_start_title" msgid="8418054686415318207">"Avvio di Android…"</string> <string name="android_upgrading_fstrim" msgid="8036718871534640010">"Ottimizzazione archiviazione."</string> - <!-- no translation found for android_upgrading_notification_title (8428357096969413169) --> - <skip /> + <string name="android_upgrading_notification_title" msgid="8428357096969413169">"Completamento aggiornamento Android…"</string> <string name="android_upgrading_notification_body" msgid="5761201379457064286">"Alcune app potrebbero non funzionare correttamente fino al completamento dell\'upgrade"</string> <string name="app_upgrading_toast" msgid="3008139776215597053">"Upgrade dell\'app <xliff:g id="APPLICATION">%1$s</xliff:g>…"</string> <string name="android_upgrading_apk" msgid="7904042682111526169">"Ottimizzazione applicazione <xliff:g id="NUMBER_0">%1$d</xliff:g> di <xliff:g id="NUMBER_1">%2$d</xliff:g>."</string> diff --git a/core/res/res/values-iw/strings.xml b/core/res/res/values-iw/strings.xml index 68a6f2b93aa0..bebe027cb67f 100644 --- a/core/res/res/values-iw/strings.xml +++ b/core/res/res/values-iw/strings.xml @@ -1069,8 +1069,7 @@ <string name="android_upgrading_title" msgid="1584192285441405746">"Android מבצע שדרוג…"</string> <string name="android_start_title" msgid="8418054686415318207">"הפעלת Android מתחילה…"</string> <string name="android_upgrading_fstrim" msgid="8036718871534640010">"מתבצעת אופטימיזציה של האחסון."</string> - <!-- no translation found for android_upgrading_notification_title (8428357096969413169) --> - <skip /> + <string name="android_upgrading_notification_title" msgid="8428357096969413169">"מסיים עדכון Android…"</string> <string name="android_upgrading_notification_body" msgid="5761201379457064286">"ייתכן שאפליקציות מסוימות לא יפעלו כראוי עד סיום השדרוג"</string> <string name="app_upgrading_toast" msgid="3008139776215597053">"<xliff:g id="APPLICATION">%1$s</xliff:g> מבצעת שדרוג…"</string> <string name="android_upgrading_apk" msgid="7904042682111526169">"מבצע אופטימיזציה של אפליקציה <xliff:g id="NUMBER_0">%1$d</xliff:g> מתוך <xliff:g id="NUMBER_1">%2$d</xliff:g>."</string> diff --git a/core/res/res/values-ka-rGE/strings.xml b/core/res/res/values-ka-rGE/strings.xml index 213b856c721c..0295ea50a8be 100644 --- a/core/res/res/values-ka-rGE/strings.xml +++ b/core/res/res/values-ka-rGE/strings.xml @@ -1023,8 +1023,7 @@ <string name="android_upgrading_title" msgid="1584192285441405746">"Android ახალ ვერსიაზე გადადის…"</string> <string name="android_start_title" msgid="8418054686415318207">"Android იწყება…"</string> <string name="android_upgrading_fstrim" msgid="8036718871534640010">"მეხსიერების ოპტიმიზირება."</string> - <!-- no translation found for android_upgrading_notification_title (8428357096969413169) --> - <skip /> + <string name="android_upgrading_notification_title" msgid="8428357096969413169">"Android-ის განახლება სრულდება…"</string> <string name="android_upgrading_notification_body" msgid="5761201379457064286">"ახალ ვერსიაზე გადასვლის დასრულებამდე, ზოგიერთმა აპმა შეიძლება არასწორად იმუშაოს"</string> <string name="app_upgrading_toast" msgid="3008139776215597053">"<xliff:g id="APPLICATION">%1$s</xliff:g> ახალ ვერსიაზე გადადის…"</string> <string name="android_upgrading_apk" msgid="7904042682111526169">"მიმდინარეობს აპლიკაციების ოპტიმიზაცია. დასრულებულია <xliff:g id="NUMBER_0">%1$d</xliff:g>, სულ <xliff:g id="NUMBER_1">%2$d</xliff:g>."</string> diff --git a/core/res/res/values-kk-rKZ/strings.xml b/core/res/res/values-kk-rKZ/strings.xml index 142bf05bb0aa..b5931c1a1ea1 100644 --- a/core/res/res/values-kk-rKZ/strings.xml +++ b/core/res/res/values-kk-rKZ/strings.xml @@ -1023,8 +1023,7 @@ <string name="android_upgrading_title" msgid="1584192285441405746">"Android жаңартылуда…"</string> <string name="android_start_title" msgid="8418054686415318207">"Android іске қосылуда…"</string> <string name="android_upgrading_fstrim" msgid="8036718871534640010">"Қойманы оңтайландыру."</string> - <!-- no translation found for android_upgrading_notification_title (8428357096969413169) --> - <skip /> + <string name="android_upgrading_notification_title" msgid="8428357096969413169">"Android жүйесін жаңарту аяқталуда…"</string> <string name="android_upgrading_notification_body" msgid="5761201379457064286">"Жаңарту аяқталғанға дейін кейбір қолданбалар дұрыс жұмыс істемеуі мүмкін"</string> <string name="app_upgrading_toast" msgid="3008139776215597053">"<xliff:g id="APPLICATION">%1$s</xliff:g> жаңартылуда…"</string> <string name="android_upgrading_apk" msgid="7904042682111526169">"<xliff:g id="NUMBER_1">%2$d</xliff:g> ішінен <xliff:g id="NUMBER_0">%1$d</xliff:g> қолданба оңтайландырылуда."</string> diff --git a/core/res/res/values-km-rKH/strings.xml b/core/res/res/values-km-rKH/strings.xml index 177b4bbb726b..71f8cbabd880 100644 --- a/core/res/res/values-km-rKH/strings.xml +++ b/core/res/res/values-km-rKH/strings.xml @@ -1025,8 +1025,7 @@ <string name="android_upgrading_title" msgid="1584192285441405746">"Android កំពុងធ្វើបច្ចុប្បន្នភាព..."</string> <string name="android_start_title" msgid="8418054686415318207">"Android កំពុងចាប់ផ្ដើម…"</string> <string name="android_upgrading_fstrim" msgid="8036718871534640010">"កំពុងធ្វើឲ្យឧបករណ៍ផ្ទុកមានប្រសិទ្ធភាព។"</string> - <!-- no translation found for android_upgrading_notification_title (8428357096969413169) --> - <skip /> + <string name="android_upgrading_notification_title" msgid="8428357096969413169">"កំពុងបញ្ចប់ការអាប់ដេត Android…"</string> <string name="android_upgrading_notification_body" msgid="5761201379457064286">"កម្មវិធីមួយចំនួនអាចនឹងមិនដំណើរការប្រក្រតីនោះទេ រហូតដល់ការអាប់គ្រេតបញ្ចប់"</string> <string name="app_upgrading_toast" msgid="3008139776215597053">"<xliff:g id="APPLICATION">%1$s</xliff:g> អាប់គ្រេត…"</string> <string name="android_upgrading_apk" msgid="7904042682111526169">"ធ្វើឲ្យកម្មវិធីប្រសើរឡើង <xliff:g id="NUMBER_0">%1$d</xliff:g> នៃ <xliff:g id="NUMBER_1">%2$d</xliff:g> ។"</string> diff --git a/core/res/res/values-kn-rIN/strings.xml b/core/res/res/values-kn-rIN/strings.xml index c338c923d104..770af199d113 100644 --- a/core/res/res/values-kn-rIN/strings.xml +++ b/core/res/res/values-kn-rIN/strings.xml @@ -1023,8 +1023,7 @@ <string name="android_upgrading_title" msgid="1584192285441405746">"Android ಅಪ್ಗ್ರೇಡ್ ಮಾಡಲಾಗುತ್ತಿದೆ…"</string> <string name="android_start_title" msgid="8418054686415318207">"Android ಪ್ರಾರಂಭಿಸಲಾಗುತ್ತಿದೆ…"</string> <string name="android_upgrading_fstrim" msgid="8036718871534640010">"ಸಂಗ್ರಹಣೆಯನ್ನು ಆಪ್ಟಿಮೈಸ್ ಮಾಡಲಾಗುತ್ತಿದೆ."</string> - <!-- no translation found for android_upgrading_notification_title (8428357096969413169) --> - <skip /> + <string name="android_upgrading_notification_title" msgid="8428357096969413169">"Android ಅಪ್ಡೇಟ್ ಮುಗಿಸಲಾಗುತ್ತಿದೆ…"</string> <string name="android_upgrading_notification_body" msgid="5761201379457064286">"ಅಪ್ಗ್ರೇಡ್ ಮುಗಿಯುವ ತನಕ ಕೆಲವು ಅಪ್ಲಿಕೇಶನ್ಗಳು ಸರಿಯಾಗಿ ಕೆಲಸ ಮಾಡದಿರಬಹುದು"</string> <string name="app_upgrading_toast" msgid="3008139776215597053">"<xliff:g id="APPLICATION">%1$s</xliff:g> ಅಪ್ಗ್ರೇಡ್ ಆಗುತ್ತಿದೆ..."</string> <string name="android_upgrading_apk" msgid="7904042682111526169">"<xliff:g id="NUMBER_1">%2$d</xliff:g> ರಲ್ಲಿ <xliff:g id="NUMBER_0">%1$d</xliff:g> ಅಪ್ಲಿಕೇಶನ್ ಆಪ್ಟಿಮೈಸ್ ಮಾಡಲಾಗುತ್ತಿದೆ."</string> diff --git a/core/res/res/values-ko/strings.xml b/core/res/res/values-ko/strings.xml index 728f036961c9..5b446b445a0f 100644 --- a/core/res/res/values-ko/strings.xml +++ b/core/res/res/values-ko/strings.xml @@ -1023,8 +1023,7 @@ <string name="android_upgrading_title" msgid="1584192285441405746">"Android 업그레이드 중.."</string> <string name="android_start_title" msgid="8418054686415318207">"Android가 시작되는 중…"</string> <string name="android_upgrading_fstrim" msgid="8036718871534640010">"저장소 최적화 중"</string> - <!-- no translation found for android_upgrading_notification_title (8428357096969413169) --> - <skip /> + <string name="android_upgrading_notification_title" msgid="8428357096969413169">"Android 업데이트 완료 중…"</string> <string name="android_upgrading_notification_body" msgid="5761201379457064286">"특정 앱은 업그레이드가 완료될 때까지 제대로 작동하지 않을 수 있습니다."</string> <string name="app_upgrading_toast" msgid="3008139776215597053">"<xliff:g id="APPLICATION">%1$s</xliff:g> 업그레이드 중…"</string> <string name="android_upgrading_apk" msgid="7904042682111526169">"앱 <xliff:g id="NUMBER_1">%2$d</xliff:g>개 중 <xliff:g id="NUMBER_0">%1$d</xliff:g>개 최적화 중"</string> diff --git a/core/res/res/values-ky-rKG/strings.xml b/core/res/res/values-ky-rKG/strings.xml index f7bb4509712e..0f82dcbdffcf 100644 --- a/core/res/res/values-ky-rKG/strings.xml +++ b/core/res/res/values-ky-rKG/strings.xml @@ -1023,8 +1023,7 @@ <string name="android_upgrading_title" msgid="1584192285441405746">"Android жаңыртылууда…"</string> <string name="android_start_title" msgid="8418054686415318207">"Android жүргүзүлүүдө…"</string> <string name="android_upgrading_fstrim" msgid="8036718871534640010">"Сактагыч ыңгайлаштырылууда."</string> - <!-- no translation found for android_upgrading_notification_title (8428357096969413169) --> - <skip /> + <string name="android_upgrading_notification_title" msgid="8428357096969413169">"Android\'ди жаңыртуу аякталууда..."</string> <string name="android_upgrading_notification_body" msgid="5761201379457064286">"Жаңыртуу аягына чыкмайынча айрым колдонмолор талаптагыдай иштебей калышы мүмкүн"</string> <string name="app_upgrading_toast" msgid="3008139776215597053">"<xliff:g id="APPLICATION">%1$s</xliff:g> жаңыртылууда..."</string> <string name="android_upgrading_apk" msgid="7904042682111526169">"<xliff:g id="NUMBER_1">%2$d</xliff:g> ичинен <xliff:g id="NUMBER_0">%1$d</xliff:g> колдонмо ыңгайлаштырылууда."</string> diff --git a/core/res/res/values-lt/strings.xml b/core/res/res/values-lt/strings.xml index 9e9b25f6801a..ab38c0caf2ca 100644 --- a/core/res/res/values-lt/strings.xml +++ b/core/res/res/values-lt/strings.xml @@ -1069,8 +1069,7 @@ <string name="android_upgrading_title" msgid="1584192285441405746">"„Android“ naujovinama..."</string> <string name="android_start_title" msgid="8418054686415318207">"Paleidžiama „Android“…"</string> <string name="android_upgrading_fstrim" msgid="8036718871534640010">"Optimizuojama saugykla."</string> - <!-- no translation found for android_upgrading_notification_title (8428357096969413169) --> - <skip /> + <string name="android_upgrading_notification_title" msgid="8428357096969413169">"Baigiamas „Android“ atnauj. procesas…"</string> <string name="android_upgrading_notification_body" msgid="5761201379457064286">"Kai kurios programos gali tinkamai neveikti, kol naujovinimo procesas nebus baigtas"</string> <string name="app_upgrading_toast" msgid="3008139776215597053">"„<xliff:g id="APPLICATION">%1$s</xliff:g>“ naujovinama..."</string> <string name="android_upgrading_apk" msgid="7904042682111526169">"Optimizuojama <xliff:g id="NUMBER_0">%1$d</xliff:g> progr. iš <xliff:g id="NUMBER_1">%2$d</xliff:g>."</string> diff --git a/core/res/res/values-lv/strings.xml b/core/res/res/values-lv/strings.xml index 1f82ad27365b..35b699f8f9c3 100644 --- a/core/res/res/values-lv/strings.xml +++ b/core/res/res/values-lv/strings.xml @@ -1046,8 +1046,7 @@ <string name="android_upgrading_title" msgid="1584192285441405746">"Notiek Android jaunināšana..."</string> <string name="android_start_title" msgid="8418054686415318207">"Notiek Android palaišana…"</string> <string name="android_upgrading_fstrim" msgid="8036718871534640010">"Notiek krātuves optimizēšana."</string> - <!-- no translation found for android_upgrading_notification_title (8428357096969413169) --> - <skip /> + <string name="android_upgrading_notification_title" msgid="8428357096969413169">"Tiek pabeigta Android atjaunināšana…"</string> <string name="android_upgrading_notification_body" msgid="5761201379457064286">"Kamēr jaunināšana nebūs pabeigta, dažas lietotnes, iespējams, nedarbosies pareizi."</string> <string name="app_upgrading_toast" msgid="3008139776215597053">"Notiek lietotnes <xliff:g id="APPLICATION">%1$s</xliff:g> jaunināšana…"</string> <string name="android_upgrading_apk" msgid="7904042682111526169">"Tiek optimizēta <xliff:g id="NUMBER_0">%1$d</xliff:g>. lietotne no <xliff:g id="NUMBER_1">%2$d</xliff:g>."</string> diff --git a/core/res/res/values-mk-rMK/strings.xml b/core/res/res/values-mk-rMK/strings.xml index 87a5eb0993ca..e0ec16a0de9b 100644 --- a/core/res/res/values-mk-rMK/strings.xml +++ b/core/res/res/values-mk-rMK/strings.xml @@ -1023,8 +1023,7 @@ <string name="android_upgrading_title" msgid="1584192285441405746">"Android се ажурира…"</string> <string name="android_start_title" msgid="8418054686415318207">"Android стартува…"</string> <string name="android_upgrading_fstrim" msgid="8036718871534640010">"Оптимизирање на складирањето."</string> - <!-- no translation found for android_upgrading_notification_title (8428357096969413169) --> - <skip /> + <string name="android_upgrading_notification_title" msgid="8428357096969413169">"Се завршува ажурирањето на Android…"</string> <string name="android_upgrading_notification_body" msgid="5761201379457064286">"Некои апликации може да не работат правилно додека не се заврши надградбата"</string> <string name="app_upgrading_toast" msgid="3008139776215597053">"<xliff:g id="APPLICATION">%1$s</xliff:g> се надградува…"</string> <string name="android_upgrading_apk" msgid="7904042682111526169">"Се оптимизира апликација <xliff:g id="NUMBER_0">%1$d</xliff:g> од <xliff:g id="NUMBER_1">%2$d</xliff:g>."</string> diff --git a/core/res/res/values-ml-rIN/strings.xml b/core/res/res/values-ml-rIN/strings.xml index 02668a009045..39d493a6ea5b 100644 --- a/core/res/res/values-ml-rIN/strings.xml +++ b/core/res/res/values-ml-rIN/strings.xml @@ -1023,8 +1023,7 @@ <string name="android_upgrading_title" msgid="1584192285441405746">"Android അപ്ഗ്രേഡുചെയ്യുന്നു…"</string> <string name="android_start_title" msgid="8418054686415318207">"Android ആരംഭിക്കുന്നു…"</string> <string name="android_upgrading_fstrim" msgid="8036718871534640010">"സ്റ്റോറേജ് ഒപ്റ്റിമൈസ് ചെയ്യുന്നു."</string> - <!-- no translation found for android_upgrading_notification_title (8428357096969413169) --> - <skip /> + <string name="android_upgrading_notification_title" msgid="8428357096969413169">"Android അപ്ഡേറ്റ് പൂർത്തിയാക്കുന്നു…"</string> <string name="android_upgrading_notification_body" msgid="5761201379457064286">"അപ്ഗ്രേഡ് പൂർത്തിയാകുന്നത് വരെ ചില ആപ്സ് ശരിയായി പ്രവർത്തിച്ചേക്കില്ല"</string> <string name="app_upgrading_toast" msgid="3008139776215597053">"<xliff:g id="APPLICATION">%1$s</xliff:g> അപ്ഗ്രേഡ് ചെയ്യുന്നു…"</string> <string name="android_upgrading_apk" msgid="7904042682111526169">"<xliff:g id="NUMBER_0">%1$d</xliff:g> / <xliff:g id="NUMBER_1">%2$d</xliff:g> അപ്ലിക്കേഷൻ ഓപ്റ്റിമൈസ് ചെയ്യുന്നു."</string> diff --git a/core/res/res/values-mn-rMN/strings.xml b/core/res/res/values-mn-rMN/strings.xml index 8f70a2551623..5f384a17f3d0 100644 --- a/core/res/res/values-mn-rMN/strings.xml +++ b/core/res/res/values-mn-rMN/strings.xml @@ -1023,8 +1023,7 @@ <string name="android_upgrading_title" msgid="1584192285441405746">"Андройдыг дэвшүүлж байна…"</string> <string name="android_start_title" msgid="8418054686415318207">"Андройд эхэлж байна..."</string> <string name="android_upgrading_fstrim" msgid="8036718871534640010">"Хадгалалтыг сайжруулж байна."</string> - <!-- no translation found for android_upgrading_notification_title (8428357096969413169) --> - <skip /> + <string name="android_upgrading_notification_title" msgid="8428357096969413169">"Андройдын шинэчлэлтийг дуусгаж байна…"</string> <string name="android_upgrading_notification_body" msgid="5761201379457064286">"Шинэчилж дуустал зарим апп хэвийн бус ажиллаж болзошгүй"</string> <string name="app_upgrading_toast" msgid="3008139776215597053">"<xliff:g id="APPLICATION">%1$s</xliff:g>-г сайжруулж байна…"</string> <string name="android_upgrading_apk" msgid="7904042682111526169">"<xliff:g id="NUMBER_1">%2$d</xliff:g>-н <xliff:g id="NUMBER_0">%1$d</xliff:g> апп-г тохируулж байна."</string> diff --git a/core/res/res/values-mr-rIN/strings.xml b/core/res/res/values-mr-rIN/strings.xml index 95407f9e32e9..36d6f6a45336 100644 --- a/core/res/res/values-mr-rIN/strings.xml +++ b/core/res/res/values-mr-rIN/strings.xml @@ -1023,8 +1023,7 @@ <string name="android_upgrading_title" msgid="1584192285441405746">"Android श्रेणीसुधारित होत आहे..."</string> <string name="android_start_title" msgid="8418054686415318207">"Android प्रारंभ करत आहे…"</string> <string name="android_upgrading_fstrim" msgid="8036718871534640010">"संचयन ऑप्टिमाइझ करत आहे."</string> - <!-- no translation found for android_upgrading_notification_title (8428357096969413169) --> - <skip /> + <string name="android_upgrading_notification_title" msgid="8428357096969413169">"Android अद्यतन समाप्त करीत आहे..."</string> <string name="android_upgrading_notification_body" msgid="5761201379457064286">"श्रेणीसुधारणा पूर्ण होईपर्यंत काही अॅप्स योग्यरित्या कार्य करणार नाहीत"</string> <string name="app_upgrading_toast" msgid="3008139776215597053">"<xliff:g id="APPLICATION">%1$s</xliff:g> श्रेणीसुधारित करीत आहे…"</string> <string name="android_upgrading_apk" msgid="7904042682111526169">"<xliff:g id="NUMBER_1">%2$d</xliff:g> पैकी <xliff:g id="NUMBER_0">%1$d</xliff:g> अॅप ऑप्टिमाइझ करत आहे."</string> diff --git a/core/res/res/values-ms-rMY/strings.xml b/core/res/res/values-ms-rMY/strings.xml index dee4268e47cf..7db5c7473fb8 100644 --- a/core/res/res/values-ms-rMY/strings.xml +++ b/core/res/res/values-ms-rMY/strings.xml @@ -1023,8 +1023,7 @@ <string name="android_upgrading_title" msgid="1584192285441405746">"Android sedang menaik taraf..."</string> <string name="android_start_title" msgid="8418054686415318207">"Android sedang dimulakan…"</string> <string name="android_upgrading_fstrim" msgid="8036718871534640010">"Mengoptimumkan storan."</string> - <!-- no translation found for android_upgrading_notification_title (8428357096969413169) --> - <skip /> + <string name="android_upgrading_notification_title" msgid="8428357096969413169">"Menyelesaikan kemas kini Android…"</string> <string name="android_upgrading_notification_body" msgid="5761201379457064286">"Sesetengah apl mungkin tidak berfungsi dengan betul sehingga peningkatan selesai"</string> <string name="app_upgrading_toast" msgid="3008139776215597053">"<xliff:g id="APPLICATION">%1$s</xliff:g> sedang ditingkatkan…"</string> <string name="android_upgrading_apk" msgid="7904042682111526169">"Mengoptimumkan apl <xliff:g id="NUMBER_0">%1$d</xliff:g> daripada <xliff:g id="NUMBER_1">%2$d</xliff:g>."</string> diff --git a/core/res/res/values-my-rMM/strings.xml b/core/res/res/values-my-rMM/strings.xml index 1d9941eab99b..077b88967d19 100644 --- a/core/res/res/values-my-rMM/strings.xml +++ b/core/res/res/values-my-rMM/strings.xml @@ -1023,7 +1023,7 @@ <string name="android_upgrading_title" msgid="1584192285441405746">"အန်ဒရွိုက်ကို မွမ်းမံနေ…"</string> <string name="android_start_title" msgid="8418054686415318207">"Android စတင်နေ…"</string> <string name="android_upgrading_fstrim" msgid="8036718871534640010">"သိုလှောင်မှုအား ပြုပြင်ခြင်း။"</string> - <string name="android_upgrading_notification_title" msgid="8428357096969413169">"Android မွမ်းမံခြင်းကို အပြီးသတ်နေသည်…"</string> + <string name="android_upgrading_notification_title" msgid="8428357096969413169">"Android အပ်ဒိတ်ကို အပြီးသတ်နေသည်…"</string> <string name="android_upgrading_notification_body" msgid="5761201379457064286">"အဆင့်မြှင့်တင်ခြင်း မပြီးဆုံးသေးသ၍ အချို့အက်ပ်များကို ကောင်းမွန်စွာအသုံးပြုနိုင်ဦးမည် မဟုတ်ပါ"</string> <string name="app_upgrading_toast" msgid="3008139776215597053">"<xliff:g id="APPLICATION">%1$s</xliff:g> ကို အဆင့်မြှင့်တင်နေပါသည်…"</string> <string name="android_upgrading_apk" msgid="7904042682111526169">"<xliff:g id="NUMBER_0">%1$d</xliff:g> ထဲက အက်ပ်<xliff:g id="NUMBER_1">%2$d</xliff:g>ကို ဆီလျော်အောင် လုပ်နေ"</string> diff --git a/core/res/res/values-nb/strings.xml b/core/res/res/values-nb/strings.xml index 82584d7a9d02..c9b275c1f7d4 100644 --- a/core/res/res/values-nb/strings.xml +++ b/core/res/res/values-nb/strings.xml @@ -1023,8 +1023,7 @@ <string name="android_upgrading_title" msgid="1584192285441405746">"Android oppgraderes …"</string> <string name="android_start_title" msgid="8418054686415318207">"Android starter …"</string> <string name="android_upgrading_fstrim" msgid="8036718871534640010">"Optimaliser lagring."</string> - <!-- no translation found for android_upgrading_notification_title (8428357096969413169) --> - <skip /> + <string name="android_upgrading_notification_title" msgid="8428357096969413169">"Fullfører Android-oppdatering …"</string> <string name="android_upgrading_notification_body" msgid="5761201379457064286">"Noen apper fungerer kanskje ikke skikkelig før oppgraderingen er fullført"</string> <string name="app_upgrading_toast" msgid="3008139776215597053">"<xliff:g id="APPLICATION">%1$s</xliff:g> oppgraderes …"</string> <string name="android_upgrading_apk" msgid="7904042682111526169">"Optimaliserer app <xliff:g id="NUMBER_0">%1$d</xliff:g> av <xliff:g id="NUMBER_1">%2$d</xliff:g>."</string> diff --git a/core/res/res/values-ne-rNP/strings.xml b/core/res/res/values-ne-rNP/strings.xml index c130c500f828..a0dcfeb89440 100644 --- a/core/res/res/values-ne-rNP/strings.xml +++ b/core/res/res/values-ne-rNP/strings.xml @@ -1029,8 +1029,7 @@ <string name="android_upgrading_title" msgid="1584192285441405746">"एन्ड्रोइड अपग्रेड हुँदैछ…"</string> <string name="android_start_title" msgid="8418054686415318207">"Android शुरू हुँदैछ..."</string> <string name="android_upgrading_fstrim" msgid="8036718871534640010">"भण्डारण अनुकूलन गर्दै।"</string> - <!-- no translation found for android_upgrading_notification_title (8428357096969413169) --> - <skip /> + <string name="android_upgrading_notification_title" msgid="8428357096969413169">"Android को अद्यावधिकलाई सम्पन्न गर्दै…"</string> <string name="android_upgrading_notification_body" msgid="5761201379457064286">"स्तरवृद्धि सम्पन्न नभएसम्म केही अनुप्रयोगहरू राम्ररी काम नगर्न सक्छन्"</string> <string name="app_upgrading_toast" msgid="3008139776215597053">"<xliff:g id="APPLICATION">%1$s</xliff:g> को स्तरवृद्धि हुँदैछ…"</string> <string name="android_upgrading_apk" msgid="7904042682111526169">"अनुप्रयोग अनुकुल हुँदै <xliff:g id="NUMBER_0">%1$d</xliff:g> को <xliff:g id="NUMBER_1">%2$d</xliff:g>।"</string> diff --git a/core/res/res/values-nl/strings.xml b/core/res/res/values-nl/strings.xml index 35c58fe16432..d7f10d3f1d17 100644 --- a/core/res/res/values-nl/strings.xml +++ b/core/res/res/values-nl/strings.xml @@ -1023,8 +1023,7 @@ <string name="android_upgrading_title" msgid="1584192285441405746">"Android wordt bijgewerkt..."</string> <string name="android_start_title" msgid="8418054686415318207">"Android wordt gestart…"</string> <string name="android_upgrading_fstrim" msgid="8036718871534640010">"Opslagruimte wordt geoptimaliseerd."</string> - <!-- no translation found for android_upgrading_notification_title (8428357096969413169) --> - <skip /> + <string name="android_upgrading_notification_title" msgid="8428357096969413169">"Android-update voltooien…"</string> <string name="android_upgrading_notification_body" msgid="5761201379457064286">"Sommige apps werken mogelijk pas correct nadat de upgrade is voltooid"</string> <string name="app_upgrading_toast" msgid="3008139776215597053">"<xliff:g id="APPLICATION">%1$s</xliff:g> upgraden…"</string> <string name="android_upgrading_apk" msgid="7904042682111526169">"App <xliff:g id="NUMBER_0">%1$d</xliff:g> van <xliff:g id="NUMBER_1">%2$d</xliff:g> optimaliseren."</string> diff --git a/core/res/res/values-pa-rIN/strings.xml b/core/res/res/values-pa-rIN/strings.xml index 0a05af3525b5..e717e697f178 100644 --- a/core/res/res/values-pa-rIN/strings.xml +++ b/core/res/res/values-pa-rIN/strings.xml @@ -1023,8 +1023,7 @@ <string name="android_upgrading_title" msgid="1584192285441405746">"Android ਅਪਗ੍ਰੇਡ ਕਰ ਰਿਹਾ ਹੈ…"</string> <string name="android_start_title" msgid="8418054686415318207">"Android ਚਾਲੂ ਕਰ ਰਿਹਾ ਹੈ…"</string> <string name="android_upgrading_fstrim" msgid="8036718871534640010">"ਸਟੋਰੇਜ ਅਨੁਕੂਲ ਕਰ ਰਿਹਾ ਹੈ।"</string> - <!-- no translation found for android_upgrading_notification_title (8428357096969413169) --> - <skip /> + <string name="android_upgrading_notification_title" msgid="8428357096969413169">"Android ਅੱਪਡੇਟ ਮੁਕੰਮਲ ਕੀਤਾ ਜਾ ਰਿਹਾ ਹੈ…"</string> <string name="android_upgrading_notification_body" msgid="5761201379457064286">"ਹੋ ਸਕਦਾ ਹੈ ਕਿ ਕੁਝ ਐਪਾਂ ਅੱਪਗ੍ਰੇਡ ਦੇ ਪੂਰੀ ਹੋਣ ਤੱਕ ਸਹੀ ਢੰਗ ਨਾਲ ਕੰਮ ਨਾ ਕਰਨ"</string> <string name="app_upgrading_toast" msgid="3008139776215597053">"<xliff:g id="APPLICATION">%1$s</xliff:g> ਅੱਪਗ੍ਰੇਡ ਹੋ ਰਹੀ ਹੈ…"</string> <string name="android_upgrading_apk" msgid="7904042682111526169">"<xliff:g id="NUMBER_0">%1$d</xliff:g> <xliff:g id="NUMBER_1">%2$d</xliff:g> ਦਾ ਐਪ ਅਨੁਕੂਲ ਕਰ ਰਿਹਾ ਹੈ।"</string> diff --git a/core/res/res/values-pl/strings.xml b/core/res/res/values-pl/strings.xml index cb968e6b197f..d9e63a626d31 100644 --- a/core/res/res/values-pl/strings.xml +++ b/core/res/res/values-pl/strings.xml @@ -1069,8 +1069,7 @@ <string name="android_upgrading_title" msgid="1584192285441405746">"Android jest uaktualniany..."</string> <string name="android_start_title" msgid="8418054686415318207">"Android się uruchamia…"</string> <string name="android_upgrading_fstrim" msgid="8036718871534640010">"Optymalizacja pamięci."</string> - <!-- no translation found for android_upgrading_notification_title (8428357096969413169) --> - <skip /> + <string name="android_upgrading_notification_title" msgid="8428357096969413169">"Kończę aktualizowanie Androida…"</string> <string name="android_upgrading_notification_body" msgid="5761201379457064286">"Niektóre aplikacje mogą nie działać prawidłowo, dopóki nie zakończy się aktualizacja."</string> <string name="app_upgrading_toast" msgid="3008139776215597053">"Uaktualniam aplikację <xliff:g id="APPLICATION">%1$s</xliff:g>…"</string> <string name="android_upgrading_apk" msgid="7904042682111526169">"Optymalizowanie aplikacji <xliff:g id="NUMBER_0">%1$d</xliff:g> z <xliff:g id="NUMBER_1">%2$d</xliff:g>."</string> diff --git a/core/res/res/values-pt-rBR/strings.xml b/core/res/res/values-pt-rBR/strings.xml index 9feac659978c..eaaad25c91d8 100644 --- a/core/res/res/values-pt-rBR/strings.xml +++ b/core/res/res/values-pt-rBR/strings.xml @@ -1023,8 +1023,7 @@ <string name="android_upgrading_title" msgid="1584192285441405746">"O Android está sendo atualizado..."</string> <string name="android_start_title" msgid="8418054686415318207">"O Android está iniciando..."</string> <string name="android_upgrading_fstrim" msgid="8036718871534640010">"Otimizando o armazenamento."</string> - <!-- no translation found for android_upgrading_notification_title (8428357096969413169) --> - <skip /> + <string name="android_upgrading_notification_title" msgid="8428357096969413169">"Concluindo atualização do Android…"</string> <string name="android_upgrading_notification_body" msgid="5761201379457064286">"Alguns apps podem não funcionar corretamente até que a atualização seja concluída"</string> <string name="app_upgrading_toast" msgid="3008139776215597053">"<xliff:g id="APPLICATION">%1$s</xliff:g> está fazendo upgrade…"</string> <string name="android_upgrading_apk" msgid="7904042682111526169">"Otimizando app <xliff:g id="NUMBER_0">%1$d</xliff:g> de <xliff:g id="NUMBER_1">%2$d</xliff:g>."</string> diff --git a/core/res/res/values-pt-rPT/strings.xml b/core/res/res/values-pt-rPT/strings.xml index 5435a57fa1e1..ae115d877588 100644 --- a/core/res/res/values-pt-rPT/strings.xml +++ b/core/res/res/values-pt-rPT/strings.xml @@ -1023,8 +1023,7 @@ <string name="android_upgrading_title" msgid="1584192285441405746">"O Android está a ser atualizado..."</string> <string name="android_start_title" msgid="8418054686415318207">"O Android está a iniciar…"</string> <string name="android_upgrading_fstrim" msgid="8036718871534640010">"A otimizar o armazenamento."</string> - <!-- no translation found for android_upgrading_notification_title (8428357096969413169) --> - <skip /> + <string name="android_upgrading_notification_title" msgid="8428357096969413169">"A terminar a atualização do Android…"</string> <string name="android_upgrading_notification_body" msgid="5761201379457064286">"Algumas aplicações podem não funcionar corretamente enquanto a atualização não for concluída"</string> <string name="app_upgrading_toast" msgid="3008139776215597053">"O <xliff:g id="APPLICATION">%1$s</xliff:g> está a ser atualizado…"</string> <string name="android_upgrading_apk" msgid="7904042682111526169">"A otimizar a aplicação <xliff:g id="NUMBER_0">%1$d</xliff:g> de <xliff:g id="NUMBER_1">%2$d</xliff:g>."</string> diff --git a/core/res/res/values-pt/strings.xml b/core/res/res/values-pt/strings.xml index 9feac659978c..eaaad25c91d8 100644 --- a/core/res/res/values-pt/strings.xml +++ b/core/res/res/values-pt/strings.xml @@ -1023,8 +1023,7 @@ <string name="android_upgrading_title" msgid="1584192285441405746">"O Android está sendo atualizado..."</string> <string name="android_start_title" msgid="8418054686415318207">"O Android está iniciando..."</string> <string name="android_upgrading_fstrim" msgid="8036718871534640010">"Otimizando o armazenamento."</string> - <!-- no translation found for android_upgrading_notification_title (8428357096969413169) --> - <skip /> + <string name="android_upgrading_notification_title" msgid="8428357096969413169">"Concluindo atualização do Android…"</string> <string name="android_upgrading_notification_body" msgid="5761201379457064286">"Alguns apps podem não funcionar corretamente até que a atualização seja concluída"</string> <string name="app_upgrading_toast" msgid="3008139776215597053">"<xliff:g id="APPLICATION">%1$s</xliff:g> está fazendo upgrade…"</string> <string name="android_upgrading_apk" msgid="7904042682111526169">"Otimizando app <xliff:g id="NUMBER_0">%1$d</xliff:g> de <xliff:g id="NUMBER_1">%2$d</xliff:g>."</string> diff --git a/core/res/res/values-ro/strings.xml b/core/res/res/values-ro/strings.xml index 4743ac101110..6198f126379f 100644 --- a/core/res/res/values-ro/strings.xml +++ b/core/res/res/values-ro/strings.xml @@ -1046,8 +1046,7 @@ <string name="android_upgrading_title" msgid="1584192285441405746">"Android trece la o versiune superioară..."</string> <string name="android_start_title" msgid="8418054686415318207">"Android pornește..."</string> <string name="android_upgrading_fstrim" msgid="8036718871534640010">"Se optimizează stocarea."</string> - <!-- no translation found for android_upgrading_notification_title (8428357096969413169) --> - <skip /> + <string name="android_upgrading_notification_title" msgid="8428357096969413169">"Se finalizează actualizarea Android…"</string> <string name="android_upgrading_notification_body" msgid="5761201379457064286">"Este posibil ca unele aplicații să nu funcționeze corespunzător până când nu se finalizează upgrade-ul"</string> <string name="app_upgrading_toast" msgid="3008139776215597053">"Se face upgrade pentru <xliff:g id="APPLICATION">%1$s</xliff:g>…"</string> <string name="android_upgrading_apk" msgid="7904042682111526169">"Se optimizează aplicația <xliff:g id="NUMBER_0">%1$d</xliff:g> din <xliff:g id="NUMBER_1">%2$d</xliff:g>."</string> diff --git a/core/res/res/values-ru/strings.xml b/core/res/res/values-ru/strings.xml index d5bd7bff65f5..0ef96afb1219 100644 --- a/core/res/res/values-ru/strings.xml +++ b/core/res/res/values-ru/strings.xml @@ -1069,8 +1069,7 @@ <string name="android_upgrading_title" msgid="1584192285441405746">"Обновление Android..."</string> <string name="android_start_title" msgid="8418054686415318207">"Запуск Android…"</string> <string name="android_upgrading_fstrim" msgid="8036718871534640010">"Оптимизация хранилища…"</string> - <!-- no translation found for android_upgrading_notification_title (8428357096969413169) --> - <skip /> + <string name="android_upgrading_notification_title" msgid="8428357096969413169">"Завершается обновление Android"</string> <string name="android_upgrading_notification_body" msgid="5761201379457064286">"Во время обновления возможны неполадки в работе приложений."</string> <string name="app_upgrading_toast" msgid="3008139776215597053">"Обновление приложения \"<xliff:g id="APPLICATION">%1$s</xliff:g>\"…"</string> <string name="android_upgrading_apk" msgid="7904042682111526169">"Оптимизация приложения <xliff:g id="NUMBER_0">%1$d</xliff:g> из <xliff:g id="NUMBER_1">%2$d</xliff:g>."</string> diff --git a/core/res/res/values-si-rLK/strings.xml b/core/res/res/values-si-rLK/strings.xml index bfce9eef3689..4f90b57d8997 100644 --- a/core/res/res/values-si-rLK/strings.xml +++ b/core/res/res/values-si-rLK/strings.xml @@ -1025,8 +1025,7 @@ <string name="android_upgrading_title" msgid="1584192285441405746">"Android උත්ශ්රේණි වෙමින් පවතී..."</string> <string name="android_start_title" msgid="8418054686415318207">"Android ආරම්භ කරමින්…"</string> <string name="android_upgrading_fstrim" msgid="8036718871534640010">"ආචයනය ප්රශස්තිකරණය කිරීම."</string> - <!-- no translation found for android_upgrading_notification_title (8428357096969413169) --> - <skip /> + <string name="android_upgrading_notification_title" msgid="8428357096969413169">"Android යාවත්කාලීනය අවසන් කරමින්…"</string> <string name="android_upgrading_notification_body" msgid="5761201379457064286">"උත්ශ්රේණි කිරීම අවසන් වන තෙක් සමහර යෙදුම් නිසි ලෙස ක්රියා නොකළ හැකිය"</string> <string name="app_upgrading_toast" msgid="3008139776215597053">"<xliff:g id="APPLICATION">%1$s</xliff:g> උත්ශ්රේණි කරමින්…"</string> <string name="android_upgrading_apk" msgid="7904042682111526169">"<xliff:g id="NUMBER_1">%2$d</xliff:g> කින් <xliff:g id="NUMBER_0">%1$d</xliff:g> වැනි යෙදුම ප්රශස්ත කරමින්."</string> diff --git a/core/res/res/values-sk/strings.xml b/core/res/res/values-sk/strings.xml index 9065aea63722..0a4869327367 100644 --- a/core/res/res/values-sk/strings.xml +++ b/core/res/res/values-sk/strings.xml @@ -1069,8 +1069,7 @@ <string name="android_upgrading_title" msgid="1584192285441405746">"Prebieha inovácia systému Android..."</string> <string name="android_start_title" msgid="8418054686415318207">"Systém Android sa spúšťa…"</string> <string name="android_upgrading_fstrim" msgid="8036718871534640010">"Optimalizuje sa úložisko"</string> - <!-- no translation found for android_upgrading_notification_title (8428357096969413169) --> - <skip /> + <string name="android_upgrading_notification_title" msgid="8428357096969413169">"Dokončuje sa aktualizácia Androidu…"</string> <string name="android_upgrading_notification_body" msgid="5761201379457064286">"Niektoré aplikácie môžu správne fungovať až po dokončení inovácie"</string> <string name="app_upgrading_toast" msgid="3008139776215597053">"Aplikácia <xliff:g id="APPLICATION">%1$s</xliff:g> sa inovuje…"</string> <string name="android_upgrading_apk" msgid="7904042682111526169">"Prebieha optimalizácia aplikácie <xliff:g id="NUMBER_0">%1$d</xliff:g> z <xliff:g id="NUMBER_1">%2$d</xliff:g>."</string> diff --git a/core/res/res/values-sl/strings.xml b/core/res/res/values-sl/strings.xml index a5a2c8b6ecd8..7b8a03aa19ab 100644 --- a/core/res/res/values-sl/strings.xml +++ b/core/res/res/values-sl/strings.xml @@ -1069,8 +1069,7 @@ <string name="android_upgrading_title" msgid="1584192285441405746">"Poteka nadgradnja Androida ..."</string> <string name="android_start_title" msgid="8418054686415318207">"Android se zaganja …"</string> <string name="android_upgrading_fstrim" msgid="8036718871534640010">"Optimiziranje shrambe."</string> - <!-- no translation found for android_upgrading_notification_title (8428357096969413169) --> - <skip /> + <string name="android_upgrading_notification_title" msgid="8428357096969413169">"Dokončanje posodobitve Androida …"</string> <string name="android_upgrading_notification_body" msgid="5761201379457064286">"Nekatere aplikacije morda ne bodo delovale pravilno, dokler ne bo dokončana nadgradnja."</string> <string name="app_upgrading_toast" msgid="3008139776215597053">"<xliff:g id="APPLICATION">%1$s</xliff:g> se nadgrajuje …"</string> <string name="android_upgrading_apk" msgid="7904042682111526169">"Optimiranje aplikacije <xliff:g id="NUMBER_0">%1$d</xliff:g> od <xliff:g id="NUMBER_1">%2$d</xliff:g>."</string> diff --git a/core/res/res/values-sq-rAL/strings.xml b/core/res/res/values-sq-rAL/strings.xml index 61c38ff6ee1c..05f0e597c5e7 100644 --- a/core/res/res/values-sq-rAL/strings.xml +++ b/core/res/res/values-sq-rAL/strings.xml @@ -1023,8 +1023,7 @@ <string name="android_upgrading_title" msgid="1584192285441405746">"\"Androidi\" po përditësohet…"</string> <string name="android_start_title" msgid="8418054686415318207">"\"Androidi\" po fillon…"</string> <string name="android_upgrading_fstrim" msgid="8036718871534640010">"Po përshtat ruajtjen."</string> - <!-- no translation found for android_upgrading_notification_title (8428357096969413169) --> - <skip /> + <string name="android_upgrading_notification_title" msgid="8428357096969413169">"Përditësimi i Android po përfundon…"</string> <string name="android_upgrading_notification_body" msgid="5761201379457064286">"Disa aplikacione mund të mos funksionojnë si duhet deri sa të përfundojë përmirësimi"</string> <string name="app_upgrading_toast" msgid="3008139776215597053">"<xliff:g id="APPLICATION">%1$s</xliff:g> po përmirësohet…"</string> <string name="android_upgrading_apk" msgid="7904042682111526169">"Po përshtat aplikacionin <xliff:g id="NUMBER_0">%1$d</xliff:g> nga gjithsej <xliff:g id="NUMBER_1">%2$d</xliff:g>."</string> diff --git a/core/res/res/values-sr/strings.xml b/core/res/res/values-sr/strings.xml index 881b1c7c55c7..517d77752293 100644 --- a/core/res/res/values-sr/strings.xml +++ b/core/res/res/values-sr/strings.xml @@ -1046,8 +1046,7 @@ <string name="android_upgrading_title" msgid="1584192285441405746">"Android се надограђује…"</string> <string name="android_start_title" msgid="8418054686415318207">"Android се покреће…"</string> <string name="android_upgrading_fstrim" msgid="8036718871534640010">"Меморија се оптимизује."</string> - <!-- no translation found for android_upgrading_notification_title (8428357096969413169) --> - <skip /> + <string name="android_upgrading_notification_title" msgid="8428357096969413169">"Довршавамо ажурирање Android-а…"</string> <string name="android_upgrading_notification_body" msgid="5761201379457064286">"Неке апликације можда неће исправно функционисати док се надоградња не доврши"</string> <string name="app_upgrading_toast" msgid="3008139776215597053">"<xliff:g id="APPLICATION">%1$s</xliff:g> се надограђује…"</string> <string name="android_upgrading_apk" msgid="7904042682111526169">"Оптимизовање апликације <xliff:g id="NUMBER_0">%1$d</xliff:g> од <xliff:g id="NUMBER_1">%2$d</xliff:g>."</string> diff --git a/core/res/res/values-sv/strings.xml b/core/res/res/values-sv/strings.xml index 228e0b90e85c..cf1b19ccffc9 100644 --- a/core/res/res/values-sv/strings.xml +++ b/core/res/res/values-sv/strings.xml @@ -1023,8 +1023,7 @@ <string name="android_upgrading_title" msgid="1584192285441405746">"Android uppgraderas ..."</string> <string name="android_start_title" msgid="8418054686415318207">"Android startar …"</string> <string name="android_upgrading_fstrim" msgid="8036718871534640010">"Lagringsutrymmet optimeras."</string> - <!-- no translation found for android_upgrading_notification_title (8428357096969413169) --> - <skip /> + <string name="android_upgrading_notification_title" msgid="8428357096969413169">"Android-uppdateringen slutförs …"</string> <string name="android_upgrading_notification_body" msgid="5761201379457064286">"En del appar kanske inte fungerar som de ska innan uppgraderingen har slutförts"</string> <string name="app_upgrading_toast" msgid="3008139776215597053">"<xliff:g id="APPLICATION">%1$s</xliff:g> uppgraderas …"</string> <string name="android_upgrading_apk" msgid="7904042682111526169">"Optimerar app <xliff:g id="NUMBER_0">%1$d</xliff:g> av <xliff:g id="NUMBER_1">%2$d</xliff:g>."</string> diff --git a/core/res/res/values-sw/strings.xml b/core/res/res/values-sw/strings.xml index b9c995f95cc8..3daaf93ee330 100644 --- a/core/res/res/values-sw/strings.xml +++ b/core/res/res/values-sw/strings.xml @@ -1021,8 +1021,7 @@ <string name="android_upgrading_title" msgid="1584192285441405746">"Toleo jipya la Android linawekwa..."</string> <string name="android_start_title" msgid="8418054686415318207">"Inaanzisha Android..."</string> <string name="android_upgrading_fstrim" msgid="8036718871534640010">"Inaboresha hifadhi."</string> - <!-- no translation found for android_upgrading_notification_title (8428357096969413169) --> - <skip /> + <string name="android_upgrading_notification_title" msgid="8428357096969413169">"Inakamilisha kusasisha Android..."</string> <string name="android_upgrading_notification_body" msgid="5761201379457064286">"Huenda baadhi ya programu zisifanye kazi vizuri hadi itakapomaliza kusasisha"</string> <string name="app_upgrading_toast" msgid="3008139776215597053">"<xliff:g id="APPLICATION">%1$s</xliff:g> inapata toleo jipya…"</string> <string name="android_upgrading_apk" msgid="7904042682111526169">"Inaboresha programu <xliff:g id="NUMBER_0">%1$d</xliff:g> kutoka <xliff:g id="NUMBER_1">%2$d</xliff:g>."</string> diff --git a/core/res/res/values-ta-rIN/strings.xml b/core/res/res/values-ta-rIN/strings.xml index 99488eebac64..e851399e567e 100644 --- a/core/res/res/values-ta-rIN/strings.xml +++ b/core/res/res/values-ta-rIN/strings.xml @@ -1023,8 +1023,7 @@ <string name="android_upgrading_title" msgid="1584192285441405746">"Android மேம்படுத்தப்படுகிறது…"</string> <string name="android_start_title" msgid="8418054686415318207">"Android துவங்குகிறது..."</string> <string name="android_upgrading_fstrim" msgid="8036718871534640010">"சேமிப்பகத்தை உகந்ததாக்குகிறது."</string> - <!-- no translation found for android_upgrading_notification_title (8428357096969413169) --> - <skip /> + <string name="android_upgrading_notification_title" msgid="8428357096969413169">"Android புதுப்பிப்பை நிறைவுசெய்கிறது…"</string> <string name="android_upgrading_notification_body" msgid="5761201379457064286">"மேம்படுத்துவது முடியும் வரை, சில பயன்பாடுகள் சரியாக வேலைசெய்யாமல் போகக்கூடும்"</string> <string name="app_upgrading_toast" msgid="3008139776215597053">"<xliff:g id="APPLICATION">%1$s</xliff:g>ஐ மேம்படுத்துகிறது…"</string> <string name="android_upgrading_apk" msgid="7904042682111526169">"<xliff:g id="NUMBER_0">%1$d</xliff:g> / <xliff:g id="NUMBER_1">%2$d</xliff:g> பயன்பாட்டை ஒருங்கிணைக்கிறது."</string> diff --git a/core/res/res/values-te-rIN/strings.xml b/core/res/res/values-te-rIN/strings.xml index 51f9175a5fee..7c48c8ccbf37 100644 --- a/core/res/res/values-te-rIN/strings.xml +++ b/core/res/res/values-te-rIN/strings.xml @@ -1023,8 +1023,7 @@ <string name="android_upgrading_title" msgid="1584192285441405746">"Android అప్గ్రేడ్ అవుతోంది…"</string> <string name="android_start_title" msgid="8418054686415318207">"Android ప్రారంభమవుతోంది…"</string> <string name="android_upgrading_fstrim" msgid="8036718871534640010">"నిల్వను అనుకూలపరుస్తోంది."</string> - <!-- no translation found for android_upgrading_notification_title (8428357096969413169) --> - <skip /> + <string name="android_upgrading_notification_title" msgid="8428357096969413169">"Android నవీకరణను ముగిస్తోంది…"</string> <string name="android_upgrading_notification_body" msgid="5761201379457064286">"అప్గ్రేడ్ పూర్తయ్యే వరకు కొన్ని అనువర్తనాలు సరిగ్గా పని చేయకపోవచ్చు"</string> <string name="app_upgrading_toast" msgid="3008139776215597053">"<xliff:g id="APPLICATION">%1$s</xliff:g>ని అప్గ్రేడ్ చేస్తోంది…"</string> <string name="android_upgrading_apk" msgid="7904042682111526169">"<xliff:g id="NUMBER_1">%2$d</xliff:g>లో <xliff:g id="NUMBER_0">%1$d</xliff:g> అనువర్తనాన్ని అనుకూలీకరిస్తోంది."</string> diff --git a/core/res/res/values-th/strings.xml b/core/res/res/values-th/strings.xml index d2b7a1b061ac..90d9f9bca794 100644 --- a/core/res/res/values-th/strings.xml +++ b/core/res/res/values-th/strings.xml @@ -1023,8 +1023,7 @@ <string name="android_upgrading_title" msgid="1584192285441405746">"กำลังอัปเกรด Android ..."</string> <string name="android_start_title" msgid="8418054686415318207">"Android กำลังเริ่มต้น…"</string> <string name="android_upgrading_fstrim" msgid="8036718871534640010">"กำลังเพิ่มประสิทธิภาพพื้นที่จัดเก็บข้อมูล"</string> - <!-- no translation found for android_upgrading_notification_title (8428357096969413169) --> - <skip /> + <string name="android_upgrading_notification_title" msgid="8428357096969413169">"กำลังทำการอัปเดต Android ให้เสร็จสิ้น…"</string> <string name="android_upgrading_notification_body" msgid="5761201379457064286">"แอปบางแอปอาจทำงานไม่ถูกต้องจนกว่าจะอัปเกรดเสร็จ"</string> <string name="app_upgrading_toast" msgid="3008139776215597053">"กำลังอัปเกรด <xliff:g id="APPLICATION">%1$s</xliff:g>…"</string> <string name="android_upgrading_apk" msgid="7904042682111526169">"กำลังเพิ่มประสิทธิภาพแอปพลิเคชัน <xliff:g id="NUMBER_0">%1$d</xliff:g> จาก <xliff:g id="NUMBER_1">%2$d</xliff:g> รายการ"</string> diff --git a/core/res/res/values-tl/strings.xml b/core/res/res/values-tl/strings.xml index 7dedd2ad54b3..efb319f52d44 100644 --- a/core/res/res/values-tl/strings.xml +++ b/core/res/res/values-tl/strings.xml @@ -1023,8 +1023,7 @@ <string name="android_upgrading_title" msgid="1584192285441405746">"Nag-a-upgrade ang Android…"</string> <string name="android_start_title" msgid="8418054686415318207">"Nagsisimula ang Android…"</string> <string name="android_upgrading_fstrim" msgid="8036718871534640010">"Ino-optimize ang storage."</string> - <!-- no translation found for android_upgrading_notification_title (8428357096969413169) --> - <skip /> + <string name="android_upgrading_notification_title" msgid="8428357096969413169">"Tinatapos ang pag-update sa Android…"</string> <string name="android_upgrading_notification_body" msgid="5761201379457064286">"Maaaring hindi gumana nang maayos ang ilang app hangga\'t hindi pa natatapos ang pag-upgrade"</string> <string name="app_upgrading_toast" msgid="3008139776215597053">"Nag-a-upgrade ang <xliff:g id="APPLICATION">%1$s</xliff:g>…"</string> <string name="android_upgrading_apk" msgid="7904042682111526169">"Ino-optimize ang app <xliff:g id="NUMBER_0">%1$d</xliff:g> ng <xliff:g id="NUMBER_1">%2$d</xliff:g>."</string> diff --git a/core/res/res/values-tr/strings.xml b/core/res/res/values-tr/strings.xml index 7ae29cd8868b..5a0776ab5f1a 100644 --- a/core/res/res/values-tr/strings.xml +++ b/core/res/res/values-tr/strings.xml @@ -1023,8 +1023,7 @@ <string name="android_upgrading_title" msgid="1584192285441405746">"Android yeni sürüme geçiriliyor..."</string> <string name="android_start_title" msgid="8418054686415318207">"Android başlatılıyor…"</string> <string name="android_upgrading_fstrim" msgid="8036718871534640010">"Depolama optimize ediliyor."</string> - <!-- no translation found for android_upgrading_notification_title (8428357096969413169) --> - <skip /> + <string name="android_upgrading_notification_title" msgid="8428357096969413169">"Android güncellemesi tamamlanıyor…"</string> <string name="android_upgrading_notification_body" msgid="5761201379457064286">"Yeni sürüme geçiş işlemi tamamlanana kadar bazı uygulamalar düzgün çalışmayabilir"</string> <string name="app_upgrading_toast" msgid="3008139776215597053">"<xliff:g id="APPLICATION">%1$s</xliff:g> yeni sürüme geçiriliyor…"</string> <string name="android_upgrading_apk" msgid="7904042682111526169">"<xliff:g id="NUMBER_0">%1$d</xliff:g>/<xliff:g id="NUMBER_1">%2$d</xliff:g> uygulama optimize ediliyor."</string> diff --git a/core/res/res/values-uk/strings.xml b/core/res/res/values-uk/strings.xml index fdf337e429eb..4810e37686af 100644 --- a/core/res/res/values-uk/strings.xml +++ b/core/res/res/values-uk/strings.xml @@ -1069,8 +1069,7 @@ <string name="android_upgrading_title" msgid="1584192285441405746">"Android оновлюється..."</string> <string name="android_start_title" msgid="8418054686415318207">"Запуск ОС Android…"</string> <string name="android_upgrading_fstrim" msgid="8036718871534640010">"Оптимізація пам’яті."</string> - <!-- no translation found for android_upgrading_notification_title (8428357096969413169) --> - <skip /> + <string name="android_upgrading_notification_title" msgid="8428357096969413169">"Завершується оновлення Android…"</string> <string name="android_upgrading_notification_body" msgid="5761201379457064286">"Деякі додатки можуть не працювати належним чином, доки не завершиться оновлення"</string> <string name="app_upgrading_toast" msgid="3008139776215597053">"Додаток <xliff:g id="APPLICATION">%1$s</xliff:g> оновлюється…"</string> <string name="android_upgrading_apk" msgid="7904042682111526169">"Оптимізація програми <xliff:g id="NUMBER_0">%1$d</xliff:g> з <xliff:g id="NUMBER_1">%2$d</xliff:g>."</string> diff --git a/core/res/res/values-ur-rPK/strings.xml b/core/res/res/values-ur-rPK/strings.xml index 3b3fc3504646..f6771325be90 100644 --- a/core/res/res/values-ur-rPK/strings.xml +++ b/core/res/res/values-ur-rPK/strings.xml @@ -1023,8 +1023,7 @@ <string name="android_upgrading_title" msgid="1584192285441405746">"Android اپ گریڈ ہو رہا ہے…"</string> <string name="android_start_title" msgid="8418054686415318207">"Android شروع ہو رہا ہے…"</string> <string name="android_upgrading_fstrim" msgid="8036718871534640010">"اسٹوریج کو بہترین بنایا جا رہا ہے۔"</string> - <!-- no translation found for android_upgrading_notification_title (8428357096969413169) --> - <skip /> + <string name="android_upgrading_notification_title" msgid="8428357096969413169">"Android اپ ڈیٹ ختم ہو رہی ہے…"</string> <string name="android_upgrading_notification_body" msgid="5761201379457064286">"اپ گریڈ ختم ہونے تک شاید کچھ ایپس ٹھیک طرح سے کام نہ کریں"</string> <string name="app_upgrading_toast" msgid="3008139776215597053">"<xliff:g id="APPLICATION">%1$s</xliff:g> اپ گریڈ ہو رہی ہے…"</string> <string name="android_upgrading_apk" msgid="7904042682111526169">"ایپ <xliff:g id="NUMBER_0">%1$d</xliff:g> از <xliff:g id="NUMBER_1">%2$d</xliff:g> کو بہتر بنایا جا رہا ہے۔"</string> diff --git a/core/res/res/values-uz-rUZ/strings.xml b/core/res/res/values-uz-rUZ/strings.xml index 0225d15316d1..8fc6428eb24b 100644 --- a/core/res/res/values-uz-rUZ/strings.xml +++ b/core/res/res/values-uz-rUZ/strings.xml @@ -1023,8 +1023,7 @@ <string name="android_upgrading_title" msgid="1584192285441405746">"Android yangilanmoqda…"</string> <string name="android_start_title" msgid="8418054686415318207">"Android ishga tushmoqda…"</string> <string name="android_upgrading_fstrim" msgid="8036718871534640010">"Xotira optimallashtirilmoqda."</string> - <!-- no translation found for android_upgrading_notification_title (8428357096969413169) --> - <skip /> + <string name="android_upgrading_notification_title" msgid="8428357096969413169">"Android yangilanishi tugay deb qoldi…"</string> <string name="android_upgrading_notification_body" msgid="5761201379457064286">"Yangilanish vaqtida ba’zi ilovalar to‘g‘ri ishlamasligi mumkin"</string> <string name="app_upgrading_toast" msgid="3008139776215597053">"<xliff:g id="APPLICATION">%1$s</xliff:g> ilovasi yangilanmoqda…"</string> <string name="android_upgrading_apk" msgid="7904042682111526169">"Ilovalar optimallashtirilmoqda (<xliff:g id="NUMBER_0">%1$d</xliff:g> / <xliff:g id="NUMBER_1">%2$d</xliff:g>)."</string> diff --git a/core/res/res/values-vi/strings.xml b/core/res/res/values-vi/strings.xml index 9dcf6bf982f1..a537b8f0bb62 100644 --- a/core/res/res/values-vi/strings.xml +++ b/core/res/res/values-vi/strings.xml @@ -1023,8 +1023,7 @@ <string name="android_upgrading_title" msgid="1584192285441405746">"Android đang nâng cấp..."</string> <string name="android_start_title" msgid="8418054686415318207">"Android đang khởi động..."</string> <string name="android_upgrading_fstrim" msgid="8036718871534640010">"Tối ưu hóa lưu trữ."</string> - <!-- no translation found for android_upgrading_notification_title (8428357096969413169) --> - <skip /> + <string name="android_upgrading_notification_title" msgid="8428357096969413169">"Hoàn tất cập nhật Android…"</string> <string name="android_upgrading_notification_body" msgid="5761201379457064286">"Một số ứng dụng có thể không hoạt động bình thường cho đến khi nâng cấp xong"</string> <string name="app_upgrading_toast" msgid="3008139776215597053">"<xliff:g id="APPLICATION">%1$s</xliff:g> đang nâng cấp…"</string> <string name="android_upgrading_apk" msgid="7904042682111526169">"Đang tối ưu hóa ứng dụng <xliff:g id="NUMBER_0">%1$d</xliff:g> trong tổng số <xliff:g id="NUMBER_1">%2$d</xliff:g>."</string> diff --git a/core/res/res/values-zh-rCN/strings.xml b/core/res/res/values-zh-rCN/strings.xml index 0ffc3819c56f..8116ec0500c0 100644 --- a/core/res/res/values-zh-rCN/strings.xml +++ b/core/res/res/values-zh-rCN/strings.xml @@ -1023,8 +1023,7 @@ <string name="android_upgrading_title" msgid="1584192285441405746">"Android正在升级..."</string> <string name="android_start_title" msgid="8418054686415318207">"Android 正在启动…"</string> <string name="android_upgrading_fstrim" msgid="8036718871534640010">"正在优化存储空间。"</string> - <!-- no translation found for android_upgrading_notification_title (8428357096969413169) --> - <skip /> + <string name="android_upgrading_notification_title" msgid="8428357096969413169">"即将完成 Android 更新…"</string> <string name="android_upgrading_notification_body" msgid="5761201379457064286">"在升级完成之前,部分应用可能无法正常运行"</string> <string name="app_upgrading_toast" msgid="3008139776215597053">"正在升级<xliff:g id="APPLICATION">%1$s</xliff:g>…"</string> <string name="android_upgrading_apk" msgid="7904042682111526169">"正在优化第<xliff:g id="NUMBER_0">%1$d</xliff:g>个应用(共<xliff:g id="NUMBER_1">%2$d</xliff:g>个)。"</string> diff --git a/core/res/res/values-zh-rHK/strings.xml b/core/res/res/values-zh-rHK/strings.xml index a453eba2ebe0..ef12eeab56f2 100644 --- a/core/res/res/values-zh-rHK/strings.xml +++ b/core/res/res/values-zh-rHK/strings.xml @@ -1023,8 +1023,7 @@ <string name="android_upgrading_title" msgid="1584192285441405746">"正在升級 Android..."</string> <string name="android_start_title" msgid="8418054686415318207">"Android 正在啟動…"</string> <string name="android_upgrading_fstrim" msgid="8036718871534640010">"正在優化儲存空間。"</string> - <!-- no translation found for android_upgrading_notification_title (8428357096969413169) --> - <skip /> + <string name="android_upgrading_notification_title" msgid="8428357096969413169">"正在完成 Android 更新…"</string> <string name="android_upgrading_notification_body" msgid="5761201379457064286">"部分應用程式需要完成升級方可正常運作"</string> <string name="app_upgrading_toast" msgid="3008139776215597053">"「<xliff:g id="APPLICATION">%1$s</xliff:g>」正在升級…"</string> <string name="android_upgrading_apk" msgid="7904042682111526169">"正在優化第 <xliff:g id="NUMBER_0">%1$d</xliff:g> 個應用程式 (共 <xliff:g id="NUMBER_1">%2$d</xliff:g> 個)。"</string> diff --git a/core/res/res/values-zh-rTW/strings.xml b/core/res/res/values-zh-rTW/strings.xml index 4dd8d8ffcf0e..84e2c2c9f738 100644 --- a/core/res/res/values-zh-rTW/strings.xml +++ b/core/res/res/values-zh-rTW/strings.xml @@ -1023,8 +1023,7 @@ <string name="android_upgrading_title" msgid="1584192285441405746">"正在升級 Android…"</string> <string name="android_start_title" msgid="8418054686415318207">"Android 正在啟動…"</string> <string name="android_upgrading_fstrim" msgid="8036718871534640010">"正在對儲存空間進行最佳化處理。"</string> - <!-- no translation found for android_upgrading_notification_title (8428357096969413169) --> - <skip /> + <string name="android_upgrading_notification_title" msgid="8428357096969413169">"即將完成 Android 更新…"</string> <string name="android_upgrading_notification_body" msgid="5761201379457064286">"升級完成前,部分應用程式可能無法正常運作"</string> <string name="app_upgrading_toast" msgid="3008139776215597053">"正在升級「<xliff:g id="APPLICATION">%1$s</xliff:g>」…"</string> <string name="android_upgrading_apk" msgid="7904042682111526169">"正在最佳化第 <xliff:g id="NUMBER_0">%1$d</xliff:g> 個應用程式 (共 <xliff:g id="NUMBER_1">%2$d</xliff:g> 個)。"</string> diff --git a/core/res/res/values-zu/strings.xml b/core/res/res/values-zu/strings.xml index c6e8988c1b05..0c7af8dd21a5 100644 --- a/core/res/res/values-zu/strings.xml +++ b/core/res/res/values-zu/strings.xml @@ -1023,8 +1023,7 @@ <string name="android_upgrading_title" msgid="1584192285441405746">"I-Android ifaka ezakamuva..."</string> <string name="android_start_title" msgid="8418054686415318207">"I-Android iyaqala…"</string> <string name="android_upgrading_fstrim" msgid="8036718871534640010">"Ikhulisa isitoreji."</string> - <!-- no translation found for android_upgrading_notification_title (8428357096969413169) --> - <skip /> + <string name="android_upgrading_notification_title" msgid="8428357096969413169">"Iqedela isibuyekezo se-Android…"</string> <string name="android_upgrading_notification_body" msgid="5761201379457064286">"Ezinye izinhlelo zokusebenza kungenzeka zingasebenzi kahle kuze kuqedwe ukuthuthukiswa"</string> <string name="app_upgrading_toast" msgid="3008139776215597053">"<xliff:g id="APPLICATION">%1$s</xliff:g> iyathuthukisa…"</string> <string name="android_upgrading_apk" msgid="7904042682111526169">"Ukubeka ezingeni eliphezulu <xliff:g id="NUMBER_0">%1$d</xliff:g> uhlelo lokusebenza <xliff:g id="NUMBER_1">%2$d</xliff:g>"</string> diff --git a/core/tests/coretests/src/com/android/internal/os/BatteryStatsDurationTimerTest.java b/core/tests/coretests/src/com/android/internal/os/BatteryStatsDurationTimerTest.java new file mode 100644 index 000000000000..a15e3679a181 --- /dev/null +++ b/core/tests/coretests/src/com/android/internal/os/BatteryStatsDurationTimerTest.java @@ -0,0 +1,151 @@ +/* + * 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.internal.os; + +import android.os.BatteryStats; +import android.os.Parcel; +import android.support.test.filters.SmallTest; +import android.util.Log; + +import junit.framework.TestCase; + +import org.mockito.Mockito; + +/** + * Test BatteryStatsImpl.DurationTimer. + * + * In these tests, unless otherwise commented, the time increments by + * 2x + 100, to make the subtraction unlikely to alias to another time. + */ +public class BatteryStatsDurationTimerTest extends TestCase { + + @SmallTest + public void testStartStop() throws Exception { + final MockClocks clocks = new MockClocks(); + + final BatteryStatsImpl.TimeBase timeBase = new BatteryStatsImpl.TimeBase(); + timeBase.init(clocks.uptimeMillis(), clocks.elapsedRealtime()); + + final BatteryStatsImpl.DurationTimer timer = new BatteryStatsImpl.DurationTimer(clocks, + null, BatteryStats.WAKE_TYPE_PARTIAL, null, timeBase); + + // TimeBase running, timer not running: current and max are 0 + timeBase.setRunning(true, /* uptimeUs */ 0, /* realtimeUs */ 100*1000); + assertFalse(timer.isRunningLocked()); + assertEquals(0, timer.getCurrentDurationMsLocked(300)); + assertEquals(0, timer.getMaxDurationMsLocked(301)); + + // Start timer: current and max advance + timer.startRunningLocked(700); + assertTrue(timer.isRunningLocked()); + assertEquals(800, timer.getCurrentDurationMsLocked(1500)); + assertEquals(801, timer.getMaxDurationMsLocked(1501)); + + // Stop timer: current resets to 0, max remains + timer.stopRunningLocked(3100); + assertFalse(timer.isRunningLocked()); + assertEquals(0, timer.getCurrentDurationMsLocked(6300)); + assertEquals(2400, timer.getMaxDurationMsLocked(6301)); + + // Start time again, but check with a short time, and make sure max doesn't + // increment. + timer.startRunningLocked(12700); + assertTrue(timer.isRunningLocked()); + assertEquals(100, timer.getCurrentDurationMsLocked(12800)); + assertEquals(2400, timer.getMaxDurationMsLocked(12801)); + + // And stop it again, but with a short time, and make sure it doesn't increment. + timer.stopRunningLocked(12900); + assertFalse(timer.isRunningLocked()); + assertEquals(0, timer.getCurrentDurationMsLocked(13000)); + assertEquals(2400, timer.getMaxDurationMsLocked(13001)); + + // Now start and check that the time doesn't increase if the two times are the same. + timer.startRunningLocked(27000); + assertTrue(timer.isRunningLocked()); + assertEquals(0, timer.getCurrentDurationMsLocked(27000)); + assertEquals(2400, timer.getMaxDurationMsLocked(27000)); + + // Stop the TimeBase. The values should be frozen. + timeBase.setRunning(false, /* uptimeUs */ 10, /* realtimeUs */ 55000*1000); + assertTrue(timer.isRunningLocked()); + assertEquals(28100, timer.getCurrentDurationMsLocked(110100)); // Why 28100 and not 28000? + assertEquals(28100, timer.getMaxDurationMsLocked(110101)); + + // Start the TimeBase. The values should be the old value plus the delta + // between when the timer restarted and the current time + timeBase.setRunning(true, /* uptimeUs */ 10, /* realtimeUs */ 220100*1000); + assertTrue(timer.isRunningLocked()); + assertEquals(28300, timer.getCurrentDurationMsLocked(220300)); // extra 100 from above?? + assertEquals(28301, timer.getMaxDurationMsLocked(220301)); + } + + @SmallTest + public void testReset() throws Exception { + } + + @SmallTest + public void testParceling() throws Exception { + final MockClocks clocks = new MockClocks(); + + final BatteryStatsImpl.TimeBase timeBase = new BatteryStatsImpl.TimeBase(); + timeBase.init(clocks.uptimeMillis(), clocks.elapsedRealtime()); + + final BatteryStatsImpl.DurationTimer timer = new BatteryStatsImpl.DurationTimer(clocks, + null, BatteryStats.WAKE_TYPE_PARTIAL, null, timeBase); + + // Start running on battery. + clocks.realtime = 100; + clocks.uptime = 10; + timeBase.setRunning(true, clocks.uptimeMillis()*1000, clocks.elapsedRealtime()*1000); + + timer.startRunningLocked(300); + + // Check that it did start running + assertEquals(400, timer.getMaxDurationMsLocked(700)); + assertEquals(401, timer.getCurrentDurationMsLocked(701)); + + // Write summary + final Parcel summaryParcel = Parcel.obtain(); + timer.writeSummaryFromParcelLocked(summaryParcel, 1500*1000); + summaryParcel.setDataPosition(0); + + // Read summary + final BatteryStatsImpl.DurationTimer summary = new BatteryStatsImpl.DurationTimer(clocks, + null, BatteryStats.WAKE_TYPE_PARTIAL, null, timeBase); + summary.startRunningLocked(3100); + summary.readSummaryFromParcelLocked(summaryParcel); + // The new one shouldn't be running, and therefore 0 for current time + assertFalse(summary.isRunningLocked()); + assertEquals(0, summary.getCurrentDurationMsLocked(6300)); + // The new one should have the max duration that we had when we wrote it + assertEquals(1200, summary.getMaxDurationMsLocked(6301)); + + // Write full + final Parcel fullParcel = Parcel.obtain(); + timer.writeToParcel(fullParcel, 1500*1000); + fullParcel.setDataPosition(0); + + // Read full - Should be the same as the summary as far as DurationTimer is concerned. + final BatteryStatsImpl.DurationTimer full = new BatteryStatsImpl.DurationTimer(clocks, + null, BatteryStats.WAKE_TYPE_PARTIAL, null, timeBase, fullParcel); + // The new one shouldn't be running, and therefore 0 for current time + assertFalse(full.isRunningLocked()); + assertEquals(0, full.getCurrentDurationMsLocked(6300)); + // The new one should have the max duration that we had when we wrote it + assertEquals(1200, full.getMaxDurationMsLocked(6301)); + } +} diff --git a/core/tests/coretests/src/com/android/internal/os/BatteryStatsTests.java b/core/tests/coretests/src/com/android/internal/os/BatteryStatsTests.java index 78bcbbc4ecb9..9518219f8c6f 100644 --- a/core/tests/coretests/src/com/android/internal/os/BatteryStatsTests.java +++ b/core/tests/coretests/src/com/android/internal/os/BatteryStatsTests.java @@ -5,6 +5,7 @@ import org.junit.runners.Suite; @RunWith(Suite.class) @Suite.SuiteClasses({ + BatteryStatsDurationTimerTest.class, BatteryStatsSamplingTimerTest.class, BatteryStatsServTest.class, BatteryStatsTimeBaseTest.class, diff --git a/graphics/java/android/graphics/drawable/AnimatedVectorDrawable.java b/graphics/java/android/graphics/drawable/AnimatedVectorDrawable.java index 0bdc76f9f359..87c472ec6c95 100644 --- a/graphics/java/android/graphics/drawable/AnimatedVectorDrawable.java +++ b/graphics/java/android/graphics/drawable/AnimatedVectorDrawable.java @@ -1358,7 +1358,7 @@ public class AnimatedVectorDrawable extends Drawable implements Animatable2 { mStartDelays.add(startDelay); nAddAnimator(mSetPtr, propertyPtr, nativeInterpolator, startDelay, duration, - repeatCount); + repeatCount, animator.getRepeatMode()); } /** @@ -1625,7 +1625,8 @@ public class AnimatedVectorDrawable extends Drawable implements Animatable2 { private static native long nCreateAnimatorSet(); private static native void nSetVectorDrawableTarget(long animatorPtr, long vectorDrawablePtr); private static native void nAddAnimator(long setPtr, long propertyValuesHolder, - long nativeInterpolator, long startDelay, long duration, int repeatCount); + long nativeInterpolator, long startDelay, long duration, int repeatCount, + int repeatMode); private static native long nCreateGroupPropertyHolder(long nativePtr, int propertyId, float startValue, float endValue); diff --git a/libs/hwui/Animator.cpp b/libs/hwui/Animator.cpp index dc180188100b..74aa3033ee12 100644 --- a/libs/hwui/Animator.cpp +++ b/libs/hwui/Animator.cpp @@ -123,22 +123,27 @@ void BaseRenderNodeAnimator::resolveStagingRequest(Request request) { mPlayTime = (mPlayState == PlayState::Running || mPlayState == PlayState::Reversing) ? mPlayTime : 0; mPlayState = PlayState::Running; + mPendingActionUponFinish = Action::None; break; case Request::Reverse: mPlayTime = (mPlayState == PlayState::Running || mPlayState == PlayState::Reversing) ? mPlayTime : mDuration; mPlayState = PlayState::Reversing; + mPendingActionUponFinish = Action::None; break; case Request::Reset: mPlayTime = 0; mPlayState = PlayState::Finished; + mPendingActionUponFinish = Action::Reset; break; case Request::Cancel: mPlayState = PlayState::Finished; + mPendingActionUponFinish = Action::None; break; case Request::End: mPlayTime = mPlayState == PlayState::Reversing ? 0 : mDuration; mPlayState = PlayState::Finished; + mPendingActionUponFinish = Action::End; break; default: LOG_ALWAYS_FATAL("Invalid staging request: %d", static_cast<int>(request)); @@ -176,8 +181,6 @@ void BaseRenderNodeAnimator::pushStaging(AnimationContext& context) { mStagingRequests.clear(); if (mStagingPlayState == PlayState::Finished) { - // Set the staging play time and end the animation - updatePlayTime(mPlayTime); callOnFinishedListener(context); } else if (mStagingPlayState == PlayState::Running || mStagingPlayState == PlayState::Reversing) { @@ -236,6 +239,15 @@ bool BaseRenderNodeAnimator::animate(AnimationContext& context) { return false; } if (mPlayState == PlayState::Finished) { + if (mPendingActionUponFinish == Action::Reset) { + // Skip to start. + updatePlayTime(0); + } else if (mPendingActionUponFinish == Action::End) { + // Skip to end. + updatePlayTime(mDuration); + } + // Reset pending action. + mPendingActionUponFinish = Action ::None; return true; } diff --git a/libs/hwui/Animator.h b/libs/hwui/Animator.h index 9476750afd52..72bac6c2a515 100644 --- a/libs/hwui/Animator.h +++ b/libs/hwui/Animator.h @@ -44,6 +44,12 @@ protected: ANDROID_API virtual ~AnimationListener() {} }; +enum class RepeatMode { + // These are the same values as the RESTART and REVERSE in ValueAnimator.java. + Restart = 1, + Reverse = 2 +}; + class BaseRenderNodeAnimator : public VirtualLightRefBase { PREVENT_COPY_AND_ASSIGN(BaseRenderNodeAnimator); public: @@ -159,6 +165,17 @@ private: Cancel, End }; + + // Defines different actions upon finish. + enum class Action { + // For animations that got canceled or finished normally. no more action needs to be done. + None, + // For animations that get reset, the reset will happen in the next animation pulse. + Reset, + // For animations being ended, in the next animation pulse the animation will skip to end. + End + }; + inline void checkMutable(); virtual void transitionToRunning(AnimationContext& context); void doSetStartValue(float value); @@ -166,7 +183,7 @@ private: void resolveStagingRequest(Request request); std::vector<Request> mStagingRequests; - + Action mPendingActionUponFinish = Action::None; }; class RenderPropertyAnimator : public BaseRenderNodeAnimator { diff --git a/libs/hwui/AnimatorManager.cpp b/libs/hwui/AnimatorManager.cpp index 8d5f1a83e211..f170e9cda8af 100644 --- a/libs/hwui/AnimatorManager.cpp +++ b/libs/hwui/AnimatorManager.cpp @@ -83,11 +83,8 @@ void AnimatorManager::pushStaging() { } mNewAnimators.clear(); } - if (mAnimators.size()) { - for (auto& animator : mAnimators) { - animator->pushStaging(mAnimationHandle->context()); - } - mParent.mProperties.updateMatrix(); + for (auto& animator : mAnimators) { + animator->pushStaging(mAnimationHandle->context()); } } diff --git a/libs/hwui/PropertyValuesAnimatorSet.cpp b/libs/hwui/PropertyValuesAnimatorSet.cpp index 796c73b9c3e7..38fb70a92e43 100644 --- a/libs/hwui/PropertyValuesAnimatorSet.cpp +++ b/libs/hwui/PropertyValuesAnimatorSet.cpp @@ -23,11 +23,11 @@ namespace android { namespace uirenderer { void PropertyValuesAnimatorSet::addPropertyAnimator(PropertyValuesHolder* propertyValuesHolder, - Interpolator* interpolator, nsecs_t startDelay, - nsecs_t duration, int repeatCount) { + Interpolator* interpolator, nsecs_t startDelay, nsecs_t duration, int repeatCount, + RepeatMode repeatMode) { PropertyAnimator* animator = new PropertyAnimator(propertyValuesHolder, - interpolator, startDelay, duration, repeatCount); + interpolator, startDelay, duration, repeatCount, repeatMode); mAnimators.emplace_back(animator); // Check whether any child animator is infinite after adding it them to the set. @@ -66,14 +66,9 @@ void PropertyValuesAnimatorSet::onPlayTimeChanged(nsecs_t playTime) { // Note that this set may containing animators modifying the same property, so when we // reset the animators, we need to make sure the animators that end the first will // have the final say on what the property value should be. - (*it)->setFraction(0); + (*it)->setFraction(0, 0); } - } else if (playTime >= mDuration) { - // Skip all the animators to end - for (auto& anim : mAnimators) { - anim->setFraction(1); - } - } else { + } else { for (auto& anim : mAnimators) { anim->setCurrentPlayTime(playTime); } @@ -124,7 +119,8 @@ uint32_t PropertyValuesAnimatorSet::dirtyMask() { } PropertyAnimator::PropertyAnimator(PropertyValuesHolder* holder, Interpolator* interpolator, - nsecs_t startDelay, nsecs_t duration, int repeatCount) + nsecs_t startDelay, nsecs_t duration, int repeatCount, + RepeatMode repeatMode) : mPropertyValuesHolder(holder), mInterpolator(interpolator), mStartDelay(startDelay), mDuration(duration) { if (repeatCount < 0) { @@ -132,24 +128,44 @@ PropertyAnimator::PropertyAnimator(PropertyValuesHolder* holder, Interpolator* i } else { mRepeatCount = repeatCount; } + mRepeatMode = repeatMode; mTotalDuration = ((nsecs_t) mRepeatCount + 1) * mDuration + mStartDelay; } void PropertyAnimator::setCurrentPlayTime(nsecs_t playTime) { - if (playTime >= mStartDelay && playTime < mTotalDuration) { - nsecs_t currentIterationPlayTime = (playTime - mStartDelay) % mDuration; - float fraction = currentIterationPlayTime / (float) mDuration; - setFraction(fraction); - } else if (mLatestFraction < 1.0f && playTime >= mTotalDuration) { - // This makes sure we only set the fraction = 1 once. It is needed because there might - // be another animator modifying the same property after this animator finishes, we need - // to make sure we don't set conflicting values on the same property within one frame. - setFraction(1.0f); + if (playTime < mStartDelay) { + return; } + + float currentIterationFraction; + long iteration; + if (playTime >= mTotalDuration) { + // Reached the end of the animation. + iteration = mRepeatCount; + currentIterationFraction = 1.0f; + } else { + // play time here is in range [mStartDelay, mTotalDuration) + iteration = (playTime - mStartDelay) / mDuration; + currentIterationFraction = ((playTime - mStartDelay) % mDuration) / (float) mDuration; + } + setFraction(currentIterationFraction, iteration); } -void PropertyAnimator::setFraction(float fraction) { - mLatestFraction = fraction; +void PropertyAnimator::setFraction(float fraction, long iteration) { + double totalFraction = fraction + iteration; + // This makes sure we only set the fraction = repeatCount + 1 once. It is needed because there + // might be another animator modifying the same property after this animator finishes, we need + // to make sure we don't set conflicting values on the same property within one frame. + if ((mLatestFraction == mRepeatCount + 1.0) && (totalFraction >= mRepeatCount + 1.0)) { + return; + } + + mLatestFraction = totalFraction; + // Check the play direction (i.e. reverse or restart) every other iteration, and calculate the + // fraction based on the play direction. + if (iteration % 2 && mRepeatMode == RepeatMode::Reverse) { + fraction = 1.0f - fraction; + } float interpolatedFraction = mInterpolator->interpolate(fraction); mPropertyValuesHolder->setFraction(interpolatedFraction); } diff --git a/libs/hwui/PropertyValuesAnimatorSet.h b/libs/hwui/PropertyValuesAnimatorSet.h index f9274e173536..e208b08cc27a 100644 --- a/libs/hwui/PropertyValuesAnimatorSet.h +++ b/libs/hwui/PropertyValuesAnimatorSet.h @@ -26,12 +26,13 @@ namespace uirenderer { class PropertyAnimator { public: PropertyAnimator(PropertyValuesHolder* holder, Interpolator* interpolator, nsecs_t startDelay, - nsecs_t duration, int repeatCount); + nsecs_t duration, int repeatCount, RepeatMode repeatMode); void setCurrentPlayTime(nsecs_t playTime); nsecs_t getTotalDuration() { return mTotalDuration; } - void setFraction(float fraction); + // fraction range: [0, 1], iteration range [0, repeatCount] + void setFraction(float fraction, long iteration); private: std::unique_ptr<PropertyValuesHolder> mPropertyValuesHolder; @@ -40,7 +41,8 @@ private: nsecs_t mDuration; uint32_t mRepeatCount; nsecs_t mTotalDuration; - float mLatestFraction = 0.0f; + RepeatMode mRepeatMode; + double mLatestFraction = 0; }; // TODO: This class should really be named VectorDrawableAnimator @@ -56,7 +58,7 @@ public: void addPropertyAnimator(PropertyValuesHolder* propertyValuesHolder, Interpolator* interpolators, int64_t startDelays, - nsecs_t durations, int repeatCount); + nsecs_t durations, int repeatCount, RepeatMode repeatMode); virtual uint32_t dirtyMask(); bool isInfinite() { return mIsInfinite; } void setVectorDrawable(VectorDrawableRoot* vd) { mVectorDrawable = vd; } diff --git a/libs/hwui/renderthread/CanvasContext.cpp b/libs/hwui/renderthread/CanvasContext.cpp index dafe1d11bbc9..dcaec428449c 100644 --- a/libs/hwui/renderthread/CanvasContext.cpp +++ b/libs/hwui/renderthread/CanvasContext.cpp @@ -578,6 +578,9 @@ void CanvasContext::draw() { = swap.queueDuration; mHaveNewSurface = false; mFrameNumber = -1; + } else { + mCurrentFrameInfo->set(FrameInfoIndex::DequeueBufferDuration) = 0; + mCurrentFrameInfo->set(FrameInfoIndex::QueueBufferDuration) = 0; } // TODO: Use a fence for real completion? diff --git a/packages/Keyguard/res/layout/keyguard_password_view.xml b/packages/Keyguard/res/layout/keyguard_password_view.xml index 7d4501749c44..29c93d5adb03 100644 --- a/packages/Keyguard/res/layout/keyguard_password_view.xml +++ b/packages/Keyguard/res/layout/keyguard_password_view.xml @@ -26,7 +26,6 @@ androidprv:layout_maxWidth="@dimen/keyguard_security_width" androidprv:layout_maxHeight="@dimen/keyguard_security_height" android:gravity="bottom" - android:contentDescription="@string/keyguard_accessibility_password_unlock" > <Space diff --git a/packages/Keyguard/res/layout/keyguard_pin_view.xml b/packages/Keyguard/res/layout/keyguard_pin_view.xml index d3fb9824e106..e75f3c15e9ef 100644 --- a/packages/Keyguard/res/layout/keyguard_pin_view.xml +++ b/packages/Keyguard/res/layout/keyguard_pin_view.xml @@ -26,7 +26,6 @@ androidprv:layout_maxWidth="@dimen/keyguard_security_width" androidprv:layout_maxHeight="@dimen/keyguard_security_max_height" android:orientation="vertical" - android:contentDescription="@string/keyguard_accessibility_pin_unlock" > <include layout="@layout/keyguard_message_area" android:layout_width="match_parent" diff --git a/packages/Keyguard/res/values/strings.xml b/packages/Keyguard/res/values/strings.xml index 09fec81e45ac..ff689aab7a74 100644 --- a/packages/Keyguard/res/values/strings.xml +++ b/packages/Keyguard/res/values/strings.xml @@ -103,15 +103,6 @@ <!-- Time format strings for fall-back clock widget --> <string name="keyguard_widget_24_hours_format" translatable="false">kk\uee01mm</string> - <string name="keyguard_accessibility_pattern_unlock">Pattern unlock.</string> - <!-- Accessibility description of the pin lock. [CHAR_LIMIT=none] --> - <string name="keyguard_accessibility_pin_unlock">Pin unlock.</string> - <!-- Accessibility description of the password lock. [CHAR_LIMIT=none] --> - <string name="keyguard_accessibility_password_unlock">Password unlock.</string> - <!-- Accessibility description of the unlock pattern area. [CHAR_LIMIT=none] --> - <string name="keyguard_accessibility_pattern_area" msgid="7679891324509597904">Pattern area.</string> - <!-- Accessibility description of the unlock slide area. [CHAR_LIMIT=none] --> - <string name="keyguard_accessibility_slide_area">Slide area.</string> <!-- Accessibility description of the PIN password view. [CHAR_LIMIT=none] --> <string name="keyguard_accessibility_pin_area">PIN area</string> <!-- Accessibility description of the SIM PIN password view. [CHAR_LIMIT=none] --> diff --git a/packages/SettingsLib/res/values-bs-rBA/strings.xml b/packages/SettingsLib/res/values-bs-rBA/strings.xml index a11bf3212836..40a3630a4e55 100644 --- a/packages/SettingsLib/res/values-bs-rBA/strings.xml +++ b/packages/SettingsLib/res/values-bs-rBA/strings.xml @@ -146,9 +146,9 @@ <string name="vpn_settings_not_available" msgid="956841430176985598">"VPN postavke nisu dostupne za ovog korisnika"</string> <string name="tethering_settings_not_available" msgid="6765770438438291012">"Postavke za privezivanje nisu dostupne za ovog korisnika"</string> <string name="apn_settings_not_available" msgid="7873729032165324000">"Postavke za naziv pristupne tačke nisu dostupne za ovog korisnika"</string> - <string name="enable_adb" msgid="7982306934419797485">"USB otklanjanje grešaka"</string> + <string name="enable_adb" msgid="7982306934419797485">"Otklanjanje grešaka putem uređaja spojenog na USB"</string> <string name="enable_adb_summary" msgid="4881186971746056635">"Način rada za uklanjanje grešaka kada je povezan USB"</string> - <string name="clear_adb_keys" msgid="4038889221503122743">"Ukini odobrenja otklanjanja grešaka USB-om"</string> + <string name="clear_adb_keys" msgid="4038889221503122743">"Ukini odobrenja otklanjanja grešaka putem uređaja spojenog na USB"</string> <string name="bugreport_in_power" msgid="7923901846375587241">"Prečica za izvještaj o greškama"</string> <string name="bugreport_in_power_summary" msgid="1778455732762984579">"Prikaži tipku za prijavu grešaka u izborniku za potrošnju energije"</string> <string name="keep_screen_on" msgid="1146389631208760344">"Ostani aktivan"</string> @@ -185,9 +185,9 @@ <string name="allow_mock_location_summary" msgid="317615105156345626">"Dozvoli lažne lokacije"</string> <string name="debug_view_attributes" msgid="6485448367803310384">"Omogući pregled atributa prikaza"</string> <string name="mobile_data_always_on_summary" msgid="8149773901431697910">"Uvijek drži mobilne podatke aktivnim, čak i kada je Wi-Fi je aktivan (za brzo prebacivanje između mreža)."</string> - <string name="adb_warning_title" msgid="6234463310896563253">"Omogućiti USB otklanjanje grešaka?"</string> - <string name="adb_warning_message" msgid="7316799925425402244">"USB otklanjanje grešaka je namijenjeno samo u svrhe razvoja aplikacija. Koristite ga za kopiranje podataka između računara i uređaja, instaliranje aplikacija na uređaj bez obavještenja te čitanje podataka iz zapisnika."</string> - <string name="adb_keys_warning_message" msgid="5659849457135841625">"Opozvati pristup otklanjanju grešaka USB-om za sve računare koje ste prethodno ovlastili?"</string> + <string name="adb_warning_title" msgid="6234463310896563253">"Omogućiti otklanjanje grešaka putem uređaja spojenog na USB?"</string> + <string name="adb_warning_message" msgid="7316799925425402244">"Otklanjanje grešaka putem uređaja spojenog na USB je namijenjeno samo u svrhe razvoja aplikacija. Koristite ga za kopiranje podataka između računara i uređaja, instaliranje aplikacija na uređaj bez obavještenja te čitanje podataka iz zapisnika."</string> + <string name="adb_keys_warning_message" msgid="5659849457135841625">"Opozvati pristup otklanjanju grešaka putem uređaja spojenog na USB za sve računare koje ste prethodno ovlastili?"</string> <string name="dev_settings_warning_title" msgid="7244607768088540165">"Dopustiti postavke za razvoj?"</string> <string name="dev_settings_warning_message" msgid="2298337781139097964">"Ove postavke su namijenjene samo za svrhe razvoja. Mogu izazvati pogrešno ponašanje uređaja i aplikacija na njemu."</string> <string name="verify_apps_over_usb_title" msgid="4177086489869041953">"Verifikuj aplikacije putem USB-a"</string> diff --git a/packages/SystemUI/res/layout/volume_dialog.xml b/packages/SystemUI/res/layout/volume_dialog.xml index 4cd635e40c2d..b3ff5d65dbab 100644 --- a/packages/SystemUI/res/layout/volume_dialog.xml +++ b/packages/SystemUI/res/layout/volume_dialog.xml @@ -26,11 +26,21 @@ android:id="@+id/volume_dialog_content" android:layout_width="match_parent" android:layout_height="wrap_content" - android:orientation="vertical" - android:paddingTop="@dimen/volume_dialog_collapsed_padding_top" - android:animateLayoutChanges="true" > + android:orientation="vertical" > - <!-- volume rows added and removed here! :-) --> + <LinearLayout + android:id="@+id/volume_dialog_rows" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:paddingEnd="@dimen/volume_button_size" + android:paddingTop="@dimen/volume_dialog_collapsed_padding_top" + android:orientation="vertical" > + <View android:id="@+id/spacer" + android:layout_width="match_parent" + android:layout_height="@dimen/volume_dialog_expanded_spacer" + android:visibility="gone"/> + <!-- volume rows added and removed here! :-) --> + </LinearLayout> <include layout="@layout/volume_zen_footer" /> diff --git a/packages/SystemUI/res/layout/volume_dialog_row.xml b/packages/SystemUI/res/layout/volume_dialog_row.xml index 95019b873dcf..7328d0597633 100644 --- a/packages/SystemUI/res/layout/volume_dialog_row.xml +++ b/packages/SystemUI/res/layout/volume_dialog_row.xml @@ -19,11 +19,8 @@ android:layout_height="@dimen/volume_row_height" android:clipChildren="false" android:clipToPadding="false" - android:id="@+id/volume_dialog_row" - android:paddingEnd="@dimen/volume_dialog_padding_end" android:orientation="vertical" - android:paddingBottom="@dimen/volume_row_padding_bottom" - android:animateLayoutChanges="true"> + android:paddingBottom="@dimen/volume_row_padding_bottom" > <TextView android:id="@+id/volume_row_header" diff --git a/packages/SystemUI/res/values-bs-rBA/strings.xml b/packages/SystemUI/res/values-bs-rBA/strings.xml index 30ba65499d5f..dcba67bbb655 100644 --- a/packages/SystemUI/res/values-bs-rBA/strings.xml +++ b/packages/SystemUI/res/values-bs-rBA/strings.xml @@ -61,11 +61,11 @@ <string name="label_view" msgid="6304565553218192990">"Prikaži"</string> <string name="always_use_device" msgid="1450287437017315906">"Koristiti kao zadanu opciju za ovaj USB uređaj"</string> <string name="always_use_accessory" msgid="1210954576979621596">"Koristiti kao zadanu opciju za ovaj USB uređaj"</string> - <string name="usb_debugging_title" msgid="4513918393387141949">"Omogućiti otklanjanje grešaka preko USB-a?"</string> + <string name="usb_debugging_title" msgid="4513918393387141949">"Omogućiti otklanjanje grešaka putem uređaja spojenog na USB?"</string> <string name="usb_debugging_message" msgid="2220143855912376496">"RSA otisak prsta za otključavanje računara je: \n<xliff:g id="FINGERPRINT">%1$s</xliff:g>"</string> <string name="usb_debugging_always" msgid="303335496705863070">"Uvijek dozvoli sa ovog računara"</string> - <string name="usb_debugging_secondary_user_title" msgid="6353808721761220421">"Uklanjanje pogreški putem USB-a nije dozvoljeno"</string> - <string name="usb_debugging_secondary_user_message" msgid="8572228137833020196">"Korisnik koji je trenutno prijavljen na uređaju ne može uključiti opciju za otklanjanje grešaka koristeći USB. Da biste koristili ovu funkciju prebacite se na korisnika administratora."</string> + <string name="usb_debugging_secondary_user_title" msgid="6353808721761220421">"Otklanjanje grešaka putem uređaja spojenog na USB nije dozvoljeno"</string> + <string name="usb_debugging_secondary_user_message" msgid="8572228137833020196">"Korisnik koji je trenutno prijavljen na uređaju ne može uključiti opciju za otklanjanje grešaka putem uređaja spojenog na USB. Da biste koristili ovu funkciju prebacite se na korisnika administratora."</string> <string name="compat_mode_on" msgid="6623839244840638213">"Uvećaj prikaz na ekran"</string> <string name="compat_mode_off" msgid="4434467572461327898">"Razvuci prikaz na ekran"</string> <string name="screenshot_saving_ticker" msgid="7403652894056693515">"Spašavanje snimka ekrana..."</string> diff --git a/packages/SystemUI/res/values/dimens.xml b/packages/SystemUI/res/values/dimens.xml index ae4f3cf37ce7..fe67808f6cb0 100644 --- a/packages/SystemUI/res/values/dimens.xml +++ b/packages/SystemUI/res/values/dimens.xml @@ -57,6 +57,9 @@ <!-- The amount to scale each of the status bar icons by. A value of 1 means no scaling. --> <item name="status_bar_icon_scale_factor" format="float" type="dimen">1.0</item> + <!-- max height of a notification such that the content can still fade out when closing --> + <dimen name="max_notification_fadeout_height">100dp</dimen> + <!-- Height of a small notification in the status bar--> <dimen name="notification_min_height">92dp</dimen> @@ -539,7 +542,7 @@ <!-- Volume dialog root view bottom margin, at rest --> <dimen name="volume_dialog_margin_bottom">4dp</dimen> <dimen name="volume_dialog_collapsed_padding_top">8dp</dimen> - <dimen name="volume_dialog_expanded_padding_top">22dp</dimen> + <dimen name="volume_dialog_expanded_spacer">14dp</dimen> <dimen name="volume_dialog_padding_end">40dp</dimen> <dimen name="volume_row_padding_bottom">9.4dp</dimen> diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardService.java b/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardService.java index b354a4cd60d5..84901ee67e71 100644 --- a/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardService.java +++ b/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardService.java @@ -98,9 +98,9 @@ public class KeyguardService extends Service { } @Override // Binder interface - public void dismiss() { + public void dismiss(boolean allowWhileOccluded) { checkPermission(); - mKeyguardViewMediator.dismiss(); + mKeyguardViewMediator.dismiss(allowWhileOccluded); } @Override // Binder interface diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java b/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java index 7c883074a3aa..a39c194bbda2 100644 --- a/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java +++ b/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java @@ -363,7 +363,7 @@ public class KeyguardViewMediator extends SystemUI { UserInfo info = UserManager.get(mContext).getUserInfo(userId); if (info != null && (info.isGuest() || info.isDemo())) { // If we just switched to a guest, try to dismiss keyguard. - dismiss(); + dismiss(false /* allowWhileOccluded */); } } } @@ -500,6 +500,17 @@ public class KeyguardViewMediator extends SystemUI { userId); } } + + @Override + public void onTrustChanged(int userId) { + if (userId == KeyguardUpdateMonitor.getCurrentUser()) { + synchronized (KeyguardViewMediator.this) { + notifyTrustedChangedLocked(mUpdateMonitor.getUserHasTrust(userId)); + } + } + } + + }; ViewMediatorCallback mViewMediatorCallback = new ViewMediatorCallback() { @@ -1253,15 +1264,16 @@ public class KeyguardViewMediator extends SystemUI { /** * Dismiss the keyguard through the security layers. + * @param allowWhileOccluded if true, dismiss the keyguard even if it's currently occluded. */ - public void handleDismiss() { - if (mShowing && !mOccluded) { + public void handleDismiss(boolean allowWhileOccluded) { + if (mShowing && (allowWhileOccluded || !mOccluded)) { mStatusBarKeyguardViewManager.dismiss(); } } - public void dismiss() { - mHandler.sendEmptyMessage(DISMISS); + public void dismiss(boolean allowWhileOccluded) { + mHandler.obtainMessage(DISMISS, allowWhileOccluded ? 1 : 0, 0).sendToTarget(); } /** @@ -1355,6 +1367,9 @@ public class KeyguardViewMediator extends SystemUI { */ public void setCurrentUser(int newUserId) { KeyguardUpdateMonitor.setCurrentUser(newUserId); + synchronized (this) { + notifyTrustedChangedLocked(mUpdateMonitor.getUserHasTrust(newUserId)); + } } private final BroadcastReceiver mBroadcastReceiver = new BroadcastReceiver() { @@ -1463,7 +1478,7 @@ public class KeyguardViewMediator extends SystemUI { } break; case DISMISS: - handleDismiss(); + handleDismiss(msg.arg1 == 1 ? true : false /* allowWhileOccluded */); break; case START_KEYGUARD_EXIT_ANIM: Trace.beginSection("KeyguardViewMediator#handleMessage START_KEYGUARD_EXIT_ANIM"); @@ -1989,6 +2004,20 @@ public class KeyguardViewMediator extends SystemUI { } } + private void notifyTrustedChangedLocked(boolean trusted) { + int size = mKeyguardStateCallbacks.size(); + for (int i = size - 1; i >= 0; i--) { + try { + mKeyguardStateCallbacks.get(i).onTrustedChanged(trusted); + } catch (RemoteException e) { + Slog.w(TAG, "Failed to call notifyTrustedChangedLocked", e); + if (e instanceof DeadObjectException) { + mKeyguardStateCallbacks.remove(i); + } + } + } + } + public void addStateMonitorCallback(IKeyguardStateCallback callback) { synchronized (this) { mKeyguardStateCallbacks.add(callback); @@ -1996,8 +2025,10 @@ public class KeyguardViewMediator extends SystemUI { callback.onSimSecureStateChanged(mUpdateMonitor.isSimPinSecure()); callback.onShowingStateChanged(mShowing); callback.onInputRestrictedStateChanged(mInputRestricted); + callback.onTrustedChanged(mUpdateMonitor.getUserHasTrust( + KeyguardUpdateMonitor.getCurrentUser())); } catch (RemoteException e) { - Slog.w(TAG, "Failed to call onShowingStateChanged or onSimSecureStateChanged or onInputRestrictedStateChanged", e); + Slog.w(TAG, "Failed to call to IKeyguardStateCallback", e); } } } diff --git a/packages/SystemUI/src/com/android/systemui/qs/QSAnimator.java b/packages/SystemUI/src/com/android/systemui/qs/QSAnimator.java index 63444d2bfef7..a21408d4929e 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/QSAnimator.java +++ b/packages/SystemUI/src/com/android/systemui/qs/QSAnimator.java @@ -233,10 +233,14 @@ public class QSAnimator implements Callback, PageListener, Listener, OnLayoutCha .addFloat(mQsPanel.getTileLayout(), "alpha", 0, 1) .addFloat(mQsPanel.getFooter().getView(), "alpha", 0, 1).build(); mAllViews.add(mQsPanel.getFooter().getView()); - Path path = new Path(); - path.moveTo(0, 0); - path.cubicTo(0, 0, 0, 1, 1, 1); - PathInterpolatorBuilder interpolatorBuilder = new PathInterpolatorBuilder(0, 0, 0, 1); + float px = 0; + float py = 1; + if (tiles.size() <= 3) { + px = 1; + } else if (tiles.size() <= 6) { + px = .4f; + } + PathInterpolatorBuilder interpolatorBuilder = new PathInterpolatorBuilder(0, 0, px, py); translationXBuilder.setInterpolator(interpolatorBuilder.getXInterpolator()); translationYBuilder.setInterpolator(interpolatorBuilder.getYInterpolator()); mTranslationXAnimator = translationXBuilder.build(); diff --git a/packages/SystemUI/src/com/android/systemui/qs/QSContainer.java b/packages/SystemUI/src/com/android/systemui/qs/QSContainer.java index d5fb8f249698..ac90ce73fa03 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/QSContainer.java +++ b/packages/SystemUI/src/com/android/systemui/qs/QSContainer.java @@ -146,7 +146,9 @@ public class QSContainer extends FrameLayout { return getHeight(); } if (mQSDetail.isClosingDetail()) { - return mQSPanel.getGridHeight() + mHeader.getCollapsedHeight() + getPaddingBottom(); + int panelHeight = ((LayoutParams) mQSPanel.getLayoutParams()).topMargin + + mQSPanel.getMeasuredHeight(); + return panelHeight + getPaddingBottom(); } else { return getMeasuredHeight(); } diff --git a/packages/SystemUI/src/com/android/systemui/qs/customize/TileAdapter.java b/packages/SystemUI/src/com/android/systemui/qs/customize/TileAdapter.java index 3a693cff7cc9..8d7f6ee72850 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/customize/TileAdapter.java +++ b/packages/SystemUI/src/com/android/systemui/qs/customize/TileAdapter.java @@ -297,6 +297,9 @@ public class TileAdapter extends RecyclerView.Adapter<Holder> implements TileSta mAccessibilityMoving = false; mTiles.remove(mEditIndex--); notifyItemRemoved(mEditIndex - 1); + // Don't remove items when the last position is selected. + if (position == mEditIndex) position--; + move(mAccessibilityFromIndex, position, v); notifyDataSetChanged(); } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/ActivatableNotificationView.java b/packages/SystemUI/src/com/android/systemui/statusbar/ActivatableNotificationView.java index 9afb3846b028..e35ef4469773 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/ActivatableNotificationView.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/ActivatableNotificationView.java @@ -744,6 +744,7 @@ public abstract class ActivatableNotificationView extends ExpandableOutlineView } if (!mWasCancelled) { enableAppearDrawing(false); + onAppearAnimationFinished(isAppearing); } } @@ -760,6 +761,9 @@ public abstract class ActivatableNotificationView extends ExpandableOutlineView mAppearAnimator.start(); } + protected void onAppearAnimationFinished(boolean wasAppearing) { + } + private void cancelAppearAnimation() { if (mAppearAnimator != null) { mAppearAnimator.cancel(); diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/ExpandableNotificationRow.java b/packages/SystemUI/src/com/android/systemui/statusbar/ExpandableNotificationRow.java index 58d402bb7432..02fdd3fc6424 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/ExpandableNotificationRow.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/ExpandableNotificationRow.java @@ -598,7 +598,7 @@ public class ExpandableNotificationRow extends ActivatableNotificationView { } private NotificationHeaderView getVisibleNotificationHeader() { - if (mIsSummaryWithChildren) { + if (mIsSummaryWithChildren && !mShowingPublic) { return mChildrenContainer.getHeaderView(); } return getShowingLayout().getVisibleNotificationHeader(); @@ -1442,13 +1442,30 @@ public class ExpandableNotificationRow extends ActivatableNotificationView { @Override protected View getContentView() { - if (mIsSummaryWithChildren) { + if (mIsSummaryWithChildren && !mShowingPublic) { return mChildrenContainer; } return getShowingLayout(); } @Override + protected void onAppearAnimationFinished(boolean wasAppearing) { + super.onAppearAnimationFinished(wasAppearing); + if (wasAppearing) { + // During the animation the visible view might have changed, so let's make sure all + // alphas are reset + if (mChildrenContainer != null) { + mChildrenContainer.setAlpha(1.0f); + mChildrenContainer.setLayerType(LAYER_TYPE_NONE, null); + } + mPrivateLayout.setAlpha(1.0f); + mPrivateLayout.setLayerType(LAYER_TYPE_NONE, null); + mPublicLayout.setAlpha(1.0f); + mPublicLayout.setLayerType(LAYER_TYPE_NONE, null); + } + } + + @Override public int getExtraBottomPadding() { if (mIsSummaryWithChildren && isGroupExpanded()) { return mIncreasedPaddingBetweenElements; 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 da3fcf7f2a7f..d3ab392d5644 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelView.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelView.java @@ -189,6 +189,7 @@ public class NotificationPanelView extends PanelView implements private boolean mExpandingFromHeadsUp; private boolean mCollapsedOnDown; private int mPositionMinSideMargin; + private int mMaxFadeoutHeight; private int mLastOrientation = -1; private boolean mClosingWithAlphaFadeOut; private boolean mHeadsUpAnimatingAway; @@ -278,6 +279,8 @@ public class NotificationPanelView extends PanelView implements R.dimen.qs_falsing_threshold); mPositionMinSideMargin = getResources().getDimensionPixelSize( R.dimen.notification_panel_min_side_margin); + mMaxFadeoutHeight = getResources().getDimensionPixelSize( + R.dimen.max_notification_fadeout_height); } public void updateResources() { @@ -552,7 +555,9 @@ public class NotificationPanelView extends PanelView implements protected void flingToHeight(float vel, boolean expand, float target, float collapseSpeedUpFactor, boolean expandBecauseOfFalsing) { mHeadsUpTouchHelper.notifyFling(!expand); - setClosingWithAlphaFadeout(!expand && getFadeoutAlpha() == 1.0f); + setClosingWithAlphaFadeout(!expand + && mNotificationStackScroller.getFirstChildIntrinsicHeight() <= mMaxFadeoutHeight + && getFadeoutAlpha() == 1.0f); super.flingToHeight(vel, expand, target, collapseSpeedUpFactor, expandBecauseOfFalsing); } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java index d836c057a838..b4368d69343d 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java @@ -1610,7 +1610,7 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode, && !mNotificationPanel.isTracking() && !mNotificationPanel.isQsExpanded()) { if (mState == StatusBarState.SHADE) { animateCollapsePanels(); - } else if (mState == StatusBarState.SHADE_LOCKED) { + } else if (mState == StatusBarState.SHADE_LOCKED && !isCollapsing()) { goToKeyguard(); } } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/stack/NotificationStackScrollLayout.java b/packages/SystemUI/src/com/android/systemui/statusbar/stack/NotificationStackScrollLayout.java index 20ec0de6c2b3..f72e50beec10 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/stack/NotificationStackScrollLayout.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/stack/NotificationStackScrollLayout.java @@ -701,7 +701,7 @@ public class NotificationStackScrollLayout extends ViewGroup */ private float getExpandTranslationStart() { int startPosition = mTrackingHeadsUp || mHeadsUpManager.hasPinnedHeadsUp() - ? 0 : -getFirstChildMinHeight(); + ? 0 : -getFirstChildIntrinsicHeight(); return startPosition - mTopPadding; } @@ -2009,7 +2009,7 @@ public class NotificationStackScrollLayout extends ViewGroup bottom = Math.min(bottom, getHeight()); } } else { - top = (int) (mTopPadding + mStackTranslation); + top = mTopPadding; bottom = top; } if (mPhoneStatusBar.getBarState() != StatusBarState.KEYGUARD) { @@ -2140,17 +2140,17 @@ public class NotificationStackScrollLayout extends ViewGroup } public int getLayoutMinHeight() { - int firstChildMinHeight = getFirstChildMinHeight(); + int firstChildMinHeight = getFirstChildIntrinsicHeight(); return Math.min(firstChildMinHeight + mBottomStackPeekSize + mBottomStackSlowDownHeight, mMaxLayoutHeight - mTopPadding); } - private int getFirstChildMinHeight() { + public int getFirstChildIntrinsicHeight() { final ExpandableView firstChild = getFirstChildNotGone(); int firstChildMinHeight = firstChild != null ? firstChild.getIntrinsicHeight() : mEmptyShadeView != null - ? mEmptyShadeView.getMinHeight() + ? mEmptyShadeView.getIntrinsicHeight() : mCollapsedSize; if (mOwnScrollY > 0) { firstChildMinHeight = Math.max(firstChildMinHeight - mOwnScrollY, mCollapsedSize); diff --git a/packages/SystemUI/src/com/android/systemui/volume/VolumeDialog.java b/packages/SystemUI/src/com/android/systemui/volume/VolumeDialog.java index 2094c0866d6f..37ea66a9048f 100644 --- a/packages/SystemUI/src/com/android/systemui/volume/VolumeDialog.java +++ b/packages/SystemUI/src/com/android/systemui/volume/VolumeDialog.java @@ -17,9 +17,7 @@ package com.android.systemui.volume; import android.accessibilityservice.AccessibilityServiceInfo; -import android.animation.LayoutTransition; import android.animation.ObjectAnimator; -import android.animation.ValueAnimator; import android.annotation.NonNull; import android.annotation.SuppressLint; import android.app.Dialog; @@ -43,9 +41,11 @@ import android.os.Looper; import android.os.Message; import android.os.SystemClock; import android.provider.Settings.Global; +import android.transition.AutoTransition; +import android.transition.Transition; +import android.transition.TransitionManager; import android.util.DisplayMetrics; import android.util.Log; -import android.util.Slog; import android.util.SparseBooleanArray; import android.view.Gravity; import android.view.MotionEvent; @@ -63,12 +63,12 @@ import android.view.accessibility.AccessibilityManager; import android.view.accessibility.AccessibilityManager.AccessibilityStateChangeListener; import android.view.animation.DecelerateInterpolator; import android.widget.ImageButton; -import android.widget.LinearLayout; import android.widget.SeekBar; import android.widget.SeekBar.OnSeekBarChangeListener; import android.widget.TextView; import com.android.settingslib.Utils; +import com.android.systemui.Interpolators; import com.android.systemui.R; import com.android.systemui.statusbar.policy.ZenModeController; import com.android.systemui.tuner.TunerService; @@ -102,8 +102,10 @@ public class VolumeDialog implements TunerService.Tunable { private final H mHandler = new H(); private final VolumeDialogController mController; + private Window mWindow; private CustomDialog mDialog; private ViewGroup mDialogView; + private ViewGroup mDialogRowsView; private ViewGroup mDialogContentView; private ImageButton mExpandButton; private final List<VolumeRow> mRows = new ArrayList<>(); @@ -114,7 +116,6 @@ public class VolumeDialog implements TunerService.Tunable { private final AccessibilityManager mAccessibilityMgr; private int mExpandButtonAnimationDuration; private ZenFooter mZenFooter; - private LayoutTransition mLayoutTransition; private final Object mSafetyWarningLock = new Object(); private final Accessibility mAccessibility = new Accessibility(); private final ColorStateList mActiveSliderTint; @@ -152,7 +153,8 @@ public class VolumeDialog implements TunerService.Tunable { mZenModeController = zenModeController; mKeyguard = (KeyguardManager) context.getSystemService(Context.KEYGUARD_SERVICE); mAudioManager = (AudioManager) context.getSystemService(Context.AUDIO_SERVICE); - mAccessibilityMgr = (AccessibilityManager) mContext.getSystemService(Context.ACCESSIBILITY_SERVICE); + mAccessibilityMgr = + (AccessibilityManager) mContext.getSystemService(Context.ACCESSIBILITY_SERVICE); mActiveSliderTint = ColorStateList.valueOf(Utils.getColorAccent(mContext)); mInactiveSliderTint = loadColorStateList(R.color.volume_slider_inactive); @@ -172,15 +174,13 @@ public class VolumeDialog implements TunerService.Tunable { mDialog = new CustomDialog(mContext); mSpTexts = new SpTexts(mContext); - mLayoutTransition = new LayoutTransition(); - mLayoutTransition.setDuration(new ValueAnimator().getDuration() / 2); mHovering = false; mShowing = false; - final Window window = mDialog.getWindow(); - window.requestFeature(Window.FEATURE_NO_TITLE); - window.setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT)); - window.clearFlags(WindowManager.LayoutParams.FLAG_DIM_BEHIND); - window.addFlags(WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE + mWindow = mDialog.getWindow(); + mWindow.requestFeature(Window.FEATURE_NO_TITLE); + mWindow.setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT)); + mWindow.clearFlags(WindowManager.LayoutParams.FLAG_DIM_BEHIND); + mWindow.addFlags(WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE | WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN | WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL | WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED @@ -188,7 +188,7 @@ public class VolumeDialog implements TunerService.Tunable { | WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED); mDialog.setCanceledOnTouchOutside(true); final Resources res = mContext.getResources(); - final WindowManager.LayoutParams lp = window.getAttributes(); + final WindowManager.LayoutParams lp = mWindow.getAttributes(); lp.type = mWindowType; lp.format = PixelFormat.TRANSLUCENT; lp.setTitle(VolumeDialog.class.getSimpleName()); @@ -196,9 +196,8 @@ public class VolumeDialog implements TunerService.Tunable { lp.y = res.getDimensionPixelSize(R.dimen.volume_offset_top); lp.gravity = Gravity.TOP; lp.windowAnimations = -1; - window.setAttributes(lp); - window.setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_NOTHING); - + mWindow.setAttributes(lp); + mWindow.setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_NOTHING); mDialog.setContentView(R.layout.volume_dialog); mDialogView = (ViewGroup) mDialog.findViewById(R.id.volume_dialog); @@ -213,13 +212,13 @@ public class VolumeDialog implements TunerService.Tunable { } }); mDialogContentView = (ViewGroup) mDialog.findViewById(R.id.volume_dialog_content); + mDialogRowsView = (ViewGroup) mDialogContentView.findViewById(R.id.volume_dialog_rows); mExpanded = false; mExpandButton = (ImageButton) mDialogView.findViewById(R.id.volume_expand_button); mExpandButton.setOnClickListener(mClickExpand); updateWindowWidthH(); updateExpandButtonH(); - mDialogContentView.setLayoutTransition(mLayoutTransition); mMotion = new VolumeDialogMotion(mDialog, mDialogView, mDialogContentView, mExpandButton, new VolumeDialogMotion.Callback() { @Override @@ -310,10 +309,7 @@ public class VolumeDialog implements TunerService.Tunable { private void addRow(int stream, int iconRes, int iconMuteRes, boolean important) { VolumeRow row = new VolumeRow(); initRow(row, stream, iconRes, iconMuteRes, important); - if (!mRows.isEmpty()) { - addSpacer(row); - } - mDialogContentView.addView(row.view, mDialogContentView.getChildCount() - 2); + mDialogRowsView.addView(row.view); mRows.add(row); } @@ -322,23 +318,10 @@ public class VolumeDialog implements TunerService.Tunable { for (int i = 0; i < N; i++) { final VolumeRow row = mRows.get(i); initRow(row, row.stream, row.iconRes, row.iconMuteRes, row.important); - if (i > 0) { - addSpacer(row); - } - mDialogContentView.addView(row.view, mDialogContentView.getChildCount() - 2); + mDialogRowsView.addView(row.view); } } - private void addSpacer(VolumeRow row) { - final View v = new View(mContext); - v.setId(android.R.id.background); - final int h = mContext.getResources() - .getDimensionPixelSize(R.dimen.volume_slider_interspacing); - final LinearLayout.LayoutParams lp = - new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, h); - mDialogContentView.addView(v, mDialogContentView.getChildCount() - 2, lp); - row.space = v; - } private boolean isAttached() { return mDialogContentView != null && mDialogContentView.isAttachedToWindow(); @@ -392,12 +375,15 @@ public class VolumeDialog implements TunerService.Tunable { row.iconMuteRes = iconMuteRes; row.important = important; row.view = mDialog.getLayoutInflater().inflate(R.layout.volume_dialog_row, null); + row.view.setId(row.stream); row.view.setTag(row); row.header = (TextView) row.view.findViewById(R.id.volume_row_header); + row.header.setId(20 * row.stream); mSpTexts.add(row.header); row.slider = (SeekBar) row.view.findViewById(R.id.volume_row_slider); row.slider.setOnSeekBarChangeListener(new VolumeSeekBarChangeListener(row)); row.anim = null; + row.cachedShowHeaders = VolumePrefs.DEFAULT_SHOW_HEADERS; // forward events above the slider into the slider row.view.setOnTouchListener(new OnTouchListener() { @@ -509,7 +495,7 @@ public class VolumeDialog implements TunerService.Tunable { mMotion.startDismiss(new Runnable() { @Override public void run() { - setExpandedH(false); + updateExpandedH(false); } }); if (mAccessibilityMgr.isEnabled()) { @@ -555,23 +541,65 @@ public class VolumeDialog implements TunerService.Tunable { mHandler.sendEmptyMessageDelayed(H.UPDATE_BOTTOM_MARGIN, getConservativeCollapseDuration()); } - private void setExpandedH(boolean expanded) { + private void updateExpandedH(final boolean expanded) { if (mExpanded == expanded) return; mExpanded = expanded; mExpandButtonAnimationRunning = isAttached(); - if (D.BUG) Log.d(TAG, "setExpandedH " + expanded); - if (!mExpanded && mExpandButtonAnimationRunning) { - prepareForCollapse(); + if (D.BUG) Log.d(TAG, "updateExpandedH " + expanded); + updateExpandButtonH(); + updateFooterH(); + final VolumeRow activeRow = getActiveRow(); + mWindow.setLayout(mWindow.getAttributes().width, ViewGroup.LayoutParams.MATCH_PARENT); + AutoTransition transition = new AutoTransition(); + transition.setDuration(mExpandButtonAnimationDuration); + transition.setInterpolator(Interpolators.LINEAR_OUT_SLOW_IN); + transition.addListener(new Transition.TransitionListener() { + @Override + public void onTransitionStart(Transition transition) { + } + + @Override + public void onTransitionEnd(Transition transition) { + mWindow.setLayout( + mWindow.getAttributes().width, ViewGroup.LayoutParams.WRAP_CONTENT); + } + + @Override + public void onTransitionCancel(Transition transition) { + mWindow.setLayout( + mWindow.getAttributes().width, ViewGroup.LayoutParams.WRAP_CONTENT); + } + + @Override + public void onTransitionPause(Transition transition) { + } + + @Override + public void onTransitionResume(Transition transition) { + } + }); + TransitionManager.endTransitions(mDialogView); + TransitionManager.beginDelayedTransition(mDialogView, transition); + updateRowsH(activeRow); + rescheduleTimeoutH(); + } + + private void updateExpandButtonH() { + if (D.BUG) Log.d(TAG, "updateExpandButtonH"); + mExpandButton.setClickable(!mExpandButtonAnimationRunning); + if (!(mExpandButtonAnimationRunning && isAttached())) { + final int res = mExpanded ? R.drawable.ic_volume_collapse_animation + : R.drawable.ic_volume_expand_animation; + if (hasTouchFeature()) { + mExpandButton.setImageResource(res); + } else { + // if there is no touch feature, show the volume ringer instead + mExpandButton.setImageResource(R.drawable.ic_volume_ringer); + mExpandButton.setBackgroundResource(0); // remove gray background emphasis + } + mExpandButton.setContentDescription(mContext.getString(mExpanded ? + R.string.accessibility_volume_collapse : R.string.accessibility_volume_expand)); } - final Resources res = mContext.getResources(); - int paddingTop = mExpanded - ? res.getDimensionPixelSize(R.dimen.volume_dialog_expanded_padding_top) - : res.getDimensionPixelSize(R.dimen.volume_dialog_collapsed_padding_top); - mDialogContentView.setPaddingRelative(mDialogContentView.getPaddingStart(), - paddingTop, - mDialogContentView.getPaddingEnd(), - mDialogContentView.getPaddingBottom()); - updateRowsH(); if (mExpandButtonAnimationRunning) { final Drawable d = mExpandButton.getDrawable(); if (d instanceof AnimatedVectorDrawable) { @@ -590,60 +618,41 @@ public class VolumeDialog implements TunerService.Tunable { }, mExpandButtonAnimationDuration); } } - rescheduleTimeoutH(); } - private void updateExpandButtonH() { - if (D.BUG) Log.d(TAG, "updateExpandButtonH"); - mExpandButton.setClickable(!mExpandButtonAnimationRunning); - if (mExpandButtonAnimationRunning && isAttached()) return; - final int res = mExpanded ? R.drawable.ic_volume_collapse_animation - : R.drawable.ic_volume_expand_animation; - if (hasTouchFeature()) { - mExpandButton.setImageResource(res); - } else { - // if there is no touch feature, show the volume ringer instead - mExpandButton.setImageResource(R.drawable.ic_volume_ringer); - mExpandButton.setBackgroundResource(0); // remove gray background emphasis - } - mExpandButton.setContentDescription(mContext.getString(mExpanded ? - R.string.accessibility_volume_collapse : R.string.accessibility_volume_expand)); - } - - private boolean isVisibleH(VolumeRow row, boolean isActive) { + private boolean shouldBeVisibleH(VolumeRow row, boolean isActive) { return mExpanded && row.view.getVisibility() == View.VISIBLE || (mExpanded && (row.important || isActive)) || !mExpanded && isActive; } - private void updateRowsH() { + private void updateRowsH(final VolumeRow activeRow) { if (D.BUG) Log.d(TAG, "updateRowsH"); - final VolumeRow activeRow = getActiveRow(); - updateFooterH(); - updateExpandButtonH(); if (!mShowing) { trimObsoleteH(); } + Util.setVisOrGone(mDialogRowsView.findViewById(R.id.spacer), mExpanded); // apply changes to all rows - for (VolumeRow row : mRows) { + for (final VolumeRow row : mRows) { final boolean isActive = row == activeRow; - final boolean visible = isVisibleH(row, isActive); - Util.setVisOrGone(row.view, visible); - Util.setVisOrGone(row.space, visible && mExpanded); - updateVolumeRowHeaderVisibleH(row); - updateVolumeRowSliderTintH(row, isActive); + final boolean shouldBeVisible = shouldBeVisibleH(row, isActive); + Util.setVisOrGone(row.view, shouldBeVisible); + if (row.view.isShown()) { + updateVolumeRowHeaderVisibleH(row); + updateVolumeRowSliderTintH(row, isActive); + } } + } private void trimObsoleteH() { if (D.BUG) Log.d(TAG, "trimObsoleteH"); - for (int i = mRows.size() -1; i >= 0; i--) { + for (int i = mRows.size() - 1; i >= 0; i--) { final VolumeRow row = mRows.get(i); if (row.ss == null || !row.ss.dynamic) continue; if (!mDynamic.get(row.stream)) { mRows.remove(i); - mDialogContentView.removeView(row.view); - mDialogContentView.removeView(row.space); + mDialogRowsView.removeView(row.view); } } } @@ -670,7 +679,7 @@ public class VolumeDialog implements TunerService.Tunable { if (mActiveStream != state.activeStream) { mActiveStream = state.activeStream; - updateRowsH(); + updateRowsH(getActiveRow()); rescheduleTimeoutH(); } for (VolumeRow row : mRows) { @@ -731,9 +740,6 @@ public class VolumeDialog implements TunerService.Tunable { && mState.ringerModeInternal == AudioManager.RINGER_MODE_SILENT; final boolean isZenAlarms = mState.zenMode == Global.ZEN_MODE_ALARMS; final boolean isZenNone = mState.zenMode == Global.ZEN_MODE_NO_INTERRUPTIONS; - final boolean isZenPriority = mState.zenMode == Global.ZEN_MODE_IMPORTANT_INTERRUPTIONS; - final boolean isRingZenNone = (isRingStream || isSystemStream) && isZenNone; - final boolean isRingLimited = isRingStream && isZenPriority; final boolean zenMuted = isZenAlarms ? (isRingStream || isSystemStream) : isZenNone ? (isRingStream || isSystemStream || isAlarmStream || isMusicStream) : false; @@ -1023,7 +1029,7 @@ public class VolumeDialog implements TunerService.Tunable { if (mExpandButtonAnimationRunning) return; final boolean newExpand = !mExpanded; Events.writeEvent(mContext, Events.EVENT_EXPAND, newExpand); - setExpandedH(newExpand); + updateExpandedH(newExpand); } }; @@ -1220,7 +1226,6 @@ public class VolumeDialog implements TunerService.Tunable { private static class VolumeRow { private View view; - private View space; private TextView header; private ImageButton icon; private SeekBar slider; diff --git a/services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java b/services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java index 7ebc150bb30b..4dab0b1374f1 100644 --- a/services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java +++ b/services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java @@ -1111,9 +1111,11 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub { private void addServiceLocked(Service service, UserState userState) { try { - service.onAdded(); - userState.mBoundServices.add(service); - userState.mComponentNameToServiceMap.put(service.mComponentName, service); + if (!userState.mBoundServices.contains(service)) { + service.onAdded(); + userState.mBoundServices.add(service); + userState.mComponentNameToServiceMap.put(service.mComponentName, service); + } } catch (RemoteException re) { /* do nothing */ } @@ -1126,8 +1128,14 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub { */ private void removeServiceLocked(Service service, UserState userState) { userState.mBoundServices.remove(service); - userState.mComponentNameToServiceMap.remove(service.mComponentName); service.onRemoved(); + // It may be possible to bind a service twice, which confuses the map. Rebuild the map + // to make sure we can still reach a service + userState.mComponentNameToServiceMap.clear(); + for (int i = 0; i < userState.mBoundServices.size(); i++) { + Service boundService = userState.mBoundServices.get(i); + userState.mComponentNameToServiceMap.put(boundService.mComponentName, boundService); + } } /** @@ -2324,15 +2332,12 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub { } /** - * Unbinds form the accessibility service and removes it from the data + * Unbinds from the accessibility service and removes it from the data * structures for service management. * * @return True if unbinding is successful. */ public boolean unbindLocked() { - if (mService == null) { - return false; - } UserState userState = getUserStateLocked(mUserId); getKeyEventDispatcher().flush(this); if (!mIsAutomation) { @@ -3033,7 +3038,7 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub { @Override public void onServiceDisconnected(ComponentName componentName) { - /* do nothing - #binderDied takes care */ + binderDied(); } public void onAdded() throws RemoteException { @@ -3062,14 +3067,18 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub { } public void unlinkToOwnDeathLocked() { - mService.unlinkToDeath(this, 0); + if (mService != null) { + mService.unlinkToDeath(this, 0); + } } public void resetLocked() { try { // Clear the proxy in the other process so this // IAccessibilityServiceConnection can be garbage collected. - mServiceInterface.init(null, mId, null); + if (mServiceInterface != null) { + mServiceInterface.init(null, mId, null); + } } catch (RemoteException re) { /* ignore */ } @@ -3093,10 +3102,10 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub { mWasConnectedAndDied = true; getKeyEventDispatcher().flush(this); UserState userState = getUserStateLocked(mUserId); - // The death recipient is unregistered in removeServiceLocked - removeServiceLocked(this, userState); resetLocked(); if (mIsAutomation) { + // This is typically done when unbinding, but UiAutomation isn't bound. + removeServiceLocked(this, userState); // We no longer have an automation service, so restore // the state based on values in the settings database. userState.mInstalledServices.remove(mAccessibilityServiceInfo); diff --git a/services/core/java/com/android/server/AlarmManagerService.java b/services/core/java/com/android/server/AlarmManagerService.java index 57c25a2d9a8c..03160932063c 100644 --- a/services/core/java/com/android/server/AlarmManagerService.java +++ b/services/core/java/com/android/server/AlarmManagerService.java @@ -2472,8 +2472,10 @@ class AlarmManagerService extends SystemService { Slog.v(TAG, "Time changed notification from kernel; rebatching"); } removeImpl(mTimeTickSender); + removeImpl(mDateChangeSender); rebatchAllAlarms(); mClockReceiver.scheduleTimeTickEvent(); + mClockReceiver.scheduleDateChangedEvent(); synchronized (mLock) { mNumTimeChanged++; mLastTimeChangeClockTime = nowRTC; diff --git a/services/core/java/com/android/server/LocationManagerService.java b/services/core/java/com/android/server/LocationManagerService.java index 36ec2eb9a192..64ca2e3eb3de 100644 --- a/services/core/java/com/android/server/LocationManagerService.java +++ b/services/core/java/com/android/server/LocationManagerService.java @@ -150,7 +150,7 @@ public class LocationManagerService extends ILocationManager.Stub { // used internally for synchronization private final Object mLock = new Object(); - // --- fields below are final after systemReady() --- + // --- fields below are final after systemRunning() --- private LocationFudger mLocationFudger; private GeofenceManager mGeofenceManager; private PackageManager mPackageManager; @@ -168,6 +168,7 @@ public class LocationManagerService extends ILocationManager.Stub { // --- fields below are protected by mLock --- // Set of providers that are explicitly enabled + // Only used by passive, fused & test. Network & GPS are controlled separately, and not listed. private final Set<String> mEnabledProviders = new HashSet<String>(); // Set of providers that are explicitly disabled @@ -236,12 +237,12 @@ public class LocationManagerService extends ILocationManager.Stub { if (D) Log.d(TAG, "Constructed"); - // most startup is deferred until systemReady() + // most startup is deferred until systemRunning() } public void systemRunning() { synchronized (mLock) { - if (D) Log.d(TAG, "systemReady()"); + if (D) Log.d(TAG, "systemRunning()"); // fetch package manager mPackageManager = mContext.getPackageManager(); @@ -321,7 +322,11 @@ public class LocationManagerService extends ILocationManager.Stub { || Intent.ACTION_MANAGED_PROFILE_REMOVED.equals(action)) { updateUserProfiles(mCurrentUserId); } else if (Intent.ACTION_SHUTDOWN.equals(action)) { - shutdownComponents(); + // shutdown only if UserId indicates whole system, not just one user + if(D) Log.d(TAG, "Shutdown received with UserId: " + getSendingUserId()); + if (getSendingUserId() == UserHandle.USER_ALL) { + shutdownComponents(); + } } } }, UserHandle.ALL, intentFilter, null, mLocationHandler); diff --git a/services/core/java/com/android/server/am/ActivityRecord.java b/services/core/java/com/android/server/am/ActivityRecord.java index 6e40cfff5411..00fda43f4ca4 100755 --- a/services/core/java/com/android/server/am/ActivityRecord.java +++ b/services/core/java/com/android/server/am/ActivityRecord.java @@ -221,7 +221,12 @@ final class ActivityRecord { boolean pendingVoiceInteractionStart; // Waiting for activity-invoked voice session IVoiceInteractionSession voiceSession; // Voice interaction session for this activity - int mRotationAnimationHint; + // A hint to override the window specified rotation animation, or -1 + // to use the window specified value. We use this so that + // we can select the right animation in the cases of starting + // windows, where the app hasn't had time to set a value + // on the window. + int mRotationAnimationHint = -1; private static String startingWindowStateToString(int state) { switch (state) { diff --git a/services/core/java/com/android/server/am/ActivityStack.java b/services/core/java/com/android/server/am/ActivityStack.java index 5624260a2658..a27adf7fcf16 100644 --- a/services/core/java/com/android/server/am/ActivityStack.java +++ b/services/core/java/com/android/server/am/ActivityStack.java @@ -988,7 +988,7 @@ final class ActivityStack { if (DEBUG_PAUSE) Slog.v(TAG_PAUSE, "Sleep needs to pause " + mResumedActivity); if (DEBUG_USER_LEAVING) Slog.v(TAG_USER_LEAVING, "Sleep => pause with userLeaving=false"); - startPausingLocked(false, true, false, false); + startPausingLocked(false, true, null, false); return true; } if (mPausingActivity != null) { @@ -1066,15 +1066,16 @@ final class ActivityStack { * @param userLeaving True if this should result in an onUserLeaving to the current activity. * @param uiSleeping True if this is happening with the user interface going to sleep (the * screen turning off). - * @param resuming True if this is being called as part of resuming the top activity, so - * we shouldn't try to instigate a resume here. + * @param resuming The activity we are currently trying to resume or null if this is not being + * called as part of resuming the top activity, so we shouldn't try to instigate + * a resume here if not null. * @param dontWait True if the caller does not want to wait for the pause to complete. If * set to true, we will immediately complete the pause here before returning. * @return Returns true if an activity now is in the PAUSING state, and we are waiting for * it to tell us when it is done. */ - final boolean startPausingLocked(boolean userLeaving, boolean uiSleeping, boolean resuming, - boolean dontWait) { + final boolean startPausingLocked(boolean userLeaving, boolean uiSleeping, + ActivityRecord resuming, boolean dontWait) { if (mPausingActivity != null) { Slog.wtf(TAG, "Going to pause when pause is already pending for " + mPausingActivity + " state=" + mPausingActivity.state); @@ -1082,12 +1083,12 @@ final class ActivityStack { // Avoid recursion among check for sleep and complete pause during sleeping. // Because activity will be paused immediately after resume, just let pause // be completed by the order of activity paused from clients. - completePauseLocked(false); + completePauseLocked(false, resuming); } } ActivityRecord prev = mResumedActivity; if (prev == null) { - if (!resuming) { + if (resuming == null) { Slog.wtf(TAG, "Trying to pause when nothing is resumed"); mStackSupervisor.resumeFocusedStackTopActivityLocked(); } @@ -1160,7 +1161,7 @@ final class ActivityStack { if (dontWait) { // If the caller said they don't want to wait for the pause, then complete // the pause now. - completePauseLocked(false); + completePauseLocked(false, resuming); return false; } else { @@ -1179,7 +1180,7 @@ final class ActivityStack { // This activity failed to schedule the // pause, so just treat it as being paused now. if (DEBUG_PAUSE) Slog.v(TAG_PAUSE, "Activity not running, resuming next."); - if (!resuming) { + if (resuming == null) { mStackSupervisor.resumeFocusedStackTopActivityLocked(); } return false; @@ -1196,7 +1197,7 @@ final class ActivityStack { if (mPausingActivity == r) { if (DEBUG_STATES) Slog.v(TAG_STATES, "Moving to PAUSED: " + r + (timeout ? " (due to timeout)" : " (pause complete)")); - completePauseLocked(true); + completePauseLocked(true, null); return; } else { EventLog.writeEvent(EventLogTags.AM_FAILED_TO_PAUSE, @@ -1267,7 +1268,7 @@ final class ActivityStack { } } - private void completePauseLocked(boolean resumeNext) { + private void completePauseLocked(boolean resumeNext, ActivityRecord resuming) { ActivityRecord prev = mPausingActivity; if (DEBUG_PAUSE) Slog.v(TAG_PAUSE, "Complete pause: " + prev); @@ -1359,7 +1360,7 @@ final class ActivityStack { mStackSupervisor.mAppVisibilitiesChangedSinceLastPause = false; } - mStackSupervisor.ensureActivitiesVisibleLocked(null, 0, !PRESERVE_WINDOWS); + mStackSupervisor.ensureActivitiesVisibleLocked(resuming, 0, !PRESERVE_WINDOWS); } private void addToStopping(ActivityRecord r, boolean immediate) { @@ -2256,11 +2257,11 @@ final class ActivityStack { // We need to start pausing the current activity so the top one can be resumed... final boolean dontWaitForPause = (next.info.flags & FLAG_RESUME_WHILE_PAUSING) != 0; - boolean pausing = mStackSupervisor.pauseBackStacks(userLeaving, true, dontWaitForPause); + boolean pausing = mStackSupervisor.pauseBackStacks(userLeaving, next, dontWaitForPause); if (mResumedActivity != null) { if (DEBUG_STATES) Slog.d(TAG_STATES, "resumeTopActivityLocked: Pausing " + mResumedActivity); - pausing |= startPausingLocked(userLeaving, false, true, dontWaitForPause); + pausing |= startPausingLocked(userLeaving, false, next, dontWaitForPause); } if (pausing) { if (DEBUG_SWITCH || DEBUG_STATES) Slog.v(TAG_STATES, @@ -3497,7 +3498,7 @@ final class ActivityStack { if (DEBUG_PAUSE) Slog.v(TAG_PAUSE, "Finish needs to pause: " + r); if (DEBUG_USER_LEAVING) Slog.v(TAG_USER_LEAVING, "finish() => pause with userLeaving=false"); - startPausingLocked(false, false, false, false); + startPausingLocked(false, false, null, false); } if (endTask) { diff --git a/services/core/java/com/android/server/am/ActivityStackSupervisor.java b/services/core/java/com/android/server/am/ActivityStackSupervisor.java index e31df57f56d4..1cb83d282c4c 100644 --- a/services/core/java/com/android/server/am/ActivityStackSupervisor.java +++ b/services/core/java/com/android/server/am/ActivityStackSupervisor.java @@ -781,20 +781,25 @@ public final class ActivityStackSupervisor implements DisplayListener { } } + static int nextTaskIdForUser(int taskId, int userId) { + int nextTaskId = taskId + 1; + if (nextTaskId == (userId + 1) * MAX_TASK_IDS_PER_USER) { + // Wrap around as there will be smaller task ids that are available now. + nextTaskId -= MAX_TASK_IDS_PER_USER; + } + return nextTaskId; + } + int getNextTaskIdForUserLocked(int userId) { final int currentTaskId = mCurTaskIdForUser.get(userId, userId * MAX_TASK_IDS_PER_USER); // for a userId u, a taskId can only be in the range // [u*MAX_TASK_IDS_PER_USER, (u+1)*MAX_TASK_IDS_PER_USER-1], so if MAX_TASK_IDS_PER_USER // was 10, user 0 could only have taskIds 0 to 9, user 1: 10 to 19, user 2: 20 to 29, so on. - int candidateTaskId = currentTaskId; + int candidateTaskId = nextTaskIdForUser(currentTaskId, userId); while (mRecentTasks.taskIdTakenForUserLocked(candidateTaskId, userId) || anyTaskForIdLocked(candidateTaskId, !RESTORE_FROM_RECENTS, INVALID_STACK_ID) != null) { - candidateTaskId++; - if (candidateTaskId == (userId + 1) * MAX_TASK_IDS_PER_USER) { - // Wrap around as there will be smaller task ids that are available now. - candidateTaskId -= MAX_TASK_IDS_PER_USER; - } + candidateTaskId = nextTaskIdForUser(candidateTaskId, userId); if (candidateTaskId == currentTaskId) { // Something wrong! // All MAX_TASK_IDS_PER_USER task ids are taken up by running tasks for this user @@ -918,9 +923,12 @@ public final class ActivityStackSupervisor implements DisplayListener { /** * Pause all activities in either all of the stacks or just the back stacks. * @param userLeaving Passed to pauseActivity() to indicate whether to call onUserLeaving(). + * @param resuming The resuming activity. + * @param dontWait The resuming activity isn't going to wait for all activities to be paused + * before resuming. * @return true if any activity was paused as a result of this call. */ - boolean pauseBackStacks(boolean userLeaving, boolean resuming, boolean dontWait) { + boolean pauseBackStacks(boolean userLeaving, ActivityRecord resuming, boolean dontWait) { boolean someActivityPaused = false; for (int displayNdx = mActivityDisplays.size() - 1; displayNdx >= 0; --displayNdx) { ArrayList<ActivityStack> stacks = mActivityDisplays.valueAt(displayNdx).mStacks; @@ -959,7 +967,7 @@ public final class ActivityStackSupervisor implements DisplayListener { } void pauseChildStacks(ActivityRecord parent, boolean userLeaving, boolean uiSleeping, - boolean resuming, boolean dontWait) { + ActivityRecord resuming, boolean dontWait) { // TODO: Put all stacks in supervisor and iterate through them instead. for (int displayNdx = mActivityDisplays.size() - 1; displayNdx >= 0; --displayNdx) { ArrayList<ActivityStack> stacks = mActivityDisplays.valueAt(displayNdx).mStacks; @@ -4195,7 +4203,7 @@ public final class ActivityStackSupervisor implements DisplayListener { mContainerState = CONTAINER_STATE_NO_SURFACE; ((VirtualActivityDisplay) mActivityDisplay).setSurface(null); if (mStack.mPausingActivity == null && mStack.mResumedActivity != null) { - mStack.startPausingLocked(false, true, false, false); + mStack.startPausingLocked(false, true, null, false); } } diff --git a/services/core/java/com/android/server/pm/EphemeralResolverConnection.java b/services/core/java/com/android/server/pm/EphemeralResolverConnection.java index b25ef175c6a1..8d926f5d316f 100644 --- a/services/core/java/com/android/server/pm/EphemeralResolverConnection.java +++ b/services/core/java/com/android/server/pm/EphemeralResolverConnection.java @@ -16,6 +16,8 @@ package com.android.server.pm; +import android.app.EphemeralResolverService; +import android.app.IEphemeralResolver; import android.content.ComponentName; import android.content.Context; import android.content.Intent; @@ -30,9 +32,6 @@ import android.os.SystemClock; import android.os.UserHandle; import android.util.TimedRemoteCaller; -import com.android.internal.app.EphemeralResolverService; -import com.android.internal.app.IEphemeralResolver; - import java.io.FileDescriptor; import java.io.PrintWriter; import java.util.ArrayList; diff --git a/services/core/java/com/android/server/policy/PhoneWindowManager.java b/services/core/java/com/android/server/policy/PhoneWindowManager.java index e502764f33b2..46bf239b9b84 100644 --- a/services/core/java/com/android/server/policy/PhoneWindowManager.java +++ b/services/core/java/com/android/server/policy/PhoneWindowManager.java @@ -2229,6 +2229,9 @@ public class PhoneWindowManager implements WindowManagerPolicy { attrs.privateFlags &= ~WindowManager.LayoutParams.PRIVATE_FLAG_KEYGUARD; } break; + case TYPE_SCREENSHOT: + attrs.flags |= WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE; + break; } if (attrs.type != TYPE_STATUS_BAR) { @@ -3560,6 +3563,14 @@ public class PhoneWindowManager implements WindowManagerPolicy { } } + @Override + public boolean canShowDismissingWindowWhileLockedLw() { + // If the keyguard is trusted, it will unlock without a challange. Therefore, windows with + // FLAG_DISMISS_KEYGUARD don't need to be force hidden, as they will unlock the phone right + // away anyways. + return mKeyguardDelegate != null && mKeyguardDelegate.isTrusted(); + } + private void launchAssistLongPressAction() { performHapticFeedbackLw(null, HapticFeedbackConstants.LONG_PRESS, false); sendCloseSystemWindows(SYSTEM_DIALOG_REASON_ASSIST); @@ -5256,7 +5267,10 @@ public class PhoneWindowManager implements WindowManagerPolicy { } } else if (mDismissKeyguard != DISMISS_KEYGUARD_NONE) { mKeyguardHidden = false; - if (setKeyguardOccludedLw(false)) { + final boolean trusted = mKeyguardDelegate.isTrusted(); + if (trusted) { + // No need to un-occlude keyguard - we'll dimiss it right away anyways. + } else if (setKeyguardOccludedLw(false)) { changes |= FINISH_LAYOUT_REDO_LAYOUT | FINISH_LAYOUT_REDO_CONFIG | FINISH_LAYOUT_REDO_WALLPAPER; @@ -5266,7 +5280,7 @@ public class PhoneWindowManager implements WindowManagerPolicy { mHandler.post(new Runnable() { @Override public void run() { - mKeyguardDelegate.dismiss(); + mKeyguardDelegate.dismiss(trusted /* allowWhileOccluded */); } }); } @@ -6511,7 +6525,7 @@ public class PhoneWindowManager implements WindowManagerPolicy { @Override public void run() { // ask the keyguard to prompt the user to authenticate if necessary - mKeyguardDelegate.dismiss(); + mKeyguardDelegate.dismiss(false /* allowWhileOccluded */); } }); } diff --git a/services/core/java/com/android/server/policy/keyguard/KeyguardServiceDelegate.java b/services/core/java/com/android/server/policy/keyguard/KeyguardServiceDelegate.java index bcae481c583f..d3c592db4099 100644 --- a/services/core/java/com/android/server/policy/keyguard/KeyguardServiceDelegate.java +++ b/services/core/java/com/android/server/policy/keyguard/KeyguardServiceDelegate.java @@ -199,6 +199,13 @@ public class KeyguardServiceDelegate { return mKeyguardState.showing; } + public boolean isTrusted() { + if (mKeyguardService != null) { + return mKeyguardService.isTrusted(); + } + return false; + } + public boolean isInputRestricted() { if (mKeyguardService != null) { mKeyguardState.inputRestricted = mKeyguardService.isInputRestricted(); @@ -220,14 +227,15 @@ public class KeyguardServiceDelegate { public void setOccluded(boolean isOccluded) { if (mKeyguardService != null) { + if (DEBUG) Log.v(TAG, "setOccluded(" + isOccluded + ")"); mKeyguardService.setOccluded(isOccluded); } mKeyguardState.occluded = isOccluded; } - public void dismiss() { + public void dismiss(boolean allowWhileOccluded) { if (mKeyguardService != null) { - mKeyguardService.dismiss(); + mKeyguardService.dismiss(allowWhileOccluded); } } diff --git a/services/core/java/com/android/server/policy/keyguard/KeyguardServiceWrapper.java b/services/core/java/com/android/server/policy/keyguard/KeyguardServiceWrapper.java index 57e885797e4c..bea31673a58b 100644 --- a/services/core/java/com/android/server/policy/keyguard/KeyguardServiceWrapper.java +++ b/services/core/java/com/android/server/policy/keyguard/KeyguardServiceWrapper.java @@ -81,9 +81,9 @@ public class KeyguardServiceWrapper implements IKeyguardService { } @Override // Binder interface - public void dismiss() { + public void dismiss(boolean allowWhileOccluded) { try { - mService.dismiss(); + mService.dismiss(allowWhileOccluded); } catch (RemoteException e) { Slog.w(TAG , "Remote Exception", e); } @@ -234,6 +234,10 @@ public class KeyguardServiceWrapper implements IKeyguardService { return mKeyguardStateMonitor.isShowing(); } + public boolean isTrusted() { + return mKeyguardStateMonitor.isTrusted(); + } + public boolean isSecure(int userId) { return mKeyguardStateMonitor.isSecure(userId); } diff --git a/services/core/java/com/android/server/policy/keyguard/KeyguardStateMonitor.java b/services/core/java/com/android/server/policy/keyguard/KeyguardStateMonitor.java index 138f068f38ed..f3238c824104 100644 --- a/services/core/java/com/android/server/policy/keyguard/KeyguardStateMonitor.java +++ b/services/core/java/com/android/server/policy/keyguard/KeyguardStateMonitor.java @@ -43,6 +43,7 @@ public class KeyguardStateMonitor extends IKeyguardStateCallback.Stub { private volatile boolean mIsShowing = true; private volatile boolean mSimSecure = true; private volatile boolean mInputRestricted = true; + private volatile boolean mTrusted = false; private int mCurrentUserId; @@ -70,6 +71,10 @@ public class KeyguardStateMonitor extends IKeyguardStateCallback.Stub { return mInputRestricted; } + public boolean isTrusted() { + return mTrusted; + } + @Override // Binder interface public void onShowingStateChanged(boolean showing) { mIsShowing = showing; @@ -93,12 +98,18 @@ public class KeyguardStateMonitor extends IKeyguardStateCallback.Stub { mInputRestricted = inputRestricted; } + @Override // Binder interface + public void onTrustedChanged(boolean trusted) { + mTrusted = trusted; + } + public void dump(String prefix, PrintWriter pw) { pw.println(prefix + TAG); prefix += " "; pw.println(prefix + "mIsShowing=" + mIsShowing); pw.println(prefix + "mSimSecure=" + mSimSecure); pw.println(prefix + "mInputRestricted=" + mInputRestricted); + pw.println(prefix + "mTrusted=" + mTrusted); pw.println(prefix + "mCurrentUserId=" + mCurrentUserId); } }
\ No newline at end of file diff --git a/services/core/java/com/android/server/wm/DisplayContent.java b/services/core/java/com/android/server/wm/DisplayContent.java index fba439f8ca60..1d57872b2fbc 100644 --- a/services/core/java/com/android/server/wm/DisplayContent.java +++ b/services/core/java/com/android/server/wm/DisplayContent.java @@ -191,6 +191,16 @@ class DisplayContent { return mHomeStack; } + TaskStack getStackById(int stackId) { + for (int i = mStacks.size() - 1; i >= 0; --i) { + final TaskStack stack = mStacks.get(i); + if (stack.mStackId == stackId) { + return stack; + } + } + return null; + } + void updateDisplayInfo() { mDisplay.getDisplayInfo(mDisplayInfo); mDisplay.getMetrics(mDisplayMetrics); diff --git a/services/core/java/com/android/server/wm/WindowAnimator.java b/services/core/java/com/android/server/wm/WindowAnimator.java index be060d243404..e5eda0522f92 100644 --- a/services/core/java/com/android/server/wm/WindowAnimator.java +++ b/services/core/java/com/android/server/wm/WindowAnimator.java @@ -16,6 +16,7 @@ package com.android.server.wm; +import static android.view.WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD; import static android.view.WindowManager.LayoutParams.FLAG_SHOW_WALLPAPER; import static android.view.WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED; import static android.view.WindowManager.LayoutParams.PRIVATE_FLAG_KEYGUARD; @@ -233,6 +234,12 @@ public class WindowAnimator { || (win.mAttrs.privateFlags & PRIVATE_FLAG_SYSTEM_ERROR) != 0; } + // Allow showing a window that dismisses Keyguard if the policy allows it. This is used for + // when the policy knows that the Keyguard can be dismissed without user interaction to + // provide a smooth transition in that case. + allowWhenLocked |= (win.mAttrs.flags & FLAG_DISMISS_KEYGUARD) != 0 + && mPolicy.canShowDismissingWindowWhileLockedLw(); + // Only hide windows if the keyguard is active and not animating away. boolean keyguardOn = mPolicy.isKeyguardShowingOrOccluded() && mForceHiding != KEYGUARD_ANIMATING_OUT; diff --git a/services/core/java/com/android/server/wm/WindowManagerService.java b/services/core/java/com/android/server/wm/WindowManagerService.java index b4085f5177b4..c66f09cd792e 100644 --- a/services/core/java/com/android/server/wm/WindowManagerService.java +++ b/services/core/java/com/android/server/wm/WindowManagerService.java @@ -5047,18 +5047,32 @@ public class WindowManagerService extends IWindowManager.Stub try { synchronized (mWindowMap) { final DisplayContent displayContent = mDisplayContents.get(displayId); + boolean attachedToDisplay = false; if (displayContent != null) { TaskStack stack = mStackIdToStack.get(stackId); if (stack == null) { if (DEBUG_STACK) Slog.d(TAG_WM, "attachStack: stackId=" + stackId); - stack = new TaskStack(this, stackId); + + stack = displayContent.getStackById(stackId); + if (stack != null) { + // It's already attached to the display. Detach and re-attach + // because onTop might change, and be sure to clear mDeferDetach! + displayContent.detachStack(stack); + stack.mDeferDetach = false; + attachedToDisplay = true; + } else { + stack = new TaskStack(this, stackId); + } + mStackIdToStack.put(stackId, stack); if (stackId == DOCKED_STACK_ID) { getDefaultDisplayContentLocked().mDividerControllerLocked .notifyDockedStackExistsChanged(true); } } - stack.attachDisplayContent(displayContent); + if (!attachedToDisplay) { + stack.attachDisplayContent(displayContent); + } displayContent.attachStack(stack, onTop); if (stack.getRawFullscreen()) { return null; @@ -9454,10 +9468,17 @@ public class WindowManagerService extends IWindowManager.Stub } final boolean dragResizingChanged = w.isDragResizeChanged() && !w.isDragResizingChangeReported(); + if (localLOGV) Slog.v(TAG_WM, "Resizing " + w + ": configChanged=" + configChanged + " dragResizingChanged=" + dragResizingChanged + " last=" + w.mLastFrame + " frame=" + w.mFrame); + + // We update mLastFrame always rather than in the conditional with the + // last inset variables, because mFrameSizeChanged only tracks the + // width and height changing. + w.mLastFrame.set(w.mFrame); + if (w.mContentInsetsChanged || w.mVisibleInsetsChanged || winAnimator.mSurfaceResized @@ -9495,7 +9516,6 @@ public class WindowManagerService extends IWindowManager.Stub w.mLastVisibleInsets.set(w.mVisibleInsets); w.mLastStableInsets.set(w.mStableInsets); w.mLastOutsets.set(w.mOutsets); - w.mLastFrame.set(w.mFrame); makeWindowFreezingScreenIfNeededLocked(w); // If the orientation is changing, or we're starting or ending // a drag resizing action, then we need to hold off on unfreezing diff --git a/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java b/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java index feeed8b922da..e828650a3049 100644 --- a/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java +++ b/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java @@ -2093,8 +2093,9 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { void removeActiveAdminLocked(final ComponentName adminReceiver, final int userHandle) { final ActiveAdmin admin = getActiveAdminUncheckedLocked(adminReceiver, userHandle); - if (admin != null) { - getUserData(userHandle).mRemovingAdmins.add(adminReceiver); + DevicePolicyData policy = getUserData(userHandle); + if (admin != null && !policy.mRemovingAdmins.contains(adminReceiver)) { + policy.mRemovingAdmins.add(adminReceiver); sendAdminCommandLocked(admin, DeviceAdminReceiver.ACTION_DEVICE_ADMIN_DISABLED, new BroadcastReceiver() { @@ -5706,7 +5707,8 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { } synchronized (this) { enforceCanSetDeviceOwnerLocked(userId); - if (getActiveAdminUncheckedLocked(admin, userId) == null) { + if (getActiveAdminUncheckedLocked(admin, userId) == null + || getUserData(userId).mRemovingAdmins.contains(admin)) { throw new IllegalArgumentException("Not active admin: " + admin); } @@ -5894,7 +5896,8 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { synchronized (this) { enforceCanSetProfileOwnerLocked(userHandle); - if (getActiveAdminUncheckedLocked(who, userHandle) == null) { + if (getActiveAdminUncheckedLocked(who, userHandle) == null + || getUserData(userHandle).mRemovingAdmins.contains(who)) { throw new IllegalArgumentException("Not active admin: " + who); } diff --git a/telephony/java/android/telephony/TelephonyManager.java b/telephony/java/android/telephony/TelephonyManager.java index a3dc34374c62..ea4ea14a43c5 100644 --- a/telephony/java/android/telephony/TelephonyManager.java +++ b/telephony/java/android/telephony/TelephonyManager.java @@ -705,6 +705,17 @@ public class TelephonyManager { "android.telephony.extra.LAUNCH_VOICEMAIL_SETTINGS_INTENT"; /** + * {@link android.telecom.Connection} event used to indicate that an IMS call failed to be + * handed over from LTE to WIFI. + * <p> + * Sent via {@link android.telecom.Connection#sendConnectionEvent(String, Bundle)}. + * The {@link Bundle} parameter is expected to be null when this connection event is used. + * @hide + */ + public static final String EVENT_HANDOVER_TO_WIFI_FAILED = + "android.telephony.event.EVENT_HANDOVER_TO_WIFI_FAILED"; + + /** * Response codes for sim activation. Activation completed successfully. * @hide */ |