diff options
181 files changed, 2129 insertions, 1794 deletions
diff --git a/api/system-current.txt b/api/system-current.txt index 4f512a08816d..9d045b3a5829 100644 --- a/api/system-current.txt +++ b/api/system-current.txt @@ -40540,6 +40540,7 @@ package android.telephony { method public boolean isSmsCapable(); method public boolean isTtyModeSupported(); method public boolean isVideoCallingEnabled(); + method public boolean isVisualVoicemailEnabled(android.telecom.PhoneAccountHandle); method public boolean isVoiceCapable(); method public boolean isVoicemailVibrationEnabled(android.telecom.PhoneAccountHandle); method public boolean isWorldPhone(); @@ -40553,6 +40554,7 @@ package android.telephony { method public boolean setPreferredNetworkTypeToGlobal(); method public boolean setRadio(boolean); method public boolean setRadioPower(boolean); + method public void setVisualVoicemailEnabled(android.telecom.PhoneAccountHandle, boolean); method public boolean setVoiceMailNumber(java.lang.String, java.lang.String); method public void silenceRinger(); method public boolean supplyPin(java.lang.String); diff --git a/cmds/bootanimation/BootAnimation.cpp b/cmds/bootanimation/BootAnimation.cpp index ebcc9ff0451f..a2d34e42f298 100644 --- a/cmds/bootanimation/BootAnimation.cpp +++ b/cmds/bootanimation/BootAnimation.cpp @@ -75,13 +75,25 @@ static const char ACCURATE_TIME_FLAG_FILE_PATH[] = "/data/system/time/time_is_ac // Java timestamp format. Don't show the clock if the date is before 2000-01-01 00:00:00. static const long long ACCURATE_TIME_EPOCH = 946684800000; static const char EXIT_PROP_NAME[] = "service.bootanim.exit"; +static const char PLAY_SOUND_PROP_NAME[] = "persist.sys.bootanim.play_sound"; static const int ANIM_ENTRY_NAME_MAX = 256; +static const char BOOT_COMPLETED_PROP_NAME[] = "sys.boot_completed"; +static const char BOOTREASON_PROP_NAME[] = "ro.boot.bootreason"; +// bootreasons list in "system/core/bootstat/bootstat.cpp". +static const std::vector<std::string> PLAY_SOUND_BOOTREASON_BLACKLIST { + "kernel_panic", + "Panic", + "Watchdog", +}; // --------------------------------------------------------------------------- BootAnimation::BootAnimation() : Thread(false), mClockEnabled(true), mTimeIsAccurate(false), mTimeCheckThread(NULL) { mSession = new SurfaceComposerClient(); + + // If the system has already booted, the animation is not being used for a boot. + mSystemBoot = !property_get_bool(BOOT_COMPLETED_PROP_NAME, 0); } BootAnimation::~BootAnimation() {} @@ -777,7 +789,7 @@ bool BootAnimation::playAnimation(const Animation& animation) break; // only play audio file the first time we animate the part - if (r == 0 && part.audioData) { + if (r == 0 && part.audioData && playSoundsAllowed()) { ALOGD("playing clip for part%d, size=%d", (int) i, part.audioLength); audioplay::playClip(part.audioData, part.audioLength); } @@ -915,6 +927,30 @@ BootAnimation::Animation* BootAnimation::loadAnimation(const String8& fn) return animation; } +bool BootAnimation::playSoundsAllowed() const { + // Only play sounds for system boots, not runtime restarts. + if (!mSystemBoot) { + return false; + } + + // Read the system property to see if we should play the sound. + // If it's not present, default to allowed. + if (!property_get_bool(PLAY_SOUND_PROP_NAME, 1)) { + return false; + } + + // Don't play sounds if this is a reboot due to an error. + char bootreason[PROPERTY_VALUE_MAX]; + if (property_get(BOOTREASON_PROP_NAME, bootreason, nullptr) > 0) { + for (const auto& str : PLAY_SOUND_BOOTREASON_BLACKLIST) { + if (strcasecmp(str.c_str(), bootreason) == 0) { + return false; + } + } + } + return true; +} + bool BootAnimation::updateIsTimeAccurate() { static constexpr long long MAX_TIME_IN_PAST = 60000LL * 60LL * 24LL * 30LL; // 30 days static constexpr long long MAX_TIME_IN_FUTURE = 60000LL * 90LL; // 90 minutes diff --git a/cmds/bootanimation/BootAnimation.h b/cmds/bootanimation/BootAnimation.h index a53216eb0310..fd497a362fc7 100644 --- a/cmds/bootanimation/BootAnimation.h +++ b/cmds/bootanimation/BootAnimation.h @@ -120,6 +120,7 @@ private: void releaseAnimation(Animation*) const; bool parseAnimationDesc(Animation&); bool preloadZip(Animation &animation); + bool playSoundsAllowed() const; void checkExit(); @@ -137,6 +138,7 @@ private: sp<Surface> mFlingerSurface; bool mClockEnabled; bool mTimeIsAccurate; + bool mSystemBoot; String8 mZipFileName; SortedVector<String8> mLoadedFiles; sp<TimeCheckThread> mTimeCheckThread; diff --git a/core/java/android/accessibilityservice/AccessibilityService.java b/core/java/android/accessibilityservice/AccessibilityService.java index ae78e21807e8..c4eaccc1b406 100644 --- a/core/java/android/accessibilityservice/AccessibilityService.java +++ b/core/java/android/accessibilityservice/AccessibilityService.java @@ -628,8 +628,8 @@ public abstract class AccessibilityService extends Service { if (connection == null) { return false; } - List<MotionEvent> events = MotionEventGenerator.getMotionEventsFromGestureDescription( - gesture, 100); + List<GestureDescription.GestureStep> steps = + MotionEventGenerator.getGestureStepsFromGestureDescription(gesture, 100); try { synchronized (mLock) { mGestureStatusCallbackSequence++; @@ -641,8 +641,8 @@ public abstract class AccessibilityService extends Service { callback, handler); mGestureStatusCallbackInfos.put(mGestureStatusCallbackSequence, callbackInfo); } - connection.sendMotionEvents(mGestureStatusCallbackSequence, - new ParceledListSlice<>(events)); + connection.sendGesture(mGestureStatusCallbackSequence, + new ParceledListSlice<>(steps)); } } catch (RemoteException re) { throw new RuntimeException(re); diff --git a/core/java/android/accessibilityservice/GestureDescription.java b/core/java/android/accessibilityservice/GestureDescription.java index fc9581e7367c..d9b03faa42fa 100644 --- a/core/java/android/accessibilityservice/GestureDescription.java +++ b/core/java/android/accessibilityservice/GestureDescription.java @@ -21,6 +21,8 @@ import android.annotation.NonNull; import android.graphics.Path; import android.graphics.PathMeasure; import android.graphics.RectF; +import android.os.Parcel; +import android.os.Parcelable; import android.view.InputDevice; import android.view.MotionEvent; import android.view.MotionEvent.PointerCoords; @@ -303,13 +305,37 @@ public final class GestureDescription { } } - private static class TouchPoint { + /** + * The location of a finger for gesture dispatch + * + * @hide + */ + public static class TouchPoint implements Parcelable { + private static final int FLAG_IS_START_OF_PATH = 0x01; + private static final int FLAG_IS_END_OF_PATH = 0x02; + int mPathIndex; boolean mIsStartOfPath; boolean mIsEndOfPath; float mX; float mY; + public TouchPoint() { + } + + public TouchPoint(TouchPoint pointToCopy) { + copyFrom(pointToCopy); + } + + public TouchPoint(Parcel parcel) { + mPathIndex = parcel.readInt(); + int startEnd = parcel.readInt(); + mIsStartOfPath = (startEnd & FLAG_IS_START_OF_PATH) != 0; + mIsEndOfPath = (startEnd & FLAG_IS_END_OF_PATH) != 0; + mX = parcel.readFloat(); + mY = parcel.readFloat(); + } + void copyFrom(TouchPoint other) { mPathIndex = other.mPathIndex; mIsStartOfPath = other.mIsStartOfPath; @@ -317,12 +343,94 @@ public final class GestureDescription { mX = other.mX; mY = other.mY; } + + @Override + public int describeContents() { + return 0; + } + + @Override + public void writeToParcel(Parcel dest, int flags) { + dest.writeInt(mPathIndex); + int startEnd = mIsStartOfPath ? FLAG_IS_START_OF_PATH : 0; + startEnd |= mIsEndOfPath ? FLAG_IS_END_OF_PATH : 0; + dest.writeInt(startEnd); + dest.writeFloat(mX); + dest.writeFloat(mY); + } + + public static final Parcelable.Creator<TouchPoint> CREATOR + = new Parcelable.Creator<TouchPoint>() { + public TouchPoint createFromParcel(Parcel in) { + return new TouchPoint(in); + } + + public TouchPoint[] newArray(int size) { + return new TouchPoint[size]; + } + }; + } + + /** + * A step along a gesture. Contains all of the touch points at a particular time + * + * @hide + */ + public static class GestureStep implements Parcelable { + public long timeSinceGestureStart; + public int numTouchPoints; + public TouchPoint[] touchPoints; + + public GestureStep(long timeSinceGestureStart, int numTouchPoints, + TouchPoint[] touchPointsToCopy) { + this.timeSinceGestureStart = timeSinceGestureStart; + this.numTouchPoints = numTouchPoints; + this.touchPoints = new TouchPoint[numTouchPoints]; + for (int i = 0; i < numTouchPoints; i++) { + this.touchPoints[i] = new TouchPoint(touchPointsToCopy[i]); + } + } + + public GestureStep(Parcel parcel) { + timeSinceGestureStart = parcel.readLong(); + Parcelable[] parcelables = + parcel.readParcelableArray(TouchPoint.class.getClassLoader()); + numTouchPoints = (parcelables == null) ? 0 : parcelables.length; + touchPoints = new TouchPoint[numTouchPoints]; + for (int i = 0; i < numTouchPoints; i++) { + touchPoints[i] = (TouchPoint) parcelables[i]; + } + } + + @Override + public int describeContents() { + return 0; + } + + @Override + public void writeToParcel(Parcel dest, int flags) { + dest.writeLong(timeSinceGestureStart); + dest.writeParcelableArray(touchPoints, flags); + } + + public static final Parcelable.Creator<GestureStep> CREATOR + = new Parcelable.Creator<GestureStep>() { + public GestureStep createFromParcel(Parcel in) { + return new GestureStep(in); + } + + public GestureStep[] newArray(int size) { + return new GestureStep[size]; + } + }; } /** * Class to convert a GestureDescription to a series of MotionEvents. + * + * @hide */ - static class MotionEventGenerator { + public static class MotionEventGenerator { /** * Constants used to initialize all MotionEvents */ @@ -341,38 +449,52 @@ public final class GestureDescription { private static PointerCoords[] sPointerCoords; private static PointerProperties[] sPointerProps; - static List<MotionEvent> getMotionEventsFromGestureDescription( + static List<GestureStep> getGestureStepsFromGestureDescription( GestureDescription description, int sampleTimeMs) { - final List<MotionEvent> motionEvents = new ArrayList<>(); + final List<GestureStep> gestureSteps = new ArrayList<>(); // Point data at each time we generate an event for final TouchPoint[] currentTouchPoints = getCurrentTouchPoints(description.getStrokeCount()); - // Point data sent in last touch event - int lastTouchPointSize = 0; - final TouchPoint[] lastTouchPoints = - getLastTouchPoints(description.getStrokeCount()); - + int currentTouchPointSize = 0; /* Loop through each time slice where there are touch points */ long timeSinceGestureStart = 0; long nextKeyPointTime = description.getNextKeyPointAtLeast(timeSinceGestureStart); while (nextKeyPointTime >= 0) { - timeSinceGestureStart = (lastTouchPointSize == 0) ? nextKeyPointTime + timeSinceGestureStart = (currentTouchPointSize == 0) ? nextKeyPointTime : Math.min(nextKeyPointTime, timeSinceGestureStart + sampleTimeMs); - int currentTouchPointSize = description.getPointsForTime(timeSinceGestureStart, + currentTouchPointSize = description.getPointsForTime(timeSinceGestureStart, currentTouchPoints); + gestureSteps.add(new GestureStep(timeSinceGestureStart, currentTouchPointSize, + currentTouchPoints)); + + /* Move to next time slice */ + nextKeyPointTime = description.getNextKeyPointAtLeast(timeSinceGestureStart + 1); + } + return gestureSteps; + } + + public static List<MotionEvent> getMotionEventsFromGestureSteps(List<GestureStep> steps) { + final List<MotionEvent> motionEvents = new ArrayList<>(); + + // Number of points in last touch event + int lastTouchPointSize = 0; + TouchPoint[] lastTouchPoints; + + for (int i = 0; i < steps.size(); i++) { + GestureStep step = steps.get(i); + int currentTouchPointSize = step.numTouchPoints; + lastTouchPoints = getLastTouchPoints( + Math.max(lastTouchPointSize, currentTouchPointSize)); appendMoveEventIfNeeded(motionEvents, lastTouchPoints, lastTouchPointSize, - currentTouchPoints, currentTouchPointSize, timeSinceGestureStart); + step.touchPoints, currentTouchPointSize, step.timeSinceGestureStart); lastTouchPointSize = appendUpEvents(motionEvents, lastTouchPoints, - lastTouchPointSize, currentTouchPoints, currentTouchPointSize, - timeSinceGestureStart); + lastTouchPointSize, step.touchPoints, currentTouchPointSize, + step.timeSinceGestureStart); lastTouchPointSize = appendDownEvents(motionEvents, lastTouchPoints, - lastTouchPointSize, currentTouchPoints, currentTouchPointSize, - timeSinceGestureStart); - - /* Move to next time slice */ - nextKeyPointTime = description.getNextKeyPointAtLeast(timeSinceGestureStart + 1); + lastTouchPointSize, step.touchPoints, currentTouchPointSize, + step.timeSinceGestureStart); } return motionEvents; } diff --git a/core/java/android/accessibilityservice/IAccessibilityServiceConnection.aidl b/core/java/android/accessibilityservice/IAccessibilityServiceConnection.aidl index 7a55079d3ecf..81cddbac3f53 100644 --- a/core/java/android/accessibilityservice/IAccessibilityServiceConnection.aidl +++ b/core/java/android/accessibilityservice/IAccessibilityServiceConnection.aidl @@ -88,5 +88,5 @@ interface IAccessibilityServiceConnection { void setSoftKeyboardCallbackEnabled(boolean enabled); - void sendMotionEvents(int sequence, in ParceledListSlice events); + void sendGesture(int sequence, in ParceledListSlice gestureSteps); } diff --git a/core/java/android/app/Fragment.java b/core/java/android/app/Fragment.java index a637ef4f9c54..8afca784b067 100644 --- a/core/java/android/app/Fragment.java +++ b/core/java/android/app/Fragment.java @@ -1483,9 +1483,10 @@ public class Fragment implements ComponentCallbacks2, OnCreateContextMenuListene * at this point. If you want to do work once the activity itself is * created, see {@link #onActivityCreated(Bundle)}. * - * <p>If your app's <code>targetSdkVersion</code> is 23 or lower, child fragments - * being restored from the savedInstanceState are restored after <code>onCreate</code> - * returns. When targeting N or above and running on an N or newer platform version + * <p>If your app's <code>targetSdkVersion</code> is {@link android.os.Build.VERSION_CODES#M} + * or lower, child fragments being restored from the savedInstanceState are restored after + * <code>onCreate</code> returns. When targeting {@link android.os.Build.VERSION_CODES#N} or + * above and running on an N or newer platform version * they are restored by <code>Fragment.onCreate</code>.</p> * * @param savedInstanceState If the fragment is being re-created from diff --git a/core/java/android/app/FragmentTransaction.java b/core/java/android/app/FragmentTransaction.java index e435580d55fe..633e85b78118 100644 --- a/core/java/android/app/FragmentTransaction.java +++ b/core/java/android/app/FragmentTransaction.java @@ -17,7 +17,8 @@ import java.lang.annotation.RetentionPolicy; * <div class="special reference"> * <h3>Developer Guides</h3> * <p>For more information about using fragments, read the - * <a href="{@docRoot}guide/topics/fundamentals/fragments.html">Fragments</a> developer guide.</p> + * <a href="{@docRoot}guide/components/fragments.html">Fragments</a> developer + * guide.</p> * </div> */ public abstract class FragmentTransaction { @@ -25,17 +26,17 @@ public abstract class FragmentTransaction { * Calls {@link #add(int, Fragment, String)} with a 0 containerViewId. */ public abstract FragmentTransaction add(Fragment fragment, String tag); - + /** * Calls {@link #add(int, Fragment, String)} with a null tag. */ public abstract FragmentTransaction add(@IdRes int containerViewId, Fragment fragment); - + /** * Add a fragment to the activity state. This fragment may optionally * also have its view (if {@link Fragment#onCreateView Fragment.onCreateView} * returns non-null) inserted into a container view of the activity. - * + * * @param containerViewId Optional identifier of the container this fragment is * to be placed in. If 0, it will not be placed in a container. * @param fragment The fragment to be added. This fragment must not already @@ -43,64 +44,64 @@ public abstract class FragmentTransaction { * @param tag Optional tag name for the fragment, to later retrieve the * fragment with {@link FragmentManager#findFragmentByTag(String) * FragmentManager.findFragmentByTag(String)}. - * + * * @return Returns the same FragmentTransaction instance. */ public abstract FragmentTransaction add(@IdRes int containerViewId, Fragment fragment, String tag); - + /** * Calls {@link #replace(int, Fragment, String)} with a null tag. */ public abstract FragmentTransaction replace(@IdRes int containerViewId, Fragment fragment); - + /** * Replace an existing fragment that was added to a container. This is * essentially the same as calling {@link #remove(Fragment)} for all * currently added fragments that were added with the same containerViewId * and then {@link #add(int, Fragment, String)} with the same arguments * given here. - * + * * @param containerViewId Identifier of the container whose fragment(s) are * to be replaced. * @param fragment The new fragment to place in the container. * @param tag Optional tag name for the fragment, to later retrieve the * fragment with {@link FragmentManager#findFragmentByTag(String) * FragmentManager.findFragmentByTag(String)}. - * + * * @return Returns the same FragmentTransaction instance. */ public abstract FragmentTransaction replace(@IdRes int containerViewId, Fragment fragment, String tag); - + /** * Remove an existing fragment. If it was added to a container, its view * is also removed from that container. - * + * * @param fragment The fragment to be removed. - * + * * @return Returns the same FragmentTransaction instance. */ public abstract FragmentTransaction remove(Fragment fragment); - + /** * Hides an existing fragment. This is only relevant for fragments whose * views have been added to a container, as this will cause the view to * be hidden. - * + * * @param fragment The fragment to be hidden. - * + * * @return Returns the same FragmentTransaction instance. */ public abstract FragmentTransaction hide(Fragment fragment); - + /** * Shows a previously hidden fragment. This is only relevant for fragments whose * views have been added to a container, as this will cause the view to * be shown. - * + * * @param fragment The fragment to be shown. - * + * * @return Returns the same FragmentTransaction instance. */ public abstract FragmentTransaction show(Fragment fragment); @@ -135,17 +136,17 @@ public abstract class FragmentTransaction { * <code>false</code> otherwise. */ public abstract boolean isEmpty(); - + /** * Bit mask that is set for all enter transitions. */ public static final int TRANSIT_ENTER_MASK = 0x1000; - + /** * Bit mask that is set for all exit transitions. */ public static final int TRANSIT_EXIT_MASK = 0x2000; - + /** Not set up for a transition. */ public static final int TRANSIT_UNSET = -1; /** No animation for transition. */ @@ -202,7 +203,7 @@ public abstract class FragmentTransaction { * animations. */ public abstract FragmentTransaction setTransitionStyle(@StyleRes int styleRes); - + /** * Add this transaction to the back stack. This means that the transaction * will be remembered after it is committed, and will reverse its operation @@ -269,7 +270,7 @@ public abstract class FragmentTransaction { * because the state after the commit can be lost if the activity needs to * be restored from its state. See {@link #commitAllowingStateLoss()} for * situations where it may be okay to lose the commit.</p> - * + * * @return Returns the identifier of this transaction's back stack entry, * if {@link #addToBackStack(String)} had been called. Otherwise, returns * a negative number. diff --git a/core/java/android/app/IWallpaperManager.aidl b/core/java/android/app/IWallpaperManager.aidl index db7d54bd40cf..ec22ff65a5f8 100644 --- a/core/java/android/app/IWallpaperManager.aidl +++ b/core/java/android/app/IWallpaperManager.aidl @@ -128,7 +128,7 @@ interface IWallpaperManager { /* * Backup: is the current system wallpaper image eligible for off-device backup? */ - boolean isWallpaperBackupEligible(int userId); + boolean isWallpaperBackupEligible(int which, int userId); /* * Keyguard: register a callback for being notified that lock-state relevant diff --git a/core/java/android/app/Notification.java b/core/java/android/app/Notification.java index 6e01922d20bf..29ed97e78dcb 100644 --- a/core/java/android/app/Notification.java +++ b/core/java/android/app/Notification.java @@ -3256,7 +3256,8 @@ public class Notification implements Parcelable * Resets the notification header to its original state */ private void resetNotificationHeader(RemoteViews contentView) { - contentView.setImageViewResource(R.id.icon, 0); + // Small icon doesn't need to be reset, as it's always set. Resetting would prevent + // re-using the drawable when the notification is updated. contentView.setBoolean(R.id.notification_header, "setExpanded", false); contentView.setTextViewText(R.id.app_name_text, null); contentView.setViewVisibility(R.id.chronometer, View.GONE); diff --git a/core/java/android/app/WallpaperManager.java b/core/java/android/app/WallpaperManager.java index 20cbde176368..6e4466238af2 100644 --- a/core/java/android/app/WallpaperManager.java +++ b/core/java/android/app/WallpaperManager.java @@ -1680,13 +1680,13 @@ public class WallpaperManager { * Only the OS itself may use this method. * @hide */ - public boolean isWallpaperBackupEligible() { + public boolean isWallpaperBackupEligible(int which) { if (sGlobals.mService == null) { Log.w(TAG, "WallpaperService not running"); throw new RuntimeException(new DeadSystemException()); } try { - return sGlobals.mService.isWallpaperBackupEligible(mContext.getUserId()); + return sGlobals.mService.isWallpaperBackupEligible(which, mContext.getUserId()); } catch (RemoteException e) { Log.e(TAG, "Exception querying wallpaper backup eligibility: " + e.getMessage()); } diff --git a/core/java/android/hardware/camera2/impl/CameraCaptureSessionImpl.java b/core/java/android/hardware/camera2/impl/CameraCaptureSessionImpl.java index c23bd5bcee47..b10c341eb5ec 100644 --- a/core/java/android/hardware/camera2/impl/CameraCaptureSessionImpl.java +++ b/core/java/android/hardware/camera2/impl/CameraCaptureSessionImpl.java @@ -286,23 +286,29 @@ public class CameraCaptureSessionImpl extends CameraCaptureSession } @Override - public synchronized void abortCaptures() throws CameraAccessException { - checkNotClosed(); + public void abortCaptures() throws CameraAccessException { + synchronized (this) { + checkNotClosed(); - if (DEBUG) { - Log.v(TAG, mIdString + "abortCaptures"); - } + if (DEBUG) { + Log.v(TAG, mIdString + "abortCaptures"); + } - if (mAborting) { - Log.w(TAG, mIdString + "abortCaptures - Session is already aborting; doing nothing"); - return; - } + if (mAborting) { + Log.w(TAG, mIdString + "abortCaptures - Session is already aborting; doing nothing"); + return; + } - mAborting = true; - mAbortDrainer.taskStarted(); + mAborting = true; + mAbortDrainer.taskStarted(); + } - mDeviceImpl.flush(); - // The next BUSY -> IDLE set of transitions will mark the end of the abort. + synchronized (mDeviceImpl.mInterfaceLock) { + synchronized (this) { + mDeviceImpl.flush(); + // The next BUSY -> IDLE set of transitions will mark the end of the abort. + } + } } @Override @@ -330,78 +336,86 @@ public class CameraCaptureSessionImpl extends CameraCaptureSession * @see CameraCaptureSession#close */ @Override - public synchronized void replaceSessionClose() { - /* - * In order for creating new sessions to be fast, the new session should be created - * before the old session is closed. - * - * Otherwise the old session will always unconfigure if there is no new session to - * replace it. - * - * Unconfiguring could add hundreds of milliseconds of delay. We could race and attempt - * to skip unconfigure if a new session is created before the captures are all drained, - * but this would introduce nondeterministic behavior. - */ - - if (DEBUG) Log.v(TAG, mIdString + "replaceSessionClose"); - - // Set up fast shutdown. Possible alternative paths: - // - This session is active, so close() below starts the shutdown drain - // - This session is mid-shutdown drain, and hasn't yet reached the idle drain listener. - // - This session is already closed and has executed the idle drain listener, and - // configureOutputsChecked(null) has already been called. - // - // Do not call configureOutputsChecked(null) going forward, since it would race with the - // configuration for the new session. If it was already called, then we don't care, since it - // won't get called again. - mSkipUnconfigure = true; + public void replaceSessionClose() { + synchronized (this) { + /* + * In order for creating new sessions to be fast, the new session should be created + * before the old session is closed. + * + * Otherwise the old session will always unconfigure if there is no new session to + * replace it. + * + * Unconfiguring could add hundreds of milliseconds of delay. We could race and attempt + * to skip unconfigure if a new session is created before the captures are all drained, + * but this would introduce nondeterministic behavior. + */ + if (DEBUG) Log.v(TAG, mIdString + "replaceSessionClose"); + + // Set up fast shutdown. Possible alternative paths: + // - This session is active, so close() below starts the shutdown drain + // - This session is mid-shutdown drain, and hasn't yet reached the idle drain listener. + // - This session is already closed and has executed the idle drain listener, and + // configureOutputsChecked(null) has already been called. + // + // Do not call configureOutputsChecked(null) going forward, since it would race with the + // configuration for the new session. If it was already called, then we don't care, + // since it won't get called again. + mSkipUnconfigure = true; + } close(); } @Override - public synchronized void close() { - - if (mClosed) { - if (DEBUG) Log.v(TAG, mIdString + "close - reentering"); - return; - } + public void close() { + synchronized (this) { + if (mClosed) { + if (DEBUG) Log.v(TAG, mIdString + "close - reentering"); + return; + } - if (DEBUG) Log.v(TAG, mIdString + "close - first time"); + if (DEBUG) Log.v(TAG, mIdString + "close - first time"); - mClosed = true; + mClosed = true; + } - /* - * Flush out any repeating request. Since camera is closed, no new requests - * can be queued, and eventually the entire request queue will be drained. - * - * If the camera device was already closed, short circuit and do nothing; since - * no more internal device callbacks will fire anyway. - * - * Otherwise, once stopRepeating is done, wait for camera to idle, then unconfigure the - * camera. Once that's done, fire #onClosed. - */ - try { - mDeviceImpl.stopRepeating(); - } catch (IllegalStateException e) { - // OK: Camera device may already be closed, nothing else to do + synchronized (mDeviceImpl.mInterfaceLock) { + synchronized (this) { + /* + * Flush out any repeating request. Since camera is closed, no new requests + * can be queued, and eventually the entire request queue will be drained. + * + * If the camera device was already closed, short circuit and do nothing; since + * no more internal device callbacks will fire anyway. + * + * Otherwise, once stopRepeating is done, wait for camera to idle, then unconfigure + * the camera. Once that's done, fire #onClosed. + */ + try { + mDeviceImpl.stopRepeating(); + } catch (IllegalStateException e) { + // OK: Camera device may already be closed, nothing else to do - // TODO: Fire onClosed anytime we get the device onClosed or the ISE? - // or just suppress the ISE only and rely onClosed. - // Also skip any of the draining work if this is already closed. + // TODO: Fire onClosed anytime we get the device onClosed or the ISE? + // or just suppress the ISE only and rely onClosed. + // Also skip any of the draining work if this is already closed. - // Short-circuit; queue callback immediately and return - mStateCallback.onClosed(this); - return; - } catch (CameraAccessException e) { - // OK: close does not throw checked exceptions. - Log.e(TAG, mIdString + "Exception while stopping repeating: ", e); + // Short-circuit; queue callback immediately and return + mStateCallback.onClosed(this); + return; + } catch (CameraAccessException e) { + // OK: close does not throw checked exceptions. + Log.e(TAG, mIdString + "Exception while stopping repeating: ", e); - // TODO: call onError instead of onClosed if this happens + // TODO: call onError instead of onClosed if this happens + } + } } - // If no sequences are pending, fire #onClosed immediately - mSequenceDrainer.beginDrain(); + synchronized (this) { + // If no sequences are pending, fire #onClosed immediately + mSequenceDrainer.beginDrain(); + } } /** diff --git a/core/java/android/hardware/fingerprint/FingerprintManager.java b/core/java/android/hardware/fingerprint/FingerprintManager.java index 1ff2e8a11a87..f17fd55bd22a 100644 --- a/core/java/android/hardware/fingerprint/FingerprintManager.java +++ b/core/java/android/hardware/fingerprint/FingerprintManager.java @@ -259,6 +259,7 @@ public class FingerprintManager { public static class AuthenticationResult { private Fingerprint mFingerprint; private CryptoObject mCryptoObject; + private int mUserId; /** * Authentication result @@ -267,9 +268,10 @@ public class FingerprintManager { * @param fingerprint the recognized fingerprint data, if allowed. * @hide */ - public AuthenticationResult(CryptoObject crypto, Fingerprint fingerprint) { + public AuthenticationResult(CryptoObject crypto, Fingerprint fingerprint, int userId) { mCryptoObject = crypto; mFingerprint = fingerprint; + mUserId = userId; } /** @@ -286,6 +288,12 @@ public class FingerprintManager { * @hide */ public Fingerprint getFingerprint() { return mFingerprint; } + + /** + * Obtain the userId for which this fingerprint was authenticated. + * @hide + */ + public int getUserId() { return mUserId; } }; /** @@ -792,7 +800,7 @@ public class FingerprintManager { sendAcquiredResult((Long) msg.obj /* deviceId */, msg.arg1 /* acquire info */); break; case MSG_AUTHENTICATION_SUCCEEDED: - sendAuthenticatedSucceeded((Fingerprint) msg.obj); + sendAuthenticatedSucceeded((Fingerprint) msg.obj, msg.arg1 /* userId */); break; case MSG_AUTHENTICATION_FAILED: sendAuthenticatedFailed(); @@ -840,9 +848,10 @@ public class FingerprintManager { } } - private void sendAuthenticatedSucceeded(Fingerprint fp) { + private void sendAuthenticatedSucceeded(Fingerprint fp, int userId) { if (mAuthenticationCallback != null) { - final AuthenticationResult result = new AuthenticationResult(mCryptoObject, fp); + final AuthenticationResult result = + new AuthenticationResult(mCryptoObject, fp, userId); mAuthenticationCallback.onAuthenticationSucceeded(result); } } @@ -981,8 +990,8 @@ public class FingerprintManager { } @Override // binder call - public void onAuthenticationSucceeded(long deviceId, Fingerprint fp) { - mHandler.obtainMessage(MSG_AUTHENTICATION_SUCCEEDED, fp).sendToTarget(); + public void onAuthenticationSucceeded(long deviceId, Fingerprint fp, int userId) { + mHandler.obtainMessage(MSG_AUTHENTICATION_SUCCEEDED, userId, 0, fp).sendToTarget(); } @Override // binder call diff --git a/core/java/android/hardware/fingerprint/IFingerprintServiceReceiver.aidl b/core/java/android/hardware/fingerprint/IFingerprintServiceReceiver.aidl index 57a429fe5fa7..b024b29fef06 100644 --- a/core/java/android/hardware/fingerprint/IFingerprintServiceReceiver.aidl +++ b/core/java/android/hardware/fingerprint/IFingerprintServiceReceiver.aidl @@ -26,7 +26,7 @@ import android.os.UserHandle; oneway interface IFingerprintServiceReceiver { void onEnrollResult(long deviceId, int fingerId, int groupId, int remaining); void onAcquired(long deviceId, int acquiredInfo); - void onAuthenticationSucceeded(long deviceId, in Fingerprint fp); + void onAuthenticationSucceeded(long deviceId, in Fingerprint fp, int userId); void onAuthenticationFailed(long deviceId); void onError(long deviceId, int error); void onRemoved(long deviceId, int fingerId, int groupId); diff --git a/core/java/android/os/Build.java b/core/java/android/os/Build.java index c5e09bdeae6c..9f0205098a98 100644 --- a/core/java/android/os/Build.java +++ b/core/java/android/os/Build.java @@ -669,7 +669,47 @@ public class Build { public static final int M = 23; /** - * N is for ¯\_(ツ)_/¯. + * N is for Nougat. + * + * <p>Applications targeting this or a later release will get these + * new changes in behavior:</p> + * <ul> + * <li> {@link android.app.DownloadManager.Request#setAllowedNetworkTypes + * DownloadManager.Request.setAllowedNetworkTypes} + * will disable "allow over metered" when specifying only + * {@link android.app.DownloadManager.Request#NETWORK_WIFI}.</li> + * <li> {@link android.app.DownloadManager} no longer allows access to raw + * file paths.</li> + * <li> {@link android.app.Notification.Builder#setShowWhen + * Notification.Builder.setShowWhen} + * must be called explicitly to have the time shown, and various other changes in + * {@link android.app.Notification.Builder Notification.Builder} to how notifications + * are shown.</li> + * <li>{@link android.content.Context#MODE_WORLD_READABLE} and + * {@link android.content.Context#MODE_WORLD_WRITEABLE} are no longer supported.</li> + * <li>{@link android.os.FileUriExposedException} will be thrown to applications.</li> + * <li>Applications will see global drag and drops as per + * {@link android.view.View#DRAG_FLAG_GLOBAL}.</li> + * <li>{@link android.webkit.WebView#evaluateJavascript WebView.evaluateJavascript} + * will not persist state from an empty WebView.</li> + * <li>{@link android.animation.AnimatorSet} will not ignore calls to end() before + * start().</li> + * <li>{@link android.app.AlarmManager#cancel(android.app.PendingIntent) + * AlarmManager.cancel} will throw a NullPointerException if given a null operation.</li> + * <li>{@link android.app.FragmentManager} will ensure fragments have been created + * before being placed on the back stack.</li> + * <li>{@link android.app.FragmentManager} restores fragments in + * {@link android.app.Fragment#onCreate Fragment.onCreate} rather than after the + * method returns.</li> + * <li>{@link android.R.attr#resizeableActivity} defaults to true.</li> + * <li>{@link android.graphics.drawable.AnimatedVectorDrawable} throws exceptions when + * opening invalid VectorDrawable animations.</li> + * <li>{@link android.view.ViewGroup.MarginLayoutParams} will no longer be dropped + * when converting between some types of layout params (such as + * {@link android.widget.LinearLayout.LayoutParams LinearLayout.LayoutParams} to + * {@link android.widget.RelativeLayout.LayoutParams RelativeLayout.LayoutParams}).</li> + * <li>Your application processes will not be killed when the device density changes.</li> + * </ul> */ public static final int N = 24; diff --git a/core/java/android/os/UserManager.java b/core/java/android/os/UserManager.java index 1dae0f8e3543..03d3cf2e70f4 100644 --- a/core/java/android/os/UserManager.java +++ b/core/java/android/os/UserManager.java @@ -614,7 +614,8 @@ public class UserManager { /** * Specifies if a user is not allowed to enable the oem unlock setting. The default value is - * <code>false</code>. + * <code>false</code>. Setting this restriction has no effect if the bootloader is already + * unlocked. * * @see DevicePolicyManager#addUserRestriction(ComponentName, String) * @see DevicePolicyManager#clearUserRestriction(ComponentName, String) diff --git a/core/java/android/service/persistentdata/PersistentDataBlockManager.java b/core/java/android/service/persistentdata/PersistentDataBlockManager.java index cfeed51da86f..0f92ed04a457 100644 --- a/core/java/android/service/persistentdata/PersistentDataBlockManager.java +++ b/core/java/android/service/persistentdata/PersistentDataBlockManager.java @@ -163,10 +163,9 @@ public class PersistentDataBlockManager { /** * Retrieves available information about this device's flash lock state. * - * @return FLASH_LOCK_STATE_LOCKED if device bootloader is locked, - * FLASH_LOCK_STATE_UNLOCKED if device bootloader is unlocked, - * or FLASH_LOCK_STATE unknown if this information cannot be ascertained - * on this device. + * @return {@link #FLASH_LOCK_LOCKED} if device bootloader is locked, + * {@link #FLASH_LOCK_UNLOCKED} if device bootloader is unlocked, or {@link #FLASH_LOCK_UNKNOWN} + * if this information cannot be ascertained on this device. */ @FlashLockState public int getFlashLockState() { diff --git a/core/java/android/view/TextureView.java b/core/java/android/view/TextureView.java index a42da8563ba0..a5900e6b2f3a 100644 --- a/core/java/android/view/TextureView.java +++ b/core/java/android/view/TextureView.java @@ -229,7 +229,6 @@ public class TextureView extends View { @Override protected void destroyHardwareResources() { destroyHardwareLayer(); - mUpdateSurface = mSurface != null; } private void destroyHardwareLayer() { @@ -376,17 +375,17 @@ public class TextureView extends View { } mLayer = mAttachInfo.mHardwareRenderer.createTextureLayer(); - if (!mUpdateSurface) { + boolean createNewSurface = (mSurface == null); + if (createNewSurface) { // Create a new SurfaceTexture for the layer. mSurface = new SurfaceTexture(false); mLayer.setSurfaceTexture(mSurface); nCreateNativeWindow(mSurface); } mSurface.setDefaultBufferSize(getWidth(), getHeight()); - mSurface.setOnFrameAvailableListener(mUpdateListener, mAttachInfo.mHandler); - if (mListener != null && !mUpdateSurface) { + if (mListener != null && createNewSurface) { mListener.onSurfaceTextureAvailable(mSurface, getWidth(), getHeight()); } mLayer.setLayerPaint(mLayerPaint); @@ -745,9 +744,11 @@ public class TextureView extends View { "released SurfaceTexture"); } if (mSurface != null) { + nDestroyNativeWindow(); mSurface.release(); } mSurface = surfaceTexture; + nCreateNativeWindow(mSurface); /* * If the view is visible and we already made a layer, update the diff --git a/core/java/android/view/ThreadedRenderer.java b/core/java/android/view/ThreadedRenderer.java index e129a067ec14..2e0729be8b63 100644 --- a/core/java/android/view/ThreadedRenderer.java +++ b/core/java/android/view/ThreadedRenderer.java @@ -520,16 +520,6 @@ public final class ThreadedRenderer { } /** - * This method should be invoked whenever the current hardware renderer - * context should be reset. - * - * @param surface The surface to hardware accelerate - */ - void invalidate(Surface surface) { - updateSurface(surface); - } - - /** * Detaches the layer's surface texture from the GL context and releases * the texture id */ diff --git a/core/java/android/view/View.java b/core/java/android/view/View.java index e7553ec943ec..fc250f269271 100644 --- a/core/java/android/view/View.java +++ b/core/java/android/view/View.java @@ -3771,9 +3771,9 @@ public class View implements Drawable.Callback, KeyEvent.Callback, * {@link android.os.Build.VERSION_CODES#N API 24} will be able to participate * in the drag operation and receive the dragged content. * - * If this is the only flag set, then the drag recipient will only have access to text data + * <p>If this is the only flag set, then the drag recipient will only have access to text data * and intents contained in the {@link ClipData} object. Access to URIs contained in the - * {@link ClipData} is determined by other DRAG_FLAG_GLOBAL_* flags. + * {@link ClipData} is determined by other DRAG_FLAG_GLOBAL_* flags</p> */ public static final int DRAG_FLAG_GLOBAL = 1 << 8; // 256 diff --git a/core/java/android/widget/AbsListView.java b/core/java/android/widget/AbsListView.java index b65f93309e04..7b45d8cb05b0 100644 --- a/core/java/android/widget/AbsListView.java +++ b/core/java/android/widget/AbsListView.java @@ -1546,7 +1546,7 @@ public abstract class AbsListView extends AdapterView<ListAdapter> implements Te switch (action) { case AccessibilityNodeInfo.ACTION_SCROLL_FORWARD: case R.id.accessibilityActionScrollDown: { - if (isEnabled() && getLastVisiblePosition() < getCount() - 1) { + if (isEnabled() && canScrollDown()) { final int viewportHeight = getHeight() - mListPadding.top - mListPadding.bottom; smoothScrollBy(viewportHeight, PositionScroller.SCROLL_DURATION); return true; @@ -1554,7 +1554,7 @@ public abstract class AbsListView extends AdapterView<ListAdapter> implements Te } return false; case AccessibilityNodeInfo.ACTION_SCROLL_BACKWARD: case R.id.accessibilityActionScrollUp: { - if (isEnabled() && mFirstPosition > 0) { + if (isEnabled() && canScrollUp()) { final int viewportHeight = getHeight() - mListPadding.top - mListPadding.bottom; smoothScrollBy(-viewportHeight, PositionScroller.SCROLL_DURATION); return true; diff --git a/core/java/android/widget/RadialTimePickerView.java b/core/java/android/widget/RadialTimePickerView.java index 02ee2df18aaf..6f198e78df8a 100644 --- a/core/java/android/widget/RadialTimePickerView.java +++ b/core/java/android/widget/RadialTimePickerView.java @@ -16,7 +16,11 @@ package android.widget; +import com.android.internal.R; +import com.android.internal.widget.ExploreByTouchHelper; + import android.animation.ObjectAnimator; +import android.annotation.IntDef; import android.content.Context; import android.content.res.ColorStateList; import android.content.res.Resources; @@ -43,9 +47,8 @@ import android.view.accessibility.AccessibilityEvent; import android.view.accessibility.AccessibilityNodeInfo; import android.view.accessibility.AccessibilityNodeInfo.AccessibilityAction; -import com.android.internal.R; -import com.android.internal.widget.ExploreByTouchHelper; - +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; import java.util.Calendar; import java.util.Locale; @@ -55,11 +58,16 @@ import java.util.Locale; * @hide */ public class RadialTimePickerView extends View { - private static final String TAG = "RadialTimePickerView"; public static final int HOURS = 0; public static final int MINUTES = 1; + + /** @hide */ + @IntDef({HOURS, MINUTES}) + @Retention(RetentionPolicy.SOURCE) + @interface PickerType {} + private static final int HOURS_INNER = 2; private static final int SELECTOR_CIRCLE = 0; @@ -185,8 +193,24 @@ public class RadialTimePickerView extends View { private boolean mInputEnabled = true; - public interface OnValueSelectedListener { - void onValueSelected(int pickerIndex, int newValue, boolean autoAdvance); + interface OnValueSelectedListener { + /** + * Called when the selected value at a given picker index has changed. + * + * @param pickerType the type of value that has changed, one of: + * <ul> + * <li>{@link #MINUTES} + * <li>{@link #HOURS} + * </ul> + * @param newValue the new value as minute in hour (0-59) or hour in + * day (0-23) + * @param autoAdvance when the picker type is {@link #HOURS}, + * {@code true} to switch to the {@link #MINUTES} + * picker or {@code false} to stay on the current + * picker. No effect when picker type is + * {@link #MINUTES}. + */ + void onValueSelected(@PickerType int pickerType, int newValue, boolean autoAdvance); } /** @@ -977,7 +1001,7 @@ public class RadialTimePickerView extends View { // Ensure we're showing the correct picker. animatePicker(mShowHours, ANIM_DURATION_TOUCH); - final int type; + final @PickerType int type; final int newValue; final boolean valueChanged; diff --git a/core/java/android/widget/TimePickerClockDelegate.java b/core/java/android/widget/TimePickerClockDelegate.java index c21f1dfe0ed1..aa0b93d76a15 100644 --- a/core/java/android/widget/TimePickerClockDelegate.java +++ b/core/java/android/widget/TimePickerClockDelegate.java @@ -61,9 +61,6 @@ class TimePickerClockDelegate extends TimePicker.AbstractTimePickerDelegate { private static final int HOUR_INDEX = RadialTimePickerView.HOURS; private static final int MINUTE_INDEX = RadialTimePickerView.MINUTES; - // NOT a real index for the purpose of what's showing. - private static final int AMPM_INDEX = 2; - private static final int[] ATTRS_TEXT_COLOR = new int[] {R.attr.textColor}; private static final int[] ATTRS_DISABLED_ALPHA = new int[] {R.attr.disabledAlpha}; @@ -701,22 +698,21 @@ class TimePickerClockDelegate extends TimePicker.AbstractTimePickerDelegate { /** Listener for RadialTimePickerView interaction. */ private final OnValueSelectedListener mOnValueSelectedListener = new OnValueSelectedListener() { @Override - public void onValueSelected(int pickerIndex, int newValue, boolean autoAdvance) { - switch (pickerIndex) { - case HOUR_INDEX: + public void onValueSelected(int pickerType, int newValue, boolean autoAdvance) { + switch (pickerType) { + case RadialTimePickerView.HOURS: final boolean isTransition = mAllowAutoAdvance && autoAdvance; setHourInternal(newValue, true, !isTransition); if (isTransition) { setCurrentItemShowing(MINUTE_INDEX, true, false); - mDelegator.announceForAccessibility(newValue + ". " + mSelectMinutes); + + final int localizedHour = getLocalizedHour(newValue); + mDelegator.announceForAccessibility(localizedHour + ". " + mSelectMinutes); } break; - case MINUTE_INDEX: + case RadialTimePickerView.MINUTES: setMinuteInternal(newValue, true); break; - case AMPM_INDEX: - updateAmPmLabelStates(newValue); - break; } if (mOnTimeChangedListener != null) { diff --git a/core/java/com/android/internal/os/ZygoteInit.java b/core/java/com/android/internal/os/ZygoteInit.java index 73a3a0be32e1..68299615b5b9 100644 --- a/core/java/com/android/internal/os/ZygoteInit.java +++ b/core/java/com/android/internal/os/ZygoteInit.java @@ -586,21 +586,42 @@ public class ZygoteInit { // System server is fully AOTed and never profiled // for profile guided compilation. // TODO: Make this configurable between INTERPRET_ONLY, SPEED, SPACE and EVERYTHING? - final int dexoptNeeded = DexFile.getDexOptNeeded( + + int dexoptNeeded; + try { + dexoptNeeded = DexFile.getDexOptNeeded( classPathElement, instructionSet, "speed", false /* newProfile */); + } catch (FileNotFoundException ignored) { + // Do not add to the classpath. + Log.w(TAG, "Missing classpath element for system server: " + classPathElement); + continue; + } catch (IOException e) { + // Not fully clear what to do here as we don't know the cause of the + // IO exception. Add to the classpath to be conservative, but don't + // attempt to compile it. + Log.w(TAG, "Error checking classpath element for system server: " + + classPathElement, e); + dexoptNeeded = DexFile.NO_DEXOPT_NEEDED; + } + if (dexoptNeeded != DexFile.NO_DEXOPT_NEEDED) { - installer.dexopt(classPathElement, Process.SYSTEM_UID, instructionSet, - dexoptNeeded, 0 /*dexFlags*/, "speed", null /*volumeUuid*/, - sharedLibraries); + try { + installer.dexopt(classPathElement, Process.SYSTEM_UID, instructionSet, + dexoptNeeded, 0 /*dexFlags*/, "speed", null /*volumeUuid*/, + sharedLibraries); + } catch (InstallerException e) { + // Ignore (but log), we need this on the classpath for fallback mode. + Log.w(TAG, "Failed compiling classpath element for system server: " + + classPathElement, e); + } } + if (!sharedLibraries.isEmpty()) { sharedLibraries += ":"; } sharedLibraries += classPathElement; } - } catch (IOException | InstallerException e) { - throw new RuntimeException("Error starting system_server", e); } finally { installer.disconnect(); } diff --git a/core/java/com/android/internal/policy/BackdropFrameRenderer.java b/core/java/com/android/internal/policy/BackdropFrameRenderer.java index 0ab3a41f1469..619303f34c32 100644 --- a/core/java/com/android/internal/policy/BackdropFrameRenderer.java +++ b/core/java/com/android/internal/policy/BackdropFrameRenderer.java @@ -385,7 +385,7 @@ public class BackdropFrameRenderer extends Thread implements Choreographer.Frame final int size = DecorView.getNavBarSize(bottomInset, rightInset, leftInset); if (DecorView.isNavBarToRightEdge(bottomInset, rightInset)) { mNavigationBarColor.setBounds(width - size, 0, width, height); - } else if (DecorView.isNavBarToLeftEdge(bottomInset, rightInset)) { + } else if (DecorView.isNavBarToLeftEdge(bottomInset, leftInset)) { mNavigationBarColor.setBounds(0, 0, size, height); } else { mNavigationBarColor.setBounds(0, height - size, width, height); diff --git a/core/java/com/android/internal/policy/PhoneWindow.java b/core/java/com/android/internal/policy/PhoneWindow.java index 9ad750d3a599..878f3a69a504 100644 --- a/core/java/com/android/internal/policy/PhoneWindow.java +++ b/core/java/com/android/internal/policy/PhoneWindow.java @@ -92,8 +92,6 @@ import android.util.EventLog; import android.util.Log; import android.util.SparseArray; import android.util.TypedValue; -import android.view.accessibility.AccessibilityNodeInfo; -import android.view.accessibility.AccessibilityNodeProvider; import android.view.animation.Animation; import android.view.animation.AnimationUtils; import android.widget.FrameLayout; @@ -2057,9 +2055,6 @@ public class PhoneWindow extends Window implements MenuBuilder.Callback { } static private final String FOCUSED_ID_TAG = "android:focusedViewId"; - static private final String ACCESSIBILITY_FOCUSED_ID_TAG = "android:accessibilityFocusedViewId"; - static private final String ACCESSIBILITY_FOCUSED_VIRTUAL_ID_TAG = - "android:accessibilityFocusedVirtualViewId"; static private final String VIEWS_TAG = "android:views"; static private final String PANELS_TAG = "android:Panels"; static private final String ACTION_BAR_TAG = "android:ActionBar"; @@ -2082,26 +2077,6 @@ public class PhoneWindow extends Window implements MenuBuilder.Callback { outState.putInt(FOCUSED_ID_TAG, focusedView.getId()); } - // Save the accessibility focused view ID. - if (mDecor != null) { - final ViewRootImpl viewRootImpl = mDecor.getViewRootImpl(); - if (viewRootImpl != null) { - final View accessFocusHost = viewRootImpl.getAccessibilityFocusedHost(); - if (accessFocusHost != null && accessFocusHost.getId() != View.NO_ID) { - outState.putInt(ACCESSIBILITY_FOCUSED_ID_TAG, accessFocusHost.getId()); - - // If we have a focused virtual node ID, save that too. - final AccessibilityNodeInfo accessFocusedNode = - viewRootImpl.getAccessibilityFocusedVirtualView(); - if (accessFocusedNode != null) { - final int virtualNodeId = AccessibilityNodeInfo.getVirtualDescendantId( - accessFocusedNode.getSourceNodeId()); - outState.putInt(ACCESSIBILITY_FOCUSED_VIRTUAL_ID_TAG, virtualNodeId); - } - } - } - } - // save the panels SparseArray<Parcelable> panelStates = new SparseArray<Parcelable>(); savePanelState(panelStates); @@ -2144,13 +2119,6 @@ public class PhoneWindow extends Window implements MenuBuilder.Callback { } } - // Restore the accessibility focused view. - final int accessFocusHostViewId = savedInstanceState.getInt( - ACCESSIBILITY_FOCUSED_ID_TAG, View.NO_ID); - final int accessFocusVirtualViewId = savedInstanceState.getInt( - ACCESSIBILITY_FOCUSED_VIRTUAL_ID_TAG, AccessibilityNodeInfo.UNDEFINED_ITEM_ID); - tryRestoreAccessibilityFocus(accessFocusHostViewId, accessFocusVirtualViewId); - // Restore the panels. SparseArray<Parcelable> panelStates = savedInstanceState.getSparseParcelableArray(PANELS_TAG); if (panelStates != null) { @@ -2170,33 +2138,6 @@ public class PhoneWindow extends Window implements MenuBuilder.Callback { } } - private void tryRestoreAccessibilityFocus(int hostViewId, int virtualViewId) { - if (hostViewId != View.NO_ID && mDecor != null) { - final View needsAccessFocus = mDecor.findViewById(hostViewId); - if (needsAccessFocus != null) { - if (!tryFocusingVirtualView(needsAccessFocus, virtualViewId) - && !needsAccessFocus.requestAccessibilityFocus()) { - Log.w(TAG, "Failed to restore focus to previously accessibility" - + " focused view with id " + hostViewId); - } - } else { - Log.w(TAG, "Previously accessibility focused view reported id " + hostViewId - + " during save, but can't be found during restore."); - } - } - } - - private boolean tryFocusingVirtualView(View host, int virtualViewId) { - if (virtualViewId != AccessibilityNodeInfo.UNDEFINED_ITEM_ID) { - final AccessibilityNodeProvider nodeProvider = host.getAccessibilityNodeProvider(); - if (nodeProvider != null) { - return nodeProvider.performAction(virtualViewId, - AccessibilityNodeInfo.ACTION_ACCESSIBILITY_FOCUS, null); - } - } - return false; - } - /** * Invoked when the panels should freeze their state. * diff --git a/core/java/com/android/internal/widget/CachingIconView.java b/core/java/com/android/internal/widget/CachingIconView.java new file mode 100644 index 000000000000..293b77b91d37 --- /dev/null +++ b/core/java/com/android/internal/widget/CachingIconView.java @@ -0,0 +1,178 @@ +/* + * 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.widget; + +import android.annotation.DrawableRes; +import android.annotation.Nullable; +import android.content.Context; +import android.content.res.Configuration; +import android.graphics.Bitmap; +import android.graphics.drawable.Drawable; +import android.graphics.drawable.Icon; +import android.net.Uri; +import android.text.TextUtils; +import android.util.AttributeSet; +import android.view.RemotableViewMethod; +import android.widget.ImageView; +import android.widget.RemoteViews; + +import libcore.util.Objects; + +/** + * An ImageView for displaying an Icon. Avoids reloading the Icon when possible. + */ +@RemoteViews.RemoteView +public class CachingIconView extends ImageView { + + private String mLastPackage; + private int mLastResId; + private boolean mInternalSetDrawable; + + public CachingIconView(Context context, @Nullable AttributeSet attrs) { + super(context, attrs); + } + + @Override + @RemotableViewMethod(asyncImpl="setImageIconAsync") + public void setImageIcon(@Nullable Icon icon) { + if (!testAndSetCache(icon)) { + mInternalSetDrawable = true; + // This calls back to setImageDrawable, make sure we don't clear the cache there. + super.setImageIcon(icon); + mInternalSetDrawable = false; + } + } + + @Override + public Runnable setImageIconAsync(@Nullable Icon icon) { + resetCache(); + return super.setImageIconAsync(icon); + } + + @Override + @RemotableViewMethod(asyncImpl="setImageResourceAsync") + public void setImageResource(@DrawableRes int resId) { + if (!testAndSetCache(resId)) { + mInternalSetDrawable = true; + // This calls back to setImageDrawable, make sure we don't clear the cache there. + super.setImageResource(resId); + mInternalSetDrawable = false; + } + } + + @Override + public Runnable setImageResourceAsync(@DrawableRes int resId) { + resetCache(); + return super.setImageResourceAsync(resId); + } + + @Override + @RemotableViewMethod(asyncImpl="setImageURIAsync") + public void setImageURI(@Nullable Uri uri) { + resetCache(); + super.setImageURI(uri); + } + + @Override + public Runnable setImageURIAsync(@Nullable Uri uri) { + resetCache(); + return super.setImageURIAsync(uri); + } + + @Override + public void setImageDrawable(@Nullable Drawable drawable) { + if (!mInternalSetDrawable) { + // Only clear the cache if we were externally called. + resetCache(); + } + super.setImageDrawable(drawable); + } + + @Override + @RemotableViewMethod + public void setImageBitmap(Bitmap bm) { + resetCache(); + super.setImageBitmap(bm); + } + + @Override + protected void onConfigurationChanged(Configuration newConfig) { + super.onConfigurationChanged(newConfig); + resetCache(); + } + + /** + * @return true if the currently set image is the same as {@param icon} + */ + private synchronized boolean testAndSetCache(Icon icon) { + if (icon != null && icon.getType() == Icon.TYPE_RESOURCE) { + String iconPackage = normalizeIconPackage(icon); + + boolean isCached = mLastResId != 0 + && icon.getResId() == mLastResId + && Objects.equal(iconPackage, mLastPackage); + + mLastPackage = iconPackage; + mLastResId = icon.getResId(); + + return isCached; + } else { + resetCache(); + return false; + } + } + + /** + * @return true if the currently set image is the same as {@param resId} + */ + private synchronized boolean testAndSetCache(int resId) { + boolean isCached; + if (resId == 0 || mLastResId == 0) { + isCached = false; + } else { + isCached = resId == mLastResId && null == mLastPackage; + } + mLastPackage = null; + mLastResId = resId; + return isCached; + } + + /** + * Returns the normalized package name of {@param icon}. + * @return null if icon is null or if the icons package is null, empty or matches the current + * context. Otherwise returns the icon's package context. + */ + private String normalizeIconPackage(Icon icon) { + if (icon == null) { + return null; + } + + String pkg = icon.getResPackage(); + if (TextUtils.isEmpty(pkg)) { + return null; + } + if (pkg.equals(mContext.getPackageName())) { + return null; + } + return pkg; + } + + private synchronized void resetCache() { + mLastResId = 0; + mLastPackage = null; + } +} diff --git a/core/java/com/android/internal/widget/LockPatternUtils.java b/core/java/com/android/internal/widget/LockPatternUtils.java index d3792ade9965..479b3b7a7a71 100644 --- a/core/java/com/android/internal/widget/LockPatternUtils.java +++ b/core/java/com/android/internal/widget/LockPatternUtils.java @@ -288,7 +288,6 @@ public class LockPatternUtils { public void reportFailedPasswordAttempt(int userId) { getDevicePolicyManager().reportFailedPasswordAttempt(userId); getTrustManager().reportUnlockAttempt(false /* authenticated */, userId); - requireStrongAuth(StrongAuthTracker.SOME_AUTH_REQUIRED_AFTER_WRONG_CREDENTIAL, userId); } public void reportSuccessfulPasswordAttempt(int userId) { @@ -1544,7 +1543,8 @@ public class LockPatternUtils { value = { STRONG_AUTH_NOT_REQUIRED, STRONG_AUTH_REQUIRED_AFTER_BOOT, STRONG_AUTH_REQUIRED_AFTER_DPM_LOCK_NOW, - SOME_AUTH_REQUIRED_AFTER_USER_REQUEST}) + SOME_AUTH_REQUIRED_AFTER_USER_REQUEST, + STRONG_AUTH_REQUIRED_AFTER_LOCKOUT}) @Retention(RetentionPolicy.SOURCE) public @interface StrongAuthFlags {} @@ -1575,13 +1575,12 @@ public class LockPatternUtils { public static final int STRONG_AUTH_REQUIRED_AFTER_LOCKOUT = 0x8; /** - * Some authentication is required because the user has entered a wrong credential. + * Strong auth flags that do not prevent fingerprint from being accepted as auth. + * + * If any other flags are set, fingerprint is disabled. */ - public static final int SOME_AUTH_REQUIRED_AFTER_WRONG_CREDENTIAL = 0x10; - private static final int ALLOWING_FINGERPRINT = STRONG_AUTH_NOT_REQUIRED - | SOME_AUTH_REQUIRED_AFTER_USER_REQUEST - | SOME_AUTH_REQUIRED_AFTER_WRONG_CREDENTIAL; + | SOME_AUTH_REQUIRED_AFTER_USER_REQUEST; private final SparseIntArray mStrongAuthRequiredForUser = new SparseIntArray(); private final H mHandler; diff --git a/core/jni/android_graphics_Canvas.cpp b/core/jni/android_graphics_Canvas.cpp index ded4daca0707..2ab4a356e436 100644 --- a/core/jni/android_graphics_Canvas.cpp +++ b/core/jni/android_graphics_Canvas.cpp @@ -614,10 +614,10 @@ static const JNINativeMethod gMethods[] = { {"native_drawPath","!(JJJ)V", (void*) CanvasJNI::drawPath}, {"nativeDrawVertices", "!(JII[FI[FI[II[SIIJ)V", (void*)CanvasJNI::drawVertices}, {"native_drawNinePatch", "!(JJJFFFFJII)V", (void*)CanvasJNI::drawNinePatch}, - {"native_drawBitmap","!(JLandroid/graphics/Bitmap;FFJIII)V", (void*) CanvasJNI::drawBitmap}, + {"native_drawBitmap","(JLandroid/graphics/Bitmap;FFJIII)V", (void*) CanvasJNI::drawBitmap}, {"nativeDrawBitmapMatrix", "!(JLandroid/graphics/Bitmap;JJ)V", (void*)CanvasJNI::drawBitmapMatrix}, - {"native_drawBitmap","!(JLandroid/graphics/Bitmap;FFFFFFFFJII)V", (void*) CanvasJNI::drawBitmapRect}, - {"native_drawBitmap", "!(J[IIIFFIIZJ)V", (void*)CanvasJNI::drawBitmapArray}, + {"native_drawBitmap","(JLandroid/graphics/Bitmap;FFFFFFFFJII)V", (void*) CanvasJNI::drawBitmapRect}, + {"native_drawBitmap", "(J[IIIFFIIZJ)V", (void*)CanvasJNI::drawBitmapArray}, {"nativeDrawBitmapMesh", "!(JLandroid/graphics/Bitmap;II[FI[IIJ)V", (void*)CanvasJNI::drawBitmapMesh}, {"native_drawText","!(J[CIIFFIJJ)V", (void*) CanvasJNI::drawTextChars}, {"native_drawText","!(JLjava/lang/String;IIFFIJJ)V", (void*) CanvasJNI::drawTextString}, diff --git a/core/jni/android_util_Process.cpp b/core/jni/android_util_Process.cpp index a693f29aa283..3c72274f1fca 100644 --- a/core/jni/android_util_Process.cpp +++ b/core/jni/android_util_Process.cpp @@ -58,21 +58,19 @@ static pthread_key_t gBgKey = -1; #endif // For both of these, err should be in the errno range (positive), not a status_t (negative) - -static void signalExceptionForPriorityError(JNIEnv* env, int err) -{ +static void signalExceptionForError(JNIEnv* env, int err, int tid) { switch (err) { case EINVAL: - jniThrowException(env, "java/lang/IllegalArgumentException", NULL); + jniThrowExceptionFmt(env, "java/lang/IllegalArgumentException", + "Invalid argument: %d", tid); break; case ESRCH: - jniThrowException(env, "java/lang/IllegalArgumentException", "Given thread does not exist"); + jniThrowExceptionFmt(env, "java/lang/IllegalArgumentException", + "Given thread %d does not exist", tid); break; case EPERM: - jniThrowException(env, "java/lang/SecurityException", "No permission to modify given thread"); - break; - case EACCES: - jniThrowException(env, "java/lang/SecurityException", "No permission to set to given priority"); + jniThrowExceptionFmt(env, "java/lang/SecurityException", + "No permission to modify given thread %d", tid); break; default: jniThrowException(env, "java/lang/RuntimeException", "Unknown error"); @@ -80,23 +78,27 @@ static void signalExceptionForPriorityError(JNIEnv* env, int err) } } -static void signalExceptionForGroupError(JNIEnv* env, int err) -{ +static void signalExceptionForPriorityError(JNIEnv* env, int err, int tid) { switch (err) { - case EINVAL: - jniThrowException(env, "java/lang/IllegalArgumentException", NULL); - break; - case ESRCH: - jniThrowException(env, "java/lang/IllegalArgumentException", "Given thread does not exist"); + case EACCES: + jniThrowExceptionFmt(env, "java/lang/SecurityException", + "No permission to set the priority of %d", tid); break; - case EPERM: - jniThrowException(env, "java/lang/SecurityException", "No permission to modify given thread"); + default: + signalExceptionForError(env, err, tid); break; + } + +} + +static void signalExceptionForGroupError(JNIEnv* env, int err, int tid) { + switch (err) { case EACCES: - jniThrowException(env, "java/lang/SecurityException", "No permission to set to given group"); + jniThrowExceptionFmt(env, "java/lang/SecurityException", + "No permission to set the group of %d", tid); break; default: - jniThrowException(env, "java/lang/RuntimeException", "Unknown error"); + signalExceptionForError(env, err, tid); break; } } @@ -171,7 +173,7 @@ void android_os_Process_setThreadGroup(JNIEnv* env, jobject clazz, int tid, jint SchedPolicy sp = (SchedPolicy) grp; int res = set_sched_policy(tid, sp); if (res != NO_ERROR) { - signalExceptionForGroupError(env, -res); + signalExceptionForGroupError(env, -res, tid); } } @@ -183,7 +185,7 @@ void android_os_Process_setProcessGroup(JNIEnv* env, jobject clazz, int pid, jin struct dirent *de; if ((grp == SP_FOREGROUND) || (grp > SP_MAX)) { - signalExceptionForGroupError(env, EINVAL); + signalExceptionForGroupError(env, EINVAL, pid); return; } @@ -219,7 +221,7 @@ void android_os_Process_setProcessGroup(JNIEnv* env, jobject clazz, int pid, jin if (!(d = opendir(proc_path))) { // If the process exited on us, don't generate an exception if (errno != ENOENT) - signalExceptionForGroupError(env, errno); + signalExceptionForGroupError(env, errno, pid); return; } @@ -254,7 +256,7 @@ void android_os_Process_setProcessGroup(JNIEnv* env, jobject clazz, int pid, jin #ifdef ENABLE_CPUSETS int err = set_cpuset_policy(t_pid, sp); if (err != NO_ERROR) { - signalExceptionForGroupError(env, -err); + signalExceptionForGroupError(env, -err, t_pid); break; } #endif @@ -266,14 +268,14 @@ void android_os_Process_setProcessGroup(JNIEnv* env, jobject clazz, int pid, jin // set both cpuset and cgroup for general threads err = set_cpuset_policy(t_pid, sp); if (err != NO_ERROR) { - signalExceptionForGroupError(env, -err); + signalExceptionForGroupError(env, -err, t_pid); break; } #endif err = set_sched_policy(t_pid, sp); if (err != NO_ERROR) { - signalExceptionForGroupError(env, -err); + signalExceptionForGroupError(env, -err, t_pid); break; } @@ -285,7 +287,7 @@ jint android_os_Process_getProcessGroup(JNIEnv* env, jobject clazz, jint pid) { SchedPolicy sp; if (get_sched_policy(pid, &sp) != 0) { - signalExceptionForGroupError(env, errno); + signalExceptionForGroupError(env, errno, pid); } return (int) sp; } @@ -400,7 +402,7 @@ jintArray android_os_Process_getExclusiveCores(JNIEnv* env, jobject clazz) { jintArray cpus; int pid = getpid(); if (get_sched_policy(pid, &sp) != 0) { - signalExceptionForGroupError(env, errno); + signalExceptionForGroupError(env, errno, pid); return NULL; } get_exclusive_cpuset_cores(sp, &cpu_set); @@ -449,10 +451,10 @@ jint android_os_Process_getThreadScheduler(JNIEnv* env, jclass clazz, errno = 0; policy = sched_getscheduler(tid); if (errno != 0) { - signalExceptionForPriorityError(env, errno); + signalExceptionForPriorityError(env, errno, tid); } #else - signalExceptionForPriorityError(env, ENOSYS); + signalExceptionForPriorityError(env, ENOSYS, tid); #endif return policy; } @@ -466,10 +468,10 @@ void android_os_Process_setThreadScheduler(JNIEnv* env, jclass clazz, param.sched_priority = pri; int rc = sched_setscheduler(tid, policy, ¶m); if (rc) { - signalExceptionForPriorityError(env, errno); + signalExceptionForPriorityError(env, errno, tid); } #else - signalExceptionForPriorityError(env, ENOSYS); + signalExceptionForPriorityError(env, ENOSYS, tid); #endif } @@ -494,9 +496,9 @@ void android_os_Process_setThreadPriority(JNIEnv* env, jobject clazz, int rc = androidSetThreadPriority(pid, pri); if (rc != 0) { if (rc == INVALID_OPERATION) { - signalExceptionForPriorityError(env, errno); + signalExceptionForPriorityError(env, errno, pid); } else { - signalExceptionForGroupError(env, errno); + signalExceptionForGroupError(env, errno, pid); } } @@ -516,7 +518,7 @@ jint android_os_Process_getThreadPriority(JNIEnv* env, jobject clazz, errno = 0; jint pri = getpriority(PRIO_PROCESS, pid); if (errno != 0) { - signalExceptionForPriorityError(env, errno); + signalExceptionForPriorityError(env, errno, pid); } //ALOGI("Returning priority of %" PRId32 ": %" PRId32 "\n", pid, pri); return pri; diff --git a/core/jni/com_android_internal_os_Zygote.cpp b/core/jni/com_android_internal_os_Zygote.cpp index 3f4b2a61321b..a04fc2a70686 100644 --- a/core/jni/com_android_internal_os_Zygote.cpp +++ b/core/jni/com_android_internal_os_Zygote.cpp @@ -176,7 +176,9 @@ static void SetGids(JNIEnv* env, jintArray javaGids) { } int rc = setgroups(gids.size(), reinterpret_cast<const gid_t*>(&gids[0])); if (rc == -1) { - RuntimeAbort(env, __LINE__, "setgroups failed"); + std::ostringstream oss; + oss << "setgroups failed: " << strerror(errno) << ", gids.size=" << gids.size(); + RuntimeAbort(env, __LINE__, oss.str().c_str()); } } diff --git a/core/res/res/layout/chooser_grid.xml b/core/res/res/layout/chooser_grid.xml index d12c8ba2f2ef..d8dd447e6a74 100644 --- a/core/res/res/layout/chooser_grid.xml +++ b/core/res/res/layout/chooser_grid.xml @@ -41,7 +41,7 @@ android:visibility="gone" style="?attr/borderlessButtonStyle" android:textAppearance="?attr/textAppearanceButton" - android:textColor="@color/material_deep_teal_500" + android:textColor="?attr/colorAccent" android:gravity="center_vertical" android:layout_alignParentTop="true" android:layout_alignParentRight="true" diff --git a/core/res/res/layout/notification_template_header.xml b/core/res/res/layout/notification_template_header.xml index 38f671c21cbb..1f71a180cdf4 100644 --- a/core/res/res/layout/notification_template_header.xml +++ b/core/res/res/layout/notification_template_header.xml @@ -26,7 +26,7 @@ android:paddingBottom="16dp" android:paddingStart="@dimen/notification_content_margin_start" android:paddingEnd="16dp"> - <ImageView + <com.android.internal.widget.CachingIconView android:id="@+id/icon" android:layout_width="18dp" android:layout_height="18dp" diff --git a/core/res/res/layout/resolver_list.xml b/core/res/res/layout/resolver_list.xml index ae945031f11d..c4e8e9cb63bf 100644 --- a/core/res/res/layout/resolver_list.xml +++ b/core/res/res/layout/resolver_list.xml @@ -42,7 +42,7 @@ android:visibility="gone" style="?attr/borderlessButtonStyle" android:textAppearance="?attr/textAppearanceButton" - android:textColor="@color/material_deep_teal_500" + android:textColor="?attr/colorAccent" android:gravity="center_vertical" android:layout_alignParentTop="true" android:layout_alignParentRight="true" diff --git a/core/res/res/values-fr-rCA/strings.xml b/core/res/res/values-fr-rCA/strings.xml index f0d988848fd9..d9fbceb2ba5d 100644 --- a/core/res/res/values-fr-rCA/strings.xml +++ b/core/res/res/values-fr-rCA/strings.xml @@ -21,7 +21,7 @@ <resources xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <string name="byteShort" msgid="8340973892742019101">"B"</string> - <string name="kilobyteShort" msgid="5973789783504771878">"Ko"</string> + <string name="kilobyteShort" msgid="5973789783504771878">"ko"</string> <string name="megabyteShort" msgid="6355851576770428922">"Mo"</string> <string name="gigabyteShort" msgid="3259882455212193214">"Go"</string> <string name="terabyteShort" msgid="231613018159186962">"To"</string> diff --git a/docs/html/guide/topics/ui/notifiers/toasts.jd b/docs/html/guide/topics/ui/notifiers/toasts.jd index d9627274fa3e..2262a9ab9567 100644 --- a/docs/html/guide/topics/ui/notifiers/toasts.jd +++ b/docs/html/guide/topics/ui/notifiers/toasts.jd @@ -76,16 +76,22 @@ To nudge it down, increase the value of the last parameter. <h2 id="CustomToastView">Creating a Custom Toast View</h2> -<p>If a simple text message isn't enough, you can create a customized layout for your -toast notification. To create a custom layout, define a View layout, -in XML or in your application code, and pass the root {@link android.view.View} object -to the {@link android.widget.Toast#setView(View)} method.</p> - -<p>For example, you can create the layout for the toast visible in the screenshot to the right -with the following XML (saved as <em>toast_layout.xml</em>):</p> +<p> + If a simple text message isn't enough, you can create a customized layout + for your toast notification. To create a custom layout, define a View + layout, in XML or in your application code, and pass the root {@link + android.view.View} object to the {@link android.widget.Toast#setView(View)} + method. +</p> + +<p> + For example, you can create the layout for the toast visible in the + screenshot to the right with the following XML (saved as + <em>layout/custom_toast.xml</em>): +</p> <pre> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" - android:id="@+id/toast_layout_root" + android:id="@+id/custom_toast_container" android:orientation="horizontal" android:layout_width="fill_parent" android:layout_height="fill_parent" @@ -105,13 +111,16 @@ with the following XML (saved as <em>toast_layout.xml</em>):</p> </LinearLayout> </pre> -<p>Notice that the ID of the LinearLayout element is "toast_layout_root". You must use this -ID to inflate the layout from the XML, as shown here:</p> +<p> + Notice that the ID of the LinearLayout element is "custom_toast_container". + You must use this ID and the ID of the XML layout file "custom_toast" to + inflate the layout, as shown here: +</p> <pre> LayoutInflater inflater = getLayoutInflater(); View layout = inflater.inflate(R.layout.custom_toast, - (ViewGroup) findViewById(R.id.toast_layout_root)); + (ViewGroup) findViewById(R.id.custom_toast_container)); TextView text = (TextView) layout.findViewById(R.id.text); text.setText("This is a custom toast"); diff --git a/docs/html/training/testing/unit-testing/local-unit-tests.jd b/docs/html/training/testing/unit-testing/local-unit-tests.jd index 8b109ee36a0e..d19de4f6544a 100644 --- a/docs/html/training/testing/unit-testing/local-unit-tests.jd +++ b/docs/html/training/testing/unit-testing/local-unit-tests.jd @@ -112,12 +112,16 @@ Hamcrest matchers</a> (such as the {@code is()} and {@code equalTo()} methods) t returned result against the expected result.</p> <h3 id="mocking-dependencies">Mock Android dependencies</h3> -<p> -By default, the <a href="{@docRoot}tools/building/plugin-for-gradle.html"> -Android Plug-in for Gradle</a> executes your local unit tests against a modified -version of the {@code android.jar} library, which does not contain any actual code. Instead, method -calls to Android classes from your unit test throw an exception. -</p> + +<p>By default, the <a href= +"{@docRoot}tools/building/plugin-for-gradle.html">Android Plug-in for +Gradle</a> executes your local unit tests against a modified version of the +{@code android.jar} library, which does not contain any actual code. Instead, +method calls to Android classes from your unit test throw an exception. This is +to make sure you test only your code and do not depend on any +particular behavior of the Android platform (that you have not explicitly +mocked).</p> + <p> You can use a mocking framework to stub out external dependencies in your code, to easily test that your component interacts with a dependency in an expected way. By substituting Android dependencies @@ -195,6 +199,26 @@ class="external-link">Mockito API reference</a> and the class="external-link">sample code</a>. </p> +<p>If the exceptions thrown by Android APIs in the +<code>android.jar</code> are problematic for your tests, you can change the behavior so that methods +instead return either null or zero by adding the following configuration in your project's +top-level <code>build.gradle</code> file:</p> + +<pre> +android { + ... + testOptions { + unitTests.returnDefaultValues = true + } +} +</pre> + +<p class="caution"><strong>Caution:</strong> +Setting the <code>returnDefaultValues</code> property to <code>true</code> +should be done with care. The null/zero return values can introduce +regressions in your tests, which are hard to debug and might allow failing tests +to pass. Only use it as a last resort.</p> + <h2 id="run">Run Local Unit Tests</h2> diff --git a/graphics/java/android/graphics/drawable/AnimatedVectorDrawable.java b/graphics/java/android/graphics/drawable/AnimatedVectorDrawable.java index 87c472ec6c95..c6a45c1a677f 100644 --- a/graphics/java/android/graphics/drawable/AnimatedVectorDrawable.java +++ b/graphics/java/android/graphics/drawable/AnimatedVectorDrawable.java @@ -210,7 +210,7 @@ public class AnimatedVectorDrawable extends Drawable implements Animatable2 { /** * In order to avoid breaking old apps, we only throw exception on invalid VectorDrawable - * animations * for apps targeting N and later. For older apps, we ignore (i.e. quietly skip) + * animations for apps targeting N and later. For older apps, we ignore (i.e. quietly skip) * these animations. * * @return whether invalid animations for vector drawable should be ignored. diff --git a/keystore/java/android/security/keystore/KeyGenParameterSpec.java b/keystore/java/android/security/keystore/KeyGenParameterSpec.java index cbef540562e1..ed40b77be4a4 100644 --- a/keystore/java/android/security/keystore/KeyGenParameterSpec.java +++ b/keystore/java/android/security/keystore/KeyGenParameterSpec.java @@ -571,13 +571,12 @@ public final class KeyGenParameterSpec implements AlgorithmParameterSpec { * * <p>If this method returns {@code null}, and the spec is used to generate an asymmetric (RSA * or EC) key pair, the public key will have a self-signed certificate if it has purpose {@link - * KeyProperties#PURPOSE_SIGN} (see {@link #KeyGenParameterSpec(String, int)). If does not have - * purpose {@link KeyProperties#PURPOSE_SIGN}, it will have a fake certificate. + * KeyProperties#PURPOSE_SIGN}. If does not have purpose {@link KeyProperties#PURPOSE_SIGN}, it + * will have a fake certificate. * * <p>Symmetric keys, such as AES and HMAC keys, do not have public key certificates. If a - * {@link KeyGenParameterSpec} with {@link #hasAttestationCertificate()} returning - * non-{@code null} is used to generate a symmetric (AES or HMAC) key, - * {@link KeyGenerator#generateKey())} will throw + * KeyGenParameterSpec with getAttestationChallenge returning non-null is used to generate a + * symmetric (AES or HMAC) key, {@link javax.crypto.KeyGenerator#generateKey()} will throw * {@link java.security.InvalidAlgorithmParameterException}. * * @see Builder#setAttestationChallenge(byte[]) @@ -1050,11 +1049,6 @@ public final class KeyGenParameterSpec implements AlgorithmParameterSpec { return this; } - /* - * TODO(swillden): Update this documentation to describe the hardware and software root - * keys, including information about CRL/OCSP services for discovering revocations, and to - * link to documentation of the extension format and content. - */ /** * Sets whether an attestation certificate will be generated for this key pair, and what * challenge value will be placed in the certificate. The attestation certificate chain @@ -1074,17 +1068,15 @@ public final class KeyGenParameterSpec implements AlgorithmParameterSpec { * * <p>If {@code attestationChallenge} is {@code null}, and this spec is used to generate an * asymmetric (RSA or EC) key pair, the public key certificate will be self-signed if the - * key has purpose {@link KeyProperties#PURPOSE_SIGN} (see - * {@link #KeyGenParameterSpec(String, int)). If the key does not have purpose - * {@link KeyProperties#PURPOSE_SIGN}, it is not possible to use the key to sign a - * certificate, so the public key certificate will contain a dummy signature. + * key has purpose {@link android.security.keystore.KeyProperties#PURPOSE_SIGN}. If the key + * does not have purpose {@link android.security.keystore.KeyProperties#PURPOSE_SIGN}, it is + * not possible to use the key to sign a certificate, so the public key certificate will + * contain a dummy signature. * * <p>Symmetric keys, such as AES and HMAC keys, do not have public key certificates. If a - * {@code getAttestationChallenge} returns non-{@code null} and the spec is used to - * generate a symmetric (AES or HMAC) key, {@link KeyGenerator#generateKey()} will throw + * {@link #getAttestationChallenge()} returns non-null and the spec is used to generate a + * symmetric (AES or HMAC) key, {@link javax.crypto.KeyGenerator#generateKey()} will throw * {@link java.security.InvalidAlgorithmParameterException}. - * - * @see Builder#setAttestationChallenge(String attestationChallenge) */ @NonNull public Builder setAttestationChallenge(byte[] attestationChallenge) { diff --git a/libs/hwui/renderthread/RenderProxy.cpp b/libs/hwui/renderthread/RenderProxy.cpp index fb1c8962328b..a734401a2be6 100644 --- a/libs/hwui/renderthread/RenderProxy.cpp +++ b/libs/hwui/renderthread/RenderProxy.cpp @@ -158,7 +158,7 @@ void RenderProxy::updateSurface(const sp<Surface>& surface) { SETUP_TASK(updateSurface); args->context = mContext; args->surface = surface.get(); - postAndWait(task); + post(task); } CREATE_BRIDGE2(pauseSurface, CanvasContext* context, Surface* surface) { diff --git a/packages/Keyguard/res/values-af/strings.xml b/packages/Keyguard/res/values-af/strings.xml index 568d82a36750..a3381656ec3d 100644 --- a/packages/Keyguard/res/values-af/strings.xml +++ b/packages/Keyguard/res/values-af/strings.xml @@ -46,11 +46,6 @@ <string name="keyguard_sim_locked_message" msgid="6875773413306380902">"SIM-kaart is gesluit."</string> <string name="keyguard_sim_puk_locked_message" msgid="3747232467471801633">"SIM-kaart is PUK-geslote."</string> <string name="keyguard_sim_unlock_progress_dialog_message" msgid="7975221805033614426">"Ontsluit tans SIM-kaart…"</string> - <string name="keyguard_accessibility_pattern_unlock" msgid="1490840706075246612">"Patroon ontsluit."</string> - <string name="keyguard_accessibility_pin_unlock" msgid="2469687111784035046">"PIN ontsluit."</string> - <string name="keyguard_accessibility_password_unlock" msgid="7675777623912155089">"Wagwoord ontsluit."</string> - <string name="keyguard_accessibility_pattern_area" msgid="7679891324509597904">"Patroonarea."</string> - <string name="keyguard_accessibility_slide_area" msgid="6736064494019979544">"Sleep-area."</string> <string name="keyguard_accessibility_pin_area" msgid="7903959476607833485">"PIN-area"</string> <string name="keyguard_accessibility_sim_pin_area" msgid="3887780775111719336">"SIM-PIN-area"</string> <string name="keyguard_accessibility_sim_puk_area" msgid="1880823406954996207">"SIM-PUK-area"</string> diff --git a/packages/Keyguard/res/values-am/strings.xml b/packages/Keyguard/res/values-am/strings.xml index 68e9ff3fd824..67fdc321837d 100644 --- a/packages/Keyguard/res/values-am/strings.xml +++ b/packages/Keyguard/res/values-am/strings.xml @@ -46,11 +46,6 @@ <string name="keyguard_sim_locked_message" msgid="6875773413306380902">"ሲም ካርድ ተዘግቷል።"</string> <string name="keyguard_sim_puk_locked_message" msgid="3747232467471801633">"ሲም ካርድ በፒዩኬ ተዘግቷል።"</string> <string name="keyguard_sim_unlock_progress_dialog_message" msgid="7975221805033614426">"ሲም ካርዱን በመክፈት ላይ…"</string> - <string name="keyguard_accessibility_pattern_unlock" msgid="1490840706075246612">"በስርዓተ-ጥለት መክፈት።"</string> - <string name="keyguard_accessibility_pin_unlock" msgid="2469687111784035046">"በፒን መክፈት።"</string> - <string name="keyguard_accessibility_password_unlock" msgid="7675777623912155089">"በይለፍ ቃል መክፈት።"</string> - <string name="keyguard_accessibility_pattern_area" msgid="7679891324509597904">"የስርዓተ-ጥለት አካባቢ።"</string> - <string name="keyguard_accessibility_slide_area" msgid="6736064494019979544">"የማንሸራተቻ አካባቢ።"</string> <string name="keyguard_accessibility_pin_area" msgid="7903959476607833485">"የፒን አካባቢ"</string> <string name="keyguard_accessibility_sim_pin_area" msgid="3887780775111719336">"የሲም ፒን አካባቢ"</string> <string name="keyguard_accessibility_sim_puk_area" msgid="1880823406954996207">"የሲም PUK አካባቢ"</string> diff --git a/packages/Keyguard/res/values-ar/strings.xml b/packages/Keyguard/res/values-ar/strings.xml index 09b78e44a2ca..8438699d0319 100644 --- a/packages/Keyguard/res/values-ar/strings.xml +++ b/packages/Keyguard/res/values-ar/strings.xml @@ -46,11 +46,6 @@ <string name="keyguard_sim_locked_message" msgid="6875773413306380902">"شريحة SIM مؤمّنة."</string> <string name="keyguard_sim_puk_locked_message" msgid="3747232467471801633">"شريحة SIM مؤمّنة بكود PUK."</string> <string name="keyguard_sim_unlock_progress_dialog_message" msgid="7975221805033614426">"جارٍ إلغاء تأمين شريحة SIM…"</string> - <string name="keyguard_accessibility_pattern_unlock" msgid="1490840706075246612">"إلغاء القفل باستخدام النقش."</string> - <string name="keyguard_accessibility_pin_unlock" msgid="2469687111784035046">"إلغاء القفل باستخدام رمز PIN."</string> - <string name="keyguard_accessibility_password_unlock" msgid="7675777623912155089">"إلغاء القفل باستخدام كلمة المرور."</string> - <string name="keyguard_accessibility_pattern_area" msgid="7679891324509597904">"منطقة النقش."</string> - <string name="keyguard_accessibility_slide_area" msgid="6736064494019979544">"منطقة التمرير."</string> <string name="keyguard_accessibility_pin_area" msgid="7903959476607833485">"منطقة رقم التعريف الشخصي"</string> <string name="keyguard_accessibility_sim_pin_area" msgid="3887780775111719336">"منطقة رقم التعريف الشخصي لبطاقة SIM"</string> <string name="keyguard_accessibility_sim_puk_area" msgid="1880823406954996207">"منطقة PUK لبطاقة SIM"</string> diff --git a/packages/Keyguard/res/values-az-rAZ/strings.xml b/packages/Keyguard/res/values-az-rAZ/strings.xml index a8a115534b79..c7a80919c670 100644 --- a/packages/Keyguard/res/values-az-rAZ/strings.xml +++ b/packages/Keyguard/res/values-az-rAZ/strings.xml @@ -46,11 +46,6 @@ <string name="keyguard_sim_locked_message" msgid="6875773413306380902">"SIM kart kilidlənib."</string> <string name="keyguard_sim_puk_locked_message" msgid="3747232467471801633">"SİM kart PUK ilə kilidlənib."</string> <string name="keyguard_sim_unlock_progress_dialog_message" msgid="7975221805033614426">"SİM kartın kilidi açılır..."</string> - <string name="keyguard_accessibility_pattern_unlock" msgid="1490840706075246612">"Kild açma modeli."</string> - <string name="keyguard_accessibility_pin_unlock" msgid="2469687111784035046">"Pin kilid açması."</string> - <string name="keyguard_accessibility_password_unlock" msgid="7675777623912155089">"Şifrə kilidi."</string> - <string name="keyguard_accessibility_pattern_area" msgid="7679891324509597904">"Model sahəsi."</string> - <string name="keyguard_accessibility_slide_area" msgid="6736064494019979544">"Sürüşdürmə sahəsi."</string> <string name="keyguard_accessibility_pin_area" msgid="7903959476607833485">"PIN sahəsi"</string> <string name="keyguard_accessibility_sim_pin_area" msgid="3887780775111719336">"SIM PIN sahəsi"</string> <string name="keyguard_accessibility_sim_puk_area" msgid="1880823406954996207">"SIM PUK sahəsi"</string> diff --git a/packages/Keyguard/res/values-b+sr+Latn/strings.xml b/packages/Keyguard/res/values-b+sr+Latn/strings.xml index 22dc0596998c..570f4bc96f86 100644 --- a/packages/Keyguard/res/values-b+sr+Latn/strings.xml +++ b/packages/Keyguard/res/values-b+sr+Latn/strings.xml @@ -46,11 +46,6 @@ <string name="keyguard_sim_locked_message" msgid="6875773413306380902">"SIM kartica je zaključana."</string> <string name="keyguard_sim_puk_locked_message" msgid="3747232467471801633">"SIM kartica je zaključana PUK kodom."</string> <string name="keyguard_sim_unlock_progress_dialog_message" msgid="7975221805033614426">"Otključavanje SIM kartice…"</string> - <string name="keyguard_accessibility_pattern_unlock" msgid="1490840706075246612">"Otključavanje šablonom."</string> - <string name="keyguard_accessibility_pin_unlock" msgid="2469687111784035046">"Otključavanje PIN-om."</string> - <string name="keyguard_accessibility_password_unlock" msgid="7675777623912155089">"Otključavanje lozinkom."</string> - <string name="keyguard_accessibility_pattern_area" msgid="7679891324509597904">"Oblast šablona."</string> - <string name="keyguard_accessibility_slide_area" msgid="6736064494019979544">"Oblast prevlačenja."</string> <string name="keyguard_accessibility_pin_area" msgid="7903959476607833485">"Oblast za PIN"</string> <string name="keyguard_accessibility_sim_pin_area" msgid="3887780775111719336">"Oblast za PIN za SIM"</string> <string name="keyguard_accessibility_sim_puk_area" msgid="1880823406954996207">"Oblast za PUK za SIM"</string> diff --git a/packages/Keyguard/res/values-be-rBY/strings.xml b/packages/Keyguard/res/values-be-rBY/strings.xml index ca6a4764406d..f357961a3b8b 100644 --- a/packages/Keyguard/res/values-be-rBY/strings.xml +++ b/packages/Keyguard/res/values-be-rBY/strings.xml @@ -46,11 +46,6 @@ <string name="keyguard_sim_locked_message" msgid="6875773413306380902">"SIM-карта заблакiраваная."</string> <string name="keyguard_sim_puk_locked_message" msgid="3747232467471801633">"SIM-карта заблакiравана PUK-кодам."</string> <string name="keyguard_sim_unlock_progress_dialog_message" msgid="7975221805033614426">"Разблакiраванне SIM-карты..."</string> - <string name="keyguard_accessibility_pattern_unlock" msgid="1490840706075246612">"Узор разблакiроўкі."</string> - <string name="keyguard_accessibility_pin_unlock" msgid="2469687111784035046">"PIN-код разблакiроўкі."</string> - <string name="keyguard_accessibility_password_unlock" msgid="7675777623912155089">"Пароль разблакiроўкі."</string> - <string name="keyguard_accessibility_pattern_area" msgid="7679891324509597904">"Вобласць узора."</string> - <string name="keyguard_accessibility_slide_area" msgid="6736064494019979544">"Вобласць слайда."</string> <string name="keyguard_accessibility_pin_area" msgid="7903959476607833485">"Поле для PIN-кода"</string> <string name="keyguard_accessibility_sim_pin_area" msgid="3887780775111719336">"Поле для PIN-кода SIM-карты"</string> <string name="keyguard_accessibility_sim_puk_area" msgid="1880823406954996207">"Поле для PUK-кода SIM-карты"</string> diff --git a/packages/Keyguard/res/values-bg/strings.xml b/packages/Keyguard/res/values-bg/strings.xml index 7eb2dbdf0532..988e97f6b482 100644 --- a/packages/Keyguard/res/values-bg/strings.xml +++ b/packages/Keyguard/res/values-bg/strings.xml @@ -46,11 +46,6 @@ <string name="keyguard_sim_locked_message" msgid="6875773413306380902">"SIM картата е заключена."</string> <string name="keyguard_sim_puk_locked_message" msgid="3747232467471801633">"SIM картата е заключена с PUK код."</string> <string name="keyguard_sim_unlock_progress_dialog_message" msgid="7975221805033614426">"SIM картата се отключва…"</string> - <string name="keyguard_accessibility_pattern_unlock" msgid="1490840706075246612">"Отключване с фигура."</string> - <string name="keyguard_accessibility_pin_unlock" msgid="2469687111784035046">"Отключване с ПИН код."</string> - <string name="keyguard_accessibility_password_unlock" msgid="7675777623912155089">"Отключване с парола."</string> - <string name="keyguard_accessibility_pattern_area" msgid="7679891324509597904">"Област на фигурата."</string> - <string name="keyguard_accessibility_slide_area" msgid="6736064494019979544">"Област на плъзгане."</string> <string name="keyguard_accessibility_pin_area" msgid="7903959476607833485">"Област за ПИН кода"</string> <string name="keyguard_accessibility_sim_pin_area" msgid="3887780775111719336">"Област за ПИН кода на SIM картата"</string> <string name="keyguard_accessibility_sim_puk_area" msgid="1880823406954996207">"Област за PUK кода на SIM картата"</string> diff --git a/packages/Keyguard/res/values-bn-rBD/strings.xml b/packages/Keyguard/res/values-bn-rBD/strings.xml index 7a33e2101cf1..1a2a8dde99c1 100644 --- a/packages/Keyguard/res/values-bn-rBD/strings.xml +++ b/packages/Keyguard/res/values-bn-rBD/strings.xml @@ -46,11 +46,6 @@ <string name="keyguard_sim_locked_message" msgid="6875773413306380902">"সিম কার্ড লক করা আছে৷"</string> <string name="keyguard_sim_puk_locked_message" msgid="3747232467471801633">"সিম কার্ডটি PUK কোড দিয়ে লক করা আছে৷"</string> <string name="keyguard_sim_unlock_progress_dialog_message" msgid="7975221805033614426">"সিম কার্ড আনলক করা হচ্ছে…"</string> - <string name="keyguard_accessibility_pattern_unlock" msgid="1490840706075246612">"প্যাটার্ন দিয়ে আনলক৷"</string> - <string name="keyguard_accessibility_pin_unlock" msgid="2469687111784035046">"পিন দিয়ে আনলক৷"</string> - <string name="keyguard_accessibility_password_unlock" msgid="7675777623912155089">"পাসওয়ার্ড দিয়ে আনলক৷"</string> - <string name="keyguard_accessibility_pattern_area" msgid="7679891324509597904">"প্যাটার্ন এলাকা৷"</string> - <string name="keyguard_accessibility_slide_area" msgid="6736064494019979544">"স্লাইড করার এলাকা৷"</string> <string name="keyguard_accessibility_pin_area" msgid="7903959476607833485">"পিন অঞ্চল"</string> <string name="keyguard_accessibility_sim_pin_area" msgid="3887780775111719336">"SIM পিন অঞ্চল"</string> <string name="keyguard_accessibility_sim_puk_area" msgid="1880823406954996207">"SIM PUK অঞ্চল"</string> diff --git a/packages/Keyguard/res/values-bs-rBA/strings.xml b/packages/Keyguard/res/values-bs-rBA/strings.xml index be73580697ae..b8ff2a9835db 100644 --- a/packages/Keyguard/res/values-bs-rBA/strings.xml +++ b/packages/Keyguard/res/values-bs-rBA/strings.xml @@ -46,15 +46,10 @@ <string name="keyguard_sim_locked_message" msgid="6875773413306380902">"SIM kartica je zaključana."</string> <string name="keyguard_sim_puk_locked_message" msgid="3747232467471801633">"SIM kartica je zaključana PUK kodom."</string> <string name="keyguard_sim_unlock_progress_dialog_message" msgid="7975221805033614426">"Otključavanje SIM kartice…"</string> - <string name="keyguard_accessibility_pattern_unlock" msgid="1490840706075246612">"Otključavanje uzorkom."</string> - <string name="keyguard_accessibility_pin_unlock" msgid="2469687111784035046">"Otključavanje pinom."</string> - <string name="keyguard_accessibility_password_unlock" msgid="7675777623912155089">"Otključavanje lozinkom."</string> - <string name="keyguard_accessibility_pattern_area" msgid="7679891324509597904">"Uzorak oblasti."</string> - <string name="keyguard_accessibility_slide_area" msgid="6736064494019979544">"Oblast za pomjeranje klizača."</string> <string name="keyguard_accessibility_pin_area" msgid="7903959476607833485">"Prostor za PIN"</string> <string name="keyguard_accessibility_sim_pin_area" msgid="3887780775111719336">"Prostor za SIM PIN"</string> <string name="keyguard_accessibility_sim_puk_area" msgid="1880823406954996207">"Prostor za SIM PUK"</string> - <string name="keyguard_accessibility_next_alarm" msgid="7269583073750518672">"Naredni alarm je podešen za <xliff:g id="ALARM">%1$s</xliff:g>"</string> + <string name="keyguard_accessibility_next_alarm" msgid="7269583073750518672">"Sljedeći alarm je podešen za <xliff:g id="ALARM">%1$s</xliff:g>"</string> <string name="keyboardview_keycode_delete" msgid="3337914833206635744">"Izbriši"</string> <string name="keyboardview_keycode_enter" msgid="2985864015076059467">"Potvrdi"</string> <string name="kg_forgot_pattern_button_text" msgid="8852021467868220608">"Zaboravili ste uzorak?"</string> diff --git a/packages/Keyguard/res/values-ca/strings.xml b/packages/Keyguard/res/values-ca/strings.xml index b542866e6df6..9207e0e201fe 100644 --- a/packages/Keyguard/res/values-ca/strings.xml +++ b/packages/Keyguard/res/values-ca/strings.xml @@ -46,11 +46,6 @@ <string name="keyguard_sim_locked_message" msgid="6875773413306380902">"La targeta SIM està bloquejada."</string> <string name="keyguard_sim_puk_locked_message" msgid="3747232467471801633">"La targeta SIM està bloquejada pel PUK."</string> <string name="keyguard_sim_unlock_progress_dialog_message" msgid="7975221805033614426">"S\'està desbloquejant la targeta SIM..."</string> - <string name="keyguard_accessibility_pattern_unlock" msgid="1490840706075246612">"Desbloqueig mitjançant patró"</string> - <string name="keyguard_accessibility_pin_unlock" msgid="2469687111784035046">"Desbloqueig mitjançant PIN"</string> - <string name="keyguard_accessibility_password_unlock" msgid="7675777623912155089">"Desbloqueig mitjançant contrasenya"</string> - <string name="keyguard_accessibility_pattern_area" msgid="7679891324509597904">"Àrea de patró"</string> - <string name="keyguard_accessibility_slide_area" msgid="6736064494019979544">"Àrea per lliscar el dit"</string> <string name="keyguard_accessibility_pin_area" msgid="7903959476607833485">"Zona del PIN"</string> <string name="keyguard_accessibility_sim_pin_area" msgid="3887780775111719336">"Zona del PIN de la SIM"</string> <string name="keyguard_accessibility_sim_puk_area" msgid="1880823406954996207">"Zona del PUK de la SIM"</string> diff --git a/packages/Keyguard/res/values-cs/strings.xml b/packages/Keyguard/res/values-cs/strings.xml index b3103239f654..aa7115dede28 100644 --- a/packages/Keyguard/res/values-cs/strings.xml +++ b/packages/Keyguard/res/values-cs/strings.xml @@ -46,11 +46,6 @@ <string name="keyguard_sim_locked_message" msgid="6875773413306380902">"SIM karta je zablokována."</string> <string name="keyguard_sim_puk_locked_message" msgid="3747232467471801633">"SIM karta je zablokována pomocí kódu PUK."</string> <string name="keyguard_sim_unlock_progress_dialog_message" msgid="7975221805033614426">"Odblokování SIM karty…"</string> - <string name="keyguard_accessibility_pattern_unlock" msgid="1490840706075246612">"Odemknutí gestem."</string> - <string name="keyguard_accessibility_pin_unlock" msgid="2469687111784035046">"Odemknutí kódem PIN."</string> - <string name="keyguard_accessibility_password_unlock" msgid="7675777623912155089">"Odemknutí heslem."</string> - <string name="keyguard_accessibility_pattern_area" msgid="7679891324509597904">"Oblast pro zadání bezpečnostního gesta."</string> - <string name="keyguard_accessibility_slide_area" msgid="6736064494019979544">"Oblast pro přejetí prstem."</string> <string name="keyguard_accessibility_pin_area" msgid="7903959476607833485">"Oblast kódu PIN"</string> <string name="keyguard_accessibility_sim_pin_area" msgid="3887780775111719336">"Oblast kódu PIN SIM karty"</string> <string name="keyguard_accessibility_sim_puk_area" msgid="1880823406954996207">"Oblast kódu PUK SIM karty"</string> diff --git a/packages/Keyguard/res/values-da/strings.xml b/packages/Keyguard/res/values-da/strings.xml index b46b536fffe9..ebea6eeb1989 100644 --- a/packages/Keyguard/res/values-da/strings.xml +++ b/packages/Keyguard/res/values-da/strings.xml @@ -46,11 +46,6 @@ <string name="keyguard_sim_locked_message" msgid="6875773413306380902">"SIM-kortet er låst."</string> <string name="keyguard_sim_puk_locked_message" msgid="3747232467471801633">"SIM-kort er låst med PUK-koden."</string> <string name="keyguard_sim_unlock_progress_dialog_message" msgid="7975221805033614426">"SIM-kortet låses op…"</string> - <string name="keyguard_accessibility_pattern_unlock" msgid="1490840706075246612">"Lås op med mønster."</string> - <string name="keyguard_accessibility_pin_unlock" msgid="2469687111784035046">"Lås op med pinkode."</string> - <string name="keyguard_accessibility_password_unlock" msgid="7675777623912155089">"Lås op med adgangskode."</string> - <string name="keyguard_accessibility_pattern_area" msgid="7679891324509597904">"Mønsterområde."</string> - <string name="keyguard_accessibility_slide_area" msgid="6736064494019979544">"Strygeområde."</string> <string name="keyguard_accessibility_pin_area" msgid="7903959476607833485">"Område for pinkoden"</string> <string name="keyguard_accessibility_sim_pin_area" msgid="3887780775111719336">"Område for pinkoden til simkortet"</string> <string name="keyguard_accessibility_sim_puk_area" msgid="1880823406954996207">"Område for PUK-koden til simkortet"</string> diff --git a/packages/Keyguard/res/values-de/strings.xml b/packages/Keyguard/res/values-de/strings.xml index ae731c343909..a519ce84b862 100644 --- a/packages/Keyguard/res/values-de/strings.xml +++ b/packages/Keyguard/res/values-de/strings.xml @@ -46,11 +46,6 @@ <string name="keyguard_sim_locked_message" msgid="6875773413306380902">"SIM-Karte ist gesperrt."</string> <string name="keyguard_sim_puk_locked_message" msgid="3747232467471801633">"SIM-Karte ist gesperrt. PUK-Eingabe erforderlich."</string> <string name="keyguard_sim_unlock_progress_dialog_message" msgid="7975221805033614426">"SIM-Karte wird entsperrt…"</string> - <string name="keyguard_accessibility_pattern_unlock" msgid="1490840706075246612">"Entsperrung mit Muster"</string> - <string name="keyguard_accessibility_pin_unlock" msgid="2469687111784035046">"Entsperrung mit PIN"</string> - <string name="keyguard_accessibility_password_unlock" msgid="7675777623912155089">"Entsperrung mit Passwort"</string> - <string name="keyguard_accessibility_pattern_area" msgid="7679891324509597904">"Bereich für Muster"</string> - <string name="keyguard_accessibility_slide_area" msgid="6736064494019979544">"Bereich für Fingerbewegung"</string> <string name="keyguard_accessibility_pin_area" msgid="7903959476607833485">"PIN-Bereich"</string> <string name="keyguard_accessibility_sim_pin_area" msgid="3887780775111719336">"SIM-PIN-Bereich"</string> <string name="keyguard_accessibility_sim_puk_area" msgid="1880823406954996207">"SIM-PUK-Bereich"</string> diff --git a/packages/Keyguard/res/values-el/strings.xml b/packages/Keyguard/res/values-el/strings.xml index c54a7fc87aa4..d9692667ba0f 100644 --- a/packages/Keyguard/res/values-el/strings.xml +++ b/packages/Keyguard/res/values-el/strings.xml @@ -46,11 +46,6 @@ <string name="keyguard_sim_locked_message" msgid="6875773413306380902">"Η κάρτα SIM είναι κλειδωμένη."</string> <string name="keyguard_sim_puk_locked_message" msgid="3747232467471801633">"Η κάρτα SIM είναι κλειδωμένη με κωδικό PUK."</string> <string name="keyguard_sim_unlock_progress_dialog_message" msgid="7975221805033614426">"Ξεκλείδωμα κάρτας SIM…"</string> - <string name="keyguard_accessibility_pattern_unlock" msgid="1490840706075246612">"Ξεκλείδωμα μοτίβου."</string> - <string name="keyguard_accessibility_pin_unlock" msgid="2469687111784035046">"Ξεκλείδωμα κωδικού ασφαλείας"</string> - <string name="keyguard_accessibility_password_unlock" msgid="7675777623912155089">"Ξεκλείδωμα κωδικού πρόσβασης."</string> - <string name="keyguard_accessibility_pattern_area" msgid="7679891324509597904">"Περιοχή μοτίβου."</string> - <string name="keyguard_accessibility_slide_area" msgid="6736064494019979544">"Περιοχή ολίσθησης"</string> <string name="keyguard_accessibility_pin_area" msgid="7903959476607833485">"Περιοχή PIN"</string> <string name="keyguard_accessibility_sim_pin_area" msgid="3887780775111719336">"Περιοχή PIN SIM"</string> <string name="keyguard_accessibility_sim_puk_area" msgid="1880823406954996207">"Περιοχή PUK SIM"</string> diff --git a/packages/Keyguard/res/values-en-rAU/strings.xml b/packages/Keyguard/res/values-en-rAU/strings.xml index e88516679f45..9ecd979163f2 100644 --- a/packages/Keyguard/res/values-en-rAU/strings.xml +++ b/packages/Keyguard/res/values-en-rAU/strings.xml @@ -46,11 +46,6 @@ <string name="keyguard_sim_locked_message" msgid="6875773413306380902">"SIM card is locked."</string> <string name="keyguard_sim_puk_locked_message" msgid="3747232467471801633">"SIM card is PUK-locked."</string> <string name="keyguard_sim_unlock_progress_dialog_message" msgid="7975221805033614426">"Unlocking SIM card…"</string> - <string name="keyguard_accessibility_pattern_unlock" msgid="1490840706075246612">"Pattern unlock."</string> - <string name="keyguard_accessibility_pin_unlock" msgid="2469687111784035046">"Pin unlock."</string> - <string name="keyguard_accessibility_password_unlock" msgid="7675777623912155089">"Password unlock."</string> - <string name="keyguard_accessibility_pattern_area" msgid="7679891324509597904">"Pattern area."</string> - <string name="keyguard_accessibility_slide_area" msgid="6736064494019979544">"Slide area."</string> <string name="keyguard_accessibility_pin_area" msgid="7903959476607833485">"PIN area"</string> <string name="keyguard_accessibility_sim_pin_area" msgid="3887780775111719336">"SIM PIN area"</string> <string name="keyguard_accessibility_sim_puk_area" msgid="1880823406954996207">"SIM PUK area"</string> diff --git a/packages/Keyguard/res/values-en-rGB/strings.xml b/packages/Keyguard/res/values-en-rGB/strings.xml index e88516679f45..9ecd979163f2 100644 --- a/packages/Keyguard/res/values-en-rGB/strings.xml +++ b/packages/Keyguard/res/values-en-rGB/strings.xml @@ -46,11 +46,6 @@ <string name="keyguard_sim_locked_message" msgid="6875773413306380902">"SIM card is locked."</string> <string name="keyguard_sim_puk_locked_message" msgid="3747232467471801633">"SIM card is PUK-locked."</string> <string name="keyguard_sim_unlock_progress_dialog_message" msgid="7975221805033614426">"Unlocking SIM card…"</string> - <string name="keyguard_accessibility_pattern_unlock" msgid="1490840706075246612">"Pattern unlock."</string> - <string name="keyguard_accessibility_pin_unlock" msgid="2469687111784035046">"Pin unlock."</string> - <string name="keyguard_accessibility_password_unlock" msgid="7675777623912155089">"Password unlock."</string> - <string name="keyguard_accessibility_pattern_area" msgid="7679891324509597904">"Pattern area."</string> - <string name="keyguard_accessibility_slide_area" msgid="6736064494019979544">"Slide area."</string> <string name="keyguard_accessibility_pin_area" msgid="7903959476607833485">"PIN area"</string> <string name="keyguard_accessibility_sim_pin_area" msgid="3887780775111719336">"SIM PIN area"</string> <string name="keyguard_accessibility_sim_puk_area" msgid="1880823406954996207">"SIM PUK area"</string> diff --git a/packages/Keyguard/res/values-en-rIN/strings.xml b/packages/Keyguard/res/values-en-rIN/strings.xml index e88516679f45..9ecd979163f2 100644 --- a/packages/Keyguard/res/values-en-rIN/strings.xml +++ b/packages/Keyguard/res/values-en-rIN/strings.xml @@ -46,11 +46,6 @@ <string name="keyguard_sim_locked_message" msgid="6875773413306380902">"SIM card is locked."</string> <string name="keyguard_sim_puk_locked_message" msgid="3747232467471801633">"SIM card is PUK-locked."</string> <string name="keyguard_sim_unlock_progress_dialog_message" msgid="7975221805033614426">"Unlocking SIM card…"</string> - <string name="keyguard_accessibility_pattern_unlock" msgid="1490840706075246612">"Pattern unlock."</string> - <string name="keyguard_accessibility_pin_unlock" msgid="2469687111784035046">"Pin unlock."</string> - <string name="keyguard_accessibility_password_unlock" msgid="7675777623912155089">"Password unlock."</string> - <string name="keyguard_accessibility_pattern_area" msgid="7679891324509597904">"Pattern area."</string> - <string name="keyguard_accessibility_slide_area" msgid="6736064494019979544">"Slide area."</string> <string name="keyguard_accessibility_pin_area" msgid="7903959476607833485">"PIN area"</string> <string name="keyguard_accessibility_sim_pin_area" msgid="3887780775111719336">"SIM PIN area"</string> <string name="keyguard_accessibility_sim_puk_area" msgid="1880823406954996207">"SIM PUK area"</string> diff --git a/packages/Keyguard/res/values-es-rUS/strings.xml b/packages/Keyguard/res/values-es-rUS/strings.xml index df0db2d32d4c..61f5c0d538b6 100644 --- a/packages/Keyguard/res/values-es-rUS/strings.xml +++ b/packages/Keyguard/res/values-es-rUS/strings.xml @@ -46,11 +46,6 @@ <string name="keyguard_sim_locked_message" msgid="6875773413306380902">"La tarjeta SIM está bloqueada."</string> <string name="keyguard_sim_puk_locked_message" msgid="3747232467471801633">"La tarjeta SIM está bloqueada por código PUK."</string> <string name="keyguard_sim_unlock_progress_dialog_message" msgid="7975221805033614426">"Desbloqueando tarjeta SIM…"</string> - <string name="keyguard_accessibility_pattern_unlock" msgid="1490840706075246612">"Desbloqueo por patrón"</string> - <string name="keyguard_accessibility_pin_unlock" msgid="2469687111784035046">"Desbloqueo por PIN"</string> - <string name="keyguard_accessibility_password_unlock" msgid="7675777623912155089">"Desbloqueo por contraseña"</string> - <string name="keyguard_accessibility_pattern_area" msgid="7679891324509597904">"Área de patrón"</string> - <string name="keyguard_accessibility_slide_area" msgid="6736064494019979544">"Área de deslizamiento"</string> <string name="keyguard_accessibility_pin_area" msgid="7903959476607833485">"Área de PIN"</string> <string name="keyguard_accessibility_sim_pin_area" msgid="3887780775111719336">"Área de PIN de SIM"</string> <string name="keyguard_accessibility_sim_puk_area" msgid="1880823406954996207">"Área de PUK de SIM"</string> diff --git a/packages/Keyguard/res/values-es/strings.xml b/packages/Keyguard/res/values-es/strings.xml index 6061b784378f..3ef737c22764 100644 --- a/packages/Keyguard/res/values-es/strings.xml +++ b/packages/Keyguard/res/values-es/strings.xml @@ -46,11 +46,6 @@ <string name="keyguard_sim_locked_message" msgid="6875773413306380902">"La tarjeta SIM está bloqueada."</string> <string name="keyguard_sim_puk_locked_message" msgid="3747232467471801633">"La tarjeta SIM está bloqueada con el código PUK."</string> <string name="keyguard_sim_unlock_progress_dialog_message" msgid="7975221805033614426">"Desbloqueando tarjeta SIM…"</string> - <string name="keyguard_accessibility_pattern_unlock" msgid="1490840706075246612">"Desbloqueo por patrón"</string> - <string name="keyguard_accessibility_pin_unlock" msgid="2469687111784035046">"Desbloqueo por PIN"</string> - <string name="keyguard_accessibility_password_unlock" msgid="7675777623912155089">"Desbloqueo por contraseña"</string> - <string name="keyguard_accessibility_pattern_area" msgid="7679891324509597904">"Área de patrón"</string> - <string name="keyguard_accessibility_slide_area" msgid="6736064494019979544">"Área para deslizar"</string> <string name="keyguard_accessibility_pin_area" msgid="7903959476607833485">"Área de PIN"</string> <string name="keyguard_accessibility_sim_pin_area" msgid="3887780775111719336">"Área de PIN de SIM"</string> <string name="keyguard_accessibility_sim_puk_area" msgid="1880823406954996207">"Área de PUK de SIM"</string> diff --git a/packages/Keyguard/res/values-et-rEE/strings.xml b/packages/Keyguard/res/values-et-rEE/strings.xml index 78ae3cacaea5..47b6332c92c2 100644 --- a/packages/Keyguard/res/values-et-rEE/strings.xml +++ b/packages/Keyguard/res/values-et-rEE/strings.xml @@ -46,11 +46,6 @@ <string name="keyguard_sim_locked_message" msgid="6875773413306380902">"SIM-kaart on lukus."</string> <string name="keyguard_sim_puk_locked_message" msgid="3747232467471801633">"SIM-kaart on PUK-lukus."</string> <string name="keyguard_sim_unlock_progress_dialog_message" msgid="7975221805033614426">"SIM-kaardi avamine ..."</string> - <string name="keyguard_accessibility_pattern_unlock" msgid="1490840706075246612">"Mustriga avamine."</string> - <string name="keyguard_accessibility_pin_unlock" msgid="2469687111784035046">"PIN-koodiga avamine."</string> - <string name="keyguard_accessibility_password_unlock" msgid="7675777623912155089">"Parooliga avamine."</string> - <string name="keyguard_accessibility_pattern_area" msgid="7679891324509597904">"Mustri ala."</string> - <string name="keyguard_accessibility_slide_area" msgid="6736064494019979544">"Lohistamisala."</string> <string name="keyguard_accessibility_pin_area" msgid="7903959476607833485">"PIN-koodi ala"</string> <string name="keyguard_accessibility_sim_pin_area" msgid="3887780775111719336">"SIM-kaardi PIN-koodi ala"</string> <string name="keyguard_accessibility_sim_puk_area" msgid="1880823406954996207">"SIM-kaardi PUK-koodi ala"</string> diff --git a/packages/Keyguard/res/values-eu-rES/strings.xml b/packages/Keyguard/res/values-eu-rES/strings.xml index 7855b16e82b9..5f4abce03f1b 100644 --- a/packages/Keyguard/res/values-eu-rES/strings.xml +++ b/packages/Keyguard/res/values-eu-rES/strings.xml @@ -46,11 +46,6 @@ <string name="keyguard_sim_locked_message" msgid="6875773413306380902">"SIM txartela blokeatuta dago."</string> <string name="keyguard_sim_puk_locked_message" msgid="3747232467471801633">"SIM txartela PUK bidez blokeatuta dago."</string> <string name="keyguard_sim_unlock_progress_dialog_message" msgid="7975221805033614426">"SIM txartela desblokeatzen…"</string> - <string name="keyguard_accessibility_pattern_unlock" msgid="1490840706075246612">"Ereduaren bidez desblokeatzea."</string> - <string name="keyguard_accessibility_pin_unlock" msgid="2469687111784035046">"PIN kodearen bidez desblokeatzea."</string> - <string name="keyguard_accessibility_password_unlock" msgid="7675777623912155089">"Pasahitzaren bidez desblokeatzea."</string> - <string name="keyguard_accessibility_pattern_area" msgid="7679891324509597904">"Eredua marrazteko eremua."</string> - <string name="keyguard_accessibility_slide_area" msgid="6736064494019979544">"Hatza lerratzeko eremua."</string> <string name="keyguard_accessibility_pin_area" msgid="7903959476607833485">"PIN kodearen eremua"</string> <string name="keyguard_accessibility_sim_pin_area" msgid="3887780775111719336">"SIM txartelaren PIN kodearen eremua"</string> <string name="keyguard_accessibility_sim_puk_area" msgid="1880823406954996207">"SIM txartelaren PUK kodearen eremua"</string> diff --git a/packages/Keyguard/res/values-fa/strings.xml b/packages/Keyguard/res/values-fa/strings.xml index 39fd4608de51..40952e256a5f 100644 --- a/packages/Keyguard/res/values-fa/strings.xml +++ b/packages/Keyguard/res/values-fa/strings.xml @@ -46,11 +46,6 @@ <string name="keyguard_sim_locked_message" msgid="6875773413306380902">"سیم کارت قفل شد."</string> <string name="keyguard_sim_puk_locked_message" msgid="3747232467471801633">"سیم کارت با PUK قفل شده است."</string> <string name="keyguard_sim_unlock_progress_dialog_message" msgid="7975221805033614426">"درحال بازگشایی قفل سیم کارت..."</string> - <string name="keyguard_accessibility_pattern_unlock" msgid="1490840706075246612">"باز کردن قفل با الگو."</string> - <string name="keyguard_accessibility_pin_unlock" msgid="2469687111784035046">"باز کردن قفل با پین."</string> - <string name="keyguard_accessibility_password_unlock" msgid="7675777623912155089">"باز کردن قفل با گذرواژه."</string> - <string name="keyguard_accessibility_pattern_area" msgid="7679891324509597904">"ناحیه الگو."</string> - <string name="keyguard_accessibility_slide_area" msgid="6736064494019979544">"ناحیه کشیدن انگشت روی صفحه."</string> <string name="keyguard_accessibility_pin_area" msgid="7903959476607833485">"قسمت پین"</string> <string name="keyguard_accessibility_sim_pin_area" msgid="3887780775111719336">"قسمت پین سیمکارت"</string> <string name="keyguard_accessibility_sim_puk_area" msgid="1880823406954996207">"قسمت PUK سیمکارت"</string> diff --git a/packages/Keyguard/res/values-fi/strings.xml b/packages/Keyguard/res/values-fi/strings.xml index 7a0c00f83bf7..a1b96ca2f671 100644 --- a/packages/Keyguard/res/values-fi/strings.xml +++ b/packages/Keyguard/res/values-fi/strings.xml @@ -46,11 +46,6 @@ <string name="keyguard_sim_locked_message" msgid="6875773413306380902">"SIM-kortti on lukittu."</string> <string name="keyguard_sim_puk_locked_message" msgid="3747232467471801633">"SIM-kortti on PUK-lukittu."</string> <string name="keyguard_sim_unlock_progress_dialog_message" msgid="7975221805033614426">"SIM-kortin lukitusta poistetaan…"</string> - <string name="keyguard_accessibility_pattern_unlock" msgid="1490840706075246612">"Lukituksen poisto salasanalla."</string> - <string name="keyguard_accessibility_pin_unlock" msgid="2469687111784035046">"Lukituksen poisto PIN-koodilla."</string> - <string name="keyguard_accessibility_password_unlock" msgid="7675777623912155089">"Lukituksen poisto salasanalla."</string> - <string name="keyguard_accessibility_pattern_area" msgid="7679891324509597904">"Kuvioalue."</string> - <string name="keyguard_accessibility_slide_area" msgid="6736064494019979544">"Liu\'utusalue."</string> <string name="keyguard_accessibility_pin_area" msgid="7903959476607833485">"PIN-koodin alue"</string> <string name="keyguard_accessibility_sim_pin_area" msgid="3887780775111719336">"SIM-kortin PIN-koodin alue"</string> <string name="keyguard_accessibility_sim_puk_area" msgid="1880823406954996207">"SIM-kortin PUK-koodin alue"</string> diff --git a/packages/Keyguard/res/values-fr-rCA/strings.xml b/packages/Keyguard/res/values-fr-rCA/strings.xml index 9bc2456809d6..d920415a69cc 100644 --- a/packages/Keyguard/res/values-fr-rCA/strings.xml +++ b/packages/Keyguard/res/values-fr-rCA/strings.xml @@ -46,11 +46,6 @@ <string name="keyguard_sim_locked_message" msgid="6875773413306380902">"La carte SIM est verrouillée."</string> <string name="keyguard_sim_puk_locked_message" msgid="3747232467471801633">"La carte SIM est verrouillée par clé PUK."</string> <string name="keyguard_sim_unlock_progress_dialog_message" msgid="7975221805033614426">"Déverrouillage de la carte SIM en cours…"</string> - <string name="keyguard_accessibility_pattern_unlock" msgid="1490840706075246612">"Déverrouillage par schéma"</string> - <string name="keyguard_accessibility_pin_unlock" msgid="2469687111784035046">"Déverrouillage par NIP"</string> - <string name="keyguard_accessibility_password_unlock" msgid="7675777623912155089">"Déverrouillage par mot de passe"</string> - <string name="keyguard_accessibility_pattern_area" msgid="7679891324509597904">"Zone du schéma"</string> - <string name="keyguard_accessibility_slide_area" msgid="6736064494019979544">"Zone où faire glisser votre doigt sur l\'écran"</string> <string name="keyguard_accessibility_pin_area" msgid="7903959476607833485">"Zone du NIP"</string> <string name="keyguard_accessibility_sim_pin_area" msgid="3887780775111719336">"Zone du NIP de la carte SIM"</string> <string name="keyguard_accessibility_sim_puk_area" msgid="1880823406954996207">"Zone du code PUK de la carte SIM"</string> diff --git a/packages/Keyguard/res/values-fr/strings.xml b/packages/Keyguard/res/values-fr/strings.xml index ecb2575d2e9a..8615b99df2bf 100644 --- a/packages/Keyguard/res/values-fr/strings.xml +++ b/packages/Keyguard/res/values-fr/strings.xml @@ -46,11 +46,6 @@ <string name="keyguard_sim_locked_message" msgid="6875773413306380902">"La carte SIM est verrouillée."</string> <string name="keyguard_sim_puk_locked_message" msgid="3747232467471801633">"La carte SIM est verrouillée par clé PUK."</string> <string name="keyguard_sim_unlock_progress_dialog_message" msgid="7975221805033614426">"Déverrouillage de la carte SIM en cours…"</string> - <string name="keyguard_accessibility_pattern_unlock" msgid="1490840706075246612">"Déverrouillage par schéma"</string> - <string name="keyguard_accessibility_pin_unlock" msgid="2469687111784035046">"Déverrouillage par code PIN"</string> - <string name="keyguard_accessibility_password_unlock" msgid="7675777623912155089">"Déverrouillage par mot de passe"</string> - <string name="keyguard_accessibility_pattern_area" msgid="7679891324509597904">"Zone du schéma"</string> - <string name="keyguard_accessibility_slide_area" msgid="6736064494019979544">"Zone où faire glisser votre doigt sur l\'écran"</string> <string name="keyguard_accessibility_pin_area" msgid="7903959476607833485">"Champ du code PIN"</string> <string name="keyguard_accessibility_sim_pin_area" msgid="3887780775111719336">"Champ du code PIN de la carte SIM"</string> <string name="keyguard_accessibility_sim_puk_area" msgid="1880823406954996207">"Champ du code PUK de la carte SIM"</string> diff --git a/packages/Keyguard/res/values-gl-rES/strings.xml b/packages/Keyguard/res/values-gl-rES/strings.xml index 382dd7bf3e13..a894fc5b9ccd 100644 --- a/packages/Keyguard/res/values-gl-rES/strings.xml +++ b/packages/Keyguard/res/values-gl-rES/strings.xml @@ -46,11 +46,6 @@ <string name="keyguard_sim_locked_message" msgid="6875773413306380902">"A tarxeta SIM está bloqueada."</string> <string name="keyguard_sim_puk_locked_message" msgid="3747232467471801633">"A tarxeta SIM está bloqueada mediante un PUK."</string> <string name="keyguard_sim_unlock_progress_dialog_message" msgid="7975221805033614426">"Desbloqueando tarxeta SIM…"</string> - <string name="keyguard_accessibility_pattern_unlock" msgid="1490840706075246612">"Desbloqueo mediante padrón"</string> - <string name="keyguard_accessibility_pin_unlock" msgid="2469687111784035046">"Desbloqueo mediante PIN"</string> - <string name="keyguard_accessibility_password_unlock" msgid="7675777623912155089">"Desbloqueo mediante contrasinal"</string> - <string name="keyguard_accessibility_pattern_area" msgid="7679891324509597904">"Zona do padrón"</string> - <string name="keyguard_accessibility_slide_area" msgid="6736064494019979544">"Zona para pasar o dedo"</string> <string name="keyguard_accessibility_pin_area" msgid="7903959476607833485">"Área do PIN"</string> <string name="keyguard_accessibility_sim_pin_area" msgid="3887780775111719336">"Área do PIN da tarxeta SIM"</string> <string name="keyguard_accessibility_sim_puk_area" msgid="1880823406954996207">"Área do PUK da tarxeta SIM"</string> diff --git a/packages/Keyguard/res/values-gu-rIN/strings.xml b/packages/Keyguard/res/values-gu-rIN/strings.xml index eddd1a158486..d288b3f9da78 100644 --- a/packages/Keyguard/res/values-gu-rIN/strings.xml +++ b/packages/Keyguard/res/values-gu-rIN/strings.xml @@ -46,11 +46,6 @@ <string name="keyguard_sim_locked_message" msgid="6875773413306380902">"SIM કાર્ડ લૉક કરેલ છે."</string> <string name="keyguard_sim_puk_locked_message" msgid="3747232467471801633">"SIM કાર્ડ, PUK-લૉક કરેલ છે."</string> <string name="keyguard_sim_unlock_progress_dialog_message" msgid="7975221805033614426">"SIM કાર્ડ અનલૉક કરી રહ્યાં છે…"</string> - <string name="keyguard_accessibility_pattern_unlock" msgid="1490840706075246612">"પેટર્ન અનલૉક."</string> - <string name="keyguard_accessibility_pin_unlock" msgid="2469687111784035046">"પિન અનલૉક."</string> - <string name="keyguard_accessibility_password_unlock" msgid="7675777623912155089">"પાસવર્ડ અનલૉક કરો."</string> - <string name="keyguard_accessibility_pattern_area" msgid="7679891324509597904">"પેટર્ન ક્ષેત્ર."</string> - <string name="keyguard_accessibility_slide_area" msgid="6736064494019979544">"સ્લાઇડ ક્ષેત્ર."</string> <string name="keyguard_accessibility_pin_area" msgid="7903959476607833485">"PIN ક્ષેત્ર"</string> <string name="keyguard_accessibility_sim_pin_area" msgid="3887780775111719336">"SIM PIN ક્ષેત્ર"</string> <string name="keyguard_accessibility_sim_puk_area" msgid="1880823406954996207">"SIM PUK ક્ષેત્ર"</string> diff --git a/packages/Keyguard/res/values-hi/strings.xml b/packages/Keyguard/res/values-hi/strings.xml index 8069c5e9c464..bf36312870e5 100644 --- a/packages/Keyguard/res/values-hi/strings.xml +++ b/packages/Keyguard/res/values-hi/strings.xml @@ -46,11 +46,6 @@ <string name="keyguard_sim_locked_message" msgid="6875773413306380902">"सिम कार्ड लॉक है."</string> <string name="keyguard_sim_puk_locked_message" msgid="3747232467471801633">"सिम कार्ड PUK द्वारा लॉक किया हुआ है."</string> <string name="keyguard_sim_unlock_progress_dialog_message" msgid="7975221805033614426">"सिम कार्ड अनलॉक हो रहा है…"</string> - <string name="keyguard_accessibility_pattern_unlock" msgid="1490840706075246612">"आकार अनलॉक."</string> - <string name="keyguard_accessibility_pin_unlock" msgid="2469687111784035046">"पिन अनलॉक."</string> - <string name="keyguard_accessibility_password_unlock" msgid="7675777623912155089">"पासवर्ड अनलॉक."</string> - <string name="keyguard_accessibility_pattern_area" msgid="7679891324509597904">"आकार क्षेत्र."</string> - <string name="keyguard_accessibility_slide_area" msgid="6736064494019979544">"स्लाइड क्षेत्र."</string> <string name="keyguard_accessibility_pin_area" msgid="7903959476607833485">"पिन क्षेत्र"</string> <string name="keyguard_accessibility_sim_pin_area" msgid="3887780775111719336">"सिम पिन क्षेत्र"</string> <string name="keyguard_accessibility_sim_puk_area" msgid="1880823406954996207">"सिम पिइउके क्षेत्र"</string> diff --git a/packages/Keyguard/res/values-hr/strings.xml b/packages/Keyguard/res/values-hr/strings.xml index 044786d6297d..169bc5716bbb 100644 --- a/packages/Keyguard/res/values-hr/strings.xml +++ b/packages/Keyguard/res/values-hr/strings.xml @@ -46,11 +46,6 @@ <string name="keyguard_sim_locked_message" msgid="6875773413306380902">"SIM kartica je zaključana."</string> <string name="keyguard_sim_puk_locked_message" msgid="3747232467471801633">"SIM kartica zaključana je PUK-om."</string> <string name="keyguard_sim_unlock_progress_dialog_message" msgid="7975221805033614426">"Otključavanje SIM kartice…"</string> - <string name="keyguard_accessibility_pattern_unlock" msgid="1490840706075246612">"Uzorak za otključavanje."</string> - <string name="keyguard_accessibility_pin_unlock" msgid="2469687111784035046">"Otključavanje PIN-om."</string> - <string name="keyguard_accessibility_password_unlock" msgid="7675777623912155089">"Otključavanje zaporkom."</string> - <string name="keyguard_accessibility_pattern_area" msgid="7679891324509597904">"Područje uzorka."</string> - <string name="keyguard_accessibility_slide_area" msgid="6736064494019979544">"Područje klizanja."</string> <string name="keyguard_accessibility_pin_area" msgid="7903959476607833485">"Područje PIN-a"</string> <string name="keyguard_accessibility_sim_pin_area" msgid="3887780775111719336">"Područje PIN-a za SIM"</string> <string name="keyguard_accessibility_sim_puk_area" msgid="1880823406954996207">"Područje PUK-a za SIM"</string> diff --git a/packages/Keyguard/res/values-hu/strings.xml b/packages/Keyguard/res/values-hu/strings.xml index e54a89f42fa6..bc3bf4e0427f 100644 --- a/packages/Keyguard/res/values-hu/strings.xml +++ b/packages/Keyguard/res/values-hu/strings.xml @@ -46,11 +46,6 @@ <string name="keyguard_sim_locked_message" msgid="6875773413306380902">"A SIM kártya le van zárva."</string> <string name="keyguard_sim_puk_locked_message" msgid="3747232467471801633">"A SIM kártya le van zárva a PUK kóddal."</string> <string name="keyguard_sim_unlock_progress_dialog_message" msgid="7975221805033614426">"SIM kártya feloldása..."</string> - <string name="keyguard_accessibility_pattern_unlock" msgid="1490840706075246612">"Feloldás mintával"</string> - <string name="keyguard_accessibility_pin_unlock" msgid="2469687111784035046">"Feloldás PIN kóddal"</string> - <string name="keyguard_accessibility_password_unlock" msgid="7675777623912155089">"Feloldás jelszóval"</string> - <string name="keyguard_accessibility_pattern_area" msgid="7679891324509597904">"Mintaterület"</string> - <string name="keyguard_accessibility_slide_area" msgid="6736064494019979544">"Csúsztatási terület"</string> <string name="keyguard_accessibility_pin_area" msgid="7903959476607833485">"PIN-kód területe"</string> <string name="keyguard_accessibility_sim_pin_area" msgid="3887780775111719336">"SIM PIN-kód területe"</string> <string name="keyguard_accessibility_sim_puk_area" msgid="1880823406954996207">"SIM PUK kód területe"</string> diff --git a/packages/Keyguard/res/values-hy-rAM/strings.xml b/packages/Keyguard/res/values-hy-rAM/strings.xml index 6758a2e962c4..4aacf8fb927a 100644 --- a/packages/Keyguard/res/values-hy-rAM/strings.xml +++ b/packages/Keyguard/res/values-hy-rAM/strings.xml @@ -46,11 +46,6 @@ <string name="keyguard_sim_locked_message" msgid="6875773413306380902">"SIM քարտը կողպված է:"</string> <string name="keyguard_sim_puk_locked_message" msgid="3747232467471801633">"SIM քարտը PUK-ով կողպված է:"</string> <string name="keyguard_sim_unlock_progress_dialog_message" msgid="7975221805033614426">"SIM քարտը ապակողպվում է..."</string> - <string name="keyguard_accessibility_pattern_unlock" msgid="1490840706075246612">"Սխեմայով ապակողպում:"</string> - <string name="keyguard_accessibility_pin_unlock" msgid="2469687111784035046">"Pin-ն ապակողպված է:"</string> - <string name="keyguard_accessibility_password_unlock" msgid="7675777623912155089">"Գաղտնաբառի ապակողպում:"</string> - <string name="keyguard_accessibility_pattern_area" msgid="7679891324509597904">"Սխեմայի տարածք:"</string> - <string name="keyguard_accessibility_slide_area" msgid="6736064494019979544">"Սահեցման տարածք:"</string> <string name="keyguard_accessibility_pin_area" msgid="7903959476607833485">"PIN կոդի տարածք"</string> <string name="keyguard_accessibility_sim_pin_area" msgid="3887780775111719336">"SIM քարտի PIN կոդի տարածք"</string> <string name="keyguard_accessibility_sim_puk_area" msgid="1880823406954996207">"SIM քարտի PUK կոդի տարածք"</string> diff --git a/packages/Keyguard/res/values-in/strings.xml b/packages/Keyguard/res/values-in/strings.xml index 6f8e7f1c6ddb..dda63a88568c 100644 --- a/packages/Keyguard/res/values-in/strings.xml +++ b/packages/Keyguard/res/values-in/strings.xml @@ -46,11 +46,6 @@ <string name="keyguard_sim_locked_message" msgid="6875773413306380902">"Kartu SIM terkunci."</string> <string name="keyguard_sim_puk_locked_message" msgid="3747232467471801633">"Kartu SIM terkunci PUK."</string> <string name="keyguard_sim_unlock_progress_dialog_message" msgid="7975221805033614426">"Membuka kartu SIM…"</string> - <string name="keyguard_accessibility_pattern_unlock" msgid="1490840706075246612">"Buka kunci dengan pola."</string> - <string name="keyguard_accessibility_pin_unlock" msgid="2469687111784035046">"Buka kunci dengan PIN."</string> - <string name="keyguard_accessibility_password_unlock" msgid="7675777623912155089">"Buka kunci dengan sandi."</string> - <string name="keyguard_accessibility_pattern_area" msgid="7679891324509597904">"Area pola."</string> - <string name="keyguard_accessibility_slide_area" msgid="6736064494019979544">"Area geser."</string> <string name="keyguard_accessibility_pin_area" msgid="7903959476607833485">"Bidang PIN"</string> <string name="keyguard_accessibility_sim_pin_area" msgid="3887780775111719336">"Bidang PIN SIM"</string> <string name="keyguard_accessibility_sim_puk_area" msgid="1880823406954996207">"Bidang PUK SIM"</string> diff --git a/packages/Keyguard/res/values-is-rIS/strings.xml b/packages/Keyguard/res/values-is-rIS/strings.xml index 279ffcfb51b4..278e03113673 100644 --- a/packages/Keyguard/res/values-is-rIS/strings.xml +++ b/packages/Keyguard/res/values-is-rIS/strings.xml @@ -46,11 +46,6 @@ <string name="keyguard_sim_locked_message" msgid="6875773413306380902">"SIM-kortið er læst."</string> <string name="keyguard_sim_puk_locked_message" msgid="3747232467471801633">"SIM-kortið er PUK-læst."</string> <string name="keyguard_sim_unlock_progress_dialog_message" msgid="7975221805033614426">"Tekur SIM-kort úr lás…"</string> - <string name="keyguard_accessibility_pattern_unlock" msgid="1490840706075246612">"Opnun með mynstri."</string> - <string name="keyguard_accessibility_pin_unlock" msgid="2469687111784035046">"Opnun með PIN-númeri."</string> - <string name="keyguard_accessibility_password_unlock" msgid="7675777623912155089">"Opnun með aðgangsorði."</string> - <string name="keyguard_accessibility_pattern_area" msgid="7679891324509597904">"Svæði mynsturs."</string> - <string name="keyguard_accessibility_slide_area" msgid="6736064494019979544">"Stroksvæði."</string> <string name="keyguard_accessibility_pin_area" msgid="7903959476607833485">"PIN-svæði"</string> <string name="keyguard_accessibility_sim_pin_area" msgid="3887780775111719336">"PIN-svæði SIM-korts"</string> <string name="keyguard_accessibility_sim_puk_area" msgid="1880823406954996207">"PUK-svæði SIM-korts"</string> diff --git a/packages/Keyguard/res/values-it/strings.xml b/packages/Keyguard/res/values-it/strings.xml index 728974df96bc..98bcae4775b9 100644 --- a/packages/Keyguard/res/values-it/strings.xml +++ b/packages/Keyguard/res/values-it/strings.xml @@ -46,11 +46,6 @@ <string name="keyguard_sim_locked_message" msgid="6875773413306380902">"La SIM è bloccata."</string> <string name="keyguard_sim_puk_locked_message" msgid="3747232467471801633">"La SIM è bloccata tramite PUK."</string> <string name="keyguard_sim_unlock_progress_dialog_message" msgid="7975221805033614426">"Sblocco scheda SIM..."</string> - <string name="keyguard_accessibility_pattern_unlock" msgid="1490840706075246612">"Sblocco con sequenza."</string> - <string name="keyguard_accessibility_pin_unlock" msgid="2469687111784035046">"Sblocco con PIN."</string> - <string name="keyguard_accessibility_password_unlock" msgid="7675777623912155089">"Sblocco con password."</string> - <string name="keyguard_accessibility_pattern_area" msgid="7679891324509597904">"Area sequenza."</string> - <string name="keyguard_accessibility_slide_area" msgid="6736064494019979544">"Area di scorrimento."</string> <string name="keyguard_accessibility_pin_area" msgid="7903959476607833485">"Area PIN"</string> <string name="keyguard_accessibility_sim_pin_area" msgid="3887780775111719336">"Area PIN SIM"</string> <string name="keyguard_accessibility_sim_puk_area" msgid="1880823406954996207">"Area PUK SIM"</string> diff --git a/packages/Keyguard/res/values-iw/strings.xml b/packages/Keyguard/res/values-iw/strings.xml index 47d0728af3ff..8d1ada3a342a 100644 --- a/packages/Keyguard/res/values-iw/strings.xml +++ b/packages/Keyguard/res/values-iw/strings.xml @@ -46,11 +46,6 @@ <string name="keyguard_sim_locked_message" msgid="6875773413306380902">"כרטיס ה-SIM נעול."</string> <string name="keyguard_sim_puk_locked_message" msgid="3747232467471801633">"כרטיס SIM נעול באמצעות PUK."</string> <string name="keyguard_sim_unlock_progress_dialog_message" msgid="7975221805033614426">"מבטל נעילה של כרטיס SIM…"</string> - <string name="keyguard_accessibility_pattern_unlock" msgid="1490840706075246612">"ביטול נעילה באמצעות ציור קו."</string> - <string name="keyguard_accessibility_pin_unlock" msgid="2469687111784035046">"ביטול נעילה באמצעות מספר PIN."</string> - <string name="keyguard_accessibility_password_unlock" msgid="7675777623912155089">"ביטול נעילה באמצעות סיסמה."</string> - <string name="keyguard_accessibility_pattern_area" msgid="7679891324509597904">"אזור ציור קו."</string> - <string name="keyguard_accessibility_slide_area" msgid="6736064494019979544">"אזור הסטה."</string> <string name="keyguard_accessibility_pin_area" msgid="7903959476607833485">"אזור עבור קוד PIN"</string> <string name="keyguard_accessibility_sim_pin_area" msgid="3887780775111719336">"אזור עבור קוד PIN של SIM"</string> <string name="keyguard_accessibility_sim_puk_area" msgid="1880823406954996207">"אזור עבור קוד PUK של SIM"</string> diff --git a/packages/Keyguard/res/values-ja/strings.xml b/packages/Keyguard/res/values-ja/strings.xml index d30355fedce8..c4b4c9856487 100644 --- a/packages/Keyguard/res/values-ja/strings.xml +++ b/packages/Keyguard/res/values-ja/strings.xml @@ -46,11 +46,6 @@ <string name="keyguard_sim_locked_message" msgid="6875773413306380902">"SIMカードはロックされています。"</string> <string name="keyguard_sim_puk_locked_message" msgid="3747232467471801633">"SIMカードはPUKでロックされています。"</string> <string name="keyguard_sim_unlock_progress_dialog_message" msgid="7975221805033614426">"SIMカードをロック解除しています…"</string> - <string name="keyguard_accessibility_pattern_unlock" msgid="1490840706075246612">"パターンロックを解除します。"</string> - <string name="keyguard_accessibility_pin_unlock" msgid="2469687111784035046">"PINロックを解除します。"</string> - <string name="keyguard_accessibility_password_unlock" msgid="7675777623912155089">"パスワードロックを解除します。"</string> - <string name="keyguard_accessibility_pattern_area" msgid="7679891324509597904">"パターンエリアです。"</string> - <string name="keyguard_accessibility_slide_area" msgid="6736064494019979544">"スライドエリアです。"</string> <string name="keyguard_accessibility_pin_area" msgid="7903959476607833485">"PINエリア"</string> <string name="keyguard_accessibility_sim_pin_area" msgid="3887780775111719336">"SIM PINエリア"</string> <string name="keyguard_accessibility_sim_puk_area" msgid="1880823406954996207">"SIM PUKエリア"</string> diff --git a/packages/Keyguard/res/values-ka-rGE/strings.xml b/packages/Keyguard/res/values-ka-rGE/strings.xml index a398e00838ec..658194ff0c4a 100644 --- a/packages/Keyguard/res/values-ka-rGE/strings.xml +++ b/packages/Keyguard/res/values-ka-rGE/strings.xml @@ -46,11 +46,6 @@ <string name="keyguard_sim_locked_message" msgid="6875773413306380902">"SIM ბარათი დაბლოკილია."</string> <string name="keyguard_sim_puk_locked_message" msgid="3747232467471801633">"SIM ბარათი დაბლოკილია PUK კოდით."</string> <string name="keyguard_sim_unlock_progress_dialog_message" msgid="7975221805033614426">"მიმდინარეობს SIM ბარათის განბლოკვა…"</string> - <string name="keyguard_accessibility_pattern_unlock" msgid="1490840706075246612">"განბლოკვა ნიმუშით."</string> - <string name="keyguard_accessibility_pin_unlock" msgid="2469687111784035046">"განბლოკვა Pin-ით."</string> - <string name="keyguard_accessibility_password_unlock" msgid="7675777623912155089">"პაროლის განბლოკვა"</string> - <string name="keyguard_accessibility_pattern_area" msgid="7679891324509597904">"ნიმუშების სივრცე."</string> - <string name="keyguard_accessibility_slide_area" msgid="6736064494019979544">"გადასრიალების სივრცე."</string> <string name="keyguard_accessibility_pin_area" msgid="7903959476607833485">"PIN-ის არე"</string> <string name="keyguard_accessibility_sim_pin_area" msgid="3887780775111719336">"SIM-ის PIN-ის არე"</string> <string name="keyguard_accessibility_sim_puk_area" msgid="1880823406954996207">"SIM-ის PUK-ის არე"</string> diff --git a/packages/Keyguard/res/values-kk-rKZ/strings.xml b/packages/Keyguard/res/values-kk-rKZ/strings.xml index be261fb332ab..2eb3948778af 100644 --- a/packages/Keyguard/res/values-kk-rKZ/strings.xml +++ b/packages/Keyguard/res/values-kk-rKZ/strings.xml @@ -46,11 +46,6 @@ <string name="keyguard_sim_locked_message" msgid="6875773413306380902">"SIM картасы бекітулі."</string> <string name="keyguard_sim_puk_locked_message" msgid="3747232467471801633">"SIM картасының PUK коды бекітілген."</string> <string name="keyguard_sim_unlock_progress_dialog_message" msgid="7975221805033614426">"SIM картасының бекітпесін ашуда…"</string> - <string name="keyguard_accessibility_pattern_unlock" msgid="1490840706075246612">"Кескін арқылы ашу."</string> - <string name="keyguard_accessibility_pin_unlock" msgid="2469687111784035046">"Pin арқылы ашу."</string> - <string name="keyguard_accessibility_password_unlock" msgid="7675777623912155089">"Құпия сөз арқылы ашу."</string> - <string name="keyguard_accessibility_pattern_area" msgid="7679891324509597904">"Кескін арқылы ашу аймағы."</string> - <string name="keyguard_accessibility_slide_area" msgid="6736064494019979544">"Сырғыту аймағы."</string> <string name="keyguard_accessibility_pin_area" msgid="7903959476607833485">"PIN аумағы"</string> <string name="keyguard_accessibility_sim_pin_area" msgid="3887780775111719336">"SIM PIN аумағы"</string> <string name="keyguard_accessibility_sim_puk_area" msgid="1880823406954996207">"SIM PUK аумағы"</string> diff --git a/packages/Keyguard/res/values-km-rKH/strings.xml b/packages/Keyguard/res/values-km-rKH/strings.xml index 4d3f6e86efbe..fce46c732a5a 100644 --- a/packages/Keyguard/res/values-km-rKH/strings.xml +++ b/packages/Keyguard/res/values-km-rKH/strings.xml @@ -46,11 +46,6 @@ <string name="keyguard_sim_locked_message" msgid="6875773413306380902">"ស៊ីមកាតជាប់សោ។"</string> <string name="keyguard_sim_puk_locked_message" msgid="3747232467471801633">"ស៊ីមកាតជាប់កូដ PUK ។"</string> <string name="keyguard_sim_unlock_progress_dialog_message" msgid="7975221805033614426">"កំពុងដោះសោស៊ីមកាត..."</string> - <string name="keyguard_accessibility_pattern_unlock" msgid="1490840706075246612">"លំនាំដោះសោ។"</string> - <string name="keyguard_accessibility_pin_unlock" msgid="2469687111784035046">"កូដ PIN ដោះសោ។"</string> - <string name="keyguard_accessibility_password_unlock" msgid="7675777623912155089">"ពាក្យសម្ងាត់ដោះសោ។"</string> - <string name="keyguard_accessibility_pattern_area" msgid="7679891324509597904">"ផ្ទៃលំនាំ។"</string> - <string name="keyguard_accessibility_slide_area" msgid="6736064494019979544">"ផ្ទៃរុញ។"</string> <string name="keyguard_accessibility_pin_area" msgid="7903959476607833485">"ប្រអប់លេខសម្ងាត់"</string> <string name="keyguard_accessibility_sim_pin_area" msgid="3887780775111719336">"ប្រអប់លេខសម្ងាត់ស៊ីម"</string> <string name="keyguard_accessibility_sim_puk_area" msgid="1880823406954996207">"ប្រអប់ PUK ស៊ីម"</string> diff --git a/packages/Keyguard/res/values-kn-rIN/strings.xml b/packages/Keyguard/res/values-kn-rIN/strings.xml index 5691a6354b22..7bac9c6c4c1b 100644 --- a/packages/Keyguard/res/values-kn-rIN/strings.xml +++ b/packages/Keyguard/res/values-kn-rIN/strings.xml @@ -46,11 +46,6 @@ <string name="keyguard_sim_locked_message" msgid="6875773413306380902">"ಸಿಮ್ ಕಾರ್ಡ್ ಲಾಕ್ ಮಾಡಲಾಗಿದೆ."</string> <string name="keyguard_sim_puk_locked_message" msgid="3747232467471801633">"ಸಿಮ್ ಕಾರ್ಡ್ ಅನ್ನು PUK-ಲಾಕ್ ಮಾಡಲಾಗಿದೆ."</string> <string name="keyguard_sim_unlock_progress_dialog_message" msgid="7975221805033614426">"ಸಿಮ್ ಕಾರ್ಡ್ ಅನ್ಲಾಕ್ ಮಾಡಲಾಗುತ್ತಿದೆ…"</string> - <string name="keyguard_accessibility_pattern_unlock" msgid="1490840706075246612">"ಪ್ಯಾಟರ್ನ್ ಅನ್ಲಾಕ್."</string> - <string name="keyguard_accessibility_pin_unlock" msgid="2469687111784035046">"ಪಿನ್ ಅನ್ಲಾಕ್."</string> - <string name="keyguard_accessibility_password_unlock" msgid="7675777623912155089">"ಪಾಸ್ವರ್ಡ್ ಅನ್ಲಾಕ್."</string> - <string name="keyguard_accessibility_pattern_area" msgid="7679891324509597904">"ಪ್ಯಾಟರ್ನ್ ಪ್ರದೇಶ."</string> - <string name="keyguard_accessibility_slide_area" msgid="6736064494019979544">"ಸ್ಲೈಡ್ ಪ್ರದೇಶ."</string> <string name="keyguard_accessibility_pin_area" msgid="7903959476607833485">"ಪಿನ್ ಪ್ರದೇಶ"</string> <string name="keyguard_accessibility_sim_pin_area" msgid="3887780775111719336">"ಸಿಮ್ ಪಿನ್ ಪ್ರದೇಶ"</string> <string name="keyguard_accessibility_sim_puk_area" msgid="1880823406954996207">"ಸಿಮ್ PUK ಪ್ರದೇಶ"</string> diff --git a/packages/Keyguard/res/values-ko/strings.xml b/packages/Keyguard/res/values-ko/strings.xml index 2eeef2b40220..5d40d4d2a954 100644 --- a/packages/Keyguard/res/values-ko/strings.xml +++ b/packages/Keyguard/res/values-ko/strings.xml @@ -46,11 +46,6 @@ <string name="keyguard_sim_locked_message" msgid="6875773413306380902">"SIM 카드가 잠겨 있습니다."</string> <string name="keyguard_sim_puk_locked_message" msgid="3747232467471801633">"SIM 카드가 PUK 잠김 상태입니다."</string> <string name="keyguard_sim_unlock_progress_dialog_message" msgid="7975221805033614426">"SIM 카드 잠금해제 중..."</string> - <string name="keyguard_accessibility_pattern_unlock" msgid="1490840706075246612">"패턴을 사용하여 잠금해제합니다."</string> - <string name="keyguard_accessibility_pin_unlock" msgid="2469687111784035046">"핀을 사용하여 잠금해제합니다."</string> - <string name="keyguard_accessibility_password_unlock" msgid="7675777623912155089">"비밀번호를 사용하여 잠금해제합니다."</string> - <string name="keyguard_accessibility_pattern_area" msgid="7679891324509597904">"패턴을 그리는 부분입니다."</string> - <string name="keyguard_accessibility_slide_area" msgid="6736064494019979544">"슬라이드하는 부분입니다."</string> <string name="keyguard_accessibility_pin_area" msgid="7903959476607833485">"PIN 영역"</string> <string name="keyguard_accessibility_sim_pin_area" msgid="3887780775111719336">"SIM PIN 영역"</string> <string name="keyguard_accessibility_sim_puk_area" msgid="1880823406954996207">"SIM PUK 영역"</string> diff --git a/packages/Keyguard/res/values-ky-rKG/strings.xml b/packages/Keyguard/res/values-ky-rKG/strings.xml index d42b1fab3a01..a48552844ffe 100644 --- a/packages/Keyguard/res/values-ky-rKG/strings.xml +++ b/packages/Keyguard/res/values-ky-rKG/strings.xml @@ -46,11 +46,6 @@ <string name="keyguard_sim_locked_message" msgid="6875773413306380902">"SIM-карта бөгөттөлгөн."</string> <string name="keyguard_sim_puk_locked_message" msgid="3747232467471801633">"SIM-карта PUK-бөгөттө."</string> <string name="keyguard_sim_unlock_progress_dialog_message" msgid="7975221805033614426">"SIM-карта бөгөттөн чыгарылууда…"</string> - <string name="keyguard_accessibility_pattern_unlock" msgid="1490840706075246612">"Үлгү менен ачуу."</string> - <string name="keyguard_accessibility_pin_unlock" msgid="2469687111784035046">"Пин код менен ачуу."</string> - <string name="keyguard_accessibility_password_unlock" msgid="7675777623912155089">"Сырсөз менен ачуу."</string> - <string name="keyguard_accessibility_pattern_area" msgid="7679891324509597904">"Үлгү аймагы."</string> - <string name="keyguard_accessibility_slide_area" msgid="6736064494019979544">"Жылмыштыруу аймагы."</string> <string name="keyguard_accessibility_pin_area" msgid="7903959476607833485">"PIN аймагы"</string> <string name="keyguard_accessibility_sim_pin_area" msgid="3887780775111719336">"SIM PIN аймагы"</string> <string name="keyguard_accessibility_sim_puk_area" msgid="1880823406954996207">"SIM PUK аймагы"</string> diff --git a/packages/Keyguard/res/values-lo-rLA/strings.xml b/packages/Keyguard/res/values-lo-rLA/strings.xml index 8e7c8136c6ca..29a1b562cf20 100644 --- a/packages/Keyguard/res/values-lo-rLA/strings.xml +++ b/packages/Keyguard/res/values-lo-rLA/strings.xml @@ -46,11 +46,6 @@ <string name="keyguard_sim_locked_message" msgid="6875773413306380902">"ຊິມກາດຖືກລັອກ."</string> <string name="keyguard_sim_puk_locked_message" msgid="3747232467471801633">"ຊິມກາດຖືກລັອກດ້ວຍລະຫັດ PUK."</string> <string name="keyguard_sim_unlock_progress_dialog_message" msgid="7975221805033614426">"ກຳລັງປົດລັອກຊິມກາດ..."</string> - <string name="keyguard_accessibility_pattern_unlock" msgid="1490840706075246612">"ປົດລັອກດ້ວຍຮູບແບບ."</string> - <string name="keyguard_accessibility_pin_unlock" msgid="2469687111784035046">"ປົດລັອກດ້ວຍ PIN."</string> - <string name="keyguard_accessibility_password_unlock" msgid="7675777623912155089">"ການປົດລັອກດ້ວຍລະຫັດຜ່ານ."</string> - <string name="keyguard_accessibility_pattern_area" msgid="7679891324509597904">"ພື້ນທີ່ຮູບແບບ."</string> - <string name="keyguard_accessibility_slide_area" msgid="6736064494019979544">"ເລື່ອນພື້ນທີ່."</string> <string name="keyguard_accessibility_pin_area" msgid="7903959476607833485">"ພື້ນທີ່ PIN"</string> <string name="keyguard_accessibility_sim_pin_area" msgid="3887780775111719336">"ພື້ນທີ່ PIN ຂອງ SIM"</string> <string name="keyguard_accessibility_sim_puk_area" msgid="1880823406954996207">"ພື້ນທີ່ PUK ຂອງ SIM"</string> diff --git a/packages/Keyguard/res/values-lt/strings.xml b/packages/Keyguard/res/values-lt/strings.xml index 653c089b915b..fd41efc28db3 100644 --- a/packages/Keyguard/res/values-lt/strings.xml +++ b/packages/Keyguard/res/values-lt/strings.xml @@ -46,11 +46,6 @@ <string name="keyguard_sim_locked_message" msgid="6875773413306380902">"SIM kortelė užrakinta."</string> <string name="keyguard_sim_puk_locked_message" msgid="3747232467471801633">"SIM kortelė užrakinta PUK kodu."</string> <string name="keyguard_sim_unlock_progress_dialog_message" msgid="7975221805033614426">"Atrakinama SIM kortelė…"</string> - <string name="keyguard_accessibility_pattern_unlock" msgid="1490840706075246612">"Atrakinimas pagal piešinį."</string> - <string name="keyguard_accessibility_pin_unlock" msgid="2469687111784035046">"Atrakinimas įvedus PIN kodą."</string> - <string name="keyguard_accessibility_password_unlock" msgid="7675777623912155089">"Atrakinimas įvedus slaptažodį."</string> - <string name="keyguard_accessibility_pattern_area" msgid="7679891324509597904">"Atrakinimo pagal piešinį sritis."</string> - <string name="keyguard_accessibility_slide_area" msgid="6736064494019979544">"Slydimo sritis."</string> <string name="keyguard_accessibility_pin_area" msgid="7903959476607833485">"PIN kodo sritis"</string> <string name="keyguard_accessibility_sim_pin_area" msgid="3887780775111719336">"SIM kortelės PIN kodo sritis"</string> <string name="keyguard_accessibility_sim_puk_area" msgid="1880823406954996207">"SIM kortelės PUK kodo sritis"</string> diff --git a/packages/Keyguard/res/values-lv/strings.xml b/packages/Keyguard/res/values-lv/strings.xml index 449659e9e63c..f801d649fa0a 100644 --- a/packages/Keyguard/res/values-lv/strings.xml +++ b/packages/Keyguard/res/values-lv/strings.xml @@ -46,11 +46,6 @@ <string name="keyguard_sim_locked_message" msgid="6875773413306380902">"SIM karte ir bloķēta."</string> <string name="keyguard_sim_puk_locked_message" msgid="3747232467471801633">"SIM karte ir bloķēta ar PUK."</string> <string name="keyguard_sim_unlock_progress_dialog_message" msgid="7975221805033614426">"Notiek SIM kartes atbloķēšana..."</string> - <string name="keyguard_accessibility_pattern_unlock" msgid="1490840706075246612">"Autorizācija ar kombināciju."</string> - <string name="keyguard_accessibility_pin_unlock" msgid="2469687111784035046">"Autorizācija ar PIN kodu."</string> - <string name="keyguard_accessibility_password_unlock" msgid="7675777623912155089">"Autorizācija ar paroli."</string> - <string name="keyguard_accessibility_pattern_area" msgid="7679891324509597904">"Kombinācijas ievades apgabals."</string> - <string name="keyguard_accessibility_slide_area" msgid="6736064494019979544">"Apgabals, kur vilkt ar pirkstu."</string> <string name="keyguard_accessibility_pin_area" msgid="7903959476607833485">"PIN apgabals"</string> <string name="keyguard_accessibility_sim_pin_area" msgid="3887780775111719336">"SIM PIN apgabals"</string> <string name="keyguard_accessibility_sim_puk_area" msgid="1880823406954996207">"SIM PUK apgabals"</string> diff --git a/packages/Keyguard/res/values-mk-rMK/strings.xml b/packages/Keyguard/res/values-mk-rMK/strings.xml index a6ee92106768..9d833f0266f2 100644 --- a/packages/Keyguard/res/values-mk-rMK/strings.xml +++ b/packages/Keyguard/res/values-mk-rMK/strings.xml @@ -46,11 +46,6 @@ <string name="keyguard_sim_locked_message" msgid="6875773413306380902">"СИМ картичката е заклучена."</string> <string name="keyguard_sim_puk_locked_message" msgid="3747232467471801633">"СИМ картичката е заклучена со ПУК."</string> <string name="keyguard_sim_unlock_progress_dialog_message" msgid="7975221805033614426">"СИМ картичката се отклучува..."</string> - <string name="keyguard_accessibility_pattern_unlock" msgid="1490840706075246612">"Отклучување со шема."</string> - <string name="keyguard_accessibility_pin_unlock" msgid="2469687111784035046">"Отклучување со пин."</string> - <string name="keyguard_accessibility_password_unlock" msgid="7675777623912155089">"Отклучување со лозинка."</string> - <string name="keyguard_accessibility_pattern_area" msgid="7679891324509597904">"Област за шема."</string> - <string name="keyguard_accessibility_slide_area" msgid="6736064494019979544">"Област за лизгање."</string> <string name="keyguard_accessibility_pin_area" msgid="7903959476607833485">"Поле за PIN"</string> <string name="keyguard_accessibility_sim_pin_area" msgid="3887780775111719336">"Поле за PIN на СИМ"</string> <string name="keyguard_accessibility_sim_puk_area" msgid="1880823406954996207">"Поле за ПУК на СИМ"</string> diff --git a/packages/Keyguard/res/values-ml-rIN/strings.xml b/packages/Keyguard/res/values-ml-rIN/strings.xml index fa39ae11af9b..5d93cf003878 100644 --- a/packages/Keyguard/res/values-ml-rIN/strings.xml +++ b/packages/Keyguard/res/values-ml-rIN/strings.xml @@ -46,11 +46,6 @@ <string name="keyguard_sim_locked_message" msgid="6875773413306380902">"സിം കാർഡ് ലോക്കുചെയ്തു."</string> <string name="keyguard_sim_puk_locked_message" msgid="3747232467471801633">"സിം കാർഡ് PUK-ലോക്ക് ചെയ്തതാണ്."</string> <string name="keyguard_sim_unlock_progress_dialog_message" msgid="7975221805033614426">"സിം കാർഡ് അൺലോക്കുചെയ്യുന്നു…"</string> - <string name="keyguard_accessibility_pattern_unlock" msgid="1490840706075246612">"പാറ്റേൺ അൺലോക്ക്."</string> - <string name="keyguard_accessibility_pin_unlock" msgid="2469687111784035046">"പിൻ അൺലോക്ക്."</string> - <string name="keyguard_accessibility_password_unlock" msgid="7675777623912155089">"പാസ്വേഡ് അൺലോക്ക്."</string> - <string name="keyguard_accessibility_pattern_area" msgid="7679891324509597904">"പാറ്റേൺ ഏരിയ."</string> - <string name="keyguard_accessibility_slide_area" msgid="6736064494019979544">"സ്ലൈഡ് ഏരിയ."</string> <string name="keyguard_accessibility_pin_area" msgid="7903959476607833485">"PIN ഏരിയ"</string> <string name="keyguard_accessibility_sim_pin_area" msgid="3887780775111719336">"SIM PIN ഏരിയ"</string> <string name="keyguard_accessibility_sim_puk_area" msgid="1880823406954996207">"SIM PUK ഏരിയ"</string> diff --git a/packages/Keyguard/res/values-mn-rMN/strings.xml b/packages/Keyguard/res/values-mn-rMN/strings.xml index fae032884c0b..8641e31285fb 100644 --- a/packages/Keyguard/res/values-mn-rMN/strings.xml +++ b/packages/Keyguard/res/values-mn-rMN/strings.xml @@ -46,11 +46,6 @@ <string name="keyguard_sim_locked_message" msgid="6875773413306380902">"SIM карт түгжигдсэн."</string> <string name="keyguard_sim_puk_locked_message" msgid="3747232467471801633">"SIM картны PUK-түгжигдсэн."</string> <string name="keyguard_sim_unlock_progress_dialog_message" msgid="7975221805033614426">"SIM картны түгжээг гаргаж байна…"</string> - <string name="keyguard_accessibility_pattern_unlock" msgid="1490840706075246612">"Тайлах хээ."</string> - <string name="keyguard_accessibility_pin_unlock" msgid="2469687111784035046">"Тайлах пин."</string> - <string name="keyguard_accessibility_password_unlock" msgid="7675777623912155089">"Тайлах нууц үг."</string> - <string name="keyguard_accessibility_pattern_area" msgid="7679891324509597904">"Хээний хэсэг."</string> - <string name="keyguard_accessibility_slide_area" msgid="6736064494019979544">"Гулсуулах хэсэг."</string> <string name="keyguard_accessibility_pin_area" msgid="7903959476607833485">"PIN талбар"</string> <string name="keyguard_accessibility_sim_pin_area" msgid="3887780775111719336">"SIM PIN талбар"</string> <string name="keyguard_accessibility_sim_puk_area" msgid="1880823406954996207">"SIM PUK талбар"</string> diff --git a/packages/Keyguard/res/values-mr-rIN/strings.xml b/packages/Keyguard/res/values-mr-rIN/strings.xml index 57a95be9971b..8bcaad6cc504 100644 --- a/packages/Keyguard/res/values-mr-rIN/strings.xml +++ b/packages/Keyguard/res/values-mr-rIN/strings.xml @@ -46,11 +46,6 @@ <string name="keyguard_sim_locked_message" msgid="6875773413306380902">"सिम कार्ड लॉक झाले आहे."</string> <string name="keyguard_sim_puk_locked_message" msgid="3747232467471801633">"सिम कार्ड PUK-लॉक केलेले आहे."</string> <string name="keyguard_sim_unlock_progress_dialog_message" msgid="7975221805033614426">"सिम कार्ड अनलॉक करत आहे…"</string> - <string name="keyguard_accessibility_pattern_unlock" msgid="1490840706075246612">"नमुना अनलॉक."</string> - <string name="keyguard_accessibility_pin_unlock" msgid="2469687111784035046">"पिन अनलॉक."</string> - <string name="keyguard_accessibility_password_unlock" msgid="7675777623912155089">"संकेतशब्द अनलॉक."</string> - <string name="keyguard_accessibility_pattern_area" msgid="7679891324509597904">"नमुना क्षेत्र."</string> - <string name="keyguard_accessibility_slide_area" msgid="6736064494019979544">"स्लाइड क्षेत्र."</string> <string name="keyguard_accessibility_pin_area" msgid="7903959476607833485">"पिन क्षेत्र"</string> <string name="keyguard_accessibility_sim_pin_area" msgid="3887780775111719336">"सिम पिन क्षेत्र"</string> <string name="keyguard_accessibility_sim_puk_area" msgid="1880823406954996207">"सिम PUK क्षेत्र"</string> diff --git a/packages/Keyguard/res/values-ms-rMY/strings.xml b/packages/Keyguard/res/values-ms-rMY/strings.xml index 803d40a27133..b7b093f085bf 100644 --- a/packages/Keyguard/res/values-ms-rMY/strings.xml +++ b/packages/Keyguard/res/values-ms-rMY/strings.xml @@ -46,11 +46,6 @@ <string name="keyguard_sim_locked_message" msgid="6875773413306380902">"Kad SIM dikunci."</string> <string name="keyguard_sim_puk_locked_message" msgid="3747232467471801633">"Kad SIM dikunci dengan PUK."</string> <string name="keyguard_sim_unlock_progress_dialog_message" msgid="7975221805033614426">"Membuka kunci kad SIM..."</string> - <string name="keyguard_accessibility_pattern_unlock" msgid="1490840706075246612">"Buka kunci corak."</string> - <string name="keyguard_accessibility_pin_unlock" msgid="2469687111784035046">"Buka kunci pin."</string> - <string name="keyguard_accessibility_password_unlock" msgid="7675777623912155089">"Buka kunci kata laluan."</string> - <string name="keyguard_accessibility_pattern_area" msgid="7679891324509597904">"Kawasan corak."</string> - <string name="keyguard_accessibility_slide_area" msgid="6736064494019979544">"Kawasan luncur."</string> <string name="keyguard_accessibility_pin_area" msgid="7903959476607833485">"Kawasan PIN"</string> <string name="keyguard_accessibility_sim_pin_area" msgid="3887780775111719336">"Kawasan PIN SIM"</string> <string name="keyguard_accessibility_sim_puk_area" msgid="1880823406954996207">"Kawasan PUK SIM"</string> diff --git a/packages/Keyguard/res/values-my-rMM/strings.xml b/packages/Keyguard/res/values-my-rMM/strings.xml index fd800e4a50fc..7a7664e20287 100644 --- a/packages/Keyguard/res/values-my-rMM/strings.xml +++ b/packages/Keyguard/res/values-my-rMM/strings.xml @@ -46,11 +46,6 @@ <string name="keyguard_sim_locked_message" msgid="6875773413306380902">"ဆင်းမ်ကဒ် သော့ကျနေပါသည်"</string> <string name="keyguard_sim_puk_locked_message" msgid="3747232467471801633">"ဆင်းမ်ကဒ် ရဲ့ ပင်နံပါတ် ပြန်ဖွင့်သည့် ကုဒ် သော့ကျနေပါသည်"</string> <string name="keyguard_sim_unlock_progress_dialog_message" msgid="7975221805033614426">"ဆင်းမ်ကဒ် ကို သော့ဖွင့်နေပါသည်"</string> - <string name="keyguard_accessibility_pattern_unlock" msgid="1490840706075246612">"ပုံစံဖြင့် သော့ဖွင့်ခြင်း"</string> - <string name="keyguard_accessibility_pin_unlock" msgid="2469687111784035046">"ပင်နံပါတ်ဖြင့် သော့ဖွင့်ခြင်း"</string> - <string name="keyguard_accessibility_password_unlock" msgid="7675777623912155089">"စကားဝှက်ဖြင့် သော့ဖွင့်ခြင်း"</string> - <string name="keyguard_accessibility_pattern_area" msgid="7679891324509597904">"ပုံစံနေရာ"</string> - <string name="keyguard_accessibility_slide_area" msgid="6736064494019979544">"ဘေးတိုက်ပွတ်ဆွဲရန် နေရာ"</string> <string name="keyguard_accessibility_pin_area" msgid="7903959476607833485">"PIN နေရာ"</string> <string name="keyguard_accessibility_sim_pin_area" msgid="3887780775111719336">"SIM PIN နေရာ"</string> <string name="keyguard_accessibility_sim_puk_area" msgid="1880823406954996207">"SIM PUK နေရာ"</string> diff --git a/packages/Keyguard/res/values-nb/strings.xml b/packages/Keyguard/res/values-nb/strings.xml index 1bdf444c05e8..e0035daa10ba 100644 --- a/packages/Keyguard/res/values-nb/strings.xml +++ b/packages/Keyguard/res/values-nb/strings.xml @@ -46,11 +46,6 @@ <string name="keyguard_sim_locked_message" msgid="6875773413306380902">"SIM-kortet er låst."</string> <string name="keyguard_sim_puk_locked_message" msgid="3747232467471801633">"SIM-kortet er PUK-låst."</string> <string name="keyguard_sim_unlock_progress_dialog_message" msgid="7975221805033614426">"Låser opp SIM-kortet ..."</string> - <string name="keyguard_accessibility_pattern_unlock" msgid="1490840706075246612">"Mønsteropplåsning."</string> - <string name="keyguard_accessibility_pin_unlock" msgid="2469687111784035046">"PIN-opplåsning."</string> - <string name="keyguard_accessibility_password_unlock" msgid="7675777623912155089">"Passordopplåsning."</string> - <string name="keyguard_accessibility_pattern_area" msgid="7679891324509597904">"Mønsterområde."</string> - <string name="keyguard_accessibility_slide_area" msgid="6736064494019979544">"Dra-felt."</string> <string name="keyguard_accessibility_pin_area" msgid="7903959476607833485">"PIN-området"</string> <string name="keyguard_accessibility_sim_pin_area" msgid="3887780775111719336">"PIN-området for SIM-kortet"</string> <string name="keyguard_accessibility_sim_puk_area" msgid="1880823406954996207">"PUK-området for SIM-kortet"</string> diff --git a/packages/Keyguard/res/values-ne-rNP/strings.xml b/packages/Keyguard/res/values-ne-rNP/strings.xml index 2cf863d25a1c..47f5432a5447 100644 --- a/packages/Keyguard/res/values-ne-rNP/strings.xml +++ b/packages/Keyguard/res/values-ne-rNP/strings.xml @@ -46,11 +46,6 @@ <string name="keyguard_sim_locked_message" msgid="6875773413306380902">"SIM कार्ड लक गरियो।"</string> <string name="keyguard_sim_puk_locked_message" msgid="3747232467471801633">"SIM कार्ड PUK-लक छ।"</string> <string name="keyguard_sim_unlock_progress_dialog_message" msgid="7975221805033614426">"SIM कार्ड अनलक हुँदै…"</string> - <string name="keyguard_accessibility_pattern_unlock" msgid="1490840706075246612">"ढाँचा अनलक।"</string> - <string name="keyguard_accessibility_pin_unlock" msgid="2469687111784035046">"Pin अनलक"</string> - <string name="keyguard_accessibility_password_unlock" msgid="7675777623912155089">"पासवर्ड अनलक।"</string> - <string name="keyguard_accessibility_pattern_area" msgid="7679891324509597904">"ढाँचा क्षेत्र।"</string> - <string name="keyguard_accessibility_slide_area" msgid="6736064494019979544">"स्लाइड क्षेत्र।"</string> <string name="keyguard_accessibility_pin_area" msgid="7903959476607833485">"पीन क्षेत्र"</string> <string name="keyguard_accessibility_sim_pin_area" msgid="3887780775111719336">"SIM पिन क्षेत्र"</string> <string name="keyguard_accessibility_sim_puk_area" msgid="1880823406954996207">"SIM पुक क्षेत्र"</string> diff --git a/packages/Keyguard/res/values-nl/strings.xml b/packages/Keyguard/res/values-nl/strings.xml index a33165d8e781..c44381efc817 100644 --- a/packages/Keyguard/res/values-nl/strings.xml +++ b/packages/Keyguard/res/values-nl/strings.xml @@ -46,11 +46,6 @@ <string name="keyguard_sim_locked_message" msgid="6875773413306380902">"Simkaart is vergrendeld."</string> <string name="keyguard_sim_puk_locked_message" msgid="3747232467471801633">"Simkaart is vergrendeld met PUK-code."</string> <string name="keyguard_sim_unlock_progress_dialog_message" msgid="7975221805033614426">"Simkaart ontgrendelen…"</string> - <string name="keyguard_accessibility_pattern_unlock" msgid="1490840706075246612">"Ontgrendeling via patroon."</string> - <string name="keyguard_accessibility_pin_unlock" msgid="2469687111784035046">"Ontgrendeling via pincode."</string> - <string name="keyguard_accessibility_password_unlock" msgid="7675777623912155089">"Ontgrendeling via wachtwoord."</string> - <string name="keyguard_accessibility_pattern_area" msgid="7679891324509597904">"Tekengebied voor patroon."</string> - <string name="keyguard_accessibility_slide_area" msgid="6736064494019979544">"Schuifgebied."</string> <string name="keyguard_accessibility_pin_area" msgid="7903959476607833485">"Gebied voor pincode"</string> <string name="keyguard_accessibility_sim_pin_area" msgid="3887780775111719336">"Gebied voor sim-pincode"</string> <string name="keyguard_accessibility_sim_puk_area" msgid="1880823406954996207">"Gebied voor sim-pukcode"</string> diff --git a/packages/Keyguard/res/values-pa-rIN/strings.xml b/packages/Keyguard/res/values-pa-rIN/strings.xml index 8cf86a065e8d..16ca29c31172 100644 --- a/packages/Keyguard/res/values-pa-rIN/strings.xml +++ b/packages/Keyguard/res/values-pa-rIN/strings.xml @@ -46,11 +46,6 @@ <string name="keyguard_sim_locked_message" msgid="6875773413306380902">"SIM ਕਾਰਡ ਲੌਕ ਕੀਤਾ ਹੋਇਆ ਹੈ।"</string> <string name="keyguard_sim_puk_locked_message" msgid="3747232467471801633">"SIM ਕਾਰਡ PUK-ਲੌਕਡ ਹੈ।"</string> <string name="keyguard_sim_unlock_progress_dialog_message" msgid="7975221805033614426">"SIM ਕਾਰਡ ਅਨਲੌਕ ਕਰ ਰਿਹਾ ਹੈ…"</string> - <string name="keyguard_accessibility_pattern_unlock" msgid="1490840706075246612">"ਪੈਟਰਨ ਅਨਲੌਕ।"</string> - <string name="keyguard_accessibility_pin_unlock" msgid="2469687111784035046">"Pin ਅਨਲੌਕ।"</string> - <string name="keyguard_accessibility_password_unlock" msgid="7675777623912155089">"ਪਾਸਵਰਡ ਅਨਲੌਕ।"</string> - <string name="keyguard_accessibility_pattern_area" msgid="7679891324509597904">"ਪੈਟਰਨ ਖੇਤਰ।"</string> - <string name="keyguard_accessibility_slide_area" msgid="6736064494019979544">"ਖੇਤਰ ਸਲਾਈਡ ਕਰੋ।"</string> <string name="keyguard_accessibility_pin_area" msgid="7903959476607833485">"PIN ਖੇਤਰ"</string> <string name="keyguard_accessibility_sim_pin_area" msgid="3887780775111719336">"SIM PIN ਖੇਤਰ"</string> <string name="keyguard_accessibility_sim_puk_area" msgid="1880823406954996207">"SIM PUK ਖੇਤਰ"</string> diff --git a/packages/Keyguard/res/values-pl/strings.xml b/packages/Keyguard/res/values-pl/strings.xml index ee208508ac00..f0980da7d085 100644 --- a/packages/Keyguard/res/values-pl/strings.xml +++ b/packages/Keyguard/res/values-pl/strings.xml @@ -46,11 +46,6 @@ <string name="keyguard_sim_locked_message" msgid="6875773413306380902">"Karta SIM jest zablokowana."</string> <string name="keyguard_sim_puk_locked_message" msgid="3747232467471801633">"Karta SIM jest zablokowana za pomocą kodu PUK."</string> <string name="keyguard_sim_unlock_progress_dialog_message" msgid="7975221805033614426">"Odblokowuję kartę SIM…"</string> - <string name="keyguard_accessibility_pattern_unlock" msgid="1490840706075246612">"Odblokowanie wzorem."</string> - <string name="keyguard_accessibility_pin_unlock" msgid="2469687111784035046">"Odblokowanie kodem PIN."</string> - <string name="keyguard_accessibility_password_unlock" msgid="7675777623912155089">"Odblokowanie hasłem."</string> - <string name="keyguard_accessibility_pattern_area" msgid="7679891324509597904">"Obszar wzoru."</string> - <string name="keyguard_accessibility_slide_area" msgid="6736064494019979544">"Obszar przesuwania."</string> <string name="keyguard_accessibility_pin_area" msgid="7903959476607833485">"Miejsce na PIN"</string> <string name="keyguard_accessibility_sim_pin_area" msgid="3887780775111719336">"Miejsce na PIN do karty SIM"</string> <string name="keyguard_accessibility_sim_puk_area" msgid="1880823406954996207">"Miejsce na PUK do karty SIM"</string> diff --git a/packages/Keyguard/res/values-pt-rBR/strings.xml b/packages/Keyguard/res/values-pt-rBR/strings.xml index d7215c1a2c48..2663337cee82 100644 --- a/packages/Keyguard/res/values-pt-rBR/strings.xml +++ b/packages/Keyguard/res/values-pt-rBR/strings.xml @@ -46,11 +46,6 @@ <string name="keyguard_sim_locked_message" msgid="6875773413306380902">"O cartão SIM está bloqueado."</string> <string name="keyguard_sim_puk_locked_message" msgid="3747232467471801633">"O cartão SIM está bloqueado pelo PUK."</string> <string name="keyguard_sim_unlock_progress_dialog_message" msgid="7975221805033614426">"Desbloqueando o cartão SIM…"</string> - <string name="keyguard_accessibility_pattern_unlock" msgid="1490840706075246612">"Desbloqueio com padrão."</string> - <string name="keyguard_accessibility_pin_unlock" msgid="2469687111784035046">"Desbloqueio com PIN."</string> - <string name="keyguard_accessibility_password_unlock" msgid="7675777623912155089">"Desbloqueio com senha."</string> - <string name="keyguard_accessibility_pattern_area" msgid="7679891324509597904">"Área do padrão."</string> - <string name="keyguard_accessibility_slide_area" msgid="6736064494019979544">"Área de deslize."</string> <string name="keyguard_accessibility_pin_area" msgid="7903959476607833485">"Área do PIN"</string> <string name="keyguard_accessibility_sim_pin_area" msgid="3887780775111719336">"Área do PIN SIM"</string> <string name="keyguard_accessibility_sim_puk_area" msgid="1880823406954996207">"Área do PUK SIM"</string> diff --git a/packages/Keyguard/res/values-pt-rPT/strings.xml b/packages/Keyguard/res/values-pt-rPT/strings.xml index f0b2bbcd0d62..e417e07d94f1 100644 --- a/packages/Keyguard/res/values-pt-rPT/strings.xml +++ b/packages/Keyguard/res/values-pt-rPT/strings.xml @@ -46,11 +46,6 @@ <string name="keyguard_sim_locked_message" msgid="6875773413306380902">"O cartão SIM está bloqueado."</string> <string name="keyguard_sim_puk_locked_message" msgid="3747232467471801633">"O cartão SIM está bloqueado por PUK."</string> <string name="keyguard_sim_unlock_progress_dialog_message" msgid="7975221805033614426">"A desbloquear o cartão SIM..."</string> - <string name="keyguard_accessibility_pattern_unlock" msgid="1490840706075246612">"Desbloqueio através de sequência."</string> - <string name="keyguard_accessibility_pin_unlock" msgid="2469687111784035046">"Desbloqueio através de PIN."</string> - <string name="keyguard_accessibility_password_unlock" msgid="7675777623912155089">"Desbloqueio através de palavra-passe."</string> - <string name="keyguard_accessibility_pattern_area" msgid="7679891324509597904">"Área da sequência."</string> - <string name="keyguard_accessibility_slide_area" msgid="6736064494019979544">"Área de deslize."</string> <string name="keyguard_accessibility_pin_area" msgid="7903959476607833485">"Área do PIN"</string> <string name="keyguard_accessibility_sim_pin_area" msgid="3887780775111719336">"Área do PIN do SIM"</string> <string name="keyguard_accessibility_sim_puk_area" msgid="1880823406954996207">"Área do PUK do SIM"</string> diff --git a/packages/Keyguard/res/values-pt/strings.xml b/packages/Keyguard/res/values-pt/strings.xml index d7215c1a2c48..2663337cee82 100644 --- a/packages/Keyguard/res/values-pt/strings.xml +++ b/packages/Keyguard/res/values-pt/strings.xml @@ -46,11 +46,6 @@ <string name="keyguard_sim_locked_message" msgid="6875773413306380902">"O cartão SIM está bloqueado."</string> <string name="keyguard_sim_puk_locked_message" msgid="3747232467471801633">"O cartão SIM está bloqueado pelo PUK."</string> <string name="keyguard_sim_unlock_progress_dialog_message" msgid="7975221805033614426">"Desbloqueando o cartão SIM…"</string> - <string name="keyguard_accessibility_pattern_unlock" msgid="1490840706075246612">"Desbloqueio com padrão."</string> - <string name="keyguard_accessibility_pin_unlock" msgid="2469687111784035046">"Desbloqueio com PIN."</string> - <string name="keyguard_accessibility_password_unlock" msgid="7675777623912155089">"Desbloqueio com senha."</string> - <string name="keyguard_accessibility_pattern_area" msgid="7679891324509597904">"Área do padrão."</string> - <string name="keyguard_accessibility_slide_area" msgid="6736064494019979544">"Área de deslize."</string> <string name="keyguard_accessibility_pin_area" msgid="7903959476607833485">"Área do PIN"</string> <string name="keyguard_accessibility_sim_pin_area" msgid="3887780775111719336">"Área do PIN SIM"</string> <string name="keyguard_accessibility_sim_puk_area" msgid="1880823406954996207">"Área do PUK SIM"</string> diff --git a/packages/Keyguard/res/values-ro/strings.xml b/packages/Keyguard/res/values-ro/strings.xml index ea5380cbde25..09a066af2e90 100644 --- a/packages/Keyguard/res/values-ro/strings.xml +++ b/packages/Keyguard/res/values-ro/strings.xml @@ -46,11 +46,6 @@ <string name="keyguard_sim_locked_message" msgid="6875773413306380902">"Cardul SIM este blocat."</string> <string name="keyguard_sim_puk_locked_message" msgid="3747232467471801633">"Cardul SIM este blocat cu codul PUK."</string> <string name="keyguard_sim_unlock_progress_dialog_message" msgid="7975221805033614426">"Se deblochează cardul SIM…"</string> - <string name="keyguard_accessibility_pattern_unlock" msgid="1490840706075246612">"Deblocare cu model."</string> - <string name="keyguard_accessibility_pin_unlock" msgid="2469687111784035046">"Deblocare cu PIN."</string> - <string name="keyguard_accessibility_password_unlock" msgid="7675777623912155089">"Deblocare cu parolă."</string> - <string name="keyguard_accessibility_pattern_area" msgid="7679891324509597904">"Zonă model."</string> - <string name="keyguard_accessibility_slide_area" msgid="6736064494019979544">"Zonă glisare."</string> <string name="keyguard_accessibility_pin_area" msgid="7903959476607833485">"Zona codului PIN"</string> <string name="keyguard_accessibility_sim_pin_area" msgid="3887780775111719336">"Zona codului PIN al cardului SIM"</string> <string name="keyguard_accessibility_sim_puk_area" msgid="1880823406954996207">"Zona codului PUK al cardului SIM"</string> @@ -61,7 +56,7 @@ <string name="kg_wrong_pattern" msgid="1850806070801358830">"Model greșit"</string> <string name="kg_wrong_password" msgid="2333281762128113157">"Parolă greșită"</string> <string name="kg_wrong_pin" msgid="1131306510833563801">"Cod PIN greșit"</string> - <string name="kg_too_many_failed_attempts_countdown" msgid="6358110221603297548">"Încercați din nou peste <xliff:g id="NUMBER">%d</xliff:g> (de) secunde."</string> + <string name="kg_too_many_failed_attempts_countdown" msgid="6358110221603297548">"Încercați din nou peste <xliff:g id="NUMBER">%d</xliff:g> secunde."</string> <string name="kg_pattern_instructions" msgid="398978611683075868">"Desenați modelul"</string> <string name="kg_sim_pin_instructions" msgid="2319508550934557331">"Introduceți codul PIN al cardului SIM"</string> <string name="kg_sim_pin_instructions_multi" msgid="7818515973197201434">"Introduceți codul PIN al cardului SIM pentru „<xliff:g id="CARRIER">%1$s</xliff:g>”"</string> @@ -77,9 +72,9 @@ <string name="kg_invalid_puk" msgid="3638289409676051243">"Reintroduceți codul PUK corect. Încercările repetate vor dezactiva definitiv cardul SIM."</string> <string name="kg_invalid_confirm_pin_hint" product="default" msgid="7003469261464593516">"Codurile PIN nu coincid"</string> <string name="kg_login_too_many_attempts" msgid="6486842094005698475">"Prea multe încercări de desenare a modelului"</string> - <string name="kg_too_many_failed_pin_attempts_dialog_message" msgid="8276745642049502550">"Ați introdus incorect codul PIN de <xliff:g id="NUMBER_0">%1$d</xliff:g> ori.\n\nÎncercați din nou peste <xliff:g id="NUMBER_1">%2$d</xliff:g> (de) secunde."</string> - <string name="kg_too_many_failed_password_attempts_dialog_message" msgid="7813713389422226531">"Ați introdus incorect parola de <xliff:g id="NUMBER_0">%1$d</xliff:g> ori. \n\nÎncercați din nou peste <xliff:g id="NUMBER_1">%2$d</xliff:g> (de) secunde."</string> - <string name="kg_too_many_failed_pattern_attempts_dialog_message" msgid="74089475965050805">"Ați desenat incorect modelul pentru deblocare de <xliff:g id="NUMBER_0">%1$d</xliff:g> ori. \n\nÎncercați din nou peste <xliff:g id="NUMBER_1">%2$d</xliff:g> (de) secunde."</string> + <string name="kg_too_many_failed_pin_attempts_dialog_message" msgid="8276745642049502550">"Ați introdus incorect codul PIN de <xliff:g id="NUMBER_0">%1$d</xliff:g> ori.\n\nÎncercați din nou peste <xliff:g id="NUMBER_1">%2$d</xliff:g> secunde."</string> + <string name="kg_too_many_failed_password_attempts_dialog_message" msgid="7813713389422226531">"Ați introdus incorect parola de <xliff:g id="NUMBER_0">%1$d</xliff:g> ori. \n\nÎncercați din nou peste <xliff:g id="NUMBER_1">%2$d</xliff:g> secunde."</string> + <string name="kg_too_many_failed_pattern_attempts_dialog_message" msgid="74089475965050805">"Ați desenat incorect modelul pentru deblocare de <xliff:g id="NUMBER_0">%1$d</xliff:g> ori. \n\nÎncercați din nou peste <xliff:g id="NUMBER_1">%2$d</xliff:g> secunde."</string> <string name="kg_failed_attempts_almost_at_wipe" product="tablet" msgid="8774056606869646621">"Ați efectuat <xliff:g id="NUMBER_0">%1$d</xliff:g> încercări incorecte de deblocare a tabletei. După încă <xliff:g id="NUMBER_1">%2$d</xliff:g> încercări nereușite, această tabletă va fi resetată, iar toate datele acesteia vor fi șterse."</string> <string name="kg_failed_attempts_almost_at_wipe" product="default" msgid="1843331751334128428">"Ați efectuat <xliff:g id="NUMBER_0">%1$d</xliff:g> încercări incorecte de deblocare a telefonului. După încă <xliff:g id="NUMBER_1">%2$d</xliff:g> încercări nereușite, acest telefon va fi resetat, iar toate datele acestuia vor fi șterse."</string> <string name="kg_failed_attempts_now_wiping" product="tablet" msgid="258925501999698032">"Ați efectuat <xliff:g id="NUMBER">%d</xliff:g> încercări incorecte de deblocare a tabletei. Această tabletă va fi resetată, iar toate datele acesteia vor fi șterse."</string> @@ -92,8 +87,8 @@ <string name="kg_failed_attempts_almost_at_erase_profile" product="default" msgid="6853071165802933545">"Ați efectuat <xliff:g id="NUMBER_0">%1$d</xliff:g> încercări incorecte de deblocare a telefonului. După încă <xliff:g id="NUMBER_1">%2$d</xliff:g> încercări nereușite, profilul de serviciu va fi eliminat, iar toate datele profilului vor fi șterse."</string> <string name="kg_failed_attempts_now_erasing_profile" product="tablet" msgid="4686386497449912146">"Ați efectuat <xliff:g id="NUMBER">%d</xliff:g> încercări incorecte de deblocare a tabletei. Profilul de serviciu va fi eliminat, iar toate datele profilului vor fi șterse."</string> <string name="kg_failed_attempts_now_erasing_profile" product="default" msgid="4951507352869831265">"Ați efectuat <xliff:g id="NUMBER">%d</xliff:g> încercări incorecte de deblocare a telefonului. Profilul de serviciu va fi eliminat, iar toate datele profilului vor fi șterse."</string> - <string name="kg_failed_attempts_almost_at_login" product="tablet" msgid="3253575572118914370">"Ați desenat incorect modelul pentru deblocare de <xliff:g id="NUMBER_0">%1$d</xliff:g> ori. După încă <xliff:g id="NUMBER_1">%2$d</xliff:g> încercări nereușite, vi se va solicita să deblocați tableta cu ajutorul unui cont de e-mail.\n\n Încercați din nou peste <xliff:g id="NUMBER_2">%3$d</xliff:g> (de) secunde."</string> - <string name="kg_failed_attempts_almost_at_login" product="default" msgid="1437638152015574839">"Ați desenat incorect modelul pentru deblocare de <xliff:g id="NUMBER_0">%1$d</xliff:g> ori. După încă <xliff:g id="NUMBER_1">%2$d</xliff:g> încercări nereușite, vi se va solicita să deblocați telefonul cu ajutorul unui cont de e-mail.\n\n Încercați din nou peste <xliff:g id="NUMBER_2">%3$d</xliff:g> (de) secunde."</string> + <string name="kg_failed_attempts_almost_at_login" product="tablet" msgid="3253575572118914370">"Ați desenat incorect modelul pentru deblocare de <xliff:g id="NUMBER_0">%1$d</xliff:g> ori. După încă <xliff:g id="NUMBER_1">%2$d</xliff:g> încercări nereușite, vi se va solicita să deblocați tableta cu ajutorul unui cont de e-mail.\n\n Încercați din nou peste <xliff:g id="NUMBER_2">%3$d</xliff:g> secunde."</string> + <string name="kg_failed_attempts_almost_at_login" product="default" msgid="1437638152015574839">"Ați desenat incorect modelul pentru deblocare de <xliff:g id="NUMBER_0">%1$d</xliff:g> ori. După încă <xliff:g id="NUMBER_1">%2$d</xliff:g> încercări nereușite, vi se va solicita să deblocați telefonul cu ajutorul unui cont de e-mail.\n\n Încercați din nou peste <xliff:g id="NUMBER_2">%3$d</xliff:g> secunde."</string> <string name="kg_password_wrong_pin_code_pukked" msgid="30531039455764924">"Codul PIN pentru cardul SIM este incorect. Contactați operatorul pentru a vă debloca dispozitivul."</string> <plurals name="kg_password_wrong_pin_code" formatted="false" msgid="6721575017538162249"> <item quantity="few">Codul PIN pentru cardul SIM este incorect. V-au mai rămas <xliff:g id="NUMBER_1">%d</xliff:g> încercări.</item> diff --git a/packages/Keyguard/res/values-ru/strings.xml b/packages/Keyguard/res/values-ru/strings.xml index 264e42ce6095..7466c6616032 100644 --- a/packages/Keyguard/res/values-ru/strings.xml +++ b/packages/Keyguard/res/values-ru/strings.xml @@ -46,11 +46,6 @@ <string name="keyguard_sim_locked_message" msgid="6875773413306380902">"SIM-карта заблокирована"</string> <string name="keyguard_sim_puk_locked_message" msgid="3747232467471801633">"Для разблокировки SIM-карты требуется PUK-код."</string> <string name="keyguard_sim_unlock_progress_dialog_message" msgid="7975221805033614426">"Разблокировка SIM-карты…"</string> - <string name="keyguard_accessibility_pattern_unlock" msgid="1490840706075246612">"Графический ключ"</string> - <string name="keyguard_accessibility_pin_unlock" msgid="2469687111784035046">"PIN-код"</string> - <string name="keyguard_accessibility_password_unlock" msgid="7675777623912155089">"Пароль"</string> - <string name="keyguard_accessibility_pattern_area" msgid="7679891324509597904">"Область ввода графического ключа"</string> - <string name="keyguard_accessibility_slide_area" msgid="6736064494019979544">"Область слайдера"</string> <string name="keyguard_accessibility_pin_area" msgid="7903959476607833485">"PIN-код"</string> <string name="keyguard_accessibility_sim_pin_area" msgid="3887780775111719336">"PIN-код SIM-карты"</string> <string name="keyguard_accessibility_sim_puk_area" msgid="1880823406954996207">"PUK-код SIM-карты"</string> diff --git a/packages/Keyguard/res/values-si-rLK/strings.xml b/packages/Keyguard/res/values-si-rLK/strings.xml index 607e8acd51b4..5f96e8c3f860 100644 --- a/packages/Keyguard/res/values-si-rLK/strings.xml +++ b/packages/Keyguard/res/values-si-rLK/strings.xml @@ -46,11 +46,6 @@ <string name="keyguard_sim_locked_message" msgid="6875773413306380902">"SIM පත අගුළු දමා ඇත."</string> <string name="keyguard_sim_puk_locked_message" msgid="3747232467471801633">"SIM පත PUK අගුළු ලා ඇත."</string> <string name="keyguard_sim_unlock_progress_dialog_message" msgid="7975221805033614426">"SIM පත අගුළු හරිමින්..."</string> - <string name="keyguard_accessibility_pattern_unlock" msgid="1490840706075246612">"රටා අගුළු ඇරීම."</string> - <string name="keyguard_accessibility_pin_unlock" msgid="2469687111784035046">"PIN අගුළු ඇරීම."</string> - <string name="keyguard_accessibility_password_unlock" msgid="7675777623912155089">"මුරපද අගුළු ඇරීම."</string> - <string name="keyguard_accessibility_pattern_area" msgid="7679891324509597904">"රටා ප්රදේශය."</string> - <string name="keyguard_accessibility_slide_area" msgid="6736064494019979544">"සර්පණ ප්රදේශය."</string> <string name="keyguard_accessibility_pin_area" msgid="7903959476607833485">"PIN කොටස"</string> <string name="keyguard_accessibility_sim_pin_area" msgid="3887780775111719336">"SIM PIN කොටස"</string> <string name="keyguard_accessibility_sim_puk_area" msgid="1880823406954996207">"SIM PUK කොටස"</string> diff --git a/packages/Keyguard/res/values-sk/strings.xml b/packages/Keyguard/res/values-sk/strings.xml index 4cbfd51bdf87..82a4f1d46bde 100644 --- a/packages/Keyguard/res/values-sk/strings.xml +++ b/packages/Keyguard/res/values-sk/strings.xml @@ -46,11 +46,6 @@ <string name="keyguard_sim_locked_message" msgid="6875773413306380902">"SIM karta je uzamknutá."</string> <string name="keyguard_sim_puk_locked_message" msgid="3747232467471801633">"SIM karta je uzamknutá pomocou kódu PUK."</string> <string name="keyguard_sim_unlock_progress_dialog_message" msgid="7975221805033614426">"Prebieha odomykanie SIM karty..."</string> - <string name="keyguard_accessibility_pattern_unlock" msgid="1490840706075246612">"Odomknutie vzorom."</string> - <string name="keyguard_accessibility_pin_unlock" msgid="2469687111784035046">"Odomknutie kódom PIN."</string> - <string name="keyguard_accessibility_password_unlock" msgid="7675777623912155089">"Odomknutie heslom."</string> - <string name="keyguard_accessibility_pattern_area" msgid="7679891324509597904">"Oblasť na zadanie bezpečnostného vzoru."</string> - <string name="keyguard_accessibility_slide_area" msgid="6736064494019979544">"Oblasť na prejdenie prstom."</string> <string name="keyguard_accessibility_pin_area" msgid="7903959476607833485">"Oblasť kódu PIN"</string> <string name="keyguard_accessibility_sim_pin_area" msgid="3887780775111719336">"Oblasť kódu PIN SIM karty"</string> <string name="keyguard_accessibility_sim_puk_area" msgid="1880823406954996207">"Oblasť kódu PUK SIM karty"</string> diff --git a/packages/Keyguard/res/values-sl/strings.xml b/packages/Keyguard/res/values-sl/strings.xml index 91083f50bd8b..9100bd3e62ce 100644 --- a/packages/Keyguard/res/values-sl/strings.xml +++ b/packages/Keyguard/res/values-sl/strings.xml @@ -46,11 +46,6 @@ <string name="keyguard_sim_locked_message" msgid="6875773413306380902">"Kartica SIM je zaklenjena."</string> <string name="keyguard_sim_puk_locked_message" msgid="3747232467471801633">"Kartica SIM je zaklenjena s kodo PUK."</string> <string name="keyguard_sim_unlock_progress_dialog_message" msgid="7975221805033614426">"Odklepanje kartice SIM …"</string> - <string name="keyguard_accessibility_pattern_unlock" msgid="1490840706075246612">"Odklepanje z vzorcem."</string> - <string name="keyguard_accessibility_pin_unlock" msgid="2469687111784035046">"Odklepanje s kodo PIN."</string> - <string name="keyguard_accessibility_password_unlock" msgid="7675777623912155089">"Odklepanje z geslom."</string> - <string name="keyguard_accessibility_pattern_area" msgid="7679891324509597904">"Območje vzorca."</string> - <string name="keyguard_accessibility_slide_area" msgid="6736064494019979544">"Območje podrsanja."</string> <string name="keyguard_accessibility_pin_area" msgid="7903959476607833485">"Območje za kodo PIN"</string> <string name="keyguard_accessibility_sim_pin_area" msgid="3887780775111719336">"Območje za kodo PIN za SIM"</string> <string name="keyguard_accessibility_sim_puk_area" msgid="1880823406954996207">"Območje za kodo PUK za SIM"</string> diff --git a/packages/Keyguard/res/values-sq-rAL/strings.xml b/packages/Keyguard/res/values-sq-rAL/strings.xml index 7f4becbda4f0..31d31b79c76b 100644 --- a/packages/Keyguard/res/values-sq-rAL/strings.xml +++ b/packages/Keyguard/res/values-sq-rAL/strings.xml @@ -46,11 +46,6 @@ <string name="keyguard_sim_locked_message" msgid="6875773413306380902">"Karta SIM është e kyçur."</string> <string name="keyguard_sim_puk_locked_message" msgid="3747232467471801633">"Karta SIM është e kyçur me PUK."</string> <string name="keyguard_sim_unlock_progress_dialog_message" msgid="7975221805033614426">"Po shkyç kartën SIM…"</string> - <string name="keyguard_accessibility_pattern_unlock" msgid="1490840706075246612">"Shkyçje me motiv."</string> - <string name="keyguard_accessibility_pin_unlock" msgid="2469687111784035046">"Shkyçje me PIN."</string> - <string name="keyguard_accessibility_password_unlock" msgid="7675777623912155089">"Shkyçja e fjalëkalimit."</string> - <string name="keyguard_accessibility_pattern_area" msgid="7679891324509597904">"Zona e motivit."</string> - <string name="keyguard_accessibility_slide_area" msgid="6736064494019979544">"Zonën e rrëshqitjes."</string> <string name="keyguard_accessibility_pin_area" msgid="7903959476607833485">"Zona PIN"</string> <string name="keyguard_accessibility_sim_pin_area" msgid="3887780775111719336">"Zona PIN e kartës SIM"</string> <string name="keyguard_accessibility_sim_puk_area" msgid="1880823406954996207">"Zona e PUK-ut të kartës SIM"</string> diff --git a/packages/Keyguard/res/values-sr/strings.xml b/packages/Keyguard/res/values-sr/strings.xml index 62614a6fd5df..840cae79665a 100644 --- a/packages/Keyguard/res/values-sr/strings.xml +++ b/packages/Keyguard/res/values-sr/strings.xml @@ -46,11 +46,6 @@ <string name="keyguard_sim_locked_message" msgid="6875773413306380902">"SIM картица је закључана."</string> <string name="keyguard_sim_puk_locked_message" msgid="3747232467471801633">"SIM картица је закључана PUK кодом."</string> <string name="keyguard_sim_unlock_progress_dialog_message" msgid="7975221805033614426">"Откључавање SIM картице…"</string> - <string name="keyguard_accessibility_pattern_unlock" msgid="1490840706075246612">"Откључавање шаблоном."</string> - <string name="keyguard_accessibility_pin_unlock" msgid="2469687111784035046">"Откључавање PIN-ом."</string> - <string name="keyguard_accessibility_password_unlock" msgid="7675777623912155089">"Откључавање лозинком."</string> - <string name="keyguard_accessibility_pattern_area" msgid="7679891324509597904">"Област шаблона."</string> - <string name="keyguard_accessibility_slide_area" msgid="6736064494019979544">"Област превлачења."</string> <string name="keyguard_accessibility_pin_area" msgid="7903959476607833485">"Област за PIN"</string> <string name="keyguard_accessibility_sim_pin_area" msgid="3887780775111719336">"Област за PIN за SIM"</string> <string name="keyguard_accessibility_sim_puk_area" msgid="1880823406954996207">"Област за PUK за SIM"</string> diff --git a/packages/Keyguard/res/values-sv/strings.xml b/packages/Keyguard/res/values-sv/strings.xml index 378f0474c28e..527c8e65b384 100644 --- a/packages/Keyguard/res/values-sv/strings.xml +++ b/packages/Keyguard/res/values-sv/strings.xml @@ -46,11 +46,6 @@ <string name="keyguard_sim_locked_message" msgid="6875773413306380902">"SIM-kortet är låst."</string> <string name="keyguard_sim_puk_locked_message" msgid="3747232467471801633">"SIM-kortet är PUK-låst."</string> <string name="keyguard_sim_unlock_progress_dialog_message" msgid="7975221805033614426">"Låser upp SIM-kort …"</string> - <string name="keyguard_accessibility_pattern_unlock" msgid="1490840706075246612">"Lås upp med grafiskt lösenord."</string> - <string name="keyguard_accessibility_pin_unlock" msgid="2469687111784035046">"Lås upp med PIN-kod."</string> - <string name="keyguard_accessibility_password_unlock" msgid="7675777623912155089">"Lås upp med lösenord."</string> - <string name="keyguard_accessibility_pattern_area" msgid="7679891324509597904">"Fält för grafiskt lösenord."</string> - <string name="keyguard_accessibility_slide_area" msgid="6736064494019979544">"Fält med dragreglage."</string> <string name="keyguard_accessibility_pin_area" msgid="7903959476607833485">"Pinkodsområde"</string> <string name="keyguard_accessibility_sim_pin_area" msgid="3887780775111719336">"Pinkodsområde för SIM-kort"</string> <string name="keyguard_accessibility_sim_puk_area" msgid="1880823406954996207">"PUK-kodsområde för SIM-kort"</string> diff --git a/packages/Keyguard/res/values-sw/strings.xml b/packages/Keyguard/res/values-sw/strings.xml index b570e9f9f4eb..c2e7ac9f8824 100644 --- a/packages/Keyguard/res/values-sw/strings.xml +++ b/packages/Keyguard/res/values-sw/strings.xml @@ -46,11 +46,6 @@ <string name="keyguard_sim_locked_message" msgid="6875773413306380902">"SIM kadi imefungwa."</string> <string name="keyguard_sim_puk_locked_message" msgid="3747232467471801633">"SIM kadi imefungwa na PUK."</string> <string name="keyguard_sim_unlock_progress_dialog_message" msgid="7975221805033614426">"Inafungua SIM kadi..."</string> - <string name="keyguard_accessibility_pattern_unlock" msgid="1490840706075246612">"Kufungua kwa ruwaza."</string> - <string name="keyguard_accessibility_pin_unlock" msgid="2469687111784035046">"Kufungua kwa PIN."</string> - <string name="keyguard_accessibility_password_unlock" msgid="7675777623912155089">"Kufungua kwa nenosiri."</string> - <string name="keyguard_accessibility_pattern_area" msgid="7679891324509597904">"Eneo la ruwaza."</string> - <string name="keyguard_accessibility_slide_area" msgid="6736064494019979544">"Eneo la slaidi."</string> <string name="keyguard_accessibility_pin_area" msgid="7903959476607833485">"Eneo la PIN"</string> <string name="keyguard_accessibility_sim_pin_area" msgid="3887780775111719336">"Eneo la PIN ya SIM"</string> <string name="keyguard_accessibility_sim_puk_area" msgid="1880823406954996207">"Eneo la PUK ya SIM"</string> diff --git a/packages/Keyguard/res/values-ta-rIN/strings.xml b/packages/Keyguard/res/values-ta-rIN/strings.xml index 2e3f588955fd..c80ddce068c3 100644 --- a/packages/Keyguard/res/values-ta-rIN/strings.xml +++ b/packages/Keyguard/res/values-ta-rIN/strings.xml @@ -46,11 +46,6 @@ <string name="keyguard_sim_locked_message" msgid="6875773413306380902">"சிம் கார்டு பூட்டப்பட்டுள்ளது."</string> <string name="keyguard_sim_puk_locked_message" msgid="3747232467471801633">"சிம் கார்டு PUK ஆல் பூட்டப்பட்டது."</string> <string name="keyguard_sim_unlock_progress_dialog_message" msgid="7975221805033614426">"சிம் கார்டின் தடையைநீக்குகிறது..."</string> - <string name="keyguard_accessibility_pattern_unlock" msgid="1490840706075246612">"வடிவம் மூலம் திறத்தல்."</string> - <string name="keyguard_accessibility_pin_unlock" msgid="2469687111784035046">"Pin மூலம் திறத்தல்."</string> - <string name="keyguard_accessibility_password_unlock" msgid="7675777623912155089">"கடவுச்சொல் மூலம் திறத்தல்."</string> - <string name="keyguard_accessibility_pattern_area" msgid="7679891324509597904">"வடிவப் பகுதி."</string> - <string name="keyguard_accessibility_slide_area" msgid="6736064494019979544">"ஸ்லைடு பகுதி."</string> <string name="keyguard_accessibility_pin_area" msgid="7903959476607833485">"PIN பகுதி"</string> <string name="keyguard_accessibility_sim_pin_area" msgid="3887780775111719336">"சிம் PIN பகுதி"</string> <string name="keyguard_accessibility_sim_puk_area" msgid="1880823406954996207">"சிம் PUK பகுதி"</string> diff --git a/packages/Keyguard/res/values-te-rIN/strings.xml b/packages/Keyguard/res/values-te-rIN/strings.xml index 6c521aad79c4..a72a85b1851e 100644 --- a/packages/Keyguard/res/values-te-rIN/strings.xml +++ b/packages/Keyguard/res/values-te-rIN/strings.xml @@ -46,11 +46,6 @@ <string name="keyguard_sim_locked_message" msgid="6875773413306380902">"సిమ్ కార్డు లాక్ చేయబడింది."</string> <string name="keyguard_sim_puk_locked_message" msgid="3747232467471801633">"సిమ్ కార్డు PUK లాక్ చేయబడింది."</string> <string name="keyguard_sim_unlock_progress_dialog_message" msgid="7975221805033614426">"సిమ్ కార్డును అన్లాక్ చేస్తోంది…"</string> - <string name="keyguard_accessibility_pattern_unlock" msgid="1490840706075246612">"నమూనా అన్లాక్."</string> - <string name="keyguard_accessibility_pin_unlock" msgid="2469687111784035046">"పిన్ అన్లాక్."</string> - <string name="keyguard_accessibility_password_unlock" msgid="7675777623912155089">"పాస్వర్డ్ అన్లాక్."</string> - <string name="keyguard_accessibility_pattern_area" msgid="7679891324509597904">"నమూనా ప్రాంతం."</string> - <string name="keyguard_accessibility_slide_area" msgid="6736064494019979544">"స్లయిడ్ ప్రాంతం."</string> <string name="keyguard_accessibility_pin_area" msgid="7903959476607833485">"PIN ప్రాంతం"</string> <string name="keyguard_accessibility_sim_pin_area" msgid="3887780775111719336">"SIM PIN ప్రాంతం"</string> <string name="keyguard_accessibility_sim_puk_area" msgid="1880823406954996207">"SIM PUK ప్రాంతం"</string> diff --git a/packages/Keyguard/res/values-th/strings.xml b/packages/Keyguard/res/values-th/strings.xml index 1799fe8ddec5..e094d3503f2d 100644 --- a/packages/Keyguard/res/values-th/strings.xml +++ b/packages/Keyguard/res/values-th/strings.xml @@ -46,11 +46,6 @@ <string name="keyguard_sim_locked_message" msgid="6875773413306380902">"ซิมการ์ดถูกล็อก"</string> <string name="keyguard_sim_puk_locked_message" msgid="3747232467471801633">"ซิมการ์ดถูกล็อกด้วย PUK"</string> <string name="keyguard_sim_unlock_progress_dialog_message" msgid="7975221805033614426">"กำลังปลดล็อกซิมการ์ด…"</string> - <string name="keyguard_accessibility_pattern_unlock" msgid="1490840706075246612">"การปลดล็อกด้วยรูปแบบ"</string> - <string name="keyguard_accessibility_pin_unlock" msgid="2469687111784035046">"การปลดล็อกด้วย PIN"</string> - <string name="keyguard_accessibility_password_unlock" msgid="7675777623912155089">"การปลดล็อกด้วยรหัสผ่าน"</string> - <string name="keyguard_accessibility_pattern_area" msgid="7679891324509597904">"พื้นที่สำหรับรูปแบบ"</string> - <string name="keyguard_accessibility_slide_area" msgid="6736064494019979544">"พื้นที่สำหรับการเลื่อน"</string> <string name="keyguard_accessibility_pin_area" msgid="7903959476607833485">"พื้นที่ PIN"</string> <string name="keyguard_accessibility_sim_pin_area" msgid="3887780775111719336">"พื้นที่ PIN ของซิม"</string> <string name="keyguard_accessibility_sim_puk_area" msgid="1880823406954996207">"พื้นที่ PUK ของซิม"</string> diff --git a/packages/Keyguard/res/values-tl/strings.xml b/packages/Keyguard/res/values-tl/strings.xml index 39cad7274c39..73492e2621b8 100644 --- a/packages/Keyguard/res/values-tl/strings.xml +++ b/packages/Keyguard/res/values-tl/strings.xml @@ -46,11 +46,6 @@ <string name="keyguard_sim_locked_message" msgid="6875773413306380902">"Naka-lock ang SIM card."</string> <string name="keyguard_sim_puk_locked_message" msgid="3747232467471801633">"Naka-lock ang SIM card gamit ang PUK."</string> <string name="keyguard_sim_unlock_progress_dialog_message" msgid="7975221805033614426">"Ina-unlock ang SIM card…"</string> - <string name="keyguard_accessibility_pattern_unlock" msgid="1490840706075246612">"Pag-unlock ng pattern."</string> - <string name="keyguard_accessibility_pin_unlock" msgid="2469687111784035046">"Pag-unlock ng pin."</string> - <string name="keyguard_accessibility_password_unlock" msgid="7675777623912155089">"Pag-unlock ng password."</string> - <string name="keyguard_accessibility_pattern_area" msgid="7679891324509597904">"Bahagi ng pattern."</string> - <string name="keyguard_accessibility_slide_area" msgid="6736064494019979544">"Bahagi ng slide."</string> <string name="keyguard_accessibility_pin_area" msgid="7903959476607833485">"Lugar ng PIN"</string> <string name="keyguard_accessibility_sim_pin_area" msgid="3887780775111719336">"Lugar ng PIN ng SIM"</string> <string name="keyguard_accessibility_sim_puk_area" msgid="1880823406954996207">"Lugar ng PUK ng SIM"</string> diff --git a/packages/Keyguard/res/values-tr/strings.xml b/packages/Keyguard/res/values-tr/strings.xml index ffcbd12cf158..3ef07056a434 100644 --- a/packages/Keyguard/res/values-tr/strings.xml +++ b/packages/Keyguard/res/values-tr/strings.xml @@ -46,11 +46,6 @@ <string name="keyguard_sim_locked_message" msgid="6875773413306380902">"SIM kart kilitli."</string> <string name="keyguard_sim_puk_locked_message" msgid="3747232467471801633">"SIM kart PUK kilidi devrede."</string> <string name="keyguard_sim_unlock_progress_dialog_message" msgid="7975221805033614426">"SIM kart kilidi açılıyor…"</string> - <string name="keyguard_accessibility_pattern_unlock" msgid="1490840706075246612">"Desenle kilit açma."</string> - <string name="keyguard_accessibility_pin_unlock" msgid="2469687111784035046">"Pin koduyla kilit açma."</string> - <string name="keyguard_accessibility_password_unlock" msgid="7675777623912155089">"Şifreyle kilit açma."</string> - <string name="keyguard_accessibility_pattern_area" msgid="7679891324509597904">"Desen alanı."</string> - <string name="keyguard_accessibility_slide_area" msgid="6736064494019979544">"Kaydırma alanı."</string> <string name="keyguard_accessibility_pin_area" msgid="7903959476607833485">"PIN alanı"</string> <string name="keyguard_accessibility_sim_pin_area" msgid="3887780775111719336">"SIM PIN alanı"</string> <string name="keyguard_accessibility_sim_puk_area" msgid="1880823406954996207">"SIM PUK alanı"</string> diff --git a/packages/Keyguard/res/values-uk/strings.xml b/packages/Keyguard/res/values-uk/strings.xml index be19281fec33..a50868960a8c 100644 --- a/packages/Keyguard/res/values-uk/strings.xml +++ b/packages/Keyguard/res/values-uk/strings.xml @@ -46,11 +46,6 @@ <string name="keyguard_sim_locked_message" msgid="6875773413306380902">"SIM-карту заблоковано."</string> <string name="keyguard_sim_puk_locked_message" msgid="3747232467471801633">"SIM-карту заблоковано PUK-кодом."</string> <string name="keyguard_sim_unlock_progress_dialog_message" msgid="7975221805033614426">"Розблокування SIM-карти…"</string> - <string name="keyguard_accessibility_pattern_unlock" msgid="1490840706075246612">"Розблокування ключем."</string> - <string name="keyguard_accessibility_pin_unlock" msgid="2469687111784035046">"Розблокування PIN-кодом."</string> - <string name="keyguard_accessibility_password_unlock" msgid="7675777623912155089">"Розблокування паролем."</string> - <string name="keyguard_accessibility_pattern_area" msgid="7679891324509597904">"Область ключа."</string> - <string name="keyguard_accessibility_slide_area" msgid="6736064494019979544">"Область повзунка."</string> <string name="keyguard_accessibility_pin_area" msgid="7903959476607833485">"PIN-код"</string> <string name="keyguard_accessibility_sim_pin_area" msgid="3887780775111719336">"PIN-код SIM-карти"</string> <string name="keyguard_accessibility_sim_puk_area" msgid="1880823406954996207">"PUK-код SIM-карти"</string> diff --git a/packages/Keyguard/res/values-ur-rPK/strings.xml b/packages/Keyguard/res/values-ur-rPK/strings.xml index 63f4e85034f2..1070d58a8dc5 100644 --- a/packages/Keyguard/res/values-ur-rPK/strings.xml +++ b/packages/Keyguard/res/values-ur-rPK/strings.xml @@ -46,11 +46,6 @@ <string name="keyguard_sim_locked_message" msgid="6875773413306380902">"SIM کارڈ مقفل ہے۔"</string> <string name="keyguard_sim_puk_locked_message" msgid="3747232467471801633">"SIM کارڈ PUK-مقفل ہے۔"</string> <string name="keyguard_sim_unlock_progress_dialog_message" msgid="7975221805033614426">"SIM کارڈ غیر مقفل کیا جا رہا ہے…"</string> - <string name="keyguard_accessibility_pattern_unlock" msgid="1490840706075246612">"پیٹرن کے ذریعے غیر مقفل کریں۔"</string> - <string name="keyguard_accessibility_pin_unlock" msgid="2469687111784035046">"پن کے ذریعے غیر مقفل کریں۔"</string> - <string name="keyguard_accessibility_password_unlock" msgid="7675777623912155089">"پاس ورڈ کے ذریعہ غیر مقفل کریں۔"</string> - <string name="keyguard_accessibility_pattern_area" msgid="7679891324509597904">"پیٹرن کا علاقہ۔"</string> - <string name="keyguard_accessibility_slide_area" msgid="6736064494019979544">"سلائیڈ کرنے کا علاقہ۔"</string> <string name="keyguard_accessibility_pin_area" msgid="7903959476607833485">"PIN کا علاقہ"</string> <string name="keyguard_accessibility_sim_pin_area" msgid="3887780775111719336">"SIM PIN کا علاقہ"</string> <string name="keyguard_accessibility_sim_puk_area" msgid="1880823406954996207">"SIM PUK کا علاقہ"</string> diff --git a/packages/Keyguard/res/values-uz-rUZ/strings.xml b/packages/Keyguard/res/values-uz-rUZ/strings.xml index ad71a56651c3..a9df331487e6 100644 --- a/packages/Keyguard/res/values-uz-rUZ/strings.xml +++ b/packages/Keyguard/res/values-uz-rUZ/strings.xml @@ -46,11 +46,6 @@ <string name="keyguard_sim_locked_message" msgid="6875773413306380902">"SIM karta qulflangan."</string> <string name="keyguard_sim_puk_locked_message" msgid="3747232467471801633">"SIM karta PUK kod bilan qulflangan."</string> <string name="keyguard_sim_unlock_progress_dialog_message" msgid="7975221805033614426">"SIM karta qulfi ochilmoqda…"</string> - <string name="keyguard_accessibility_pattern_unlock" msgid="1490840706075246612">"Grafik kalit bilan ochish."</string> - <string name="keyguard_accessibility_pin_unlock" msgid="2469687111784035046">"Pin qulfini ochish."</string> - <string name="keyguard_accessibility_password_unlock" msgid="7675777623912155089">"Parolli qulfni ochish."</string> - <string name="keyguard_accessibility_pattern_area" msgid="7679891324509597904">"Grafik kalit chiziladigan hudud."</string> - <string name="keyguard_accessibility_slide_area" msgid="6736064494019979544">"Maydonni silang"</string> <string name="keyguard_accessibility_pin_area" msgid="7903959476607833485">"PIN-kod maydoni"</string> <string name="keyguard_accessibility_sim_pin_area" msgid="3887780775111719336">"SIM karta PIN kodi maydoni"</string> <string name="keyguard_accessibility_sim_puk_area" msgid="1880823406954996207">"SIM karta PUK kodi maydoni"</string> diff --git a/packages/Keyguard/res/values-vi/strings.xml b/packages/Keyguard/res/values-vi/strings.xml index ad3da9fbf32d..c6d2bd808e8b 100644 --- a/packages/Keyguard/res/values-vi/strings.xml +++ b/packages/Keyguard/res/values-vi/strings.xml @@ -46,11 +46,6 @@ <string name="keyguard_sim_locked_message" msgid="6875773413306380902">"Thẻ SIM đã bị khóa."</string> <string name="keyguard_sim_puk_locked_message" msgid="3747232467471801633">"Thẻ SIM đã bị khóa PUK."</string> <string name="keyguard_sim_unlock_progress_dialog_message" msgid="7975221805033614426">"Đang mở khóa thẻ SIM…"</string> - <string name="keyguard_accessibility_pattern_unlock" msgid="1490840706075246612">"Mở khóa bằng hình."</string> - <string name="keyguard_accessibility_pin_unlock" msgid="2469687111784035046">"Mở khóa bằng mã pin."</string> - <string name="keyguard_accessibility_password_unlock" msgid="7675777623912155089">"Mở khóa bằng mật khẩu."</string> - <string name="keyguard_accessibility_pattern_area" msgid="7679891324509597904">"Khu vực hình."</string> - <string name="keyguard_accessibility_slide_area" msgid="6736064494019979544">"Khu vực trượt."</string> <string name="keyguard_accessibility_pin_area" msgid="7903959476607833485">"Khu vực mã PIN"</string> <string name="keyguard_accessibility_sim_pin_area" msgid="3887780775111719336">"Khu vực mã PIN của SIM"</string> <string name="keyguard_accessibility_sim_puk_area" msgid="1880823406954996207">"Khu vực PUK của SIM"</string> diff --git a/packages/Keyguard/res/values-zh-rCN/strings.xml b/packages/Keyguard/res/values-zh-rCN/strings.xml index 274d9e69492e..0723ab19e7b6 100644 --- a/packages/Keyguard/res/values-zh-rCN/strings.xml +++ b/packages/Keyguard/res/values-zh-rCN/strings.xml @@ -46,11 +46,6 @@ <string name="keyguard_sim_locked_message" msgid="6875773413306380902">"SIM卡已被锁定。"</string> <string name="keyguard_sim_puk_locked_message" msgid="3747232467471801633">"SIM卡已被PUK码锁定。"</string> <string name="keyguard_sim_unlock_progress_dialog_message" msgid="7975221805033614426">"正在解锁SIM卡..."</string> - <string name="keyguard_accessibility_pattern_unlock" msgid="1490840706075246612">"图案解锁。"</string> - <string name="keyguard_accessibility_pin_unlock" msgid="2469687111784035046">"PIN码解锁。"</string> - <string name="keyguard_accessibility_password_unlock" msgid="7675777623912155089">"密码解锁。"</string> - <string name="keyguard_accessibility_pattern_area" msgid="7679891324509597904">"图案区域。"</string> - <string name="keyguard_accessibility_slide_area" msgid="6736064494019979544">"滑动区域。"</string> <string name="keyguard_accessibility_pin_area" msgid="7903959476607833485">"PIN 码区域"</string> <string name="keyguard_accessibility_sim_pin_area" msgid="3887780775111719336">"SIM 卡 PIN 码区域"</string> <string name="keyguard_accessibility_sim_puk_area" msgid="1880823406954996207">"SIM 卡 PUK 码区域"</string> diff --git a/packages/Keyguard/res/values-zh-rHK/strings.xml b/packages/Keyguard/res/values-zh-rHK/strings.xml index 7d511540d7ec..5b1903b4b961 100644 --- a/packages/Keyguard/res/values-zh-rHK/strings.xml +++ b/packages/Keyguard/res/values-zh-rHK/strings.xml @@ -46,11 +46,6 @@ <string name="keyguard_sim_locked_message" msgid="6875773413306380902">"SIM 卡處於鎖定狀態。"</string> <string name="keyguard_sim_puk_locked_message" msgid="3747232467471801633">"SIM 卡處於 PUK 鎖定狀態。"</string> <string name="keyguard_sim_unlock_progress_dialog_message" msgid="7975221805033614426">"正在解開上鎖的 SIM 卡..."</string> - <string name="keyguard_accessibility_pattern_unlock" msgid="1490840706075246612">"圖案解鎖。"</string> - <string name="keyguard_accessibility_pin_unlock" msgid="2469687111784035046">"PIN 解鎖。"</string> - <string name="keyguard_accessibility_password_unlock" msgid="7675777623912155089">"密碼解鎖。"</string> - <string name="keyguard_accessibility_pattern_area" msgid="7679891324509597904">"圖案區域。"</string> - <string name="keyguard_accessibility_slide_area" msgid="6736064494019979544">"滑動區域。"</string> <string name="keyguard_accessibility_pin_area" msgid="7903959476607833485">"PIN 區域"</string> <string name="keyguard_accessibility_sim_pin_area" msgid="3887780775111719336">"SIM PIN 區域"</string> <string name="keyguard_accessibility_sim_puk_area" msgid="1880823406954996207">"SIM PUK 區域"</string> diff --git a/packages/Keyguard/res/values-zh-rTW/strings.xml b/packages/Keyguard/res/values-zh-rTW/strings.xml index 50895f3da3b9..388f8e17872a 100644 --- a/packages/Keyguard/res/values-zh-rTW/strings.xml +++ b/packages/Keyguard/res/values-zh-rTW/strings.xml @@ -46,11 +46,6 @@ <string name="keyguard_sim_locked_message" msgid="6875773413306380902">"SIM 卡處於鎖定狀態。"</string> <string name="keyguard_sim_puk_locked_message" msgid="3747232467471801633">"SIM 卡處於 PUK 鎖定狀態"</string> <string name="keyguard_sim_unlock_progress_dialog_message" msgid="7975221805033614426">"正在解除 SIM 卡鎖定..."</string> - <string name="keyguard_accessibility_pattern_unlock" msgid="1490840706075246612">"圖案解鎖。"</string> - <string name="keyguard_accessibility_pin_unlock" msgid="2469687111784035046">"PIN 解鎖。"</string> - <string name="keyguard_accessibility_password_unlock" msgid="7675777623912155089">"密碼解鎖。"</string> - <string name="keyguard_accessibility_pattern_area" msgid="7679891324509597904">"圖案區域。"</string> - <string name="keyguard_accessibility_slide_area" msgid="6736064494019979544">"滑動區域。"</string> <string name="keyguard_accessibility_pin_area" msgid="7903959476607833485">"PIN 區"</string> <string name="keyguard_accessibility_sim_pin_area" msgid="3887780775111719336">"SIM 卡 PIN 區"</string> <string name="keyguard_accessibility_sim_puk_area" msgid="1880823406954996207">"SIM 卡 PUK 區"</string> diff --git a/packages/Keyguard/res/values-zu/strings.xml b/packages/Keyguard/res/values-zu/strings.xml index c5f2a85bd4b8..a9b62634548a 100644 --- a/packages/Keyguard/res/values-zu/strings.xml +++ b/packages/Keyguard/res/values-zu/strings.xml @@ -46,11 +46,6 @@ <string name="keyguard_sim_locked_message" msgid="6875773413306380902">"Ikhadi le-SIM likhiyiwe."</string> <string name="keyguard_sim_puk_locked_message" msgid="3747232467471801633">"Ikhadi le-SIM likhiywe nge-PUK."</string> <string name="keyguard_sim_unlock_progress_dialog_message" msgid="7975221805033614426">"Ivula ikhadi le-SIM..."</string> - <string name="keyguard_accessibility_pattern_unlock" msgid="1490840706075246612">"Ukuvula ngephethini."</string> - <string name="keyguard_accessibility_pin_unlock" msgid="2469687111784035046">"Ukuvula ngephinikhodi."</string> - <string name="keyguard_accessibility_password_unlock" msgid="7675777623912155089">"Ukuvula ngephasiwedi."</string> - <string name="keyguard_accessibility_pattern_area" msgid="7679891324509597904">"Indawo yephethini."</string> - <string name="keyguard_accessibility_slide_area" msgid="6736064494019979544">"Indawo yokushelelisa."</string> <string name="keyguard_accessibility_pin_area" msgid="7903959476607833485">"Indawo yephinikhodi"</string> <string name="keyguard_accessibility_sim_pin_area" msgid="3887780775111719336">"Indawo yephinikhodi ye-SIM"</string> <string name="keyguard_accessibility_sim_puk_area" msgid="1880823406954996207">"Indawo ye-SIM PUK"</string> diff --git a/packages/Keyguard/src/com/android/keyguard/KeyguardSecurityView.java b/packages/Keyguard/src/com/android/keyguard/KeyguardSecurityView.java index aa74940492f2..829084202f5a 100644 --- a/packages/Keyguard/src/com/android/keyguard/KeyguardSecurityView.java +++ b/packages/Keyguard/src/com/android/keyguard/KeyguardSecurityView.java @@ -49,11 +49,6 @@ public interface KeyguardSecurityView { int PROMPT_REASON_AFTER_LOCKOUT = 5; /** - * Some auth is required because a single wrong credential has been tried. - */ - int PROMPT_REASON_WRONG_CREDENTIAL = 6; - - /** * Interface back to keyguard to tell it when security * @param callback */ diff --git a/packages/Keyguard/src/com/android/keyguard/KeyguardUpdateMonitor.java b/packages/Keyguard/src/com/android/keyguard/KeyguardUpdateMonitor.java index 1b83ccdefe62..0a862914b14f 100644 --- a/packages/Keyguard/src/com/android/keyguard/KeyguardUpdateMonitor.java +++ b/packages/Keyguard/src/com/android/keyguard/KeyguardUpdateMonitor.java @@ -444,7 +444,7 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener { } } - private void handleFingerprintAuthenticated() { + private void handleFingerprintAuthenticated(int authUserId) { Trace.beginSection("KeyGuardUpdateMonitor#handlerFingerPrintAuthenticated"); try { final int userId; @@ -454,6 +454,10 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener { Log.e(TAG, "Failed to get current user id: ", e); return; } + if (userId != authUserId) { + Log.d(TAG, "Fingerprint authenticated for wrong user: " + authUserId); + return; + } if (isFingerprintDisabled(userId)) { Log.d(TAG, "Fingerprint disabled by DPM for userId: " + userId); return; @@ -745,7 +749,7 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener { @Override public void onAuthenticationSucceeded(AuthenticationResult result) { Trace.beginSection("KeyguardUpdateMonitor#onAuthenticationSucceeded"); - handleFingerprintAuthenticated(); + handleFingerprintAuthenticated(result.getUserId()); Trace.endSection(); } diff --git a/packages/SystemUI/res/layout/tv_pip_controls.xml b/packages/SystemUI/res/layout/tv_pip_controls.xml index 0a2f32048e02..49119fb2bda8 100644 --- a/packages/SystemUI/res/layout/tv_pip_controls.xml +++ b/packages/SystemUI/res/layout/tv_pip_controls.xml @@ -41,5 +41,6 @@ android:layout_height="wrap_content" android:layout_marginStart="-50dp" android:src="@drawable/ic_pause_white_24dp" - android:text="@string/pip_pause" /> + android:text="@string/pip_pause" + android:visibility="gone" /> </merge> diff --git a/packages/SystemUI/res/layout/volume_zen_footer.xml b/packages/SystemUI/res/layout/volume_zen_footer.xml index ea26bba89432..775b1576b763 100644 --- a/packages/SystemUI/res/layout/volume_zen_footer.xml +++ b/packages/SystemUI/res/layout/volume_zen_footer.xml @@ -18,7 +18,8 @@ android:id="@+id/volume_zen_footer" android:layout_width="match_parent" android:layout_height="wrap_content" - android:orientation="vertical" > <!-- extends LinearLayout --> + android:orientation="vertical" + android:paddingBottom="8dp" > <!-- extends LinearLayout --> <View android:id="@+id/zen_embedded_divider" diff --git a/packages/SystemUI/res/values-fi/strings.xml b/packages/SystemUI/res/values-fi/strings.xml index f292c2b454f0..5ff50be1aa23 100644 --- a/packages/SystemUI/res/values-fi/strings.xml +++ b/packages/SystemUI/res/values-fi/strings.xml @@ -603,7 +603,7 @@ <string name="keycode_description" msgid="1403795192716828949">"Näppäinkoodi-painikkeet sallivat näppäimistön näppäimien lisäämisen navigointipalkkiin. Kun painiketta painetaan, se jäljittelee valittua näppäintä. Valitse ensin painikkeen kohteena oleva näppäin, sitten painikkeessa näkyvä kuva."</string> <string name="select_keycode" msgid="7413765103381924584">"Valitse näppäimistön näppäin"</string> <string name="preview" msgid="9077832302472282938">"Esikatselu"</string> - <string name="drag_to_add_tiles" msgid="7058945779098711293">"Lisää osioita vetämällä."</string> + <string name="drag_to_add_tiles" msgid="7058945779098711293">"Lisää osioita vetämällä"</string> <string name="drag_to_remove_tiles" msgid="3361212377437088062">"Poista vetämällä tähän."</string> <string name="qs_edit" msgid="2232596095725105230">"Muokkaa"</string> <string name="tuner_time" msgid="6572217313285536011">"Aika"</string> diff --git a/packages/SystemUI/res/values-fr/strings.xml b/packages/SystemUI/res/values-fr/strings.xml index d89e1c17afea..447255ba85d2 100644 --- a/packages/SystemUI/res/values-fr/strings.xml +++ b/packages/SystemUI/res/values-fr/strings.xml @@ -314,7 +314,7 @@ <string name="quick_settings_notifications_label" msgid="4818156442169154523">"Notifications"</string> <string name="quick_settings_flashlight_label" msgid="2133093497691661546">"Lampe de poche"</string> <string name="quick_settings_cellular_detail_title" msgid="8575062783675171695">"Données mobiles"</string> - <string name="quick_settings_cellular_detail_data_usage" msgid="1964260360259312002">"Consommation des données"</string> + <string name="quick_settings_cellular_detail_data_usage" msgid="1964260360259312002">"Conso des données"</string> <string name="quick_settings_cellular_detail_remaining_data" msgid="722715415543541249">"Données restantes"</string> <string name="quick_settings_cellular_detail_over_limit" msgid="967669665390990427">"Limite dépassée"</string> <string name="quick_settings_cellular_detail_data_used" msgid="1476810587475761478">"<xliff:g id="DATA_USED">%s</xliff:g> utilisés"</string> diff --git a/packages/SystemUI/res/values-vi/strings.xml b/packages/SystemUI/res/values-vi/strings.xml index 1eaa9a3f7bff..930eebe9ad10 100644 --- a/packages/SystemUI/res/values-vi/strings.xml +++ b/packages/SystemUI/res/values-vi/strings.xml @@ -310,7 +310,7 @@ <string name="quick_settings_tethering_label" msgid="7153452060448575549">"Đang dùng làm điểm truy cập Internet"</string> <string name="quick_settings_hotspot_label" msgid="6046917934974004879">"Điểm phát sóng"</string> <string name="quick_settings_notifications_label" msgid="4818156442169154523">"Thông báo"</string> - <string name="quick_settings_flashlight_label" msgid="2133093497691661546">"Đèn nháy"</string> + <string name="quick_settings_flashlight_label" msgid="2133093497691661546">"Đèn pin"</string> <string name="quick_settings_cellular_detail_title" msgid="8575062783675171695">"Dữ liệu di động"</string> <string name="quick_settings_cellular_detail_data_usage" msgid="1964260360259312002">"Sử dụng dữ liệu"</string> <string name="quick_settings_cellular_detail_remaining_data" msgid="722715415543541249">"Dữ liệu còn lại"</string> diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java b/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java index a39c194bbda2..433fd00b765a 100644 --- a/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java +++ b/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java @@ -86,7 +86,6 @@ import java.util.List; import static android.provider.Settings.System.SCREEN_OFF_TIMEOUT; import static com.android.internal.widget.LockPatternUtils.StrongAuthTracker.SOME_AUTH_REQUIRED_AFTER_USER_REQUEST; -import static com.android.internal.widget.LockPatternUtils.StrongAuthTracker.SOME_AUTH_REQUIRED_AFTER_WRONG_CREDENTIAL; import static com.android.internal.widget.LockPatternUtils.StrongAuthTracker.STRONG_AUTH_REQUIRED_AFTER_DPM_LOCK_NOW; import static com.android.internal.widget.LockPatternUtils.StrongAuthTracker.STRONG_AUTH_REQUIRED_AFTER_LOCKOUT; @@ -614,10 +613,7 @@ public class KeyguardViewMediator extends SystemUI { return KeyguardSecurityView.PROMPT_REASON_USER_REQUEST; } else if (any && (strongAuth & STRONG_AUTH_REQUIRED_AFTER_LOCKOUT) != 0) { return KeyguardSecurityView.PROMPT_REASON_AFTER_LOCKOUT; - } else if (trust && (strongAuth & SOME_AUTH_REQUIRED_AFTER_WRONG_CREDENTIAL) != 0) { - return KeyguardSecurityView.PROMPT_REASON_WRONG_CREDENTIAL; } - return KeyguardSecurityView.PROMPT_REASON_NONE; } }; diff --git a/packages/SystemUI/src/com/android/systemui/qs/QSContainer.java b/packages/SystemUI/src/com/android/systemui/qs/QSContainer.java index ac90ce73fa03..19a5d522f530 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/QSContainer.java +++ b/packages/SystemUI/src/com/android/systemui/qs/QSContainer.java @@ -237,6 +237,10 @@ public class QSContainer extends FrameLayout { mQSPanel.setListening(mListening && mQsExpanded); } + public void setHeaderListening(boolean listening) { + mHeader.setListening(listening); + } + public void setQsExpansion(float expansion, float headerTranslation) { if (DEBUG) Log.d(TAG, "setQSExpansion " + expansion + " " + headerTranslation); mQsExpansion = expansion; diff --git a/packages/SystemUI/src/com/android/systemui/qs/QSPanel.java b/packages/SystemUI/src/com/android/systemui/qs/QSPanel.java index 385b8350cb45..fef89305e553 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/QSPanel.java +++ b/packages/SystemUI/src/com/android/systemui/qs/QSPanel.java @@ -246,10 +246,12 @@ public class QSPanel extends LinearLayout implements Tunable, Callback { if (mListening) { refreshAllTiles(); } - if (listening) { - mBrightnessController.registerCallbacks(); - } else { - mBrightnessController.unregisterCallbacks(); + if (mBrightnessView.getVisibility() == View.VISIBLE) { + if (listening) { + mBrightnessController.registerCallbacks(); + } else { + mBrightnessController.unregisterCallbacks(); + } } } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/KeyguardAffordanceView.java b/packages/SystemUI/src/com/android/systemui/statusbar/KeyguardAffordanceView.java index 0b1984defe07..88f37a320926 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/KeyguardAffordanceView.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/KeyguardAffordanceView.java @@ -147,7 +147,7 @@ public class KeyguardAffordanceView extends ImageView { @Override protected void onDraw(Canvas canvas) { - mSupportHardware = false;//canvas.isHardwareAccelerated(); + mSupportHardware = canvas.isHardwareAccelerated(); drawBackgroundCircle(canvas); canvas.save(); canvas.scale(mImageScale, mImageScale, getWidth() / 2, getHeight() / 2); 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 d3ab392d5644..f4b41bbf8eca 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelView.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelView.java @@ -1617,6 +1617,9 @@ public class NotificationPanelView extends PanelView implements if (mQsExpanded) { onQsExpansionStarted(); } + // Since there are QS tiles in the header now, we need to make sure we start listening + // immediately so they can be up to date. + mQsContainer.setHeaderListening(true); } @Override diff --git a/packages/SystemUI/src/com/android/systemui/volume/VolumeDialog.java b/packages/SystemUI/src/com/android/systemui/volume/VolumeDialog.java index 37ea66a9048f..4aa14e205b04 100644 --- a/packages/SystemUI/src/com/android/systemui/volume/VolumeDialog.java +++ b/packages/SystemUI/src/com/android/systemui/volume/VolumeDialog.java @@ -495,7 +495,7 @@ public class VolumeDialog implements TunerService.Tunable { mMotion.startDismiss(new Runnable() { @Override public void run() { - updateExpandedH(false); + updateExpandedH(false /* expanding */, true /* dismissing */); } }); if (mAccessibilityMgr.isEnabled()) { @@ -541,45 +541,47 @@ public class VolumeDialog implements TunerService.Tunable { mHandler.sendEmptyMessageDelayed(H.UPDATE_BOTTOM_MARGIN, getConservativeCollapseDuration()); } - private void updateExpandedH(final boolean expanded) { + private void updateExpandedH(final boolean expanded, final boolean dismissing) { if (mExpanded == expanded) return; mExpanded = expanded; mExpandButtonAnimationRunning = isAttached(); if (D.BUG) Log.d(TAG, "updateExpandedH " + expanded); updateExpandButtonH(); updateFooterH(); + TransitionManager.endTransitions(mDialogView); 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) { - } + if (!dismissing) { + 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 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 onTransitionCancel(Transition transition) { + } - @Override - public void onTransitionPause(Transition transition) { - } + @Override + public void onTransitionPause(Transition transition) { + mWindow.setLayout( + mWindow.getAttributes().width, ViewGroup.LayoutParams.WRAP_CONTENT); + } - @Override - public void onTransitionResume(Transition transition) { - } - }); - TransitionManager.endTransitions(mDialogView); - TransitionManager.beginDelayedTransition(mDialogView, transition); + @Override + public void onTransitionResume(Transition transition) { + } + }); + TransitionManager.beginDelayedTransition(mDialogView, transition); + } updateRowsH(activeRow); rescheduleTimeoutH(); } @@ -1029,7 +1031,7 @@ public class VolumeDialog implements TunerService.Tunable { if (mExpandButtonAnimationRunning) return; final boolean newExpand = !mExpanded; Events.writeEvent(mContext, Events.EVENT_EXPAND, newExpand); - updateExpandedH(newExpand); + updateExpandedH(newExpand, false /* dismissing */); } }; diff --git a/packages/WallpaperBackup/src/com/android/wallpaperbackup/WallpaperBackupAgent.java b/packages/WallpaperBackup/src/com/android/wallpaperbackup/WallpaperBackupAgent.java index 82b305087707..242eca8898ce 100644 --- a/packages/WallpaperBackup/src/com/android/wallpaperbackup/WallpaperBackupAgent.java +++ b/packages/WallpaperBackup/src/com/android/wallpaperbackup/WallpaperBackupAgent.java @@ -34,6 +34,8 @@ import android.os.UserHandle; import android.util.Slog; import android.util.Xml; +import libcore.io.IoUtils; + import org.xmlpull.v1.XmlPullParser; import java.io.File; @@ -112,56 +114,58 @@ public class WallpaperBackupAgent extends BackupAgent { touch.close(); fullBackupFile(empty, data); - // only back up the wallpaper if we've been told it's allowed - if (mWm.isWallpaperBackupEligible()) { - if (DEBUG) { - Slog.v(TAG, "Wallpaper is backup-eligible"); - } + SharedPreferences prefs = getSharedPreferences(PREFS_NAME, Context.MODE_PRIVATE); + final int lastSysGeneration = prefs.getInt(SYSTEM_GENERATION, -1); + final int lastLockGeneration = prefs.getInt(LOCK_GENERATION, -1); - SharedPreferences prefs = getSharedPreferences(PREFS_NAME, Context.MODE_PRIVATE); - final int lastSysGeneration = prefs.getInt(SYSTEM_GENERATION, -1); - final int lastLockGeneration = prefs.getInt(LOCK_GENERATION, -1); + final int sysGeneration = + mWm.getWallpaperIdForUser(FLAG_SYSTEM, UserHandle.USER_SYSTEM); + final int lockGeneration = + mWm.getWallpaperIdForUser(FLAG_LOCK, UserHandle.USER_SYSTEM); + final boolean sysChanged = (sysGeneration != lastSysGeneration); + final boolean lockChanged = (lockGeneration != lastLockGeneration); - final int sysGeneration = - mWm.getWallpaperIdForUser(FLAG_SYSTEM, UserHandle.USER_SYSTEM); - final int lockGeneration = - mWm.getWallpaperIdForUser(FLAG_LOCK, UserHandle.USER_SYSTEM); - final boolean sysChanged = (sysGeneration != lastSysGeneration); - final boolean lockChanged = (lockGeneration != lastLockGeneration); + final boolean sysEligible = mWm.isWallpaperBackupEligible(FLAG_SYSTEM); + final boolean lockEligible = mWm.isWallpaperBackupEligible(FLAG_LOCK); - if (DEBUG) { - Slog.v(TAG, "sysGen=" + sysGeneration + " : sysChanged=" + sysChanged); - Slog.v(TAG, "lockGen=" + lockGeneration + " : lockChanged=" + lockChanged); - } - if (mWallpaperInfo.exists()) { - if (sysChanged || lockChanged || !infoStage.exists()) { - if (DEBUG) Slog.v(TAG, "New wallpaper configuration; copying"); - FileUtils.copyFileOrThrow(mWallpaperInfo, infoStage); - } - fullBackupFile(infoStage, data); + // There might be a latent lock wallpaper file present but unused: don't + // include it in the backup if that's the case. + ParcelFileDescriptor lockFd = mWm.getWallpaperFile(FLAG_LOCK, UserHandle.USER_SYSTEM); + final boolean hasLockWallpaper = (lockFd != null); + IoUtils.closeQuietly(lockFd); + + if (DEBUG) { + Slog.v(TAG, "sysGen=" + sysGeneration + " : sysChanged=" + sysChanged); + Slog.v(TAG, "lockGen=" + lockGeneration + " : lockChanged=" + lockChanged); + Slog.v(TAG, "sysEligble=" + sysEligible); + Slog.v(TAG, "lockEligible=" + lockEligible); + } + + // only back up the wallpapers if we've been told they're eligible + if ((sysEligible || lockEligible) && mWallpaperInfo.exists()) { + if (sysChanged || lockChanged || !infoStage.exists()) { + if (DEBUG) Slog.v(TAG, "New wallpaper configuration; copying"); + FileUtils.copyFileOrThrow(mWallpaperInfo, infoStage); } - if (mWallpaperFile.exists()) { - if (sysChanged || !imageStage.exists()) { - if (DEBUG) Slog.v(TAG, "New system wallpaper; copying"); - FileUtils.copyFileOrThrow(mWallpaperFile, imageStage); - } - fullBackupFile(imageStage, data); - prefs.edit().putInt(SYSTEM_GENERATION, sysGeneration).apply(); + fullBackupFile(infoStage, data); + } + if (sysEligible && mWallpaperFile.exists()) { + if (sysChanged || !imageStage.exists()) { + if (DEBUG) Slog.v(TAG, "New system wallpaper; copying"); + FileUtils.copyFileOrThrow(mWallpaperFile, imageStage); } + fullBackupFile(imageStage, data); + prefs.edit().putInt(SYSTEM_GENERATION, sysGeneration).apply(); + } - // Don't try to store the lock image if we overran our quota last time - if (mLockWallpaperFile.exists() && !mQuotaExceeded) { - if (lockChanged || !lockImageStage.exists()) { - if (DEBUG) Slog.v(TAG, "New lock wallpaper; copying"); - FileUtils.copyFileOrThrow(mLockWallpaperFile, lockImageStage); - } - fullBackupFile(lockImageStage, data); - prefs.edit().putInt(LOCK_GENERATION, lockGeneration).apply(); - } - } else { - if (DEBUG) { - Slog.v(TAG, "Wallpaper not backup-eligible; writing no data"); + // Don't try to store the lock image if we overran our quota last time + if (lockEligible && hasLockWallpaper && mLockWallpaperFile.exists() && !mQuotaExceeded) { + if (lockChanged || !lockImageStage.exists()) { + if (DEBUG) Slog.v(TAG, "New lock wallpaper; copying"); + FileUtils.copyFileOrThrow(mLockWallpaperFile, lockImageStage); } + fullBackupFile(lockImageStage, data); + prefs.edit().putInt(LOCK_GENERATION, lockGeneration).apply(); } } catch (Exception e) { Slog.e(TAG, "Unable to back up wallpaper", e); @@ -199,15 +203,20 @@ public class WallpaperBackupAgent extends BackupAgent { final File imageStage = new File (filesDir, IMAGE_STAGE); final File lockImageStage = new File (filesDir, LOCK_IMAGE_STAGE); + // If we restored separate lock imagery, the system wallpaper should be + // applied as system-only; but if there's no separate lock image, make + // sure to apply the restored system wallpaper as both. + final int sysWhich = FLAG_SYSTEM | (lockImageStage.exists() ? 0 : FLAG_LOCK); + try { // First off, revert to the factory state - mWm.clear(WallpaperManager.FLAG_SYSTEM | WallpaperManager.FLAG_LOCK); + mWm.clear(FLAG_SYSTEM | FLAG_LOCK); // It is valid for the imagery to be absent; it means that we were not permitted // to back up the original image on the source device, or there was no user-supplied // wallpaper image present. - restoreFromStage(imageStage, infoStage, "wp", WallpaperManager.FLAG_SYSTEM); - restoreFromStage(lockImageStage, infoStage, "kwp", WallpaperManager.FLAG_LOCK); + restoreFromStage(imageStage, infoStage, "wp", sysWhich); + restoreFromStage(lockImageStage, infoStage, "kwp", FLAG_LOCK); } catch (Exception e) { Slog.e(TAG, "Unable to restore wallpaper: " + e.getMessage()); } finally { diff --git a/services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java b/services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java index 4dab0b1374f1..99f14d7c4c00 100644 --- a/services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java +++ b/services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java @@ -21,6 +21,7 @@ import static android.accessibilityservice.AccessibilityServiceInfo.DEFAULT; import android.Manifest; import android.accessibilityservice.AccessibilityService; import android.accessibilityservice.AccessibilityServiceInfo; +import android.accessibilityservice.GestureDescription; import android.accessibilityservice.IAccessibilityServiceClient; import android.accessibilityservice.IAccessibilityServiceConnection; import android.annotation.NonNull; @@ -2752,7 +2753,7 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub { } @Override - public void sendMotionEvents(int sequence, ParceledListSlice events) { + public void sendGesture(int sequence, ParceledListSlice gestureSteps) { synchronized (mLock) { if (mSecurityPolicy.canPerformGestures(this)) { final long endMillis = @@ -2766,9 +2767,16 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub { } } if (mMotionEventInjector != null) { - mMotionEventInjector.injectEvents((List<MotionEvent>) events.getList(), - mServiceInterface, sequence); - return; + List<GestureDescription.GestureStep> steps = gestureSteps.getList(); + List<MotionEvent> events = GestureDescription.MotionEventGenerator + .getMotionEventsFromGestureSteps(steps); + // Confirm that the motion events end with an UP event. + if (events.get(events.size() - 1).getAction() == MotionEvent.ACTION_UP) { + mMotionEventInjector.injectEvents(events, mServiceInterface, sequence); + return; + } else { + Slog.e(LOG_TAG, "Gesture is not well-formed"); + } } else { Slog.e(LOG_TAG, "MotionEventInjector installation timed out"); } diff --git a/services/core/java/com/android/server/AlarmManagerService.java b/services/core/java/com/android/server/AlarmManagerService.java index 03160932063c..20cca16991c9 100644 --- a/services/core/java/com/android/server/AlarmManagerService.java +++ b/services/core/java/com/android/server/AlarmManagerService.java @@ -2699,7 +2699,7 @@ class AlarmManagerService extends SystemService { public void scheduleDateChangedEvent() { Calendar calendar = Calendar.getInstance(); calendar.setTimeInMillis(System.currentTimeMillis()); - calendar.set(Calendar.HOUR, 0); + calendar.set(Calendar.HOUR_OF_DAY, 0); calendar.set(Calendar.MINUTE, 0); calendar.set(Calendar.SECOND, 0); calendar.set(Calendar.MILLISECOND, 0); diff --git a/services/core/java/com/android/server/TwilightCalculator.java b/services/core/java/com/android/server/TwilightCalculator.java deleted file mode 100644 index 5839b1674d63..000000000000 --- a/services/core/java/com/android/server/TwilightCalculator.java +++ /dev/null @@ -1,122 +0,0 @@ -/* - * Copyright (C) 2010 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.android.server; - -import android.text.format.DateUtils; - -/** @hide */ -public class TwilightCalculator { - - /** Value of {@link #mState} if it is currently day */ - public static final int DAY = 0; - - /** Value of {@link #mState} if it is currently night */ - public static final int NIGHT = 1; - - private static final float DEGREES_TO_RADIANS = (float) (Math.PI / 180.0f); - - // element for calculating solar transit. - private static final float J0 = 0.0009f; - - // correction for civil twilight - private static final float ALTIDUTE_CORRECTION_CIVIL_TWILIGHT = -0.104719755f; - - // coefficients for calculating Equation of Center. - private static final float C1 = 0.0334196f; - private static final float C2 = 0.000349066f; - private static final float C3 = 0.000005236f; - - private static final float OBLIQUITY = 0.40927971f; - - // Java time on Jan 1, 2000 12:00 UTC. - private static final long UTC_2000 = 946728000000L; - - /** - * Time of sunset (civil twilight) in milliseconds or -1 in the case the day - * or night never ends. - */ - public long mSunset; - - /** - * Time of sunrise (civil twilight) in milliseconds or -1 in the case the - * day or night never ends. - */ - public long mSunrise; - - /** Current state */ - public int mState; - - /** - * calculates the civil twilight bases on time and geo-coordinates. - * - * @param time time in milliseconds. - * @param latiude latitude in degrees. - * @param longitude latitude in degrees. - */ - public void calculateTwilight(long time, double latiude, double longitude) { - final float daysSince2000 = (float) (time - UTC_2000) / DateUtils.DAY_IN_MILLIS; - - // mean anomaly - final float meanAnomaly = 6.240059968f + daysSince2000 * 0.01720197f; - - // true anomaly - final double trueAnomaly = meanAnomaly + C1 * Math.sin(meanAnomaly) + C2 - * Math.sin(2 * meanAnomaly) + C3 * Math.sin(3 * meanAnomaly); - - // ecliptic longitude - final double solarLng = trueAnomaly + 1.796593063d + Math.PI; - - // solar transit in days since 2000 - final double arcLongitude = -longitude / 360; - float n = Math.round(daysSince2000 - J0 - arcLongitude); - double solarTransitJ2000 = n + J0 + arcLongitude + 0.0053d * Math.sin(meanAnomaly) - + -0.0069d * Math.sin(2 * solarLng); - - // declination of sun - double solarDec = Math.asin(Math.sin(solarLng) * Math.sin(OBLIQUITY)); - - final double latRad = latiude * DEGREES_TO_RADIANS; - - double cosHourAngle = (Math.sin(ALTIDUTE_CORRECTION_CIVIL_TWILIGHT) - Math.sin(latRad) - * Math.sin(solarDec)) / (Math.cos(latRad) * Math.cos(solarDec)); - // The day or night never ends for the given date and location, if this value is out of - // range. - if (cosHourAngle >= 1) { - mState = NIGHT; - mSunset = -1; - mSunrise = -1; - return; - } else if (cosHourAngle <= -1) { - mState = DAY; - mSunset = -1; - mSunrise = -1; - return; - } - - float hourAngle = (float) (Math.acos(cosHourAngle) / (2 * Math.PI)); - - mSunset = Math.round((solarTransitJ2000 + hourAngle) * DateUtils.DAY_IN_MILLIS) + UTC_2000; - mSunrise = Math.round((solarTransitJ2000 - hourAngle) * DateUtils.DAY_IN_MILLIS) + UTC_2000; - - if (mSunrise < time && mSunset > time) { - mState = DAY; - } else { - mState = NIGHT; - } - } - -} diff --git a/services/core/java/com/android/server/UiModeManagerService.java b/services/core/java/com/android/server/UiModeManagerService.java index 6f713cdfebbe..bb5f62bd4abf 100644 --- a/services/core/java/com/android/server/UiModeManagerService.java +++ b/services/core/java/com/android/server/UiModeManagerService.java @@ -16,6 +16,7 @@ package com.android.server; +import android.annotation.Nullable; import android.app.Activity; import android.app.ActivityManager; import android.app.ActivityManagerNative; @@ -155,8 +156,13 @@ final class UiModeManagerService extends SystemService { private final TwilightListener mTwilightListener = new TwilightListener() { @Override - public void onTwilightStateChanged() { - updateTwilight(); + public void onTwilightStateChanged(@Nullable TwilightState state) { + synchronized (mLock) { + if (mNightMode == UiModeManager.MODE_NIGHT_AUTO) { + updateComputedNightModeLocked(); + updateLocked(0, 0); + } + } } }; @@ -344,8 +350,8 @@ final class UiModeManagerService extends SystemService { pw.print(" mSystemReady="); pw.println(mSystemReady); if (mTwilightManager != null) { // We may not have a TwilightManager. - pw.print(" mTwilightService.getCurrentState()="); - pw.println(mTwilightManager.getCurrentState()); + pw.print(" mTwilightService.getLastTwilightState()="); + pw.println(mTwilightManager.getLastTwilightState()); } } } @@ -355,9 +361,6 @@ final class UiModeManagerService extends SystemService { if (phase == SystemService.PHASE_SYSTEM_SERVICES_READY) { synchronized (mLock) { mTwilightManager = getLocalService(TwilightManager.class); - if (mTwilightManager != null) { - mTwilightManager.registerListener(mTwilightListener, mHandler); - } mSystemReady = true; mCarModeEnabled = mDockState == Intent.EXTRA_DOCK_STATE_CAR; updateComputedNightModeLocked(); @@ -411,10 +414,16 @@ final class UiModeManagerService extends SystemService { } if (mNightMode == UiModeManager.MODE_NIGHT_AUTO) { + if (mTwilightManager != null) { + mTwilightManager.registerListener(mTwilightListener, mHandler); + } updateComputedNightModeLocked(); uiMode |= mComputedNightMode ? Configuration.UI_MODE_NIGHT_YES : Configuration.UI_MODE_NIGHT_NO; } else { + if (mTwilightManager != null) { + mTwilightManager.unregisterListener(mTwilightListener); + } uiMode |= mNightMode << 4; } @@ -668,18 +677,9 @@ final class UiModeManagerService extends SystemService { } } - void updateTwilight() { - synchronized (mLock) { - if (mNightMode == UiModeManager.MODE_NIGHT_AUTO) { - updateComputedNightModeLocked(); - updateLocked(0, 0); - } - } - } - private void updateComputedNightModeLocked() { if (mTwilightManager != null) { - TwilightState state = mTwilightManager.getCurrentState(); + TwilightState state = mTwilightManager.getLastTwilightState(); if (state != null) { mComputedNightMode = state.isNight(); } diff --git a/services/core/java/com/android/server/am/ActivityManagerService.java b/services/core/java/com/android/server/am/ActivityManagerService.java index e336ed5e34ab..9e601eb7e07c 100644 --- a/services/core/java/com/android/server/am/ActivityManagerService.java +++ b/services/core/java/com/android/server/am/ActivityManagerService.java @@ -2337,7 +2337,7 @@ public final class ActivityManagerService extends ActivityManagerNative Process.SCHED_OTHER, 0); } } catch (IllegalArgumentException e) { - Slog.e(TAG, "Failed to set scheduling policy, thread does" + Slog.w(TAG, "Failed to set scheduling policy, thread does" + " not exist:\n" + e); } } @@ -3832,6 +3832,15 @@ public final class ActivityManagerService extends ActivityManagerNative app.killedByAm = false; checkTime(startTime, "startProcess: starting to update pids map"); synchronized (mPidsSelfLocked) { + ProcessRecord oldApp; + // If there is already an app occupying that pid that hasn't been cleaned up + if ((oldApp = mPidsSelfLocked.get(startResult.pid)) != null && !app.isolated) { + // Clean up anything relating to this pid first + Slog.w(TAG, "Reusing pid " + startResult.pid + + " while app is still mapped to it"); + cleanUpApplicationRecordLocked(oldApp, false, false, -1, + true /*replacingPid*/); + } this.mPidsSelfLocked.put(startResult.pid, app); if (isActivityProcess) { Message msg = mHandler.obtainMessage(PROC_START_TIMEOUT_MSG); @@ -5047,7 +5056,8 @@ public final class ActivityManagerService extends ActivityManagerNative private final void handleAppDiedLocked(ProcessRecord app, boolean restarting, boolean allowRestart) { int pid = app.pid; - boolean kept = cleanUpApplicationRecordLocked(app, restarting, allowRestart, -1); + boolean kept = cleanUpApplicationRecordLocked(app, restarting, allowRestart, -1, + false /*replacingPid*/); if (!kept && !restarting) { removeLruProcessLocked(app); if (pid > 0) { @@ -12566,23 +12576,38 @@ public final class ActivityManagerService extends ActivityManagerNative synchronized (mPidsSelfLocked) { final int pid = Binder.getCallingPid(); proc = mPidsSelfLocked.get(pid); + if (proc != null && mInVrMode && tid >= 0) { // ensure the tid belongs to the process if (!Process.isThreadInProcess(pid, tid)) { throw new IllegalArgumentException("VR thread does not belong to process"); } - // reset existing VR thread to CFS - if (proc.vrThreadTid != 0) { - Process.setThreadScheduler(proc.vrThreadTid, Process.SCHED_OTHER, 0); + + // reset existing VR thread to CFS if this thread still exists and belongs to + // the calling process + if (proc.vrThreadTid != 0 + && Process.isThreadInProcess(pid, proc.vrThreadTid)) { + try { + Process.setThreadScheduler(proc.vrThreadTid, Process.SCHED_OTHER, 0); + } catch (IllegalArgumentException e) { + // Ignore this. Only occurs in race condition where previous VR thread + // was destroyed during this method call. + } } - // add check to guarantee that tid belongs to pid? + proc.vrThreadTid = tid; + // promote to FIFO now if the tid is non-zero - if (proc.curSchedGroup == ProcessList.SCHED_GROUP_TOP_APP && proc.vrThreadTid > 0) { - Process.setThreadScheduler(proc.vrThreadTid, Process.SCHED_FIFO | Process.SCHED_RESET_ON_FORK, 1); + try { + if (proc.curSchedGroup == ProcessList.SCHED_GROUP_TOP_APP && + proc.vrThreadTid > 0) { + Process.setThreadScheduler(proc.vrThreadTid, + Process.SCHED_FIFO | Process.SCHED_RESET_ON_FORK, 1); + } + } catch (IllegalArgumentException e) { + Slog.e(TAG, "Failed to set scheduling policy, thread does" + + " not exist:\n" + e); } - } else { - //Slog.e("VR_FIFO", "Didn't set thread from setVrThread?"); } } } @@ -16807,7 +16832,8 @@ public final class ActivityManagerService extends ActivityManagerNative * app that was passed in must remain on the process lists. */ private final boolean cleanUpApplicationRecordLocked(ProcessRecord app, - boolean restarting, boolean allowRestart, int index) { + boolean restarting, boolean allowRestart, int index, boolean replacingPid) { + Slog.d(TAG, "cleanUpApplicationRecord -- " + app.pid); if (index >= 0) { removeLruProcessLocked(app); ProcessList.remove(app.pid); @@ -16938,7 +16964,9 @@ public final class ActivityManagerService extends ActivityManagerNative if (!app.persistent || app.isolated) { if (DEBUG_PROCESSES || DEBUG_CLEANUP) Slog.v(TAG_CLEANUP, "Removing non-persistent process during cleanup: " + app); - removeProcessNameLocked(app.processName, app.uid); + if (!replacingPid) { + removeProcessNameLocked(app.processName, app.uid); + } if (mHeavyWeightProcess == app) { mHandler.sendMessage(mHandler.obtainMessage(CANCEL_HEAVY_NOTIFICATION_MSG, mHeavyWeightProcess.userId, 0)); @@ -20343,17 +20371,29 @@ public final class ActivityManagerService extends ActivityManagerNative if (oldSchedGroup != ProcessList.SCHED_GROUP_TOP_APP) { // Switch VR thread for app to SCHED_FIFO if (mInVrMode && app.vrThreadTid != 0) { - Process.setThreadScheduler(app.vrThreadTid, - Process.SCHED_FIFO | Process.SCHED_RESET_ON_FORK, 1); + try { + Process.setThreadScheduler(app.vrThreadTid, + Process.SCHED_FIFO | Process.SCHED_RESET_ON_FORK, 1); + } catch (IllegalArgumentException e) { + // thread died, ignore + } } if (mUseFifoUiScheduling) { // Switch UI pipeline for app to SCHED_FIFO app.savedPriority = Process.getThreadPriority(app.pid); - Process.setThreadScheduler(app.pid, - Process.SCHED_FIFO | Process.SCHED_RESET_ON_FORK, 1); - if (app.renderThreadTid != 0) { - Process.setThreadScheduler(app.renderThreadTid, + try { + Process.setThreadScheduler(app.pid, Process.SCHED_FIFO | Process.SCHED_RESET_ON_FORK, 1); + } catch (IllegalArgumentException e) { + // thread died, ignore + } + if (app.renderThreadTid != 0) { + try { + Process.setThreadScheduler(app.renderThreadTid, + Process.SCHED_FIFO | Process.SCHED_RESET_ON_FORK, 1); + } catch (IllegalArgumentException e) { + // thread died, ignore + } if (DEBUG_OOM_ADJ) { Slog.d("UI_FIFO", "Set RenderThread (TID " + app.renderThreadTid + ") to FIFO"); @@ -20367,7 +20407,11 @@ public final class ActivityManagerService extends ActivityManagerNative // Boost priority for top app UI and render threads Process.setThreadPriority(app.pid, -10); if (app.renderThreadTid != 0) { - Process.setThreadPriority(app.renderThreadTid, -10); + try { + Process.setThreadPriority(app.renderThreadTid, -10); + } catch (IllegalArgumentException e) { + // thread died, ignore + } } } } @@ -21251,7 +21295,7 @@ public final class ActivityManagerService extends ActivityManagerNative // Ignore exceptions. } } - cleanUpApplicationRecordLocked(app, false, true, -1); + cleanUpApplicationRecordLocked(app, false, true, -1, false /*replacingPid*/); mRemovedProcesses.remove(i); if (app.persistent) { diff --git a/services/core/java/com/android/server/am/AppErrors.java b/services/core/java/com/android/server/am/AppErrors.java index 1f156dfd1985..7eff773543c8 100644 --- a/services/core/java/com/android/server/am/AppErrors.java +++ b/services/core/java/com/android/server/am/AppErrors.java @@ -638,7 +638,8 @@ class AppErrors { // Allow restarting for started or bound foreground services that are crashing the // first time. This includes wallpapers. - if (sr.crashCount <= 1 && (sr.isForeground || procIsBoundForeground)) { + if ((data != null) && (sr.crashCount <= 1) + && (sr.isForeground || procIsBoundForeground)) { data.isRestartableForService = true; } } diff --git a/services/core/java/com/android/server/am/BroadcastQueue.java b/services/core/java/com/android/server/am/BroadcastQueue.java index a279290a34be..f78f29c4ac6d 100644 --- a/services/core/java/com/android/server/am/BroadcastQueue.java +++ b/services/core/java/com/android/server/am/BroadcastQueue.java @@ -302,6 +302,11 @@ public final class BroadcastQueue { boolean didSomething = false; final BroadcastRecord br = mPendingBroadcast; if (br != null && br.curApp.pid == app.pid) { + if (br.curApp != app) { + Slog.e(TAG, "App mismatch when sending pending broadcast to " + + app.processName + ", intended target is " + br.curApp.processName); + return false; + } try { mPendingBroadcast = null; processCurBroadcastLocked(br, app); diff --git a/services/core/java/com/android/server/am/RecentTasks.java b/services/core/java/com/android/server/am/RecentTasks.java index 5c05ab64e199..beb863b394af 100644 --- a/services/core/java/com/android/server/am/RecentTasks.java +++ b/services/core/java/com/android/server/am/RecentTasks.java @@ -653,12 +653,17 @@ class RecentTasks extends ArrayList<TaskRecord> { && task.realActivity.equals(tr.realActivity); // If the document is open in another app or is not the same // document, we don't need to trim it. - if (!sameActivity || !sameIntentFilter || multiTasksAllowed) { + if (!sameActivity) { continue; // Otherwise only trim if we are over our max recents for this task - } else if (maxRecents > 0 && !doTrim) { + } else if (maxRecents > 0) { --maxRecents; - continue; + if (!doTrim || !sameIntentFilter || multiTasksAllowed) { + // We don't want to trim if we are not over the max allowed entries and + // the caller doesn't want us to trim, the tasks are not of the same + // intent filter, or multiple entries fot the task is allowed. + continue; + } } // Hit the maximum number of documents for this task. Fall through // and remove this document from recents. diff --git a/services/core/java/com/android/server/connectivity/Tethering.java b/services/core/java/com/android/server/connectivity/Tethering.java index b6c8d5d87b4c..e0d8373fc445 100644 --- a/services/core/java/com/android/server/connectivity/Tethering.java +++ b/services/core/java/com/android/server/connectivity/Tethering.java @@ -1392,6 +1392,8 @@ public class Tethering extends BaseNetworkObserver implements IControlsTethering for (Integer netType : mUpstreamIfaceTypes) { NetworkInfo info = cm.getNetworkInfo(netType.intValue()); + // TODO: if the network is suspended we should consider + // that to be the same as connected here. if ((info != null) && info.isConnected()) { upType = netType.intValue(); break; @@ -1465,6 +1467,10 @@ public class Tethering extends BaseNetworkObserver implements IControlsTethering // it immediately, because there likely will be no second // EVENT_ON_AVAILABLE (it was already received). handleNewUpstreamNetworkState(ns); + } else if (mCurrentUpstreamIface == null) { + // There are no available upstream networks, or none that + // have an IPv4 default route (current metric for success). + handleNewUpstreamNetworkState(null); } } @@ -1639,6 +1645,7 @@ public class Tethering extends BaseNetworkObserver implements IControlsTethering chooseUpstreamType(mTryCell); mTryCell = !mTryCell; } + @Override public void exit() { // TODO: examine if we should check the return value. @@ -1646,7 +1653,9 @@ public class Tethering extends BaseNetworkObserver implements IControlsTethering mUpstreamNetworkMonitor.stop(); stopListeningForSimChanges(); notifyTetheredOfNewUpstreamIface(null); + handleNewUpstreamNetworkState(null); } + @Override public boolean processMessage(Message message) { maybeLogMessage(this, message.what); @@ -1734,6 +1743,7 @@ public class Tethering extends BaseNetworkObserver implements IControlsTethering // reevaluation is triggered via received CONNECTIVITY_ACTION // broadcasts that result in being passed a // TetherMasterSM.CMD_UPSTREAM_CHANGED. + handleNewUpstreamNetworkState(null); break; default: break; diff --git a/services/core/java/com/android/server/connectivity/tethering/IPv6TetheringCoordinator.java b/services/core/java/com/android/server/connectivity/tethering/IPv6TetheringCoordinator.java index 825439786360..e94b584ac48a 100644 --- a/services/core/java/com/android/server/connectivity/tethering/IPv6TetheringCoordinator.java +++ b/services/core/java/com/android/server/connectivity/tethering/IPv6TetheringCoordinator.java @@ -55,7 +55,7 @@ public class IPv6TetheringCoordinator { if (VDBG) { Log.d(TAG, "updateUpstreamNetworkState: " + toDebugString(ns)); } - if (ns == null || ns.network == null) { + if (!canTetherIPv6(ns)) { stopIPv6TetheringOnAllInterfaces(); setUpstreamNetworkState(null); return; @@ -65,8 +65,9 @@ public class IPv6TetheringCoordinator { !ns.network.equals(mUpstreamNetworkState.network)) { stopIPv6TetheringOnAllInterfaces(); } + setUpstreamNetworkState(ns); - maybeUpdateIPv6TetheringInterfaces(); + updateIPv6TetheringInterfaces(); } private void stopIPv6TetheringOnAllInterfaces() { @@ -77,9 +78,10 @@ public class IPv6TetheringCoordinator { } private void setUpstreamNetworkState(NetworkState ns) { - if (!canTetherIPv6(ns)) { + if (ns == null) { mUpstreamNetworkState = null; } else { + // Make a deep copy of the parts we need. mUpstreamNetworkState = new NetworkState( null, new LinkProperties(ns.linkProperties), @@ -94,19 +96,17 @@ public class IPv6TetheringCoordinator { } } - private void maybeUpdateIPv6TetheringInterfaces() { - if (mUpstreamNetworkState == null) return; - + private void updateIPv6TetheringInterfaces() { for (TetherInterfaceStateMachine sm : mNotifyList) { final LinkProperties lp = getInterfaceIPv6LinkProperties(sm.interfaceType()); - if (lp != null) { - sm.sendMessage(TetherInterfaceStateMachine.CMD_IPV6_TETHER_UPDATE, 0, 0, lp); - } + sm.sendMessage(TetherInterfaceStateMachine.CMD_IPV6_TETHER_UPDATE, 0, 0, lp); break; } } private LinkProperties getInterfaceIPv6LinkProperties(int interfaceType) { + if (mUpstreamNetworkState == null) return null; + // NOTE: Here, in future, we would have policies to decide how to divvy // up the available dedicated prefixes among downstream interfaces. // At this time we have no such mechanism--we only support tethering diff --git a/services/core/java/com/android/server/connectivity/tethering/IPv6TetheringInterfaceServices.java b/services/core/java/com/android/server/connectivity/tethering/IPv6TetheringInterfaceServices.java index b47e079395d8..edb4347f56a3 100644 --- a/services/core/java/com/android/server/connectivity/tethering/IPv6TetheringInterfaceServices.java +++ b/services/core/java/com/android/server/connectivity/tethering/IPv6TetheringInterfaceServices.java @@ -16,6 +16,7 @@ package com.android.server.connectivity.tethering; +import android.net.INetd; import android.net.IpPrefix; import android.net.LinkAddress; import android.net.LinkProperties; @@ -27,13 +28,16 @@ import android.net.ip.RouterAdvertisementDaemon.RaParams; import android.os.INetworkManagementService; import android.os.RemoteException; import android.util.Log; +import android.util.Slog; import java.net.Inet6Address; import java.net.InetAddress; import java.net.NetworkInterface; import java.net.SocketException; +import java.net.UnknownHostException; import java.util.ArrayList; import java.util.HashSet; +import java.util.Objects; /** @@ -41,13 +45,15 @@ import java.util.HashSet; */ class IPv6TetheringInterfaceServices { private static final String TAG = IPv6TetheringInterfaceServices.class.getSimpleName(); + private static final IpPrefix LINK_LOCAL_PREFIX = new IpPrefix("fe80::/64"); + private static final int RFC7421_IP_PREFIX_LENGTH = 64; private final String mIfName; private final INetworkManagementService mNMService; private NetworkInterface mNetworkInterface; private byte[] mHwAddr; - private ArrayList<RouteInfo> mLastLocalRoutes; + private LinkProperties mLastIPv6LinkProperties; private RouterAdvertisementDaemon mRaDaemon; private RaParams mLastRaParams; @@ -86,8 +92,7 @@ class IPv6TetheringInterfaceServices { public void stop() { mNetworkInterface = null; mHwAddr = null; - updateLocalRoutes(null); - updateRaParams(null); + setRaParams(null); if (mRaDaemon != null) { mRaDaemon.stop(); @@ -104,95 +109,182 @@ class IPv6TetheringInterfaceServices { public void updateUpstreamIPv6LinkProperties(LinkProperties v6only) { if (mRaDaemon == null) return; - if (v6only == null) { - updateLocalRoutes(null); - updateRaParams(null); + // Avoid unnecessary work on spurious updates. + if (Objects.equals(mLastIPv6LinkProperties, v6only)) { return; } - RaParams params = new RaParams(); - params.mtu = v6only.getMtu(); - params.hasDefaultRoute = v6only.hasIPv6DefaultRoute(); + RaParams params = null; - ArrayList<RouteInfo> localRoutes = new ArrayList<RouteInfo>(); - for (LinkAddress linkAddr : v6only.getLinkAddresses()) { - final IpPrefix prefix = new IpPrefix(linkAddr.getAddress(), - linkAddr.getPrefixLength()); + if (v6only != null) { + params = new RaParams(); + params.mtu = v6only.getMtu(); + params.hasDefaultRoute = v6only.hasIPv6DefaultRoute(); - // Accumulate routes representing "prefixes to be assigned to the - // local interface", for subsequent addition to the local network - // in the routing rules. - localRoutes.add(new RouteInfo(prefix, null, mIfName)); + for (LinkAddress linkAddr : v6only.getLinkAddresses()) { + if (linkAddr.getPrefixLength() != RFC7421_IP_PREFIX_LENGTH) continue; - params.prefixes.add(prefix); + final IpPrefix prefix = new IpPrefix( + linkAddr.getAddress(), linkAddr.getPrefixLength()); + params.prefixes.add(prefix); + + final Inet6Address dnsServer = getLocalDnsIpFor(prefix); + if (dnsServer != null) { + params.dnses.add(dnsServer); + } + } } + // If v6only is null, we pass in null to setRaParams(), which handles + // deprecation of any existing RA data. + + setRaParams(params); + mLastIPv6LinkProperties = v6only; + } - // We need to be able to send unicast RAs, and clients might like to - // ping the default router's link-local address, so add that as well. - localRoutes.add(new RouteInfo(new IpPrefix("fe80::/64"), null, mIfName)); - // TODO: Add a local interface address, update dnsmasq to listen on the - // new address, and use only that address as a DNS server. - for (InetAddress dnsServer : v6only.getDnsServers()) { - if (dnsServer instanceof Inet6Address) { - params.dnses.add((Inet6Address) dnsServer); + private void configureLocalRoutes( + HashSet<IpPrefix> deprecatedPrefixes, HashSet<IpPrefix> newPrefixes) { + // [1] Remove the routes that are deprecated. + if (!deprecatedPrefixes.isEmpty()) { + final ArrayList<RouteInfo> toBeRemoved = getLocalRoutesFor(deprecatedPrefixes); + try { + final int removalFailures = mNMService.removeRoutesFromLocalNetwork(toBeRemoved); + if (removalFailures > 0) { + Log.e(TAG, String.format("Failed to remove %d IPv6 routes from local table.", + removalFailures)); + } + } catch (RemoteException e) { + Log.e(TAG, "Failed to remove IPv6 routes from local table: ", e); } } - updateLocalRoutes(localRoutes); - updateRaParams(params); - } + // [2] Add only the routes that have not previously been added. + if (newPrefixes != null && !newPrefixes.isEmpty()) { + HashSet<IpPrefix> addedPrefixes = (HashSet) newPrefixes.clone(); + if (mLastRaParams != null) { + addedPrefixes.removeAll(mLastRaParams.prefixes); + } - private void updateLocalRoutes(ArrayList<RouteInfo> localRoutes) { - if (localRoutes != null) { - // TODO: Compare with mLastLocalRoutes and take appropriate - // appropriate action on the difference between the two. + if (mLastRaParams == null || mLastRaParams.prefixes.isEmpty()) { + // We need to be able to send unicast RAs, and clients might + // like to ping the default router's link-local address. Note + // that we never remove the link-local route from the network + // until Tethering disables tethering on the interface. We + // only need to add the link-local prefix once, but in the + // event we add it more than once netd silently ignores EEXIST. + addedPrefixes.add(LINK_LOCAL_PREFIX); + } - if (!localRoutes.isEmpty()) { + if (!addedPrefixes.isEmpty()) { + final ArrayList<RouteInfo> toBeAdded = getLocalRoutesFor(addedPrefixes); try { - mNMService.addInterfaceToLocalNetwork(mIfName, localRoutes); + // It's safe to call addInterfaceToLocalNetwork() even if + // the interface is already in the local_network. Note also + // that adding routes that already exist does not cause an + // error (EEXIST is silently ignored). + mNMService.addInterfaceToLocalNetwork(mIfName, toBeAdded); } catch (RemoteException e) { Log.e(TAG, "Failed to add IPv6 routes to local table: ", e); } } - } else { - if (mLastLocalRoutes != null && !mLastLocalRoutes.isEmpty()) { + } + } + + private void configureLocalDns( + HashSet<Inet6Address> deprecatedDnses, HashSet<Inet6Address> newDnses) { + INetd netd = getNetdServiceOrNull(); + if (netd == null) { + if (newDnses != null) newDnses.clear(); + Log.e(TAG, "No netd service instance available; not setting local IPv6 addresses"); + return; + } + + // [1] Remove deprecated local DNS IP addresses. + if (!deprecatedDnses.isEmpty()) { + for (Inet6Address dns : deprecatedDnses) { + final String dnsString = dns.getHostAddress(); try { - final int removalFailures = - mNMService.removeRoutesFromLocalNetwork(mLastLocalRoutes); - if (removalFailures > 0) { - Log.e(TAG, - String.format("Failed to remove %d IPv6 routes from local table.", - removalFailures)); - } + netd.interfaceDelAddress(mIfName, dnsString, RFC7421_IP_PREFIX_LENGTH); } catch (RemoteException e) { - Log.e(TAG, "Failed to remove IPv6 routes from local table: ", e); + Log.e(TAG, "Failed to remove local dns IP: " + dnsString, e); } } } - mLastLocalRoutes = localRoutes; + // [2] Add only the local DNS IP addresses that have not previously been added. + if (newDnses != null && !newDnses.isEmpty()) { + final HashSet<Inet6Address> addedDnses = (HashSet) newDnses.clone(); + if (mLastRaParams != null) { + addedDnses.removeAll(mLastRaParams.dnses); + } + + for (Inet6Address dns : addedDnses) { + final String dnsString = dns.getHostAddress(); + try { + netd.interfaceAddAddress(mIfName, dnsString, RFC7421_IP_PREFIX_LENGTH); + } catch (RemoteException e) { + Log.e(TAG, "Failed to add local dns IP: " + dnsString, e); + newDnses.remove(dns); + } + } + } + + try { + netd.tetherApplyDnsInterfaces(); + } catch (RemoteException e) { + Log.e(TAG, "Failed to update local DNS caching server"); + if (newDnses != null) newDnses.clear(); + } } - private void updateRaParams(RaParams params) { + private void setRaParams(RaParams newParams) { if (mRaDaemon != null) { - HashSet<IpPrefix> deprecated = null; + final RaParams deprecatedParams = + RaParams.getDeprecatedRaParams(mLastRaParams, newParams); - if (mLastRaParams != null) { - deprecated = new HashSet<>(); + configureLocalRoutes(deprecatedParams.prefixes, + (newParams != null) ? newParams.prefixes : null); - for (IpPrefix ipp : mLastRaParams.prefixes) { - if (params == null || !params.prefixes.contains(ipp)) { - deprecated.add(ipp); - } - } - } + configureLocalDns(deprecatedParams.dnses, + (newParams != null) ? newParams.dnses : null); + + mRaDaemon.buildNewRa(deprecatedParams, newParams); + } + + mLastRaParams = newParams; + } + + // Accumulate routes representing "prefixes to be assigned to the local + // interface", for subsequent modification of local_network routing. + private ArrayList<RouteInfo> getLocalRoutesFor(HashSet<IpPrefix> prefixes) { + final ArrayList<RouteInfo> localRoutes = new ArrayList<RouteInfo>(); + for (IpPrefix ipp : prefixes) { + localRoutes.add(new RouteInfo(ipp, null, mIfName)); + } + return localRoutes; + } - // Currently, we send spurious RAs (5) whenever there's any update. - // TODO: Compare params with mLastParams to avoid spurious updates. - mRaDaemon.buildNewRa(params, deprecated); + private INetd getNetdServiceOrNull() { + if (mNMService != null) { + try { + return mNMService.getNetdService(); + } catch (RemoteException ignored) { + // This blocks until netd can be reached, but it can return + // null during a netd crash. + } } + return null; + } - mLastRaParams = params; + // Given a prefix like 2001:db8::/64 return 2001:db8::1. + private static Inet6Address getLocalDnsIpFor(IpPrefix localPrefix) { + final byte[] dnsBytes = localPrefix.getRawAddress(); + dnsBytes[dnsBytes.length - 1] = 0x1; + try { + return Inet6Address.getByAddress(null, dnsBytes, 0); + } catch (UnknownHostException e) { + Slog.wtf(TAG, "Failed to construct Inet6Address from: " + localPrefix); + return null; + } } } diff --git a/services/core/java/com/android/server/display/AutomaticBrightnessController.java b/services/core/java/com/android/server/display/AutomaticBrightnessController.java index c16dac23d4c7..15ae846186fa 100644 --- a/services/core/java/com/android/server/display/AutomaticBrightnessController.java +++ b/services/core/java/com/android/server/display/AutomaticBrightnessController.java @@ -22,6 +22,7 @@ import com.android.server.twilight.TwilightListener; import com.android.server.twilight.TwilightManager; import com.android.server.twilight.TwilightState; +import android.annotation.Nullable; import android.hardware.Sensor; import android.hardware.SensorEvent; import android.hardware.SensorEventListener; @@ -268,7 +269,7 @@ class AutomaticBrightnessController { pw.println(); pw.println("Automatic Brightness Controller State:"); pw.println(" mLightSensor=" + mLightSensor); - pw.println(" mTwilight.getCurrentState()=" + mTwilight.getCurrentState()); + pw.println(" mTwilight.getLastTwilightState()=" + mTwilight.getLastTwilightState()); pw.println(" mLightSensorEnabled=" + mLightSensorEnabled); pw.println(" mLightSensorEnableTime=" + TimeUtils.formatUptime(mLightSensorEnableTime)); pw.println(" mAmbientLux=" + mAmbientLux); @@ -495,12 +496,14 @@ class AutomaticBrightnessController { } if (mUseTwilight) { - TwilightState state = mTwilight.getCurrentState(); + TwilightState state = mTwilight.getLastTwilightState(); if (state != null && state.isNight()) { - final long now = System.currentTimeMillis(); - gamma *= 1 + state.getAmount() * TWILIGHT_ADJUSTMENT_MAX_GAMMA; + final long duration = state.sunriseTimeMillis() - state.sunsetTimeMillis(); + final long progress = System.currentTimeMillis() - state.sunsetTimeMillis(); + final float amount = (float) Math.pow(2.0 * progress / duration - 1.0, 2.0); + gamma *= 1 + amount * TWILIGHT_ADJUSTMENT_MAX_GAMMA; if (DEBUG) { - Slog.d(TAG, "updateAutoBrightness: twilight amount=" + state.getAmount()); + Slog.d(TAG, "updateAutoBrightness: twilight amount=" + amount); } } } @@ -621,7 +624,7 @@ class AutomaticBrightnessController { private final TwilightListener mTwilightListener = new TwilightListener() { @Override - public void onTwilightStateChanged() { + public void onTwilightStateChanged(@Nullable TwilightState state) { updateAutoBrightness(true /*sendUpdate*/); } }; diff --git a/services/core/java/com/android/server/display/NightDisplayService.java b/services/core/java/com/android/server/display/NightDisplayService.java index 39498a62fdcd..07fa2ce01b3b 100644 --- a/services/core/java/com/android/server/display/NightDisplayService.java +++ b/services/core/java/com/android/server/display/NightDisplayService.java @@ -20,6 +20,8 @@ import android.animation.Animator; import android.animation.AnimatorListenerAdapter; import android.animation.TypeEvaluator; import android.animation.ValueAnimator; +import android.annotation.NonNull; +import android.annotation.Nullable; import android.app.AlarmManager; import android.content.BroadcastReceiver; import android.content.ContentResolver; @@ -217,12 +219,12 @@ public final class NightDisplayService extends SystemService if (mIsActivated == null || mIsActivated != activated) { Slog.i(TAG, activated ? "Turning on night display" : "Turning off night display"); - mIsActivated = activated; - if (mAutoMode != null) { mAutoMode.onActivated(activated); } + mIsActivated = activated; + // Cancel the old animator if still running. if (mColorMatrixAnimator != null) { mColorMatrixAnimator.cancel(); @@ -360,13 +362,12 @@ public final class NightDisplayService extends SystemService if (setActivated) { mController.setActivated(activated); } - updateNextAlarm(); + updateNextAlarm(mIsActivated, now); } - private void updateNextAlarm() { - if (mIsActivated != null) { - final Calendar now = Calendar.getInstance(); - final Calendar next = mIsActivated ? mEndTime.getDateTimeAfter(now) + private void updateNextAlarm(@Nullable Boolean activated, @NonNull Calendar now) { + if (activated != null) { + final Calendar next = activated ? mEndTime.getDateTimeAfter(now) : mStartTime.getDateTimeAfter(now); mAlarmManager.setExact(AlarmManager.RTC, next.getTimeInMillis(), TAG, this, null); } @@ -395,8 +396,11 @@ public final class NightDisplayService extends SystemService @Override public void onActivated(boolean activated) { - mLastActivatedTime = Calendar.getInstance(); - updateNextAlarm(); + final Calendar now = Calendar.getInstance(); + if (mIsActivated != null) { + mLastActivatedTime = now; + } + updateNextAlarm(activated, now); } @Override @@ -424,22 +428,30 @@ public final class NightDisplayService extends SystemService private final TwilightManager mTwilightManager; - private boolean mIsNight; + private Calendar mLastActivatedTime; public TwilightAutoMode() { mTwilightManager = getLocalService(TwilightManager.class); } - private void updateActivated() { - final TwilightState state = mTwilightManager.getCurrentState(); + private void updateActivated(TwilightState state) { final boolean isNight = state != null && state.isNight(); - if (mIsNight != isNight) { - mIsNight = isNight; - - if (mIsActivated == null || mIsActivated != isNight) { - mController.setActivated(isNight); + boolean setActivated = mIsActivated == null || mIsActivated != isNight; + if (setActivated && state != null && mLastActivatedTime != null) { + final Calendar sunrise = state.sunrise(); + final Calendar sunset = state.sunset(); + if (sunrise.before(sunset)) { + setActivated = mLastActivatedTime.before(sunrise) + || mLastActivatedTime.after(sunset); + } else { + setActivated = mLastActivatedTime.before(sunset) + || mLastActivatedTime.after(sunrise); } } + + if (setActivated) { + mController.setActivated(isNight); + } } @Override @@ -447,18 +459,26 @@ public final class NightDisplayService extends SystemService mTwilightManager.registerListener(this, mHandler); // Force an update to initialize state. - updateActivated(); + updateActivated(mTwilightManager.getLastTwilightState()); } @Override public void onStop() { mTwilightManager.unregisterListener(this); + mLastActivatedTime = null; + } + + @Override + public void onActivated(boolean activated) { + if (mIsActivated != null) { + mLastActivatedTime = Calendar.getInstance(); + } } @Override - public void onTwilightStateChanged() { + public void onTwilightStateChanged(@Nullable TwilightState state) { if (DEBUG) Slog.d(TAG, "onTwilightStateChanged"); - updateActivated(); + updateActivated(state); } } diff --git a/services/core/java/com/android/server/fingerprint/AuthenticationClient.java b/services/core/java/com/android/server/fingerprint/AuthenticationClient.java index c04b9a1bed0f..87da866603cc 100644 --- a/services/core/java/com/android/server/fingerprint/AuthenticationClient.java +++ b/services/core/java/com/android/server/fingerprint/AuthenticationClient.java @@ -39,9 +39,9 @@ public abstract class AuthenticationClient extends ClientMonitor { public abstract void resetFailedAttempts(); public AuthenticationClient(Context context, long halDeviceId, IBinder token, - IFingerprintServiceReceiver receiver, int callingUserId, int groupId, long opId, + IFingerprintServiceReceiver receiver, int targetUserId, int groupId, long opId, boolean restricted, String owner) { - super(context, halDeviceId, token, receiver, callingUserId, groupId, restricted, owner); + super(context, halDeviceId, token, receiver, targetUserId, groupId, restricted, owner); mOpId = opId; } @@ -65,7 +65,7 @@ public abstract class AuthenticationClient extends ClientMonitor { Fingerprint fp = !getIsRestricted() ? new Fingerprint("" /* TODO */, groupId, fingerId, getHalDeviceId()) : null; - receiver.onAuthenticationSucceeded(getHalDeviceId(), fp); + receiver.onAuthenticationSucceeded(getHalDeviceId(), fp, getTargetUserId()); } } catch (RemoteException e) { Slog.w(TAG, "Failed to notify Authenticated:", e); diff --git a/services/core/java/com/android/server/fingerprint/FingerprintService.java b/services/core/java/com/android/server/fingerprint/FingerprintService.java index df7fcb59b8c0..73c8469ca709 100644 --- a/services/core/java/com/android/server/fingerprint/FingerprintService.java +++ b/services/core/java/com/android/server/fingerprint/FingerprintService.java @@ -536,7 +536,7 @@ public class FingerprintService extends SystemService implements IBinder.DeathRe if (DEBUG) Slog.v(TAG, "startAuthentication(" + opPackageName + ")"); AuthenticationClient client = new AuthenticationClient(getContext(), mHalDeviceId, token, - receiver, callingUserId, groupId, opId, restricted, opPackageName) { + receiver, mCurrentUserId, groupId, opId, restricted, opPackageName) { @Override public boolean handleFailedAttempt() { mFailedAttempts++; diff --git a/services/core/java/com/android/server/net/NetworkPolicyManagerService.java b/services/core/java/com/android/server/net/NetworkPolicyManagerService.java index 8f9cc47f9224..da615ec21720 100644 --- a/services/core/java/com/android/server/net/NetworkPolicyManagerService.java +++ b/services/core/java/com/android/server/net/NetworkPolicyManagerService.java @@ -1074,6 +1074,8 @@ public class NetworkPolicyManagerService extends INetworkPolicyManager.Stub { builder.setTicker(title); builder.setContentTitle(title); builder.setContentText(body); + builder.setDefaults(Notification.DEFAULT_ALL); + builder.setPriority(Notification.PRIORITY_HIGH); final Intent snoozeIntent = buildSnoozeWarningIntent(policy.template); builder.setDeleteIntent(PendingIntent.getBroadcast( diff --git a/services/core/java/com/android/server/notification/ConditionProviders.java b/services/core/java/com/android/server/notification/ConditionProviders.java index 62fe70cf176f..2fab2887c28e 100644 --- a/services/core/java/com/android/server/notification/ConditionProviders.java +++ b/services/core/java/com/android/server/notification/ConditionProviders.java @@ -17,6 +17,8 @@ package com.android.server.notification; import android.annotation.NonNull; +import android.app.INotificationManager; +import android.app.NotificationManager; import android.content.ComponentName; import android.content.ContentResolver; import android.content.Context; @@ -161,6 +163,25 @@ public class ConditionProviders extends ManagedServices { } } + @Override + public void onPackagesChanged(boolean removingPackage, String[] pkgList) { + if (removingPackage) { + INotificationManager inm = NotificationManager.getService(); + + if (pkgList != null && (pkgList.length > 0)) { + for (String pkgName : pkgList) { + try { + inm.removeAutomaticZenRules(pkgName); + inm.setNotificationPolicyAccessGranted(pkgName, false); + } catch (Exception e) { + Slog.e(TAG, "Failed to clean up rules for " + pkgName, e); + } + } + } + } + super.onPackagesChanged(removingPackage, pkgList); + } + public ManagedServiceInfo checkServiceToken(IConditionProvider provider) { synchronized(mMutex) { return checkServiceTokenLocked(provider); diff --git a/services/core/java/com/android/server/notification/ManagedServices.java b/services/core/java/com/android/server/notification/ManagedServices.java index dc85dd7ef40e..14e2ba3896d8 100644 --- a/services/core/java/com/android/server/notification/ManagedServices.java +++ b/services/core/java/com/android/server/notification/ManagedServices.java @@ -217,8 +217,8 @@ abstract public class ManagedServices { return mEnabledServicesPackageNames.contains(pkg); } - public void onPackagesChanged(boolean queryReplace, String[] pkgList) { - if (DEBUG) Slog.d(TAG, "onPackagesChanged queryReplace=" + queryReplace + public void onPackagesChanged(boolean removingPackage, String[] pkgList) { + if (DEBUG) Slog.d(TAG, "onPackagesChanged removingPackage=" + removingPackage + " pkgList=" + (pkgList == null ? null : Arrays.asList(pkgList)) + " mEnabledServicesPackageNames=" + mEnabledServicesPackageNames); boolean anyServicesInvolved = false; @@ -234,7 +234,7 @@ abstract public class ManagedServices { if (anyServicesInvolved) { // if we're not replacing a package, clean up orphaned bits - if (!queryReplace) { + if (removingPackage) { updateSettingsAccordingToInstalledServices(); rebuildRestoredPackages(); } diff --git a/services/core/java/com/android/server/notification/NotificationManagerService.java b/services/core/java/com/android/server/notification/NotificationManagerService.java index 2dbbc88e0599..bb55240fc859 100644 --- a/services/core/java/com/android/server/notification/NotificationManagerService.java +++ b/services/core/java/com/android/server/notification/NotificationManagerService.java @@ -696,9 +696,9 @@ public class NotificationManagerService extends SystemService { int changeUserId = intent.getIntExtra(Intent.EXTRA_USER_HANDLE, UserHandle.USER_ALL); String pkgList[] = null; - boolean queryReplace = queryRemove && - intent.getBooleanExtra(Intent.EXTRA_REPLACING, false); - if (DBG) Slog.i(TAG, "action=" + action + " queryReplace=" + queryReplace); + boolean removingPackage = queryRemove && + !intent.getBooleanExtra(Intent.EXTRA_REPLACING, false); + if (DBG) Slog.i(TAG, "action=" + action + " removing=" + removingPackage); if (action.equals(Intent.ACTION_EXTERNAL_APPLICATIONS_UNAVAILABLE)) { pkgList = intent.getStringArrayExtra(Intent.EXTRA_CHANGED_PACKAGE_LIST); } else if (action.equals(Intent.ACTION_PACKAGES_SUSPENDED)) { @@ -747,10 +747,10 @@ public class NotificationManagerService extends SystemService { } } } - mListeners.onPackagesChanged(queryReplace, pkgList); - mRankerServices.onPackagesChanged(queryReplace, pkgList); - mConditionProviders.onPackagesChanged(queryReplace, pkgList); - mRankingHelper.onPackagesChanged(queryReplace, pkgList); + mListeners.onPackagesChanged(removingPackage, pkgList); + mRankerServices.onPackagesChanged(removingPackage, pkgList); + mConditionProviders.onPackagesChanged(removingPackage, pkgList); + mRankingHelper.onPackagesChanged(removingPackage, pkgList); } } }; @@ -3894,14 +3894,14 @@ public class NotificationManagerService extends SystemService { } @Override - public void onPackagesChanged(boolean queryReplace, String[] pkgList) { - if (DEBUG) Slog.d(TAG, "onPackagesChanged queryReplace=" + queryReplace + public void onPackagesChanged(boolean removingPackage, String[] pkgList) { + if (DEBUG) Slog.d(TAG, "onPackagesChanged removingPackage=" + removingPackage + " pkgList=" + (pkgList == null ? null : Arrays.asList(pkgList))); if (mRankerServicePackageName == null) { return; } - if (pkgList != null && (pkgList.length > 0)) { + if (pkgList != null && (pkgList.length > 0) && !removingPackage) { for (String pkgName : pkgList) { if (mRankerServicePackageName.equals(pkgName)) { registerRanker(); diff --git a/services/core/java/com/android/server/notification/RankingHelper.java b/services/core/java/com/android/server/notification/RankingHelper.java index 78b3f4134dd3..90484027446c 100644 --- a/services/core/java/com/android/server/notification/RankingHelper.java +++ b/services/core/java/com/android/server/notification/RankingHelper.java @@ -504,8 +504,8 @@ public class RankingHelper implements RankingConfig { return packageBans; } - public void onPackagesChanged(boolean queryReplace, String[] pkgList) { - if (queryReplace || pkgList == null || pkgList.length == 0 + public void onPackagesChanged(boolean removingPackage, String[] pkgList) { + if (!removingPackage || pkgList == null || pkgList.length == 0 || mRestoredWithoutUids.isEmpty()) { return; // nothing to do } diff --git a/services/core/java/com/android/server/notification/ZenModeConditions.java b/services/core/java/com/android/server/notification/ZenModeConditions.java index 86ca97d48531..1c12a961ad04 100644 --- a/services/core/java/com/android/server/notification/ZenModeConditions.java +++ b/services/core/java/com/android/server/notification/ZenModeConditions.java @@ -147,6 +147,7 @@ public class ZenModeConditions implements ConditionProviders.Callback { if (mConditionProviders.subscribeIfNecessary(rule.component, rule.conditionId)) { mSubscriptions.put(rule.conditionId, rule.component); } else { + rule.condition = null; if (DEBUG) Log.d(TAG, "zmc failed to subscribe"); } } diff --git a/services/core/java/com/android/server/pm/ShortcutService.java b/services/core/java/com/android/server/pm/ShortcutService.java index 44df9264d748..c1fc7f114c67 100644 --- a/services/core/java/com/android/server/pm/ShortcutService.java +++ b/services/core/java/com/android/server/pm/ShortcutService.java @@ -878,6 +878,9 @@ public class ShortcutService extends IShortcutService.Stub { saveUserInternalLocked(userId, os, /* forBackup= */ false); file.finishWrite(os); + + // Remove all dangling bitmap files. + cleanupDanglingBitmapDirectoriesLocked(userId); } catch (XmlPullParserException | IOException e) { Slog.e(TAG, "Failed to write to file " + file.getBaseFile(), e); file.failWrite(os); @@ -929,7 +932,6 @@ public class ShortcutService extends IShortcutService.Stub { } try { final ShortcutUser ret = loadUserInternal(userId, in, /* forBackup= */ false); - cleanupDanglingBitmapDirectoriesLocked(userId, ret); return ret; } catch (IOException | XmlPullParserException e) { Slog.e(TAG, "Failed to read file " + file.getBaseFile(), e); @@ -1062,9 +1064,22 @@ public class ShortcutService extends IShortcutService.Stub { } } - // Requires mLock held, but "Locked" prefix would look weired so we jsut say "L". + // Requires mLock held, but "Locked" prefix would look weired so we just say "L". protected boolean isUserUnlockedL(@UserIdInt int userId) { - return mUnlockedUsers.get(userId); + // First, check the local copy. + if (mUnlockedUsers.get(userId)) { + return true; + } + // If the local copy says the user is locked, check with AM for the actual state, since + // the user might just have been unlocked. + // Note we just don't use isUserUnlockingOrUnlocked() here, because it'll return false + // when the user is STOPPING, which we still want to consider as "unlocked". + final long token = injectClearCallingIdentity(); + try { + return mUserManager.isUserUnlockingOrUnlocked(userId); + } finally { + injectRestoreCallingIdentity(token); + } } // Requires mLock held, but "Locked" prefix would look weired so we jsut say "L". @@ -1125,14 +1140,8 @@ public class ShortcutService extends IShortcutService.Stub { // === Caller validation === void removeIcon(@UserIdInt int userId, ShortcutInfo shortcut) { - if (shortcut.getBitmapPath() != null) { - if (DEBUG) { - Slog.d(TAG, "Removing " + shortcut.getBitmapPath()); - } - new File(shortcut.getBitmapPath()).delete(); - - shortcut.setBitmapPath(null); - } + // Do not remove the actual bitmap file yet, because if the device crashes before saving + // he XML we'd lose the icon. We just remove all dangling files after saving the XML. shortcut.setIconResourceId(0); shortcut.setIconResName(null); shortcut.clearFlags(ShortcutInfo.FLAG_HAS_ICON_FILE | ShortcutInfo.FLAG_HAS_ICON_RES); @@ -1148,13 +1157,14 @@ public class ShortcutService extends IShortcutService.Stub { } } - private void cleanupDanglingBitmapDirectoriesLocked( - @UserIdInt int userId, @NonNull ShortcutUser user) { + private void cleanupDanglingBitmapDirectoriesLocked(@UserIdInt int userId) { if (DEBUG) { Slog.d(TAG, "cleanupDanglingBitmaps: userId=" + userId); } final long start = injectElapsedRealtime(); + final ShortcutUser user = getUserShortcutsLocked(userId); + final File bitmapDir = getUserBitmapFilePath(userId); final File[] children = bitmapDir.listFiles(); if (children == null) { @@ -2601,17 +2611,9 @@ public class ShortcutService extends IShortcutService.Stub { /* appStillExists = */ false); } } - final long now = injectCurrentTimeMillis(); - - // Then for each installed app, publish manifest shortcuts when needed. - forUpdatedPackages(ownerUserId, user.getLastAppScanTime(), ai -> { - user.rescanPackageIfNeeded(ai.packageName, /* forceRescan=*/ false); - }); - // Write the time just before the scan, because there may be apps that have just - // been updated, and we want to catch them in the next time. - user.setLastAppScanTime(now); - scheduleSaveUser(ownerUserId); + rescanUpdatedPackagesLocked(ownerUserId, user.getLastAppScanTime(), + /* forceRescan=*/ false); } } finally { logDurationStat(Stats.CHECK_PACKAGE_CHANGES, start); @@ -2619,6 +2621,24 @@ public class ShortcutService extends IShortcutService.Stub { verifyStates(); } + private void rescanUpdatedPackagesLocked(@UserIdInt int userId, long lastScanTime, + boolean forceRescan) { + final ShortcutUser user = getUserShortcutsLocked(userId); + + final long now = injectCurrentTimeMillis(); + + // Then for each installed app, publish manifest shortcuts when needed. + forUpdatedPackages(userId, lastScanTime, ai -> { + user.attemptToRestoreIfNeededAndSave(this, ai.packageName, userId); + user.rescanPackageIfNeeded(ai.packageName, forceRescan); + }); + + // Write the time just before the scan, because there may be apps that have just + // been updated, and we want to catch them in the next time. + user.setLastAppScanTime(now); + scheduleSaveUser(userId); + } + private void handlePackageAdded(String packageName, @UserIdInt int userId) { if (DEBUG) { Slog.d(TAG, String.format("handlePackageAdded: %s user=%d", packageName, userId)); @@ -3119,12 +3139,10 @@ public class ShortcutService extends IShortcutService.Stub { } mUsers.put(userId, user); - // Then purge all the save images. - final File bitmapPath = getUserBitmapFilePath(userId); - final boolean success = FileUtils.deleteContents(bitmapPath); - if (!success) { - Slog.w(TAG, "Failed to delete " + bitmapPath); - } + // Rescan all packages to re-publish manifest shortcuts and do other checks. + rescanUpdatedPackagesLocked(userId, + 0, // lastScanTime = 0; rescan all packages. + /* forceRescan= */ true); saveUserLocked(userId); } diff --git a/services/core/java/com/android/server/pm/UserRestrictionsUtils.java b/services/core/java/com/android/server/pm/UserRestrictionsUtils.java index 772c64ea2171..3df13a9c637f 100644 --- a/services/core/java/com/android/server/pm/UserRestrictionsUtils.java +++ b/services/core/java/com/android/server/pm/UserRestrictionsUtils.java @@ -26,11 +26,9 @@ import android.app.ActivityManager; import android.app.ActivityManagerNative; import android.content.ContentResolver; import android.content.Context; -import android.net.Uri; import android.os.Binder; import android.os.Bundle; import android.os.RemoteException; -import android.os.SystemProperties; import android.os.UserHandle; import android.os.UserManager; import android.service.persistentdata.PersistentDataBlockManager; @@ -188,8 +186,7 @@ public class UserRestrictionsUtils { serializer.endTag(null, tag); } - public static void readRestrictions(XmlPullParser parser, Bundle restrictions) - throws IOException { + public static void readRestrictions(XmlPullParser parser, Bundle restrictions) { for (String key : USER_RESTRICTIONS) { final String value = parser.getAttributeValue(null, key); if (value != null) { @@ -437,7 +434,13 @@ public class UserRestrictionsUtils { if (newValue) { PersistentDataBlockManager manager = (PersistentDataBlockManager) context .getSystemService(Context.PERSISTENT_DATA_BLOCK_SERVICE); - if (manager != null && manager.getOemUnlockEnabled()) { + if (manager != null + && manager.getOemUnlockEnabled() + && manager.getFlashLockState() + != PersistentDataBlockManager.FLASH_LOCK_UNLOCKED) { + // Only disable OEM unlock if the bootloader is locked. If it's already + // unlocked, setting the OEM unlock enabled flag to false has no effect + // (the bootloader would remain unlocked). manager.setOemUnlockEnabled(false); } } diff --git a/services/core/java/com/android/server/policy/PhoneWindowManager.java b/services/core/java/com/android/server/policy/PhoneWindowManager.java index 46bf239b9b84..f7454a3a5170 100644 --- a/services/core/java/com/android/server/policy/PhoneWindowManager.java +++ b/services/core/java/com/android/server/policy/PhoneWindowManager.java @@ -7319,8 +7319,8 @@ public class PhoneWindowManager implements WindowManagerPolicy { } private boolean areSystemNavigationKeysEnabled() { - return Settings.Secure.getInt(mContext.getContentResolver(), - Settings.Secure.SYSTEM_NAVIGATION_KEYS_ENABLED, 0) == 1; + return Settings.Secure.getIntForUser(mContext.getContentResolver(), + Settings.Secure.SYSTEM_NAVIGATION_KEYS_ENABLED, 0, UserHandle.USER_CURRENT) == 1; } @Override diff --git a/services/core/java/com/android/server/trust/TrustArchive.java b/services/core/java/com/android/server/trust/TrustArchive.java index fd63d486d049..aaac2979049b 100644 --- a/services/core/java/com/android/server/trust/TrustArchive.java +++ b/services/core/java/com/android/server/trust/TrustArchive.java @@ -37,6 +37,7 @@ public class TrustArchive { private static final int TYPE_AGENT_CONNECTED = 4; private static final int TYPE_AGENT_STOPPED = 5; private static final int TYPE_MANAGING_TRUST = 6; + private static final int TYPE_POLICY_CHANGED = 7; private static final int HISTORY_LIMIT = 200; @@ -99,6 +100,10 @@ public class TrustArchive { addEvent(new Event(TYPE_MANAGING_TRUST, userId, agent, null, 0, 0, managing)); } + public void logDevicePolicyChanged() { + addEvent(new Event(TYPE_POLICY_CHANGED, UserHandle.USER_ALL, null, null, 0, 0, false)); + } + private void addEvent(Event e) { if (mEvents.size() >= HISTORY_LIMIT) { mEvents.removeFirst(); @@ -112,7 +117,8 @@ public class TrustArchive { Iterator<Event> iter = mEvents.descendingIterator(); while (iter.hasNext() && count < limit) { Event ev = iter.next(); - if (userId != UserHandle.USER_ALL && userId != ev.userId) { + if (userId != UserHandle.USER_ALL && userId != ev.userId + && ev.userId != UserHandle.USER_ALL) { continue; } @@ -122,11 +128,13 @@ public class TrustArchive { if (userId == UserHandle.USER_ALL) { writer.print("user="); writer.print(ev.userId); writer.print(", "); } - writer.print("agent="); - if (duplicateSimpleNames) { - writer.print(ev.agent.flattenToShortString()); - } else { - writer.print(getSimpleName(ev.agent)); + if (ev.agent != null) { + writer.print("agent="); + if (duplicateSimpleNames) { + writer.print(ev.agent.flattenToShortString()); + } else { + writer.print(getSimpleName(ev.agent)); + } } switch (ev.type) { case TYPE_GRANT_TRUST: @@ -181,6 +189,8 @@ public class TrustArchive { return "AgentStopped"; case TYPE_MANAGING_TRUST: return "ManagingTrust"; + case TYPE_POLICY_CHANGED: + return "DevicePolicyChanged"; default: return "Unknown(" + type + ")"; } diff --git a/services/core/java/com/android/server/trust/TrustManagerService.java b/services/core/java/com/android/server/trust/TrustManagerService.java index c1868a456641..d9c42541f9f4 100644 --- a/services/core/java/com/android/server/trust/TrustManagerService.java +++ b/services/core/java/com/android/server/trust/TrustManagerService.java @@ -399,12 +399,17 @@ public class TrustManagerService extends SystemService { } void updateDevicePolicyFeatures() { + boolean changed = false; for (int i = 0; i < mActiveAgents.size(); i++) { AgentInfo info = mActiveAgents.valueAt(i); if (info.agent.isConnected()) { info.agent.updateDevicePolicyFeatures(); + changed = true; } } + if (changed) { + mArchive.logDevicePolicyChanged(); + } } private void removeAgentsOfPackage(String packageName) { diff --git a/services/core/java/com/android/server/twilight/TwilightListener.java b/services/core/java/com/android/server/twilight/TwilightListener.java index 29ead445892e..58dcef6cbba2 100644 --- a/services/core/java/com/android/server/twilight/TwilightListener.java +++ b/services/core/java/com/android/server/twilight/TwilightListener.java @@ -16,6 +16,14 @@ package com.android.server.twilight; +import android.annotation.Nullable; + +/** + * Callback for when the twilight state has changed. + */ public interface TwilightListener { - void onTwilightStateChanged(); + /** + * Called when the twilight state has changed. + */ + void onTwilightStateChanged(@Nullable TwilightState state); }
\ No newline at end of file diff --git a/services/core/java/com/android/server/twilight/TwilightManager.java b/services/core/java/com/android/server/twilight/TwilightManager.java index 56137a406757..5ef941730cb7 100644 --- a/services/core/java/com/android/server/twilight/TwilightManager.java +++ b/services/core/java/com/android/server/twilight/TwilightManager.java @@ -1,5 +1,5 @@ /* - * Copyright (C) 2013 The Android Open Source Project + * 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. @@ -16,10 +16,30 @@ package com.android.server.twilight; +import android.annotation.NonNull; import android.os.Handler; +/** + * This class provides sunrise/sunset information based on the device's current location. + */ public interface TwilightManager { - void registerListener(TwilightListener listener, Handler handler); - void unregisterListener(TwilightListener listener); - TwilightState getCurrentState(); + /** + * Register a listener to be notified whenever the twilight state changes. + * + * @param listener the {@link TwilightListener} to be notified + * @param handler the {@link Handler} to use to notify the listener + */ + void registerListener(@NonNull TwilightListener listener, @NonNull Handler handler); + + /** + * Unregisters a previously registered listener. + * + * @param listener the {@link TwilightListener} to be unregistered + */ + void unregisterListener(@NonNull TwilightListener listener); + + /** + * Returns the last {@link TwilightState}, or {@code null} if not available. + */ + TwilightState getLastTwilightState(); } diff --git a/services/core/java/com/android/server/twilight/TwilightService.java b/services/core/java/com/android/server/twilight/TwilightService.java index ee7a4a0d5599..acd65875ffac 100644 --- a/services/core/java/com/android/server/twilight/TwilightService.java +++ b/services/core/java/com/android/server/twilight/TwilightService.java @@ -1,5 +1,5 @@ /* - * Copyright (C) 2012 The Android Open Source Project + * 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. @@ -16,31 +16,27 @@ package com.android.server.twilight; +import android.annotation.NonNull; import android.app.AlarmManager; -import android.app.PendingIntent; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.content.IntentFilter; -import android.location.Criteria; +import android.icu.impl.CalendarAstronomer; +import android.icu.util.Calendar; import android.location.Location; import android.location.LocationListener; import android.location.LocationManager; import android.os.Bundle; import android.os.Handler; +import android.os.Looper; import android.os.Message; -import android.os.SystemClock; -import android.text.format.DateUtils; -import android.text.format.Time; +import android.util.ArrayMap; import android.util.Slog; import com.android.internal.annotations.GuardedBy; import com.android.server.SystemService; -import com.android.server.TwilightCalculator; -import java.util.ArrayList; -import java.util.Iterator; -import java.util.List; import java.util.Objects; /** @@ -49,476 +45,261 @@ import java.util.Objects; * Used by the UI mode manager and other components to adjust night mode * effects based on sunrise and sunset. */ -public final class TwilightService extends SystemService { +public final class TwilightService extends SystemService + implements AlarmManager.OnAlarmListener, Handler.Callback, LocationListener { private static final String TAG = "TwilightService"; private static final boolean DEBUG = false; - private static final String ACTION_UPDATE_TWILIGHT_STATE = - "com.android.server.action.UPDATE_TWILIGHT_STATE"; + private static final int MSG_START_LISTENING = 1; + private static final int MSG_STOP_LISTENING = 2; - /** - * The amount of time after or before sunrise over which to start adjusting twilight affected - * things. We want the change to happen gradually so that it is below the threshold of - * perceptibility and so that the adjustment has and so that the adjustment has - * maximum effect well after dusk. - */ - private static final long TWILIGHT_ADJUSTMENT_TIME = DateUtils.HOUR_IN_MILLIS * 2; + @GuardedBy("mListeners") + private final ArrayMap<TwilightListener, Handler> mListeners = new ArrayMap<>(); - private final Object mLock = new Object(); - - @GuardedBy("mLock") - private final List<TwilightListenerRecord> mListeners = new ArrayList<>(); + private final Handler mHandler; private AlarmManager mAlarmManager; private LocationManager mLocationManager; - private LocationHandler mLocationHandler; - @GuardedBy("mLock") - private TwilightState mTwilightState; + private boolean mBootCompleted; + private boolean mHasListeners; + + private BroadcastReceiver mTimeChangedReceiver; + private Location mLastLocation; + + @GuardedBy("mListeners") + private TwilightState mLastTwilightState; public TwilightService(Context context) { super(context); + mHandler = new Handler(Looper.getMainLooper(), this); } @Override public void onStart() { - mAlarmManager = (AlarmManager) getContext().getSystemService(Context.ALARM_SERVICE); - mLocationManager = (LocationManager) getContext().getSystemService( - Context.LOCATION_SERVICE); - mLocationHandler = new LocationHandler(); - - IntentFilter filter = new IntentFilter(Intent.ACTION_AIRPLANE_MODE_CHANGED); - filter.addAction(Intent.ACTION_TIME_CHANGED); - filter.addAction(Intent.ACTION_TIMEZONE_CHANGED); - filter.addAction(Intent.ACTION_USER_SWITCHED); - getContext().registerReceiver(mReceiver, filter); - - publishLocalService(TwilightManager.class, mService); - } - - @Override - public void onBootPhase(int phase) { - if (phase == PHASE_BOOT_COMPLETED) { - // Initialize the current twilight state. - mLocationHandler.requestTwilightUpdate(); - } - } - - private void setTwilightState(TwilightState state) { - synchronized (mLock) { - if (!Objects.equals(mTwilightState, state)) { - if (DEBUG) { - Slog.d(TAG, "Twilight state changed: " + state); + publishLocalService(TwilightManager.class, new TwilightManager() { + @Override + public void registerListener(@NonNull TwilightListener listener, + @NonNull Handler handler) { + synchronized (mListeners) { + final boolean wasEmpty = mListeners.isEmpty(); + mListeners.put(listener, handler); + + if (wasEmpty && !mListeners.isEmpty()) { + mHandler.sendEmptyMessage(MSG_START_LISTENING); + } } + } - mTwilightState = state; + @Override + public void unregisterListener(@NonNull TwilightListener listener) { + synchronized (mListeners) { + final boolean wasEmpty = mListeners.isEmpty(); + mListeners.remove(listener); - for (TwilightListenerRecord mListener : mListeners) { - mListener.postUpdate(); + if (!wasEmpty && mListeners.isEmpty()) { + mHandler.sendEmptyMessage(MSG_STOP_LISTENING); + } } } - } - } - - private static class TwilightListenerRecord implements Runnable { - - private final TwilightListener mListener; - private final Handler mHandler; - - public TwilightListenerRecord(TwilightListener listener, Handler handler) { - mListener = listener; - mHandler = handler; - } - - public void postUpdate() { - mHandler.post(this); - } - @Override - public void run() { - mListener.onTwilightStateChanged(); - } - } - - private final TwilightManager mService = new TwilightManager() { - @Override - public TwilightState getCurrentState() { - synchronized (mLock) { - return mTwilightState; + @Override + public TwilightState getLastTwilightState() { + synchronized (mListeners) { + return mLastTwilightState; + } } - } + }); + } - @Override - public void registerListener(TwilightListener listener, Handler handler) { - synchronized (mLock) { - mListeners.add(new TwilightListenerRecord(listener, handler)); + @Override + public void onBootPhase(int phase) { + if (phase == PHASE_BOOT_COMPLETED) { + final Context c = getContext(); + mAlarmManager = (AlarmManager) c.getSystemService(Context.ALARM_SERVICE); + mLocationManager = (LocationManager) c.getSystemService(Context.LOCATION_SERVICE); - if (mListeners.size() == 1) { - mLocationHandler.enableLocationUpdates(); - } + mBootCompleted = true; + if (mHasListeners) { + startListening(); } } + } - @Override - public void unregisterListener(TwilightListener listener) { - synchronized (mLock) { - for (int i = 0; i < mListeners.size(); i++) { - if (mListeners.get(i).mListener == listener) { - mListeners.remove(i); + @Override + public boolean handleMessage(Message msg) { + switch (msg.what) { + case MSG_START_LISTENING: + if (!mHasListeners) { + mHasListeners = true; + if (mBootCompleted) { + startListening(); } } - - if (mListeners.size() == 0) { - mLocationHandler.disableLocationUpdates(); + return true; + case MSG_STOP_LISTENING: + if (mHasListeners) { + mHasListeners = false; + if (mBootCompleted) { + stopListening(); + } } - } + return true; } - }; + return false; + } - // The user has moved if the accuracy circles of the two locations don't overlap. - private static boolean hasMoved(Location from, Location to) { - if (to == null) { - return false; + private void startListening() { + if (DEBUG) Slog.d(TAG, "startListening"); + + // Start listening for location updates (default: low power, max 1h, min 10m). + mLocationManager.requestLocationUpdates( + null /* default */, this, Looper.getMainLooper()); + + // Request the device's location immediately if a previous location isn't available. + if (mLocationManager.getLastLocation() == null) { + if (mLocationManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER)) { + mLocationManager.requestSingleUpdate( + LocationManager.NETWORK_PROVIDER, this, Looper.getMainLooper()); + } else if (mLocationManager.isProviderEnabled(LocationManager.GPS_PROVIDER)) { + mLocationManager.requestSingleUpdate( + LocationManager.GPS_PROVIDER, this, Looper.getMainLooper()); + } } - if (from == null) { - return true; - } + // Update whenever the system clock is changed. + if (mTimeChangedReceiver == null) { + mTimeChangedReceiver = new BroadcastReceiver() { + @Override + public void onReceive(Context context, Intent intent) { + if (DEBUG) Slog.d(TAG, "onReceive: " + intent); + updateTwilightState(); + } + }; - // if new location is older than the current one, the device hasn't moved. - if (to.getElapsedRealtimeNanos() < from.getElapsedRealtimeNanos()) { - return false; + final IntentFilter intentFilter = new IntentFilter(Intent.ACTION_TIME_CHANGED); + intentFilter.addAction(Intent.ACTION_TIMEZONE_CHANGED); + getContext().registerReceiver(mTimeChangedReceiver, intentFilter); } - // Get the distance between the two points. - float distance = from.distanceTo(to); - - // Get the total accuracy radius for both locations. - float totalAccuracy = from.getAccuracy() + to.getAccuracy(); - - // If the distance is greater than the combined accuracy of the two - // points then they can't overlap and hence the user has moved. - return distance >= totalAccuracy; + // Force an update now that we have listeners registered. + updateTwilightState(); } - private final class LocationHandler extends Handler { - - private static final int MSG_ENABLE_LOCATION_UPDATES = 1; - private static final int MSG_GET_NEW_LOCATION_UPDATE = 2; - private static final int MSG_PROCESS_NEW_LOCATION = 3; - private static final int MSG_DO_TWILIGHT_UPDATE = 4; - private static final int MSG_DISABLE_LOCATION_UPDATES = 5; - - private static final long LOCATION_UPDATE_MS = 24 * DateUtils.HOUR_IN_MILLIS; - private static final long MIN_LOCATION_UPDATE_MS = 30 * DateUtils.MINUTE_IN_MILLIS; - private static final float LOCATION_UPDATE_DISTANCE_METER = 1000 * 20; - private static final long LOCATION_UPDATE_ENABLE_INTERVAL_MIN = 5000; - private static final long LOCATION_UPDATE_ENABLE_INTERVAL_MAX = - 15 * DateUtils.MINUTE_IN_MILLIS; - private static final double FACTOR_GMT_OFFSET_LONGITUDE = - 1000.0 * 360.0 / DateUtils.DAY_IN_MILLIS; - - private final TwilightCalculator mTwilightCalculator = new TwilightCalculator(); - - private boolean mPassiveListenerEnabled; - private boolean mNetworkListenerEnabled; - private boolean mDidFirstInit; - private long mLastNetworkRegisterTime = -MIN_LOCATION_UPDATE_MS; - private long mLastUpdateInterval; - private Location mLocation; - - public void processNewLocation(Location location) { - Message msg = obtainMessage(MSG_PROCESS_NEW_LOCATION, location); - sendMessage(msg); - } + private void stopListening() { + if (DEBUG) Slog.d(TAG, "stopListening"); - public void enableLocationUpdates() { - sendEmptyMessage(MSG_ENABLE_LOCATION_UPDATES); + if (mTimeChangedReceiver != null) { + getContext().unregisterReceiver(mTimeChangedReceiver); + mTimeChangedReceiver = null; } - public void disableLocationUpdates() { - sendEmptyMessage(MSG_DISABLE_LOCATION_UPDATES); + if (mLastTwilightState != null) { + mAlarmManager.cancel(this); } - public void requestLocationUpdate() { - sendEmptyMessage(MSG_GET_NEW_LOCATION_UPDATE); - } + mLocationManager.removeUpdates(this); + mLastLocation = null; + } - public void requestTwilightUpdate() { - sendEmptyMessage(MSG_DO_TWILIGHT_UPDATE); + private void updateTwilightState() { + // Calculate the twilight state based on the current time and location. + final long currentTimeMillis = System.currentTimeMillis(); + final Location location = mLastLocation != null ? mLastLocation + : mLocationManager.getLastLocation(); + final TwilightState state = calculateTwilightState(location, currentTimeMillis); + if (DEBUG) { + Slog.d(TAG, "updateTwilightState: " + state); } - @Override - public void handleMessage(Message msg) { - switch (msg.what) { - case MSG_PROCESS_NEW_LOCATION: { - final Location location = (Location) msg.obj; - final boolean hasMoved = hasMoved(mLocation, location); - final boolean hasBetterAccuracy = mLocation == null - || location.getAccuracy() < mLocation.getAccuracy(); - if (DEBUG) { - Slog.d(TAG, "Processing new location: " + location - + ", hasMoved=" + hasMoved - + ", hasBetterAccuracy=" + hasBetterAccuracy); - } - if (hasMoved || hasBetterAccuracy) { - setLocation(location); - } - break; - } - - case MSG_GET_NEW_LOCATION_UPDATE: - if (!mNetworkListenerEnabled) { - // Don't do anything -- we are still trying to get a - // location. - return; - } - if ((mLastNetworkRegisterTime + MIN_LOCATION_UPDATE_MS) >= - SystemClock.elapsedRealtime()) { - // Don't do anything -- it hasn't been long enough - // since we last requested an update. - return; - } - - // Unregister the current location monitor, so we can - // register a new one for it to get an immediate update. - mNetworkListenerEnabled = false; - mLocationManager.removeUpdates(mEmptyLocationListener); - - // Fall through to re-register listener. - case MSG_ENABLE_LOCATION_UPDATES: - // enable network provider to receive at least location updates for a given - // distance. - boolean networkLocationEnabled; - try { - networkLocationEnabled = mLocationManager.isProviderEnabled( - LocationManager.NETWORK_PROVIDER); - } catch (Exception e) { - // we may get IllegalArgumentException if network location provider - // does not exist or is not yet installed. - networkLocationEnabled = false; - } - if (!mNetworkListenerEnabled && networkLocationEnabled) { - mNetworkListenerEnabled = true; - mLastNetworkRegisterTime = SystemClock.elapsedRealtime(); - mLocationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, - LOCATION_UPDATE_MS, 0, mEmptyLocationListener); - - if (!mDidFirstInit) { - mDidFirstInit = true; - if (mLocation == null) { - retrieveLocation(); - } - } - } - - // enable passive provider to receive updates from location fixes (gps - // and network). - boolean passiveLocationEnabled; - try { - passiveLocationEnabled = mLocationManager.isProviderEnabled( - LocationManager.PASSIVE_PROVIDER); - } catch (Exception e) { - // we may get IllegalArgumentException if passive location provider - // does not exist or is not yet installed. - passiveLocationEnabled = false; - } - - if (!mPassiveListenerEnabled && passiveLocationEnabled) { - mPassiveListenerEnabled = true; - mLocationManager.requestLocationUpdates(LocationManager.PASSIVE_PROVIDER, - 0, LOCATION_UPDATE_DISTANCE_METER, mLocationListener); - } - - if (!(mNetworkListenerEnabled && mPassiveListenerEnabled)) { - mLastUpdateInterval *= 1.5; - if (mLastUpdateInterval == 0) { - mLastUpdateInterval = LOCATION_UPDATE_ENABLE_INTERVAL_MIN; - } else if (mLastUpdateInterval > LOCATION_UPDATE_ENABLE_INTERVAL_MAX) { - mLastUpdateInterval = LOCATION_UPDATE_ENABLE_INTERVAL_MAX; + // Notify listeners if the state has changed. + synchronized (mListeners) { + if (!Objects.equals(mLastTwilightState, state)) { + mLastTwilightState = state; + + for (int i = mListeners.size() - 1; i >= 0; --i) { + final TwilightListener listener = mListeners.keyAt(i); + final Handler handler = mListeners.valueAt(i); + handler.post(new Runnable() { + @Override + public void run() { + listener.onTwilightStateChanged(state); } - sendEmptyMessageDelayed(MSG_ENABLE_LOCATION_UPDATES, mLastUpdateInterval); - } - break; - - case MSG_DISABLE_LOCATION_UPDATES: - mLocationManager.removeUpdates(mLocationListener); - removeMessages(MSG_ENABLE_LOCATION_UPDATES); - break; - - case MSG_DO_TWILIGHT_UPDATE: - updateTwilightState(); - break; - } - } - - private void retrieveLocation() { - Location location = null; - final Iterator<String> providers = - mLocationManager.getProviders(new Criteria(), true).iterator(); - while (providers.hasNext()) { - final Location lastKnownLocation = - mLocationManager.getLastKnownLocation(providers.next()); - // pick the most recent location - if (location == null || (lastKnownLocation != null && - location.getElapsedRealtimeNanos() < - lastKnownLocation.getElapsedRealtimeNanos())) { - location = lastKnownLocation; + }); } } - - // In the case there is no location available (e.g. GPS fix or network location - // is not available yet), the longitude of the location is estimated using the - // timezone, latitude and accuracy are set to get a good average. - if (location == null) { - Time currentTime = new Time(); - currentTime.set(System.currentTimeMillis()); - double lngOffset = FACTOR_GMT_OFFSET_LONGITUDE * - (currentTime.gmtoff - (currentTime.isDst > 0 ? 3600 : 0)); - location = new Location("fake"); - location.setLongitude(lngOffset); - location.setLatitude(0); - location.setAccuracy(417000.0f); - location.setTime(System.currentTimeMillis()); - location.setElapsedRealtimeNanos(SystemClock.elapsedRealtimeNanos()); - - if (DEBUG) { - Slog.d(TAG, "Estimated location from timezone: " + location); - } - } - - setLocation(location); } - private void setLocation(Location location) { - mLocation = location; - updateTwilightState(); - } - - private void updateTwilightState() { - if (mLocation == null) { - setTwilightState(null); - return; - } - - final long now = System.currentTimeMillis(); - - // calculate today's twilight - mTwilightCalculator.calculateTwilight(now, - mLocation.getLatitude(), mLocation.getLongitude()); - final boolean isNight = (mTwilightCalculator.mState == TwilightCalculator.NIGHT); - final long todaySunrise = mTwilightCalculator.mSunrise; - final long todaySunset = mTwilightCalculator.mSunset; - - // calculate tomorrow's twilight - mTwilightCalculator.calculateTwilight(now + DateUtils.DAY_IN_MILLIS, - mLocation.getLatitude(), mLocation.getLongitude()); - final long tomorrowSunrise = mTwilightCalculator.mSunrise; - - float amount = 0; - if (isNight) { - if (todaySunrise == -1 || todaySunset == -1) { - amount = 1; - } else if (now > todaySunset) { - amount = Math.min(1, (now - todaySunset) / (float) TWILIGHT_ADJUSTMENT_TIME); - } else { - amount = Math.max(0, 1 - - (todaySunrise - now) / (float) TWILIGHT_ADJUSTMENT_TIME); - } - } - // set twilight state - TwilightState state = new TwilightState(isNight, amount); - if (DEBUG) { - Slog.d(TAG, "Updating twilight state: " + state); - } - setTwilightState(state); - - // schedule next update - long nextUpdate = 0; - if (todaySunrise == -1 || todaySunset == -1) { - // In the case the day or night never ends the update is scheduled 12 hours later. - nextUpdate = now + 12 * DateUtils.HOUR_IN_MILLIS; - } else { - // add some extra time to be on the safe side. - nextUpdate += DateUtils.MINUTE_IN_MILLIS; - - if (amount == 1 || amount == 0) { - if (now > todaySunset) { - nextUpdate += tomorrowSunrise; - } else if (now > todaySunrise) { - nextUpdate += todaySunset; - } else { - nextUpdate += todaySunrise; - } - } else { - // This is the update rate while transitioning. - // Leave at 10 min for now (one from above). - nextUpdate += 9 * DateUtils.MINUTE_IN_MILLIS; - } - } - - if (DEBUG) { - Slog.d(TAG, "Next update in " + (nextUpdate - now) + " ms"); - } - - final PendingIntent pendingIntent = PendingIntent.getBroadcast( - getContext(), 0, new Intent(ACTION_UPDATE_TWILIGHT_STATE), 0); - mAlarmManager.cancel(pendingIntent); - mAlarmManager.setExact(AlarmManager.RTC, nextUpdate, pendingIntent); + // Schedule an alarm to update the state at the next sunrise or sunset. + if (state != null) { + final long triggerAtMillis = state.isNight() + ? state.sunriseTimeMillis() : state.sunsetTimeMillis(); + mAlarmManager.setExact(AlarmManager.RTC, triggerAtMillis, TAG, this, mHandler); } } - private final BroadcastReceiver mReceiver = new BroadcastReceiver() { - @Override - public void onReceive(Context context, Intent intent) { - if (Intent.ACTION_AIRPLANE_MODE_CHANGED.equals(intent.getAction()) - && !intent.getBooleanExtra("state", false)) { - // Airplane mode is now off! - mLocationHandler.requestLocationUpdate(); - return; - } - // Time zone has changed or alarm expired. - mLocationHandler.requestTwilightUpdate(); - } - }; - - // A LocationListener to initialize the network location provider. The location updates - // are handled through the passive location provider. - private final LocationListener mEmptyLocationListener = new LocationListener() { - @Override - public void onLocationChanged(Location location) { - } + @Override + public void onAlarm() { + if (DEBUG) Slog.d(TAG, "onAlarm"); + updateTwilightState(); + } - @Override - public void onStatusChanged(String provider, int status, Bundle extras) { - } + @Override + public void onLocationChanged(Location location) { + if (DEBUG) Slog.d(TAG, "onLocationChanged: " + location); + mLastLocation = location; + updateTwilightState(); + } - @Override - public void onProviderEnabled(String provider) { - } + @Override + public void onStatusChanged(String provider, int status, Bundle extras) { + } - @Override - public void onProviderDisabled(String provider) { - } - }; + @Override + public void onProviderEnabled(String provider) { + } - private final LocationListener mLocationListener = new LocationListener() { - @Override - public void onLocationChanged(Location location) { - mLocationHandler.processNewLocation(location); - } + @Override + public void onProviderDisabled(String provider) { + } - @Override - public void onStatusChanged(String provider, int status, Bundle extras) { + /** + * Calculates the twilight state for a specific location and time. + * + * @param location the location to use + * @param timeMillis the reference time to use + * @return the calculated {@link TwilightState}, or {@code null} if location is {@code null} + */ + private static TwilightState calculateTwilightState(Location location, long timeMillis) { + if (location == null) { + return null; } - @Override - public void onProviderEnabled(String provider) { + final CalendarAstronomer ca = new CalendarAstronomer( + location.getLongitude(), location.getLatitude()); + + final Calendar noon = Calendar.getInstance(); + noon.setTimeInMillis(timeMillis); + noon.set(Calendar.HOUR_OF_DAY, 12); + noon.set(Calendar.MINUTE, 0); + noon.set(Calendar.SECOND, 0); + noon.set(Calendar.MILLISECOND, 0); + ca.setTime(noon.getTimeInMillis()); + + long sunriseTimeMillis = ca.getSunRiseSet(true /* rise */); + long sunsetTimeMillis = ca.getSunRiseSet(false /* rise */); + + if (sunsetTimeMillis < timeMillis) { + noon.add(Calendar.DATE, 1); + ca.setTime(noon.getTimeInMillis()); + sunriseTimeMillis = ca.getSunRiseSet(true /* rise */); + } else if (sunriseTimeMillis > timeMillis) { + noon.add(Calendar.DATE, -1); + ca.setTime(noon.getTimeInMillis()); + sunsetTimeMillis = ca.getSunRiseSet(false /* rise */); } - @Override - public void onProviderDisabled(String provider) { - } - }; + return new TwilightState(sunriseTimeMillis, sunsetTimeMillis); + } } diff --git a/services/core/java/com/android/server/twilight/TwilightState.java b/services/core/java/com/android/server/twilight/TwilightState.java index dec053b83948..a12965df11c0 100644 --- a/services/core/java/com/android/server/twilight/TwilightState.java +++ b/services/core/java/com/android/server/twilight/TwilightState.java @@ -1,5 +1,5 @@ /* - * Copyright (C) 2013 The Android Open Source Project + * 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. @@ -16,59 +16,89 @@ package com.android.server.twilight; -import java.text.DateFormat; -import java.util.Date; +import android.text.format.DateFormat; + +import java.util.Calendar; /** - * Describes whether it is day or night. - * This object is immutable. + * The twilight state, consisting of the sunrise and sunset times (in millis) for the current + * period. + * <p/> + * Note: This object is immutable. */ -public class TwilightState { +public final class TwilightState { - private final boolean mIsNight; - private final float mAmount; + private final long mSunriseTimeMillis; + private final long mSunsetTimeMillis; - TwilightState(boolean isNight, float amount) { - mIsNight = isNight; - mAmount = amount; + TwilightState(long sunriseTimeMillis, long sunsetTimeMillis) { + mSunriseTimeMillis = sunriseTimeMillis; + mSunsetTimeMillis = sunsetTimeMillis; } /** - * Returns true if it is currently night time. + * Returns the time (in UTC milliseconds from epoch) of the upcoming or previous sunrise if + * it's night or day respectively. */ - public boolean isNight() { - return mIsNight; + public long sunriseTimeMillis() { + return mSunriseTimeMillis; + } + + /** + * Returns a new {@link Calendar} instance initialized to {@link #sunriseTimeMillis()}. + */ + public Calendar sunrise() { + final Calendar sunrise = Calendar.getInstance(); + sunrise.setTimeInMillis(mSunriseTimeMillis); + return sunrise; } /** - * For twilight affects that change gradually over time, this is the amount they - * should currently be in effect. + * Returns the time (in UTC milliseconds from epoch) of the upcoming or previous sunset if + * it's day or night respectively. */ - public float getAmount() { - return mAmount; + public long sunsetTimeMillis() { + return mSunsetTimeMillis; + } + + /** + * Returns a new {@link Calendar} instance initialized to {@link #sunsetTimeMillis()}. + */ + public Calendar sunset() { + final Calendar sunset = Calendar.getInstance(); + sunset.setTimeInMillis(mSunsetTimeMillis); + return sunset; + } + + /** + * Returns {@code true} if it is currently night time. + */ + public boolean isNight() { + final long now = System.currentTimeMillis(); + return now >= mSunsetTimeMillis && now < mSunriseTimeMillis; } @Override public boolean equals(Object o) { - return o instanceof TwilightState && equals((TwilightState)o); + return o instanceof TwilightState && equals((TwilightState) o); } public boolean equals(TwilightState other) { return other != null - && mIsNight == other.mIsNight - && mAmount == other.mAmount; + && mSunriseTimeMillis == other.mSunriseTimeMillis + && mSunsetTimeMillis == other.mSunsetTimeMillis; } @Override public int hashCode() { - return 0; // don't care + return Long.hashCode(mSunriseTimeMillis) ^ Long.hashCode(mSunsetTimeMillis); } @Override public String toString() { - DateFormat f = DateFormat.getDateTimeInstance(); - return "{TwilightState: isNight=" + mIsNight - + ", mAmount=" + mAmount - + "}"; + return "TwilightState {" + + " sunrise=" + DateFormat.format("MM-dd HH:mm", mSunriseTimeMillis) + + " sunset="+ DateFormat.format("MM-dd HH:mm", mSunsetTimeMillis) + + " }"; } } diff --git a/services/core/java/com/android/server/wallpaper/WallpaperManagerService.java b/services/core/java/com/android/server/wallpaper/WallpaperManagerService.java index 74a6131b11eb..71660280162d 100644 --- a/services/core/java/com/android/server/wallpaper/WallpaperManagerService.java +++ b/services/core/java/com/android/server/wallpaper/WallpaperManagerService.java @@ -1753,12 +1753,14 @@ public class WallpaperManagerService extends IWallpaperManager.Stub { } @Override - public boolean isWallpaperBackupEligible(int userId) { + public boolean isWallpaperBackupEligible(int which, int userId) { if (Binder.getCallingUid() != Process.SYSTEM_UID) { throw new SecurityException("Only the system may call isWallpaperBackupEligible"); } - WallpaperData wallpaper = getWallpaperSafeLocked(userId, FLAG_SYSTEM); + WallpaperData wallpaper = (which == FLAG_LOCK) + ? mWallpaperMap.get(userId) + : mLockWallpaperMap.get(userId); return (wallpaper != null) ? wallpaper.allowBackup : false; } diff --git a/services/core/java/com/android/server/wm/AppTransition.java b/services/core/java/com/android/server/wm/AppTransition.java index 3aefc08746bc..d4d6f3225edd 100644 --- a/services/core/java/com/android/server/wm/AppTransition.java +++ b/services/core/java/com/android/server/wm/AppTransition.java @@ -162,6 +162,9 @@ public class AppTransition implements Dump { private final WindowManagerService mService; private int mNextAppTransition = TRANSIT_UNSET; + private int mLastUsedAppTransition = TRANSIT_UNSET; + private String mLastOpeningApp; + private String mLastClosingApp; private static final int NEXT_TRANSIT_TYPE_NONE = 0; private static final int NEXT_TRANSIT_TYPE_CUSTOM = 1; @@ -285,6 +288,13 @@ public class AppTransition implements Dump { private void setAppTransition(int transit) { mNextAppTransition = transit; + setLastAppTransition(TRANSIT_UNSET, null, null); + } + + void setLastAppTransition(int transit, AppWindowToken openingApp, AppWindowToken closingApp) { + mLastUsedAppTransition = transit; + mLastOpeningApp = "" + openingApp; + mLastClosingApp = "" + closingApp; } boolean isReady() { @@ -1904,6 +1914,14 @@ public class AppTransition implements Dump { pw.print(prefix); pw.print("mNextAppTransitionCallback="); pw.println(mNextAppTransitionCallback); } + if (mLastUsedAppTransition != TRANSIT_NONE) { + pw.print(prefix); pw.print("mLastUsedAppTransition="); + pw.println(appTransitionToString(mLastUsedAppTransition)); + pw.print(prefix); pw.print("mLastOpeningApp="); + pw.println(mLastOpeningApp); + pw.print(prefix); pw.print("mLastClosingApp="); + pw.println(mLastClosingApp); + } } public void setCurrentUser(int newUserId) { diff --git a/services/core/java/com/android/server/wm/AppWindowToken.java b/services/core/java/com/android/server/wm/AppWindowToken.java index a9624cfaba95..1f385dfac5a5 100644 --- a/services/core/java/com/android/server/wm/AppWindowToken.java +++ b/services/core/java/com/android/server/wm/AppWindowToken.java @@ -17,7 +17,9 @@ package com.android.server.wm; import static android.app.ActivityManager.StackId; +import static android.view.WindowManager.LayoutParams.FLAG_SHOW_WALLPAPER; import static android.view.WindowManager.LayoutParams.TYPE_APPLICATION_STARTING; +import static android.view.WindowManagerPolicy.FINISH_LAYOUT_REDO_WALLPAPER; import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_ANIM; import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_APP_TRANSITIONS; import static com.android.server.wm.WindowManagerDebugConfig.DEBUG_ADD_REMOVE; @@ -357,8 +359,14 @@ class AppWindowToken extends WindowToken { // placement for this window during this period, one or more frame will // show up with wrong position or scale. win.mWinAnimator.mAnimating = false; + + if (win.mDestroying) { + win.mDestroying = false; + service.mDestroySurface.remove(win); + } } } + requestUpdateWallpaperIfNeeded(); } void destroySurfaces() { @@ -406,6 +414,9 @@ class AppWindowToken extends WindowToken { if (displayContent != null && !displayList.contains(displayContent)) { displayList.add(displayContent); } + if (cleanupOnResume) { + win.requestUpdateWallpaperIfNeeded(); + } win.mDestroying = false; } for (int i = 0; i < displayList.size(); i++) { diff --git a/services/core/java/com/android/server/wm/WallpaperController.java b/services/core/java/com/android/server/wm/WallpaperController.java index a976b3649554..e53452514ddb 100644 --- a/services/core/java/com/android/server/wm/WallpaperController.java +++ b/services/core/java/com/android/server/wm/WallpaperController.java @@ -590,18 +590,9 @@ class WallpaperController { "Animating wallpapers: old#" + oldI + "=" + oldW + "; new#" + wallpaperTargetIndex + "=" + wallpaperTarget); - // Set the new target correctly. - if (wallpaperTarget.mAppToken != null - && wallpaperTarget.mAppToken.hiddenRequested) { - if (DEBUG_WALLPAPER_LIGHT) Slog.v(TAG, - "Old wallpaper still the target."); - mWallpaperTarget = oldW; - wallpaperTarget = oldW; - wallpaperTargetIndex = oldI; - } - // Now set the upper and lower wallpaper targets correctly, + // Set the upper and lower wallpaper targets correctly, // and make sure that we are positioning the wallpaper below the lower. - else if (wallpaperTargetIndex > oldI) { + if (wallpaperTargetIndex > oldI) { // The new target is on top of the old one. if (DEBUG_WALLPAPER_LIGHT) Slog.v(TAG, "Found target above old target."); @@ -616,6 +607,16 @@ class WallpaperController { mUpperWallpaperTarget = oldW; mLowerWallpaperTarget = wallpaperTarget; } + + // If the new target is going hidden, set it back to the old target. + if (wallpaperTarget.mAppToken != null + && wallpaperTarget.mAppToken.hiddenRequested) { + if (DEBUG_WALLPAPER_LIGHT) Slog.v(TAG, + "Old wallpaper still the target."); + mWallpaperTarget = oldW; + wallpaperTarget = oldW; + wallpaperTargetIndex = oldI; + } } } } diff --git a/services/core/java/com/android/server/wm/WindowSurfacePlacer.java b/services/core/java/com/android/server/wm/WindowSurfacePlacer.java index ee4a9a417379..fa5e3cabeb44 100644 --- a/services/core/java/com/android/server/wm/WindowSurfacePlacer.java +++ b/services/core/java/com/android/server/wm/WindowSurfacePlacer.java @@ -1097,6 +1097,26 @@ class WindowSurfacePlacer { boolean fullscreenAnim = false; boolean voiceInteraction = false; + int i; + for (i = 0; i < appsCount; i++) { + final AppWindowToken wtoken = mService.mOpeningApps.valueAt(i); + // Clearing the mAnimatingExit flag before entering animation. It's set to + // true if app window is removed, or window relayout to invisible. + // This also affects window visibility. We need to clear it *before* + // maybeUpdateTransitToWallpaper() as the transition selection depends on + // wallpaper target visibility. + wtoken.clearAnimatingFlags(); + + } + // Adjust wallpaper before we pull the lower/upper target, since pending changes + // (like the clearAnimatingFlags() above) might affect wallpaper target result. + final DisplayContent displayContent = mService.getDefaultDisplayContentLocked(); + if ((displayContent.pendingLayoutChanges & FINISH_LAYOUT_REDO_WALLPAPER) != 0 && + mWallpaperControllerLocked.adjustWallpaperWindows()) { + mService.mLayersController.assignLayersLocked(windows); + displayContent.layoutNeeded = true; + } + final WindowState lowerWallpaperTarget = mWallpaperControllerLocked.getLowerWallpaperTarget(); final WindowState upperWallpaperTarget = @@ -1113,7 +1133,6 @@ class WindowSurfacePlacer { upperWallpaperAppToken = upperWallpaperTarget.mAppToken; } - int i; // Do a first pass through the tokens for two // things: // (1) Determine if both the closing and opening @@ -1138,12 +1157,6 @@ class WindowSurfacePlacer { if (wtoken == lowerWallpaperAppToken || wtoken == upperWallpaperAppToken) { openingAppHasWallpaper = true; } - // Clearing the mAnimatingExit flag before entering animation. It's set to - // true if app window is removed, or window relayout to invisible. - // This also affects window visibility. We need to clear it *before* - // maybeUpdateTransitToWallpaper() as the transition selection depends on - // wallpaper target visibility. - wtoken.clearAnimatingFlags(); } voiceInteraction |= wtoken.voiceInteraction; @@ -1189,6 +1202,8 @@ class WindowSurfacePlacer { final AppWindowToken topOpeningApp = handleOpeningApps(transit, animLp, voiceInteraction, topClosingLayer); + mService.mAppTransition.setLastAppTransition(transit, topOpeningApp, topClosingApp); + final AppWindowAnimator openingAppAnimator = (topOpeningApp == null) ? null : topOpeningApp.mAppAnimator; final AppWindowAnimator closingAppAnimator = (topClosingApp == null) ? null : @@ -1204,7 +1219,7 @@ class WindowSurfacePlacer { // This has changed the visibility of windows, so perform // a new layout to get them all up-to-date. - mService.getDefaultDisplayContentLocked().layoutNeeded = true; + displayContent.layoutNeeded = true; // TODO(multidisplay): IMEs are only supported on the default display. if (windows == mService.getDefaultWindowListLocked() @@ -1468,7 +1483,7 @@ class WindowSurfacePlacer { mObscured = true; } - if (w.mHasSurface) { + if (w.mHasSurface && canBeSeen) { if ((attrFlags&FLAG_KEEP_SCREEN_ON) != 0) { mHoldScreen = w.mSession; mHoldScreenWindow = w; @@ -1491,43 +1506,39 @@ class WindowSurfacePlacer { } final int type = attrs.type; - if (canBeSeen - && (type == TYPE_SYSTEM_DIALOG - || type == TYPE_SYSTEM_ERROR - || (attrs.privateFlags & PRIVATE_FLAG_KEYGUARD) != 0)) { + if (type == TYPE_SYSTEM_DIALOG || type == TYPE_SYSTEM_ERROR + || (attrs.privateFlags & PRIVATE_FLAG_KEYGUARD) != 0) { mSyswin = true; } - if (canBeSeen) { - // This function assumes that the contents of the default display are - // processed first before secondary displays. - final DisplayContent displayContent = w.getDisplayContent(); - if (displayContent != null && displayContent.isDefaultDisplay) { - // While a dream or keyguard is showing, obscure ordinary application - // content on secondary displays (by forcibly enabling mirroring unless - // there is other content we want to show) but still allow opaque - // keyguard dialogs to be shown. - if (type == TYPE_DREAM || (attrs.privateFlags & PRIVATE_FLAG_KEYGUARD) != 0) { - mObscureApplicationContentOnSecondaryDisplays = true; - } - mDisplayHasContent = true; - } else if (displayContent != null && - (!mObscureApplicationContentOnSecondaryDisplays - || (mObscured && type == TYPE_KEYGUARD_DIALOG))) { - // Allow full screen keyguard presentation dialogs to be seen. - mDisplayHasContent = true; - } - if (mPreferredRefreshRate == 0 - && w.mAttrs.preferredRefreshRate != 0) { - mPreferredRefreshRate = w.mAttrs.preferredRefreshRate; - } - if (mPreferredModeId == 0 - && w.mAttrs.preferredDisplayModeId != 0) { - mPreferredModeId = w.mAttrs.preferredDisplayModeId; - } - if ((privateflags & PRIVATE_FLAG_SUSTAINED_PERFORMANCE_MODE) != 0) { - mSustainedPerformanceModeCurrent = true; + // This function assumes that the contents of the default display are + // processed first before secondary displays. + final DisplayContent displayContent = w.getDisplayContent(); + if (displayContent != null && displayContent.isDefaultDisplay) { + // While a dream or keyguard is showing, obscure ordinary application + // content on secondary displays (by forcibly enabling mirroring unless + // there is other content we want to show) but still allow opaque + // keyguard dialogs to be shown. + if (type == TYPE_DREAM || (attrs.privateFlags & PRIVATE_FLAG_KEYGUARD) != 0) { + mObscureApplicationContentOnSecondaryDisplays = true; } + mDisplayHasContent = true; + } else if (displayContent != null && + (!mObscureApplicationContentOnSecondaryDisplays + || (mObscured && type == TYPE_KEYGUARD_DIALOG))) { + // Allow full screen keyguard presentation dialogs to be seen. + mDisplayHasContent = true; + } + if (mPreferredRefreshRate == 0 + && w.mAttrs.preferredRefreshRate != 0) { + mPreferredRefreshRate = w.mAttrs.preferredRefreshRate; + } + if (mPreferredModeId == 0 + && w.mAttrs.preferredDisplayModeId != 0) { + mPreferredModeId = w.mAttrs.preferredDisplayModeId; + } + if ((privateflags & PRIVATE_FLAG_SUSTAINED_PERFORMANCE_MODE) != 0) { + mSustainedPerformanceModeCurrent = true; } } } diff --git a/services/net/java/android/net/ip/RouterAdvertisementDaemon.java b/services/net/java/android/net/ip/RouterAdvertisementDaemon.java index 1a9d2f23935e..6802cffc0207 100644 --- a/services/net/java/android/net/ip/RouterAdvertisementDaemon.java +++ b/services/net/java/android/net/ip/RouterAdvertisementDaemon.java @@ -47,6 +47,7 @@ import java.nio.ByteOrder; import java.util.ArrayList; import java.util.HashMap; import java.util.HashSet; +import java.util.Iterator; import java.util.Map; import java.util.Random; import java.util.Set; @@ -61,10 +62,6 @@ import java.util.concurrent.atomic.AtomicInteger; * - Rewrite using Handler (and friends) so that AlarmManager can deliver * "kick" messages when it's time to send a multicast RA. * - * - Support transmitting MAX_URGENT_RTR_ADVERTISEMENTS number of empty - * RAs with zero default router lifetime when transitioning from an - * advertising state to a non-advertising state. - * * @hide */ public class RouterAdvertisementDaemon { @@ -112,8 +109,7 @@ public class RouterAdvertisementDaemon { @GuardedBy("mLock") private int mRaLength; @GuardedBy("mLock") - private final HashMap<IpPrefix, Integer> mDeprecatedPrefixes; - + private final DeprecatedInfoTracker mDeprecatedInfoTracker; @GuardedBy("mLock") private RaParams mRaParams; @@ -140,6 +136,88 @@ public class RouterAdvertisementDaemon { prefixes = (HashSet) other.prefixes.clone(); dnses = (HashSet) other.dnses.clone(); } + + // Returns the subset of RA parameters that become deprecated when + // moving from announcing oldRa to announcing newRa. + // + // Currently only tracks differences in |prefixes| and |dnses|. + public static RaParams getDeprecatedRaParams(RaParams oldRa, RaParams newRa) { + RaParams newlyDeprecated = new RaParams(); + + if (oldRa != null) { + for (IpPrefix ipp : oldRa.prefixes) { + if (newRa == null || !newRa.prefixes.contains(ipp)) { + newlyDeprecated.prefixes.add(ipp); + } + } + + for (Inet6Address dns : oldRa.dnses) { + if (newRa == null || !newRa.dnses.contains(dns)) { + newlyDeprecated.dnses.add(dns); + } + } + } + + return newlyDeprecated; + } + } + + private static class DeprecatedInfoTracker { + private final HashMap<IpPrefix, Integer> mPrefixes = new HashMap<>(); + private final HashMap<Inet6Address, Integer> mDnses = new HashMap<>(); + + Set<IpPrefix> getPrefixes() { return mPrefixes.keySet(); } + + void putPrefixes(Set<IpPrefix> prefixes) { + for (IpPrefix ipp : prefixes) { + mPrefixes.put(ipp, MAX_URGENT_RTR_ADVERTISEMENTS); + } + } + + void removePrefixes(Set<IpPrefix> prefixes) { + for (IpPrefix ipp : prefixes) { + mPrefixes.remove(ipp); + } + } + + Set<Inet6Address> getDnses() { return mDnses.keySet(); } + + void putDnses(Set<Inet6Address> dnses) { + for (Inet6Address dns : dnses) { + mDnses.put(dns, MAX_URGENT_RTR_ADVERTISEMENTS); + } + } + + void removeDnses(Set<Inet6Address> dnses) { + for (Inet6Address dns : dnses) { + mDnses.remove(dns); + } + } + + boolean isEmpty() { return mPrefixes.isEmpty() && mDnses.isEmpty(); } + + private boolean decrementCounters() { + boolean removed = decrementCounter(mPrefixes); + removed |= decrementCounter(mDnses); + return removed; + } + + private <T> boolean decrementCounter(HashMap<T, Integer> map) { + boolean removed = false; + + for (Iterator<Map.Entry<T, Integer>> it = map.entrySet().iterator(); + it.hasNext();) { + Map.Entry<T, Integer> kv = it.next(); + if (kv.getValue() == 0) { + it.remove(); + removed = true; + } else { + kv.setValue(kv.getValue() - 1); + } + } + + return removed; + } } @@ -148,29 +226,24 @@ public class RouterAdvertisementDaemon { mIfIndex = ifindex; mHwAddr = hwaddr; mAllNodes = new InetSocketAddress(getAllNodesForScopeId(mIfIndex), 0); - mDeprecatedPrefixes = new HashMap<>(); + mDeprecatedInfoTracker = new DeprecatedInfoTracker(); } - public void buildNewRa(RaParams params, HashSet<IpPrefix> newlyDeprecated) { - if (newlyDeprecated != null) { - synchronized (mLock) { - for (IpPrefix ipp : newlyDeprecated) { - mDeprecatedPrefixes.put(ipp, MAX_URGENT_RTR_ADVERTISEMENTS); - } + public void buildNewRa(RaParams deprecatedParams, RaParams newParams) { + synchronized (mLock) { + if (deprecatedParams != null) { + mDeprecatedInfoTracker.putPrefixes(deprecatedParams.prefixes); + mDeprecatedInfoTracker.putDnses(deprecatedParams.dnses); } - } - // TODO: Send MAX_URGENT_RTR_ADVERTISEMENTS zero router lifetime RAs, - // iff. we have already sent an RA. - if (params == null || params.prefixes.isEmpty()) { - // No RA to be served at this time. - clearRa(); - return; - } + if (newParams != null) { + // Process information that is no longer deprecated. + mDeprecatedInfoTracker.removePrefixes(newParams.prefixes); + mDeprecatedInfoTracker.removeDnses(newParams.dnses); + } - synchronized (mLock) { - mRaParams = params; - assembleRa(); + mRaParams = newParams; + assembleRaLocked(); } maybeNotifyMulticastTransmitter(); @@ -196,73 +269,64 @@ public class RouterAdvertisementDaemon { mUnicastResponder = null; } - private void clearRa() { - boolean notifySocket; - synchronized (mLock) { - notifySocket = (mRaLength != 0); - mRaLength = 0; - } - if (notifySocket) { - maybeNotifyMulticastTransmitter(); - } - } - - private void assembleRa() { + private void assembleRaLocked() { final ByteBuffer ra = ByteBuffer.wrap(mRA); ra.order(ByteOrder.BIG_ENDIAN); - synchronized (mLock) { - try { - putHeader(ra, mRaParams.hasDefaultRoute); - - putSlla(ra, mHwAddr); - - // https://tools.ietf.org/html/rfc5175#section-4 says: - // - // "MUST NOT be added to a Router Advertisement message - // if no flags in the option are set." - // - // putExpandedFlagsOption(ra); + boolean shouldSendRA = false; + try { + putHeader(ra, mRaParams != null && mRaParams.hasDefaultRoute); + putSlla(ra, mHwAddr); + mRaLength = ra.position(); + + // https://tools.ietf.org/html/rfc5175#section-4 says: + // + // "MUST NOT be added to a Router Advertisement message + // if no flags in the option are set." + // + // putExpandedFlagsOption(ra); + + if (mRaParams != null) { putMtu(ra, mRaParams.mtu); + mRaLength = ra.position(); for (IpPrefix ipp : mRaParams.prefixes) { putPio(ra, ipp, DEFAULT_LIFETIME, DEFAULT_LIFETIME); - mDeprecatedPrefixes.remove(ipp); - } - - for (IpPrefix ipp : mDeprecatedPrefixes.keySet()) { - putPio(ra, ipp, 0, 0); + mRaLength = ra.position(); + shouldSendRA = true; } if (mRaParams.dnses.size() > 0) { - putRdnss(ra, mRaParams.dnses); + putRdnss(ra, mRaParams.dnses, DEFAULT_LIFETIME); + mRaLength = ra.position(); + shouldSendRA = true; } + } + for (IpPrefix ipp : mDeprecatedInfoTracker.getPrefixes()) { + putPio(ra, ipp, 0, 0); mRaLength = ra.position(); - } catch (BufferOverflowException e) { - Log.e(TAG, "Could not construct new RA: " + e); - mRaLength = 0; - return; + shouldSendRA = true; } - } - } - private int decrementDeprecatedPrefixes() { - int removed = 0; - - synchronized (mLock) { - for (Map.Entry<IpPrefix, Integer> kv : mDeprecatedPrefixes.entrySet()) { - if (kv.getValue() == 0) { - mDeprecatedPrefixes.remove(kv.getKey()); - removed++; - } else { - kv.setValue(kv.getValue() - 1); - } + final Set<Inet6Address> deprecatedDnses = mDeprecatedInfoTracker.getDnses(); + if (!deprecatedDnses.isEmpty()) { + putRdnss(ra, deprecatedDnses, 0); + mRaLength = ra.position(); + shouldSendRA = true; } + } catch (BufferOverflowException e) { + // The packet up to mRaLength is valid, since it has been updated + // progressively as the RA was built. Log an error, and continue + // on as best as possible. + Log.e(TAG, "Could not construct new RA: " + e); } - return removed; + // We have nothing worth announcing; indicate as much to maybeSendRA(). + if (!shouldSendRA) { + mRaLength = 0; + } } private void maybeNotifyMulticastTransmitter() { @@ -461,7 +525,7 @@ public class RouterAdvertisementDaemon { } } - private static void putRdnss(ByteBuffer ra, Set<Inet6Address> dnses) { + private static void putRdnss(ByteBuffer ra, Set<Inet6Address> dnses, int lifetime) { /** Recursive DNS Server (RDNSS) Option @@ -483,9 +547,15 @@ public class RouterAdvertisementDaemon { ra.put(ND_OPTION_RDNSS) .put(RDNSS_NUM_8OCTETS) .putShort(asShort(0)) - .putInt(DEFAULT_LIFETIME); + .putInt(lifetime); for (Inet6Address dns : dnses) { + // NOTE: If the full of list DNS servers doesn't fit in the packet, + // this code will cause a buffer overflow and the RA won't include + // this instance of the option at all. + // + // TODO: Consider looking at ra.remaining() to determine how many + // DNS servers will fit, and adding only those. ra.put(dns.getAddress()); } } @@ -601,10 +671,12 @@ public class RouterAdvertisementDaemon { } maybeSendRA(mAllNodes); - if (decrementDeprecatedPrefixes() > 0) { - // At least one deprecated PIO has been removed; - // reassemble the RA. - assembleRa(); + synchronized (mLock) { + if (mDeprecatedInfoTracker.decrementCounters()) { + // At least one deprecated PIO has been removed; + // reassemble the RA. + assembleRaLocked(); + } } } } @@ -619,17 +691,17 @@ public class RouterAdvertisementDaemon { } private int getNextMulticastTransmitDelaySec() { - int countDeprecatedPrefixes = 0; + boolean deprecationInProgress = false; synchronized (mLock) { if (mRaLength < MIN_RA_HEADER_SIZE) { // No actual RA to send; just sleep for 1 day. return DAY_IN_SECONDS; } - countDeprecatedPrefixes = mDeprecatedPrefixes.size(); + deprecationInProgress = !mDeprecatedInfoTracker.isEmpty(); } final int urgentPending = mUrgentAnnouncements.getAndDecrement(); - if (urgentPending > 0 || countDeprecatedPrefixes > 0) { + if ((urgentPending > 0) || deprecationInProgress) { return MIN_DELAY_BETWEEN_RAS_SEC; } diff --git a/services/tests/servicestests/src/com/android/server/devicepolicy/DevicePolicyManagerTest.java b/services/tests/servicestests/src/com/android/server/devicepolicy/DevicePolicyManagerTest.java index 3a2e946e617f..2d96bff29bd7 100644 --- a/services/tests/servicestests/src/com/android/server/devicepolicy/DevicePolicyManagerTest.java +++ b/services/tests/servicestests/src/com/android/server/devicepolicy/DevicePolicyManagerTest.java @@ -27,7 +27,6 @@ import android.content.pm.PackageInfo; import android.content.pm.PackageManager; import android.net.wifi.WifiInfo; import android.os.Build.VERSION_CODES; -import android.os.Build; import android.os.Bundle; import android.os.Process; import android.os.UserHandle; @@ -42,7 +41,6 @@ import android.util.Pair; import com.android.server.LocalServices; import com.android.server.SystemService; -import org.mockito.ArgumentCaptor; import org.mockito.invocation.InvocationOnMock; import org.mockito.stubbing.Answer; @@ -62,7 +60,6 @@ import static org.mockito.Mockito.doAnswer; import static org.mockito.Mockito.doReturn; import static org.mockito.Mockito.reset; import static org.mockito.Mockito.times; -import static org.mockito.Mockito.validateMockitoUsage; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; @@ -454,8 +451,7 @@ public class DevicePolicyManagerTest extends DpmTestBase { .thenReturn(true); dpm.removeActiveAdmin(admin1); - - assertTrue(dpm.isRemovingAdmin(admin1, DpmMockContext.CALLER_USER_HANDLE)); + assertFalse(dpm.isAdminActiveAsUser(admin1, DpmMockContext.CALLER_USER_HANDLE)); } /** @@ -479,8 +475,7 @@ public class DevicePolicyManagerTest extends DpmTestBase { mContext.binder.callingUid = 1234567; dpms.removeActiveAdmin(admin1, DpmMockContext.CALLER_USER_HANDLE); - - assertTrue(dpm.isRemovingAdmin(admin1, DpmMockContext.CALLER_USER_HANDLE)); + assertFalse(dpm.isAdminActiveAsUser(admin1, DpmMockContext.CALLER_USER_HANDLE)); // TODO DO Still can't be removed in this case. } @@ -510,28 +505,18 @@ public class DevicePolicyManagerTest extends DpmTestBase { mContext.callerPermissions.clear(); dpm.removeActiveAdmin(admin1); - final ArgumentCaptor<BroadcastReceiver> brCap = - ArgumentCaptor.forClass(BroadcastReceiver.class); - - // Is removing now, but not removed yet. - assertTrue(dpm.isAdminActive(admin1)); - assertTrue(dpm.isRemovingAdmin(admin1, DpmMockContext.CALLER_USER_HANDLE)); - verify(mContext.spiedContext).sendOrderedBroadcastAsUser( MockUtils.checkIntentAction( DeviceAdminReceiver.ACTION_DEVICE_ADMIN_DISABLED), MockUtils.checkUserHandle(DpmMockContext.CALLER_USER_HANDLE), isNull(String.class), - brCap.capture(), + any(BroadcastReceiver.class), eq(dpms.mHandler), eq(Activity.RESULT_OK), isNull(String.class), isNull(Bundle.class)); - brCap.getValue().onReceive(mContext, null); - - assertFalse(dpm.isAdminActive(admin1)); - assertFalse(dpm.isRemovingAdmin(admin1, DpmMockContext.CALLER_USER_HANDLE)); + assertFalse(dpm.isAdminActiveAsUser(admin1, DpmMockContext.CALLER_USER_HANDLE)); // Again broadcast from saveSettingsLocked(). verify(mContext.spiedContext, times(2)).sendBroadcastAsUser( @@ -853,9 +838,7 @@ public class DevicePolicyManagerTest extends DpmTestBase { MockUtils.checkUserRestrictions() ); - assertTrue(dpm.isAdminActive(admin1)); - assertTrue(dpm.isRemovingAdmin(admin1, UserHandle.USER_SYSTEM)); - + assertFalse(dpm.isAdminActiveAsUser(admin1, UserHandle.USER_SYSTEM)); // TODO Check other calls. } @@ -945,7 +928,7 @@ public class DevicePolicyManagerTest extends DpmTestBase { // Check assertFalse(dpm.isProfileOwnerApp(admin1.getPackageName())); - assertTrue(dpm.isRemovingAdmin(admin1, DpmMockContext.CALLER_USER_HANDLE)); + assertFalse(dpm.isAdminActiveAsUser(admin1, DpmMockContext.CALLER_USER_HANDLE)); } public void testSetProfileOwner_failures() throws Exception { @@ -1477,7 +1460,7 @@ public class DevicePolicyManagerTest extends DpmTestBase { // Remove PO. dpm.clearProfileOwner(admin1); - + dpm.setActiveAdmin(admin1, false); // Test 4, Caller is DO now. assertTrue(dpm.setDeviceOwner(admin1, null, UserHandle.USER_SYSTEM)); @@ -1526,6 +1509,7 @@ public class DevicePolicyManagerTest extends DpmTestBase { // Remove PO and add DO. dpm.clearProfileOwner(admin1); + dpm.setActiveAdmin(admin1, false); assertTrue(dpm.setDeviceOwner(admin1, null, UserHandle.USER_SYSTEM)); // admin1 is DO. diff --git a/services/tests/servicestests/src/com/android/server/devicepolicy/DpmMockContext.java b/services/tests/servicestests/src/com/android/server/devicepolicy/DpmMockContext.java index f6e35f54f7d4..0783afc0dfd4 100644 --- a/services/tests/servicestests/src/com/android/server/devicepolicy/DpmMockContext.java +++ b/services/tests/servicestests/src/com/android/server/devicepolicy/DpmMockContext.java @@ -527,6 +527,7 @@ public class DpmMockContext extends MockContext { int initialCode, String initialData, Bundle initialExtras) { spiedContext.sendOrderedBroadcastAsUser(intent, user, receiverPermission, resultReceiver, scheduler, initialCode, initialData, initialExtras); + resultReceiver.onReceive(spiedContext, intent); } @Override diff --git a/services/tests/servicestests/src/com/android/server/pm/BaseShortcutManagerTest.java b/services/tests/servicestests/src/com/android/server/pm/BaseShortcutManagerTest.java index e7f33457bb5f..1c7a138468cf 100644 --- a/services/tests/servicestests/src/com/android/server/pm/BaseShortcutManagerTest.java +++ b/services/tests/servicestests/src/com/android/server/pm/BaseShortcutManagerTest.java @@ -247,20 +247,6 @@ public abstract class BaseShortcutManagerTest extends InstrumentationTestCase { } @Override - protected boolean isUserUnlockedL(@UserIdInt int userId) { - // Note due to a late change, now ShortcutManager doesn't use - // UserManager.isUserUnlockingOrUnlocked(). But all unit tests are still using it, - // so we convert here. - - final long token = injectClearCallingIdentity(); - try { - return mMockUserManager.isUserUnlockingOrUnlocked(userId); - } finally { - injectRestoreCallingIdentity(token); - } - } - - @Override int injectDipToPixel(int dip) { return dip; } diff --git a/services/tests/servicestests/src/com/android/server/pm/ShortcutManagerTest1.java b/services/tests/servicestests/src/com/android/server/pm/ShortcutManagerTest1.java index 4bd0d6fb9b38..253334eec9cf 100644 --- a/services/tests/servicestests/src/com/android/server/pm/ShortcutManagerTest1.java +++ b/services/tests/servicestests/src/com/android/server/pm/ShortcutManagerTest1.java @@ -57,13 +57,11 @@ import static org.mockito.Matchers.any; import static org.mockito.Matchers.anyInt; import static org.mockito.Matchers.anyString; import static org.mockito.Matchers.eq; -import static org.mockito.Mockito.doAnswer; import static org.mockito.Mockito.doReturn; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.reset; import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; -import static org.mockito.Mockito.when; import android.Manifest.permission; import android.app.ActivityManager; @@ -82,6 +80,7 @@ import android.net.Uri; import android.os.Bundle; import android.os.Handler; import android.os.Looper; +import android.os.Process; import android.os.UserHandle; import android.test.suitebuilder.annotation.SmallTest; import android.util.Log; @@ -5153,7 +5152,7 @@ public class ShortcutManagerTest1 extends BaseShortcutManagerTest { } - public void testBackupAndRestore_manifestNotRestored() { + public void testBackupAndRestore_manifestRePublished() { // Publish two manifest shortcuts. addManifestShortcutResource( new ComponentName(CALLING_PACKAGE_1, ShortcutActivity.class.getName()), @@ -5162,9 +5161,15 @@ public class ShortcutManagerTest1 extends BaseShortcutManagerTest { mService.mPackageMonitor.onReceive(mServiceContext, genPackageAddIntent(CALLING_PACKAGE_1, USER_0)); + runWithCaller(CALLING_PACKAGE_1, USER_0, () -> { + assertTrue(mManager.setDynamicShortcuts(list( + makeShortcut("s1"), makeShortcut("s2"), makeShortcut("s3")))); + }); + // Pin from launcher 1. runWithCaller(LAUNCHER_1, USER_0, () -> { - mLauncherApps.pinShortcuts(CALLING_PACKAGE_1, list("ms1", "ms2"), HANDLE_USER_0); + mLauncherApps.pinShortcuts(CALLING_PACKAGE_1, + list("ms1", "ms2", "s1", "s2"), HANDLE_USER_0); }); // Update and now ms2 is gone -> disabled. @@ -5178,9 +5183,18 @@ public class ShortcutManagerTest1 extends BaseShortcutManagerTest { // Make sure the manifest shortcuts have been published. runWithCaller(CALLING_PACKAGE_1, USER_0, () -> { assertWith(getCallerShortcuts()) - .areAllPinned() - .haveIds("ms1", "ms2") + .selectManifest() + .haveIds("ms1") + .revertToOriginalList() + .selectDynamic() + .haveIds("s1", "s2", "s3") + + .revertToOriginalList() + .selectPinned() + .haveIds("ms1", "ms2", "s1", "s2") + + .revertToOriginalList() .selectByIds("ms1") .areAllManifest() .areAllEnabled() @@ -5191,10 +5205,130 @@ public class ShortcutManagerTest1 extends BaseShortcutManagerTest { .areAllDisabled(); }); - // Now do the regular backup & restore test. - // The existence of the manifest shortcuts shouldn't affect the result. - prepareCrossProfileDataSet(); backupAndRestore(); + + // When re-installing the app, the manifest shortcut should be re-published. + mService.mPackageMonitor.onReceive(mServiceContext, + genPackageAddIntent(CALLING_PACKAGE_1, USER_0)); + mService.mPackageMonitor.onReceive(mServiceContext, + genPackageAddIntent(LAUNCHER_1, USER_0)); + + runWithCaller(CALLING_PACKAGE_1, USER_0, () -> { + assertWith(getCallerVisibleShortcuts()) + .selectPinned() + // ms2 was disabled, so not restored. + .haveIds("ms1", "s1", "s2") + .areAllEnabled() + + .revertToOriginalList() + .selectByIds("ms1") + .areAllManifest() + + .revertToOriginalList() + .selectByIds("s1", "s2") + .areAllNotDynamic() + ; + }); + } + + /** + * It's the case with preintalled apps -- when applyRestore() is called, the system + * apps are already installed, so manifest shortcuts need to be re-published. + */ + public void testBackupAndRestore_appAlreadyInstalledWhenRestored() { + // Pre-backup. Same as testBackupAndRestore_manifestRePublished(). + + // Publish two manifest shortcuts. + addManifestShortcutResource( + new ComponentName(CALLING_PACKAGE_1, ShortcutActivity.class.getName()), + R.xml.shortcut_2); + updatePackageVersion(CALLING_PACKAGE_1, 1); + mService.mPackageMonitor.onReceive(mServiceContext, + genPackageAddIntent(CALLING_PACKAGE_1, USER_0)); + + runWithCaller(CALLING_PACKAGE_1, USER_0, () -> { + assertTrue(mManager.setDynamicShortcuts(list( + makeShortcut("s1"), makeShortcut("s2"), makeShortcut("s3")))); + }); + + // Pin from launcher 1. + runWithCaller(LAUNCHER_1, USER_0, () -> { + mLauncherApps.pinShortcuts(CALLING_PACKAGE_1, + list("ms1", "ms2", "s1", "s2"), HANDLE_USER_0); + }); + + // Update and now ms2 is gone -> disabled. + addManifestShortcutResource( + new ComponentName(CALLING_PACKAGE_1, ShortcutActivity.class.getName()), + R.xml.shortcut_1); + updatePackageVersion(CALLING_PACKAGE_1, 1); + mService.mPackageMonitor.onReceive(mServiceContext, + genPackageAddIntent(CALLING_PACKAGE_1, USER_0)); + + // Make sure the manifest shortcuts have been published. + runWithCaller(CALLING_PACKAGE_1, USER_0, () -> { + assertWith(getCallerShortcuts()) + .selectManifest() + .haveIds("ms1") + + .revertToOriginalList() + .selectDynamic() + .haveIds("s1", "s2", "s3") + + .revertToOriginalList() + .selectPinned() + .haveIds("ms1", "ms2", "s1", "s2") + + .revertToOriginalList() + .selectByIds("ms1") + .areAllManifest() + .areAllEnabled() + + .revertToOriginalList() + .selectByIds("ms2") + .areAllNotManifest() + .areAllDisabled(); + }); + + // Backup and *without restarting the service, just call applyRestore()*. + { + int prevUid = mInjectedCallingUid; + mInjectedCallingUid = Process.SYSTEM_UID; // Only system can call it. + + dumpsysOnLogcat("Before backup"); + + final byte[] payload = mService.getBackupPayload(USER_0); + if (ENABLE_DUMP) { + final String xml = new String(payload); + Log.v(TAG, "Backup payload:"); + for (String line : xml.split("\n")) { + Log.v(TAG, line); + } + } + mService.applyRestore(payload, USER_0); + + dumpsysOnLogcat("After restore"); + + mInjectedCallingUid = prevUid; + } + + // The check is also the same as testBackupAndRestore_manifestRePublished(). + runWithCaller(CALLING_PACKAGE_1, USER_0, () -> { + assertWith(getCallerVisibleShortcuts()) + .selectPinned() + // ms2 was disabled, so not restored. + .haveIds("ms1", "s1", "s2") + .areAllEnabled() + + .revertToOriginalList() + .selectByIds("ms1") + .areAllManifest() + + .revertToOriginalList() + .selectByIds("s1", "s2") + .areAllNotDynamic() + ; + }); } public void testSaveAndLoad_crossProfile() { @@ -5729,6 +5863,7 @@ public class ShortcutManagerTest1 extends BaseShortcutManagerTest { assertEmpty(mManager.getPinnedShortcuts()); }); // Send add broadcast, but the user is not running, so should be ignored. + mService.handleCleanupUser(USER_10); mRunningUsers.put(USER_10, false); mUnlockedUsers.put(USER_10, false); diff --git a/services/tests/servicestests/src/com/android/server/pm/ShortcutManagerTest2.java b/services/tests/servicestests/src/com/android/server/pm/ShortcutManagerTest2.java index ad5bc7730833..d25923c019ca 100644 --- a/services/tests/servicestests/src/com/android/server/pm/ShortcutManagerTest2.java +++ b/services/tests/servicestests/src/com/android/server/pm/ShortcutManagerTest2.java @@ -2005,4 +2005,36 @@ public class ShortcutManagerTest2 extends BaseShortcutManagerTest { }); }); } + + public void testIsUserUnlocked() { + mRunningUsers.clear(); + mUnlockedUsers.clear(); + + assertFalse(mService.isUserUnlockedL(USER_0)); + assertFalse(mService.isUserUnlockedL(USER_10)); + + // Start user 0, still locked. + mRunningUsers.put(USER_0, true); + assertFalse(mService.isUserUnlockedL(USER_0)); + assertFalse(mService.isUserUnlockedL(USER_10)); + + // Unlock user. + mUnlockedUsers.put(USER_0, true); + assertTrue(mService.isUserUnlockedL(USER_0)); + assertFalse(mService.isUserUnlockedL(USER_10)); + + // Clear again. + mRunningUsers.clear(); + mUnlockedUsers.clear(); + + // Directly call the lifecycle event. Now also locked. + mService.handleUnlockUser(USER_0); + assertTrue(mService.isUserUnlockedL(USER_0)); + assertFalse(mService.isUserUnlockedL(USER_10)); + + // Directly call the stop lifecycle event. Goes back to the initial state. + mService.handleCleanupUser(USER_0); + assertFalse(mService.isUserUnlockedL(USER_0)); + assertFalse(mService.isUserUnlockedL(USER_10)); + } } diff --git a/telephony/java/android/telephony/CarrierConfigManager.java b/telephony/java/android/telephony/CarrierConfigManager.java index f14474fdaddb..a171d9d4c40d 100644 --- a/telephony/java/android/telephony/CarrierConfigManager.java +++ b/telephony/java/android/telephony/CarrierConfigManager.java @@ -900,6 +900,19 @@ public class CarrierConfigManager { public static final String KEY_ENHANCED_4G_LTE_TITLE_VARIANT_BOOL = "enhanced_4g_lte_title_variant_bool"; + /** + * Indicates whether the carrier wants to notify the user when handover of an LTE video call to + * WIFI fails. + * <p> + * When {@code true}, if a video call starts on LTE and the modem reports a failure to handover + * the call to WIFI or if no handover success is reported within 60 seconds of call initiation, + * the {@link android.telephony.TelephonyManager#EVENT_HANDOVER_TO_WIFI_FAILED} event is raised + * on the connection. + * @hide + */ + public static final String KEY_NOTIFY_VT_HANDOVER_TO_WIFI_FAILURE_BOOL = + "notify_vt_handover_to_wifi_failure_bool"; + /** The default value for every variable. */ private final static PersistableBundle sDefaults; @@ -1065,6 +1078,7 @@ public class CarrierConfigManager { sDefaults.putStringArray(KEY_IMS_REASONINFO_MAPPING_STRING_ARRAY, null); sDefaults.putBoolean(KEY_ENHANCED_4G_LTE_TITLE_VARIANT_BOOL, false); + sDefaults.putBoolean(KEY_NOTIFY_VT_HANDOVER_TO_WIFI_FAILURE_BOOL, false); } /** diff --git a/telephony/java/android/telephony/DisconnectCause.java b/telephony/java/android/telephony/DisconnectCause.java index d7d4e840aa77..f5e422df7511 100644 --- a/telephony/java/android/telephony/DisconnectCause.java +++ b/telephony/java/android/telephony/DisconnectCause.java @@ -212,6 +212,20 @@ public class DisconnectCause { */ public static final int MAXIMUM_NUMBER_OF_CALLS_REACHED = 53; + /** + * The call was terminated because cellular data has been disabled. + * Used when in a video call and the user disables cellular data via the settings. + * {@hide} + */ + public static final int DATA_DISABLED = 54; + + /** + * The call was terminated because the data policy has disabled cellular data. + * Used when in a video call and the user has exceeded the device data limit. + * {@hide} + */ + public static final int DATA_LIMIT_REACHED = 55; + //********************************************************************************************* // When adding a disconnect type: // 1) Please assign the new type the next id value below. @@ -220,14 +234,14 @@ public class DisconnectCause { // 4) Update toString() with the newly added disconnect type. // 5) Update android.telecom.DisconnectCauseUtil with any mappings to a telecom.DisconnectCause. // - // NextId: 54 + // NextId: 56 //********************************************************************************************* /** Smallest valid value for call disconnect codes. */ public static final int MINIMUM_VALID_VALUE = NOT_DISCONNECTED; /** Largest valid value for call disconnect codes. */ - public static final int MAXIMUM_VALID_VALUE = MAXIMUM_NUMBER_OF_CALLS_REACHED; + public static final int MAXIMUM_VALID_VALUE = DATA_LIMIT_REACHED; /** Private constructor to avoid class instantiation. */ private DisconnectCause() { @@ -343,6 +357,10 @@ public class DisconnectCause { return "ANSWERED_ELSEWHERE"; case MAXIMUM_NUMBER_OF_CALLS_REACHED: return "MAXIMUM_NUMER_OF_CALLS_REACHED"; + case DATA_DISABLED: + return "DATA_DISABLED"; + case DATA_LIMIT_REACHED: + return "DATA_LIMIT_REACHED"; default: return "INVALID: " + cause; } diff --git a/telephony/java/android/telephony/TelephonyManager.java b/telephony/java/android/telephony/TelephonyManager.java index ea4ea14a43c5..759ea1d2b8ac 100644 --- a/telephony/java/android/telephony/TelephonyManager.java +++ b/telephony/java/android/telephony/TelephonyManager.java @@ -2484,6 +2484,56 @@ public class TelephonyManager { } /** + * Enables or disables the visual voicemail client for a phone account. + * + * <p>Requires that the calling app is the default dialer, or has carrier privileges, or + * has permission {@link android.Manifest.permission#MODIFY_PHONE_STATE MODIFY_PHONE_STATE}. + * @see #hasCarrierPrivileges + * + * @param phoneAccountHandle the phone account to change the client state + * @param enabled the new state of the client + * @hide + */ + @SystemApi + public void setVisualVoicemailEnabled(PhoneAccountHandle phoneAccountHandle, boolean enabled){ + try { + ITelephony telephony = getITelephony(); + if (telephony != null) { + telephony.setVisualVoicemailEnabled(mContext.getOpPackageName(), phoneAccountHandle, + enabled); + } + } catch (RemoteException ex) { + } catch (NullPointerException ex) { + // This could happen before phone restarts due to crashing + } + } + + /** + * Returns whether the visual voicemail client is enabled. + * + * <p>Requires Permission: + * {@link android.Manifest.permission#READ_PHONE_STATE READ_PHONE_STATE} + * + * @param phoneAccountHandle the phone account to check for. + * @return {@code true} when the visual voicemail client is enabled for this client + * @hide + */ + @SystemApi + public boolean isVisualVoicemailEnabled(PhoneAccountHandle phoneAccountHandle){ + try { + ITelephony telephony = getITelephony(); + if (telephony != null) { + return telephony.isVisualVoicemailEnabled( + mContext.getOpPackageName(), phoneAccountHandle); + } + } catch (RemoteException ex) { + } catch (NullPointerException ex) { + // This could happen before phone restarts due to crashing + } + return false; + } + + /** * Enables the visual voicemail SMS filter for a phone account. When the filter is * enabled, Incoming SMS messages matching the OMTP VVM SMS interface will be redirected to the * visual voicemail client with diff --git a/telephony/java/com/android/ims/ImsReasonInfo.java b/telephony/java/com/android/ims/ImsReasonInfo.java index 408ad31674c4..56b882221cd7 100644 --- a/telephony/java/com/android/ims/ImsReasonInfo.java +++ b/telephony/java/com/android/ims/ImsReasonInfo.java @@ -298,6 +298,16 @@ public class ImsReasonInfo implements Parcelable { public static final int CODE_REMOTE_CALL_DECLINE = 1404; /** + * Indicates the call was disconnected due to the user reaching their data limit. + */ + public static final int CODE_DATA_LIMIT_REACHED = 1405; + + /** + * Indicates the call was disconnected due to the user disabling cellular data. + */ + public static final int CODE_DATA_DISABLED = 1406; + + /** * Network string error messages. * mExtraMessage may have these values. */ diff --git a/telephony/java/com/android/internal/telephony/ITelephony.aidl b/telephony/java/com/android/internal/telephony/ITelephony.aidl index 7e7071ee173a..a8eaf3627013 100644 --- a/telephony/java/com/android/internal/telephony/ITelephony.aidl +++ b/telephony/java/com/android/internal/telephony/ITelephony.aidl @@ -454,6 +454,12 @@ interface ITelephony { */ int getVoiceMessageCountForSubscriber(int subId); + oneway void setVisualVoicemailEnabled(String callingPackage, + in PhoneAccountHandle accountHandle, boolean enabled); + + boolean isVisualVoicemailEnabled(String callingPackage, + in PhoneAccountHandle accountHandle); + // Not oneway, caller needs to make sure the vaule is set before receiving a SMS void enableVisualVoicemailSmsFilter(String callingPackage, int subId, in VisualVoicemailSmsFilterSettings settings); |