Merge "Remove scaling bucket hack" into lmp-dev
diff --git a/Android.mk b/Android.mk
index 4376ed6..273f5f6 100644
--- a/Android.mk
+++ b/Android.mk
@@ -186,6 +186,7 @@
core/java/android/nfc/INfcTag.aidl \
core/java/android/nfc/INfcCardEmulation.aidl \
core/java/android/nfc/INfcLockscreenDispatch.aidl \
+ core/java/android/nfc/INfcUnlockHandler.aidl \
core/java/android/os/IBatteryPropertiesListener.aidl \
core/java/android/os/IBatteryPropertiesRegistrar.aidl \
core/java/android/os/ICancellationSignal.aidl \
@@ -360,6 +361,8 @@
telephony/java/com/android/ims/internal/IImsCallSessionListener.aidl \
telephony/java/com/android/ims/internal/IImsConfig.aidl \
telephony/java/com/android/ims/internal/IImsRegistrationListener.aidl \
+ telephony/java/com/android/ims/internal/IImsEcbm.aidl \
+ telephony/java/com/android/ims/internal/IImsEcbmListener.aidl \
telephony/java/com/android/ims/internal/IImsService.aidl \
telephony/java/com/android/ims/internal/IImsStreamMediaSession.aidl \
telephony/java/com/android/ims/internal/IImsUt.aidl \
diff --git a/api/current.txt b/api/current.txt
index a3a99c7..5f23a36 100644
--- a/api/current.txt
+++ b/api/current.txt
@@ -465,6 +465,7 @@
field public static final int contentInsetLeft = 16843863; // 0x1010457
field public static final int contentInsetRight = 16843864; // 0x1010458
field public static final int contentInsetStart = 16843861; // 0x1010455
+ field public static final int contentRatingSystemXml = 16843957; // 0x10104b5
field public static final int controlX1 = 16843798; // 0x1010416
field public static final int controlX2 = 16843800; // 0x1010418
field public static final int controlY1 = 16843799; // 0x1010417
@@ -1123,6 +1124,7 @@
field public static final int showDividers = 16843561; // 0x1010329
field public static final int showOnLockScreen = 16843721; // 0x10103c9
field public static final int showSilent = 16843259; // 0x10101fb
+ field public static final int showText = 16843952; // 0x10104b0
field public static final int showWeekNumber = 16843582; // 0x101033e
field public static final int shownWeekCount = 16843585; // 0x1010341
field public static final int shrinkColumns = 16843082; // 0x101014a
@@ -1434,8 +1436,12 @@
field public static final int windowNoDisplay = 16843294; // 0x101021e
field public static final int windowNoTitle = 16842838; // 0x1010056
field public static final int windowOverscan = 16843727; // 0x10103cf
+ field public static final int windowReenterTransition = 16843954; // 0x10104b2
+ field public static final int windowReturnTransition = 16843953; // 0x10104b1
field public static final int windowSharedElementEnterTransition = 16843835; // 0x101043b
field public static final int windowSharedElementExitTransition = 16843836; // 0x101043c
+ field public static final int windowSharedElementReenterTransition = 16843956; // 0x10104b4
+ field public static final int windowSharedElementReturnTransition = 16843955; // 0x10104b3
field public static final int windowShowAnimation = 16842934; // 0x10100b6
field public static final int windowShowWallpaper = 16843410; // 0x1010292
field public static final int windowSoftInputMode = 16843307; // 0x101022b
@@ -4691,6 +4697,7 @@
field public android.os.Bundle extras;
field public int flags;
field public android.app.PendingIntent fullScreenIntent;
+ field public android.widget.RemoteViews headsUpContentView;
field public int icon;
field public int iconLevel;
field public android.graphics.Bitmap largeIcon;
@@ -5219,6 +5226,7 @@
field public static java.lang.String ACTION_EXIT_DESK_MODE;
field public static final int DISABLE_CAR_MODE_GO_HOME = 1; // 0x1
field public static final int ENABLE_CAR_MODE_GO_CAR_HOME = 1; // 0x1
+ field public static final int ENABLE_CAR_MODE_NO_WAKE_LOCK = 2; // 0x2
field public static final int MODE_NIGHT_AUTO = 0; // 0x0
field public static final int MODE_NIGHT_NO = 1; // 0x1
field public static final int MODE_NIGHT_YES = 2; // 0x2
@@ -6574,22 +6582,20 @@
method public int describeContents();
method public boolean getIncludeDeviceName();
method public boolean getIncludeTxPowerLevel();
- method public int getManufacturerId();
- method public byte[] getManufacturerSpecificData();
- method public byte[] getServiceData();
- method public android.os.ParcelUuid getServiceDataUuid();
+ method public android.util.SparseArray<byte[]> getManufacturerSpecificData();
+ method public java.util.Map<android.os.ParcelUuid, byte[]> getServiceData();
method public java.util.List<android.os.ParcelUuid> getServiceUuids();
method public void writeToParcel(android.os.Parcel, int);
}
public static final class AdvertiseData.Builder {
ctor public AdvertiseData.Builder();
+ method public android.bluetooth.le.AdvertiseData.Builder addManufacturerData(int, byte[]);
+ method public android.bluetooth.le.AdvertiseData.Builder addServiceData(android.os.ParcelUuid, byte[]);
method public android.bluetooth.le.AdvertiseData.Builder addServiceUuid(android.os.ParcelUuid);
method public android.bluetooth.le.AdvertiseData build();
method public android.bluetooth.le.AdvertiseData.Builder setIncludeDeviceName(boolean);
method public android.bluetooth.le.AdvertiseData.Builder setIncludeTxPowerLevel(boolean);
- method public android.bluetooth.le.AdvertiseData.Builder setManufacturerData(int, byte[]);
- method public android.bluetooth.le.AdvertiseData.Builder setServiceData(android.os.ParcelUuid, byte[]);
}
public final class AdvertiseSettings implements android.os.Parcelable {
@@ -6650,6 +6656,7 @@
method public int getManufacturerId();
method public byte[] getServiceData();
method public byte[] getServiceDataMask();
+ method public android.os.ParcelUuid getServiceDataUuid();
method public android.os.ParcelUuid getServiceUuid();
method public android.os.ParcelUuid getServiceUuidMask();
method public boolean matches(android.bluetooth.le.ScanResult);
@@ -6673,10 +6680,10 @@
method public int getAdvertiseFlags();
method public byte[] getBytes();
method public java.lang.String getDeviceName();
- method public int getManufacturerId();
- method public byte[] getManufacturerSpecificData();
- method public byte[] getServiceData();
- method public android.os.ParcelUuid getServiceDataUuid();
+ method public android.util.SparseArray<byte[]> getManufacturerSpecificData();
+ method public byte[] getManufacturerSpecificData(int);
+ method public java.util.Map<android.os.ParcelUuid, byte[]> getServiceData();
+ method public byte[] getServiceData(android.os.ParcelUuid);
method public java.util.List<android.os.ParcelUuid> getServiceUuids();
method public int getTxPowerLevel();
}
@@ -8513,9 +8520,11 @@
method public android.graphics.Bitmap getAppIcon();
method public java.lang.CharSequence getAppLabel();
method public java.lang.String getAppPackageName();
+ method public android.content.Intent getDetailsIntent();
method public java.lang.String getInstallerPackageName();
method public float getProgress();
method public int getSessionId();
+ method public boolean isOpen();
method public void writeToParcel(android.os.Parcel, int);
field public static final android.os.Parcelable.Creator CREATOR;
}
@@ -8529,7 +8538,6 @@
method public void setInstallLocation(int);
method public void setOriginatingUri(android.net.Uri);
method public void setReferrerUri(android.net.Uri);
- method public void setSignatures(android.content.pm.Signature[]);
method public void setSize(long);
method public void writeToParcel(android.os.Parcel, int);
field public static final android.os.Parcelable.Creator CREATOR;
@@ -8645,6 +8653,8 @@
method public android.content.pm.PackageInstaller.Session openSession(int);
method public void removeSessionCallback(android.content.pm.PackageInstaller.SessionCallback);
method public void uninstall(java.lang.String, android.content.pm.PackageInstaller.UninstallCallback);
+ field public static final java.lang.String ACTION_SESSION_DETAILS = "android.content.pm.action.SESSION_DETAILS";
+ field public static final java.lang.String EXTRA_SESSION_ID = "android.content.pm.extra.SESSION_ID";
}
public static abstract class PackageInstaller.CommitCallback {
@@ -8664,14 +8674,18 @@
method public void close();
method public void commit(android.content.pm.PackageInstaller.CommitCallback);
method public void fsync(java.io.OutputStream) throws java.io.IOException;
+ method public java.lang.String[] list();
+ method public java.io.InputStream openRead(java.lang.String) throws java.io.IOException;
method public java.io.OutputStream openWrite(java.lang.String, long, long) throws java.io.IOException;
method public void setProgress(float);
}
public static abstract class PackageInstaller.SessionCallback {
ctor public PackageInstaller.SessionCallback();
+ method public abstract void onClosed(int);
method public abstract void onCreated(int);
method public abstract void onFinished(int, boolean);
+ method public abstract void onOpened(int);
method public abstract void onProgressChanged(int, float);
}
@@ -13276,6 +13290,11 @@
field public static final int MONITOR_CURRENTLY_AVAILABLE = 0; // 0x0
field public static final int MONITOR_CURRENTLY_UNAVAILABLE = 1; // 0x1
field public static final int MONITOR_UNSUPPORTED = 2; // 0x2
+ field public static final int SOURCE_TECHNOLOGY_BLUETOOTH = 16; // 0x10
+ field public static final int SOURCE_TECHNOLOGY_CELL = 8; // 0x8
+ field public static final int SOURCE_TECHNOLOGY_GNSS = 1; // 0x1
+ field public static final int SOURCE_TECHNOLOGY_SENSORS = 4; // 0x4
+ field public static final int SOURCE_TECHNOLOGY_WIFI = 2; // 0x2
}
public abstract class GeofenceHardwareCallback {
@@ -13289,7 +13308,19 @@
public abstract class GeofenceHardwareMonitorCallback {
ctor public GeofenceHardwareMonitorCallback();
- method public void onMonitoringSystemChange(int, boolean, android.location.Location);
+ method public deprecated void onMonitoringSystemChange(int, boolean, android.location.Location);
+ method public void onMonitoringSystemChange(android.hardware.location.GeofenceHardwareMonitorEvent);
+ }
+
+ public class GeofenceHardwareMonitorEvent implements android.os.Parcelable {
+ ctor public GeofenceHardwareMonitorEvent(int, int, int, android.location.Location);
+ method public int describeContents();
+ method public android.location.Location getLocation();
+ method public int getMonitoringStatus();
+ method public int getMonitoringType();
+ method public int getSourceTechnologies();
+ method public void writeToParcel(android.os.Parcel, int);
+ field public static final android.os.Parcelable.Creator CREATOR;
}
public final class GeofenceHardwareRequest {
@@ -13301,10 +13332,12 @@
method public int getMonitorTransitions();
method public int getNotificationResponsiveness();
method public double getRadius();
+ method public int getSourceTechnologies();
method public int getUnknownTimer();
method public void setLastTransition(int);
method public void setMonitorTransitions(int);
method public void setNotificationResponsiveness(int);
+ method public void setSourceTechnologies(int);
method public void setUnknownTimer(int);
}
@@ -14074,6 +14107,9 @@
}
public class AudioFormat {
+ method public int getChannelMask();
+ method public int getEncoding();
+ method public int getSampleRate();
field public static final deprecated int CHANNEL_CONFIGURATION_DEFAULT = 1; // 0x1
field public static final deprecated int CHANNEL_CONFIGURATION_INVALID = 0; // 0x0
field public static final deprecated int CHANNEL_CONFIGURATION_MONO = 2; // 0x2
@@ -16811,28 +16847,14 @@
package android.media.tv {
public final class TvContentRating {
- ctor public TvContentRating(java.lang.String);
- ctor public TvContentRating(java.lang.String, java.lang.String[]);
+ method public static android.media.tv.TvContentRating createRating(java.lang.String, java.lang.String, java.lang.String, java.lang.String, java.lang.String...);
method public java.lang.String flattenToString();
+ method public java.lang.String getCountry();
+ method public java.lang.String getDomain();
method public java.lang.String getMainRating();
+ method public java.lang.String getRatingSystem();
method public java.util.List<java.lang.String> getSubRatings();
method public static android.media.tv.TvContentRating unflattenFromString(java.lang.String);
- field public static final java.lang.String RATING_KR_12 = "RATING_KR_12";
- field public static final java.lang.String RATING_KR_15 = "RATING_KR_15";
- field public static final java.lang.String RATING_KR_19 = "RATING_KR_19";
- field public static final java.lang.String RATING_KR_7 = "RATING_KR_7";
- field public static final java.lang.String RATING_KR_ALL = "RATING_KR_ALL";
- field public static final java.lang.String RATING_US_TV_14 = "RATING_US_TV_14";
- field public static final java.lang.String RATING_US_TV_G = "RATING_US_TV_G";
- field public static final java.lang.String RATING_US_TV_MA = "RATING_US_TV_MA";
- field public static final java.lang.String RATING_US_TV_PG = "RATING_US_TV_PG";
- field public static final java.lang.String RATING_US_TV_Y = "RATING_US_TV_Y";
- field public static final java.lang.String RATING_US_TV_Y7 = "RATING_US_TV_Y7";
- field public static final java.lang.String SUBRATING_US_D = "SUBRATING_US_D";
- field public static final java.lang.String SUBRATING_US_FV = "SUBRATING_US_FV";
- field public static final java.lang.String SUBRATING_US_L = "SUBRATING_US_L";
- field public static final java.lang.String SUBRATING_US_S = "SUBRATING_US_S";
- field public static final java.lang.String SUBRATING_US_V = "SUBRATING_US_V";
}
public final class TvContract {
@@ -17044,6 +17066,7 @@
method public void notifyContentAllowed();
method public void notifyContentBlocked(android.media.tv.TvContentRating);
method public void notifyTrackInfoChanged(java.util.List<android.media.tv.TvTrackInfo>);
+ method public void notifyTrackSelectionChanged(java.util.List<android.media.tv.TvTrackInfo>);
method public void notifyVideoAvailable();
method public void notifyVideoUnavailable(int);
method public android.view.View onCreateOverlayView();
@@ -17067,33 +17090,30 @@
}
public final class TvTrackInfo implements android.os.Parcelable {
- method public boolean containsKey(java.lang.String);
method public int describeContents();
- method public boolean getBoolean(java.lang.String);
- method public int getInt(java.lang.String);
- method public java.lang.String getString(java.lang.String);
+ method public final int getAudioChannelCount();
+ method public final int getAudioSampleRate();
+ method public final android.os.Bundle getExtra();
+ method public final java.lang.String getLanguage();
+ method public final int getType();
+ method public final int getVideoHeight();
+ method public final int getVideoWidth();
method public void writeToParcel(android.os.Parcel, int);
field public static final android.os.Parcelable.Creator CREATOR;
- field public static final java.lang.String KEY_CHANNEL_COUNT = "channel-count";
- field public static final java.lang.String KEY_HEIGHT = "height";
- field public static final java.lang.String KEY_IS_SELECTED = "is-selected";
- field public static final java.lang.String KEY_LANGUAGE = "language";
- field public static final java.lang.String KEY_SAMPLE_RATE = "sample-rate";
- field public static final java.lang.String KEY_TAG = "tag";
- field public static final java.lang.String KEY_TYPE = "type";
- field public static final java.lang.String KEY_WIDTH = "width";
- field public static final int VALUE_TYPE_AUDIO = 0; // 0x0
- field public static final int VALUE_TYPE_SUBTITLE = 2; // 0x2
- field public static final int VALUE_TYPE_VIDEO = 1; // 0x1
+ field public static final int TYPE_AUDIO = 0; // 0x0
+ field public static final int TYPE_SUBTITLE = 2; // 0x2
+ field public static final int TYPE_VIDEO = 1; // 0x1
}
public static final class TvTrackInfo.Builder {
- ctor public TvTrackInfo.Builder(int, java.lang.String, boolean);
- ctor public TvTrackInfo.Builder(android.media.tv.TvTrackInfo);
+ ctor public TvTrackInfo.Builder(int);
method public android.media.tv.TvTrackInfo build();
- method public android.media.tv.TvTrackInfo.Builder putBoolean(java.lang.String, boolean);
- method public android.media.tv.TvTrackInfo.Builder putInt(java.lang.String, int);
- method public android.media.tv.TvTrackInfo.Builder putString(java.lang.String, java.lang.String);
+ method public final android.media.tv.TvTrackInfo.Builder setAudioChannelCount(int);
+ method public final android.media.tv.TvTrackInfo.Builder setAudioSampleRate(int);
+ method public final android.media.tv.TvTrackInfo.Builder setExtra(android.os.Bundle);
+ method public final android.media.tv.TvTrackInfo.Builder setLanguage(java.lang.String);
+ method public final android.media.tv.TvTrackInfo.Builder setVideoHeight(int);
+ method public final android.media.tv.TvTrackInfo.Builder setVideoWidth(int);
}
public class TvView extends android.view.ViewGroup {
@@ -17101,6 +17121,7 @@
ctor public TvView(android.content.Context, android.util.AttributeSet);
ctor public TvView(android.content.Context, android.util.AttributeSet, int);
method public boolean dispatchUnhandledInputEvent(android.view.InputEvent);
+ method public java.util.List<android.media.tv.TvTrackInfo> getSelectedTracks();
method public java.util.List<android.media.tv.TvTrackInfo> getTracks();
method protected void onLayout(boolean, int, int, int, int);
method public boolean onUnhandledInputEvent(android.view.InputEvent);
@@ -17127,6 +17148,7 @@
method public void onContentBlocked(java.lang.String, android.media.tv.TvContentRating);
method public void onError(java.lang.String, int);
method public void onTrackInfoChanged(java.lang.String, java.util.List<android.media.tv.TvTrackInfo>);
+ method public void onTrackSelectionChanged(java.lang.String, java.util.List<android.media.tv.TvTrackInfo>);
method public void onVideoAvailable(java.lang.String);
method public void onVideoSizeChanged(java.lang.String, int, int);
method public void onVideoUnavailable(java.lang.String, int);
@@ -17453,10 +17475,15 @@
method public java.net.URL getBoundURL(java.net.URL) throws java.net.MalformedURLException;
method public java.net.InetAddress getByName(java.lang.String) throws java.net.UnknownHostException;
method public javax.net.SocketFactory getSocketFactory();
+ method public static void setNetworkBoundURLFactory(android.net.NetworkBoundURLFactory);
method public void writeToParcel(android.os.Parcel, int);
field public static final android.os.Parcelable.Creator CREATOR;
}
+ public abstract interface NetworkBoundURLFactory {
+ method public abstract java.net.URL getBoundURL(android.net.Network, java.net.URL) throws java.net.MalformedURLException;
+ }
+
public final class NetworkCapabilities implements android.os.Parcelable {
ctor public NetworkCapabilities(android.net.NetworkCapabilities);
method public int describeContents();
@@ -27466,17 +27493,17 @@
public class AlwaysOnHotwordDetector {
method public android.content.Intent getManageIntent(int);
method public int getSupportedRecognitionModes();
- method public void startRecognition(int);
- method public void stopRecognition();
+ method public boolean startRecognition(int);
+ method public boolean stopRecognition();
field public static final int MANAGE_ACTION_ENROLL = 0; // 0x0
field public static final int MANAGE_ACTION_RE_ENROLL = 1; // 0x1
field public static final int MANAGE_ACTION_UN_ENROLL = 2; // 0x2
+ field public static final int RECOGNITION_FLAG_ALLOW_MULTIPLE_TRIGGERS = 2; // 0x2
field public static final int RECOGNITION_FLAG_CAPTURE_TRIGGER_AUDIO = 1; // 0x1
field public static final int RECOGNITION_FLAG_NONE = 0; // 0x0
field public static final int RECOGNITION_MODE_USER_IDENTIFICATION = 2; // 0x2
field public static final int RECOGNITION_MODE_VOICE_TRIGGER = 1; // 0x1
field public static final int STATE_HARDWARE_UNAVAILABLE = -2; // 0xfffffffe
- field public static final int STATE_INVALID = -3; // 0xfffffffd
field public static final int STATE_KEYPHRASE_ENROLLED = 2; // 0x2
field public static final int STATE_KEYPHRASE_UNENROLLED = 1; // 0x1
field public static final int STATE_KEYPHRASE_UNSUPPORTED = -1; // 0xffffffff
@@ -27484,12 +27511,15 @@
public static abstract interface AlwaysOnHotwordDetector.Callback {
method public abstract void onAvailabilityChanged(int);
- method public abstract void onDetected(byte[]);
- method public abstract void onDetectionStarted();
- method public abstract void onDetectionStopped();
+ method public abstract void onDetected(android.service.voice.AlwaysOnHotwordDetector.TriggerAudio);
method public abstract void onError();
}
+ public static class AlwaysOnHotwordDetector.TriggerAudio {
+ field public final android.media.AudioFormat audioFormat;
+ field public final byte[] data;
+ }
+
public class VoiceInteractionService extends android.app.Service {
ctor public VoiceInteractionService();
method public final android.service.voice.AlwaysOnHotwordDetector createAlwaysOnHotwordDetector(java.lang.String, java.lang.String, android.service.voice.AlwaysOnHotwordDetector.Callback);
@@ -29216,14 +29246,28 @@
field public static final int VOICEMAIL_NUMBER_MISSING = 40; // 0x28
}
+ public class IccOpenLogicalChannelResponse implements android.os.Parcelable {
+ method public int describeContents();
+ method public int getChannel();
+ method public byte[] getSelectResponse();
+ method public int getStatus();
+ method public void writeToParcel(android.os.Parcel, int);
+ field public static final android.os.Parcelable.Creator CREATOR;
+ field public static int INVALID_CHANNEL;
+ field public static int MISSING_RESOURCE;
+ field public static int NO_ERROR;
+ field public static int NO_SUCH_ELEMENT;
+ field public static int UNKNOWN_ERROR;
+ }
+
public class MessagingConfigurationManager {
method public boolean getCarrierConfigBoolean(java.lang.String, boolean);
+ method public boolean getCarrierConfigBoolean(long, java.lang.String, boolean);
method public int getCarrierConfigInt(java.lang.String, int);
+ method public int getCarrierConfigInt(long, java.lang.String, int);
method public java.lang.String getCarrierConfigString(java.lang.String, java.lang.String);
+ method public java.lang.String getCarrierConfigString(long, java.lang.String, java.lang.String);
method public static android.telephony.MessagingConfigurationManager getDefault();
- method public void setCarrierConfigBoolean(java.lang.String, boolean);
- method public void setCarrierConfigInt(java.lang.String, int);
- method public void setCarrierConfigString(java.lang.String, java.lang.String);
field public static final java.lang.String CONF_ALIAS_ENABLED = "aliasEnabled";
field public static final java.lang.String CONF_ALIAS_MAX_CHARS = "aliasMaxChars";
field public static final java.lang.String CONF_ALIAS_MIN_CHARS = "aliasMinChars";
@@ -29402,19 +29446,19 @@
method public boolean deleteStoredConversation(long);
method public boolean deleteStoredMessage(android.net.Uri);
method public java.util.ArrayList<java.lang.String> divideMessage(java.lang.String);
- method public void downloadMultimediaMessage(java.lang.String, android.app.PendingIntent);
- method public void downloadMultimediaMessage(long, java.lang.String, android.app.PendingIntent);
+ method public void downloadMultimediaMessage(java.lang.String, android.content.ContentValues, android.app.PendingIntent);
+ method public void downloadMultimediaMessage(long, java.lang.String, android.content.ContentValues, android.app.PendingIntent);
method public boolean getAutoPersisting();
method public static android.telephony.SmsManager getDefault();
method public android.net.Uri importMultimediaMessage(byte[], java.lang.String, long, boolean, boolean);
method public android.net.Uri importTextMessage(java.lang.String, int, java.lang.String, long, boolean, boolean);
method public void injectSmsPdu(byte[], java.lang.String, android.app.PendingIntent);
method public void sendDataMessage(java.lang.String, java.lang.String, short, byte[], android.app.PendingIntent, android.app.PendingIntent);
- method public void sendMultimediaMessage(byte[], java.lang.String, android.app.PendingIntent);
- method public void sendMultimediaMessage(long, byte[], java.lang.String, android.app.PendingIntent);
+ method public void sendMultimediaMessage(byte[], java.lang.String, android.content.ContentValues, android.app.PendingIntent);
+ method public void sendMultimediaMessage(long, byte[], java.lang.String, android.content.ContentValues, android.app.PendingIntent);
method public void sendMultipartTextMessage(java.lang.String, java.lang.String, java.util.ArrayList<java.lang.String>, java.util.ArrayList<android.app.PendingIntent>, java.util.ArrayList<android.app.PendingIntent>);
- method public void sendStoredMultimediaMessage(android.net.Uri, android.app.PendingIntent);
- method public void sendStoredMultimediaMessage(long, android.net.Uri, android.app.PendingIntent);
+ method public void sendStoredMultimediaMessage(android.net.Uri, android.content.ContentValues, android.app.PendingIntent);
+ method public void sendStoredMultimediaMessage(long, android.net.Uri, android.content.ContentValues, android.app.PendingIntent);
method public void sendStoredMultipartTextMessage(android.net.Uri, java.lang.String, java.util.ArrayList<android.app.PendingIntent>, java.util.ArrayList<android.app.PendingIntent>);
method public void sendStoredMultipartTextMessage(long, android.net.Uri, java.lang.String, java.util.ArrayList<android.app.PendingIntent>, java.util.ArrayList<android.app.PendingIntent>);
method public void sendStoredTextMessage(android.net.Uri, java.lang.String, android.app.PendingIntent, android.app.PendingIntent);
@@ -29538,7 +29582,8 @@
method public int hasCarrierPrivileges();
method public boolean hasIccCard();
method public boolean iccCloseLogicalChannel(int);
- method public int iccOpenLogicalChannel(java.lang.String);
+ method public android.telephony.IccOpenLogicalChannelResponse iccOpenLogicalChannel(java.lang.String);
+ method public java.lang.String iccTransmitApduBasicChannel(int, int, int, int, int, java.lang.String);
method public java.lang.String iccTransmitApduLogicalChannel(int, int, int, int, int, int, java.lang.String);
method public boolean isNetworkRoaming();
method public boolean isSmsCapable();
@@ -31707,7 +31752,7 @@
field public static final int WEEKDAY_WEDNESDAY = 4; // 0x4
}
- public static abstract class TtsSpan.Builder {
+ public static class TtsSpan.Builder {
ctor public TtsSpan.Builder(java.lang.String);
method public android.text.style.TtsSpan build();
method public C setIntArgument(java.lang.String, int);
@@ -35278,8 +35323,12 @@
method protected final int getLocalFeatures();
method public android.media.session.MediaController getMediaController();
method public abstract int getNavigationBarColor();
+ method public android.transition.Transition getReenterTransition();
+ method public android.transition.Transition getReturnTransition();
method public android.transition.Transition getSharedElementEnterTransition();
method public android.transition.Transition getSharedElementExitTransition();
+ method public android.transition.Transition getSharedElementReenterTransition();
+ method public android.transition.Transition getSharedElementReturnTransition();
method public abstract int getStatusBarColor();
method public long getTransitionBackgroundFadeDuration();
method public android.transition.TransitionManager getTransitionManager();
@@ -35335,8 +35384,12 @@
method public void setLogo(int);
method public void setMediaController(android.media.session.MediaController);
method public abstract void setNavigationBarColor(int);
+ method public void setReenterTransition(android.transition.Transition);
+ method public void setReturnTransition(android.transition.Transition);
method public void setSharedElementEnterTransition(android.transition.Transition);
method public void setSharedElementExitTransition(android.transition.Transition);
+ method public void setSharedElementReenterTransition(android.transition.Transition);
+ method public void setSharedElementReturnTransition(android.transition.Transition);
method public void setSoftInputMode(int);
method public abstract void setStatusBarColor(int);
method public abstract void setTitle(java.lang.CharSequence);
@@ -39379,6 +39432,7 @@
ctor public Switch(android.content.Context, android.util.AttributeSet);
ctor public Switch(android.content.Context, android.util.AttributeSet, int);
ctor public Switch(android.content.Context, android.util.AttributeSet, int, int);
+ method public boolean getShowText();
method public boolean getSplitTrack();
method public int getSwitchMinWidth();
method public int getSwitchPadding();
@@ -39388,6 +39442,7 @@
method public int getThumbTextPadding();
method public android.graphics.drawable.Drawable getTrackDrawable();
method public void onMeasure(int, int);
+ method public void setShowText(boolean);
method public void setSplitTrack(boolean);
method public void setSwitchMinWidth(int);
method public void setSwitchPadding(int);
diff --git a/cmds/pm/src/com/android/commands/pm/Pm.java b/cmds/pm/src/com/android/commands/pm/Pm.java
index bc16800..1f25dd0 100644
--- a/cmds/pm/src/com/android/commands/pm/Pm.java
+++ b/cmds/pm/src/com/android/commands/pm/Pm.java
@@ -59,7 +59,6 @@
import com.android.internal.util.SizedInputStream;
import libcore.io.IoUtils;
-import libcore.io.Streams;
import java.io.File;
import java.io.FileDescriptor;
@@ -1068,6 +1067,8 @@
}
}
+ final InstallSessionInfo info = mInstaller.getSessionInfo(sessionId);
+
PackageInstaller.Session session = null;
InputStream in = null;
OutputStream out = null;
@@ -1081,16 +1082,21 @@
}
out = session.openWrite(splitName, 0, sizeBytes);
- final int n = Streams.copy(in, out);
+ int total = 0;
+ byte[] buffer = new byte[65536];
+ int c;
+ while ((c = in.read(buffer)) != -1) {
+ total += c;
+ out.write(buffer, 0, c);
+
+ if (info.sizeBytes > 0) {
+ final float fraction = ((float) c / (float) info.sizeBytes);
+ session.addProgress(fraction);
+ }
+ }
session.fsync(out);
- final InstallSessionInfo info = mInstaller.getSessionInfo(sessionId);
- if (info.sizeBytes > 0) {
- final float fraction = ((float) n / (float) info.sizeBytes);
- session.addProgress(fraction);
- }
-
- System.out.println("Success: streamed " + n + " bytes");
+ System.out.println("Success: streamed " + total + " bytes");
} finally {
IoUtils.closeQuietly(out);
IoUtils.closeQuietly(in);
diff --git a/core/java/android/app/ActivityManagerInternal.java b/core/java/android/app/ActivityManagerInternal.java
index 5262a5f..2a17fa6 100644
--- a/core/java/android/app/ActivityManagerInternal.java
+++ b/core/java/android/app/ActivityManagerInternal.java
@@ -25,4 +25,6 @@
// Called by the power manager.
public abstract void goingToSleep();
public abstract void wakingUp();
+ public abstract int startIsolatedProcess(String entryPoint, String[] mainArgs,
+ String processName, String abiOverride, int uid, Runnable crashHandler);
}
diff --git a/core/java/android/app/ActivityTransitionCoordinator.java b/core/java/android/app/ActivityTransitionCoordinator.java
index b3046b5..75af2df 100644
--- a/core/java/android/app/ActivityTransitionCoordinator.java
+++ b/core/java/android/app/ActivityTransitionCoordinator.java
@@ -196,7 +196,7 @@
final protected ArrayList<View> mSharedElements = new ArrayList<View>();
final protected ArrayList<String> mSharedElementNames = new ArrayList<String>();
final protected ArrayList<View> mTransitioningViews = new ArrayList<View>();
- final protected SharedElementListener mListener;
+ protected SharedElementListener mListener;
protected ResultReceiver mResultReceiver;
final private FixedEpicenterCallback mEpicenterCallback = new FixedEpicenterCallback();
final protected boolean mIsReturning;
@@ -564,6 +564,7 @@
mTransitioningViews.clear();
mResultReceiver = null;
mPendingTransition = null;
+ mListener = null;
}
protected long getFadeDuration() {
diff --git a/core/java/android/app/ApplicationPackageManager.java b/core/java/android/app/ApplicationPackageManager.java
index f18507e..18ba8c4 100644
--- a/core/java/android/app/ApplicationPackageManager.java
+++ b/core/java/android/app/ApplicationPackageManager.java
@@ -1624,7 +1624,7 @@
}
Drawable dr = getDrawable(itemInfo.packageName, itemInfo.icon, appInfo);
if (dr == null) {
- dr = getDefaultActivityIcon();
+ dr = itemInfo.loadDefaultIcon(this);
}
return getUserManager().getBadgedDrawableForUser(dr,
new UserHandle(mContext.getUserId()));
diff --git a/core/java/android/app/EnterTransitionCoordinator.java b/core/java/android/app/EnterTransitionCoordinator.java
index 1326064..b5d362d 100644
--- a/core/java/android/app/EnterTransitionCoordinator.java
+++ b/core/java/android/app/EnterTransitionCoordinator.java
@@ -256,7 +256,7 @@
@Override
protected Transition getViewsTransition() {
if (mIsReturning) {
- return getWindow().getExitTransition();
+ return getWindow().getReenterTransition();
} else {
return getWindow().getEnterTransition();
}
@@ -264,7 +264,7 @@
protected Transition getSharedElementTransition() {
if (mIsReturning) {
- return getWindow().getSharedElementExitTransition();
+ return getWindow().getSharedElementReenterTransition();
} else {
return getWindow().getSharedElementEnterTransition();
}
diff --git a/core/java/android/app/ExitTransitionCoordinator.java b/core/java/android/app/ExitTransitionCoordinator.java
index 2ce6018..b3fdcc7 100644
--- a/core/java/android/app/ExitTransitionCoordinator.java
+++ b/core/java/android/app/ExitTransitionCoordinator.java
@@ -395,7 +395,7 @@
@Override
protected Transition getViewsTransition() {
if (mIsReturning) {
- return getWindow().getEnterTransition();
+ return getWindow().getReturnTransition();
} else {
return getWindow().getExitTransition();
}
@@ -403,7 +403,7 @@
protected Transition getSharedElementTransition() {
if (mIsReturning) {
- return getWindow().getSharedElementEnterTransition();
+ return getWindow().getSharedElementReturnTransition();
} else {
return getWindow().getSharedElementExitTransition();
}
diff --git a/core/java/android/app/IActivityManager.java b/core/java/android/app/IActivityManager.java
index 5347f03..772e132 100644
--- a/core/java/android/app/IActivityManager.java
+++ b/core/java/android/app/IActivityManager.java
@@ -454,7 +454,7 @@
* Private non-Binder interfaces
*/
/* package */ boolean testIsSystemReady();
-
+
/** Information you can retrieve about a particular application. */
public static class ContentProviderHolder implements Parcelable {
public final ProviderInfo info;
diff --git a/core/java/android/app/Notification.java b/core/java/android/app/Notification.java
index c7fdbed..21525bc 100644
--- a/core/java/android/app/Notification.java
+++ b/core/java/android/app/Notification.java
@@ -32,6 +32,7 @@
import android.media.session.MediaSession;
import android.net.Uri;
import android.os.BadParcelableException;
+import android.os.Build;
import android.os.Bundle;
import android.os.Parcel;
import android.os.Parcelable;
@@ -247,7 +248,6 @@
/**
- * @hide
* A medium-format version of {@link #contentView}, providing the Notification an
* opportunity to add action buttons to contentView. At its discretion, the system UI may
* choose to show this as a heads-up notification, which will pop up so the user can see
@@ -814,6 +814,13 @@
public static final String EXTRA_COMPACT_ACTIONS = "android.compactActions";
/**
+ * {@link #extras} key: the user that built the notification.
+ *
+ * @hide
+ */
+ public static final String EXTRA_ORIGINATING_USERID = "android.originatingUserId";
+
+ /**
* Value for {@link #EXTRA_AS_HEADS_UP} that indicates this notification should not be
* displayed in the heads up space.
*
@@ -1862,6 +1869,10 @@
private ArrayList<String> mPeople;
private int mColor = COLOR_DEFAULT;
+ /**
+ * The user that built the notification originally.
+ */
+ private int mOriginatingUserId;
/**
* Contains extras related to rebuilding during the build phase.
@@ -1911,7 +1922,8 @@
mPriority = PRIORITY_DEFAULT;
mPeople = new ArrayList<String>();
- mColorUtil = NotificationColorUtil.getInstance();
+ mColorUtil = context.getApplicationInfo().targetSdkVersion < Build.VERSION_CODES.L ?
+ NotificationColorUtil.getInstance() : null;
}
/**
@@ -2569,8 +2581,10 @@
}
private Bitmap getProfileBadge() {
+ // Note: This assumes that the current user can read the profile badge of the
+ // originating user.
UserManager userManager = (UserManager) mContext.getSystemService(Context.USER_SERVICE);
- Drawable badge = userManager.getBadgeForUser(android.os.Process.myUserHandle());
+ Drawable badge = userManager.getBadgeForUser(new UserHandle(mOriginatingUserId));
if (badge == null) {
return null;
}
@@ -2918,6 +2932,7 @@
*/
public void populateExtras(Bundle extras) {
// Store original information used in the construction of this object
+ extras.putInt(EXTRA_ORIGINATING_USERID, mOriginatingUserId);
extras.putString(EXTRA_REBUILD_CONTEXT_PACKAGE, mContext.getPackageName());
extras.putCharSequence(EXTRA_TITLE, mContentTitle);
extras.putCharSequence(EXTRA_TEXT, mContentText);
@@ -3145,6 +3160,7 @@
// Extras.
Bundle extras = n.extras;
+ mOriginatingUserId = extras.getInt(EXTRA_ORIGINATING_USERID);
mContentTitle = extras.getCharSequence(EXTRA_TITLE);
mContentText = extras.getCharSequence(EXTRA_TEXT);
mSubText = extras.getCharSequence(EXTRA_SUB_TEXT);
@@ -3177,6 +3193,8 @@
* object.
*/
public Notification build() {
+ mOriginatingUserId = mContext.getUserId();
+
Notification n = buildUnstyled();
if (mStyle != null) {
diff --git a/core/java/android/app/Service.java b/core/java/android/app/Service.java
index 3967740..ec9960d 100644
--- a/core/java/android/app/Service.java
+++ b/core/java/android/app/Service.java
@@ -401,7 +401,7 @@
/**
* This flag is set in {@link #onStartCommand} if the Intent is a
- * a retry because the original attempt never got to or returned from
+ * retry because the original attempt never got to or returned from
* {@link #onStartCommand(Intent, int, int)}.
*/
public static final int START_FLAG_RETRY = 0x0002;
diff --git a/core/java/android/app/UiModeManager.java b/core/java/android/app/UiModeManager.java
index c6731c9..f79eb04 100644
--- a/core/java/android/app/UiModeManager.java
+++ b/core/java/android/app/UiModeManager.java
@@ -123,7 +123,18 @@
* will switch to the car home activity even if we are already in car mode.
*/
public static final int ENABLE_CAR_MODE_GO_CAR_HOME = 0x0001;
-
+
+ /**
+ * Flag for use with {@link #enableCarMode(int)}: do not hold full wake lock
+ * while in car mode. By default, when this flag is not set, the system may hold
+ * a full wake lock to keep the screen turned on while in car mode.
+ * Setting this flag disables such behavior and the screen may be turned off if
+ * there is no other user activity and no other full wake lock held.
+ * Setting this flag can be relevant for a car dock application that does not require the
+ * screen kept on.
+ */
+ public static final int ENABLE_CAR_MODE_NO_WAKE_LOCK = 0x0002;
+
/**
* Force device into car mode, like it had been placed in the car dock.
* This will cause the device to switch to the car home UI as part of
diff --git a/core/java/android/app/admin/DevicePolicyManager.java b/core/java/android/app/admin/DevicePolicyManager.java
index 8be52a2..e28f00c 100644
--- a/core/java/android/app/admin/DevicePolicyManager.java
+++ b/core/java/android/app/admin/DevicePolicyManager.java
@@ -449,9 +449,17 @@
* active (enabled) in the system.
*/
public boolean isAdminActive(ComponentName who) {
+ return isAdminActiveAsUser(who, UserHandle.myUserId());
+ }
+
+ /**
+ * @see #isAdminActive(ComponentName)
+ * @hide
+ */
+ public boolean isAdminActiveAsUser(ComponentName who, int userId) {
if (mService != null) {
try {
- return mService.isAdminActive(who, UserHandle.myUserId());
+ return mService.isAdminActive(who, userId);
} catch (RemoteException e) {
Log.w(TAG, "Failed talking with device policy service", e);
}
@@ -465,9 +473,17 @@
* returned.
*/
public List<ComponentName> getActiveAdmins() {
+ return getActiveAdminsAsUser(UserHandle.myUserId());
+ }
+
+ /**
+ * @see #getActiveAdmins()
+ * @hide
+ */
+ public List<ComponentName> getActiveAdminsAsUser(int userId) {
if (mService != null) {
try {
- return mService.getActiveAdmins(UserHandle.myUserId());
+ return mService.getActiveAdmins(userId);
} catch (RemoteException e) {
Log.w(TAG, "Failed talking with device policy service", e);
}
@@ -2314,9 +2330,17 @@
* @throws IllegalArgumentException if the userId is invalid.
*/
public ComponentName getProfileOwner() throws IllegalArgumentException {
+ return getProfileOwnerAsUser(Process.myUserHandle().getIdentifier());
+ }
+
+ /**
+ * @see #getProfileOwner()
+ * @hide
+ */
+ public ComponentName getProfileOwnerAsUser(final int userId) throws IllegalArgumentException {
if (mService != null) {
try {
- return mService.getProfileOwner(Process.myUserHandle().getIdentifier());
+ return mService.getProfileOwner(userId);
} catch (RemoteException re) {
Log.w(TAG, "Failed to get profile owner");
throw new IllegalArgumentException(
@@ -2856,7 +2880,7 @@
* @see #setAccountManagementDisabled
*/
public String[] getAccountTypesWithManagementDisabled() {
- return getAccountTypesWithManagementDisabledAsUser(UserHandle.getCallingUserId());
+ return getAccountTypesWithManagementDisabledAsUser(UserHandle.myUserId());
}
/**
diff --git a/core/java/android/bluetooth/BluetoothGatt.java b/core/java/android/bluetooth/BluetoothGatt.java
index 1fe43ec..59d7956 100644
--- a/core/java/android/bluetooth/BluetoothGatt.java
+++ b/core/java/android/bluetooth/BluetoothGatt.java
@@ -16,7 +16,6 @@
package android.bluetooth;
-import android.bluetooth.le.ScanResult;
import android.content.Context;
import android.os.ParcelUuid;
import android.os.RemoteException;
@@ -130,10 +129,10 @@
/*package*/ static final int AUTHENTICATION_MITM = 2;
/**
- * Bluetooth GATT interface callbacks
+ * Bluetooth GATT callbacks. Overrides the default BluetoothGattCallback implementation.
*/
private final IBluetoothGattCallback mBluetoothGattCallback =
- new IBluetoothGattCallback.Stub() {
+ new BluetoothGattCallbackWrapper() {
/**
* Application interface registered - app is ready to go
* @hide
@@ -198,14 +197,6 @@
}
/**
- * Callback reporting an LE scan result.
- * @hide
- */
- public void onScanResult(String address, int rssi, byte[] advData) {
- // no op
- }
-
- /**
* A new GATT service has been discovered.
* The service is added to the internal list and the search
* continues.
@@ -600,23 +591,6 @@
}
/**
- * Advertise state change callback
- * @hide
- */
- public void onAdvertiseStateChange(int state, int status) {
- if (DBG) Log.d(TAG, "onAdvertiseStateChange() - state = "
- + state + " status=" + status);
- }
-
- /**
- * @hide
- */
- @Override
- public void onMultiAdvertiseCallback(int status) {
- // no op.
- }
-
- /**
* Callback invoked when the MTU for a given connection changes
* @hide
*/
@@ -647,20 +621,6 @@
Log.w(TAG, "Unhandled exception in callback", ex);
}
}
-
- @Override
- public void onBatchScanResults(List<ScanResult> results) {
- // no op
- }
-
- /**
- * @hide
- */
- @Override
- public void onFoundOrLost(boolean onFound, String address, int rssi,
- byte[] advData) {
- // no op.
- }
};
/*package*/ BluetoothGatt(Context context, IBluetoothGatt iGatt, BluetoothDevice device,
diff --git a/core/java/android/bluetooth/BluetoothGattCallbackWrapper.java b/core/java/android/bluetooth/BluetoothGattCallbackWrapper.java
new file mode 100644
index 0000000..0eb9d21
--- /dev/null
+++ b/core/java/android/bluetooth/BluetoothGattCallbackWrapper.java
@@ -0,0 +1,131 @@
+/*
+ * Copyright (C) 2014 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.bluetooth;
+
+import android.bluetooth.le.AdvertiseSettings;
+import android.bluetooth.le.ScanResult;
+import android.os.ParcelUuid;
+import android.os.RemoteException;
+
+import java.util.List;
+
+/**
+ * Wrapper class for default implementation of IBluetoothGattCallback.
+ *
+ * @hide
+ */
+public class BluetoothGattCallbackWrapper extends IBluetoothGattCallback.Stub {
+
+ @Override
+ public void onClientRegistered(int status, int clientIf) throws RemoteException {
+ }
+
+ @Override
+ public void onClientConnectionState(int status, int clientIf, boolean connected, String address)
+ throws RemoteException {
+ }
+
+ @Override
+ public void onScanResult(ScanResult scanResult) throws RemoteException {
+ }
+
+ @Override
+ public void onBatchScanResults(List<ScanResult> batchResults) throws RemoteException {
+ }
+
+ @Override
+ public void onGetService(String address, int srvcType, int srvcInstId, ParcelUuid srvcUuid)
+ throws RemoteException {
+ }
+
+ @Override
+ public void onGetIncludedService(String address, int srvcType, int srvcInstId,
+ ParcelUuid srvcUuid, int inclSrvcType, int inclSrvcInstId, ParcelUuid inclSrvcUuid)
+ throws RemoteException {
+ }
+
+ @Override
+ public void onGetCharacteristic(String address, int srvcType, int srvcInstId,
+ ParcelUuid srvcUuid, int charInstId, ParcelUuid charUuid, int charProps)
+ throws RemoteException {
+ }
+
+ @Override
+ public void onGetDescriptor(String address, int srvcType, int srvcInstId, ParcelUuid srvcUuid,
+ int charInstId, ParcelUuid charUuid, int descrInstId, ParcelUuid descrUuid)
+ throws RemoteException {
+ }
+
+ @Override
+ public void onSearchComplete(String address, int status) throws RemoteException {
+ }
+
+ @Override
+ public void onCharacteristicRead(String address, int status, int srvcType, int srvcInstId,
+ ParcelUuid srvcUuid, int charInstId, ParcelUuid charUuid, byte[] value)
+ throws RemoteException {
+ }
+
+ @Override
+ public void onCharacteristicWrite(String address, int status, int srvcType, int srvcInstId,
+ ParcelUuid srvcUuid, int charInstId, ParcelUuid charUuid) throws RemoteException {
+ }
+
+ @Override
+ public void onExecuteWrite(String address, int status) throws RemoteException {
+ }
+
+ @Override
+ public void onDescriptorRead(String address, int status, int srvcType, int srvcInstId,
+ ParcelUuid srvcUuid, int charInstId, ParcelUuid charUuid, int descrInstId,
+ ParcelUuid descrUuid, byte[] value) throws RemoteException {
+ }
+
+ @Override
+ public void onDescriptorWrite(String address, int status, int srvcType, int srvcInstId,
+ ParcelUuid srvcUuid, int charInstId, ParcelUuid charUuid, int descrInstId,
+ ParcelUuid descrUuid) throws RemoteException {
+ }
+
+ @Override
+ public void onNotify(String address, int srvcType, int srvcInstId, ParcelUuid srvcUuid,
+ int charInstId, ParcelUuid charUuid, byte[] value) throws RemoteException {
+ }
+
+ @Override
+ public void onReadRemoteRssi(String address, int rssi, int status) throws RemoteException {
+ }
+
+ @Override
+ public void onMultiAdvertiseCallback(int status, boolean isStart,
+ AdvertiseSettings advertiseSettings) throws RemoteException {
+ }
+
+ @Override
+ public void onConfigureMTU(String address, int mtu, int status) throws RemoteException {
+ }
+
+ @Override
+ public void onConnectionCongested(String address, boolean congested) throws RemoteException {
+ }
+
+ @Override
+ public void onFoundOrLost(boolean onFound, String address, int rssi, byte[] advData)
+ throws RemoteException {
+ }
+
+}
diff --git a/core/java/android/bluetooth/IBluetoothGattCallback.aidl b/core/java/android/bluetooth/IBluetoothGattCallback.aidl
index 18e3f54..f14cce0 100644
--- a/core/java/android/bluetooth/IBluetoothGattCallback.aidl
+++ b/core/java/android/bluetooth/IBluetoothGattCallback.aidl
@@ -16,6 +16,7 @@
package android.bluetooth;
import android.os.ParcelUuid;
+import android.bluetooth.le.AdvertiseSettings;
import android.bluetooth.le.ScanResult;
/**
@@ -26,7 +27,7 @@
void onClientRegistered(in int status, in int clientIf);
void onClientConnectionState(in int status, in int clientIf,
in boolean connected, in String address);
- void onScanResult(in String address, in int rssi, in byte[] advData);
+ void onScanResult(in ScanResult scanResult);
void onBatchScanResults(in List<ScanResult> batchResults);
void onGetService(in String address, in int srvcType, in int srvcInstId,
in ParcelUuid srvcUuid);
@@ -64,7 +65,8 @@
in int charInstId, in ParcelUuid charUuid,
in byte[] value);
void onReadRemoteRssi(in String address, in int rssi, in int status);
- void onMultiAdvertiseCallback(in int status);
+ void onMultiAdvertiseCallback(in int status, boolean isStart,
+ in AdvertiseSettings advertiseSettings);
void onConfigureMTU(in String address, in int mtu, in int status);
void onConnectionCongested(in String address, in boolean congested);
void onFoundOrLost(in boolean onFound, in String address, in int rssi,
diff --git a/core/java/android/bluetooth/le/AdvertiseData.java b/core/java/android/bluetooth/le/AdvertiseData.java
index b137eeb..843cd84 100644
--- a/core/java/android/bluetooth/le/AdvertiseData.java
+++ b/core/java/android/bluetooth/le/AdvertiseData.java
@@ -17,14 +17,15 @@
package android.bluetooth.le;
import android.annotation.Nullable;
-import android.bluetooth.BluetoothUuid;
import android.os.Parcel;
import android.os.ParcelUuid;
import android.os.Parcelable;
+import android.util.ArrayMap;
+import android.util.SparseArray;
import java.util.ArrayList;
-import java.util.Arrays;
import java.util.List;
+import java.util.Map;
import java.util.Objects;
/**
@@ -42,27 +43,18 @@
@Nullable
private final List<ParcelUuid> mServiceUuids;
- private final int mManufacturerId;
- @Nullable
- private final byte[] mManufacturerSpecificData;
-
- @Nullable
- private final ParcelUuid mServiceDataUuid;
- @Nullable
- private final byte[] mServiceData;
-
+ private final SparseArray<byte[]> mManufacturerSpecificData;
+ private final Map<ParcelUuid, byte[]> mServiceData;
private final boolean mIncludeTxPowerLevel;
private final boolean mIncludeDeviceName;
private AdvertiseData(List<ParcelUuid> serviceUuids,
- ParcelUuid serviceDataUuid, byte[] serviceData,
- int manufacturerId,
- byte[] manufacturerSpecificData, boolean includeTxPowerLevel,
+ SparseArray<byte[]> manufacturerData,
+ Map<ParcelUuid, byte[]> serviceData,
+ boolean includeTxPowerLevel,
boolean includeDeviceName) {
mServiceUuids = serviceUuids;
- mManufacturerId = manufacturerId;
- mManufacturerSpecificData = manufacturerSpecificData;
- mServiceDataUuid = serviceDataUuid;
+ mManufacturerSpecificData = manufacturerData;
mServiceData = serviceData;
mIncludeTxPowerLevel = includeTxPowerLevel;
mIncludeDeviceName = includeDeviceName;
@@ -77,32 +69,17 @@
}
/**
- * Returns the manufacturer identifier, which is a non-negative number assigned by Bluetooth
- * SIG.
+ * Returns an array of manufacturer Id and the corresponding manufacturer specific data. The
+ * manufacturer id is a non-negative number assigned by Bluetooth SIG.
*/
- public int getManufacturerId() {
- return mManufacturerId;
- }
-
- /**
- * Returns the manufacturer specific data which is the content of manufacturer specific data
- * field. The first 2 bytes of the data contain the company id.
- */
- public byte[] getManufacturerSpecificData() {
+ public SparseArray<byte[]> getManufacturerSpecificData() {
return mManufacturerSpecificData;
}
/**
- * Returns a 16-bit UUID of the service that the service data is associated with.
+ * Returns a map of 16-bit UUID and its corresponding service data.
*/
- public ParcelUuid getServiceDataUuid() {
- return mServiceDataUuid;
- }
-
- /**
- * Returns service data.
- */
- public byte[] getServiceData() {
+ public Map<ParcelUuid, byte[]> getServiceData() {
return mServiceData;
}
@@ -125,8 +102,8 @@
*/
@Override
public int hashCode() {
- return Objects.hash(mServiceUuids, mManufacturerId, mManufacturerSpecificData,
- mServiceDataUuid, mServiceData, mIncludeDeviceName, mIncludeTxPowerLevel);
+ return Objects.hash(mServiceUuids, mManufacturerSpecificData, mServiceData,
+ mIncludeDeviceName, mIncludeTxPowerLevel);
}
/**
@@ -142,20 +119,17 @@
}
AdvertiseData other = (AdvertiseData) obj;
return Objects.equals(mServiceUuids, other.mServiceUuids) &&
- mManufacturerId == other.mManufacturerId &&
- Objects.deepEquals(mManufacturerSpecificData, other.mManufacturerSpecificData) &&
- Objects.equals(mServiceDataUuid, other.mServiceDataUuid) &&
- Objects.deepEquals(mServiceData, other.mServiceData) &&
+ Utils.equals(mManufacturerSpecificData, other.mManufacturerSpecificData) &&
+ Utils.equals(mServiceData, other.mServiceData) &&
mIncludeDeviceName == other.mIncludeDeviceName &&
mIncludeTxPowerLevel == other.mIncludeTxPowerLevel;
}
@Override
public String toString() {
- return "AdvertiseData [mServiceUuids=" + mServiceUuids + ", mManufacturerId="
- + mManufacturerId + ", mManufacturerSpecificData="
- + Arrays.toString(mManufacturerSpecificData) + ", mServiceDataUuid="
- + mServiceDataUuid + ", mServiceData=" + Arrays.toString(mServiceData)
+ return "AdvertiseData [mServiceUuids=" + mServiceUuids + ", mManufacturerSpecificData="
+ + Utils.toString(mManufacturerSpecificData) + ", mServiceData="
+ + Utils.toString(mServiceData)
+ ", mIncludeTxPowerLevel=" + mIncludeTxPowerLevel + ", mIncludeDeviceName="
+ mIncludeDeviceName + "]";
}
@@ -169,21 +143,30 @@
public void writeToParcel(Parcel dest, int flags) {
dest.writeList(mServiceUuids);
- dest.writeInt(mManufacturerId);
- if (mManufacturerSpecificData == null) {
- dest.writeInt(0);
- } else {
- dest.writeInt(1);
- dest.writeInt(mManufacturerSpecificData.length);
- dest.writeByteArray(mManufacturerSpecificData);
+ // mManufacturerSpecificData could not be null.
+ dest.writeInt(mManufacturerSpecificData.size());
+ for (int i = 0; i < mManufacturerSpecificData.size(); ++i) {
+ dest.writeInt(mManufacturerSpecificData.keyAt(i));
+ byte[] data = mManufacturerSpecificData.valueAt(i);
+ if (data == null) {
+ dest.writeInt(0);
+ } else {
+ dest.writeInt(1);
+ dest.writeInt(data.length);
+ dest.writeByteArray(data);
+ }
}
- dest.writeParcelable(mServiceDataUuid, flags);
- if (mServiceData == null) {
- dest.writeInt(0);
- } else {
- dest.writeInt(1);
- dest.writeInt(mServiceData.length);
- dest.writeByteArray(mServiceData);
+ dest.writeInt(mServiceData.size());
+ for (ParcelUuid uuid : mServiceData.keySet()) {
+ dest.writeParcelable(uuid, flags);
+ byte[] data = mServiceData.get(uuid);
+ if (data == null) {
+ dest.writeInt(0);
+ } else {
+ dest.writeInt(1);
+ dest.writeInt(data.length);
+ dest.writeByteArray(data);
+ }
}
dest.writeByte((byte) (getIncludeTxPowerLevel() ? 1 : 0));
dest.writeByte((byte) (getIncludeDeviceName() ? 1 : 0));
@@ -209,20 +192,26 @@
builder.addServiceUuid(uuid);
}
}
- int manufacturerId = in.readInt();
- if (in.readInt() == 1) {
- int manufacturerDataLength = in.readInt();
- byte[] manufacturerData = new byte[manufacturerDataLength];
- in.readByteArray(manufacturerData);
- builder.setManufacturerData(manufacturerId, manufacturerData);
+ int manufacturerSize = in.readInt();
+ for (int i = 0; i < manufacturerSize; ++i) {
+ int manufacturerId = in.readInt();
+ if (in.readInt() == 1) {
+ int manufacturerDataLength = in.readInt();
+ byte[] manufacturerData = new byte[manufacturerDataLength];
+ in.readByteArray(manufacturerData);
+ builder.addManufacturerData(manufacturerId, manufacturerData);
+ }
}
- ParcelUuid serviceDataUuid = in.readParcelable(
- ParcelUuid.class.getClassLoader());
- if (in.readInt() == 1) {
- int serviceDataLength = in.readInt();
- byte[] serviceData = new byte[serviceDataLength];
- in.readByteArray(serviceData);
- builder.setServiceData(serviceDataUuid, serviceData);
+ int serviceDataSize = in.readInt();
+ for (int i = 0; i < serviceDataSize; ++i) {
+ ParcelUuid serviceDataUuid = in.readParcelable(
+ ParcelUuid.class.getClassLoader());
+ if (in.readInt() == 1) {
+ int serviceDataLength = in.readInt();
+ byte[] serviceData = new byte[serviceDataLength];
+ in.readByteArray(serviceData);
+ builder.addServiceData(serviceDataUuid, serviceData);
+ }
}
builder.setIncludeTxPowerLevel(in.readByte() == 1);
builder.setIncludeDeviceName(in.readByte() == 1);
@@ -236,13 +225,8 @@
public static final class Builder {
@Nullable
private List<ParcelUuid> mServiceUuids = new ArrayList<ParcelUuid>();
- private int mManufacturerId = -1;
- @Nullable
- private byte[] mManufacturerSpecificData;
- @Nullable
- private ParcelUuid mServiceDataUuid;
- @Nullable
- private byte[] mServiceData;
+ private SparseArray<byte[]> mManufacturerSpecificData = new SparseArray<byte[]>();
+ private Map<ParcelUuid, byte[]> mServiceData = new ArrayMap<ParcelUuid, byte[]>();
private boolean mIncludeTxPowerLevel;
private boolean mIncludeDeviceName;
@@ -268,18 +252,17 @@
* @throws IllegalArgumentException If the {@code serviceDataUuid} or {@code serviceData} is
* empty.
*/
- public Builder setServiceData(ParcelUuid serviceDataUuid, byte[] serviceData) {
+ public Builder addServiceData(ParcelUuid serviceDataUuid, byte[] serviceData) {
if (serviceDataUuid == null || serviceData == null) {
throw new IllegalArgumentException(
"serviceDataUuid or serviceDataUuid is null");
}
- mServiceDataUuid = serviceDataUuid;
- mServiceData = serviceData;
+ mServiceData.put(serviceDataUuid, serviceData);
return this;
}
/**
- * Set manufacturer specific data.
+ * Add manufacturer specific data.
* <p>
* Please refer to the Bluetooth Assigned Numbers document provided by the <a
* href="https://www.bluetooth.org">Bluetooth SIG</a> for a list of existing company
@@ -290,7 +273,7 @@
* @throws IllegalArgumentException If the {@code manufacturerId} is negative or
* {@code manufacturerSpecificData} is null.
*/
- public Builder setManufacturerData(int manufacturerId, byte[] manufacturerSpecificData) {
+ public Builder addManufacturerData(int manufacturerId, byte[] manufacturerSpecificData) {
if (manufacturerId < 0) {
throw new IllegalArgumentException(
"invalid manufacturerId - " + manufacturerId);
@@ -298,8 +281,7 @@
if (manufacturerSpecificData == null) {
throw new IllegalArgumentException("manufacturerSpecificData is null");
}
- mManufacturerId = manufacturerId;
- mManufacturerSpecificData = manufacturerSpecificData;
+ mManufacturerSpecificData.put(manufacturerId, manufacturerSpecificData);
return this;
}
@@ -324,9 +306,7 @@
* Build the {@link AdvertiseData}.
*/
public AdvertiseData build() {
- return new AdvertiseData(mServiceUuids,
- mServiceDataUuid,
- mServiceData, mManufacturerId, mManufacturerSpecificData,
+ return new AdvertiseData(mServiceUuids, mManufacturerSpecificData, mServiceData,
mIncludeTxPowerLevel, mIncludeDeviceName);
}
}
diff --git a/core/java/android/bluetooth/le/BluetoothLeAdvertiser.java b/core/java/android/bluetooth/le/BluetoothLeAdvertiser.java
index 4d128e7..331ebfc 100644
--- a/core/java/android/bluetooth/le/BluetoothLeAdvertiser.java
+++ b/core/java/android/bluetooth/le/BluetoothLeAdvertiser.java
@@ -18,6 +18,7 @@
import android.bluetooth.BluetoothAdapter;
import android.bluetooth.BluetoothGatt;
+import android.bluetooth.BluetoothGattCallbackWrapper;
import android.bluetooth.BluetoothUuid;
import android.bluetooth.IBluetoothGatt;
import android.bluetooth.IBluetoothGattCallback;
@@ -209,13 +210,13 @@
num128BitUuids * BluetoothUuid.UUID_BYTES_128_BIT;
}
}
- if (data.getServiceDataUuid() != null) {
+ for (ParcelUuid uuid : data.getServiceData().keySet()) {
size += OVERHEAD_BYTES_PER_FIELD + SERVICE_DATA_UUID_LENGTH
- + byteLength(data.getServiceData());
+ + byteLength(data.getServiceData().get(uuid));
}
- if (data.getManufacturerId() > 0) {
+ for (int i = 0; i < data.getManufacturerSpecificData().size(); ++i) {
size += OVERHEAD_BYTES_PER_FIELD + MANUFACTURER_SPECIFIC_DATA_LENGTH +
- byteLength(data.getManufacturerSpecificData());
+ byteLength(data.getManufacturerSpecificData().valueAt(i));
}
if (data.getIncludeTxPowerLevel()) {
size += OVERHEAD_BYTES_PER_FIELD + 1; // tx power level value is one byte.
@@ -233,7 +234,7 @@
/**
* Bluetooth GATT interface callbacks for advertising.
*/
- private static class AdvertiseCallbackWrapper extends IBluetoothGattCallback.Stub {
+ private static class AdvertiseCallbackWrapper extends BluetoothGattCallbackWrapper {
private static final int LE_CALLBACK_TIMEOUT_MILLIS = 2000;
private final AdvertiseCallback mAdvertiseCallback;
private final AdvertiseData mAdvertisement;
@@ -245,7 +246,7 @@
// -1: scan stopped
// >0: registered and scan started
private int mClientIf;
- private boolean isAdvertising = false;
+ private boolean mIsAdvertising = false;
public AdvertiseCallbackWrapper(AdvertiseCallback advertiseCallback,
AdvertiseData advertiseData, AdvertiseData scanResponse,
@@ -270,7 +271,7 @@
} catch (InterruptedException e) {
Log.e(TAG, "Callback reg wait interrupted: ", e);
}
- started = (mClientIf > 0 && isAdvertising);
+ started = (mClientIf > 0 && mIsAdvertising);
}
return started;
}
@@ -282,7 +283,7 @@
} catch (InterruptedException e) {
Log.e(TAG, "Callback reg wait interrupted: " + e);
}
- return !isAdvertising;
+ return !mIsAdvertising;
}
}
@@ -312,155 +313,35 @@
}
@Override
- public void onClientConnectionState(int status, int clientIf,
- boolean connected, String address) {
- // no op
- }
-
- @Override
- public void onScanResult(String address, int rssi, byte[] advData) {
- // no op
- }
-
- @Override
- public void onGetService(String address, int srvcType,
- int srvcInstId, ParcelUuid srvcUuid) {
- // no op
- }
-
- @Override
- public void onGetIncludedService(String address, int srvcType,
- int srvcInstId, ParcelUuid srvcUuid,
- int inclSrvcType, int inclSrvcInstId,
- ParcelUuid inclSrvcUuid) {
- // no op
- }
-
- @Override
- public void onGetCharacteristic(String address, int srvcType,
- int srvcInstId, ParcelUuid srvcUuid,
- int charInstId, ParcelUuid charUuid,
- int charProps) {
- // no op
- }
-
- @Override
- public void onGetDescriptor(String address, int srvcType,
- int srvcInstId, ParcelUuid srvcUuid,
- int charInstId, ParcelUuid charUuid,
- int descInstId, ParcelUuid descUuid) {
- // no op
- }
-
- @Override
- public void onSearchComplete(String address, int status) {
- // no op
- }
-
- @Override
- public void onCharacteristicRead(String address, int status, int srvcType,
- int srvcInstId, ParcelUuid srvcUuid,
- int charInstId, ParcelUuid charUuid, byte[] value) {
- // no op
- }
-
- @Override
- public void onCharacteristicWrite(String address, int status, int srvcType,
- int srvcInstId, ParcelUuid srvcUuid,
- int charInstId, ParcelUuid charUuid) {
- // no op
- }
-
- @Override
- public void onNotify(String address, int srvcType,
- int srvcInstId, ParcelUuid srvcUuid,
- int charInstId, ParcelUuid charUuid,
- byte[] value) {
- // no op
- }
-
- @Override
- public void onDescriptorRead(String address, int status, int srvcType,
- int srvcInstId, ParcelUuid srvcUuid,
- int charInstId, ParcelUuid charUuid,
- int descInstId, ParcelUuid descrUuid, byte[] value) {
- // no op
- }
-
- @Override
- public void onDescriptorWrite(String address, int status, int srvcType,
- int srvcInstId, ParcelUuid srvcUuid,
- int charInstId, ParcelUuid charUuid,
- int descInstId, ParcelUuid descrUuid) {
- // no op
- }
-
- @Override
- public void onExecuteWrite(String address, int status) {
- // no op
- }
-
- @Override
- public void onReadRemoteRssi(String address, int rssi, int status) {
- // no op
- }
-
- @Override
- public void onMultiAdvertiseCallback(int status) {
- // TODO: This logic needs to be re-visited to account
- // for whether the scan has actually been started
- // or not. Toggling the isAdvertising does not seem
- // correct.
+ public void onMultiAdvertiseCallback(int status, boolean isStart,
+ AdvertiseSettings settings) {
synchronized (this) {
- if (status == AdvertiseCallback.ADVERTISE_SUCCESS) {
- isAdvertising = !isAdvertising;
- if (!isAdvertising) {
- try {
- mBluetoothGatt.unregisterClient(mClientIf);
- mClientIf = -1;
- } catch (RemoteException e) {
- Log.e(TAG, "remote exception when unregistering", e);
- }
+ if (isStart) {
+ if (status == AdvertiseCallback.ADVERTISE_SUCCESS) {
+ // Start success
+ mAdvertiseCallback.onStartSuccess(settings);
+ mIsAdvertising = true;
} else {
- mAdvertiseCallback.onStartSuccess(null);
+ // Start failure.
+ mAdvertiseCallback.onStartFailure(status);
}
} else {
- if (!isAdvertising)
- mAdvertiseCallback.onStartFailure(status);
+ // unregister client for stop.
+ try {
+ mBluetoothGatt.unregisterClient(mClientIf);
+ mClientIf = -1;
+ mIsAdvertising = false;
+ } catch (RemoteException e) {
+ Log.e(TAG, "remote exception when unregistering", e);
+ }
}
notifyAll();
}
}
-
- /**
- * Callback reporting LE ATT MTU.
- *
- * @hide
- */
- @Override
- public void onConfigureMTU(String address, int mtu, int status) {
- // no op
- }
-
- @Override
- public void onConnectionCongested(String address, boolean congested) {
- // no op
- }
-
- @Override
- public void onBatchScanResults(List<ScanResult> results) {
- // no op
- }
-
- @Override
- public void onFoundOrLost(boolean onFound, String address, int rssi,
- byte[] advData) {
- // no op
- }
}
- //TODO: move this api to a common util class.
+ // TODO: move this api to a common util class.
private void checkAdapterState() {
if (mBluetoothAdapter.getState() != mBluetoothAdapter.STATE_ON) {
throw new IllegalStateException("BT Adapter is not turned ON");
diff --git a/core/java/android/bluetooth/le/BluetoothLeScanner.java b/core/java/android/bluetooth/le/BluetoothLeScanner.java
index f100ddc..45e466f 100644
--- a/core/java/android/bluetooth/le/BluetoothLeScanner.java
+++ b/core/java/android/bluetooth/le/BluetoothLeScanner.java
@@ -19,6 +19,7 @@
import android.bluetooth.BluetoothAdapter;
import android.bluetooth.BluetoothDevice;
import android.bluetooth.BluetoothGatt;
+import android.bluetooth.BluetoothGattCallbackWrapper;
import android.bluetooth.IBluetoothGatt;
import android.bluetooth.IBluetoothGattCallback;
import android.bluetooth.IBluetoothManager;
@@ -186,7 +187,7 @@
/**
* Bluetooth GATT interface callbacks
*/
- private static class BleScanCallbackWrapper extends IBluetoothGattCallback.Stub {
+ private static class BleScanCallbackWrapper extends BluetoothGattCallbackWrapper {
private static final int REGISTRATION_CALLBACK_TIMEOUT_SECONDS = 5;
private final ScanCallback mScanCallback;
@@ -284,37 +285,26 @@
}
}
- @Override
- public void onClientConnectionState(int status, int clientIf,
- boolean connected, String address) {
- // no op
- }
-
/**
* Callback reporting an LE scan result.
*
* @hide
*/
@Override
- public void onScanResult(String address, int rssi, byte[] advData) {
+ public void onScanResult(final ScanResult scanResult) {
if (DBG)
- Log.d(TAG, "onScanResult() - Device=" + address + " RSSI=" + rssi);
+ Log.d(TAG, "onScanResult() - " + scanResult.toString());
// Check null in case the scan has been stopped
synchronized (this) {
if (mClientIf <= 0)
return;
}
- BluetoothDevice device = BluetoothAdapter.getDefaultAdapter().getRemoteDevice(
- address);
- long scanNanos = SystemClock.elapsedRealtimeNanos();
- final ScanResult result = new ScanResult(device, ScanRecord.parseFromBytes(advData),
- rssi, scanNanos);
Handler handler = new Handler(Looper.getMainLooper());
handler.post(new Runnable() {
@Override
public void run() {
- mScanCallback.onScanResult(ScanSettings.CALLBACK_TYPE_ALL_MATCHES, result);
+ mScanCallback.onScanResult(ScanSettings.CALLBACK_TYPE_ALL_MATCHES, scanResult);
}
});
@@ -332,104 +322,6 @@
}
@Override
- public void onGetService(String address, int srvcType,
- int srvcInstId, ParcelUuid srvcUuid) {
- // no op
- }
-
- @Override
- public void onGetIncludedService(String address, int srvcType,
- int srvcInstId, ParcelUuid srvcUuid,
- int inclSrvcType, int inclSrvcInstId,
- ParcelUuid inclSrvcUuid) {
- // no op
- }
-
- @Override
- public void onGetCharacteristic(String address, int srvcType,
- int srvcInstId, ParcelUuid srvcUuid,
- int charInstId, ParcelUuid charUuid,
- int charProps) {
- // no op
- }
-
- @Override
- public void onGetDescriptor(String address, int srvcType,
- int srvcInstId, ParcelUuid srvcUuid,
- int charInstId, ParcelUuid charUuid,
- int descInstId, ParcelUuid descUuid) {
- // no op
- }
-
- @Override
- public void onSearchComplete(String address, int status) {
- // no op
- }
-
- @Override
- public void onCharacteristicRead(String address, int status, int srvcType,
- int srvcInstId, ParcelUuid srvcUuid,
- int charInstId, ParcelUuid charUuid, byte[] value) {
- // no op
- }
-
- @Override
- public void onCharacteristicWrite(String address, int status, int srvcType,
- int srvcInstId, ParcelUuid srvcUuid,
- int charInstId, ParcelUuid charUuid) {
- // no op
- }
-
- @Override
- public void onNotify(String address, int srvcType,
- int srvcInstId, ParcelUuid srvcUuid,
- int charInstId, ParcelUuid charUuid,
- byte[] value) {
- // no op
- }
-
- @Override
- public void onDescriptorRead(String address, int status, int srvcType,
- int srvcInstId, ParcelUuid srvcUuid,
- int charInstId, ParcelUuid charUuid,
- int descInstId, ParcelUuid descrUuid, byte[] value) {
- // no op
- }
-
- @Override
- public void onDescriptorWrite(String address, int status, int srvcType,
- int srvcInstId, ParcelUuid srvcUuid,
- int charInstId, ParcelUuid charUuid,
- int descInstId, ParcelUuid descrUuid) {
- // no op
- }
-
- @Override
- public void onExecuteWrite(String address, int status) {
- // no op
- }
-
- @Override
- public void onReadRemoteRssi(String address, int rssi, int status) {
- // no op
- }
-
- @Override
- public void onMultiAdvertiseCallback(int status) {
- // no op
- }
-
- @Override
- public void onConfigureMTU(String address, int mtu, int status) {
- // no op
- }
-
- @Override
- public void onConnectionCongested(String address, boolean congested) {
- // no op
- }
-
- @Override
public void onFoundOrLost(boolean onFound, String address, int rssi,
byte[] advData) {
if (DBG) {
diff --git a/core/java/android/bluetooth/le/ScanFilter.java b/core/java/android/bluetooth/le/ScanFilter.java
index 30aaf2e..d1b93d2 100644
--- a/core/java/android/bluetooth/le/ScanFilter.java
+++ b/core/java/android/bluetooth/le/ScanFilter.java
@@ -181,7 +181,7 @@
byte[] serviceDataMask = new byte[serviceDataMaskLength];
in.readByteArray(serviceDataMask);
builder.setServiceData(
- servcieDataUuid, serviceData, serviceDataMask);
+ servcieDataUuid, serviceData, serviceDataMask);
}
}
}
@@ -242,9 +242,6 @@
return mServiceDataMask;
}
- /**
- * @hide
- */
@Nullable
public ParcelUuid getServiceDataUuid() {
return mServiceDataUuid;
@@ -303,19 +300,17 @@
}
// Service data match
- if (mServiceData != null) {
- if (!Objects.equals(mServiceDataUuid, scanRecord.getServiceDataUuid()) ||
- !matchesPartialData(mServiceData, mServiceDataMask,
- scanRecord.getServiceData())) {
+ if (mServiceDataUuid != null) {
+ if (!matchesPartialData(mServiceData, mServiceDataMask,
+ scanRecord.getServiceData(mServiceDataUuid))) {
return false;
}
}
// Manufacturer data match.
- if (mManufacturerData != null) {
- if (mManufacturerId != scanRecord.getManufacturerId() ||
- !matchesPartialData(mManufacturerData,
- mManufacturerDataMask, scanRecord.getManufacturerSpecificData())) {
+ if (mManufacturerId >= 0) {
+ if (!matchesPartialData(mManufacturerData, mManufacturerDataMask,
+ scanRecord.getManufacturerSpecificData(mManufacturerId))) {
return false;
}
}
diff --git a/core/java/android/bluetooth/le/ScanRecord.java b/core/java/android/bluetooth/le/ScanRecord.java
index e564c7d..e7f33ff1 100644
--- a/core/java/android/bluetooth/le/ScanRecord.java
+++ b/core/java/android/bluetooth/le/ScanRecord.java
@@ -19,11 +19,14 @@
import android.annotation.Nullable;
import android.bluetooth.BluetoothUuid;
import android.os.ParcelUuid;
+import android.util.ArrayMap;
import android.util.Log;
+import android.util.SparseArray;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
+import java.util.Map;
/**
* Represents a scan record from Bluetooth LE scan.
@@ -53,14 +56,9 @@
@Nullable
private final List<ParcelUuid> mServiceUuids;
- private final int mManufacturerId;
- @Nullable
- private final byte[] mManufacturerSpecificData;
+ private final SparseArray<byte[]> mManufacturerSpecificData;
- @Nullable
- private final ParcelUuid mServiceDataUuid;
- @Nullable
- private final byte[] mServiceData;
+ private final Map<ParcelUuid, byte[]> mServiceData;
// Transmission power level(in dB).
private final int mTxPowerLevel;
@@ -81,43 +79,49 @@
/**
* Returns a list of service UUIDs within the advertisement that are used to identify the
- * bluetooth gatt services.
+ * bluetooth GATT services.
*/
public List<ParcelUuid> getServiceUuids() {
return mServiceUuids;
}
/**
- * Returns the manufacturer identifier, which is a non-negative number assigned by Bluetooth
- * SIG.
+ * Returns a sparse array of manufacturer identifier and its corresponding manufacturer specific
+ * data.
*/
- public int getManufacturerId() {
- return mManufacturerId;
- }
-
- /**
- * Returns the manufacturer specific data which is the content of manufacturer specific data
- * field.
- */
- public byte[] getManufacturerSpecificData() {
+ public SparseArray<byte[]> getManufacturerSpecificData() {
return mManufacturerSpecificData;
}
/**
- * Returns a 16-bit UUID of the service that the service data is associated with.
+ * Returns the manufacturer specific data associated with the manufacturer id. Returns
+ * {@code null} if the {@code manufacturerId} is not found.
*/
- public ParcelUuid getServiceDataUuid() {
- return mServiceDataUuid;
+ @Nullable
+ public byte[] getManufacturerSpecificData(int manufacturerId) {
+ return mManufacturerSpecificData.get(manufacturerId);
}
/**
- * Returns service data.
+ * Returns a map of service UUID and its corresponding service data.
*/
- public byte[] getServiceData() {
+ public Map<ParcelUuid, byte[]> getServiceData() {
return mServiceData;
}
/**
+ * Returns the service data byte array associated with the {@code serviceUuid}. Returns
+ * {@code null} if the {@code serviceDataUuid} is not found.
+ */
+ @Nullable
+ public byte[] getServiceData(ParcelUuid serviceDataUuid) {
+ if (serviceDataUuid == null) {
+ return null;
+ }
+ return mServiceData.get(serviceDataUuid);
+ }
+
+ /**
* Returns the transmission power level of the packet in dBm. Returns {@link Integer#MIN_VALUE}
* if the field is not set. This value can be used to calculate the path loss of a received
* packet using the following equation:
@@ -144,14 +148,12 @@
}
private ScanRecord(List<ParcelUuid> serviceUuids,
- ParcelUuid serviceDataUuid, byte[] serviceData,
- int manufacturerId,
- byte[] manufacturerSpecificData, int advertiseFlags, int txPowerLevel,
+ SparseArray<byte[]> manufacturerData,
+ Map<ParcelUuid, byte[]> serviceData,
+ int advertiseFlags, int txPowerLevel,
String localName, byte[] bytes) {
mServiceUuids = serviceUuids;
- mManufacturerId = manufacturerId;
- mManufacturerSpecificData = manufacturerSpecificData;
- mServiceDataUuid = serviceDataUuid;
+ mManufacturerSpecificData = manufacturerData;
mServiceData = serviceData;
mDeviceName = localName;
mAdvertiseFlags = advertiseFlags;
@@ -168,7 +170,6 @@
* order.
*
* @param scanRecord The scan record of Bluetooth LE advertisement and/or scan response.
- *
* @hide
*/
public static ScanRecord parseFromBytes(byte[] scanRecord) {
@@ -181,10 +182,9 @@
List<ParcelUuid> serviceUuids = new ArrayList<ParcelUuid>();
String localName = null;
int txPowerLevel = Integer.MIN_VALUE;
- ParcelUuid serviceDataUuid = null;
- byte[] serviceData = null;
- int manufacturerId = -1;
- byte[] manufacturerSpecificData = null;
+
+ SparseArray<byte[]> manufacturerData = new SparseArray<byte[]>();
+ Map<ParcelUuid, byte[]> serviceData = new ArrayMap<ParcelUuid, byte[]>();
try {
while (currentPos < scanRecord.length) {
@@ -230,16 +230,20 @@
int serviceUuidLength = BluetoothUuid.UUID_BYTES_16_BIT;
byte[] serviceDataUuidBytes = extractBytes(scanRecord, currentPos,
serviceUuidLength);
- serviceDataUuid = BluetoothUuid.parseUuidFrom(serviceDataUuidBytes);
- serviceData = extractBytes(scanRecord, currentPos + 2, dataLength - 2);
+ ParcelUuid serviceDataUuid = BluetoothUuid.parseUuidFrom(
+ serviceDataUuidBytes);
+ byte[] serviceDataArray = extractBytes(scanRecord,
+ currentPos + serviceUuidLength, dataLength - serviceUuidLength);
+ serviceData.put(serviceDataUuid, serviceDataArray);
break;
case DATA_TYPE_MANUFACTURER_SPECIFIC_DATA:
// The first two bytes of the manufacturer specific data are
// manufacturer ids in little endian.
- manufacturerId = ((scanRecord[currentPos + 1] & 0xFF) << 8) +
+ int manufacturerId = ((scanRecord[currentPos + 1] & 0xFF) << 8) +
(scanRecord[currentPos] & 0xFF);
- manufacturerSpecificData = extractBytes(scanRecord, currentPos + 2,
+ byte[] manufacturerDataBytes = extractBytes(scanRecord, currentPos + 2,
dataLength - 2);
+ manufacturerData.put(manufacturerId, manufacturerDataBytes);
break;
default:
// Just ignore, we don't handle such data type.
@@ -251,9 +255,8 @@
if (serviceUuids.isEmpty()) {
serviceUuids = null;
}
- return new ScanRecord(serviceUuids, serviceDataUuid, serviceData,
- manufacturerId, manufacturerSpecificData, advertiseFlag, txPowerLevel,
- localName, scanRecord);
+ return new ScanRecord(serviceUuids, manufacturerData, serviceData,
+ advertiseFlag, txPowerLevel, localName, scanRecord);
} catch (IndexOutOfBoundsException e) {
Log.e(TAG, "unable to parse scan record: " + Arrays.toString(scanRecord));
return null;
@@ -263,13 +266,11 @@
@Override
public String toString() {
return "ScanRecord [mAdvertiseFlags=" + mAdvertiseFlags + ", mServiceUuids=" + mServiceUuids
- + ", mManufacturerId=" + mManufacturerId + ", mManufacturerSpecificData="
- + Arrays.toString(mManufacturerSpecificData) + ", mServiceDataUuid="
- + mServiceDataUuid + ", mServiceData=" + Arrays.toString(mServiceData)
+ + ", mManufacturerSpecificData=" + Utils.toString(mManufacturerSpecificData)
+ + ", mServiceData=" + Utils.toString(mServiceData)
+ ", mTxPowerLevel=" + mTxPowerLevel + ", mDeviceName=" + mDeviceName + "]";
}
-
// Parse service UUIDs.
private static int parseServiceUuid(byte[] scanRecord, int currentPos, int dataLength,
int uuidLength, List<ParcelUuid> serviceUuids) {
diff --git a/core/java/android/bluetooth/le/Utils.java b/core/java/android/bluetooth/le/Utils.java
new file mode 100644
index 0000000..8598dd7
--- /dev/null
+++ b/core/java/android/bluetooth/le/Utils.java
@@ -0,0 +1,126 @@
+/*
+ * Copyright (C) 2014 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.bluetooth.le;
+
+import android.util.SparseArray;
+
+import java.util.Arrays;
+import java.util.Iterator;
+import java.util.Map;
+import java.util.Objects;
+import java.util.Set;
+
+/**
+ * Helper class for Bluetooth LE utils.
+ *
+ * @hide
+ */
+public class Utils {
+
+ /**
+ * Returns a string composed from a {@link SparseArray}.
+ */
+ static String toString(SparseArray<byte[]> array) {
+ if (array == null) {
+ return "null";
+ }
+ if (array.size() == 0) {
+ return "{}";
+ }
+ StringBuilder buffer = new StringBuilder();
+ buffer.append('{');
+ for (int i = 0; i < array.size(); ++i) {
+ buffer.append(array.keyAt(i)).append("=").append(array.valueAt(i));
+ }
+ buffer.append('}');
+ return buffer.toString();
+ }
+
+ /**
+ * Returns a string composed from a {@link Map}.
+ */
+ static <T> String toString(Map<T, byte[]> map) {
+ if (map == null) {
+ return "null";
+ }
+ if (map.isEmpty()) {
+ return "{}";
+ }
+ StringBuilder buffer = new StringBuilder();
+ buffer.append('{');
+ Iterator<Map.Entry<T, byte[]>> it = map.entrySet().iterator();
+ while (it.hasNext()) {
+ Map.Entry<T, byte[]> entry = it.next();
+ Object key = entry.getKey();
+ buffer.append(key).append("=").append(Arrays.toString(map.get(key)));
+ if (it.hasNext()) {
+ buffer.append(", ");
+ }
+ }
+ buffer.append('}');
+ return buffer.toString();
+ }
+
+ /**
+ * Check whether two {@link SparseArray} equal.
+ */
+ static boolean equals(SparseArray<byte[]> array, SparseArray<byte[]> otherArray) {
+ if (array == otherArray) {
+ return true;
+ }
+ if (array == null || otherArray == null) {
+ return false;
+ }
+ if (array.size() != otherArray.size()) {
+ return false;
+ }
+
+ // Keys are guaranteed in ascending order when indices are in ascending order.
+ for (int i = 0; i < array.size(); ++i) {
+ if (array.keyAt(i) != otherArray.keyAt(i) ||
+ !Arrays.equals(array.valueAt(i), otherArray.valueAt(i))) {
+ return false;
+ }
+ }
+ return true;
+ }
+
+ /**
+ * Check whether two {@link Map} equal.
+ */
+ static <T> boolean equals(Map<T, byte[]> map, Map<T, byte[]> otherMap) {
+ if (map == otherMap) {
+ return true;
+ }
+ if (map == null || otherMap == null) {
+ return false;
+ }
+ if (map.size() != otherMap.size()) {
+ return false;
+ }
+ Set<T> keys = map.keySet();
+ if (!keys.equals(otherMap.keySet())) {
+ return false;
+ }
+ for (T key : keys) {
+ if (!Objects.deepEquals(map.get(key), otherMap.get(key))) {
+ return false;
+ }
+ }
+ return true;
+ }
+}
diff --git a/core/java/android/content/pm/ApplicationInfo.java b/core/java/android/content/pm/ApplicationInfo.java
index 482ad6e..548a0c9 100644
--- a/core/java/android/content/pm/ApplicationInfo.java
+++ b/core/java/android/content/pm/ApplicationInfo.java
@@ -839,7 +839,8 @@
/**
* @hide
*/
- @Override protected Drawable loadDefaultIcon(PackageManager pm) {
+ @Override
+ public Drawable loadDefaultIcon(PackageManager pm) {
if ((flags & FLAG_EXTERNAL_STORAGE) != 0
&& isPackageUnavailable(pm)) {
return Resources.getSystem().getDrawable(
diff --git a/core/java/android/content/pm/ComponentInfo.java b/core/java/android/content/pm/ComponentInfo.java
index 7e8f285..cc06b67 100644
--- a/core/java/android/content/pm/ComponentInfo.java
+++ b/core/java/android/content/pm/ComponentInfo.java
@@ -179,7 +179,8 @@
/**
* @hide
*/
- @Override protected Drawable loadDefaultIcon(PackageManager pm) {
+ @Override
+ public Drawable loadDefaultIcon(PackageManager pm) {
return applicationInfo.loadIcon(pm);
}
diff --git a/core/java/android/content/pm/IPackageInstallerCallback.aidl b/core/java/android/content/pm/IPackageInstallerCallback.aidl
index a31ae54..39ae1a0 100644
--- a/core/java/android/content/pm/IPackageInstallerCallback.aidl
+++ b/core/java/android/content/pm/IPackageInstallerCallback.aidl
@@ -19,6 +19,8 @@
/** {@hide} */
oneway interface IPackageInstallerCallback {
void onSessionCreated(int sessionId);
+ void onSessionOpened(int sessionId);
void onSessionProgressChanged(int sessionId, float progress);
+ void onSessionClosed(int sessionId);
void onSessionFinished(int sessionId, boolean success);
}
diff --git a/core/java/android/content/pm/IPackageInstallerSession.aidl b/core/java/android/content/pm/IPackageInstallerSession.aidl
index 2fd7ddb..af0323f 100644
--- a/core/java/android/content/pm/IPackageInstallerSession.aidl
+++ b/core/java/android/content/pm/IPackageInstallerSession.aidl
@@ -24,7 +24,9 @@
void setClientProgress(float progress);
void addClientProgress(float progress);
+ String[] list();
ParcelFileDescriptor openWrite(String name, long offsetBytes, long lengthBytes);
+ ParcelFileDescriptor openRead(String name);
void close();
void commit(in IPackageInstallObserver2 observer);
diff --git a/core/java/android/content/pm/InstallSessionInfo.java b/core/java/android/content/pm/InstallSessionInfo.java
index a9c574a..f263885 100644
--- a/core/java/android/content/pm/InstallSessionInfo.java
+++ b/core/java/android/content/pm/InstallSessionInfo.java
@@ -16,7 +16,9 @@
package android.content.pm;
+import android.annotation.NonNull;
import android.annotation.Nullable;
+import android.content.Intent;
import android.graphics.Bitmap;
import android.os.Parcel;
import android.os.Parcelable;
@@ -32,6 +34,8 @@
public String installerPackageName;
/** {@hide} */
public float progress;
+ /** {@hide} */
+ public boolean open;
/** {@hide} */
public int mode;
@@ -53,6 +57,7 @@
sessionId = source.readInt();
installerPackageName = source.readString();
progress = source.readFloat();
+ open = source.readInt() != 0;
mode = source.readInt();
sizeBytes = source.readLong();
@@ -88,6 +93,13 @@
}
/**
+ * Return if this session is currently open.
+ */
+ public boolean isOpen() {
+ return open;
+ }
+
+ /**
* Return the package name this session is working with. May be {@code null}
* if unknown.
*/
@@ -111,6 +123,23 @@
return appLabel;
}
+ /**
+ * Return an Intent that can be started to view details about this install
+ * session. This may surface actions such as pause, resume, or cancel.
+ * <p>
+ * In some cases, a matching Activity may not exist, so ensure you safeguard
+ * against this.
+ *
+ * @see PackageInstaller#ACTION_SESSION_DETAILS
+ */
+ public @Nullable Intent getDetailsIntent() {
+ final Intent intent = new Intent(PackageInstaller.ACTION_SESSION_DETAILS);
+ intent.putExtra(PackageInstaller.EXTRA_SESSION_ID, sessionId);
+ intent.setPackage(installerPackageName);
+ intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
+ return intent;
+ }
+
@Override
public int describeContents() {
return 0;
@@ -121,6 +150,7 @@
dest.writeInt(sessionId);
dest.writeString(installerPackageName);
dest.writeFloat(progress);
+ dest.writeInt(open ? 1 : 0);
dest.writeInt(mode);
dest.writeLong(sizeBytes);
diff --git a/core/java/android/content/pm/InstallSessionParams.java b/core/java/android/content/pm/InstallSessionParams.java
index 3de9863..1716e39 100644
--- a/core/java/android/content/pm/InstallSessionParams.java
+++ b/core/java/android/content/pm/InstallSessionParams.java
@@ -17,6 +17,7 @@
package android.content.pm;
import android.annotation.Nullable;
+import android.app.ActivityManager;
import android.content.Intent;
import android.graphics.Bitmap;
import android.net.Uri;
@@ -30,6 +31,9 @@
*/
public class InstallSessionParams implements Parcelable {
+ /** {@hide} */
+ public static final int MODE_INVALID = -1;
+
/**
* Mode for an install session whose staged APKs should fully replace any
* existing APKs for the target app.
@@ -48,21 +52,19 @@
public static final int MODE_INHERIT_EXISTING = 2;
/** {@hide} */
- public int mode;
+ public int mode = MODE_INVALID;
/** {@hide} */
public int installFlags;
/** {@hide} */
public int installLocation = PackageInfo.INSTALL_LOCATION_INTERNAL_ONLY;
/** {@hide} */
- public Signature[] signatures;
- /** {@hide} */
public long sizeBytes = -1;
/** {@hide} */
public String appPackageName;
/** {@hide} */
public Bitmap appIcon;
/** {@hide} */
- public CharSequence appLabel;
+ public String appLabel;
/** {@hide} */
public Uri originatingUri;
/** {@hide} */
@@ -86,7 +88,6 @@
mode = source.readInt();
installFlags = source.readInt();
installLocation = source.readInt();
- signatures = (Signature[]) source.readParcelableArray(null);
sizeBytes = source.readLong();
appPackageName = source.readString();
appIcon = source.readParcelable(null);
@@ -106,16 +107,13 @@
}
/**
- * Optionally provide a set of certificates for the app being installed.
- * <p>
- * If the APKs staged in the session aren't consistent with these
- * signatures, the install will fail. Regardless of this value, all APKs in
- * the app must have the same signing certificates.
- *
- * @see PackageInfo#signatures
+ * @deprecated use {@link PackageInstaller.Session#openRead(String)} to
+ * calculate message digest instead.
+ * @hide
*/
+ @Deprecated
public void setSignatures(@Nullable Signature[] signatures) {
- this.signatures = signatures;
+ throw new UnsupportedOperationException();
}
/**
@@ -146,7 +144,8 @@
/**
* Optionally set an icon representing the app being installed. This should
- * be at least {@link android.R.dimen#app_icon_size} in both dimensions.
+ * be roughly {@link ActivityManager#getLauncherLargeIconSize()} in both
+ * dimensions.
*/
public void setAppIcon(@Nullable Bitmap appIcon) {
this.appIcon = appIcon;
@@ -156,7 +155,7 @@
* Optionally set a label representing the app being installed.
*/
public void setAppLabel(@Nullable CharSequence appLabel) {
- this.appLabel = appLabel;
+ this.appLabel = (appLabel != null) ? appLabel.toString() : null;
}
/**
@@ -184,7 +183,6 @@
pw.printPair("mode", mode);
pw.printHexPair("installFlags", installFlags);
pw.printPair("installLocation", installLocation);
- pw.printPair("signatures", (signatures != null));
pw.printPair("sizeBytes", sizeBytes);
pw.printPair("appPackageName", appPackageName);
pw.printPair("appIcon", (appIcon != null));
@@ -205,11 +203,10 @@
dest.writeInt(mode);
dest.writeInt(installFlags);
dest.writeInt(installLocation);
- dest.writeParcelableArray(signatures, flags);
dest.writeLong(sizeBytes);
dest.writeString(appPackageName);
dest.writeParcelable(appIcon, flags);
- dest.writeString(appLabel != null ? appLabel.toString() : null);
+ dest.writeString(appLabel);
dest.writeParcelable(originatingUri, flags);
dest.writeParcelable(referrerUri, flags);
dest.writeString(abiOverride);
diff --git a/core/java/android/content/pm/PackageInstaller.java b/core/java/android/content/pm/PackageInstaller.java
index a114bb8..8af827e 100644
--- a/core/java/android/content/pm/PackageInstaller.java
+++ b/core/java/android/content/pm/PackageInstaller.java
@@ -18,9 +18,10 @@
import android.annotation.NonNull;
import android.annotation.Nullable;
+import android.annotation.SdkConstant;
+import android.annotation.SdkConstant.SdkConstantType;
import android.app.PackageInstallObserver;
import android.app.PackageUninstallObserver;
-import android.content.pm.PackageManager.NameNotFoundException;
import android.os.Bundle;
import android.os.FileBridge;
import android.os.Handler;
@@ -32,7 +33,9 @@
import java.io.Closeable;
import java.io.IOException;
+import java.io.InputStream;
import java.io.OutputStream;
+import java.security.MessageDigest;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
@@ -63,6 +66,27 @@
* </ul>
*/
public class PackageInstaller {
+ /**
+ * Activity Action: Show details about a particular install session. This
+ * may surface actions such as pause, resume, or cancel.
+ * <p>
+ * This should always be scoped to the installer package that owns the
+ * session. Clients should use {@link InstallSessionInfo#getDetailsIntent()}
+ * to build this intent correctly.
+ * <p>
+ * In some cases, a matching Activity may not exist, so ensure you safeguard
+ * against this.
+ */
+ @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION)
+ public static final String ACTION_SESSION_DETAILS = "android.content.pm.action.SESSION_DETAILS";
+
+ /**
+ * An integer session ID.
+ *
+ * @see #ACTION_SESSION_DETAILS
+ */
+ public static final String EXTRA_SESSION_ID = "android.content.pm.extra.SESSION_ID";
+
private final PackageManager mPm;
private final IPackageInstaller mInstaller;
private final int mUserId;
@@ -180,14 +204,32 @@
/**
* Events for observing session lifecycle.
+ * <p>
+ * A typical session lifecycle looks like this:
+ * <ul>
+ * <li>An installer creates a session to indicate pending app delivery. All
+ * install details are available at this point.
+ * <li>The installer opens the session to deliver APK data. Note that a
+ * session may be opened and closed multiple times as network connectivity
+ * changes. The installer may deliver periodic progress updates.
+ * <li>The installer commits or abandons the session, resulting in the
+ * session being finished.
+ * </ul>
*/
public static abstract class SessionCallback {
/**
- * New session has been created.
+ * New session has been created. Details about the session can be
+ * obtained from {@link PackageInstaller#getSessionInfo(int)}.
*/
public abstract void onCreated(int sessionId);
/**
+ * Session has been opened. A session is usually opened when the
+ * installer is actively writing data.
+ */
+ public abstract void onOpened(int sessionId);
+
+ /**
* Progress for given session has been updated.
* <p>
* Note that this progress may not directly correspond to the value
@@ -198,6 +240,11 @@
public abstract void onProgressChanged(int sessionId, float progress);
/**
+ * Session has been closed.
+ */
+ public abstract void onClosed(int sessionId);
+
+ /**
* Session has completely finished, either with success or failure.
*/
public abstract void onFinished(int sessionId, boolean success);
@@ -207,8 +254,10 @@
private static class SessionCallbackDelegate extends IPackageInstallerCallback.Stub implements
Handler.Callback {
private static final int MSG_SESSION_CREATED = 1;
- private static final int MSG_SESSION_PROGRESS_CHANGED = 2;
- private static final int MSG_SESSION_FINISHED = 3;
+ private static final int MSG_SESSION_OPENED = 2;
+ private static final int MSG_SESSION_PROGRESS_CHANGED = 3;
+ private static final int MSG_SESSION_CLOSED = 4;
+ private static final int MSG_SESSION_FINISHED = 5;
final SessionCallback mCallback;
final Handler mHandler;
@@ -224,9 +273,15 @@
case MSG_SESSION_CREATED:
mCallback.onCreated(msg.arg1);
return true;
+ case MSG_SESSION_OPENED:
+ mCallback.onOpened(msg.arg1);
+ return true;
case MSG_SESSION_PROGRESS_CHANGED:
mCallback.onProgressChanged(msg.arg1, (float) msg.obj);
return true;
+ case MSG_SESSION_CLOSED:
+ mCallback.onClosed(msg.arg1);
+ return true;
case MSG_SESSION_FINISHED:
mCallback.onFinished(msg.arg1, msg.arg2 != 0);
return true;
@@ -240,12 +295,22 @@
}
@Override
+ public void onSessionOpened(int sessionId) {
+ mHandler.obtainMessage(MSG_SESSION_OPENED, sessionId, 0).sendToTarget();
+ }
+
+ @Override
public void onSessionProgressChanged(int sessionId, float progress) {
mHandler.obtainMessage(MSG_SESSION_PROGRESS_CHANGED, sessionId, 0, progress)
.sendToTarget();
}
@Override
+ public void onSessionClosed(int sessionId) {
+ mHandler.obtainMessage(MSG_SESSION_CLOSED, sessionId, 0).sendToTarget();
+ }
+
+ @Override
public void onSessionFinished(int sessionId, boolean success) {
mHandler.obtainMessage(MSG_SESSION_FINISHED, sessionId, success ? 1 : 0)
.sendToTarget();
@@ -373,7 +438,7 @@
ExceptionUtils.maybeUnwrapIOException(e);
throw e;
} catch (RemoteException e) {
- throw new IOException(e);
+ throw e.rethrowAsRuntimeException();
}
}
@@ -391,6 +456,40 @@
}
/**
+ * List all APK names contained in this session.
+ * <p>
+ * This returns all names which have been previously written through
+ * {@link #openWrite(String, long, long)} as part of this session.
+ */
+ public @NonNull String[] list() {
+ try {
+ return mSession.list();
+ } catch (RemoteException e) {
+ throw e.rethrowAsRuntimeException();
+ }
+ }
+
+ /**
+ * Open a stream to read an APK file from the session.
+ * <p>
+ * This is only valid for names which have been previously written
+ * through {@link #openWrite(String, long, long)} as part of this
+ * session. For example, this stream may be used to calculate a
+ * {@link MessageDigest} of a written APK before committing.
+ */
+ public @NonNull InputStream openRead(@NonNull String name) throws IOException {
+ try {
+ final ParcelFileDescriptor pfd = mSession.openRead(name);
+ return new ParcelFileDescriptor.AutoCloseInputStream(pfd);
+ } catch (RuntimeException e) {
+ ExceptionUtils.maybeUnwrapIOException(e);
+ throw e;
+ } catch (RemoteException e) {
+ throw e.rethrowAsRuntimeException();
+ }
+ }
+
+ /**
* Attempt to commit everything staged in this session. This may require
* user intervention, and so it may not happen immediately. The final
* result of the commit will be reported through the given callback.
diff --git a/core/java/android/content/pm/PackageItemInfo.java b/core/java/android/content/pm/PackageItemInfo.java
index 4b5bdda..cacdf8e 100644
--- a/core/java/android/content/pm/PackageItemInfo.java
+++ b/core/java/android/content/pm/PackageItemInfo.java
@@ -187,7 +187,7 @@
*
* @hide
*/
- protected Drawable loadDefaultIcon(PackageManager pm) {
+ public Drawable loadDefaultIcon(PackageManager pm) {
return pm.getDefaultActivityIcon();
}
diff --git a/core/java/android/hardware/camera2/legacy/CaptureCollector.java b/core/java/android/hardware/camera2/legacy/CaptureCollector.java
index af58a8a..307e466 100644
--- a/core/java/android/hardware/camera2/legacy/CaptureCollector.java
+++ b/core/java/android/hardware/camera2/legacy/CaptureCollector.java
@@ -236,6 +236,11 @@
Log.d(TAG, "queueRequest for request " + holder.getRequestId() +
" - " + mInFlight + " requests remain in flight.");
}
+
+ if (!(h.needsJpeg || h.needsPreview)) {
+ throw new IllegalStateException("Request must target at least one output surface!");
+ }
+
if (h.needsJpeg) {
// Wait for all current requests to finish before queueing jpeg.
while (mInFlight > 0) {
@@ -259,9 +264,6 @@
mInFlightPreviews++;
}
- if (!(h.needsJpeg || h.needsPreview)) {
- throw new IllegalStateException("Request must target at least one output surface!");
- }
mInFlight++;
return true;
diff --git a/core/java/android/hardware/camera2/legacy/LegacyMetadataMapper.java b/core/java/android/hardware/camera2/legacy/LegacyMetadataMapper.java
index 633bada..986f9a8 100644
--- a/core/java/android/hardware/camera2/legacy/LegacyMetadataMapper.java
+++ b/core/java/android/hardware/camera2/legacy/LegacyMetadataMapper.java
@@ -27,6 +27,7 @@
import android.hardware.camera2.CaptureRequest;
import android.hardware.camera2.CaptureResult;
import android.hardware.camera2.impl.CameraMetadataNative;
+import android.hardware.camera2.params.MeteringRectangle;
import android.hardware.camera2.params.StreamConfiguration;
import android.hardware.camera2.params.StreamConfigurationDuration;
import android.hardware.camera2.utils.ArrayUtils;
@@ -78,6 +79,8 @@
private static final long APPROXIMATE_SENSOR_AREA_PX = (1 << 23); // 8 megapixels
private static final long APPROXIMATE_JPEG_ENCODE_TIME_MS = 600; // 600 milliseconds
+ static final int UNKNOWN_MODE = -1;
+
/*
* Development hijinks: Lie about not supporting certain capabilities
*
@@ -458,7 +461,22 @@
m.set(CONTROL_MAX_REGIONS, maxRegions);
- // TODO rest of control fields
+ /*
+ * android.control.availableEffects
+ */
+ List<String> effectModes = p.getSupportedColorEffects();
+ int[] supportedEffectModes = (effectModes == null) ? new int[0] :
+ ArrayUtils.convertStringListToIntArray(effectModes, sLegacyEffectMode,
+ sEffectModes);
+ m.set(CONTROL_AVAILABLE_EFFECTS, supportedEffectModes);
+
+ /*
+ * android.control.availableSceneModes
+ */
+ List<String> sceneModes = p.getSupportedSceneModes();
+ int[] supportedSceneModes = (sceneModes == null) ? new int[0] :
+ ArrayUtils.convertStringListToIntArray(sceneModes, sLegacySceneModes, sSceneModes);
+ m.set(CONTROL_AVAILABLE_SCENE_MODES, supportedSceneModes);
}
private static void mapLens(CameraMetadataNative m, Camera.Parameters p) {
@@ -472,6 +490,9 @@
*/
m.set(LENS_INFO_MINIMUM_FOCUS_DISTANCE, LENS_INFO_MINIMUM_FOCUS_DISTANCE_FIXED_FOCUS);
}
+
+ float[] focalLengths = new float[] { p.getFocalLength() };
+ m.set(LENS_INFO_AVAILABLE_FOCAL_LENGTHS, focalLengths);
}
private static void mapFlash(CameraMetadataNative m, Camera.Parameters p) {
@@ -680,6 +701,106 @@
}
}
+ private final static String[] sLegacySceneModes = {
+ Parameters.SCENE_MODE_AUTO,
+ Parameters.SCENE_MODE_ACTION,
+ Parameters.SCENE_MODE_PORTRAIT,
+ Parameters.SCENE_MODE_LANDSCAPE,
+ Parameters.SCENE_MODE_NIGHT,
+ Parameters.SCENE_MODE_NIGHT_PORTRAIT,
+ Parameters.SCENE_MODE_THEATRE,
+ Parameters.SCENE_MODE_BEACH,
+ Parameters.SCENE_MODE_SNOW,
+ Parameters.SCENE_MODE_SUNSET,
+ Parameters.SCENE_MODE_STEADYPHOTO,
+ Parameters.SCENE_MODE_FIREWORKS,
+ Parameters.SCENE_MODE_SPORTS,
+ Parameters.SCENE_MODE_PARTY,
+ Parameters.SCENE_MODE_CANDLELIGHT,
+ Parameters.SCENE_MODE_BARCODE,
+ };
+
+ private final static int[] sSceneModes = {
+ CameraCharacteristics.CONTROL_SCENE_MODE_DISABLED,
+ CameraCharacteristics.CONTROL_SCENE_MODE_ACTION,
+ CameraCharacteristics.CONTROL_SCENE_MODE_PORTRAIT,
+ CameraCharacteristics.CONTROL_SCENE_MODE_LANDSCAPE,
+ CameraCharacteristics.CONTROL_SCENE_MODE_NIGHT,
+ CameraCharacteristics.CONTROL_SCENE_MODE_NIGHT_PORTRAIT,
+ CameraCharacteristics.CONTROL_SCENE_MODE_THEATRE,
+ CameraCharacteristics.CONTROL_SCENE_MODE_BEACH,
+ CameraCharacteristics.CONTROL_SCENE_MODE_SNOW,
+ CameraCharacteristics.CONTROL_SCENE_MODE_SUNSET,
+ CameraCharacteristics.CONTROL_SCENE_MODE_STEADYPHOTO,
+ CameraCharacteristics.CONTROL_SCENE_MODE_FIREWORKS,
+ CameraCharacteristics.CONTROL_SCENE_MODE_SPORTS,
+ CameraCharacteristics.CONTROL_SCENE_MODE_PARTY,
+ CameraCharacteristics.CONTROL_SCENE_MODE_CANDLELIGHT,
+ CameraCharacteristics.CONTROL_SCENE_MODE_BARCODE,
+ };
+
+ static int convertSceneModeFromLegacy(String mode) {
+ if (mode == null) {
+ return CameraCharacteristics.CONTROL_SCENE_MODE_DISABLED;
+ }
+ int index = ArrayUtils.getArrayIndex(sLegacySceneModes, mode);
+ if (index < 0) {
+ return UNKNOWN_MODE;
+ }
+ return sSceneModes[index];
+ }
+
+ static String convertSceneModeToLegacy(int mode) {
+ int index = ArrayUtils.getArrayIndex(sSceneModes, mode);
+ if (index < 0) {
+ return null;
+ }
+ return sLegacySceneModes[index];
+ }
+
+ private final static String[] sLegacyEffectMode = {
+ Parameters.EFFECT_NONE,
+ Parameters.EFFECT_MONO,
+ Parameters.EFFECT_NEGATIVE,
+ Parameters.EFFECT_SOLARIZE,
+ Parameters.EFFECT_SEPIA,
+ Parameters.EFFECT_POSTERIZE,
+ Parameters.EFFECT_WHITEBOARD,
+ Parameters.EFFECT_BLACKBOARD,
+ Parameters.EFFECT_AQUA,
+ };
+
+ private final static int[] sEffectModes = {
+ CameraCharacteristics.CONTROL_EFFECT_MODE_OFF,
+ CameraCharacteristics.CONTROL_EFFECT_MODE_MONO,
+ CameraCharacteristics.CONTROL_EFFECT_MODE_NEGATIVE,
+ CameraCharacteristics.CONTROL_EFFECT_MODE_SOLARIZE,
+ CameraCharacteristics.CONTROL_EFFECT_MODE_SEPIA,
+ CameraCharacteristics.CONTROL_EFFECT_MODE_POSTERIZE,
+ CameraCharacteristics.CONTROL_EFFECT_MODE_WHITEBOARD,
+ CameraCharacteristics.CONTROL_EFFECT_MODE_BLACKBOARD,
+ CameraCharacteristics.CONTROL_EFFECT_MODE_AQUA,
+ };
+
+ static int convertEffectModeFromLegacy(String mode) {
+ if (mode == null) {
+ return CameraCharacteristics.CONTROL_EFFECT_MODE_OFF;
+ }
+ int index = ArrayUtils.getArrayIndex(sLegacyEffectMode, mode);
+ if (index < 0) {
+ return UNKNOWN_MODE;
+ }
+ return sEffectModes[index];
+ }
+
+ static String convertEffectModeToLegacy(int mode) {
+ int index = ArrayUtils.getArrayIndex(sEffectModes, mode);
+ if (index < 0) {
+ return null;
+ }
+ return sLegacyEffectMode[index];
+ }
+
/**
* Convert the ae antibanding mode from api1 into api2.
*
@@ -760,6 +881,16 @@
LegacyRequestMapper.convertRequestMetadata(request);
}
+ private static final int[] sAllowedTemplates = {
+ CameraDevice.TEMPLATE_PREVIEW,
+ CameraDevice.TEMPLATE_STILL_CAPTURE,
+ CameraDevice.TEMPLATE_RECORD,
+ // Disallowed templates in legacy mode:
+ // CameraDevice.TEMPLATE_VIDEO_SNAPSHOT,
+ // CameraDevice.TEMPLATE_ZERO_SHUTTER_LAG,
+ // CameraDevice.TEMPLATE_MANUAL
+ };
+
/**
* Create a request template
*
@@ -774,7 +905,7 @@
*/
public static CameraMetadataNative createRequestTemplate(
CameraCharacteristics c, int templateId) {
- if (templateId < 0 || templateId > CameraDevice.TEMPLATE_MANUAL) {
+ if (!ArrayUtils.contains(sAllowedTemplates, templateId)) {
throw new IllegalArgumentException("templateId out of range");
}
@@ -786,16 +917,58 @@
* to create our own templates in the framework
*/
+ /*
+ * control.*
+ */
+
if (LIE_ABOUT_AWB) {
m.set(CaptureRequest.CONTROL_AWB_MODE, CameraMetadata.CONTROL_AWB_MODE_AUTO);
} else {
throw new AssertionError("Valid control.awbMode not implemented yet");
}
+ // control.aeAntibandingMode
+ m.set(CaptureRequest.CONTROL_AE_ANTIBANDING_MODE, CONTROL_AE_ANTIBANDING_MODE_AUTO);
+
+ // control.aeExposureCompensation
+ m.set(CaptureRequest.CONTROL_AE_EXPOSURE_COMPENSATION, 0);
+
+ // control.aeLock
+ m.set(CaptureRequest.CONTROL_AE_LOCK, false);
+
+ // control.aePrecaptureTrigger
+ m.set(CaptureRequest.CONTROL_AE_PRECAPTURE_TRIGGER, CONTROL_AE_PRECAPTURE_TRIGGER_IDLE);
+
+ // control.afTrigger
+ m.set(CaptureRequest.CONTROL_AF_TRIGGER, CONTROL_AF_TRIGGER_IDLE);
+
+ // control.awbMode
+ m.set(CaptureRequest.CONTROL_AWB_MODE, CONTROL_AWB_MODE_AUTO);
+
+ // control.awbLock
+ m.set(CaptureRequest.CONTROL_AWB_LOCK, false);
+
+ // control.aeRegions, control.awbRegions, control.afRegions
+ {
+ Rect activeArray = c.get(SENSOR_INFO_ACTIVE_ARRAY_SIZE);
+ MeteringRectangle[] activeRegions = new MeteringRectangle[] {
+ new MeteringRectangle(/*x*/0, /*y*/0, /*width*/activeArray.width() - 1,
+ /*height*/activeArray.height() - 1,/*weight*/1)};
+ m.set(CaptureRequest.CONTROL_AE_REGIONS, activeRegions);
+ m.set(CaptureRequest.CONTROL_AWB_REGIONS, activeRegions);
+ m.set(CaptureRequest.CONTROL_AF_REGIONS, activeRegions);
+ }
+
+ // control.captureIntent
+ m.set(CaptureRequest.CONTROL_CAPTURE_INTENT, templateId);
+
// control.aeMode
m.set(CaptureRequest.CONTROL_AE_MODE, CameraMetadata.CONTROL_AE_MODE_ON);
// AE is always unconditionally available in API1 devices
+ // control.mode
+ m.set(CaptureRequest.CONTROL_MODE, CONTROL_MODE_AUTO);
+
// control.afMode
{
Float minimumFocusDistance = c.get(LENS_INFO_MINIMUM_FOCUS_DISTANCE);
@@ -808,11 +981,65 @@
} else {
// If a minimum focus distance is reported; the camera must have AF
afMode = CameraMetadata.CONTROL_AF_MODE_AUTO;
+
+ if (templateId == CameraDevice.TEMPLATE_RECORD ||
+ templateId == CameraDevice.TEMPLATE_VIDEO_SNAPSHOT) {
+ if (ArrayUtils.contains(c.get(CONTROL_AF_AVAILABLE_MODES),
+ CONTROL_AF_MODE_CONTINUOUS_VIDEO)) {
+ afMode = CaptureRequest.CONTROL_AF_MODE_CONTINUOUS_VIDEO;
+ }
+ } else if (templateId == CameraDevice.TEMPLATE_PREVIEW ||
+ templateId == CameraDevice.TEMPLATE_STILL_CAPTURE) {
+ if (ArrayUtils.contains(c.get(CONTROL_AF_AVAILABLE_MODES),
+ CONTROL_AF_MODE_CONTINUOUS_PICTURE)) {
+ afMode = CaptureRequest.CONTROL_AF_MODE_CONTINUOUS_PICTURE;
+ }
+ }
}
m.set(CaptureRequest.CONTROL_AF_MODE, afMode);
}
+ {
+ // control.aeTargetFpsRange
+ Range<Integer>[] availableFpsRange = c.
+ get(CameraCharacteristics.CONTROL_AE_AVAILABLE_TARGET_FPS_RANGES);
+
+ // Pick FPS range with highest max value, tiebreak on higher min value
+ Range<Integer> bestRange = availableFpsRange[0];
+ for (Range<Integer> r : availableFpsRange) {
+ if (bestRange.getUpper() < r.getUpper()) {
+ bestRange = r;
+ } else if (bestRange.getUpper() == r.getUpper() &&
+ bestRange.getLower() < r.getLower()) {
+ bestRange = r;
+ }
+ }
+ m.set(CaptureRequest.CONTROL_AE_TARGET_FPS_RANGE, bestRange);
+ }
+
+ /*
+ * statistics.*
+ */
+
+ // statistics.faceDetectMode
+ m.set(CaptureRequest.STATISTICS_FACE_DETECT_MODE, STATISTICS_FACE_DETECT_MODE_OFF);
+
+ /*
+ * flash.*
+ */
+
+ // flash.mode
+ m.set(CaptureRequest.FLASH_MODE, FLASH_MODE_OFF);
+
+ /*
+ * lens.*
+ */
+
+ // lens.focalLength
+ m.set(CaptureRequest.LENS_FOCAL_LENGTH,
+ c.get(CameraCharacteristics.LENS_INFO_AVAILABLE_FOCAL_LENGTHS)[0]);
+
// TODO: map other request template values
return m;
}
diff --git a/core/java/android/hardware/camera2/legacy/LegacyRequestMapper.java b/core/java/android/hardware/camera2/legacy/LegacyRequestMapper.java
index fbfc39f..dfec9008 100644
--- a/core/java/android/hardware/camera2/legacy/LegacyRequestMapper.java
+++ b/core/java/android/hardware/camera2/legacy/LegacyRequestMapper.java
@@ -108,7 +108,12 @@
{
// aeRegions
{
+ // Use aeRegions if available, fall back to using awbRegions if present
MeteringRectangle[] aeRegions = request.get(CONTROL_AE_REGIONS);
+ if (request.get(CONTROL_AWB_REGIONS) != null) {
+ Log.w(TAG, "convertRequestMetadata - control.awbRegions setting is not " +
+ "supported, ignoring value");
+ }
int maxNumMeteringAreas = params.getMaxNumMeteringAreas();
List<Camera.Area> meteringAreaList = convertMeteringRegionsToLegacy(
activeArray, zoomData, aeRegions, maxNumMeteringAreas,
@@ -238,6 +243,57 @@
+ infinityFocusSupported + ", only 0.0f is supported");
}
}
+
+ // control.sceneMode, control.mode
+ {
+ // TODO: Map FACE_PRIORITY scene mode to face detection.
+
+ if (params.getSupportedSceneModes() != null) {
+ int controlMode = ParamsUtils.getOrDefault(request, CONTROL_MODE,
+ /*defaultValue*/CONTROL_MODE_AUTO);
+ String modeToSet;
+ switch (controlMode) {
+ case CONTROL_MODE_USE_SCENE_MODE: {
+ int sceneMode = ParamsUtils.getOrDefault(request, CONTROL_SCENE_MODE,
+ /*defaultValue*/CONTROL_SCENE_MODE_DISABLED);
+ String legacySceneMode = LegacyMetadataMapper.
+ convertSceneModeToLegacy(sceneMode);
+ if (legacySceneMode != null) {
+ modeToSet = legacySceneMode;
+ } else {
+ modeToSet = Parameters.SCENE_MODE_AUTO;
+ Log.w(TAG, "Skipping unknown requested scene mode: " + sceneMode);
+ }
+ break;
+ }
+ case CONTROL_MODE_AUTO: {
+ modeToSet = Parameters.SCENE_MODE_AUTO;
+ break;
+ }
+ default: {
+ Log.w(TAG, "Control mode " + controlMode +
+ " is unsupported, defaulting to AUTO");
+ modeToSet = Parameters.SCENE_MODE_AUTO;
+ }
+ }
+ params.setSceneMode(modeToSet);
+ }
+ }
+
+ // control.effectMode
+ {
+ if (params.getSupportedColorEffects() != null) {
+ int effectMode = ParamsUtils.getOrDefault(request, CONTROL_EFFECT_MODE,
+ /*defaultValue*/CONTROL_EFFECT_MODE_OFF);
+ String legacyEffectMode = LegacyMetadataMapper.convertEffectModeToLegacy(effectMode);
+ if (legacyEffectMode != null) {
+ params.setColorEffect(legacyEffectMode);
+ } else {
+ params.setColorEffect(Parameters.EFFECT_NONE);
+ Log.w(TAG, "Skipping unknown requested effect mode: " + effectMode);
+ }
+ }
+ }
}
private static List<Camera.Area> convertMeteringRegionsToLegacy(
diff --git a/core/java/android/hardware/camera2/legacy/LegacyResultMapper.java b/core/java/android/hardware/camera2/legacy/LegacyResultMapper.java
index 07852b9..6da5dd0 100644
--- a/core/java/android/hardware/camera2/legacy/LegacyResultMapper.java
+++ b/core/java/android/hardware/camera2/legacy/LegacyResultMapper.java
@@ -28,6 +28,7 @@
import android.hardware.camera2.legacy.ParameterUtils.ZoomData;
import android.hardware.camera2.params.MeteringRectangle;
import android.hardware.camera2.utils.ListUtils;
+import android.hardware.camera2.utils.ParamsUtils;
import android.util.Log;
import android.util.Size;
@@ -153,6 +154,51 @@
request.get(CaptureRequest.CONTROL_AWB_MODE));
}
+
+ /*
+ * control.mode
+ */
+ {
+ int controlMode = ParamsUtils.getOrDefault(request, CaptureRequest.CONTROL_MODE,
+ CONTROL_MODE_AUTO);
+ if (controlMode == CaptureResult.CONTROL_MODE_USE_SCENE_MODE) {
+ result.set(CONTROL_MODE, CONTROL_MODE_USE_SCENE_MODE);
+ } else {
+ result.set(CONTROL_MODE, CONTROL_MODE_AUTO);
+ }
+ }
+
+ /*
+ * control.sceneMode
+ */
+ {
+ String legacySceneMode = params.getSceneMode();
+ int mode = LegacyMetadataMapper.convertSceneModeFromLegacy(legacySceneMode);
+ if (mode != LegacyMetadataMapper.UNKNOWN_MODE) {
+ result.set(CaptureResult.CONTROL_SCENE_MODE, mode);
+ } else {
+ Log.w(TAG, "Unknown scene mode " + legacySceneMode +
+ " returned by camera HAL, setting to disabled.");
+ result.set(CaptureResult.CONTROL_SCENE_MODE, CONTROL_SCENE_MODE_DISABLED);
+ }
+ }
+
+
+ /*
+ * control.effectMode
+ */
+ {
+ String legacyEffectMode = params.getColorEffect();
+ int mode = LegacyMetadataMapper.convertEffectModeFromLegacy(legacyEffectMode);
+ if (mode != LegacyMetadataMapper.UNKNOWN_MODE) {
+ result.set(CaptureResult.CONTROL_EFFECT_MODE, mode);
+ } else {
+ Log.w(TAG, "Unknown effect mode " + legacyEffectMode +
+ " returned by camera HAL, setting to off.");
+ result.set(CaptureResult.CONTROL_EFFECT_MODE, CONTROL_EFFECT_MODE_OFF);
+ }
+ }
+
/*
* flash
*/
diff --git a/core/java/android/hardware/camera2/legacy/SurfaceTextureRenderer.java b/core/java/android/hardware/camera2/legacy/SurfaceTextureRenderer.java
index 0687264..3f24b2c 100644
--- a/core/java/android/hardware/camera2/legacy/SurfaceTextureRenderer.java
+++ b/core/java/android/hardware/camera2/legacy/SurfaceTextureRenderer.java
@@ -329,6 +329,9 @@
mSurfaces.clear();
mConversionSurfaces.clear();
mPBufferPixels = null;
+ if (mSurfaceTexture != null) {
+ mSurfaceTexture.release();
+ }
mSurfaceTexture = null;
}
diff --git a/core/java/android/hardware/camera2/utils/ArrayUtils.java b/core/java/android/hardware/camera2/utils/ArrayUtils.java
index 24c85d0..ae97079 100644
--- a/core/java/android/hardware/camera2/utils/ArrayUtils.java
+++ b/core/java/android/hardware/camera2/utils/ArrayUtils.java
@@ -47,6 +47,19 @@
return -1;
}
+ /** Return the index of {@code needle} in the {@code array}, or else {@code -1} */
+ public static int getArrayIndex(int[] array, int needle) {
+ if (array == null) {
+ return -1;
+ }
+ for (int i = 0; i < array.length; ++i) {
+ if (array[i] == needle) {
+ return i;
+ }
+ }
+ return -1;
+ }
+
/**
* Create an {@code int[]} from the {@code List<>} by using {@code convertFrom} and
* {@code convertTo} as a one-to-one map (via the index).
@@ -143,6 +156,17 @@
return arr;
}
+ /**
+ * Returns true if the given {@code array} contains the given element.
+ *
+ * @param array {@code array} to check for {@code elem}
+ * @param elem {@code elem} to test for
+ * @return {@code true} if the given element is contained
+ */
+ public static boolean contains(int[] array, int elem) {
+ return getArrayIndex(array, elem) != -1;
+ }
+
private ArrayUtils() {
throw new AssertionError();
}
diff --git a/core/java/android/hardware/hdmi/HdmiCecDeviceInfo.java b/core/java/android/hardware/hdmi/HdmiCecDeviceInfo.java
index 27829a7..6e1844a 100644
--- a/core/java/android/hardware/hdmi/HdmiCecDeviceInfo.java
+++ b/core/java/android/hardware/hdmi/HdmiCecDeviceInfo.java
@@ -65,6 +65,18 @@
*/
public static final int ADDR_INTERNAL = 0;
+ /**
+ * Physical address used to indicate the source comes from internal device.
+ * The physical address of TV(0) is used.
+ */
+ public static final int PATH_INTERNAL = 0x0000;
+
+ /** Invalid physical address (routing path) */
+ public static final int PATH_INVALID = 0xFFFF;
+
+ /** Invalid port ID */
+ public static final int PORT_INVALID = -1;
+
// Logical address, physical address, device type, vendor id and display name
// are immutable value.
private final int mLogicalAddress;
diff --git a/core/java/android/hardware/hdmi/IHdmiControlService.aidl b/core/java/android/hardware/hdmi/IHdmiControlService.aidl
index 808e0c9..920a1f4 100644
--- a/core/java/android/hardware/hdmi/IHdmiControlService.aidl
+++ b/core/java/android/hardware/hdmi/IHdmiControlService.aidl
@@ -37,6 +37,7 @@
*/
interface IHdmiControlService {
int[] getSupportedTypes();
+ HdmiCecDeviceInfo getActiveSource();
void oneTouchPlay(IHdmiControlCallback callback);
void queryDisplayStatus(IHdmiControlCallback callback);
void addHotplugEventListener(IHdmiHotplugEventListener listener);
diff --git a/core/java/android/hardware/location/GeofenceHardware.java b/core/java/android/hardware/location/GeofenceHardware.java
index 2d7b7e1..2d82cba 100644
--- a/core/java/android/hardware/location/GeofenceHardware.java
+++ b/core/java/android/hardware/location/GeofenceHardware.java
@@ -16,6 +16,7 @@
package android.hardware.location;
import android.location.Location;
+import android.os.Build;
import android.os.RemoteException;
import java.lang.ref.WeakReference;
@@ -60,19 +61,19 @@
public static final int MONITORING_TYPE_FUSED_HARDWARE = 1;
/**
- * Constant to indiciate that the monitoring system is currently
+ * Constant to indicate that the monitoring system is currently
* available for monitoring geofences.
*/
public static final int MONITOR_CURRENTLY_AVAILABLE = 0;
/**
- * Constant to indiciate that the monitoring system is currently
+ * Constant to indicate that the monitoring system is currently
* unavailable for monitoring geofences.
*/
public static final int MONITOR_CURRENTLY_UNAVAILABLE = 1;
/**
- * Constant to indiciate that the monitoring system is unsupported
+ * Constant to indicate that the monitoring system is unsupported
* for hardware geofence monitoring.
*/
public static final int MONITOR_UNSUPPORTED = 2;
@@ -129,6 +130,33 @@
*/
public static final int GEOFENCE_ERROR_INSUFFICIENT_MEMORY = 6;
+ // the following values must match the definitions in fused_location.h
+
+ /**
+ * The constant used to indicate that the monitoring system supports GNSS.
+ */
+ public static final int SOURCE_TECHNOLOGY_GNSS = (1<<0);
+
+ /**
+ * The constant used to indicate that the monitoring system supports WiFi.
+ */
+ public static final int SOURCE_TECHNOLOGY_WIFI = (1<<1);
+
+ /**
+ * The constant used to indicate that the monitoring system supports Sensors.
+ */
+ public static final int SOURCE_TECHNOLOGY_SENSORS = (1<<2);
+
+ /**
+ * The constant used to indicate that the monitoring system supports Cell.
+ */
+ public static final int SOURCE_TECHNOLOGY_CELL = (1<<3);
+
+ /**
+ * The constant used to indicate that the monitoring system supports Bluetooth.
+ */
+ public static final int SOURCE_TECHNOLOGY_BLUETOOTH = (1<<4);
+
private HashMap<GeofenceHardwareCallback, GeofenceHardwareCallbackWrapper>
mCallbacks = new HashMap<GeofenceHardwareCallback, GeofenceHardwareCallbackWrapper>();
private HashMap<GeofenceHardwareMonitorCallback, GeofenceHardwareMonitorCallbackWrapper>
@@ -238,13 +266,9 @@
geofenceRequest, GeofenceHardwareCallback callback) {
try {
if (geofenceRequest.getType() == GeofenceHardwareRequest.GEOFENCE_TYPE_CIRCLE) {
- return mService.addCircularFence(geofenceId, monitoringType,
- geofenceRequest.getLatitude(),
- geofenceRequest.getLongitude(), geofenceRequest.getRadius(),
- geofenceRequest.getLastTransition(),
- geofenceRequest.getMonitorTransitions(),
- geofenceRequest.getNotificationResponsiveness(),
- geofenceRequest.getUnknownTimer(),
+ return mService.addCircularFence(
+ monitoringType,
+ new GeofenceHardwareRequestParcelable(geofenceId, geofenceRequest),
getCallbackWrapper(callback));
} else {
throw new IllegalArgumentException("Geofence Request type not supported");
@@ -452,10 +476,21 @@
mCallback = new WeakReference<GeofenceHardwareMonitorCallback>(c);
}
- public void onMonitoringSystemChange(int monitoringType, boolean available,
- Location location) {
+ public void onMonitoringSystemChange(GeofenceHardwareMonitorEvent event) {
GeofenceHardwareMonitorCallback c = mCallback.get();
- if (c != null) c.onMonitoringSystemChange(monitoringType, available, location);
+ if (c == null) return;
+
+ // report the legacy event first, so older clients are not broken
+ c.onMonitoringSystemChange(
+ event.getMonitoringType(),
+ event.getMonitoringStatus() == GeofenceHardware.MONITOR_CURRENTLY_AVAILABLE,
+ event.getLocation());
+
+ // and only call the updated callback on on L and above, this complies with the
+ // documentation of GeofenceHardwareMonitorCallback
+ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.L) {
+ c.onMonitoringSystemChange(event);
+ }
}
}
diff --git a/core/java/android/hardware/location/GeofenceHardwareImpl.java b/core/java/android/hardware/location/GeofenceHardwareImpl.java
index 6b61690..5c7a8da 100644
--- a/core/java/android/hardware/location/GeofenceHardwareImpl.java
+++ b/core/java/android/hardware/location/GeofenceHardwareImpl.java
@@ -139,8 +139,8 @@
private void updateFusedHardwareAvailability() {
boolean fusedSupported;
try {
- fusedSupported = mFusedService.isSupported();
- } catch(RemoteException e) {
+ fusedSupported = (mFusedService != null ? mFusedService.isSupported() : false);
+ } catch (RemoteException e) {
Log.e(TAG, "RemoteException calling LocationManagerService");
fusedSupported = false;
}
@@ -210,18 +210,20 @@
}
}
- public boolean addCircularFence(int geofenceId, int monitoringType, double latitude,
- double longitude, double radius, int lastTransition,int monitorTransitions,
- int notificationResponsivenes, int unknownTimer, IGeofenceHardwareCallback callback) {
+ public boolean addCircularFence(
+ int monitoringType,
+ GeofenceHardwareRequestParcelable request,
+ IGeofenceHardwareCallback callback) {
+ int geofenceId = request.getId();
+
// This API is not thread safe. Operations on the same geofence need to be serialized
// by upper layers
if (DEBUG) {
- Log.d(TAG, "addCircularFence: GeofenceId: " + geofenceId + " Latitude: " + latitude +
- " Longitude: " + longitude + " Radius: " + radius + " LastTransition: "
- + lastTransition + " MonitorTransition: " + monitorTransitions +
- " NotificationResponsiveness: " + notificationResponsivenes +
- " UnKnown Timer: " + unknownTimer + " MonitoringType: " + monitoringType);
-
+ String message = String.format(
+ "addCircularFence: monitoringType=%d, %s",
+ monitoringType,
+ request);
+ Log.d(TAG, message);
}
boolean result;
@@ -237,9 +239,15 @@
case GeofenceHardware.MONITORING_TYPE_GPS_HARDWARE:
if (mGpsService == null) return false;
try {
- result = mGpsService.addCircularHardwareGeofence(geofenceId, latitude,
- longitude, radius, lastTransition, monitorTransitions,
- notificationResponsivenes, unknownTimer);
+ result = mGpsService.addCircularHardwareGeofence(
+ request.getId(),
+ request.getLatitude(),
+ request.getLongitude(),
+ request.getRadius(),
+ request.getLastTransition(),
+ request.getMonitorTransitions(),
+ request.getNotificationResponsiveness(),
+ request.getUnknownTimer());
} catch (RemoteException e) {
Log.e(TAG, "AddGeofence: Remote Exception calling LocationManagerService");
result = false;
@@ -249,20 +257,9 @@
if(mFusedService == null) {
return false;
}
- GeofenceHardwareRequest request = GeofenceHardwareRequest.createCircularGeofence(
- latitude,
- longitude,
- radius);
- request.setUnknownTimer(unknownTimer);
- request.setNotificationResponsiveness(notificationResponsivenes);
- request.setMonitorTransitions(monitorTransitions);
- request.setLastTransition(lastTransition);
-
- GeofenceHardwareRequestParcelable parcelableRequest =
- new GeofenceHardwareRequestParcelable(geofenceId, request);
try {
mFusedService.addGeofences(
- new GeofenceHardwareRequestParcelable[] { parcelableRequest });
+ new GeofenceHardwareRequestParcelable[] { request });
result = true;
} catch(RemoteException e) {
Log.e(TAG, "AddGeofence: RemoteException calling LocationManagerService");
@@ -471,12 +468,14 @@
int monitoringStatus,
Location location,
int source) {
- // TODO: use the source if needed in the future
setMonitorAvailability(monitoringType, monitoringStatus);
acquireWakeLock();
- Message message = mCallbacksHandler.obtainMessage(GEOFENCE_STATUS, location);
- message.arg1 = monitoringStatus;
- message.arg2 = monitoringType;
+ GeofenceHardwareMonitorEvent event = new GeofenceHardwareMonitorEvent(
+ monitoringType,
+ monitoringStatus,
+ source,
+ location);
+ Message message = mCallbacksHandler.obtainMessage(GEOFENCE_STATUS, event);
message.sendToTarget();
}
@@ -644,20 +643,17 @@
switch (msg.what) {
case GEOFENCE_STATUS:
- Location location = (Location) msg.obj;
- int val = msg.arg1;
- monitoringType = msg.arg2;
- boolean available;
- available = (val == GeofenceHardware.MONITOR_CURRENTLY_AVAILABLE ?
- true : false);
- callbackList = mCallbacks[monitoringType];
+ GeofenceHardwareMonitorEvent event = (GeofenceHardwareMonitorEvent) msg.obj;
+ callbackList = mCallbacks[event.getMonitoringType()];
if (callbackList != null) {
- if (DEBUG) Log.d(TAG, "MonitoringSystemChangeCallback: GPS : " + available);
+ if (DEBUG) Log.d(TAG, "MonitoringSystemChangeCallback: " + event);
- for (IGeofenceHardwareMonitorCallback c: callbackList) {
+ for (IGeofenceHardwareMonitorCallback c : callbackList) {
try {
- c.onMonitoringSystemChange(monitoringType, available, location);
- } catch (RemoteException e) {}
+ c.onMonitoringSystemChange(event);
+ } catch (RemoteException e) {
+ Log.d(TAG, "Error reporting onMonitoringSystemChange.", e);
+ }
}
}
releaseWakeLock();
diff --git a/core/java/android/hardware/location/GeofenceHardwareMonitorCallback.java b/core/java/android/hardware/location/GeofenceHardwareMonitorCallback.java
index b8e927e..f927027 100644
--- a/core/java/android/hardware/location/GeofenceHardwareMonitorCallback.java
+++ b/core/java/android/hardware/location/GeofenceHardwareMonitorCallback.java
@@ -19,19 +19,39 @@
import android.location.Location;
/**
- * The callback class associated with the status change of hardware montiors
+ * The callback class associated with the status change of hardware monitors
* in {@link GeofenceHardware}
*/
public abstract class GeofenceHardwareMonitorCallback {
/**
* The callback called when the state of a monitoring system changes.
* {@link GeofenceHardware#MONITORING_TYPE_GPS_HARDWARE} is an example of a
- * monitoring system
+ * monitoring system.
+ *
+ * @deprecated use {@link #onMonitoringSystemChange(GeofenceHardwareMonitorEvent)} instead.
+ * NOTE: this API is will remain to be called on Android API 21 and above for backwards
+ * compatibility. But clients must stop implementing it when updating their code.
*
* @param monitoringType The type of the monitoring system.
- * @param available Indicates whether the system is currenty available or not.
+ * @param available Indicates whether the system is currently available or not.
* @param location The last known location according to the monitoring system.
*/
+ @Deprecated
public void onMonitoringSystemChange(int monitoringType, boolean available, Location location) {
}
+
+ /**
+ * The callback called when the sate of a monitoring system changes.
+ * {@link GeofenceHardware#MONITORING_TYPE_GPS_HARDWARE} is an example of a monitoring system.
+ * {@link GeofenceHardware#MONITOR_CURRENTLY_AVAILABLE} is an example of a monitoring status.
+ * {@link GeofenceHardware#SOURCE_TECHNOLOGY_GNSS} is an example of a source.
+ *
+ * This callback must be used instead of
+ * {@link #onMonitoringSystemChange(int, boolean, android.location.Location)}.
+ *
+ * NOTE: this API is only called on Android API 21 and above.
+ *
+ * @param event An object representing the monitoring system change event.
+ */
+ public void onMonitoringSystemChange(GeofenceHardwareMonitorEvent event) {}
}
diff --git a/core/java/android/hardware/location/GeofenceHardwareMonitorEvent.aidl b/core/java/android/hardware/location/GeofenceHardwareMonitorEvent.aidl
new file mode 100644
index 0000000..008953e
--- /dev/null
+++ b/core/java/android/hardware/location/GeofenceHardwareMonitorEvent.aidl
@@ -0,0 +1,19 @@
+/*
+ * Copyright (C) 2014 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License
+ */
+
+package android.hardware.location;
+
+parcelable GeofenceHardwareMonitorEvent;
\ No newline at end of file
diff --git a/core/java/android/hardware/location/GeofenceHardwareMonitorEvent.java b/core/java/android/hardware/location/GeofenceHardwareMonitorEvent.java
new file mode 100644
index 0000000..9c460d2
--- /dev/null
+++ b/core/java/android/hardware/location/GeofenceHardwareMonitorEvent.java
@@ -0,0 +1,116 @@
+/*
+ * Copyright (C) 2014 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.hardware.location;
+
+import android.location.Location;
+import android.os.Parcel;
+import android.os.Parcelable;
+
+/**
+ * A class that represents an event for each change in the state of a monitoring system.
+ */
+public class GeofenceHardwareMonitorEvent implements Parcelable {
+ private final int mMonitoringType;
+ private final int mMonitoringStatus;
+ private final int mSourceTechnologies;
+ private final Location mLocation;
+
+ public GeofenceHardwareMonitorEvent(
+ int monitoringType,
+ int monitoringStatus,
+ int sourceTechnologies,
+ Location location) {
+ mMonitoringType = monitoringType;
+ mMonitoringStatus = monitoringStatus;
+ mSourceTechnologies = sourceTechnologies;
+ mLocation = location;
+ }
+
+ /**
+ * Returns the type of the monitoring system that has a change on its state.
+ */
+ public int getMonitoringType() {
+ return mMonitoringType;
+ }
+
+ /**
+ * Returns the new status associated with the monitoring system.
+ */
+ public int getMonitoringStatus() {
+ return mMonitoringStatus;
+ }
+
+ /**
+ * Returns the source technologies that the status is associated to.
+ */
+ public int getSourceTechnologies() {
+ return mSourceTechnologies;
+ }
+
+ /**
+ * Returns the last known location according to the monitoring system.
+ */
+ public Location getLocation() {
+ return mLocation;
+ }
+
+ public static final Creator<GeofenceHardwareMonitorEvent> CREATOR =
+ new Creator<GeofenceHardwareMonitorEvent>() {
+ @Override
+ public GeofenceHardwareMonitorEvent createFromParcel(Parcel source) {
+ ClassLoader classLoader = GeofenceHardwareMonitorEvent.class.getClassLoader();
+ int monitoringType = source.readInt();
+ int monitoringStatus = source.readInt();
+ int sourceTechnologies = source.readInt();
+ Location location = source.readParcelable(classLoader);
+
+ return new GeofenceHardwareMonitorEvent(
+ monitoringType,
+ monitoringStatus,
+ sourceTechnologies,
+ location);
+ }
+
+ @Override
+ public GeofenceHardwareMonitorEvent[] newArray(int size) {
+ return new GeofenceHardwareMonitorEvent[size];
+ }
+ };
+
+ @Override
+ public int describeContents() {
+ return 0;
+ }
+
+ @Override
+ public void writeToParcel(Parcel parcel, int flags) {
+ parcel.writeInt(mMonitoringType);
+ parcel.writeInt(mMonitoringStatus);
+ parcel.writeInt(mSourceTechnologies);
+ parcel.writeParcelable(mLocation, flags);
+ }
+
+ @Override
+ public String toString() {
+ return String.format(
+ "GeofenceHardwareMonitorEvent: type=%d, status=%d, sources=%d, location=%s",
+ mMonitoringType,
+ mMonitoringStatus,
+ mSourceTechnologies,
+ mLocation);
+ }
+}
diff --git a/core/java/android/hardware/location/GeofenceHardwareRequest.java b/core/java/android/hardware/location/GeofenceHardwareRequest.java
index 796d7f8..887c4ad 100644
--- a/core/java/android/hardware/location/GeofenceHardwareRequest.java
+++ b/core/java/android/hardware/location/GeofenceHardwareRequest.java
@@ -33,6 +33,7 @@
private int mMonitorTransitions = GeofenceHardware.GEOFENCE_UNCERTAIN |
GeofenceHardware.GEOFENCE_ENTERED | GeofenceHardware.GEOFENCE_EXITED;
private int mNotificationResponsiveness = 5000; // 5 secs
+ private int mSourceTechnologies = GeofenceHardware.SOURCE_TECHNOLOGY_GNSS;
private void setCircularGeofence(double latitude, double longitude, double radius) {
mLatitude = latitude;
@@ -102,6 +103,28 @@
}
/**
+ * Set the source technologies to use while tracking the geofence.
+ * The value is the bit-wise of one or several source fields defined in
+ * {@link GeofenceHardware}.
+ *
+ * @param sourceTechnologies The set of source technologies to use.
+ */
+ public void setSourceTechnologies(int sourceTechnologies) {
+ int sourceTechnologiesAll = GeofenceHardware.SOURCE_TECHNOLOGY_GNSS
+ | GeofenceHardware.SOURCE_TECHNOLOGY_WIFI
+ | GeofenceHardware.SOURCE_TECHNOLOGY_SENSORS
+ | GeofenceHardware.SOURCE_TECHNOLOGY_CELL
+ | GeofenceHardware.SOURCE_TECHNOLOGY_BLUETOOTH;
+
+ int sanitizedSourceTechnologies = (sourceTechnologies & sourceTechnologiesAll);
+ if (sanitizedSourceTechnologies == 0) {
+ throw new IllegalArgumentException("At least one valid source technology must be set.");
+ }
+
+ mSourceTechnologies = sanitizedSourceTechnologies;
+ }
+
+ /**
* Returns the latitude of this geofence.
*/
public double getLatitude() {
@@ -150,6 +173,13 @@
return mLastTransition;
}
+ /**
+ * Returns the source technologies to track this geofence.
+ */
+ public int getSourceTechnologies() {
+ return mSourceTechnologies;
+ }
+
int getType() {
return mType;
}
diff --git a/core/java/android/hardware/location/GeofenceHardwareRequestParcelable.java b/core/java/android/hardware/location/GeofenceHardwareRequestParcelable.java
index 40e7fc4..d3311f5 100644
--- a/core/java/android/hardware/location/GeofenceHardwareRequestParcelable.java
+++ b/core/java/android/hardware/location/GeofenceHardwareRequestParcelable.java
@@ -98,9 +98,43 @@
}
/**
+ * Returns the source technologies to track this geofence.
+ */
+ int getSourceTechnologies() {
+ return mRequest.getSourceTechnologies();
+ }
+
+
+ @Override
+ public String toString() {
+ StringBuilder builder = new StringBuilder();
+ builder.append("id=");
+ builder.append(mId);
+ builder.append(", type=");
+ builder.append(mRequest.getType());
+ builder.append(", latitude=");
+ builder.append(mRequest.getLatitude());
+ builder.append(", longitude=");
+ builder.append(mRequest.getLongitude());
+ builder.append(", radius=");
+ builder.append(mRequest.getRadius());
+ builder.append(", lastTransition=");
+ builder.append(mRequest.getLastTransition());
+ builder.append(", unknownTimer=");
+ builder.append(mRequest.getUnknownTimer());
+ builder.append(", monitorTransitions=");
+ builder.append(mRequest.getMonitorTransitions());
+ builder.append(", notificationResponsiveness=");
+ builder.append(mRequest.getNotificationResponsiveness());
+ builder.append(", sourceTechnologies=");
+ builder.append(mRequest.getSourceTechnologies());
+ return builder.toString();
+ }
+
+ /**
* Method definitions to support Parcelable operations.
*/
- public static final Parcelable.Creator<GeofenceHardwareRequestParcelable> CREATOR =
+ public static final Parcelable.Creator<GeofenceHardwareRequestParcelable> CREATOR =
new Parcelable.Creator<GeofenceHardwareRequestParcelable>() {
@Override
public GeofenceHardwareRequestParcelable createFromParcel(Parcel parcel) {
@@ -120,7 +154,8 @@
request.setMonitorTransitions(parcel.readInt());
request.setUnknownTimer(parcel.readInt());
request.setNotificationResponsiveness(parcel.readInt());
-
+ request.setSourceTechnologies(parcel.readInt());
+
int id = parcel.readInt();
return new GeofenceHardwareRequestParcelable(id, request);
}
@@ -146,6 +181,7 @@
parcel.writeInt(getMonitorTransitions());
parcel.writeInt(getUnknownTimer());
parcel.writeInt(getNotificationResponsiveness());
+ parcel.writeInt(getSourceTechnologies());
parcel.writeInt(getId());
}
}
diff --git a/core/java/android/hardware/location/GeofenceHardwareService.java b/core/java/android/hardware/location/GeofenceHardwareService.java
index fb238bd..4816c5f 100644
--- a/core/java/android/hardware/location/GeofenceHardwareService.java
+++ b/core/java/android/hardware/location/GeofenceHardwareService.java
@@ -86,15 +86,14 @@
return mGeofenceHardwareImpl.getStatusOfMonitoringType(monitoringType);
}
- public boolean addCircularFence(int id, int monitoringType, double lat, double longitude,
- double radius, int lastTransition, int monitorTransitions, int
- notificationResponsiveness, int unknownTimer, IGeofenceHardwareCallback callback) {
+ public boolean addCircularFence(
+ int monitoringType,
+ GeofenceHardwareRequestParcelable request,
+ IGeofenceHardwareCallback callback) {
mContext.enforceCallingPermission(Manifest.permission.LOCATION_HARDWARE,
"Location Hardware permission not granted to access hardware geofence");
checkPermission(Binder.getCallingPid(), Binder.getCallingUid(), monitoringType);
- return mGeofenceHardwareImpl.addCircularFence(id, monitoringType, lat, longitude,
- radius, lastTransition, monitorTransitions, notificationResponsiveness,
- unknownTimer, callback);
+ return mGeofenceHardwareImpl.addCircularFence(monitoringType, request, callback);
}
public boolean removeGeofence(int id, int monitoringType) {
diff --git a/core/java/android/hardware/location/IGeofenceHardware.aidl b/core/java/android/hardware/location/IGeofenceHardware.aidl
index 8900166..0e840c4 100644
--- a/core/java/android/hardware/location/IGeofenceHardware.aidl
+++ b/core/java/android/hardware/location/IGeofenceHardware.aidl
@@ -18,6 +18,7 @@
import android.location.IFusedGeofenceHardware;
import android.location.IGpsGeofenceHardware;
+import android.hardware.location.GeofenceHardwareRequestParcelable;
import android.hardware.location.IGeofenceHardwareCallback;
import android.hardware.location.IGeofenceHardwareMonitorCallback;
@@ -27,9 +28,10 @@
void setFusedGeofenceHardware(in IFusedGeofenceHardware service);
int[] getMonitoringTypes();
int getStatusOfMonitoringType(int monitoringType);
- boolean addCircularFence(int id, int monitoringType, double lat, double longitude,
- double radius, int lastTransition, int monitorTransitions,
- int notificationResponsiveness, int unknownTimer,in IGeofenceHardwareCallback callback);
+ boolean addCircularFence(
+ int monitoringType,
+ in GeofenceHardwareRequestParcelable request,
+ in IGeofenceHardwareCallback callback);
boolean removeGeofence(int id, int monitoringType);
boolean pauseGeofence(int id, int monitoringType);
boolean resumeGeofence(int id, int monitoringType, int monitorTransitions);
diff --git a/core/java/android/hardware/location/IGeofenceHardwareMonitorCallback.aidl b/core/java/android/hardware/location/IGeofenceHardwareMonitorCallback.aidl
index 0b6e04b..811ecd0 100644
--- a/core/java/android/hardware/location/IGeofenceHardwareMonitorCallback.aidl
+++ b/core/java/android/hardware/location/IGeofenceHardwareMonitorCallback.aidl
@@ -16,9 +16,10 @@
package android.hardware.location;
+import android.hardware.location.GeofenceHardwareMonitorEvent;
import android.location.Location;
/** @hide */
oneway interface IGeofenceHardwareMonitorCallback {
- void onMonitoringSystemChange(int monitoringType, boolean available, in Location location);
+ void onMonitoringSystemChange(in GeofenceHardwareMonitorEvent event);
}
diff --git a/core/java/android/hardware/soundtrigger/SoundTrigger.java b/core/java/android/hardware/soundtrigger/SoundTrigger.java
index 4498789..adee740 100644
--- a/core/java/android/hardware/soundtrigger/SoundTrigger.java
+++ b/core/java/android/hardware/soundtrigger/SoundTrigger.java
@@ -524,6 +524,11 @@
/** True if the DSP should capture the trigger sound and make it available for further
* capture. */
public final boolean captureRequested;
+ /**
+ * True if the service should restart listening after the DSP triggers.
+ * Note: This config flag is currently used at the service layer rather than by the DSP.
+ */
+ public final boolean allowMultipleTriggers;
/** List of all keyphrases in the sound model for which recognition should be performed with
* options for each keyphrase. */
public final KeyphraseRecognitionExtra keyphrases[];
@@ -531,9 +536,10 @@
* typically during enrollment. */
public final byte[] data;
- public RecognitionConfig(boolean captureRequested,
+ public RecognitionConfig(boolean captureRequested, boolean allowMultipleTriggers,
KeyphraseRecognitionExtra keyphrases[], byte[] data) {
this.captureRequested = captureRequested;
+ this.allowMultipleTriggers = allowMultipleTriggers;
this.keyphrases = keyphrases;
this.data = data;
}
@@ -551,15 +557,17 @@
private static RecognitionConfig fromParcel(Parcel in) {
boolean captureRequested = in.readByte() == 1;
+ boolean allowMultipleTriggers = in.readByte() == 1;
KeyphraseRecognitionExtra[] keyphrases =
in.createTypedArray(KeyphraseRecognitionExtra.CREATOR);
byte[] data = in.readBlob();
- return new RecognitionConfig(captureRequested, keyphrases, data);
+ return new RecognitionConfig(captureRequested, allowMultipleTriggers, keyphrases, data);
}
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeByte((byte) (captureRequested ? 1 : 0));
+ dest.writeByte((byte) (allowMultipleTriggers ? 1 : 0));
dest.writeTypedArray(keyphrases, flags);
dest.writeBlob(data);
}
@@ -571,9 +579,9 @@
@Override
public String toString() {
- return "RecognitionConfig [captureRequested=" + captureRequested + ", keyphrases="
- + Arrays.toString(keyphrases)
- + ", data=" + (data == null ? 0 : data.length) + "]";
+ return "RecognitionConfig [captureRequested=" + captureRequested
+ + ", allowMultipleTriggers=" + allowMultipleTriggers + ", keyphrases="
+ + Arrays.toString(keyphrases) + ", data=" + Arrays.toString(data) + "]";
}
}
diff --git a/core/java/android/net/Network.java b/core/java/android/net/Network.java
index 5e3decd..0de3f26 100644
--- a/core/java/android/net/Network.java
+++ b/core/java/android/net/Network.java
@@ -16,6 +16,7 @@
package android.net;
+import android.net.NetworkBoundURLFactory;
import android.net.NetworkUtils;
import android.os.Parcelable;
import android.os.Parcel;
@@ -29,6 +30,8 @@
import java.net.SocketException;
import java.net.UnknownHostException;
import java.net.URL;
+import java.net.URLStreamHandler;
+import java.util.concurrent.atomic.AtomicReference;
import javax.net.SocketFactory;
import com.android.okhttp.HostResolver;
@@ -52,8 +55,8 @@
// Objects used to perform per-network operations such as getSocketFactory
// and getBoundURL, and a lock to protect access to them.
- private NetworkBoundSocketFactory mNetworkBoundSocketFactory = null;
- private OkHttpClient mOkHttpClient = null;
+ private volatile NetworkBoundSocketFactory mNetworkBoundSocketFactory = null;
+ private volatile OkHttpClient mOkHttpClient = null;
private Object mLock = new Object();
/**
@@ -174,36 +177,83 @@
* {@code Network}.
*/
public SocketFactory getSocketFactory() {
- synchronized (mLock) {
- if (mNetworkBoundSocketFactory == null) {
- mNetworkBoundSocketFactory = new NetworkBoundSocketFactory(netId);
+ if (mNetworkBoundSocketFactory == null) {
+ synchronized (mLock) {
+ if (mNetworkBoundSocketFactory == null) {
+ mNetworkBoundSocketFactory = new NetworkBoundSocketFactory(netId);
+ }
}
}
return mNetworkBoundSocketFactory;
}
+ /** The default NetworkBoundURLFactory, used if setNetworkBoundURLFactory is never called. */
+ private static final NetworkBoundURLFactory DEFAULT_URL_FACTORY = new NetworkBoundURLFactory() {
+ public URL getBoundURL(final Network network, URL url) throws MalformedURLException {
+ if (network.mOkHttpClient == null) {
+ synchronized (network.mLock) {
+ if (network.mOkHttpClient == null) {
+ HostResolver hostResolver = new HostResolver() {
+ @Override
+ public InetAddress[] getAllByName(String host)
+ throws UnknownHostException {
+ return network.getAllByName(host);
+ }
+ };
+ network.mOkHttpClient = new OkHttpClient()
+ .setSocketFactory(network.getSocketFactory())
+ .setHostResolver(hostResolver);
+ }
+ }
+ }
+
+ String protocol = url.getProtocol();
+ URLStreamHandler handler = network.mOkHttpClient.createURLStreamHandler(protocol);
+ if (handler == null) {
+ // OkHttpClient only supports HTTP and HTTPS and returns a null URLStreamHandler if
+ // passed another protocol.
+ throw new MalformedURLException("Invalid URL or unrecognized protocol " + protocol);
+ }
+ return new URL(url, "", handler);
+ }
+ };
+
+ private static AtomicReference<NetworkBoundURLFactory> sNetworkBoundURLFactory =
+ new AtomicReference <NetworkBoundURLFactory>(DEFAULT_URL_FACTORY);
+
/**
- * Returns a {@link URL} based on the given URL but bound to this {@code Network}.
- * Note that if this {@code Network} ever disconnects, this factory and any URL object it
- * produced in the past or future will cease to work.
+ * Returns a {@link URL} based on the given URL but bound to this {@code Network},
+ * such that opening the URL will send all network traffic on this Network.
+ *
+ * Note that if this {@code Network} ever disconnects, any URL object generated by this method
+ * in the past or future will cease to work.
+ *
+ * The returned URL may have a {@link URLStreamHandler} explicitly set, which may not be the
+ * handler generated by the factory set with {@link java.net.URL#setURLStreamHandlerFactory}. To
+ * affect the {@code URLStreamHandler}s of URLs returned by this method, call
+ * {@link #setNetworkBoundURLFactory}.
+ *
+ * Because the returned URLs may have an explicit {@code URLStreamHandler} set, using them as a
+ * context when constructing other URLs and explicitly specifying a {@code URLStreamHandler} may
+ * result in URLs that are no longer bound to the same {@code Network}.
+ *
+ * The default implementation only supports {@code HTTP} and {@code HTTPS} URLs.
*
* @return a {@link URL} bound to this {@code Network}.
*/
public URL getBoundURL(URL url) throws MalformedURLException {
- synchronized (mLock) {
- if (mOkHttpClient == null) {
- HostResolver hostResolver = new HostResolver() {
- @Override
- public InetAddress[] getAllByName(String host) throws UnknownHostException {
- return Network.this.getAllByName(host);
- }
- };
- mOkHttpClient = new OkHttpClient()
- .setSocketFactory(getSocketFactory())
- .setHostResolver(hostResolver);
- }
+ return sNetworkBoundURLFactory.get().getBoundURL(this, url);
+ }
+
+ /**
+ * Sets the {@link NetworkBoundURLFactory} to be used by future {@link #getBoundURL} calls.
+ * If {@code null}, clears any factory that was previously specified.
+ */
+ public static void setNetworkBoundURLFactory(NetworkBoundURLFactory factory) {
+ if (factory == null) {
+ factory = DEFAULT_URL_FACTORY;
}
- return new URL(url, "", mOkHttpClient.createURLStreamHandler(url.getProtocol()));
+ sNetworkBoundURLFactory.set(factory);
}
// implement the Parcelable interface
diff --git a/core/java/android/net/NetworkBoundURLFactory.java b/core/java/android/net/NetworkBoundURLFactory.java
new file mode 100644
index 0000000..356100e
--- /dev/null
+++ b/core/java/android/net/NetworkBoundURLFactory.java
@@ -0,0 +1,35 @@
+/*
+ * Copyright (C) 2014 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.net;
+
+import java.net.MalformedURLException;
+import java.net.URL;
+
+/**
+ * An interface that describes a factory for network-specific {@link URL} objects.
+ */
+public interface NetworkBoundURLFactory {
+ /**
+ * Returns a {@link URL} based on the given URL but bound to the specified {@code Network},
+ * such that opening the URL will send all network traffic on the specified Network.
+ *
+ * @return a {@link URL} bound to this {@code Network}.
+ * @throws MalformedURLException if the URL was not valid, or this factory cannot handle the
+ * specified URL (e.g., if it does not support the protocol of the URL).
+ */
+ public URL getBoundURL(Network network, URL url) throws MalformedURLException;
+}
diff --git a/core/java/android/nfc/INfcAdapter.aidl b/core/java/android/nfc/INfcAdapter.aidl
index 541b700..ee4d45e 100644
--- a/core/java/android/nfc/INfcAdapter.aidl
+++ b/core/java/android/nfc/INfcAdapter.aidl
@@ -27,6 +27,7 @@
import android.nfc.INfcTag;
import android.nfc.INfcCardEmulation;
import android.nfc.INfcLockscreenDispatch;
+import android.nfc.INfcUnlockHandler;
import android.os.Bundle;
/**
@@ -57,4 +58,6 @@
void setP2pModes(int initatorModes, int targetModes);
void registerLockscreenDispatch(INfcLockscreenDispatch lockscreenDispatch, in int[] techList);
+ void addNfcUnlockHandler(INfcUnlockHandler unlockHandler, in int[] techList);
+ void removeNfcUnlockHandler(IBinder b);
}
diff --git a/core/java/android/nfc/INfcUnlockHandler.aidl b/core/java/android/nfc/INfcUnlockHandler.aidl
new file mode 100644
index 0000000..e1cace9
--- /dev/null
+++ b/core/java/android/nfc/INfcUnlockHandler.aidl
@@ -0,0 +1,12 @@
+package android.nfc;
+
+import android.nfc.Tag;
+
+/**
+ * @hide
+ */
+interface INfcUnlockHandler {
+
+ boolean onUnlockAttempted(in Tag tag);
+
+}
diff --git a/core/java/android/nfc/NfcAdapter.java b/core/java/android/nfc/NfcAdapter.java
index b0397d5..dde2cf1 100644
--- a/core/java/android/nfc/NfcAdapter.java
+++ b/core/java/android/nfc/NfcAdapter.java
@@ -20,6 +20,7 @@
import android.annotation.SdkConstant;
import android.annotation.SdkConstant.SdkConstantType;
+import android.annotation.SystemApi;
import android.app.Activity;
import android.app.ActivityThread;
import android.app.OnActivityPausedListener;
@@ -29,7 +30,6 @@
import android.content.pm.IPackageManager;
import android.content.pm.PackageManager;
import android.net.Uri;
-import android.nfc.BeamShareData;
import android.nfc.tech.MifareClassic;
import android.nfc.tech.Ndef;
import android.nfc.tech.NfcA;
@@ -261,6 +261,7 @@
public static final String EXTRA_READER_PRESENCE_CHECK_DELAY = "presence";
/** @hide */
+ @SystemApi
public static final int FLAG_NDEF_PUSH_NO_CONFIRM = 0x1;
/** @hide */
@@ -310,6 +311,8 @@
final NfcActivityManager mNfcActivityManager;
final Context mContext;
+ final HashMap<NfcUnlockHandler, IBinder> mNfcUnlockHandlers;
+ final Object mLock;
/**
* A callback to be invoked when the system finds a tag while the foreground activity is
@@ -392,6 +395,22 @@
/**
+ * A callback to be invoked when an application has registered as a
+ * handler to unlock the device given an NFC tag at the lockscreen.
+ * @hide
+ */
+ @SystemApi
+ public interface NfcUnlockHandler {
+ /**
+ * Called at the lock screen to attempt to unlock the device with the given tag.
+ * @param tag the detected tag, to be used to unlock the device
+ * @return true if the device was successfully unlocked
+ */
+ public boolean onUnlockAttempted(Tag tag);
+ }
+
+
+ /**
* Helper to check if this device has FEATURE_NFC, but without using
* a context.
* Equivalent to
@@ -523,6 +542,8 @@
NfcAdapter(Context context) {
mContext = context;
mNfcActivityManager = new NfcActivityManager(this);
+ mNfcUnlockHandlers = new HashMap<NfcUnlockHandler, IBinder>();
+ mLock = new Object();
}
/**
@@ -652,6 +673,7 @@
*
* @hide
*/
+ @SystemApi
public boolean enable() {
try {
return sService.enable();
@@ -679,7 +701,7 @@
*
* @hide
*/
-
+ @SystemApi
public boolean disable() {
try {
return sService.disable(true);
@@ -932,6 +954,7 @@
/**
* @hide
*/
+ @SystemApi
public void setNdefPushMessage(NdefMessage message, Activity activity, int flags) {
if (activity == null) {
throw new NullPointerException("activity cannot be null");
@@ -1359,6 +1382,7 @@
* <p>This API is for the Settings application.
* @hide
*/
+ @SystemApi
public boolean enableNdefPush() {
try {
return sService.enableNdefPush();
@@ -1373,6 +1397,7 @@
* <p>This API is for the Settings application.
* @hide
*/
+ @SystemApi
public boolean disableNdefPush() {
try {
return sService.disableNdefPush();
@@ -1451,7 +1476,7 @@
public boolean onTagDetected(Tag tag) throws RemoteException {
return lockscreenDispatch.onTagDetected(tag);
}
- }, Tag.techListFromStrings(techList));
+ }, Tag.getTechCodesFromStrings(techList));
} catch (RemoteException e) {
attemptDeadServiceRecovery(e);
return false;
@@ -1464,6 +1489,72 @@
}
/**
+ * Registers a new NFC unlock handler with the NFC service.
+ *
+ * <p />NFC unlock handlers are intended to unlock the keyguard in the presence of a trusted
+ * NFC device. The handler should return true if it successfully authenticates the user and
+ * unlocks the keyguard.
+ *
+ * <p /> The parameter {@code tagTechnologies} determines which Tag technologies will be polled for
+ * at the lockscreen. Polling for less tag technologies reduces latency, and so it is
+ * strongly recommended to only provide the Tag technologies that the handler is expected to
+ * receive.
+ *
+ * @hide
+ */
+ @SystemApi
+ public boolean addNfcUnlockHandler(final NfcUnlockHandler unlockHandler,
+ String[] tagTechnologies) {
+ try {
+ INfcUnlockHandler.Stub iHandler = new INfcUnlockHandler.Stub() {
+ @Override
+ public boolean onUnlockAttempted(Tag tag) throws RemoteException {
+ return unlockHandler.onUnlockAttempted(tag);
+ }
+ };
+
+ synchronized (mLock) {
+ if (mNfcUnlockHandlers.containsKey(unlockHandler)) {
+ return true;
+ }
+ sService.addNfcUnlockHandler(iHandler, Tag.getTechCodesFromStrings(tagTechnologies));
+ mNfcUnlockHandlers.put(unlockHandler, iHandler.asBinder());
+ }
+ } catch (RemoteException e) {
+ attemptDeadServiceRecovery(e);
+ return false;
+ } catch (IllegalArgumentException e) {
+ Log.e(TAG, "Unable to register LockscreenDispatch", e);
+ return false;
+ }
+
+ return true;
+ }
+
+ /**
+ * Removes a previously registered unlock handler. Also removes the tag technologies
+ * associated with the removed unlock handler.
+ *
+ * @hide
+ */
+ @SystemApi
+ public boolean removeNfcUnlockHandler(NfcUnlockHandler unlockHandler) {
+ try {
+ synchronized (mLock) {
+ if (mNfcUnlockHandlers.containsKey(unlockHandler)) {
+ sService.removeNfcUnlockHandler(mNfcUnlockHandlers.get(unlockHandler));
+ mNfcUnlockHandlers.remove(unlockHandler);
+ }
+
+ return true;
+ }
+ } catch (RemoteException e) {
+ attemptDeadServiceRecovery(e);
+ return false;
+ }
+ }
+
+ /**
* @hide
*/
public INfcAdapterExtras getNfcAdapterExtrasInterface() {
diff --git a/core/java/android/nfc/Tag.java b/core/java/android/nfc/Tag.java
index 43be702..154d5a1 100644
--- a/core/java/android/nfc/Tag.java
+++ b/core/java/android/nfc/Tag.java
@@ -196,7 +196,7 @@
return strings;
}
- static int[] techListFromStrings(String[] techStringList) throws IllegalArgumentException {
+ static int[] getTechCodesFromStrings(String[] techStringList) throws IllegalArgumentException {
if (techStringList == null) {
throw new IllegalArgumentException("List cannot be null");
}
diff --git a/core/java/android/os/PowerManager.java b/core/java/android/os/PowerManager.java
index dda6d27..6334f76 100644
--- a/core/java/android/os/PowerManager.java
+++ b/core/java/android/os/PowerManager.java
@@ -716,6 +716,19 @@
= "android.os.action.POWER_SAVE_MODE_CHANGED";
/**
+ * Intent that is broadcast when the state of {@link #isPowerSaveMode()} is about to change.
+ * This broadcast is only sent to registered receivers.
+ *
+ * @hide
+ */
+ @SdkConstant(SdkConstant.SdkConstantType.BROADCAST_INTENT_ACTION)
+ public static final String ACTION_POWER_SAVE_MODE_CHANGING
+ = "android.os.action.POWER_SAVE_MODE_CHANGING";
+
+ /** @hide */
+ public static final String EXTRA_POWER_SAVE_MODE = "mode";
+
+ /**
* A wake lock is a mechanism to indicate that your application needs
* to have the device stay on.
* <p>
diff --git a/core/java/android/os/Process.java b/core/java/android/os/Process.java
index afac239..c3ac012 100644
--- a/core/java/android/os/Process.java
+++ b/core/java/android/os/Process.java
@@ -61,6 +61,12 @@
public static final String SECONDARY_ZYGOTE_SOCKET = "zygote_secondary";
/**
+ * Defines the root UID.
+ * @hide
+ */
+ public static final int ROOT_UID = 0;
+
+ /**
* Defines the UID/GID under which system code runs.
*/
public static final int SYSTEM_UID = 1000;
diff --git a/core/java/android/os/UserManager.java b/core/java/android/os/UserManager.java
index d385131..13f93a7 100644
--- a/core/java/android/os/UserManager.java
+++ b/core/java/android/os/UserManager.java
@@ -625,8 +625,9 @@
Settings.Secure.putStringForUser(context.getContentResolver(),
Settings.Secure.SKIP_FIRST_USE_HINTS, "1", guest.id);
try {
- mService.setUserRestrictions(
- mService.getDefaultGuestRestrictions(), guest.id);
+ Bundle guestRestrictions = mService.getDefaultGuestRestrictions();
+ guestRestrictions.putBoolean(DISALLOW_SMS, true);
+ mService.setUserRestrictions(guestRestrictions, guest.id);
} catch (RemoteException re) {
Log.w(TAG, "Could not update guest restrictions");
}
diff --git a/core/java/android/provider/Settings.java b/core/java/android/provider/Settings.java
index 5d5be4a6..4b7e615 100644
--- a/core/java/android/provider/Settings.java
+++ b/core/java/android/provider/Settings.java
@@ -4607,6 +4607,12 @@
public static final String WAKE_GESTURE_ENABLED = "wake_gesture_enabled";
/**
+ * Whether the device should doze if configured.
+ * @hide
+ */
+ public static final String DOZE_ENABLED = "doze_enabled";
+
+ /**
* The current night mode that has been selected by the user. Owned
* and controlled by UiModeManagerService. Constants are as per
* UiModeManager.
diff --git a/core/java/android/service/notification/NotificationListenerService.java b/core/java/android/service/notification/NotificationListenerService.java
index 1f01bc8..f807ad6 100644
--- a/core/java/android/service/notification/NotificationListenerService.java
+++ b/core/java/android/service/notification/NotificationListenerService.java
@@ -609,8 +609,12 @@
}
private boolean isAmbient(String key) {
+ int firstAmbientIndex = mRankingUpdate.getFirstAmbientIndex();
+ if (firstAmbientIndex < 0) {
+ return false;
+ }
int rank = getRank(key);
- return rank >= 0 && rank >= mRankingUpdate.getFirstAmbientIndex();
+ return rank >= 0 && rank >= firstAmbientIndex;
}
private boolean isIntercepted(String key) {
diff --git a/core/java/android/service/voice/AlwaysOnHotwordDetector.java b/core/java/android/service/voice/AlwaysOnHotwordDetector.java
index 3f53ad4..279bf40 100644
--- a/core/java/android/service/voice/AlwaysOnHotwordDetector.java
+++ b/core/java/android/service/voice/AlwaysOnHotwordDetector.java
@@ -16,6 +16,9 @@
package android.service.voice;
+import android.annotation.IntDef;
+import android.annotation.NonNull;
+import android.annotation.Nullable;
import android.content.Intent;
import android.hardware.soundtrigger.IRecognitionStatusCallback;
import android.hardware.soundtrigger.KeyphraseEnrollmentInfo;
@@ -27,6 +30,7 @@
import android.hardware.soundtrigger.SoundTrigger.KeyphraseSoundModel;
import android.hardware.soundtrigger.SoundTrigger.ModuleProperties;
import android.hardware.soundtrigger.SoundTrigger.RecognitionConfig;
+import android.media.AudioFormat;
import android.os.AsyncTask;
import android.os.Handler;
import android.os.Message;
@@ -35,6 +39,9 @@
import com.android.internal.app.IVoiceInteractionManagerService;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+
/**
* A class that lets a VoiceInteractionService implementation interact with
* always-on keyphrase detection APIs.
@@ -45,18 +52,22 @@
* Indicates that this hotword detector is no longer valid for any recognition
* and should not be used anymore.
*/
- public static final int STATE_INVALID = -3;
+ private static final int STATE_INVALID = -3;
+
/**
* Indicates that recognition for the given keyphrase is not available on the system
* because of the hardware configuration.
+ * No further interaction should be performed with the detector that returns this availability.
*/
public static final int STATE_HARDWARE_UNAVAILABLE = -2;
/**
* Indicates that recognition for the given keyphrase is not supported.
+ * No further interaction should be performed with the detector that returns this availability.
*/
public static final int STATE_KEYPHRASE_UNSUPPORTED = -1;
/**
* Indicates that the given keyphrase is not enrolled.
+ * The caller may choose to begin an enrollment flow for the keyphrase.
*/
public static final int STATE_KEYPHRASE_UNENROLLED = 1;
/**
@@ -78,7 +89,17 @@
/** Indicates that we need to un-enroll. */
public static final int MANAGE_ACTION_UN_ENROLL = 2;
- //-- Flags for startRecogntion ----//
+ //-- Flags for startRecognition ----//
+ /** @hide */
+ @Retention(RetentionPolicy.SOURCE)
+ @IntDef(flag = true,
+ value = {
+ RECOGNITION_FLAG_NONE,
+ RECOGNITION_FLAG_CAPTURE_TRIGGER_AUDIO,
+ RECOGNITION_FLAG_ALLOW_MULTIPLE_TRIGGERS
+ })
+ public @interface RecognitionFlags {}
+
/** Empty flag for {@link #startRecognition(int)}. */
public static final int RECOGNITION_FLAG_NONE = 0;
/**
@@ -86,17 +107,37 @@
* whether the trigger audio for hotword needs to be captured.
*/
public static final int RECOGNITION_FLAG_CAPTURE_TRIGGER_AUDIO = 0x1;
+ /**
+ * Recognition flag for {@link #startRecognition(int)} that indicates
+ * whether the recognition should keep going on even after the keyphrase triggers.
+ * If this flag is specified, it's possible to get multiple triggers after a
+ * call to {@link #startRecognition(int)} if the user speaks the keyphrase multiple times.
+ * When this isn't specified, the default behavior is to stop recognition once the
+ * keyphrase is spoken, till the caller starts recognition again.
+ */
+ public static final int RECOGNITION_FLAG_ALLOW_MULTIPLE_TRIGGERS = 0x2;
//---- Recognition mode flags. Return codes for getSupportedRecognitionModes() ----//
// Must be kept in sync with the related attribute defined as searchKeyphraseRecognitionFlags.
+ /** @hide */
+ @Retention(RetentionPolicy.SOURCE)
+ @IntDef(flag = true,
+ value = {
+ RECOGNITION_MODE_VOICE_TRIGGER,
+ RECOGNITION_MODE_USER_IDENTIFICATION,
+ })
+ public @interface RecognitionModes {}
+
/**
- * Simple recognition of the key phrase. Returned by {@link #getSupportedRecognitionModes()}
+ * Simple recognition of the key phrase.
+ * Returned by {@link #getSupportedRecognitionModes()}
*/
public static final int RECOGNITION_MODE_VOICE_TRIGGER
= SoundTrigger.RECOGNITION_MODE_VOICE_TRIGGER;
/**
- * Trigger only if one user is identified. Returned by {@link #getSupportedRecognitionModes()}
+ * User identification performed with the keyphrase recognition.
+ * Returned by {@link #getSupportedRecognitionModes()}
*/
public static final int RECOGNITION_MODE_USER_IDENTIFICATION
= SoundTrigger.RECOGNITION_MODE_USER_IDENTIFICATION;
@@ -108,16 +149,9 @@
private static final int STATUS_ERROR = SoundTrigger.STATUS_ERROR;
private static final int STATUS_OK = SoundTrigger.STATUS_OK;
- private static final int MSG_STATE_CHANGED = 1;
+ private static final int MSG_AVAILABILITY_CHANGED = 1;
private static final int MSG_HOTWORD_DETECTED = 2;
- private static final int MSG_DETECTION_STARTED = 3;
- private static final int MSG_DETECTION_STOPPED = 4;
- private static final int MSG_DETECTION_ERROR = 5;
-
- private static final int FLAG_REQUESTED = 0x1;
- private static final int FLAG_STARTED = 0x2;
- private static final int FLAG_CALL_ACTIVE = 0x4;
- private static final int FLAG_MICROPHONE_OPEN = 0x8;
+ private static final int MSG_DETECTION_ERROR = 3;
private final String mText;
private final String mLocale;
@@ -135,8 +169,27 @@
private final Handler mHandler;
private int mAvailability = STATE_NOT_READY;
- private int mInternalState = 0;
- private int mRecognitionFlags = RECOGNITION_FLAG_NONE;
+
+ /**
+ * Details of the audio that triggered the keyphrase.
+ */
+ public static class TriggerAudio {
+ /**
+ * Format of {@code data}.
+ */
+ @NonNull
+ public final AudioFormat audioFormat;
+ /**
+ * Raw audio data that triggered they keyphrase.
+ */
+ @NonNull
+ public final byte[] data;
+
+ private TriggerAudio(AudioFormat _audioFormat, byte[] _data) {
+ audioFormat = _audioFormat;
+ data = _data;
+ }
+ }
/**
* Callbacks for always-on hotword detection.
@@ -149,16 +202,11 @@
*
* Availability implies whether the hardware on this system is capable of listening for
* the given keyphrase or not. <p/>
- * If the return code is one of {@link #STATE_HARDWARE_UNAVAILABLE} or
- * {@link #STATE_KEYPHRASE_UNSUPPORTED},
- * detection is not possible and no further interaction should be
- * performed with this detector. <br/>
- * If it is {@link #STATE_KEYPHRASE_UNENROLLED} the caller may choose to begin
- * an enrollment flow for the keyphrase. <br/>
- * and for {@link #STATE_KEYPHRASE_ENROLLED} a recognition can be started as desired. <p/>
*
- * If the return code is {@link #STATE_INVALID}, this detector is stale.
- * A new detector should be obtained for use in the future.
+ * @see AlwaysOnHotwordDetector#STATE_HARDWARE_UNAVAILABLE
+ * @see AlwaysOnHotwordDetector#STATE_KEYPHRASE_UNSUPPORTED
+ * @see AlwaysOnHotwordDetector#STATE_KEYPHRASE_UNENROLLED
+ * @see AlwaysOnHotwordDetector#STATE_KEYPHRASE_ENROLLED
*/
void onAvailabilityChanged(int status);
/**
@@ -167,22 +215,10 @@
* Clients should start a recognition again once they are done handling this
* detection.
*
- * @param data Optional trigger audio data, if it was requested during
+ * @param triggerAudio Optional trigger audio data, if it was requested during
* {@link AlwaysOnHotwordDetector#startRecognition(int)}.
*/
- void onDetected(byte[] data);
- /**
- * Called when the detection for the associated keyphrase starts.
- * This is called as a result of a successful call to
- * {@link AlwaysOnHotwordDetector#startRecognition(int)}.
- */
- void onDetectionStarted();
- /**
- * Called when the detection for the associated keyphrase stops.
- * This is called as a result of a successful call to
- * {@link AlwaysOnHotwordDetector#stopRecognition()}.
- */
- void onDetectionStopped();
+ void onDetected(@Nullable TriggerAudio triggerAudio);
/**
* Called when the detection fails due to an error.
*/
@@ -217,17 +253,29 @@
/**
* Gets the recognition modes supported by the associated keyphrase.
*
+ * @see #RECOGNITION_MODE_USER_IDENTIFICATION
+ * @see #RECOGNITION_MODE_VOICE_TRIGGER
+ *
* @throws UnsupportedOperationException if the keyphrase itself isn't supported.
* Callers should only call this method after a supported state callback on
* {@link Callback#onAvailabilityChanged(int)} to avoid this exception.
+ * @throws IllegalStateException if the detector is in an invalid state.
+ * This may happen if another detector has been instantiated or the
+ * {@link VoiceInteractionService} hosting this detector has been shut down.
*/
- public int getSupportedRecognitionModes() {
+ public @RecognitionModes int getSupportedRecognitionModes() {
+ if (DBG) Slog.d(TAG, "getSupportedRecognitionModes()");
synchronized (mLock) {
return getSupportedRecognitionModesLocked();
}
}
private int getSupportedRecognitionModesLocked() {
+ if (mAvailability == STATE_INVALID) {
+ throw new IllegalStateException(
+ "getSupportedRecognitionModes called on an invalid detector");
+ }
+
// This method only makes sense if we can actually support a recognition.
if (mAvailability != STATE_KEYPHRASE_ENROLLED
&& mAvailability != STATE_KEYPHRASE_UNENROLLED) {
@@ -242,44 +290,59 @@
* Starts recognition for the associated keyphrase.
*
* @param recognitionFlags The flags to control the recognition properties.
- * The allowed flags are {@link #RECOGNITION_FLAG_NONE} and
- * {@link #RECOGNITION_FLAG_CAPTURE_TRIGGER_AUDIO}.
+ * The allowed flags are {@link #RECOGNITION_FLAG_NONE},
+ * {@link #RECOGNITION_FLAG_CAPTURE_TRIGGER_AUDIO} and
+ * {@link #RECOGNITION_FLAG_ALLOW_MULTIPLE_TRIGGERS}.
+ * @return Indicates whether the call succeeded or not.
* @throws UnsupportedOperationException if the recognition isn't supported.
* Callers should only call this method after a supported state callback on
* {@link Callback#onAvailabilityChanged(int)} to avoid this exception.
+ * @throws IllegalStateException if the detector is in an invalid state.
+ * This may happen if another detector has been instantiated or the
+ * {@link VoiceInteractionService} hosting this detector has been shut down.
*/
- public void startRecognition(int recognitionFlags) {
+ public boolean startRecognition(@RecognitionFlags int recognitionFlags) {
+ if (DBG) Slog.d(TAG, "startRecognition(" + recognitionFlags + ")");
synchronized (mLock) {
+ if (mAvailability == STATE_INVALID) {
+ throw new IllegalStateException("startRecognition called on an invalid detector");
+ }
+
// Check if we can start/stop a recognition.
if (mAvailability != STATE_KEYPHRASE_ENROLLED) {
throw new UnsupportedOperationException(
"Recognition for the given keyphrase is not supported");
}
- mInternalState |= FLAG_REQUESTED;
- mRecognitionFlags = recognitionFlags;
- updateRecognitionLocked();
+ return startRecognitionLocked(recognitionFlags) == STATUS_OK;
}
}
/**
* Stops recognition for the associated keyphrase.
*
+ * @return Indicates whether the call succeeded or not.
* @throws UnsupportedOperationException if the recognition isn't supported.
* Callers should only call this method after a supported state callback on
* {@link Callback#onAvailabilityChanged(int)} to avoid this exception.
+ * @throws IllegalStateException if the detector is in an invalid state.
+ * This may happen if another detector has been instantiated or the
+ * {@link VoiceInteractionService} hosting this detector has been shut down.
*/
- public void stopRecognition() {
+ public boolean stopRecognition() {
+ if (DBG) Slog.d(TAG, "stopRecognition()");
synchronized (mLock) {
+ if (mAvailability == STATE_INVALID) {
+ throw new IllegalStateException("stopRecognition called on an invalid detector");
+ }
+
// Check if we can start/stop a recognition.
if (mAvailability != STATE_KEYPHRASE_ENROLLED) {
throw new UnsupportedOperationException(
"Recognition for the given keyphrase is not supported");
}
- mInternalState &= ~FLAG_REQUESTED;
- mRecognitionFlags = RECOGNITION_FLAG_NONE;
- updateRecognitionLocked();
+ return stopRecognitionLocked() == STATUS_OK;
}
}
@@ -293,14 +356,29 @@
* @throws UnsupportedOperationException if managing they keyphrase isn't supported.
* Callers should only call this method after a supported state callback on
* {@link Callback#onAvailabilityChanged(int)} to avoid this exception.
+ * @throws IllegalStateException if the detector is in an invalid state.
+ * This may happen if another detector has been instantiated or the
+ * {@link VoiceInteractionService} hosting this detector has been shut down.
*/
public Intent getManageIntent(int action) {
+ if (DBG) Slog.d(TAG, "getManageIntent(" + action + ")");
+ synchronized (mLock) {
+ return getManageIntentLocked(action);
+ }
+ }
+
+ private Intent getManageIntentLocked(int action) {
+ if (mAvailability == STATE_INVALID) {
+ throw new IllegalStateException("getManageIntent called on an invalid detector");
+ }
+
// This method only makes sense if we can actually support a recognition.
if (mAvailability != STATE_KEYPHRASE_ENROLLED
&& mAvailability != STATE_KEYPHRASE_UNENROLLED) {
throw new UnsupportedOperationException(
"Managing the given keyphrase is not supported");
}
+
if (action != MANAGE_ACTION_ENROLL
&& action != MANAGE_ACTION_RE_ENROLL
&& action != MANAGE_ACTION_UN_ENROLL) {
@@ -330,7 +408,7 @@
*/
void onSoundModelsChanged() {
synchronized (mLock) {
- // TODO: This should stop the recognition if it was using an enrolled sound model
+ // FIXME: This should stop the recognition if it was using an enrolled sound model
// that's no longer available.
if (mAvailability == STATE_INVALID
|| mAvailability == STATE_HARDWARE_UNAVAILABLE
@@ -344,89 +422,21 @@
}
}
- @SuppressWarnings("unused")
- private void onCallStateChanged(boolean active) {
- synchronized (mLock) {
- if (active) {
- mInternalState |= FLAG_CALL_ACTIVE;
- } else {
- mInternalState &= ~FLAG_CALL_ACTIVE;
- }
-
- updateRecognitionLocked();
- }
- }
-
- @SuppressWarnings("unused")
- private void onMicrophoneStateChanged(boolean open) {
- synchronized (mLock) {
- if (open) {
- mInternalState |= FLAG_MICROPHONE_OPEN;
- } else {
- mInternalState &= ~FLAG_MICROPHONE_OPEN;
- }
-
- updateRecognitionLocked();
- }
- }
-
- private void updateRecognitionLocked() {
- // Don't attempt to update the recognition state if keyphrase isn't enrolled.
- if (mAvailability != STATE_KEYPHRASE_ENROLLED) {
- return;
- }
-
- // Start recognition if requested and not in a call/reading from the microphone
- boolean start = (mInternalState&FLAG_REQUESTED) != 0
- && (mInternalState&FLAG_CALL_ACTIVE) == 0
- && (mInternalState&FLAG_MICROPHONE_OPEN) == 0;
- boolean requested = (mInternalState&FLAG_REQUESTED) != 0;
-
- if (start && (mInternalState&FLAG_STARTED) == 0) {
- // Start recognition.
- if (DBG) Slog.d(TAG, "starting recognition...");
- int status = startRecognitionLocked();
- if (status == STATUS_OK) {
- mInternalState |= FLAG_STARTED;
- mHandler.sendEmptyMessage(MSG_DETECTION_STARTED);
- } else {
- if (DBG) Slog.d(TAG, "failed to start recognition: " + status);
- mHandler.sendEmptyMessage(MSG_DETECTION_ERROR);
- }
- // Post the callback
- return;
- }
-
- if (!start && (mInternalState&FLAG_STARTED) != 0) {
- // Stop recognition
- // Only notify the callback if a recognition was *not* requested.
- // For internal stoppages, don't notify the callback.
- if (DBG) Slog.d(TAG, "stopping recognition...");
- int status = stopRecognitionLocked();
- if (status == STATUS_OK) {
- mInternalState &= ~FLAG_STARTED;
- if (!requested) mHandler.sendEmptyMessage(MSG_DETECTION_STOPPED);
- } else {
- if (!requested) mHandler.sendEmptyMessage(MSG_DETECTION_ERROR);
- if (DBG) Slog.d(TAG, "failed to stop recognition: " + status);
- }
- return;
- }
- }
-
- private int startRecognitionLocked() {
+ private int startRecognitionLocked(int recognitionFlags) {
KeyphraseRecognitionExtra[] recognitionExtra = new KeyphraseRecognitionExtra[1];
// TODO: Do we need to do something about the confidence level here?
recognitionExtra[0] = new KeyphraseRecognitionExtra(mKeyphraseMetadata.id,
mKeyphraseMetadata.recognitionModeFlags, new ConfidenceLevel[0]);
boolean captureTriggerAudio =
- (mRecognitionFlags&RECOGNITION_FLAG_CAPTURE_TRIGGER_AUDIO) != 0;
+ (recognitionFlags&RECOGNITION_FLAG_CAPTURE_TRIGGER_AUDIO) != 0;
+ boolean allowMultipleTriggers =
+ (recognitionFlags&RECOGNITION_FLAG_ALLOW_MULTIPLE_TRIGGERS) != 0;
int code = STATUS_ERROR;
try {
code = mModelManagementService.startRecognition(mVoiceInteractionService,
mKeyphraseMetadata.id, mInternalCallback,
- new RecognitionConfig(
- captureTriggerAudio, recognitionExtra, null /* additional data */));
+ new RecognitionConfig(captureTriggerAudio, allowMultipleTriggers,
+ recognitionExtra, null /* additional data */));
} catch (RemoteException e) {
Slog.w(TAG, "RemoteException in startRecognition!");
}
@@ -452,7 +462,7 @@
}
private void notifyStateChangedLocked() {
- Message message = Message.obtain(mHandler, MSG_STATE_CHANGED);
+ Message message = Message.obtain(mHandler, MSG_AVAILABILITY_CHANGED);
message.arg1 = mAvailability;
message.sendToTarget();
}
@@ -467,9 +477,22 @@
@Override
public void onDetected(KeyphraseRecognitionEvent event) {
- Slog.i(TAG, "onDetected");
+ if (DBG) {
+ Slog.d(TAG, "OnDetected(" + event + ")");
+ } else {
+ Slog.i(TAG, "onDetected");
+ }
Message message = Message.obtain(mHandler, MSG_HOTWORD_DETECTED);
- message.obj = event.data;
+ // FIXME: Check whether the event contains trigger data or not.
+ // FIXME: Read the audio format from the event.
+ if (event.data != null) {
+ AudioFormat audioFormat = new AudioFormat.Builder()
+ .setChannelMask(AudioFormat.CHANNEL_IN_MONO)
+ .setEncoding(AudioFormat.ENCODING_PCM_16BIT)
+ .setSampleRate(16000)
+ .build();
+ message.obj = new TriggerAudio(audioFormat, event.data);
+ }
message.sendToTarget();
}
@@ -483,18 +506,19 @@
class MyHandler extends Handler {
@Override
public void handleMessage(Message msg) {
+ synchronized (mLock) {
+ if (mAvailability == STATE_INVALID) {
+ Slog.w(TAG, "Received message: " + msg.what + " for an invalid detector");
+ return;
+ }
+ }
+
switch (msg.what) {
- case MSG_STATE_CHANGED:
+ case MSG_AVAILABILITY_CHANGED:
mExternalCallback.onAvailabilityChanged(msg.arg1);
break;
case MSG_HOTWORD_DETECTED:
- mExternalCallback.onDetected((byte[]) msg.obj);
- break;
- case MSG_DETECTION_STARTED:
- mExternalCallback.onDetectionStarted();
- break;
- case MSG_DETECTION_STOPPED:
- mExternalCallback.onDetectionStopped();
+ mExternalCallback.onDetected((TriggerAudio) msg.obj);
break;
case MSG_DETECTION_ERROR:
mExternalCallback.onError();
diff --git a/core/java/android/service/voice/VoiceInteractionService.java b/core/java/android/service/voice/VoiceInteractionService.java
index 82e23c4..5189404 100644
--- a/core/java/android/service/voice/VoiceInteractionService.java
+++ b/core/java/android/service/voice/VoiceInteractionService.java
@@ -182,6 +182,7 @@
/**
* Called during service de-initialization to tell you when the system is shutting the
* service down.
+ * At this point this service may no longer be the active {@link VoiceInteractionService}.
*/
public void onShutdown() {
}
diff --git a/core/java/android/text/TextUtils.java b/core/java/android/text/TextUtils.java
index 1d1aafb..3502b52 100644
--- a/core/java/android/text/TextUtils.java
+++ b/core/java/android/text/TextUtils.java
@@ -1750,7 +1750,7 @@
*/
public static int getLayoutDirectionFromLocale(Locale locale) {
if (locale != null && !locale.equals(Locale.ROOT)) {
- final String scriptSubtag = ICU.getScript(ICU.addLikelySubtags(locale.toString()));
+ final String scriptSubtag = ICU.addLikelySubtags(locale).getScript();
if (scriptSubtag == null) return getLayoutDirectionFromFirstChar(locale);
if (scriptSubtag.equalsIgnoreCase(ARAB_SCRIPT_SUBTAG) ||
diff --git a/core/java/android/text/style/TtsSpan.java b/core/java/android/text/style/TtsSpan.java
index f3a48a6..cb447fd 100644
--- a/core/java/android/text/style/TtsSpan.java
+++ b/core/java/android/text/style/TtsSpan.java
@@ -518,7 +518,7 @@
* This class uses generics so methods from this class can return instances
* of its child classes, resulting in a fluent API (CRTP pattern).
*/
- public static abstract class Builder<C extends Builder<C>> {
+ public static class Builder<C extends Builder<?>> {
// Holds the type of this class.
private final String mType;
@@ -580,7 +580,7 @@
* this builder like {@link TtsSpan.TextBuilder} and
* {@link TtsSpan.CardinalBuilder} are likely more useful.
*/
- public static class SemioticClassBuilder<C extends SemioticClassBuilder<C>>
+ public static class SemioticClassBuilder<C extends SemioticClassBuilder<?>>
extends Builder<C> {
public SemioticClassBuilder(String type) {
diff --git a/core/java/android/transition/Visibility.java b/core/java/android/transition/Visibility.java
index af2016c..79dbb49 100644
--- a/core/java/android/transition/Visibility.java
+++ b/core/java/android/transition/Visibility.java
@@ -43,7 +43,7 @@
*/
public abstract class Visibility extends Transition {
- private static final String PROPNAME_VISIBILITY = "android:visibility:visibility";
+ static final String PROPNAME_VISIBILITY = "android:visibility:visibility";
private static final String PROPNAME_PARENT = "android:visibility:parent";
private static final String PROPNAME_SCREEN_LOCATION = "android:visibility:screenLocation";
diff --git a/core/java/android/transition/VisibilityPropagation.java b/core/java/android/transition/VisibilityPropagation.java
index 0326d47..183e036 100644
--- a/core/java/android/transition/VisibilityPropagation.java
+++ b/core/java/android/transition/VisibilityPropagation.java
@@ -42,7 +42,11 @@
@Override
public void captureValues(TransitionValues values) {
View view = values.view;
- values.values.put(PROPNAME_VISIBILITY, view.getVisibility());
+ Integer visibility = (Integer) values.values.get(Visibility.PROPNAME_VISIBILITY);
+ if (visibility == null) {
+ visibility = view.getVisibility();
+ }
+ values.values.put(PROPNAME_VISIBILITY, visibility);
int[] loc = new int[2];
view.getLocationOnScreen(loc);
loc[0] += Math.round(view.getTranslationX());
diff --git a/core/java/android/view/IWindowManager.aidl b/core/java/android/view/IWindowManager.aidl
index 5157c41..83767cb 100644
--- a/core/java/android/view/IWindowManager.aidl
+++ b/core/java/android/view/IWindowManager.aidl
@@ -150,10 +150,9 @@
void setStrictModeVisualIndicatorPreference(String enabled);
/**
- * Update the windowmanagers cached value of
- * {@link android.app.admin.DevicePolicyManager#getScreenCaptureDisabled(null, userId)}
+ * Set whether screen capture is disabled for all windows of a specific user
*/
- void updateScreenCaptureDisabled(int userId);
+ void setScreenCaptureDisabled(int userId, boolean disabled);
// These can only be called with the SET_ORIENTATION permission.
/**
diff --git a/core/java/android/view/RenderNode.java b/core/java/android/view/RenderNode.java
index e9ec565..eee4973 100644
--- a/core/java/android/view/RenderNode.java
+++ b/core/java/android/view/RenderNode.java
@@ -355,9 +355,10 @@
return nSetOutlineEmpty(mNativeRenderNode);
} else if (outline.mRect != null) {
return nSetOutlineRoundRect(mNativeRenderNode, outline.mRect.left, outline.mRect.top,
- outline.mRect.right, outline.mRect.bottom, outline.mRadius);
+ outline.mRect.right, outline.mRect.bottom, outline.mRadius, outline.mAlpha);
} else if (outline.mPath != null) {
- return nSetOutlineConvexPath(mNativeRenderNode, outline.mPath.mNativePath);
+ return nSetOutlineConvexPath(mNativeRenderNode, outline.mPath.mNativePath,
+ outline.mAlpha);
}
throw new IllegalArgumentException("Unrecognized outline?");
}
@@ -849,8 +850,9 @@
private static native boolean nSetProjectBackwards(long renderNode, boolean shouldProject);
private static native boolean nSetProjectionReceiver(long renderNode, boolean shouldRecieve);
private static native boolean nSetOutlineRoundRect(long renderNode, int left, int top,
- int right, int bottom, float radius);
- private static native boolean nSetOutlineConvexPath(long renderNode, long nativePath);
+ int right, int bottom, float radius, float alpha);
+ private static native boolean nSetOutlineConvexPath(long renderNode, long nativePath,
+ float alpha);
private static native boolean nSetOutlineEmpty(long renderNode);
private static native boolean nSetOutlineNone(long renderNode);
private static native boolean nSetClipToOutline(long renderNode, boolean clipToOutline);
diff --git a/core/java/android/view/ViewGroup.java b/core/java/android/view/ViewGroup.java
index c09440b..6b46174 100644
--- a/core/java/android/view/ViewGroup.java
+++ b/core/java/android/view/ViewGroup.java
@@ -3265,21 +3265,29 @@
final View child = children[i];
if (((child.mViewFlags & VISIBILITY_MASK) == VISIBLE || child.getAnimation() != null) &&
child.hasStaticLayer()) {
- child.mRecreateDisplayList = (child.mPrivateFlags & PFLAG_INVALIDATED)
- == PFLAG_INVALIDATED;
- child.mPrivateFlags &= ~PFLAG_INVALIDATED;
- child.getDisplayList();
- child.mRecreateDisplayList = false;
+ recreateChildDisplayList(child);
}
}
if (mOverlay != null) {
View overlayView = mOverlay.getOverlayView();
- overlayView.mRecreateDisplayList = (overlayView.mPrivateFlags & PFLAG_INVALIDATED)
- == PFLAG_INVALIDATED;
- overlayView.mPrivateFlags &= ~PFLAG_INVALIDATED;
- overlayView.getDisplayList();
- overlayView.mRecreateDisplayList = false;
+ recreateChildDisplayList(overlayView);
}
+ if (mDisappearingChildren != null) {
+ final ArrayList<View> disappearingChildren = mDisappearingChildren;
+ final int disappearingCount = disappearingChildren.size();
+ for (int i = 0; i < disappearingCount; ++i) {
+ final View child = disappearingChildren.get(i);
+ recreateChildDisplayList(child);
+ }
+ }
+ }
+
+ private void recreateChildDisplayList(View child) {
+ child.mRecreateDisplayList = (child.mPrivateFlags & PFLAG_INVALIDATED)
+ == PFLAG_INVALIDATED;
+ child.mPrivateFlags &= ~PFLAG_INVALIDATED;
+ child.getDisplayList();
+ child.mRecreateDisplayList = false;
}
/**
diff --git a/core/java/android/view/ViewOutlineProvider.java b/core/java/android/view/ViewOutlineProvider.java
index 64624ae..4054031 100644
--- a/core/java/android/view/ViewOutlineProvider.java
+++ b/core/java/android/view/ViewOutlineProvider.java
@@ -25,7 +25,8 @@
public abstract class ViewOutlineProvider {
/**
* Default outline provider for Views, which queries the Outline from the View's background,
- * or returns <code>false</code> if the View does not have a background.
+ * or generates a 0 alpha, rectangular Outline the size of the View if a background
+ * isn't present.
*
* @see Drawable#getOutline(Outline)
*/
@@ -35,6 +36,10 @@
Drawable background = view.getBackground();
if (background != null) {
background.getOutline(outline);
+ } else {
+
+ outline.setRect(0, 0, view.getWidth(), view.getHeight());
+ outline.setAlpha(0.0f);
}
}
};
diff --git a/core/java/android/view/Window.java b/core/java/android/view/Window.java
index c169d35..e7b3152 100644
--- a/core/java/android/view/Window.java
+++ b/core/java/android/view/Window.java
@@ -1425,6 +1425,21 @@
public void setEnterTransition(Transition transition) {}
/**
+ * Sets the Transition that will be used to move Views out of the scene when the Window is
+ * preparing to close, for example after a call to
+ * {@link android.app.Activity#finishAfterTransition()}. The exiting
+ * Views will be those that are regular Views or ViewGroups that have
+ * {@link ViewGroup#isTransitionGroup} return true. Typical Transitions will extend
+ * {@link android.transition.Visibility} as entering is governed by changing visibility from
+ * {@link View#VISIBLE} to {@link View#INVISIBLE}. If <code>transition</code> is null,
+ * entering Views will remain unaffected. If nothing is set, the default will be to
+ * use the same value as set in {@link #setEnterTransition(android.transition.Transition)}.
+ * @param transition The Transition to use to move Views out of the Scene when the Window
+ * is preparing to close.
+ */
+ public void setReturnTransition(Transition transition) {}
+
+ /**
* Sets the Transition that will be used to move Views out of the scene when starting a
* new Activity. The exiting Views will be those that are regular Views or ViewGroups that
* have {@link ViewGroup#isTransitionGroup} return true. Typical Transitions will extend
@@ -1437,6 +1452,20 @@
public void setExitTransition(Transition transition) {}
/**
+ * Sets the Transition that will be used to move Views in to the scene when returning from
+ * a previously-started Activity. The entering Views will be those that are regular Views
+ * or ViewGroups that have {@link ViewGroup#isTransitionGroup} return true. Typical Transitions
+ * will extend {@link android.transition.Visibility} as exiting is governed by changing
+ * visibility from {@link View#VISIBLE} to {@link View#INVISIBLE}. If transition is null,
+ * the views will remain unaffected. If nothing is set, the default will be to use the same
+ * transition as {@link #setExitTransition(android.transition.Transition)}.
+ * Requires {@link #FEATURE_CONTENT_TRANSITIONS}.
+ * @param transition The Transition to use to move Views into the scene when reentering from a
+ * previously-started Activity.
+ */
+ public void setReenterTransition(Transition transition) {}
+
+ /**
* Returns the transition used to move Views into the initial scene. The entering
* Views will be those that are regular Views or ViewGroups that have
* {@link ViewGroup#isTransitionGroup} return true. Typical Transitions will extend
@@ -1449,6 +1478,19 @@
public Transition getEnterTransition() { return null; }
/**
+ * Returns he Transition that will be used to move Views out of the scene when the Window is
+ * preparing to close, for example after a call to
+ * {@link android.app.Activity#finishAfterTransition()}. The exiting
+ * Views will be those that are regular Views or ViewGroups that have
+ * {@link ViewGroup#isTransitionGroup} return true. Typical Transitions will extend
+ * {@link android.transition.Visibility} as entering is governed by changing visibility from
+ * {@link View#VISIBLE} to {@link View#INVISIBLE}.
+ * @return The Transition to use to move Views out of the Scene when the Window
+ * is preparing to close.
+ */
+ public Transition getReturnTransition() { return null; }
+
+ /**
* Returns the Transition that will be used to move Views out of the scene when starting a
* new Activity. The exiting Views will be those that are regular Views or ViewGroups that
* have {@link ViewGroup#isTransitionGroup} return true. Typical Transitions will extend
@@ -1461,6 +1503,18 @@
public Transition getExitTransition() { return null; }
/**
+ * Returns the Transition that will be used to move Views in to the scene when returning from
+ * a previously-started Activity. The entering Views will be those that are regular Views
+ * or ViewGroups that have {@link ViewGroup#isTransitionGroup} return true. Typical Transitions
+ * will extend {@link android.transition.Visibility} as exiting is governed by changing
+ * visibility from {@link View#VISIBLE} to {@link View#INVISIBLE}.
+ * Requires {@link #FEATURE_CONTENT_TRANSITIONS}.
+ * @return The Transition to use to move Views into the scene when reentering from a
+ * previously-started Activity.
+ */
+ public Transition getReenterTransition() { return null; }
+
+ /**
* Sets the Transition that will be used for shared elements transferred into the content
* Scene. Typical Transitions will affect size and location, such as
* {@link android.transition.ChangeBounds}. A null
@@ -1472,6 +1526,19 @@
public void setSharedElementEnterTransition(Transition transition) {}
/**
+ * Sets the Transition that will be used for shared elements transferred back to a
+ * calling Activity. Typical Transitions will affect size and location, such as
+ * {@link android.transition.ChangeBounds}. A null
+ * value will cause transferred shared elements to blink to the final position.
+ * If no value is set, the default will be to use the same value as
+ * {@link #setSharedElementEnterTransition(android.transition.Transition)}.
+ * Requires {@link #FEATURE_CONTENT_TRANSITIONS}.
+ * @param transition The Transition to use for shared elements transferred out of the content
+ * Scene.
+ */
+ public void setSharedElementReturnTransition(Transition transition) {}
+
+ /**
* Returns the Transition that will be used for shared elements transferred into the content
* Scene. Requires {@link #FEATURE_CONTENT_TRANSITIONS}.
* @return Transition to use for sharend elements transferred into the content Scene.
@@ -1479,6 +1546,13 @@
public Transition getSharedElementEnterTransition() { return null; }
/**
+ * Returns the Transition that will be used for shared elements transferred back to a
+ * calling Activity. Requires {@link #FEATURE_CONTENT_TRANSITIONS}.
+ * @return Transition to use for sharend elements transferred into the content Scene.
+ */
+ public Transition getSharedElementReturnTransition() { return null; }
+
+ /**
* Sets the Transition that will be used for shared elements after starting a new Activity
* before the shared elements are transferred to the called Activity. If the shared elements
* must animate during the exit transition, this Transition should be used. Upon completion,
@@ -1490,6 +1564,17 @@
public void setSharedElementExitTransition(Transition transition) {}
/**
+ * Sets the Transition that will be used for shared elements reentering from a started
+ * Activity after it has returned the shared element to it start location. If no value
+ * is set, this will default to
+ * {@link #setSharedElementExitTransition(android.transition.Transition)}.
+ * Requires {@link #FEATURE_CONTENT_TRANSITIONS}.
+ * @param transition The Transition to use for shared elements in the launching Window
+ * after the shared element has returned to the Window.
+ */
+ public void setSharedElementReenterTransition(Transition transition) {}
+
+ /**
* Returns the Transition to use for shared elements in the launching Window prior
* to transferring to the launched Activity's Window.
* Requires {@link #FEATURE_CONTENT_TRANSITIONS}.
@@ -1500,6 +1585,16 @@
public Transition getSharedElementExitTransition() { return null; }
/**
+ * Returns the Transition that will be used for shared elements reentering from a started
+ * Activity after it has returned the shared element to it start location.
+ * Requires {@link #FEATURE_CONTENT_TRANSITIONS}.
+ *
+ * @return the Transition that will be used for shared elements reentering from a started
+ * Activity after it has returned the shared element to it start location.
+ */
+ public Transition getSharedElementReenterTransition() { return null; }
+
+ /**
* Controls how the transition set in
* {@link #setEnterTransition(android.transition.Transition)} overlaps with the exit
* transition of the calling Activity. When true, the transition will start as soon as possible.
diff --git a/core/java/android/webkit/WebViewFactory.java b/core/java/android/webkit/WebViewFactory.java
index 2c7b3eb..fa16fae 100644
--- a/core/java/android/webkit/WebViewFactory.java
+++ b/core/java/android/webkit/WebViewFactory.java
@@ -16,16 +16,26 @@
package android.webkit;
+import android.app.ActivityManagerInternal;
+import android.app.Application;
+import android.app.AppGlobals;
+import android.content.Context;
+import android.content.pm.ApplicationInfo;
+import android.content.pm.PackageManager;
import android.os.Build;
import android.os.Process;
import android.os.RemoteException;
import android.os.ServiceManager;
import android.os.StrictMode;
+import android.os.SystemProperties;
+import android.text.TextUtils;
import android.util.AndroidRuntimeException;
import android.util.Log;
+import com.android.server.LocalServices;
import dalvik.system.VMRuntime;
import java.io.File;
+import java.util.Arrays;
import com.android.internal.os.Zygote;
@@ -42,17 +52,15 @@
private static final String NULL_WEBVIEW_FACTORY =
"com.android.webview.nullwebview.NullWebViewFactoryProvider";
- // TODO(torne): we need to use a system property instead of hardcoding the library paths to
- // enable it to be changed when a webview update apk is installed.
- private static final String CHROMIUM_WEBVIEW_NATIVE_LIB_32 =
- "/system/lib/libwebviewchromium.so";
- private static final String CHROMIUM_WEBVIEW_NATIVE_LIB_64 =
- "/system/lib64/libwebviewchromium.so";
private static final String CHROMIUM_WEBVIEW_NATIVE_RELRO_32 =
"/data/misc/shared_relro/libwebviewchromium32.relro";
private static final String CHROMIUM_WEBVIEW_NATIVE_RELRO_64 =
"/data/misc/shared_relro/libwebviewchromium64.relro";
+ public static final String CHROMIUM_WEBVIEW_VMSIZE_SIZE_PROPERTY =
+ "persist.sys.webview.vmsize";
+ private static final long CHROMIUM_WEBVIEW_DEFAULT_VMSIZE_BYTES = 100 * 1024 * 1024;
+
private static final String LOGTAG = "WebViewFactory";
private static final boolean DEBUG = false;
@@ -64,8 +72,8 @@
private static boolean sAddressSpaceReserved = false;
public static String getWebViewPackageName() {
- // TODO: Make this dynamic based on resource configuration.
- return "com.android.webview";
+ return AppGlobals.getInitialApplication().getString(
+ com.android.internal.R.string.config_webViewPackageName);
}
static WebViewFactoryProvider getProvider() {
@@ -99,11 +107,28 @@
}
private static Class<WebViewFactoryProvider> getFactoryClass() throws ClassNotFoundException {
+ Application initialApplication = AppGlobals.getInitialApplication();
try {
- return (Class<WebViewFactoryProvider>) Class.forName(CHROMIUM_WEBVIEW_FACTORY);
- } catch (ClassNotFoundException e) {
- Log.e(LOGTAG, "Chromium WebView does not exist");
- return (Class<WebViewFactoryProvider>) Class.forName(NULL_WEBVIEW_FACTORY);
+ Context webViewContext = initialApplication.createPackageContext(
+ getWebViewPackageName(),
+ Context.CONTEXT_INCLUDE_CODE | Context.CONTEXT_IGNORE_SECURITY);
+ initialApplication.getAssets().addAssetPath(
+ webViewContext.getApplicationInfo().sourceDir);
+ ClassLoader clazzLoader = webViewContext.getClassLoader();
+ return (Class<WebViewFactoryProvider>) Class.forName(CHROMIUM_WEBVIEW_FACTORY, true,
+ clazzLoader);
+ } catch (PackageManager.NameNotFoundException e) {
+ // If the package doesn't exist, then try loading the null WebView instead.
+ // If that succeeds, then this is a device without WebView support; if it fails then
+ // swallow the failure, complain that the real WebView is missing and rethrow the
+ // original exception.
+ try {
+ return (Class<WebViewFactoryProvider>) Class.forName(NULL_WEBVIEW_FACTORY);
+ } catch (ClassNotFoundException e2) {
+ // Ignore.
+ }
+ Log.e(LOGTAG, "Chromium WebView package does not exist", e);
+ throw new AndroidRuntimeException(e);
}
}
@@ -114,79 +139,197 @@
public static void prepareWebViewInZygote() {
try {
System.loadLibrary("webviewchromium_loader");
- sAddressSpaceReserved = nativeReserveAddressSpace(CHROMIUM_WEBVIEW_NATIVE_LIB_32,
- CHROMIUM_WEBVIEW_NATIVE_LIB_64);
+ long addressSpaceToReserve =
+ SystemProperties.getLong(CHROMIUM_WEBVIEW_VMSIZE_SIZE_PROPERTY,
+ CHROMIUM_WEBVIEW_DEFAULT_VMSIZE_BYTES);
+ sAddressSpaceReserved = nativeReserveAddressSpace(addressSpaceToReserve);
+
if (sAddressSpaceReserved) {
- if (DEBUG) Log.v(LOGTAG, "address space reserved");
+ if (DEBUG) {
+ Log.v(LOGTAG, "address space reserved: " + addressSpaceToReserve + " bytes");
+ }
} else {
- Log.e(LOGTAG, "reserving address space failed");
+ Log.e(LOGTAG, "reserving " + addressSpaceToReserve +
+ " bytes of address space failed");
}
- } catch (Throwable e) {
+ } catch (Throwable t) {
// Log and discard errors at this stage as we must not crash the zygote.
- Log.e(LOGTAG, "error preparing native loader", e);
+ Log.e(LOGTAG, "error preparing native loader", t);
}
}
/**
* Perform any WebView loading preparations that must happen at boot from the system server,
- * after the package manager has started.
+ * after the package manager has started or after an update to the webview is installed.
* This must be called in the system server.
* Currently, this means spawning the child processes which will create the relro files.
*/
public static void prepareWebViewInSystemServer() {
- if (DEBUG) Log.v(LOGTAG, "creating relro files");
- if (new File(CHROMIUM_WEBVIEW_NATIVE_LIB_64).exists()) {
- createRelroFile(Build.SUPPORTED_64_BIT_ABIS[0]);
+ String[] nativePaths = null;
+ try {
+ nativePaths = getWebViewNativeLibraryPaths();
+ } catch (PackageManager.NameNotFoundException e) {
}
- if (new File(CHROMIUM_WEBVIEW_NATIVE_LIB_32).exists()) {
- createRelroFile(Build.SUPPORTED_32_BIT_ABIS[0]);
+ prepareWebViewInSystemServer(nativePaths);
+ }
+
+ private static void prepareWebViewInSystemServer(String[] nativeLibraryPaths) {
+ if (DEBUG) Log.v(LOGTAG, "creating relro files");
+
+ // We must always trigger createRelRo regardless of the value of nativeLibraryPaths. Any
+ // unexpected values will be handled there to ensure that we trigger notifying any process
+ // waiting on relreo creation.
+ if (Build.SUPPORTED_32_BIT_ABIS.length > 0) {
+ if (DEBUG) Log.v(LOGTAG, "Create 32 bit relro");
+ createRelroFile(false /* is64Bit */, nativeLibraryPaths);
+ }
+
+ if (Build.SUPPORTED_64_BIT_ABIS.length > 0) {
+ if (DEBUG) Log.v(LOGTAG, "Create 64 bit relro");
+ createRelroFile(true /* is64Bit */, nativeLibraryPaths);
}
}
- private static void createRelroFile(String abi) {
+ public static void onWebViewUpdateInstalled() {
+ String[] nativeLibs = null;
try {
- Process.start("android.webkit.WebViewFactory$RelroFileCreator",
- "WebViewLoader-" + abi,
- Process.SHARED_RELRO_UID,
- Process.SHARED_RELRO_UID,
- null,
- 0, // TODO(torne): do we need to set debug flags?
- Zygote.MOUNT_EXTERNAL_NONE,
- Build.VERSION.SDK_INT,
- null,
- abi,
- null);
- } catch (Throwable e) {
+ nativeLibs = WebViewFactory.getWebViewNativeLibraryPaths();
+ } catch (PackageManager.NameNotFoundException e) {
+ }
+
+ if (nativeLibs != null) {
+ long newVmSize = 0L;
+
+ for (String path : nativeLibs) {
+ if (DEBUG) Log.d(LOGTAG, "Checking file size of " + path);
+ if (path == null) continue;
+ File f = new File(path);
+ if (f.exists()) {
+ long length = f.length();
+ if (length > newVmSize) {
+ newVmSize = length;
+ }
+ }
+ }
+
+ if (DEBUG) {
+ Log.v(LOGTAG, "Based on library size, need " + newVmSize +
+ " bytes of address space.");
+ }
+ // The required memory can be larger than the file on disk (due to .bss), and an
+ // upgraded version of the library will likely be larger, so always attempt to reserve
+ // twice as much as we think to allow for the library to grow during this boot cycle.
+ newVmSize = Math.max(2 * newVmSize, CHROMIUM_WEBVIEW_DEFAULT_VMSIZE_BYTES);
+ Log.d(LOGTAG, "Setting new address space to " + newVmSize);
+ SystemProperties.set(CHROMIUM_WEBVIEW_VMSIZE_SIZE_PROPERTY,
+ Long.toString(newVmSize));
+ }
+ prepareWebViewInSystemServer(nativeLibs);
+ }
+
+ private static String[] getWebViewNativeLibraryPaths()
+ throws PackageManager.NameNotFoundException {
+ final String NATIVE_LIB_FILE_NAME = "libwebviewchromium.so";
+
+ PackageManager pm = AppGlobals.getInitialApplication().getPackageManager();
+ ApplicationInfo ai = pm.getApplicationInfo(getWebViewPackageName(), 0);
+
+ String path32;
+ String path64;
+ boolean primaryArchIs64bit = VMRuntime.is64BitAbi(ai.primaryCpuAbi);
+ if (!TextUtils.isEmpty(ai.secondaryCpuAbi)) {
+ // Multi-arch case.
+ if (primaryArchIs64bit) {
+ // Primary arch: 64-bit, secondary: 32-bit.
+ path64 = ai.nativeLibraryDir;
+ path32 = ai.secondaryNativeLibraryDir;
+ } else {
+ // Primary arch: 32-bit, secondary: 64-bit.
+ path64 = ai.secondaryNativeLibraryDir;
+ path32 = ai.nativeLibraryDir;
+ }
+ } else if (primaryArchIs64bit) {
+ // Single-arch 64-bit.
+ path64 = ai.nativeLibraryDir;
+ path32 = "";
+ } else {
+ // Single-arch 32-bit.
+ path32 = ai.nativeLibraryDir;
+ path64 = "";
+ }
+ if (!TextUtils.isEmpty(path32)) path32 += "/" + NATIVE_LIB_FILE_NAME;
+ if (!TextUtils.isEmpty(path64)) path64 += "/" + NATIVE_LIB_FILE_NAME;
+ return new String[] { path32, path64 };
+ }
+
+ private static void createRelroFile(final boolean is64Bit, String[] nativeLibraryPaths) {
+ final String abi =
+ is64Bit ? Build.SUPPORTED_64_BIT_ABIS[0] : Build.SUPPORTED_32_BIT_ABIS[0];
+
+ // crashHandler is invoked by the ActivityManagerService when the isolated process crashes.
+ Runnable crashHandler = new Runnable() {
+ @Override
+ public void run() {
+ try {
+ Log.e(LOGTAG, "relro file creator for " + abi + " crashed. Proceeding without");
+ getUpdateService().notifyRelroCreationCompleted(is64Bit, false);
+ } catch (RemoteException e) {
+ Log.e(LOGTAG, "Cannot reach WebViewUpdateService. " + e.getMessage());
+ }
+ }
+ };
+
+ try {
+ if (nativeLibraryPaths == null
+ || nativeLibraryPaths[0] == null || nativeLibraryPaths[1] == null) {
+ throw new IllegalArgumentException(
+ "Native library paths to the WebView RelRo process must not be null!");
+ }
+ int pid = LocalServices.getService(ActivityManagerInternal.class).startIsolatedProcess(
+ RelroFileCreator.class.getName(), nativeLibraryPaths, "WebViewLoader-" + abi, abi,
+ Process.SHARED_RELRO_UID, crashHandler);
+ if (pid <= 0) throw new Exception("Failed to start the relro file creator process");
+ } catch (Throwable t) {
// Log and discard errors as we must not crash the system server.
- Log.e(LOGTAG, "error starting relro file creator for abi " + abi, e);
+ Log.e(LOGTAG, "error starting relro file creator for abi " + abi, t);
+ crashHandler.run();
}
}
private static class RelroFileCreator {
// Called in an unprivileged child process to create the relro file.
public static void main(String[] args) {
- if (!sAddressSpaceReserved) {
- Log.e(LOGTAG, "can't create relro file; address space not reserved");
- return;
- }
- boolean result = nativeCreateRelroFile(CHROMIUM_WEBVIEW_NATIVE_LIB_32,
- CHROMIUM_WEBVIEW_NATIVE_LIB_64,
- CHROMIUM_WEBVIEW_NATIVE_RELRO_32,
- CHROMIUM_WEBVIEW_NATIVE_RELRO_64);
- if (!result) {
- Log.e(LOGTAG, "failed to create relro file");
- } else if (DEBUG) {
- Log.v(LOGTAG, "created relro file");
- }
- try {
- getUpdateService().notifyRelroCreationCompleted(VMRuntime.getRuntime().is64Bit(),
- result);
- } catch (RemoteException e) {
- Log.e(LOGTAG, "error notifying update service", e);
- }
+ boolean result = false;
+ boolean is64Bit = VMRuntime.getRuntime().is64Bit();
+ try{
+ if (args.length != 2 || args[0] == null || args[1] == null) {
+ Log.e(LOGTAG, "Invalid RelroFileCreator args: " + Arrays.toString(args));
+ return;
+ }
+ Log.v(LOGTAG, "RelroFileCreator (64bit = " + is64Bit + "), " +
+ " 32-bit lib: " + args[0] + ", 64-bit lib: " + args[1]);
+ if (!sAddressSpaceReserved) {
+ Log.e(LOGTAG, "can't create relro file; address space not reserved");
+ return;
+ }
+ result = nativeCreateRelroFile(args[0] /* path32 */,
+ args[1] /* path64 */,
+ CHROMIUM_WEBVIEW_NATIVE_RELRO_32,
+ CHROMIUM_WEBVIEW_NATIVE_RELRO_64);
+ if (result && DEBUG) Log.v(LOGTAG, "created relro file");
+ } finally {
+ // We must do our best to always notify the update service, even if something fails.
+ try {
+ getUpdateService().notifyRelroCreationCompleted(is64Bit, result);
+ } catch (RemoteException e) {
+ Log.e(LOGTAG, "error notifying update service", e);
+ }
- // Must explicitly exit or else this process will just sit around after we return.
- System.exit(0);
+ if (!result) Log.e(LOGTAG, "failed to create relro file");
+
+ // Must explicitly exit or else this process will just sit around after we return.
+ System.exit(0);
+ }
}
}
@@ -203,14 +346,19 @@
return;
}
- boolean result = nativeLoadWithRelroFile(CHROMIUM_WEBVIEW_NATIVE_LIB_32,
- CHROMIUM_WEBVIEW_NATIVE_LIB_64,
- CHROMIUM_WEBVIEW_NATIVE_RELRO_32,
- CHROMIUM_WEBVIEW_NATIVE_RELRO_64);
- if (!result) {
- Log.w(LOGTAG, "failed to load with relro file, proceeding without");
- } else if (DEBUG) {
- Log.v(LOGTAG, "loaded with relro file");
+ try {
+ String[] args = getWebViewNativeLibraryPaths();
+ boolean result = nativeLoadWithRelroFile(args[0] /* path32 */,
+ args[1] /* path64 */,
+ CHROMIUM_WEBVIEW_NATIVE_RELRO_32,
+ CHROMIUM_WEBVIEW_NATIVE_RELRO_64);
+ if (!result) {
+ Log.w(LOGTAG, "failed to load with relro file, proceeding without");
+ } else if (DEBUG) {
+ Log.v(LOGTAG, "loaded with relro file");
+ }
+ } catch (PackageManager.NameNotFoundException e) {
+ Log.e(LOGTAG, "Failed to list WebView package libraries for loadNativeLibrary", e);
}
}
@@ -218,7 +366,7 @@
return IWebViewUpdateService.Stub.asInterface(ServiceManager.getService("webviewupdate"));
}
- private static native boolean nativeReserveAddressSpace(String lib32, String lib64);
+ private static native boolean nativeReserveAddressSpace(long addressSpaceToReserve);
private static native boolean nativeCreateRelroFile(String lib32, String lib64,
String relro32, String relro64);
private static native boolean nativeLoadWithRelroFile(String lib32, String lib64,
diff --git a/core/java/android/widget/Switch.java b/core/java/android/widget/Switch.java
index 8ea1090..682f2ae 100644
--- a/core/java/android/widget/Switch.java
+++ b/core/java/android/widget/Switch.java
@@ -100,13 +100,35 @@
private int mMinFlingVelocity;
private float mThumbPosition;
- private int mSwitchWidth;
- private int mSwitchHeight;
- private int mThumbWidth; // Does not include padding
+ /**
+ * Width required to draw the switch track and thumb. Includes padding and
+ * optical bounds for both the track and thumb.
+ */
+ private int mSwitchWidth;
+
+ /**
+ * Height required to draw the switch track and thumb. Includes padding and
+ * optical bounds for both the track and thumb.
+ */
+ private int mSwitchHeight;
+
+ /**
+ * Width of the thumb's content region. Does not include padding or
+ * optical bounds.
+ */
+ private int mThumbWidth;
+
+ /** Left bound for drawing the switch track and thumb. */
private int mSwitchLeft;
+
+ /** Top bound for drawing the switch track and thumb. */
private int mSwitchTop;
+
+ /** Right bound for drawing the switch track and thumb. */
private int mSwitchRight;
+
+ /** Bottom bound for drawing the switch track and thumb. */
private int mSwitchBottom;
private TextPaint mTextPaint;
@@ -539,7 +561,7 @@
* Sets whether the on/off text should be displayed.
*
* @param showText {@code true} to display on/off text
- * @hide
+ * @attr ref android.R.styleable#Switch_showText
*/
public void setShowText(boolean showText) {
if (mShowText != showText) {
@@ -550,7 +572,7 @@
/**
* @return whether the on/off text should be displayed
- * @hide
+ * @attr ref android.R.styleable#Switch_showText
*/
public boolean getShowText() {
return mShowText;
@@ -568,8 +590,30 @@
}
}
- final int trackHeight;
final Rect padding = mTempRect;
+ final int thumbWidth;
+ final int thumbHeight;
+ if (mThumbDrawable != null) {
+ // Cached thumb width does not include padding.
+ mThumbDrawable.getPadding(padding);
+ thumbWidth = mThumbDrawable.getIntrinsicWidth() - padding.left - padding.right;
+ thumbHeight = mThumbDrawable.getIntrinsicHeight();
+ } else {
+ thumbWidth = 0;
+ thumbHeight = 0;
+ }
+
+ final int maxTextWidth;
+ if (mShowText) {
+ maxTextWidth = Math.max(mOnLayout.getWidth(), mOffLayout.getWidth())
+ + mThumbTextPadding * 2;
+ } else {
+ maxTextWidth = 0;
+ }
+
+ mThumbWidth = Math.max(maxTextWidth, thumbWidth);
+
+ final int trackHeight;
if (mTrackDrawable != null) {
mTrackDrawable.getPadding(padding);
trackHeight = mTrackDrawable.getIntrinsicHeight();
@@ -578,22 +622,18 @@
trackHeight = 0;
}
- final int thumbWidth;
- final int thumbHeight;
+ // Adjust left and right padding to ensure there's enough room for the
+ // thumb's padding (when present).
+ int paddingLeft = padding.left;
+ int paddingRight = padding.right;
if (mThumbDrawable != null) {
- thumbWidth = mThumbDrawable.getIntrinsicWidth();
- thumbHeight = mThumbDrawable.getIntrinsicHeight();
- } else {
- thumbWidth = 0;
- thumbHeight = 0;
+ final Insets inset = mThumbDrawable.getOpticalInsets();
+ paddingLeft = Math.max(paddingLeft, inset.left);
+ paddingRight = Math.max(paddingRight, inset.right);
}
- final int maxTextWidth = mShowText ? Math.max(mOnLayout.getWidth(), mOffLayout.getWidth())
- + mThumbTextPadding * 2 : 0;
- mThumbWidth = Math.max(maxTextWidth, thumbWidth);
-
final int switchWidth = Math.max(mSwitchMinWidth,
- 2 * mThumbWidth + padding.left + padding.right);
+ 2 * mThumbWidth + paddingLeft + paddingRight);
final int switchHeight = Math.max(trackHeight, thumbHeight);
mSwitchWidth = switchWidth;
mSwitchHeight = switchHeight;
@@ -806,19 +846,33 @@
protected void onLayout(boolean changed, int left, int top, int right, int bottom) {
super.onLayout(changed, left, top, right, bottom);
- int switchRight;
- int switchLeft;
+ int opticalInsetLeft = 0;
+ int opticalInsetRight = 0;
+ if (mThumbDrawable != null) {
+ final Rect trackPadding = mTempRect;
+ if (mTrackDrawable != null) {
+ mTrackDrawable.getPadding(trackPadding);
+ } else {
+ trackPadding.setEmpty();
+ }
- if (isLayoutRtl()) {
- switchLeft = getPaddingLeft();
- switchRight = switchLeft + mSwitchWidth;
- } else {
- switchRight = getWidth() - getPaddingRight();
- switchLeft = switchRight - mSwitchWidth;
+ final Insets insets = mThumbDrawable.getOpticalInsets();
+ opticalInsetLeft = Math.max(0, insets.left - trackPadding.left);
+ opticalInsetRight = Math.max(0, insets.right - trackPadding.right);
}
- int switchTop = 0;
- int switchBottom = 0;
+ final int switchRight;
+ final int switchLeft;
+ if (isLayoutRtl()) {
+ switchLeft = getPaddingLeft() + opticalInsetLeft;
+ switchRight = switchLeft + mSwitchWidth - opticalInsetLeft - opticalInsetRight;
+ } else {
+ switchRight = getWidth() - getPaddingRight() - opticalInsetRight;
+ switchLeft = switchRight - mSwitchWidth + opticalInsetLeft + opticalInsetRight;
+ }
+
+ final int switchTop;
+ final int switchBottom;
switch (getGravity() & Gravity.VERTICAL_GRAVITY_MASK) {
default:
case Gravity.TOP:
@@ -847,27 +901,55 @@
@Override
public void draw(Canvas c) {
final Rect padding = mTempRect;
-
- // Layout the track.
final int switchLeft = mSwitchLeft;
final int switchTop = mSwitchTop;
final int switchRight = mSwitchRight;
final int switchBottom = mSwitchBottom;
- if (mTrackDrawable != null) {
- mTrackDrawable.setBounds(switchLeft, switchTop, switchRight, switchBottom);
- mTrackDrawable.getPadding(padding);
+
+ int thumbInitialLeft = switchLeft + getThumbOffset();
+
+ final Insets thumbInsets;
+ if (mThumbDrawable != null) {
+ thumbInsets = mThumbDrawable.getOpticalInsets();
+ } else {
+ thumbInsets = Insets.NONE;
}
- final int switchInnerLeft = switchLeft + padding.left;
+ // Layout the track.
+ if (mTrackDrawable != null) {
+ mTrackDrawable.getPadding(padding);
- // Relies on mTempRect, MUST be called first!
- final int thumbPos = getThumbOffset();
+ // Adjust thumb position for track padding.
+ thumbInitialLeft += padding.left;
+
+ // If necessary, offset by the optical insets of the thumb asset.
+ int trackLeft = switchLeft;
+ int trackTop = switchTop;
+ int trackRight = switchRight;
+ int trackBottom = switchBottom;
+ if (thumbInsets != Insets.NONE) {
+ if (thumbInsets.left > padding.left) {
+ trackLeft += thumbInsets.left - padding.left;
+ }
+ if (thumbInsets.top > padding.top) {
+ trackTop += thumbInsets.top - padding.top;
+ }
+ if (thumbInsets.right > padding.right) {
+ trackRight -= thumbInsets.right - padding.right;
+ }
+ if (thumbInsets.bottom > padding.bottom) {
+ trackBottom -= thumbInsets.bottom - padding.bottom;
+ }
+ }
+ mTrackDrawable.setBounds(trackLeft, trackTop, trackRight, trackBottom);
+ }
// Layout the thumb.
if (mThumbDrawable != null) {
mThumbDrawable.getPadding(padding);
- final int thumbLeft = switchInnerLeft - padding.left + thumbPos;
- final int thumbRight = switchInnerLeft + thumbPos + mThumbWidth + padding.right;
+
+ final int thumbLeft = thumbInitialLeft - padding.left;
+ final int thumbRight = thumbInitialLeft + mThumbWidth + padding.right;
mThumbDrawable.setBounds(thumbLeft, switchTop, thumbRight, switchBottom);
final Drawable background = getBackground();
@@ -894,9 +976,7 @@
final int switchTop = mSwitchTop;
final int switchBottom = mSwitchBottom;
- final int switchInnerLeft = mSwitchLeft + padding.left;
final int switchInnerTop = switchTop + padding.top;
- final int switchInnerRight = mSwitchRight - padding.right;
final int switchInnerBottom = switchBottom - padding.bottom;
final Drawable thumbDrawable = mThumbDrawable;
@@ -919,7 +999,6 @@
final int saveCount = canvas.save();
if (thumbDrawable != null) {
- canvas.clipRect(switchInnerLeft, switchTop, switchInnerRight, switchBottom);
thumbDrawable.draw(canvas);
}
@@ -974,7 +1053,7 @@
/**
* Translates thumb position to offset according to current RTL setting and
- * thumb scroll range.
+ * thumb scroll range. Accounts for both track and thumb padding.
*
* @return thumb offset
*/
@@ -990,8 +1069,18 @@
private int getThumbScrollRange() {
if (mTrackDrawable != null) {
- mTrackDrawable.getPadding(mTempRect);
- return mSwitchWidth - mThumbWidth - mTempRect.left - mTempRect.right;
+ final Rect padding = mTempRect;
+ mTrackDrawable.getPadding(padding);
+
+ final Insets insets;
+ if (mThumbDrawable != null) {
+ insets = mThumbDrawable.getOpticalInsets();
+ } else {
+ insets = Insets.NONE;
+ }
+
+ return mSwitchWidth - mThumbWidth - padding.left - padding.right
+ - insets.left - insets.right;
} else {
return 0;
}
diff --git a/core/java/android/widget/TextView.java b/core/java/android/widget/TextView.java
index 52618cc..a0f7baf 100644
--- a/core/java/android/widget/TextView.java
+++ b/core/java/android/widget/TextView.java
@@ -658,6 +658,7 @@
float dx = 0, dy = 0, r = 0;
boolean elegant = false;
float letterSpacing = 0;
+ String fontFeatureSettings = null;
final Resources.Theme theme = context.getTheme();
@@ -742,6 +743,10 @@
case com.android.internal.R.styleable.TextAppearance_letterSpacing:
letterSpacing = appearance.getFloat(attr, 0);
break;
+
+ case com.android.internal.R.styleable.TextAppearance_fontFeatureSettings:
+ fontFeatureSettings = appearance.getString(attr);
+ break;
}
}
@@ -1087,6 +1092,10 @@
case com.android.internal.R.styleable.TextView_letterSpacing:
letterSpacing = a.getFloat(attr, 0);
break;
+
+ case com.android.internal.R.styleable.TextView_fontFeatureSettings:
+ fontFeatureSettings = a.getString(attr);
+ break;
}
}
a.recycle();
@@ -1269,6 +1278,7 @@
setRawTextSize(textSize);
setElegantTextHeight(elegant);
setLetterSpacing(letterSpacing);
+ setFontFeatureSettings(fontFeatureSettings);
if (allCaps) {
setTransformationMethod(new AllCapsTransformationMethod(getContext()));
@@ -2502,6 +2512,11 @@
com.android.internal.R.styleable.TextAppearance_letterSpacing, 0));
}
+ if (appearance.hasValue(com.android.internal.R.styleable.TextAppearance_fontFeatureSettings)) {
+ setFontFeatureSettings(appearance.getString(
+ com.android.internal.R.styleable.TextAppearance_fontFeatureSettings));
+ }
+
appearance.recycle();
}
@@ -2686,6 +2701,7 @@
* This will normally be 0.
*
* @see #setLetterSpacing(float)
+ * @see Paint#setLetterSpacing
* @hide
*/
public float getLetterSpacing() {
@@ -2697,7 +2713,7 @@
* for slight expansion will be around 0.05. Negative values tighten text.
*
* @see #getLetterSpacing()
- * @see Paint#setFlags
+ * @see Paint#getLetterSpacing
*
* @attr ref android.R.styleable#TextView_letterSpacing
* @hide
@@ -2715,6 +2731,41 @@
}
}
+ /**
+ * @return the currently set font feature settings. Default is null.
+ *
+ * @see #setFontFeatureSettings(String)
+ * @see Paint#setFontFeatureSettings
+ * @hide
+ */
+ public String getFontFeatureSettings() {
+ return mTextPaint.getFontFeatureSettings();
+ }
+
+ /**
+ * Sets font feature settings. The format is the same as the CSS
+ * font-feature-settings attribute:
+ * http://dev.w3.org/csswg/css-fonts/#propdef-font-feature-settings
+ *
+ * @see #getFontFeatureSettings()
+ * @see Paint#getFontFeatureSettings
+ *
+ * @attr ref android.R.styleable#TextView_fontFeatureSettings
+ * @hide
+ */
+ @android.view.RemotableViewMethod
+ public void setFontFeatureSettings(String fontFeatureSettings) {
+ if (fontFeatureSettings != mTextPaint.getFontFeatureSettings()) {
+ mTextPaint.setFontFeatureSettings(fontFeatureSettings);
+
+ if (mLayout != null) {
+ nullLayouts();
+ requestLayout();
+ invalidate();
+ }
+ }
+ }
+
/**
* Sets the text color for all the states (normal, selected,
diff --git a/core/java/com/android/internal/statusbar/IStatusBar.aidl b/core/java/com/android/internal/statusbar/IStatusBar.aidl
index 969c0db..7901379 100644
--- a/core/java/com/android/internal/statusbar/IStatusBar.aidl
+++ b/core/java/com/android/internal/statusbar/IStatusBar.aidl
@@ -35,6 +35,8 @@
void setHardKeyboardStatus(boolean available, boolean enabled);
void setWindowState(int window, int state);
void buzzBeepBlinked();
+ void notificationLightOff();
+ void notificationLightPulse(int argb, int millisOn, int millisOff);
void showRecentApps(boolean triggeredFromAltTab);
void hideRecentApps(boolean triggeredFromAltTab);
diff --git a/core/java/com/android/internal/util/XmlUtils.java b/core/java/com/android/internal/util/XmlUtils.java
index dca9921..7db70ba 100644
--- a/core/java/com/android/internal/util/XmlUtils.java
+++ b/core/java/com/android/internal/util/XmlUtils.java
@@ -16,12 +16,18 @@
package com.android.internal.util;
+import android.graphics.Bitmap;
+import android.graphics.BitmapFactory;
+import android.graphics.Bitmap.CompressFormat;
+import android.net.Uri;
+import android.util.Base64;
import android.util.Xml;
import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserException;
import org.xmlpull.v1.XmlSerializer;
+import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
@@ -1415,6 +1421,20 @@
out.attribute(null, name, Long.toString(value));
}
+ public static float readFloatAttribute(XmlPullParser in, String name) throws IOException {
+ final String value = in.getAttributeValue(null, name);
+ try {
+ return Float.parseFloat(value);
+ } catch (NumberFormatException e) {
+ throw new ProtocolException("problem parsing " + name + "=" + value + " as long");
+ }
+ }
+
+ public static void writeFloatAttribute(XmlSerializer out, String name, float value)
+ throws IOException {
+ out.attribute(null, name, Float.toString(value));
+ }
+
public static boolean readBooleanAttribute(XmlPullParser in, String name) {
final String value = in.getAttributeValue(null, name);
return Boolean.parseBoolean(value);
@@ -1425,6 +1445,63 @@
out.attribute(null, name, Boolean.toString(value));
}
+ public static Uri readUriAttribute(XmlPullParser in, String name) {
+ final String value = in.getAttributeValue(null, name);
+ return (value != null) ? Uri.parse(value) : null;
+ }
+
+ public static void writeUriAttribute(XmlSerializer out, String name, Uri value)
+ throws IOException {
+ if (value != null) {
+ out.attribute(null, name, value.toString());
+ }
+ }
+
+ public static String readStringAttribute(XmlPullParser in, String name) {
+ return in.getAttributeValue(null, name);
+ }
+
+ public static void writeStringAttribute(XmlSerializer out, String name, String value)
+ throws IOException {
+ if (value != null) {
+ out.attribute(null, name, value);
+ }
+ }
+
+ public static byte[] readByteArrayAttribute(XmlPullParser in, String name) {
+ final String value = in.getAttributeValue(null, name);
+ if (value != null) {
+ return Base64.decode(value, Base64.DEFAULT);
+ } else {
+ return null;
+ }
+ }
+
+ public static void writeByteArrayAttribute(XmlSerializer out, String name, byte[] value)
+ throws IOException {
+ if (value != null) {
+ out.attribute(null, name, Base64.encodeToString(value, Base64.DEFAULT));
+ }
+ }
+
+ public static Bitmap readBitmapAttribute(XmlPullParser in, String name) {
+ final byte[] value = readByteArrayAttribute(in, name);
+ if (value != null) {
+ return BitmapFactory.decodeByteArray(value, 0, value.length);
+ } else {
+ return null;
+ }
+ }
+
+ public static void writeBitmapAttribute(XmlSerializer out, String name, Bitmap value)
+ throws IOException {
+ if (value != null) {
+ final ByteArrayOutputStream os = new ByteArrayOutputStream();
+ value.compress(CompressFormat.PNG, 90, os);
+ writeByteArrayAttribute(out, name, os.toByteArray());
+ }
+ }
+
/** @hide */
public interface WriteMapCallback {
/**
diff --git a/core/java/com/android/internal/widget/ActionBarContainer.java b/core/java/com/android/internal/widget/ActionBarContainer.java
index 790b611..9e24844 100644
--- a/core/java/com/android/internal/widget/ActionBarContainer.java
+++ b/core/java/com/android/internal/widget/ActionBarContainer.java
@@ -16,10 +16,12 @@
package com.android.internal.widget;
+import android.annotation.NonNull;
import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.Canvas;
import android.graphics.ColorFilter;
+import android.graphics.Outline;
import android.graphics.drawable.Drawable;
import android.util.AttributeSet;
import android.view.ActionMode;
@@ -324,18 +326,36 @@
* projection surfaces.
*/
private class ActionBarBackgroundDrawable extends Drawable {
- @Override
- public void draw(Canvas canvas) {
+ private Drawable getDrawable() {
if (mIsSplit) {
- if (mSplitBackground != null) mSplitBackground.draw(canvas);
+ if (mSplitBackground != null) {
+ return mSplitBackground;
+ }
} else {
if (mBackground != null) {
- mBackground.draw(canvas);
+ return mBackground;
}
if (mStackedBackground != null && mIsStacked) {
- mStackedBackground.draw(canvas);
+ return mStackedBackground;
}
}
+ return null;
+ }
+
+ @Override
+ public void draw(Canvas canvas) {
+ final Drawable drawable = getDrawable();
+ if (drawable != null) {
+ drawable.draw(canvas);
+ }
+ }
+
+ @Override
+ public void getOutline(@NonNull Outline outline) {
+ final Drawable drawable = getDrawable();
+ if (drawable != null) {
+ drawable.getOutline(outline);
+ }
}
@Override
diff --git a/core/jni/android/graphics/BitmapFactory.cpp b/core/jni/android/graphics/BitmapFactory.cpp
index a890eb4..2ce1b15 100644
--- a/core/jni/android/graphics/BitmapFactory.cpp
+++ b/core/jni/android/graphics/BitmapFactory.cpp
@@ -353,7 +353,7 @@
ninePatchInsets = env->NewObject(gInsetStruct_class, gInsetStruct_constructorMethodID,
peeker.mOpticalInsets[0], peeker.mOpticalInsets[1], peeker.mOpticalInsets[2], peeker.mOpticalInsets[3],
peeker.mOutlineInsets[0], peeker.mOutlineInsets[1], peeker.mOutlineInsets[2], peeker.mOutlineInsets[3],
- peeker.mOutlineRadius, peeker.mOutlineFilled, scale);
+ peeker.mOutlineRadius, peeker.mOutlineAlpha, scale);
if (javaBitmap != NULL) {
env->SetObjectField(javaBitmap, gBitmap_ninePatchInsetsFieldID, ninePatchInsets);
}
@@ -589,7 +589,7 @@
"Landroid/graphics/NinePatch$InsetStruct;");
gInsetStruct_class = (jclass) env->NewGlobalRef(env->FindClass("android/graphics/NinePatch$InsetStruct"));
- gInsetStruct_constructorMethodID = env->GetMethodID(gInsetStruct_class, "<init>", "(IIIIIIIIFZF)V");
+ gInsetStruct_constructorMethodID = env->GetMethodID(gInsetStruct_class, "<init>", "(IIIIIIIIFIF)V");
int ret = AndroidRuntime::registerNativeMethods(env,
"android/graphics/BitmapFactory$Options",
diff --git a/core/jni/android/graphics/MinikinUtils.cpp b/core/jni/android/graphics/MinikinUtils.cpp
index 47f72c4..b00e1ab 100644
--- a/core/jni/android/graphics/MinikinUtils.cpp
+++ b/core/jni/android/graphics/MinikinUtils.cpp
@@ -59,6 +59,7 @@
minikinPaint.skewX = paint->getTextSkewX();
minikinPaint.letterSpacing = paint->getLetterSpacing();
minikinPaint.paintFlags = MinikinFontSkia::packPaintFlags(paint);
+ minikinPaint.fontFeatureSettings = paint->getFontFeatureSettings();
layout->doLayout(buf, start, count, bufSize, bidiFlags, minikinStyle, minikinPaint);
}
diff --git a/core/jni/android/graphics/NinePatchPeeker.cpp b/core/jni/android/graphics/NinePatchPeeker.cpp
index ea5193b..1dafa1b 100644
--- a/core/jni/android/graphics/NinePatchPeeker.cpp
+++ b/core/jni/android/graphics/NinePatchPeeker.cpp
@@ -48,11 +48,11 @@
} else if (!strcmp("npLb", tag) && length == sizeof(int32_t) * 4) {
mHasInsets = true;
memcpy(&mOpticalInsets, data, sizeof(int32_t) * 4);
- } else if (!strcmp("npOl", tag) && length == 24) { // 4 int32_ts, 1 float, 1 int32_t sized bool
+ } else if (!strcmp("npOl", tag) && length == 24) { // 4 int32_ts, 1 float, 1 int32_t sized byte
mHasInsets = true;
memcpy(&mOutlineInsets, data, sizeof(int32_t) * 4);
mOutlineRadius = ((const float*)data)[4];
- mOutlineFilled = ((const int32_t*)data)[5] & 0x01;
+ mOutlineAlpha = ((const int32_t*)data)[5] & 0xff;
}
return true; // keep on decoding
}
diff --git a/core/jni/android/graphics/NinePatchPeeker.h b/core/jni/android/graphics/NinePatchPeeker.h
index 8d3e6cf..7c18b2d 100644
--- a/core/jni/android/graphics/NinePatchPeeker.h
+++ b/core/jni/android/graphics/NinePatchPeeker.h
@@ -33,7 +33,7 @@
, mPatchSize(0)
, mHasInsets(false)
, mOutlineRadius(0)
- , mOutlineFilled(false) {
+ , mOutlineAlpha(0) {
memset(mOpticalInsets, 0, 4 * sizeof(int32_t));
memset(mOutlineInsets, 0, 4 * sizeof(int32_t));
}
@@ -50,7 +50,7 @@
int32_t mOpticalInsets[4];
int32_t mOutlineInsets[4];
float mOutlineRadius;
- bool mOutlineFilled;
+ uint8_t mOutlineAlpha;
};
#endif // NinePatchPeeker_h
diff --git a/core/jni/android/graphics/Paint.cpp b/core/jni/android/graphics/Paint.cpp
index 2b0d68c..f6ced09 100644
--- a/core/jni/android/graphics/Paint.cpp
+++ b/core/jni/android/graphics/Paint.cpp
@@ -428,6 +428,16 @@
paint->setLetterSpacing(letterSpacing);
}
+ static void setFontFeatureSettings(JNIEnv* env, jobject clazz, jlong paintHandle, jstring settings) {
+ Paint* paint = reinterpret_cast<Paint*>(paintHandle);
+ if (!settings) {
+ paint->setFontFeatureSettings(std::string());
+ } else {
+ ScopedUtfChars settingsChars(env, settings);
+ paint->setFontFeatureSettings(std::string(settingsChars.c_str(), settingsChars.size()));
+ }
+ }
+
static SkScalar getMetricsInternal(JNIEnv* env, jobject jpaint, Paint::FontMetrics *metrics) {
const int kElegantTop = 2500;
const int kElegantBottom = -1000;
@@ -987,6 +997,7 @@
{"setTextSkewX","(F)V", (void*) PaintGlue::setTextSkewX},
{"native_getLetterSpacing","(J)F", (void*) PaintGlue::getLetterSpacing},
{"native_setLetterSpacing","(JF)V", (void*) PaintGlue::setLetterSpacing},
+ {"native_setFontFeatureSettings","(JLjava/lang/String;)V", (void*) PaintGlue::setFontFeatureSettings},
{"ascent","()F", (void*) PaintGlue::ascent},
{"descent","()F", (void*) PaintGlue::descent},
{"getFontMetrics", "(Landroid/graphics/Paint$FontMetrics;)F", (void*)PaintGlue::getFontMetrics},
diff --git a/core/jni/android/graphics/Paint.h b/core/jni/android/graphics/Paint.h
index 7235cc4..efc65be 100644
--- a/core/jni/android/graphics/Paint.h
+++ b/core/jni/android/graphics/Paint.h
@@ -18,6 +18,7 @@
#define ANDROID_GRAPHICS_PAINT_H
#include <SkPaint.h>
+#include <string>
namespace android {
@@ -42,8 +43,17 @@
return mLetterSpacing;
}
+ void setFontFeatureSettings(const std::string &fontFeatureSettings) {
+ mFontFeatureSettings = fontFeatureSettings;
+ }
+
+ std::string getFontFeatureSettings() const {
+ return mFontFeatureSettings;
+ }
+
private:
float mLetterSpacing;
+ std::string mFontFeatureSettings;
};
} // namespace android
diff --git a/core/jni/android/graphics/PaintImpl.cpp b/core/jni/android/graphics/PaintImpl.cpp
index ff2bbc5..05020d2 100644
--- a/core/jni/android/graphics/PaintImpl.cpp
+++ b/core/jni/android/graphics/PaintImpl.cpp
@@ -23,11 +23,11 @@
namespace android {
Paint::Paint() : SkPaint(),
- mLetterSpacing(0) {
+ mLetterSpacing(0), mFontFeatureSettings() {
}
Paint::Paint(const Paint& paint) : SkPaint(paint),
- mLetterSpacing(0) {
+ mLetterSpacing(0), mFontFeatureSettings() {
}
Paint::~Paint() {
@@ -36,12 +36,14 @@
Paint& Paint::operator=(const Paint& other) {
SkPaint::operator=(other);
mLetterSpacing = other.mLetterSpacing;
+ mFontFeatureSettings = other.mFontFeatureSettings;
return *this;
}
bool operator==(const Paint& a, const Paint& b) {
return static_cast<const SkPaint&>(a) == static_cast<const SkPaint&>(b)
- && a.mLetterSpacing == b.mLetterSpacing;
+ && a.mLetterSpacing == b.mLetterSpacing
+ && a.mFontFeatureSettings == b.mFontFeatureSettings;
}
}
diff --git a/core/jni/android/graphics/Picture.cpp b/core/jni/android/graphics/Picture.cpp
index d214575..630999c 100644
--- a/core/jni/android/graphics/Picture.cpp
+++ b/core/jni/android/graphics/Picture.cpp
@@ -42,6 +42,10 @@
mWidth = width;
mHeight = height;
SkCanvas* canvas = mRecorder->beginRecording(width, height, NULL, 0);
+ // the java side will wrap this guy in a Canvas.java, which will call
+ // unref in its finalizer, so we have to ref it here, so that both that
+ // Canvas.java and our picture can both be owners
+ canvas->ref();
return Canvas::create_canvas(canvas);
}
diff --git a/core/jni/android_view_RenderNode.cpp b/core/jni/android_view_RenderNode.cpp
index ff54fb9..1e9d722 100644
--- a/core/jni/android_view_RenderNode.cpp
+++ b/core/jni/android_view_RenderNode.cpp
@@ -140,18 +140,19 @@
static jboolean android_view_RenderNode_setOutlineRoundRect(JNIEnv* env,
jobject clazz, jlong renderNodePtr, jint left, jint top,
- jint right, jint bottom, jfloat radius) {
+ jint right, jint bottom, jfloat radius, jfloat alpha) {
RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr);
- renderNode->mutateStagingProperties().mutableOutline().setRoundRect(left, top, right, bottom, radius);
+ renderNode->mutateStagingProperties().mutableOutline().setRoundRect(left, top, right, bottom,
+ radius, alpha);
renderNode->setPropertyFieldsDirty(RenderNode::GENERIC);
return true;
}
static jboolean android_view_RenderNode_setOutlineConvexPath(JNIEnv* env,
- jobject clazz, jlong renderNodePtr, jlong outlinePathPtr) {
+ jobject clazz, jlong renderNodePtr, jlong outlinePathPtr, jfloat alpha) {
RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr);
SkPath* outlinePath = reinterpret_cast<SkPath*>(outlinePathPtr);
- renderNode->mutateStagingProperties().mutableOutline().setConvexPath(outlinePath);
+ renderNode->mutateStagingProperties().mutableOutline().setConvexPath(outlinePath, alpha);
renderNode->setPropertyFieldsDirty(RenderNode::GENERIC);
return true;
}
@@ -480,8 +481,8 @@
{ "nSetProjectBackwards", "(JZ)Z", (void*) android_view_RenderNode_setProjectBackwards },
{ "nSetProjectionReceiver","(JZ)Z", (void*) android_view_RenderNode_setProjectionReceiver },
- { "nSetOutlineRoundRect", "(JIIIIF)Z", (void*) android_view_RenderNode_setOutlineRoundRect },
- { "nSetOutlineConvexPath", "(JJ)Z", (void*) android_view_RenderNode_setOutlineConvexPath },
+ { "nSetOutlineRoundRect", "(JIIIIFF)Z", (void*) android_view_RenderNode_setOutlineRoundRect },
+ { "nSetOutlineConvexPath", "(JJF)Z", (void*) android_view_RenderNode_setOutlineConvexPath },
{ "nSetOutlineEmpty", "(J)Z", (void*) android_view_RenderNode_setOutlineEmpty },
{ "nSetOutlineNone", "(J)Z", (void*) android_view_RenderNode_setOutlineNone },
{ "nSetClipToOutline", "(JZ)Z", (void*) android_view_RenderNode_setClipToOutline },
diff --git a/core/res/AndroidManifest.xml b/core/res/AndroidManifest.xml
index d7aea39..2a96580 100644
--- a/core/res/AndroidManifest.xml
+++ b/core/res/AndroidManifest.xml
@@ -75,6 +75,7 @@
<protected-broadcast android:name="android.intent.action.USER_SWITCHED" />
<protected-broadcast android:name="android.os.action.POWER_SAVE_MODE_CHANGED" />
+ <protected-broadcast android:name="android.os.action.POWER_SAVE_MODE_CHANGING" />
<protected-broadcast android:name="android.app.action.ENTER_CAR_MODE" />
<protected-broadcast android:name="android.app.action.EXIT_CAR_MODE" />
diff --git a/core/res/res/drawable-hdpi/btn_switch_to_off_mtrl_000.png b/core/res/res/drawable-hdpi/btn_switch_to_off_mtrl_000.png
deleted file mode 100644
index c54f8d7..0000000
--- a/core/res/res/drawable-hdpi/btn_switch_to_off_mtrl_000.png
+++ /dev/null
Binary files differ
diff --git a/core/res/res/drawable-hdpi/btn_switch_to_off_mtrl_00001.9.png b/core/res/res/drawable-hdpi/btn_switch_to_off_mtrl_00001.9.png
new file mode 100644
index 0000000..9076900
--- /dev/null
+++ b/core/res/res/drawable-hdpi/btn_switch_to_off_mtrl_00001.9.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/btn_switch_to_off_mtrl_00002.9.png b/core/res/res/drawable-hdpi/btn_switch_to_off_mtrl_00002.9.png
new file mode 100644
index 0000000..3c72bf8
--- /dev/null
+++ b/core/res/res/drawable-hdpi/btn_switch_to_off_mtrl_00002.9.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/btn_switch_to_off_mtrl_00003.9.png b/core/res/res/drawable-hdpi/btn_switch_to_off_mtrl_00003.9.png
new file mode 100644
index 0000000..d31e113
--- /dev/null
+++ b/core/res/res/drawable-hdpi/btn_switch_to_off_mtrl_00003.9.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/btn_switch_to_off_mtrl_00004.9.png b/core/res/res/drawable-hdpi/btn_switch_to_off_mtrl_00004.9.png
new file mode 100644
index 0000000..d0c693e
--- /dev/null
+++ b/core/res/res/drawable-hdpi/btn_switch_to_off_mtrl_00004.9.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/btn_switch_to_off_mtrl_00005.9.png b/core/res/res/drawable-hdpi/btn_switch_to_off_mtrl_00005.9.png
new file mode 100644
index 0000000..dfa19b4
--- /dev/null
+++ b/core/res/res/drawable-hdpi/btn_switch_to_off_mtrl_00005.9.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/btn_switch_to_off_mtrl_00006.9.png b/core/res/res/drawable-hdpi/btn_switch_to_off_mtrl_00006.9.png
new file mode 100644
index 0000000..151f205
--- /dev/null
+++ b/core/res/res/drawable-hdpi/btn_switch_to_off_mtrl_00006.9.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/btn_switch_to_off_mtrl_00007.9.png b/core/res/res/drawable-hdpi/btn_switch_to_off_mtrl_00007.9.png
new file mode 100644
index 0000000..ad3ee2c
--- /dev/null
+++ b/core/res/res/drawable-hdpi/btn_switch_to_off_mtrl_00007.9.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/btn_switch_to_off_mtrl_00008.9.png b/core/res/res/drawable-hdpi/btn_switch_to_off_mtrl_00008.9.png
new file mode 100644
index 0000000..43d66d7
--- /dev/null
+++ b/core/res/res/drawable-hdpi/btn_switch_to_off_mtrl_00008.9.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/btn_switch_to_off_mtrl_00009.9.png b/core/res/res/drawable-hdpi/btn_switch_to_off_mtrl_00009.9.png
new file mode 100644
index 0000000..13e4f8b
--- /dev/null
+++ b/core/res/res/drawable-hdpi/btn_switch_to_off_mtrl_00009.9.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/btn_switch_to_off_mtrl_00010.9.png b/core/res/res/drawable-hdpi/btn_switch_to_off_mtrl_00010.9.png
new file mode 100644
index 0000000..a09b6b2
--- /dev/null
+++ b/core/res/res/drawable-hdpi/btn_switch_to_off_mtrl_00010.9.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/btn_switch_to_off_mtrl_00011.9.png b/core/res/res/drawable-hdpi/btn_switch_to_off_mtrl_00011.9.png
new file mode 100644
index 0000000..be02e53
--- /dev/null
+++ b/core/res/res/drawable-hdpi/btn_switch_to_off_mtrl_00011.9.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/btn_switch_to_off_mtrl_00012.9.png b/core/res/res/drawable-hdpi/btn_switch_to_off_mtrl_00012.9.png
new file mode 100644
index 0000000..655d387
--- /dev/null
+++ b/core/res/res/drawable-hdpi/btn_switch_to_off_mtrl_00012.9.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/btn_switch_to_off_mtrl_001.png b/core/res/res/drawable-hdpi/btn_switch_to_off_mtrl_001.png
deleted file mode 100644
index e062f61..0000000
--- a/core/res/res/drawable-hdpi/btn_switch_to_off_mtrl_001.png
+++ /dev/null
Binary files differ
diff --git a/core/res/res/drawable-hdpi/btn_switch_to_off_mtrl_002.png b/core/res/res/drawable-hdpi/btn_switch_to_off_mtrl_002.png
deleted file mode 100644
index 7737646..0000000
--- a/core/res/res/drawable-hdpi/btn_switch_to_off_mtrl_002.png
+++ /dev/null
Binary files differ
diff --git a/core/res/res/drawable-hdpi/btn_switch_to_off_mtrl_003.png b/core/res/res/drawable-hdpi/btn_switch_to_off_mtrl_003.png
deleted file mode 100644
index 65ff45e..0000000
--- a/core/res/res/drawable-hdpi/btn_switch_to_off_mtrl_003.png
+++ /dev/null
Binary files differ
diff --git a/core/res/res/drawable-hdpi/btn_switch_to_off_mtrl_004.png b/core/res/res/drawable-hdpi/btn_switch_to_off_mtrl_004.png
deleted file mode 100644
index 11aaec0..0000000
--- a/core/res/res/drawable-hdpi/btn_switch_to_off_mtrl_004.png
+++ /dev/null
Binary files differ
diff --git a/core/res/res/drawable-hdpi/btn_switch_to_off_mtrl_005.png b/core/res/res/drawable-hdpi/btn_switch_to_off_mtrl_005.png
deleted file mode 100644
index 9e1b60f..0000000
--- a/core/res/res/drawable-hdpi/btn_switch_to_off_mtrl_005.png
+++ /dev/null
Binary files differ
diff --git a/core/res/res/drawable-hdpi/btn_switch_to_off_mtrl_006.png b/core/res/res/drawable-hdpi/btn_switch_to_off_mtrl_006.png
deleted file mode 100644
index 1e45687..0000000
--- a/core/res/res/drawable-hdpi/btn_switch_to_off_mtrl_006.png
+++ /dev/null
Binary files differ
diff --git a/core/res/res/drawable-hdpi/btn_switch_to_off_mtrl_007.png b/core/res/res/drawable-hdpi/btn_switch_to_off_mtrl_007.png
deleted file mode 100644
index 1e45687..0000000
--- a/core/res/res/drawable-hdpi/btn_switch_to_off_mtrl_007.png
+++ /dev/null
Binary files differ
diff --git a/core/res/res/drawable-hdpi/btn_switch_to_off_mtrl_008.png b/core/res/res/drawable-hdpi/btn_switch_to_off_mtrl_008.png
deleted file mode 100644
index 6c48456..0000000
--- a/core/res/res/drawable-hdpi/btn_switch_to_off_mtrl_008.png
+++ /dev/null
Binary files differ
diff --git a/core/res/res/drawable-hdpi/btn_switch_to_off_mtrl_009.png b/core/res/res/drawable-hdpi/btn_switch_to_off_mtrl_009.png
deleted file mode 100644
index a4d084b..0000000
--- a/core/res/res/drawable-hdpi/btn_switch_to_off_mtrl_009.png
+++ /dev/null
Binary files differ
diff --git a/core/res/res/drawable-hdpi/btn_switch_to_off_mtrl_010.png b/core/res/res/drawable-hdpi/btn_switch_to_off_mtrl_010.png
deleted file mode 100644
index 1e1a1b0..0000000
--- a/core/res/res/drawable-hdpi/btn_switch_to_off_mtrl_010.png
+++ /dev/null
Binary files differ
diff --git a/core/res/res/drawable-hdpi/btn_switch_to_off_mtrl_011.png b/core/res/res/drawable-hdpi/btn_switch_to_off_mtrl_011.png
deleted file mode 100644
index 1e1a1b0..0000000
--- a/core/res/res/drawable-hdpi/btn_switch_to_off_mtrl_011.png
+++ /dev/null
Binary files differ
diff --git a/core/res/res/drawable-hdpi/btn_switch_to_off_mtrl_012.png b/core/res/res/drawable-hdpi/btn_switch_to_off_mtrl_012.png
deleted file mode 100644
index 1e1a1b0..0000000
--- a/core/res/res/drawable-hdpi/btn_switch_to_off_mtrl_012.png
+++ /dev/null
Binary files differ
diff --git a/core/res/res/drawable-hdpi/btn_switch_to_off_mtrl_013.png b/core/res/res/drawable-hdpi/btn_switch_to_off_mtrl_013.png
deleted file mode 100644
index 1e1a1b0..0000000
--- a/core/res/res/drawable-hdpi/btn_switch_to_off_mtrl_013.png
+++ /dev/null
Binary files differ
diff --git a/core/res/res/drawable-hdpi/btn_switch_to_off_mtrl_014.png b/core/res/res/drawable-hdpi/btn_switch_to_off_mtrl_014.png
deleted file mode 100644
index 1e1a1b0..0000000
--- a/core/res/res/drawable-hdpi/btn_switch_to_off_mtrl_014.png
+++ /dev/null
Binary files differ
diff --git a/core/res/res/drawable-hdpi/btn_switch_to_on_mtrl_000.png b/core/res/res/drawable-hdpi/btn_switch_to_on_mtrl_000.png
deleted file mode 100644
index cf09f97..0000000
--- a/core/res/res/drawable-hdpi/btn_switch_to_on_mtrl_000.png
+++ /dev/null
Binary files differ
diff --git a/core/res/res/drawable-hdpi/btn_switch_to_on_mtrl_00001.9.png b/core/res/res/drawable-hdpi/btn_switch_to_on_mtrl_00001.9.png
new file mode 100644
index 0000000..e870a0a
--- /dev/null
+++ b/core/res/res/drawable-hdpi/btn_switch_to_on_mtrl_00001.9.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/btn_switch_to_on_mtrl_00002.9.png b/core/res/res/drawable-hdpi/btn_switch_to_on_mtrl_00002.9.png
new file mode 100644
index 0000000..1d8f805
--- /dev/null
+++ b/core/res/res/drawable-hdpi/btn_switch_to_on_mtrl_00002.9.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/btn_switch_to_on_mtrl_00003.9.png b/core/res/res/drawable-hdpi/btn_switch_to_on_mtrl_00003.9.png
new file mode 100644
index 0000000..d348871
--- /dev/null
+++ b/core/res/res/drawable-hdpi/btn_switch_to_on_mtrl_00003.9.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/btn_switch_to_on_mtrl_00004.9.png b/core/res/res/drawable-hdpi/btn_switch_to_on_mtrl_00004.9.png
new file mode 100644
index 0000000..941e91e
--- /dev/null
+++ b/core/res/res/drawable-hdpi/btn_switch_to_on_mtrl_00004.9.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/btn_switch_to_on_mtrl_00005.9.png b/core/res/res/drawable-hdpi/btn_switch_to_on_mtrl_00005.9.png
new file mode 100644
index 0000000..adee78d
--- /dev/null
+++ b/core/res/res/drawable-hdpi/btn_switch_to_on_mtrl_00005.9.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/btn_switch_to_on_mtrl_00006.9.png b/core/res/res/drawable-hdpi/btn_switch_to_on_mtrl_00006.9.png
new file mode 100644
index 0000000..e6b4ca3
--- /dev/null
+++ b/core/res/res/drawable-hdpi/btn_switch_to_on_mtrl_00006.9.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/btn_switch_to_on_mtrl_00007.9.png b/core/res/res/drawable-hdpi/btn_switch_to_on_mtrl_00007.9.png
new file mode 100644
index 0000000..6c2bc0d
--- /dev/null
+++ b/core/res/res/drawable-hdpi/btn_switch_to_on_mtrl_00007.9.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/btn_switch_to_on_mtrl_00008.9.png b/core/res/res/drawable-hdpi/btn_switch_to_on_mtrl_00008.9.png
new file mode 100644
index 0000000..763833c
--- /dev/null
+++ b/core/res/res/drawable-hdpi/btn_switch_to_on_mtrl_00008.9.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/btn_switch_to_on_mtrl_00009.9.png b/core/res/res/drawable-hdpi/btn_switch_to_on_mtrl_00009.9.png
new file mode 100644
index 0000000..9a87fbc
--- /dev/null
+++ b/core/res/res/drawable-hdpi/btn_switch_to_on_mtrl_00009.9.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/btn_switch_to_on_mtrl_00010.9.png b/core/res/res/drawable-hdpi/btn_switch_to_on_mtrl_00010.9.png
new file mode 100644
index 0000000..6ccf70b
--- /dev/null
+++ b/core/res/res/drawable-hdpi/btn_switch_to_on_mtrl_00010.9.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/btn_switch_to_on_mtrl_00011.9.png b/core/res/res/drawable-hdpi/btn_switch_to_on_mtrl_00011.9.png
new file mode 100644
index 0000000..d1c14a5
--- /dev/null
+++ b/core/res/res/drawable-hdpi/btn_switch_to_on_mtrl_00011.9.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/btn_switch_to_on_mtrl_00012.9.png b/core/res/res/drawable-hdpi/btn_switch_to_on_mtrl_00012.9.png
new file mode 100644
index 0000000..c2290f0
--- /dev/null
+++ b/core/res/res/drawable-hdpi/btn_switch_to_on_mtrl_00012.9.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/btn_switch_to_on_mtrl_001.png b/core/res/res/drawable-hdpi/btn_switch_to_on_mtrl_001.png
deleted file mode 100644
index 3218e66..0000000
--- a/core/res/res/drawable-hdpi/btn_switch_to_on_mtrl_001.png
+++ /dev/null
Binary files differ
diff --git a/core/res/res/drawable-hdpi/btn_switch_to_on_mtrl_002.png b/core/res/res/drawable-hdpi/btn_switch_to_on_mtrl_002.png
deleted file mode 100644
index 0acff03..0000000
--- a/core/res/res/drawable-hdpi/btn_switch_to_on_mtrl_002.png
+++ /dev/null
Binary files differ
diff --git a/core/res/res/drawable-hdpi/btn_switch_to_on_mtrl_003.png b/core/res/res/drawable-hdpi/btn_switch_to_on_mtrl_003.png
deleted file mode 100644
index c93adf4..0000000
--- a/core/res/res/drawable-hdpi/btn_switch_to_on_mtrl_003.png
+++ /dev/null
Binary files differ
diff --git a/core/res/res/drawable-hdpi/btn_switch_to_on_mtrl_004.png b/core/res/res/drawable-hdpi/btn_switch_to_on_mtrl_004.png
deleted file mode 100644
index 5d8ddc96..0000000
--- a/core/res/res/drawable-hdpi/btn_switch_to_on_mtrl_004.png
+++ /dev/null
Binary files differ
diff --git a/core/res/res/drawable-hdpi/btn_switch_to_on_mtrl_005.png b/core/res/res/drawable-hdpi/btn_switch_to_on_mtrl_005.png
deleted file mode 100644
index 47206a4..0000000
--- a/core/res/res/drawable-hdpi/btn_switch_to_on_mtrl_005.png
+++ /dev/null
Binary files differ
diff --git a/core/res/res/drawable-hdpi/btn_switch_to_on_mtrl_006.png b/core/res/res/drawable-hdpi/btn_switch_to_on_mtrl_006.png
deleted file mode 100644
index 7d6a91f..0000000
--- a/core/res/res/drawable-hdpi/btn_switch_to_on_mtrl_006.png
+++ /dev/null
Binary files differ
diff --git a/core/res/res/drawable-hdpi/btn_switch_to_on_mtrl_007.png b/core/res/res/drawable-hdpi/btn_switch_to_on_mtrl_007.png
deleted file mode 100644
index e062f61..0000000
--- a/core/res/res/drawable-hdpi/btn_switch_to_on_mtrl_007.png
+++ /dev/null
Binary files differ
diff --git a/core/res/res/drawable-hdpi/btn_switch_to_on_mtrl_008.png b/core/res/res/drawable-hdpi/btn_switch_to_on_mtrl_008.png
deleted file mode 100644
index b0f0dde..0000000
--- a/core/res/res/drawable-hdpi/btn_switch_to_on_mtrl_008.png
+++ /dev/null
Binary files differ
diff --git a/core/res/res/drawable-hdpi/btn_switch_to_on_mtrl_009.png b/core/res/res/drawable-hdpi/btn_switch_to_on_mtrl_009.png
deleted file mode 100644
index c54f8d7..0000000
--- a/core/res/res/drawable-hdpi/btn_switch_to_on_mtrl_009.png
+++ /dev/null
Binary files differ
diff --git a/core/res/res/drawable-hdpi/btn_switch_to_on_mtrl_010.png b/core/res/res/drawable-hdpi/btn_switch_to_on_mtrl_010.png
deleted file mode 100644
index c54f8d7..0000000
--- a/core/res/res/drawable-hdpi/btn_switch_to_on_mtrl_010.png
+++ /dev/null
Binary files differ
diff --git a/core/res/res/drawable-hdpi/btn_switch_to_on_mtrl_011.png b/core/res/res/drawable-hdpi/btn_switch_to_on_mtrl_011.png
deleted file mode 100644
index c54f8d7..0000000
--- a/core/res/res/drawable-hdpi/btn_switch_to_on_mtrl_011.png
+++ /dev/null
Binary files differ
diff --git a/core/res/res/drawable-hdpi/btn_switch_to_on_mtrl_012.png b/core/res/res/drawable-hdpi/btn_switch_to_on_mtrl_012.png
deleted file mode 100644
index c54f8d7..0000000
--- a/core/res/res/drawable-hdpi/btn_switch_to_on_mtrl_012.png
+++ /dev/null
Binary files differ
diff --git a/core/res/res/drawable-hdpi/btn_switch_to_on_mtrl_013.png b/core/res/res/drawable-hdpi/btn_switch_to_on_mtrl_013.png
deleted file mode 100644
index c54f8d7..0000000
--- a/core/res/res/drawable-hdpi/btn_switch_to_on_mtrl_013.png
+++ /dev/null
Binary files differ
diff --git a/core/res/res/drawable-hdpi/btn_switch_to_on_mtrl_014.png b/core/res/res/drawable-hdpi/btn_switch_to_on_mtrl_014.png
deleted file mode 100644
index c54f8d7..0000000
--- a/core/res/res/drawable-hdpi/btn_switch_to_on_mtrl_014.png
+++ /dev/null
Binary files differ
diff --git a/core/res/res/drawable-hdpi/ic_corp_icon.png b/core/res/res/drawable-hdpi/ic_corp_icon.png
index fc986fe..829962c 100644
--- a/core/res/res/drawable-hdpi/ic_corp_icon.png
+++ b/core/res/res/drawable-hdpi/ic_corp_icon.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/stat_notify_wifi_in_range.png b/core/res/res/drawable-hdpi/stat_notify_wifi_in_range.png
deleted file mode 100644
index 8148ab8..0000000
--- a/core/res/res/drawable-hdpi/stat_notify_wifi_in_range.png
+++ /dev/null
Binary files differ
diff --git a/core/res/res/drawable-hdpi/stat_sys_tether_wifi.png b/core/res/res/drawable-hdpi/stat_sys_tether_wifi.png
deleted file mode 100644
index 7d4df50..0000000
--- a/core/res/res/drawable-hdpi/stat_sys_tether_wifi.png
+++ /dev/null
Binary files differ
diff --git a/core/res/res/drawable-hdpi/switch_track_mtrl_alpha.9.png b/core/res/res/drawable-hdpi/switch_track_mtrl_alpha.9.png
index ac1fc23..0ebe65e 100644
--- a/core/res/res/drawable-hdpi/switch_track_mtrl_alpha.9.png
+++ b/core/res/res/drawable-hdpi/switch_track_mtrl_alpha.9.png
Binary files differ
diff --git a/core/res/res/drawable-ldpi/stat_notify_wifi_in_range.png b/core/res/res/drawable-ldpi/stat_notify_wifi_in_range.png
deleted file mode 100644
index 1ff50ea..0000000
--- a/core/res/res/drawable-ldpi/stat_notify_wifi_in_range.png
+++ /dev/null
Binary files differ
diff --git a/core/res/res/drawable-ldpi/stat_sys_tether_wifi.png b/core/res/res/drawable-ldpi/stat_sys_tether_wifi.png
deleted file mode 100644
index b4b3cfd..0000000
--- a/core/res/res/drawable-ldpi/stat_sys_tether_wifi.png
+++ /dev/null
Binary files differ
diff --git a/core/res/res/drawable-mdpi/btn_switch_to_off_mtrl_000.png b/core/res/res/drawable-mdpi/btn_switch_to_off_mtrl_000.png
deleted file mode 100644
index 8c3f26c..0000000
--- a/core/res/res/drawable-mdpi/btn_switch_to_off_mtrl_000.png
+++ /dev/null
Binary files differ
diff --git a/core/res/res/drawable-mdpi/btn_switch_to_off_mtrl_00001.9.png b/core/res/res/drawable-mdpi/btn_switch_to_off_mtrl_00001.9.png
new file mode 100644
index 0000000..0238898
--- /dev/null
+++ b/core/res/res/drawable-mdpi/btn_switch_to_off_mtrl_00001.9.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/btn_switch_to_off_mtrl_00002.9.png b/core/res/res/drawable-mdpi/btn_switch_to_off_mtrl_00002.9.png
new file mode 100644
index 0000000..ada1be9
--- /dev/null
+++ b/core/res/res/drawable-mdpi/btn_switch_to_off_mtrl_00002.9.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/btn_switch_to_off_mtrl_00003.9.png b/core/res/res/drawable-mdpi/btn_switch_to_off_mtrl_00003.9.png
new file mode 100644
index 0000000..82aec64
--- /dev/null
+++ b/core/res/res/drawable-mdpi/btn_switch_to_off_mtrl_00003.9.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/btn_switch_to_off_mtrl_00004.9.png b/core/res/res/drawable-mdpi/btn_switch_to_off_mtrl_00004.9.png
new file mode 100644
index 0000000..1c6ea9f
--- /dev/null
+++ b/core/res/res/drawable-mdpi/btn_switch_to_off_mtrl_00004.9.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/btn_switch_to_off_mtrl_00005.9.png b/core/res/res/drawable-mdpi/btn_switch_to_off_mtrl_00005.9.png
new file mode 100644
index 0000000..ac11400
--- /dev/null
+++ b/core/res/res/drawable-mdpi/btn_switch_to_off_mtrl_00005.9.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/btn_switch_to_off_mtrl_00006.9.png b/core/res/res/drawable-mdpi/btn_switch_to_off_mtrl_00006.9.png
new file mode 100644
index 0000000..2025972
--- /dev/null
+++ b/core/res/res/drawable-mdpi/btn_switch_to_off_mtrl_00006.9.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/btn_switch_to_off_mtrl_00007.9.png b/core/res/res/drawable-mdpi/btn_switch_to_off_mtrl_00007.9.png
new file mode 100644
index 0000000..7420fd8
--- /dev/null
+++ b/core/res/res/drawable-mdpi/btn_switch_to_off_mtrl_00007.9.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/btn_switch_to_off_mtrl_00008.9.png b/core/res/res/drawable-mdpi/btn_switch_to_off_mtrl_00008.9.png
new file mode 100644
index 0000000..1f40832
--- /dev/null
+++ b/core/res/res/drawable-mdpi/btn_switch_to_off_mtrl_00008.9.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/btn_switch_to_off_mtrl_00009.9.png b/core/res/res/drawable-mdpi/btn_switch_to_off_mtrl_00009.9.png
new file mode 100644
index 0000000..cf58e44
--- /dev/null
+++ b/core/res/res/drawable-mdpi/btn_switch_to_off_mtrl_00009.9.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/btn_switch_to_off_mtrl_00010.9.png b/core/res/res/drawable-mdpi/btn_switch_to_off_mtrl_00010.9.png
new file mode 100644
index 0000000..930a280
--- /dev/null
+++ b/core/res/res/drawable-mdpi/btn_switch_to_off_mtrl_00010.9.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/btn_switch_to_off_mtrl_00011.9.png b/core/res/res/drawable-mdpi/btn_switch_to_off_mtrl_00011.9.png
new file mode 100644
index 0000000..ed9bc37
--- /dev/null
+++ b/core/res/res/drawable-mdpi/btn_switch_to_off_mtrl_00011.9.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/btn_switch_to_off_mtrl_00012.9.png b/core/res/res/drawable-mdpi/btn_switch_to_off_mtrl_00012.9.png
new file mode 100644
index 0000000..cddb5b0
--- /dev/null
+++ b/core/res/res/drawable-mdpi/btn_switch_to_off_mtrl_00012.9.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/btn_switch_to_off_mtrl_001.png b/core/res/res/drawable-mdpi/btn_switch_to_off_mtrl_001.png
deleted file mode 100644
index 3617168..0000000
--- a/core/res/res/drawable-mdpi/btn_switch_to_off_mtrl_001.png
+++ /dev/null
Binary files differ
diff --git a/core/res/res/drawable-mdpi/btn_switch_to_off_mtrl_002.png b/core/res/res/drawable-mdpi/btn_switch_to_off_mtrl_002.png
deleted file mode 100644
index e4366f4..0000000
--- a/core/res/res/drawable-mdpi/btn_switch_to_off_mtrl_002.png
+++ /dev/null
Binary files differ
diff --git a/core/res/res/drawable-mdpi/btn_switch_to_off_mtrl_003.png b/core/res/res/drawable-mdpi/btn_switch_to_off_mtrl_003.png
deleted file mode 100644
index ea4533b..0000000
--- a/core/res/res/drawable-mdpi/btn_switch_to_off_mtrl_003.png
+++ /dev/null
Binary files differ
diff --git a/core/res/res/drawable-mdpi/btn_switch_to_off_mtrl_004.png b/core/res/res/drawable-mdpi/btn_switch_to_off_mtrl_004.png
deleted file mode 100644
index 94aedbb..0000000
--- a/core/res/res/drawable-mdpi/btn_switch_to_off_mtrl_004.png
+++ /dev/null
Binary files differ
diff --git a/core/res/res/drawable-mdpi/btn_switch_to_off_mtrl_005.png b/core/res/res/drawable-mdpi/btn_switch_to_off_mtrl_005.png
deleted file mode 100644
index ef84578..0000000
--- a/core/res/res/drawable-mdpi/btn_switch_to_off_mtrl_005.png
+++ /dev/null
Binary files differ
diff --git a/core/res/res/drawable-mdpi/btn_switch_to_off_mtrl_006.png b/core/res/res/drawable-mdpi/btn_switch_to_off_mtrl_006.png
deleted file mode 100644
index 4de2321..0000000
--- a/core/res/res/drawable-mdpi/btn_switch_to_off_mtrl_006.png
+++ /dev/null
Binary files differ
diff --git a/core/res/res/drawable-mdpi/btn_switch_to_off_mtrl_007.png b/core/res/res/drawable-mdpi/btn_switch_to_off_mtrl_007.png
deleted file mode 100644
index 4de2321..0000000
--- a/core/res/res/drawable-mdpi/btn_switch_to_off_mtrl_007.png
+++ /dev/null
Binary files differ
diff --git a/core/res/res/drawable-mdpi/btn_switch_to_off_mtrl_008.png b/core/res/res/drawable-mdpi/btn_switch_to_off_mtrl_008.png
deleted file mode 100644
index d62fbd5..0000000
--- a/core/res/res/drawable-mdpi/btn_switch_to_off_mtrl_008.png
+++ /dev/null
Binary files differ
diff --git a/core/res/res/drawable-mdpi/btn_switch_to_off_mtrl_009.png b/core/res/res/drawable-mdpi/btn_switch_to_off_mtrl_009.png
deleted file mode 100644
index 3d87c4e..0000000
--- a/core/res/res/drawable-mdpi/btn_switch_to_off_mtrl_009.png
+++ /dev/null
Binary files differ
diff --git a/core/res/res/drawable-mdpi/btn_switch_to_off_mtrl_010.png b/core/res/res/drawable-mdpi/btn_switch_to_off_mtrl_010.png
deleted file mode 100644
index 536ed46..0000000
--- a/core/res/res/drawable-mdpi/btn_switch_to_off_mtrl_010.png
+++ /dev/null
Binary files differ
diff --git a/core/res/res/drawable-mdpi/btn_switch_to_off_mtrl_011.png b/core/res/res/drawable-mdpi/btn_switch_to_off_mtrl_011.png
deleted file mode 100644
index 536ed46..0000000
--- a/core/res/res/drawable-mdpi/btn_switch_to_off_mtrl_011.png
+++ /dev/null
Binary files differ
diff --git a/core/res/res/drawable-mdpi/btn_switch_to_off_mtrl_012.png b/core/res/res/drawable-mdpi/btn_switch_to_off_mtrl_012.png
deleted file mode 100644
index 536ed46..0000000
--- a/core/res/res/drawable-mdpi/btn_switch_to_off_mtrl_012.png
+++ /dev/null
Binary files differ
diff --git a/core/res/res/drawable-mdpi/btn_switch_to_off_mtrl_013.png b/core/res/res/drawable-mdpi/btn_switch_to_off_mtrl_013.png
deleted file mode 100644
index 536ed46..0000000
--- a/core/res/res/drawable-mdpi/btn_switch_to_off_mtrl_013.png
+++ /dev/null
Binary files differ
diff --git a/core/res/res/drawable-mdpi/btn_switch_to_off_mtrl_014.png b/core/res/res/drawable-mdpi/btn_switch_to_off_mtrl_014.png
deleted file mode 100644
index 536ed46..0000000
--- a/core/res/res/drawable-mdpi/btn_switch_to_off_mtrl_014.png
+++ /dev/null
Binary files differ
diff --git a/core/res/res/drawable-mdpi/btn_switch_to_on_mtrl_000.png b/core/res/res/drawable-mdpi/btn_switch_to_on_mtrl_000.png
deleted file mode 100644
index f5b660d..0000000
--- a/core/res/res/drawable-mdpi/btn_switch_to_on_mtrl_000.png
+++ /dev/null
Binary files differ
diff --git a/core/res/res/drawable-mdpi/btn_switch_to_on_mtrl_00001.9.png b/core/res/res/drawable-mdpi/btn_switch_to_on_mtrl_00001.9.png
new file mode 100644
index 0000000..bc1f979
--- /dev/null
+++ b/core/res/res/drawable-mdpi/btn_switch_to_on_mtrl_00001.9.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/btn_switch_to_on_mtrl_00002.9.png b/core/res/res/drawable-mdpi/btn_switch_to_on_mtrl_00002.9.png
new file mode 100644
index 0000000..e6fdbcc
--- /dev/null
+++ b/core/res/res/drawable-mdpi/btn_switch_to_on_mtrl_00002.9.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/btn_switch_to_on_mtrl_00003.9.png b/core/res/res/drawable-mdpi/btn_switch_to_on_mtrl_00003.9.png
new file mode 100644
index 0000000..3d60b43
--- /dev/null
+++ b/core/res/res/drawable-mdpi/btn_switch_to_on_mtrl_00003.9.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/btn_switch_to_on_mtrl_00004.9.png b/core/res/res/drawable-mdpi/btn_switch_to_on_mtrl_00004.9.png
new file mode 100644
index 0000000..b9afdc2
--- /dev/null
+++ b/core/res/res/drawable-mdpi/btn_switch_to_on_mtrl_00004.9.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/btn_switch_to_on_mtrl_00005.9.png b/core/res/res/drawable-mdpi/btn_switch_to_on_mtrl_00005.9.png
new file mode 100644
index 0000000..c3c8bf2
--- /dev/null
+++ b/core/res/res/drawable-mdpi/btn_switch_to_on_mtrl_00005.9.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/btn_switch_to_on_mtrl_00006.9.png b/core/res/res/drawable-mdpi/btn_switch_to_on_mtrl_00006.9.png
new file mode 100644
index 0000000..1c7e5e1
--- /dev/null
+++ b/core/res/res/drawable-mdpi/btn_switch_to_on_mtrl_00006.9.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/btn_switch_to_on_mtrl_00007.9.png b/core/res/res/drawable-mdpi/btn_switch_to_on_mtrl_00007.9.png
new file mode 100644
index 0000000..6329b73
--- /dev/null
+++ b/core/res/res/drawable-mdpi/btn_switch_to_on_mtrl_00007.9.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/btn_switch_to_on_mtrl_00008.9.png b/core/res/res/drawable-mdpi/btn_switch_to_on_mtrl_00008.9.png
new file mode 100644
index 0000000..424202c
--- /dev/null
+++ b/core/res/res/drawable-mdpi/btn_switch_to_on_mtrl_00008.9.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/btn_switch_to_on_mtrl_00009.9.png b/core/res/res/drawable-mdpi/btn_switch_to_on_mtrl_00009.9.png
new file mode 100644
index 0000000..313beca
--- /dev/null
+++ b/core/res/res/drawable-mdpi/btn_switch_to_on_mtrl_00009.9.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/btn_switch_to_on_mtrl_00010.9.png b/core/res/res/drawable-mdpi/btn_switch_to_on_mtrl_00010.9.png
new file mode 100644
index 0000000..f18d86a
--- /dev/null
+++ b/core/res/res/drawable-mdpi/btn_switch_to_on_mtrl_00010.9.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/btn_switch_to_on_mtrl_00011.9.png b/core/res/res/drawable-mdpi/btn_switch_to_on_mtrl_00011.9.png
new file mode 100644
index 0000000..8ab48c0
--- /dev/null
+++ b/core/res/res/drawable-mdpi/btn_switch_to_on_mtrl_00011.9.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/btn_switch_to_on_mtrl_00012.9.png b/core/res/res/drawable-mdpi/btn_switch_to_on_mtrl_00012.9.png
new file mode 100644
index 0000000..fbc2c16
--- /dev/null
+++ b/core/res/res/drawable-mdpi/btn_switch_to_on_mtrl_00012.9.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/btn_switch_to_on_mtrl_001.png b/core/res/res/drawable-mdpi/btn_switch_to_on_mtrl_001.png
deleted file mode 100644
index 9e4db6c..0000000
--- a/core/res/res/drawable-mdpi/btn_switch_to_on_mtrl_001.png
+++ /dev/null
Binary files differ
diff --git a/core/res/res/drawable-mdpi/btn_switch_to_on_mtrl_002.png b/core/res/res/drawable-mdpi/btn_switch_to_on_mtrl_002.png
deleted file mode 100644
index 7de2128..0000000
--- a/core/res/res/drawable-mdpi/btn_switch_to_on_mtrl_002.png
+++ /dev/null
Binary files differ
diff --git a/core/res/res/drawable-mdpi/btn_switch_to_on_mtrl_003.png b/core/res/res/drawable-mdpi/btn_switch_to_on_mtrl_003.png
deleted file mode 100644
index 1980c2c..0000000
--- a/core/res/res/drawable-mdpi/btn_switch_to_on_mtrl_003.png
+++ /dev/null
Binary files differ
diff --git a/core/res/res/drawable-mdpi/btn_switch_to_on_mtrl_004.png b/core/res/res/drawable-mdpi/btn_switch_to_on_mtrl_004.png
deleted file mode 100644
index 6e73ef0..0000000
--- a/core/res/res/drawable-mdpi/btn_switch_to_on_mtrl_004.png
+++ /dev/null
Binary files differ
diff --git a/core/res/res/drawable-mdpi/btn_switch_to_on_mtrl_005.png b/core/res/res/drawable-mdpi/btn_switch_to_on_mtrl_005.png
deleted file mode 100644
index f8973928..0000000
--- a/core/res/res/drawable-mdpi/btn_switch_to_on_mtrl_005.png
+++ /dev/null
Binary files differ
diff --git a/core/res/res/drawable-mdpi/btn_switch_to_on_mtrl_006.png b/core/res/res/drawable-mdpi/btn_switch_to_on_mtrl_006.png
deleted file mode 100644
index 74a6ebd..0000000
--- a/core/res/res/drawable-mdpi/btn_switch_to_on_mtrl_006.png
+++ /dev/null
Binary files differ
diff --git a/core/res/res/drawable-mdpi/btn_switch_to_on_mtrl_007.png b/core/res/res/drawable-mdpi/btn_switch_to_on_mtrl_007.png
deleted file mode 100644
index 3617168..0000000
--- a/core/res/res/drawable-mdpi/btn_switch_to_on_mtrl_007.png
+++ /dev/null
Binary files differ
diff --git a/core/res/res/drawable-mdpi/btn_switch_to_on_mtrl_008.png b/core/res/res/drawable-mdpi/btn_switch_to_on_mtrl_008.png
deleted file mode 100644
index 884eb66..0000000
--- a/core/res/res/drawable-mdpi/btn_switch_to_on_mtrl_008.png
+++ /dev/null
Binary files differ
diff --git a/core/res/res/drawable-mdpi/btn_switch_to_on_mtrl_009.png b/core/res/res/drawable-mdpi/btn_switch_to_on_mtrl_009.png
deleted file mode 100644
index 8c3f26c..0000000
--- a/core/res/res/drawable-mdpi/btn_switch_to_on_mtrl_009.png
+++ /dev/null
Binary files differ
diff --git a/core/res/res/drawable-mdpi/btn_switch_to_on_mtrl_010.png b/core/res/res/drawable-mdpi/btn_switch_to_on_mtrl_010.png
deleted file mode 100644
index 8c3f26c..0000000
--- a/core/res/res/drawable-mdpi/btn_switch_to_on_mtrl_010.png
+++ /dev/null
Binary files differ
diff --git a/core/res/res/drawable-mdpi/btn_switch_to_on_mtrl_011.png b/core/res/res/drawable-mdpi/btn_switch_to_on_mtrl_011.png
deleted file mode 100644
index 8c3f26c..0000000
--- a/core/res/res/drawable-mdpi/btn_switch_to_on_mtrl_011.png
+++ /dev/null
Binary files differ
diff --git a/core/res/res/drawable-mdpi/btn_switch_to_on_mtrl_012.png b/core/res/res/drawable-mdpi/btn_switch_to_on_mtrl_012.png
deleted file mode 100644
index 8c3f26c..0000000
--- a/core/res/res/drawable-mdpi/btn_switch_to_on_mtrl_012.png
+++ /dev/null
Binary files differ
diff --git a/core/res/res/drawable-mdpi/btn_switch_to_on_mtrl_013.png b/core/res/res/drawable-mdpi/btn_switch_to_on_mtrl_013.png
deleted file mode 100644
index 8c3f26c..0000000
--- a/core/res/res/drawable-mdpi/btn_switch_to_on_mtrl_013.png
+++ /dev/null
Binary files differ
diff --git a/core/res/res/drawable-mdpi/btn_switch_to_on_mtrl_014.png b/core/res/res/drawable-mdpi/btn_switch_to_on_mtrl_014.png
deleted file mode 100644
index 8c3f26c..0000000
--- a/core/res/res/drawable-mdpi/btn_switch_to_on_mtrl_014.png
+++ /dev/null
Binary files differ
diff --git a/core/res/res/drawable-mdpi/ic_corp_icon.png b/core/res/res/drawable-mdpi/ic_corp_icon.png
index deb7966..44eb2d5 100644
--- a/core/res/res/drawable-mdpi/ic_corp_icon.png
+++ b/core/res/res/drawable-mdpi/ic_corp_icon.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/stat_notify_wifi_in_range.png b/core/res/res/drawable-mdpi/stat_notify_wifi_in_range.png
deleted file mode 100644
index b7e2a6a..0000000
--- a/core/res/res/drawable-mdpi/stat_notify_wifi_in_range.png
+++ /dev/null
Binary files differ
diff --git a/core/res/res/drawable-mdpi/stat_sys_tether_wifi.png b/core/res/res/drawable-mdpi/stat_sys_tether_wifi.png
deleted file mode 100644
index 869ad35..0000000
--- a/core/res/res/drawable-mdpi/stat_sys_tether_wifi.png
+++ /dev/null
Binary files differ
diff --git a/core/res/res/drawable-mdpi/switch_track_mtrl_alpha.9.png b/core/res/res/drawable-mdpi/switch_track_mtrl_alpha.9.png
index b6538e4..4918d33 100644
--- a/core/res/res/drawable-mdpi/switch_track_mtrl_alpha.9.png
+++ b/core/res/res/drawable-mdpi/switch_track_mtrl_alpha.9.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/btn_switch_to_off_mtrl_000.png b/core/res/res/drawable-xhdpi/btn_switch_to_off_mtrl_000.png
deleted file mode 100644
index 2494fd4..0000000
--- a/core/res/res/drawable-xhdpi/btn_switch_to_off_mtrl_000.png
+++ /dev/null
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/btn_switch_to_off_mtrl_00001.9.png b/core/res/res/drawable-xhdpi/btn_switch_to_off_mtrl_00001.9.png
new file mode 100644
index 0000000..265aeb7
--- /dev/null
+++ b/core/res/res/drawable-xhdpi/btn_switch_to_off_mtrl_00001.9.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/btn_switch_to_off_mtrl_00002.9.png b/core/res/res/drawable-xhdpi/btn_switch_to_off_mtrl_00002.9.png
new file mode 100644
index 0000000..2f036ad
--- /dev/null
+++ b/core/res/res/drawable-xhdpi/btn_switch_to_off_mtrl_00002.9.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/btn_switch_to_off_mtrl_00003.9.png b/core/res/res/drawable-xhdpi/btn_switch_to_off_mtrl_00003.9.png
new file mode 100644
index 0000000..bb26440
--- /dev/null
+++ b/core/res/res/drawable-xhdpi/btn_switch_to_off_mtrl_00003.9.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/btn_switch_to_off_mtrl_00004.9.png b/core/res/res/drawable-xhdpi/btn_switch_to_off_mtrl_00004.9.png
new file mode 100644
index 0000000..1b70047
--- /dev/null
+++ b/core/res/res/drawable-xhdpi/btn_switch_to_off_mtrl_00004.9.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/btn_switch_to_off_mtrl_00005.9.png b/core/res/res/drawable-xhdpi/btn_switch_to_off_mtrl_00005.9.png
new file mode 100644
index 0000000..b544b98
--- /dev/null
+++ b/core/res/res/drawable-xhdpi/btn_switch_to_off_mtrl_00005.9.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/btn_switch_to_off_mtrl_00006.9.png b/core/res/res/drawable-xhdpi/btn_switch_to_off_mtrl_00006.9.png
new file mode 100644
index 0000000..c461f3d
--- /dev/null
+++ b/core/res/res/drawable-xhdpi/btn_switch_to_off_mtrl_00006.9.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/btn_switch_to_off_mtrl_00007.9.png b/core/res/res/drawable-xhdpi/btn_switch_to_off_mtrl_00007.9.png
new file mode 100644
index 0000000..f57da14
--- /dev/null
+++ b/core/res/res/drawable-xhdpi/btn_switch_to_off_mtrl_00007.9.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/btn_switch_to_off_mtrl_00008.9.png b/core/res/res/drawable-xhdpi/btn_switch_to_off_mtrl_00008.9.png
new file mode 100644
index 0000000..22c6fbc
--- /dev/null
+++ b/core/res/res/drawable-xhdpi/btn_switch_to_off_mtrl_00008.9.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/btn_switch_to_off_mtrl_00009.9.png b/core/res/res/drawable-xhdpi/btn_switch_to_off_mtrl_00009.9.png
new file mode 100644
index 0000000..cd21ac9
--- /dev/null
+++ b/core/res/res/drawable-xhdpi/btn_switch_to_off_mtrl_00009.9.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/btn_switch_to_off_mtrl_00010.9.png b/core/res/res/drawable-xhdpi/btn_switch_to_off_mtrl_00010.9.png
new file mode 100644
index 0000000..a38dc87
--- /dev/null
+++ b/core/res/res/drawable-xhdpi/btn_switch_to_off_mtrl_00010.9.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/btn_switch_to_off_mtrl_00011.9.png b/core/res/res/drawable-xhdpi/btn_switch_to_off_mtrl_00011.9.png
new file mode 100644
index 0000000..d84a342
--- /dev/null
+++ b/core/res/res/drawable-xhdpi/btn_switch_to_off_mtrl_00011.9.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/btn_switch_to_off_mtrl_00012.9.png b/core/res/res/drawable-xhdpi/btn_switch_to_off_mtrl_00012.9.png
new file mode 100644
index 0000000..b82a2eb
--- /dev/null
+++ b/core/res/res/drawable-xhdpi/btn_switch_to_off_mtrl_00012.9.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/btn_switch_to_off_mtrl_001.png b/core/res/res/drawable-xhdpi/btn_switch_to_off_mtrl_001.png
deleted file mode 100644
index 7bd99fe..0000000
--- a/core/res/res/drawable-xhdpi/btn_switch_to_off_mtrl_001.png
+++ /dev/null
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/btn_switch_to_off_mtrl_002.png b/core/res/res/drawable-xhdpi/btn_switch_to_off_mtrl_002.png
deleted file mode 100644
index 2ef623b..0000000
--- a/core/res/res/drawable-xhdpi/btn_switch_to_off_mtrl_002.png
+++ /dev/null
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/btn_switch_to_off_mtrl_003.png b/core/res/res/drawable-xhdpi/btn_switch_to_off_mtrl_003.png
deleted file mode 100644
index 19db3e0..0000000
--- a/core/res/res/drawable-xhdpi/btn_switch_to_off_mtrl_003.png
+++ /dev/null
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/btn_switch_to_off_mtrl_004.png b/core/res/res/drawable-xhdpi/btn_switch_to_off_mtrl_004.png
deleted file mode 100644
index 984c3c5..0000000
--- a/core/res/res/drawable-xhdpi/btn_switch_to_off_mtrl_004.png
+++ /dev/null
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/btn_switch_to_off_mtrl_005.png b/core/res/res/drawable-xhdpi/btn_switch_to_off_mtrl_005.png
deleted file mode 100644
index 6454190..0000000
--- a/core/res/res/drawable-xhdpi/btn_switch_to_off_mtrl_005.png
+++ /dev/null
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/btn_switch_to_off_mtrl_006.png b/core/res/res/drawable-xhdpi/btn_switch_to_off_mtrl_006.png
deleted file mode 100644
index cee9393..0000000
--- a/core/res/res/drawable-xhdpi/btn_switch_to_off_mtrl_006.png
+++ /dev/null
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/btn_switch_to_off_mtrl_007.png b/core/res/res/drawable-xhdpi/btn_switch_to_off_mtrl_007.png
deleted file mode 100644
index cee9393..0000000
--- a/core/res/res/drawable-xhdpi/btn_switch_to_off_mtrl_007.png
+++ /dev/null
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/btn_switch_to_off_mtrl_008.png b/core/res/res/drawable-xhdpi/btn_switch_to_off_mtrl_008.png
deleted file mode 100644
index 437ffdd..0000000
--- a/core/res/res/drawable-xhdpi/btn_switch_to_off_mtrl_008.png
+++ /dev/null
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/btn_switch_to_off_mtrl_009.png b/core/res/res/drawable-xhdpi/btn_switch_to_off_mtrl_009.png
deleted file mode 100644
index d2e14ad..0000000
--- a/core/res/res/drawable-xhdpi/btn_switch_to_off_mtrl_009.png
+++ /dev/null
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/btn_switch_to_off_mtrl_010.png b/core/res/res/drawable-xhdpi/btn_switch_to_off_mtrl_010.png
deleted file mode 100644
index 4e2f5bc..0000000
--- a/core/res/res/drawable-xhdpi/btn_switch_to_off_mtrl_010.png
+++ /dev/null
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/btn_switch_to_off_mtrl_011.png b/core/res/res/drawable-xhdpi/btn_switch_to_off_mtrl_011.png
deleted file mode 100644
index 4e2f5bc..0000000
--- a/core/res/res/drawable-xhdpi/btn_switch_to_off_mtrl_011.png
+++ /dev/null
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/btn_switch_to_off_mtrl_012.png b/core/res/res/drawable-xhdpi/btn_switch_to_off_mtrl_012.png
deleted file mode 100644
index 4e2f5bc..0000000
--- a/core/res/res/drawable-xhdpi/btn_switch_to_off_mtrl_012.png
+++ /dev/null
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/btn_switch_to_off_mtrl_013.png b/core/res/res/drawable-xhdpi/btn_switch_to_off_mtrl_013.png
deleted file mode 100644
index 4e2f5bc..0000000
--- a/core/res/res/drawable-xhdpi/btn_switch_to_off_mtrl_013.png
+++ /dev/null
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/btn_switch_to_off_mtrl_014.png b/core/res/res/drawable-xhdpi/btn_switch_to_off_mtrl_014.png
deleted file mode 100644
index 4e2f5bc..0000000
--- a/core/res/res/drawable-xhdpi/btn_switch_to_off_mtrl_014.png
+++ /dev/null
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/btn_switch_to_on_mtrl_000.png b/core/res/res/drawable-xhdpi/btn_switch_to_on_mtrl_000.png
deleted file mode 100644
index f1bcfa3..0000000
--- a/core/res/res/drawable-xhdpi/btn_switch_to_on_mtrl_000.png
+++ /dev/null
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/btn_switch_to_on_mtrl_00001.9.png b/core/res/res/drawable-xhdpi/btn_switch_to_on_mtrl_00001.9.png
new file mode 100644
index 0000000..6a33ebf
--- /dev/null
+++ b/core/res/res/drawable-xhdpi/btn_switch_to_on_mtrl_00001.9.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/btn_switch_to_on_mtrl_00002.9.png b/core/res/res/drawable-xhdpi/btn_switch_to_on_mtrl_00002.9.png
new file mode 100644
index 0000000..dafc250
--- /dev/null
+++ b/core/res/res/drawable-xhdpi/btn_switch_to_on_mtrl_00002.9.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/btn_switch_to_on_mtrl_00003.9.png b/core/res/res/drawable-xhdpi/btn_switch_to_on_mtrl_00003.9.png
new file mode 100644
index 0000000..27df6ff
--- /dev/null
+++ b/core/res/res/drawable-xhdpi/btn_switch_to_on_mtrl_00003.9.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/btn_switch_to_on_mtrl_00004.9.png b/core/res/res/drawable-xhdpi/btn_switch_to_on_mtrl_00004.9.png
new file mode 100644
index 0000000..cb4121c
--- /dev/null
+++ b/core/res/res/drawable-xhdpi/btn_switch_to_on_mtrl_00004.9.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/btn_switch_to_on_mtrl_00005.9.png b/core/res/res/drawable-xhdpi/btn_switch_to_on_mtrl_00005.9.png
new file mode 100644
index 0000000..c5cbb75
--- /dev/null
+++ b/core/res/res/drawable-xhdpi/btn_switch_to_on_mtrl_00005.9.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/btn_switch_to_on_mtrl_00006.9.png b/core/res/res/drawable-xhdpi/btn_switch_to_on_mtrl_00006.9.png
new file mode 100644
index 0000000..c69ef41
--- /dev/null
+++ b/core/res/res/drawable-xhdpi/btn_switch_to_on_mtrl_00006.9.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/btn_switch_to_on_mtrl_00007.9.png b/core/res/res/drawable-xhdpi/btn_switch_to_on_mtrl_00007.9.png
new file mode 100644
index 0000000..aff03d1
--- /dev/null
+++ b/core/res/res/drawable-xhdpi/btn_switch_to_on_mtrl_00007.9.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/btn_switch_to_on_mtrl_00008.9.png b/core/res/res/drawable-xhdpi/btn_switch_to_on_mtrl_00008.9.png
new file mode 100644
index 0000000..fb56ae6
--- /dev/null
+++ b/core/res/res/drawable-xhdpi/btn_switch_to_on_mtrl_00008.9.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/btn_switch_to_on_mtrl_00009.9.png b/core/res/res/drawable-xhdpi/btn_switch_to_on_mtrl_00009.9.png
new file mode 100644
index 0000000..88b9d28
--- /dev/null
+++ b/core/res/res/drawable-xhdpi/btn_switch_to_on_mtrl_00009.9.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/btn_switch_to_on_mtrl_00010.9.png b/core/res/res/drawable-xhdpi/btn_switch_to_on_mtrl_00010.9.png
new file mode 100644
index 0000000..8451958
--- /dev/null
+++ b/core/res/res/drawable-xhdpi/btn_switch_to_on_mtrl_00010.9.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/btn_switch_to_on_mtrl_00011.9.png b/core/res/res/drawable-xhdpi/btn_switch_to_on_mtrl_00011.9.png
new file mode 100644
index 0000000..6f57654
--- /dev/null
+++ b/core/res/res/drawable-xhdpi/btn_switch_to_on_mtrl_00011.9.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/btn_switch_to_on_mtrl_00012.9.png b/core/res/res/drawable-xhdpi/btn_switch_to_on_mtrl_00012.9.png
new file mode 100644
index 0000000..21bfc28
--- /dev/null
+++ b/core/res/res/drawable-xhdpi/btn_switch_to_on_mtrl_00012.9.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/btn_switch_to_on_mtrl_001.png b/core/res/res/drawable-xhdpi/btn_switch_to_on_mtrl_001.png
deleted file mode 100644
index ede2fec..0000000
--- a/core/res/res/drawable-xhdpi/btn_switch_to_on_mtrl_001.png
+++ /dev/null
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/btn_switch_to_on_mtrl_002.png b/core/res/res/drawable-xhdpi/btn_switch_to_on_mtrl_002.png
deleted file mode 100644
index 94ce017..0000000
--- a/core/res/res/drawable-xhdpi/btn_switch_to_on_mtrl_002.png
+++ /dev/null
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/btn_switch_to_on_mtrl_003.png b/core/res/res/drawable-xhdpi/btn_switch_to_on_mtrl_003.png
deleted file mode 100644
index 647cfe3..0000000
--- a/core/res/res/drawable-xhdpi/btn_switch_to_on_mtrl_003.png
+++ /dev/null
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/btn_switch_to_on_mtrl_004.png b/core/res/res/drawable-xhdpi/btn_switch_to_on_mtrl_004.png
deleted file mode 100644
index b3bf923..0000000
--- a/core/res/res/drawable-xhdpi/btn_switch_to_on_mtrl_004.png
+++ /dev/null
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/btn_switch_to_on_mtrl_005.png b/core/res/res/drawable-xhdpi/btn_switch_to_on_mtrl_005.png
deleted file mode 100644
index ae95b2b..0000000
--- a/core/res/res/drawable-xhdpi/btn_switch_to_on_mtrl_005.png
+++ /dev/null
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/btn_switch_to_on_mtrl_006.png b/core/res/res/drawable-xhdpi/btn_switch_to_on_mtrl_006.png
deleted file mode 100644
index b8e4bd6..0000000
--- a/core/res/res/drawable-xhdpi/btn_switch_to_on_mtrl_006.png
+++ /dev/null
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/btn_switch_to_on_mtrl_007.png b/core/res/res/drawable-xhdpi/btn_switch_to_on_mtrl_007.png
deleted file mode 100644
index ec6d6d7..0000000
--- a/core/res/res/drawable-xhdpi/btn_switch_to_on_mtrl_007.png
+++ /dev/null
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/btn_switch_to_on_mtrl_008.png b/core/res/res/drawable-xhdpi/btn_switch_to_on_mtrl_008.png
deleted file mode 100644
index c0e493f..0000000
--- a/core/res/res/drawable-xhdpi/btn_switch_to_on_mtrl_008.png
+++ /dev/null
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/btn_switch_to_on_mtrl_009.png b/core/res/res/drawable-xhdpi/btn_switch_to_on_mtrl_009.png
deleted file mode 100644
index 2494fd4..0000000
--- a/core/res/res/drawable-xhdpi/btn_switch_to_on_mtrl_009.png
+++ /dev/null
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/btn_switch_to_on_mtrl_010.png b/core/res/res/drawable-xhdpi/btn_switch_to_on_mtrl_010.png
deleted file mode 100644
index 2494fd4..0000000
--- a/core/res/res/drawable-xhdpi/btn_switch_to_on_mtrl_010.png
+++ /dev/null
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/btn_switch_to_on_mtrl_011.png b/core/res/res/drawable-xhdpi/btn_switch_to_on_mtrl_011.png
deleted file mode 100644
index 2494fd4..0000000
--- a/core/res/res/drawable-xhdpi/btn_switch_to_on_mtrl_011.png
+++ /dev/null
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/btn_switch_to_on_mtrl_012.png b/core/res/res/drawable-xhdpi/btn_switch_to_on_mtrl_012.png
deleted file mode 100644
index 2494fd4..0000000
--- a/core/res/res/drawable-xhdpi/btn_switch_to_on_mtrl_012.png
+++ /dev/null
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/btn_switch_to_on_mtrl_013.png b/core/res/res/drawable-xhdpi/btn_switch_to_on_mtrl_013.png
deleted file mode 100644
index 2494fd4..0000000
--- a/core/res/res/drawable-xhdpi/btn_switch_to_on_mtrl_013.png
+++ /dev/null
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/btn_switch_to_on_mtrl_014.png b/core/res/res/drawable-xhdpi/btn_switch_to_on_mtrl_014.png
deleted file mode 100644
index 2494fd4..0000000
--- a/core/res/res/drawable-xhdpi/btn_switch_to_on_mtrl_014.png
+++ /dev/null
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/ic_corp_icon.png b/core/res/res/drawable-xhdpi/ic_corp_icon.png
index ec4f44b..04faf00 100644
--- a/core/res/res/drawable-xhdpi/ic_corp_icon.png
+++ b/core/res/res/drawable-xhdpi/ic_corp_icon.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/stat_notify_wifi_in_range.png b/core/res/res/drawable-xhdpi/stat_notify_wifi_in_range.png
deleted file mode 100644
index 0dbae57..0000000
--- a/core/res/res/drawable-xhdpi/stat_notify_wifi_in_range.png
+++ /dev/null
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/stat_sys_tether_wifi.png b/core/res/res/drawable-xhdpi/stat_sys_tether_wifi.png
deleted file mode 100644
index dc48646..0000000
--- a/core/res/res/drawable-xhdpi/stat_sys_tether_wifi.png
+++ /dev/null
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/switch_track_mtrl_alpha.9.png b/core/res/res/drawable-xhdpi/switch_track_mtrl_alpha.9.png
index d6a0ab2..fd47f15 100644
--- a/core/res/res/drawable-xhdpi/switch_track_mtrl_alpha.9.png
+++ b/core/res/res/drawable-xhdpi/switch_track_mtrl_alpha.9.png
Binary files differ
diff --git a/core/res/res/drawable-xxhdpi/btn_switch_to_off_mtrl_000.png b/core/res/res/drawable-xxhdpi/btn_switch_to_off_mtrl_000.png
deleted file mode 100644
index 198ac07..0000000
--- a/core/res/res/drawable-xxhdpi/btn_switch_to_off_mtrl_000.png
+++ /dev/null
Binary files differ
diff --git a/core/res/res/drawable-xxhdpi/btn_switch_to_off_mtrl_00001.9.png b/core/res/res/drawable-xxhdpi/btn_switch_to_off_mtrl_00001.9.png
new file mode 100644
index 0000000..c30cb5a
--- /dev/null
+++ b/core/res/res/drawable-xxhdpi/btn_switch_to_off_mtrl_00001.9.png
Binary files differ
diff --git a/core/res/res/drawable-xxhdpi/btn_switch_to_off_mtrl_00002.9.png b/core/res/res/drawable-xxhdpi/btn_switch_to_off_mtrl_00002.9.png
new file mode 100644
index 0000000..eaba558
--- /dev/null
+++ b/core/res/res/drawable-xxhdpi/btn_switch_to_off_mtrl_00002.9.png
Binary files differ
diff --git a/core/res/res/drawable-xxhdpi/btn_switch_to_off_mtrl_00003.9.png b/core/res/res/drawable-xxhdpi/btn_switch_to_off_mtrl_00003.9.png
new file mode 100644
index 0000000..17c18c9
--- /dev/null
+++ b/core/res/res/drawable-xxhdpi/btn_switch_to_off_mtrl_00003.9.png
Binary files differ
diff --git a/core/res/res/drawable-xxhdpi/btn_switch_to_off_mtrl_00004.9.png b/core/res/res/drawable-xxhdpi/btn_switch_to_off_mtrl_00004.9.png
new file mode 100644
index 0000000..0fce07a
--- /dev/null
+++ b/core/res/res/drawable-xxhdpi/btn_switch_to_off_mtrl_00004.9.png
Binary files differ
diff --git a/core/res/res/drawable-xxhdpi/btn_switch_to_off_mtrl_00005.9.png b/core/res/res/drawable-xxhdpi/btn_switch_to_off_mtrl_00005.9.png
new file mode 100644
index 0000000..c29b837
--- /dev/null
+++ b/core/res/res/drawable-xxhdpi/btn_switch_to_off_mtrl_00005.9.png
Binary files differ
diff --git a/core/res/res/drawable-xxhdpi/btn_switch_to_off_mtrl_00006.9.png b/core/res/res/drawable-xxhdpi/btn_switch_to_off_mtrl_00006.9.png
new file mode 100644
index 0000000..ae56a41
--- /dev/null
+++ b/core/res/res/drawable-xxhdpi/btn_switch_to_off_mtrl_00006.9.png
Binary files differ
diff --git a/core/res/res/drawable-xxhdpi/btn_switch_to_off_mtrl_00007.9.png b/core/res/res/drawable-xxhdpi/btn_switch_to_off_mtrl_00007.9.png
new file mode 100644
index 0000000..85290ac
--- /dev/null
+++ b/core/res/res/drawable-xxhdpi/btn_switch_to_off_mtrl_00007.9.png
Binary files differ
diff --git a/core/res/res/drawable-xxhdpi/btn_switch_to_off_mtrl_00008.9.png b/core/res/res/drawable-xxhdpi/btn_switch_to_off_mtrl_00008.9.png
new file mode 100644
index 0000000..1e8513b
--- /dev/null
+++ b/core/res/res/drawable-xxhdpi/btn_switch_to_off_mtrl_00008.9.png
Binary files differ
diff --git a/core/res/res/drawable-xxhdpi/btn_switch_to_off_mtrl_00009.9.png b/core/res/res/drawable-xxhdpi/btn_switch_to_off_mtrl_00009.9.png
new file mode 100644
index 0000000..8810a12
--- /dev/null
+++ b/core/res/res/drawable-xxhdpi/btn_switch_to_off_mtrl_00009.9.png
Binary files differ
diff --git a/core/res/res/drawable-xxhdpi/btn_switch_to_off_mtrl_00010.9.png b/core/res/res/drawable-xxhdpi/btn_switch_to_off_mtrl_00010.9.png
new file mode 100644
index 0000000..717207f
--- /dev/null
+++ b/core/res/res/drawable-xxhdpi/btn_switch_to_off_mtrl_00010.9.png
Binary files differ
diff --git a/core/res/res/drawable-xxhdpi/btn_switch_to_off_mtrl_00011.9.png b/core/res/res/drawable-xxhdpi/btn_switch_to_off_mtrl_00011.9.png
new file mode 100644
index 0000000..db046f3
--- /dev/null
+++ b/core/res/res/drawable-xxhdpi/btn_switch_to_off_mtrl_00011.9.png
Binary files differ
diff --git a/core/res/res/drawable-xxhdpi/btn_switch_to_off_mtrl_00012.9.png b/core/res/res/drawable-xxhdpi/btn_switch_to_off_mtrl_00012.9.png
new file mode 100644
index 0000000..c5c07a4
--- /dev/null
+++ b/core/res/res/drawable-xxhdpi/btn_switch_to_off_mtrl_00012.9.png
Binary files differ
diff --git a/core/res/res/drawable-xxhdpi/btn_switch_to_off_mtrl_001.png b/core/res/res/drawable-xxhdpi/btn_switch_to_off_mtrl_001.png
deleted file mode 100644
index eff3dd0..0000000
--- a/core/res/res/drawable-xxhdpi/btn_switch_to_off_mtrl_001.png
+++ /dev/null
Binary files differ
diff --git a/core/res/res/drawable-xxhdpi/btn_switch_to_off_mtrl_002.png b/core/res/res/drawable-xxhdpi/btn_switch_to_off_mtrl_002.png
deleted file mode 100644
index 000a23a..0000000
--- a/core/res/res/drawable-xxhdpi/btn_switch_to_off_mtrl_002.png
+++ /dev/null
Binary files differ
diff --git a/core/res/res/drawable-xxhdpi/btn_switch_to_off_mtrl_003.png b/core/res/res/drawable-xxhdpi/btn_switch_to_off_mtrl_003.png
deleted file mode 100644
index 394d661..0000000
--- a/core/res/res/drawable-xxhdpi/btn_switch_to_off_mtrl_003.png
+++ /dev/null
Binary files differ
diff --git a/core/res/res/drawable-xxhdpi/btn_switch_to_off_mtrl_004.png b/core/res/res/drawable-xxhdpi/btn_switch_to_off_mtrl_004.png
deleted file mode 100644
index 4e7311d..0000000
--- a/core/res/res/drawable-xxhdpi/btn_switch_to_off_mtrl_004.png
+++ /dev/null
Binary files differ
diff --git a/core/res/res/drawable-xxhdpi/btn_switch_to_off_mtrl_005.png b/core/res/res/drawable-xxhdpi/btn_switch_to_off_mtrl_005.png
deleted file mode 100644
index d9dcf91..0000000
--- a/core/res/res/drawable-xxhdpi/btn_switch_to_off_mtrl_005.png
+++ /dev/null
Binary files differ
diff --git a/core/res/res/drawable-xxhdpi/btn_switch_to_off_mtrl_006.png b/core/res/res/drawable-xxhdpi/btn_switch_to_off_mtrl_006.png
deleted file mode 100644
index 674142e..0000000
--- a/core/res/res/drawable-xxhdpi/btn_switch_to_off_mtrl_006.png
+++ /dev/null
Binary files differ
diff --git a/core/res/res/drawable-xxhdpi/btn_switch_to_off_mtrl_007.png b/core/res/res/drawable-xxhdpi/btn_switch_to_off_mtrl_007.png
deleted file mode 100644
index 674142e..0000000
--- a/core/res/res/drawable-xxhdpi/btn_switch_to_off_mtrl_007.png
+++ /dev/null
Binary files differ
diff --git a/core/res/res/drawable-xxhdpi/btn_switch_to_off_mtrl_008.png b/core/res/res/drawable-xxhdpi/btn_switch_to_off_mtrl_008.png
deleted file mode 100644
index 9d4026a..0000000
--- a/core/res/res/drawable-xxhdpi/btn_switch_to_off_mtrl_008.png
+++ /dev/null
Binary files differ
diff --git a/core/res/res/drawable-xxhdpi/btn_switch_to_off_mtrl_009.png b/core/res/res/drawable-xxhdpi/btn_switch_to_off_mtrl_009.png
deleted file mode 100644
index bb4b426..0000000
--- a/core/res/res/drawable-xxhdpi/btn_switch_to_off_mtrl_009.png
+++ /dev/null
Binary files differ
diff --git a/core/res/res/drawable-xxhdpi/btn_switch_to_off_mtrl_010.png b/core/res/res/drawable-xxhdpi/btn_switch_to_off_mtrl_010.png
deleted file mode 100644
index a37076d..0000000
--- a/core/res/res/drawable-xxhdpi/btn_switch_to_off_mtrl_010.png
+++ /dev/null
Binary files differ
diff --git a/core/res/res/drawable-xxhdpi/btn_switch_to_off_mtrl_011.png b/core/res/res/drawable-xxhdpi/btn_switch_to_off_mtrl_011.png
deleted file mode 100644
index a37076d..0000000
--- a/core/res/res/drawable-xxhdpi/btn_switch_to_off_mtrl_011.png
+++ /dev/null
Binary files differ
diff --git a/core/res/res/drawable-xxhdpi/btn_switch_to_off_mtrl_012.png b/core/res/res/drawable-xxhdpi/btn_switch_to_off_mtrl_012.png
deleted file mode 100644
index a37076d..0000000
--- a/core/res/res/drawable-xxhdpi/btn_switch_to_off_mtrl_012.png
+++ /dev/null
Binary files differ
diff --git a/core/res/res/drawable-xxhdpi/btn_switch_to_off_mtrl_013.png b/core/res/res/drawable-xxhdpi/btn_switch_to_off_mtrl_013.png
deleted file mode 100644
index a37076d..0000000
--- a/core/res/res/drawable-xxhdpi/btn_switch_to_off_mtrl_013.png
+++ /dev/null
Binary files differ
diff --git a/core/res/res/drawable-xxhdpi/btn_switch_to_off_mtrl_014.png b/core/res/res/drawable-xxhdpi/btn_switch_to_off_mtrl_014.png
deleted file mode 100644
index a37076d..0000000
--- a/core/res/res/drawable-xxhdpi/btn_switch_to_off_mtrl_014.png
+++ /dev/null
Binary files differ
diff --git a/core/res/res/drawable-xxhdpi/btn_switch_to_on_mtrl_000.png b/core/res/res/drawable-xxhdpi/btn_switch_to_on_mtrl_000.png
deleted file mode 100644
index 22e9951..0000000
--- a/core/res/res/drawable-xxhdpi/btn_switch_to_on_mtrl_000.png
+++ /dev/null
Binary files differ
diff --git a/core/res/res/drawable-xxhdpi/btn_switch_to_on_mtrl_00001.9.png b/core/res/res/drawable-xxhdpi/btn_switch_to_on_mtrl_00001.9.png
new file mode 100644
index 0000000..c9bdf1f
--- /dev/null
+++ b/core/res/res/drawable-xxhdpi/btn_switch_to_on_mtrl_00001.9.png
Binary files differ
diff --git a/core/res/res/drawable-xxhdpi/btn_switch_to_on_mtrl_00002.9.png b/core/res/res/drawable-xxhdpi/btn_switch_to_on_mtrl_00002.9.png
new file mode 100644
index 0000000..6bfd943
--- /dev/null
+++ b/core/res/res/drawable-xxhdpi/btn_switch_to_on_mtrl_00002.9.png
Binary files differ
diff --git a/core/res/res/drawable-xxhdpi/btn_switch_to_on_mtrl_00003.9.png b/core/res/res/drawable-xxhdpi/btn_switch_to_on_mtrl_00003.9.png
new file mode 100644
index 0000000..a1d3fbb
--- /dev/null
+++ b/core/res/res/drawable-xxhdpi/btn_switch_to_on_mtrl_00003.9.png
Binary files differ
diff --git a/core/res/res/drawable-xxhdpi/btn_switch_to_on_mtrl_00004.9.png b/core/res/res/drawable-xxhdpi/btn_switch_to_on_mtrl_00004.9.png
new file mode 100644
index 0000000..40c3a5b
--- /dev/null
+++ b/core/res/res/drawable-xxhdpi/btn_switch_to_on_mtrl_00004.9.png
Binary files differ
diff --git a/core/res/res/drawable-xxhdpi/btn_switch_to_on_mtrl_00005.9.png b/core/res/res/drawable-xxhdpi/btn_switch_to_on_mtrl_00005.9.png
new file mode 100644
index 0000000..26b8736
--- /dev/null
+++ b/core/res/res/drawable-xxhdpi/btn_switch_to_on_mtrl_00005.9.png
Binary files differ
diff --git a/core/res/res/drawable-xxhdpi/btn_switch_to_on_mtrl_00006.9.png b/core/res/res/drawable-xxhdpi/btn_switch_to_on_mtrl_00006.9.png
new file mode 100644
index 0000000..88c027e
--- /dev/null
+++ b/core/res/res/drawable-xxhdpi/btn_switch_to_on_mtrl_00006.9.png
Binary files differ
diff --git a/core/res/res/drawable-xxhdpi/btn_switch_to_on_mtrl_00007.9.png b/core/res/res/drawable-xxhdpi/btn_switch_to_on_mtrl_00007.9.png
new file mode 100644
index 0000000..02567c6
--- /dev/null
+++ b/core/res/res/drawable-xxhdpi/btn_switch_to_on_mtrl_00007.9.png
Binary files differ
diff --git a/core/res/res/drawable-xxhdpi/btn_switch_to_on_mtrl_00008.9.png b/core/res/res/drawable-xxhdpi/btn_switch_to_on_mtrl_00008.9.png
new file mode 100644
index 0000000..037d3bf
--- /dev/null
+++ b/core/res/res/drawable-xxhdpi/btn_switch_to_on_mtrl_00008.9.png
Binary files differ
diff --git a/core/res/res/drawable-xxhdpi/btn_switch_to_on_mtrl_00009.9.png b/core/res/res/drawable-xxhdpi/btn_switch_to_on_mtrl_00009.9.png
new file mode 100644
index 0000000..0252769
--- /dev/null
+++ b/core/res/res/drawable-xxhdpi/btn_switch_to_on_mtrl_00009.9.png
Binary files differ
diff --git a/core/res/res/drawable-xxhdpi/btn_switch_to_on_mtrl_00010.9.png b/core/res/res/drawable-xxhdpi/btn_switch_to_on_mtrl_00010.9.png
new file mode 100644
index 0000000..3ae501d
--- /dev/null
+++ b/core/res/res/drawable-xxhdpi/btn_switch_to_on_mtrl_00010.9.png
Binary files differ
diff --git a/core/res/res/drawable-xxhdpi/btn_switch_to_on_mtrl_00011.9.png b/core/res/res/drawable-xxhdpi/btn_switch_to_on_mtrl_00011.9.png
new file mode 100644
index 0000000..ecf2831
--- /dev/null
+++ b/core/res/res/drawable-xxhdpi/btn_switch_to_on_mtrl_00011.9.png
Binary files differ
diff --git a/core/res/res/drawable-xxhdpi/btn_switch_to_on_mtrl_00012.9.png b/core/res/res/drawable-xxhdpi/btn_switch_to_on_mtrl_00012.9.png
new file mode 100644
index 0000000..0877749
--- /dev/null
+++ b/core/res/res/drawable-xxhdpi/btn_switch_to_on_mtrl_00012.9.png
Binary files differ
diff --git a/core/res/res/drawable-xxhdpi/btn_switch_to_on_mtrl_001.png b/core/res/res/drawable-xxhdpi/btn_switch_to_on_mtrl_001.png
deleted file mode 100644
index 14e6b39..0000000
--- a/core/res/res/drawable-xxhdpi/btn_switch_to_on_mtrl_001.png
+++ /dev/null
Binary files differ
diff --git a/core/res/res/drawable-xxhdpi/btn_switch_to_on_mtrl_002.png b/core/res/res/drawable-xxhdpi/btn_switch_to_on_mtrl_002.png
deleted file mode 100644
index 86b2c01..0000000
--- a/core/res/res/drawable-xxhdpi/btn_switch_to_on_mtrl_002.png
+++ /dev/null
Binary files differ
diff --git a/core/res/res/drawable-xxhdpi/btn_switch_to_on_mtrl_003.png b/core/res/res/drawable-xxhdpi/btn_switch_to_on_mtrl_003.png
deleted file mode 100644
index 1c565df..0000000
--- a/core/res/res/drawable-xxhdpi/btn_switch_to_on_mtrl_003.png
+++ /dev/null
Binary files differ
diff --git a/core/res/res/drawable-xxhdpi/btn_switch_to_on_mtrl_004.png b/core/res/res/drawable-xxhdpi/btn_switch_to_on_mtrl_004.png
deleted file mode 100644
index b825449..0000000
--- a/core/res/res/drawable-xxhdpi/btn_switch_to_on_mtrl_004.png
+++ /dev/null
Binary files differ
diff --git a/core/res/res/drawable-xxhdpi/btn_switch_to_on_mtrl_005.png b/core/res/res/drawable-xxhdpi/btn_switch_to_on_mtrl_005.png
deleted file mode 100644
index 170c234..0000000
--- a/core/res/res/drawable-xxhdpi/btn_switch_to_on_mtrl_005.png
+++ /dev/null
Binary files differ
diff --git a/core/res/res/drawable-xxhdpi/btn_switch_to_on_mtrl_006.png b/core/res/res/drawable-xxhdpi/btn_switch_to_on_mtrl_006.png
deleted file mode 100644
index 5477007..0000000
--- a/core/res/res/drawable-xxhdpi/btn_switch_to_on_mtrl_006.png
+++ /dev/null
Binary files differ
diff --git a/core/res/res/drawable-xxhdpi/btn_switch_to_on_mtrl_007.png b/core/res/res/drawable-xxhdpi/btn_switch_to_on_mtrl_007.png
deleted file mode 100644
index eff3dd0..0000000
--- a/core/res/res/drawable-xxhdpi/btn_switch_to_on_mtrl_007.png
+++ /dev/null
Binary files differ
diff --git a/core/res/res/drawable-xxhdpi/btn_switch_to_on_mtrl_008.png b/core/res/res/drawable-xxhdpi/btn_switch_to_on_mtrl_008.png
deleted file mode 100644
index e3fd96a..0000000
--- a/core/res/res/drawable-xxhdpi/btn_switch_to_on_mtrl_008.png
+++ /dev/null
Binary files differ
diff --git a/core/res/res/drawable-xxhdpi/btn_switch_to_on_mtrl_009.png b/core/res/res/drawable-xxhdpi/btn_switch_to_on_mtrl_009.png
deleted file mode 100644
index 198ac07..0000000
--- a/core/res/res/drawable-xxhdpi/btn_switch_to_on_mtrl_009.png
+++ /dev/null
Binary files differ
diff --git a/core/res/res/drawable-xxhdpi/btn_switch_to_on_mtrl_010.png b/core/res/res/drawable-xxhdpi/btn_switch_to_on_mtrl_010.png
deleted file mode 100644
index 198ac07..0000000
--- a/core/res/res/drawable-xxhdpi/btn_switch_to_on_mtrl_010.png
+++ /dev/null
Binary files differ
diff --git a/core/res/res/drawable-xxhdpi/btn_switch_to_on_mtrl_011.png b/core/res/res/drawable-xxhdpi/btn_switch_to_on_mtrl_011.png
deleted file mode 100644
index 198ac07..0000000
--- a/core/res/res/drawable-xxhdpi/btn_switch_to_on_mtrl_011.png
+++ /dev/null
Binary files differ
diff --git a/core/res/res/drawable-xxhdpi/btn_switch_to_on_mtrl_012.png b/core/res/res/drawable-xxhdpi/btn_switch_to_on_mtrl_012.png
deleted file mode 100644
index 198ac07..0000000
--- a/core/res/res/drawable-xxhdpi/btn_switch_to_on_mtrl_012.png
+++ /dev/null
Binary files differ
diff --git a/core/res/res/drawable-xxhdpi/btn_switch_to_on_mtrl_013.png b/core/res/res/drawable-xxhdpi/btn_switch_to_on_mtrl_013.png
deleted file mode 100644
index 198ac07..0000000
--- a/core/res/res/drawable-xxhdpi/btn_switch_to_on_mtrl_013.png
+++ /dev/null
Binary files differ
diff --git a/core/res/res/drawable-xxhdpi/btn_switch_to_on_mtrl_014.png b/core/res/res/drawable-xxhdpi/btn_switch_to_on_mtrl_014.png
deleted file mode 100644
index 198ac07..0000000
--- a/core/res/res/drawable-xxhdpi/btn_switch_to_on_mtrl_014.png
+++ /dev/null
Binary files differ
diff --git a/core/res/res/drawable-xxhdpi/ic_corp_icon.png b/core/res/res/drawable-xxhdpi/ic_corp_icon.png
index 6888377..68400ea 100644
--- a/core/res/res/drawable-xxhdpi/ic_corp_icon.png
+++ b/core/res/res/drawable-xxhdpi/ic_corp_icon.png
Binary files differ
diff --git a/core/res/res/drawable-xxhdpi/stat_notify_wifi_in_range.png b/core/res/res/drawable-xxhdpi/stat_notify_wifi_in_range.png
deleted file mode 100644
index 47e74fb..0000000
--- a/core/res/res/drawable-xxhdpi/stat_notify_wifi_in_range.png
+++ /dev/null
Binary files differ
diff --git a/core/res/res/drawable-xxhdpi/stat_sys_tether_wifi.png b/core/res/res/drawable-xxhdpi/stat_sys_tether_wifi.png
deleted file mode 100644
index da44e6a..0000000
--- a/core/res/res/drawable-xxhdpi/stat_sys_tether_wifi.png
+++ /dev/null
Binary files differ
diff --git a/core/res/res/drawable-xxhdpi/switch_track_mtrl_alpha.9.png b/core/res/res/drawable-xxhdpi/switch_track_mtrl_alpha.9.png
index a8067cb..3e3174d 100644
--- a/core/res/res/drawable-xxhdpi/switch_track_mtrl_alpha.9.png
+++ b/core/res/res/drawable-xxhdpi/switch_track_mtrl_alpha.9.png
Binary files differ
diff --git a/core/res/res/drawable-xxxhdpi/btn_switch_to_off_mtrl_000.png b/core/res/res/drawable-xxxhdpi/btn_switch_to_off_mtrl_000.png
deleted file mode 100644
index 8b202c6..0000000
--- a/core/res/res/drawable-xxxhdpi/btn_switch_to_off_mtrl_000.png
+++ /dev/null
Binary files differ
diff --git a/core/res/res/drawable-xxxhdpi/btn_switch_to_off_mtrl_00001.9.png b/core/res/res/drawable-xxxhdpi/btn_switch_to_off_mtrl_00001.9.png
new file mode 100644
index 0000000..bc21279
--- /dev/null
+++ b/core/res/res/drawable-xxxhdpi/btn_switch_to_off_mtrl_00001.9.png
Binary files differ
diff --git a/core/res/res/drawable-xxxhdpi/btn_switch_to_off_mtrl_00002.9.png b/core/res/res/drawable-xxxhdpi/btn_switch_to_off_mtrl_00002.9.png
new file mode 100644
index 0000000..b57b592
--- /dev/null
+++ b/core/res/res/drawable-xxxhdpi/btn_switch_to_off_mtrl_00002.9.png
Binary files differ
diff --git a/core/res/res/drawable-xxxhdpi/btn_switch_to_off_mtrl_00003.9.png b/core/res/res/drawable-xxxhdpi/btn_switch_to_off_mtrl_00003.9.png
new file mode 100644
index 0000000..0fb9277
--- /dev/null
+++ b/core/res/res/drawable-xxxhdpi/btn_switch_to_off_mtrl_00003.9.png
Binary files differ
diff --git a/core/res/res/drawable-xxxhdpi/btn_switch_to_off_mtrl_00004.9.png b/core/res/res/drawable-xxxhdpi/btn_switch_to_off_mtrl_00004.9.png
new file mode 100644
index 0000000..340722d
--- /dev/null
+++ b/core/res/res/drawable-xxxhdpi/btn_switch_to_off_mtrl_00004.9.png
Binary files differ
diff --git a/core/res/res/drawable-xxxhdpi/btn_switch_to_off_mtrl_00005.9.png b/core/res/res/drawable-xxxhdpi/btn_switch_to_off_mtrl_00005.9.png
new file mode 100644
index 0000000..8554a76
--- /dev/null
+++ b/core/res/res/drawable-xxxhdpi/btn_switch_to_off_mtrl_00005.9.png
Binary files differ
diff --git a/core/res/res/drawable-xxxhdpi/btn_switch_to_off_mtrl_00006.9.png b/core/res/res/drawable-xxxhdpi/btn_switch_to_off_mtrl_00006.9.png
new file mode 100644
index 0000000..a05e335
--- /dev/null
+++ b/core/res/res/drawable-xxxhdpi/btn_switch_to_off_mtrl_00006.9.png
Binary files differ
diff --git a/core/res/res/drawable-xxxhdpi/btn_switch_to_off_mtrl_00007.9.png b/core/res/res/drawable-xxxhdpi/btn_switch_to_off_mtrl_00007.9.png
new file mode 100644
index 0000000..a5ded14
--- /dev/null
+++ b/core/res/res/drawable-xxxhdpi/btn_switch_to_off_mtrl_00007.9.png
Binary files differ
diff --git a/core/res/res/drawable-xxxhdpi/btn_switch_to_off_mtrl_00008.9.png b/core/res/res/drawable-xxxhdpi/btn_switch_to_off_mtrl_00008.9.png
new file mode 100644
index 0000000..0300a49
--- /dev/null
+++ b/core/res/res/drawable-xxxhdpi/btn_switch_to_off_mtrl_00008.9.png
Binary files differ
diff --git a/core/res/res/drawable-xxxhdpi/btn_switch_to_off_mtrl_00009.9.png b/core/res/res/drawable-xxxhdpi/btn_switch_to_off_mtrl_00009.9.png
new file mode 100644
index 0000000..37dd7ce
--- /dev/null
+++ b/core/res/res/drawable-xxxhdpi/btn_switch_to_off_mtrl_00009.9.png
Binary files differ
diff --git a/core/res/res/drawable-xxxhdpi/btn_switch_to_off_mtrl_00010.9.png b/core/res/res/drawable-xxxhdpi/btn_switch_to_off_mtrl_00010.9.png
new file mode 100644
index 0000000..6bc549a
--- /dev/null
+++ b/core/res/res/drawable-xxxhdpi/btn_switch_to_off_mtrl_00010.9.png
Binary files differ
diff --git a/core/res/res/drawable-xxxhdpi/btn_switch_to_off_mtrl_00011.9.png b/core/res/res/drawable-xxxhdpi/btn_switch_to_off_mtrl_00011.9.png
new file mode 100644
index 0000000..b026d5d
--- /dev/null
+++ b/core/res/res/drawable-xxxhdpi/btn_switch_to_off_mtrl_00011.9.png
Binary files differ
diff --git a/core/res/res/drawable-xxxhdpi/btn_switch_to_off_mtrl_00012.9.png b/core/res/res/drawable-xxxhdpi/btn_switch_to_off_mtrl_00012.9.png
new file mode 100644
index 0000000..89238dc
--- /dev/null
+++ b/core/res/res/drawable-xxxhdpi/btn_switch_to_off_mtrl_00012.9.png
Binary files differ
diff --git a/core/res/res/drawable-xxxhdpi/btn_switch_to_off_mtrl_001.png b/core/res/res/drawable-xxxhdpi/btn_switch_to_off_mtrl_001.png
deleted file mode 100644
index 3b497f3..0000000
--- a/core/res/res/drawable-xxxhdpi/btn_switch_to_off_mtrl_001.png
+++ /dev/null
Binary files differ
diff --git a/core/res/res/drawable-xxxhdpi/btn_switch_to_off_mtrl_002.png b/core/res/res/drawable-xxxhdpi/btn_switch_to_off_mtrl_002.png
deleted file mode 100644
index 532b6de..0000000
--- a/core/res/res/drawable-xxxhdpi/btn_switch_to_off_mtrl_002.png
+++ /dev/null
Binary files differ
diff --git a/core/res/res/drawable-xxxhdpi/btn_switch_to_off_mtrl_003.png b/core/res/res/drawable-xxxhdpi/btn_switch_to_off_mtrl_003.png
deleted file mode 100644
index 403b2fe..0000000
--- a/core/res/res/drawable-xxxhdpi/btn_switch_to_off_mtrl_003.png
+++ /dev/null
Binary files differ
diff --git a/core/res/res/drawable-xxxhdpi/btn_switch_to_off_mtrl_004.png b/core/res/res/drawable-xxxhdpi/btn_switch_to_off_mtrl_004.png
deleted file mode 100644
index 8c5086c..0000000
--- a/core/res/res/drawable-xxxhdpi/btn_switch_to_off_mtrl_004.png
+++ /dev/null
Binary files differ
diff --git a/core/res/res/drawable-xxxhdpi/btn_switch_to_off_mtrl_005.png b/core/res/res/drawable-xxxhdpi/btn_switch_to_off_mtrl_005.png
deleted file mode 100644
index d4870f8..0000000
--- a/core/res/res/drawable-xxxhdpi/btn_switch_to_off_mtrl_005.png
+++ /dev/null
Binary files differ
diff --git a/core/res/res/drawable-xxxhdpi/btn_switch_to_off_mtrl_006.png b/core/res/res/drawable-xxxhdpi/btn_switch_to_off_mtrl_006.png
deleted file mode 100644
index c05adf5..0000000
--- a/core/res/res/drawable-xxxhdpi/btn_switch_to_off_mtrl_006.png
+++ /dev/null
Binary files differ
diff --git a/core/res/res/drawable-xxxhdpi/btn_switch_to_off_mtrl_007.png b/core/res/res/drawable-xxxhdpi/btn_switch_to_off_mtrl_007.png
deleted file mode 100644
index 99b2056..0000000
--- a/core/res/res/drawable-xxxhdpi/btn_switch_to_off_mtrl_007.png
+++ /dev/null
Binary files differ
diff --git a/core/res/res/drawable-xxxhdpi/btn_switch_to_off_mtrl_008.png b/core/res/res/drawable-xxxhdpi/btn_switch_to_off_mtrl_008.png
deleted file mode 100644
index d839358..0000000
--- a/core/res/res/drawable-xxxhdpi/btn_switch_to_off_mtrl_008.png
+++ /dev/null
Binary files differ
diff --git a/core/res/res/drawable-xxxhdpi/btn_switch_to_off_mtrl_009.png b/core/res/res/drawable-xxxhdpi/btn_switch_to_off_mtrl_009.png
deleted file mode 100644
index 913f94d..0000000
--- a/core/res/res/drawable-xxxhdpi/btn_switch_to_off_mtrl_009.png
+++ /dev/null
Binary files differ
diff --git a/core/res/res/drawable-xxxhdpi/btn_switch_to_off_mtrl_010.png b/core/res/res/drawable-xxxhdpi/btn_switch_to_off_mtrl_010.png
deleted file mode 100644
index 7f325b3..0000000
--- a/core/res/res/drawable-xxxhdpi/btn_switch_to_off_mtrl_010.png
+++ /dev/null
Binary files differ
diff --git a/core/res/res/drawable-xxxhdpi/btn_switch_to_off_mtrl_011.png b/core/res/res/drawable-xxxhdpi/btn_switch_to_off_mtrl_011.png
deleted file mode 100644
index 149a9aa..0000000
--- a/core/res/res/drawable-xxxhdpi/btn_switch_to_off_mtrl_011.png
+++ /dev/null
Binary files differ
diff --git a/core/res/res/drawable-xxxhdpi/btn_switch_to_off_mtrl_012.png b/core/res/res/drawable-xxxhdpi/btn_switch_to_off_mtrl_012.png
deleted file mode 100644
index 95c219e..0000000
--- a/core/res/res/drawable-xxxhdpi/btn_switch_to_off_mtrl_012.png
+++ /dev/null
Binary files differ
diff --git a/core/res/res/drawable-xxxhdpi/btn_switch_to_off_mtrl_013.png b/core/res/res/drawable-xxxhdpi/btn_switch_to_off_mtrl_013.png
deleted file mode 100644
index 462a128d..0000000
--- a/core/res/res/drawable-xxxhdpi/btn_switch_to_off_mtrl_013.png
+++ /dev/null
Binary files differ
diff --git a/core/res/res/drawable-xxxhdpi/btn_switch_to_off_mtrl_014.png b/core/res/res/drawable-xxxhdpi/btn_switch_to_off_mtrl_014.png
deleted file mode 100644
index 5911d16..0000000
--- a/core/res/res/drawable-xxxhdpi/btn_switch_to_off_mtrl_014.png
+++ /dev/null
Binary files differ
diff --git a/core/res/res/drawable-xxxhdpi/btn_switch_to_on_mtrl_000.png b/core/res/res/drawable-xxxhdpi/btn_switch_to_on_mtrl_000.png
deleted file mode 100644
index e0c6d85..0000000
--- a/core/res/res/drawable-xxxhdpi/btn_switch_to_on_mtrl_000.png
+++ /dev/null
Binary files differ
diff --git a/core/res/res/drawable-xxxhdpi/btn_switch_to_on_mtrl_00001.9.png b/core/res/res/drawable-xxxhdpi/btn_switch_to_on_mtrl_00001.9.png
new file mode 100644
index 0000000..1d309fe
--- /dev/null
+++ b/core/res/res/drawable-xxxhdpi/btn_switch_to_on_mtrl_00001.9.png
Binary files differ
diff --git a/core/res/res/drawable-xxxhdpi/btn_switch_to_on_mtrl_00002.9.png b/core/res/res/drawable-xxxhdpi/btn_switch_to_on_mtrl_00002.9.png
new file mode 100644
index 0000000..2e58fa9
--- /dev/null
+++ b/core/res/res/drawable-xxxhdpi/btn_switch_to_on_mtrl_00002.9.png
Binary files differ
diff --git a/core/res/res/drawable-xxxhdpi/btn_switch_to_on_mtrl_00003.9.png b/core/res/res/drawable-xxxhdpi/btn_switch_to_on_mtrl_00003.9.png
new file mode 100644
index 0000000..2ebe7a7
--- /dev/null
+++ b/core/res/res/drawable-xxxhdpi/btn_switch_to_on_mtrl_00003.9.png
Binary files differ
diff --git a/core/res/res/drawable-xxxhdpi/btn_switch_to_on_mtrl_00004.9.png b/core/res/res/drawable-xxxhdpi/btn_switch_to_on_mtrl_00004.9.png
new file mode 100644
index 0000000..04bab76
--- /dev/null
+++ b/core/res/res/drawable-xxxhdpi/btn_switch_to_on_mtrl_00004.9.png
Binary files differ
diff --git a/core/res/res/drawable-xxxhdpi/btn_switch_to_on_mtrl_00005.9.png b/core/res/res/drawable-xxxhdpi/btn_switch_to_on_mtrl_00005.9.png
new file mode 100644
index 0000000..3497e48
--- /dev/null
+++ b/core/res/res/drawable-xxxhdpi/btn_switch_to_on_mtrl_00005.9.png
Binary files differ
diff --git a/core/res/res/drawable-xxxhdpi/btn_switch_to_on_mtrl_00006.9.png b/core/res/res/drawable-xxxhdpi/btn_switch_to_on_mtrl_00006.9.png
new file mode 100644
index 0000000..42333b4
--- /dev/null
+++ b/core/res/res/drawable-xxxhdpi/btn_switch_to_on_mtrl_00006.9.png
Binary files differ
diff --git a/core/res/res/drawable-xxxhdpi/btn_switch_to_on_mtrl_00007.9.png b/core/res/res/drawable-xxxhdpi/btn_switch_to_on_mtrl_00007.9.png
new file mode 100644
index 0000000..732e175
--- /dev/null
+++ b/core/res/res/drawable-xxxhdpi/btn_switch_to_on_mtrl_00007.9.png
Binary files differ
diff --git a/core/res/res/drawable-xxxhdpi/btn_switch_to_on_mtrl_00008.9.png b/core/res/res/drawable-xxxhdpi/btn_switch_to_on_mtrl_00008.9.png
new file mode 100644
index 0000000..12eddd8
--- /dev/null
+++ b/core/res/res/drawable-xxxhdpi/btn_switch_to_on_mtrl_00008.9.png
Binary files differ
diff --git a/core/res/res/drawable-xxxhdpi/btn_switch_to_on_mtrl_00009.9.png b/core/res/res/drawable-xxxhdpi/btn_switch_to_on_mtrl_00009.9.png
new file mode 100644
index 0000000..95cbc61
--- /dev/null
+++ b/core/res/res/drawable-xxxhdpi/btn_switch_to_on_mtrl_00009.9.png
Binary files differ
diff --git a/core/res/res/drawable-xxxhdpi/btn_switch_to_on_mtrl_00010.9.png b/core/res/res/drawable-xxxhdpi/btn_switch_to_on_mtrl_00010.9.png
new file mode 100644
index 0000000..105ec07
--- /dev/null
+++ b/core/res/res/drawable-xxxhdpi/btn_switch_to_on_mtrl_00010.9.png
Binary files differ
diff --git a/core/res/res/drawable-xxxhdpi/btn_switch_to_on_mtrl_00011.9.png b/core/res/res/drawable-xxxhdpi/btn_switch_to_on_mtrl_00011.9.png
new file mode 100644
index 0000000..fac253a
--- /dev/null
+++ b/core/res/res/drawable-xxxhdpi/btn_switch_to_on_mtrl_00011.9.png
Binary files differ
diff --git a/core/res/res/drawable-xxxhdpi/btn_switch_to_on_mtrl_00012.9.png b/core/res/res/drawable-xxxhdpi/btn_switch_to_on_mtrl_00012.9.png
new file mode 100644
index 0000000..1b8d11c
--- /dev/null
+++ b/core/res/res/drawable-xxxhdpi/btn_switch_to_on_mtrl_00012.9.png
Binary files differ
diff --git a/core/res/res/drawable-xxxhdpi/btn_switch_to_on_mtrl_001.png b/core/res/res/drawable-xxxhdpi/btn_switch_to_on_mtrl_001.png
deleted file mode 100644
index 5679943..0000000
--- a/core/res/res/drawable-xxxhdpi/btn_switch_to_on_mtrl_001.png
+++ /dev/null
Binary files differ
diff --git a/core/res/res/drawable-xxxhdpi/btn_switch_to_on_mtrl_002.png b/core/res/res/drawable-xxxhdpi/btn_switch_to_on_mtrl_002.png
deleted file mode 100644
index 54b636d..0000000
--- a/core/res/res/drawable-xxxhdpi/btn_switch_to_on_mtrl_002.png
+++ /dev/null
Binary files differ
diff --git a/core/res/res/drawable-xxxhdpi/btn_switch_to_on_mtrl_003.png b/core/res/res/drawable-xxxhdpi/btn_switch_to_on_mtrl_003.png
deleted file mode 100644
index bf9fac0..0000000
--- a/core/res/res/drawable-xxxhdpi/btn_switch_to_on_mtrl_003.png
+++ /dev/null
Binary files differ
diff --git a/core/res/res/drawable-xxxhdpi/btn_switch_to_on_mtrl_004.png b/core/res/res/drawable-xxxhdpi/btn_switch_to_on_mtrl_004.png
deleted file mode 100644
index 25d5319..0000000
--- a/core/res/res/drawable-xxxhdpi/btn_switch_to_on_mtrl_004.png
+++ /dev/null
Binary files differ
diff --git a/core/res/res/drawable-xxxhdpi/btn_switch_to_on_mtrl_005.png b/core/res/res/drawable-xxxhdpi/btn_switch_to_on_mtrl_005.png
deleted file mode 100644
index d2df595..0000000
--- a/core/res/res/drawable-xxxhdpi/btn_switch_to_on_mtrl_005.png
+++ /dev/null
Binary files differ
diff --git a/core/res/res/drawable-xxxhdpi/btn_switch_to_on_mtrl_006.png b/core/res/res/drawable-xxxhdpi/btn_switch_to_on_mtrl_006.png
deleted file mode 100644
index 7700bde..0000000
--- a/core/res/res/drawable-xxxhdpi/btn_switch_to_on_mtrl_006.png
+++ /dev/null
Binary files differ
diff --git a/core/res/res/drawable-xxxhdpi/btn_switch_to_on_mtrl_007.png b/core/res/res/drawable-xxxhdpi/btn_switch_to_on_mtrl_007.png
deleted file mode 100644
index 883f98b..0000000
--- a/core/res/res/drawable-xxxhdpi/btn_switch_to_on_mtrl_007.png
+++ /dev/null
Binary files differ
diff --git a/core/res/res/drawable-xxxhdpi/btn_switch_to_on_mtrl_008.png b/core/res/res/drawable-xxxhdpi/btn_switch_to_on_mtrl_008.png
deleted file mode 100644
index b3b2108..0000000
--- a/core/res/res/drawable-xxxhdpi/btn_switch_to_on_mtrl_008.png
+++ /dev/null
Binary files differ
diff --git a/core/res/res/drawable-xxxhdpi/btn_switch_to_on_mtrl_009.png b/core/res/res/drawable-xxxhdpi/btn_switch_to_on_mtrl_009.png
deleted file mode 100644
index 3aad596..0000000
--- a/core/res/res/drawable-xxxhdpi/btn_switch_to_on_mtrl_009.png
+++ /dev/null
Binary files differ
diff --git a/core/res/res/drawable-xxxhdpi/btn_switch_to_on_mtrl_010.png b/core/res/res/drawable-xxxhdpi/btn_switch_to_on_mtrl_010.png
deleted file mode 100644
index 2017e17..0000000
--- a/core/res/res/drawable-xxxhdpi/btn_switch_to_on_mtrl_010.png
+++ /dev/null
Binary files differ
diff --git a/core/res/res/drawable-xxxhdpi/btn_switch_to_on_mtrl_011.png b/core/res/res/drawable-xxxhdpi/btn_switch_to_on_mtrl_011.png
deleted file mode 100644
index 1fc2700..0000000
--- a/core/res/res/drawable-xxxhdpi/btn_switch_to_on_mtrl_011.png
+++ /dev/null
Binary files differ
diff --git a/core/res/res/drawable-xxxhdpi/btn_switch_to_on_mtrl_012.png b/core/res/res/drawable-xxxhdpi/btn_switch_to_on_mtrl_012.png
deleted file mode 100644
index bb8b0f2..0000000
--- a/core/res/res/drawable-xxxhdpi/btn_switch_to_on_mtrl_012.png
+++ /dev/null
Binary files differ
diff --git a/core/res/res/drawable-xxxhdpi/btn_switch_to_on_mtrl_013.png b/core/res/res/drawable-xxxhdpi/btn_switch_to_on_mtrl_013.png
deleted file mode 100644
index 66ab8f6..0000000
--- a/core/res/res/drawable-xxxhdpi/btn_switch_to_on_mtrl_013.png
+++ /dev/null
Binary files differ
diff --git a/core/res/res/drawable-xxxhdpi/btn_switch_to_on_mtrl_014.png b/core/res/res/drawable-xxxhdpi/btn_switch_to_on_mtrl_014.png
deleted file mode 100644
index e3424db..0000000
--- a/core/res/res/drawable-xxxhdpi/btn_switch_to_on_mtrl_014.png
+++ /dev/null
Binary files differ
diff --git a/core/res/res/drawable-xxxhdpi/switch_track_mtrl_alpha.9.png b/core/res/res/drawable-xxxhdpi/switch_track_mtrl_alpha.9.png
index fb07f2a..1e4a74c 100644
--- a/core/res/res/drawable-xxxhdpi/switch_track_mtrl_alpha.9.png
+++ b/core/res/res/drawable-xxxhdpi/switch_track_mtrl_alpha.9.png
Binary files differ
diff --git a/core/res/res/drawable/stat_notify_wifi_in_range.xml b/core/res/res/drawable/stat_notify_wifi_in_range.xml
new file mode 100644
index 0000000..9a5407d
--- /dev/null
+++ b/core/res/res/drawable/stat_notify_wifi_in_range.xml
@@ -0,0 +1,27 @@
+<!--
+Copyright (C) 2014 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+ android:width="26.0dp"
+ android:height="24.0dp"
+ android:viewportWidth="26.0"
+ android:viewportHeight="24.0">
+ <path
+ android:fillColor="#4DFFFFFF"
+ android:pathData="M19.100000,14.000000l-3.400000,0.000000l0.000000,-1.500000c0.000000,-1.800000 0.800000,-2.800000 1.500000,-3.400000C18.100000,8.300000 19.200001,8.000000 20.600000,8.000000c1.200000,0.000000 2.300000,0.300000 3.100000,0.800000l1.900000,-2.300000C25.100000,6.100000 20.299999,2.100000 13.000000,2.100000S0.900000,6.100000 0.400000,6.500000L13.000000,22.000000l0.000000,0.000000l0.000000,0.000000l0.000000,0.000000l0.000000,0.000000l6.500000,-8.100000L19.100000,14.000000z"/>
+ <path
+ android:fillColor="#FFFFFFFF"
+ android:pathData="M19.500000,17.799999c0.000000,-0.800000 0.100000,-1.300000 0.200000,-1.600000c0.200000,-0.300000 0.500000,-0.700000 1.100000,-1.200000c0.400000,-0.400000 0.700000,-0.800000 1.000000,-1.100000s0.400000,-0.800000 0.400000,-1.200000c0.000000,-0.500000 -0.100000,-0.900000 -0.400000,-1.200000c-0.300000,-0.300000 -0.700000,-0.400000 -1.200000,-0.400000c-0.400000,0.000000 -0.800000,0.100000 -1.100000,0.300000c-0.300000,0.200000 -0.400000,0.600000 -0.400000,1.100000l-1.900000,0.000000c0.000000,-1.000000 0.300000,-1.700000 1.000000,-2.200000c0.600000,-0.500000 1.500000,-0.800000 2.500000,-0.800000c1.100000,0.000000 2.000000,0.300000 2.600000,0.800000c0.600000,0.500000 0.900000,1.300000 0.900000,2.300000c0.000000,0.700000 -0.200000,1.300000 -0.600000,1.800000c-0.400000,0.600000 -0.900000,1.100000 -1.500000,1.600000c-0.300000,0.300000 -0.500000,0.500000 -0.600000,0.700000c-0.100000,0.200000 -0.100000,0.600000 -0.100000,1.000000L19.500000,17.700001zM21.400000,21.000000l-1.900000,0.000000l0.000000,-1.800000l1.900000,0.000000L21.400000,21.000000z"/>
+</vector>
diff --git a/core/res/res/drawable/stat_sys_tether_wifi.xml b/core/res/res/drawable/stat_sys_tether_wifi.xml
new file mode 100644
index 0000000..a816db8
--- /dev/null
+++ b/core/res/res/drawable/stat_sys_tether_wifi.xml
@@ -0,0 +1,24 @@
+<!--
+Copyright (C) 2014 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+ android:width="26.0dp"
+ android:height="24.0dp"
+ android:viewportWidth="26.0"
+ android:viewportHeight="24.0">
+ <path
+ android:fillColor="#FFFFFFFF"
+ android:pathData="M13.000000,22.000000L25.600000,6.500000C25.100000,6.100000 20.299999,2.100000 13.000000,2.100000S0.900000,6.100000 0.400000,6.500000L13.000000,22.000000L13.000000,22.000000L13.000000,22.000000L13.000000,22.000000L13.000000,22.000000z"/>
+</vector>
diff --git a/core/res/res/drawable/switch_thumb_material_anim.xml b/core/res/res/drawable/switch_thumb_material_anim.xml
index 67e460a..71f6cfd 100644
--- a/core/res/res/drawable/switch_thumb_material_anim.xml
+++ b/core/res/res/drawable/switch_thumb_material_anim.xml
@@ -19,130 +19,116 @@
<item
android:state_enabled="false"
android:state_checked="true">
- <bitmap
- android:src="@drawable/btn_switch_to_on_mtrl_014"
+ <nine-patch
+ android:src="@drawable/btn_switch_to_on_mtrl_00012"
android:gravity="center"
+ android:tintMode="multiply"
android:tint="?attr/colorControlActivated"
android:alpha="?attr/disabledAlpha" />
</item>
<item android:state_enabled="false">
- <bitmap
- android:src="@drawable/btn_switch_to_on_mtrl_000"
+ <nine-patch
+ android:src="@drawable/btn_switch_to_on_mtrl_00001"
android:gravity="center"
- android:tint="?attr/colorControlNormal"
+ android:tintMode="multiply"
+ android:tint="?attr/colorButtonNormal"
android:alpha="?attr/disabledAlpha" />
</item>
<item
android:state_checked="true"
android:id="@+id/on">
- <bitmap
- android:src="@drawable/btn_switch_to_on_mtrl_014"
+ <nine-patch
+ android:src="@drawable/btn_switch_to_on_mtrl_00012"
android:gravity="center"
+ android:tintMode="multiply"
android:tint="?attr/colorControlActivated" />
</item>
<item android:id="@+id/off">
- <bitmap
- android:src="@drawable/btn_switch_to_on_mtrl_000"
+ <nine-patch
+ android:src="@drawable/btn_switch_to_on_mtrl_00001"
android:gravity="center"
- android:tint="?attr/colorControlNormal" />
+ android:tintMode="multiply"
+ android:tint="?attr/colorButtonNormal" />
</item>
<transition
android:fromId="@+id/off"
android:toId="@+id/on">
<animation-list>
<item android:duration="15">
- <bitmap android:src="@drawable/btn_switch_to_on_mtrl_000" android:gravity="center" android:tint="?attr/colorControlNormal" />
+ <nine-patch android:src="@drawable/btn_switch_to_on_mtrl_00001" android:gravity="center" android:tintMode="multiply" android:tint="?attr/colorButtonNormal" />
</item>
<item android:duration="15">
- <bitmap android:src="@drawable/btn_switch_to_on_mtrl_001" android:gravity="center" android:tint="?attr/colorControlNormal" />
+ <nine-patch android:src="@drawable/btn_switch_to_on_mtrl_00002" android:gravity="center" android:tintMode="multiply" android:tint="?attr/colorButtonNormal" />
</item>
<item android:duration="15">
- <bitmap android:src="@drawable/btn_switch_to_on_mtrl_002" android:gravity="center" android:tint="?attr/colorControlNormal" />
+ <nine-patch android:src="@drawable/btn_switch_to_on_mtrl_00003" android:gravity="center" android:tintMode="multiply" android:tint="?attr/colorButtonNormal" />
</item>
<item android:duration="15">
- <bitmap android:src="@drawable/btn_switch_to_on_mtrl_003" android:gravity="center" android:tint="?attr/colorControlNormal" />
+ <nine-patch android:src="@drawable/btn_switch_to_on_mtrl_00004" android:gravity="center" android:tintMode="multiply" android:tint="?attr/colorButtonNormal" />
</item>
<item android:duration="15">
- <bitmap android:src="@drawable/btn_switch_to_on_mtrl_004" android:gravity="center" android:tint="?attr/colorControlNormal" />
+ <nine-patch android:src="@drawable/btn_switch_to_on_mtrl_00005" android:gravity="center" android:tintMode="multiply" android:tint="?attr/colorButtonNormal" />
</item>
<item android:duration="15">
- <bitmap android:src="@drawable/btn_switch_to_on_mtrl_005" android:gravity="center" android:tint="?attr/colorControlNormal" />
+ <nine-patch android:src="@drawable/btn_switch_to_on_mtrl_00006" android:gravity="center" android:tintMode="multiply" android:tint="?attr/colorButtonNormal" />
</item>
<item android:duration="15">
- <bitmap android:src="@drawable/btn_switch_to_on_mtrl_006" android:gravity="center" android:tint="?attr/colorControlNormal" />
+ <nine-patch android:src="@drawable/btn_switch_to_on_mtrl_00007" android:gravity="center" android:tintMode="multiply" android:tint="?attr/colorControlActivated" />
</item>
<item android:duration="15">
- <bitmap android:src="@drawable/btn_switch_to_on_mtrl_007" android:gravity="center" android:tint="?attr/colorControlActivated" />
+ <nine-patch android:src="@drawable/btn_switch_to_on_mtrl_00008" android:gravity="center" android:tintMode="multiply" android:tint="?attr/colorControlActivated" />
</item>
<item android:duration="15">
- <bitmap android:src="@drawable/btn_switch_to_on_mtrl_008" android:gravity="center" android:tint="?attr/colorControlActivated" />
+ <nine-patch android:src="@drawable/btn_switch_to_on_mtrl_00009" android:gravity="center" android:tintMode="multiply" android:tint="?attr/colorControlActivated" />
</item>
<item android:duration="15">
- <bitmap android:src="@drawable/btn_switch_to_on_mtrl_009" android:gravity="center" android:tint="?attr/colorControlActivated" />
+ <nine-patch android:src="@drawable/btn_switch_to_on_mtrl_00010" android:gravity="center" android:tintMode="multiply" android:tint="?attr/colorControlActivated" />
</item>
<item android:duration="15">
- <bitmap android:src="@drawable/btn_switch_to_on_mtrl_010" android:gravity="center" android:tint="?attr/colorControlActivated" />
+ <nine-patch android:src="@drawable/btn_switch_to_on_mtrl_00011" android:gravity="center" android:tintMode="multiply" android:tint="?attr/colorControlActivated" />
</item>
<item android:duration="15">
- <bitmap android:src="@drawable/btn_switch_to_on_mtrl_011" android:gravity="center" android:tint="?attr/colorControlActivated" />
- </item>
- <item android:duration="15">
- <bitmap android:src="@drawable/btn_switch_to_on_mtrl_012" android:gravity="center" android:tint="?attr/colorControlActivated" />
- </item>
- <item android:duration="15">
- <bitmap android:src="@drawable/btn_switch_to_on_mtrl_013" android:gravity="center" android:tint="?attr/colorControlActivated" />
- </item>
- <item android:duration="15">
- <bitmap android:src="@drawable/btn_switch_to_on_mtrl_014" android:gravity="center" android:tint="?attr/colorControlActivated" />
+ <nine-patch android:src="@drawable/btn_switch_to_on_mtrl_00012" android:gravity="center" android:tintMode="multiply" android:tint="?attr/colorControlActivated" />
</item>
</animation-list>
</transition>
<transition android:fromId="@+id/on" android:toId="@+id/off">
<animation-list>
<item android:duration="15">
- <bitmap android:src="@drawable/btn_switch_to_off_mtrl_000" android:gravity="center" android:tint="?attr/colorControlActivated" />
+ <nine-patch android:src="@drawable/btn_switch_to_off_mtrl_00001" android:gravity="center" android:tintMode="multiply" android:tint="?attr/colorControlActivated" />
</item>
<item android:duration="15">
- <bitmap android:src="@drawable/btn_switch_to_off_mtrl_001" android:gravity="center" android:tint="?attr/colorControlActivated" />
+ <nine-patch android:src="@drawable/btn_switch_to_off_mtrl_00002" android:gravity="center" android:tintMode="multiply" android:tint="?attr/colorControlActivated" />
</item>
<item android:duration="15">
- <bitmap android:src="@drawable/btn_switch_to_off_mtrl_002" android:gravity="center" android:tint="?attr/colorControlActivated" />
+ <nine-patch android:src="@drawable/btn_switch_to_off_mtrl_00003" android:gravity="center" android:tintMode="multiply" android:tint="?attr/colorControlActivated" />
</item>
<item android:duration="15">
- <bitmap android:src="@drawable/btn_switch_to_off_mtrl_003" android:gravity="center" android:tint="?attr/colorControlActivated" />
+ <nine-patch android:src="@drawable/btn_switch_to_off_mtrl_00004" android:gravity="center" android:tintMode="multiply" android:tint="?attr/colorControlActivated" />
</item>
<item android:duration="15">
- <bitmap android:src="@drawable/btn_switch_to_off_mtrl_004" android:gravity="center" android:tint="?attr/colorControlActivated" />
+ <nine-patch android:src="@drawable/btn_switch_to_off_mtrl_00005" android:gravity="center" android:tintMode="multiply" android:tint="?attr/colorControlActivated" />
</item>
<item android:duration="15">
- <bitmap android:src="@drawable/btn_switch_to_off_mtrl_005" android:gravity="center" android:tint="?attr/colorControlActivated" />
+ <nine-patch android:src="@drawable/btn_switch_to_off_mtrl_00006" android:gravity="center" android:tintMode="multiply" android:tint="?attr/colorControlActivated" />
</item>
<item android:duration="15">
- <bitmap android:src="@drawable/btn_switch_to_off_mtrl_006" android:gravity="center" android:tint="?attr/colorControlActivated" />
+ <nine-patch android:src="@drawable/btn_switch_to_off_mtrl_00007" android:gravity="center" android:tintMode="multiply" android:tint="?attr/colorButtonNormal" />
</item>
<item android:duration="15">
- <bitmap android:src="@drawable/btn_switch_to_off_mtrl_007" android:gravity="center" android:tint="?attr/colorControlNormal" />
+ <nine-patch android:src="@drawable/btn_switch_to_off_mtrl_00008" android:gravity="center" android:tintMode="multiply" android:tint="?attr/colorButtonNormal" />
</item>
<item android:duration="15">
- <bitmap android:src="@drawable/btn_switch_to_off_mtrl_008" android:gravity="center" android:tint="?attr/colorControlNormal" />
+ <nine-patch android:src="@drawable/btn_switch_to_off_mtrl_00009" android:gravity="center" android:tintMode="multiply" android:tint="?attr/colorButtonNormal" />
</item>
<item android:duration="15">
- <bitmap android:src="@drawable/btn_switch_to_off_mtrl_009" android:gravity="center" android:tint="?attr/colorControlNormal" />
+ <nine-patch android:src="@drawable/btn_switch_to_off_mtrl_00010" android:gravity="center" android:tintMode="multiply" android:tint="?attr/colorButtonNormal" />
</item>
<item android:duration="15">
- <bitmap android:src="@drawable/btn_switch_to_off_mtrl_010" android:gravity="center" android:tint="?attr/colorControlNormal" />
+ <nine-patch android:src="@drawable/btn_switch_to_off_mtrl_00011" android:gravity="center" android:tintMode="multiply" android:tint="?attr/colorButtonNormal" />
</item>
<item android:duration="15">
- <bitmap android:src="@drawable/btn_switch_to_off_mtrl_011" android:gravity="center" android:tint="?attr/colorControlNormal" />
- </item>
- <item android:duration="15">
- <bitmap android:src="@drawable/btn_switch_to_off_mtrl_012" android:gravity="center" android:tint="?attr/colorControlNormal" />
- </item>
- <item android:duration="15">
- <bitmap android:src="@drawable/btn_switch_to_off_mtrl_013" android:gravity="center" android:tint="?attr/colorControlNormal" />
- </item>
- <item android:duration="15">
- <bitmap android:src="@drawable/btn_switch_to_off_mtrl_014" android:gravity="center" android:tint="?attr/colorControlNormal" />
+ <nine-patch android:src="@drawable/btn_switch_to_off_mtrl_00012" android:gravity="center" android:tintMode="multiply" android:tint="?attr/colorButtonNormal" />
</item>
</animation-list>
</transition>
diff --git a/core/res/res/drawable/switch_track_material.xml b/core/res/res/drawable/switch_track_material.xml
index 6ca2489..b400644 100644
--- a/core/res/res/drawable/switch_track_material.xml
+++ b/core/res/res/drawable/switch_track_material.xml
@@ -18,19 +18,21 @@
<item android:state_enabled="false" android:state_checked="true">
<nine-patch android:src="@drawable/switch_track_mtrl_alpha"
android:tint="?attr/colorControlActivated"
- android:alpha="?attr/disabledAlpha" />
+ android:alpha="0.15" />
</item>
<item android:state_enabled="false">
<nine-patch android:src="@drawable/switch_track_mtrl_alpha"
- android:tint="?attr/colorControlNormal"
- android:alpha="?attr/disabledAlpha" />
+ android:tint="?attr/colorButtonNormal"
+ android:alpha="0.15" />
</item>
<item android:state_checked="true">
<nine-patch android:src="@drawable/switch_track_mtrl_alpha"
- android:tint="?attr/colorControlActivated" />
+ android:tint="?attr/colorControlActivated"
+ android:alpha="0.3" />
</item>
<item>
<nine-patch android:src="@drawable/switch_track_mtrl_alpha"
- android:tint="?attr/colorControlNormal" />
+ android:tint="?attr/colorButtonNormal"
+ android:alpha="0.3" />
</item>
</selector>
diff --git a/core/res/res/layout/input_method_switch_dialog_title.xml b/core/res/res/layout/input_method_switch_dialog_title.xml
index e11a523..d498d23 100644
--- a/core/res/res/layout/input_method_switch_dialog_title.xml
+++ b/core/res/res/layout/input_method_switch_dialog_title.xml
@@ -33,7 +33,7 @@
<com.android.internal.widget.DialogTitle
android:id="@+id/alertTitle"
- style="@android:style/DialogWindowTitle.Holo"
+ style="@android:style/DialogWindowTitle.DeviceDefault"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:ellipsize="end"
@@ -49,11 +49,6 @@
android:layout_height="wrap_content"
android:orientation="vertical" >
- <View
- android:layout_width="match_parent"
- android:layout_height="2dip"
- android:background="@android:color/holo_blue_light" />
-
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
@@ -97,12 +92,10 @@
android:layout_gravity="center_vertical"
android:layout_marginEnd="12dip" />
</LinearLayout>
+
+ <View
+ android:layout_width="match_parent"
+ android:layout_height="1dp"
+ android:background="?android:attr/listDividerAlertDialog" />
</LinearLayout>
-
- <View
- android:id="@+id/titleDivider"
- android:layout_width="match_parent"
- android:layout_height="2dip"
- android:background="@android:drawable/divider_horizontal_dark" />
-
-</LinearLayout>
\ No newline at end of file
+</LinearLayout>
diff --git a/core/res/res/layout/input_method_switch_item.xml b/core/res/res/layout/input_method_switch_item.xml
new file mode 100644
index 0000000..cfa8b31
--- /dev/null
+++ b/core/res/res/layout/input_method_switch_item.xml
@@ -0,0 +1,63 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2014 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:orientation="horizontal"
+ android:gravity="center_vertical"
+ android:paddingStart="16dip"
+ android:paddingEnd="12dip"
+ android:minHeight="?attr/listPreferredItemHeightSmall"
+ android:background="@color/transparent">
+
+ <RadioButton
+ android:id="@+id/radio"
+ android:layout_width="35dip"
+ android:layout_height="wrap_content"
+ android:paddingEnd="12dip"
+ android:gravity="center_vertical"
+ android:focusable="false"
+ android:clickable="false" />
+
+ <LinearLayout
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_weight="1"
+ android:orientation="vertical"
+ android:gravity="center_vertical">
+
+ <TextView android:id="@android:id/text1"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:textAppearance="?attr/textAppearanceListItem"
+ android:textColor="?attr/textColorAlertDialogListItem"
+ android:gravity="center_vertical|start"
+ android:singleLine="true"
+ android:ellipsize="marquee" />
+
+ <TextView android:id="@android:id/text2"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:textAppearance="?attr/textAppearanceListItemSecondary"
+ android:textColor="?attr/textColorAlertDialogListItem"
+ android:gravity="center_vertical|start"
+ android:singleLine="true"
+ android:ellipsize="marquee" />
+
+ </LinearLayout>
+
+</LinearLayout>
diff --git a/core/res/res/values-af/strings.xml b/core/res/res/values-af/strings.xml
index f1d2d38..2932cdd 100644
--- a/core/res/res/values-af/strings.xml
+++ b/core/res/res/values-af/strings.xml
@@ -1339,8 +1339,10 @@
<string name="extmedia_format_button_format" msgid="4131064560127478695">"Formaat"</string>
<string name="adb_active_notification_title" msgid="6729044778949189918">"USB-ontfouter gekoppel"</string>
<string name="adb_active_notification_message" msgid="1016654627626476142">"Raak om USB-ontfouting te deaktiveer."</string>
- <string name="select_input_method" msgid="4653387336791222978">"Kies invoermetode"</string>
- <string name="configure_input_methods" msgid="9091652157722495116">"Stel invoermetodes op"</string>
+ <!-- no translation found for select_input_method (8547250819326693584) -->
+ <skip />
+ <!-- no translation found for configure_input_methods (4769971288371946846) -->
+ <skip />
<string name="use_physical_keyboard" msgid="6203112478095117625">"Fisiese sleutelbord"</string>
<string name="hardware" msgid="7517821086888990278">"Hardeware"</string>
<string name="select_keyboard_layout_notification_title" msgid="1407367017263030773">"Kies sleutelborduitleg"</string>
@@ -1384,8 +1386,8 @@
<string name="permdesc_control_keyguard" msgid="3043732290518629061">"Laat \'n program toe om keyguard te beheer."</string>
<string name="permlab_trust_listener" msgid="1765718054003704476">"Luister na vertrouenstaatveranderinge."</string>
<string name="permdesc_trust_listener" msgid="8233895334214716864">"Laat \'n program toe om vir veranderinge in vertrouenstaat te luister."</string>
- <string name="permlab_provide_trust_agent" msgid="5465587586091358316">"Voorsien \'n vertroude agent."</string>
- <string name="permdesc_provide_trust_agent" msgid="3865702641053068148">"Laat \'n program toe om \'n vertroude agent te voorsien."</string>
+ <string name="permlab_provide_trust_agent" msgid="5465587586091358316">"Voorsien \'n vertrouensagent."</string>
+ <string name="permdesc_provide_trust_agent" msgid="3865702641053068148">"Laat \'n program toe om \'n vertrouensagent te voorsien."</string>
<string name="permlab_launch_trust_agent_settings" msgid="5859430082240410200">"Begin instellingskieslys vir vertrouensagent"</string>
<string name="permdesc_launch_trust_agent_settings" msgid="8185142708644913381">"Laat \'n program toe om \'n aktiwiteit te begin wat die vertrouensagentgedrag verander."</string>
<string name="permlab_bind_trust_agent_service" msgid="8242093169457695334">"Verbind met \'n vertrouensagentdiens"</string>
@@ -1633,8 +1635,7 @@
<string name="user_switched" msgid="3768006783166984410">"Huidige gebruiker <xliff:g id="NAME">%1$s</xliff:g> ."</string>
<string name="owner_name" msgid="2716755460376028154">"Eienaar"</string>
<string name="error_message_title" msgid="4510373083082500195">"Fout"</string>
- <!-- no translation found for error_message_change_not_allowed (1347282344200417578) -->
- <skip />
+ <string name="error_message_change_not_allowed" msgid="1347282344200417578">"Hierdie verandering word nie deur jou administrateur toegelaat nie"</string>
<string name="app_not_found" msgid="3429141853498927379">"Geen program gevind om hierdie handeling te hanteer nie"</string>
<string name="revoke" msgid="5404479185228271586">"Herroep"</string>
<string name="mediasize_iso_a0" msgid="1994474252931294172">"ISO A0"</string>
@@ -1765,4 +1766,40 @@
<string name="lock_to_app_unlock_pin" msgid="7908385370846820001">"PIN"</string>
<string name="lock_to_app_unlock_pattern" msgid="7763071104790758405">"ontsluitpatroon"</string>
<string name="lock_to_app_unlock_password" msgid="795224196583495868">"wagwoord"</string>
+ <!-- no translation found for description_ustvpg (3666171166900312727) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_d (6552868431924879897) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_l (2427588153488291892) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_s (2556047043212535339) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_v (6647466085048806213) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_fv (4015953953338931020) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_y (2271448022073929890) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_y7 (8931861188215869211) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_g (506861774854051282) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_pg (4238749719629801564) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_14 (6305164472373004907) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_ma (5842074394338699982) -->
+ <skip />
+ <!-- no translation found for description_krtv_all (11497981488871053) -->
+ <skip />
+ <!-- no translation found for description_krtv_7 (6204900788594114856) -->
+ <skip />
+ <!-- no translation found for description_krtv_12 (5134514644432355428) -->
+ <skip />
+ <!-- no translation found for description_krtv_15 (1183692678647313272) -->
+ <skip />
+ <!-- no translation found for description_krtv_19 (7021986912313208481) -->
+ <skip />
+ <!-- no translation found for battery_saver_description (724302068634956656) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-am/strings.xml b/core/res/res/values-am/strings.xml
index 2bc8f20..69eacc8 100644
--- a/core/res/res/values-am/strings.xml
+++ b/core/res/res/values-am/strings.xml
@@ -1339,8 +1339,10 @@
<string name="extmedia_format_button_format" msgid="4131064560127478695">"ቅርጸት"</string>
<string name="adb_active_notification_title" msgid="6729044778949189918">"USB አድስ ተያይዟል"</string>
<string name="adb_active_notification_message" msgid="1016654627626476142">"USB ማረሚያ ላለማንቃት ዳስስ።"</string>
- <string name="select_input_method" msgid="4653387336791222978">"የግቤት ስልት ምረጥ"</string>
- <string name="configure_input_methods" msgid="9091652157722495116">"የግቤት ስልቶችን አዘጋጅ"</string>
+ <!-- no translation found for select_input_method (8547250819326693584) -->
+ <skip />
+ <!-- no translation found for configure_input_methods (4769971288371946846) -->
+ <skip />
<string name="use_physical_keyboard" msgid="6203112478095117625">"የሚዳሰስ የቁልፍ ሰሌዳ"</string>
<string name="hardware" msgid="7517821086888990278">"ሃርድዌር"</string>
<string name="select_keyboard_layout_notification_title" msgid="1407367017263030773">"የቁልፍ ሰሌዳ አቀማመጥ ምረጥ"</string>
@@ -1385,9 +1387,9 @@
<string name="permlab_trust_listener" msgid="1765718054003704476">"የተአማኒነት ሁኔታ ለውጦችን አዳምጥ።"</string>
<string name="permdesc_trust_listener" msgid="8233895334214716864">"መተግበሪያው በተአማኒነት ሁኔታ ውስጥ ለውጦችን እንዲያዳምጥ ይፈቅዳል።"</string>
<string name="permlab_provide_trust_agent" msgid="5465587586091358316">"የመታመን ወኪል ያቅርቡ።"</string>
- <string name="permdesc_provide_trust_agent" msgid="3865702641053068148">"አንድ መተግበሪያ የመታመን ወኪል እንዲያቀርብ ይፈቅድለታል።"</string>
- <string name="permlab_launch_trust_agent_settings" msgid="5859430082240410200">"የሚታመን ወኪል ቅንብሮች ምናሌ ያስጀምራል።"</string>
- <string name="permdesc_launch_trust_agent_settings" msgid="8185142708644913381">"አንድ መተግበሪያ የሚታመነው ወኪል ባህሪ የሚቀይር እንቅስቃሴ እንዲያስጀምር ያስችለዋል።"</string>
+ <string name="permdesc_provide_trust_agent" msgid="3865702641053068148">"አንድ መተግበሪያ የተአማኒነት ወኪል እንዲያቀርብ ይፈቅድለታል።"</string>
+ <string name="permlab_launch_trust_agent_settings" msgid="5859430082240410200">"የተአማኒነት ወኪል ቅንብሮች ምናሌ ያስጀምራል።"</string>
+ <string name="permdesc_launch_trust_agent_settings" msgid="8185142708644913381">"አንድ መተግበሪያ የተአማኒነት ወኪል ባህሪ የሚቀይር እንቅስቃሴ እንዲያስጀምር ያስችለዋል።"</string>
<string name="permlab_bind_trust_agent_service" msgid="8242093169457695334">"ለተአማኒነት ወኪል አገልግሎት ተገዢ አድርግ"</string>
<string name="permdesc_bind_trust_agent_service" msgid="7041930026024507515">"ለመተግበሪያን የተአማኒነት ወኪል አገልግሎትን እንዲያከብር ይፈቅዳል።"</string>
<string name="permlab_recovery" msgid="3157024487744125846">"ከዝማኔዎች እና ከመልሶ ማግኛ ስርዓቶች ጋር ይገናኙ"</string>
@@ -1633,8 +1635,7 @@
<string name="user_switched" msgid="3768006783166984410">"የአሁኑ ተጠቃሚ <xliff:g id="NAME">%1$s</xliff:g>።"</string>
<string name="owner_name" msgid="2716755460376028154">"ባለቤት"</string>
<string name="error_message_title" msgid="4510373083082500195">"ስህተት"</string>
- <!-- no translation found for error_message_change_not_allowed (1347282344200417578) -->
- <skip />
+ <string name="error_message_change_not_allowed" msgid="1347282344200417578">"ይህ ለውጥ በአስተዳዳሪዎ አይፈቀድም"</string>
<string name="app_not_found" msgid="3429141853498927379">"ይህን እርምጃ የሚያከናውን ምንም መተግበሪያ አልተገኘም"</string>
<string name="revoke" msgid="5404479185228271586">"ሻር"</string>
<string name="mediasize_iso_a0" msgid="1994474252931294172">"አይ ኤስ ኦ ኤ0"</string>
@@ -1765,4 +1766,40 @@
<string name="lock_to_app_unlock_pin" msgid="7908385370846820001">"ፒን"</string>
<string name="lock_to_app_unlock_pattern" msgid="7763071104790758405">"የማስከፈቻ ስርዓተ-ጥለት"</string>
<string name="lock_to_app_unlock_password" msgid="795224196583495868">"የይለፍ ቃል"</string>
+ <!-- no translation found for description_ustvpg (3666171166900312727) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_d (6552868431924879897) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_l (2427588153488291892) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_s (2556047043212535339) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_v (6647466085048806213) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_fv (4015953953338931020) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_y (2271448022073929890) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_y7 (8931861188215869211) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_g (506861774854051282) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_pg (4238749719629801564) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_14 (6305164472373004907) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_ma (5842074394338699982) -->
+ <skip />
+ <!-- no translation found for description_krtv_all (11497981488871053) -->
+ <skip />
+ <!-- no translation found for description_krtv_7 (6204900788594114856) -->
+ <skip />
+ <!-- no translation found for description_krtv_12 (5134514644432355428) -->
+ <skip />
+ <!-- no translation found for description_krtv_15 (1183692678647313272) -->
+ <skip />
+ <!-- no translation found for description_krtv_19 (7021986912313208481) -->
+ <skip />
+ <!-- no translation found for battery_saver_description (724302068634956656) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-ar/strings.xml b/core/res/res/values-ar/strings.xml
index a9bef04..0ed9220 100644
--- a/core/res/res/values-ar/strings.xml
+++ b/core/res/res/values-ar/strings.xml
@@ -1339,8 +1339,10 @@
<string name="extmedia_format_button_format" msgid="4131064560127478695">"تنسيق"</string>
<string name="adb_active_notification_title" msgid="6729044778949189918">"تم توصيل تصحيح أخطاء USB"</string>
<string name="adb_active_notification_message" msgid="1016654627626476142">"المس لتعطيل تصحيح أخطاء USB."</string>
- <string name="select_input_method" msgid="4653387336791222978">"اختيار أسلوب الإدخال"</string>
- <string name="configure_input_methods" msgid="9091652157722495116">"إعداد أسلوب الإدخال"</string>
+ <!-- no translation found for select_input_method (8547250819326693584) -->
+ <skip />
+ <!-- no translation found for configure_input_methods (4769971288371946846) -->
+ <skip />
<string name="use_physical_keyboard" msgid="6203112478095117625">"لوحة مفاتيح فعلية"</string>
<string name="hardware" msgid="7517821086888990278">"أجهزة"</string>
<string name="select_keyboard_layout_notification_title" msgid="1407367017263030773">"تحديد تخطيط لوحة مفاتيح"</string>
@@ -1633,8 +1635,7 @@
<string name="user_switched" msgid="3768006783166984410">"المستخدم الحالي <xliff:g id="NAME">%1$s</xliff:g>."</string>
<string name="owner_name" msgid="2716755460376028154">"المالك"</string>
<string name="error_message_title" msgid="4510373083082500195">"خطأ"</string>
- <!-- no translation found for error_message_change_not_allowed (1347282344200417578) -->
- <skip />
+ <string name="error_message_change_not_allowed" msgid="1347282344200417578">"لا يسمح المشرف بإجراء هذا التغيير"</string>
<string name="app_not_found" msgid="3429141853498927379">"لم يتم العثور على تطبيق يمكنه التعامل مع هذا الإجراء."</string>
<string name="revoke" msgid="5404479185228271586">"إلغاء"</string>
<string name="mediasize_iso_a0" msgid="1994474252931294172">"ISO A0"</string>
@@ -1765,4 +1766,40 @@
<string name="lock_to_app_unlock_pin" msgid="7908385370846820001">"رقم التعريف الشخصي"</string>
<string name="lock_to_app_unlock_pattern" msgid="7763071104790758405">"نقش إلغاء القفل"</string>
<string name="lock_to_app_unlock_password" msgid="795224196583495868">"كلمة المرور"</string>
+ <!-- no translation found for description_ustvpg (3666171166900312727) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_d (6552868431924879897) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_l (2427588153488291892) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_s (2556047043212535339) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_v (6647466085048806213) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_fv (4015953953338931020) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_y (2271448022073929890) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_y7 (8931861188215869211) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_g (506861774854051282) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_pg (4238749719629801564) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_14 (6305164472373004907) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_ma (5842074394338699982) -->
+ <skip />
+ <!-- no translation found for description_krtv_all (11497981488871053) -->
+ <skip />
+ <!-- no translation found for description_krtv_7 (6204900788594114856) -->
+ <skip />
+ <!-- no translation found for description_krtv_12 (5134514644432355428) -->
+ <skip />
+ <!-- no translation found for description_krtv_15 (1183692678647313272) -->
+ <skip />
+ <!-- no translation found for description_krtv_19 (7021986912313208481) -->
+ <skip />
+ <!-- no translation found for battery_saver_description (724302068634956656) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-bg/strings.xml b/core/res/res/values-bg/strings.xml
index b0c7b74..96cc322 100644
--- a/core/res/res/values-bg/strings.xml
+++ b/core/res/res/values-bg/strings.xml
@@ -1339,8 +1339,10 @@
<string name="extmedia_format_button_format" msgid="4131064560127478695">"Форматиране"</string>
<string name="adb_active_notification_title" msgid="6729044778949189918">"Отстраняването на грешки през USB е свързано"</string>
<string name="adb_active_notification_message" msgid="1016654627626476142">"Докоснете, за да деактивирате отстраняването на грешки през USB."</string>
- <string name="select_input_method" msgid="4653387336791222978">"Избор на метод на въвеждане"</string>
- <string name="configure_input_methods" msgid="9091652157722495116">"Методи на въвеждане: Настройка"</string>
+ <!-- no translation found for select_input_method (8547250819326693584) -->
+ <skip />
+ <!-- no translation found for configure_input_methods (4769971288371946846) -->
+ <skip />
<string name="use_physical_keyboard" msgid="6203112478095117625">"Физическа клавиатура"</string>
<string name="hardware" msgid="7517821086888990278">"Хардуер"</string>
<string name="select_keyboard_layout_notification_title" msgid="1407367017263030773">"Избиране на клавиатурна подредба"</string>
@@ -1633,8 +1635,7 @@
<string name="user_switched" msgid="3768006783166984410">"Текущ потребител <xliff:g id="NAME">%1$s</xliff:g>."</string>
<string name="owner_name" msgid="2716755460376028154">"Собственик"</string>
<string name="error_message_title" msgid="4510373083082500195">"Грешка"</string>
- <!-- no translation found for error_message_change_not_allowed (1347282344200417578) -->
- <skip />
+ <string name="error_message_change_not_allowed" msgid="1347282344200417578">"Тази промяна не е разрешена от администратора ви"</string>
<string name="app_not_found" msgid="3429141853498927379">"Няма намерено приложение за извършване на това действие"</string>
<string name="revoke" msgid="5404479185228271586">"Отмяна"</string>
<string name="mediasize_iso_a0" msgid="1994474252931294172">"ISO A0"</string>
@@ -1765,4 +1766,40 @@
<string name="lock_to_app_unlock_pin" msgid="7908385370846820001">"ПИН код"</string>
<string name="lock_to_app_unlock_pattern" msgid="7763071104790758405">"фигура за отключване"</string>
<string name="lock_to_app_unlock_password" msgid="795224196583495868">"парола"</string>
+ <!-- no translation found for description_ustvpg (3666171166900312727) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_d (6552868431924879897) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_l (2427588153488291892) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_s (2556047043212535339) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_v (6647466085048806213) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_fv (4015953953338931020) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_y (2271448022073929890) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_y7 (8931861188215869211) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_g (506861774854051282) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_pg (4238749719629801564) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_14 (6305164472373004907) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_ma (5842074394338699982) -->
+ <skip />
+ <!-- no translation found for description_krtv_all (11497981488871053) -->
+ <skip />
+ <!-- no translation found for description_krtv_7 (6204900788594114856) -->
+ <skip />
+ <!-- no translation found for description_krtv_12 (5134514644432355428) -->
+ <skip />
+ <!-- no translation found for description_krtv_15 (1183692678647313272) -->
+ <skip />
+ <!-- no translation found for description_krtv_19 (7021986912313208481) -->
+ <skip />
+ <!-- no translation found for battery_saver_description (724302068634956656) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-bn-rBD/strings.xml b/core/res/res/values-bn-rBD/strings.xml
index 1e6dbf4..0de83e7 100644
--- a/core/res/res/values-bn-rBD/strings.xml
+++ b/core/res/res/values-bn-rBD/strings.xml
@@ -1339,8 +1339,10 @@
<string name="extmedia_format_button_format" msgid="4131064560127478695">"ফর্ম্যাট করুন"</string>
<string name="adb_active_notification_title" msgid="6729044778949189918">"USB ডিবাগিং সংযুক্ত হয়েছে"</string>
<string name="adb_active_notification_message" msgid="1016654627626476142">"USB ডিবাগিং অক্ষম করতে স্পর্শ করুন৷"</string>
- <string name="select_input_method" msgid="4653387336791222978">"ইনপুট পদ্ধতি নির্বাচন করুন"</string>
- <string name="configure_input_methods" msgid="9091652157722495116">"ইনপুট পদ্ধতিগুলি সেট আপ করুন"</string>
+ <!-- no translation found for select_input_method (8547250819326693584) -->
+ <skip />
+ <!-- no translation found for configure_input_methods (4769971288371946846) -->
+ <skip />
<string name="use_physical_keyboard" msgid="6203112478095117625">"ফিজিক্যাল কীবোর্ড"</string>
<string name="hardware" msgid="7517821086888990278">"হার্ডওয়্যার"</string>
<string name="select_keyboard_layout_notification_title" msgid="1407367017263030773">"কীবোর্ডের লেআউট নির্বাচন করুন"</string>
@@ -1633,8 +1635,7 @@
<string name="user_switched" msgid="3768006783166984410">"বর্তমান ব্যবহারকারী <xliff:g id="NAME">%1$s</xliff:g>৷"</string>
<string name="owner_name" msgid="2716755460376028154">"মালিক"</string>
<string name="error_message_title" msgid="4510373083082500195">"ত্রুটি"</string>
- <!-- no translation found for error_message_change_not_allowed (1347282344200417578) -->
- <skip />
+ <string name="error_message_change_not_allowed" msgid="1347282344200417578">"এই পরিবর্তনটি আপনার প্রশাসক দ্বারা অনুমোদিত নয়"</string>
<string name="app_not_found" msgid="3429141853498927379">"এই ক্রিয়াটিকে চালনা করার জন্য কোনো অ্যাপ্লিকেশান পাওয়া যায়নি"</string>
<string name="revoke" msgid="5404479185228271586">"প্রত্যাহার করুন"</string>
<string name="mediasize_iso_a0" msgid="1994474252931294172">"ISO A0"</string>
@@ -1765,4 +1766,40 @@
<string name="lock_to_app_unlock_pin" msgid="7908385370846820001">"PIN"</string>
<string name="lock_to_app_unlock_pattern" msgid="7763071104790758405">"আনলক প্যাটার্ন"</string>
<string name="lock_to_app_unlock_password" msgid="795224196583495868">"পাসওয়ার্ড"</string>
+ <!-- no translation found for description_ustvpg (3666171166900312727) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_d (6552868431924879897) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_l (2427588153488291892) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_s (2556047043212535339) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_v (6647466085048806213) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_fv (4015953953338931020) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_y (2271448022073929890) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_y7 (8931861188215869211) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_g (506861774854051282) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_pg (4238749719629801564) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_14 (6305164472373004907) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_ma (5842074394338699982) -->
+ <skip />
+ <!-- no translation found for description_krtv_all (11497981488871053) -->
+ <skip />
+ <!-- no translation found for description_krtv_7 (6204900788594114856) -->
+ <skip />
+ <!-- no translation found for description_krtv_12 (5134514644432355428) -->
+ <skip />
+ <!-- no translation found for description_krtv_15 (1183692678647313272) -->
+ <skip />
+ <!-- no translation found for description_krtv_19 (7021986912313208481) -->
+ <skip />
+ <!-- no translation found for battery_saver_description (724302068634956656) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-ca/strings.xml b/core/res/res/values-ca/strings.xml
index 510747f..5805693 100644
--- a/core/res/res/values-ca/strings.xml
+++ b/core/res/res/values-ca/strings.xml
@@ -1339,8 +1339,10 @@
<string name="extmedia_format_button_format" msgid="4131064560127478695">"Formata"</string>
<string name="adb_active_notification_title" msgid="6729044778949189918">"Depuració USB activada"</string>
<string name="adb_active_notification_message" msgid="1016654627626476142">"Toca per desactivar la depuració USB"</string>
- <string name="select_input_method" msgid="4653387336791222978">"Selecciona un mètode d\'entrada"</string>
- <string name="configure_input_methods" msgid="9091652157722495116">"Configura els mètodes d\'entrada"</string>
+ <!-- no translation found for select_input_method (8547250819326693584) -->
+ <skip />
+ <!-- no translation found for configure_input_methods (4769971288371946846) -->
+ <skip />
<string name="use_physical_keyboard" msgid="6203112478095117625">"Teclat físic"</string>
<string name="hardware" msgid="7517821086888990278">"Maquinari"</string>
<string name="select_keyboard_layout_notification_title" msgid="1407367017263030773">"Selecciona una disposició de teclat"</string>
@@ -1388,8 +1390,8 @@
<string name="permdesc_provide_trust_agent" msgid="3865702641053068148">"Permet que una aplicació proporcioni un agent de confiança."</string>
<string name="permlab_launch_trust_agent_settings" msgid="5859430082240410200">"Iniciar el menú de configuració de l\'agent de confiança"</string>
<string name="permdesc_launch_trust_agent_settings" msgid="8185142708644913381">"Permet que una aplicació iniciï una activitat que modifiqui el comportament de l\'agent de confiança."</string>
- <string name="permlab_bind_trust_agent_service" msgid="8242093169457695334">"Enllaçar amb el servei d\'un agent de confiança"</string>
- <string name="permdesc_bind_trust_agent_service" msgid="7041930026024507515">"Permet que una aplicació es vinculi amb el servei d\'un agent de confiança."</string>
+ <string name="permlab_bind_trust_agent_service" msgid="8242093169457695334">"Enllaçar amb un servei d\'agent de confiança"</string>
+ <string name="permdesc_bind_trust_agent_service" msgid="7041930026024507515">"Permet que una aplicació es vinculi amb un servei d\'agent de confiança."</string>
<string name="permlab_recovery" msgid="3157024487744125846">"Interacciona amb el sistema de recuperació i amb les actualitzacions"</string>
<string name="permdesc_recovery" msgid="8511774533266359571">"Permet que una aplicació interaccioni amb el sistema de recuperació i amb les actualitzacions del sistema."</string>
<string name="permlab_createMediaProjection" msgid="4941338725487978112">"Creació de sessions de projecció de fitxers multimèdia"</string>
@@ -1633,8 +1635,7 @@
<string name="user_switched" msgid="3768006783166984410">"Usuari actual: <xliff:g id="NAME">%1$s</xliff:g>."</string>
<string name="owner_name" msgid="2716755460376028154">"Propietari"</string>
<string name="error_message_title" msgid="4510373083082500195">"Error"</string>
- <!-- no translation found for error_message_change_not_allowed (1347282344200417578) -->
- <skip />
+ <string name="error_message_change_not_allowed" msgid="1347282344200417578">"L\'administrador no permet aquest canvi."</string>
<string name="app_not_found" msgid="3429141853498927379">"No s\'ha trobat cap aplicació per processar aquesta acció"</string>
<string name="revoke" msgid="5404479185228271586">"Revoca"</string>
<string name="mediasize_iso_a0" msgid="1994474252931294172">"ISO A0"</string>
@@ -1765,4 +1766,40 @@
<string name="lock_to_app_unlock_pin" msgid="7908385370846820001">"PIN"</string>
<string name="lock_to_app_unlock_pattern" msgid="7763071104790758405">"patró de desbloqueig"</string>
<string name="lock_to_app_unlock_password" msgid="795224196583495868">"contrasenya"</string>
+ <!-- no translation found for description_ustvpg (3666171166900312727) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_d (6552868431924879897) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_l (2427588153488291892) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_s (2556047043212535339) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_v (6647466085048806213) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_fv (4015953953338931020) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_y (2271448022073929890) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_y7 (8931861188215869211) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_g (506861774854051282) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_pg (4238749719629801564) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_14 (6305164472373004907) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_ma (5842074394338699982) -->
+ <skip />
+ <!-- no translation found for description_krtv_all (11497981488871053) -->
+ <skip />
+ <!-- no translation found for description_krtv_7 (6204900788594114856) -->
+ <skip />
+ <!-- no translation found for description_krtv_12 (5134514644432355428) -->
+ <skip />
+ <!-- no translation found for description_krtv_15 (1183692678647313272) -->
+ <skip />
+ <!-- no translation found for description_krtv_19 (7021986912313208481) -->
+ <skip />
+ <!-- no translation found for battery_saver_description (724302068634956656) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-cs/strings.xml b/core/res/res/values-cs/strings.xml
index 6af130a..a4ed53c 100644
--- a/core/res/res/values-cs/strings.xml
+++ b/core/res/res/values-cs/strings.xml
@@ -1339,8 +1339,10 @@
<string name="extmedia_format_button_format" msgid="4131064560127478695">"Formátovat"</string>
<string name="adb_active_notification_title" msgid="6729044778949189918">"Ladění přes rozhraní USB připojeno"</string>
<string name="adb_active_notification_message" msgid="1016654627626476142">"Dotykem zakážete ladění USB."</string>
- <string name="select_input_method" msgid="4653387336791222978">"Vybrat metodu zadávání"</string>
- <string name="configure_input_methods" msgid="9091652157722495116">"Nastavit metody zadávání"</string>
+ <!-- no translation found for select_input_method (8547250819326693584) -->
+ <skip />
+ <!-- no translation found for configure_input_methods (4769971288371946846) -->
+ <skip />
<string name="use_physical_keyboard" msgid="6203112478095117625">"Fyzická klávesnice"</string>
<string name="hardware" msgid="7517821086888990278">"Hardware"</string>
<string name="select_keyboard_layout_notification_title" msgid="1407367017263030773">"Výběr rozložení klávesnice"</string>
@@ -1384,12 +1386,12 @@
<string name="permdesc_control_keyguard" msgid="3043732290518629061">"Umožňuje aplikaci ovládat zámek obrazovky."</string>
<string name="permlab_trust_listener" msgid="1765718054003704476">"Naslouchat změnám stavu důvěryhodnosti"</string>
<string name="permdesc_trust_listener" msgid="8233895334214716864">"Umožňuje aplikaci naslouchat změnám ve stavu důvěryhodnosti."</string>
- <string name="permlab_provide_trust_agent" msgid="5465587586091358316">"Poskytování zástupce důvěryhodnosti"</string>
- <string name="permdesc_provide_trust_agent" msgid="3865702641053068148">"Umožňuje aplikaci poskytnout zástupce důvěryhodnosti."</string>
- <string name="permlab_launch_trust_agent_settings" msgid="5859430082240410200">"Spustit nabídku nastavení agenta důvěryhodnosti"</string>
- <string name="permdesc_launch_trust_agent_settings" msgid="8185142708644913381">"Umožňuje aplikaci spustit aktivitu, která změní chování agenta důvěryhodnosti."</string>
- <string name="permlab_bind_trust_agent_service" msgid="8242093169457695334">"Vázat se na službu zástupce důvěryhodnosti"</string>
- <string name="permdesc_bind_trust_agent_service" msgid="7041930026024507515">"Umožňuje aplikaci vázat se na službu zástupce důvěryhodnosti."</string>
+ <string name="permlab_provide_trust_agent" msgid="5465587586091358316">"Poskytovat agenta důvěry"</string>
+ <string name="permdesc_provide_trust_agent" msgid="3865702641053068148">"Umožňuje aplikaci poskytnout agent důvěry."</string>
+ <string name="permlab_launch_trust_agent_settings" msgid="5859430082240410200">"Spustit nabídku nastavení agenta důvěry"</string>
+ <string name="permdesc_launch_trust_agent_settings" msgid="8185142708644913381">"Umožňuje aplikaci spustit aktivitu, která změní chování agenta důvěry."</string>
+ <string name="permlab_bind_trust_agent_service" msgid="8242093169457695334">"Vázat se na službu agent důvěry"</string>
+ <string name="permdesc_bind_trust_agent_service" msgid="7041930026024507515">"Umožňuje aplikaci vázat se na službu agent důvěry."</string>
<string name="permlab_recovery" msgid="3157024487744125846">"Interakce se systémem aktualizací a obnovení"</string>
<string name="permdesc_recovery" msgid="8511774533266359571">"Umožňuje aplikaci interakci se systémem obnovení a s aktualizacemi systému."</string>
<string name="permlab_createMediaProjection" msgid="4941338725487978112">"Vytváření relací promítání médií"</string>
@@ -1633,8 +1635,7 @@
<string name="user_switched" msgid="3768006783166984410">"Aktuální uživatel je <xliff:g id="NAME">%1$s</xliff:g>."</string>
<string name="owner_name" msgid="2716755460376028154">"Vlastník"</string>
<string name="error_message_title" msgid="4510373083082500195">"Chyba"</string>
- <!-- no translation found for error_message_change_not_allowed (1347282344200417578) -->
- <skip />
+ <string name="error_message_change_not_allowed" msgid="1347282344200417578">"Administrátor tuto změnu zakázal"</string>
<string name="app_not_found" msgid="3429141853498927379">"Aplikace potřebná k provedení této akce nebyla nalezena"</string>
<string name="revoke" msgid="5404479185228271586">"Zrušit"</string>
<string name="mediasize_iso_a0" msgid="1994474252931294172">"ISO A0"</string>
@@ -1765,4 +1766,40 @@
<string name="lock_to_app_unlock_pin" msgid="7908385370846820001">"PIN"</string>
<string name="lock_to_app_unlock_pattern" msgid="7763071104790758405">"bezpečnostní gesto"</string>
<string name="lock_to_app_unlock_password" msgid="795224196583495868">"heslo"</string>
+ <!-- no translation found for description_ustvpg (3666171166900312727) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_d (6552868431924879897) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_l (2427588153488291892) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_s (2556047043212535339) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_v (6647466085048806213) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_fv (4015953953338931020) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_y (2271448022073929890) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_y7 (8931861188215869211) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_g (506861774854051282) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_pg (4238749719629801564) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_14 (6305164472373004907) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_ma (5842074394338699982) -->
+ <skip />
+ <!-- no translation found for description_krtv_all (11497981488871053) -->
+ <skip />
+ <!-- no translation found for description_krtv_7 (6204900788594114856) -->
+ <skip />
+ <!-- no translation found for description_krtv_12 (5134514644432355428) -->
+ <skip />
+ <!-- no translation found for description_krtv_15 (1183692678647313272) -->
+ <skip />
+ <!-- no translation found for description_krtv_19 (7021986912313208481) -->
+ <skip />
+ <!-- no translation found for battery_saver_description (724302068634956656) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-da/strings.xml b/core/res/res/values-da/strings.xml
index 55ee236..325dea7 100644
--- a/core/res/res/values-da/strings.xml
+++ b/core/res/res/values-da/strings.xml
@@ -1339,8 +1339,10 @@
<string name="extmedia_format_button_format" msgid="4131064560127478695">"Formater"</string>
<string name="adb_active_notification_title" msgid="6729044778949189918">"USB-fejlretning er tilsluttet"</string>
<string name="adb_active_notification_message" msgid="1016654627626476142">"Tryk for at deaktivere USB-fejlretning."</string>
- <string name="select_input_method" msgid="4653387336791222978">"Vælg inputmetode"</string>
- <string name="configure_input_methods" msgid="9091652157722495116">"Konfigurer inputmetoder"</string>
+ <!-- no translation found for select_input_method (8547250819326693584) -->
+ <skip />
+ <!-- no translation found for configure_input_methods (4769971288371946846) -->
+ <skip />
<string name="use_physical_keyboard" msgid="6203112478095117625">"Fysisk tastatur"</string>
<string name="hardware" msgid="7517821086888990278">"Hardware"</string>
<string name="select_keyboard_layout_notification_title" msgid="1407367017263030773">"Vælg tastaturlayout"</string>
@@ -1633,8 +1635,7 @@
<string name="user_switched" msgid="3768006783166984410">"Nuværende bruger <xliff:g id="NAME">%1$s</xliff:g>."</string>
<string name="owner_name" msgid="2716755460376028154">"Ejer"</string>
<string name="error_message_title" msgid="4510373083082500195">"Fejl"</string>
- <!-- no translation found for error_message_change_not_allowed (1347282344200417578) -->
- <skip />
+ <string name="error_message_change_not_allowed" msgid="1347282344200417578">"Din administrator har ikke givet tilladelse til at foretage denne ændring"</string>
<string name="app_not_found" msgid="3429141853498927379">"Der blev ikke fundet nogen applikation, der kan håndtere denne handling"</string>
<string name="revoke" msgid="5404479185228271586">"Tilbagekald"</string>
<string name="mediasize_iso_a0" msgid="1994474252931294172">"ISO A0"</string>
@@ -1765,4 +1766,40 @@
<string name="lock_to_app_unlock_pin" msgid="7908385370846820001">"Pinkode"</string>
<string name="lock_to_app_unlock_pattern" msgid="7763071104790758405">"oplåsningsmønster"</string>
<string name="lock_to_app_unlock_password" msgid="795224196583495868">"adgangskode"</string>
+ <!-- no translation found for description_ustvpg (3666171166900312727) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_d (6552868431924879897) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_l (2427588153488291892) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_s (2556047043212535339) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_v (6647466085048806213) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_fv (4015953953338931020) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_y (2271448022073929890) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_y7 (8931861188215869211) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_g (506861774854051282) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_pg (4238749719629801564) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_14 (6305164472373004907) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_ma (5842074394338699982) -->
+ <skip />
+ <!-- no translation found for description_krtv_all (11497981488871053) -->
+ <skip />
+ <!-- no translation found for description_krtv_7 (6204900788594114856) -->
+ <skip />
+ <!-- no translation found for description_krtv_12 (5134514644432355428) -->
+ <skip />
+ <!-- no translation found for description_krtv_15 (1183692678647313272) -->
+ <skip />
+ <!-- no translation found for description_krtv_19 (7021986912313208481) -->
+ <skip />
+ <!-- no translation found for battery_saver_description (724302068634956656) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-de/strings.xml b/core/res/res/values-de/strings.xml
index aee819d..ef66d41 100644
--- a/core/res/res/values-de/strings.xml
+++ b/core/res/res/values-de/strings.xml
@@ -1339,8 +1339,10 @@
<string name="extmedia_format_button_format" msgid="4131064560127478695">"Format"</string>
<string name="adb_active_notification_title" msgid="6729044778949189918">"USB-Debugging"</string>
<string name="adb_active_notification_message" msgid="1016654627626476142">"Zum Deaktivieren von USB-Debugging berühren"</string>
- <string name="select_input_method" msgid="4653387336791222978">"Eingabemethode wählen"</string>
- <string name="configure_input_methods" msgid="9091652157722495116">"Eingabemethoden einrichten"</string>
+ <!-- no translation found for select_input_method (8547250819326693584) -->
+ <skip />
+ <!-- no translation found for configure_input_methods (4769971288371946846) -->
+ <skip />
<string name="use_physical_keyboard" msgid="6203112478095117625">"Physische Tastatur"</string>
<string name="hardware" msgid="7517821086888990278">"Hardware"</string>
<string name="select_keyboard_layout_notification_title" msgid="1407367017263030773">"Tastaturlayout auswählen"</string>
@@ -1633,8 +1635,7 @@
<string name="user_switched" msgid="3768006783166984410">"Aktueller Nutzer <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="owner_name" msgid="2716755460376028154">"Eigentümer"</string>
<string name="error_message_title" msgid="4510373083082500195">"Fehler"</string>
- <!-- no translation found for error_message_change_not_allowed (1347282344200417578) -->
- <skip />
+ <string name="error_message_change_not_allowed" msgid="1347282344200417578">"Ihr Administrator lässt diese Änderung nicht zu."</string>
<string name="app_not_found" msgid="3429141853498927379">"Für diese Aktion wurde keine App gefunden."</string>
<string name="revoke" msgid="5404479185228271586">"Aufheben"</string>
<string name="mediasize_iso_a0" msgid="1994474252931294172">"ISO A0"</string>
@@ -1765,4 +1766,40 @@
<string name="lock_to_app_unlock_pin" msgid="7908385370846820001">"PIN"</string>
<string name="lock_to_app_unlock_pattern" msgid="7763071104790758405">"Entsperrungsmuster"</string>
<string name="lock_to_app_unlock_password" msgid="795224196583495868">"Passwort"</string>
+ <!-- no translation found for description_ustvpg (3666171166900312727) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_d (6552868431924879897) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_l (2427588153488291892) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_s (2556047043212535339) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_v (6647466085048806213) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_fv (4015953953338931020) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_y (2271448022073929890) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_y7 (8931861188215869211) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_g (506861774854051282) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_pg (4238749719629801564) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_14 (6305164472373004907) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_ma (5842074394338699982) -->
+ <skip />
+ <!-- no translation found for description_krtv_all (11497981488871053) -->
+ <skip />
+ <!-- no translation found for description_krtv_7 (6204900788594114856) -->
+ <skip />
+ <!-- no translation found for description_krtv_12 (5134514644432355428) -->
+ <skip />
+ <!-- no translation found for description_krtv_15 (1183692678647313272) -->
+ <skip />
+ <!-- no translation found for description_krtv_19 (7021986912313208481) -->
+ <skip />
+ <!-- no translation found for battery_saver_description (724302068634956656) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-el/strings.xml b/core/res/res/values-el/strings.xml
index 70dfd9ad..b6be606 100644
--- a/core/res/res/values-el/strings.xml
+++ b/core/res/res/values-el/strings.xml
@@ -1339,8 +1339,10 @@
<string name="extmedia_format_button_format" msgid="4131064560127478695">"Διαμόρφωση"</string>
<string name="adb_active_notification_title" msgid="6729044778949189918">"Συνδέθηκε ο εντοπισμός σφαλμάτων USB"</string>
<string name="adb_active_notification_message" msgid="1016654627626476142">"Αγγίξτε για απενεργοποίηση του εντοπισμού σφαλμάτων USB."</string>
- <string name="select_input_method" msgid="4653387336791222978">"Επιλογή μεθόδου εισόδου"</string>
- <string name="configure_input_methods" msgid="9091652157722495116">"Ρύθμιση μεθόδων εισαγωγής"</string>
+ <!-- no translation found for select_input_method (8547250819326693584) -->
+ <skip />
+ <!-- no translation found for configure_input_methods (4769971288371946846) -->
+ <skip />
<string name="use_physical_keyboard" msgid="6203112478095117625">"Φυσικό πληκτρολόγιο"</string>
<string name="hardware" msgid="7517821086888990278">"Υλικό"</string>
<string name="select_keyboard_layout_notification_title" msgid="1407367017263030773">"Επιλογή διάταξης πληκτρολογίου"</string>
@@ -1633,8 +1635,7 @@
<string name="user_switched" msgid="3768006783166984410">"Τρέχων χρήστης <xliff:g id="NAME">%1$s</xliff:g>."</string>
<string name="owner_name" msgid="2716755460376028154">"Κάτοχος"</string>
<string name="error_message_title" msgid="4510373083082500195">"Σφάλμα"</string>
- <!-- no translation found for error_message_change_not_allowed (1347282344200417578) -->
- <skip />
+ <string name="error_message_change_not_allowed" msgid="1347282344200417578">"Αυτή η αλλαγή δεν επιτρέπεται από το διαχειριστή σας"</string>
<string name="app_not_found" msgid="3429141853498927379">"Δεν υπάρχει εφαρμογή για τη διαχείριση αυτής της ενέργειας"</string>
<string name="revoke" msgid="5404479185228271586">"Ανάκληση"</string>
<string name="mediasize_iso_a0" msgid="1994474252931294172">"ISO A0"</string>
@@ -1765,4 +1766,40 @@
<string name="lock_to_app_unlock_pin" msgid="7908385370846820001">"Αριθμός PIN"</string>
<string name="lock_to_app_unlock_pattern" msgid="7763071104790758405">"μοτίβο ξεκλειδώματος"</string>
<string name="lock_to_app_unlock_password" msgid="795224196583495868">"κωδικός πρόσβασης"</string>
+ <!-- no translation found for description_ustvpg (3666171166900312727) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_d (6552868431924879897) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_l (2427588153488291892) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_s (2556047043212535339) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_v (6647466085048806213) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_fv (4015953953338931020) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_y (2271448022073929890) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_y7 (8931861188215869211) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_g (506861774854051282) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_pg (4238749719629801564) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_14 (6305164472373004907) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_ma (5842074394338699982) -->
+ <skip />
+ <!-- no translation found for description_krtv_all (11497981488871053) -->
+ <skip />
+ <!-- no translation found for description_krtv_7 (6204900788594114856) -->
+ <skip />
+ <!-- no translation found for description_krtv_12 (5134514644432355428) -->
+ <skip />
+ <!-- no translation found for description_krtv_15 (1183692678647313272) -->
+ <skip />
+ <!-- no translation found for description_krtv_19 (7021986912313208481) -->
+ <skip />
+ <!-- no translation found for battery_saver_description (724302068634956656) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-en-rGB/strings.xml b/core/res/res/values-en-rGB/strings.xml
index 8dd9170..59644ee 100644
--- a/core/res/res/values-en-rGB/strings.xml
+++ b/core/res/res/values-en-rGB/strings.xml
@@ -1339,8 +1339,10 @@
<string name="extmedia_format_button_format" msgid="4131064560127478695">"Format"</string>
<string name="adb_active_notification_title" msgid="6729044778949189918">"USB debugging connected"</string>
<string name="adb_active_notification_message" msgid="1016654627626476142">"Touch to disable USB debugging."</string>
- <string name="select_input_method" msgid="4653387336791222978">"Choose input method"</string>
- <string name="configure_input_methods" msgid="9091652157722495116">"Set up input methods"</string>
+ <!-- no translation found for select_input_method (8547250819326693584) -->
+ <skip />
+ <!-- no translation found for configure_input_methods (4769971288371946846) -->
+ <skip />
<string name="use_physical_keyboard" msgid="6203112478095117625">"Physical keyboard"</string>
<string name="hardware" msgid="7517821086888990278">"Hardware"</string>
<string name="select_keyboard_layout_notification_title" msgid="1407367017263030773">"Select keyboard layout"</string>
@@ -1764,4 +1766,40 @@
<string name="lock_to_app_unlock_pin" msgid="7908385370846820001">"PIN"</string>
<string name="lock_to_app_unlock_pattern" msgid="7763071104790758405">"unlock pattern"</string>
<string name="lock_to_app_unlock_password" msgid="795224196583495868">"password"</string>
+ <!-- no translation found for description_ustvpg (3666171166900312727) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_d (6552868431924879897) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_l (2427588153488291892) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_s (2556047043212535339) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_v (6647466085048806213) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_fv (4015953953338931020) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_y (2271448022073929890) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_y7 (8931861188215869211) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_g (506861774854051282) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_pg (4238749719629801564) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_14 (6305164472373004907) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_ma (5842074394338699982) -->
+ <skip />
+ <!-- no translation found for description_krtv_all (11497981488871053) -->
+ <skip />
+ <!-- no translation found for description_krtv_7 (6204900788594114856) -->
+ <skip />
+ <!-- no translation found for description_krtv_12 (5134514644432355428) -->
+ <skip />
+ <!-- no translation found for description_krtv_15 (1183692678647313272) -->
+ <skip />
+ <!-- no translation found for description_krtv_19 (7021986912313208481) -->
+ <skip />
+ <!-- no translation found for battery_saver_description (724302068634956656) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-en-rIN/strings.xml b/core/res/res/values-en-rIN/strings.xml
index 8dd9170..59644ee 100644
--- a/core/res/res/values-en-rIN/strings.xml
+++ b/core/res/res/values-en-rIN/strings.xml
@@ -1339,8 +1339,10 @@
<string name="extmedia_format_button_format" msgid="4131064560127478695">"Format"</string>
<string name="adb_active_notification_title" msgid="6729044778949189918">"USB debugging connected"</string>
<string name="adb_active_notification_message" msgid="1016654627626476142">"Touch to disable USB debugging."</string>
- <string name="select_input_method" msgid="4653387336791222978">"Choose input method"</string>
- <string name="configure_input_methods" msgid="9091652157722495116">"Set up input methods"</string>
+ <!-- no translation found for select_input_method (8547250819326693584) -->
+ <skip />
+ <!-- no translation found for configure_input_methods (4769971288371946846) -->
+ <skip />
<string name="use_physical_keyboard" msgid="6203112478095117625">"Physical keyboard"</string>
<string name="hardware" msgid="7517821086888990278">"Hardware"</string>
<string name="select_keyboard_layout_notification_title" msgid="1407367017263030773">"Select keyboard layout"</string>
@@ -1764,4 +1766,40 @@
<string name="lock_to_app_unlock_pin" msgid="7908385370846820001">"PIN"</string>
<string name="lock_to_app_unlock_pattern" msgid="7763071104790758405">"unlock pattern"</string>
<string name="lock_to_app_unlock_password" msgid="795224196583495868">"password"</string>
+ <!-- no translation found for description_ustvpg (3666171166900312727) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_d (6552868431924879897) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_l (2427588153488291892) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_s (2556047043212535339) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_v (6647466085048806213) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_fv (4015953953338931020) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_y (2271448022073929890) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_y7 (8931861188215869211) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_g (506861774854051282) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_pg (4238749719629801564) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_14 (6305164472373004907) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_ma (5842074394338699982) -->
+ <skip />
+ <!-- no translation found for description_krtv_all (11497981488871053) -->
+ <skip />
+ <!-- no translation found for description_krtv_7 (6204900788594114856) -->
+ <skip />
+ <!-- no translation found for description_krtv_12 (5134514644432355428) -->
+ <skip />
+ <!-- no translation found for description_krtv_15 (1183692678647313272) -->
+ <skip />
+ <!-- no translation found for description_krtv_19 (7021986912313208481) -->
+ <skip />
+ <!-- no translation found for battery_saver_description (724302068634956656) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-es-rUS/strings.xml b/core/res/res/values-es-rUS/strings.xml
index 9c8863f..e960e2a 100644
--- a/core/res/res/values-es-rUS/strings.xml
+++ b/core/res/res/values-es-rUS/strings.xml
@@ -1339,8 +1339,10 @@
<string name="extmedia_format_button_format" msgid="4131064560127478695">"Formato"</string>
<string name="adb_active_notification_title" msgid="6729044778949189918">"Depuración por USB conectada"</string>
<string name="adb_active_notification_message" msgid="1016654627626476142">"Toca para desactivar la depuración por USB."</string>
- <string name="select_input_method" msgid="4653387336791222978">"Selecciona el método de entrada"</string>
- <string name="configure_input_methods" msgid="9091652157722495116">"Configurar métodos de introducción"</string>
+ <!-- no translation found for select_input_method (8547250819326693584) -->
+ <skip />
+ <!-- no translation found for configure_input_methods (4769971288371946846) -->
+ <skip />
<string name="use_physical_keyboard" msgid="6203112478095117625">"Teclado físico"</string>
<string name="hardware" msgid="7517821086888990278">"Hardware"</string>
<string name="select_keyboard_layout_notification_title" msgid="1407367017263030773">"Selecciona un diseño de teclado"</string>
@@ -1633,8 +1635,7 @@
<string name="user_switched" msgid="3768006783166984410">"Usuario actual: <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="owner_name" msgid="2716755460376028154">"Propietario"</string>
<string name="error_message_title" msgid="4510373083082500195">"Error"</string>
- <!-- no translation found for error_message_change_not_allowed (1347282344200417578) -->
- <skip />
+ <string name="error_message_change_not_allowed" msgid="1347282344200417578">"El administrador no permite este cambio."</string>
<string name="app_not_found" msgid="3429141853498927379">"No se encontró una aplicación para manejar esta acción."</string>
<string name="revoke" msgid="5404479185228271586">"Revocar"</string>
<string name="mediasize_iso_a0" msgid="1994474252931294172">"ISO A0"</string>
@@ -1765,4 +1766,40 @@
<string name="lock_to_app_unlock_pin" msgid="7908385370846820001">"PIN"</string>
<string name="lock_to_app_unlock_pattern" msgid="7763071104790758405">"patrón de desbloqueo"</string>
<string name="lock_to_app_unlock_password" msgid="795224196583495868">"contraseña"</string>
+ <!-- no translation found for description_ustvpg (3666171166900312727) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_d (6552868431924879897) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_l (2427588153488291892) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_s (2556047043212535339) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_v (6647466085048806213) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_fv (4015953953338931020) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_y (2271448022073929890) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_y7 (8931861188215869211) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_g (506861774854051282) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_pg (4238749719629801564) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_14 (6305164472373004907) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_ma (5842074394338699982) -->
+ <skip />
+ <!-- no translation found for description_krtv_all (11497981488871053) -->
+ <skip />
+ <!-- no translation found for description_krtv_7 (6204900788594114856) -->
+ <skip />
+ <!-- no translation found for description_krtv_12 (5134514644432355428) -->
+ <skip />
+ <!-- no translation found for description_krtv_15 (1183692678647313272) -->
+ <skip />
+ <!-- no translation found for description_krtv_19 (7021986912313208481) -->
+ <skip />
+ <!-- no translation found for battery_saver_description (724302068634956656) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-es/strings.xml b/core/res/res/values-es/strings.xml
index cc6d4f7..f208fd2 100644
--- a/core/res/res/values-es/strings.xml
+++ b/core/res/res/values-es/strings.xml
@@ -1339,8 +1339,10 @@
<string name="extmedia_format_button_format" msgid="4131064560127478695">"Formato"</string>
<string name="adb_active_notification_title" msgid="6729044778949189918">"Depuración USB habilitada"</string>
<string name="adb_active_notification_message" msgid="1016654627626476142">"Toca para inhabilitar la depuración USB"</string>
- <string name="select_input_method" msgid="4653387336791222978">"Selecciona un método de entrada"</string>
- <string name="configure_input_methods" msgid="9091652157722495116">"Configurar métodos de entrada"</string>
+ <!-- no translation found for select_input_method (8547250819326693584) -->
+ <skip />
+ <!-- no translation found for configure_input_methods (4769971288371946846) -->
+ <skip />
<string name="use_physical_keyboard" msgid="6203112478095117625">"Teclado físico"</string>
<string name="hardware" msgid="7517821086888990278">"Hardware"</string>
<string name="select_keyboard_layout_notification_title" msgid="1407367017263030773">"Selecciona un diseño de teclado"</string>
@@ -1633,8 +1635,7 @@
<string name="user_switched" msgid="3768006783166984410">"Usuario actual: <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="owner_name" msgid="2716755460376028154">"Propietario"</string>
<string name="error_message_title" msgid="4510373083082500195">"Error"</string>
- <!-- no translation found for error_message_change_not_allowed (1347282344200417578) -->
- <skip />
+ <string name="error_message_change_not_allowed" msgid="1347282344200417578">"El administrador no permite este cambio"</string>
<string name="app_not_found" msgid="3429141853498927379">"No se ha encontrado ninguna aplicación que pueda realizar esta acción."</string>
<string name="revoke" msgid="5404479185228271586">"Revocar"</string>
<string name="mediasize_iso_a0" msgid="1994474252931294172">"ISO A0"</string>
@@ -1765,4 +1766,40 @@
<string name="lock_to_app_unlock_pin" msgid="7908385370846820001">"PIN"</string>
<string name="lock_to_app_unlock_pattern" msgid="7763071104790758405">"patrón de desbloqueo"</string>
<string name="lock_to_app_unlock_password" msgid="795224196583495868">"contraseña"</string>
+ <!-- no translation found for description_ustvpg (3666171166900312727) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_d (6552868431924879897) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_l (2427588153488291892) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_s (2556047043212535339) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_v (6647466085048806213) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_fv (4015953953338931020) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_y (2271448022073929890) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_y7 (8931861188215869211) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_g (506861774854051282) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_pg (4238749719629801564) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_14 (6305164472373004907) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_ma (5842074394338699982) -->
+ <skip />
+ <!-- no translation found for description_krtv_all (11497981488871053) -->
+ <skip />
+ <!-- no translation found for description_krtv_7 (6204900788594114856) -->
+ <skip />
+ <!-- no translation found for description_krtv_12 (5134514644432355428) -->
+ <skip />
+ <!-- no translation found for description_krtv_15 (1183692678647313272) -->
+ <skip />
+ <!-- no translation found for description_krtv_19 (7021986912313208481) -->
+ <skip />
+ <!-- no translation found for battery_saver_description (724302068634956656) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-et-rEE/strings.xml b/core/res/res/values-et-rEE/strings.xml
index 2ccdab0..10dce95 100644
--- a/core/res/res/values-et-rEE/strings.xml
+++ b/core/res/res/values-et-rEE/strings.xml
@@ -1339,8 +1339,10 @@
<string name="extmedia_format_button_format" msgid="4131064560127478695">"Vorminda"</string>
<string name="adb_active_notification_title" msgid="6729044778949189918">"USB-silumine ühendatud"</string>
<string name="adb_active_notification_message" msgid="1016654627626476142">"Puudutage USB-silumise keelamiseks."</string>
- <string name="select_input_method" msgid="4653387336791222978">"Valige sisestusmeetod"</string>
- <string name="configure_input_methods" msgid="9091652157722495116">"Seadista sisestusmeetodid"</string>
+ <!-- no translation found for select_input_method (8547250819326693584) -->
+ <skip />
+ <!-- no translation found for configure_input_methods (4769971288371946846) -->
+ <skip />
<string name="use_physical_keyboard" msgid="6203112478095117625">"Füüsiline klaviatuur"</string>
<string name="hardware" msgid="7517821086888990278">"Riistvara"</string>
<string name="select_keyboard_layout_notification_title" msgid="1407367017263030773">"Klaviatuuri paigutuse valimine"</string>
@@ -1633,8 +1635,7 @@
<string name="user_switched" msgid="3768006783166984410">"Praegune kasutaja <xliff:g id="NAME">%1$s</xliff:g>."</string>
<string name="owner_name" msgid="2716755460376028154">"Omanik"</string>
<string name="error_message_title" msgid="4510373083082500195">"Viga"</string>
- <!-- no translation found for error_message_change_not_allowed (1347282344200417578) -->
- <skip />
+ <string name="error_message_change_not_allowed" msgid="1347282344200417578">"Administraator ei luba sellist muudatust teha"</string>
<string name="app_not_found" msgid="3429141853498927379">"Selle toimingu käsitlemiseks ei leitud ühtegi rakendust"</string>
<string name="revoke" msgid="5404479185228271586">"Tühista"</string>
<string name="mediasize_iso_a0" msgid="1994474252931294172">"ISO A0"</string>
@@ -1765,4 +1766,40 @@
<string name="lock_to_app_unlock_pin" msgid="7908385370846820001">"PIN-koodi"</string>
<string name="lock_to_app_unlock_pattern" msgid="7763071104790758405">"avamismustrit"</string>
<string name="lock_to_app_unlock_password" msgid="795224196583495868">"parooli"</string>
+ <!-- no translation found for description_ustvpg (3666171166900312727) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_d (6552868431924879897) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_l (2427588153488291892) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_s (2556047043212535339) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_v (6647466085048806213) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_fv (4015953953338931020) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_y (2271448022073929890) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_y7 (8931861188215869211) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_g (506861774854051282) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_pg (4238749719629801564) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_14 (6305164472373004907) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_ma (5842074394338699982) -->
+ <skip />
+ <!-- no translation found for description_krtv_all (11497981488871053) -->
+ <skip />
+ <!-- no translation found for description_krtv_7 (6204900788594114856) -->
+ <skip />
+ <!-- no translation found for description_krtv_12 (5134514644432355428) -->
+ <skip />
+ <!-- no translation found for description_krtv_15 (1183692678647313272) -->
+ <skip />
+ <!-- no translation found for description_krtv_19 (7021986912313208481) -->
+ <skip />
+ <!-- no translation found for battery_saver_description (724302068634956656) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-eu-rES/strings.xml b/core/res/res/values-eu-rES/strings.xml
index a01b437..d0e1955 100644
--- a/core/res/res/values-eu-rES/strings.xml
+++ b/core/res/res/values-eu-rES/strings.xml
@@ -1339,8 +1339,10 @@
<string name="extmedia_format_button_format" msgid="4131064560127478695">"Formateatu"</string>
<string name="adb_active_notification_title" msgid="6729044778949189918">"USB arazketa konektatuta"</string>
<string name="adb_active_notification_message" msgid="1016654627626476142">"USB arazketa desgaitzeko, ukitu hau."</string>
- <string name="select_input_method" msgid="4653387336791222978">"Aukeratu idazketa-metodoa"</string>
- <string name="configure_input_methods" msgid="9091652157722495116">"Konfiguratu idazketa-metodoak"</string>
+ <!-- no translation found for select_input_method (8547250819326693584) -->
+ <skip />
+ <!-- no translation found for configure_input_methods (4769971288371946846) -->
+ <skip />
<string name="use_physical_keyboard" msgid="6203112478095117625">"Teklatu fisikoa"</string>
<string name="hardware" msgid="7517821086888990278">"Hardwarea"</string>
<string name="select_keyboard_layout_notification_title" msgid="1407367017263030773">"Hautatu teklatuaren diseinua"</string>
@@ -1633,8 +1635,7 @@
<string name="user_switched" msgid="3768006783166984410">"Uneko erabiltzailea: <xliff:g id="NAME">%1$s</xliff:g>."</string>
<string name="owner_name" msgid="2716755460376028154">"Jabea"</string>
<string name="error_message_title" msgid="4510373083082500195">"Errorea"</string>
- <!-- no translation found for error_message_change_not_allowed (1347282344200417578) -->
- <skip />
+ <string name="error_message_change_not_allowed" msgid="1347282344200417578">"Zure administratzaileak ez du aldaketa egiteko baimena eman"</string>
<string name="app_not_found" msgid="3429141853498927379">"Ez da ekintza gauza dezakeen aplikaziorik aurkitu"</string>
<string name="revoke" msgid="5404479185228271586">"Baliogabetu"</string>
<string name="mediasize_iso_a0" msgid="1994474252931294172">"ISO A0 (Europa)"</string>
@@ -1765,4 +1766,40 @@
<string name="lock_to_app_unlock_pin" msgid="7908385370846820001">"PIN kodea"</string>
<string name="lock_to_app_unlock_pattern" msgid="7763071104790758405">"desblokeatzeko eredua"</string>
<string name="lock_to_app_unlock_password" msgid="795224196583495868">"pasahitza"</string>
+ <!-- no translation found for description_ustvpg (3666171166900312727) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_d (6552868431924879897) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_l (2427588153488291892) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_s (2556047043212535339) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_v (6647466085048806213) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_fv (4015953953338931020) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_y (2271448022073929890) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_y7 (8931861188215869211) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_g (506861774854051282) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_pg (4238749719629801564) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_14 (6305164472373004907) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_ma (5842074394338699982) -->
+ <skip />
+ <!-- no translation found for description_krtv_all (11497981488871053) -->
+ <skip />
+ <!-- no translation found for description_krtv_7 (6204900788594114856) -->
+ <skip />
+ <!-- no translation found for description_krtv_12 (5134514644432355428) -->
+ <skip />
+ <!-- no translation found for description_krtv_15 (1183692678647313272) -->
+ <skip />
+ <!-- no translation found for description_krtv_19 (7021986912313208481) -->
+ <skip />
+ <!-- no translation found for battery_saver_description (724302068634956656) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-fa/strings.xml b/core/res/res/values-fa/strings.xml
index 0ec1884..ed9c37d 100644
--- a/core/res/res/values-fa/strings.xml
+++ b/core/res/res/values-fa/strings.xml
@@ -1339,8 +1339,10 @@
<string name="extmedia_format_button_format" msgid="4131064560127478695">"قالب"</string>
<string name="adb_active_notification_title" msgid="6729044778949189918">"اتصال رفع عیب USB"</string>
<string name="adb_active_notification_message" msgid="1016654627626476142">"برای غیرفعال کردن اشکال زدایی USB لمس کنید."</string>
- <string name="select_input_method" msgid="4653387336791222978">"انتخاب روش ورودی"</string>
- <string name="configure_input_methods" msgid="9091652157722495116">"تنظیم روشهای ورودی"</string>
+ <!-- no translation found for select_input_method (8547250819326693584) -->
+ <skip />
+ <!-- no translation found for configure_input_methods (4769971288371946846) -->
+ <skip />
<string name="use_physical_keyboard" msgid="6203112478095117625">"صفحهکلید فیزیکی"</string>
<string name="hardware" msgid="7517821086888990278">"سختافزار"</string>
<string name="select_keyboard_layout_notification_title" msgid="1407367017263030773">"انتخاب طرحبندی صفحهکلید"</string>
@@ -1633,8 +1635,7 @@
<string name="user_switched" msgid="3768006783166984410">"کاربر کنونی <xliff:g id="NAME">%1$s</xliff:g>."</string>
<string name="owner_name" msgid="2716755460376028154">"دارنده"</string>
<string name="error_message_title" msgid="4510373083082500195">"خطا"</string>
- <!-- no translation found for error_message_change_not_allowed (1347282344200417578) -->
- <skip />
+ <string name="error_message_change_not_allowed" msgid="1347282344200417578">"این تغییر از طرف سرپرستتان مجاز دانسته نشده است"</string>
<string name="app_not_found" msgid="3429141853498927379">"برنامهای برای انجام این عملکرد موجود نیست"</string>
<string name="revoke" msgid="5404479185228271586">"لغو"</string>
<string name="mediasize_iso_a0" msgid="1994474252931294172">"ISO A0"</string>
@@ -1765,4 +1766,40 @@
<string name="lock_to_app_unlock_pin" msgid="7908385370846820001">"پین"</string>
<string name="lock_to_app_unlock_pattern" msgid="7763071104790758405">"الگوی بازگشایی"</string>
<string name="lock_to_app_unlock_password" msgid="795224196583495868">"گذرواژه"</string>
+ <!-- no translation found for description_ustvpg (3666171166900312727) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_d (6552868431924879897) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_l (2427588153488291892) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_s (2556047043212535339) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_v (6647466085048806213) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_fv (4015953953338931020) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_y (2271448022073929890) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_y7 (8931861188215869211) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_g (506861774854051282) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_pg (4238749719629801564) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_14 (6305164472373004907) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_ma (5842074394338699982) -->
+ <skip />
+ <!-- no translation found for description_krtv_all (11497981488871053) -->
+ <skip />
+ <!-- no translation found for description_krtv_7 (6204900788594114856) -->
+ <skip />
+ <!-- no translation found for description_krtv_12 (5134514644432355428) -->
+ <skip />
+ <!-- no translation found for description_krtv_15 (1183692678647313272) -->
+ <skip />
+ <!-- no translation found for description_krtv_19 (7021986912313208481) -->
+ <skip />
+ <!-- no translation found for battery_saver_description (724302068634956656) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-fi/strings.xml b/core/res/res/values-fi/strings.xml
index b24def8..0592c32 100644
--- a/core/res/res/values-fi/strings.xml
+++ b/core/res/res/values-fi/strings.xml
@@ -1339,8 +1339,10 @@
<string name="extmedia_format_button_format" msgid="4131064560127478695">"Muoto"</string>
<string name="adb_active_notification_title" msgid="6729044778949189918">"USB-vianetsintä yhdistetty"</string>
<string name="adb_active_notification_message" msgid="1016654627626476142">"Poista USB-vianetsintä käytöstä koskettamalla tätä."</string>
- <string name="select_input_method" msgid="4653387336791222978">"Valitse syöttötapa"</string>
- <string name="configure_input_methods" msgid="9091652157722495116">"Määritä syöttötavat"</string>
+ <!-- no translation found for select_input_method (8547250819326693584) -->
+ <skip />
+ <!-- no translation found for configure_input_methods (4769971288371946846) -->
+ <skip />
<string name="use_physical_keyboard" msgid="6203112478095117625">"Fyysinen näppäimistö"</string>
<string name="hardware" msgid="7517821086888990278">"Laitteisto"</string>
<string name="select_keyboard_layout_notification_title" msgid="1407367017263030773">"Valitse näppäimistöasettelu"</string>
@@ -1633,8 +1635,7 @@
<string name="user_switched" msgid="3768006783166984410">"Nykyinen käyttäjä: <xliff:g id="NAME">%1$s</xliff:g>."</string>
<string name="owner_name" msgid="2716755460376028154">"Omistaja"</string>
<string name="error_message_title" msgid="4510373083082500195">"Virhe"</string>
- <!-- no translation found for error_message_change_not_allowed (1347282344200417578) -->
- <skip />
+ <string name="error_message_change_not_allowed" msgid="1347282344200417578">"Järjestelmänvalvoja ei salli tätä muutosta"</string>
<string name="app_not_found" msgid="3429141853498927379">"Tätä toimintoa käsittelevää sovellusta ei löydy"</string>
<string name="revoke" msgid="5404479185228271586">"Peruuta"</string>
<string name="mediasize_iso_a0" msgid="1994474252931294172">"ISO A0"</string>
@@ -1765,4 +1766,40 @@
<string name="lock_to_app_unlock_pin" msgid="7908385370846820001">"PIN-koodi"</string>
<string name="lock_to_app_unlock_pattern" msgid="7763071104790758405">"lukituksenpoistokuvio"</string>
<string name="lock_to_app_unlock_password" msgid="795224196583495868">"salasana"</string>
+ <!-- no translation found for description_ustvpg (3666171166900312727) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_d (6552868431924879897) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_l (2427588153488291892) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_s (2556047043212535339) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_v (6647466085048806213) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_fv (4015953953338931020) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_y (2271448022073929890) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_y7 (8931861188215869211) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_g (506861774854051282) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_pg (4238749719629801564) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_14 (6305164472373004907) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_ma (5842074394338699982) -->
+ <skip />
+ <!-- no translation found for description_krtv_all (11497981488871053) -->
+ <skip />
+ <!-- no translation found for description_krtv_7 (6204900788594114856) -->
+ <skip />
+ <!-- no translation found for description_krtv_12 (5134514644432355428) -->
+ <skip />
+ <!-- no translation found for description_krtv_15 (1183692678647313272) -->
+ <skip />
+ <!-- no translation found for description_krtv_19 (7021986912313208481) -->
+ <skip />
+ <!-- no translation found for battery_saver_description (724302068634956656) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-fr-rCA/strings.xml b/core/res/res/values-fr-rCA/strings.xml
index 7f1d754..0497ff8 100644
--- a/core/res/res/values-fr-rCA/strings.xml
+++ b/core/res/res/values-fr-rCA/strings.xml
@@ -1339,8 +1339,10 @@
<string name="extmedia_format_button_format" msgid="4131064560127478695">"Mise en forme"</string>
<string name="adb_active_notification_title" msgid="6729044778949189918">"Débogage USB connecté"</string>
<string name="adb_active_notification_message" msgid="1016654627626476142">"Appuyez pour désactiver le débogage USB."</string>
- <string name="select_input_method" msgid="4653387336791222978">"Sélectionnez le mode de saisie"</string>
- <string name="configure_input_methods" msgid="9091652157722495116">"Configurer les modes de saisie"</string>
+ <!-- no translation found for select_input_method (8547250819326693584) -->
+ <skip />
+ <!-- no translation found for configure_input_methods (4769971288371946846) -->
+ <skip />
<string name="use_physical_keyboard" msgid="6203112478095117625">"Clavier physique"</string>
<string name="hardware" msgid="7517821086888990278">"Matériel"</string>
<string name="select_keyboard_layout_notification_title" msgid="1407367017263030773">"Sélectionnez la disposition du clavier"</string>
@@ -1414,8 +1416,8 @@
<string name="deny" msgid="2081879885755434506">"Refuser"</string>
<string name="permission_request_notification_title" msgid="6486759795926237907">"Autorisation demandée"</string>
<string name="permission_request_notification_with_subtitle" msgid="8530393139639560189">"Autorisation demandée\npour le compte \"<xliff:g id="ACCOUNT">%s</xliff:g>\""</string>
- <string name="forward_intent_to_owner" msgid="570916783072215572">"Vous utilisez cette application dans votre espace personnel."</string>
- <string name="forward_intent_to_work" msgid="8624579696577525279">"Vous utilisez cette application dans votre espace de travail."</string>
+ <string name="forward_intent_to_owner" msgid="570916783072215572">"Vous utilisez cette application dans votre espace personnel"</string>
+ <string name="forward_intent_to_work" msgid="8624579696577525279">"Vous utilisez cette application dans votre espace de travail"</string>
<string name="input_method_binding_label" msgid="1283557179944992649">"Mode de saisie"</string>
<string name="sync_binding_label" msgid="3687969138375092423">"Synchroniser"</string>
<string name="accessibility_binding_label" msgid="4148120742096474641">"Accessibilité"</string>
@@ -1626,15 +1628,14 @@
<string name="kg_failed_attempts_almost_at_login" product="default" msgid="1437638152015574839">"Vous avez dessiné un schéma de déverrouillage incorrect à <xliff:g id="NUMBER_0">%d</xliff:g> reprises. Si vous échouez encore <xliff:g id="NUMBER_1">%d</xliff:g> fois, vous devrez déverrouiller votre téléphone à l\'aide d\'un compte de messagerie électronique.\n\n Veuillez réessayer dans <xliff:g id="NUMBER_2">%d</xliff:g> secondes."</string>
<string name="kg_text_message_separator" product="default" msgid="4160700433287233771">" — "</string>
<string name="kg_reordering_delete_drop_target_text" msgid="7899202978204438708">"Supprimer"</string>
- <string name="safe_media_volume_warning" product="default" msgid="2276318909314492312">"Augmenter le volume au dessus du niveau recommandé ?\n\nL\'écoute prolongée à un volume élevé peut endommager vos facultés auditives."</string>
+ <string name="safe_media_volume_warning" product="default" msgid="2276318909314492312">"Augmenter le volume au-dessus du niveau recommandé?\n\nL\'écoute prolongée à un volume élevé peut endommager vos facultés auditives."</string>
<string name="continue_to_enable_accessibility" msgid="1626427372316070258">"Pour activer l\'accessibilité, appuyez de manière prolongée avec deux doigts."</string>
<string name="accessibility_enabled" msgid="1381972048564547685">"L\'accessibilité a bien été activée."</string>
<string name="enable_accessibility_canceled" msgid="3833923257966635673">"Accessibilité annulée."</string>
<string name="user_switched" msgid="3768006783166984410">"Utilisateur actuel : <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="owner_name" msgid="2716755460376028154">"Propriétaire"</string>
<string name="error_message_title" msgid="4510373083082500195">"Erreur"</string>
- <!-- no translation found for error_message_change_not_allowed (1347282344200417578) -->
- <skip />
+ <string name="error_message_change_not_allowed" msgid="1347282344200417578">"Cette modification n\'est pas autorisée par votre administrateur"</string>
<string name="app_not_found" msgid="3429141853498927379">"Aucune application trouvée pour gérer cette action."</string>
<string name="revoke" msgid="5404479185228271586">"Révoquer"</string>
<string name="mediasize_iso_a0" msgid="1994474252931294172">"ISO A0"</string>
@@ -1765,4 +1766,40 @@
<string name="lock_to_app_unlock_pin" msgid="7908385370846820001">"NIP"</string>
<string name="lock_to_app_unlock_pattern" msgid="7763071104790758405">"schéma de déverrouillage"</string>
<string name="lock_to_app_unlock_password" msgid="795224196583495868">"mot de passe"</string>
+ <!-- no translation found for description_ustvpg (3666171166900312727) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_d (6552868431924879897) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_l (2427588153488291892) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_s (2556047043212535339) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_v (6647466085048806213) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_fv (4015953953338931020) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_y (2271448022073929890) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_y7 (8931861188215869211) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_g (506861774854051282) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_pg (4238749719629801564) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_14 (6305164472373004907) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_ma (5842074394338699982) -->
+ <skip />
+ <!-- no translation found for description_krtv_all (11497981488871053) -->
+ <skip />
+ <!-- no translation found for description_krtv_7 (6204900788594114856) -->
+ <skip />
+ <!-- no translation found for description_krtv_12 (5134514644432355428) -->
+ <skip />
+ <!-- no translation found for description_krtv_15 (1183692678647313272) -->
+ <skip />
+ <!-- no translation found for description_krtv_19 (7021986912313208481) -->
+ <skip />
+ <!-- no translation found for battery_saver_description (724302068634956656) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-fr/strings.xml b/core/res/res/values-fr/strings.xml
index 09322a1..b9f1e83 100644
--- a/core/res/res/values-fr/strings.xml
+++ b/core/res/res/values-fr/strings.xml
@@ -1339,8 +1339,10 @@
<string name="extmedia_format_button_format" msgid="4131064560127478695">"Format"</string>
<string name="adb_active_notification_title" msgid="6729044778949189918">"Débogage USB activé"</string>
<string name="adb_active_notification_message" msgid="1016654627626476142">"Appuyez pour désactiver le débogage USB."</string>
- <string name="select_input_method" msgid="4653387336791222978">"Sélectionnez le mode de saisie"</string>
- <string name="configure_input_methods" msgid="9091652157722495116">"Configurer les modes de saisie"</string>
+ <!-- no translation found for select_input_method (8547250819326693584) -->
+ <skip />
+ <!-- no translation found for configure_input_methods (4769971288371946846) -->
+ <skip />
<string name="use_physical_keyboard" msgid="6203112478095117625">"Clavier physique"</string>
<string name="hardware" msgid="7517821086888990278">"Matériel"</string>
<string name="select_keyboard_layout_notification_title" msgid="1407367017263030773">"Sélectionnez la disposition du clavier"</string>
@@ -1633,8 +1635,7 @@
<string name="user_switched" msgid="3768006783166984410">"Utilisateur actuel : <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="owner_name" msgid="2716755460376028154">"Propriétaire"</string>
<string name="error_message_title" msgid="4510373083082500195">"Erreur"</string>
- <!-- no translation found for error_message_change_not_allowed (1347282344200417578) -->
- <skip />
+ <string name="error_message_change_not_allowed" msgid="1347282344200417578">"Votre administrateur n\'autorise pas cette modification."</string>
<string name="app_not_found" msgid="3429141853498927379">"Aucune application trouvée pour gérer cette action."</string>
<string name="revoke" msgid="5404479185228271586">"Révoquer"</string>
<string name="mediasize_iso_a0" msgid="1994474252931294172">"ISO A0"</string>
@@ -1765,4 +1766,40 @@
<string name="lock_to_app_unlock_pin" msgid="7908385370846820001">"code PIN"</string>
<string name="lock_to_app_unlock_pattern" msgid="7763071104790758405">"schéma de déverrouillage"</string>
<string name="lock_to_app_unlock_password" msgid="795224196583495868">"mot de passe"</string>
+ <!-- no translation found for description_ustvpg (3666171166900312727) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_d (6552868431924879897) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_l (2427588153488291892) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_s (2556047043212535339) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_v (6647466085048806213) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_fv (4015953953338931020) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_y (2271448022073929890) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_y7 (8931861188215869211) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_g (506861774854051282) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_pg (4238749719629801564) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_14 (6305164472373004907) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_ma (5842074394338699982) -->
+ <skip />
+ <!-- no translation found for description_krtv_all (11497981488871053) -->
+ <skip />
+ <!-- no translation found for description_krtv_7 (6204900788594114856) -->
+ <skip />
+ <!-- no translation found for description_krtv_12 (5134514644432355428) -->
+ <skip />
+ <!-- no translation found for description_krtv_15 (1183692678647313272) -->
+ <skip />
+ <!-- no translation found for description_krtv_19 (7021986912313208481) -->
+ <skip />
+ <!-- no translation found for battery_saver_description (724302068634956656) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-gl-rES/strings.xml b/core/res/res/values-gl-rES/strings.xml
index a5e68f6..1f149e8 100644
--- a/core/res/res/values-gl-rES/strings.xml
+++ b/core/res/res/values-gl-rES/strings.xml
@@ -1339,8 +1339,10 @@
<string name="extmedia_format_button_format" msgid="4131064560127478695">"Formato"</string>
<string name="adb_active_notification_title" msgid="6729044778949189918">"Depuración USB conectada"</string>
<string name="adb_active_notification_message" msgid="1016654627626476142">"Toca para desactivar a depuración de erros de USB."</string>
- <string name="select_input_method" msgid="4653387336791222978">"Escoller método de entrada"</string>
- <string name="configure_input_methods" msgid="9091652157722495116">"Configurar métodos de entrada"</string>
+ <!-- no translation found for select_input_method (8547250819326693584) -->
+ <skip />
+ <!-- no translation found for configure_input_methods (4769971288371946846) -->
+ <skip />
<string name="use_physical_keyboard" msgid="6203112478095117625">"Teclado físico"</string>
<string name="hardware" msgid="7517821086888990278">"Hardware"</string>
<string name="select_keyboard_layout_notification_title" msgid="1407367017263030773">"Seleccionar deseño de teclado"</string>
@@ -1633,8 +1635,7 @@
<string name="user_switched" msgid="3768006783166984410">"Usuario actual <xliff:g id="NAME">%1$s</xliff:g>."</string>
<string name="owner_name" msgid="2716755460376028154">"Propietario"</string>
<string name="error_message_title" msgid="4510373083082500195">"Erro"</string>
- <!-- no translation found for error_message_change_not_allowed (1347282344200417578) -->
- <skip />
+ <string name="error_message_change_not_allowed" msgid="1347282344200417578">"O administrador non admite este cambio"</string>
<string name="app_not_found" msgid="3429141853498927379">"Non se atopou ningunha aplicación para procesar esta acción"</string>
<string name="revoke" msgid="5404479185228271586">"Revogar"</string>
<string name="mediasize_iso_a0" msgid="1994474252931294172">"ISO A0"</string>
@@ -1765,4 +1766,40 @@
<string name="lock_to_app_unlock_pin" msgid="7908385370846820001">"PIN"</string>
<string name="lock_to_app_unlock_pattern" msgid="7763071104790758405">"deseño de desbloqueo"</string>
<string name="lock_to_app_unlock_password" msgid="795224196583495868">"contrasinal"</string>
+ <!-- no translation found for description_ustvpg (3666171166900312727) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_d (6552868431924879897) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_l (2427588153488291892) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_s (2556047043212535339) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_v (6647466085048806213) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_fv (4015953953338931020) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_y (2271448022073929890) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_y7 (8931861188215869211) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_g (506861774854051282) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_pg (4238749719629801564) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_14 (6305164472373004907) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_ma (5842074394338699982) -->
+ <skip />
+ <!-- no translation found for description_krtv_all (11497981488871053) -->
+ <skip />
+ <!-- no translation found for description_krtv_7 (6204900788594114856) -->
+ <skip />
+ <!-- no translation found for description_krtv_12 (5134514644432355428) -->
+ <skip />
+ <!-- no translation found for description_krtv_15 (1183692678647313272) -->
+ <skip />
+ <!-- no translation found for description_krtv_19 (7021986912313208481) -->
+ <skip />
+ <!-- no translation found for battery_saver_description (724302068634956656) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-hi/strings.xml b/core/res/res/values-hi/strings.xml
index df462d6..94b238ed 100644
--- a/core/res/res/values-hi/strings.xml
+++ b/core/res/res/values-hi/strings.xml
@@ -480,11 +480,11 @@
<string name="permdesc_broadcastSticky" product="tablet" msgid="7749760494399915651">"ऐप्स को स्टिकी प्रसारण भेजने देता है, जो प्रसारण समाप्त होने के बाद भी बने रहते हैं. अत्यधिक उपयोग, टेबलेट की बहुत अधिक स्मृति का उपयोग करके उसे धीमा या अस्थिर कर सकता है."</string>
<string name="permdesc_broadcastSticky" product="default" msgid="2825803764232445091">"ऐप्स को स्टिकी प्रसारण भेजने देता है, जो प्रसारण समाप्त होने के बाद भी बने रहते हैं. अत्यधिक उपयोग, फ़ोन की बहुत अधिक स्मृति का उपयोग करके उसे धीमा या अस्थिर कर सकता है."</string>
<string name="permlab_readContacts" msgid="8348481131899886131">"अपने संपर्क पढ़ें"</string>
- <string name="permdesc_readContacts" product="tablet" msgid="5294866856941149639">"ऐप्स को आपके टेबलेट में संग्रहीत संपर्कों के डेटा को, साथ ही आपके द्वारा विशिष्ट व्यक्तियों को कॉल करने, ईमेल करने, या अन्य तरीके से संवाद करने की आवृत्ति को पढ़ने देता है. यह अनुमति ऐप्स को आपके संपर्क डेटा को सहेजने देती है, और दुर्भावनापूर्ण ऐप्स आपकी जानकारी के बिना संपर्क डेटा को साझा कर सकते हैं."</string>
- <string name="permdesc_readContacts" product="default" msgid="8440654152457300662">"ऐप्स को आपके फ़ोन में संग्रहीत संपर्कों के डेटा को, साथ ही आपके द्वारा विशिष्ट व्यक्तियों को कॉल करने, ईमेल करने, या अन्य तरीके से संवाद करने की आवृत्ति को पढ़ने देता है. यह अनुमति ऐप्स को आपके संपर्क डेटा को सहेजने देती है, और दुर्भावनापूर्ण ऐप्स आपकी जानकारी के बिना संपर्क डेटा को साझा कर सकते हैं."</string>
+ <string name="permdesc_readContacts" product="tablet" msgid="5294866856941149639">"ऐप्स को आपके टेबलेट में संग्रहीत संपर्कों के डेटा को, साथ ही आपके द्वारा विशिष्ट व्यक्तियों को कॉल करने, ईमेल करने, या अन्य तरीके से डॉयलॉग करने की आवृत्ति को पढ़ने देता है. यह अनुमति ऐप्स को आपके संपर्क डेटा को सहेजने देती है, और दुर्भावनापूर्ण ऐप्स आपकी जानकारी के बिना संपर्क डेटा को साझा कर सकते हैं."</string>
+ <string name="permdesc_readContacts" product="default" msgid="8440654152457300662">"ऐप्स को आपके फ़ोन में संग्रहीत संपर्कों के डेटा को, साथ ही आपके द्वारा विशिष्ट व्यक्तियों को कॉल करने, ईमेल करने, या अन्य तरीके से डॉयलॉग करने की आवृत्ति को पढ़ने देता है. यह अनुमति ऐप्स को आपके संपर्क डेटा को सहेजने देती है, और दुर्भावनापूर्ण ऐप्स आपकी जानकारी के बिना संपर्क डेटा को साझा कर सकते हैं."</string>
<string name="permlab_writeContacts" msgid="5107492086416793544">"अपने संपर्क बदलें"</string>
- <string name="permdesc_writeContacts" product="tablet" msgid="897243932521953602">"ऐप्स को आपके टेबलेट में संग्रहीत संपर्कों के डेटा को, साथ ही आपके द्वारा विशिष्ट व्यक्तियों को कॉल करने, ईमेल करने, या अन्य तरीके से संवाद करने की आवृत्ति को संशोधित करने देता है. यह अनुमति ऐप्स को आपके संपर्क डेटा को हटाने देती है."</string>
- <string name="permdesc_writeContacts" product="default" msgid="589869224625163558">"ऐप्स को आपके फ़ोन में संग्रहीत संपर्कों के डेटा को, साथ ही आपके द्वारा विशिष्ट व्यक्तियों को कॉल करने, ईमेल करने, या अन्य तरीके से संवाद करने की आवृत्ति को संशोधित करने देता है. यह अनुमति ऐप्स को आपके संपर्क डेटा को हटाने देती है."</string>
+ <string name="permdesc_writeContacts" product="tablet" msgid="897243932521953602">"ऐप्स को आपके टेबलेट में संग्रहीत संपर्कों के डेटा को, साथ ही आपके द्वारा विशिष्ट व्यक्तियों को कॉल करने, ईमेल करने, या अन्य तरीके से डॉयलॉग करने की आवृत्ति को संशोधित करने देता है. यह अनुमति ऐप्स को आपके संपर्क डेटा को हटाने देती है."</string>
+ <string name="permdesc_writeContacts" product="default" msgid="589869224625163558">"ऐप्स को आपके फ़ोन में संग्रहीत संपर्कों के डेटा को, साथ ही आपके द्वारा विशिष्ट व्यक्तियों को कॉल करने, ईमेल करने, या अन्य तरीके से डॉयलॉग करने की आवृत्ति को संशोधित करने देता है. यह अनुमति ऐप्स को आपके संपर्क डेटा को हटाने देती है."</string>
<string name="permlab_readCallLog" msgid="3478133184624102739">"कॉल लॉग पढ़ें"</string>
<string name="permdesc_readCallLog" product="tablet" msgid="3700645184870760285">"ऐप्स को आपके फ़ोन का कॉल लॉग पढ़ने देता है, जिसमें इनकमिंग और आउटगोइंग कॉल का डेटा शामिल है. यह अनुमति ऐप्स को आपके कॉल लॉग डेटा को सहेजने देती है, और दुर्भावनापूर्ण ऐप्स आपकी जानकारी के बिना कॉल लॉग डेटा को साझा कर सकते हैं."</string>
<string name="permdesc_readCallLog" product="default" msgid="5777725796813217244">"ऐप्स को आपके फ़ोन का कॉल लॉग पढ़ने देता है, जिसमें इनकमिंग और आउटगोइंग कॉल का डेटा शामिल है. यह अनुमति ऐप्स को आपके कॉल लॉग डेटा को सहेजने देती है, और दुर्भावनापूर्ण ऐप्स आपकी जानकारी के बिना कॉल लॉग डेटा को साझा कर सकते हैं."</string>
@@ -1048,8 +1048,8 @@
<string name="searchview_description_submit" msgid="2688450133297983542">"क्वेरी सबमिट करें"</string>
<string name="searchview_description_voice" msgid="2453203695674994440">"बोलकर खोजें"</string>
<string name="enable_explore_by_touch_warning_title" msgid="7460694070309730149">"स्पर्श के द्वारा अन्वेषण करें सक्षम करें?"</string>
- <string name="enable_explore_by_touch_warning_message" product="tablet" msgid="8655887539089910577">"<xliff:g id="ACCESSIBILITY_SERVICE_NAME">%1$s</xliff:g> स्पर्श के द्वारा अन्वेषण करें सक्षम करना चाहती है. स्पर्श के द्वारा अन्वेष करें चालू होने पर, आप अपनी अंगुली के नीचे क्या है उसका विवरण सुन सकते हैं या देख सकते हैं या टेबलेट से संवाद करने के लिए जेस्चर निष्पादित कर सकते हैं."</string>
- <string name="enable_explore_by_touch_warning_message" product="default" msgid="2708199672852373195">"<xliff:g id="ACCESSIBILITY_SERVICE_NAME">%1$s</xliff:g> स्पर्श के द्वारा अन्वेषण करें सक्षम करना चाहती है. स्पर्श के द्वारा अन्वेष करें चालू होने पर, आप अपनी अंगुली के नीचे क्या है उसका विवरण सुन सकते हैं या देख सकते हैं या फ़ोन से संवाद करने के लिए जेस्चर निष्पादित कर सकते हैं."</string>
+ <string name="enable_explore_by_touch_warning_message" product="tablet" msgid="8655887539089910577">"<xliff:g id="ACCESSIBILITY_SERVICE_NAME">%1$s</xliff:g> स्पर्श के द्वारा अन्वेषण करें सक्षम करना चाहती है. स्पर्श के द्वारा अन्वेष करें चालू होने पर, आप अपनी अंगुली के नीचे क्या है उसका विवरण सुन सकते हैं या देख सकते हैं या टेबलेट से डॉयलॉग करने के लिए जेस्चर निष्पादित कर सकते हैं."</string>
+ <string name="enable_explore_by_touch_warning_message" product="default" msgid="2708199672852373195">"<xliff:g id="ACCESSIBILITY_SERVICE_NAME">%1$s</xliff:g> स्पर्श के द्वारा अन्वेषण करें सक्षम करना चाहती है. स्पर्श के द्वारा अन्वेष करें चालू होने पर, आप अपनी अंगुली के नीचे क्या है उसका विवरण सुन सकते हैं या देख सकते हैं या फ़ोन से डॉयलॉग करने के लिए जेस्चर निष्पादित कर सकते हैं."</string>
<string name="oneMonthDurationPast" msgid="7396384508953779925">"1 माह पहले"</string>
<string name="beforeOneMonthDurationPast" msgid="909134546836499826">"1 माह से पहले"</string>
<plurals name="num_seconds_ago">
@@ -1339,8 +1339,10 @@
<string name="extmedia_format_button_format" msgid="4131064560127478695">"प्रारूपित करें"</string>
<string name="adb_active_notification_title" msgid="6729044778949189918">"USB डीबग करना कनेक्ट किया गया"</string>
<string name="adb_active_notification_message" msgid="1016654627626476142">"USB डीबग करना अक्षम करने के लिए स्पर्श करें."</string>
- <string name="select_input_method" msgid="4653387336791222978">"इनपुट पद्धति चुनें"</string>
- <string name="configure_input_methods" msgid="9091652157722495116">"इनपुट पद्धतियां सेट करें"</string>
+ <!-- no translation found for select_input_method (8547250819326693584) -->
+ <skip />
+ <!-- no translation found for configure_input_methods (4769971288371946846) -->
+ <skip />
<string name="use_physical_keyboard" msgid="6203112478095117625">"भौतिक कीबोर्ड"</string>
<string name="hardware" msgid="7517821086888990278">"हार्डवेयर"</string>
<string name="select_keyboard_layout_notification_title" msgid="1407367017263030773">"कीबोर्ड लेआउट को चुनें"</string>
@@ -1386,10 +1388,10 @@
<string name="permdesc_trust_listener" msgid="8233895334214716864">"किसी ऐप्लिकेशन को ट्रस्ट स्थिति के बदलावों को सुनने की अनुमति देती है."</string>
<string name="permlab_provide_trust_agent" msgid="5465587586091358316">"विश्वसनीय एजेंट प्रदान करें."</string>
<string name="permdesc_provide_trust_agent" msgid="3865702641053068148">"ऐप्लिकेशन को विश्वसनीय एजेंट प्रदान करने देती है."</string>
- <string name="permlab_launch_trust_agent_settings" msgid="5859430082240410200">"विश्वस्त एजेंट सेटिंग मेनू लॉन्च करें."</string>
- <string name="permdesc_launch_trust_agent_settings" msgid="8185142708644913381">"ऐप्लिकेशन को ऐसी गतिविधि लॉन्च करने देती है जो विश्वस्त एजेंट के व्यवहार में बदलाव लाती है."</string>
- <string name="permlab_bind_trust_agent_service" msgid="8242093169457695334">"ट्रस्ट एजेंट सेवा से आबद्ध करना"</string>
- <string name="permdesc_bind_trust_agent_service" msgid="7041930026024507515">"किसी ऐप्लिकेशन को ट्रस्ट एजेंट सेवा से आबद्ध करने की अनुमति देती है."</string>
+ <string name="permlab_launch_trust_agent_settings" msgid="5859430082240410200">"विश्वसनीय एजेंट सेटिंग मेनू लॉन्च करें."</string>
+ <string name="permdesc_launch_trust_agent_settings" msgid="8185142708644913381">"ऐप्लिकेशन को ऐसी गतिविधि लॉन्च करने देती है जो विश्वसनीय एजेंट के व्यवहार में बदलाव लाती है."</string>
+ <string name="permlab_bind_trust_agent_service" msgid="8242093169457695334">"विश्वसनीय एजेंट सेवा से जुड़ें"</string>
+ <string name="permdesc_bind_trust_agent_service" msgid="7041930026024507515">"किसी ऐप्लिकेशन को विश्वसनीय एजेंट सेवा से जुडॉव की अनुमति देती है."</string>
<string name="permlab_recovery" msgid="3157024487744125846">"अपडेट और पुनर्प्राप्ति सिस्टम के साथ सहभागिता करें"</string>
<string name="permdesc_recovery" msgid="8511774533266359571">"ऐप्लिकेशन को पुनर्प्राप्ति सिस्टम और सिस्टम अपडेट के साथ सहभागिता करने देती है."</string>
<string name="permlab_createMediaProjection" msgid="4941338725487978112">"मीडिया प्रोजेक्शन सत्र बनाएं"</string>
@@ -1633,8 +1635,7 @@
<string name="user_switched" msgid="3768006783166984410">"वर्तमान उपयोगकर्ता <xliff:g id="NAME">%1$s</xliff:g>."</string>
<string name="owner_name" msgid="2716755460376028154">"स्वामी"</string>
<string name="error_message_title" msgid="4510373083082500195">"त्रुटि"</string>
- <!-- no translation found for error_message_change_not_allowed (1347282344200417578) -->
- <skip />
+ <string name="error_message_change_not_allowed" msgid="1347282344200417578">"यह बदलाव आपके व्यवस्थापक द्वारा अनुमत नहीं है"</string>
<string name="app_not_found" msgid="3429141853498927379">"इस कार्यवाही को प्रबंधित करने के लिए कोई ऐप्स नहीं मिला"</string>
<string name="revoke" msgid="5404479185228271586">"निरस्त करें"</string>
<string name="mediasize_iso_a0" msgid="1994474252931294172">"ISO A0"</string>
@@ -1765,4 +1766,40 @@
<string name="lock_to_app_unlock_pin" msgid="7908385370846820001">"पिन"</string>
<string name="lock_to_app_unlock_pattern" msgid="7763071104790758405">"पैटर्न अनलॉक करें"</string>
<string name="lock_to_app_unlock_password" msgid="795224196583495868">"पासवर्ड"</string>
+ <!-- no translation found for description_ustvpg (3666171166900312727) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_d (6552868431924879897) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_l (2427588153488291892) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_s (2556047043212535339) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_v (6647466085048806213) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_fv (4015953953338931020) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_y (2271448022073929890) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_y7 (8931861188215869211) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_g (506861774854051282) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_pg (4238749719629801564) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_14 (6305164472373004907) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_ma (5842074394338699982) -->
+ <skip />
+ <!-- no translation found for description_krtv_all (11497981488871053) -->
+ <skip />
+ <!-- no translation found for description_krtv_7 (6204900788594114856) -->
+ <skip />
+ <!-- no translation found for description_krtv_12 (5134514644432355428) -->
+ <skip />
+ <!-- no translation found for description_krtv_15 (1183692678647313272) -->
+ <skip />
+ <!-- no translation found for description_krtv_19 (7021986912313208481) -->
+ <skip />
+ <!-- no translation found for battery_saver_description (724302068634956656) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-hr/strings.xml b/core/res/res/values-hr/strings.xml
index 425de47..aec1cf2 100644
--- a/core/res/res/values-hr/strings.xml
+++ b/core/res/res/values-hr/strings.xml
@@ -1339,8 +1339,10 @@
<string name="extmedia_format_button_format" msgid="4131064560127478695">"Format"</string>
<string name="adb_active_notification_title" msgid="6729044778949189918">"Priključen je alat za uklanjanje programske pogreške USB-a"</string>
<string name="adb_active_notification_message" msgid="1016654627626476142">"Dodirnite da biste onemogućili rješavanje programske pogreške na USB-u."</string>
- <string name="select_input_method" msgid="4653387336791222978">"Odabir načina unosa"</string>
- <string name="configure_input_methods" msgid="9091652157722495116">"Postavljanje načina unosa"</string>
+ <!-- no translation found for select_input_method (8547250819326693584) -->
+ <skip />
+ <!-- no translation found for configure_input_methods (4769971288371946846) -->
+ <skip />
<string name="use_physical_keyboard" msgid="6203112478095117625">"Fizička tipkovnica"</string>
<string name="hardware" msgid="7517821086888990278">"Hardver"</string>
<string name="select_keyboard_layout_notification_title" msgid="1407367017263030773">"Odaberite izgled tipkovnice"</string>
@@ -1633,8 +1635,7 @@
<string name="user_switched" msgid="3768006783166984410">"Trenutačni korisnik <xliff:g id="NAME">%1$s</xliff:g>."</string>
<string name="owner_name" msgid="2716755460376028154">"Vlasnik"</string>
<string name="error_message_title" msgid="4510373083082500195">"Pogreška"</string>
- <!-- no translation found for error_message_change_not_allowed (1347282344200417578) -->
- <skip />
+ <string name="error_message_change_not_allowed" msgid="1347282344200417578">"Vaš administrator ne dopušta tu promjenu"</string>
<string name="app_not_found" msgid="3429141853498927379">"Nije pronađena aplikacija za upravljanje ovom radnjom"</string>
<string name="revoke" msgid="5404479185228271586">"Opozovi"</string>
<string name="mediasize_iso_a0" msgid="1994474252931294172">"ISO A0"</string>
@@ -1765,4 +1766,40 @@
<string name="lock_to_app_unlock_pin" msgid="7908385370846820001">"PIN"</string>
<string name="lock_to_app_unlock_pattern" msgid="7763071104790758405">"uzorak za otključavanje"</string>
<string name="lock_to_app_unlock_password" msgid="795224196583495868">"zaporka"</string>
+ <!-- no translation found for description_ustvpg (3666171166900312727) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_d (6552868431924879897) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_l (2427588153488291892) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_s (2556047043212535339) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_v (6647466085048806213) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_fv (4015953953338931020) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_y (2271448022073929890) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_y7 (8931861188215869211) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_g (506861774854051282) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_pg (4238749719629801564) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_14 (6305164472373004907) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_ma (5842074394338699982) -->
+ <skip />
+ <!-- no translation found for description_krtv_all (11497981488871053) -->
+ <skip />
+ <!-- no translation found for description_krtv_7 (6204900788594114856) -->
+ <skip />
+ <!-- no translation found for description_krtv_12 (5134514644432355428) -->
+ <skip />
+ <!-- no translation found for description_krtv_15 (1183692678647313272) -->
+ <skip />
+ <!-- no translation found for description_krtv_19 (7021986912313208481) -->
+ <skip />
+ <!-- no translation found for battery_saver_description (724302068634956656) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-hu/strings.xml b/core/res/res/values-hu/strings.xml
index 441d6dc..867625e87 100644
--- a/core/res/res/values-hu/strings.xml
+++ b/core/res/res/values-hu/strings.xml
@@ -1339,8 +1339,10 @@
<string name="extmedia_format_button_format" msgid="4131064560127478695">"Formázás"</string>
<string name="adb_active_notification_title" msgid="6729044778949189918">"USB hibakereső csatlakoztatva"</string>
<string name="adb_active_notification_message" msgid="1016654627626476142">"Érintse meg az USB hibakeresés kikapcsolásához."</string>
- <string name="select_input_method" msgid="4653387336791222978">"Beviteli mód kiválasztása"</string>
- <string name="configure_input_methods" msgid="9091652157722495116">"Beviteli módok beállítása"</string>
+ <!-- no translation found for select_input_method (8547250819326693584) -->
+ <skip />
+ <!-- no translation found for configure_input_methods (4769971288371946846) -->
+ <skip />
<string name="use_physical_keyboard" msgid="6203112478095117625">"Fizikai billentyűzet"</string>
<string name="hardware" msgid="7517821086888990278">"Hardver"</string>
<string name="select_keyboard_layout_notification_title" msgid="1407367017263030773">"Válasszon billentyűzetkiosztást"</string>
@@ -1384,10 +1386,10 @@
<string name="permdesc_control_keyguard" msgid="3043732290518629061">"Lehetővé teszi egy alkalmazás számára a billentyűzár vezérlését."</string>
<string name="permlab_trust_listener" msgid="1765718054003704476">"Trust-állapot változásának figyelése"</string>
<string name="permdesc_trust_listener" msgid="8233895334214716864">"Lehetővé teszi, hogy az alkalmazás figyelje a trust-állapot változásait."</string>
- <string name="permlab_provide_trust_agent" msgid="5465587586091358316">"Trust agent szoftver megadása"</string>
- <string name="permdesc_provide_trust_agent" msgid="3865702641053068148">"Lehetővé teszi, hogy az alkalmazás megadjon egy trust agent szoftvert."</string>
- <string name="permlab_launch_trust_agent_settings" msgid="5859430082240410200">"A trust agent beállításait tartalmazó menü indítása."</string>
- <string name="permdesc_launch_trust_agent_settings" msgid="8185142708644913381">"Lehetővé teszi, hogy egy alkalmazás olyan tevékenységet indítson el, amely megváltoztatja a trust agent viselkedését."</string>
+ <string name="permlab_provide_trust_agent" msgid="5465587586091358316">"Trust agent komponens megadása"</string>
+ <string name="permdesc_provide_trust_agent" msgid="3865702641053068148">"Lehetővé teszi, hogy az alkalmazás megadjon egy trust agent komponenst."</string>
+ <string name="permlab_launch_trust_agent_settings" msgid="5859430082240410200">"A trust agent komponens beállításait tartalmazó menü indítása."</string>
+ <string name="permdesc_launch_trust_agent_settings" msgid="8185142708644913381">"Lehetővé teszi, hogy egy alkalmazás olyan tevékenységet indítson el, amely megváltoztatja a trust agent komponens viselkedését."</string>
<string name="permlab_bind_trust_agent_service" msgid="8242093169457695334">"Csatlakozás egy trust agent szolgáltatáshoz"</string>
<string name="permdesc_bind_trust_agent_service" msgid="7041930026024507515">"Lehetővé teszi, hogy az alkalmazás egy trust agent szolgáltatáshoz csatlakozzon."</string>
<string name="permlab_recovery" msgid="3157024487744125846">"Kapcsolatfelvétel a frissítési és helyreállítási rendszerrel"</string>
@@ -1633,8 +1635,7 @@
<string name="user_switched" msgid="3768006783166984410">"<xliff:g id="NAME">%1$s</xliff:g> az aktuális felhasználó."</string>
<string name="owner_name" msgid="2716755460376028154">"Tulajdonos"</string>
<string name="error_message_title" msgid="4510373083082500195">"Hiba"</string>
- <!-- no translation found for error_message_change_not_allowed (1347282344200417578) -->
- <skip />
+ <string name="error_message_change_not_allowed" msgid="1347282344200417578">"Rendszergazdája nem engedélyezi ezt a módosítást"</string>
<string name="app_not_found" msgid="3429141853498927379">"Nincs megfelelő alkalmazás a művelet elvégzésére."</string>
<string name="revoke" msgid="5404479185228271586">"Visszavonás"</string>
<string name="mediasize_iso_a0" msgid="1994474252931294172">"„ISO A0” méret"</string>
@@ -1765,4 +1766,40 @@
<string name="lock_to_app_unlock_pin" msgid="7908385370846820001">"PIN kód"</string>
<string name="lock_to_app_unlock_pattern" msgid="7763071104790758405">"feloldási minta"</string>
<string name="lock_to_app_unlock_password" msgid="795224196583495868">"jelszó"</string>
+ <!-- no translation found for description_ustvpg (3666171166900312727) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_d (6552868431924879897) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_l (2427588153488291892) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_s (2556047043212535339) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_v (6647466085048806213) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_fv (4015953953338931020) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_y (2271448022073929890) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_y7 (8931861188215869211) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_g (506861774854051282) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_pg (4238749719629801564) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_14 (6305164472373004907) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_ma (5842074394338699982) -->
+ <skip />
+ <!-- no translation found for description_krtv_all (11497981488871053) -->
+ <skip />
+ <!-- no translation found for description_krtv_7 (6204900788594114856) -->
+ <skip />
+ <!-- no translation found for description_krtv_12 (5134514644432355428) -->
+ <skip />
+ <!-- no translation found for description_krtv_15 (1183692678647313272) -->
+ <skip />
+ <!-- no translation found for description_krtv_19 (7021986912313208481) -->
+ <skip />
+ <!-- no translation found for battery_saver_description (724302068634956656) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-hy-rAM/strings.xml b/core/res/res/values-hy-rAM/strings.xml
index d72dd18..91bf908 100644
--- a/core/res/res/values-hy-rAM/strings.xml
+++ b/core/res/res/values-hy-rAM/strings.xml
@@ -1339,8 +1339,10 @@
<string name="extmedia_format_button_format" msgid="4131064560127478695">"Ձևաչափ"</string>
<string name="adb_active_notification_title" msgid="6729044778949189918">"USB վրիպազերծումը միացված է"</string>
<string name="adb_active_notification_message" msgid="1016654627626476142">"Հպեք` USB կարգաբերումը կասեցնելու համար:"</string>
- <string name="select_input_method" msgid="4653387336791222978">"Ընտրեք մուտքագրման եղանակը"</string>
- <string name="configure_input_methods" msgid="9091652157722495116">"Կարգավորել ներածման եղանակները"</string>
+ <!-- no translation found for select_input_method (8547250819326693584) -->
+ <skip />
+ <!-- no translation found for configure_input_methods (4769971288371946846) -->
+ <skip />
<string name="use_physical_keyboard" msgid="6203112478095117625">"Ֆիզիկական ստեղնաշար"</string>
<string name="hardware" msgid="7517821086888990278">"Սարքաշար"</string>
<string name="select_keyboard_layout_notification_title" msgid="1407367017263030773">"Ընտրեք ստեղնաշարի դիրքը"</string>
@@ -1633,8 +1635,7 @@
<string name="user_switched" msgid="3768006783166984410">"Ներկայիս օգտվողը <xliff:g id="NAME">%1$s</xliff:g>:"</string>
<string name="owner_name" msgid="2716755460376028154">"Սեփականատեր"</string>
<string name="error_message_title" msgid="4510373083082500195">"Սխալ"</string>
- <!-- no translation found for error_message_change_not_allowed (1347282344200417578) -->
- <skip />
+ <string name="error_message_change_not_allowed" msgid="1347282344200417578">"Այս փոփոխությունը չի թույլատրվում ձեր ադմինիստրատորի կողմից:"</string>
<string name="app_not_found" msgid="3429141853498927379">"Այս գործողությունը կատարելու համար ոչ մի ծրագիր չի գտնվել:"</string>
<string name="revoke" msgid="5404479185228271586">"Չեղարկել"</string>
<string name="mediasize_iso_a0" msgid="1994474252931294172">"ISO A0"</string>
@@ -1765,4 +1766,40 @@
<string name="lock_to_app_unlock_pin" msgid="7908385370846820001">"PIN"</string>
<string name="lock_to_app_unlock_pattern" msgid="7763071104790758405">"ապակողպող նախշ"</string>
<string name="lock_to_app_unlock_password" msgid="795224196583495868">"գաղտնաբառ"</string>
+ <!-- no translation found for description_ustvpg (3666171166900312727) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_d (6552868431924879897) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_l (2427588153488291892) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_s (2556047043212535339) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_v (6647466085048806213) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_fv (4015953953338931020) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_y (2271448022073929890) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_y7 (8931861188215869211) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_g (506861774854051282) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_pg (4238749719629801564) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_14 (6305164472373004907) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_ma (5842074394338699982) -->
+ <skip />
+ <!-- no translation found for description_krtv_all (11497981488871053) -->
+ <skip />
+ <!-- no translation found for description_krtv_7 (6204900788594114856) -->
+ <skip />
+ <!-- no translation found for description_krtv_12 (5134514644432355428) -->
+ <skip />
+ <!-- no translation found for description_krtv_15 (1183692678647313272) -->
+ <skip />
+ <!-- no translation found for description_krtv_19 (7021986912313208481) -->
+ <skip />
+ <!-- no translation found for battery_saver_description (724302068634956656) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-in/strings.xml b/core/res/res/values-in/strings.xml
index 50e96de..76b24bc 100644
--- a/core/res/res/values-in/strings.xml
+++ b/core/res/res/values-in/strings.xml
@@ -812,7 +812,7 @@
<string name="phoneTypeFaxHome" msgid="2067265972322971467">"Faks Rumah"</string>
<string name="phoneTypePager" msgid="7582359955394921732">"Pager"</string>
<string name="phoneTypeOther" msgid="1544425847868765990">"Lainnya"</string>
- <string name="phoneTypeCallback" msgid="2712175203065678206">"Panggil balik"</string>
+ <string name="phoneTypeCallback" msgid="2712175203065678206">"Telepon balik"</string>
<string name="phoneTypeCar" msgid="8738360689616716982">"Mobil"</string>
<string name="phoneTypeCompanyMain" msgid="540434356461478916">"Utama Perusahaan"</string>
<string name="phoneTypeIsdn" msgid="8022453193171370337">"ISDN"</string>
@@ -1339,8 +1339,10 @@
<string name="extmedia_format_button_format" msgid="4131064560127478695">"Format"</string>
<string name="adb_active_notification_title" msgid="6729044778949189918">"Debugging USB terhubung"</string>
<string name="adb_active_notification_message" msgid="1016654627626476142">"Sentuh untuk menonaktifkan debugging USB."</string>
- <string name="select_input_method" msgid="4653387336791222978">"Pilih metode masukan"</string>
- <string name="configure_input_methods" msgid="9091652157722495116">"Menyiapkan metode masukan"</string>
+ <!-- no translation found for select_input_method (8547250819326693584) -->
+ <skip />
+ <!-- no translation found for configure_input_methods (4769971288371946846) -->
+ <skip />
<string name="use_physical_keyboard" msgid="6203112478095117625">"Keyboard fisik"</string>
<string name="hardware" msgid="7517821086888990278">"Perangkat Keras"</string>
<string name="select_keyboard_layout_notification_title" msgid="1407367017263030773">"Pilih tata letak keyboard"</string>
@@ -1388,8 +1390,8 @@
<string name="permdesc_provide_trust_agent" msgid="3865702641053068148">"Memungkinkan aplikasi memberikan agen tepercaya."</string>
<string name="permlab_launch_trust_agent_settings" msgid="5859430082240410200">"Luncurkan menu setelan agen tepercaya."</string>
<string name="permdesc_launch_trust_agent_settings" msgid="8185142708644913381">"Izinkan aplikasi meluncurkan aktivitas yang mengubah perilaku agen tepercaya."</string>
- <string name="permlab_bind_trust_agent_service" msgid="8242093169457695334">"Ikat ke layanan agen kepercayaan"</string>
- <string name="permdesc_bind_trust_agent_service" msgid="7041930026024507515">"Mengizinkan aplikasi mengikat ke layanan agen kepercayaan."</string>
+ <string name="permlab_bind_trust_agent_service" msgid="8242093169457695334">"Ikat ke layanan agen tepercaya"</string>
+ <string name="permdesc_bind_trust_agent_service" msgid="7041930026024507515">"Mengizinkan aplikasi mengikat ke layanan agen tepercaya."</string>
<string name="permlab_recovery" msgid="3157024487744125846">"Berinteraksi dengan sistem pemulihan dan pembaruan"</string>
<string name="permdesc_recovery" msgid="8511774533266359571">"Mengizinkan aplikasi berinteraksi dengan sistem pemulihan dan pembaruan sistem."</string>
<string name="permlab_createMediaProjection" msgid="4941338725487978112">"Membuat sesi proyeksi media"</string>
@@ -1405,7 +1407,7 @@
<string name="ime_action_done" msgid="8971516117910934605">"Selesai"</string>
<string name="ime_action_previous" msgid="1443550039250105948">"Sebelumnya"</string>
<string name="ime_action_default" msgid="2840921885558045721">"Lakukan"</string>
- <string name="dial_number_using" msgid="5789176425167573586">"Panggil nomor \nmenggunakan<xliff:g id="NUMBER">%s</xliff:g>"</string>
+ <string name="dial_number_using" msgid="5789176425167573586">"Telepon nomor \nmenggunakan<xliff:g id="NUMBER">%s</xliff:g>"</string>
<string name="create_contact_using" msgid="4947405226788104538">"Buat kontak \nmenggunakan <xliff:g id="NUMBER">%s</xliff:g>"</string>
<string name="grant_credentials_permission_message_header" msgid="2106103817937859662">"Satu atau beberapa apl meminta izin untuk mengakses akun Anda, sekarang dan di masa mendatang."</string>
<string name="grant_credentials_permission_message_footer" msgid="3125211343379376561">"Apakah Anda ingin mengizinkan permintaan ini?"</string>
@@ -1633,8 +1635,7 @@
<string name="user_switched" msgid="3768006783166984410">"Pengguna saat ini <xliff:g id="NAME">%1$s</xliff:g>."</string>
<string name="owner_name" msgid="2716755460376028154">"Pemilik"</string>
<string name="error_message_title" msgid="4510373083082500195">"Kesalahan"</string>
- <!-- no translation found for error_message_change_not_allowed (1347282344200417578) -->
- <skip />
+ <string name="error_message_change_not_allowed" msgid="1347282344200417578">"Perubahan ini tidak diizinkan oleh administrator Anda"</string>
<string name="app_not_found" msgid="3429141853498927379">"Tidak ada aplikasi yang ditemukan untuk menangani tindakan ini"</string>
<string name="revoke" msgid="5404479185228271586">"Cabut"</string>
<string name="mediasize_iso_a0" msgid="1994474252931294172">"ISO A0"</string>
@@ -1765,4 +1766,40 @@
<string name="lock_to_app_unlock_pin" msgid="7908385370846820001">"PIN"</string>
<string name="lock_to_app_unlock_pattern" msgid="7763071104790758405">"pola pembuka kunci"</string>
<string name="lock_to_app_unlock_password" msgid="795224196583495868">"sandi"</string>
+ <!-- no translation found for description_ustvpg (3666171166900312727) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_d (6552868431924879897) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_l (2427588153488291892) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_s (2556047043212535339) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_v (6647466085048806213) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_fv (4015953953338931020) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_y (2271448022073929890) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_y7 (8931861188215869211) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_g (506861774854051282) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_pg (4238749719629801564) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_14 (6305164472373004907) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_ma (5842074394338699982) -->
+ <skip />
+ <!-- no translation found for description_krtv_all (11497981488871053) -->
+ <skip />
+ <!-- no translation found for description_krtv_7 (6204900788594114856) -->
+ <skip />
+ <!-- no translation found for description_krtv_12 (5134514644432355428) -->
+ <skip />
+ <!-- no translation found for description_krtv_15 (1183692678647313272) -->
+ <skip />
+ <!-- no translation found for description_krtv_19 (7021986912313208481) -->
+ <skip />
+ <!-- no translation found for battery_saver_description (724302068634956656) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-is-rIS/strings.xml b/core/res/res/values-is-rIS/strings.xml
index f77ae33..e4a1d7a 100644
--- a/core/res/res/values-is-rIS/strings.xml
+++ b/core/res/res/values-is-rIS/strings.xml
@@ -1339,8 +1339,10 @@
<string name="extmedia_format_button_format" msgid="4131064560127478695">"Forsníða"</string>
<string name="adb_active_notification_title" msgid="6729044778949189918">"USB-villuleit tengd"</string>
<string name="adb_active_notification_message" msgid="1016654627626476142">"Snertu til að slökkva á USB-villuleit."</string>
- <string name="select_input_method" msgid="4653387336791222978">"Veldu innsláttaraðferð"</string>
- <string name="configure_input_methods" msgid="9091652157722495116">"Setja upp innsláttaraðferðir"</string>
+ <!-- no translation found for select_input_method (8547250819326693584) -->
+ <skip />
+ <!-- no translation found for configure_input_methods (4769971288371946846) -->
+ <skip />
<string name="use_physical_keyboard" msgid="6203112478095117625">"Vélbúnaðarlyklaborð"</string>
<string name="hardware" msgid="7517821086888990278">"Vélbúnaður"</string>
<string name="select_keyboard_layout_notification_title" msgid="1407367017263030773">"Veldu lyklaskipan"</string>
@@ -1633,8 +1635,7 @@
<string name="user_switched" msgid="3768006783166984410">"Núverandi notandi <xliff:g id="NAME">%1$s</xliff:g>."</string>
<string name="owner_name" msgid="2716755460376028154">"Eigandi"</string>
<string name="error_message_title" msgid="4510373083082500195">"Villa"</string>
- <!-- no translation found for error_message_change_not_allowed (1347282344200417578) -->
- <skip />
+ <string name="error_message_change_not_allowed" msgid="1347282344200417578">"Stjórnandinn þinn leyfir ekki þessa breytingu."</string>
<string name="app_not_found" msgid="3429141853498927379">"Ekkert forrit fannst til að meðhöndla þessa aðgerð"</string>
<string name="revoke" msgid="5404479185228271586">"Afturkalla"</string>
<string name="mediasize_iso_a0" msgid="1994474252931294172">"ISO A0"</string>
@@ -1765,4 +1766,40 @@
<string name="lock_to_app_unlock_pin" msgid="7908385370846820001">"PIN-númer"</string>
<string name="lock_to_app_unlock_pattern" msgid="7763071104790758405">"opnunarmynstur"</string>
<string name="lock_to_app_unlock_password" msgid="795224196583495868">"aðgangsorð"</string>
+ <!-- no translation found for description_ustvpg (3666171166900312727) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_d (6552868431924879897) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_l (2427588153488291892) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_s (2556047043212535339) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_v (6647466085048806213) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_fv (4015953953338931020) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_y (2271448022073929890) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_y7 (8931861188215869211) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_g (506861774854051282) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_pg (4238749719629801564) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_14 (6305164472373004907) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_ma (5842074394338699982) -->
+ <skip />
+ <!-- no translation found for description_krtv_all (11497981488871053) -->
+ <skip />
+ <!-- no translation found for description_krtv_7 (6204900788594114856) -->
+ <skip />
+ <!-- no translation found for description_krtv_12 (5134514644432355428) -->
+ <skip />
+ <!-- no translation found for description_krtv_15 (1183692678647313272) -->
+ <skip />
+ <!-- no translation found for description_krtv_19 (7021986912313208481) -->
+ <skip />
+ <!-- no translation found for battery_saver_description (724302068634956656) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-it/strings.xml b/core/res/res/values-it/strings.xml
index b04ac30..5bd2071 100644
--- a/core/res/res/values-it/strings.xml
+++ b/core/res/res/values-it/strings.xml
@@ -1339,8 +1339,10 @@
<string name="extmedia_format_button_format" msgid="4131064560127478695">"Formatta"</string>
<string name="adb_active_notification_title" msgid="6729044778949189918">"Debug USB collegato"</string>
<string name="adb_active_notification_message" msgid="1016654627626476142">"Tocca per disattivare il debug USB."</string>
- <string name="select_input_method" msgid="4653387336791222978">"Scegli il metodo di immissione"</string>
- <string name="configure_input_methods" msgid="9091652157722495116">"Configura metodi di immissione"</string>
+ <!-- no translation found for select_input_method (8547250819326693584) -->
+ <skip />
+ <!-- no translation found for configure_input_methods (4769971288371946846) -->
+ <skip />
<string name="use_physical_keyboard" msgid="6203112478095117625">"Tastiera fisica"</string>
<string name="hardware" msgid="7517821086888990278">"Hardware"</string>
<string name="select_keyboard_layout_notification_title" msgid="1407367017263030773">"Seleziona layout tastiera"</string>
@@ -1384,12 +1386,12 @@
<string name="permdesc_control_keyguard" msgid="3043732290518629061">"Consente a un\'applicazione di controllare keguard."</string>
<string name="permlab_trust_listener" msgid="1765718054003704476">"Rilevamento modifiche dello stato trust."</string>
<string name="permdesc_trust_listener" msgid="8233895334214716864">"Consente a un\'applicazione di rilevare le modifiche nello stato trust."</string>
- <string name="permlab_provide_trust_agent" msgid="5465587586091358316">"Indica un trust agent."</string>
- <string name="permdesc_provide_trust_agent" msgid="3865702641053068148">"Consente a un\'applicazione di indicare un trust agent."</string>
- <string name="permlab_launch_trust_agent_settings" msgid="5859430082240410200">"Avvio del menu di impostazioni del trust agent."</string>
- <string name="permdesc_launch_trust_agent_settings" msgid="8185142708644913381">"Consente a un\'applicazione di avviare un\'attività che modifica il comportamento di un trust agent."</string>
- <string name="permlab_bind_trust_agent_service" msgid="8242093169457695334">"Associazione a un servizio trust agent"</string>
- <string name="permdesc_bind_trust_agent_service" msgid="7041930026024507515">"Consente a un\'applicazione di associarsi a un servizio trust agent."</string>
+ <string name="permlab_provide_trust_agent" msgid="5465587586091358316">"Indica un agente di attendibilità."</string>
+ <string name="permdesc_provide_trust_agent" msgid="3865702641053068148">"Consente a un\'applicazione di indicare un agente di attendibilità."</string>
+ <string name="permlab_launch_trust_agent_settings" msgid="5859430082240410200">"Avvio del menu di impostazioni dell\'agente di attendibilità."</string>
+ <string name="permdesc_launch_trust_agent_settings" msgid="8185142708644913381">"Consente a un\'applicazione di avviare un\'attività che modifica il comportamento di un agente di attendibilità."</string>
+ <string name="permlab_bind_trust_agent_service" msgid="8242093169457695334">"Associazione a un agente di attendibilità"</string>
+ <string name="permdesc_bind_trust_agent_service" msgid="7041930026024507515">"Consente a un\'applicazione di associarsi a un agente di attendibilità."</string>
<string name="permlab_recovery" msgid="3157024487744125846">"Interazione con il sistema di ripristino e aggiornamento"</string>
<string name="permdesc_recovery" msgid="8511774533266359571">"Consente a un\'applicazione di interagire con il sistema di ripristino e con gli aggiornamenti di sistema."</string>
<string name="permlab_createMediaProjection" msgid="4941338725487978112">"Crea sessioni di proiezioni multimediali"</string>
@@ -1633,8 +1635,7 @@
<string name="user_switched" msgid="3768006783166984410">"Utente corrente <xliff:g id="NAME">%1$s</xliff:g>."</string>
<string name="owner_name" msgid="2716755460376028154">"Proprietario"</string>
<string name="error_message_title" msgid="4510373083082500195">"Errore"</string>
- <!-- no translation found for error_message_change_not_allowed (1347282344200417578) -->
- <skip />
+ <string name="error_message_change_not_allowed" msgid="1347282344200417578">"Questa modifica non è consentita dal tuo amministratore"</string>
<string name="app_not_found" msgid="3429141853498927379">"Nessuna applicazione trovata in grado di gestire questa azione"</string>
<string name="revoke" msgid="5404479185228271586">"Revoca"</string>
<string name="mediasize_iso_a0" msgid="1994474252931294172">"ISO A0"</string>
@@ -1765,4 +1766,40 @@
<string name="lock_to_app_unlock_pin" msgid="7908385370846820001">"PIN"</string>
<string name="lock_to_app_unlock_pattern" msgid="7763071104790758405">"sequenza di sblocco"</string>
<string name="lock_to_app_unlock_password" msgid="795224196583495868">"password"</string>
+ <!-- no translation found for description_ustvpg (3666171166900312727) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_d (6552868431924879897) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_l (2427588153488291892) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_s (2556047043212535339) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_v (6647466085048806213) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_fv (4015953953338931020) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_y (2271448022073929890) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_y7 (8931861188215869211) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_g (506861774854051282) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_pg (4238749719629801564) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_14 (6305164472373004907) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_ma (5842074394338699982) -->
+ <skip />
+ <!-- no translation found for description_krtv_all (11497981488871053) -->
+ <skip />
+ <!-- no translation found for description_krtv_7 (6204900788594114856) -->
+ <skip />
+ <!-- no translation found for description_krtv_12 (5134514644432355428) -->
+ <skip />
+ <!-- no translation found for description_krtv_15 (1183692678647313272) -->
+ <skip />
+ <!-- no translation found for description_krtv_19 (7021986912313208481) -->
+ <skip />
+ <!-- no translation found for battery_saver_description (724302068634956656) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-iw/strings.xml b/core/res/res/values-iw/strings.xml
index 8afdb86..ea3d83d 100644
--- a/core/res/res/values-iw/strings.xml
+++ b/core/res/res/values-iw/strings.xml
@@ -1339,8 +1339,10 @@
<string name="extmedia_format_button_format" msgid="4131064560127478695">"פרמוט"</string>
<string name="adb_active_notification_title" msgid="6729044778949189918">"ניקוי באגים של USB מחובר"</string>
<string name="adb_active_notification_message" msgid="1016654627626476142">"גע כדי להשבית את ניקוי הבאגים בהתקן ה-USB."</string>
- <string name="select_input_method" msgid="4653387336791222978">"בחר שיטת הזנה"</string>
- <string name="configure_input_methods" msgid="9091652157722495116">"הגדר שיטות קלט"</string>
+ <!-- no translation found for select_input_method (8547250819326693584) -->
+ <skip />
+ <!-- no translation found for configure_input_methods (4769971288371946846) -->
+ <skip />
<string name="use_physical_keyboard" msgid="6203112478095117625">"מקלדת פיזית"</string>
<string name="hardware" msgid="7517821086888990278">"חומרה"</string>
<string name="select_keyboard_layout_notification_title" msgid="1407367017263030773">"בחירת פריסת מקלדת"</string>
@@ -1384,12 +1386,12 @@
<string name="permdesc_control_keyguard" msgid="3043732290518629061">"מאפשר לאפליקציה לשלוט במגן המקלדת."</string>
<string name="permlab_trust_listener" msgid="1765718054003704476">"חיפוש שינויים במצב אמון."</string>
<string name="permdesc_trust_listener" msgid="8233895334214716864">"מאפשר לאפליקציה לחפש שינויים במצב אמון."</string>
- <string name="permlab_provide_trust_agent" msgid="5465587586091358316">"ציון סוכן אמון."</string>
- <string name="permdesc_provide_trust_agent" msgid="3865702641053068148">"מאפשר לאפליקציה לספק סוכן אמון."</string>
- <string name="permlab_launch_trust_agent_settings" msgid="5859430082240410200">"הפעלה של תפריט ההגדרות עבור סוכן האמון."</string>
- <string name="permdesc_launch_trust_agent_settings" msgid="8185142708644913381">"מאפשר לאפליקציה להפעיל פעילות המשנה את התנהגות סוכן האמון."</string>
- <string name="permlab_bind_trust_agent_service" msgid="8242093169457695334">"איגוד אל שירות סוכן אמון"</string>
- <string name="permdesc_bind_trust_agent_service" msgid="7041930026024507515">"מאפשר לאפליקציה לאגוד אל שירות סוכן אמון."</string>
+ <string name="permlab_provide_trust_agent" msgid="5465587586091358316">"ציון סביבה אמינה."</string>
+ <string name="permdesc_provide_trust_agent" msgid="3865702641053068148">"מאפשר לאפליקציה לספק סביבה אמינה."</string>
+ <string name="permlab_launch_trust_agent_settings" msgid="5859430082240410200">"הפעלה של תפריט ההגדרות עבור סביבה אמינה."</string>
+ <string name="permdesc_launch_trust_agent_settings" msgid="8185142708644913381">"מאפשר לאפליקציה להפעיל פעילות המשנה את התנהגות הסביבה האמינה."</string>
+ <string name="permlab_bind_trust_agent_service" msgid="8242093169457695334">"איגוד אל שירות סביבה אמינה"</string>
+ <string name="permdesc_bind_trust_agent_service" msgid="7041930026024507515">"מאפשר לאפליקציה לאגוד אל שירות סביבה אמינה."</string>
<string name="permlab_recovery" msgid="3157024487744125846">"אינטראקציה עם מערכת שחזור ועדכונים"</string>
<string name="permdesc_recovery" msgid="8511774533266359571">"מאפשרת לאפליקציה ליצור אינטראקציה עם מערכת השחזור ועדכוני מערכת."</string>
<string name="permlab_createMediaProjection" msgid="4941338725487978112">"יצירת פעילות של הקרנת מדיה"</string>
@@ -1633,8 +1635,7 @@
<string name="user_switched" msgid="3768006783166984410">"המשתמש הנוכחי <xliff:g id="NAME">%1$s</xliff:g>."</string>
<string name="owner_name" msgid="2716755460376028154">"בעלים"</string>
<string name="error_message_title" msgid="4510373083082500195">"שגיאה"</string>
- <!-- no translation found for error_message_change_not_allowed (1347282344200417578) -->
- <skip />
+ <string name="error_message_change_not_allowed" msgid="1347282344200417578">"מנהל המערכת שלך אינו מתיר שינוי זה"</string>
<string name="app_not_found" msgid="3429141853498927379">"לא נמצאה אפליקציה שתומכת בפעולה זו"</string>
<string name="revoke" msgid="5404479185228271586">"בטל"</string>
<string name="mediasize_iso_a0" msgid="1994474252931294172">"ISO A0"</string>
@@ -1765,4 +1766,40 @@
<string name="lock_to_app_unlock_pin" msgid="7908385370846820001">"מספר PIN"</string>
<string name="lock_to_app_unlock_pattern" msgid="7763071104790758405">"קו ביטול נעילה"</string>
<string name="lock_to_app_unlock_password" msgid="795224196583495868">"סיסמה"</string>
+ <!-- no translation found for description_ustvpg (3666171166900312727) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_d (6552868431924879897) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_l (2427588153488291892) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_s (2556047043212535339) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_v (6647466085048806213) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_fv (4015953953338931020) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_y (2271448022073929890) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_y7 (8931861188215869211) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_g (506861774854051282) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_pg (4238749719629801564) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_14 (6305164472373004907) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_ma (5842074394338699982) -->
+ <skip />
+ <!-- no translation found for description_krtv_all (11497981488871053) -->
+ <skip />
+ <!-- no translation found for description_krtv_7 (6204900788594114856) -->
+ <skip />
+ <!-- no translation found for description_krtv_12 (5134514644432355428) -->
+ <skip />
+ <!-- no translation found for description_krtv_15 (1183692678647313272) -->
+ <skip />
+ <!-- no translation found for description_krtv_19 (7021986912313208481) -->
+ <skip />
+ <!-- no translation found for battery_saver_description (724302068634956656) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-ja/strings.xml b/core/res/res/values-ja/strings.xml
index 1d99f3d..b7f2f77 100644
--- a/core/res/res/values-ja/strings.xml
+++ b/core/res/res/values-ja/strings.xml
@@ -1339,8 +1339,10 @@
<string name="extmedia_format_button_format" msgid="4131064560127478695">"フォーマット"</string>
<string name="adb_active_notification_title" msgid="6729044778949189918">"USBデバッグが接続されました"</string>
<string name="adb_active_notification_message" msgid="1016654627626476142">"タップしてUSBデバッグを無効にします。"</string>
- <string name="select_input_method" msgid="4653387336791222978">"入力方法の選択"</string>
- <string name="configure_input_methods" msgid="9091652157722495116">"入力方法をセットアップ"</string>
+ <!-- no translation found for select_input_method (8547250819326693584) -->
+ <skip />
+ <!-- no translation found for configure_input_methods (4769971288371946846) -->
+ <skip />
<string name="use_physical_keyboard" msgid="6203112478095117625">"物理キーボード"</string>
<string name="hardware" msgid="7517821086888990278">"ハードウェア"</string>
<string name="select_keyboard_layout_notification_title" msgid="1407367017263030773">"キーボードレイアウトの選択"</string>
@@ -1633,8 +1635,7 @@
<string name="user_switched" msgid="3768006783166984410">"現在のユーザーは<xliff:g id="NAME">%1$s</xliff:g>です。"</string>
<string name="owner_name" msgid="2716755460376028154">"所有者"</string>
<string name="error_message_title" msgid="4510373083082500195">"エラー"</string>
- <!-- no translation found for error_message_change_not_allowed (1347282344200417578) -->
- <skip />
+ <string name="error_message_change_not_allowed" msgid="1347282344200417578">"この変更は管理者によって許可されていません"</string>
<string name="app_not_found" msgid="3429141853498927379">"この操作を行うアプリが見つかりません"</string>
<string name="revoke" msgid="5404479185228271586">"取り消し"</string>
<string name="mediasize_iso_a0" msgid="1994474252931294172">"ISO A0"</string>
@@ -1765,4 +1766,40 @@
<string name="lock_to_app_unlock_pin" msgid="7908385370846820001">"PIN"</string>
<string name="lock_to_app_unlock_pattern" msgid="7763071104790758405">"ロック解除パターン"</string>
<string name="lock_to_app_unlock_password" msgid="795224196583495868">"パスワード"</string>
+ <!-- no translation found for description_ustvpg (3666171166900312727) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_d (6552868431924879897) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_l (2427588153488291892) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_s (2556047043212535339) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_v (6647466085048806213) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_fv (4015953953338931020) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_y (2271448022073929890) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_y7 (8931861188215869211) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_g (506861774854051282) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_pg (4238749719629801564) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_14 (6305164472373004907) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_ma (5842074394338699982) -->
+ <skip />
+ <!-- no translation found for description_krtv_all (11497981488871053) -->
+ <skip />
+ <!-- no translation found for description_krtv_7 (6204900788594114856) -->
+ <skip />
+ <!-- no translation found for description_krtv_12 (5134514644432355428) -->
+ <skip />
+ <!-- no translation found for description_krtv_15 (1183692678647313272) -->
+ <skip />
+ <!-- no translation found for description_krtv_19 (7021986912313208481) -->
+ <skip />
+ <!-- no translation found for battery_saver_description (724302068634956656) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-ka-rGE/strings.xml b/core/res/res/values-ka-rGE/strings.xml
index 05ac254..c06efc8 100644
--- a/core/res/res/values-ka-rGE/strings.xml
+++ b/core/res/res/values-ka-rGE/strings.xml
@@ -1339,8 +1339,10 @@
<string name="extmedia_format_button_format" msgid="4131064560127478695">"დაფორმატება"</string>
<string name="adb_active_notification_title" msgid="6729044778949189918">"USB გამართვა შეერთებულია"</string>
<string name="adb_active_notification_message" msgid="1016654627626476142">"შეეხეთ, რათა შეწყვიტოთ USB-ის გამართვა."</string>
- <string name="select_input_method" msgid="4653387336791222978">"აირჩიეთ შეყვანის მეთოდი"</string>
- <string name="configure_input_methods" msgid="9091652157722495116">"შეყვანის მეთოდების დაყენება"</string>
+ <!-- no translation found for select_input_method (8547250819326693584) -->
+ <skip />
+ <!-- no translation found for configure_input_methods (4769971288371946846) -->
+ <skip />
<string name="use_physical_keyboard" msgid="6203112478095117625">"ფიზიკური კლავიატურა"</string>
<string name="hardware" msgid="7517821086888990278">"მოწყობილობა"</string>
<string name="select_keyboard_layout_notification_title" msgid="1407367017263030773">"შეარჩიეთ კლავიატურის განლაგება."</string>
@@ -1414,8 +1416,8 @@
<string name="deny" msgid="2081879885755434506">"აკრძალვა"</string>
<string name="permission_request_notification_title" msgid="6486759795926237907">"მოთხოვნილია ნებართვა"</string>
<string name="permission_request_notification_with_subtitle" msgid="8530393139639560189">"მოთხოვნილია ნებრათვა \nანგარიშისთვის: <xliff:g id="ACCOUNT">%s</xliff:g>"</string>
- <string name="forward_intent_to_owner" msgid="570916783072215572">"ამ აპს თვენს პერსონალურ სივრცეში იყენებთ"</string>
- <string name="forward_intent_to_work" msgid="8624579696577525279">"ამ აპს თვენს სამუშაო სივრცეში იყენებთ"</string>
+ <string name="forward_intent_to_owner" msgid="570916783072215572">"ამ აპს თქვენს პერსონალურ სივრცეში იყენებთ"</string>
+ <string name="forward_intent_to_work" msgid="8624579696577525279">"ამ აპს თქვენს სამუშაო სივრცეში იყენებთ"</string>
<string name="input_method_binding_label" msgid="1283557179944992649">"შეყვანის მეთოდი"</string>
<string name="sync_binding_label" msgid="3687969138375092423">"სინქრონიზაცია"</string>
<string name="accessibility_binding_label" msgid="4148120742096474641">"წვდომა"</string>
@@ -1633,8 +1635,7 @@
<string name="user_switched" msgid="3768006783166984410">"ამჟამინდელი მომხმარებელი <xliff:g id="NAME">%1$s</xliff:g>."</string>
<string name="owner_name" msgid="2716755460376028154">"მფლობელი"</string>
<string name="error_message_title" msgid="4510373083082500195">"შეცდომა"</string>
- <!-- no translation found for error_message_change_not_allowed (1347282344200417578) -->
- <skip />
+ <string name="error_message_change_not_allowed" msgid="1347282344200417578">"ეს ცვლილება თქვენი დომენის ადმინისტრატორის მიერ ნებადართული არ არის."</string>
<string name="app_not_found" msgid="3429141853498927379">"ამ მოქმედების შესასრულებლად აპლიკაცია ვერ მოიძებნა"</string>
<string name="revoke" msgid="5404479185228271586">"გაუქმება"</string>
<string name="mediasize_iso_a0" msgid="1994474252931294172">"ISO A0"</string>
@@ -1765,4 +1766,40 @@
<string name="lock_to_app_unlock_pin" msgid="7908385370846820001">"PIN-კოდი"</string>
<string name="lock_to_app_unlock_pattern" msgid="7763071104790758405">"განბლოკვის ნიმუში"</string>
<string name="lock_to_app_unlock_password" msgid="795224196583495868">"პაროლი"</string>
+ <!-- no translation found for description_ustvpg (3666171166900312727) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_d (6552868431924879897) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_l (2427588153488291892) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_s (2556047043212535339) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_v (6647466085048806213) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_fv (4015953953338931020) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_y (2271448022073929890) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_y7 (8931861188215869211) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_g (506861774854051282) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_pg (4238749719629801564) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_14 (6305164472373004907) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_ma (5842074394338699982) -->
+ <skip />
+ <!-- no translation found for description_krtv_all (11497981488871053) -->
+ <skip />
+ <!-- no translation found for description_krtv_7 (6204900788594114856) -->
+ <skip />
+ <!-- no translation found for description_krtv_12 (5134514644432355428) -->
+ <skip />
+ <!-- no translation found for description_krtv_15 (1183692678647313272) -->
+ <skip />
+ <!-- no translation found for description_krtv_19 (7021986912313208481) -->
+ <skip />
+ <!-- no translation found for battery_saver_description (724302068634956656) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-kk-rKZ/strings.xml b/core/res/res/values-kk-rKZ/strings.xml
index 480a481..e72b418 100644
--- a/core/res/res/values-kk-rKZ/strings.xml
+++ b/core/res/res/values-kk-rKZ/strings.xml
@@ -1339,8 +1339,10 @@
<string name="extmedia_format_button_format" msgid="4131064560127478695">"Формат"</string>
<string name="adb_active_notification_title" msgid="6729044778949189918">"USB жөндеу қосылған"</string>
<string name="adb_active_notification_message" msgid="1016654627626476142">"USB күйін келтіруді өшіру үшін түртіңіз."</string>
- <string name="select_input_method" msgid="4653387336791222978">"Енгізу әдісін таңдау"</string>
- <string name="configure_input_methods" msgid="9091652157722495116">"Енгізу әдістерін реттеу"</string>
+ <!-- no translation found for select_input_method (8547250819326693584) -->
+ <skip />
+ <!-- no translation found for configure_input_methods (4769971288371946846) -->
+ <skip />
<string name="use_physical_keyboard" msgid="6203112478095117625">"Қатты пернетақта"</string>
<string name="hardware" msgid="7517821086888990278">"Компьютерлік жабдық"</string>
<string name="select_keyboard_layout_notification_title" msgid="1407367017263030773">"Пернетақта орналасуын таңдау"</string>
@@ -1633,8 +1635,7 @@
<string name="user_switched" msgid="3768006783166984410">"Ағымдағы пайдаланушы <xliff:g id="NAME">%1$s</xliff:g>."</string>
<string name="owner_name" msgid="2716755460376028154">"Пайдаланушы"</string>
<string name="error_message_title" msgid="4510373083082500195">"Қателік"</string>
- <!-- no translation found for error_message_change_not_allowed (1347282344200417578) -->
- <skip />
+ <string name="error_message_change_not_allowed" msgid="1347282344200417578">"Бұл өзгертуге әкімші рұқсат етпеген"</string>
<string name="app_not_found" msgid="3429141853498927379">"Бұл әрекетті орындайтын қолданба табылмады"</string>
<string name="revoke" msgid="5404479185228271586">"Бас тарту"</string>
<string name="mediasize_iso_a0" msgid="1994474252931294172">"ISO A0"</string>
@@ -1765,4 +1766,40 @@
<string name="lock_to_app_unlock_pin" msgid="7908385370846820001">"PIN"</string>
<string name="lock_to_app_unlock_pattern" msgid="7763071104790758405">"бекітпесін ашу әдісі"</string>
<string name="lock_to_app_unlock_password" msgid="795224196583495868">"құпия сөз"</string>
+ <!-- no translation found for description_ustvpg (3666171166900312727) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_d (6552868431924879897) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_l (2427588153488291892) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_s (2556047043212535339) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_v (6647466085048806213) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_fv (4015953953338931020) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_y (2271448022073929890) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_y7 (8931861188215869211) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_g (506861774854051282) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_pg (4238749719629801564) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_14 (6305164472373004907) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_ma (5842074394338699982) -->
+ <skip />
+ <!-- no translation found for description_krtv_all (11497981488871053) -->
+ <skip />
+ <!-- no translation found for description_krtv_7 (6204900788594114856) -->
+ <skip />
+ <!-- no translation found for description_krtv_12 (5134514644432355428) -->
+ <skip />
+ <!-- no translation found for description_krtv_15 (1183692678647313272) -->
+ <skip />
+ <!-- no translation found for description_krtv_19 (7021986912313208481) -->
+ <skip />
+ <!-- no translation found for battery_saver_description (724302068634956656) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-km-rKH/strings.xml b/core/res/res/values-km-rKH/strings.xml
index ce3214c..f59cb5a 100644
--- a/core/res/res/values-km-rKH/strings.xml
+++ b/core/res/res/values-km-rKH/strings.xml
@@ -1341,8 +1341,10 @@
<string name="extmedia_format_button_format" msgid="4131064560127478695">"ធ្វើទ្រង់ទ្រាយ"</string>
<string name="adb_active_notification_title" msgid="6729044778949189918">"បានភ្ជាប់ការកែកំហុសយូអេសប៊ី"</string>
<string name="adb_active_notification_message" msgid="1016654627626476142">"ប៉ះ ដើម្បីបិទការកែកំហុសយូអេសប៊ី។"</string>
- <string name="select_input_method" msgid="4653387336791222978">"ជ្រើសវិធីសាស្ត្របញ្ចូល"</string>
- <string name="configure_input_methods" msgid="9091652157722495116">"រៀបចំវិធីសាស្ត្របញ្ចូល"</string>
+ <!-- no translation found for select_input_method (8547250819326693584) -->
+ <skip />
+ <!-- no translation found for configure_input_methods (4769971288371946846) -->
+ <skip />
<string name="use_physical_keyboard" msgid="6203112478095117625">"ក្ដារចុចពិតប្រាកដ"</string>
<string name="hardware" msgid="7517821086888990278">"ផ្នែករឹង"</string>
<string name="select_keyboard_layout_notification_title" msgid="1407367017263030773">"ជ្រើសប្លង់ក្ដារចុច"</string>
@@ -1635,8 +1637,7 @@
<string name="user_switched" msgid="3768006783166984410">"អ្នកប្រើបច្ចុប្បន្ន <xliff:g id="NAME">%1$s</xliff:g> ។"</string>
<string name="owner_name" msgid="2716755460376028154">"ម្ចាស់"</string>
<string name="error_message_title" msgid="4510373083082500195">"កំហុស"</string>
- <!-- no translation found for error_message_change_not_allowed (1347282344200417578) -->
- <skip />
+ <string name="error_message_change_not_allowed" msgid="1347282344200417578">"ការផ្លាស់ប្ដូរនេះមិនត្រូវបានអនុញ្ញាតដោយអ្នកគ្រប់គ្រងរបស់អ្នកទេ"</string>
<string name="app_not_found" msgid="3429141853498927379">"រកមិនឃើញកម្មវិធី ដើម្បីគ្រប់គ្រងសកម្មភាពនេះ"</string>
<string name="revoke" msgid="5404479185228271586">"ដកហូត"</string>
<string name="mediasize_iso_a0" msgid="1994474252931294172">"ISO A0"</string>
@@ -1767,4 +1768,40 @@
<string name="lock_to_app_unlock_pin" msgid="7908385370846820001">"កូដ PIN"</string>
<string name="lock_to_app_unlock_pattern" msgid="7763071104790758405">"លំនាំដោះសោ"</string>
<string name="lock_to_app_unlock_password" msgid="795224196583495868">"ពាក្យសម្ងាត់"</string>
+ <!-- no translation found for description_ustvpg (3666171166900312727) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_d (6552868431924879897) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_l (2427588153488291892) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_s (2556047043212535339) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_v (6647466085048806213) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_fv (4015953953338931020) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_y (2271448022073929890) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_y7 (8931861188215869211) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_g (506861774854051282) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_pg (4238749719629801564) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_14 (6305164472373004907) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_ma (5842074394338699982) -->
+ <skip />
+ <!-- no translation found for description_krtv_all (11497981488871053) -->
+ <skip />
+ <!-- no translation found for description_krtv_7 (6204900788594114856) -->
+ <skip />
+ <!-- no translation found for description_krtv_12 (5134514644432355428) -->
+ <skip />
+ <!-- no translation found for description_krtv_15 (1183692678647313272) -->
+ <skip />
+ <!-- no translation found for description_krtv_19 (7021986912313208481) -->
+ <skip />
+ <!-- no translation found for battery_saver_description (724302068634956656) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-kn-rIN/strings.xml b/core/res/res/values-kn-rIN/strings.xml
index a657235..975715a 100644
--- a/core/res/res/values-kn-rIN/strings.xml
+++ b/core/res/res/values-kn-rIN/strings.xml
@@ -1339,8 +1339,10 @@
<string name="extmedia_format_button_format" msgid="4131064560127478695">"ಸ್ವರೂಪಿಸು"</string>
<string name="adb_active_notification_title" msgid="6729044778949189918">"USB ಡೀಬಗ್ ಮಾಡುವಿಕೆ ಸಂಪರ್ಕಪಡಿಸಲಾಗಿದೆ"</string>
<string name="adb_active_notification_message" msgid="1016654627626476142">"USB ಡೀಬಗ್ ಮಾಡುವಿಕೆಯನ್ನು ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಲು ಸ್ಪರ್ಶಿಸಿ."</string>
- <string name="select_input_method" msgid="4653387336791222978">"ಇನ್ಪುಟ್ ವಿಧಾನವನ್ನು ಆರಿಸಿ"</string>
- <string name="configure_input_methods" msgid="9091652157722495116">"ಇನ್ಪುಟ್ ವಿಧಾನಗಳನ್ನು ಹೊಂದಿಸಿ"</string>
+ <!-- no translation found for select_input_method (8547250819326693584) -->
+ <skip />
+ <!-- no translation found for configure_input_methods (4769971288371946846) -->
+ <skip />
<string name="use_physical_keyboard" msgid="6203112478095117625">"ಭೌತಿಕ ಕೀಬೋರ್ಡ್"</string>
<string name="hardware" msgid="7517821086888990278">"ಹಾರ್ಡ್ವೇರ್"</string>
<string name="select_keyboard_layout_notification_title" msgid="1407367017263030773">"ಕೀಬೋರ್ಡ್ ಲೇಔಟ್ ಆಯ್ಕೆಮಾಡಿ"</string>
@@ -1633,8 +1635,7 @@
<string name="user_switched" msgid="3768006783166984410">"ಪ್ರಸ್ತುತ ಬಳಕೆದಾರರು <xliff:g id="NAME">%1$s</xliff:g>."</string>
<string name="owner_name" msgid="2716755460376028154">"ಮಾಲೀಕರು"</string>
<string name="error_message_title" msgid="4510373083082500195">"ದೋಷ"</string>
- <!-- no translation found for error_message_change_not_allowed (1347282344200417578) -->
- <skip />
+ <string name="error_message_change_not_allowed" msgid="1347282344200417578">"ಈ ಬದಲಾವಣೆಯನ್ನು ನಿಮ್ಮ ನಿರ್ವಾಹಕರು ಅನುಮತಿಸುವುದಿಲ್ಲ"</string>
<string name="app_not_found" msgid="3429141853498927379">"ಈ ಕ್ರಿಯೆಯನ್ನು ನಿರ್ವಹಿಸಲು ಯಾವುದೇ ಅಪ್ಲಿಕೇಶನ್ ಕಂಡುಬಂದಿಲ್ಲ"</string>
<string name="revoke" msgid="5404479185228271586">"ಹಿಂತೆಗೆದುಕೊಳ್ಳಿ"</string>
<string name="mediasize_iso_a0" msgid="1994474252931294172">"ISO A0"</string>
@@ -1765,4 +1766,40 @@
<string name="lock_to_app_unlock_pin" msgid="7908385370846820001">"PIN"</string>
<string name="lock_to_app_unlock_pattern" msgid="7763071104790758405">"ಅನ್ಲಾಕ್ ನಮೂನೆ"</string>
<string name="lock_to_app_unlock_password" msgid="795224196583495868">"ಪಾಸ್ವರ್ಡ್"</string>
+ <!-- no translation found for description_ustvpg (3666171166900312727) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_d (6552868431924879897) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_l (2427588153488291892) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_s (2556047043212535339) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_v (6647466085048806213) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_fv (4015953953338931020) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_y (2271448022073929890) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_y7 (8931861188215869211) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_g (506861774854051282) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_pg (4238749719629801564) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_14 (6305164472373004907) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_ma (5842074394338699982) -->
+ <skip />
+ <!-- no translation found for description_krtv_all (11497981488871053) -->
+ <skip />
+ <!-- no translation found for description_krtv_7 (6204900788594114856) -->
+ <skip />
+ <!-- no translation found for description_krtv_12 (5134514644432355428) -->
+ <skip />
+ <!-- no translation found for description_krtv_15 (1183692678647313272) -->
+ <skip />
+ <!-- no translation found for description_krtv_19 (7021986912313208481) -->
+ <skip />
+ <!-- no translation found for battery_saver_description (724302068634956656) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-ko/strings.xml b/core/res/res/values-ko/strings.xml
index 17cc6cf..ea16646 100644
--- a/core/res/res/values-ko/strings.xml
+++ b/core/res/res/values-ko/strings.xml
@@ -1339,8 +1339,10 @@
<string name="extmedia_format_button_format" msgid="4131064560127478695">"포맷"</string>
<string name="adb_active_notification_title" msgid="6729044778949189918">"USB 디버깅 연결됨"</string>
<string name="adb_active_notification_message" msgid="1016654627626476142">"USB 디버깅을 사용하지 않으려면 터치하세요."</string>
- <string name="select_input_method" msgid="4653387336791222978">"입력 방법 선택"</string>
- <string name="configure_input_methods" msgid="9091652157722495116">"입력 방법 설정"</string>
+ <!-- no translation found for select_input_method (8547250819326693584) -->
+ <skip />
+ <!-- no translation found for configure_input_methods (4769971288371946846) -->
+ <skip />
<string name="use_physical_keyboard" msgid="6203112478095117625">"물리적 키보드"</string>
<string name="hardware" msgid="7517821086888990278">"하드웨어"</string>
<string name="select_keyboard_layout_notification_title" msgid="1407367017263030773">"키보드 레이아웃 선택"</string>
@@ -1633,8 +1635,7 @@
<string name="user_switched" msgid="3768006783166984410">"현재 사용자는 <xliff:g id="NAME">%1$s</xliff:g>님입니다."</string>
<string name="owner_name" msgid="2716755460376028154">"소유자"</string>
<string name="error_message_title" msgid="4510373083082500195">"오류"</string>
- <!-- no translation found for error_message_change_not_allowed (1347282344200417578) -->
- <skip />
+ <string name="error_message_change_not_allowed" msgid="1347282344200417578">"관리자가 이 변경을 허용하지 않습니다."</string>
<string name="app_not_found" msgid="3429141853498927379">"이 작업을 처리하는 애플리케이션을 찾을 수 없습니다."</string>
<string name="revoke" msgid="5404479185228271586">"취소"</string>
<string name="mediasize_iso_a0" msgid="1994474252931294172">"ISO A0"</string>
@@ -1765,4 +1766,40 @@
<string name="lock_to_app_unlock_pin" msgid="7908385370846820001">"PIN"</string>
<string name="lock_to_app_unlock_pattern" msgid="7763071104790758405">"잠금해제 패턴"</string>
<string name="lock_to_app_unlock_password" msgid="795224196583495868">"비밀번호"</string>
+ <!-- no translation found for description_ustvpg (3666171166900312727) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_d (6552868431924879897) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_l (2427588153488291892) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_s (2556047043212535339) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_v (6647466085048806213) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_fv (4015953953338931020) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_y (2271448022073929890) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_y7 (8931861188215869211) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_g (506861774854051282) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_pg (4238749719629801564) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_14 (6305164472373004907) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_ma (5842074394338699982) -->
+ <skip />
+ <!-- no translation found for description_krtv_all (11497981488871053) -->
+ <skip />
+ <!-- no translation found for description_krtv_7 (6204900788594114856) -->
+ <skip />
+ <!-- no translation found for description_krtv_12 (5134514644432355428) -->
+ <skip />
+ <!-- no translation found for description_krtv_15 (1183692678647313272) -->
+ <skip />
+ <!-- no translation found for description_krtv_19 (7021986912313208481) -->
+ <skip />
+ <!-- no translation found for battery_saver_description (724302068634956656) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-ky-rKG/strings.xml b/core/res/res/values-ky-rKG/strings.xml
index bd574e5..f13cb3e 100644
--- a/core/res/res/values-ky-rKG/strings.xml
+++ b/core/res/res/values-ky-rKG/strings.xml
@@ -1735,8 +1735,10 @@
<!-- no translation found for adb_active_notification_title (6729044778949189918) -->
<skip />
<string name="adb_active_notification_message" msgid="1016654627626476142">"USB мүчүлүштүктөрдү жоюу мүмкүнчүлүгүн өчүрүү үчүн тийип коюңуз."</string>
- <string name="select_input_method" msgid="4653387336791222978">"Дайын киргизүү ыкмасын тандаңыз"</string>
- <string name="configure_input_methods" msgid="9091652157722495116">"Киргизүү ыкмаларын орнотуу"</string>
+ <!-- no translation found for select_input_method (8547250819326693584) -->
+ <skip />
+ <!-- no translation found for configure_input_methods (4769971288371946846) -->
+ <skip />
<string name="use_physical_keyboard" msgid="6203112478095117625">"Аппараттык тергич"</string>
<string name="hardware" msgid="7517821086888990278">"Аппараттык"</string>
<string name="select_keyboard_layout_notification_title" msgid="1407367017263030773">"Тергичтин жайгашуусун тандоо"</string>
@@ -2115,8 +2117,7 @@
<string name="user_switched" msgid="3768006783166984410">"Учурдагы колдонуучу <xliff:g id="NAME">%1$s</xliff:g>."</string>
<string name="owner_name" msgid="2716755460376028154">"Ээси"</string>
<string name="error_message_title" msgid="4510373083082500195">"Ката"</string>
- <!-- no translation found for error_message_change_not_allowed (1347282344200417578) -->
- <skip />
+ <string name="error_message_change_not_allowed" msgid="1347282344200417578">"Мындай өзгөртүүгө администраторуңуз тарабынан тыюу салынган."</string>
<string name="app_not_found" msgid="3429141853498927379">"Бул аракетти аткаруучу эч бир колдонмо табылбады"</string>
<string name="revoke" msgid="5404479185228271586">"Жокко чыгаруу"</string>
<string name="mediasize_iso_a0" msgid="1994474252931294172">"ISO A0 (841mm x 1189mm)"</string>
@@ -2247,4 +2248,40 @@
<string name="lock_to_app_unlock_pin" msgid="7908385370846820001">"PIN"</string>
<string name="lock_to_app_unlock_pattern" msgid="7763071104790758405">"бөгөттөн чыгаруу үлгүсү"</string>
<string name="lock_to_app_unlock_password" msgid="795224196583495868">"сырсөз"</string>
+ <!-- no translation found for description_ustvpg (3666171166900312727) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_d (6552868431924879897) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_l (2427588153488291892) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_s (2556047043212535339) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_v (6647466085048806213) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_fv (4015953953338931020) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_y (2271448022073929890) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_y7 (8931861188215869211) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_g (506861774854051282) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_pg (4238749719629801564) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_14 (6305164472373004907) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_ma (5842074394338699982) -->
+ <skip />
+ <!-- no translation found for description_krtv_all (11497981488871053) -->
+ <skip />
+ <!-- no translation found for description_krtv_7 (6204900788594114856) -->
+ <skip />
+ <!-- no translation found for description_krtv_12 (5134514644432355428) -->
+ <skip />
+ <!-- no translation found for description_krtv_15 (1183692678647313272) -->
+ <skip />
+ <!-- no translation found for description_krtv_19 (7021986912313208481) -->
+ <skip />
+ <!-- no translation found for battery_saver_description (724302068634956656) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-lo-rLA/strings.xml b/core/res/res/values-lo-rLA/strings.xml
index 405883c..97b3180 100644
--- a/core/res/res/values-lo-rLA/strings.xml
+++ b/core/res/res/values-lo-rLA/strings.xml
@@ -1339,8 +1339,10 @@
<string name="extmedia_format_button_format" msgid="4131064560127478695">"ຟໍແມັດ"</string>
<string name="adb_active_notification_title" msgid="6729044778949189918">"ເຊື່ອມຕໍ່ການດີບັ໊ກຜ່ານ USB ແລ້ວ"</string>
<string name="adb_active_notification_message" msgid="1016654627626476142">"ແຕະເພື່ອປິດການດີບັ໊ກຜ່ານ USB."</string>
- <string name="select_input_method" msgid="4653387336791222978">"ເລືອກຮູບແບບການປ້ອນ"</string>
- <string name="configure_input_methods" msgid="9091652157722495116">"ຕັ້ງຄ່າວິທີການປ້ອນຂໍ້ມູນ"</string>
+ <!-- no translation found for select_input_method (8547250819326693584) -->
+ <skip />
+ <!-- no translation found for configure_input_methods (4769971288371946846) -->
+ <skip />
<string name="use_physical_keyboard" msgid="6203112478095117625">"ແປ້ນພິມແທ້"</string>
<string name="hardware" msgid="7517821086888990278">"ຮາດແວ"</string>
<string name="select_keyboard_layout_notification_title" msgid="1407367017263030773">"ເລືອກຮູບແບບແປ້ນພິມ"</string>
@@ -1384,11 +1386,11 @@
<string name="permdesc_control_keyguard" msgid="3043732290518629061">"ອະນຸຍາດໃຫ້ແອັບພລິເຄຊັນສາມາດຄວບຄຸມຄີກາດໄດ້."</string>
<string name="permlab_trust_listener" msgid="1765718054003704476">"ຕິດຕາມການປ່ຽນແປງສະຖານະການເຊື່ອຖືກ."</string>
<string name="permdesc_trust_listener" msgid="8233895334214716864">"ອະນຸຍາດໃຫ້ແອັບພລິເຄຊັນຕິດຕາມການປ່ຽນແປງໃນສະຖານະການເຊື່ອຖື."</string>
- <string name="permlab_provide_trust_agent" msgid="5465587586091358316">"ລະບຸເອເຈນທີ່ເຊື່ອຖືໄດ້."</string>
- <string name="permdesc_provide_trust_agent" msgid="3865702641053068148">"ອະນຸຍາດໃຫ້ແອັບພລິເຄຊັນລະບຸເອເຈນທີ່ເຊື່ອຖືໄດ້."</string>
- <string name="permlab_launch_trust_agent_settings" msgid="5859430082240410200">"ເປີດການຕັ້ງຄ່າເມນູເອເຈນທີ່ເຊື່ອຖືໄດ້."</string>
- <string name="permdesc_launch_trust_agent_settings" msgid="8185142708644913381">"ອະນຸຍາດໃຫ້ແອັບພລິເຄຊັນເປີດການເຄື່ອນໄຫວທີ່ປ່ຽນພຶດຕິກຳຂອງເອເຈນ."</string>
- <string name="permlab_bind_trust_agent_service" msgid="8242093169457695334">"ເຊື່ອມໂຍງຫາບໍລິການຕົວແທນການເຊື່ອຖື"</string>
+ <string name="permlab_provide_trust_agent" msgid="5465587586091358316">"ລະບຸຕົວແທນທີ່ເຊື່ອຖືໄດ້."</string>
+ <string name="permdesc_provide_trust_agent" msgid="3865702641053068148">"ອະນຸຍາດໃຫ້ແອັບພລິເຄຊັນລະບຸຕົວແທນທີ່ເຊື່ອຖືໄດ້."</string>
+ <string name="permlab_launch_trust_agent_settings" msgid="5859430082240410200">"ເປີດການຕັ້ງຄ່າເມນູຕົວແທນທີ່ເຊື່ອຖືໄດ້."</string>
+ <string name="permdesc_launch_trust_agent_settings" msgid="8185142708644913381">"ອະນຸຍາດໃຫ້ແອັບພລິເຄຊັນເປີດການເຄື່ອນໄຫວທີ່ປ່ຽນພຶດຕິກຳຂອງຕົວແທນທີ່ເຊື່ອຖືໄດ້."</string>
+ <string name="permlab_bind_trust_agent_service" msgid="8242093169457695334">"ເຊື່ອມໂຍງຫາບໍລິການຕົວແທນທີ່ເຊື່ອຖືໄດ້"</string>
<string name="permdesc_bind_trust_agent_service" msgid="7041930026024507515">"ອະນຸຍາດໃຫ້ແອັບພລິເຄຊັນເຊື່ອມໂຍງກັບບໍລິການຕົວແທນທີ່ເຊື່ອຖືໄດ້."</string>
<string name="permlab_recovery" msgid="3157024487744125846">"ຕິດຕໍ່ກັບລະບົບອັບເດດ ແລະລະບົບກູ້ຂໍ້ມູນ."</string>
<string name="permdesc_recovery" msgid="8511774533266359571">"ອະນຸຍາດໃຫ້ແອັບພລິເຄຊັນຕິດຕໍ່ກັບລະບົບກູ້ຂໍ້ມູນ ແລະການອັບເດດລະບົບ."</string>
@@ -1633,8 +1635,7 @@
<string name="user_switched" msgid="3768006783166984410">"ຜູ່ໃຊ້ປັດຈຸບັນ <xliff:g id="NAME">%1$s</xliff:g> ."</string>
<string name="owner_name" msgid="2716755460376028154">"ເຈົ້າຂອງ"</string>
<string name="error_message_title" msgid="4510373083082500195">"ຜິດພາດ"</string>
- <!-- no translation found for error_message_change_not_allowed (1347282344200417578) -->
- <skip />
+ <string name="error_message_change_not_allowed" msgid="1347282344200417578">"ຜູ່ເບິ່ງແຍງລະບົບຂອງທ່ານບໍ່ອະນຸຍາດໃຫ້ປ່ຽນແປງສິ່ງນີ້"</string>
<string name="app_not_found" msgid="3429141853498927379">"ບໍ່ພົບແອັບພລິເຄຊັນເພື່ອຈັດການເຮັດວຽກນີ້."</string>
<string name="revoke" msgid="5404479185228271586">"ຖອນ"</string>
<string name="mediasize_iso_a0" msgid="1994474252931294172">"ISO A0"</string>
@@ -1765,4 +1766,40 @@
<string name="lock_to_app_unlock_pin" msgid="7908385370846820001">"PIN"</string>
<string name="lock_to_app_unlock_pattern" msgid="7763071104790758405">"ຮູບແບບປົດລັອກ"</string>
<string name="lock_to_app_unlock_password" msgid="795224196583495868">"ລະຫັດຜ່ານ"</string>
+ <!-- no translation found for description_ustvpg (3666171166900312727) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_d (6552868431924879897) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_l (2427588153488291892) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_s (2556047043212535339) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_v (6647466085048806213) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_fv (4015953953338931020) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_y (2271448022073929890) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_y7 (8931861188215869211) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_g (506861774854051282) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_pg (4238749719629801564) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_14 (6305164472373004907) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_ma (5842074394338699982) -->
+ <skip />
+ <!-- no translation found for description_krtv_all (11497981488871053) -->
+ <skip />
+ <!-- no translation found for description_krtv_7 (6204900788594114856) -->
+ <skip />
+ <!-- no translation found for description_krtv_12 (5134514644432355428) -->
+ <skip />
+ <!-- no translation found for description_krtv_15 (1183692678647313272) -->
+ <skip />
+ <!-- no translation found for description_krtv_19 (7021986912313208481) -->
+ <skip />
+ <!-- no translation found for battery_saver_description (724302068634956656) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-lt/strings.xml b/core/res/res/values-lt/strings.xml
index be4f0e0..8ed80a2 100644
--- a/core/res/res/values-lt/strings.xml
+++ b/core/res/res/values-lt/strings.xml
@@ -1339,8 +1339,10 @@
<string name="extmedia_format_button_format" msgid="4131064560127478695">"Formatuoti"</string>
<string name="adb_active_notification_title" msgid="6729044778949189918">"USB derinimas prijungtas"</string>
<string name="adb_active_notification_message" msgid="1016654627626476142">"Palieskite, kad neleistumėte USB derinimo."</string>
- <string name="select_input_method" msgid="4653387336791222978">"Pasirinkite įvesties metodą"</string>
- <string name="configure_input_methods" msgid="9091652157722495116">"Nustatyti įvesties metodus"</string>
+ <!-- no translation found for select_input_method (8547250819326693584) -->
+ <skip />
+ <!-- no translation found for configure_input_methods (4769971288371946846) -->
+ <skip />
<string name="use_physical_keyboard" msgid="6203112478095117625">"Fizinė klaviatūra"</string>
<string name="hardware" msgid="7517821086888990278">"Apar. įr."</string>
<string name="select_keyboard_layout_notification_title" msgid="1407367017263030773">"Pasirinkite klaviatūros išdėstymą"</string>
@@ -1388,8 +1390,8 @@
<string name="permdesc_provide_trust_agent" msgid="3865702641053068148">"Programai leidžiama teikti patikimos priemonės paslaugą."</string>
<string name="permlab_launch_trust_agent_settings" msgid="5859430082240410200">"Paleisti patikimos priemonės nustatymų meniu."</string>
<string name="permdesc_launch_trust_agent_settings" msgid="8185142708644913381">"Programai leidžiama paleisti veiklą, keičiančią patikimos priemonės elgseną."</string>
- <string name="permlab_bind_trust_agent_service" msgid="8242093169457695334">"Susisaistyti su „trust agent“ paslauga"</string>
- <string name="permdesc_bind_trust_agent_service" msgid="7041930026024507515">"Programai leidžiama susisaistyti su „trust agent“ paslauga."</string>
+ <string name="permlab_bind_trust_agent_service" msgid="8242093169457695334">"Susisaistyti su patikimos priemonės paslauga"</string>
+ <string name="permdesc_bind_trust_agent_service" msgid="7041930026024507515">"Programai leidžiama susisaistyti su patikimos priemonės paslauga."</string>
<string name="permlab_recovery" msgid="3157024487744125846">"Sąveikauti su naujiniu ir atkūrimo sistema"</string>
<string name="permdesc_recovery" msgid="8511774533266359571">"Programai leidžiama sąveikauti su atkūrimo sistema ir sistemos naujiniais."</string>
<string name="permlab_createMediaProjection" msgid="4941338725487978112">"Kurti medijos projekcijų seansus"</string>
@@ -1633,8 +1635,7 @@
<string name="user_switched" msgid="3768006783166984410">"Dabartinis naudotojas: <xliff:g id="NAME">%1$s</xliff:g>."</string>
<string name="owner_name" msgid="2716755460376028154">"Savininkas"</string>
<string name="error_message_title" msgid="4510373083082500195">"Klaida"</string>
- <!-- no translation found for error_message_change_not_allowed (1347282344200417578) -->
- <skip />
+ <string name="error_message_change_not_allowed" msgid="1347282344200417578">"Administratorius neleidžia atlikti šio pakeitimo"</string>
<string name="app_not_found" msgid="3429141853498927379">"Nerasta programa šiam veiksmui apdoroti"</string>
<string name="revoke" msgid="5404479185228271586">"Anuliuoti"</string>
<string name="mediasize_iso_a0" msgid="1994474252931294172">"ISO A0"</string>
@@ -1765,4 +1766,40 @@
<string name="lock_to_app_unlock_pin" msgid="7908385370846820001">"PIN kodas"</string>
<string name="lock_to_app_unlock_pattern" msgid="7763071104790758405">"atrakinimo piešinys"</string>
<string name="lock_to_app_unlock_password" msgid="795224196583495868">"slaptažodis"</string>
+ <!-- no translation found for description_ustvpg (3666171166900312727) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_d (6552868431924879897) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_l (2427588153488291892) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_s (2556047043212535339) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_v (6647466085048806213) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_fv (4015953953338931020) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_y (2271448022073929890) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_y7 (8931861188215869211) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_g (506861774854051282) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_pg (4238749719629801564) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_14 (6305164472373004907) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_ma (5842074394338699982) -->
+ <skip />
+ <!-- no translation found for description_krtv_all (11497981488871053) -->
+ <skip />
+ <!-- no translation found for description_krtv_7 (6204900788594114856) -->
+ <skip />
+ <!-- no translation found for description_krtv_12 (5134514644432355428) -->
+ <skip />
+ <!-- no translation found for description_krtv_15 (1183692678647313272) -->
+ <skip />
+ <!-- no translation found for description_krtv_19 (7021986912313208481) -->
+ <skip />
+ <!-- no translation found for battery_saver_description (724302068634956656) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-lv/strings.xml b/core/res/res/values-lv/strings.xml
index e2b2e5b..a8e95d4 100644
--- a/core/res/res/values-lv/strings.xml
+++ b/core/res/res/values-lv/strings.xml
@@ -1339,8 +1339,10 @@
<string name="extmedia_format_button_format" msgid="4131064560127478695">"Formatēt"</string>
<string name="adb_active_notification_title" msgid="6729044778949189918">"USB atkļūdošana ir pievienota."</string>
<string name="adb_active_notification_message" msgid="1016654627626476142">"Pieskarieties, lai atspējotu USB atkļūdošanu."</string>
- <string name="select_input_method" msgid="4653387336791222978">"Ievades metodes izvēle"</string>
- <string name="configure_input_methods" msgid="9091652157722495116">"Iestatīt ievades metodes"</string>
+ <!-- no translation found for select_input_method (8547250819326693584) -->
+ <skip />
+ <!-- no translation found for configure_input_methods (4769971288371946846) -->
+ <skip />
<string name="use_physical_keyboard" msgid="6203112478095117625">"Fiziskā tastatūra"</string>
<string name="hardware" msgid="7517821086888990278">"Aparatūra"</string>
<string name="select_keyboard_layout_notification_title" msgid="1407367017263030773">"Atlasiet tastatūras izkārtojumu"</string>
@@ -1388,8 +1390,8 @@
<string name="permdesc_provide_trust_agent" msgid="3865702641053068148">"Ļauj lietojumprogrammai nodrošināt uzticamības pārbaudes programmu."</string>
<string name="permlab_launch_trust_agent_settings" msgid="5859430082240410200">"Palaist uzticamības pārbaudes programmas iestatījumu izvēlni."</string>
<string name="permdesc_launch_trust_agent_settings" msgid="8185142708644913381">"Ļauj lietojumprogrammai palaist darbību, kas maina uzticamības pārbaudes programmas rīcību."</string>
- <string name="permlab_bind_trust_agent_service" msgid="8242093169457695334">"Izveidot savienojumu ar uzticamības pārbaudes pakalpojumu"</string>
- <string name="permdesc_bind_trust_agent_service" msgid="7041930026024507515">"Ļauj lietojumprogrammai izveidot savienojumu ar uzticamības pārbaudes pakalpojumu."</string>
+ <string name="permlab_bind_trust_agent_service" msgid="8242093169457695334">"Izveidot savienojumu ar uzticamības pārbaudes programmu"</string>
+ <string name="permdesc_bind_trust_agent_service" msgid="7041930026024507515">"Ļauj lietojumprogrammai izveidot savienojumu ar uzticamības pārbaudes programmu."</string>
<string name="permlab_recovery" msgid="3157024487744125846">"Mijiedarbošanās ar atjauninājumu un atkopšanas sistēmu"</string>
<string name="permdesc_recovery" msgid="8511774533266359571">"Ļauj lietojumprogrammai mijiedarboties ar atkopšanas sistēmu un sistēmas atjauninājumiem."</string>
<string name="permlab_createMediaProjection" msgid="4941338725487978112">"Izveidot satura projekcijas sesijas"</string>
@@ -1633,8 +1635,7 @@
<string name="user_switched" msgid="3768006783166984410">"Pašreizējais lietotājs: <xliff:g id="NAME">%1$s</xliff:g>."</string>
<string name="owner_name" msgid="2716755460376028154">"Īpašnieks"</string>
<string name="error_message_title" msgid="4510373083082500195">"Kļūda"</string>
- <!-- no translation found for error_message_change_not_allowed (1347282344200417578) -->
- <skip />
+ <string name="error_message_change_not_allowed" msgid="1347282344200417578">"Jūsu administrators neļauj veikt šīs izmaiņas."</string>
<string name="app_not_found" msgid="3429141853498927379">"Netika atrasta neviena lietojumprogramma, kas var veikt šo darbību."</string>
<string name="revoke" msgid="5404479185228271586">"Atsaukt"</string>
<string name="mediasize_iso_a0" msgid="1994474252931294172">"ISO A0"</string>
@@ -1765,4 +1766,40 @@
<string name="lock_to_app_unlock_pin" msgid="7908385370846820001">"PIN kods"</string>
<string name="lock_to_app_unlock_pattern" msgid="7763071104790758405">"grafiskā atslēga"</string>
<string name="lock_to_app_unlock_password" msgid="795224196583495868">"parole"</string>
+ <!-- no translation found for description_ustvpg (3666171166900312727) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_d (6552868431924879897) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_l (2427588153488291892) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_s (2556047043212535339) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_v (6647466085048806213) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_fv (4015953953338931020) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_y (2271448022073929890) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_y7 (8931861188215869211) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_g (506861774854051282) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_pg (4238749719629801564) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_14 (6305164472373004907) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_ma (5842074394338699982) -->
+ <skip />
+ <!-- no translation found for description_krtv_all (11497981488871053) -->
+ <skip />
+ <!-- no translation found for description_krtv_7 (6204900788594114856) -->
+ <skip />
+ <!-- no translation found for description_krtv_12 (5134514644432355428) -->
+ <skip />
+ <!-- no translation found for description_krtv_15 (1183692678647313272) -->
+ <skip />
+ <!-- no translation found for description_krtv_19 (7021986912313208481) -->
+ <skip />
+ <!-- no translation found for battery_saver_description (724302068634956656) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-mk-rMK/strings.xml b/core/res/res/values-mk-rMK/strings.xml
index 6df89fc..5ac005d 100644
--- a/core/res/res/values-mk-rMK/strings.xml
+++ b/core/res/res/values-mk-rMK/strings.xml
@@ -1339,8 +1339,10 @@
<string name="extmedia_format_button_format" msgid="4131064560127478695">"Форматирај"</string>
<string name="adb_active_notification_title" msgid="6729044778949189918">"Поврзано е отстранување грешки преку УСБ"</string>
<string name="adb_active_notification_message" msgid="1016654627626476142">"Допрете за да се оневозможи отстранувањето грешки преку USB."</string>
- <string name="select_input_method" msgid="4653387336791222978">"Одбери метод на внес"</string>
- <string name="configure_input_methods" msgid="9091652157722495116">"Постави методи на внес"</string>
+ <!-- no translation found for select_input_method (8547250819326693584) -->
+ <skip />
+ <!-- no translation found for configure_input_methods (4769971288371946846) -->
+ <skip />
<string name="use_physical_keyboard" msgid="6203112478095117625">"Физичка тастатура"</string>
<string name="hardware" msgid="7517821086888990278">"Хардвер"</string>
<string name="select_keyboard_layout_notification_title" msgid="1407367017263030773">"Избери изглед на тастатура"</string>
@@ -1635,8 +1637,7 @@
<string name="user_switched" msgid="3768006783166984410">"Тековен корисник <xliff:g id="NAME">%1$s</xliff:g>."</string>
<string name="owner_name" msgid="2716755460376028154">"Сопственик"</string>
<string name="error_message_title" msgid="4510373083082500195">"Грешка"</string>
- <!-- no translation found for error_message_change_not_allowed (1347282344200417578) -->
- <skip />
+ <string name="error_message_change_not_allowed" msgid="1347282344200417578">"Администраторот не ја дозволува промената"</string>
<string name="app_not_found" msgid="3429141853498927379">"Не се пронајдени апликации да се изврши ова дејство"</string>
<string name="revoke" msgid="5404479185228271586">"Отповикај"</string>
<string name="mediasize_iso_a0" msgid="1994474252931294172">"ISO A0"</string>
@@ -1767,4 +1768,40 @@
<string name="lock_to_app_unlock_pin" msgid="7908385370846820001">"ПИН"</string>
<string name="lock_to_app_unlock_pattern" msgid="7763071104790758405">"шема за отклучување"</string>
<string name="lock_to_app_unlock_password" msgid="795224196583495868">"лозинка"</string>
+ <!-- no translation found for description_ustvpg (3666171166900312727) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_d (6552868431924879897) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_l (2427588153488291892) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_s (2556047043212535339) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_v (6647466085048806213) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_fv (4015953953338931020) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_y (2271448022073929890) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_y7 (8931861188215869211) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_g (506861774854051282) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_pg (4238749719629801564) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_14 (6305164472373004907) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_ma (5842074394338699982) -->
+ <skip />
+ <!-- no translation found for description_krtv_all (11497981488871053) -->
+ <skip />
+ <!-- no translation found for description_krtv_7 (6204900788594114856) -->
+ <skip />
+ <!-- no translation found for description_krtv_12 (5134514644432355428) -->
+ <skip />
+ <!-- no translation found for description_krtv_15 (1183692678647313272) -->
+ <skip />
+ <!-- no translation found for description_krtv_19 (7021986912313208481) -->
+ <skip />
+ <!-- no translation found for battery_saver_description (724302068634956656) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-ml-rIN/strings.xml b/core/res/res/values-ml-rIN/strings.xml
index 8415ef5..3b4ce94 100644
--- a/core/res/res/values-ml-rIN/strings.xml
+++ b/core/res/res/values-ml-rIN/strings.xml
@@ -1339,8 +1339,10 @@
<string name="extmedia_format_button_format" msgid="4131064560127478695">"ഫോർമാറ്റുചെയ്യുക"</string>
<string name="adb_active_notification_title" msgid="6729044778949189918">"USB ഡീബഗ്ഗിംഗ് കണക്റ്റുചെയ്തു"</string>
<string name="adb_active_notification_message" msgid="1016654627626476142">"USB ഡീബഗ്ഗിംഗ് പ്രവർത്തനരഹിതമാക്കാൻ സ്പർശിക്കുക."</string>
- <string name="select_input_method" msgid="4653387336791222978">"ഇൻപുട്ട് രീതി തിരഞ്ഞെടുക്കുക"</string>
- <string name="configure_input_methods" msgid="9091652157722495116">"ടൈപ്പുചെയ്യൽ രീതികൾ സജ്ജീകരിക്കുക"</string>
+ <!-- no translation found for select_input_method (8547250819326693584) -->
+ <skip />
+ <!-- no translation found for configure_input_methods (4769971288371946846) -->
+ <skip />
<string name="use_physical_keyboard" msgid="6203112478095117625">"ഭൗതിക കീബോർഡ്"</string>
<string name="hardware" msgid="7517821086888990278">"ഹാർഡ്വെയർ"</string>
<string name="select_keyboard_layout_notification_title" msgid="1407367017263030773">"കീബോർഡ് ലേഔട്ട് തിരഞ്ഞെടുക്കുക"</string>
@@ -1386,10 +1388,10 @@
<string name="permdesc_trust_listener" msgid="8233895334214716864">"വിശ്വസ്ത സ്റ്റേറ്റിലെ മാറ്റങ്ങൾ കേൾക്കുന്നതിന് അപ്ലിക്കേഷനെ അനുവദിക്കുന്നു."</string>
<string name="permlab_provide_trust_agent" msgid="5465587586091358316">"ഒരു പരിചിത ഏജന്റിനെ നൽകുക."</string>
<string name="permdesc_provide_trust_agent" msgid="3865702641053068148">"ഒരു പരിചിത ഏജന്റിനെ നൽകാൻ ഒരു അപ്ലിക്കേഷൻ അനുവദിക്കുന്നു."</string>
- <string name="permlab_launch_trust_agent_settings" msgid="5859430082240410200">"വിശ്വസ്ത ഏജന്റ് ക്രമീകരണ മെനു സമാരംഭിക്കുക."</string>
- <string name="permdesc_launch_trust_agent_settings" msgid="8185142708644913381">"വിശ്വസ്ത ഏജന്റിന്റെ പ്രവർത്തനരീതിയെ മാറ്റുന്ന, ഒരു പ്രവർത്തനം സമാരംഭിക്കാൻ ഒരു അപ്ലിക്കേഷനെ അനുവദിക്കുന്നു."</string>
- <string name="permlab_bind_trust_agent_service" msgid="8242093169457695334">"വിശ്വസ്ത ഏജന്റ് സേവനവുമായി ബന്ധിപ്പിക്കുക"</string>
- <string name="permdesc_bind_trust_agent_service" msgid="7041930026024507515">"ഒരു വിശ്വസ്ത ഏജന്റ് സേവനത്തിലേക്ക് ബന്ധിപ്പിക്കാൻ അപ്ലിക്കേഷനെ അനുവദിക്കുന്നു."</string>
+ <string name="permlab_launch_trust_agent_settings" msgid="5859430082240410200">"പരിചിത ഏജന്റ് ക്രമീകരണ മെനു സമാരംഭിക്കുക."</string>
+ <string name="permdesc_launch_trust_agent_settings" msgid="8185142708644913381">"പരിചിത ഏജന്റിന്റെ പ്രവർത്തനരീതിയെ മാറ്റുന്ന, ഒരു പ്രവർത്തനം സമാരംഭിക്കാൻ ഒരു അപ്ലിക്കേഷനെ അനുവദിക്കുന്നു."</string>
+ <string name="permlab_bind_trust_agent_service" msgid="8242093169457695334">"പരിചിത ഏജന്റ് സേവനവുമായി ബന്ധിപ്പിക്കുക"</string>
+ <string name="permdesc_bind_trust_agent_service" msgid="7041930026024507515">"ഒരു പരിചിത ഏജന്റ് സേവനത്തിലേക്ക് ബന്ധിപ്പിക്കാൻ അപ്ലിക്കേഷനെ അനുവദിക്കുന്നു."</string>
<string name="permlab_recovery" msgid="3157024487744125846">"അപ്ഡേറ്റ്, വീണ്ടെടുക്കൽ സിസ്റ്റവുമായി സംവദിക്കുക"</string>
<string name="permdesc_recovery" msgid="8511774533266359571">"വീണ്ടെടുക്കൽ സിസ്റ്റവുമായും സിസ്റ്റം അപ്ഡേറ്റുകളുമായും സംവദിക്കാൻ ഒരു അപ്ലിക്കേഷനെ അനുവദിക്കുന്നു."</string>
<string name="permlab_createMediaProjection" msgid="4941338725487978112">"മീഡിയ പ്രൊജക്ഷൻ സെഷനുകൾ സൃഷ്ടിക്കുക"</string>
@@ -1633,8 +1635,7 @@
<string name="user_switched" msgid="3768006783166984410">"നിലവിലെ ഉപയോക്താവ് <xliff:g id="NAME">%1$s</xliff:g> ആണ്."</string>
<string name="owner_name" msgid="2716755460376028154">"ഉടമ"</string>
<string name="error_message_title" msgid="4510373083082500195">"പിശക്"</string>
- <!-- no translation found for error_message_change_not_allowed (1347282344200417578) -->
- <skip />
+ <string name="error_message_change_not_allowed" msgid="1347282344200417578">"ഈ മാറ്റം നിങ്ങളുടെ അഡ്മിനിസ്ട്രേറ്റർ അനുവദിച്ചതല്ല"</string>
<string name="app_not_found" msgid="3429141853498927379">"ഈ പ്രവർത്തനം കൈകാര്യം ചെയ്യുന്ന അപ്ലിക്കേഷനുകളൊന്നും കണ്ടെത്തിയില്ല"</string>
<string name="revoke" msgid="5404479185228271586">"റദ്ദാക്കുക"</string>
<string name="mediasize_iso_a0" msgid="1994474252931294172">"ISO A0"</string>
@@ -1765,4 +1766,40 @@
<string name="lock_to_app_unlock_pin" msgid="7908385370846820001">"പിൻ"</string>
<string name="lock_to_app_unlock_pattern" msgid="7763071104790758405">"അൺലോക്ക് പാറ്റേൺ"</string>
<string name="lock_to_app_unlock_password" msgid="795224196583495868">"പാസ്വേഡ്"</string>
+ <!-- no translation found for description_ustvpg (3666171166900312727) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_d (6552868431924879897) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_l (2427588153488291892) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_s (2556047043212535339) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_v (6647466085048806213) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_fv (4015953953338931020) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_y (2271448022073929890) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_y7 (8931861188215869211) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_g (506861774854051282) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_pg (4238749719629801564) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_14 (6305164472373004907) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_ma (5842074394338699982) -->
+ <skip />
+ <!-- no translation found for description_krtv_all (11497981488871053) -->
+ <skip />
+ <!-- no translation found for description_krtv_7 (6204900788594114856) -->
+ <skip />
+ <!-- no translation found for description_krtv_12 (5134514644432355428) -->
+ <skip />
+ <!-- no translation found for description_krtv_15 (1183692678647313272) -->
+ <skip />
+ <!-- no translation found for description_krtv_19 (7021986912313208481) -->
+ <skip />
+ <!-- no translation found for battery_saver_description (724302068634956656) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-mn-rMN/strings.xml b/core/res/res/values-mn-rMN/strings.xml
index 8236bf8..28ae2fe 100644
--- a/core/res/res/values-mn-rMN/strings.xml
+++ b/core/res/res/values-mn-rMN/strings.xml
@@ -1339,8 +1339,10 @@
<string name="extmedia_format_button_format" msgid="4131064560127478695">"Форматлах"</string>
<string name="adb_active_notification_title" msgid="6729044778949189918">"USB дебаг холбогдсон"</string>
<string name="adb_active_notification_message" msgid="1016654627626476142">"USB дебаг хийхийг идэвхгүй болгох бол хүрнэ үү."</string>
- <string name="select_input_method" msgid="4653387336791222978">"Оруулах аргыг сонгоно уу"</string>
- <string name="configure_input_methods" msgid="9091652157722495116">"Оруулах аргыг тохируулах"</string>
+ <!-- no translation found for select_input_method (8547250819326693584) -->
+ <skip />
+ <!-- no translation found for configure_input_methods (4769971288371946846) -->
+ <skip />
<string name="use_physical_keyboard" msgid="6203112478095117625">"Бодит гар"</string>
<string name="hardware" msgid="7517821086888990278">"Хардвер"</string>
<string name="select_keyboard_layout_notification_title" msgid="1407367017263030773">"Гарын схемийг сонгох"</string>
@@ -1633,8 +1635,7 @@
<string name="user_switched" msgid="3768006783166984410">"Одоогийн хэрэглэгч <xliff:g id="NAME">%1$s</xliff:g>."</string>
<string name="owner_name" msgid="2716755460376028154">"Эзэмшигч"</string>
<string name="error_message_title" msgid="4510373083082500195">"Алдаа"</string>
- <!-- no translation found for error_message_change_not_allowed (1347282344200417578) -->
- <skip />
+ <string name="error_message_change_not_allowed" msgid="1347282344200417578">"Энэ өөрчлөлтийг админ зөвшөөрөөгүй байна"</string>
<string name="app_not_found" msgid="3429141853498927379">"Энэ ажиллагааг зохицуулах аппликешн олдсонгүй."</string>
<string name="revoke" msgid="5404479185228271586">"Цуцлах"</string>
<string name="mediasize_iso_a0" msgid="1994474252931294172">"ISO A0"</string>
@@ -1765,4 +1766,40 @@
<string name="lock_to_app_unlock_pin" msgid="7908385370846820001">"PIN"</string>
<string name="lock_to_app_unlock_pattern" msgid="7763071104790758405">"тайлах хээ"</string>
<string name="lock_to_app_unlock_password" msgid="795224196583495868">"нууц үг"</string>
+ <!-- no translation found for description_ustvpg (3666171166900312727) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_d (6552868431924879897) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_l (2427588153488291892) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_s (2556047043212535339) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_v (6647466085048806213) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_fv (4015953953338931020) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_y (2271448022073929890) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_y7 (8931861188215869211) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_g (506861774854051282) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_pg (4238749719629801564) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_14 (6305164472373004907) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_ma (5842074394338699982) -->
+ <skip />
+ <!-- no translation found for description_krtv_all (11497981488871053) -->
+ <skip />
+ <!-- no translation found for description_krtv_7 (6204900788594114856) -->
+ <skip />
+ <!-- no translation found for description_krtv_12 (5134514644432355428) -->
+ <skip />
+ <!-- no translation found for description_krtv_15 (1183692678647313272) -->
+ <skip />
+ <!-- no translation found for description_krtv_19 (7021986912313208481) -->
+ <skip />
+ <!-- no translation found for battery_saver_description (724302068634956656) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-mr-rIN/strings.xml b/core/res/res/values-mr-rIN/strings.xml
index 15310ec..f9c99f0 100644
--- a/core/res/res/values-mr-rIN/strings.xml
+++ b/core/res/res/values-mr-rIN/strings.xml
@@ -1339,8 +1339,10 @@
<string name="extmedia_format_button_format" msgid="4131064560127478695">"फॉरमॅट करा"</string>
<string name="adb_active_notification_title" msgid="6729044778949189918">"USB डीबग करणे कनेक्ट केले"</string>
<string name="adb_active_notification_message" msgid="1016654627626476142">"USB डीबग करणे अक्षम करण्यासाठी स्पर्श करा."</string>
- <string name="select_input_method" msgid="4653387336791222978">"इनपुट पद्धत निवडा"</string>
- <string name="configure_input_methods" msgid="9091652157722495116">"इनपुट पद्धती सेट करा"</string>
+ <!-- no translation found for select_input_method (8547250819326693584) -->
+ <skip />
+ <!-- no translation found for configure_input_methods (4769971288371946846) -->
+ <skip />
<string name="use_physical_keyboard" msgid="6203112478095117625">"वास्तविक कीबोर्ड"</string>
<string name="hardware" msgid="7517821086888990278">"हार्डवेअर"</string>
<string name="select_keyboard_layout_notification_title" msgid="1407367017263030773">"कीबोर्ड लेआउट निवडा"</string>
@@ -1633,8 +1635,7 @@
<string name="user_switched" msgid="3768006783166984410">"वर्तमान वापरकर्ता <xliff:g id="NAME">%1$s</xliff:g>."</string>
<string name="owner_name" msgid="2716755460376028154">"मालक"</string>
<string name="error_message_title" msgid="4510373083082500195">"त्रुटी"</string>
- <!-- no translation found for error_message_change_not_allowed (1347282344200417578) -->
- <skip />
+ <string name="error_message_change_not_allowed" msgid="1347282344200417578">"या बदलास आपल्या प्रशासकाकडून अनुमती नाही"</string>
<string name="app_not_found" msgid="3429141853498927379">"ही क्रिया हाताळण्यासाठी कोणताही अनुप्रयोग आढळला नाही"</string>
<string name="revoke" msgid="5404479185228271586">"मागे घ्या"</string>
<string name="mediasize_iso_a0" msgid="1994474252931294172">"ISO A0"</string>
@@ -1765,4 +1766,40 @@
<string name="lock_to_app_unlock_pin" msgid="7908385370846820001">"PIN"</string>
<string name="lock_to_app_unlock_pattern" msgid="7763071104790758405">"अनलॉक नमुना"</string>
<string name="lock_to_app_unlock_password" msgid="795224196583495868">"संकेतशब्द"</string>
+ <!-- no translation found for description_ustvpg (3666171166900312727) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_d (6552868431924879897) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_l (2427588153488291892) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_s (2556047043212535339) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_v (6647466085048806213) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_fv (4015953953338931020) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_y (2271448022073929890) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_y7 (8931861188215869211) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_g (506861774854051282) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_pg (4238749719629801564) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_14 (6305164472373004907) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_ma (5842074394338699982) -->
+ <skip />
+ <!-- no translation found for description_krtv_all (11497981488871053) -->
+ <skip />
+ <!-- no translation found for description_krtv_7 (6204900788594114856) -->
+ <skip />
+ <!-- no translation found for description_krtv_12 (5134514644432355428) -->
+ <skip />
+ <!-- no translation found for description_krtv_15 (1183692678647313272) -->
+ <skip />
+ <!-- no translation found for description_krtv_19 (7021986912313208481) -->
+ <skip />
+ <!-- no translation found for battery_saver_description (724302068634956656) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-ms-rMY/strings.xml b/core/res/res/values-ms-rMY/strings.xml
index caa6e32..e3a6dd7 100644
--- a/core/res/res/values-ms-rMY/strings.xml
+++ b/core/res/res/values-ms-rMY/strings.xml
@@ -1339,8 +1339,10 @@
<string name="extmedia_format_button_format" msgid="4131064560127478695">"Format"</string>
<string name="adb_active_notification_title" msgid="6729044778949189918">"Penyahpepijatan USB disambungkan"</string>
<string name="adb_active_notification_message" msgid="1016654627626476142">"Sentuh untuk melumpuhkan penyahpepijatan USB."</string>
- <string name="select_input_method" msgid="4653387336791222978">"Pilih kaedah input"</string>
- <string name="configure_input_methods" msgid="9091652157722495116">"Sediakan kaedah input"</string>
+ <!-- no translation found for select_input_method (8547250819326693584) -->
+ <skip />
+ <!-- no translation found for configure_input_methods (4769971288371946846) -->
+ <skip />
<string name="use_physical_keyboard" msgid="6203112478095117625">"Papan kekunci fizikal"</string>
<string name="hardware" msgid="7517821086888990278">"Perkakasan"</string>
<string name="select_keyboard_layout_notification_title" msgid="1407367017263030773">"Pilih susun atur papan kekunci"</string>
@@ -1633,8 +1635,7 @@
<string name="user_switched" msgid="3768006783166984410">"Pengguna semasa <xliff:g id="NAME">%1$s</xliff:g>."</string>
<string name="owner_name" msgid="2716755460376028154">"Pemilik"</string>
<string name="error_message_title" msgid="4510373083082500195">"Ralat"</string>
- <!-- no translation found for error_message_change_not_allowed (1347282344200417578) -->
- <skip />
+ <string name="error_message_change_not_allowed" msgid="1347282344200417578">"Perubahan ini tidak dibenarkan oleh pentadbir anda"</string>
<string name="app_not_found" msgid="3429141853498927379">"Tidak menemui aplikasi untuk mengendalikan tindakan ini"</string>
<string name="revoke" msgid="5404479185228271586">"Batalkan"</string>
<string name="mediasize_iso_a0" msgid="1994474252931294172">"ISO A0"</string>
@@ -1765,4 +1766,40 @@
<string name="lock_to_app_unlock_pin" msgid="7908385370846820001">"PIN"</string>
<string name="lock_to_app_unlock_pattern" msgid="7763071104790758405">"corak buka kunci"</string>
<string name="lock_to_app_unlock_password" msgid="795224196583495868">"kata laluan"</string>
+ <!-- no translation found for description_ustvpg (3666171166900312727) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_d (6552868431924879897) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_l (2427588153488291892) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_s (2556047043212535339) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_v (6647466085048806213) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_fv (4015953953338931020) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_y (2271448022073929890) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_y7 (8931861188215869211) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_g (506861774854051282) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_pg (4238749719629801564) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_14 (6305164472373004907) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_ma (5842074394338699982) -->
+ <skip />
+ <!-- no translation found for description_krtv_all (11497981488871053) -->
+ <skip />
+ <!-- no translation found for description_krtv_7 (6204900788594114856) -->
+ <skip />
+ <!-- no translation found for description_krtv_12 (5134514644432355428) -->
+ <skip />
+ <!-- no translation found for description_krtv_15 (1183692678647313272) -->
+ <skip />
+ <!-- no translation found for description_krtv_19 (7021986912313208481) -->
+ <skip />
+ <!-- no translation found for battery_saver_description (724302068634956656) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-my-rMM/strings.xml b/core/res/res/values-my-rMM/strings.xml
index 7047bee..7b03578 100644
--- a/core/res/res/values-my-rMM/strings.xml
+++ b/core/res/res/values-my-rMM/strings.xml
@@ -1339,8 +1339,10 @@
<string name="extmedia_format_button_format" msgid="4131064560127478695">"ပုံစံချရန်ပြင်ဆင်သည်"</string>
<string name="adb_active_notification_title" msgid="6729044778949189918">"USB အမှားစစ်ခြင်းအား ချိတ်ဆက်ထားသည်"</string>
<string name="adb_active_notification_message" msgid="1016654627626476142">"USB ဒီဘာဂင် ပိတ်ရန် ထိပါ။"</string>
- <string name="select_input_method" msgid="4653387336791222978">"ထည့်သွင်းရေး နည်းကို ရွေးရန်"</string>
- <string name="configure_input_methods" msgid="9091652157722495116">"ရိုက်ထည့် နည်းများ သတ်မှတ်ရန်"</string>
+ <!-- no translation found for select_input_method (8547250819326693584) -->
+ <skip />
+ <!-- no translation found for configure_input_methods (4769971288371946846) -->
+ <skip />
<string name="use_physical_keyboard" msgid="6203112478095117625">"ခလုတ်ပါဝင်သော ကီးဘုတ်"</string>
<string name="hardware" msgid="7517821086888990278">"ဟာ့ဒ်ဝဲ"</string>
<string name="select_keyboard_layout_notification_title" msgid="1407367017263030773">"လက်ကွက် အပြင်အဆင်ရွေးရန်"</string>
@@ -1764,4 +1766,40 @@
<string name="lock_to_app_unlock_pin" msgid="7908385370846820001">"PIN"</string>
<string name="lock_to_app_unlock_pattern" msgid="7763071104790758405">"သော့ဖွင့် ပုံစံဒီဇိုင်း"</string>
<string name="lock_to_app_unlock_password" msgid="795224196583495868">"စကားဝှက်"</string>
+ <!-- no translation found for description_ustvpg (3666171166900312727) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_d (6552868431924879897) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_l (2427588153488291892) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_s (2556047043212535339) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_v (6647466085048806213) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_fv (4015953953338931020) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_y (2271448022073929890) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_y7 (8931861188215869211) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_g (506861774854051282) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_pg (4238749719629801564) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_14 (6305164472373004907) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_ma (5842074394338699982) -->
+ <skip />
+ <!-- no translation found for description_krtv_all (11497981488871053) -->
+ <skip />
+ <!-- no translation found for description_krtv_7 (6204900788594114856) -->
+ <skip />
+ <!-- no translation found for description_krtv_12 (5134514644432355428) -->
+ <skip />
+ <!-- no translation found for description_krtv_15 (1183692678647313272) -->
+ <skip />
+ <!-- no translation found for description_krtv_19 (7021986912313208481) -->
+ <skip />
+ <!-- no translation found for battery_saver_description (724302068634956656) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-nb/strings.xml b/core/res/res/values-nb/strings.xml
index a669ee3..34892df 100644
--- a/core/res/res/values-nb/strings.xml
+++ b/core/res/res/values-nb/strings.xml
@@ -1339,8 +1339,10 @@
<string name="extmedia_format_button_format" msgid="4131064560127478695">"Formatér"</string>
<string name="adb_active_notification_title" msgid="6729044778949189918">"USB-debugging tilkoblet"</string>
<string name="adb_active_notification_message" msgid="1016654627626476142">"Trykk for å deaktivere USB-feilsøking."</string>
- <string name="select_input_method" msgid="4653387336791222978">"Velg inndatametode"</string>
- <string name="configure_input_methods" msgid="9091652157722495116">"Konfigurer inndatametoder"</string>
+ <!-- no translation found for select_input_method (8547250819326693584) -->
+ <skip />
+ <!-- no translation found for configure_input_methods (4769971288371946846) -->
+ <skip />
<string name="use_physical_keyboard" msgid="6203112478095117625">"Fysisk tastatur"</string>
<string name="hardware" msgid="7517821086888990278">"Maskinvare"</string>
<string name="select_keyboard_layout_notification_title" msgid="1407367017263030773">"Velg tastaturoppsett"</string>
@@ -1633,8 +1635,7 @@
<string name="user_switched" msgid="3768006783166984410">"Gjeldende bruker: <xliff:g id="NAME">%1$s</xliff:g>."</string>
<string name="owner_name" msgid="2716755460376028154">"Eier"</string>
<string name="error_message_title" msgid="4510373083082500195">"Feil"</string>
- <!-- no translation found for error_message_change_not_allowed (1347282344200417578) -->
- <skip />
+ <string name="error_message_change_not_allowed" msgid="1347282344200417578">"Denne endringen er ikke tillatt av administratoren"</string>
<string name="app_not_found" msgid="3429141853498927379">"Finner ingen apper som kan utføre denne handlingen"</string>
<string name="revoke" msgid="5404479185228271586">"Opphev"</string>
<string name="mediasize_iso_a0" msgid="1994474252931294172">"ISO A0"</string>
@@ -1765,4 +1766,40 @@
<string name="lock_to_app_unlock_pin" msgid="7908385370846820001">"PIN-kode"</string>
<string name="lock_to_app_unlock_pattern" msgid="7763071104790758405">"opplåsingsmønster"</string>
<string name="lock_to_app_unlock_password" msgid="795224196583495868">"passord"</string>
+ <!-- no translation found for description_ustvpg (3666171166900312727) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_d (6552868431924879897) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_l (2427588153488291892) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_s (2556047043212535339) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_v (6647466085048806213) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_fv (4015953953338931020) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_y (2271448022073929890) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_y7 (8931861188215869211) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_g (506861774854051282) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_pg (4238749719629801564) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_14 (6305164472373004907) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_ma (5842074394338699982) -->
+ <skip />
+ <!-- no translation found for description_krtv_all (11497981488871053) -->
+ <skip />
+ <!-- no translation found for description_krtv_7 (6204900788594114856) -->
+ <skip />
+ <!-- no translation found for description_krtv_12 (5134514644432355428) -->
+ <skip />
+ <!-- no translation found for description_krtv_15 (1183692678647313272) -->
+ <skip />
+ <!-- no translation found for description_krtv_19 (7021986912313208481) -->
+ <skip />
+ <!-- no translation found for battery_saver_description (724302068634956656) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-ne-rNP/strings.xml b/core/res/res/values-ne-rNP/strings.xml
index 879e379..83a9001 100644
--- a/core/res/res/values-ne-rNP/strings.xml
+++ b/core/res/res/values-ne-rNP/strings.xml
@@ -1347,8 +1347,10 @@
<string name="extmedia_format_button_format" msgid="4131064560127478695">"फर्म्याट गर्नुहोस्"</string>
<string name="adb_active_notification_title" msgid="6729044778949189918">"USB डिबग गर्ने जडित छ"</string>
<string name="adb_active_notification_message" msgid="1016654627626476142">"USB डिबग गर्ने असक्षम पार्न छुनुहोस्।"</string>
- <string name="select_input_method" msgid="4653387336791222978">"निवेश विधि छान्नुहोस्"</string>
- <string name="configure_input_methods" msgid="9091652157722495116">"इनपुट विधिहरू सेटअप गर्नुहोस्"</string>
+ <!-- no translation found for select_input_method (8547250819326693584) -->
+ <skip />
+ <!-- no translation found for configure_input_methods (4769971288371946846) -->
+ <skip />
<string name="use_physical_keyboard" msgid="6203112478095117625">"भौतिक किबोर्ड"</string>
<string name="hardware" msgid="7517821086888990278">"हार्डवेयर"</string>
<string name="select_keyboard_layout_notification_title" msgid="1407367017263030773">"किबोर्ड रूपरेखा चयन गर्नुहोस्"</string>
@@ -1641,8 +1643,7 @@
<string name="user_switched" msgid="3768006783166984410">"अहिलेको प्रयोगकर्ता <xliff:g id="NAME">%1$s</xliff:g>।"</string>
<string name="owner_name" msgid="2716755460376028154">"मालिक"</string>
<string name="error_message_title" msgid="4510373083082500195">"त्रुटि"</string>
- <!-- no translation found for error_message_change_not_allowed (1347282344200417578) -->
- <skip />
+ <string name="error_message_change_not_allowed" msgid="1347282344200417578">"यो परिवर्तन गर्न तपाईँको प्रशासक द्वारा अनुमति छैन"</string>
<string name="app_not_found" msgid="3429141853498927379">"यस कार्य सम्हालने कुनै अनुप्रयोग भेटिएन"</string>
<string name="revoke" msgid="5404479185228271586">"रद्द गर्नुहोस्"</string>
<string name="mediasize_iso_a0" msgid="1994474252931294172">"ISO A0"</string>
@@ -1775,4 +1776,40 @@
<string name="lock_to_app_unlock_pin" msgid="7908385370846820001">"PIN"</string>
<string name="lock_to_app_unlock_pattern" msgid="7763071104790758405">"शैली बन्द गर्नुहोस"</string>
<string name="lock_to_app_unlock_password" msgid="795224196583495868">"पासवर्ड"</string>
+ <!-- no translation found for description_ustvpg (3666171166900312727) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_d (6552868431924879897) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_l (2427588153488291892) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_s (2556047043212535339) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_v (6647466085048806213) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_fv (4015953953338931020) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_y (2271448022073929890) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_y7 (8931861188215869211) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_g (506861774854051282) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_pg (4238749719629801564) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_14 (6305164472373004907) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_ma (5842074394338699982) -->
+ <skip />
+ <!-- no translation found for description_krtv_all (11497981488871053) -->
+ <skip />
+ <!-- no translation found for description_krtv_7 (6204900788594114856) -->
+ <skip />
+ <!-- no translation found for description_krtv_12 (5134514644432355428) -->
+ <skip />
+ <!-- no translation found for description_krtv_15 (1183692678647313272) -->
+ <skip />
+ <!-- no translation found for description_krtv_19 (7021986912313208481) -->
+ <skip />
+ <!-- no translation found for battery_saver_description (724302068634956656) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-nl/strings.xml b/core/res/res/values-nl/strings.xml
index 1916f0e..84c5242 100644
--- a/core/res/res/values-nl/strings.xml
+++ b/core/res/res/values-nl/strings.xml
@@ -1339,8 +1339,10 @@
<string name="extmedia_format_button_format" msgid="4131064560127478695">"Formatteren"</string>
<string name="adb_active_notification_title" msgid="6729044778949189918">"USB-foutopsporing verbonden"</string>
<string name="adb_active_notification_message" msgid="1016654627626476142">"Tik om USB-foutopsporing uit te schakelen."</string>
- <string name="select_input_method" msgid="4653387336791222978">"Invoermethode selecteren"</string>
- <string name="configure_input_methods" msgid="9091652157722495116">"Invoermethoden instellen"</string>
+ <!-- no translation found for select_input_method (8547250819326693584) -->
+ <skip />
+ <!-- no translation found for configure_input_methods (4769971288371946846) -->
+ <skip />
<string name="use_physical_keyboard" msgid="6203112478095117625">"Fysiek toetsenbord"</string>
<string name="hardware" msgid="7517821086888990278">"Hardware"</string>
<string name="select_keyboard_layout_notification_title" msgid="1407367017263030773">"Toetsenbordindeling selecteren"</string>
@@ -1384,12 +1386,12 @@
<string name="permdesc_control_keyguard" msgid="3043732290518629061">"Staat toe dat een app de toetsbeveiliging beheert."</string>
<string name="permlab_trust_listener" msgid="1765718054003704476">"Controleren op wijzigingen in de trust-status."</string>
<string name="permdesc_trust_listener" msgid="8233895334214716864">"Toestaan dat een app controleert op wijzigingen in de trust-status."</string>
- <string name="permlab_provide_trust_agent" msgid="5465587586091358316">"Een trust-agent aanleveren."</string>
- <string name="permdesc_provide_trust_agent" msgid="3865702641053068148">"Hiermee kan een app een trust-agent aanleveren."</string>
- <string name="permlab_launch_trust_agent_settings" msgid="5859430082240410200">"Menu met instellingen voor trust-agents starten."</string>
- <string name="permdesc_launch_trust_agent_settings" msgid="8185142708644913381">"Hiermee kan een app een activiteit starten waarmee het gedrag van trust-agents wordt gewijzigd."</string>
- <string name="permlab_bind_trust_agent_service" msgid="8242093169457695334">"Binden aan een trust-agentservice"</string>
- <string name="permdesc_bind_trust_agent_service" msgid="7041930026024507515">"Toestaan dat een app wordt gebonden aan een trust-agentservice."</string>
+ <string name="permlab_provide_trust_agent" msgid="5465587586091358316">"Een trust agent aanleveren."</string>
+ <string name="permdesc_provide_trust_agent" msgid="3865702641053068148">"Hiermee kan een app een trust agent aanleveren."</string>
+ <string name="permlab_launch_trust_agent_settings" msgid="5859430082240410200">"Menu met instellingen voor trust agents starten."</string>
+ <string name="permdesc_launch_trust_agent_settings" msgid="8185142708644913381">"Hiermee kan een app een activiteit starten waarmee het gedrag van trust agents wordt gewijzigd."</string>
+ <string name="permlab_bind_trust_agent_service" msgid="8242093169457695334">"Binden aan een trust agent-service"</string>
+ <string name="permdesc_bind_trust_agent_service" msgid="7041930026024507515">"Toestaan dat een app wordt gebonden aan een trust agent-service."</string>
<string name="permlab_recovery" msgid="3157024487744125846">"Interactie met update- en herstelsysteem"</string>
<string name="permdesc_recovery" msgid="8511774533266359571">"Hiermee kan een app interactie hebben met het herstelsysteem en systeemupdates."</string>
<string name="permlab_createMediaProjection" msgid="4941338725487978112">"Mediaprojectiesessies maken"</string>
@@ -1633,8 +1635,7 @@
<string name="user_switched" msgid="3768006783166984410">"Huidige gebruiker <xliff:g id="NAME">%1$s</xliff:g>."</string>
<string name="owner_name" msgid="2716755460376028154">"Eigenaar"</string>
<string name="error_message_title" msgid="4510373083082500195">"Fout"</string>
- <!-- no translation found for error_message_change_not_allowed (1347282344200417578) -->
- <skip />
+ <string name="error_message_change_not_allowed" msgid="1347282344200417578">"Deze wijziging is niet toegestaan door uw beheerder"</string>
<string name="app_not_found" msgid="3429141853498927379">"Er is geen app gevonden om deze actie uit te voeren"</string>
<string name="revoke" msgid="5404479185228271586">"Intrekken"</string>
<string name="mediasize_iso_a0" msgid="1994474252931294172">"ISO A0"</string>
@@ -1765,4 +1766,40 @@
<string name="lock_to_app_unlock_pin" msgid="7908385370846820001">"pincode"</string>
<string name="lock_to_app_unlock_pattern" msgid="7763071104790758405">"ontgrendelingspatroon"</string>
<string name="lock_to_app_unlock_password" msgid="795224196583495868">"wachtwoord"</string>
+ <!-- no translation found for description_ustvpg (3666171166900312727) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_d (6552868431924879897) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_l (2427588153488291892) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_s (2556047043212535339) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_v (6647466085048806213) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_fv (4015953953338931020) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_y (2271448022073929890) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_y7 (8931861188215869211) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_g (506861774854051282) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_pg (4238749719629801564) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_14 (6305164472373004907) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_ma (5842074394338699982) -->
+ <skip />
+ <!-- no translation found for description_krtv_all (11497981488871053) -->
+ <skip />
+ <!-- no translation found for description_krtv_7 (6204900788594114856) -->
+ <skip />
+ <!-- no translation found for description_krtv_12 (5134514644432355428) -->
+ <skip />
+ <!-- no translation found for description_krtv_15 (1183692678647313272) -->
+ <skip />
+ <!-- no translation found for description_krtv_19 (7021986912313208481) -->
+ <skip />
+ <!-- no translation found for battery_saver_description (724302068634956656) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-pl/strings.xml b/core/res/res/values-pl/strings.xml
index bae26f8..03b716e 100644
--- a/core/res/res/values-pl/strings.xml
+++ b/core/res/res/values-pl/strings.xml
@@ -1339,8 +1339,10 @@
<string name="extmedia_format_button_format" msgid="4131064560127478695">"Formatuj"</string>
<string name="adb_active_notification_title" msgid="6729044778949189918">"Podłączono moduł debugowania USB"</string>
<string name="adb_active_notification_message" msgid="1016654627626476142">"Dotknij, aby wyłączyć debugowanie USB."</string>
- <string name="select_input_method" msgid="4653387336791222978">"Wybierz metodę wprowadzania"</string>
- <string name="configure_input_methods" msgid="9091652157722495116">"Konfiguruj metody wprowadzania"</string>
+ <!-- no translation found for select_input_method (8547250819326693584) -->
+ <skip />
+ <!-- no translation found for configure_input_methods (4769971288371946846) -->
+ <skip />
<string name="use_physical_keyboard" msgid="6203112478095117625">"Klawiatura fizyczna"</string>
<string name="hardware" msgid="7517821086888990278">"Sprzęt"</string>
<string name="select_keyboard_layout_notification_title" msgid="1407367017263030773">"Wybierz układ klawiatury"</string>
@@ -1384,11 +1386,11 @@
<string name="permdesc_control_keyguard" msgid="3043732290518629061">"Umożliwia aplikacji kontrolowanie zabezpieczenia kluczami."</string>
<string name="permlab_trust_listener" msgid="1765718054003704476">"Monitoruj zmiany w stanie zaufania."</string>
<string name="permdesc_trust_listener" msgid="8233895334214716864">"Zezwala aplikacji na monitorowanie zmian w stanie zaufania."</string>
- <string name="permlab_provide_trust_agent" msgid="5465587586091358316">"Dostarczaj agenta zaufania."</string>
+ <string name="permlab_provide_trust_agent" msgid="5465587586091358316">"Dostarczanie agenta zaufania"</string>
<string name="permdesc_provide_trust_agent" msgid="3865702641053068148">"Zezwala aplikacji na dostarczanie agenta zaufania."</string>
- <string name="permlab_launch_trust_agent_settings" msgid="5859430082240410200">"Otwieranie menu ustawień agenta zaufania."</string>
+ <string name="permlab_launch_trust_agent_settings" msgid="5859430082240410200">"Otwieranie menu ustawień agenta zaufania"</string>
<string name="permdesc_launch_trust_agent_settings" msgid="8185142708644913381">"Zezwala aplikacji na uruchamianie akcji, która zmienia sposób działania agenta zaufania."</string>
- <string name="permlab_bind_trust_agent_service" msgid="8242093169457695334">"Powiąż z usługą agenta zaufania"</string>
+ <string name="permlab_bind_trust_agent_service" msgid="8242093169457695334">"Powiązanie z usługą agenta zaufania"</string>
<string name="permdesc_bind_trust_agent_service" msgid="7041930026024507515">"Zezwala aplikacji na powiązanie z usługą agenta zaufania."</string>
<string name="permlab_recovery" msgid="3157024487744125846">"Interakcja z systemem odzyskiwania i aktualizacjami"</string>
<string name="permdesc_recovery" msgid="8511774533266359571">"Zezwala aplikacji na interakcję z systemem odzyskiwania i aktualizacjami systemu."</string>
@@ -1633,8 +1635,7 @@
<string name="user_switched" msgid="3768006783166984410">"Bieżący użytkownik: <xliff:g id="NAME">%1$s</xliff:g>."</string>
<string name="owner_name" msgid="2716755460376028154">"Właściciel"</string>
<string name="error_message_title" msgid="4510373083082500195">"Błąd"</string>
- <!-- no translation found for error_message_change_not_allowed (1347282344200417578) -->
- <skip />
+ <string name="error_message_change_not_allowed" msgid="1347282344200417578">"Ta zmiana nie jest dozwolona przez administratora"</string>
<string name="app_not_found" msgid="3429141853498927379">"Nie znaleziono aplikacji do obsługi tej akcji"</string>
<string name="revoke" msgid="5404479185228271586">"Cofnij"</string>
<string name="mediasize_iso_a0" msgid="1994474252931294172">"ISO A0"</string>
@@ -1765,4 +1766,40 @@
<string name="lock_to_app_unlock_pin" msgid="7908385370846820001">"Kod PIN"</string>
<string name="lock_to_app_unlock_pattern" msgid="7763071104790758405">"wzór odblokowania"</string>
<string name="lock_to_app_unlock_password" msgid="795224196583495868">"hasło"</string>
+ <!-- no translation found for description_ustvpg (3666171166900312727) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_d (6552868431924879897) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_l (2427588153488291892) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_s (2556047043212535339) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_v (6647466085048806213) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_fv (4015953953338931020) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_y (2271448022073929890) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_y7 (8931861188215869211) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_g (506861774854051282) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_pg (4238749719629801564) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_14 (6305164472373004907) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_ma (5842074394338699982) -->
+ <skip />
+ <!-- no translation found for description_krtv_all (11497981488871053) -->
+ <skip />
+ <!-- no translation found for description_krtv_7 (6204900788594114856) -->
+ <skip />
+ <!-- no translation found for description_krtv_12 (5134514644432355428) -->
+ <skip />
+ <!-- no translation found for description_krtv_15 (1183692678647313272) -->
+ <skip />
+ <!-- no translation found for description_krtv_19 (7021986912313208481) -->
+ <skip />
+ <!-- no translation found for battery_saver_description (724302068634956656) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-pt-rPT/strings.xml b/core/res/res/values-pt-rPT/strings.xml
index 0341db8..0bac7a3 100644
--- a/core/res/res/values-pt-rPT/strings.xml
+++ b/core/res/res/values-pt-rPT/strings.xml
@@ -1339,8 +1339,10 @@
<string name="extmedia_format_button_format" msgid="4131064560127478695">"Formatar"</string>
<string name="adb_active_notification_title" msgid="6729044778949189918">"Depuração USB ligada"</string>
<string name="adb_active_notification_message" msgid="1016654627626476142">"Toque para desativar a depuração USB."</string>
- <string name="select_input_method" msgid="4653387336791222978">"Escolher o método de entrada"</string>
- <string name="configure_input_methods" msgid="9091652157722495116">"Configurar métodos de introdução"</string>
+ <!-- no translation found for select_input_method (8547250819326693584) -->
+ <skip />
+ <!-- no translation found for configure_input_methods (4769971288371946846) -->
+ <skip />
<string name="use_physical_keyboard" msgid="6203112478095117625">"Teclado físico"</string>
<string name="hardware" msgid="7517821086888990278">"Hardware"</string>
<string name="select_keyboard_layout_notification_title" msgid="1407367017263030773">"Selecionar esquema de teclado"</string>
@@ -1388,8 +1390,8 @@
<string name="permdesc_provide_trust_agent" msgid="3865702641053068148">"Permite que uma aplicação forneça um agente fidedigno."</string>
<string name="permlab_launch_trust_agent_settings" msgid="5859430082240410200">"Iniciar o menu de definições do agente fidedigno."</string>
<string name="permdesc_launch_trust_agent_settings" msgid="8185142708644913381">"Permite que uma aplicação inicie uma atividade que altere o comportamento do agente fidedigno."</string>
- <string name="permlab_bind_trust_agent_service" msgid="8242093169457695334">"Vincular a um serviço de trust agent"</string>
- <string name="permdesc_bind_trust_agent_service" msgid="7041930026024507515">"Permite que uma aplicação fique vinculada a um serviço de trust agent."</string>
+ <string name="permlab_bind_trust_agent_service" msgid="8242093169457695334">"Vincular a um serviço de agente fidedigno"</string>
+ <string name="permdesc_bind_trust_agent_service" msgid="7041930026024507515">"Permite que uma aplicação fique vinculada a um serviço de agente fidedigno."</string>
<string name="permlab_recovery" msgid="3157024487744125846">"Interagir com o sistema de recuperação e de atualização"</string>
<string name="permdesc_recovery" msgid="8511774533266359571">"Permite que uma aplicação interaja com o sistema de recuperação e as atualizações do sistema."</string>
<string name="permlab_createMediaProjection" msgid="4941338725487978112">"Criar sessões de projeção multimédia"</string>
@@ -1633,8 +1635,7 @@
<string name="user_switched" msgid="3768006783166984410">"<xliff:g id="NAME">%1$s</xliff:g> do utilizador atual."</string>
<string name="owner_name" msgid="2716755460376028154">"Proprietário"</string>
<string name="error_message_title" msgid="4510373083082500195">"Erro"</string>
- <!-- no translation found for error_message_change_not_allowed (1347282344200417578) -->
- <skip />
+ <string name="error_message_change_not_allowed" msgid="1347282344200417578">"O administrador não permite esta alteração"</string>
<string name="app_not_found" msgid="3429141853498927379">"Não foram encontradas aplicações para executar esta ação"</string>
<string name="revoke" msgid="5404479185228271586">"Revogar"</string>
<string name="mediasize_iso_a0" msgid="1994474252931294172">"ISO A0"</string>
@@ -1765,4 +1766,40 @@
<string name="lock_to_app_unlock_pin" msgid="7908385370846820001">"PIN"</string>
<string name="lock_to_app_unlock_pattern" msgid="7763071104790758405">"sequência de desbloqueio"</string>
<string name="lock_to_app_unlock_password" msgid="795224196583495868">"palavra-passe"</string>
+ <!-- no translation found for description_ustvpg (3666171166900312727) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_d (6552868431924879897) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_l (2427588153488291892) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_s (2556047043212535339) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_v (6647466085048806213) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_fv (4015953953338931020) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_y (2271448022073929890) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_y7 (8931861188215869211) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_g (506861774854051282) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_pg (4238749719629801564) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_14 (6305164472373004907) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_ma (5842074394338699982) -->
+ <skip />
+ <!-- no translation found for description_krtv_all (11497981488871053) -->
+ <skip />
+ <!-- no translation found for description_krtv_7 (6204900788594114856) -->
+ <skip />
+ <!-- no translation found for description_krtv_12 (5134514644432355428) -->
+ <skip />
+ <!-- no translation found for description_krtv_15 (1183692678647313272) -->
+ <skip />
+ <!-- no translation found for description_krtv_19 (7021986912313208481) -->
+ <skip />
+ <!-- no translation found for battery_saver_description (724302068634956656) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-pt/strings.xml b/core/res/res/values-pt/strings.xml
index 169498a..24745f7 100644
--- a/core/res/res/values-pt/strings.xml
+++ b/core/res/res/values-pt/strings.xml
@@ -1339,8 +1339,10 @@
<string name="extmedia_format_button_format" msgid="4131064560127478695">"Formatar"</string>
<string name="adb_active_notification_title" msgid="6729044778949189918">"Depuração USB conectada"</string>
<string name="adb_active_notification_message" msgid="1016654627626476142">"Toque para desativar a depuração do USB."</string>
- <string name="select_input_method" msgid="4653387336791222978">"Selecione o método de entrada"</string>
- <string name="configure_input_methods" msgid="9091652157722495116">"Configurar métodos de entrada"</string>
+ <!-- no translation found for select_input_method (8547250819326693584) -->
+ <skip />
+ <!-- no translation found for configure_input_methods (4769971288371946846) -->
+ <skip />
<string name="use_physical_keyboard" msgid="6203112478095117625">"Teclado físico"</string>
<string name="hardware" msgid="7517821086888990278">"Hardware"</string>
<string name="select_keyboard_layout_notification_title" msgid="1407367017263030773">"Selecione o layout de teclado"</string>
@@ -1633,8 +1635,7 @@
<string name="user_switched" msgid="3768006783166984410">"Usuário atual <xliff:g id="NAME">%1$s</xliff:g>."</string>
<string name="owner_name" msgid="2716755460376028154">"Proprietário"</string>
<string name="error_message_title" msgid="4510373083082500195">"Erro"</string>
- <!-- no translation found for error_message_change_not_allowed (1347282344200417578) -->
- <skip />
+ <string name="error_message_change_not_allowed" msgid="1347282344200417578">"Esta alteração não é permitida pelo administrador"</string>
<string name="app_not_found" msgid="3429141853498927379">"Nenhum aplicativo encontrado para executar a ação"</string>
<string name="revoke" msgid="5404479185228271586">"Revogar"</string>
<string name="mediasize_iso_a0" msgid="1994474252931294172">"ISO A0"</string>
@@ -1765,4 +1766,40 @@
<string name="lock_to_app_unlock_pin" msgid="7908385370846820001">"PIN"</string>
<string name="lock_to_app_unlock_pattern" msgid="7763071104790758405">"desbloquear padrão"</string>
<string name="lock_to_app_unlock_password" msgid="795224196583495868">"senha"</string>
+ <!-- no translation found for description_ustvpg (3666171166900312727) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_d (6552868431924879897) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_l (2427588153488291892) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_s (2556047043212535339) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_v (6647466085048806213) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_fv (4015953953338931020) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_y (2271448022073929890) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_y7 (8931861188215869211) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_g (506861774854051282) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_pg (4238749719629801564) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_14 (6305164472373004907) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_ma (5842074394338699982) -->
+ <skip />
+ <!-- no translation found for description_krtv_all (11497981488871053) -->
+ <skip />
+ <!-- no translation found for description_krtv_7 (6204900788594114856) -->
+ <skip />
+ <!-- no translation found for description_krtv_12 (5134514644432355428) -->
+ <skip />
+ <!-- no translation found for description_krtv_15 (1183692678647313272) -->
+ <skip />
+ <!-- no translation found for description_krtv_19 (7021986912313208481) -->
+ <skip />
+ <!-- no translation found for battery_saver_description (724302068634956656) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-ro/strings.xml b/core/res/res/values-ro/strings.xml
index d2d4c34..358f170 100644
--- a/core/res/res/values-ro/strings.xml
+++ b/core/res/res/values-ro/strings.xml
@@ -1341,8 +1341,10 @@
<string name="extmedia_format_button_format" msgid="4131064560127478695">"Formataţi"</string>
<string name="adb_active_notification_title" msgid="6729044778949189918">"Depanarea USB este conectată"</string>
<string name="adb_active_notification_message" msgid="1016654627626476142">"Atingeţi pentru a dezactiva depanarea USB."</string>
- <string name="select_input_method" msgid="4653387336791222978">"Alegeți metoda de introducere de text"</string>
- <string name="configure_input_methods" msgid="9091652157722495116">"Setați metode introducere text"</string>
+ <!-- no translation found for select_input_method (8547250819326693584) -->
+ <skip />
+ <!-- no translation found for configure_input_methods (4769971288371946846) -->
+ <skip />
<string name="use_physical_keyboard" msgid="6203112478095117625">"Tastatură fizică"</string>
<string name="hardware" msgid="7517821086888990278">"Hardware"</string>
<string name="select_keyboard_layout_notification_title" msgid="1407367017263030773">"Selectaţi aspectul tastaturii"</string>
@@ -1635,8 +1637,7 @@
<string name="user_switched" msgid="3768006783166984410">"Utilizator curent: <xliff:g id="NAME">%1$s</xliff:g>."</string>
<string name="owner_name" msgid="2716755460376028154">"Proprietar"</string>
<string name="error_message_title" msgid="4510373083082500195">"Eroare"</string>
- <!-- no translation found for error_message_change_not_allowed (1347282344200417578) -->
- <skip />
+ <string name="error_message_change_not_allowed" msgid="1347282344200417578">"Această modificare nu este permisă de administratorul dvs."</string>
<string name="app_not_found" msgid="3429141853498927379">"Nicio aplicație pentru gestionarea acestei acțiuni"</string>
<string name="revoke" msgid="5404479185228271586">"Revocați"</string>
<string name="mediasize_iso_a0" msgid="1994474252931294172">"ISO A0"</string>
@@ -1767,4 +1768,40 @@
<string name="lock_to_app_unlock_pin" msgid="7908385370846820001">"PIN"</string>
<string name="lock_to_app_unlock_pattern" msgid="7763071104790758405">"model pentru deblocare"</string>
<string name="lock_to_app_unlock_password" msgid="795224196583495868">"parolă"</string>
+ <!-- no translation found for description_ustvpg (3666171166900312727) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_d (6552868431924879897) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_l (2427588153488291892) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_s (2556047043212535339) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_v (6647466085048806213) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_fv (4015953953338931020) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_y (2271448022073929890) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_y7 (8931861188215869211) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_g (506861774854051282) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_pg (4238749719629801564) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_14 (6305164472373004907) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_ma (5842074394338699982) -->
+ <skip />
+ <!-- no translation found for description_krtv_all (11497981488871053) -->
+ <skip />
+ <!-- no translation found for description_krtv_7 (6204900788594114856) -->
+ <skip />
+ <!-- no translation found for description_krtv_12 (5134514644432355428) -->
+ <skip />
+ <!-- no translation found for description_krtv_15 (1183692678647313272) -->
+ <skip />
+ <!-- no translation found for description_krtv_19 (7021986912313208481) -->
+ <skip />
+ <!-- no translation found for battery_saver_description (724302068634956656) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-ru/strings.xml b/core/res/res/values-ru/strings.xml
index 78f7703..ed80539 100644
--- a/core/res/res/values-ru/strings.xml
+++ b/core/res/res/values-ru/strings.xml
@@ -1339,8 +1339,10 @@
<string name="extmedia_format_button_format" msgid="4131064560127478695">"Формат"</string>
<string name="adb_active_notification_title" msgid="6729044778949189918">"Отладка по USB разрешена"</string>
<string name="adb_active_notification_message" msgid="1016654627626476142">"Нажмите, чтобы отключить отладку по USB."</string>
- <string name="select_input_method" msgid="4653387336791222978">"Выберите способ ввода"</string>
- <string name="configure_input_methods" msgid="9091652157722495116">"Настройка способов ввода"</string>
+ <!-- no translation found for select_input_method (8547250819326693584) -->
+ <skip />
+ <!-- no translation found for configure_input_methods (4769971288371946846) -->
+ <skip />
<string name="use_physical_keyboard" msgid="6203112478095117625">"Физическая клавиатура"</string>
<string name="hardware" msgid="7517821086888990278">"Аппаратура"</string>
<string name="select_keyboard_layout_notification_title" msgid="1407367017263030773">"Выберите раскладку клавиатуры"</string>
@@ -1633,8 +1635,7 @@
<string name="user_switched" msgid="3768006783166984410">"Выбран аккаунт пользователя <xliff:g id="NAME">%1$s</xliff:g>."</string>
<string name="owner_name" msgid="2716755460376028154">"Владелец"</string>
<string name="error_message_title" msgid="4510373083082500195">"Ошибка"</string>
- <!-- no translation found for error_message_change_not_allowed (1347282344200417578) -->
- <skip />
+ <string name="error_message_change_not_allowed" msgid="1347282344200417578">"Это действие запрещено администратором"</string>
<string name="app_not_found" msgid="3429141853498927379">"Невозможно обработать это действие"</string>
<string name="revoke" msgid="5404479185228271586">"Отменить"</string>
<string name="mediasize_iso_a0" msgid="1994474252931294172">"ISO A0 (841 х 1189 мм)"</string>
@@ -1765,4 +1766,40 @@
<string name="lock_to_app_unlock_pin" msgid="7908385370846820001">"PIN-код"</string>
<string name="lock_to_app_unlock_pattern" msgid="7763071104790758405">"графический ключ"</string>
<string name="lock_to_app_unlock_password" msgid="795224196583495868">"пароль"</string>
+ <!-- no translation found for description_ustvpg (3666171166900312727) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_d (6552868431924879897) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_l (2427588153488291892) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_s (2556047043212535339) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_v (6647466085048806213) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_fv (4015953953338931020) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_y (2271448022073929890) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_y7 (8931861188215869211) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_g (506861774854051282) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_pg (4238749719629801564) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_14 (6305164472373004907) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_ma (5842074394338699982) -->
+ <skip />
+ <!-- no translation found for description_krtv_all (11497981488871053) -->
+ <skip />
+ <!-- no translation found for description_krtv_7 (6204900788594114856) -->
+ <skip />
+ <!-- no translation found for description_krtv_12 (5134514644432355428) -->
+ <skip />
+ <!-- no translation found for description_krtv_15 (1183692678647313272) -->
+ <skip />
+ <!-- no translation found for description_krtv_19 (7021986912313208481) -->
+ <skip />
+ <!-- no translation found for battery_saver_description (724302068634956656) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-si-rLK/strings.xml b/core/res/res/values-si-rLK/strings.xml
index eff02b3..26008f7 100644
--- a/core/res/res/values-si-rLK/strings.xml
+++ b/core/res/res/values-si-rLK/strings.xml
@@ -1342,8 +1342,10 @@
<string name="extmedia_format_button_format" msgid="4131064560127478695">"ෆෝමැට්"</string>
<string name="adb_active_notification_title" msgid="6729044778949189918">"USB නිදොස්කරණය සම්බන්ධිතයි"</string>
<string name="adb_active_notification_message" msgid="1016654627626476142">"USB නිදොස්කරණය අබල කිරීමට ස්පර්ශ කරන්න."</string>
- <string name="select_input_method" msgid="4653387336791222978">"ආදාන ක්රමයක් තෝරන්න"</string>
- <string name="configure_input_methods" msgid="9091652157722495116">"ආදාන ක්රම සකසන්න"</string>
+ <!-- no translation found for select_input_method (8547250819326693584) -->
+ <skip />
+ <!-- no translation found for configure_input_methods (4769971288371946846) -->
+ <skip />
<string name="use_physical_keyboard" msgid="6203112478095117625">"භෞතික යතුරු පුවරුව"</string>
<string name="hardware" msgid="7517821086888990278">"දෘඨාංග"</string>
<string name="select_keyboard_layout_notification_title" msgid="1407367017263030773">"යතුරු පුවරුවට පිරිසැලැස්ම තෝරන්න"</string>
@@ -1636,8 +1638,7 @@
<string name="user_switched" msgid="3768006783166984410">"දැනට සිටින පරිශීලකයා <xliff:g id="NAME">%1$s</xliff:g>."</string>
<string name="owner_name" msgid="2716755460376028154">"හිමිකරු"</string>
<string name="error_message_title" msgid="4510373083082500195">"දෝෂය"</string>
- <!-- no translation found for error_message_change_not_allowed (1347282344200417578) -->
- <skip />
+ <string name="error_message_change_not_allowed" msgid="1347282344200417578">"ඔබගේ පරිපාලක විසින් මෙම වෙනස් කිරීමට ඉඩ නොදේ"</string>
<string name="app_not_found" msgid="3429141853498927379">"මෙම ක්රියාව හසුරුවීමට යෙදුමක් සොයාගත්තේ නැත"</string>
<string name="revoke" msgid="5404479185228271586">"අහෝසි කරන්න"</string>
<string name="mediasize_iso_a0" msgid="1994474252931294172">"ISO A0"</string>
@@ -1768,4 +1769,40 @@
<string name="lock_to_app_unlock_pin" msgid="7908385370846820001">"PIN"</string>
<string name="lock_to_app_unlock_pattern" msgid="7763071104790758405">"අඟුළු ඇරීමේ රටාව"</string>
<string name="lock_to_app_unlock_password" msgid="795224196583495868">"මුරපදය"</string>
+ <!-- no translation found for description_ustvpg (3666171166900312727) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_d (6552868431924879897) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_l (2427588153488291892) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_s (2556047043212535339) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_v (6647466085048806213) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_fv (4015953953338931020) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_y (2271448022073929890) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_y7 (8931861188215869211) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_g (506861774854051282) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_pg (4238749719629801564) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_14 (6305164472373004907) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_ma (5842074394338699982) -->
+ <skip />
+ <!-- no translation found for description_krtv_all (11497981488871053) -->
+ <skip />
+ <!-- no translation found for description_krtv_7 (6204900788594114856) -->
+ <skip />
+ <!-- no translation found for description_krtv_12 (5134514644432355428) -->
+ <skip />
+ <!-- no translation found for description_krtv_15 (1183692678647313272) -->
+ <skip />
+ <!-- no translation found for description_krtv_19 (7021986912313208481) -->
+ <skip />
+ <!-- no translation found for battery_saver_description (724302068634956656) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-sk/strings.xml b/core/res/res/values-sk/strings.xml
index 2868477..f6256b9 100644
--- a/core/res/res/values-sk/strings.xml
+++ b/core/res/res/values-sk/strings.xml
@@ -1339,8 +1339,10 @@
<string name="extmedia_format_button_format" msgid="4131064560127478695">"Formát"</string>
<string name="adb_active_notification_title" msgid="6729044778949189918">"Ladenie cez USB pripojené"</string>
<string name="adb_active_notification_message" msgid="1016654627626476142">"Dotknutím zakážete ladenie USB."</string>
- <string name="select_input_method" msgid="4653387336791222978">"Zvoliť metódu vstupu"</string>
- <string name="configure_input_methods" msgid="9091652157722495116">"Nastavenie metód vstupu"</string>
+ <!-- no translation found for select_input_method (8547250819326693584) -->
+ <skip />
+ <!-- no translation found for configure_input_methods (4769971288371946846) -->
+ <skip />
<string name="use_physical_keyboard" msgid="6203112478095117625">"Fyzická klávesnica"</string>
<string name="hardware" msgid="7517821086888990278">"Hardvér"</string>
<string name="select_keyboard_layout_notification_title" msgid="1407367017263030773">"Zvoľte rozloženie klávesnice"</string>
@@ -1384,12 +1386,12 @@
<string name="permdesc_control_keyguard" msgid="3043732290518629061">"Umožňuje aplikácii ovládať technológiu keyguard."</string>
<string name="permlab_trust_listener" msgid="1765718054003704476">"Reagovanie na zmeny stavu dôveryhodnosti."</string>
<string name="permdesc_trust_listener" msgid="8233895334214716864">"Umožňuje aplikácii reagovať na zmeny stavu dôveryhodnosti."</string>
- <string name="permlab_provide_trust_agent" msgid="5465587586091358316">"Poskytnúť dôveryhodného agenta"</string>
- <string name="permdesc_provide_trust_agent" msgid="3865702641053068148">"Umožňuje aplikácii poskytnúť dôveryhodného agenta."</string>
- <string name="permlab_launch_trust_agent_settings" msgid="5859430082240410200">"Spustiť ponuku nastavení agenta dôveryhodnosti"</string>
- <string name="permdesc_launch_trust_agent_settings" msgid="8185142708644913381">"Umožňuje aplikácii spustiť aktivitu, ktorá zmení správanie agenta dôveryhodnosti."</string>
- <string name="permlab_bind_trust_agent_service" msgid="8242093169457695334">"Viazanie sa na službu zástupcu dôveryhodnosti"</string>
- <string name="permdesc_bind_trust_agent_service" msgid="7041930026024507515">"Umožňuje aplikácii viazať sa na službu zástupcu dôveryhodnosti."</string>
+ <string name="permlab_provide_trust_agent" msgid="5465587586091358316">"Poskytovať agenta dôvery"</string>
+ <string name="permdesc_provide_trust_agent" msgid="3865702641053068148">"Umožňuje aplikácii poskytovať agenta dôvery."</string>
+ <string name="permlab_launch_trust_agent_settings" msgid="5859430082240410200">"Spustiť ponuku nastavení agenta dôvery"</string>
+ <string name="permdesc_launch_trust_agent_settings" msgid="8185142708644913381">"Umožňuje aplikácii spustiť aktivitu, ktorá zmení správanie agenta dôvery."</string>
+ <string name="permlab_bind_trust_agent_service" msgid="8242093169457695334">"Viazať sa na službu agenta dôvery"</string>
+ <string name="permdesc_bind_trust_agent_service" msgid="7041930026024507515">"Umožňuje aplikácii viazať sa na službu agenta dôvery."</string>
<string name="permlab_recovery" msgid="3157024487744125846">"Interakcia so systémom aktualizácií a obnovenia"</string>
<string name="permdesc_recovery" msgid="8511774533266359571">"Umožňuje aplikácii interakciu so systémom obnovenia a s aktualizáciami systému."</string>
<string name="permlab_createMediaProjection" msgid="4941338725487978112">"Vytváranie relácií projekcie médií"</string>
@@ -1633,8 +1635,7 @@
<string name="user_switched" msgid="3768006783166984410">"Aktuálny používateľ je <xliff:g id="NAME">%1$s</xliff:g>."</string>
<string name="owner_name" msgid="2716755460376028154">"Vlastník"</string>
<string name="error_message_title" msgid="4510373083082500195">"Chyba"</string>
- <!-- no translation found for error_message_change_not_allowed (1347282344200417578) -->
- <skip />
+ <string name="error_message_change_not_allowed" msgid="1347282344200417578">"Správca túto zmenu zakázal"</string>
<string name="app_not_found" msgid="3429141853498927379">"Aplikácia potrebná na spracovanie tejto akcie sa nenašla"</string>
<string name="revoke" msgid="5404479185228271586">"Odvolať"</string>
<string name="mediasize_iso_a0" msgid="1994474252931294172">"ISO A0"</string>
@@ -1765,4 +1766,40 @@
<string name="lock_to_app_unlock_pin" msgid="7908385370846820001">"Číslo PIN"</string>
<string name="lock_to_app_unlock_pattern" msgid="7763071104790758405">"bezpečnostný vzor"</string>
<string name="lock_to_app_unlock_password" msgid="795224196583495868">"heslo"</string>
+ <!-- no translation found for description_ustvpg (3666171166900312727) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_d (6552868431924879897) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_l (2427588153488291892) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_s (2556047043212535339) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_v (6647466085048806213) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_fv (4015953953338931020) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_y (2271448022073929890) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_y7 (8931861188215869211) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_g (506861774854051282) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_pg (4238749719629801564) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_14 (6305164472373004907) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_ma (5842074394338699982) -->
+ <skip />
+ <!-- no translation found for description_krtv_all (11497981488871053) -->
+ <skip />
+ <!-- no translation found for description_krtv_7 (6204900788594114856) -->
+ <skip />
+ <!-- no translation found for description_krtv_12 (5134514644432355428) -->
+ <skip />
+ <!-- no translation found for description_krtv_15 (1183692678647313272) -->
+ <skip />
+ <!-- no translation found for description_krtv_19 (7021986912313208481) -->
+ <skip />
+ <!-- no translation found for battery_saver_description (724302068634956656) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-sl/strings.xml b/core/res/res/values-sl/strings.xml
index 50768cd..69bbcfc 100644
--- a/core/res/res/values-sl/strings.xml
+++ b/core/res/res/values-sl/strings.xml
@@ -1339,8 +1339,10 @@
<string name="extmedia_format_button_format" msgid="4131064560127478695">"Formatiraj"</string>
<string name="adb_active_notification_title" msgid="6729044778949189918">"Iskanje in odpravljanje napak USB je povezano"</string>
<string name="adb_active_notification_message" msgid="1016654627626476142">"Dotaknite se, če želite onemogočiti iskanje in odpravljanje napak prek vrat USB."</string>
- <string name="select_input_method" msgid="4653387336791222978">"Izberite način vnosa"</string>
- <string name="configure_input_methods" msgid="9091652157722495116">"Nastavi načine vnosa"</string>
+ <!-- no translation found for select_input_method (8547250819326693584) -->
+ <skip />
+ <!-- no translation found for configure_input_methods (4769971288371946846) -->
+ <skip />
<string name="use_physical_keyboard" msgid="6203112478095117625">"Fizična tipkovnica"</string>
<string name="hardware" msgid="7517821086888990278">"Strojna oprema"</string>
<string name="select_keyboard_layout_notification_title" msgid="1407367017263030773">"Izberite razporeditev tipkovnice"</string>
@@ -1633,8 +1635,7 @@
<string name="user_switched" msgid="3768006783166984410">"Trenutni uporabnik <xliff:g id="NAME">%1$s</xliff:g>."</string>
<string name="owner_name" msgid="2716755460376028154">"Lastnik"</string>
<string name="error_message_title" msgid="4510373083082500195">"Napaka"</string>
- <!-- no translation found for error_message_change_not_allowed (1347282344200417578) -->
- <skip />
+ <string name="error_message_change_not_allowed" msgid="1347282344200417578">"Skrbnik ne dovoli te spremembe"</string>
<string name="app_not_found" msgid="3429141853498927379">"Najdena ni bila nobena aplikacija za izvedbo tega dejanja"</string>
<string name="revoke" msgid="5404479185228271586">"Prekliči"</string>
<string name="mediasize_iso_a0" msgid="1994474252931294172">"ISO A0"</string>
@@ -1765,4 +1766,40 @@
<string name="lock_to_app_unlock_pin" msgid="7908385370846820001">"PIN"</string>
<string name="lock_to_app_unlock_pattern" msgid="7763071104790758405">"vzorec za odklepanje"</string>
<string name="lock_to_app_unlock_password" msgid="795224196583495868">"geslo"</string>
+ <!-- no translation found for description_ustvpg (3666171166900312727) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_d (6552868431924879897) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_l (2427588153488291892) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_s (2556047043212535339) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_v (6647466085048806213) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_fv (4015953953338931020) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_y (2271448022073929890) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_y7 (8931861188215869211) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_g (506861774854051282) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_pg (4238749719629801564) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_14 (6305164472373004907) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_ma (5842074394338699982) -->
+ <skip />
+ <!-- no translation found for description_krtv_all (11497981488871053) -->
+ <skip />
+ <!-- no translation found for description_krtv_7 (6204900788594114856) -->
+ <skip />
+ <!-- no translation found for description_krtv_12 (5134514644432355428) -->
+ <skip />
+ <!-- no translation found for description_krtv_15 (1183692678647313272) -->
+ <skip />
+ <!-- no translation found for description_krtv_19 (7021986912313208481) -->
+ <skip />
+ <!-- no translation found for battery_saver_description (724302068634956656) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-sr/strings.xml b/core/res/res/values-sr/strings.xml
index bb46b87..80efdaa 100644
--- a/core/res/res/values-sr/strings.xml
+++ b/core/res/res/values-sr/strings.xml
@@ -1339,8 +1339,10 @@
<string name="extmedia_format_button_format" msgid="4131064560127478695">"Формат"</string>
<string name="adb_active_notification_title" msgid="6729044778949189918">"Отклањање грешака са USB-а је успостављено"</string>
<string name="adb_active_notification_message" msgid="1016654627626476142">"Додирните да бисте онемогућили отклањање грешака са USB-а."</string>
- <string name="select_input_method" msgid="4653387336791222978">"Избор метода уноса"</string>
- <string name="configure_input_methods" msgid="9091652157722495116">"Подеси методе уноса"</string>
+ <!-- no translation found for select_input_method (8547250819326693584) -->
+ <skip />
+ <!-- no translation found for configure_input_methods (4769971288371946846) -->
+ <skip />
<string name="use_physical_keyboard" msgid="6203112478095117625">"Физичка тастатура"</string>
<string name="hardware" msgid="7517821086888990278">"Хардвер"</string>
<string name="select_keyboard_layout_notification_title" msgid="1407367017263030773">"Избор распореда тастатуре"</string>
@@ -1633,8 +1635,7 @@
<string name="user_switched" msgid="3768006783166984410">"Актуелни корисник <xliff:g id="NAME">%1$s</xliff:g>."</string>
<string name="owner_name" msgid="2716755460376028154">"Власник"</string>
<string name="error_message_title" msgid="4510373083082500195">"Грешка"</string>
- <!-- no translation found for error_message_change_not_allowed (1347282344200417578) -->
- <skip />
+ <string name="error_message_change_not_allowed" msgid="1347282344200417578">"Администратор није дозволио ову промену"</string>
<string name="app_not_found" msgid="3429141853498927379">"Није пронађена ниједна апликација која би могла да обави ову радњу"</string>
<string name="revoke" msgid="5404479185228271586">"Опозови"</string>
<string name="mediasize_iso_a0" msgid="1994474252931294172">"ISO A0"</string>
@@ -1765,4 +1766,40 @@
<string name="lock_to_app_unlock_pin" msgid="7908385370846820001">"PIN"</string>
<string name="lock_to_app_unlock_pattern" msgid="7763071104790758405">"шаблон за откључавање"</string>
<string name="lock_to_app_unlock_password" msgid="795224196583495868">"лозинка"</string>
+ <!-- no translation found for description_ustvpg (3666171166900312727) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_d (6552868431924879897) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_l (2427588153488291892) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_s (2556047043212535339) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_v (6647466085048806213) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_fv (4015953953338931020) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_y (2271448022073929890) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_y7 (8931861188215869211) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_g (506861774854051282) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_pg (4238749719629801564) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_14 (6305164472373004907) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_ma (5842074394338699982) -->
+ <skip />
+ <!-- no translation found for description_krtv_all (11497981488871053) -->
+ <skip />
+ <!-- no translation found for description_krtv_7 (6204900788594114856) -->
+ <skip />
+ <!-- no translation found for description_krtv_12 (5134514644432355428) -->
+ <skip />
+ <!-- no translation found for description_krtv_15 (1183692678647313272) -->
+ <skip />
+ <!-- no translation found for description_krtv_19 (7021986912313208481) -->
+ <skip />
+ <!-- no translation found for battery_saver_description (724302068634956656) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-sv/strings.xml b/core/res/res/values-sv/strings.xml
index c8a0cc5..e6044a0 100644
--- a/core/res/res/values-sv/strings.xml
+++ b/core/res/res/values-sv/strings.xml
@@ -1339,8 +1339,10 @@
<string name="extmedia_format_button_format" msgid="4131064560127478695">"Format"</string>
<string name="adb_active_notification_title" msgid="6729044778949189918">"USB-felsökning ansluten"</string>
<string name="adb_active_notification_message" msgid="1016654627626476142">"Tryck om du vill inaktivera USB-felsökning."</string>
- <string name="select_input_method" msgid="4653387336791222978">"Välj inmatningsmetod"</string>
- <string name="configure_input_methods" msgid="9091652157722495116">"Konfigurera inmatningsmetoder"</string>
+ <!-- no translation found for select_input_method (8547250819326693584) -->
+ <skip />
+ <!-- no translation found for configure_input_methods (4769971288371946846) -->
+ <skip />
<string name="use_physical_keyboard" msgid="6203112478095117625">"Fysiskt tangentbord"</string>
<string name="hardware" msgid="7517821086888990278">"Maskinvara"</string>
<string name="select_keyboard_layout_notification_title" msgid="1407367017263030773">"Välj en tangentbordslayout"</string>
@@ -1633,8 +1635,7 @@
<string name="user_switched" msgid="3768006783166984410">"Nuvarande användare: <xliff:g id="NAME">%1$s</xliff:g>."</string>
<string name="owner_name" msgid="2716755460376028154">"Ägare"</string>
<string name="error_message_title" msgid="4510373083082500195">"Fel"</string>
- <!-- no translation found for error_message_change_not_allowed (1347282344200417578) -->
- <skip />
+ <string name="error_message_change_not_allowed" msgid="1347282344200417578">"Administratören tillåter inte den här ändringen"</string>
<string name="app_not_found" msgid="3429141853498927379">"Ingen app som kan hantera åtgärden hittades"</string>
<string name="revoke" msgid="5404479185228271586">"Återkalla"</string>
<string name="mediasize_iso_a0" msgid="1994474252931294172">"ISO A0"</string>
@@ -1765,4 +1766,40 @@
<string name="lock_to_app_unlock_pin" msgid="7908385370846820001">"Pinkod"</string>
<string name="lock_to_app_unlock_pattern" msgid="7763071104790758405">"grafiskt lösenord"</string>
<string name="lock_to_app_unlock_password" msgid="795224196583495868">"lösenord"</string>
+ <!-- no translation found for description_ustvpg (3666171166900312727) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_d (6552868431924879897) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_l (2427588153488291892) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_s (2556047043212535339) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_v (6647466085048806213) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_fv (4015953953338931020) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_y (2271448022073929890) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_y7 (8931861188215869211) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_g (506861774854051282) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_pg (4238749719629801564) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_14 (6305164472373004907) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_ma (5842074394338699982) -->
+ <skip />
+ <!-- no translation found for description_krtv_all (11497981488871053) -->
+ <skip />
+ <!-- no translation found for description_krtv_7 (6204900788594114856) -->
+ <skip />
+ <!-- no translation found for description_krtv_12 (5134514644432355428) -->
+ <skip />
+ <!-- no translation found for description_krtv_15 (1183692678647313272) -->
+ <skip />
+ <!-- no translation found for description_krtv_19 (7021986912313208481) -->
+ <skip />
+ <!-- no translation found for battery_saver_description (724302068634956656) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-sw/strings.xml b/core/res/res/values-sw/strings.xml
index 447bb57..5e15b75 100644
--- a/core/res/res/values-sw/strings.xml
+++ b/core/res/res/values-sw/strings.xml
@@ -1199,8 +1199,8 @@
<string name="chooseUsbActivity" msgid="6894748416073583509">"Chagua programu ya kifaa cha USB"</string>
<string name="noApplications" msgid="2991814273936504689">"Hakuna programu zinazoweza kufanya tendo hili."</string>
<string name="aerr_title" msgid="1905800560317137752"></string>
- <string name="aerr_application" msgid="932628488013092776">"Kwa bahati mbaya, <xliff:g id="APPLICATION">%1$s</xliff:g> imekoma."</string>
- <string name="aerr_process" msgid="4507058997035697579">"Kwa bahati mbaya, mchakato <xliff:g id="PROCESS">%1$s</xliff:g> umekoma."</string>
+ <string name="aerr_application" msgid="932628488013092776">"Kwa bahati mbaya, <xliff:g id="APPLICATION">%1$s</xliff:g> imeacha kufanya kazi."</string>
+ <string name="aerr_process" msgid="4507058997035697579">"Kwa bahati mbaya, mchakato wa <xliff:g id="PROCESS">%1$s</xliff:g> umekoma."</string>
<string name="anr_title" msgid="4351948481459135709"></string>
<string name="anr_activity_application" msgid="1904477189057199066">"<xliff:g id="APPLICATION">%2$s</xliff:g> haifanyi kazi.\n\nUnataka kuifunga?"</string>
<string name="anr_activity_process" msgid="5776209883299089767">"Shughuli <xliff:g id="ACTIVITY">%1$s</xliff:g> haijibu. \n\n Unataka kuifunga?"</string>
@@ -1339,8 +1339,10 @@
<string name="extmedia_format_button_format" msgid="4131064560127478695">"Fomati"</string>
<string name="adb_active_notification_title" msgid="6729044778949189918">"Utatuaji wa USB umeunganishwa"</string>
<string name="adb_active_notification_message" msgid="1016654627626476142">"Gusa ili uzime utatuaji wa USB."</string>
- <string name="select_input_method" msgid="4653387336791222978">"Chagua njia ya ingizo"</string>
- <string name="configure_input_methods" msgid="9091652157722495116">"Weka mbinu za ingizo"</string>
+ <!-- no translation found for select_input_method (8547250819326693584) -->
+ <skip />
+ <!-- no translation found for configure_input_methods (4769971288371946846) -->
+ <skip />
<string name="use_physical_keyboard" msgid="6203112478095117625">"Kibodi halisi"</string>
<string name="hardware" msgid="7517821086888990278">"Maunzi"</string>
<string name="select_keyboard_layout_notification_title" msgid="1407367017263030773">"Teua mpangilio wa kibodi"</string>
@@ -1384,12 +1386,12 @@
<string name="permdesc_control_keyguard" msgid="3043732290518629061">"Huruhusu programu kudhibiti kilinda-funguo."</string>
<string name="permlab_trust_listener" msgid="1765718054003704476">"Sikiliza mabadiliko ya hali ya kuaminiwa."</string>
<string name="permdesc_trust_listener" msgid="8233895334214716864">"Huruhusu programu kusikiliza mabadiliko katika hali ya kuaminiwa."</string>
- <string name="permlab_provide_trust_agent" msgid="5465587586091358316">"Toa wakala wa uaminifu."</string>
- <string name="permdesc_provide_trust_agent" msgid="3865702641053068148">"Huruhusu programu kutoa wakala wa uaminifu."</string>
- <string name="permlab_launch_trust_agent_settings" msgid="5859430082240410200">"Fungua menyu ya mipangilio ya madalali wa kuaminiwa."</string>
- <string name="permdesc_launch_trust_agent_settings" msgid="8185142708644913381">"Huruhusu programu kufungua kitendo ambacho hubadilisha tabia ya madalali wa kuaminiwa."</string>
- <string name="permlab_bind_trust_agent_service" msgid="8242093169457695334">"Funga kwenye huduma ya dalali wa kuaminiwa"</string>
- <string name="permdesc_bind_trust_agent_service" msgid="7041930026024507515">"Huruhusu programu kufungamanisha kwenye huduma ya dalali wa kuaminiwa."</string>
+ <string name="permlab_provide_trust_agent" msgid="5465587586091358316">"Kutoa kipengele cha kutathmini hali ya kuaminika."</string>
+ <string name="permdesc_provide_trust_agent" msgid="3865702641053068148">"Huruhusu programu kutoa kipengele cha kutathmini hali ya kuaminika."</string>
+ <string name="permlab_launch_trust_agent_settings" msgid="5859430082240410200">"Fungua menyu ya mipangilio ya kipengele cha kutathmini hali ya kuaminika."</string>
+ <string name="permdesc_launch_trust_agent_settings" msgid="8185142708644913381">"Huruhusu programu kuanzisha shughuli ambayo hubadilisha tabia ya kipengele cha kutathmini hali ya kuaminika."</string>
+ <string name="permlab_bind_trust_agent_service" msgid="8242093169457695334">"Kujiambatisha kwenye huduma ya kutathmini hali ya kuaminika"</string>
+ <string name="permdesc_bind_trust_agent_service" msgid="7041930026024507515">"Huruhusu programu kujiambatisha kwenye huduma ya kutathmini hali ya kuaminika."</string>
<string name="permlab_recovery" msgid="3157024487744125846">"Ingiliana na sasisho na mfumo wa kurejesha"</string>
<string name="permdesc_recovery" msgid="8511774533266359571">"Huruhusu programu kuingiliana na mfumo wa kurejesha na sasisho la mfumo."</string>
<string name="permlab_createMediaProjection" msgid="4941338725487978112">"Unda vipindi vya kuonyesha maudhui"</string>
@@ -1633,8 +1635,7 @@
<string name="user_switched" msgid="3768006783166984410">"Mtumiaji wa sasa <xliff:g id="NAME">%1$s</xliff:g>."</string>
<string name="owner_name" msgid="2716755460376028154">"Mmiliki"</string>
<string name="error_message_title" msgid="4510373083082500195">"Hitilafu"</string>
- <!-- no translation found for error_message_change_not_allowed (1347282344200417578) -->
- <skip />
+ <string name="error_message_change_not_allowed" msgid="1347282344200417578">"Mabadiliko haya hayaruhusiwi na msimamizi wako"</string>
<string name="app_not_found" msgid="3429141853498927379">"Hakuna programu iliyopatikana ili kushughulikia kitendo hiki"</string>
<string name="revoke" msgid="5404479185228271586">"Batilisha"</string>
<string name="mediasize_iso_a0" msgid="1994474252931294172">"ISO A0"</string>
@@ -1765,4 +1766,40 @@
<string name="lock_to_app_unlock_pin" msgid="7908385370846820001">"PIN"</string>
<string name="lock_to_app_unlock_pattern" msgid="7763071104790758405">"mchoro wa kufungua"</string>
<string name="lock_to_app_unlock_password" msgid="795224196583495868">"nenosiri"</string>
+ <!-- no translation found for description_ustvpg (3666171166900312727) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_d (6552868431924879897) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_l (2427588153488291892) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_s (2556047043212535339) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_v (6647466085048806213) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_fv (4015953953338931020) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_y (2271448022073929890) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_y7 (8931861188215869211) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_g (506861774854051282) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_pg (4238749719629801564) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_14 (6305164472373004907) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_ma (5842074394338699982) -->
+ <skip />
+ <!-- no translation found for description_krtv_all (11497981488871053) -->
+ <skip />
+ <!-- no translation found for description_krtv_7 (6204900788594114856) -->
+ <skip />
+ <!-- no translation found for description_krtv_12 (5134514644432355428) -->
+ <skip />
+ <!-- no translation found for description_krtv_15 (1183692678647313272) -->
+ <skip />
+ <!-- no translation found for description_krtv_19 (7021986912313208481) -->
+ <skip />
+ <!-- no translation found for battery_saver_description (724302068634956656) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-ta-rIN/strings.xml b/core/res/res/values-ta-rIN/strings.xml
index f09b328..2d71d73 100644
--- a/core/res/res/values-ta-rIN/strings.xml
+++ b/core/res/res/values-ta-rIN/strings.xml
@@ -1339,8 +1339,10 @@
<string name="extmedia_format_button_format" msgid="4131064560127478695">"வடிவமைப்பு"</string>
<string name="adb_active_notification_title" msgid="6729044778949189918">"USB பிழைதிருத்தம் இணைக்கப்பட்டது"</string>
<string name="adb_active_notification_message" msgid="1016654627626476142">"USB பிழைத்திருத்தத்தை முடக்க, தொடவும்."</string>
- <string name="select_input_method" msgid="4653387336791222978">"உள்ளீட்டு முறையைத் தேர்வுசெய்க"</string>
- <string name="configure_input_methods" msgid="9091652157722495116">"உள்ளீட்டு முறைகளை அமை"</string>
+ <!-- no translation found for select_input_method (8547250819326693584) -->
+ <skip />
+ <!-- no translation found for configure_input_methods (4769971288371946846) -->
+ <skip />
<string name="use_physical_keyboard" msgid="6203112478095117625">"கைமுறை விசைப்பலகை"</string>
<string name="hardware" msgid="7517821086888990278">"வன்பொருள்"</string>
<string name="select_keyboard_layout_notification_title" msgid="1407367017263030773">"விசைப்பலகைத் தளவமைப்பைத் தேர்ந்தெடுக்கவும்"</string>
@@ -1626,15 +1628,14 @@
<string name="kg_failed_attempts_almost_at_login" product="default" msgid="1437638152015574839">"திறப்பதற்கான வடிவத்தை <xliff:g id="NUMBER_0">%d</xliff:g> முறை தவறாக வரைந்துள்ளீர்கள். மேலும் <xliff:g id="NUMBER_1">%d</xliff:g> தோல்வி முயற்சிகளுக்குப் பிறகு, மின்னஞ்சல் கணக்கைப் பயன்படுத்தி உங்கள் மொபைலைத் திறக்கக் கேட்கப்படுவீர்கள்.\n\n <xliff:g id="NUMBER_2">%d</xliff:g> வினாடிகள் கழித்து முயற்சிக்கவும்."</string>
<string name="kg_text_message_separator" product="default" msgid="4160700433287233771">" — "</string>
<string name="kg_reordering_delete_drop_target_text" msgid="7899202978204438708">"அகற்று"</string>
- <string name="safe_media_volume_warning" product="default" msgid="2276318909314492312">"பரிந்துரைத்த அளவை விட ஒலியை அதிகரிக்கவா?\n\nநீண்ட நேரத்திற்கு அதிகளவில் ஒலி கேட்பது காதுகளைப் பாதிக்கலாம்."</string>
+ <string name="safe_media_volume_warning" product="default" msgid="2276318909314492312">"பரிந்துரைத்த அளவை விட ஒலியை அதிகரிக்கவா?\n\nநீண்ட நேரத்திற்கு அதிகளவில் ஒலி கேட்பது கேட்கும் திறனைப் பாதிக்கலாம்."</string>
<string name="continue_to_enable_accessibility" msgid="1626427372316070258">"அணுகல்தன்மையை இயக்க இரண்டு விரல்களைத் தொடர்ந்து வைக்கவும்."</string>
<string name="accessibility_enabled" msgid="1381972048564547685">"அணுகல்தன்மை இயக்கப்பட்டது."</string>
<string name="enable_accessibility_canceled" msgid="3833923257966635673">"அணுகல்தன்மை ரத்துசெய்யப்பட்டது."</string>
<string name="user_switched" msgid="3768006783166984410">"நடப்பு பயனர் <xliff:g id="NAME">%1$s</xliff:g>."</string>
<string name="owner_name" msgid="2716755460376028154">"உரிமையாளர்"</string>
<string name="error_message_title" msgid="4510373083082500195">"பிழை"</string>
- <!-- no translation found for error_message_change_not_allowed (1347282344200417578) -->
- <skip />
+ <string name="error_message_change_not_allowed" msgid="1347282344200417578">"உங்கள் நிர்வாகி இந்த மாற்றத்தை அனுமதிக்கவில்லை"</string>
<string name="app_not_found" msgid="3429141853498927379">"இந்தச் செயலைச் செய்ய பயன்பாடு எதுவுமில்லை"</string>
<string name="revoke" msgid="5404479185228271586">"திரும்பப்பெறு"</string>
<string name="mediasize_iso_a0" msgid="1994474252931294172">"ISO A0"</string>
@@ -1765,4 +1766,40 @@
<string name="lock_to_app_unlock_pin" msgid="7908385370846820001">"PIN"</string>
<string name="lock_to_app_unlock_pattern" msgid="7763071104790758405">"திறப்பதற்கான வடிவம்"</string>
<string name="lock_to_app_unlock_password" msgid="795224196583495868">"கடவுச்சொல்"</string>
+ <!-- no translation found for description_ustvpg (3666171166900312727) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_d (6552868431924879897) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_l (2427588153488291892) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_s (2556047043212535339) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_v (6647466085048806213) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_fv (4015953953338931020) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_y (2271448022073929890) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_y7 (8931861188215869211) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_g (506861774854051282) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_pg (4238749719629801564) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_14 (6305164472373004907) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_ma (5842074394338699982) -->
+ <skip />
+ <!-- no translation found for description_krtv_all (11497981488871053) -->
+ <skip />
+ <!-- no translation found for description_krtv_7 (6204900788594114856) -->
+ <skip />
+ <!-- no translation found for description_krtv_12 (5134514644432355428) -->
+ <skip />
+ <!-- no translation found for description_krtv_15 (1183692678647313272) -->
+ <skip />
+ <!-- no translation found for description_krtv_19 (7021986912313208481) -->
+ <skip />
+ <!-- no translation found for battery_saver_description (724302068634956656) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-te-rIN/strings.xml b/core/res/res/values-te-rIN/strings.xml
index 19944e6..6e2bbb6 100644
--- a/core/res/res/values-te-rIN/strings.xml
+++ b/core/res/res/values-te-rIN/strings.xml
@@ -1339,8 +1339,10 @@
<string name="extmedia_format_button_format" msgid="4131064560127478695">"ఫార్మాట్ చేయి"</string>
<string name="adb_active_notification_title" msgid="6729044778949189918">"USB డీబగ్గింగ్ కనెక్ట్ చేయబడింది"</string>
<string name="adb_active_notification_message" msgid="1016654627626476142">"USB డీబగ్గింగ్ను నిలిపివేయడానికి తాకండి."</string>
- <string name="select_input_method" msgid="4653387336791222978">"ఇన్పుట్ పద్ధతిని ఎంచుకోండి"</string>
- <string name="configure_input_methods" msgid="9091652157722495116">"ఇన్పుట్ పద్ధతులను సెటప్ చేయి"</string>
+ <!-- no translation found for select_input_method (8547250819326693584) -->
+ <skip />
+ <!-- no translation found for configure_input_methods (4769971288371946846) -->
+ <skip />
<string name="use_physical_keyboard" msgid="6203112478095117625">"భౌతిక కీబోర్డ్"</string>
<string name="hardware" msgid="7517821086888990278">"హార్డ్వేర్"</string>
<string name="select_keyboard_layout_notification_title" msgid="1407367017263030773">"కీబోర్డ్ లేఅవుట్ను ఎంచుకోండి"</string>
@@ -1633,8 +1635,7 @@
<string name="user_switched" msgid="3768006783166984410">"ప్రస్తుత వినియోగదారు <xliff:g id="NAME">%1$s</xliff:g>."</string>
<string name="owner_name" msgid="2716755460376028154">"యజమాని"</string>
<string name="error_message_title" msgid="4510373083082500195">"లోపం"</string>
- <!-- no translation found for error_message_change_not_allowed (1347282344200417578) -->
- <skip />
+ <string name="error_message_change_not_allowed" msgid="1347282344200417578">"ఈ మార్పును మీ నిర్వాహకుడు అనుమతించలేదు"</string>
<string name="app_not_found" msgid="3429141853498927379">"ఈ చర్యను నిర్వహించడానికి అనువర్తనం ఏదీ కనుగొనబడలేదు"</string>
<string name="revoke" msgid="5404479185228271586">"ఉపసంహరించండి"</string>
<string name="mediasize_iso_a0" msgid="1994474252931294172">"ISO A0"</string>
@@ -1765,4 +1766,40 @@
<string name="lock_to_app_unlock_pin" msgid="7908385370846820001">"PIN"</string>
<string name="lock_to_app_unlock_pattern" msgid="7763071104790758405">"అన్లాక్ నమూనా"</string>
<string name="lock_to_app_unlock_password" msgid="795224196583495868">"పాస్వర్డ్"</string>
+ <!-- no translation found for description_ustvpg (3666171166900312727) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_d (6552868431924879897) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_l (2427588153488291892) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_s (2556047043212535339) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_v (6647466085048806213) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_fv (4015953953338931020) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_y (2271448022073929890) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_y7 (8931861188215869211) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_g (506861774854051282) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_pg (4238749719629801564) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_14 (6305164472373004907) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_ma (5842074394338699982) -->
+ <skip />
+ <!-- no translation found for description_krtv_all (11497981488871053) -->
+ <skip />
+ <!-- no translation found for description_krtv_7 (6204900788594114856) -->
+ <skip />
+ <!-- no translation found for description_krtv_12 (5134514644432355428) -->
+ <skip />
+ <!-- no translation found for description_krtv_15 (1183692678647313272) -->
+ <skip />
+ <!-- no translation found for description_krtv_19 (7021986912313208481) -->
+ <skip />
+ <!-- no translation found for battery_saver_description (724302068634956656) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-th/strings.xml b/core/res/res/values-th/strings.xml
index 11d24df..fc8d893 100644
--- a/core/res/res/values-th/strings.xml
+++ b/core/res/res/values-th/strings.xml
@@ -1339,8 +1339,10 @@
<string name="extmedia_format_button_format" msgid="4131064560127478695">"รูปแบบ"</string>
<string name="adb_active_notification_title" msgid="6729044778949189918">"เชื่อมต่อการแก้ไขข้อบกพร่อง USB แล้ว"</string>
<string name="adb_active_notification_message" msgid="1016654627626476142">"แตะเพื่อปิดใช้งานการแก้ไขข้อบกพร่องของ USB"</string>
- <string name="select_input_method" msgid="4653387336791222978">"เลือกวิธีการป้อนข้อมูล"</string>
- <string name="configure_input_methods" msgid="9091652157722495116">"ตั้งค่าวิธีการป้อนข้อมูล"</string>
+ <!-- no translation found for select_input_method (8547250819326693584) -->
+ <skip />
+ <!-- no translation found for configure_input_methods (4769971288371946846) -->
+ <skip />
<string name="use_physical_keyboard" msgid="6203112478095117625">"แป้นพิมพ์บนเครื่อง"</string>
<string name="hardware" msgid="7517821086888990278">"ฮาร์ดแวร์"</string>
<string name="select_keyboard_layout_notification_title" msgid="1407367017263030773">"เลือกรูปแบบแป้นพิมพ์"</string>
@@ -1633,8 +1635,7 @@
<string name="user_switched" msgid="3768006783166984410">"ผู้ใช้ปัจจุบัน <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="owner_name" msgid="2716755460376028154">"เจ้าของ"</string>
<string name="error_message_title" msgid="4510373083082500195">"ข้อผิดพลาด"</string>
- <!-- no translation found for error_message_change_not_allowed (1347282344200417578) -->
- <skip />
+ <string name="error_message_change_not_allowed" msgid="1347282344200417578">"ผู้ดูแลระบบไม่อนุญาตการเปลี่ยนแปลงนี้"</string>
<string name="app_not_found" msgid="3429141853498927379">"ไม่พบแอปพลิเคชันสำหรับการทำงานนี้"</string>
<string name="revoke" msgid="5404479185228271586">"เพิกถอน"</string>
<string name="mediasize_iso_a0" msgid="1994474252931294172">"ISO A0"</string>
@@ -1765,4 +1766,40 @@
<string name="lock_to_app_unlock_pin" msgid="7908385370846820001">"PIN"</string>
<string name="lock_to_app_unlock_pattern" msgid="7763071104790758405">"รูปแบบการปลดล็อก"</string>
<string name="lock_to_app_unlock_password" msgid="795224196583495868">"รหัสผ่าน"</string>
+ <!-- no translation found for description_ustvpg (3666171166900312727) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_d (6552868431924879897) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_l (2427588153488291892) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_s (2556047043212535339) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_v (6647466085048806213) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_fv (4015953953338931020) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_y (2271448022073929890) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_y7 (8931861188215869211) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_g (506861774854051282) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_pg (4238749719629801564) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_14 (6305164472373004907) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_ma (5842074394338699982) -->
+ <skip />
+ <!-- no translation found for description_krtv_all (11497981488871053) -->
+ <skip />
+ <!-- no translation found for description_krtv_7 (6204900788594114856) -->
+ <skip />
+ <!-- no translation found for description_krtv_12 (5134514644432355428) -->
+ <skip />
+ <!-- no translation found for description_krtv_15 (1183692678647313272) -->
+ <skip />
+ <!-- no translation found for description_krtv_19 (7021986912313208481) -->
+ <skip />
+ <!-- no translation found for battery_saver_description (724302068634956656) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-tl/strings.xml b/core/res/res/values-tl/strings.xml
index bb93e06..461b394e 100644
--- a/core/res/res/values-tl/strings.xml
+++ b/core/res/res/values-tl/strings.xml
@@ -1339,8 +1339,10 @@
<string name="extmedia_format_button_format" msgid="4131064560127478695">"Format"</string>
<string name="adb_active_notification_title" msgid="6729044778949189918">"Konektado ang debugging ng USB"</string>
<string name="adb_active_notification_message" msgid="1016654627626476142">"Pindutin upang huwag paganahin ang pag-debug ng USB."</string>
- <string name="select_input_method" msgid="4653387336791222978">"Pumili ng pamamaraan ng pag-input"</string>
- <string name="configure_input_methods" msgid="9091652157722495116">"I-set up paraan ng pag-input"</string>
+ <!-- no translation found for select_input_method (8547250819326693584) -->
+ <skip />
+ <!-- no translation found for configure_input_methods (4769971288371946846) -->
+ <skip />
<string name="use_physical_keyboard" msgid="6203112478095117625">"Aktwal na keyboard"</string>
<string name="hardware" msgid="7517821086888990278">"Hardware"</string>
<string name="select_keyboard_layout_notification_title" msgid="1407367017263030773">"Pumili ng layout ng keyboard"</string>
@@ -1633,8 +1635,7 @@
<string name="user_switched" msgid="3768006783166984410">"Kasalukuyang user <xliff:g id="NAME">%1$s</xliff:g>."</string>
<string name="owner_name" msgid="2716755460376028154">"May-ari"</string>
<string name="error_message_title" msgid="4510373083082500195">"Error"</string>
- <!-- no translation found for error_message_change_not_allowed (1347282344200417578) -->
- <skip />
+ <string name="error_message_change_not_allowed" msgid="1347282344200417578">"Ang pagbabagong ito ay hindi pinapahintulutan ng iyong administrator"</string>
<string name="app_not_found" msgid="3429141853498927379">"Walang nakitang application na mangangasiwa sa pagkilos na ito"</string>
<string name="revoke" msgid="5404479185228271586">"Bawiin"</string>
<string name="mediasize_iso_a0" msgid="1994474252931294172">"ISO A0"</string>
@@ -1765,4 +1766,40 @@
<string name="lock_to_app_unlock_pin" msgid="7908385370846820001">"PIN"</string>
<string name="lock_to_app_unlock_pattern" msgid="7763071104790758405">"pattern sa pag-unlock"</string>
<string name="lock_to_app_unlock_password" msgid="795224196583495868">"password"</string>
+ <!-- no translation found for description_ustvpg (3666171166900312727) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_d (6552868431924879897) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_l (2427588153488291892) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_s (2556047043212535339) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_v (6647466085048806213) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_fv (4015953953338931020) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_y (2271448022073929890) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_y7 (8931861188215869211) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_g (506861774854051282) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_pg (4238749719629801564) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_14 (6305164472373004907) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_ma (5842074394338699982) -->
+ <skip />
+ <!-- no translation found for description_krtv_all (11497981488871053) -->
+ <skip />
+ <!-- no translation found for description_krtv_7 (6204900788594114856) -->
+ <skip />
+ <!-- no translation found for description_krtv_12 (5134514644432355428) -->
+ <skip />
+ <!-- no translation found for description_krtv_15 (1183692678647313272) -->
+ <skip />
+ <!-- no translation found for description_krtv_19 (7021986912313208481) -->
+ <skip />
+ <!-- no translation found for battery_saver_description (724302068634956656) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-tr/strings.xml b/core/res/res/values-tr/strings.xml
index 373dc93..de5a482 100644
--- a/core/res/res/values-tr/strings.xml
+++ b/core/res/res/values-tr/strings.xml
@@ -1339,8 +1339,10 @@
<string name="extmedia_format_button_format" msgid="4131064560127478695">"Biçimlendir"</string>
<string name="adb_active_notification_title" msgid="6729044778949189918">"USB hata ayıklaması bağlandı"</string>
<string name="adb_active_notification_message" msgid="1016654627626476142">"USB hata ayıklama özelliğini devre dışı bırakmak için dokunun."</string>
- <string name="select_input_method" msgid="4653387336791222978">"Giriş yöntemini seçin"</string>
- <string name="configure_input_methods" msgid="9091652157722495116">"Giriş yöntemlerini ayarla"</string>
+ <!-- no translation found for select_input_method (8547250819326693584) -->
+ <skip />
+ <!-- no translation found for configure_input_methods (4769971288371946846) -->
+ <skip />
<string name="use_physical_keyboard" msgid="6203112478095117625">"Fiziksel klavye"</string>
<string name="hardware" msgid="7517821086888990278">"Donanım"</string>
<string name="select_keyboard_layout_notification_title" msgid="1407367017263030773">"Klavye düzeni seçin"</string>
@@ -1633,8 +1635,7 @@
<string name="user_switched" msgid="3768006783166984410">"Geçerli kullanıcı: <xliff:g id="NAME">%1$s</xliff:g>."</string>
<string name="owner_name" msgid="2716755460376028154">"Sahibi"</string>
<string name="error_message_title" msgid="4510373083082500195">"Hata"</string>
- <!-- no translation found for error_message_change_not_allowed (1347282344200417578) -->
- <skip />
+ <string name="error_message_change_not_allowed" msgid="1347282344200417578">"Yöneticiniz bu değişikliğe izin vermiyor"</string>
<string name="app_not_found" msgid="3429141853498927379">"Bu eylemi gerçekleştirecek bir uygulama bulunamadı"</string>
<string name="revoke" msgid="5404479185228271586">"İptal et"</string>
<string name="mediasize_iso_a0" msgid="1994474252931294172">"ISO A0"</string>
@@ -1765,4 +1766,40 @@
<string name="lock_to_app_unlock_pin" msgid="7908385370846820001">"PIN"</string>
<string name="lock_to_app_unlock_pattern" msgid="7763071104790758405">"kilit açma deseni"</string>
<string name="lock_to_app_unlock_password" msgid="795224196583495868">"şifre"</string>
+ <!-- no translation found for description_ustvpg (3666171166900312727) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_d (6552868431924879897) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_l (2427588153488291892) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_s (2556047043212535339) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_v (6647466085048806213) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_fv (4015953953338931020) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_y (2271448022073929890) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_y7 (8931861188215869211) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_g (506861774854051282) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_pg (4238749719629801564) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_14 (6305164472373004907) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_ma (5842074394338699982) -->
+ <skip />
+ <!-- no translation found for description_krtv_all (11497981488871053) -->
+ <skip />
+ <!-- no translation found for description_krtv_7 (6204900788594114856) -->
+ <skip />
+ <!-- no translation found for description_krtv_12 (5134514644432355428) -->
+ <skip />
+ <!-- no translation found for description_krtv_15 (1183692678647313272) -->
+ <skip />
+ <!-- no translation found for description_krtv_19 (7021986912313208481) -->
+ <skip />
+ <!-- no translation found for battery_saver_description (724302068634956656) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-uk/strings.xml b/core/res/res/values-uk/strings.xml
index beeb72b..165d109 100644
--- a/core/res/res/values-uk/strings.xml
+++ b/core/res/res/values-uk/strings.xml
@@ -1339,8 +1339,10 @@
<string name="extmedia_format_button_format" msgid="4131064560127478695">"Форматув."</string>
<string name="adb_active_notification_title" msgid="6729044778949189918">"Налагодження USB завершено"</string>
<string name="adb_active_notification_message" msgid="1016654627626476142">"Торкніться, щоб вимкнути налагодження USB."</string>
- <string name="select_input_method" msgid="4653387336791222978">"Вибрати метод введення"</string>
- <string name="configure_input_methods" msgid="9091652157722495116">"Налаштувати методи введення"</string>
+ <!-- no translation found for select_input_method (8547250819326693584) -->
+ <skip />
+ <!-- no translation found for configure_input_methods (4769971288371946846) -->
+ <skip />
<string name="use_physical_keyboard" msgid="6203112478095117625">"Фізична клавіатура"</string>
<string name="hardware" msgid="7517821086888990278">"Обладнання"</string>
<string name="select_keyboard_layout_notification_title" msgid="1407367017263030773">"Виберіть розкладку клавіатури"</string>
@@ -1633,8 +1635,7 @@
<string name="user_switched" msgid="3768006783166984410">"Поточний користувач: <xliff:g id="NAME">%1$s</xliff:g>."</string>
<string name="owner_name" msgid="2716755460376028154">"Власник"</string>
<string name="error_message_title" msgid="4510373083082500195">"Помилка"</string>
- <!-- no translation found for error_message_change_not_allowed (1347282344200417578) -->
- <skip />
+ <string name="error_message_change_not_allowed" msgid="1347282344200417578">"Ця дія заборонена адміністратором"</string>
<string name="app_not_found" msgid="3429141853498927379">"Не знайдено програму для обробки цієї дії"</string>
<string name="revoke" msgid="5404479185228271586">"Анулювати"</string>
<string name="mediasize_iso_a0" msgid="1994474252931294172">"ISO A0"</string>
@@ -1765,4 +1766,40 @@
<string name="lock_to_app_unlock_pin" msgid="7908385370846820001">"PIN-код"</string>
<string name="lock_to_app_unlock_pattern" msgid="7763071104790758405">"ключ розблокування"</string>
<string name="lock_to_app_unlock_password" msgid="795224196583495868">"пароль"</string>
+ <!-- no translation found for description_ustvpg (3666171166900312727) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_d (6552868431924879897) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_l (2427588153488291892) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_s (2556047043212535339) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_v (6647466085048806213) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_fv (4015953953338931020) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_y (2271448022073929890) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_y7 (8931861188215869211) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_g (506861774854051282) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_pg (4238749719629801564) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_14 (6305164472373004907) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_ma (5842074394338699982) -->
+ <skip />
+ <!-- no translation found for description_krtv_all (11497981488871053) -->
+ <skip />
+ <!-- no translation found for description_krtv_7 (6204900788594114856) -->
+ <skip />
+ <!-- no translation found for description_krtv_12 (5134514644432355428) -->
+ <skip />
+ <!-- no translation found for description_krtv_15 (1183692678647313272) -->
+ <skip />
+ <!-- no translation found for description_krtv_19 (7021986912313208481) -->
+ <skip />
+ <!-- no translation found for battery_saver_description (724302068634956656) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-ur-rPK/strings.xml b/core/res/res/values-ur-rPK/strings.xml
index b4f73a1..5b71dff 100644
--- a/core/res/res/values-ur-rPK/strings.xml
+++ b/core/res/res/values-ur-rPK/strings.xml
@@ -1339,8 +1339,10 @@
<string name="extmedia_format_button_format" msgid="4131064560127478695">"فارمیٹ کریں"</string>
<string name="adb_active_notification_title" msgid="6729044778949189918">"USB ڈیبگ کرنا مربوط ہو گیا"</string>
<string name="adb_active_notification_message" msgid="1016654627626476142">"USB ڈیبگنگ کو غیر فعال کرنے کیلئے ٹچ کریں۔"</string>
- <string name="select_input_method" msgid="4653387336791222978">"ان پٹ کا طریقہ منتخب کریں"</string>
- <string name="configure_input_methods" msgid="9091652157722495116">"ان پٹ کے طریقوں کو ترتیب دیں"</string>
+ <!-- no translation found for select_input_method (8547250819326693584) -->
+ <skip />
+ <!-- no translation found for configure_input_methods (4769971288371946846) -->
+ <skip />
<string name="use_physical_keyboard" msgid="6203112478095117625">"طبعی کی بورڈ"</string>
<string name="hardware" msgid="7517821086888990278">"ہارڈ ویئر"</string>
<string name="select_keyboard_layout_notification_title" msgid="1407367017263030773">"کی بورڈ کا خاکہ منتخب کریں"</string>
@@ -1633,8 +1635,7 @@
<string name="user_switched" msgid="3768006783166984410">"موجودہ صارف <xliff:g id="NAME">%1$s</xliff:g>۔"</string>
<string name="owner_name" msgid="2716755460376028154">"مالک"</string>
<string name="error_message_title" msgid="4510373083082500195">"خرابی"</string>
- <!-- no translation found for error_message_change_not_allowed (1347282344200417578) -->
- <skip />
+ <string name="error_message_change_not_allowed" msgid="1347282344200417578">"آپ کے منتظم کے ذریعے اس تبدیلی کی اجازت نہیں ہے"</string>
<string name="app_not_found" msgid="3429141853498927379">"اس عمل کو ہینڈل کرنے کیلئے کوئی ایپلیکیشن نہیں ملا"</string>
<string name="revoke" msgid="5404479185228271586">"منسوخ کریں"</string>
<string name="mediasize_iso_a0" msgid="1994474252931294172">"ISO A0"</string>
@@ -1765,4 +1766,40 @@
<string name="lock_to_app_unlock_pin" msgid="7908385370846820001">"PIN"</string>
<string name="lock_to_app_unlock_pattern" msgid="7763071104790758405">"غیر مقفل کرنے کا پیٹرن"</string>
<string name="lock_to_app_unlock_password" msgid="795224196583495868">"پاس ورڈ"</string>
+ <!-- no translation found for description_ustvpg (3666171166900312727) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_d (6552868431924879897) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_l (2427588153488291892) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_s (2556047043212535339) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_v (6647466085048806213) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_fv (4015953953338931020) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_y (2271448022073929890) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_y7 (8931861188215869211) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_g (506861774854051282) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_pg (4238749719629801564) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_14 (6305164472373004907) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_ma (5842074394338699982) -->
+ <skip />
+ <!-- no translation found for description_krtv_all (11497981488871053) -->
+ <skip />
+ <!-- no translation found for description_krtv_7 (6204900788594114856) -->
+ <skip />
+ <!-- no translation found for description_krtv_12 (5134514644432355428) -->
+ <skip />
+ <!-- no translation found for description_krtv_15 (1183692678647313272) -->
+ <skip />
+ <!-- no translation found for description_krtv_19 (7021986912313208481) -->
+ <skip />
+ <!-- no translation found for battery_saver_description (724302068634956656) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-uz-rUZ/strings.xml b/core/res/res/values-uz-rUZ/strings.xml
index cf19c17..4c362ba 100644
--- a/core/res/res/values-uz-rUZ/strings.xml
+++ b/core/res/res/values-uz-rUZ/strings.xml
@@ -1339,8 +1339,10 @@
<string name="extmedia_format_button_format" msgid="4131064560127478695">"Format"</string>
<string name="adb_active_notification_title" msgid="6729044778949189918">"USB nosozlikni tuzatish ulandi"</string>
<string name="adb_active_notification_message" msgid="1016654627626476142">"USB orqali sozlashni o‘chirib qo‘yish uchun bosing."</string>
- <string name="select_input_method" msgid="4653387336791222978">"Matn kiritish usulini tanlang"</string>
- <string name="configure_input_methods" msgid="9091652157722495116">"Kiritish usullarini sozlash"</string>
+ <!-- no translation found for select_input_method (8547250819326693584) -->
+ <skip />
+ <!-- no translation found for configure_input_methods (4769971288371946846) -->
+ <skip />
<string name="use_physical_keyboard" msgid="6203112478095117625">"Tashqi tugmatag"</string>
<string name="hardware" msgid="7517821086888990278">"Qurilma"</string>
<string name="select_keyboard_layout_notification_title" msgid="1407367017263030773">"Tugmalar tartibini tanlash"</string>
@@ -1633,8 +1635,7 @@
<string name="user_switched" msgid="3768006783166984410">"Joriy foydalanuvchi <xliff:g id="NAME">%1$s</xliff:g>."</string>
<string name="owner_name" msgid="2716755460376028154">"Egasi"</string>
<string name="error_message_title" msgid="4510373083082500195">"Xato"</string>
- <!-- no translation found for error_message_change_not_allowed (1347282344200417578) -->
- <skip />
+ <string name="error_message_change_not_allowed" msgid="1347282344200417578">"Ushbu o‘zgarishni amalga oshirish uchun administrator ruxsat bermagan"</string>
<string name="app_not_found" msgid="3429141853498927379">"Ushbu amalni bajaradigan dastur topilmadi"</string>
<string name="revoke" msgid="5404479185228271586">"Boshlang‘ich holatga tiklash"</string>
<string name="mediasize_iso_a0" msgid="1994474252931294172">"ISO A0"</string>
@@ -1765,4 +1766,40 @@
<string name="lock_to_app_unlock_pin" msgid="7908385370846820001">"PIN kod"</string>
<string name="lock_to_app_unlock_pattern" msgid="7763071104790758405">"qulfdan chiqarish chizmasi"</string>
<string name="lock_to_app_unlock_password" msgid="795224196583495868">"parol"</string>
+ <!-- no translation found for description_ustvpg (3666171166900312727) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_d (6552868431924879897) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_l (2427588153488291892) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_s (2556047043212535339) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_v (6647466085048806213) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_fv (4015953953338931020) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_y (2271448022073929890) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_y7 (8931861188215869211) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_g (506861774854051282) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_pg (4238749719629801564) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_14 (6305164472373004907) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_ma (5842074394338699982) -->
+ <skip />
+ <!-- no translation found for description_krtv_all (11497981488871053) -->
+ <skip />
+ <!-- no translation found for description_krtv_7 (6204900788594114856) -->
+ <skip />
+ <!-- no translation found for description_krtv_12 (5134514644432355428) -->
+ <skip />
+ <!-- no translation found for description_krtv_15 (1183692678647313272) -->
+ <skip />
+ <!-- no translation found for description_krtv_19 (7021986912313208481) -->
+ <skip />
+ <!-- no translation found for battery_saver_description (724302068634956656) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-vi/strings.xml b/core/res/res/values-vi/strings.xml
index 0006948..f67cbc4 100644
--- a/core/res/res/values-vi/strings.xml
+++ b/core/res/res/values-vi/strings.xml
@@ -1339,8 +1339,10 @@
<string name="extmedia_format_button_format" msgid="4131064560127478695">"Định dạng"</string>
<string name="adb_active_notification_title" msgid="6729044778949189918">"Gỡ lỗi USB đã được kết nối"</string>
<string name="adb_active_notification_message" msgid="1016654627626476142">"Chạm để vô hiệu hóa gỡ lỗi USB."</string>
- <string name="select_input_method" msgid="4653387336791222978">"Chọn phương thức nhập"</string>
- <string name="configure_input_methods" msgid="9091652157722495116">"Thiết lập phương thức nhập"</string>
+ <!-- no translation found for select_input_method (8547250819326693584) -->
+ <skip />
+ <!-- no translation found for configure_input_methods (4769971288371946846) -->
+ <skip />
<string name="use_physical_keyboard" msgid="6203112478095117625">"Bàn phím thực"</string>
<string name="hardware" msgid="7517821086888990278">"Phần cứng"</string>
<string name="select_keyboard_layout_notification_title" msgid="1407367017263030773">"Chọn bố cục bàn phím"</string>
@@ -1633,8 +1635,7 @@
<string name="user_switched" msgid="3768006783166984410">"Người dùng hiện tại <xliff:g id="NAME">%1$s</xliff:g>."</string>
<string name="owner_name" msgid="2716755460376028154">"Chủ sở hữu"</string>
<string name="error_message_title" msgid="4510373083082500195">"Lỗi"</string>
- <!-- no translation found for error_message_change_not_allowed (1347282344200417578) -->
- <skip />
+ <string name="error_message_change_not_allowed" msgid="1347282344200417578">"Quản trị viên của bạn không cho phép thực hiện thay đổi này"</string>
<string name="app_not_found" msgid="3429141853498927379">"Không tìm thấy ứng dụng nào để xử lý tác vụ này"</string>
<string name="revoke" msgid="5404479185228271586">"Thu hồi"</string>
<string name="mediasize_iso_a0" msgid="1994474252931294172">"ISO A0"</string>
@@ -1765,4 +1766,40 @@
<string name="lock_to_app_unlock_pin" msgid="7908385370846820001">"Mã PIN"</string>
<string name="lock_to_app_unlock_pattern" msgid="7763071104790758405">"hình mở khóa"</string>
<string name="lock_to_app_unlock_password" msgid="795224196583495868">"mật khẩu"</string>
+ <!-- no translation found for description_ustvpg (3666171166900312727) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_d (6552868431924879897) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_l (2427588153488291892) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_s (2556047043212535339) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_v (6647466085048806213) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_fv (4015953953338931020) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_y (2271448022073929890) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_y7 (8931861188215869211) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_g (506861774854051282) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_pg (4238749719629801564) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_14 (6305164472373004907) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_ma (5842074394338699982) -->
+ <skip />
+ <!-- no translation found for description_krtv_all (11497981488871053) -->
+ <skip />
+ <!-- no translation found for description_krtv_7 (6204900788594114856) -->
+ <skip />
+ <!-- no translation found for description_krtv_12 (5134514644432355428) -->
+ <skip />
+ <!-- no translation found for description_krtv_15 (1183692678647313272) -->
+ <skip />
+ <!-- no translation found for description_krtv_19 (7021986912313208481) -->
+ <skip />
+ <!-- no translation found for battery_saver_description (724302068634956656) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-zh-rCN/strings.xml b/core/res/res/values-zh-rCN/strings.xml
index 78520d3..ec3efe5 100644
--- a/core/res/res/values-zh-rCN/strings.xml
+++ b/core/res/res/values-zh-rCN/strings.xml
@@ -1339,8 +1339,10 @@
<string name="extmedia_format_button_format" msgid="4131064560127478695">"格式化"</string>
<string name="adb_active_notification_title" msgid="6729044778949189918">"已连接到USB调试"</string>
<string name="adb_active_notification_message" msgid="1016654627626476142">"触摸可停用USB调试。"</string>
- <string name="select_input_method" msgid="4653387336791222978">"选择输入法"</string>
- <string name="configure_input_methods" msgid="9091652157722495116">"设置输入法"</string>
+ <!-- no translation found for select_input_method (8547250819326693584) -->
+ <skip />
+ <!-- no translation found for configure_input_methods (4769971288371946846) -->
+ <skip />
<string name="use_physical_keyboard" msgid="6203112478095117625">"物理键盘"</string>
<string name="hardware" msgid="7517821086888990278">"硬件"</string>
<string name="select_keyboard_layout_notification_title" msgid="1407367017263030773">"选择键盘布局"</string>
@@ -1395,7 +1397,7 @@
<string name="permlab_createMediaProjection" msgid="4941338725487978112">"创建媒体投影会话"</string>
<string name="permdesc_createMediaProjection" msgid="1284530992706219702">"允许应用创建媒体投影会话。这些会话可让应用截取显示内容和音频内容。普通应用绝不需要此权限。"</string>
<string name="permlab_readInstallSessions" msgid="6165432407628065939">"读取安装会话"</string>
- <string name="permdesc_readInstallSessions" msgid="2049771699626019849">"允许应用读取安装会话。这样,应用将可以查看有关当前程序包安装的详情。"</string>
+ <string name="permdesc_readInstallSessions" msgid="2049771699626019849">"允许应用读取安装会话。这样,应用将可以查看有关当前软件包安装的详情。"</string>
<string name="tutorial_double_tap_to_zoom_message_short" msgid="4070433208160063538">"触摸两次可进行缩放控制"</string>
<string name="gadget_host_error_inflating" msgid="4882004314906466162">"无法添加小部件。"</string>
<string name="ime_action_go" msgid="8320845651737369027">"开始"</string>
@@ -1414,8 +1416,8 @@
<string name="deny" msgid="2081879885755434506">"拒绝"</string>
<string name="permission_request_notification_title" msgid="6486759795926237907">"权限请求"</string>
<string name="permission_request_notification_with_subtitle" msgid="8530393139639560189">"应用对帐户 <xliff:g id="ACCOUNT">%s</xliff:g>\n 提出权限请求。"</string>
- <string name="forward_intent_to_owner" msgid="570916783072215572">"您目前正在个人空间使用此应用"</string>
- <string name="forward_intent_to_work" msgid="8624579696577525279">"您目前正在工作空间使用此应用"</string>
+ <string name="forward_intent_to_owner" msgid="570916783072215572">"您目前是在个人空间内使用此应用"</string>
+ <string name="forward_intent_to_work" msgid="8624579696577525279">"您目前是在工作空间内使用此应用"</string>
<string name="input_method_binding_label" msgid="1283557179944992649">"输入法"</string>
<string name="sync_binding_label" msgid="3687969138375092423">"同步"</string>
<string name="accessibility_binding_label" msgid="4148120742096474641">"辅助功能"</string>
@@ -1626,15 +1628,14 @@
<string name="kg_failed_attempts_almost_at_login" product="default" msgid="1437638152015574839">"您已经 <xliff:g id="NUMBER_0">%d</xliff:g> 次错误地绘制了解锁图案。如果再尝试 <xliff:g id="NUMBER_1">%d</xliff:g> 次后仍不成功,系统就会要求您使用自己的电子邮件帐户解锁手机。\n\n请在 <xliff:g id="NUMBER_2">%d</xliff:g> 秒后重试。"</string>
<string name="kg_text_message_separator" product="default" msgid="4160700433287233771">" — "</string>
<string name="kg_reordering_delete_drop_target_text" msgid="7899202978204438708">"删除"</string>
- <string name="safe_media_volume_warning" product="default" msgid="2276318909314492312">"要将音量提高到建议的音量以上吗?\n\n长时间聆听高音量内容可能会损伤您的听力。"</string>
+ <string name="safe_media_volume_warning" product="default" msgid="2276318909314492312">"要将音量调高到推荐水平以上吗?\n\n长时间保持高音量可能会损伤听力。"</string>
<string name="continue_to_enable_accessibility" msgid="1626427372316070258">"持续按住双指即可启用辅助功能。"</string>
<string name="accessibility_enabled" msgid="1381972048564547685">"辅助功能已启用。"</string>
<string name="enable_accessibility_canceled" msgid="3833923257966635673">"已取消辅助功能。"</string>
<string name="user_switched" msgid="3768006783166984410">"当前用户是<xliff:g id="NAME">%1$s</xliff:g>。"</string>
<string name="owner_name" msgid="2716755460376028154">"机主"</string>
<string name="error_message_title" msgid="4510373083082500195">"错误"</string>
- <!-- no translation found for error_message_change_not_allowed (1347282344200417578) -->
- <skip />
+ <string name="error_message_change_not_allowed" msgid="1347282344200417578">"您的管理员不允许进行此更改"</string>
<string name="app_not_found" msgid="3429141853498927379">"找不到可处理此操作的应用"</string>
<string name="revoke" msgid="5404479185228271586">"撤消"</string>
<string name="mediasize_iso_a0" msgid="1994474252931294172">"ISO A0"</string>
@@ -1765,4 +1766,40 @@
<string name="lock_to_app_unlock_pin" msgid="7908385370846820001">"PIN码"</string>
<string name="lock_to_app_unlock_pattern" msgid="7763071104790758405">"解锁图案"</string>
<string name="lock_to_app_unlock_password" msgid="795224196583495868">"密码"</string>
+ <!-- no translation found for description_ustvpg (3666171166900312727) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_d (6552868431924879897) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_l (2427588153488291892) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_s (2556047043212535339) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_v (6647466085048806213) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_fv (4015953953338931020) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_y (2271448022073929890) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_y7 (8931861188215869211) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_g (506861774854051282) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_pg (4238749719629801564) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_14 (6305164472373004907) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_ma (5842074394338699982) -->
+ <skip />
+ <!-- no translation found for description_krtv_all (11497981488871053) -->
+ <skip />
+ <!-- no translation found for description_krtv_7 (6204900788594114856) -->
+ <skip />
+ <!-- no translation found for description_krtv_12 (5134514644432355428) -->
+ <skip />
+ <!-- no translation found for description_krtv_15 (1183692678647313272) -->
+ <skip />
+ <!-- no translation found for description_krtv_19 (7021986912313208481) -->
+ <skip />
+ <!-- no translation found for battery_saver_description (724302068634956656) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-zh-rHK/strings.xml b/core/res/res/values-zh-rHK/strings.xml
index c493759..e7a18dc 100644
--- a/core/res/res/values-zh-rHK/strings.xml
+++ b/core/res/res/values-zh-rHK/strings.xml
@@ -1339,8 +1339,10 @@
<string name="extmedia_format_button_format" msgid="4131064560127478695">"格式"</string>
<string name="adb_active_notification_title" msgid="6729044778949189918">"已連接 USB 偵錯工具"</string>
<string name="adb_active_notification_message" msgid="1016654627626476142">"輕觸即可停用 USB 偵錯。"</string>
- <string name="select_input_method" msgid="4653387336791222978">"選擇輸入法"</string>
- <string name="configure_input_methods" msgid="9091652157722495116">"設定輸入法"</string>
+ <!-- no translation found for select_input_method (8547250819326693584) -->
+ <skip />
+ <!-- no translation found for configure_input_methods (4769971288371946846) -->
+ <skip />
<string name="use_physical_keyboard" msgid="6203112478095117625">"實體鍵盤"</string>
<string name="hardware" msgid="7517821086888990278">"硬件"</string>
<string name="select_keyboard_layout_notification_title" msgid="1407367017263030773">"選取鍵盤配置"</string>
@@ -1386,10 +1388,10 @@
<string name="permdesc_trust_listener" msgid="8233895334214716864">"允許應用程式聽取信任狀態的變更。"</string>
<string name="permlab_provide_trust_agent" msgid="5465587586091358316">"提供信任的代理程式。"</string>
<string name="permdesc_provide_trust_agent" msgid="3865702641053068148">"允許應用程式提供信任的代理程式。"</string>
- <string name="permlab_launch_trust_agent_settings" msgid="5859430082240410200">"啟動信任代理的程式設定選單。"</string>
+ <string name="permlab_launch_trust_agent_settings" msgid="5859430082240410200">"啟動信任代理程式的設定選單。"</string>
<string name="permdesc_launch_trust_agent_settings" msgid="8185142708644913381">"允許應用程式啟動可變更信任代理程式行為的活動。"</string>
- <string name="permlab_bind_trust_agent_service" msgid="8242093169457695334">"繫結至信任的代理程式服務"</string>
- <string name="permdesc_bind_trust_agent_service" msgid="7041930026024507515">"允許應用程式繫結至信任的代理程式服務。"</string>
+ <string name="permlab_bind_trust_agent_service" msgid="8242093169457695334">"繫結至信任的代理程式"</string>
+ <string name="permdesc_bind_trust_agent_service" msgid="7041930026024507515">"允許應用程式繫結至信任的代理程式。"</string>
<string name="permlab_recovery" msgid="3157024487744125846">"與更新和復原系統互動"</string>
<string name="permdesc_recovery" msgid="8511774533266359571">"允許應用程式與復原系統和系統更新互動。"</string>
<string name="permlab_createMediaProjection" msgid="4941338725487978112">"建立媒體投影工作階段"</string>
@@ -1633,8 +1635,7 @@
<string name="user_switched" msgid="3768006783166984410">"目前的用戶是<xliff:g id="NAME">%1$s</xliff:g>。"</string>
<string name="owner_name" msgid="2716755460376028154">"擁有者"</string>
<string name="error_message_title" msgid="4510373083082500195">"錯誤"</string>
- <!-- no translation found for error_message_change_not_allowed (1347282344200417578) -->
- <skip />
+ <string name="error_message_change_not_allowed" msgid="1347282344200417578">"您的管理員不允許這項變更"</string>
<string name="app_not_found" msgid="3429141853498927379">"找不到處理這項操作的應用程式"</string>
<string name="revoke" msgid="5404479185228271586">"撤銷"</string>
<string name="mediasize_iso_a0" msgid="1994474252931294172">"ISO A0"</string>
@@ -1765,4 +1766,40 @@
<string name="lock_to_app_unlock_pin" msgid="7908385370846820001">"PIN"</string>
<string name="lock_to_app_unlock_pattern" msgid="7763071104790758405">"解鎖圖案"</string>
<string name="lock_to_app_unlock_password" msgid="795224196583495868">"密碼"</string>
+ <!-- no translation found for description_ustvpg (3666171166900312727) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_d (6552868431924879897) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_l (2427588153488291892) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_s (2556047043212535339) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_v (6647466085048806213) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_fv (4015953953338931020) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_y (2271448022073929890) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_y7 (8931861188215869211) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_g (506861774854051282) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_pg (4238749719629801564) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_14 (6305164472373004907) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_ma (5842074394338699982) -->
+ <skip />
+ <!-- no translation found for description_krtv_all (11497981488871053) -->
+ <skip />
+ <!-- no translation found for description_krtv_7 (6204900788594114856) -->
+ <skip />
+ <!-- no translation found for description_krtv_12 (5134514644432355428) -->
+ <skip />
+ <!-- no translation found for description_krtv_15 (1183692678647313272) -->
+ <skip />
+ <!-- no translation found for description_krtv_19 (7021986912313208481) -->
+ <skip />
+ <!-- no translation found for battery_saver_description (724302068634956656) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-zh-rTW/strings.xml b/core/res/res/values-zh-rTW/strings.xml
index 41d8f42..459e968 100644
--- a/core/res/res/values-zh-rTW/strings.xml
+++ b/core/res/res/values-zh-rTW/strings.xml
@@ -1339,8 +1339,10 @@
<string name="extmedia_format_button_format" msgid="4131064560127478695">"格式化"</string>
<string name="adb_active_notification_title" msgid="6729044778949189918">"已連接 USB 偵錯工具"</string>
<string name="adb_active_notification_message" msgid="1016654627626476142">"輕觸即可停用 USB 偵錯。"</string>
- <string name="select_input_method" msgid="4653387336791222978">"選擇輸入法"</string>
- <string name="configure_input_methods" msgid="9091652157722495116">"設定輸入法"</string>
+ <!-- no translation found for select_input_method (8547250819326693584) -->
+ <skip />
+ <!-- no translation found for configure_input_methods (4769971288371946846) -->
+ <skip />
<string name="use_physical_keyboard" msgid="6203112478095117625">"實體鍵盤"</string>
<string name="hardware" msgid="7517821086888990278">"硬體"</string>
<string name="select_keyboard_layout_notification_title" msgid="1407367017263030773">"選取鍵盤配置"</string>
@@ -1633,8 +1635,7 @@
<string name="user_switched" msgid="3768006783166984410">"目前的使用者是 <xliff:g id="NAME">%1$s</xliff:g>。"</string>
<string name="owner_name" msgid="2716755460376028154">"擁有者"</string>
<string name="error_message_title" msgid="4510373083082500195">"錯誤"</string>
- <!-- no translation found for error_message_change_not_allowed (1347282344200417578) -->
- <skip />
+ <string name="error_message_change_not_allowed" msgid="1347282344200417578">"您的管理員不允許這項變更"</string>
<string name="app_not_found" msgid="3429141853498927379">"找不到支援此操作的應用程式"</string>
<string name="revoke" msgid="5404479185228271586">"撤銷"</string>
<string name="mediasize_iso_a0" msgid="1994474252931294172">"ISO A0"</string>
@@ -1765,4 +1766,40 @@
<string name="lock_to_app_unlock_pin" msgid="7908385370846820001">"PIN"</string>
<string name="lock_to_app_unlock_pattern" msgid="7763071104790758405">"解鎖圖形"</string>
<string name="lock_to_app_unlock_password" msgid="795224196583495868">"密碼"</string>
+ <!-- no translation found for description_ustvpg (3666171166900312727) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_d (6552868431924879897) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_l (2427588153488291892) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_s (2556047043212535339) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_v (6647466085048806213) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_fv (4015953953338931020) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_y (2271448022073929890) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_y7 (8931861188215869211) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_g (506861774854051282) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_pg (4238749719629801564) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_14 (6305164472373004907) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_ma (5842074394338699982) -->
+ <skip />
+ <!-- no translation found for description_krtv_all (11497981488871053) -->
+ <skip />
+ <!-- no translation found for description_krtv_7 (6204900788594114856) -->
+ <skip />
+ <!-- no translation found for description_krtv_12 (5134514644432355428) -->
+ <skip />
+ <!-- no translation found for description_krtv_15 (1183692678647313272) -->
+ <skip />
+ <!-- no translation found for description_krtv_19 (7021986912313208481) -->
+ <skip />
+ <!-- no translation found for battery_saver_description (724302068634956656) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-zu/strings.xml b/core/res/res/values-zu/strings.xml
index 5861c16..587eb46 100644
--- a/core/res/res/values-zu/strings.xml
+++ b/core/res/res/values-zu/strings.xml
@@ -1339,8 +1339,10 @@
<string name="extmedia_format_button_format" msgid="4131064560127478695">"Ifomethi"</string>
<string name="adb_active_notification_title" msgid="6729044778949189918">"Ukulungisa iphutha le-USB kuxhunyiwe"</string>
<string name="adb_active_notification_message" msgid="1016654627626476142">"Thinta ukwenza ukuthi ukudibhaga kwe-USB kungasebenzi."</string>
- <string name="select_input_method" msgid="4653387336791222978">"Khetha indlela yokufaka"</string>
- <string name="configure_input_methods" msgid="9091652157722495116">"Izilungiselelo zezindlela zokufakwayo"</string>
+ <!-- no translation found for select_input_method (8547250819326693584) -->
+ <skip />
+ <!-- no translation found for configure_input_methods (4769971288371946846) -->
+ <skip />
<string name="use_physical_keyboard" msgid="6203112478095117625">"Ukwakheka kwekhibhodi"</string>
<string name="hardware" msgid="7517821086888990278">"I-Hardware"</string>
<string name="select_keyboard_layout_notification_title" msgid="1407367017263030773">"Khetha isendlalelo sekhibhodi"</string>
@@ -1384,12 +1386,12 @@
<string name="permdesc_control_keyguard" msgid="3043732290518629061">"Ivumela uhlelo lokusebenza ukuthi lulawule ukhiye wokuqapha."</string>
<string name="permlab_trust_listener" msgid="1765718054003704476">"Lalela izinguquko zesimo sokuthemba."</string>
<string name="permdesc_trust_listener" msgid="8233895334214716864">"Ivumela uhlelo lokusebenza ukuthi lilalelele izinguquko kusimo sethemba."</string>
- <string name="permlab_provide_trust_agent" msgid="5465587586091358316">"Nikeza umsebenzeli owethembekile."</string>
- <string name="permdesc_provide_trust_agent" msgid="3865702641053068148">"Ivumela uhlelo lokusebenza ukunikeza umsebenzeli owethembekile."</string>
- <string name="permlab_launch_trust_agent_settings" msgid="5859430082240410200">"Ivula imenyu yezilungiselelo zomsebenzeli."</string>
- <string name="permdesc_launch_trust_agent_settings" msgid="8185142708644913381">"Ivumela uhlelo lokusebenza ukuqalisa umsebenzi oshintsha ukuziphatha komsebenzeli owethembekile."</string>
- <string name="permlab_bind_trust_agent_service" msgid="8242093169457695334">"Bophezela kusevisi yomenzeli wethemba"</string>
- <string name="permdesc_bind_trust_agent_service" msgid="7041930026024507515">"Ivumela uhlelo lokusebenza ukuthi libophezeleke kusevisi yomenzeli wethemba."</string>
+ <string name="permlab_provide_trust_agent" msgid="5465587586091358316">"Nikeza umsebenzeli wokuthemba."</string>
+ <string name="permdesc_provide_trust_agent" msgid="3865702641053068148">"Ivumela uhlelo lokusebenza ukunikeza umsebenzeli wokuthemba."</string>
+ <string name="permlab_launch_trust_agent_settings" msgid="5859430082240410200">"Ivula imenyu yezilungiselelo zomsebenzeli wokuthemba."</string>
+ <string name="permdesc_launch_trust_agent_settings" msgid="8185142708644913381">"Ivumela uhlelo lokusebenza ukuqalisa umsebenzi oshintsha ukuziphatha komsebenzeli wokuthemba."</string>
+ <string name="permlab_bind_trust_agent_service" msgid="8242093169457695334">"Bophezela kusevisi yomsebenzeli wokuthemba"</string>
+ <string name="permdesc_bind_trust_agent_service" msgid="7041930026024507515">"Ivumela uhlelo lokusebenza ukuthi libophezeleke kusevisi yomsebenzeli wokuthemba."</string>
<string name="permlab_recovery" msgid="3157024487744125846">"Ixhumana nesibuyekezo nesistimu yokutakula"</string>
<string name="permdesc_recovery" msgid="8511774533266359571">"Ivumela uhlelo lokusebenza ukuthi lixhumane nesistimu yokutakula nezibuyekezo zesistimu."</string>
<string name="permlab_createMediaProjection" msgid="4941338725487978112">"Dala isikhathi sephrojekthi semidiya"</string>
@@ -1633,8 +1635,7 @@
<string name="user_switched" msgid="3768006783166984410">"Umsebenzisi wamanje <xliff:g id="NAME">%1$s</xliff:g>."</string>
<string name="owner_name" msgid="2716755460376028154">"Umnikazi"</string>
<string name="error_message_title" msgid="4510373083082500195">"Iphutha"</string>
- <!-- no translation found for error_message_change_not_allowed (1347282344200417578) -->
- <skip />
+ <string name="error_message_change_not_allowed" msgid="1347282344200417578">"Le nguquko ayivumelekile ngomqondisi wakho"</string>
<string name="app_not_found" msgid="3429141853498927379">"Alukho uhlelo lokusebenza olutholakele lokuphatha lesi senzo"</string>
<string name="revoke" msgid="5404479185228271586">"Chitha"</string>
<string name="mediasize_iso_a0" msgid="1994474252931294172">"I-ISO A0"</string>
@@ -1765,4 +1766,40 @@
<string name="lock_to_app_unlock_pin" msgid="7908385370846820001">"IPHINIKHODI"</string>
<string name="lock_to_app_unlock_pattern" msgid="7763071104790758405">"iphethini yokuvula"</string>
<string name="lock_to_app_unlock_password" msgid="795224196583495868">"iphasiwedi"</string>
+ <!-- no translation found for description_ustvpg (3666171166900312727) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_d (6552868431924879897) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_l (2427588153488291892) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_s (2556047043212535339) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_v (6647466085048806213) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_fv (4015953953338931020) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_y (2271448022073929890) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_y7 (8931861188215869211) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_g (506861774854051282) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_pg (4238749719629801564) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_14 (6305164472373004907) -->
+ <skip />
+ <!-- no translation found for description_ustvpg_ma (5842074394338699982) -->
+ <skip />
+ <!-- no translation found for description_krtv_all (11497981488871053) -->
+ <skip />
+ <!-- no translation found for description_krtv_7 (6204900788594114856) -->
+ <skip />
+ <!-- no translation found for description_krtv_12 (5134514644432355428) -->
+ <skip />
+ <!-- no translation found for description_krtv_15 (1183692678647313272) -->
+ <skip />
+ <!-- no translation found for description_krtv_19 (7021986912313208481) -->
+ <skip />
+ <!-- no translation found for battery_saver_description (724302068634956656) -->
+ <skip />
</resources>
diff --git a/core/res/res/values/arrays.xml b/core/res/res/values/arrays.xml
index 1af4d10..327782d 100644
--- a/core/res/res/values/arrays.xml
+++ b/core/res/res/values/arrays.xml
@@ -368,36 +368,30 @@
<item>@drawable/btn_rating_star_off_mtrl_alpha</item>
<item>@drawable/btn_rating_star_on_mtrl_alpha</item>
<item>@drawable/btn_star_mtrl_alpha</item>
- <item>@drawable/btn_switch_to_off_mtrl_000</item>
- <item>@drawable/btn_switch_to_off_mtrl_001</item>
- <item>@drawable/btn_switch_to_off_mtrl_002</item>
- <item>@drawable/btn_switch_to_off_mtrl_003</item>
- <item>@drawable/btn_switch_to_off_mtrl_004</item>
- <item>@drawable/btn_switch_to_off_mtrl_005</item>
- <item>@drawable/btn_switch_to_off_mtrl_006</item>
- <item>@drawable/btn_switch_to_off_mtrl_007</item>
- <item>@drawable/btn_switch_to_off_mtrl_008</item>
- <item>@drawable/btn_switch_to_off_mtrl_009</item>
- <item>@drawable/btn_switch_to_off_mtrl_010</item>
- <item>@drawable/btn_switch_to_off_mtrl_011</item>
- <item>@drawable/btn_switch_to_off_mtrl_012</item>
- <item>@drawable/btn_switch_to_off_mtrl_013</item>
- <item>@drawable/btn_switch_to_off_mtrl_014</item>
- <item>@drawable/btn_switch_to_on_mtrl_000</item>
- <item>@drawable/btn_switch_to_on_mtrl_001</item>
- <item>@drawable/btn_switch_to_on_mtrl_002</item>
- <item>@drawable/btn_switch_to_on_mtrl_003</item>
- <item>@drawable/btn_switch_to_on_mtrl_004</item>
- <item>@drawable/btn_switch_to_on_mtrl_005</item>
- <item>@drawable/btn_switch_to_on_mtrl_006</item>
- <item>@drawable/btn_switch_to_on_mtrl_007</item>
- <item>@drawable/btn_switch_to_on_mtrl_008</item>
- <item>@drawable/btn_switch_to_on_mtrl_009</item>
- <item>@drawable/btn_switch_to_on_mtrl_010</item>
- <item>@drawable/btn_switch_to_on_mtrl_011</item>
- <item>@drawable/btn_switch_to_on_mtrl_012</item>
- <item>@drawable/btn_switch_to_on_mtrl_013</item>
- <item>@drawable/btn_switch_to_on_mtrl_014</item>
+ <item>@drawable/btn_switch_to_off_mtrl_00001</item>
+ <item>@drawable/btn_switch_to_off_mtrl_00002</item>
+ <item>@drawable/btn_switch_to_off_mtrl_00003</item>
+ <item>@drawable/btn_switch_to_off_mtrl_00004</item>
+ <item>@drawable/btn_switch_to_off_mtrl_00005</item>
+ <item>@drawable/btn_switch_to_off_mtrl_00006</item>
+ <item>@drawable/btn_switch_to_off_mtrl_00007</item>
+ <item>@drawable/btn_switch_to_off_mtrl_00008</item>
+ <item>@drawable/btn_switch_to_off_mtrl_00009</item>
+ <item>@drawable/btn_switch_to_off_mtrl_00010</item>
+ <item>@drawable/btn_switch_to_off_mtrl_00011</item>
+ <item>@drawable/btn_switch_to_off_mtrl_00012</item>
+ <item>@drawable/btn_switch_to_on_mtrl_00001</item>
+ <item>@drawable/btn_switch_to_on_mtrl_00002</item>
+ <item>@drawable/btn_switch_to_on_mtrl_00003</item>
+ <item>@drawable/btn_switch_to_on_mtrl_00004</item>
+ <item>@drawable/btn_switch_to_on_mtrl_00005</item>
+ <item>@drawable/btn_switch_to_on_mtrl_00006</item>
+ <item>@drawable/btn_switch_to_on_mtrl_00007</item>
+ <item>@drawable/btn_switch_to_on_mtrl_00008</item>
+ <item>@drawable/btn_switch_to_on_mtrl_00009</item>
+ <item>@drawable/btn_switch_to_on_mtrl_00010</item>
+ <item>@drawable/btn_switch_to_on_mtrl_00011</item>
+ <item>@drawable/btn_switch_to_on_mtrl_00012</item>
<item>@drawable/btn_toggle_indicator_mtrl_alpha</item>
<item>@drawable/expander_close_mtrl_alpha</item>
<item>@drawable/expander_open_mtrl_alpha</item>
diff --git a/core/res/res/values/attrs.xml b/core/res/res/values/attrs.xml
index 5cb3068..2baa599 100644
--- a/core/res/res/values/attrs.xml
+++ b/core/res/res/values/attrs.xml
@@ -464,24 +464,48 @@
<attr name="windowEnterTransition" format="reference"/>
<!-- Reference to a Transition XML resource defining the desired Transition
+ used to move Views out of the scene when the Window is
+ preparing to close. Corresponds to
+ {@link android.view.Window#setReturnTransition(android.transition.Transition)}. -->
+ <attr name="windowReturnTransition" format="reference"/>
+
+ <!-- Reference to a Transition XML resource defining the desired Transition
used to move Views out of the Window's content Scene when launching a new Activity.
Corresponds to
{@link android.view.Window#setExitTransition(android.transition.Transition)}. -->
<attr name="windowExitTransition" format="reference"/>
<!-- Reference to a Transition XML resource defining the desired Transition
+ used to move Views in to the scene when returning from a previously-started Activity.
+ Corresponds to
+ {@link android.view.Window#setReenterTransition(android.transition.Transition)}. -->
+ <attr name="windowReenterTransition" format="reference"/>
+
+ <!-- Reference to a Transition XML resource defining the desired Transition
used to move shared elements transferred into the Window's initial content Scene.
Corresponds to {@link android.view.Window#setSharedElementEnterTransition(
android.transition.Transition)}. -->
<attr name="windowSharedElementEnterTransition" format="reference"/>
<!-- Reference to a Transition XML resource defining the desired Transition
+ used to move shared elements transferred back to a calling Activity.
+ Corresponds to {@link android.view.Window#setSharedElementReturnTransition(
+ android.transition.Transition)}. -->
+ <attr name="windowSharedElementReturnTransition" format="reference"/>
+
+ <!-- Reference to a Transition XML resource defining the desired Transition
used when starting a new Activity to move shared elements prior to transferring
to the called Activity.
Corresponds to {@link android.view.Window#setSharedElementExitTransition(
android.transition.Transition)}. -->
<attr name="windowSharedElementExitTransition" format="reference"/>
+ <!-- Reference to a Transition XML resource defining the desired Transition
+ used for shared elements transferred back to a calling Activity.
+ Corresponds to {@link android.view.Window#setSharedElementReenterTransition(
+ android.transition.Transition)}. -->
+ <attr name="windowSharedElementReenterTransition" format="reference"/>
+
<!-- Flag indicating whether this Window's transition should overlap with
the exiting transition of the calling Activity. Corresponds to
{@link android.view.Window#setAllowEnterTransitionOverlap(boolean)}. -->
@@ -1751,30 +1775,54 @@
or a fraction of the screen size in that dimension. -->
<attr name="windowFixedHeightMajor" format="dimension|fraction" />
<attr name="windowOutsetBottom" format="dimension" />
- <!-- Reference to a TransitionManager XML resource defining the desired Transition
+ <!-- Reference to a Transition XML resource defining the desired Transition
used to move Views into the initial Window's content Scene. Corresponds to
{@link android.view.Window#setEnterTransition(android.transition.Transition)}. -->
<attr name="windowEnterTransition"/>
- <!-- Reference to a TransitionManager XML resource defining the desired Transition
+ <!-- Reference to a Transition XML resource defining the desired Transition
+ used to move Views out of the scene when the Window is
+ preparing to close. Corresponds to
+ {@link android.view.Window#setReturnTransition(android.transition.Transition)}. -->
+ <attr name="windowReturnTransition"/>
+
+ <!-- Reference to a Transition XML resource defining the desired Transition
used to move Views out of the Window's content Scene when launching a new Activity.
Corresponds to
{@link android.view.Window#setExitTransition(android.transition.Transition)}. -->
<attr name="windowExitTransition"/>
- <!-- Reference to a TransitionManager XML resource defining the desired Transition
+ <!-- Reference to a Transition XML resource defining the desired Transition
+ used to move Views in to the scene when returning from a previously-started Activity.
+ Corresponds to
+ {@link android.view.Window#setReenterTransition(android.transition.Transition)}. -->
+ <attr name="windowReenterTransition"/>
+
+ <!-- Reference to a Transition XML resource defining the desired Transition
used to move shared elements transferred into the Window's initial content Scene.
Corresponds to {@link android.view.Window#setSharedElementEnterTransition(
android.transition.Transition)}. -->
<attr name="windowSharedElementEnterTransition"/>
- <!-- Reference to a TransitionManager XML resource defining the desired Transition
+ <!-- Reference to a Transition XML resource defining the desired Transition
+ used to move shared elements transferred back to a calling Activity.
+ Corresponds to {@link android.view.Window#setSharedElementReturnTransition(
+ android.transition.Transition)}. -->
+ <attr name="windowSharedElementReturnTransition"/>
+
+ <!-- Reference to a Transition XML resource defining the desired Transition
used when starting a new Activity to move shared elements prior to transferring
to the called Activity.
Corresponds to {@link android.view.Window#setSharedElementExitTransition(
android.transition.Transition)}. -->
<attr name="windowSharedElementExitTransition"/>
+ <!-- Reference to a Transition XML resource defining the desired Transition
+ used for shared elements transferred back to a calling Activity.
+ Corresponds to {@link android.view.Window#setSharedElementReenterTransition(
+ android.transition.Transition)}. -->
+ <attr name="windowSharedElementReenterTransition"/>
+
<!-- Flag indicating whether this Window's transition should overlap with
the exiting transition of the calling Activity. Corresponds to
@@ -3736,6 +3784,8 @@
<attr name="elegantTextHeight" format="boolean" />
<!-- Text letter-spacing. -->
<attr name="letterSpacing" format="float" />
+ <!-- Font feature settings. -->
+ <attr name="fontFeatureSettings" format="string" />
</declare-styleable>
<declare-styleable name="TextClock">
<!-- Specifies the formatting pattern used to show the time and/or date
@@ -4031,6 +4081,8 @@
<attr name="elegantTextHeight" />
<!-- Text letter-spacing. -->
<attr name="letterSpacing" />
+ <!-- Font feature settings. -->
+ <attr name="fontFeatureSettings" />
</declare-styleable>
<declare-styleable name="TextViewAppearance">
<!-- Base text color, typeface, size, and style. -->
@@ -7211,7 +7263,9 @@
<!-- Component name of an activity that allows the user to modify
the settings for this service. -->
<attr name="settingsActivity" />
- <!-- Type of this service. -->
+ <!-- Component name of an xml file that describes the structure of TV content ratings that
+ this service uses. -->
+ <attr name="contentRatingSystemXml" format="reference" />
</declare-styleable>
<declare-styleable name="ResolverDrawerLayout">
diff --git a/core/res/res/values/config.xml b/core/res/res/values/config.xml
index 217658c..b9e5c66 100644
--- a/core/res/res/values/config.xml
+++ b/core/res/res/values/config.xml
@@ -1661,4 +1661,8 @@
<!--Support decoding the user data payload as pack GSM 8-bit (a GSM alphabet
string that's stored in 8-bit unpacked format) characters.-->
<bool translatable="false" name="config_sms_decode_gsm_8bit_data">false</bool>
+
+ <!-- Package name providing WebView implementation. -->
+ <string name="config_webViewPackageName" translatable="false">com.android.webview</string>
+
</resources>
diff --git a/core/res/res/values/public.xml b/core/res/res/values/public.xml
index 9acd4a6..08398f0 100644
--- a/core/res/res/values/public.xml
+++ b/core/res/res/values/public.xml
@@ -2264,6 +2264,11 @@
<public type="attr" name="toolbarStyle" />
<public type="attr" name="windowClipToOutline" />
<public type="attr" name="datePickerDialogTheme" />
+ <public type="attr" name="showText" />
+ <public type="attr" name="windowReturnTransition" />
+ <public type="attr" name="windowReenterTransition" />
+ <public type="attr" name="windowSharedElementReturnTransition" />
+ <public type="attr" name="windowSharedElementReenterTransition" />
<public-padding type="dimen" name="l_resource_pad" end="0x01050010" />
@@ -2555,4 +2560,6 @@
<public type="raw" name="loaderror" id="0x01100000"/>
<!-- WebView error page for when domain lookup fails. @hide @SystemApi -->
<public type="raw" name="nodomain"/>
+
+ <public type="attr" name="contentRatingSystemXml"/>
</resources>
diff --git a/core/res/res/values/strings.xml b/core/res/res/values/strings.xml
index 11c41e3..8e626e3 100644
--- a/core/res/res/values/strings.xml
+++ b/core/res/res/values/strings.xml
@@ -3754,10 +3754,10 @@
<!-- DO NOT TRANSLATE -->
<string name="locale_replacement">""</string>
- <!-- Title of the pop-up dialog in which the user switches input method components. -->
- <string name="select_input_method">Choose input method</string>
- <!-- Title of a button to open the settings for input methods [CHAR LIMIT=30] -->
- <string name="configure_input_methods">Set up input methods</string>
+ <!-- Title of the pop-up dialog in which the user switches keyboard, also known as input method. -->
+ <string name="select_input_method">Change keyboard</string>
+ <!-- Title of a button to open the settings to enable or disable keyboards, also known as input methods [CHAR LIMIT=30] -->
+ <string name="configure_input_methods">Choose keyboards</string>
<!-- Summary text of a toggle switch to enable/disable use of the physical keyboard in the input method selector [CHAR LIMIT=25] -->
<string name="use_physical_keyboard">Physical keyboard</string>
<!-- Title of the physical keyboard category in the input method selector [CHAR LIMIT=10] -->
@@ -4841,4 +4841,44 @@
<!-- Lock-to-app unlock password string -->
<string name="lock_to_app_unlock_password">password</string>
+ <string name="display_name_ustvpg" translatable="false">US-TV</string>
+ <string name="description_ustvpg">The TV Parental Guidelines</string>
+ <string name="display_name_krtv" translatable="false">KR-TV</string>
+
+ <string name="display_name_ustvpg_d" translatable="false">D</string>
+ <string name="display_name_ustvpg_l" translatable="false">L</string>
+ <string name="display_name_ustvpg_s" translatable="false">S</string>
+ <string name="display_name_ustvpg_v" translatable="false">V</string>
+ <string name="display_name_ustvpg_fv" translatable="false">FV</string>
+ <string name="display_name_ustvpg_y" translatable="false">TV-Y</string>
+ <string name="display_name_ustvpg_y7" translatable="false">TV-Y7</string>
+ <string name="display_name_ustvpg_g" translatable="false">TV-G</string>
+ <string name="display_name_ustvpg_pg" translatable="false">TV-PG</string>
+ <string name="display_name_ustvpg_14" translatable="false">TV-14</string>
+ <string name="display_name_ustvpg_ma" translatable="false">TV-MA</string>
+ <string name="display_name_krtv_all" translatable="false">모든연령시청가</string>
+ <string name="display_name_krtv_7" translatable="false">7세이상시청가</string>
+ <string name="display_name_krtv_12" translatable="false">12세이상시청가</string>
+ <string name="display_name_krtv_15" translatable="false">15세이상시청가</string>
+ <string name="display_name_krtv_19" translatable="false">19세이상시청가</string>
+
+ <string name="description_ustvpg_d">Suggestive dialogue (Usually means talks about sex)</string>
+ <string name="description_ustvpg_l">Coarse language</string>
+ <string name="description_ustvpg_s">Sexual content</string>
+ <string name="description_ustvpg_v">Violence</string>
+ <string name="description_ustvpg_fv">Fantasy violence (Children\'s programming only)</string>
+ <string name="description_ustvpg_y">This program is designed to be appropriate for all children.</string>
+ <string name="description_ustvpg_y7">This program is designed for children age 7 and above.</string>
+ <string name="description_ustvpg_g">Most parents would find this program suitable for all ages.</string>
+ <string name="description_ustvpg_pg">This program contains material that parents may find unsuitable for younger children.</string>
+ <string name="description_ustvpg_14">This program contains some material that many parents would find unsuitable for children under 14 years of age.</string>
+ <string name="description_ustvpg_ma">This program is specifically designed to be viewed by adults and therefore may be unsuitable for children under 17.</string>
+ <string name="description_krtv_all">모든 연령의 시청자가 시청하기에 부적절한 내용이 없는 등급을 말한다.</string>
+ <string name="description_krtv_7">7세미만의 어린이가 시청하기에 부적절한 내용이 포함되어 있어 보호자의 시청지도가 필요한 등급을 말한다.</string>
+ <string name="description_krtv_12">12세미만의 청소년이 시청하기에 부적절한 내용이 포함되어 있어 보호자의 시청지도가 필요한 등급을 말한다.</string>
+ <string name="description_krtv_15">15세미만의 청소년이 시청하기에 부적절한 내용이 포함되어 있어 보호자의 시청지도가 필요한 등급을 말한다.</string>
+ <string name="description_krtv_19">19세미만의 청소년이 시청하기에 부적절한 내용이 포함되어 있어 청소년이 시청할 수 없는 등급을 말한다.</string>
+
+ <!-- [CHAR_LIMIT=NONE] Battery saver: Feature description -->
+ <string name="battery_saver_description">To help improve battery life, battery saver will reduce your device’s performance and restrict background data. Email, messaging, and other apps that rely on syncing may not update unless you open them.\n\nBattery saver turns off automatically when your device is charging.</string>
</resources>
diff --git a/core/res/res/values/styles_material.xml b/core/res/res/values/styles_material.xml
index 61dff1b..9ee377f 100644
--- a/core/res/res/values/styles_material.xml
+++ b/core/res/res/values/styles_material.xml
@@ -537,12 +537,9 @@
<style name="Widget.Material.CompoundButton.Switch">
<item name="track">@drawable/switch_track_material</item>
<item name="thumb">@drawable/switch_thumb_material_anim</item>
- <item name="splitTrack">true</item>
<item name="switchTextAppearance">@style/TextAppearance.Material.Widget.Switch</item>
<item name="textOn">@string/capital_on</item>
<item name="textOff">@string/capital_off</item>
- <item name="switchMinWidth">4dip</item>
- <item name="switchPadding">4dip</item>
<item name="background">?attr/selectableItemBackgroundBorderless</item>
<item name="showText">false</item>
</style>
diff --git a/core/res/res/values/symbols.xml b/core/res/res/values/symbols.xml
index 6e23557..84bc62c 100644
--- a/core/res/res/values/symbols.xml
+++ b/core/res/res/values/symbols.xml
@@ -1195,6 +1195,7 @@
<java-symbol type="layout" name="icon_menu_layout" />
<java-symbol type="layout" name="input_method" />
<java-symbol type="layout" name="input_method_extract_view" />
+ <java-symbol type="layout" name="input_method_switch_item" />
<java-symbol type="layout" name="input_method_switch_dialog_title" />
<java-symbol type="layout" name="js_prompt" />
<java-symbol type="layout" name="list_content_simple" />
@@ -1259,6 +1260,7 @@
<java-symbol type="xml" name="audio_assets" />
<java-symbol type="xml" name="global_keys" />
<java-symbol type="xml" name="default_zen_mode_config" />
+ <java-symbol type="xml" name="tv_content_rating_systems" />
<java-symbol type="raw" name="accessibility_gestures" />
<java-symbol type="raw" name="incognito_mode_start_page" />
@@ -1838,6 +1840,7 @@
<java-symbol type="attr" name="actionModeWebSearchDrawable" />
<java-symbol type="string" name="websearch" />
<java-symbol type="drawable" name="ic_media_video_poster" />
+ <java-symbol type="string" name="config_webViewPackageName" />
<!-- From SubtitleView -->
<java-symbol type="dimen" name="subtitle_corner_radius" />
@@ -1892,6 +1895,7 @@
<java-symbol type="string" name="timepicker_numbers_radius_multiplier_normal" />
<java-symbol type="string" name="timepicker_transition_mid_radius_multiplier" />
<java-symbol type="string" name="timepicker_transition_end_radius_multiplier" />
+ <java-symbol type="string" name="battery_saver_description" />
<java-symbol type="string" name="item_is_selected" />
<java-symbol type="string" name="day_of_week_label_typeface" />
diff --git a/core/res/res/xml/tv_content_rating_systems.xml b/core/res/res/xml/tv_content_rating_systems.xml
new file mode 100644
index 0000000..bd9abb8
--- /dev/null
+++ b/core/res/res/xml/tv_content_rating_systems.xml
@@ -0,0 +1,127 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+/*
+** Copyright 2014, The Android Open Source Project
+**
+** Licensed under the Apache License, Version 2.0 (the "License");
+** you may not use this file except in compliance with the License.
+** You may obtain a copy of the License at
+**
+** http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+** See the License for the specific language governing permissions and
+** limitations under the License.
+*/
+-->
+<rating-system-definitions>
+ <rating-system-definition id="US_TVPG"
+ displayName="@string/display_name_ustvpg"
+ description="@string/description_ustvpg"
+ country="US">
+ <sub-rating-definition id="US_TVPG_D"
+ displayName="@string/display_name_ustvpg_d"
+ description="@string/description_ustvpg_d" />
+ <sub-rating-definition id="US_TVPG_L"
+ displayName="@string/display_name_ustvpg_l"
+ description="@string/description_ustvpg_l" />
+ <sub-rating-definition id="US_TVPG_S"
+ displayName="@string/display_name_ustvpg_s"
+ description="@string/description_ustvpg_s" />
+ <sub-rating-definition id="US_TVPG_V"
+ displayName="@string/display_name_ustvpg_v"
+ description="@string/description_ustvpg_v" />
+ <sub-rating-definition id="US_TVPG_FV"
+ displayName="@string/display_name_ustvpg_fv"
+ description="@string/description_ustvpg_fv" />
+
+ <rating-definition id="US_TVPG_TV_Y"
+ displayName="@string/display_name_ustvpg_y"
+ description="@string/description_ustvpg_y"
+ ageHint="0" />
+ <rating-definition id="US_TVPG_TV_Y7"
+ displayName="@string/display_name_ustvpg_y7"
+ description="@string/description_ustvpg_y7"
+ ageHint="7">
+ <sub-rating id="US_TVPG_FV" />
+ </rating-definition>
+ <rating-definition id="US_TVPG_TV_G"
+ displayName="@string/display_name_ustvpg_g"
+ description="@string/description_ustvpg_g"
+ ageHint="0" />
+ <rating-definition id="US_TVPG_TV_PG"
+ displayName="@string/display_name_ustvpg_pg"
+ description="@string/description_ustvpg_pg"
+ ageHint="14">
+ <sub-rating id="US_TVPG_D" />
+ <sub-rating id="US_TVPG_L" />
+ <sub-rating id="US_TVPG_S" />
+ <sub-rating id="US_TVPG_V" />
+ </rating-definition>
+ <rating-definition id="US_TVPG_TV_14"
+ displayName="@string/display_name_ustvpg_14"
+ description="@string/description_ustvpg_14"
+ ageHint="14">
+ <sub-rating id="US_TVPG_D" />
+ <sub-rating id="US_TVPG_L" />
+ <sub-rating id="US_TVPG_S" />
+ <sub-rating id="US_TVPG_V" />
+ </rating-definition>
+ <rating-definition id="US_TVPG_TV_MA"
+ displayName="@string/display_name_ustvpg_ma"
+ description="@string/description_ustvpg_ma"
+ ageHint="17">
+ <sub-rating id="US_TVPG_L" />
+ <sub-rating id="US_TVPG_S" />
+ <sub-rating id="US_TVPG_V" />
+ </rating-definition>
+ <order>
+ <rating id="US_TVPG_TV_Y" />
+ <rating id="US_TVPG_TV_Y7" />
+ </order>
+ <order>
+ <rating id="US_TVPG_TV_G" />
+ <rating id="US_TVPG_TV_PG" />
+ <rating id="US_TVPG_TV_14" />
+ <rating id="US_TVPG_TV_MA" />
+ </order>
+ </rating-system-definition>
+
+ <rating-system-definition id="KR_TV"
+ displayName="@string/display_name_krtv"
+ country="KR">
+ <rating-definition id="KR_TV_ALL"
+ displayName="@string/display_name_krtv_all"
+ description="@string/description_krtv_all"
+ ageHint="0" />
+ <rating-definition id="KR_TV_7"
+ displayName="@string/display_name_krtv_7"
+ description="@string/description_krtv_7"
+ ageHint="7">
+ </rating-definition>
+ <rating-definition id="KR_TV_12"
+ displayName="@string/display_name_krtv_12"
+ description="@string/description_krtv_12"
+ ageHint="12">
+ </rating-definition>
+ <rating-definition id="KR_TV_15"
+ displayName="@string/display_name_krtv_15"
+ description="@string/description_krtv_15"
+ ageHint="15">
+ </rating-definition>
+ <rating-definition id="KR_TV_19"
+ displayName="@string/display_name_krtv_19"
+ description="@string/description_krtv_19"
+ ageHint="19">
+ </rating-definition>
+ <order>
+ <rating id="KR_TV_ALL" />
+ <rating id="KR_TV_7" />
+ <rating id="KR_TV_12" />
+ <rating id="KR_TV_15" />
+ <rating id="KR_TV_19" />
+ </order>
+ </rating-system-definition>
+</rating-system-definitions>
diff --git a/core/tests/bluetoothtests/src/android/bluetooth/le/AdvertiseDataTest.java b/core/tests/bluetoothtests/src/android/bluetooth/le/AdvertiseDataTest.java
index 5e451ca..e58d905 100644
--- a/core/tests/bluetoothtests/src/android/bluetooth/le/AdvertiseDataTest.java
+++ b/core/tests/bluetoothtests/src/android/bluetooth/le/AdvertiseDataTest.java
@@ -66,7 +66,7 @@
byte[] manufacturerData = new byte[0];
AdvertiseData data =
mAdvertiseDataBuilder.setIncludeDeviceName(true)
- .setManufacturerData(manufacturerId, manufacturerData).build();
+ .addManufacturerData(manufacturerId, manufacturerData).build();
data.writeToParcel(parcel, 0);
parcel.setDataPosition(0);
AdvertiseData dataFromParcel =
@@ -81,7 +81,7 @@
byte[] serviceData = new byte[0];
AdvertiseData data =
mAdvertiseDataBuilder.setIncludeDeviceName(true)
- .setServiceData(uuid, serviceData).build();
+ .addServiceData(uuid, serviceData).build();
data.writeToParcel(parcel, 0);
parcel.setDataPosition(0);
AdvertiseData dataFromParcel =
@@ -117,7 +117,7 @@
AdvertiseData data =
mAdvertiseDataBuilder.setIncludeDeviceName(true)
.addServiceUuid(uuid).addServiceUuid(uuid2)
- .setManufacturerData(manufacturerId, manufacturerData).build();
+ .addManufacturerData(manufacturerId, manufacturerData).build();
data.writeToParcel(parcel, 0);
parcel.setDataPosition(0);
@@ -134,7 +134,7 @@
(byte) 0xF0, 0x00, 0x02, 0x15 };
AdvertiseData data =
mAdvertiseDataBuilder.setIncludeDeviceName(true)
- .setServiceData(uuid, serviceData).build();
+ .addServiceData(uuid, serviceData).build();
data.writeToParcel(parcel, 0);
parcel.setDataPosition(0);
AdvertiseData dataFromParcel =
diff --git a/core/tests/bluetoothtests/src/android/bluetooth/le/ScanRecordTest.java b/core/tests/bluetoothtests/src/android/bluetooth/le/ScanRecordTest.java
index ccdd90a..8b3db7e 100644
--- a/core/tests/bluetoothtests/src/android/bluetooth/le/ScanRecordTest.java
+++ b/core/tests/bluetoothtests/src/android/bluetooth/le/ScanRecordTest.java
@@ -53,13 +53,13 @@
assertEquals("Ped", data.getDeviceName());
assertEquals(-20, data.getTxPowerLevel());
- assertEquals(0x00e0, data.getManufacturerId());
+ assertTrue(data.getManufacturerSpecificData().get(0x00E0) != null);
assertArrayEquals(new byte[] {
- 0x02, 0x15 }, data.getManufacturerSpecificData());
+ 0x02, 0x15 }, data.getManufacturerSpecificData().get(0x00E0));
- assertEquals(uuid2, data.getServiceDataUuid());
+ assertTrue(data.getServiceData().containsKey(uuid2));
assertArrayEquals(new byte[] {
- 0x50, 0x64 }, data.getServiceData());
+ 0x50, 0x64 }, data.getServiceData().get(uuid2));
}
// Assert two byte arrays are equal.
diff --git a/data/fonts/Roboto-Black.ttf b/data/fonts/Roboto-Black.ttf
index 82bc9fc..79b5f74 100644
--- a/data/fonts/Roboto-Black.ttf
+++ b/data/fonts/Roboto-Black.ttf
Binary files differ
diff --git a/data/fonts/Roboto-BlackItalic.ttf b/data/fonts/Roboto-BlackItalic.ttf
index 40f8bc8..4c58b7b 100644
--- a/data/fonts/Roboto-BlackItalic.ttf
+++ b/data/fonts/Roboto-BlackItalic.ttf
Binary files differ
diff --git a/data/fonts/Roboto-Bold.ttf b/data/fonts/Roboto-Bold.ttf
index 2957cd8..58397cc 100644
--- a/data/fonts/Roboto-Bold.ttf
+++ b/data/fonts/Roboto-Bold.ttf
Binary files differ
diff --git a/data/fonts/Roboto-BoldItalic.ttf b/data/fonts/Roboto-BoldItalic.ttf
index 85ff2e9..606252c 100644
--- a/data/fonts/Roboto-BoldItalic.ttf
+++ b/data/fonts/Roboto-BoldItalic.ttf
Binary files differ
diff --git a/data/fonts/Roboto-Italic.ttf b/data/fonts/Roboto-Italic.ttf
index d496291..cc3fd40 100644
--- a/data/fonts/Roboto-Italic.ttf
+++ b/data/fonts/Roboto-Italic.ttf
Binary files differ
diff --git a/data/fonts/Roboto-Light.ttf b/data/fonts/Roboto-Light.ttf
index 1489708..e65c2d2 100644
--- a/data/fonts/Roboto-Light.ttf
+++ b/data/fonts/Roboto-Light.ttf
Binary files differ
diff --git a/data/fonts/Roboto-LightItalic.ttf b/data/fonts/Roboto-LightItalic.ttf
index 2dd300e..d5476e7 100644
--- a/data/fonts/Roboto-LightItalic.ttf
+++ b/data/fonts/Roboto-LightItalic.ttf
Binary files differ
diff --git a/data/fonts/Roboto-Medium.ttf b/data/fonts/Roboto-Medium.ttf
index 8a8e89d..9263090 100644
--- a/data/fonts/Roboto-Medium.ttf
+++ b/data/fonts/Roboto-Medium.ttf
Binary files differ
diff --git a/data/fonts/Roboto-MediumItalic.ttf b/data/fonts/Roboto-MediumItalic.ttf
index 830a471..329aab9 100644
--- a/data/fonts/Roboto-MediumItalic.ttf
+++ b/data/fonts/Roboto-MediumItalic.ttf
Binary files differ
diff --git a/data/fonts/Roboto-Regular.ttf b/data/fonts/Roboto-Regular.ttf
index f392d64..c515eca 100644
--- a/data/fonts/Roboto-Regular.ttf
+++ b/data/fonts/Roboto-Regular.ttf
Binary files differ
diff --git a/data/fonts/Roboto-Thin.ttf b/data/fonts/Roboto-Thin.ttf
index 1b58ba4..35ab525 100644
--- a/data/fonts/Roboto-Thin.ttf
+++ b/data/fonts/Roboto-Thin.ttf
Binary files differ
diff --git a/data/fonts/Roboto-ThinItalic.ttf b/data/fonts/Roboto-ThinItalic.ttf
index 316a9e9..edada2e 100644
--- a/data/fonts/Roboto-ThinItalic.ttf
+++ b/data/fonts/Roboto-ThinItalic.ttf
Binary files differ
diff --git a/data/fonts/RobotoCondensed-Bold.ttf b/data/fonts/RobotoCondensed-Bold.ttf
index 194a710..bcbeece 100644
--- a/data/fonts/RobotoCondensed-Bold.ttf
+++ b/data/fonts/RobotoCondensed-Bold.ttf
Binary files differ
diff --git a/data/fonts/RobotoCondensed-BoldItalic.ttf b/data/fonts/RobotoCondensed-BoldItalic.ttf
index 013640f..7680d0a 100644
--- a/data/fonts/RobotoCondensed-BoldItalic.ttf
+++ b/data/fonts/RobotoCondensed-BoldItalic.ttf
Binary files differ
diff --git a/data/fonts/RobotoCondensed-Italic.ttf b/data/fonts/RobotoCondensed-Italic.ttf
index 42c48aa..04c83a0 100644
--- a/data/fonts/RobotoCondensed-Italic.ttf
+++ b/data/fonts/RobotoCondensed-Italic.ttf
Binary files differ
diff --git a/data/fonts/RobotoCondensed-Light.ttf b/data/fonts/RobotoCondensed-Light.ttf
index 5ca51e8..9f57418 100644
--- a/data/fonts/RobotoCondensed-Light.ttf
+++ b/data/fonts/RobotoCondensed-Light.ttf
Binary files differ
diff --git a/data/fonts/RobotoCondensed-LightItalic.ttf b/data/fonts/RobotoCondensed-LightItalic.ttf
index b788bd7..f9eac04 100644
--- a/data/fonts/RobotoCondensed-LightItalic.ttf
+++ b/data/fonts/RobotoCondensed-LightItalic.ttf
Binary files differ
diff --git a/data/fonts/RobotoCondensed-Regular.ttf b/data/fonts/RobotoCondensed-Regular.ttf
index 573100b..3a06286 100644
--- a/data/fonts/RobotoCondensed-Regular.ttf
+++ b/data/fonts/RobotoCondensed-Regular.ttf
Binary files differ
diff --git a/docs/html/google/google_toc.cs b/docs/html/google/google_toc.cs
index b770135..7cce86b 100644
--- a/docs/html/google/google_toc.cs
+++ b/docs/html/google/google_toc.cs
@@ -138,9 +138,6 @@
<li><a href="<?cs var:toroot?>google/play/billing/billing_admin.html">
<span class="en">Administering In-app Billing</span></a>
</li>
- <li><a href="<?cs var:toroot?>google/play/billing/gp-purchase-status-api.html">
- <span class="en">Purchase Status API</span></a>
- </li>
<li><a href="<?cs var:toroot?>google/play/billing/versions.html">
<span class="en">Version Notes</span></a>
</li>
@@ -205,7 +202,9 @@
<li><a href="<?cs var:toroot ?>google/play/filters.html">
<span class="en">Filters on Google Play</span></a>
</li>
-
+ <li><a href="<?cs var:toroot?>google/play/billing/gp-purchase-status-api.html">
+ <span class="en">Google Play Developer API</span></a>
+ </li>
<li><a href="<?cs var:toroot ?>google/play/publishing/multiple-apks.html">
<span class="en">Multiple APK Support</span></a>
</li>
diff --git a/docs/html/google/play/billing/billing_subscriptions.jd b/docs/html/google/play/billing/billing_subscriptions.jd
index d0e6dc5..3c72da1 100644
--- a/docs/html/google/play/billing/billing_subscriptions.jd
+++ b/docs/html/google/play/billing/billing_subscriptions.jd
@@ -24,6 +24,7 @@
<li><a href="#administering">Configuring Subscriptions Items</a></li>
<li><a href="#cancellation">Cancellation</a></li>
<li><a href="#payment">Payment Processing</a></li>
+ <li><a href="#strategies">Purchase Verification Strategies</a></li>
</ol>
<h2>See also</h2>
<ol>
@@ -325,6 +326,21 @@
{@code orderId} field of the {@code INAPP_PURCHASE_DATA} JSON field (in V3)
or the {@code PURCHASE_STATE_CHANGED} intent (in V2).</p>
+<h2 id="strategies">Purchase Verification Strategies</h2>
+
+<p>In a typical scenario, your app verifies the order status for new purchases
+to ensure that they are valid before granting access to the purchased
+content.</p>
+
+<p>To verify a purchase, the app passes the purchase token and other details up
+to your backend servers, which verifies them directly with Google Play using the
+Purchase Status API. If the backend server determines that the purchase is
+valid, it notifies the app and grants access to the content.</p>
+
+<p>Keep in mind that users will want the ability to use your app at any time,
+including when there may be no network connection available. Make sure that your
+approach to purchase verification accounts for the offline use-case.</p>
+
<h2 id="play-dev-api">Google Play Android Developer API</h2>
<p>Google Play offers an HTTP-based API that lets you remotely query the
@@ -333,4 +349,4 @@
managing subscriptions, as well as extending and integrating subscriptions with
other services.</p>
-<p>For complete information, see <a href="{@docRoot}google/play/billing/gp-purchase-status-api.html">Purchase Status API</a>.</p>
\ No newline at end of file
+<p>For complete information, see <a href="{@docRoot}google/play/billing/gp-purchase-status-api.html">Purchase Status API</a>.</p>
diff --git a/docs/html/google/play/billing/gp-purchase-status-api.jd b/docs/html/google/play/billing/gp-purchase-status-api.jd
index d272301..fa0c397 100644
--- a/docs/html/google/play/billing/gp-purchase-status-api.jd
+++ b/docs/html/google/play/billing/gp-purchase-status-api.jd
@@ -1,38 +1,114 @@
-page.title=Purchase Status API
-page.tags=In-app Billing,Google Play,inapp billing,in app billing,iab,billing
+page.title=Google Play Developer API
+page.tags="In-app Billing", "Google Play", "inapp billing", "in app billing", "iab", "billing", "publishing"
+
@jd:body
<div id="qv-wrapper">
<div id="qv">
<h2>In this document</h2>
+ <!-- TODO: Update TOC -->
<ol>
- <li><a href="#overview">Overview</a></li>
- <li><a href="#using">Using the API</a></li>
- <li><a href="#strategies">Verification Strategies</a></li>
- <li><a href="#practices">Using the API Efficiently</a></li>
+ <li><a href="#publishing_api_overview">Publishing API</a>
+ <li><a href="#subscriptions_api_overview">Subscriptions and In-App
+ Purchases API</a></li>
+ <li><a href="#using">Using the API</a>
+ <li><a href="#edits">Staged Edits</a></li>
+ <li><a href="#practices">Using the API Efficiently</a>
+ <ol>
+ <li><a href="#quota">Quota</a></li>
+ </ol>
+ </li>
</ol>
+
<h2>See also</h2>
<ol>
- <li><a href="https://developers.google.com/android-publisher/v1_1/">Google Play Android Developer API</a></li>
+ <li><a href="https://developers.google.com/android-publisher/">Google Play
+ Developer API</a> documentation</li>
+ <li><a href="https://support.google.com/googleplay/android-developer/answer/6071616">Google
+ Help Center</a> overview of the Google Play Developer API</li>
</ol>
</div>
</div>
-<p>Google Play provides an HTTP-based Purchase Status API that lets
-you remotely query the status of a specific in-app product or subscription,
-or cancel an active subscription. The API is designed to be used from your
-backend servers as a way of securely managing in-app products and
-subscriptions, as well as extending and integrating them with other services.</p>
+<p>The Google Play Developer API is a REST-based web service that allows you to perform publishing
+and app-management tasks. You can use this API to integrate your publishing
+operations with your release-management process.</p>
-<h2 id="overview">Overview</h2>
+<p>Not all developers will need to use these APIs—in most cases you will
+continue to manage your apps directly using the Google Play Developer Console.
+However, if you have a large number of APKs to manage, or have to track user
+purchases and subscriptions, you may find this API very useful.</p>
-<p>With the Purchase Status API you can quickly retrieve the details of any
-purchase using a standard GET request. In the request you supply information
-about the purchase — app package name, purchase or subscription ID,
-and the purchase token. The server responds with a JSON object describing
-the associated purchase details, order status, developer payload, and other
-information.</p>
+<p>Using the Google Play Developer API, you can automate a variety of
+app-management tasks, including:</p>
+
+<ul>
+<li>Uploading and releasing new versions of your app</li>
+<li>Editing your app Google Play Store listings, including localized text and
+ graphics</li>
+<li>Managing your in-app product catalog, your products purchase status and your
+ app subscriptions</li>
+</li>
+</ul>
+
+
+
+<p>The Google Play Developer API lets you focus on designing and developing your
+app, while spending less time and effort managing your releases, even as you
+grow to new markets.</p>
+
+<p>The Google Play Developer API includes two components:</p>
+
+<ul>
+<li>The <a href="#publishing_api_overview">Publishing API</a> lets you upload and publish
+ apps, and perform other publishing-related tasks.</li>
+<li>The <a href="#subscriptions_api_overview">Subscriptions and In-App Purchases
+ API</a> lets you manage in-app purchases and subscriptions. (This was
+ previously known as the "Purchase Status API".)</li>
+</ul>
+
+<h2 id="publishing_api_overview">Publishing API</h2>
+
+<p>
+The Google Play Developer Publishing API allows you to automate frequent tasks
+having to do with app distribution. This provides functions
+similar to those available to a developer through the Google Play
+Developer Console, such
+as:
+</p>
+
+<ul><li>Uploading new versions of an app</li>
+<li>Releasing apps, by assigning APKs to various <em>Tracks</em> (alpha, beta,
+ staged rollout, or production)</li>
+<li>Creating and modifying Google Play Store listings, including localized text
+ and graphics and multi-device screenshots</li></ul>
+
+<p>Those tasks are performed using the
+<a href="#edits">edits</a>
+functionality, which takes a transactional approach to making changes —
+you bundle several changes into a single draft edit, then commit the changes all
+at once. (None of the changes take effect until the edit is committed.)</p>
+
+<p class="note"><strong>Note:</strong> Not all developers will need to use this
+API. All the functionality provided by the API is also available through the
+Google Play
+Developer Console. However, this API lets you integrate your app and listing
+update process with your existing tools, which will be very useful for some
+developers. In particular, if you have a large number of APKs to manage, or
+localized listings in many different locales, you may find this API invaluable.
+</p>
+
+<h2 id="subscriptions_api_overview">Subscriptions and In-App Purchases API</h2>
+
+<p>The API allows you to manage your app's catalog of in-app products and
+subscriptions. In addition, with the Subscriptions and In-App Purchases API you
+can quickly retrieve the
+details of any purchase using a standard GET request. In the request you supply
+information about the purchase — app package name, purchase or
+subscription ID, and the purchase token. The server responds with a JSON object
+describing the associated purchase details, order status, developer payload, and
+other information.</p>
<p>You can use the Purchase Status API in several ways, such as for reporting
and reconciliation of individual orders and for verifying purchases and
@@ -40,101 +116,85 @@
orders and confirm whether in-app products have been consumed, including
whether they were consumed before being cancelled.</p>
-<p>For subscriptions, in addition to querying for order status and expiration,
-you can use the Purchase Status API to remotely cancel a subscription. This is a
-convenient way to manage cancellations on behalf of customers, without
-requiring them to manage the cancellation themselves on their Android devices.</p>
-
-<p>If you plan to use the Purchase Status API, keep in mind that:</p>
-<ul><li>You can use the API to check the status of individual items only
-— bulk requests for order status are not supported at this time.</li>
-<li>You can query for the details of orders placed on or after 12 June 2013,
-but not for orders placed earlier.</li>
-<li>You can query purchases of any item type made with the In-app
-Billing v3 API, or purchases of managed items made with In-app Billing v1 and
-v2. You can not use the Purchase Status API to query purchases of unmanaged items
-made with In-app Billing v1 or v2.</li>
-</ul>
+<p class="note"><strong>Note:</strong> The Subscriptions and In-App
+Purchases API does not use the new, transactional "edits" functionality used by
+the <a href="#publishing_api_overview">Publishing API</a>. Methods for the
+<a href="https://developers.google.com/android-publisher/api-ref/inappproducts">Inappproducts</a>,
+<a href="https://developers.google.com/android-publisher/api-ref/purchases/products">Purchases.products</a>,
+and <a href="https://developers.google.com/android-publisher/api-ref/purchases/subscriptions">Purchases.subscriptions</a>
+resources take effect immediately. Each resource's API reference page notes
+specifically whether the methods for that resource use the "edits"
+model.</p>
<p>The Purchase Status API is part of the <a
-href="https://developers.google.com/android-publisher/v1_1/">Google Play Android
-Developer API v1.1</a>, available through the Google Developers Console. The new version
-of the API supersedes the v1 API, which is deprecated. If you are using the v1
-API, please migrate your operations to the v1.1 API as soon as possible.</p>
-
+href="https://developers.google.com/android-publisher/">Google Play Developer
+API</a> v. 2.0, available through the Google Developers Console.</p>
<h2 id="using">Using the API</h2>
-<p>To use the API, you must first register a project at the <a
-href="https://cloud.google.com/console">Google Developers Console</a> and receive
-a Client ID and shared secret that your app will present when calling the
-API. All calls are authenticated with OAuth 2.0.</p>
+<p>To start making API calls, you’ll set up and manage the Google Play Developer
+API directly from the <a href="https://play.google.com/apps/publish/">Google
+Play Developer Console</a>. The API can only be managed by the owner of your
+Google Play Developer account.</p>
-<p>Once your app is registered, you can access the API directly, using standard
-HTTP methods to retrieve and manipulate resources. The API is built on a RESTful
-design that uses HTTP and JSON. so any standard web stack can send requests and
-parse the responses. However, if you don’t want to send HTTP requests and parse
-responses manually, you can access the API using the Google APIs Client
-Libraries, which provide better language integration, improved security,
-and support for making calls that require user authorization.</p>
+<p>To access the API, you'll need to:</p>
-<p>For more information about the API and how to access it through the Google
-APIs Client Libraries, see the documentation at:</p>
+<ol><li>Set up a new or existing API project</li>
+<li>Set up one or more authorized clients, which can be either:
+<ul>
+ <li><a href="https://developers.google.com/accounts/docs/OAuth2">OAuth
+ clients</a></li>
+ <li><a href="https://developers.google.com/accounts/docs/OAuth2ServiceAccount">
+ service account</a></li>
+</ul></li></ol>
-<p style="margin-left:1.5em;"><a
-href="https://developers.google.com/android-publisher/v1_1/">https://developers.
-google.com/android-publisher/v1_1/</a></p>
+<p>For full details, see the Google Play Developer API
+<a href="https://developers.google.com/android-publisher/getting_started">Getting
+Started</a> page.</p>
-<h3 id="quota">Quota</h3>
+<h2 id="edits">Staged Edits</h2>
-<p>Applications using the Google Play Android Developer API are limited to an
-initial courtesy usage quota of <strong>200,000 requests per day</strong> (per
-application). This should provide enough access for normal
-subscription-validation needs, assuming that you follow the recommendation in
-this section.</p>
+<p>The Google Play Developer Publishing API Edits methods allow you to prepare
+and commit changes to your Google Play apps. Once your update is ready to go,
+you can deploy it with a single operation. The changes you can make include:</p>
-<p>If you need to request a higher limit for your application, see the
-instructions in the <a
-href="https://developers.google.com/console/help/new/#trafficcontrols">Google Developers
-Console Help</a>.
-Also, please read the section below on design best practices for minimizing your
-use of the API.</p>
+<ul>
+ <li>Uploading one or more APKs</li>
+ <li>Assigning different APKs to different “tracks”: alpha, beta, staged
+ rollout, and production</li>
+ <li>Creating and modifying localized store listings for the app</li>
+ <li>Uploading screenshots and other images for the app’s store listings</li>
+</ul>
-<h3 id="auth">Authorization</h3>
+<p>Once all the desired changes have been staged, they are all committed with a
+single operation.</p>
-<p>Calls to the Google Play Android Developer API require authorization. Google
-uses the OAuth 2.0 protocol to allow authorized applications to access user
-data. To learn more, see <a
-href="https://developers.google.com/android-publisher/authorization">Authorization</a>
-in the Google Play Android Developer API documentation.</p>
+<p>For full details on staged edits, see the Google Play Developer API
+<a href="https://developers.google.com/android-publisher/edits/">Edits</a>
+page.</p>
-<h2 id="strategies">Purchase Verification Strategies</h2>
-
-<p>In a typical scenario, your app verifies the order status for new purchases
-to ensure that they are valid before granting access to the purchased content.</p>
-
-<p>To verify a purchase, the app passes the purchase token and other details up
-to your backend servers, which verifies them directly with Google Play using the
-Purchase Status API. For security reasons, the app should not normally attempt to verify
-the purchase itself using the Purchase Status API.</p>
-
-<p>If the backend server determines that the purchase is valid, it notifies the
-app and grants access to the content. For improved performance, the backend servers
-should store the purchase details and order status in a local database, updated at
-intervals or as-needed.</p>
-
-<p>Keep in mind that users will want the ability to use your app at any time, including
-when there may be no network connection available. Make sure that your approach to
-purchase verification accounts for the offline use-case.</p>
+<p class="note"><strong>Note:</strong> The new, transactional "edits"
+functionality is only used by the <a href="#publishing_api_overview">Publishing
+API</a>. Methods for the <a href="#subscriptions_api_overview">Subscriptions and
+In-App Purchases API</a> take effect immediately. Each resource's API reference
+page notes specifically whether the methods for that resource use the "edits"
+model.</p>
<h2 id="practices">Using the API Efficiently</h2>
-<p>Access to the Google Play Android Developer API is regulated to help ensure a
-high-performance environment for all applications that use it. While you can
+<p>Access to the Google Play Developer API is regulated to help ensure a
+high-performance environment for all applications that use it (as described in
+<a href="#quota">Quota</a>). While you can
request a higher daily quota for your application, we highly recommend that you
-minimize your access using the techniques below. </p>
+minimize your access using these techniques: </p>
<ul>
+ <li><em>Limit the number of app updates</em> — Do not publish alpha or beta
+ updates more frequently than once a day. (Production apps should be updated
+ even less frequently than that.) Every update costs your users time and
+ possibly money. If you update too frequently, users will start ignoring
+ updates, or even uninstall the product. (Of course, if there's a major problem
+ with your app, go ahead and fix it.)</li>
<li><em>Query the Purchase Status API for new purchases only</em> — At
purchase, your app can pass the purchase token and other details to your backend
servers, which can use the Purchase Status API to verify the purchase.</li>
@@ -163,6 +223,15 @@
</ul>
<p>By following those general guidelines, your implementation will offer the
-best possible performance for users and minimize use of the <a
-href="https://developers.google.com/android-publisher/v1_1/">Google Play Android
-Developer API</a>.</p>
+best possible performance for users.</p>
+
+<h3 id="quota">Quota</h3>
+
+<p>Applications using the Google Play Developer API are limited to an
+initial courtesy usage quota of <strong>200,000 requests per day</strong> (per
+application). This should provide enough access for publishing activities and
+normal subscription-validation needs.</p>
+
+<p>If you need to request a higher limit for your application, use the "Request
+more" link on the <strong>Quotas</strong>
+pane of the Google Developers Console.</p>
diff --git a/docs/html/google/play/billing/index.jd b/docs/html/google/play/billing/index.jd
index dce20cb..18b1523 100644
--- a/docs/html/google/play/billing/index.jd
+++ b/docs/html/google/play/billing/index.jd
@@ -14,7 +14,11 @@
<div class="sidebox">
<h2><strong>New in In-App Billing</strong></h2>
<ul>
- <li><strong>Purchase Status API</strong>—The <a href="{@docRoot}google/play/billing/gp-purchase-status-api.html">Purchase Status API</a> lets you query the status of in-app product or subscription purchases. </li>
+ <li><strong>Google Play Developer API</strong>—The
+ <a href="{@docRoot}google/play/billing/gp-purchase-status-api.html">Google
+ Play Developer API</a> allows you to perform a number of publishing and
+ app-management tasks. It includes the functionality previously known as the
+ <em>Purchase Status API.</em> </li>
<li><strong>In-app Billing Version 3</strong>—The <a href="{@docRoot}google/play/billing/api.html">latest version</a> of In-app Billing features a synchronous API that is easier to implement and lets you manage in-app products and subscriptions more effectively.</li>
<li><strong>Subscriptions now supported in Version 3</strong>—You can query and launch purchase flows for subscription items using the V3 API.</li>
<li><strong>Free trials</strong>—You can now offer users a configurable <a href="/google/play/billing/v2/billing_subscriptions.html#trials">free trial period</a> for your in-app subscriptions. You can set up trials with a simple change in the Developer Console—no change to your app code is needed.</li>
diff --git a/docs/html/google/play/dist.jd b/docs/html/google/play/dist.jd
index b4efe40..f1ad834 100644
--- a/docs/html/google/play/dist.jd
+++ b/docs/html/google/play/dist.jd
@@ -49,4 +49,12 @@
<p>Protect your revenue streams and integrate policies for usage into your app.
</p><a href="{@docRoot}google/play/licensing/index.html">Learn more »</a>
</div>
-</div>
\ No newline at end of file
+ <div class="layout-content-col span-6">
+ <h4>
+ Google Play Developer API
+ </h4>
+ <p>Integrate your publishing operations with your release-management
+ process.
+ </p><a href="{@docRoot}google/play/billing/gp-purchase-status-api.html">Learn more »</a>
+ </div>
+</div>
diff --git a/docs/html/preview/preview_toc.cs b/docs/html/preview/preview_toc.cs
index a505905..819976e 100644
--- a/docs/html/preview/preview_toc.cs
+++ b/docs/html/preview/preview_toc.cs
@@ -68,6 +68,8 @@
Recommendations</a></li>
</ul>
</li>
+ <li><a href="<?cs var:toroot ?>preview/tv/tif/index.html">
+ TV Input Framework</a></li>
<li><a href="<?cs var:toroot ?>preview/tv/games/index.html">
Games on TV</a></li>
<li><a href="<?cs var:toroot ?>preview/tv/start/hardware-features.html">
diff --git a/docs/html/preview/tv/adt-1/index.jd b/docs/html/preview/tv/adt-1/index.jd
index 882f421..b37a55a 100644
--- a/docs/html/preview/tv/adt-1/index.jd
+++ b/docs/html/preview/tv/adt-1/index.jd
@@ -52,16 +52,16 @@
</p>
<p>Unplug the included power cable from the back of ADT-1. The device does not have an on/off
switch. However, ADT-1 will begin sleeping (daydream) based on user settings in
- <strong>Settings > Display > Daydream</strong>.
+ <strong>Settings > Device > Display > Daydream</strong>.
</p>
<p>
<strong>How do I connect to the network?</strong>
</p>
<p>ADT-1 has both wireless and Ethernet for connecting to your network. To change your wireless
- network, go to <strong>Settings -> Wi-Fi</strong>. To use an Ethernet network connection,
- simply plug an Ethernet cable (that is connected to your network) into the port on the back of
- ADT-1.</p>
+ network, go to <strong>Settings > Device > Wi-Fi</strong>. To use an Ethernet network
+ connection, simply plug an Ethernet cable (that is connected to your network) into the port on
+ the back of ADT-1.</p>
<p>
<strong>How do I use the developer cable?</strong>
@@ -70,6 +70,35 @@
power port on the back of ADT-1, a standard male USB-A connector that connects your PC, and a
small, female power connector that the included power supply plugs into.</p>
+<p class="note">
+ <strong>Note:</strong> Make sure you have enabled USB debugging in <strong>Settings >
+ Preferences > Developer options > Debugging > USB debugging</strong>, so that you can
+ use the Android Debug Bridge (adb) to connect with the ADT-1 device.
+</p>
+
+<p id="adb-tcp">
+ <strong>Can I connect without a developer cable?</strong>
+</p>
+<p>
+ Yes. The ADT-1 device is enabled for Android Debug Bridge (adb) connections over TCP/IP. To
+ connect to the ADT-1 device using this method:
+</p>
+<ol>
+ <li>Make sure that your development computer and the ADT-1 device are on the same network.</li>
+ <li>Determine the IP address of the ADT-1 device by navigating to <strong>Settings >
+ Device > Wi-Fi > your-network-name > Status info</strong>.</li>
+ <li>Connect to the ADT-1 device using the following adb command:
+<pre>
+$ adb connect <ip-address-for-adt-1>:4321
+</pre>
+ </li>
+</ol>
+
+<p class="note">
+ <strong>Note:</strong> Make sure you have enabled USB debugging in <strong>Settings >
+ Preferences > Developer options > Debugging > USB debugging</strong>, so that you can
+ use the Android Debug Bridge (adb) to connect with the ADT-1 device.
+</p>
<h3 id="input">User Input</h3>
@@ -179,8 +208,8 @@
<strong>How do I register my ADT-1 in order to run my apps?</strong>
</p>
<ol>
- <li>Go to <strong>Settings > Google Cast</strong> and turn on developer support, allowing the
- ADT-1 device to send its serial number to Google.</li>
+ <li>Go to <strong>Settings > Device > Google Cast</strong> and turn on developer support,
+ allowing the ADT-1 device to send its serial number to Google.</li>
<li>Register your ADT-1 device in the Google Cast Developer Console, using the 12 character
serial number engraved on the back of the ADT-1.</li>
</ol>
@@ -203,8 +232,8 @@
<p>
<strong>Why doesn't the on-screen keyboard come up?</strong>
</p>
-<p>Enable the keyboard in the device Settings. Go to <strong>Settings > Keyboard > Current
- keyboard</strong> and choose <strong>Leanback keyboard</strong>.
+<p>Enable the keyboard in the device Settings. Go to <strong>Settings > Preferences >
+ Keyboard > Current keyboard</strong> and choose <strong>Leanback keyboard</strong>.
<p>
<strong>How do I perform a hardware reboot?</strong>
@@ -221,8 +250,8 @@
data, downloaded apps, app data, and account settings.
</p>
-<p>From the home screen, go to <strong>Settings > Device > Factory data reset</strong>, and
- select <strong>Reset device</strong>.
+<p>From the home screen, go to <strong>Settings > Device > Storage & Reset</strong>, and
+ select <strong>Factory data reset</strong>.
</p>
<p>
@@ -279,4 +308,3 @@
<li><a href="regulatory.html">Regulatory Disclosures</a></li>
<li><a href="safety.html">Important Safety Information</a></li>
</ul>
-
diff --git a/docs/html/preview/tv/images/tif-overview.png b/docs/html/preview/tv/images/tif-overview.png
new file mode 100644
index 0000000..197775e
--- /dev/null
+++ b/docs/html/preview/tv/images/tif-overview.png
Binary files differ
diff --git a/docs/html/preview/tv/tif/index.jd b/docs/html/preview/tv/tif/index.jd
new file mode 100644
index 0000000..ef02def
--- /dev/null
+++ b/docs/html/preview/tv/tif/index.jd
@@ -0,0 +1,38 @@
+page.title=TV Input Framework
+page.tags=tif
+
+@jd:body
+
+<p>
+ Watching live television shows and other continuous, channel-based content is a big part of the
+ TV experience. Android supports receiving and playback of live video content through the TV Input
+ Framework. This framework provides a unified method for receiving audio and video channel content
+ from hardware sources, such as HDMI ports and built-in-tuners, and software sources, such as
+ video streamed over the internet.
+</p>
+<p>
+ The framework enables developers to define live TV input sources by implementing a TV input
+ service. This service publishes a list of channels and programs to the TV Provider. The live TV
+ app on a TV device gets the list of available channels and programs from the TV Provider and
+ displays them to a user. When a user selects a specific channel, the live TV app creates a
+ session for the associated TV input service through the TV Input Manager, and tells the TV input
+ service to tune to the requested channel and play the content to a display surface provided by
+ the TV app.
+</p>
+
+<img src="{@docRoot}preview/tv/images/tif-overview.png" id="figure1">
+<p class="img-caption">
+ <strong>Figure 1.</strong> Functional diagram of the TV Input Framework
+</p>
+
+<p>
+ The TV Input Framework is designed to provide access to a wide variety of live TV input sources
+ and bring them together in a single user interface for users to browse, view, and enjoy content.
+ Building a TV input service for your content can help make it more accessible on TV devices.
+</p>
+
+<p>
+ The APIs for the TV Input Framework are available in the L Developer Preview and you can
+ review them in the preview API reference docs. However, more changes are planned, so stay tuned
+ for additional information with the official Android platform launch.
+</p>
diff --git a/graphics/java/android/graphics/NinePatch.java b/graphics/java/android/graphics/NinePatch.java
index 335bce0..3bccf08 100644
--- a/graphics/java/android/graphics/NinePatch.java
+++ b/graphics/java/android/graphics/NinePatch.java
@@ -43,7 +43,7 @@
@SuppressWarnings({"UnusedDeclaration"}) // called from JNI
InsetStruct(int opticalLeft, int opticalTop, int opticalRight, int opticalBottom,
int outlineLeft, int outlineTop, int outlineRight, int outlineBottom,
- float outlineRadius, boolean outlineFilled, float decodeScale) {
+ float outlineRadius, int outlineAlpha, float decodeScale) {
opticalRect = new Rect(opticalLeft, opticalTop, opticalRight, opticalBottom);
outlineRect = new Rect(outlineLeft, outlineTop, outlineRight, outlineBottom);
@@ -55,13 +55,13 @@
outlineRect.scaleRoundIn(decodeScale);
}
this.outlineRadius = outlineRadius * decodeScale;
- this.outlineFilled = outlineFilled;
+ this.outlineAlpha = outlineAlpha / 255.0f;
}
public final Rect opticalRect;
public final Rect outlineRect;
public final float outlineRadius;
- public final boolean outlineFilled;
+ public final float outlineAlpha;
}
private final Bitmap mBitmap;
diff --git a/graphics/java/android/graphics/Outline.java b/graphics/java/android/graphics/Outline.java
index 3a4c2a7..1cf5f37 100644
--- a/graphics/java/android/graphics/Outline.java
+++ b/graphics/java/android/graphics/Outline.java
@@ -37,9 +37,8 @@
public Rect mRect;
/** @hide */
public float mRadius;
-
/** @hide */
- public boolean mIsFilled;
+ public float mAlpha;
/**
* Constructs an empty Outline. Call one of the setter methods to make
@@ -63,7 +62,6 @@
mPath = null;
mRect = null;
mRadius = 0;
- mIsFilled = true;
}
/**
@@ -92,24 +90,24 @@
}
/**
- * Sets whether the outline represents a fully opaque area.
+ * Sets the alpha represented by the Outline.
*
- * A filled outline is assumed, by the drawing system, to fully cover content beneath it,
- * meaning content beneath may be optimized away.
+ * Content producing a fully opaque (alpha = 1.0f) outline is assumed, by the drawing system,
+ * to fully cover content beneath it, meaning content beneath may be optimized away.
*
* @hide
*/
- public void setFilled(boolean isFilled) {
- mIsFilled = isFilled;
+ public void setAlpha(float alpha) {
+ mAlpha = alpha;
}
/**
- * Returns whether the outline represents a fully opaque area.
+ * Sets the alpha represented by the Outline.
*
* @hide
*/
- public boolean isFilled() {
- return !isEmpty() && mIsFilled;
+ public float getAlpha() {
+ return mAlpha;
}
/**
@@ -132,7 +130,7 @@
mRect.set(src.mRect);
}
mRadius = src.mRadius;
- mIsFilled = src.mIsFilled;
+ mAlpha = src.mAlpha;
}
/**
@@ -164,7 +162,6 @@
mRect.set(left, top, right, bottom);
mRadius = radius;
mPath = null;
- mIsFilled = true;
}
/**
@@ -193,7 +190,6 @@
mPath.reset();
mPath.addOval(left, top, right, bottom, Path.Direction.CW);
mRect = null;
- mIsFilled = true;
}
/**
@@ -220,6 +216,5 @@
mPath.set(convexPath);
mRect = null;
mRadius = -1.0f;
- mIsFilled = true;
}
}
diff --git a/graphics/java/android/graphics/Paint.java b/graphics/java/android/graphics/Paint.java
index 58a1bf2..ca8d736 100644
--- a/graphics/java/android/graphics/Paint.java
+++ b/graphics/java/android/graphics/Paint.java
@@ -51,6 +51,7 @@
private float mInvCompatScaling;
private Locale mLocale;
+ private String mFontFeatureSettings;
/**
* @hide
@@ -474,6 +475,7 @@
mBidiFlags = BIDI_DEFAULT_LTR;
setTextLocale(Locale.getDefault());
setElegantTextHeight(false);
+ mFontFeatureSettings = null;
}
/**
@@ -513,6 +515,7 @@
mBidiFlags = paint.mBidiFlags;
mLocale = paint.mLocale;
+ mFontFeatureSettings = paint.mFontFeatureSettings;
}
/** @hide */
@@ -1283,6 +1286,37 @@
}
/**
+ * Get font feature settings. Default is null.
+ *
+ * @return the paint's currently set font feature settings.
+ * @hide
+ */
+ public String getFontFeatureSettings() {
+ return mFontFeatureSettings;
+ }
+
+ /**
+ * Set font feature settings.
+ *
+ * The format is the same as the CSS font-feature-settings attribute:
+ * http://dev.w3.org/csswg/css-fonts/#propdef-font-feature-settings
+ *
+ * @param settings the font feature settings string to use, may be null.
+ * @hide
+ */
+ public void setFontFeatureSettings(String settings) {
+ if (settings != null && settings.equals("")) {
+ settings = null;
+ }
+ if ((settings == null && mFontFeatureSettings == null)
+ || (settings != null && settings.equals(mFontFeatureSettings))) {
+ return;
+ }
+ mFontFeatureSettings = settings;
+ native_setFontFeatureSettings(mNativePaint, settings);
+ }
+
+ /**
* Return the distance above (negative) the baseline (ascent) based on the
* current typeface and text size.
*
@@ -2259,4 +2293,6 @@
private static native float native_getLetterSpacing(long native_object);
private static native void native_setLetterSpacing(long native_object,
float letterSpacing);
+ private static native void native_setFontFeatureSettings(long native_object,
+ String settings);
}
diff --git a/graphics/java/android/graphics/drawable/Drawable.java b/graphics/java/android/graphics/drawable/Drawable.java
index acb34c2..df9f3c3 100644
--- a/graphics/java/android/graphics/drawable/Drawable.java
+++ b/graphics/java/android/graphics/drawable/Drawable.java
@@ -861,16 +861,14 @@
* This method is called by the default {@link android.view.ViewOutlineProvider} to define
* the outline of the View.
* <p>
- * The default behavior defines the outline to be the bounding rectangle. Subclasses that wish
- * to convey a different shape must override this method.
- *
- * @return true if this drawable actually has an outline, else false. The outline must be
- * populated by the drawable if true is returned.
+ * The default behavior defines the outline to be the bounding rectangle of 0 alpha.
+ * Subclasses that wish to convey a different shape or alpha value must override this method.
*
* @see android.view.View#setOutlineProvider(android.view.ViewOutlineProvider)
*/
public void getOutline(@NonNull Outline outline) {
outline.setRect(getBounds());
+ outline.setAlpha(getAlpha() / 255.0f);
}
/**
diff --git a/graphics/java/android/graphics/drawable/GradientDrawable.java b/graphics/java/android/graphics/drawable/GradientDrawable.java
index 4815586..a383aab 100644
--- a/graphics/java/android/graphics/drawable/GradientDrawable.java
+++ b/graphics/java/android/graphics/drawable/GradientDrawable.java
@@ -1413,6 +1413,7 @@
public void getOutline(Outline outline) {
final GradientState st = mGradientState;
final Rect bounds = getBounds();
+ outline.setAlpha(mAlpha / 255.0f);
switch (st.mShape) {
case RECTANGLE:
diff --git a/graphics/java/android/graphics/drawable/LayerDrawable.java b/graphics/java/android/graphics/drawable/LayerDrawable.java
index 073100a..d094ce4 100644
--- a/graphics/java/android/graphics/drawable/LayerDrawable.java
+++ b/graphics/java/android/graphics/drawable/LayerDrawable.java
@@ -595,12 +595,9 @@
}
/**
- * Populates <code>outline</code> with the first available layer outline.
- * Returns <code>true</code> if an outline is available, <code>false</code>
- * otherwise.
+ * Populates <code>outline</code> with the first available (non-empty) layer outline.
*
* @param outline Outline in which to place the first available layer outline
- * @return <code>true</code> if an outline is available
*/
@Override
public void getOutline(@NonNull Outline outline) {
diff --git a/graphics/java/android/graphics/drawable/NinePatchDrawable.java b/graphics/java/android/graphics/drawable/NinePatchDrawable.java
index 241ec65..3397e94 100644
--- a/graphics/java/android/graphics/drawable/NinePatchDrawable.java
+++ b/graphics/java/android/graphics/drawable/NinePatchDrawable.java
@@ -245,9 +245,8 @@
final int restoreAlpha;
if (mNinePatchState.mBaseAlpha != 1.0f) {
- final Paint p = getPaint();
- restoreAlpha = p.getAlpha();
- p.setAlpha((int) (restoreAlpha * mNinePatchState.mBaseAlpha + 0.5f));
+ restoreAlpha = mPaint.getAlpha();
+ mPaint.setAlpha((int) (restoreAlpha * mNinePatchState.mBaseAlpha + 0.5f));
} else {
restoreAlpha = -1;
}
@@ -297,7 +296,7 @@
bounds.right - outlineInsets.right,
bounds.bottom - outlineInsets.bottom,
insets.outlineRadius);
- outline.setFilled(insets.outlineFilled);
+ outline.setAlpha(insets.outlineAlpha * (getAlpha() / 255.0f));
return;
}
}
@@ -445,6 +444,16 @@
// Hey, now might be a good time to actually load optical bounds!
bitmap.getOpticalInsets(opticalInsets);
+ // Sanity check for valid padding when we have optical insets.
+ if (padding.left < opticalInsets.left) {
+ padding.left = opticalInsets.left;
+ padding.right = opticalInsets.right;
+ }
+ if (padding.top < opticalInsets.top) {
+ padding.top = opticalInsets.top;
+ padding.bottom = opticalInsets.bottom;
+ }
+
state.mNinePatch = new NinePatch(bitmap, bitmap.getNinePatchChunk());
state.mPadding = padding;
state.mOpticalInsets = Insets.of(opticalInsets);
@@ -611,6 +620,16 @@
mOpticalInsets = Insets.of(opticalInsets);
mDither = dither;
mAutoMirrored = autoMirror;
+
+ // Sanity check for valid padding when we have optical insets.
+ if (mPadding.left < mOpticalInsets.left) {
+ mPadding.left = mOpticalInsets.left;
+ mPadding.right = mOpticalInsets.right;
+ }
+ if (mPadding.top < mOpticalInsets.top) {
+ mPadding.top = mOpticalInsets.top;
+ mPadding.bottom = mOpticalInsets.bottom;
+ }
}
// Copy constructor
diff --git a/graphics/java/android/graphics/drawable/RippleDrawable.java b/graphics/java/android/graphics/drawable/RippleDrawable.java
index eb7291c..cf675ed 100644
--- a/graphics/java/android/graphics/drawable/RippleDrawable.java
+++ b/graphics/java/android/graphics/drawable/RippleDrawable.java
@@ -585,11 +585,9 @@
/**
* Populates <code>outline</code> with the first available layer outline,
- * excluding the mask layer. Returns <code>true</code> if an outline is
- * available, <code>false</code> otherwise.
+ * excluding the mask layer.
*
* @param outline Outline in which to place the first available layer outline
- * @return <code>true</code> if an outline is available
*/
@Override
public void getOutline(@NonNull Outline outline) {
diff --git a/graphics/java/android/graphics/drawable/ShapeDrawable.java b/graphics/java/android/graphics/drawable/ShapeDrawable.java
index 2bed3b0..394f584 100644
--- a/graphics/java/android/graphics/drawable/ShapeDrawable.java
+++ b/graphics/java/android/graphics/drawable/ShapeDrawable.java
@@ -470,6 +470,7 @@
public void getOutline(Outline outline) {
if (mShapeState.mShape != null) {
mShapeState.mShape.getOutline(outline);
+ outline.setAlpha(getAlpha() / 255.0f);
}
}
diff --git a/graphics/java/android/graphics/drawable/VectorDrawable.java b/graphics/java/android/graphics/drawable/VectorDrawable.java
index f41b11a..be02c9b 100644
--- a/graphics/java/android/graphics/drawable/VectorDrawable.java
+++ b/graphics/java/android/graphics/drawable/VectorDrawable.java
@@ -364,13 +364,19 @@
/** @hide */
public static VectorDrawable create(Resources resources, int rid) {
try {
- final XmlPullParser xpp = resources.getXml(rid);
- final AttributeSet attrs = Xml.asAttributeSet(xpp);
- final XmlPullParserFactory factory = XmlPullParserFactory.newInstance();
- factory.setNamespaceAware(true);
+ final XmlPullParser parser = resources.getXml(rid);
+ final AttributeSet attrs = Xml.asAttributeSet(parser);
+ int type;
+ while ((type=parser.next()) != XmlPullParser.START_TAG &&
+ type != XmlPullParser.END_DOCUMENT) {
+ // Empty loop
+ }
+ if (type != XmlPullParser.START_TAG) {
+ throw new XmlPullParserException("No start tag found");
+ }
final VectorDrawable drawable = new VectorDrawable();
- drawable.inflate(resources, xpp, attrs);
+ drawable.inflate(resources, parser, attrs);
return drawable;
} catch (XmlPullParserException e) {
@@ -436,10 +442,10 @@
if (pathRenderer.mViewportWidth <= 0) {
throw new XmlPullParserException(a.getPositionDescription() +
- "<viewport> tag requires viewportWidth > 0");
+ "<vector> tag requires viewportWidth > 0");
} else if (pathRenderer.mViewportHeight <= 0) {
throw new XmlPullParserException(a.getPositionDescription() +
- "<viewport> tag requires viewportHeight > 0");
+ "<vector> tag requires viewportHeight > 0");
}
pathRenderer.mBaseWidth = a.getDimension(
@@ -449,10 +455,10 @@
if (pathRenderer.mBaseWidth <= 0) {
throw new XmlPullParserException(a.getPositionDescription() +
- "<size> tag requires width > 0");
+ "<vector> tag requires width > 0");
} else if (pathRenderer.mBaseHeight <= 0) {
throw new XmlPullParserException(a.getPositionDescription() +
- "<size> tag requires height > 0");
+ "<vector> tag requires height > 0");
}
}
diff --git a/libs/hwui/Outline.h b/libs/hwui/Outline.h
index 83426e8..6dacd5ed 100644
--- a/libs/hwui/Outline.h
+++ b/libs/hwui/Outline.h
@@ -28,18 +28,20 @@
Outline()
: mShouldClip(false)
, mType(kOutlineType_None)
- , mRadius(0) {}
+ , mRadius(0)
+ , mAlpha(0.0f) {}
- void setRoundRect(int left, int top, int right, int bottom, float radius) {
+ void setRoundRect(int left, int top, int right, int bottom, float radius, float alpha) {
mType = kOutlineType_RoundRect;
mBounds.set(left, top, right, bottom);
mRadius = radius;
mPath.reset();
mPath.addRoundRect(SkRect::MakeLTRB(left, top, right, bottom),
radius, radius);
+ mAlpha = alpha;
}
- void setConvexPath(const SkPath* outline) {
+ void setConvexPath(const SkPath* outline, float alpha) {
if (!outline) {
setEmpty();
return;
@@ -47,22 +49,29 @@
mType = kOutlineType_ConvexPath;
mPath = *outline;
mBounds.set(outline->getBounds());
+ mAlpha = alpha;
}
void setEmpty() {
mType = kOutlineType_Empty;
mPath.reset();
+ mAlpha = 0.0f;
}
void setNone() {
mType = kOutlineType_None;
mPath.reset();
+ mAlpha = 0.0f;
}
bool isEmpty() const {
return mType == kOutlineType_Empty;
}
+ float getAlpha() const {
+ return mAlpha;
+ }
+
void setShouldClip(bool clip) {
mShouldClip = clip;
}
@@ -103,6 +112,7 @@
OutlineType mType;
Rect mBounds;
float mRadius;
+ float mAlpha;
SkPath mPath;
};
diff --git a/libs/hwui/RenderNode.cpp b/libs/hwui/RenderNode.cpp
index 0662ca2..fa1b21d 100644
--- a/libs/hwui/RenderNode.cpp
+++ b/libs/hwui/RenderNode.cpp
@@ -594,7 +594,12 @@
template <class T>
void RenderNode::issueDrawShadowOperation(const Matrix4& transformFromParent, T& handler) {
- if (properties().getAlpha() <= 0.0f || !properties().getOutline().getPath()) return;
+ if (properties().getAlpha() <= 0.0f
+ || properties().getOutline().getAlpha() <= 0.0f
+ || !properties().getOutline().getPath()) {
+ // no shadow to draw
+ return;
+ }
mat4 shadowMatrixXY(transformFromParent);
applyViewPropertyTransforms(shadowMatrixXY);
@@ -607,8 +612,9 @@
const SkPath* revealClipPath = properties().getRevealClip().getPath();
if (revealClipPath && revealClipPath->isEmpty()) return;
+ float casterAlpha = properties().getAlpha() * properties().getOutline().getAlpha();
DisplayListOp* shadowOp = new (handler.allocator()) DrawShadowOp(
- shadowMatrixXY, shadowMatrixZ, properties().getAlpha(),
+ shadowMatrixXY, shadowMatrixZ, casterAlpha,
outlinePath, revealClipPath);
handler(shadowOp, PROPERTY_SAVECOUNT, properties().getClipToBounds());
}
diff --git a/media/java/android/media/AudioAttributes.java b/media/java/android/media/AudioAttributes.java
index 099cd3f..1225fd1 100644
--- a/media/java/android/media/AudioAttributes.java
+++ b/media/java/android/media/AudioAttributes.java
@@ -19,6 +19,7 @@
import android.annotation.IntDef;
import android.os.Parcel;
import android.os.Parcelable;
+import android.text.TextUtils;
import android.util.Log;
import java.lang.annotation.Retention;
@@ -257,12 +258,7 @@
aa.mSource = mSource;
aa.mFlags = mFlags;
aa.mTags = (HashSet<String>) mTags.clone();
- final Iterator<String> tagIterator = mTags.iterator();
- String allTagsInOne = new String();
- while (tagIterator.hasNext()) {
- allTagsInOne += tagIterator.next() + ";";
- }
- aa.mFormattedTags = allTagsInOne;
+ aa.mFormattedTags = TextUtils.join(";", mTags);
return aa;
}
@@ -503,12 +499,14 @@
boolean hasFlattenedTags = ((in.readInt() & FLATTEN_TAGS) == FLATTEN_TAGS);
mTags = new HashSet<String>();
if (hasFlattenedTags) {
- mTags.add(in.readString());
+ mFormattedTags = new String(in.readString());
+ mTags.add(mFormattedTags);
} else {
String[] tagsArray = in.readStringArray();
for (int i = tagsArray.length - 1 ; i >= 0 ; i--) {
mTags.add(tagsArray[i]);
}
+ mFormattedTags = TextUtils.join(";", mTags);
}
}
@@ -535,7 +533,7 @@
+ " usage=" + mUsage
+ " content=" + mContentType
+ " flags=0x" + Integer.toHexString(mFlags).toUpperCase()
- + " tags=" + mTags);
+ + " tags=" + mFormattedTags);
}
/** @hide */
diff --git a/media/java/android/media/AudioDevicePort.java b/media/java/android/media/AudioDevicePort.java
index c088906..7975e04 100644
--- a/media/java/android/media/AudioDevicePort.java
+++ b/media/java/android/media/AudioDevicePort.java
@@ -82,4 +82,12 @@
}
return super.equals(o);
}
+
+ @Override
+ public String toString() {
+ return "{" + super.toString()
+ + ", mType:" + mType
+ + ", mAddress: " + mAddress
+ + "}";
+ }
}
diff --git a/media/java/android/media/AudioFormat.java b/media/java/android/media/AudioFormat.java
index 2a612e8..8d99d6a1 100644
--- a/media/java/android/media/AudioFormat.java
+++ b/media/java/android/media/AudioFormat.java
@@ -263,18 +263,39 @@
private int mChannelMask;
private int mPropertySetMask;
- /** @hide */
+ /**
+ * Return the encoding.
+ * @return one of the values that can be set in {@link Builder#setEncoding(int)} or
+ * {@link AudioFormat#ENCODING_INVALID} if not set.
+ */
public int getEncoding() {
+ if ((mPropertySetMask & AUDIO_FORMAT_HAS_PROPERTY_ENCODING) == 0) {
+ return ENCODING_INVALID;
+ }
return mEncoding;
}
- /** @hide */
+ /**
+ * Return the sample rate.
+ * @return one of the values that can be set in {@link Builder#setSampleRate(int)} or
+ * 0 if not set.
+ */
public int getSampleRate() {
+ if ((mPropertySetMask & AUDIO_FORMAT_HAS_PROPERTY_SAMPLE_RATE) == 0) {
+ return 0;
+ }
return mSampleRate;
}
- /** @hide */
+ /**
+ * Return the channel mask.
+ * @return one of the values that can be set in {@link Builder#setChannelMask(int)} or
+ * {@link AudioFormat#CHANNEL_INVALID} if not set.
+ */
public int getChannelMask() {
+ if ((mPropertySetMask & AUDIO_FORMAT_HAS_PROPERTY_CHANNEL_MASK) == 0) {
+ return CHANNEL_INVALID;
+ }
return mChannelMask;
}
diff --git a/media/java/android/media/AudioHandle.java b/media/java/android/media/AudioHandle.java
index b58e7a3..6493dac 100644
--- a/media/java/android/media/AudioHandle.java
+++ b/media/java/android/media/AudioHandle.java
@@ -46,4 +46,9 @@
public int hashCode() {
return mId;
}
+
+ @Override
+ public String toString() {
+ return Integer.toString(mId);
+ }
}
diff --git a/media/java/android/media/AudioPort.java b/media/java/android/media/AudioPort.java
index 8b748422..53212aa 100644
--- a/media/java/android/media/AudioPort.java
+++ b/media/java/android/media/AudioPort.java
@@ -173,5 +173,11 @@
public int hashCode() {
return mHandle.hashCode();
}
-}
+ @Override
+ public String toString() {
+ return "{mHandle:" + mHandle
+ + ", mRole:" + mRole
+ + "}";
+ }
+}
diff --git a/media/java/android/media/AudioPortConfig.java b/media/java/android/media/AudioPortConfig.java
index 5dc768d..f937cc2 100644
--- a/media/java/android/media/AudioPortConfig.java
+++ b/media/java/android/media/AudioPortConfig.java
@@ -90,4 +90,14 @@
public AudioGainConfig gain() {
return mGain;
}
+
+ @Override
+ public String toString() {
+ return "{mPort:" + mPort
+ + ", mSamplingRate:" + mSamplingRate
+ + ", mChannelMask: " + mChannelMask
+ + ", mFormat:" + mFormat
+ + ", mGain:" + mGain
+ + "}";
+ }
}
diff --git a/media/java/android/media/MediaCodec.java b/media/java/android/media/MediaCodec.java
index 275d9b2..4a1c0ae 100644
--- a/media/java/android/media/MediaCodec.java
+++ b/media/java/android/media/MediaCodec.java
@@ -34,6 +34,7 @@
import java.nio.ByteBuffer;
import java.nio.ReadOnlyBufferException;
import java.util.Arrays;
+import java.util.HashMap;
import java.util.Map;
/**
@@ -531,9 +532,13 @@
public native final Surface createInputSurface();
/**
- * After successfully configuring the component, call start. On return
- * you can query the component for its input/output buffers.
- * @throws IllegalStateException if not in the Configured state.
+ * After successfully configuring the component, call {@code start}.
+ * <p>
+ * Call {@code start} also if the codec is configured in asynchronous mode,
+ * and it has just been flushed, to resume requesting input buffers.
+ * @throws IllegalStateException if not in the Configured state
+ * or just after {@link #flush} for a codec that is configured
+ * in asynchronous mode.
* @throws MediaCodec.CodecException upon codec error. Note that some codec errors
* for start may be attributed to future method calls.
*/
@@ -569,6 +574,15 @@
* Flush both input and output ports of the component, all indices
* previously returned in calls to {@link #dequeueInputBuffer} and
* {@link #dequeueOutputBuffer} become invalid.
+ * <p>
+ * If codec is configured in asynchronous mode, call {@link #start}
+ * after {@code flush} has returned to resume codec operations. The
+ * codec will not request input buffers until this has happened.
+ * <p>
+ * If codec is configured in synchronous mode, codec will resume
+ * automatically if an input surface was created. Otherwise, it
+ * will resume when {@link #dequeueInputBuffer} is called.
+ *
* @throws IllegalStateException if not in the Executing state.
* @throws MediaCodec.CodecException upon codec error.
*/
@@ -576,10 +590,8 @@
synchronized(mBufferLock) {
invalidateByteBuffers(mCachedInputBuffers);
invalidateByteBuffers(mCachedOutputBuffers);
- invalidateByteBuffers(mDequeuedInputBuffers);
- invalidateByteBuffers(mDequeuedOutputBuffers);
- freeImages(mDequeuedInputImages);
- freeImages(mDequeuedOutputImages);
+ mDequeuedInputBuffers.clear();
+ mDequeuedOutputBuffers.clear();
}
native_flush();
}
@@ -719,7 +731,7 @@
throws CryptoException {
synchronized(mBufferLock) {
invalidateByteBuffer(mCachedInputBuffers, index);
- updateDequeuedByteBuffer(mDequeuedInputBuffers, index, null);
+ mDequeuedInputBuffers.remove(index);
}
native_queueInputBuffer(
index, offset, size, presentationTimeUs, flags);
@@ -839,7 +851,7 @@
int flags) throws CryptoException {
synchronized(mBufferLock) {
invalidateByteBuffer(mCachedInputBuffers, index);
- updateDequeuedByteBuffer(mDequeuedInputBuffers, index, null);
+ mDequeuedInputBuffers.remove(index);
}
native_queueSecureInputBuffer(
index, offset, info, presentationTimeUs, flags);
@@ -859,7 +871,8 @@
* for the availability of an input buffer if timeoutUs < 0 or wait up
* to "timeoutUs" microseconds if timeoutUs > 0.
* @param timeoutUs The timeout in microseconds, a negative timeout indicates "infinite".
- * @throws IllegalStateException if not in the Executing state.
+ * @throws IllegalStateException if not in the Executing state,
+ * or codec is configured in asynchronous mode.
* @throws MediaCodec.CodecException upon codec error.
*/
public final int dequeueInputBuffer(long timeoutUs) {
@@ -907,7 +920,8 @@
* decoded or one of the INFO_* constants below.
* @param info Will be filled with buffer meta data.
* @param timeoutUs The timeout in microseconds, a negative timeout indicates "infinite".
- * @throws IllegalStateException if not in the Executing state.
+ * @throws IllegalStateException if not in the Executing state,
+ * or codec is configured in asynchronous mode.
* @throws MediaCodec.CodecException upon codec error.
*/
public final int dequeueOutputBuffer(
@@ -946,7 +960,7 @@
public final void releaseOutputBuffer(int index, boolean render) {
synchronized(mBufferLock) {
invalidateByteBuffer(mCachedOutputBuffers, index);
- updateDequeuedByteBuffer(mDequeuedOutputBuffers, index, null);
+ mDequeuedOutputBuffers.remove(index);
}
releaseOutputBuffer(index, render, false /* updatePTS */, 0 /* dummy */);
}
@@ -1003,7 +1017,7 @@
public final void releaseOutputBuffer(int index, long renderTimestampNs) {
synchronized(mBufferLock) {
invalidateByteBuffer(mCachedOutputBuffers, index);
- updateDequeuedByteBuffer(mDequeuedOutputBuffers, index, null);
+ mDequeuedOutputBuffers.remove(index);
}
releaseOutputBuffer(
index, true /* render */, true /* updatePTS */, renderTimestampNs);
@@ -1068,17 +1082,82 @@
private native final Map<String, Object> getOutputFormatNative(int index);
+ // used to track dequeued buffers
+ private static class BufferMap {
+ // various returned representations of the codec buffer
+ private static class CodecBuffer {
+ private Image mImage;
+ private ByteBuffer mByteBuffer;
+
+ public void free() {
+ if (mByteBuffer != null) {
+ // all of our ByteBuffers are direct
+ java.nio.NioUtils.freeDirectBuffer(mByteBuffer);
+ mByteBuffer = null;
+ }
+ if (mImage != null) {
+ mImage.close();
+ mImage = null;
+ }
+ }
+
+ public void setImage(Image image) {
+ free();
+ mImage = image;
+ }
+
+ public void setByteBuffer(ByteBuffer buffer) {
+ free();
+ mByteBuffer = buffer;
+ }
+ }
+
+ private final Map<Integer, CodecBuffer> mMap =
+ new HashMap<Integer, CodecBuffer>();
+
+ public void remove(int index) {
+ CodecBuffer buffer = mMap.get(index);
+ if (buffer != null) {
+ buffer.free();
+ mMap.remove(index);
+ }
+ }
+
+ public void put(int index, ByteBuffer newBuffer) {
+ CodecBuffer buffer = mMap.get(index);
+ if (buffer == null) { // likely
+ buffer = new CodecBuffer();
+ mMap.put(index, buffer);
+ }
+ buffer.setByteBuffer(newBuffer);
+ }
+
+ public void put(int index, Image newImage) {
+ CodecBuffer buffer = mMap.get(index);
+ if (buffer == null) { // likely
+ buffer = new CodecBuffer();
+ mMap.put(index, buffer);
+ }
+ buffer.setImage(newImage);
+ }
+
+ public void clear() {
+ for (CodecBuffer buffer: mMap.values()) {
+ buffer.free();
+ }
+ mMap.clear();
+ }
+ }
+
private ByteBuffer[] mCachedInputBuffers;
private ByteBuffer[] mCachedOutputBuffers;
- private ByteBuffer[] mDequeuedInputBuffers;
- private ByteBuffer[] mDequeuedOutputBuffers;
- private Image[] mDequeuedInputImages;
- private Image[] mDequeuedOutputImages;
+ private final BufferMap mDequeuedInputBuffers = new BufferMap();
+ private final BufferMap mDequeuedOutputBuffers = new BufferMap();
final private Object mBufferLock;
private final void invalidateByteBuffer(
ByteBuffer[] buffers, int index) {
- if (index >= 0 && index < buffers.length) {
+ if (buffers != null && index >= 0 && index < buffers.length) {
ByteBuffer buffer = buffers[index];
if (buffer != null) {
buffer.setAccessible(false);
@@ -1088,7 +1167,7 @@
private final void validateInputByteBuffer(
ByteBuffer[] buffers, int index) {
- if (index >= 0 && index < buffers.length) {
+ if (buffers != null && index >= 0 && index < buffers.length) {
ByteBuffer buffer = buffers[index];
if (buffer != null) {
buffer.setAccessible(true);
@@ -1099,7 +1178,7 @@
private final void validateOutputByteBuffer(
ByteBuffer[] buffers, int index, BufferInfo info) {
- if (index >= 0 && index < buffers.length) {
+ if (buffers != null && index >= 0 && index < buffers.length) {
ByteBuffer buffer = buffers[index];
if (buffer != null) {
buffer.setAccessible(true);
@@ -1133,46 +1212,29 @@
}
}
- private final void freeImage(Image image) {
- if (image != null) {
- image.close();
- }
- }
-
- private final void freeImages(Image[] images) {
- if (images != null) {
- for (Image image: images) {
- freeImage(image);
- }
- }
- }
-
private final void freeAllTrackedBuffers() {
- freeByteBuffers(mCachedInputBuffers);
- freeByteBuffers(mCachedOutputBuffers);
- freeImages(mDequeuedInputImages);
- freeImages(mDequeuedOutputImages);
- freeByteBuffers(mDequeuedInputBuffers);
- freeByteBuffers(mDequeuedOutputBuffers);
- mCachedInputBuffers = null;
- mCachedOutputBuffers = null;
- mDequeuedInputImages = null;
- mDequeuedOutputImages = null;
- mDequeuedInputBuffers = null;
- mDequeuedOutputBuffers = null;
+ synchronized (mBufferLock) {
+ freeByteBuffers(mCachedInputBuffers);
+ freeByteBuffers(mCachedOutputBuffers);
+ mCachedInputBuffers = null;
+ mCachedOutputBuffers = null;
+ mDequeuedInputBuffers.clear();
+ mDequeuedOutputBuffers.clear();
+ }
}
private final void cacheBuffers(boolean input) {
- ByteBuffer[] buffers = getBuffers(input);
- invalidateByteBuffers(buffers);
+ ByteBuffer[] buffers = null;
+ try {
+ buffers = getBuffers(input);
+ invalidateByteBuffers(buffers);
+ } catch (IllegalStateException e) {
+ // we don't get buffers in async mode
+ }
if (input) {
mCachedInputBuffers = buffers;
- mDequeuedInputImages = new Image[buffers.length];
- mDequeuedInputBuffers = new ByteBuffer[buffers.length];
} else {
mCachedOutputBuffers = buffers;
- mDequeuedOutputImages = new Image[buffers.length];
- mDequeuedOutputBuffers = new ByteBuffer[buffers.length];
}
}
@@ -1188,7 +1250,8 @@
* <b>Note:</b>As of API 21, dequeued input buffers are
* automatically {@link java.nio.Buffer#clear cleared}.
*
- * @throws IllegalStateException if not in the Executing state.
+ * @throws IllegalStateException if not in the Executing state,
+ * or codec is configured in asynchronous mode.
* @throws MediaCodec.CodecException upon codec error.
*/
public ByteBuffer[] getInputBuffers() {
@@ -1227,26 +1290,6 @@
return mCachedOutputBuffers;
}
- private boolean updateDequeuedByteBuffer(
- ByteBuffer[] buffers, int index, ByteBuffer newBuffer) {
- if (index < 0 || index >= buffers.length) {
- return false;
- }
- freeByteBuffer(buffers[index]);
- buffers[index] = newBuffer;
- return newBuffer != null;
- }
-
- private boolean updateDequeuedImage(
- Image[] images, int index, Image newImage) {
- if (index < 0 || index >= images.length) {
- return false;
- }
- freeImage(images[index]);
- images[index] = newImage;
- return newImage != null;
- }
-
/**
* Returns a {@link java.nio.Buffer#clear cleared}, writable ByteBuffer
* object for a dequeued input buffer index to contain the input data.
@@ -1268,13 +1311,10 @@
public ByteBuffer getInputBuffer(int index) {
ByteBuffer newBuffer = getBuffer(true /* input */, index);
synchronized(mBufferLock) {
- if (updateDequeuedByteBuffer(mDequeuedInputBuffers, index, newBuffer)) {
- updateDequeuedImage(mDequeuedInputImages, index, null);
- invalidateByteBuffer(mCachedInputBuffers, index);
- return newBuffer;
- }
+ invalidateByteBuffer(mCachedInputBuffers, index);
+ mDequeuedInputBuffers.put(index, newBuffer);
}
- return null;
+ return newBuffer;
}
/**
@@ -1298,12 +1338,11 @@
*/
public Image getInputImage(int index) {
Image newImage = getImage(true /* input */, index);
- if (updateDequeuedImage(mDequeuedInputImages, index, newImage)) {
- updateDequeuedByteBuffer(mDequeuedInputBuffers, index, null);
+ synchronized(mBufferLock) {
invalidateByteBuffer(mCachedInputBuffers, index);
- return newImage;
+ mDequeuedInputBuffers.put(index, newImage);
}
- return null;
+ return newImage;
}
/**
@@ -1328,13 +1367,10 @@
public ByteBuffer getOutputBuffer(int index) {
ByteBuffer newBuffer = getBuffer(false /* input */, index);
synchronized(mBufferLock) {
- if (updateDequeuedByteBuffer(mDequeuedOutputBuffers, index, newBuffer)) {
- updateDequeuedImage(mDequeuedOutputImages, index, null);
- invalidateByteBuffer(mCachedOutputBuffers, index);
- return newBuffer;
- }
+ invalidateByteBuffer(mCachedOutputBuffers, index);
+ mDequeuedOutputBuffers.put(index, newBuffer);
}
- return null;
+ return newBuffer;
}
/**
@@ -1358,13 +1394,10 @@
public Image getOutputImage(int index) {
Image newImage = getImage(false /* input */, index);
synchronized(mBufferLock) {
- if (updateDequeuedImage(mDequeuedOutputImages, index, newImage)) {
- updateDequeuedByteBuffer(mDequeuedOutputBuffers, index, null);
- invalidateByteBuffer(mCachedOutputBuffers, index);
- return newImage;
- }
+ invalidateByteBuffer(mCachedOutputBuffers, index);
+ mDequeuedOutputBuffers.put(index, newImage);
}
- return null;
+ return newImage;
}
/**
@@ -1445,7 +1478,12 @@
* a valid callback should be provided before {@link #configure} is called.
*
* When asynchronous callback is enabled, the client should not call
- * {@link #dequeueInputBuffer(long)} or {@link #dequeueOutputBuffer(BufferInfo, long)}
+ * {@link #getInputBuffers}, {@link #getOutputBuffers},
+ * {@link #dequeueInputBuffer(long)} or {@link #dequeueOutputBuffer(BufferInfo, long)}.
+ * <p>
+ * Also, {@link #flush} behaves differently in asynchronous mode. After calling
+ * {@code flush}, you must call {@link #start} to "resume" receiving input buffers,
+ * even if an input surface was created.
*
* @param cb The callback that will run.
*/
diff --git a/media/java/android/media/browse/MediaBrowserItem.java b/media/java/android/media/browse/MediaBrowserItem.java
index d0a0342..47ec46b 100644
--- a/media/java/android/media/browse/MediaBrowserItem.java
+++ b/media/java/android/media/browse/MediaBrowserItem.java
@@ -135,6 +135,19 @@
}
}
+ @Override
+ public String toString() {
+ final StringBuilder sb = new StringBuilder("MediaBrowserItem{");
+ sb.append("mUri=").append(mUri);
+ sb.append(", mFlags=").append(mFlags);
+ sb.append(", mTitle=").append(mTitle);
+ sb.append(", mSummary=").append(mSummary);
+ sb.append(", mIconUri=").append(mIconUri);
+ sb.append(", mIconResourceId=").append(mIconResourceId);
+ sb.append('}');
+ return sb.toString();
+ }
+
public static final Parcelable.Creator<MediaBrowserItem> CREATOR =
new Parcelable.Creator<MediaBrowserItem>() {
@Override
diff --git a/media/java/android/media/tv/ITvInputClient.aidl b/media/java/android/media/tv/ITvInputClient.aidl
index c48ddf1..2c39afa 100644
--- a/media/java/android/media/tv/ITvInputClient.aidl
+++ b/media/java/android/media/tv/ITvInputClient.aidl
@@ -34,6 +34,7 @@
void onSessionEvent(in String name, in Bundle args, int seq);
void onChannelRetuned(in Uri channelUri, int seq);
void onTrackInfoChanged(in List<TvTrackInfo> tracks, int seq);
+ void onTrackSelectionChanged(in List<TvTrackInfo> selectedTracks, int seq);
void onVideoAvailable(int seq);
void onVideoUnavailable(int reason, int seq);
void onContentAllowed(int seq);
diff --git a/media/java/android/media/tv/ITvInputHardware.aidl b/media/java/android/media/tv/ITvInputHardware.aidl
index f35e8f3..3a04161 100644
--- a/media/java/android/media/tv/ITvInputHardware.aidl
+++ b/media/java/android/media/tv/ITvInputHardware.aidl
@@ -33,6 +33,7 @@
* trigger CEC commands for adjusting active HDMI source. Returns true on success.
*/
boolean setSurface(in Surface surface, in TvStreamConfig config);
+
/**
* Set volume for this stream via AudioGain. (TBD)
*/
@@ -43,4 +44,21 @@
* HDMI CEC commands. If the hardware is not representing an HDMI port, this method will fail.
*/
boolean dispatchKeyEventToHdmi(in KeyEvent event);
+
+ /**
+ * Override default audio sink from audio policy. When override is on, it is
+ * TvInputService's responsibility to adjust to audio configuration change
+ * (for example, when the audio sink becomes unavailable or more desirable
+ * audio sink is detected).
+ *
+ * @param audioType one of AudioManager.DEVICE_* values. When it's * DEVICE_NONE, override
+ * becomes off.
+ * @param audioAddress audio address of the overriding device.
+ * @param samplingRate desired sampling rate. Use default when it's 0.
+ * @param channelMask desired channel mask. Use default when it's
+ * AudioFormat.CHANNEL_OUT_DEFAULT.
+ * @param format desired format. Use default when it's AudioFormat.ENCODING_DEFAULT.
+ */
+ void overrideAudioSink(int audioType, String audioAddress, int samplingRate, int channelMask,
+ int format);
}
diff --git a/media/java/android/media/tv/ITvInputManager.aidl b/media/java/android/media/tv/ITvInputManager.aidl
index 41c4f07..a2b7d6b 100644
--- a/media/java/android/media/tv/ITvInputManager.aidl
+++ b/media/java/android/media/tv/ITvInputManager.aidl
@@ -38,6 +38,8 @@
List<TvInputInfo> getTvInputList(int userId);
TvInputInfo getTvInputInfo(in String inputId, int userId);
+ List<Uri> getTvContentRatingSystemXmls(int userId);
+
void registerCallback(in ITvInputManagerCallback callback, int userId);
void unregisterCallback(in ITvInputManagerCallback callback, int userId);
@@ -56,7 +58,7 @@
void dispatchSurfaceChanged(in IBinder sessionToken, int format, int width, int height,
int userId);
void setVolume(in IBinder sessionToken, float volume, int userId);
- void tune(in IBinder sessionToken, in Uri channelUri, int userId);
+ void tune(in IBinder sessionToken, in Uri channelUri, in Bundle params, int userId);
void setCaptionEnabled(in IBinder sessionToken, boolean enabled, int userId);
void selectTrack(in IBinder sessionToken, in TvTrackInfo track, int userId);
void unselectTrack(in IBinder sessionToken, in TvTrackInfo track, int userId);
diff --git a/media/java/android/media/tv/ITvInputSession.aidl b/media/java/android/media/tv/ITvInputSession.aidl
index df14ad6..9a0be25 100644
--- a/media/java/android/media/tv/ITvInputSession.aidl
+++ b/media/java/android/media/tv/ITvInputSession.aidl
@@ -35,7 +35,7 @@
// TODO: Remove this once it becomes irrelevant for applications to handle audio focus. The plan
// is to introduce some new concepts that will solve a number of problems in audio policy today.
void setVolume(float volume);
- void tune(in Uri channelUri);
+ void tune(in Uri channelUri, in Bundle params);
void setCaptionEnabled(boolean enabled);
void selectTrack(in TvTrackInfo track);
void unselectTrack(in TvTrackInfo track);
diff --git a/media/java/android/media/tv/ITvInputSessionCallback.aidl b/media/java/android/media/tv/ITvInputSessionCallback.aidl
index 4186bb5..3773987 100644
--- a/media/java/android/media/tv/ITvInputSessionCallback.aidl
+++ b/media/java/android/media/tv/ITvInputSessionCallback.aidl
@@ -31,6 +31,7 @@
void onSessionEvent(in String name, in Bundle args);
void onChannelRetuned(in Uri channelUri);
void onTrackInfoChanged(in List<TvTrackInfo> tracks);
+ void onTrackSelectionChanged(in List<TvTrackInfo> selectedTracks);
void onVideoAvailable();
void onVideoUnavailable(int reason);
void onContentAllowed();
diff --git a/media/java/android/media/tv/ITvInputSessionWrapper.java b/media/java/android/media/tv/ITvInputSessionWrapper.java
index 9fb552c..a809da9 100644
--- a/media/java/android/media/tv/ITvInputSessionWrapper.java
+++ b/media/java/android/media/tv/ITvInputSessionWrapper.java
@@ -111,7 +111,9 @@
return;
}
case DO_TUNE: {
- mTvInputSessionImpl.tune((Uri) msg.obj);
+ SomeArgs args = (SomeArgs) msg.obj;
+ mTvInputSessionImpl.tune((Uri) args.arg1, (Bundle) args.arg2);
+ args.recycle();
return;
}
case DO_SET_CAPTION_ENABLED: {
@@ -184,8 +186,8 @@
}
@Override
- public void tune(Uri channelUri) {
- mCaller.executeOrSendMessage(mCaller.obtainMessageO(DO_TUNE, channelUri));
+ public void tune(Uri channelUri, Bundle params) {
+ mCaller.executeOrSendMessage(mCaller.obtainMessageOO(DO_TUNE, channelUri, params));
}
@Override
diff --git a/media/java/android/media/tv/TvContentRating.java b/media/java/android/media/tv/TvContentRating.java
index 986a7d9..1ace775 100644
--- a/media/java/android/media/tv/TvContentRating.java
+++ b/media/java/android/media/tv/TvContentRating.java
@@ -17,149 +17,275 @@
package android.media.tv;
import android.annotation.SystemApi;
+import android.net.Uri;
import android.text.TextUtils;
-import android.util.ArrayMap;
import android.util.Log;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
-import java.util.Map;
/**
* A class representing a TV content rating.
+ * When a TV input service provides the content rating information of a program into TV provider,
+ * TvContentRating class will be used for generating the value of {@link
+ * TvContract.Programs#COLUMN_CONTENT_RATING}. To create an object of {@link TvContentRating}, use
+ * the {@link #createRating} method with valid arguments. The arguments could be a system defined
+ * strings, or a TV input service defined strings.
+ * TV input service defined strings are in an xml file defined in <code><{@link
+ * android.R.styleable#TvInputService tv-input}></code> with the {@link
+ * android.R.attr#contentRatingSystemXml contentRatingSystemXml} attribute by the TV input service.
+ *
+ * <h3> Content Rating System XML format </h3>
+ * The XML file for publishing content rating system should follow the DTD bellow:
+ * <p><pre class="prettyprint">
+ * <?xml version="1.0" encoding="UTF-8"?>
+ * <!DOCTYPE rating-systems [
+ * <!ELEMENT rating-system-definitions (rating-system-definition+)>
+ * <!ELEMENT rating-system-definition (
+ * (sub-rating-definition*, rating-definition, sub-rating-definition*)+, order*)>
+ * <!ATTLIST rating-system-definition
+ * id ID #REQUIRED
+ * displayName CDATA #IMPLIED
+ * description CDATA #IMPLIED
+ * country CDATA #IMPLIED>
+ * <!ELEMENT sub-rating-definition EMPTY>
+ * <!ATTLIST sub-rating-definition
+ * id ID #REQUIRED
+ * displayName CDATA #IMPLIED
+ * icon CDATA #IMPLIED
+ * description CDATA #IMPLIED>
+ * <!ELEMENT rating-definition (sub-rating*))>
+ * <!ATTLIST rating-definition
+ * id ID #REQUIRED
+ * displayName CDATA #IMPLIED
+ * icon CDATA #IMPLIED
+ * description CDATA #IMPLIED>
+ * <!ELEMENT sub-rating EMPTY>
+ * <!ATTLIST sub-rating id IDREF #REQUIRED>
+ * <!ELEMENT order (rating, rating+)>
+ * <!ELEMENT rating EMPTY>
+ * <!ATTLIST rating id IDREF #REQUIRED>
+ * ]>
+ * </pre></p>
+ *
+ * <h3>System defined rating strings</h3>
+ *
+ * <u>System defined string for {@code domain}</u>
+ * <table border="0" cellspacing="0" cellpadding="0">
+ * <tr>
+ * <td>String value</td>
+ * <td>Comments</td>
+ * </tr>
+ * <tr>
+ * <td>android.media.tv</td>
+ * <td>Used for creating system defined content ratings</td>
+ * </tr>
+ * </table>
+ * <u>System defined string for {@code ratingSystem}</u>
+ * <table border="0" cellspacing="0" cellpadding="0">
+ * <tr>
+ * <td>String value</td>
+ * <td>Comments</td>
+ * </tr>
+ * <tr>
+ * <td>US_TVPG</td>
+ * <td>The TV Parental Guidelines for US TV content ratings</td>
+ * </tr>
+ * <tr>
+ * <td>KR_TV</td>
+ * <td>The South Korean television rating system</td>
+ * </tr>
+ * </table>
+ *
+ * <u>System defined string for {@code rating}</u>
+ * <table border="0" cellspacing="0" cellpadding="0">
+ * <tr>
+ * <td>String value</td>
+ * <td>Comments</td>
+ * </tr>
+ * <tr>
+ * <td>US_TVPG_TV_Y</td>
+ * <td>A rating string for the US_TVPG domain. Programs rated this are designed to be
+ * appropriate for all children. Whether animated or live-action, the themes and elements
+ * in this program are specifically designed for a very young audience, including children
+ * from ages 2-6. This program is not expected to frighten younger children.</td>
+ * </tr>
+ * <tr>
+ * <td>US_TVPG_TV_Y7</td>
+ * <td>A rating string for the US_TVPG domain. Programs rated this are designed for children
+ * age 7 and above. It may be more appropriate for children who have acquired the
+ * developmental skills needed to distinguish between make-believe and reality. Themes and
+ * elements in this program may include mild fantasy violence or comedic violence, or may
+ * frighten children under the age of 7. Therefore, parents may wish to consider the
+ * suitability of this program for their very young children. This rating may contain
+ * fantasy violence (US_TVPG_FV) when programs are generally more intense or more combative
+ * than other programs in this category.</td>
+ * </tr>
+ * <tr>
+ * <td>US_TVPG_TV_G</td>
+ * <td>A rating string for the US_TVPG domain. Most parents would find this program suitable
+ * for all ages. Although this rating does not signify a program designed specifically for
+ * children, most parents may let younger children watch this program unattended. It
+ * contains little or no violence, no strong language and little or no sexual dialogue or
+ * situations.</td>
+ * </tr>
+ * <tr>
+ * <td>US_TVPG_TV_PG</td>
+ * <td>A rating string for the US_TVPG domain. Programs rated this contain material that
+ * parents may find unsuitable for younger children. Many parents may want to watch it with
+ * their younger children. The theme itself may call for parental guidance and/or the
+ * program may contain one or more of the following: some suggestive dialogue (US_TVPG_D),
+ * infrequent coarse language (US_TVPG_L), some sexual situations (US_TVPG_S), or moderate
+ * violence (US_TVPG_V).</td>
+ * </tr>
+ * <tr>
+ * <td>US_TVPG_TV_14</td>
+ * <td>A rating string for the US_TVPG domain. Programs rated this contains some material
+ * that many parents would find unsuitable for children under 14 years of age. Parents are
+ * strongly urged to exercise greater care in monitoring this program and are cautioned
+ * against letting children under the age of 14 watch unattended. This program may contain
+ * one or more of the following: intensely suggestive dialogue (US_TVPG_D), strong coarse
+ * language (US_TVPG_L), intense sexual situations (US_TVPG_S), or intense violence
+ * (US_TVPG_V).</td>
+ * </tr>
+ * <tr>
+ * <td>US_TVPG_TV_MA</td>
+ * <td>A rating string for the US_TVPG domain. Programs rated TV-MA are specifically
+ * designed to be viewed by adults and therefore may be unsuitable for children under 17.
+ * This program may contain one or more of the following: crude indecent language
+ * (US_TVPG_L), explicit sexual activity (US_TVPG_S), or graphic violence (US_TVPG_V).</td>
+ * </tr>
+ * <tr>
+ * <td>KR_TV_ALL</td>
+ * <td>A rating string for the KR_TV domain. This rating is for programs that are
+ * appropriate for all ages. This program usually involves programs designed for children or
+ * families. This rating does not have an icon.</td>
+ * </tr>
+ * <tr>
+ * <td>KR_TV_7</td>
+ * <td>A rating string for the KR_TV domain. This rating is for programs that may contain
+ * material inappropriate for children younger than 7, and parental discretion should be
+ * used. Some cartoon programs not deemed strictly as "educational", and films rated "G" or
+ * "PG" in North America may fall into the 7 category.</td>
+ * </tr>
+ * <tr>
+ * <td>KR_TV_12</td>
+ * <td>A rating string for the KR_TV domain. This rating is for programs that may deemed
+ * inappropriate for those younger than 12, and parental discretion should be used. Usually
+ * used for animations that have stronger themes or violence then those designed for
+ * children, or for reality shows that have mild violence, themes, or language.</td>
+ * </tr>
+ * <tr>
+ * <td>KR_TV_15</td>
+ * <td>A rating string for the KR_TV domain. This rating is for programs that contain
+ * material that may be inappropriate for children under 15, and that parental discretion
+ * should be used. Examples include most dramas, and talk shows on OTA (over-the-air) TV
+ * (KBS, MBC, SBS), and many American TV shows/dramas on Cable TV channels like OCN and
+ * OnStyle. The programs that have this rating may include moderate or strong adult themes,
+ * language, sexual inference, and violence. As with the TV-14 rating in North America, this
+ * rating is commonly applied to live events where the occurrence of inappropriate dialogue
+ * is unpredictable. Since 2007, this rating is the most used rating for TV.</td>
+ * </tr>
+ * <tr>
+ * <td>KR_TV_19</td>
+ * <td>A rating string for the KR_TV domain. This rating is for programs that are intended
+ * for adults only. 19-rated programs cannot air during the hours of 7:00AM to 9:00AM, and
+ * 1:00PM to 10:00PM. Programs that receive this rating will almost certainly have adult
+ * themes, sexual situations, frequent use of strong language and disturbing scenes of
+ * violence.</td>
+ * </tr>
+ * </table>
+ *
+ * <u>System defined string for {@code subRating}</u>
+ * <table border="0" cellspacing="0" cellpadding="0">
+ * <tr>
+ * <td>String value</td>
+ * <td>Comments</td>
+ * </tr>
+ * <tr>
+ * <td>US_TVPG_D</td>
+ * <td>Suggestive dialogue (Not used with US_TVPG_TV_MA)</td>
+ * </tr>
+ * <tr>
+ * <td>US_TVPG_L</td>
+ * <td>Coarse language</td>
+ * </tr>
+ * <tr>
+ * <td>US_TVPG_S</td>
+ * <td>Sexual content</td>
+ * </tr>
+ * <tr>
+ * <td>US_TVPG_V</td>
+ * <td>Violence</td>
+ * </tr>
+ * <tr>
+ * <td>US_TVPG_FV</td>
+ * <td>Fantasy violence (exclusive to US_TVPG_TV_Y7)</td>
+ * </tr>
+ * </table>
*/
public final class TvContentRating {
private static final String TAG = "TvContentRating";
- private static final int RATING_PREFIX_LENGTH = 10;
- private static final String PREFIX_RATING_US = "RATING_US_";
- private static final String PREFIX_SUBRATING_US = "SUBRATING_US_";
+ /** @hide */
+ public static final Uri SYSTEM_CONTENT_RATING_SYSTEM_XML = Uri.parse(
+ "android.resource://system/" + com.android.internal.R.xml.tv_content_rating_systems);
- /**
- * Rating constant for TV-Y from the TV Parental Guidelines system in US. This program is
- * designed to be appropriate for all children.
- */
- public static final String RATING_US_TV_Y = PREFIX_RATING_US + "TV_Y";
- /**
- * Rating constant for TV-Y7 from the TV Parental Guidelines system in US. This program is
- * designed for children age 7 and above.
- */
- public static final String RATING_US_TV_Y7 = PREFIX_RATING_US + "TV_Y7";
- /**
- * Rating constant for TV-G from the TV Parental Guidelines system in US. Most parents would
- * find this program suitable for all ages.
- */
- public static final String RATING_US_TV_G = PREFIX_RATING_US + "TV_G";
- /**
- * Rating constant for TV-PG from the TV Parental Guidelines system in US. This program contains
- * material that parents may find unsuitable for younger children.
- */
- public static final String RATING_US_TV_PG = PREFIX_RATING_US + "TV_PG";
- /**
- * Rating constant for TV-14 from the TV Parental Guidelines system in US. This program contains
- * some material that many parents would find unsuitable for children under 14 years of age.
- */
- public static final String RATING_US_TV_14 = PREFIX_RATING_US + "TV_14";
- /**
- * Rating constant for TV-MA from the TV Parental Guidelines system in US. This program is
- * specifically designed to be viewed by adults and therefore may be unsuitable for children
- * under 17.
- */
- public static final String RATING_US_TV_MA = PREFIX_RATING_US + "TV_MA";
-
- /**
- * Sub-rating constant for D (Suggestive dialogue) from the TV Parental Guidelines system in US.
- */
- public static final String SUBRATING_US_D = PREFIX_SUBRATING_US + "D";
- /**
- * Sub-rating constant for L (Coarse language) from the TV Parental Guidelines system in US.
- */
- public static final String SUBRATING_US_L = PREFIX_SUBRATING_US + "L";
- /**
- * Sub-rating constant for S (Sexual content) from the TV Parental Guidelines system in US.
- */
- public static final String SUBRATING_US_S = PREFIX_SUBRATING_US + "S";
- /**
- * Sub-rating constant for V (Violence) from the TV Parental Guidelines system in US.
- */
- public static final String SUBRATING_US_V = PREFIX_SUBRATING_US + "V";
- /**
- * Sub-rating constant for FV (Fantasy violence) from the TV Parental Guidelines system in US.
- */
- public static final String SUBRATING_US_FV = PREFIX_SUBRATING_US + "FV";
-
- private static final String PREFIX_RATING_KR = "RATING_KR_";
-
- /**
- * Rating constant for 'ALL' from the South Korean television rating system. This rating is for
- * programming that is appropriate for all ages.
- */
- public static final String RATING_KR_ALL = PREFIX_RATING_KR + "ALL";
- /**
- * Rating constant for '7' from the South Korean television rating system. This rating is for
- * programming that may contain material inappropriate for children younger than 7, and parental
- * discretion should be used.
- */
- public static final String RATING_KR_7 = PREFIX_RATING_KR + "7";
- /**
- * Rating constant for '12' from the South Korean television rating system. This rating is for
- * programs that may deemed inappropriate for those younger than 12, and parental discretion
- * should be used.
- */
- public static final String RATING_KR_12 = PREFIX_RATING_KR + "12";
- /**
- * Rating constant for '15' from the South Korean television rating system. This rating is for
- * programs that contain material that may be inappropriate for children under 15, and that
- * parental discretion should be used.
- */
- public static final String RATING_KR_15 = PREFIX_RATING_KR + "15";
- /**
- * Rating constant for '19' from the South Korean television rating system. This rating is for
- * programs that are intended for adults only. 19-rated programming cannot air during the hours
- * of 7:00AM to 9:00AM, and 1:00PM to 10:00PM.
- */
- public static final String RATING_KR_19 = PREFIX_RATING_KR + "19";
-
+ // TODO: Consider to use other DELIMITER. In some countries such as India may use this delimiter
+ // in the main ratings.
private static final String DELIMITER = "/";
- // A mapping from two-letter country code (ISO 3166-1 alpha-2) to its rating-to-sub-ratings map.
- // This is used for validating the builder parameters.
- private static final Map<String, Map<String, String[]>> sRatings
- = new ArrayMap<String, Map<String, String[]>>();
-
- static {
- Map<String, String[]> usRatings = new ArrayMap<String, String[]>();
- usRatings.put(RATING_US_TV_Y, null);
- usRatings.put(RATING_US_TV_Y7, new String[] { SUBRATING_US_FV });
- usRatings.put(RATING_US_TV_G, null);
- usRatings.put(RATING_US_TV_PG, new String[] {
- SUBRATING_US_D, SUBRATING_US_L, SUBRATING_US_S, SUBRATING_US_V });
- usRatings.put(RATING_US_TV_14, new String[] {
- SUBRATING_US_D, SUBRATING_US_L, SUBRATING_US_S, SUBRATING_US_V });
- usRatings.put(RATING_US_TV_MA, new String[] {
- SUBRATING_US_L, SUBRATING_US_S, SUBRATING_US_V });
- sRatings.put(PREFIX_RATING_US, usRatings);
-
- Map<String, String[]> krRatings = new ArrayMap<String, String[]>();
- krRatings.put(RATING_KR_ALL, null);
- krRatings.put(RATING_KR_7, null);
- krRatings.put(RATING_KR_12, null);
- krRatings.put(RATING_KR_15, null);
- krRatings.put(RATING_KR_19, null);
- sRatings.put(PREFIX_RATING_KR, krRatings);
- }
-
+ private final String mDomain;
+ private final String mCountryCode;
+ private final String mRatingSystem;
private final String mRating;
private final String[] mSubRatings;
/**
- * Constructs a TvContentRating object from a given rating constant.
+ * Creates a TvContentRating object.
*
- * @param rating The rating constant defined in this class.
+ * @param domain The domain name.
+ * @param countryCode The country code in ISO 3166-2 format or {@code null}.
+ * @param ratingSystem The rating system id.
+ * @param rating The content rating string.
+ * @param subRatings The string array of sub-ratings.
+ * @return A TvContentRating object, or null if creation failed.
*/
- public TvContentRating(String rating) {
- this(rating, null);
+ public static TvContentRating createRating(String domain, String countryCode,
+ String ratingSystem, String rating, String... subRatings) {
+ if (TextUtils.isEmpty(domain)) {
+ throw new IllegalArgumentException("domain cannot be empty");
+ }
+ if (TextUtils.isEmpty(rating)) {
+ throw new IllegalArgumentException("rating cannot be empty");
+ }
+ return new TvContentRating(domain, countryCode, ratingSystem, rating, subRatings);
+ }
+
+ /**
+ * Recovers a TvContentRating from a String that was previously created with
+ * {@link #flattenToString}.
+ *
+ * @param ratingString The String that was returned by flattenToString().
+ * @return a new TvContentRating containing the domain, countryCode, rating system, rating and
+ * sub-ratings information was encoded in {@code ratingString}.
+ * @see #flattenToString
+ */
+ public static TvContentRating unflattenFromString(String ratingString) {
+ if (TextUtils.isEmpty(ratingString)) {
+ throw new IllegalArgumentException("ratingString cannot be empty");
+ }
+ String[] strs = ratingString.split(DELIMITER);
+ if (strs.length < 4) {
+ throw new IllegalArgumentException("Invalid rating string: " + ratingString);
+ }
+ if (strs.length > 4) {
+ String[] subRatings = new String[strs.length - 4];
+ System.arraycopy(strs, 4, subRatings, 0, subRatings.length);
+ return new TvContentRating(strs[0], strs[1], strs[2], strs[3], subRatings);
+ }
+ return new TvContentRating(strs[0], strs[1], strs[2], strs[3], null);
}
/**
@@ -168,57 +294,45 @@
* @param rating The rating constant defined in this class.
* @param subRatings The String array of sub-rating constants defined in this class.
*/
- public TvContentRating(String rating, String[] subRatings) {
- if (TextUtils.isEmpty(rating)) {
- throw new IllegalArgumentException("rating cannot be null");
- }
+ private TvContentRating(String domain, String countryCode,
+ String ratingSystem, String rating, String[] subRatings) {
+ mDomain = domain;
+ mCountryCode = countryCode;
+ mRatingSystem = ratingSystem;
mRating = rating;
mSubRatings = subRatings;
- String prefix = "";
- if (mRating.length() > RATING_PREFIX_LENGTH) {
- prefix = mRating.substring(0, RATING_PREFIX_LENGTH);
- }
- Map<String, String[]> ratings = sRatings.get(prefix);
- if (ratings != null) {
- if (!ratings.keySet().contains(mRating)) {
- Log.w(TAG, "Unknown rating: " + mRating);
- } else if (mSubRatings != null) {
- String[] validSubRatings = ratings.get(mRating);
- if (validSubRatings == null) {
- Log.w(TAG, "Invalid subratings: " + mSubRatings);
- } else {
- List<String> validSubRatingList = Arrays.asList(subRatings);
- for (String sr : mSubRatings) {
- if (TextUtils.isEmpty(sr)) {
- throw new IllegalArgumentException(
- "subRatings cannot contain empty elements");
- }
- if (!validSubRatingList.contains(sr)) {
- Log.w(TAG, "Invalid subrating: " + sr);
- break;
- }
- }
- }
- }
- } else {
- Log.w(TAG, "Rating undefined for " + mRating);
- }
}
/**
- * Returns the main rating constant.
- *
- * @return the rating string that starts with "RATING_" prefix as defined in this class.
+ * Returns the domain.
+ */
+ public String getDomain() {
+ return mDomain;
+ }
+
+ /**
+ * Returns the country code in ISO 3166-2 format or {@code null}.
+ */
+ public String getCountry() {
+ return mCountryCode;
+ }
+
+ /**
+ * Returns the rating system id.
+ */
+ public String getRatingSystem() {
+ return mRatingSystem;
+ }
+
+ /**
+ * Returns the main rating.
*/
public String getMainRating() {
return mRating;
}
/**
- * Returns the list of sub-rating constants.
- *
- * @return the unmodifiable {@code List} of sub-rating strings that start with "SUBRATING_"
- * prefix as defined in this class.
+ * Returns the unmodifiable {@code List} of sub-rating strings.
*/
public List<String> getSubRatings() {
if (mSubRatings == null) {
@@ -238,10 +352,14 @@
* @see #unflattenFromString
*/
public String flattenToString() {
- // TODO: Consider removing all obvious/redundant sub-strings including "RATING" and
- // "SUBRATING" and find out a storage-efficient string format such as:
- // <country>-<primary>/<sub1>/<sub2>/<sub3>
- StringBuilder builder = new StringBuilder(mRating);
+ StringBuilder builder = new StringBuilder();
+ builder.append(mDomain);
+ builder.append(DELIMITER);
+ builder.append(mCountryCode);
+ builder.append(DELIMITER);
+ builder.append(mRatingSystem);
+ builder.append(DELIMITER);
+ builder.append(mRating);
if (mSubRatings != null) {
for (String subRating : mSubRatings) {
builder.append(DELIMITER);
@@ -252,31 +370,6 @@
}
/**
- * Recovers a TvContentRating from a String that was previously created with
- * {@link #flattenToString}.
- *
- * @param ratingString The String that was returned by flattenToString().
- * @return a new TvContentRating containing the rating and sub-ratings information was encoded
- * in {@code ratingString}.
- * @see #flattenToString
- */
- public static TvContentRating unflattenFromString(String ratingString) {
- if (TextUtils.isEmpty(ratingString)) {
- throw new IllegalArgumentException("Empty rating string");
- }
- String[] strs = ratingString.split(DELIMITER);
- if (strs.length < 1) {
- throw new IllegalArgumentException("Invalid rating string: " + ratingString);
- }
- if (strs.length > 1) {
- String[] subRatings = new String[strs.length - 1];
- System.arraycopy(strs, 1, subRatings, 0, subRatings.length);
- return new TvContentRating(strs[0], subRatings);
- }
- return new TvContentRating(strs[0]);
- }
-
- /**
* Returns true if this rating has the same main rating as the specified rating and when this
* rating's sub-ratings contain the other's.
* <p>
diff --git a/media/java/android/media/tv/TvContract.java b/media/java/android/media/tv/TvContract.java
index 1a43051..5a0ea0d 100644
--- a/media/java/android/media/tv/TvContract.java
+++ b/media/java/android/media/tv/TvContract.java
@@ -509,7 +509,7 @@
* The ID of the TV input service that provides this TV channel.
* <p>
* Use {@link #buildInputId} to build the ID.
- * <p>
+ * </p><p>
* This is a required field.
* </p><p>
* Type: TEXT
@@ -662,7 +662,7 @@
* {@link Programs#COLUMN_VIDEO_HEIGHT} to get more accurate video resolution.
* </p><p>
* Type: TEXT
- * </p><p>
+ * </p>
* @see #getVideoResolution
*/
public static final String COLUMN_VIDEO_FORMAT = "video_format";
@@ -688,8 +688,7 @@
* the channel is searchable and can be included in search results, a value of 0 indicates
* the channel and its TV programs are hidden from search. If not specified, this value is
* set to 1 (searchable) by default.
- * </p>
- * <p>
+ * </p><p>
* Type: INTEGER (boolean)
* </p>
*/
@@ -743,14 +742,12 @@
* To access this directory, append {@link Channels.Logo#CONTENT_DIRECTORY} to the raw
* channel URI. The resulting URI represents an image file, and should be interacted
* using ContentResolver.openAssetFileDescriptor.
- * </p>
- * <p>
+ * </p><p>
* Note that this sub-directory also supports opening the logo as an asset file in write
* mode. Callers can create or replace the primary logo associated with this channel by
* opening the asset file and writing the full-size photo contents into it. When the file
* is closed, the image will be parsed, sized down if necessary, and stored.
- * </p>
- * <p>
+ * </p><p>
* Usage example:
* <pre>
* public void writeChannelLogo(long channelId, byte[] logo) {
@@ -1180,6 +1177,19 @@
*/
public static final String COLUMN_DESCRIPTION = "description";
+ /**
+ * Extra parameters of the tune operation.
+ * <p>
+ * This column contains an encoded string which is comma-separated key-value pairs.
+ * (Ex. "[key1]=[value1], [key2]=[value2]"). COLUMN_TUNE_PARAMS will use '%' as an escape
+ * character for the characters of '%', '=', and ','.
+ * </p><p>
+ * Type: TEXT
+ * </p>
+ * @see TvInputManager.Session.tune(Uri, Bundle)
+ */
+ public static final String COLUMN_TUNE_PARAMS = "tune_params";
+
private WatchedPrograms() {}
}
}
diff --git a/media/java/android/media/tv/TvInputInfo.java b/media/java/android/media/tv/TvInputInfo.java
index e48b805..bc0538c 100644
--- a/media/java/android/media/tv/TvInputInfo.java
+++ b/media/java/android/media/tv/TvInputInfo.java
@@ -18,6 +18,7 @@
import android.annotation.SystemApi;
import android.content.ComponentName;
+import android.content.ContentResolver;
import android.content.Context;
import android.content.Intent;
import android.content.pm.PackageManager;
@@ -118,6 +119,7 @@
private String mLabel;
private Uri mIconUri;
private boolean mIsConnectedToHdmiSwitch;
+ private Uri mRatingSystemXmlUri;
static {
sHardwareTypeToTvInputType.put(TvInputHardwareInfo.TV_INPUT_TYPE_OTHER_HARDWARE,
@@ -237,6 +239,19 @@
Log.d(TAG, "Settings activity loaded. [" + input.mSettingsActivity + "] for "
+ si.name);
}
+ int contentRatingSystemXml = sa.getResourceId(
+ com.android.internal.R.styleable.TvInputService_contentRatingSystemXml, -1);
+ if (contentRatingSystemXml != -1) {
+ input.mRatingSystemXmlUri = new Uri.Builder()
+ .scheme(ContentResolver.SCHEME_ANDROID_RESOURCE)
+ .authority(si.packageName)
+ .appendPath(Integer.toString(contentRatingSystemXml))
+ .build();
+ if (DEBUG) {
+ Log.d(TAG, "Content rating xml loaded. [" + contentRatingSystemXml + "] for "
+ + si.name);
+ }
+ }
sa.recycle();
input.mLabel = label;
@@ -346,6 +361,15 @@
}
/**
+ * Returns the resource uri for the rating system xml of this TV input service.
+ * @hide
+ */
+ @SystemApi
+ public Uri getRatingSystemXmlUri() {
+ return mRatingSystemXmlUri;
+ }
+
+ /**
* Returns {@code true} if this TV input is pass-though which does not have any real channels
* in TvProvider. {@code false} otherwise.
*
@@ -449,9 +473,10 @@
dest.writeString(mSetupActivity);
dest.writeString(mSettingsActivity);
dest.writeInt(mType);
- dest.writeString(mIconUri == null ? null : mIconUri.toString());
+ dest.writeParcelable(mIconUri, flags);
dest.writeString(mLabel);
dest.writeByte(mIsConnectedToHdmiSwitch ? (byte) 1 : 0);
+ dest.writeParcelable(mRatingSystemXmlUri, flags);
}
private Drawable loadDefaultIcon(Context context) {
@@ -521,11 +546,9 @@
mSetupActivity = in.readString();
mSettingsActivity = in.readString();
mType = in.readInt();
- String mIconUriString = in.readString();
- if (mIconUriString != null) {
- mIconUri = Uri.parse(mIconUriString);
- }
+ mIconUri = in.readParcelable(null);
mLabel = in.readString();
mIsConnectedToHdmiSwitch = in.readByte() == 1 ? true : false;
+ mRatingSystemXmlUri = in.readParcelable(null);
}
}
diff --git a/media/java/android/media/tv/TvInputManager.java b/media/java/android/media/tv/TvInputManager.java
index d97aee02..0334083 100644
--- a/media/java/android/media/tv/TvInputManager.java
+++ b/media/java/android/media/tv/TvInputManager.java
@@ -164,7 +164,7 @@
* This is called when the channel of this session is changed by the underlying TV input
* with out any {@link TvInputManager.Session#tune(Uri)} request.
*
- * @param session A {@link TvInputManager.Session} associated with this callback
+ * @param session A {@link TvInputManager.Session} associated with this callback.
* @param channelUri The URI of a channel.
*/
public void onChannelRetuned(Session session, Uri channelUri) {
@@ -173,16 +173,25 @@
/**
* This is called when the track information of the session has been changed.
*
- * @param session A {@link TvInputManager.Session} associated with this callback
+ * @param session A {@link TvInputManager.Session} associated with this callback.
* @param tracks A list which includes track information.
*/
public void onTrackInfoChanged(Session session, List<TvTrackInfo> tracks) {
}
/**
- * This is called when the video is available, so the TV input starts the playback.
+ * This is called when there is a change on the selected tracks in this session.
*
* @param session A {@link TvInputManager.Session} associated with this callback
+ * @param selectedTracks A list of selected tracks.
+ */
+ public void onTrackSelectionChanged(Session session, List<TvTrackInfo> selectedTracks) {
+ }
+
+ /**
+ * This is called when the video is available, so the TV input starts the playback.
+ *
+ * @param session A {@link TvInputManager.Session} associated with this callback.
*/
public void onVideoAvailable(Session session) {
}
@@ -277,12 +286,22 @@
mHandler.post(new Runnable() {
@Override
public void run() {
- mSession.setTracks(tracks);
+ mSession.mTracks = tracks;
mSessionCallback.onTrackInfoChanged(mSession, tracks);
}
});
}
+ public void postTrackSelectionChanged(final List<TvTrackInfo> selectedTracks) {
+ mHandler.post(new Runnable() {
+ @Override
+ public void run() {
+ mSession.mSelectedTracks = selectedTracks;
+ mSessionCallback.onTrackSelectionChanged(mSession, selectedTracks);
+ }
+ });
+ }
+
public void postVideoAvailable() {
mHandler.post(new Runnable() {
@Override
@@ -469,6 +488,18 @@
}
@Override
+ public void onTrackSelectionChanged(List<TvTrackInfo> selectedTracks, int seq) {
+ synchronized (mSessionCallbackRecordMap) {
+ SessionCallbackRecord record = mSessionCallbackRecordMap.get(seq);
+ if (record == null) {
+ Log.e(TAG, "Callback not found for seq " + seq);
+ return;
+ }
+ record.postTrackSelectionChanged(selectedTracks);
+ }
+ }
+
+ @Override
public void onVideoAvailable(int seq) {
synchronized (mSessionCallbackRecordMap) {
SessionCallbackRecord record = mSessionCallbackRecordMap.get(seq);
@@ -769,6 +800,19 @@
}
/**
+ * Returns the list of xml resource uris for TV content rating systems.
+ * @hide
+ */
+ @SystemApi
+ public List<Uri> getTvContentRatingSystemXmls() {
+ try {
+ return mService.getTvContentRatingSystemXmls(mUserId);
+ } catch (RemoteException e) {
+ throw new RuntimeException(e);
+ }
+ }
+
+ /**
* Creates a {@link Session} for a given TV input.
* <p>
* The number of sessions that can be created at the same time is limited by the capability of
@@ -868,6 +912,7 @@
private TvInputEventSender mSender;
private InputChannel mChannel;
private List<TvTrackInfo> mTracks;
+ private List<TvTrackInfo> mSelectedTracks;
private Session(IBinder token, InputChannel channel, ITvInputManager service, int userId,
int seq, SparseArray<SessionCallbackRecord> sessionCallbackRecordMap) {
@@ -980,6 +1025,19 @@
* @throws IllegalArgumentException if the argument is {@code null}.
*/
public void tune(Uri channelUri) {
+ tune(channelUri, null);
+ }
+
+ /**
+ * Tunes to a given channel.
+ *
+ * @param channelUri The URI of a channel.
+ * @param params A set of extra parameters which might be handled with this tune event.
+ * @throws IllegalArgumentException if {@code channelUri} is {@code null}.
+ * @hide
+ */
+ @SystemApi
+ public void tune(Uri channelUri, Bundle params) {
if (channelUri == null) {
throw new IllegalArgumentException("channelUri cannot be null");
}
@@ -989,7 +1047,7 @@
}
mTracks = null;
try {
- mService.tune(mToken, channelUri, mUserId);
+ mService.tune(mToken, channelUri, params, mUserId);
} catch (RemoteException e) {
throw new RuntimeException(e);
}
@@ -1067,8 +1125,17 @@
return new ArrayList<TvTrackInfo>(mTracks);
}
- private void setTracks(List<TvTrackInfo> tracks) {
- mTracks = tracks;
+ /**
+ * Returns a list of selected tracks May return {@code null} if the information is not
+ * available.
+ * @see #selectTrack(TvTrackInfo)
+ * @see #unselectTrack(TvTrackInfo)
+ */
+ public List<TvTrackInfo> getSelectedTracks() {
+ if (mSelectedTracks == null) {
+ return null;
+ }
+ return new ArrayList<TvTrackInfo>(mSelectedTracks);
}
/**
diff --git a/media/java/android/media/tv/TvInputService.java b/media/java/android/media/tv/TvInputService.java
index a321809..7ce278c 100644
--- a/media/java/android/media/tv/TvInputService.java
+++ b/media/java/android/media/tv/TvInputService.java
@@ -325,10 +325,6 @@
* @param tracks A list which includes track information.
*/
public void notifyTrackInfoChanged(final List<TvTrackInfo> tracks) {
- if (!TvTrackInfo.checkSanity(tracks)) {
- throw new IllegalArgumentException(
- "Two or more selected tracks for a track type.");
- }
mHandler.post(new Runnable() {
@Override
public void run() {
@@ -343,6 +339,28 @@
}
/**
+ * Sends the list of selected tracks. This is expected to be called whenever there is a
+ * change on track selection.
+ *
+ * @param selectedTracks A list of selected tracks.
+ * @see #onSelectTrack(TvTrackInfo)
+ * @see #onUnselectTrack(TvTrackInfo)
+ */
+ public void notifyTrackSelectionChanged(final List<TvTrackInfo> selectedTracks) {
+ mHandler.post(new Runnable() {
+ @Override
+ public void run() {
+ try {
+ if (DEBUG) Log.d(TAG, "notifyTrackSelectionChanged");
+ mSessionCallback.onTrackSelectionChanged(selectedTracks);
+ } catch (RemoteException e) {
+ Log.w(TAG, "error in notifyTrackSelectionChanged");
+ }
+ }
+ });
+ }
+
+ /**
* Informs the application that video is available and the playback of the TV stream has
* been started.
*/
@@ -540,6 +558,19 @@
public abstract boolean onTune(Uri channelUri);
/**
+ * Calls {@link #onTune(Uri)}. Override this method in order to handle {@code params}.
+ *
+ * @param channelUri The URI of the channel.
+ * @param params The extra parameters from other applications.
+ * @return {@code true} the tuning was successful, {@code false} otherwise.
+ * @hide
+ */
+ @SystemApi
+ public boolean onTune(Uri channelUri, Bundle params) {
+ return onTune(channelUri);
+ }
+
+ /**
* Enables or disables the caption.
* <p>
* The locale for the user's preferred captioning language can be obtained by calling
@@ -572,13 +603,12 @@
* If it is called multiple times on the same type of track (ie. Video, Audio, Text), the
* track selected previously should be unselected in the implementation of this method.
* Also, if the select operation was successful, the implementation should call
- * {@link #notifyTrackInfoChanged(List)} to report the updated track information.
+ * {@link #notifyTrackSelectionChanged(List)} to report the selected track list.
* </p>
*
* @param track The track to be selected.
* @return {@code true} if the select operation was successful, {@code false} otherwise.
- * @see #notifyTrackInfoChanged
- * @see TvTrackInfo#KEY_IS_SELECTED
+ * @see #notifyTrackSelectionChanged(List)
*/
public boolean onSelectTrack(TvTrackInfo track) {
return false;
@@ -588,13 +618,12 @@
* Unselects a given track.
* <p>
* If the unselect operation was successful, the implementation should call
- * {@link #notifyTrackInfoChanged(List)} to report the updated track information.
+ * {@link #notifyTrackSelectionChanged(List)} to report the selected track list.
* </p>
*
* @param track The track to be unselected.
* @return {@code true} if the unselect operation was successful, {@code false} otherwise.
- * @see #notifyTrackInfoChanged
- * @see TvTrackInfo#KEY_IS_SELECTED
+ * @see #notifyTrackSelectionChanged(List)
*/
public boolean onUnselectTrack(TvTrackInfo track) {
return false;
@@ -793,8 +822,8 @@
/**
* Calls {@link #onTune}.
*/
- void tune(Uri channelUri) {
- onTune(channelUri);
+ void tune(Uri channelUri, Bundle params) {
+ onTune(channelUri, params);
// TODO: Handle failure.
}
diff --git a/media/java/android/media/tv/TvStreamConfig.java b/media/java/android/media/tv/TvStreamConfig.java
index 243f864..a7e7e44 100644
--- a/media/java/android/media/tv/TvStreamConfig.java
+++ b/media/java/android/media/tv/TvStreamConfig.java
@@ -88,6 +88,16 @@
return mGeneration;
}
+ @Override
+ public String toString() {
+ StringBuilder b = new StringBuilder(128);
+ b.append("TvStreamConfig {");
+ b.append("mStreamId=").append(mStreamId).append(";");
+ b.append("mType=").append(mType).append(";");
+ b.append("mGeneration=").append(mGeneration).append("}");
+ return b.toString();
+ }
+
// Parcelable
@Override
public int describeContents() {
diff --git a/media/java/android/media/tv/TvTrackInfo.java b/media/java/android/media/tv/TvTrackInfo.java
index de4f4b7..3b80db4 100644
--- a/media/java/android/media/tv/TvTrackInfo.java
+++ b/media/java/android/media/tv/TvTrackInfo.java
@@ -16,171 +16,121 @@
package android.media.tv;
-import android.media.MediaFormat;
import android.os.Bundle;
import android.os.Parcel;
import android.os.Parcelable;
-import java.util.List;
-
/**
* Encapsulates the format of tracks played in {@link TvInputService}.
*/
public final class TvTrackInfo implements Parcelable {
/**
- * A key describing the type of this track. The associated value is an integer and it should be
- * one of {@link #VALUE_TYPE_AUDIO}, {@link #VALUE_TYPE_VIDEO}, and {@link #VALUE_TYPE_SUBTITLE}.
- * <p>
- * This is a required key.
- * </p>
+ * The type value for audio tracks.
*/
- public static final String KEY_TYPE = "type";
+ public static final int TYPE_AUDIO = 0;
/**
- * A key describing the language of the track, using either ISO 639-1 or 639-2/T codes.
- * If the language is unknown or could not be determined, the corresponding value will be "und".
- * The associated value is a string.
- * <p>
- * This is a required key.
- * </p>
+ * The type value for video tracks.
*/
- public static final String KEY_LANGUAGE = MediaFormat.KEY_LANGUAGE;
+ public static final int TYPE_VIDEO = 1;
/**
- * A key describing whether this track is selected for the playback.
- * The associated value is a boolean.
- * <p>
- * This is a required key.
- * </p>
+ * The type value for subtitle tracks.
*/
- public static final String KEY_IS_SELECTED = "is-selected";
+ public static final int TYPE_SUBTITLE = 2;
- /**
- * A key describing the sample rate of an audio track.
- * The associated value is an integer.
- */
- public static final String KEY_SAMPLE_RATE = MediaFormat.KEY_SAMPLE_RATE;
+ private final int mType;
+ private final String mLanguage;
+ private final int mAudioChannelCount;
+ private final int mAudioSampleRate;
+ private final int mVideoWidth;
+ private final int mVideoHeight;
+ private final Bundle mExtra;
- /**
- * A key describing the number of channels in an audio track.
- * The associated value is an integer.
- */
- public static final String KEY_CHANNEL_COUNT = MediaFormat.KEY_CHANNEL_COUNT;
-
- /**
- * A key describing the width of the content in a video track.
- * The associated value is an integer.
- */
- public static final String KEY_WIDTH = MediaFormat.KEY_WIDTH;
-
- /**
- * A key describing the height of the content in a video track.
- * The associated value is an integer.
- */
- public static final String KEY_HEIGHT = MediaFormat.KEY_HEIGHT;
-
- /**
- * A key describing a tag associated with this track. Expected to be used as an identifier with
- * in a session. The associated value is a string.
- */
- public static final String KEY_TAG = "tag";
-
- /**
- * The type value for audio track.
- */
- public static final int VALUE_TYPE_AUDIO = 0;
-
- /**
- * The type value for video track.
- */
- public static final int VALUE_TYPE_VIDEO = 1;
-
- /**
- * The type value for subtitle track.
- */
- public static final int VALUE_TYPE_SUBTITLE = 2;
-
- private final Bundle mBundle;
-
- private TvTrackInfo(Bundle bundle) {
- mBundle = new Bundle(bundle);
+ private TvTrackInfo(int type, String language, int audioChannelCount,
+ int audioSampleRate, int videoWidth, int videoHeight, Bundle extra) {
+ mType = type;
+ mLanguage = language;
+ mAudioChannelCount = audioChannelCount;
+ mAudioSampleRate = audioSampleRate;
+ mVideoWidth = videoWidth;
+ mVideoHeight = videoHeight;
+ mExtra = extra;
}
private TvTrackInfo(Parcel in) {
- mBundle = in.readBundle();
+ mType = in.readInt();
+ mLanguage = in.readString();
+ mAudioChannelCount = in.readInt();
+ mAudioSampleRate = in.readInt();
+ mVideoWidth = in.readInt();
+ mVideoHeight = in.readInt();
+ mExtra = in.readBundle();
}
/**
- * Checks if there is only one or zero selected track per track type.
- *
- * @param tracks a list including tracks which will be checked.
- * @return true if there is only one or zero selected track per track type, false otherwise
- * @hide
+ * Returns the type of the track. The type should be one of the followings:
+ * {@link #TYPE_AUDIO}, {@link #TYPE_VIDEO} and {@link #TYPE_SUBTITLE}.
*/
- public static boolean checkSanity(List<TvTrackInfo> tracks) {
- int selectedAudioTracks = 0;
- int selectedVideoTracks = 0;
- int selectedSubtitleTracks = 0;
- for (TvTrackInfo track : tracks) {
- if (track.getBoolean(KEY_IS_SELECTED)) {
- int type = track.getInt(KEY_TYPE);
- if (type == VALUE_TYPE_AUDIO) {
- selectedAudioTracks++;
- } else if (type == VALUE_TYPE_VIDEO) {
- selectedVideoTracks++;
- } else if (type == VALUE_TYPE_SUBTITLE) {
- selectedSubtitleTracks++;
- }
- }
+ public final int getType() {
+ return mType;
+ }
+
+ /**
+ * Returns the language information encoded by either ISO 639-1 or ISO 639-2/T. If the language
+ * is unknown or could not be determined, the corresponding value will be {@code null}.
+ */
+ public final String getLanguage() {
+ return mLanguage;
+ }
+
+ /**
+ * Returns the audio channel count. Valid for {@link #TYPE_AUDIO} tracks only.
+ */
+ public final int getAudioChannelCount() {
+ if (mType != TYPE_AUDIO) {
+ throw new IllegalStateException("Not an audio track");
}
- if (selectedAudioTracks > 1 || selectedVideoTracks > 1 || selectedSubtitleTracks > 1) {
- return false;
+ return mAudioChannelCount;
+ }
+
+ /**
+ * Returns the audio sample rate, in the unit of Hz. Valid for {@link #TYPE_AUDIO} tracks only.
+ */
+ public final int getAudioSampleRate() {
+ if (mType != TYPE_AUDIO) {
+ throw new IllegalStateException("Not an audio track");
}
- return true;
+ return mAudioSampleRate;
}
/**
- * Returns true if the given key is contained in the metadata
- *
- * @param key A String key
- * @return true If the key exists in this metadata, false otherwise
+ * Returns the width of the video, in the unit of pixels. Valid for {@link #TYPE_VIDEO} tracks
+ * only.
*/
- public boolean containsKey(String key) {
- return mBundle.containsKey(key);
+ public final int getVideoWidth() {
+ if (mType != TYPE_VIDEO) {
+ throw new IllegalStateException("Not a video track");
+ }
+ return mVideoWidth;
}
/**
- * Returns the value associated with the given key, or null if no mapping of
- * the desired type exists for the given key or a null value is explicitly
- * associated with the key.
- *
- * @param key The key the value is stored under
- * @return A String value, or null
+ * Returns the height of the video, in the unit of pixels. Valid for {@link #TYPE_VIDEO} tracks
+ * only.
*/
- public String getString(String key) {
- return mBundle.getString(key);
+ public final int getVideoHeight() {
+ if (mType != TYPE_VIDEO) {
+ throw new IllegalStateException("Not a video track");
+ }
+ return mVideoHeight;
}
/**
- * Returns the value associated with the given key, or 0L if no integer exists
- * for the given key.
- *
- * @param key The key the value is stored under
- * @return An integer value
+ * Returns the extra information about the current track.
*/
- public int getInt(String key) {
- return mBundle.getInt(key, 0);
- }
-
- /**
- * Returns the value associated with the given key, or false if no integer exists
- * for the given key.
- *
- * @param key The key the value is stored under
- * @return A boolean value
- */
- public boolean getBoolean(String key) {
- return mBundle.getBoolean(key, false);
+ public final Bundle getExtra() {
+ return mExtra;
}
@Override
@@ -188,13 +138,25 @@
return 0;
}
+ /**
+ * Used to package this object into a {@link Parcel}.
+ *
+ * @param dest The {@link Parcel} to be written.
+ * @param flags The flags used for parceling.
+ */
@Override
public void writeToParcel(Parcel dest, int flags) {
- dest.writeBundle(mBundle);
+ dest.writeInt(mType);
+ dest.writeString(mLanguage);
+ dest.writeInt(mAudioChannelCount);
+ dest.writeInt(mAudioSampleRate);
+ dest.writeInt(mVideoWidth);
+ dest.writeInt(mVideoHeight);
+ dest.writeBundle(mExtra);
}
- public static final Parcelable.Creator<TvTrackInfo> CREATOR
- = new Parcelable.Creator<TvTrackInfo>() {
+ public static final Parcelable.Creator<TvTrackInfo> CREATOR =
+ new Parcelable.Creator<TvTrackInfo>() {
@Override
public TvTrackInfo createFromParcel(Parcel in) {
return new TvTrackInfo(in);
@@ -210,73 +172,100 @@
* A builder class for creating {@link TvTrackInfo} objects.
*/
public static final class Builder {
- private final Bundle mBundle;
+ private int mType;
+ private String mLanguage;
+ private int mAudioChannelCount;
+ private int mAudioSampleRate;
+ private int mVideoWidth;
+ private int mVideoHeight;
+ private Bundle mExtra;
/**
- * Create a {@link Builder}. Any field that should be included in the
- * {@link TvTrackInfo} must be added.
+ * Create a {@link Builder}. Any field that should be included in the {@link TvTrackInfo}
+ * must be added.
*
* @param type The type of the track.
- * @param language The language of the track, using either ISO 639-1 or 639-2/T codes.
- * "und" if the language is unknown.
- * @param isSelected Whether this track is selected for the playback or not.
*/
- public Builder(int type, String language, boolean isSelected) {
- if (type != VALUE_TYPE_AUDIO
- && type != VALUE_TYPE_VIDEO
- && type != VALUE_TYPE_SUBTITLE) {
+ public Builder(int type) {
+ if (type != TYPE_AUDIO
+ && type != TYPE_VIDEO
+ && type != TYPE_SUBTITLE) {
throw new IllegalArgumentException("Unknown type: " + type);
}
- mBundle = new Bundle();
- putInt(KEY_TYPE, type);
- putString(KEY_LANGUAGE, language);
- putBoolean(KEY_IS_SELECTED, isSelected);
+ mType = type;
}
/**
- * Create a Builder using a {@link TvTrackInfo} instance to set the
- * initial values. All fields in the source metadata will be included in
- * the new metadata. Fields can be overwritten by adding the same key.
+ * Sets the language information of the current track.
*
- * @param source The source {@link TvTrackInfo} instance
+ * @param language The language string encoded by either ISO 639-1 or ISO 639-2/T.
*/
- public Builder(TvTrackInfo source) {
- mBundle = new Bundle(source.mBundle);
- }
-
- /**
- * Put a String value into the track.
- *
- * @param key The key for referencing this value
- * @param value The String value to store
- * @return The Builder to allow chaining
- */
- public Builder putString(String key, String value) {
- mBundle.putString(key, value);
+ public final Builder setLanguage(String language) {
+ mLanguage = language;
return this;
}
/**
- * Put an integer value into the track.
+ * Sets the audio channel count. Valid for {@link #TYPE_AUDIO} tracks only.
*
- * @param key The key for referencing this value
- * @param value The integer value to store
- * @return The Builder to allow chaining
+ * @param audioChannelCount The audio channel count.
*/
- public Builder putInt(String key, int value) {
- mBundle.putInt(key, value);
+ public final Builder setAudioChannelCount(int audioChannelCount) {
+ if (mType != TYPE_AUDIO) {
+ throw new IllegalStateException("Not an audio track");
+ }
+ mAudioChannelCount = audioChannelCount;
return this;
}
/**
- * Put a boolean value into the track.
+ * Sets the audio sample rate, in the unit of Hz. Valid for {@link #TYPE_AUDIO} tracks only.
*
- * @param key The key for referencing this value
- * @param value The boolean value to store
- * @return The Builder to allow chaining
+ * @param audioSampleRate The audio sample rate.
*/
- public Builder putBoolean(String key, boolean value) {
- mBundle.putBoolean(key, value);
+ public final Builder setAudioSampleRate(int audioSampleRate) {
+ if (mType != TYPE_AUDIO) {
+ throw new IllegalStateException("Not an audio track");
+ }
+ mAudioSampleRate = audioSampleRate;
+ return this;
+ }
+
+ /**
+ * Sets the width of the video, in the unit of pixels. Valid for {@link #TYPE_VIDEO} tracks
+ * only.
+ *
+ * @param videoWidth The width of the video.
+ */
+ public final Builder setVideoWidth(int videoWidth) {
+ if (mType != TYPE_VIDEO) {
+ throw new IllegalStateException("Not a video track");
+ }
+ mVideoWidth = videoWidth;
+ return this;
+ }
+
+ /**
+ * Sets the height of the video, in the unit of pixels. Valid for {@link #TYPE_VIDEO} tracks
+ * only.
+ *
+ * @param videoHeight The height of the video.
+ */
+ public final Builder setVideoHeight(int videoHeight) {
+ if (mType != TYPE_VIDEO) {
+ throw new IllegalStateException("Not a video track");
+ }
+ mVideoHeight = videoHeight;
+ return this;
+ }
+
+ /**
+ * Sets the extra information about the current track.
+ *
+ * @param extra The extra information.
+ */
+ public final Builder setExtra(Bundle extra) {
+ mExtra = new Bundle(extra);
return this;
}
@@ -286,7 +275,8 @@
* @return The new {@link TvTrackInfo} instance
*/
public TvTrackInfo build() {
- return new TvTrackInfo(mBundle);
+ return new TvTrackInfo(mType, mLanguage, mAudioChannelCount,
+ mAudioSampleRate, mVideoWidth, mVideoHeight, mExtra);
}
}
}
\ No newline at end of file
diff --git a/media/java/android/media/tv/TvView.java b/media/java/android/media/tv/TvView.java
index f6af8c8..2696a63 100644
--- a/media/java/android/media/tv/TvView.java
+++ b/media/java/android/media/tv/TvView.java
@@ -68,7 +68,7 @@
private final Handler mHandler = new Handler();
private Session mSession;
- private final SurfaceView mSurfaceView;
+ private SurfaceView mSurfaceView;
private Surface mSurface;
private boolean mOverlayViewCreated;
private Rect mOverlayViewFrame;
@@ -84,6 +84,8 @@
private int mSurfaceFormat;
private int mSurfaceWidth;
private int mSurfaceHeight;
+ private final AttributeSet mAttrs;
+ private final int mDefStyleAttr;
private final SurfaceHolder.Callback mSurfaceHolderCallback = new SurfaceHolder.Callback() {
@Override
@@ -143,14 +145,9 @@
public TvView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
- mSurfaceView = new SurfaceView(context, attrs, defStyleAttr) {
- @Override
- protected void updateWindow(boolean force, boolean redrawNeeded) {
- super.updateWindow(force, redrawNeeded);
- relayoutSessionOverlayView();
- }};
- mSurfaceView.getHolder().addCallback(mSurfaceHolderCallback);
- addView(mSurfaceView);
+ mAttrs = attrs;
+ mDefStyleAttr = defStyleAttr;
+ resetSurfaceView();
mTvInputManager = (TvInputManager) getContext().getSystemService(Context.TV_INPUT_SERVICE);
}
@@ -206,10 +203,23 @@
/**
* Tunes to a given channel.
*
- * @param inputId the id of TV input which will play the given channel.
+ * @param inputId The id of TV input which will play the given channel.
* @param channelUri The URI of a channel.
*/
public void tune(String inputId, Uri channelUri) {
+ tune(inputId, channelUri, null);
+ }
+
+ /**
+ * Tunes to a given channel.
+ *
+ * @param inputId The id of TV input which will play the given channel.
+ * @param channelUri The URI of a channel.
+ * @param params Extra parameters which might be handled with the tune event.
+ * @hide
+ */
+ @SystemApi
+ public void tune(String inputId, Uri channelUri, Bundle params) {
if (DEBUG) Log.d(TAG, "tune(" + channelUri + ")");
if (TextUtils.isEmpty(inputId)) {
throw new IllegalArgumentException("inputId cannot be null or an empty string");
@@ -221,22 +231,21 @@
}
if (mSessionCallback != null && mSessionCallback.mInputId.equals(inputId)) {
if (mSession != null) {
- mSession.tune(channelUri);
+ mSession.tune(channelUri, params);
} else {
// Session is not created yet. Replace the channel which will be set once the
// session is made.
mSessionCallback.mChannelUri = channelUri;
+ mSessionCallback.mTuneParams = params;
}
} else {
- if (mSession != null) {
- release();
- }
+ reset();
// When createSession() is called multiple times before the callback is called,
// only the callback of the last createSession() call will be actually called back.
// The previous callbacks will be ignored. For the logic, mSessionCallback
// is newly assigned for every createSession request and compared with
// MySessionCreateCallback.this.
- mSessionCallback = new MySessionCallback(inputId, channelUri);
+ mSessionCallback = new MySessionCallback(inputId, channelUri, params);
mTvInputManager.createSession(inputId, mSessionCallback, mHandler);
}
}
@@ -249,6 +258,7 @@
public void reset() {
if (mSession != null) {
release();
+ resetSurfaceView();
}
}
@@ -325,6 +335,17 @@
}
/**
+ * Returns a list of selected tracks. May return {@code null} if the information is not
+ * available.
+ */
+ public List<TvTrackInfo> getSelectedTracks() {
+ if (mSession == null) {
+ return null;
+ }
+ return mSession.getSelectedTracks();
+ }
+
+ /**
* Call {@link TvInputService.Session#appPrivateCommand(String, Bundle)
* TvInputService.Session.appPrivateCommand()} on the current TvView.
*
@@ -495,6 +516,21 @@
}
}
+ private void resetSurfaceView() {
+ if (mSurfaceView != null) {
+ mSurfaceView.getHolder().removeCallback(mSurfaceHolderCallback);
+ removeView(mSurfaceView);
+ }
+ mSurfaceView = new SurfaceView(getContext(), mAttrs, mDefStyleAttr) {
+ @Override
+ protected void updateWindow(boolean force, boolean redrawNeeded) {
+ super.updateWindow(force, redrawNeeded);
+ relayoutSessionOverlayView();
+ }};
+ mSurfaceView.getHolder().addCallback(mSurfaceHolderCallback);
+ addView(mSurfaceView);
+ }
+
private void release() {
setSessionSurface(null);
removeSessionOverlayView();
@@ -558,10 +594,9 @@
private void updateVideoSize(List<TvTrackInfo> tracks) {
for (TvTrackInfo track : tracks) {
- if (track.getBoolean(TvTrackInfo.KEY_IS_SELECTED)
- && track.getInt(TvTrackInfo.KEY_TYPE) == TvTrackInfo.VALUE_TYPE_VIDEO) {
- int width = track.getInt(TvTrackInfo.KEY_WIDTH);
- int height = track.getInt(TvTrackInfo.KEY_HEIGHT);
+ if (track.getType() == TvTrackInfo.TYPE_VIDEO) {
+ int width = track.getVideoWidth();
+ int height = track.getVideoHeight();
if (width != mVideoWidth || height != mVideoHeight) {
mVideoWidth = width;
mVideoHeight = height;
@@ -619,6 +654,15 @@
}
/**
+ * This is called when there is a change on the selected tracks.
+ *
+ * @param inputId The ID of the TV input bound to this view.
+ * @param selectedTracks A list which includes track information.
+ */
+ public void onTrackSelectionChanged(String inputId, List<TvTrackInfo> selectedTracks) {
+ }
+
+ /**
* This is called when the video is available, so the TV input starts the playback.
*
* @param inputId The ID of the TV input bound to this view.
@@ -692,10 +736,12 @@
private class MySessionCallback extends SessionCallback {
final String mInputId;
Uri mChannelUri;
+ Bundle mTuneParams;
- MySessionCallback(String inputId, Uri channelUri) {
+ MySessionCallback(String inputId, Uri channelUri, Bundle tuneParams) {
mInputId = inputId;
mChannelUri = channelUri;
+ mTuneParams = tuneParams;
}
@Override
@@ -724,7 +770,7 @@
}
}
createSessionOverlayView();
- mSession.tune(mChannelUri);
+ mSession.tune(mChannelUri, mTuneParams);
if (mHasStreamVolume) {
mSession.setStreamVolume(mStreamVolume);
}
@@ -768,13 +814,26 @@
if (DEBUG) {
Log.d(TAG, "onTrackInfoChanged()");
}
- updateVideoSize(tracks);
if (mListener != null) {
mListener.onTrackInfoChanged(mInputId, tracks);
}
}
@Override
+ public void onTrackSelectionChanged(Session session, List<TvTrackInfo> selectedTracks) {
+ if (this != mSessionCallback) {
+ return;
+ }
+ if (DEBUG) {
+ Log.d(TAG, "onTrackInfoChanged()");
+ }
+ updateVideoSize(selectedTracks);
+ if (mListener != null) {
+ mListener.onTrackSelectionChanged(mInputId, selectedTracks);
+ }
+ }
+
+ @Override
public void onVideoAvailable(Session session) {
if (this != mSessionCallback) {
return;
diff --git a/packages/CaptivePortalLogin/res/values-af/strings.xml b/packages/CaptivePortalLogin/res/values-af/strings.xml
new file mode 100644
index 0000000..a543266
--- /dev/null
+++ b/packages/CaptivePortalLogin/res/values-af/strings.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="5934709770924185752">"CaptivePortal-aanmelding"</string>
+ <string name="action_use_network" msgid="6076184727448466030">"Gebruik hierdie netwerk nes dit is"</string>
+ <string name="action_do_not_use_network" msgid="4577366536956516683">"Moenie hierdie netwerk gebruik nie"</string>
+ <string name="action_bar_label" msgid="2573986763322074279">"Meld aan by netwerk"</string>
+</resources>
diff --git a/packages/CaptivePortalLogin/res/values-am/strings.xml b/packages/CaptivePortalLogin/res/values-am/strings.xml
new file mode 100644
index 0000000..bfad2d1
--- /dev/null
+++ b/packages/CaptivePortalLogin/res/values-am/strings.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="5934709770924185752">"CaptivePortalLogin"</string>
+ <string name="action_use_network" msgid="6076184727448466030">"ይህን አውታረ መረብ እንዳለ ተጠቀምበት"</string>
+ <string name="action_do_not_use_network" msgid="4577366536956516683">"ይህን አውታረ መረብ አትጠቀምበት"</string>
+ <string name="action_bar_label" msgid="2573986763322074279">"ወደ አውታረ መረብ በመለያ ይግቡ"</string>
+</resources>
diff --git a/packages/CaptivePortalLogin/res/values-ar/strings.xml b/packages/CaptivePortalLogin/res/values-ar/strings.xml
new file mode 100644
index 0000000..cb2e484
--- /dev/null
+++ b/packages/CaptivePortalLogin/res/values-ar/strings.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="5934709770924185752">"CaptivePortalLogin"</string>
+ <string name="action_use_network" msgid="6076184727448466030">"استخدام هذه الشبكة كما هي"</string>
+ <string name="action_do_not_use_network" msgid="4577366536956516683">"عدم استخدام هذه الشبكة"</string>
+ <string name="action_bar_label" msgid="2573986763322074279">"تسجيل الدخول إلى الشبكة"</string>
+</resources>
diff --git a/packages/CaptivePortalLogin/res/values-bg/strings.xml b/packages/CaptivePortalLogin/res/values-bg/strings.xml
new file mode 100644
index 0000000..c56af54
--- /dev/null
+++ b/packages/CaptivePortalLogin/res/values-bg/strings.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="5934709770924185752">"CaptivePortalLogin"</string>
+ <string name="action_use_network" msgid="6076184727448466030">"Директно използване на тази мрежа"</string>
+ <string name="action_do_not_use_network" msgid="4577366536956516683">"Без използване на тази мрежа"</string>
+ <string name="action_bar_label" msgid="2573986763322074279">"Вход в мрежата"</string>
+</resources>
diff --git a/packages/CaptivePortalLogin/res/values-bn-rBD/strings.xml b/packages/CaptivePortalLogin/res/values-bn-rBD/strings.xml
new file mode 100644
index 0000000..51a2b78
--- /dev/null
+++ b/packages/CaptivePortalLogin/res/values-bn-rBD/strings.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="5934709770924185752">"CaptivePortalLogin"</string>
+ <string name="action_use_network" msgid="6076184727448466030">"যেভাবে আছে সেভাবেই এই নেটওয়ার্ক ব্যবহার করুন"</string>
+ <string name="action_do_not_use_network" msgid="4577366536956516683">"এই নেটওয়ার্ক ব্যবহার করবেন না"</string>
+ <string name="action_bar_label" msgid="2573986763322074279">"নেটওয়ার্কে সাইন ইন করুন"</string>
+</resources>
diff --git a/packages/CaptivePortalLogin/res/values-ca/strings.xml b/packages/CaptivePortalLogin/res/values-ca/strings.xml
new file mode 100644
index 0000000..a26a11d
--- /dev/null
+++ b/packages/CaptivePortalLogin/res/values-ca/strings.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="5934709770924185752">"CaptivePortalLogin"</string>
+ <string name="action_use_network" msgid="6076184727448466030">"Fes servir aquesta xarxa tal com està."</string>
+ <string name="action_do_not_use_network" msgid="4577366536956516683">"No facis servir aquesta xarxa."</string>
+ <string name="action_bar_label" msgid="2573986763322074279">"Inicia la sessió a la xarxa."</string>
+</resources>
diff --git a/packages/CaptivePortalLogin/res/values-cs/strings.xml b/packages/CaptivePortalLogin/res/values-cs/strings.xml
new file mode 100644
index 0000000..a1639b8
--- /dev/null
+++ b/packages/CaptivePortalLogin/res/values-cs/strings.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="5934709770924185752">"CaptivePortalLogin"</string>
+ <string name="action_use_network" msgid="6076184727448466030">"Použít tuto síť tak, jak je"</string>
+ <string name="action_do_not_use_network" msgid="4577366536956516683">"Tuto síť nepoužívat"</string>
+ <string name="action_bar_label" msgid="2573986763322074279">"Přihlásit se k síti"</string>
+</resources>
diff --git a/packages/CaptivePortalLogin/res/values-da/strings.xml b/packages/CaptivePortalLogin/res/values-da/strings.xml
new file mode 100644
index 0000000..a48eeac
--- /dev/null
+++ b/packages/CaptivePortalLogin/res/values-da/strings.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="5934709770924185752">"Login til captive portal"</string>
+ <string name="action_use_network" msgid="6076184727448466030">"Brug dette netværk, som det er"</string>
+ <string name="action_do_not_use_network" msgid="4577366536956516683">"Brug ikke dette netværk"</string>
+ <string name="action_bar_label" msgid="2573986763322074279">"Login til netværk"</string>
+</resources>
diff --git a/packages/CaptivePortalLogin/res/values-de/strings.xml b/packages/CaptivePortalLogin/res/values-de/strings.xml
new file mode 100644
index 0000000..86c8d1f
--- /dev/null
+++ b/packages/CaptivePortalLogin/res/values-de/strings.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="5934709770924185752">"CaptivePortalLogin"</string>
+ <string name="action_use_network" msgid="6076184727448466030">"Dieses Netzwerk im Istzustand verwenden"</string>
+ <string name="action_do_not_use_network" msgid="4577366536956516683">"Dieses Netzwerk nicht verwenden"</string>
+ <string name="action_bar_label" msgid="2573986763322074279">"Im Netzwerk anmelden"</string>
+</resources>
diff --git a/packages/CaptivePortalLogin/res/values-el/strings.xml b/packages/CaptivePortalLogin/res/values-el/strings.xml
new file mode 100644
index 0000000..f9a5b0f
--- /dev/null
+++ b/packages/CaptivePortalLogin/res/values-el/strings.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="5934709770924185752">"CaptivePortalLogin"</string>
+ <string name="action_use_network" msgid="6076184727448466030">"Χρήση αυτού του δικτύου ως έχει"</string>
+ <string name="action_do_not_use_network" msgid="4577366536956516683">"Να μη χρησιμοποιείται αυτό το δίκτυο"</string>
+ <string name="action_bar_label" msgid="2573986763322074279">"Σύνδεση στο δίκτυο"</string>
+</resources>
diff --git a/packages/CaptivePortalLogin/res/values-es-rUS/strings.xml b/packages/CaptivePortalLogin/res/values-es-rUS/strings.xml
new file mode 100644
index 0000000..2c2e882
--- /dev/null
+++ b/packages/CaptivePortalLogin/res/values-es-rUS/strings.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="5934709770924185752">"CaptivePortalLogin"</string>
+ <string name="action_use_network" msgid="6076184727448466030">"Usar esta red como está"</string>
+ <string name="action_do_not_use_network" msgid="4577366536956516683">"No usar esta red"</string>
+ <string name="action_bar_label" msgid="2573986763322074279">"Acceder a la red"</string>
+</resources>
diff --git a/packages/CaptivePortalLogin/res/values-es/strings.xml b/packages/CaptivePortalLogin/res/values-es/strings.xml
new file mode 100644
index 0000000..6ea2ab7
--- /dev/null
+++ b/packages/CaptivePortalLogin/res/values-es/strings.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="5934709770924185752">"CaptivePortalLogin"</string>
+ <string name="action_use_network" msgid="6076184727448466030">"Utilizar esta red tal cual"</string>
+ <string name="action_do_not_use_network" msgid="4577366536956516683">"No utilizar esta red"</string>
+ <string name="action_bar_label" msgid="2573986763322074279">"Iniciar sesión en red"</string>
+</resources>
diff --git a/packages/CaptivePortalLogin/res/values-et-rEE/strings.xml b/packages/CaptivePortalLogin/res/values-et-rEE/strings.xml
new file mode 100644
index 0000000..95c7eba
--- /dev/null
+++ b/packages/CaptivePortalLogin/res/values-et-rEE/strings.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="5934709770924185752">"CaptivePortalLogin"</string>
+ <string name="action_use_network" msgid="6076184727448466030">"Kasuta seda võrku olemasoleval kujul"</string>
+ <string name="action_do_not_use_network" msgid="4577366536956516683">"Ära kasuta seda võrku"</string>
+ <string name="action_bar_label" msgid="2573986763322074279">"Võrku sisselogimine"</string>
+</resources>
diff --git a/packages/CaptivePortalLogin/res/values-eu-rES/strings.xml b/packages/CaptivePortalLogin/res/values-eu-rES/strings.xml
new file mode 100644
index 0000000..98ccb53
--- /dev/null
+++ b/packages/CaptivePortalLogin/res/values-eu-rES/strings.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="5934709770924185752">"CaptivePortalLogin"</string>
+ <string name="action_use_network" msgid="6076184727448466030">"Erabili sare hau bere horretan"</string>
+ <string name="action_do_not_use_network" msgid="4577366536956516683">"Ez erabili sare hau"</string>
+ <string name="action_bar_label" msgid="2573986763322074279">"Hasi saioa sarean"</string>
+</resources>
diff --git a/packages/CaptivePortalLogin/res/values-fa/strings.xml b/packages/CaptivePortalLogin/res/values-fa/strings.xml
new file mode 100644
index 0000000..36e53c1
--- /dev/null
+++ b/packages/CaptivePortalLogin/res/values-fa/strings.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="5934709770924185752">"CaptivePortalLogin"</string>
+ <string name="action_use_network" msgid="6076184727448466030">"از این شبکه همانطور که هست استفاده شود"</string>
+ <string name="action_do_not_use_network" msgid="4577366536956516683">"از این شبکه استفاده نشود"</string>
+ <string name="action_bar_label" msgid="2573986763322074279">"وارد شدن به سیستم شبکه"</string>
+</resources>
diff --git a/packages/CaptivePortalLogin/res/values-fi/strings.xml b/packages/CaptivePortalLogin/res/values-fi/strings.xml
new file mode 100644
index 0000000..fb44d99
--- /dev/null
+++ b/packages/CaptivePortalLogin/res/values-fi/strings.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="5934709770924185752">"CaptivePortalLogin"</string>
+ <string name="action_use_network" msgid="6076184727448466030">"Käytä tätä verkkoa sellaisenaan"</string>
+ <string name="action_do_not_use_network" msgid="4577366536956516683">"Älä käytä tätä verkkoa"</string>
+ <string name="action_bar_label" msgid="2573986763322074279">"Kirjaudu verkkoon"</string>
+</resources>
diff --git a/packages/CaptivePortalLogin/res/values-fr-rCA/strings.xml b/packages/CaptivePortalLogin/res/values-fr-rCA/strings.xml
new file mode 100644
index 0000000..7ef7449
--- /dev/null
+++ b/packages/CaptivePortalLogin/res/values-fr-rCA/strings.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="5934709770924185752">"CaptivePortalLogin"</string>
+ <string name="action_use_network" msgid="6076184727448466030">"Utiliser ce réseau tel quel"</string>
+ <string name="action_do_not_use_network" msgid="4577366536956516683">"Ne pas utiliser ce réseau"</string>
+ <string name="action_bar_label" msgid="2573986763322074279">"Connectez-vous au réseau"</string>
+</resources>
diff --git a/packages/CaptivePortalLogin/res/values-fr/strings.xml b/packages/CaptivePortalLogin/res/values-fr/strings.xml
new file mode 100644
index 0000000..b8cb9d2
--- /dev/null
+++ b/packages/CaptivePortalLogin/res/values-fr/strings.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="5934709770924185752">"CaptivePortalLogin"</string>
+ <string name="action_use_network" msgid="6076184727448466030">"Utiliser ce réseau tel quel"</string>
+ <string name="action_do_not_use_network" msgid="4577366536956516683">"Ne pas utiliser ce réseau"</string>
+ <string name="action_bar_label" msgid="2573986763322074279">"Se connecter au réseau"</string>
+</resources>
diff --git a/packages/CaptivePortalLogin/res/values-gl-rES/strings.xml b/packages/CaptivePortalLogin/res/values-gl-rES/strings.xml
new file mode 100644
index 0000000..0c967d5
--- /dev/null
+++ b/packages/CaptivePortalLogin/res/values-gl-rES/strings.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="5934709770924185752">"CaptivePortalLogin"</string>
+ <string name="action_use_network" msgid="6076184727448466030">"Utilizar esta rede tal como está"</string>
+ <string name="action_do_not_use_network" msgid="4577366536956516683">"Non utilizar esta rede"</string>
+ <string name="action_bar_label" msgid="2573986763322074279">"Inicia sesión na rede"</string>
+</resources>
diff --git a/packages/CaptivePortalLogin/res/values-hi/strings.xml b/packages/CaptivePortalLogin/res/values-hi/strings.xml
new file mode 100644
index 0000000..2bf4a07
--- /dev/null
+++ b/packages/CaptivePortalLogin/res/values-hi/strings.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="5934709770924185752">"CaptivePortalLogin"</string>
+ <string name="action_use_network" msgid="6076184727448466030">"इस नेटवर्क का उपयोग जैसा है वैसा ही करें"</string>
+ <string name="action_do_not_use_network" msgid="4577366536956516683">"इस नेटवर्क का उपयोग न करें"</string>
+ <string name="action_bar_label" msgid="2573986763322074279">"नेटवर्क में प्रवेश करें"</string>
+</resources>
diff --git a/packages/CaptivePortalLogin/res/values-hr/strings.xml b/packages/CaptivePortalLogin/res/values-hr/strings.xml
new file mode 100644
index 0000000..1a51195
--- /dev/null
+++ b/packages/CaptivePortalLogin/res/values-hr/strings.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="5934709770924185752">"CaptivePortalLogin"</string>
+ <string name="action_use_network" msgid="6076184727448466030">"Upotrebljavaj ovu mrežu u zatečenom stanju"</string>
+ <string name="action_do_not_use_network" msgid="4577366536956516683">"Ne upotrebljavaj ovu mrežu"</string>
+ <string name="action_bar_label" msgid="2573986763322074279">"Prijavi se na mrežu"</string>
+</resources>
diff --git a/packages/CaptivePortalLogin/res/values-hu/strings.xml b/packages/CaptivePortalLogin/res/values-hu/strings.xml
new file mode 100644
index 0000000..ea3a66b
--- /dev/null
+++ b/packages/CaptivePortalLogin/res/values-hu/strings.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="5934709770924185752">"CaptivePortalLogin"</string>
+ <string name="action_use_network" msgid="6076184727448466030">"Hálózat használata jelen állapotában"</string>
+ <string name="action_do_not_use_network" msgid="4577366536956516683">"Ne használja ezt a hálózatot"</string>
+ <string name="action_bar_label" msgid="2573986763322074279">"Bejelentkezés a hálózatba"</string>
+</resources>
diff --git a/packages/CaptivePortalLogin/res/values-hy-rAM/strings.xml b/packages/CaptivePortalLogin/res/values-hy-rAM/strings.xml
new file mode 100644
index 0000000..381b53d
--- /dev/null
+++ b/packages/CaptivePortalLogin/res/values-hy-rAM/strings.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="5934709770924185752">"CaptivePortalLogin"</string>
+ <string name="action_use_network" msgid="6076184727448466030">"Օգտագործել այս ցանցն ինչպես կա"</string>
+ <string name="action_do_not_use_network" msgid="4577366536956516683">"Չօգտագործել այս ցանցը"</string>
+ <string name="action_bar_label" msgid="2573986763322074279">"Մուտք գործել ցանց"</string>
+</resources>
diff --git a/packages/CaptivePortalLogin/res/values-in/strings.xml b/packages/CaptivePortalLogin/res/values-in/strings.xml
new file mode 100644
index 0000000..20a15ca
--- /dev/null
+++ b/packages/CaptivePortalLogin/res/values-in/strings.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="5934709770924185752">"CaptivePortalLogin"</string>
+ <string name="action_use_network" msgid="6076184727448466030">"Gunakan jaringan ini sebagaimana adanya"</string>
+ <string name="action_do_not_use_network" msgid="4577366536956516683">"Jangan gunakan jaringan ini"</string>
+ <string name="action_bar_label" msgid="2573986763322074279">"Masuk ke jaringan"</string>
+</resources>
diff --git a/packages/CaptivePortalLogin/res/values-is-rIS/strings.xml b/packages/CaptivePortalLogin/res/values-is-rIS/strings.xml
new file mode 100644
index 0000000..127bb83
--- /dev/null
+++ b/packages/CaptivePortalLogin/res/values-is-rIS/strings.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="5934709770924185752">"CaptivePortalLogin"</string>
+ <string name="action_use_network" msgid="6076184727448466030">"Nota þetta net óbreytt"</string>
+ <string name="action_do_not_use_network" msgid="4577366536956516683">"Ekki nota þetta net"</string>
+ <string name="action_bar_label" msgid="2573986763322074279">"Skrá þig inn á netið"</string>
+</resources>
diff --git a/packages/CaptivePortalLogin/res/values-it/strings.xml b/packages/CaptivePortalLogin/res/values-it/strings.xml
new file mode 100644
index 0000000..0c62b98
--- /dev/null
+++ b/packages/CaptivePortalLogin/res/values-it/strings.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="5934709770924185752">"CaptivePortalLogin"</string>
+ <string name="action_use_network" msgid="6076184727448466030">"Utilizza questa rete così com\'è"</string>
+ <string name="action_do_not_use_network" msgid="4577366536956516683">"Non utilizzare questa rete"</string>
+ <string name="action_bar_label" msgid="2573986763322074279">"Accedi alla rete"</string>
+</resources>
diff --git a/packages/CaptivePortalLogin/res/values-iw/strings.xml b/packages/CaptivePortalLogin/res/values-iw/strings.xml
new file mode 100644
index 0000000..9abfb61
--- /dev/null
+++ b/packages/CaptivePortalLogin/res/values-iw/strings.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="5934709770924185752">"CaptivePortalLogin"</string>
+ <string name="action_use_network" msgid="6076184727448466030">"השתמש ברשת זו כפי שהיא"</string>
+ <string name="action_do_not_use_network" msgid="4577366536956516683">"אל תשתמש ברשת זו"</string>
+ <string name="action_bar_label" msgid="2573986763322074279">"היכנס לרשת"</string>
+</resources>
diff --git a/packages/CaptivePortalLogin/res/values-ja/strings.xml b/packages/CaptivePortalLogin/res/values-ja/strings.xml
new file mode 100644
index 0000000..1328011
--- /dev/null
+++ b/packages/CaptivePortalLogin/res/values-ja/strings.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="5934709770924185752">"CaptivePortalLogin"</string>
+ <string name="action_use_network" msgid="6076184727448466030">"このネットワークをそのまま使用する"</string>
+ <string name="action_do_not_use_network" msgid="4577366536956516683">"このネットワークを使用しない"</string>
+ <string name="action_bar_label" msgid="2573986763322074279">"ネットワークにログインする"</string>
+</resources>
diff --git a/packages/CaptivePortalLogin/res/values-ka-rGE/strings.xml b/packages/CaptivePortalLogin/res/values-ka-rGE/strings.xml
new file mode 100644
index 0000000..a429669
--- /dev/null
+++ b/packages/CaptivePortalLogin/res/values-ka-rGE/strings.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="5934709770924185752">"CaptivePortalLogin"</string>
+ <string name="action_use_network" msgid="6076184727448466030">"ამ ქსელის გამოყენება, როგორც არის"</string>
+ <string name="action_do_not_use_network" msgid="4577366536956516683">"ეს ქსელი არ გამოიყენო"</string>
+ <string name="action_bar_label" msgid="2573986763322074279">"ქსელთან დაკავშირება"</string>
+</resources>
diff --git a/packages/CaptivePortalLogin/res/values-kk-rKZ/strings.xml b/packages/CaptivePortalLogin/res/values-kk-rKZ/strings.xml
new file mode 100644
index 0000000..fcb6584
--- /dev/null
+++ b/packages/CaptivePortalLogin/res/values-kk-rKZ/strings.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="5934709770924185752">"CaptivePortalLogin"</string>
+ <string name="action_use_network" msgid="6076184727448466030">"Осы желіні бар күйінде пайдалану"</string>
+ <string name="action_do_not_use_network" msgid="4577366536956516683">"Осы желіні пайдаланбау"</string>
+ <string name="action_bar_label" msgid="2573986763322074279">"Желіге кіру"</string>
+</resources>
diff --git a/packages/CaptivePortalLogin/res/values-km-rKH/strings.xml b/packages/CaptivePortalLogin/res/values-km-rKH/strings.xml
new file mode 100644
index 0000000..8cdedd4
--- /dev/null
+++ b/packages/CaptivePortalLogin/res/values-km-rKH/strings.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="5934709770924185752">"CaptivePortalLogin"</string>
+ <string name="action_use_network" msgid="6076184727448466030">"ប្រើបណ្ដាញនេះជា"</string>
+ <string name="action_do_not_use_network" msgid="4577366536956516683">"កុំប្រើបណ្ដាញនេះ"</string>
+ <string name="action_bar_label" msgid="2573986763322074279">"ចូលបណ្ដាញ"</string>
+</resources>
diff --git a/packages/CaptivePortalLogin/res/values-kn-rIN/strings.xml b/packages/CaptivePortalLogin/res/values-kn-rIN/strings.xml
new file mode 100644
index 0000000..070ba52
--- /dev/null
+++ b/packages/CaptivePortalLogin/res/values-kn-rIN/strings.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="5934709770924185752">"CaptivePortalLogin"</string>
+ <string name="action_use_network" msgid="6076184727448466030">"ಈ ನೆಟ್ವರ್ಕ್ ಅನ್ನು ಹೀಗೆ ಬಳಸಿ"</string>
+ <string name="action_do_not_use_network" msgid="4577366536956516683">"ಈ ನೆಟ್ವರ್ಕ್ ಬಳಸಬೇಡಿ"</string>
+ <string name="action_bar_label" msgid="2573986763322074279">"ನೆಟ್ವರ್ಕ್ಗೆ ಸೈನ್ ಇನ್ ಮಾಡಿ"</string>
+</resources>
diff --git a/packages/CaptivePortalLogin/res/values-ko/strings.xml b/packages/CaptivePortalLogin/res/values-ko/strings.xml
new file mode 100644
index 0000000..c72511b
--- /dev/null
+++ b/packages/CaptivePortalLogin/res/values-ko/strings.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="5934709770924185752">"CaptivePortalLogin"</string>
+ <string name="action_use_network" msgid="6076184727448466030">"현재 상태로 이 네트워크 사용"</string>
+ <string name="action_do_not_use_network" msgid="4577366536956516683">"이 네트워크 사용 안함"</string>
+ <string name="action_bar_label" msgid="2573986763322074279">"네트워크에 로그인"</string>
+</resources>
diff --git a/packages/CaptivePortalLogin/res/values-ky-rKG/strings.xml b/packages/CaptivePortalLogin/res/values-ky-rKG/strings.xml
new file mode 100644
index 0000000..eb16c6c
--- /dev/null
+++ b/packages/CaptivePortalLogin/res/values-ky-rKG/strings.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="5934709770924185752">"CaptivePortalLogin"</string>
+ <string name="action_use_network" msgid="6076184727448466030">"Бул тармак кандай болсо, ошондой колдонулсун"</string>
+ <string name="action_do_not_use_network" msgid="4577366536956516683">"Бул тармак колдонулбасын"</string>
+ <string name="action_bar_label" msgid="2573986763322074279">"Тармакка кирүү"</string>
+</resources>
diff --git a/packages/CaptivePortalLogin/res/values-lo-rLA/strings.xml b/packages/CaptivePortalLogin/res/values-lo-rLA/strings.xml
new file mode 100644
index 0000000..f2b637c
--- /dev/null
+++ b/packages/CaptivePortalLogin/res/values-lo-rLA/strings.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="5934709770924185752">"CaptivePortalLogin"</string>
+ <string name="action_use_network" msgid="6076184727448466030">"ໃຊ້ເຄືອຂ່າຍນີ້ຕາມທີ່ມັນເປັນ"</string>
+ <string name="action_do_not_use_network" msgid="4577366536956516683">"ບໍ່ໃຊ້ເຄືອຂ່າຍນີ້"</string>
+ <string name="action_bar_label" msgid="2573986763322074279">"ເຂົ້າສູ່ລະບົບຫາເຄືອຂ່າຍ"</string>
+</resources>
diff --git a/packages/CaptivePortalLogin/res/values-lt/strings.xml b/packages/CaptivePortalLogin/res/values-lt/strings.xml
new file mode 100644
index 0000000..00ca28d
--- /dev/null
+++ b/packages/CaptivePortalLogin/res/values-lt/strings.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="5934709770924185752">"CaptivePortalLogin"</string>
+ <string name="action_use_network" msgid="6076184727448466030">"Naudoti šį tinklą tokį, koks yra"</string>
+ <string name="action_do_not_use_network" msgid="4577366536956516683">"Nenaudoti šio tinklo"</string>
+ <string name="action_bar_label" msgid="2573986763322074279">"Prisijungti prie tinklo"</string>
+</resources>
diff --git a/packages/CaptivePortalLogin/res/values-lv/strings.xml b/packages/CaptivePortalLogin/res/values-lv/strings.xml
new file mode 100644
index 0000000..0912497
--- /dev/null
+++ b/packages/CaptivePortalLogin/res/values-lv/strings.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="5934709770924185752">"CaptivePortalLogin"</string>
+ <string name="action_use_network" msgid="6076184727448466030">"Izmantot tīklu ar pašreizējiem iestatījumiem"</string>
+ <string name="action_do_not_use_network" msgid="4577366536956516683">"Neizmantot šo tīklu"</string>
+ <string name="action_bar_label" msgid="2573986763322074279">"Pierakstīties tīklā"</string>
+</resources>
diff --git a/packages/CaptivePortalLogin/res/values-mk-rMK/strings.xml b/packages/CaptivePortalLogin/res/values-mk-rMK/strings.xml
new file mode 100644
index 0000000..5fd27a2
--- /dev/null
+++ b/packages/CaptivePortalLogin/res/values-mk-rMK/strings.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="5934709770924185752">"CaptivePortalLogin"</string>
+ <string name="action_use_network" msgid="6076184727448466030">"Користи ја мрежата во оваа состојба"</string>
+ <string name="action_do_not_use_network" msgid="4577366536956516683">"Не ја користи мрежата"</string>
+ <string name="action_bar_label" msgid="2573986763322074279">"Пријави се на мрежа"</string>
+</resources>
diff --git a/packages/CaptivePortalLogin/res/values-ml-rIN/strings.xml b/packages/CaptivePortalLogin/res/values-ml-rIN/strings.xml
new file mode 100644
index 0000000..ff7c6cc
--- /dev/null
+++ b/packages/CaptivePortalLogin/res/values-ml-rIN/strings.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="5934709770924185752">"CaptivePortalLogin"</string>
+ <string name="action_use_network" msgid="6076184727448466030">"ഈ നെറ്റ്വർക്ക് മാറ്റമൊന്നും വരുത്താതെ ഉപയോഗിക്കുക"</string>
+ <string name="action_do_not_use_network" msgid="4577366536956516683">"ഈ നെറ്റ്വർക്ക് ഉപയോഗിക്കരുത്"</string>
+ <string name="action_bar_label" msgid="2573986763322074279">"നെറ്റ്വർക്കിൽ സൈൻ ഇൻ ചെയ്യുക"</string>
+</resources>
diff --git a/packages/CaptivePortalLogin/res/values-mn-rMN/strings.xml b/packages/CaptivePortalLogin/res/values-mn-rMN/strings.xml
new file mode 100644
index 0000000..5ce9e7e
--- /dev/null
+++ b/packages/CaptivePortalLogin/res/values-mn-rMN/strings.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="5934709770924185752">"CaptivePortalLogin"</string>
+ <string name="action_use_network" msgid="6076184727448466030">"Энэ сүлжээг ашиглана уу"</string>
+ <string name="action_do_not_use_network" msgid="4577366536956516683">"Энэ сүлжээг бүү ашиглана уу"</string>
+ <string name="action_bar_label" msgid="2573986763322074279">"Сүлжээнд нэвтрэх"</string>
+</resources>
diff --git a/packages/CaptivePortalLogin/res/values-mr-rIN/strings.xml b/packages/CaptivePortalLogin/res/values-mr-rIN/strings.xml
new file mode 100644
index 0000000..082e7ad
--- /dev/null
+++ b/packages/CaptivePortalLogin/res/values-mr-rIN/strings.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="5934709770924185752">"CaptivePortalLogin"</string>
+ <string name="action_use_network" msgid="6076184727448466030">"हे नेटवर्क जसेच्या तसे वापरा"</string>
+ <string name="action_do_not_use_network" msgid="4577366536956516683">"हे नेटवर्क वापरू नका"</string>
+ <string name="action_bar_label" msgid="2573986763322074279">"नेटवर्कवर साइन इन करा"</string>
+</resources>
diff --git a/packages/CaptivePortalLogin/res/values-ms-rMY/strings.xml b/packages/CaptivePortalLogin/res/values-ms-rMY/strings.xml
new file mode 100644
index 0000000..f3d2918
--- /dev/null
+++ b/packages/CaptivePortalLogin/res/values-ms-rMY/strings.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="5934709770924185752">"CaptivePortalLogin"</string>
+ <string name="action_use_network" msgid="6076184727448466030">"Gunakan rangkaian ini"</string>
+ <string name="action_do_not_use_network" msgid="4577366536956516683">"Jangan gunakan rangkaian ini"</string>
+ <string name="action_bar_label" msgid="2573986763322074279">"Log masuk ke rangkaian"</string>
+</resources>
diff --git a/packages/CaptivePortalLogin/res/values-nb/strings.xml b/packages/CaptivePortalLogin/res/values-nb/strings.xml
new file mode 100644
index 0000000..8bdf95b
--- /dev/null
+++ b/packages/CaptivePortalLogin/res/values-nb/strings.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="5934709770924185752">"CaptivePortalLogin"</string>
+ <string name="action_use_network" msgid="6076184727448466030">"Bruk dette nettverket som det er"</string>
+ <string name="action_do_not_use_network" msgid="4577366536956516683">"Ikke bruk dette nettverket"</string>
+ <string name="action_bar_label" msgid="2573986763322074279">"Logg på nettverk"</string>
+</resources>
diff --git a/packages/CaptivePortalLogin/res/values-ne-rNP/strings.xml b/packages/CaptivePortalLogin/res/values-ne-rNP/strings.xml
new file mode 100644
index 0000000..7fcaf07
--- /dev/null
+++ b/packages/CaptivePortalLogin/res/values-ne-rNP/strings.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="5934709770924185752">"CaptivePortalLogin"</string>
+ <string name="action_use_network" msgid="6076184727448466030">"यो सञ्जाल जस्तो छ प्रयोग गर्नुहोस्"</string>
+ <string name="action_do_not_use_network" msgid="4577366536956516683">"यो सञ्जाल प्रयोग नगर्नुहोस्"</string>
+ <string name="action_bar_label" msgid="2573986763322074279">"सञ्जालमा साइन इन गर्नुहोस्"</string>
+</resources>
diff --git a/packages/CaptivePortalLogin/res/values-nl/strings.xml b/packages/CaptivePortalLogin/res/values-nl/strings.xml
new file mode 100644
index 0000000..063c91e
--- /dev/null
+++ b/packages/CaptivePortalLogin/res/values-nl/strings.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="5934709770924185752">"CaptivePortalLogin"</string>
+ <string name="action_use_network" msgid="6076184727448466030">"Dit netwerk in de huidige staat gebruiken"</string>
+ <string name="action_do_not_use_network" msgid="4577366536956516683">"Dit netwerk niet gebruiken"</string>
+ <string name="action_bar_label" msgid="2573986763322074279">"Inloggen bij netwerk"</string>
+</resources>
diff --git a/packages/CaptivePortalLogin/res/values-pl/strings.xml b/packages/CaptivePortalLogin/res/values-pl/strings.xml
new file mode 100644
index 0000000..e1f6eb4
--- /dev/null
+++ b/packages/CaptivePortalLogin/res/values-pl/strings.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="5934709770924185752">"CaptivePortalLogin"</string>
+ <string name="action_use_network" msgid="6076184727448466030">"Używaj tej sieci tak jak jest"</string>
+ <string name="action_do_not_use_network" msgid="4577366536956516683">"Nie używaj tej sieci"</string>
+ <string name="action_bar_label" msgid="2573986763322074279">"Zaloguj się w sieci"</string>
+</resources>
diff --git a/packages/CaptivePortalLogin/res/values-pt-rPT/strings.xml b/packages/CaptivePortalLogin/res/values-pt-rPT/strings.xml
new file mode 100644
index 0000000..1b07222
--- /dev/null
+++ b/packages/CaptivePortalLogin/res/values-pt-rPT/strings.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="5934709770924185752">"CaptivePortalLogin"</string>
+ <string name="action_use_network" msgid="6076184727448466030">"Utilizar esta rede como está"</string>
+ <string name="action_do_not_use_network" msgid="4577366536956516683">"Não utilizar esta rede"</string>
+ <string name="action_bar_label" msgid="2573986763322074279">"Início de sessão na rede"</string>
+</resources>
diff --git a/packages/CaptivePortalLogin/res/values-pt/strings.xml b/packages/CaptivePortalLogin/res/values-pt/strings.xml
new file mode 100644
index 0000000..4208912
--- /dev/null
+++ b/packages/CaptivePortalLogin/res/values-pt/strings.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="5934709770924185752">"CaptivePortalLogin"</string>
+ <string name="action_use_network" msgid="6076184727448466030">"Usar esta rede como está"</string>
+ <string name="action_do_not_use_network" msgid="4577366536956516683">"Não usar esta rede"</string>
+ <string name="action_bar_label" msgid="2573986763322074279">"Fazer login na rede"</string>
+</resources>
diff --git a/packages/CaptivePortalLogin/res/values-ro/strings.xml b/packages/CaptivePortalLogin/res/values-ro/strings.xml
new file mode 100644
index 0000000..272967f
--- /dev/null
+++ b/packages/CaptivePortalLogin/res/values-ro/strings.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="5934709770924185752">"CaptivePortalLogin"</string>
+ <string name="action_use_network" msgid="6076184727448466030">"Utilizați această rețea în starea actuală"</string>
+ <string name="action_do_not_use_network" msgid="4577366536956516683">"Nu utilizați această rețea"</string>
+ <string name="action_bar_label" msgid="2573986763322074279">"Conectați-vă la rețea"</string>
+</resources>
diff --git a/packages/CaptivePortalLogin/res/values-ru/strings.xml b/packages/CaptivePortalLogin/res/values-ru/strings.xml
new file mode 100644
index 0000000..6e7a85f
--- /dev/null
+++ b/packages/CaptivePortalLogin/res/values-ru/strings.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="5934709770924185752">"CaptivePortalLogin"</string>
+ <string name="action_use_network" msgid="6076184727448466030">"Использовать эту сеть"</string>
+ <string name="action_do_not_use_network" msgid="4577366536956516683">"Не использовать эту сеть"</string>
+ <string name="action_bar_label" msgid="2573986763322074279">"Подключиться к сети"</string>
+</resources>
diff --git a/packages/CaptivePortalLogin/res/values-si-rLK/strings.xml b/packages/CaptivePortalLogin/res/values-si-rLK/strings.xml
new file mode 100644
index 0000000..7fb17b9
--- /dev/null
+++ b/packages/CaptivePortalLogin/res/values-si-rLK/strings.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="5934709770924185752">"CaptivePortalLogin"</string>
+ <string name="action_use_network" msgid="6076184727448466030">"මෙම ජාලය ලෙසම භාවිතා කරන්න"</string>
+ <string name="action_do_not_use_network" msgid="4577366536956516683">"මෙම ජාලය භාවිතා කරන්න එපා"</string>
+ <string name="action_bar_label" msgid="2573986763322074279">"ජාලයට පුරනය වන්න"</string>
+</resources>
diff --git a/packages/CaptivePortalLogin/res/values-sk/strings.xml b/packages/CaptivePortalLogin/res/values-sk/strings.xml
new file mode 100644
index 0000000..514b4c8
--- /dev/null
+++ b/packages/CaptivePortalLogin/res/values-sk/strings.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="5934709770924185752">"CaptivePortalLogin"</string>
+ <string name="action_use_network" msgid="6076184727448466030">"Použiť túto sieť tak, ako je"</string>
+ <string name="action_do_not_use_network" msgid="4577366536956516683">"Túto sieť nepoužívať"</string>
+ <string name="action_bar_label" msgid="2573986763322074279">"Prihlásiť sa do siete"</string>
+</resources>
diff --git a/packages/CaptivePortalLogin/res/values-sl/strings.xml b/packages/CaptivePortalLogin/res/values-sl/strings.xml
new file mode 100644
index 0000000..6748126
--- /dev/null
+++ b/packages/CaptivePortalLogin/res/values-sl/strings.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="5934709770924185752">"CaptivePortalLogin"</string>
+ <string name="action_use_network" msgid="6076184727448466030">"Uporabljajte to omrežje, »kakršno je«"</string>
+ <string name="action_do_not_use_network" msgid="4577366536956516683">"Ne uporabljajte tega omrežja"</string>
+ <string name="action_bar_label" msgid="2573986763322074279">"Prijavite se v omrežje"</string>
+</resources>
diff --git a/packages/CaptivePortalLogin/res/values-sr/strings.xml b/packages/CaptivePortalLogin/res/values-sr/strings.xml
new file mode 100644
index 0000000..1b86247
--- /dev/null
+++ b/packages/CaptivePortalLogin/res/values-sr/strings.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="5934709770924185752">"CaptivePortalLogin"</string>
+ <string name="action_use_network" msgid="6076184727448466030">"Користи ову мрежу такву каква је"</string>
+ <string name="action_do_not_use_network" msgid="4577366536956516683">"Не користи ову мрежу"</string>
+ <string name="action_bar_label" msgid="2573986763322074279">"Пријави ме на мрежу"</string>
+</resources>
diff --git a/packages/CaptivePortalLogin/res/values-sv/strings.xml b/packages/CaptivePortalLogin/res/values-sv/strings.xml
new file mode 100644
index 0000000..5436c51
--- /dev/null
+++ b/packages/CaptivePortalLogin/res/values-sv/strings.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="5934709770924185752">"CaptivePortalLogin"</string>
+ <string name="action_use_network" msgid="6076184727448466030">"Använd det här nätverket som det är"</string>
+ <string name="action_do_not_use_network" msgid="4577366536956516683">"Använd inte det här nätverket"</string>
+ <string name="action_bar_label" msgid="2573986763322074279">"Logga in på nätverket"</string>
+</resources>
diff --git a/packages/CaptivePortalLogin/res/values-sw/strings.xml b/packages/CaptivePortalLogin/res/values-sw/strings.xml
new file mode 100644
index 0000000..460e66f
--- /dev/null
+++ b/packages/CaptivePortalLogin/res/values-sw/strings.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="5934709770924185752">"CaptivePortalLogin"</string>
+ <string name="action_use_network" msgid="6076184727448466030">"Tumia mtandao huu jinsi ulivyo"</string>
+ <string name="action_do_not_use_network" msgid="4577366536956516683">"Usitumie mtandao huu"</string>
+ <string name="action_bar_label" msgid="2573986763322074279">"Ingia katika mtandao"</string>
+</resources>
diff --git a/packages/CaptivePortalLogin/res/values-ta-rIN/strings.xml b/packages/CaptivePortalLogin/res/values-ta-rIN/strings.xml
new file mode 100644
index 0000000..d8626a4
--- /dev/null
+++ b/packages/CaptivePortalLogin/res/values-ta-rIN/strings.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="5934709770924185752">"CaptivePortalLogin"</string>
+ <string name="action_use_network" msgid="6076184727448466030">"இந்த நெட்வொர்க்கைப் பயன்படுத்து"</string>
+ <string name="action_do_not_use_network" msgid="4577366536956516683">"இந்த நெட்வொர்க்கைப் பயன்படுத்த வேண்டாம்"</string>
+ <string name="action_bar_label" msgid="2573986763322074279">"நெட்வொர்க்கில் உள்நுழையவும்"</string>
+</resources>
diff --git a/packages/CaptivePortalLogin/res/values-te-rIN/strings.xml b/packages/CaptivePortalLogin/res/values-te-rIN/strings.xml
new file mode 100644
index 0000000..7cbd81b
--- /dev/null
+++ b/packages/CaptivePortalLogin/res/values-te-rIN/strings.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="5934709770924185752">"CaptivePortalLogin"</string>
+ <string name="action_use_network" msgid="6076184727448466030">"ఈ నెట్వర్క్ని యథావిధిగా ఉపయోగించు"</string>
+ <string name="action_do_not_use_network" msgid="4577366536956516683">"ఈ నెట్వర్క్ని ఉపయోగించవద్దు"</string>
+ <string name="action_bar_label" msgid="2573986763322074279">"నెట్వర్క్కి సైన్-ఇన్ చేయండి"</string>
+</resources>
diff --git a/packages/CaptivePortalLogin/res/values-th/strings.xml b/packages/CaptivePortalLogin/res/values-th/strings.xml
new file mode 100644
index 0000000..be50b9a
--- /dev/null
+++ b/packages/CaptivePortalLogin/res/values-th/strings.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="5934709770924185752">"CaptivePortalLogin"</string>
+ <string name="action_use_network" msgid="6076184727448466030">"ใช้เครือข่ายนี้ตามที่เป็นอยู่"</string>
+ <string name="action_do_not_use_network" msgid="4577366536956516683">"ไม่ใช้เครือข่ายนี้"</string>
+ <string name="action_bar_label" msgid="2573986763322074279">"ลงชื่อเข้าใช้เครือข่าย"</string>
+</resources>
diff --git a/packages/CaptivePortalLogin/res/values-tl/strings.xml b/packages/CaptivePortalLogin/res/values-tl/strings.xml
new file mode 100644
index 0000000..76d0ff8
--- /dev/null
+++ b/packages/CaptivePortalLogin/res/values-tl/strings.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="5934709770924185752">"CaptivePortalLogin"</string>
+ <string name="action_use_network" msgid="6076184727448466030">"Gamitin ang network na ito nang walang pagbabago"</string>
+ <string name="action_do_not_use_network" msgid="4577366536956516683">"Huwag gamitin ang network na ito"</string>
+ <string name="action_bar_label" msgid="2573986763322074279">"Mag-sign in sa network"</string>
+</resources>
diff --git a/packages/CaptivePortalLogin/res/values-tr/strings.xml b/packages/CaptivePortalLogin/res/values-tr/strings.xml
new file mode 100644
index 0000000..752e4af
--- /dev/null
+++ b/packages/CaptivePortalLogin/res/values-tr/strings.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="5934709770924185752">"CaptivePortalLogin"</string>
+ <string name="action_use_network" msgid="6076184727448466030">"Bu ağı olduğu gibi kullan"</string>
+ <string name="action_do_not_use_network" msgid="4577366536956516683">"Bu ağı kullanma"</string>
+ <string name="action_bar_label" msgid="2573986763322074279">"Ağda oturum aç"</string>
+</resources>
diff --git a/packages/CaptivePortalLogin/res/values-uk/strings.xml b/packages/CaptivePortalLogin/res/values-uk/strings.xml
new file mode 100644
index 0000000..028a724
--- /dev/null
+++ b/packages/CaptivePortalLogin/res/values-uk/strings.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="5934709770924185752">"CaptivePortalLogin"</string>
+ <string name="action_use_network" msgid="6076184727448466030">"Використовувати цю мережу як є"</string>
+ <string name="action_do_not_use_network" msgid="4577366536956516683">"Не використовувати цю мережу"</string>
+ <string name="action_bar_label" msgid="2573986763322074279">"Увійти в мережу"</string>
+</resources>
diff --git a/packages/CaptivePortalLogin/res/values-ur-rPK/strings.xml b/packages/CaptivePortalLogin/res/values-ur-rPK/strings.xml
new file mode 100644
index 0000000..af91d951
--- /dev/null
+++ b/packages/CaptivePortalLogin/res/values-ur-rPK/strings.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="5934709770924185752">"CaptivePortalLogin"</string>
+ <string name="action_use_network" msgid="6076184727448466030">"جوں کا توں اس نیٹ ورک کا استعمال کریں"</string>
+ <string name="action_do_not_use_network" msgid="4577366536956516683">"اس نیٹ ورک کا استعمال نہ کریں"</string>
+ <string name="action_bar_label" msgid="2573986763322074279">"نیٹ ورک میں سائن ان کریں"</string>
+</resources>
diff --git a/packages/CaptivePortalLogin/res/values-uz-rUZ/strings.xml b/packages/CaptivePortalLogin/res/values-uz-rUZ/strings.xml
new file mode 100644
index 0000000..8fca0f0
--- /dev/null
+++ b/packages/CaptivePortalLogin/res/values-uz-rUZ/strings.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="5934709770924185752">"CaptivePortalLogin"</string>
+ <string name="action_use_network" msgid="6076184727448466030">"Ushbu tarmoqdan o‘z holicha foydalanilsin"</string>
+ <string name="action_do_not_use_network" msgid="4577366536956516683">"Ushbu tarmoqdan foydalanilmasin"</string>
+ <string name="action_bar_label" msgid="2573986763322074279">"Tarmoqqa kirish"</string>
+</resources>
diff --git a/packages/CaptivePortalLogin/res/values-vi/strings.xml b/packages/CaptivePortalLogin/res/values-vi/strings.xml
new file mode 100644
index 0000000..64d2ddf
--- /dev/null
+++ b/packages/CaptivePortalLogin/res/values-vi/strings.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="5934709770924185752">"CaptivePortalLogin"</string>
+ <string name="action_use_network" msgid="6076184727448466030">"Sử dụng mạng này"</string>
+ <string name="action_do_not_use_network" msgid="4577366536956516683">"Không sử dụng mạng này"</string>
+ <string name="action_bar_label" msgid="2573986763322074279">"Đăng nhập vào mạng"</string>
+</resources>
diff --git a/packages/CaptivePortalLogin/res/values-zh-rCN/strings.xml b/packages/CaptivePortalLogin/res/values-zh-rCN/strings.xml
new file mode 100644
index 0000000..628d597
--- /dev/null
+++ b/packages/CaptivePortalLogin/res/values-zh-rCN/strings.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="5934709770924185752">"CaptivePortalLogin"</string>
+ <string name="action_use_network" msgid="6076184727448466030">"直接使用此网络"</string>
+ <string name="action_do_not_use_network" msgid="4577366536956516683">"不要使用此网络"</string>
+ <string name="action_bar_label" msgid="2573986763322074279">"登录到网络"</string>
+</resources>
diff --git a/packages/CaptivePortalLogin/res/values-zh-rHK/strings.xml b/packages/CaptivePortalLogin/res/values-zh-rHK/strings.xml
new file mode 100644
index 0000000..4ca9e0b
--- /dev/null
+++ b/packages/CaptivePortalLogin/res/values-zh-rHK/strings.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="5934709770924185752">"CaptivePortalLogin"</string>
+ <string name="action_use_network" msgid="6076184727448466030">"依照現況使用這個網絡"</string>
+ <string name="action_do_not_use_network" msgid="4577366536956516683">"不要使用這個網絡"</string>
+ <string name="action_bar_label" msgid="2573986763322074279">"登入網絡"</string>
+</resources>
diff --git a/packages/CaptivePortalLogin/res/values-zh-rTW/strings.xml b/packages/CaptivePortalLogin/res/values-zh-rTW/strings.xml
new file mode 100644
index 0000000..cf498e4
--- /dev/null
+++ b/packages/CaptivePortalLogin/res/values-zh-rTW/strings.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="5934709770924185752">"CaptivePortalLogin"</string>
+ <string name="action_use_network" msgid="6076184727448466030">"依現況使用這個網路"</string>
+ <string name="action_do_not_use_network" msgid="4577366536956516683">"不使用這個網路"</string>
+ <string name="action_bar_label" msgid="2573986763322074279">"登入網路"</string>
+</resources>
diff --git a/packages/CaptivePortalLogin/res/values-zu/strings.xml b/packages/CaptivePortalLogin/res/values-zu/strings.xml
new file mode 100644
index 0000000..180367c
--- /dev/null
+++ b/packages/CaptivePortalLogin/res/values-zu/strings.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="5934709770924185752">"I-CaptivePortalLogin"</string>
+ <string name="action_use_network" msgid="6076184727448466030">"Sebenzisa le nethiwekhi njengoba injalo"</string>
+ <string name="action_do_not_use_network" msgid="4577366536956516683">"Ungasebenzisi le nethiwekhi"</string>
+ <string name="action_bar_label" msgid="2573986763322074279">"Ngena ngemvume kunethiwekhi"</string>
+</resources>
diff --git a/packages/PrintSpooler/res/values-hi/strings.xml b/packages/PrintSpooler/res/values-hi/strings.xml
index 52a018f..581995a 100644
--- a/packages/PrintSpooler/res/values-hi/strings.xml
+++ b/packages/PrintSpooler/res/values-hi/strings.xml
@@ -35,7 +35,7 @@
<string name="generating_print_job" msgid="3119608742651698916">"प्रिंट कार्य जनरेट हो रहा है"</string>
<string name="save_as_pdf" msgid="5718454119847596853">"PDF के रूप में सहेजें"</string>
<string name="all_printers" msgid="5018829726861876202">"सभी प्रिंटर..."</string>
- <string name="print_dialog" msgid="32628687461331979">"प्रिंट संवाद"</string>
+ <string name="print_dialog" msgid="32628687461331979">"प्रिंट डॉयलॉग"</string>
<string name="current_page_template" msgid="1386638343571771292">"<xliff:g id="CURRENT_PAGE">%1$d</xliff:g> /<xliff:g id="PAGE_COUNT">%2$d</xliff:g>"</string>
<string name="search" msgid="5421724265322228497">"खोजें"</string>
<string name="all_printers_label" msgid="3178848870161526399">"सभी प्रिंटर"</string>
diff --git a/packages/SettingsProvider/src/com/android/providers/settings/SettingsHelper.java b/packages/SettingsProvider/src/com/android/providers/settings/SettingsHelper.java
index dd7a828..91199c1 100644
--- a/packages/SettingsProvider/src/com/android/providers/settings/SettingsHelper.java
+++ b/packages/SettingsProvider/src/com/android/providers/settings/SettingsHelper.java
@@ -190,33 +190,34 @@
String localeString = loc.getLanguage();
String country = loc.getCountry();
if (!TextUtils.isEmpty(country)) {
- localeString += "_" + country;
+ localeString += "-" + country;
}
return localeString.getBytes();
}
/**
- * Sets the locale specified. Input data is the equivalent of "ll_cc".getBytes(), where
- * "ll" is the language code and "cc" is the country code.
+ * Sets the locale specified. Input data is the byte representation of a
+ * BCP-47 language tag. For backwards compatibility, strings of the form
+ * {@code ll_CC} are also accepted, where {@code ll} is a two letter language
+ * code and {@code CC} is a two letter country code.
+ *
* @param data the locale string in bytes.
*/
void setLocaleData(byte[] data, int size) {
// Check if locale was set by the user:
Configuration conf = mContext.getResources().getConfiguration();
- Locale loc = conf.locale;
// TODO: The following is not working as intended because the network is forcing a locale
// change after registering. Need to find some other way to detect if the user manually
// changed the locale
if (conf.userSetLocale) return; // Don't change if user set it in the SetupWizard
final String[] availableLocales = mContext.getAssets().getLocales();
- String localeCode = new String(data, 0, size);
- String language = new String(data, 0, 2);
- String country = size > 4 ? new String(data, 3, 2) : "";
- loc = null;
+ // Replace "_" with "-" to deal with older backups.
+ String localeCode = new String(data, 0, size).replace('_', '-');
+ Locale loc = null;
for (int i = 0; i < availableLocales.length; i++) {
if (availableLocales[i].equals(localeCode)) {
- loc = new Locale(language, country);
+ loc = Locale.forLanguageTag(localeCode);
break;
}
}
diff --git a/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_0.png b/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_0.png
deleted file mode 100644
index a14b8d8..0000000
--- a/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_0.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_1.png b/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_1.png
deleted file mode 100644
index b226694..0000000
--- a/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_1.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_1x.png b/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_1x.png
deleted file mode 100644
index cbabd61..0000000
--- a/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_1x.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_2.png b/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_2.png
deleted file mode 100644
index 1e9fbfd..0000000
--- a/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_2.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_3.png b/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_3.png
deleted file mode 100644
index 0676919..0000000
--- a/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_3.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_3g.png b/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_3g.png
deleted file mode 100644
index 12569d1..0000000
--- a/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_3g.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_4.png b/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_4.png
deleted file mode 100644
index 3ad9e76..0000000
--- a/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_4.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_4g.png b/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_4g.png
deleted file mode 100644
index 7d5f6d0..0000000
--- a/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_4g.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_e.png b/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_e.png
deleted file mode 100644
index 2102263..0000000
--- a/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_e.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_full_0.png b/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_full_0.png
deleted file mode 100644
index c288137..0000000
--- a/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_full_0.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_full_1.png b/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_full_1.png
deleted file mode 100644
index 2e3e486..0000000
--- a/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_full_1.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_full_1x.png b/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_full_1x.png
deleted file mode 100644
index c24cd4d..0000000
--- a/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_full_1x.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_full_2.png b/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_full_2.png
deleted file mode 100644
index 04e8220..0000000
--- a/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_full_2.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_full_3.png b/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_full_3.png
deleted file mode 100644
index f8ed8f0..0000000
--- a/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_full_3.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_full_3g.png b/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_full_3g.png
deleted file mode 100644
index 4f76f66..0000000
--- a/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_full_3g.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_full_4.png b/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_full_4.png
deleted file mode 100644
index 9570dae..0000000
--- a/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_full_4.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_full_4g.png b/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_full_4g.png
deleted file mode 100644
index b23a043..0000000
--- a/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_full_4g.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_full_e.png b/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_full_e.png
deleted file mode 100644
index 75de8cd..0000000
--- a/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_full_e.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_full_g.png b/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_full_g.png
deleted file mode 100644
index c0ae67c..0000000
--- a/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_full_g.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_full_h.png b/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_full_h.png
deleted file mode 100644
index 858afc8..0000000
--- a/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_full_h.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_full_lte.png b/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_full_lte.png
deleted file mode 100644
index 9dfde67..0000000
--- a/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_full_lte.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_full_r.png b/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_full_r.png
deleted file mode 100644
index 4fea255..0000000
--- a/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_full_r.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_g.png b/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_g.png
deleted file mode 100644
index fa905cc..0000000
--- a/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_g.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_h.png b/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_h.png
deleted file mode 100644
index 5b5b5d2..0000000
--- a/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_h.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_in.png b/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_in.png
deleted file mode 100644
index 250653b..0000000
--- a/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_in.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_inout.png b/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_inout.png
deleted file mode 100644
index 497c69f..0000000
--- a/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_inout.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_lte.png b/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_lte.png
deleted file mode 100644
index 5128c0d..0000000
--- a/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_lte.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_no_network.png b/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_no_network.png
deleted file mode 100644
index 05bb0a0..0000000
--- a/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_no_network.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_no_signal.png b/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_no_signal.png
deleted file mode 100644
index dd8ba8f..0000000
--- a/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_no_signal.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_out.png b/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_out.png
deleted file mode 100644
index d750726..0000000
--- a/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_out.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_r.png b/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_r.png
deleted file mode 100644
index da77a35..0000000
--- a/packages/SystemUI/res/drawable-hdpi/ic_qs_signal_r.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/ic_qs_wifi_0.png b/packages/SystemUI/res/drawable-hdpi/ic_qs_wifi_0.png
deleted file mode 100644
index c416fc3..0000000
--- a/packages/SystemUI/res/drawable-hdpi/ic_qs_wifi_0.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/ic_qs_wifi_1.png b/packages/SystemUI/res/drawable-hdpi/ic_qs_wifi_1.png
deleted file mode 100644
index c500691..0000000
--- a/packages/SystemUI/res/drawable-hdpi/ic_qs_wifi_1.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/ic_qs_wifi_2.png b/packages/SystemUI/res/drawable-hdpi/ic_qs_wifi_2.png
deleted file mode 100644
index ae87896..0000000
--- a/packages/SystemUI/res/drawable-hdpi/ic_qs_wifi_2.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/ic_qs_wifi_3.png b/packages/SystemUI/res/drawable-hdpi/ic_qs_wifi_3.png
deleted file mode 100644
index e47ef7a..0000000
--- a/packages/SystemUI/res/drawable-hdpi/ic_qs_wifi_3.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/ic_qs_wifi_4.png b/packages/SystemUI/res/drawable-hdpi/ic_qs_wifi_4.png
deleted file mode 100644
index 9fd1ae6..0000000
--- a/packages/SystemUI/res/drawable-hdpi/ic_qs_wifi_4.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/ic_qs_wifi_full_1.png b/packages/SystemUI/res/drawable-hdpi/ic_qs_wifi_full_1.png
deleted file mode 100644
index 93b45b4..0000000
--- a/packages/SystemUI/res/drawable-hdpi/ic_qs_wifi_full_1.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/ic_qs_wifi_full_2.png b/packages/SystemUI/res/drawable-hdpi/ic_qs_wifi_full_2.png
deleted file mode 100644
index 21b2c61..0000000
--- a/packages/SystemUI/res/drawable-hdpi/ic_qs_wifi_full_2.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/ic_qs_wifi_full_3.png b/packages/SystemUI/res/drawable-hdpi/ic_qs_wifi_full_3.png
deleted file mode 100644
index cd96ae0..0000000
--- a/packages/SystemUI/res/drawable-hdpi/ic_qs_wifi_full_3.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/ic_qs_wifi_full_4.png b/packages/SystemUI/res/drawable-hdpi/ic_qs_wifi_full_4.png
deleted file mode 100644
index 43bfe3a..0000000
--- a/packages/SystemUI/res/drawable-hdpi/ic_qs_wifi_full_4.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/ic_qs_wifi_in.png b/packages/SystemUI/res/drawable-hdpi/ic_qs_wifi_in.png
deleted file mode 100644
index 250653b..0000000
--- a/packages/SystemUI/res/drawable-hdpi/ic_qs_wifi_in.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/ic_qs_wifi_inout.png b/packages/SystemUI/res/drawable-hdpi/ic_qs_wifi_inout.png
deleted file mode 100644
index 497c69f..0000000
--- a/packages/SystemUI/res/drawable-hdpi/ic_qs_wifi_inout.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/ic_qs_wifi_no_network.png b/packages/SystemUI/res/drawable-hdpi/ic_qs_wifi_no_network.png
deleted file mode 100644
index 45bc376..0000000
--- a/packages/SystemUI/res/drawable-hdpi/ic_qs_wifi_no_network.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/ic_qs_wifi_not_connected.png b/packages/SystemUI/res/drawable-hdpi/ic_qs_wifi_not_connected.png
deleted file mode 100644
index c416fc3..0000000
--- a/packages/SystemUI/res/drawable-hdpi/ic_qs_wifi_not_connected.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/ic_qs_wifi_out.png b/packages/SystemUI/res/drawable-hdpi/ic_qs_wifi_out.png
deleted file mode 100644
index d750726..0000000
--- a/packages/SystemUI/res/drawable-hdpi/ic_qs_wifi_out.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_data_fully_connected_1x.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_data_fully_connected_1x.png
deleted file mode 100644
index 804d1ac..0000000
--- a/packages/SystemUI/res/drawable-hdpi/stat_sys_data_fully_connected_1x.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_data_fully_connected_3g.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_data_fully_connected_3g.png
deleted file mode 100644
index 1d863e9..0000000
--- a/packages/SystemUI/res/drawable-hdpi/stat_sys_data_fully_connected_3g.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_data_fully_connected_4g.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_data_fully_connected_4g.png
deleted file mode 100644
index 62970fe..0000000
--- a/packages/SystemUI/res/drawable-hdpi/stat_sys_data_fully_connected_4g.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_data_fully_connected_e.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_data_fully_connected_e.png
deleted file mode 100644
index 6c3fbdc..0000000
--- a/packages/SystemUI/res/drawable-hdpi/stat_sys_data_fully_connected_e.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_data_fully_connected_g.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_data_fully_connected_g.png
deleted file mode 100644
index a5effe0..0000000
--- a/packages/SystemUI/res/drawable-hdpi/stat_sys_data_fully_connected_g.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_data_fully_connected_h.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_data_fully_connected_h.png
deleted file mode 100644
index b7071b9..0000000
--- a/packages/SystemUI/res/drawable-hdpi/stat_sys_data_fully_connected_h.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_data_fully_connected_lte.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_data_fully_connected_lte.png
deleted file mode 100644
index bd145fa..0000000
--- a/packages/SystemUI/res/drawable-hdpi/stat_sys_data_fully_connected_lte.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_data_fully_connected_roam.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_data_fully_connected_roam.png
deleted file mode 100644
index be38df8..0000000
--- a/packages/SystemUI/res/drawable-hdpi/stat_sys_data_fully_connected_roam.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_0.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_0.png
deleted file mode 100644
index da941c8..0000000
--- a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_0.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_0_fully.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_0_fully.png
deleted file mode 100644
index 0fd09d7..0000000
--- a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_0_fully.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_1_fully.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_1_fully.png
deleted file mode 100644
index cfe43dd..0000000
--- a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_1_fully.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_2_fully.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_2_fully.png
deleted file mode 100644
index 92a5b1c..0000000
--- a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_2_fully.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_3_fully.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_3_fully.png
deleted file mode 100644
index 9454cd8..0000000
--- a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_3_fully.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_4_fully.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_4_fully.png
deleted file mode 100644
index 6cb18c7..0000000
--- a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_4_fully.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_null.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_null.png
deleted file mode 100644
index 45ed7ca..0000000
--- a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_null.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_wifi_signal_0.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_wifi_signal_0.png
deleted file mode 100644
index 0060eba..0000000
--- a/packages/SystemUI/res/drawable-hdpi/stat_sys_wifi_signal_0.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_wifi_signal_1_fully.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_wifi_signal_1_fully.png
deleted file mode 100644
index faf4153..0000000
--- a/packages/SystemUI/res/drawable-hdpi/stat_sys_wifi_signal_1_fully.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_wifi_signal_2_fully.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_wifi_signal_2_fully.png
deleted file mode 100644
index 6a25705..0000000
--- a/packages/SystemUI/res/drawable-hdpi/stat_sys_wifi_signal_2_fully.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_wifi_signal_3_fully.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_wifi_signal_3_fully.png
deleted file mode 100644
index c609847..0000000
--- a/packages/SystemUI/res/drawable-hdpi/stat_sys_wifi_signal_3_fully.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_wifi_signal_4_fully.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_wifi_signal_4_fully.png
deleted file mode 100644
index 6248cfd..0000000
--- a/packages/SystemUI/res/drawable-hdpi/stat_sys_wifi_signal_4_fully.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_wifi_signal_null.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_wifi_signal_null.png
deleted file mode 100644
index 8c3e896..0000000
--- a/packages/SystemUI/res/drawable-hdpi/stat_sys_wifi_signal_null.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-hdpi/ic_qs_signal_0.png b/packages/SystemUI/res/drawable-ldrtl-hdpi/ic_qs_signal_0.png
deleted file mode 100644
index 49f9d8d..0000000
--- a/packages/SystemUI/res/drawable-ldrtl-hdpi/ic_qs_signal_0.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-hdpi/ic_qs_signal_1.png b/packages/SystemUI/res/drawable-ldrtl-hdpi/ic_qs_signal_1.png
deleted file mode 100644
index b6388e1..0000000
--- a/packages/SystemUI/res/drawable-ldrtl-hdpi/ic_qs_signal_1.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-hdpi/ic_qs_signal_1x.png b/packages/SystemUI/res/drawable-ldrtl-hdpi/ic_qs_signal_1x.png
deleted file mode 100644
index 969bff4..0000000
--- a/packages/SystemUI/res/drawable-ldrtl-hdpi/ic_qs_signal_1x.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-hdpi/ic_qs_signal_2.png b/packages/SystemUI/res/drawable-ldrtl-hdpi/ic_qs_signal_2.png
deleted file mode 100644
index 610a018..0000000
--- a/packages/SystemUI/res/drawable-ldrtl-hdpi/ic_qs_signal_2.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-hdpi/ic_qs_signal_3.png b/packages/SystemUI/res/drawable-ldrtl-hdpi/ic_qs_signal_3.png
deleted file mode 100644
index badebf5..0000000
--- a/packages/SystemUI/res/drawable-ldrtl-hdpi/ic_qs_signal_3.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-hdpi/ic_qs_signal_3g.png b/packages/SystemUI/res/drawable-ldrtl-hdpi/ic_qs_signal_3g.png
deleted file mode 100644
index ff96e40..0000000
--- a/packages/SystemUI/res/drawable-ldrtl-hdpi/ic_qs_signal_3g.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-hdpi/ic_qs_signal_4.png b/packages/SystemUI/res/drawable-ldrtl-hdpi/ic_qs_signal_4.png
deleted file mode 100644
index 52c9a74..0000000
--- a/packages/SystemUI/res/drawable-ldrtl-hdpi/ic_qs_signal_4.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-hdpi/ic_qs_signal_4g.png b/packages/SystemUI/res/drawable-ldrtl-hdpi/ic_qs_signal_4g.png
deleted file mode 100644
index 312a384..0000000
--- a/packages/SystemUI/res/drawable-ldrtl-hdpi/ic_qs_signal_4g.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-hdpi/ic_qs_signal_e.png b/packages/SystemUI/res/drawable-ldrtl-hdpi/ic_qs_signal_e.png
deleted file mode 100644
index 1211e0d..0000000
--- a/packages/SystemUI/res/drawable-ldrtl-hdpi/ic_qs_signal_e.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-hdpi/ic_qs_signal_full_0.png b/packages/SystemUI/res/drawable-ldrtl-hdpi/ic_qs_signal_full_0.png
deleted file mode 100644
index 49f9d8d..0000000
--- a/packages/SystemUI/res/drawable-ldrtl-hdpi/ic_qs_signal_full_0.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-hdpi/ic_qs_signal_full_1.png b/packages/SystemUI/res/drawable-ldrtl-hdpi/ic_qs_signal_full_1.png
deleted file mode 100644
index ce85449..0000000
--- a/packages/SystemUI/res/drawable-ldrtl-hdpi/ic_qs_signal_full_1.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-hdpi/ic_qs_signal_full_1x.png b/packages/SystemUI/res/drawable-ldrtl-hdpi/ic_qs_signal_full_1x.png
deleted file mode 100644
index 3226db6..0000000
--- a/packages/SystemUI/res/drawable-ldrtl-hdpi/ic_qs_signal_full_1x.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-hdpi/ic_qs_signal_full_2.png b/packages/SystemUI/res/drawable-ldrtl-hdpi/ic_qs_signal_full_2.png
deleted file mode 100644
index 050dde5..0000000
--- a/packages/SystemUI/res/drawable-ldrtl-hdpi/ic_qs_signal_full_2.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-hdpi/ic_qs_signal_full_3.png b/packages/SystemUI/res/drawable-ldrtl-hdpi/ic_qs_signal_full_3.png
deleted file mode 100644
index 1498198..0000000
--- a/packages/SystemUI/res/drawable-ldrtl-hdpi/ic_qs_signal_full_3.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-hdpi/ic_qs_signal_full_3g.png b/packages/SystemUI/res/drawable-ldrtl-hdpi/ic_qs_signal_full_3g.png
deleted file mode 100644
index 99484b1..0000000
--- a/packages/SystemUI/res/drawable-ldrtl-hdpi/ic_qs_signal_full_3g.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-hdpi/ic_qs_signal_full_4.png b/packages/SystemUI/res/drawable-ldrtl-hdpi/ic_qs_signal_full_4.png
deleted file mode 100644
index 656f9ef..0000000
--- a/packages/SystemUI/res/drawable-ldrtl-hdpi/ic_qs_signal_full_4.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-hdpi/ic_qs_signal_full_4g.png b/packages/SystemUI/res/drawable-ldrtl-hdpi/ic_qs_signal_full_4g.png
deleted file mode 100644
index f4f0035..0000000
--- a/packages/SystemUI/res/drawable-ldrtl-hdpi/ic_qs_signal_full_4g.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-hdpi/ic_qs_signal_full_e.png b/packages/SystemUI/res/drawable-ldrtl-hdpi/ic_qs_signal_full_e.png
deleted file mode 100644
index 935a743..0000000
--- a/packages/SystemUI/res/drawable-ldrtl-hdpi/ic_qs_signal_full_e.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-hdpi/ic_qs_signal_full_g.png b/packages/SystemUI/res/drawable-ldrtl-hdpi/ic_qs_signal_full_g.png
deleted file mode 100644
index 5510f6b..0000000
--- a/packages/SystemUI/res/drawable-ldrtl-hdpi/ic_qs_signal_full_g.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-hdpi/ic_qs_signal_full_h.png b/packages/SystemUI/res/drawable-ldrtl-hdpi/ic_qs_signal_full_h.png
deleted file mode 100644
index c21352c..0000000
--- a/packages/SystemUI/res/drawable-ldrtl-hdpi/ic_qs_signal_full_h.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-hdpi/ic_qs_signal_full_lte.png b/packages/SystemUI/res/drawable-ldrtl-hdpi/ic_qs_signal_full_lte.png
deleted file mode 100644
index 9298dae..0000000
--- a/packages/SystemUI/res/drawable-ldrtl-hdpi/ic_qs_signal_full_lte.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-hdpi/ic_qs_signal_full_r.png b/packages/SystemUI/res/drawable-ldrtl-hdpi/ic_qs_signal_full_r.png
deleted file mode 100644
index da4093e..0000000
--- a/packages/SystemUI/res/drawable-ldrtl-hdpi/ic_qs_signal_full_r.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-hdpi/ic_qs_signal_g.png b/packages/SystemUI/res/drawable-ldrtl-hdpi/ic_qs_signal_g.png
deleted file mode 100644
index b65abc6..0000000
--- a/packages/SystemUI/res/drawable-ldrtl-hdpi/ic_qs_signal_g.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-hdpi/ic_qs_signal_h.png b/packages/SystemUI/res/drawable-ldrtl-hdpi/ic_qs_signal_h.png
deleted file mode 100644
index 08e21d2..0000000
--- a/packages/SystemUI/res/drawable-ldrtl-hdpi/ic_qs_signal_h.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-hdpi/ic_qs_signal_in.png b/packages/SystemUI/res/drawable-ldrtl-hdpi/ic_qs_signal_in.png
deleted file mode 100644
index 64c6723..0000000
--- a/packages/SystemUI/res/drawable-ldrtl-hdpi/ic_qs_signal_in.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-hdpi/ic_qs_signal_inout.png b/packages/SystemUI/res/drawable-ldrtl-hdpi/ic_qs_signal_inout.png
deleted file mode 100644
index 2338122..0000000
--- a/packages/SystemUI/res/drawable-ldrtl-hdpi/ic_qs_signal_inout.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-hdpi/ic_qs_signal_lte.png b/packages/SystemUI/res/drawable-ldrtl-hdpi/ic_qs_signal_lte.png
deleted file mode 100644
index 464ebbc..0000000
--- a/packages/SystemUI/res/drawable-ldrtl-hdpi/ic_qs_signal_lte.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-hdpi/ic_qs_signal_no_network.png b/packages/SystemUI/res/drawable-ldrtl-hdpi/ic_qs_signal_no_network.png
deleted file mode 100644
index c532510..0000000
--- a/packages/SystemUI/res/drawable-ldrtl-hdpi/ic_qs_signal_no_network.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-hdpi/ic_qs_signal_no_signal.png b/packages/SystemUI/res/drawable-ldrtl-hdpi/ic_qs_signal_no_signal.png
deleted file mode 100644
index f87944f..0000000
--- a/packages/SystemUI/res/drawable-ldrtl-hdpi/ic_qs_signal_no_signal.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-hdpi/ic_qs_signal_out.png b/packages/SystemUI/res/drawable-ldrtl-hdpi/ic_qs_signal_out.png
deleted file mode 100644
index 29df6d7..0000000
--- a/packages/SystemUI/res/drawable-ldrtl-hdpi/ic_qs_signal_out.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-hdpi/ic_qs_signal_r.png b/packages/SystemUI/res/drawable-ldrtl-hdpi/ic_qs_signal_r.png
deleted file mode 100644
index 37da1f4..0000000
--- a/packages/SystemUI/res/drawable-ldrtl-hdpi/ic_qs_signal_r.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-hdpi/stat_sys_data_fully_connected_1x.png b/packages/SystemUI/res/drawable-ldrtl-hdpi/stat_sys_data_fully_connected_1x.png
deleted file mode 100644
index 3d82daf..0000000
--- a/packages/SystemUI/res/drawable-ldrtl-hdpi/stat_sys_data_fully_connected_1x.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-hdpi/stat_sys_data_fully_connected_3g.png b/packages/SystemUI/res/drawable-ldrtl-hdpi/stat_sys_data_fully_connected_3g.png
deleted file mode 100644
index dfbf1a4..0000000
--- a/packages/SystemUI/res/drawable-ldrtl-hdpi/stat_sys_data_fully_connected_3g.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-hdpi/stat_sys_data_fully_connected_4g.png b/packages/SystemUI/res/drawable-ldrtl-hdpi/stat_sys_data_fully_connected_4g.png
deleted file mode 100644
index 85721db..0000000
--- a/packages/SystemUI/res/drawable-ldrtl-hdpi/stat_sys_data_fully_connected_4g.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-hdpi/stat_sys_data_fully_connected_e.png b/packages/SystemUI/res/drawable-ldrtl-hdpi/stat_sys_data_fully_connected_e.png
deleted file mode 100644
index 4a2421c..0000000
--- a/packages/SystemUI/res/drawable-ldrtl-hdpi/stat_sys_data_fully_connected_e.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-hdpi/stat_sys_data_fully_connected_g.png b/packages/SystemUI/res/drawable-ldrtl-hdpi/stat_sys_data_fully_connected_g.png
deleted file mode 100644
index acc98b7..0000000
--- a/packages/SystemUI/res/drawable-ldrtl-hdpi/stat_sys_data_fully_connected_g.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-hdpi/stat_sys_data_fully_connected_h.png b/packages/SystemUI/res/drawable-ldrtl-hdpi/stat_sys_data_fully_connected_h.png
deleted file mode 100644
index 64653eb..0000000
--- a/packages/SystemUI/res/drawable-ldrtl-hdpi/stat_sys_data_fully_connected_h.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-hdpi/stat_sys_data_fully_connected_lte.png b/packages/SystemUI/res/drawable-ldrtl-hdpi/stat_sys_data_fully_connected_lte.png
deleted file mode 100644
index f440755..0000000
--- a/packages/SystemUI/res/drawable-ldrtl-hdpi/stat_sys_data_fully_connected_lte.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-hdpi/stat_sys_data_fully_connected_roam.png b/packages/SystemUI/res/drawable-ldrtl-hdpi/stat_sys_data_fully_connected_roam.png
deleted file mode 100644
index ffb58ca..0000000
--- a/packages/SystemUI/res/drawable-ldrtl-hdpi/stat_sys_data_fully_connected_roam.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-hdpi/stat_sys_signal_0.png b/packages/SystemUI/res/drawable-ldrtl-hdpi/stat_sys_signal_0.png
deleted file mode 100644
index b477332..0000000
--- a/packages/SystemUI/res/drawable-ldrtl-hdpi/stat_sys_signal_0.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-hdpi/stat_sys_signal_0_fully.png b/packages/SystemUI/res/drawable-ldrtl-hdpi/stat_sys_signal_0_fully.png
deleted file mode 100644
index b477332..0000000
--- a/packages/SystemUI/res/drawable-ldrtl-hdpi/stat_sys_signal_0_fully.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-hdpi/stat_sys_signal_1_fully.png b/packages/SystemUI/res/drawable-ldrtl-hdpi/stat_sys_signal_1_fully.png
deleted file mode 100644
index 36cb7e5..0000000
--- a/packages/SystemUI/res/drawable-ldrtl-hdpi/stat_sys_signal_1_fully.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-hdpi/stat_sys_signal_2_fully.png b/packages/SystemUI/res/drawable-ldrtl-hdpi/stat_sys_signal_2_fully.png
deleted file mode 100644
index cc30aa1..0000000
--- a/packages/SystemUI/res/drawable-ldrtl-hdpi/stat_sys_signal_2_fully.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-hdpi/stat_sys_signal_3_fully.png b/packages/SystemUI/res/drawable-ldrtl-hdpi/stat_sys_signal_3_fully.png
deleted file mode 100644
index 6f0b419..0000000
--- a/packages/SystemUI/res/drawable-ldrtl-hdpi/stat_sys_signal_3_fully.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-hdpi/stat_sys_signal_4_fully.png b/packages/SystemUI/res/drawable-ldrtl-hdpi/stat_sys_signal_4_fully.png
deleted file mode 100644
index 01d47c5..0000000
--- a/packages/SystemUI/res/drawable-ldrtl-hdpi/stat_sys_signal_4_fully.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-hdpi/stat_sys_signal_null.png b/packages/SystemUI/res/drawable-ldrtl-hdpi/stat_sys_signal_null.png
deleted file mode 100644
index cd4056c..0000000
--- a/packages/SystemUI/res/drawable-ldrtl-hdpi/stat_sys_signal_null.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-mdpi/ic_qs_signal_0.png b/packages/SystemUI/res/drawable-ldrtl-mdpi/ic_qs_signal_0.png
deleted file mode 100644
index ad699e2..0000000
--- a/packages/SystemUI/res/drawable-ldrtl-mdpi/ic_qs_signal_0.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-mdpi/ic_qs_signal_1.png b/packages/SystemUI/res/drawable-ldrtl-mdpi/ic_qs_signal_1.png
deleted file mode 100644
index 7116084..0000000
--- a/packages/SystemUI/res/drawable-ldrtl-mdpi/ic_qs_signal_1.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-mdpi/ic_qs_signal_1x.png b/packages/SystemUI/res/drawable-ldrtl-mdpi/ic_qs_signal_1x.png
deleted file mode 100644
index 8596aa6..0000000
--- a/packages/SystemUI/res/drawable-ldrtl-mdpi/ic_qs_signal_1x.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-mdpi/ic_qs_signal_2.png b/packages/SystemUI/res/drawable-ldrtl-mdpi/ic_qs_signal_2.png
deleted file mode 100644
index 1b81c42..0000000
--- a/packages/SystemUI/res/drawable-ldrtl-mdpi/ic_qs_signal_2.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-mdpi/ic_qs_signal_3.png b/packages/SystemUI/res/drawable-ldrtl-mdpi/ic_qs_signal_3.png
deleted file mode 100644
index 03591c2a..0000000
--- a/packages/SystemUI/res/drawable-ldrtl-mdpi/ic_qs_signal_3.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-mdpi/ic_qs_signal_3g.png b/packages/SystemUI/res/drawable-ldrtl-mdpi/ic_qs_signal_3g.png
deleted file mode 100644
index ee72967..0000000
--- a/packages/SystemUI/res/drawable-ldrtl-mdpi/ic_qs_signal_3g.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-mdpi/ic_qs_signal_4.png b/packages/SystemUI/res/drawable-ldrtl-mdpi/ic_qs_signal_4.png
deleted file mode 100644
index 162315c..0000000
--- a/packages/SystemUI/res/drawable-ldrtl-mdpi/ic_qs_signal_4.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-mdpi/ic_qs_signal_4g.png b/packages/SystemUI/res/drawable-ldrtl-mdpi/ic_qs_signal_4g.png
deleted file mode 100644
index c472f2b..0000000
--- a/packages/SystemUI/res/drawable-ldrtl-mdpi/ic_qs_signal_4g.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-mdpi/ic_qs_signal_e.png b/packages/SystemUI/res/drawable-ldrtl-mdpi/ic_qs_signal_e.png
deleted file mode 100644
index e4bf4e2..0000000
--- a/packages/SystemUI/res/drawable-ldrtl-mdpi/ic_qs_signal_e.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-mdpi/ic_qs_signal_full_0.png b/packages/SystemUI/res/drawable-ldrtl-mdpi/ic_qs_signal_full_0.png
deleted file mode 100644
index ad699e2..0000000
--- a/packages/SystemUI/res/drawable-ldrtl-mdpi/ic_qs_signal_full_0.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-mdpi/ic_qs_signal_full_1.png b/packages/SystemUI/res/drawable-ldrtl-mdpi/ic_qs_signal_full_1.png
deleted file mode 100644
index d45c0ad..0000000
--- a/packages/SystemUI/res/drawable-ldrtl-mdpi/ic_qs_signal_full_1.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-mdpi/ic_qs_signal_full_1x.png b/packages/SystemUI/res/drawable-ldrtl-mdpi/ic_qs_signal_full_1x.png
deleted file mode 100644
index e5e2c27..0000000
--- a/packages/SystemUI/res/drawable-ldrtl-mdpi/ic_qs_signal_full_1x.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-mdpi/ic_qs_signal_full_2.png b/packages/SystemUI/res/drawable-ldrtl-mdpi/ic_qs_signal_full_2.png
deleted file mode 100644
index 55e7125..0000000
--- a/packages/SystemUI/res/drawable-ldrtl-mdpi/ic_qs_signal_full_2.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-mdpi/ic_qs_signal_full_3.png b/packages/SystemUI/res/drawable-ldrtl-mdpi/ic_qs_signal_full_3.png
deleted file mode 100644
index db913dd..0000000
--- a/packages/SystemUI/res/drawable-ldrtl-mdpi/ic_qs_signal_full_3.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-mdpi/ic_qs_signal_full_3g.png b/packages/SystemUI/res/drawable-ldrtl-mdpi/ic_qs_signal_full_3g.png
deleted file mode 100644
index e1760b4..0000000
--- a/packages/SystemUI/res/drawable-ldrtl-mdpi/ic_qs_signal_full_3g.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-mdpi/ic_qs_signal_full_4.png b/packages/SystemUI/res/drawable-ldrtl-mdpi/ic_qs_signal_full_4.png
deleted file mode 100644
index c098fd9..0000000
--- a/packages/SystemUI/res/drawable-ldrtl-mdpi/ic_qs_signal_full_4.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-mdpi/ic_qs_signal_full_4g.png b/packages/SystemUI/res/drawable-ldrtl-mdpi/ic_qs_signal_full_4g.png
deleted file mode 100644
index d084a6b7..0000000
--- a/packages/SystemUI/res/drawable-ldrtl-mdpi/ic_qs_signal_full_4g.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-mdpi/ic_qs_signal_full_e.png b/packages/SystemUI/res/drawable-ldrtl-mdpi/ic_qs_signal_full_e.png
deleted file mode 100644
index 5c2e8e5..0000000
--- a/packages/SystemUI/res/drawable-ldrtl-mdpi/ic_qs_signal_full_e.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-mdpi/ic_qs_signal_full_g.png b/packages/SystemUI/res/drawable-ldrtl-mdpi/ic_qs_signal_full_g.png
deleted file mode 100644
index f69c1f7..0000000
--- a/packages/SystemUI/res/drawable-ldrtl-mdpi/ic_qs_signal_full_g.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-mdpi/ic_qs_signal_full_h.png b/packages/SystemUI/res/drawable-ldrtl-mdpi/ic_qs_signal_full_h.png
deleted file mode 100644
index 066efdd..0000000
--- a/packages/SystemUI/res/drawable-ldrtl-mdpi/ic_qs_signal_full_h.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-mdpi/ic_qs_signal_full_lte.png b/packages/SystemUI/res/drawable-ldrtl-mdpi/ic_qs_signal_full_lte.png
deleted file mode 100644
index d3b51c1..0000000
--- a/packages/SystemUI/res/drawable-ldrtl-mdpi/ic_qs_signal_full_lte.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-mdpi/ic_qs_signal_full_r.png b/packages/SystemUI/res/drawable-ldrtl-mdpi/ic_qs_signal_full_r.png
deleted file mode 100644
index 4fcc7bc..0000000
--- a/packages/SystemUI/res/drawable-ldrtl-mdpi/ic_qs_signal_full_r.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-mdpi/ic_qs_signal_g.png b/packages/SystemUI/res/drawable-ldrtl-mdpi/ic_qs_signal_g.png
deleted file mode 100644
index 98b0104..0000000
--- a/packages/SystemUI/res/drawable-ldrtl-mdpi/ic_qs_signal_g.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-mdpi/ic_qs_signal_h.png b/packages/SystemUI/res/drawable-ldrtl-mdpi/ic_qs_signal_h.png
deleted file mode 100644
index fc19c7a..0000000
--- a/packages/SystemUI/res/drawable-ldrtl-mdpi/ic_qs_signal_h.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-mdpi/ic_qs_signal_in.png b/packages/SystemUI/res/drawable-ldrtl-mdpi/ic_qs_signal_in.png
deleted file mode 100644
index 3fba731..0000000
--- a/packages/SystemUI/res/drawable-ldrtl-mdpi/ic_qs_signal_in.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-mdpi/ic_qs_signal_inout.png b/packages/SystemUI/res/drawable-ldrtl-mdpi/ic_qs_signal_inout.png
deleted file mode 100644
index eb5fcd0..0000000
--- a/packages/SystemUI/res/drawable-ldrtl-mdpi/ic_qs_signal_inout.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-mdpi/ic_qs_signal_lte.png b/packages/SystemUI/res/drawable-ldrtl-mdpi/ic_qs_signal_lte.png
deleted file mode 100644
index 2250282..0000000
--- a/packages/SystemUI/res/drawable-ldrtl-mdpi/ic_qs_signal_lte.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-mdpi/ic_qs_signal_no_network.png b/packages/SystemUI/res/drawable-ldrtl-mdpi/ic_qs_signal_no_network.png
deleted file mode 100644
index 5ec4543..0000000
--- a/packages/SystemUI/res/drawable-ldrtl-mdpi/ic_qs_signal_no_network.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-mdpi/ic_qs_signal_no_signal.png b/packages/SystemUI/res/drawable-ldrtl-mdpi/ic_qs_signal_no_signal.png
deleted file mode 100644
index b8f137c..0000000
--- a/packages/SystemUI/res/drawable-ldrtl-mdpi/ic_qs_signal_no_signal.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-mdpi/ic_qs_signal_out.png b/packages/SystemUI/res/drawable-ldrtl-mdpi/ic_qs_signal_out.png
deleted file mode 100644
index a91c7c7..0000000
--- a/packages/SystemUI/res/drawable-ldrtl-mdpi/ic_qs_signal_out.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-mdpi/ic_qs_signal_r.png b/packages/SystemUI/res/drawable-ldrtl-mdpi/ic_qs_signal_r.png
deleted file mode 100644
index 8290e1b..0000000
--- a/packages/SystemUI/res/drawable-ldrtl-mdpi/ic_qs_signal_r.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-mdpi/stat_sys_data_fully_connected_1x.png b/packages/SystemUI/res/drawable-ldrtl-mdpi/stat_sys_data_fully_connected_1x.png
deleted file mode 100644
index 0d97960..0000000
--- a/packages/SystemUI/res/drawable-ldrtl-mdpi/stat_sys_data_fully_connected_1x.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-mdpi/stat_sys_data_fully_connected_3g.png b/packages/SystemUI/res/drawable-ldrtl-mdpi/stat_sys_data_fully_connected_3g.png
deleted file mode 100644
index f8e06e1..0000000
--- a/packages/SystemUI/res/drawable-ldrtl-mdpi/stat_sys_data_fully_connected_3g.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-mdpi/stat_sys_data_fully_connected_4g.png b/packages/SystemUI/res/drawable-ldrtl-mdpi/stat_sys_data_fully_connected_4g.png
deleted file mode 100644
index 35be266..0000000
--- a/packages/SystemUI/res/drawable-ldrtl-mdpi/stat_sys_data_fully_connected_4g.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-mdpi/stat_sys_data_fully_connected_e.png b/packages/SystemUI/res/drawable-ldrtl-mdpi/stat_sys_data_fully_connected_e.png
deleted file mode 100644
index 64727d3..0000000
--- a/packages/SystemUI/res/drawable-ldrtl-mdpi/stat_sys_data_fully_connected_e.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-mdpi/stat_sys_data_fully_connected_g.png b/packages/SystemUI/res/drawable-ldrtl-mdpi/stat_sys_data_fully_connected_g.png
deleted file mode 100644
index 3b14d98..0000000
--- a/packages/SystemUI/res/drawable-ldrtl-mdpi/stat_sys_data_fully_connected_g.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-mdpi/stat_sys_data_fully_connected_h.png b/packages/SystemUI/res/drawable-ldrtl-mdpi/stat_sys_data_fully_connected_h.png
deleted file mode 100644
index c51c4b1..0000000
--- a/packages/SystemUI/res/drawable-ldrtl-mdpi/stat_sys_data_fully_connected_h.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-mdpi/stat_sys_data_fully_connected_lte.png b/packages/SystemUI/res/drawable-ldrtl-mdpi/stat_sys_data_fully_connected_lte.png
deleted file mode 100644
index 867a014..0000000
--- a/packages/SystemUI/res/drawable-ldrtl-mdpi/stat_sys_data_fully_connected_lte.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-mdpi/stat_sys_data_fully_connected_roam.png b/packages/SystemUI/res/drawable-ldrtl-mdpi/stat_sys_data_fully_connected_roam.png
deleted file mode 100644
index c54ceba..0000000
--- a/packages/SystemUI/res/drawable-ldrtl-mdpi/stat_sys_data_fully_connected_roam.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-mdpi/stat_sys_signal_0.png b/packages/SystemUI/res/drawable-ldrtl-mdpi/stat_sys_signal_0.png
deleted file mode 100644
index 6f457e0..0000000
--- a/packages/SystemUI/res/drawable-ldrtl-mdpi/stat_sys_signal_0.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-mdpi/stat_sys_signal_0_fully.png b/packages/SystemUI/res/drawable-ldrtl-mdpi/stat_sys_signal_0_fully.png
deleted file mode 100644
index 6f457e0..0000000
--- a/packages/SystemUI/res/drawable-ldrtl-mdpi/stat_sys_signal_0_fully.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-mdpi/stat_sys_signal_1_fully.png b/packages/SystemUI/res/drawable-ldrtl-mdpi/stat_sys_signal_1_fully.png
deleted file mode 100644
index 45d733e..0000000
--- a/packages/SystemUI/res/drawable-ldrtl-mdpi/stat_sys_signal_1_fully.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-mdpi/stat_sys_signal_2_fully.png b/packages/SystemUI/res/drawable-ldrtl-mdpi/stat_sys_signal_2_fully.png
deleted file mode 100644
index 093387a..0000000
--- a/packages/SystemUI/res/drawable-ldrtl-mdpi/stat_sys_signal_2_fully.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-mdpi/stat_sys_signal_3_fully.png b/packages/SystemUI/res/drawable-ldrtl-mdpi/stat_sys_signal_3_fully.png
deleted file mode 100644
index 2f32c4c..0000000
--- a/packages/SystemUI/res/drawable-ldrtl-mdpi/stat_sys_signal_3_fully.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-mdpi/stat_sys_signal_4_fully.png b/packages/SystemUI/res/drawable-ldrtl-mdpi/stat_sys_signal_4_fully.png
deleted file mode 100644
index 8e9ba9c..0000000
--- a/packages/SystemUI/res/drawable-ldrtl-mdpi/stat_sys_signal_4_fully.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-mdpi/stat_sys_signal_null.png b/packages/SystemUI/res/drawable-ldrtl-mdpi/stat_sys_signal_null.png
deleted file mode 100644
index c18d103..0000000
--- a/packages/SystemUI/res/drawable-ldrtl-mdpi/stat_sys_signal_null.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-xhdpi/ic_qs_signal_0.png b/packages/SystemUI/res/drawable-ldrtl-xhdpi/ic_qs_signal_0.png
deleted file mode 100644
index e50be70..0000000
--- a/packages/SystemUI/res/drawable-ldrtl-xhdpi/ic_qs_signal_0.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-xhdpi/ic_qs_signal_1.png b/packages/SystemUI/res/drawable-ldrtl-xhdpi/ic_qs_signal_1.png
deleted file mode 100644
index a5d68e1..0000000
--- a/packages/SystemUI/res/drawable-ldrtl-xhdpi/ic_qs_signal_1.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-xhdpi/ic_qs_signal_1x.png b/packages/SystemUI/res/drawable-ldrtl-xhdpi/ic_qs_signal_1x.png
deleted file mode 100644
index 69d0461..0000000
--- a/packages/SystemUI/res/drawable-ldrtl-xhdpi/ic_qs_signal_1x.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-xhdpi/ic_qs_signal_2.png b/packages/SystemUI/res/drawable-ldrtl-xhdpi/ic_qs_signal_2.png
deleted file mode 100644
index df0948b..0000000
--- a/packages/SystemUI/res/drawable-ldrtl-xhdpi/ic_qs_signal_2.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-xhdpi/ic_qs_signal_3.png b/packages/SystemUI/res/drawable-ldrtl-xhdpi/ic_qs_signal_3.png
deleted file mode 100644
index 4409267..0000000
--- a/packages/SystemUI/res/drawable-ldrtl-xhdpi/ic_qs_signal_3.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-xhdpi/ic_qs_signal_3g.png b/packages/SystemUI/res/drawable-ldrtl-xhdpi/ic_qs_signal_3g.png
deleted file mode 100644
index de0181b..0000000
--- a/packages/SystemUI/res/drawable-ldrtl-xhdpi/ic_qs_signal_3g.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-xhdpi/ic_qs_signal_4.png b/packages/SystemUI/res/drawable-ldrtl-xhdpi/ic_qs_signal_4.png
deleted file mode 100644
index c3e4181..0000000
--- a/packages/SystemUI/res/drawable-ldrtl-xhdpi/ic_qs_signal_4.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-xhdpi/ic_qs_signal_4g.png b/packages/SystemUI/res/drawable-ldrtl-xhdpi/ic_qs_signal_4g.png
deleted file mode 100644
index 69a950d..0000000
--- a/packages/SystemUI/res/drawable-ldrtl-xhdpi/ic_qs_signal_4g.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-xhdpi/ic_qs_signal_e.png b/packages/SystemUI/res/drawable-ldrtl-xhdpi/ic_qs_signal_e.png
deleted file mode 100644
index 04948ae..0000000
--- a/packages/SystemUI/res/drawable-ldrtl-xhdpi/ic_qs_signal_e.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-xhdpi/ic_qs_signal_full_0.png b/packages/SystemUI/res/drawable-ldrtl-xhdpi/ic_qs_signal_full_0.png
deleted file mode 100644
index e50be70..0000000
--- a/packages/SystemUI/res/drawable-ldrtl-xhdpi/ic_qs_signal_full_0.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-xhdpi/ic_qs_signal_full_1.png b/packages/SystemUI/res/drawable-ldrtl-xhdpi/ic_qs_signal_full_1.png
deleted file mode 100644
index 53bf4de..0000000
--- a/packages/SystemUI/res/drawable-ldrtl-xhdpi/ic_qs_signal_full_1.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-xhdpi/ic_qs_signal_full_1x.png b/packages/SystemUI/res/drawable-ldrtl-xhdpi/ic_qs_signal_full_1x.png
deleted file mode 100644
index 5733b5d..0000000
--- a/packages/SystemUI/res/drawable-ldrtl-xhdpi/ic_qs_signal_full_1x.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-xhdpi/ic_qs_signal_full_2.png b/packages/SystemUI/res/drawable-ldrtl-xhdpi/ic_qs_signal_full_2.png
deleted file mode 100644
index 5a69da2..0000000
--- a/packages/SystemUI/res/drawable-ldrtl-xhdpi/ic_qs_signal_full_2.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-xhdpi/ic_qs_signal_full_3.png b/packages/SystemUI/res/drawable-ldrtl-xhdpi/ic_qs_signal_full_3.png
deleted file mode 100644
index 52df2f7..0000000
--- a/packages/SystemUI/res/drawable-ldrtl-xhdpi/ic_qs_signal_full_3.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-xhdpi/ic_qs_signal_full_3g.png b/packages/SystemUI/res/drawable-ldrtl-xhdpi/ic_qs_signal_full_3g.png
deleted file mode 100644
index 503cc78..0000000
--- a/packages/SystemUI/res/drawable-ldrtl-xhdpi/ic_qs_signal_full_3g.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-xhdpi/ic_qs_signal_full_4.png b/packages/SystemUI/res/drawable-ldrtl-xhdpi/ic_qs_signal_full_4.png
deleted file mode 100644
index b5c176d..0000000
--- a/packages/SystemUI/res/drawable-ldrtl-xhdpi/ic_qs_signal_full_4.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-xhdpi/ic_qs_signal_full_4g.png b/packages/SystemUI/res/drawable-ldrtl-xhdpi/ic_qs_signal_full_4g.png
deleted file mode 100644
index 4c169ec..0000000
--- a/packages/SystemUI/res/drawable-ldrtl-xhdpi/ic_qs_signal_full_4g.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-xhdpi/ic_qs_signal_full_e.png b/packages/SystemUI/res/drawable-ldrtl-xhdpi/ic_qs_signal_full_e.png
deleted file mode 100644
index 5d09b042..0000000
--- a/packages/SystemUI/res/drawable-ldrtl-xhdpi/ic_qs_signal_full_e.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-xhdpi/ic_qs_signal_full_g.png b/packages/SystemUI/res/drawable-ldrtl-xhdpi/ic_qs_signal_full_g.png
deleted file mode 100644
index 94f332e..0000000
--- a/packages/SystemUI/res/drawable-ldrtl-xhdpi/ic_qs_signal_full_g.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-xhdpi/ic_qs_signal_full_h.png b/packages/SystemUI/res/drawable-ldrtl-xhdpi/ic_qs_signal_full_h.png
deleted file mode 100644
index 1d2594b..0000000
--- a/packages/SystemUI/res/drawable-ldrtl-xhdpi/ic_qs_signal_full_h.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-xhdpi/ic_qs_signal_full_lte.png b/packages/SystemUI/res/drawable-ldrtl-xhdpi/ic_qs_signal_full_lte.png
deleted file mode 100644
index 22eec00..0000000
--- a/packages/SystemUI/res/drawable-ldrtl-xhdpi/ic_qs_signal_full_lte.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-xhdpi/ic_qs_signal_full_r.png b/packages/SystemUI/res/drawable-ldrtl-xhdpi/ic_qs_signal_full_r.png
deleted file mode 100644
index 99efc08..0000000
--- a/packages/SystemUI/res/drawable-ldrtl-xhdpi/ic_qs_signal_full_r.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-xhdpi/ic_qs_signal_g.png b/packages/SystemUI/res/drawable-ldrtl-xhdpi/ic_qs_signal_g.png
deleted file mode 100644
index a6b0393..0000000
--- a/packages/SystemUI/res/drawable-ldrtl-xhdpi/ic_qs_signal_g.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-xhdpi/ic_qs_signal_h.png b/packages/SystemUI/res/drawable-ldrtl-xhdpi/ic_qs_signal_h.png
deleted file mode 100644
index ede64f1..0000000
--- a/packages/SystemUI/res/drawable-ldrtl-xhdpi/ic_qs_signal_h.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-xhdpi/ic_qs_signal_in.png b/packages/SystemUI/res/drawable-ldrtl-xhdpi/ic_qs_signal_in.png
deleted file mode 100644
index 521de12..0000000
--- a/packages/SystemUI/res/drawable-ldrtl-xhdpi/ic_qs_signal_in.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-xhdpi/ic_qs_signal_inout.png b/packages/SystemUI/res/drawable-ldrtl-xhdpi/ic_qs_signal_inout.png
deleted file mode 100644
index 4d015da..0000000
--- a/packages/SystemUI/res/drawable-ldrtl-xhdpi/ic_qs_signal_inout.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-xhdpi/ic_qs_signal_lte.png b/packages/SystemUI/res/drawable-ldrtl-xhdpi/ic_qs_signal_lte.png
deleted file mode 100644
index e82ba13..0000000
--- a/packages/SystemUI/res/drawable-ldrtl-xhdpi/ic_qs_signal_lte.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-xhdpi/ic_qs_signal_no_network.png b/packages/SystemUI/res/drawable-ldrtl-xhdpi/ic_qs_signal_no_network.png
deleted file mode 100644
index 7097b26..0000000
--- a/packages/SystemUI/res/drawable-ldrtl-xhdpi/ic_qs_signal_no_network.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-xhdpi/ic_qs_signal_no_signal.png b/packages/SystemUI/res/drawable-ldrtl-xhdpi/ic_qs_signal_no_signal.png
deleted file mode 100644
index 43fbaeb..0000000
--- a/packages/SystemUI/res/drawable-ldrtl-xhdpi/ic_qs_signal_no_signal.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-xhdpi/ic_qs_signal_out.png b/packages/SystemUI/res/drawable-ldrtl-xhdpi/ic_qs_signal_out.png
deleted file mode 100644
index d8209e6..0000000
--- a/packages/SystemUI/res/drawable-ldrtl-xhdpi/ic_qs_signal_out.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-xhdpi/ic_qs_signal_r.png b/packages/SystemUI/res/drawable-ldrtl-xhdpi/ic_qs_signal_r.png
deleted file mode 100644
index 83e7206..0000000
--- a/packages/SystemUI/res/drawable-ldrtl-xhdpi/ic_qs_signal_r.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-xhdpi/stat_sys_data_fully_connected_1x.png b/packages/SystemUI/res/drawable-ldrtl-xhdpi/stat_sys_data_fully_connected_1x.png
deleted file mode 100644
index 8a72b0a..0000000
--- a/packages/SystemUI/res/drawable-ldrtl-xhdpi/stat_sys_data_fully_connected_1x.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-xhdpi/stat_sys_data_fully_connected_3g.png b/packages/SystemUI/res/drawable-ldrtl-xhdpi/stat_sys_data_fully_connected_3g.png
deleted file mode 100644
index 4f1632d..0000000
--- a/packages/SystemUI/res/drawable-ldrtl-xhdpi/stat_sys_data_fully_connected_3g.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-xhdpi/stat_sys_data_fully_connected_4g.png b/packages/SystemUI/res/drawable-ldrtl-xhdpi/stat_sys_data_fully_connected_4g.png
deleted file mode 100644
index fd9eb8b..0000000
--- a/packages/SystemUI/res/drawable-ldrtl-xhdpi/stat_sys_data_fully_connected_4g.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-xhdpi/stat_sys_data_fully_connected_e.png b/packages/SystemUI/res/drawable-ldrtl-xhdpi/stat_sys_data_fully_connected_e.png
deleted file mode 100644
index aa0677e..0000000
--- a/packages/SystemUI/res/drawable-ldrtl-xhdpi/stat_sys_data_fully_connected_e.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-xhdpi/stat_sys_data_fully_connected_g.png b/packages/SystemUI/res/drawable-ldrtl-xhdpi/stat_sys_data_fully_connected_g.png
deleted file mode 100644
index cf1f099..0000000
--- a/packages/SystemUI/res/drawable-ldrtl-xhdpi/stat_sys_data_fully_connected_g.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-xhdpi/stat_sys_data_fully_connected_h.png b/packages/SystemUI/res/drawable-ldrtl-xhdpi/stat_sys_data_fully_connected_h.png
deleted file mode 100644
index 441e9dd..0000000
--- a/packages/SystemUI/res/drawable-ldrtl-xhdpi/stat_sys_data_fully_connected_h.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-xhdpi/stat_sys_data_fully_connected_lte.png b/packages/SystemUI/res/drawable-ldrtl-xhdpi/stat_sys_data_fully_connected_lte.png
deleted file mode 100644
index 2614d61..0000000
--- a/packages/SystemUI/res/drawable-ldrtl-xhdpi/stat_sys_data_fully_connected_lte.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-xhdpi/stat_sys_data_fully_connected_roam.png b/packages/SystemUI/res/drawable-ldrtl-xhdpi/stat_sys_data_fully_connected_roam.png
deleted file mode 100644
index d8db235..0000000
--- a/packages/SystemUI/res/drawable-ldrtl-xhdpi/stat_sys_data_fully_connected_roam.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-xhdpi/stat_sys_signal_0.png b/packages/SystemUI/res/drawable-ldrtl-xhdpi/stat_sys_signal_0.png
deleted file mode 100644
index 60ede0a..0000000
--- a/packages/SystemUI/res/drawable-ldrtl-xhdpi/stat_sys_signal_0.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-xhdpi/stat_sys_signal_0_fully.png b/packages/SystemUI/res/drawable-ldrtl-xhdpi/stat_sys_signal_0_fully.png
deleted file mode 100644
index a22fa28..0000000
--- a/packages/SystemUI/res/drawable-ldrtl-xhdpi/stat_sys_signal_0_fully.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-xhdpi/stat_sys_signal_1_fully.png b/packages/SystemUI/res/drawable-ldrtl-xhdpi/stat_sys_signal_1_fully.png
deleted file mode 100644
index 26a0543..0000000
--- a/packages/SystemUI/res/drawable-ldrtl-xhdpi/stat_sys_signal_1_fully.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-xhdpi/stat_sys_signal_2_fully.png b/packages/SystemUI/res/drawable-ldrtl-xhdpi/stat_sys_signal_2_fully.png
deleted file mode 100644
index ec31162..0000000
--- a/packages/SystemUI/res/drawable-ldrtl-xhdpi/stat_sys_signal_2_fully.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-xhdpi/stat_sys_signal_3_fully.png b/packages/SystemUI/res/drawable-ldrtl-xhdpi/stat_sys_signal_3_fully.png
deleted file mode 100644
index 26cd26f..0000000
--- a/packages/SystemUI/res/drawable-ldrtl-xhdpi/stat_sys_signal_3_fully.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-xhdpi/stat_sys_signal_4_fully.png b/packages/SystemUI/res/drawable-ldrtl-xhdpi/stat_sys_signal_4_fully.png
deleted file mode 100644
index 25ed626..0000000
--- a/packages/SystemUI/res/drawable-ldrtl-xhdpi/stat_sys_signal_4_fully.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-xhdpi/stat_sys_signal_null.png b/packages/SystemUI/res/drawable-ldrtl-xhdpi/stat_sys_signal_null.png
deleted file mode 100644
index 37da3339..0000000
--- a/packages/SystemUI/res/drawable-ldrtl-xhdpi/stat_sys_signal_null.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-xxhdpi/ic_qs_signal_0.png b/packages/SystemUI/res/drawable-ldrtl-xxhdpi/ic_qs_signal_0.png
deleted file mode 100644
index 5298d41..0000000
--- a/packages/SystemUI/res/drawable-ldrtl-xxhdpi/ic_qs_signal_0.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-xxhdpi/ic_qs_signal_1.png b/packages/SystemUI/res/drawable-ldrtl-xxhdpi/ic_qs_signal_1.png
deleted file mode 100644
index 19809c2..0000000
--- a/packages/SystemUI/res/drawable-ldrtl-xxhdpi/ic_qs_signal_1.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-xxhdpi/ic_qs_signal_1x.png b/packages/SystemUI/res/drawable-ldrtl-xxhdpi/ic_qs_signal_1x.png
deleted file mode 100644
index cd34141..0000000
--- a/packages/SystemUI/res/drawable-ldrtl-xxhdpi/ic_qs_signal_1x.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-xxhdpi/ic_qs_signal_2.png b/packages/SystemUI/res/drawable-ldrtl-xxhdpi/ic_qs_signal_2.png
deleted file mode 100644
index 5691f96..0000000
--- a/packages/SystemUI/res/drawable-ldrtl-xxhdpi/ic_qs_signal_2.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-xxhdpi/ic_qs_signal_3.png b/packages/SystemUI/res/drawable-ldrtl-xxhdpi/ic_qs_signal_3.png
deleted file mode 100644
index 56768dd..0000000
--- a/packages/SystemUI/res/drawable-ldrtl-xxhdpi/ic_qs_signal_3.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-xxhdpi/ic_qs_signal_3g.png b/packages/SystemUI/res/drawable-ldrtl-xxhdpi/ic_qs_signal_3g.png
deleted file mode 100644
index 094d4ca..0000000
--- a/packages/SystemUI/res/drawable-ldrtl-xxhdpi/ic_qs_signal_3g.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-xxhdpi/ic_qs_signal_4.png b/packages/SystemUI/res/drawable-ldrtl-xxhdpi/ic_qs_signal_4.png
deleted file mode 100644
index 55ec5b8..0000000
--- a/packages/SystemUI/res/drawable-ldrtl-xxhdpi/ic_qs_signal_4.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-xxhdpi/ic_qs_signal_4g.png b/packages/SystemUI/res/drawable-ldrtl-xxhdpi/ic_qs_signal_4g.png
deleted file mode 100644
index f92aac2..0000000
--- a/packages/SystemUI/res/drawable-ldrtl-xxhdpi/ic_qs_signal_4g.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-xxhdpi/ic_qs_signal_e.png b/packages/SystemUI/res/drawable-ldrtl-xxhdpi/ic_qs_signal_e.png
deleted file mode 100644
index 4329b67..0000000
--- a/packages/SystemUI/res/drawable-ldrtl-xxhdpi/ic_qs_signal_e.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-xxhdpi/ic_qs_signal_full_0.png b/packages/SystemUI/res/drawable-ldrtl-xxhdpi/ic_qs_signal_full_0.png
deleted file mode 100644
index a9c0849..0000000
--- a/packages/SystemUI/res/drawable-ldrtl-xxhdpi/ic_qs_signal_full_0.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-xxhdpi/ic_qs_signal_full_1.png b/packages/SystemUI/res/drawable-ldrtl-xxhdpi/ic_qs_signal_full_1.png
deleted file mode 100644
index 41c1f89..0000000
--- a/packages/SystemUI/res/drawable-ldrtl-xxhdpi/ic_qs_signal_full_1.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-xxhdpi/ic_qs_signal_full_1x.png b/packages/SystemUI/res/drawable-ldrtl-xxhdpi/ic_qs_signal_full_1x.png
deleted file mode 100644
index dea2bf2..0000000
--- a/packages/SystemUI/res/drawable-ldrtl-xxhdpi/ic_qs_signal_full_1x.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-xxhdpi/ic_qs_signal_full_2.png b/packages/SystemUI/res/drawable-ldrtl-xxhdpi/ic_qs_signal_full_2.png
deleted file mode 100644
index 3a1678f..0000000
--- a/packages/SystemUI/res/drawable-ldrtl-xxhdpi/ic_qs_signal_full_2.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-xxhdpi/ic_qs_signal_full_3.png b/packages/SystemUI/res/drawable-ldrtl-xxhdpi/ic_qs_signal_full_3.png
deleted file mode 100644
index 2e84aa1..0000000
--- a/packages/SystemUI/res/drawable-ldrtl-xxhdpi/ic_qs_signal_full_3.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-xxhdpi/ic_qs_signal_full_3g.png b/packages/SystemUI/res/drawable-ldrtl-xxhdpi/ic_qs_signal_full_3g.png
deleted file mode 100644
index 79c97fa..0000000
--- a/packages/SystemUI/res/drawable-ldrtl-xxhdpi/ic_qs_signal_full_3g.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-xxhdpi/ic_qs_signal_full_4.png b/packages/SystemUI/res/drawable-ldrtl-xxhdpi/ic_qs_signal_full_4.png
deleted file mode 100644
index 742b5bb..0000000
--- a/packages/SystemUI/res/drawable-ldrtl-xxhdpi/ic_qs_signal_full_4.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-xxhdpi/ic_qs_signal_full_4g.png b/packages/SystemUI/res/drawable-ldrtl-xxhdpi/ic_qs_signal_full_4g.png
deleted file mode 100644
index 3b297af..0000000
--- a/packages/SystemUI/res/drawable-ldrtl-xxhdpi/ic_qs_signal_full_4g.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-xxhdpi/ic_qs_signal_full_e.png b/packages/SystemUI/res/drawable-ldrtl-xxhdpi/ic_qs_signal_full_e.png
deleted file mode 100644
index c5a7b8c..0000000
--- a/packages/SystemUI/res/drawable-ldrtl-xxhdpi/ic_qs_signal_full_e.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-xxhdpi/ic_qs_signal_full_g.png b/packages/SystemUI/res/drawable-ldrtl-xxhdpi/ic_qs_signal_full_g.png
deleted file mode 100644
index 077b754..0000000
--- a/packages/SystemUI/res/drawable-ldrtl-xxhdpi/ic_qs_signal_full_g.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-xxhdpi/ic_qs_signal_full_h.png b/packages/SystemUI/res/drawable-ldrtl-xxhdpi/ic_qs_signal_full_h.png
deleted file mode 100644
index 7907b02..0000000
--- a/packages/SystemUI/res/drawable-ldrtl-xxhdpi/ic_qs_signal_full_h.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-xxhdpi/ic_qs_signal_full_lte.png b/packages/SystemUI/res/drawable-ldrtl-xxhdpi/ic_qs_signal_full_lte.png
deleted file mode 100644
index 190d3f4..0000000
--- a/packages/SystemUI/res/drawable-ldrtl-xxhdpi/ic_qs_signal_full_lte.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-xxhdpi/ic_qs_signal_full_r.png b/packages/SystemUI/res/drawable-ldrtl-xxhdpi/ic_qs_signal_full_r.png
deleted file mode 100644
index 7c70da6..0000000
--- a/packages/SystemUI/res/drawable-ldrtl-xxhdpi/ic_qs_signal_full_r.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-xxhdpi/ic_qs_signal_g.png b/packages/SystemUI/res/drawable-ldrtl-xxhdpi/ic_qs_signal_g.png
deleted file mode 100644
index 3577fbb..0000000
--- a/packages/SystemUI/res/drawable-ldrtl-xxhdpi/ic_qs_signal_g.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-xxhdpi/ic_qs_signal_h.png b/packages/SystemUI/res/drawable-ldrtl-xxhdpi/ic_qs_signal_h.png
deleted file mode 100644
index 0aae48b..0000000
--- a/packages/SystemUI/res/drawable-ldrtl-xxhdpi/ic_qs_signal_h.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-xxhdpi/ic_qs_signal_in.png b/packages/SystemUI/res/drawable-ldrtl-xxhdpi/ic_qs_signal_in.png
deleted file mode 100644
index 3725b3f..0000000
--- a/packages/SystemUI/res/drawable-ldrtl-xxhdpi/ic_qs_signal_in.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-xxhdpi/ic_qs_signal_inout.png b/packages/SystemUI/res/drawable-ldrtl-xxhdpi/ic_qs_signal_inout.png
deleted file mode 100644
index b72a274..0000000
--- a/packages/SystemUI/res/drawable-ldrtl-xxhdpi/ic_qs_signal_inout.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-xxhdpi/ic_qs_signal_lte.png b/packages/SystemUI/res/drawable-ldrtl-xxhdpi/ic_qs_signal_lte.png
deleted file mode 100644
index 2d2b106..0000000
--- a/packages/SystemUI/res/drawable-ldrtl-xxhdpi/ic_qs_signal_lte.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-xxhdpi/ic_qs_signal_no_network.png b/packages/SystemUI/res/drawable-ldrtl-xxhdpi/ic_qs_signal_no_network.png
deleted file mode 100644
index 330b96b..0000000
--- a/packages/SystemUI/res/drawable-ldrtl-xxhdpi/ic_qs_signal_no_network.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-xxhdpi/ic_qs_signal_no_signal.png b/packages/SystemUI/res/drawable-ldrtl-xxhdpi/ic_qs_signal_no_signal.png
deleted file mode 100644
index 30fe798..0000000
--- a/packages/SystemUI/res/drawable-ldrtl-xxhdpi/ic_qs_signal_no_signal.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-xxhdpi/ic_qs_signal_out.png b/packages/SystemUI/res/drawable-ldrtl-xxhdpi/ic_qs_signal_out.png
deleted file mode 100644
index aa2de43..0000000
--- a/packages/SystemUI/res/drawable-ldrtl-xxhdpi/ic_qs_signal_out.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-xxhdpi/ic_qs_signal_r.png b/packages/SystemUI/res/drawable-ldrtl-xxhdpi/ic_qs_signal_r.png
deleted file mode 100644
index a2003fc..0000000
--- a/packages/SystemUI/res/drawable-ldrtl-xxhdpi/ic_qs_signal_r.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-xxhdpi/stat_sys_data_fully_connected_1x.png b/packages/SystemUI/res/drawable-ldrtl-xxhdpi/stat_sys_data_fully_connected_1x.png
deleted file mode 100644
index c4507c7..0000000
--- a/packages/SystemUI/res/drawable-ldrtl-xxhdpi/stat_sys_data_fully_connected_1x.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-xxhdpi/stat_sys_data_fully_connected_3g.png b/packages/SystemUI/res/drawable-ldrtl-xxhdpi/stat_sys_data_fully_connected_3g.png
deleted file mode 100644
index bfef649..0000000
--- a/packages/SystemUI/res/drawable-ldrtl-xxhdpi/stat_sys_data_fully_connected_3g.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-xxhdpi/stat_sys_data_fully_connected_4g.png b/packages/SystemUI/res/drawable-ldrtl-xxhdpi/stat_sys_data_fully_connected_4g.png
deleted file mode 100644
index c39658d..0000000
--- a/packages/SystemUI/res/drawable-ldrtl-xxhdpi/stat_sys_data_fully_connected_4g.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-xxhdpi/stat_sys_data_fully_connected_e.png b/packages/SystemUI/res/drawable-ldrtl-xxhdpi/stat_sys_data_fully_connected_e.png
deleted file mode 100644
index 0f2e79c..0000000
--- a/packages/SystemUI/res/drawable-ldrtl-xxhdpi/stat_sys_data_fully_connected_e.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-xxhdpi/stat_sys_data_fully_connected_g.png b/packages/SystemUI/res/drawable-ldrtl-xxhdpi/stat_sys_data_fully_connected_g.png
deleted file mode 100644
index d37b2929..0000000
--- a/packages/SystemUI/res/drawable-ldrtl-xxhdpi/stat_sys_data_fully_connected_g.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-xxhdpi/stat_sys_data_fully_connected_h.png b/packages/SystemUI/res/drawable-ldrtl-xxhdpi/stat_sys_data_fully_connected_h.png
deleted file mode 100644
index 96a1463..0000000
--- a/packages/SystemUI/res/drawable-ldrtl-xxhdpi/stat_sys_data_fully_connected_h.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-xxhdpi/stat_sys_data_fully_connected_lte.png b/packages/SystemUI/res/drawable-ldrtl-xxhdpi/stat_sys_data_fully_connected_lte.png
deleted file mode 100644
index 9b5dbfa..0000000
--- a/packages/SystemUI/res/drawable-ldrtl-xxhdpi/stat_sys_data_fully_connected_lte.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-xxhdpi/stat_sys_data_fully_connected_roam.png b/packages/SystemUI/res/drawable-ldrtl-xxhdpi/stat_sys_data_fully_connected_roam.png
deleted file mode 100644
index cc6155f..0000000
--- a/packages/SystemUI/res/drawable-ldrtl-xxhdpi/stat_sys_data_fully_connected_roam.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-xxhdpi/stat_sys_signal_0.png b/packages/SystemUI/res/drawable-ldrtl-xxhdpi/stat_sys_signal_0.png
deleted file mode 100644
index 5950ef8..0000000
--- a/packages/SystemUI/res/drawable-ldrtl-xxhdpi/stat_sys_signal_0.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-xxhdpi/stat_sys_signal_0_fully.png b/packages/SystemUI/res/drawable-ldrtl-xxhdpi/stat_sys_signal_0_fully.png
deleted file mode 100644
index a930649..0000000
--- a/packages/SystemUI/res/drawable-ldrtl-xxhdpi/stat_sys_signal_0_fully.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-xxhdpi/stat_sys_signal_1_fully.png b/packages/SystemUI/res/drawable-ldrtl-xxhdpi/stat_sys_signal_1_fully.png
deleted file mode 100644
index 9245462..0000000
--- a/packages/SystemUI/res/drawable-ldrtl-xxhdpi/stat_sys_signal_1_fully.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-xxhdpi/stat_sys_signal_2_fully.png b/packages/SystemUI/res/drawable-ldrtl-xxhdpi/stat_sys_signal_2_fully.png
deleted file mode 100644
index b5b8884..0000000
--- a/packages/SystemUI/res/drawable-ldrtl-xxhdpi/stat_sys_signal_2_fully.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-xxhdpi/stat_sys_signal_3_fully.png b/packages/SystemUI/res/drawable-ldrtl-xxhdpi/stat_sys_signal_3_fully.png
deleted file mode 100644
index 11b5832..0000000
--- a/packages/SystemUI/res/drawable-ldrtl-xxhdpi/stat_sys_signal_3_fully.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-xxhdpi/stat_sys_signal_4_fully.png b/packages/SystemUI/res/drawable-ldrtl-xxhdpi/stat_sys_signal_4_fully.png
deleted file mode 100644
index ff8246e..0000000
--- a/packages/SystemUI/res/drawable-ldrtl-xxhdpi/stat_sys_signal_4_fully.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-ldrtl-xxhdpi/stat_sys_signal_null.png b/packages/SystemUI/res/drawable-ldrtl-xxhdpi/stat_sys_signal_null.png
deleted file mode 100644
index e0c5408..0000000
--- a/packages/SystemUI/res/drawable-ldrtl-xxhdpi/stat_sys_signal_null.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_0.png b/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_0.png
deleted file mode 100644
index 3afbca4..0000000
--- a/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_0.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_1.png b/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_1.png
deleted file mode 100644
index 2994632..0000000
--- a/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_1.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_1x.png b/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_1x.png
deleted file mode 100644
index a89191f..0000000
--- a/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_1x.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_2.png b/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_2.png
deleted file mode 100644
index b111939..0000000
--- a/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_2.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_3.png b/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_3.png
deleted file mode 100644
index 98c8e25..0000000
--- a/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_3.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_3g.png b/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_3g.png
deleted file mode 100644
index 8a8e323..0000000
--- a/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_3g.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_4.png b/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_4.png
deleted file mode 100644
index 625dbd9..0000000
--- a/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_4.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_4g.png b/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_4g.png
deleted file mode 100644
index c1063a9..0000000
--- a/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_4g.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_e.png b/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_e.png
deleted file mode 100644
index f145410..0000000
--- a/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_e.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_full_0.png b/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_full_0.png
deleted file mode 100644
index ea4ab18..0000000
--- a/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_full_0.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_full_1.png b/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_full_1.png
deleted file mode 100644
index 1d063d7..0000000
--- a/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_full_1.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_full_1x.png b/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_full_1x.png
deleted file mode 100644
index 2f76529..0000000
--- a/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_full_1x.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_full_2.png b/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_full_2.png
deleted file mode 100644
index b8551ac..0000000
--- a/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_full_2.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_full_3.png b/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_full_3.png
deleted file mode 100644
index 25e5586..0000000
--- a/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_full_3.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_full_3g.png b/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_full_3g.png
deleted file mode 100644
index 244280b..0000000
--- a/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_full_3g.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_full_4.png b/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_full_4.png
deleted file mode 100644
index f0bd70e..0000000
--- a/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_full_4.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_full_4g.png b/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_full_4g.png
deleted file mode 100644
index befe94d..0000000
--- a/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_full_4g.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_full_e.png b/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_full_e.png
deleted file mode 100644
index 01a81ab..0000000
--- a/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_full_e.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_full_g.png b/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_full_g.png
deleted file mode 100644
index abed290..0000000
--- a/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_full_g.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_full_h.png b/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_full_h.png
deleted file mode 100644
index e4b1fad..0000000
--- a/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_full_h.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_full_lte.png b/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_full_lte.png
deleted file mode 100644
index da8ebce..0000000
--- a/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_full_lte.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_full_r.png b/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_full_r.png
deleted file mode 100644
index 776210b..0000000
--- a/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_full_r.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_g.png b/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_g.png
deleted file mode 100644
index a5de26f..0000000
--- a/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_g.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_h.png b/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_h.png
deleted file mode 100644
index b3d4524..0000000
--- a/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_h.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_in.png b/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_in.png
deleted file mode 100644
index 4a2119f..0000000
--- a/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_in.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_inout.png b/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_inout.png
deleted file mode 100644
index a53d764..0000000
--- a/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_inout.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_lte.png b/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_lte.png
deleted file mode 100644
index 0555eed..0000000
--- a/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_lte.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_no_network.png b/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_no_network.png
deleted file mode 100644
index b27479a..0000000
--- a/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_no_network.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_no_signal.png b/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_no_signal.png
deleted file mode 100644
index 5922161..0000000
--- a/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_no_signal.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_out.png b/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_out.png
deleted file mode 100644
index 8b7251b..0000000
--- a/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_out.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_r.png b/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_r.png
deleted file mode 100644
index f1753d6..0000000
--- a/packages/SystemUI/res/drawable-mdpi/ic_qs_signal_r.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/ic_qs_wifi_0.png b/packages/SystemUI/res/drawable-mdpi/ic_qs_wifi_0.png
deleted file mode 100644
index b177999..0000000
--- a/packages/SystemUI/res/drawable-mdpi/ic_qs_wifi_0.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/ic_qs_wifi_1.png b/packages/SystemUI/res/drawable-mdpi/ic_qs_wifi_1.png
deleted file mode 100644
index 60e38ad..0000000
--- a/packages/SystemUI/res/drawable-mdpi/ic_qs_wifi_1.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/ic_qs_wifi_2.png b/packages/SystemUI/res/drawable-mdpi/ic_qs_wifi_2.png
deleted file mode 100644
index 8983380..0000000
--- a/packages/SystemUI/res/drawable-mdpi/ic_qs_wifi_2.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/ic_qs_wifi_3.png b/packages/SystemUI/res/drawable-mdpi/ic_qs_wifi_3.png
deleted file mode 100644
index ff652df..0000000
--- a/packages/SystemUI/res/drawable-mdpi/ic_qs_wifi_3.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/ic_qs_wifi_4.png b/packages/SystemUI/res/drawable-mdpi/ic_qs_wifi_4.png
deleted file mode 100644
index 8dd9c43..0000000
--- a/packages/SystemUI/res/drawable-mdpi/ic_qs_wifi_4.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/ic_qs_wifi_full_1.png b/packages/SystemUI/res/drawable-mdpi/ic_qs_wifi_full_1.png
deleted file mode 100644
index b3318bc..0000000
--- a/packages/SystemUI/res/drawable-mdpi/ic_qs_wifi_full_1.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/ic_qs_wifi_full_2.png b/packages/SystemUI/res/drawable-mdpi/ic_qs_wifi_full_2.png
deleted file mode 100644
index 18f5307..0000000
--- a/packages/SystemUI/res/drawable-mdpi/ic_qs_wifi_full_2.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/ic_qs_wifi_full_3.png b/packages/SystemUI/res/drawable-mdpi/ic_qs_wifi_full_3.png
deleted file mode 100644
index 6d08001c..0000000
--- a/packages/SystemUI/res/drawable-mdpi/ic_qs_wifi_full_3.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/ic_qs_wifi_full_4.png b/packages/SystemUI/res/drawable-mdpi/ic_qs_wifi_full_4.png
deleted file mode 100644
index ef3023e..0000000
--- a/packages/SystemUI/res/drawable-mdpi/ic_qs_wifi_full_4.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/ic_qs_wifi_in.png b/packages/SystemUI/res/drawable-mdpi/ic_qs_wifi_in.png
deleted file mode 100644
index 4a2119f..0000000
--- a/packages/SystemUI/res/drawable-mdpi/ic_qs_wifi_in.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/ic_qs_wifi_inout.png b/packages/SystemUI/res/drawable-mdpi/ic_qs_wifi_inout.png
deleted file mode 100644
index a53d764..0000000
--- a/packages/SystemUI/res/drawable-mdpi/ic_qs_wifi_inout.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/ic_qs_wifi_no_network.png b/packages/SystemUI/res/drawable-mdpi/ic_qs_wifi_no_network.png
deleted file mode 100644
index 535a4fdc..0000000
--- a/packages/SystemUI/res/drawable-mdpi/ic_qs_wifi_no_network.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/ic_qs_wifi_not_connected.png b/packages/SystemUI/res/drawable-mdpi/ic_qs_wifi_not_connected.png
deleted file mode 100644
index b177999..0000000
--- a/packages/SystemUI/res/drawable-mdpi/ic_qs_wifi_not_connected.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/ic_qs_wifi_out.png b/packages/SystemUI/res/drawable-mdpi/ic_qs_wifi_out.png
deleted file mode 100644
index 8b7251b..0000000
--- a/packages/SystemUI/res/drawable-mdpi/ic_qs_wifi_out.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_data_fully_connected_1x.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_data_fully_connected_1x.png
deleted file mode 100644
index 36713ae..0000000
--- a/packages/SystemUI/res/drawable-mdpi/stat_sys_data_fully_connected_1x.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_data_fully_connected_3g.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_data_fully_connected_3g.png
deleted file mode 100644
index 1c9e313..0000000
--- a/packages/SystemUI/res/drawable-mdpi/stat_sys_data_fully_connected_3g.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_data_fully_connected_4g.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_data_fully_connected_4g.png
deleted file mode 100644
index 7b1b16f..0000000
--- a/packages/SystemUI/res/drawable-mdpi/stat_sys_data_fully_connected_4g.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_data_fully_connected_e.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_data_fully_connected_e.png
deleted file mode 100644
index 02dc258..0000000
--- a/packages/SystemUI/res/drawable-mdpi/stat_sys_data_fully_connected_e.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_data_fully_connected_g.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_data_fully_connected_g.png
deleted file mode 100644
index 27417d8f..0000000
--- a/packages/SystemUI/res/drawable-mdpi/stat_sys_data_fully_connected_g.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_data_fully_connected_h.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_data_fully_connected_h.png
deleted file mode 100644
index f3a805c..0000000
--- a/packages/SystemUI/res/drawable-mdpi/stat_sys_data_fully_connected_h.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_data_fully_connected_lte.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_data_fully_connected_lte.png
deleted file mode 100644
index 8a8c3d9..0000000
--- a/packages/SystemUI/res/drawable-mdpi/stat_sys_data_fully_connected_lte.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_data_fully_connected_roam.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_data_fully_connected_roam.png
deleted file mode 100644
index fb2a6b6..0000000
--- a/packages/SystemUI/res/drawable-mdpi/stat_sys_data_fully_connected_roam.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_0.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_0.png
deleted file mode 100644
index ca02605..0000000
--- a/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_0.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_0_fully.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_0_fully.png
deleted file mode 100644
index 2dcbe28..0000000
--- a/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_0_fully.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_1_fully.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_1_fully.png
deleted file mode 100644
index fe71893..0000000
--- a/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_1_fully.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_2_fully.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_2_fully.png
deleted file mode 100644
index a6c61ff..0000000
--- a/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_2_fully.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_3_fully.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_3_fully.png
deleted file mode 100644
index ba4a9d9..0000000
--- a/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_3_fully.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_4_fully.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_4_fully.png
deleted file mode 100644
index 79c2ec1..0000000
--- a/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_4_fully.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_null.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_null.png
deleted file mode 100644
index 4548617..0000000
--- a/packages/SystemUI/res/drawable-mdpi/stat_sys_signal_null.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_wifi_signal_0.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_wifi_signal_0.png
deleted file mode 100644
index 3cc96ee..0000000
--- a/packages/SystemUI/res/drawable-mdpi/stat_sys_wifi_signal_0.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_wifi_signal_1_fully.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_wifi_signal_1_fully.png
deleted file mode 100644
index 34ae3bf..0000000
--- a/packages/SystemUI/res/drawable-mdpi/stat_sys_wifi_signal_1_fully.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_wifi_signal_2_fully.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_wifi_signal_2_fully.png
deleted file mode 100644
index cb3623a..0000000
--- a/packages/SystemUI/res/drawable-mdpi/stat_sys_wifi_signal_2_fully.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_wifi_signal_3_fully.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_wifi_signal_3_fully.png
deleted file mode 100644
index 4f9a8b0..0000000
--- a/packages/SystemUI/res/drawable-mdpi/stat_sys_wifi_signal_3_fully.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_wifi_signal_4_fully.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_wifi_signal_4_fully.png
deleted file mode 100644
index 441de0c..0000000
--- a/packages/SystemUI/res/drawable-mdpi/stat_sys_wifi_signal_4_fully.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_wifi_signal_null.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_wifi_signal_null.png
deleted file mode 100644
index 34abc98..0000000
--- a/packages/SystemUI/res/drawable-mdpi/stat_sys_wifi_signal_null.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_0.png b/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_0.png
deleted file mode 100644
index e303016..0000000
--- a/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_0.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_1.png b/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_1.png
deleted file mode 100644
index abc9358..0000000
--- a/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_1.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_1x.png b/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_1x.png
deleted file mode 100644
index f88e3a4..0000000
--- a/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_1x.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_2.png b/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_2.png
deleted file mode 100644
index 0419144..0000000
--- a/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_2.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_3.png b/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_3.png
deleted file mode 100644
index 515ffe7..0000000
--- a/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_3.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_3g.png b/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_3g.png
deleted file mode 100644
index 9aff8aa..0000000
--- a/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_3g.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_4.png b/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_4.png
deleted file mode 100644
index 118de2d..0000000
--- a/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_4.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_4g.png b/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_4g.png
deleted file mode 100644
index 2e00303..0000000
--- a/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_4g.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_e.png b/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_e.png
deleted file mode 100644
index 33ae551..0000000
--- a/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_e.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_full_0.png b/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_full_0.png
deleted file mode 100644
index 2ef694e..0000000
--- a/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_full_0.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_full_1.png b/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_full_1.png
deleted file mode 100644
index d6af953d..0000000
--- a/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_full_1.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_full_1x.png b/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_full_1x.png
deleted file mode 100644
index 2866e4c..0000000
--- a/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_full_1x.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_full_2.png b/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_full_2.png
deleted file mode 100644
index a702239..0000000
--- a/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_full_2.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_full_3.png b/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_full_3.png
deleted file mode 100644
index 33e0310..0000000
--- a/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_full_3.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_full_3g.png b/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_full_3g.png
deleted file mode 100644
index 922f7ca..0000000
--- a/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_full_3g.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_full_4.png b/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_full_4.png
deleted file mode 100644
index a857c32..0000000
--- a/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_full_4.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_full_4g.png b/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_full_4g.png
deleted file mode 100644
index 82ced1e..0000000
--- a/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_full_4g.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_full_e.png b/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_full_e.png
deleted file mode 100644
index 7ae8f90..0000000
--- a/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_full_e.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_full_g.png b/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_full_g.png
deleted file mode 100644
index 050cbcb..0000000
--- a/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_full_g.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_full_h.png b/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_full_h.png
deleted file mode 100644
index 7440bc0..0000000
--- a/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_full_h.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_full_lte.png b/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_full_lte.png
deleted file mode 100644
index 4212e49..0000000
--- a/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_full_lte.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_full_r.png b/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_full_r.png
deleted file mode 100644
index 2176a88..0000000
--- a/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_full_r.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_g.png b/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_g.png
deleted file mode 100644
index fb09a26..0000000
--- a/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_g.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_h.png b/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_h.png
deleted file mode 100644
index b52aec7..0000000
--- a/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_h.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_in.png b/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_in.png
deleted file mode 100644
index 1664688..0000000
--- a/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_in.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_inout.png b/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_inout.png
deleted file mode 100644
index b38e3ef..0000000
--- a/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_inout.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_lte.png b/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_lte.png
deleted file mode 100644
index 9942e7a..0000000
--- a/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_lte.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_no_network.png b/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_no_network.png
deleted file mode 100644
index f7571db..0000000
--- a/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_no_network.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_no_signal.png b/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_no_signal.png
deleted file mode 100644
index 48650c7..0000000
--- a/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_no_signal.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_out.png b/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_out.png
deleted file mode 100644
index c645859..0000000
--- a/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_out.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_r.png b/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_r.png
deleted file mode 100644
index 1efdebf..0000000
--- a/packages/SystemUI/res/drawable-xhdpi/ic_qs_signal_r.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xhdpi/ic_qs_wifi_0.png b/packages/SystemUI/res/drawable-xhdpi/ic_qs_wifi_0.png
deleted file mode 100644
index 2afe504..0000000
--- a/packages/SystemUI/res/drawable-xhdpi/ic_qs_wifi_0.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xhdpi/ic_qs_wifi_1.png b/packages/SystemUI/res/drawable-xhdpi/ic_qs_wifi_1.png
deleted file mode 100644
index 715e60a..0000000
--- a/packages/SystemUI/res/drawable-xhdpi/ic_qs_wifi_1.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xhdpi/ic_qs_wifi_2.png b/packages/SystemUI/res/drawable-xhdpi/ic_qs_wifi_2.png
deleted file mode 100644
index ed7f5b9..0000000
--- a/packages/SystemUI/res/drawable-xhdpi/ic_qs_wifi_2.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xhdpi/ic_qs_wifi_3.png b/packages/SystemUI/res/drawable-xhdpi/ic_qs_wifi_3.png
deleted file mode 100644
index 8f1464b..0000000
--- a/packages/SystemUI/res/drawable-xhdpi/ic_qs_wifi_3.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xhdpi/ic_qs_wifi_4.png b/packages/SystemUI/res/drawable-xhdpi/ic_qs_wifi_4.png
deleted file mode 100644
index b32c676..0000000
--- a/packages/SystemUI/res/drawable-xhdpi/ic_qs_wifi_4.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xhdpi/ic_qs_wifi_full_1.png b/packages/SystemUI/res/drawable-xhdpi/ic_qs_wifi_full_1.png
deleted file mode 100644
index 6df8484..0000000
--- a/packages/SystemUI/res/drawable-xhdpi/ic_qs_wifi_full_1.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xhdpi/ic_qs_wifi_full_2.png b/packages/SystemUI/res/drawable-xhdpi/ic_qs_wifi_full_2.png
deleted file mode 100644
index d7915c6..0000000
--- a/packages/SystemUI/res/drawable-xhdpi/ic_qs_wifi_full_2.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xhdpi/ic_qs_wifi_full_3.png b/packages/SystemUI/res/drawable-xhdpi/ic_qs_wifi_full_3.png
deleted file mode 100644
index c3773d2..0000000
--- a/packages/SystemUI/res/drawable-xhdpi/ic_qs_wifi_full_3.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xhdpi/ic_qs_wifi_full_4.png b/packages/SystemUI/res/drawable-xhdpi/ic_qs_wifi_full_4.png
deleted file mode 100644
index 263d697..0000000
--- a/packages/SystemUI/res/drawable-xhdpi/ic_qs_wifi_full_4.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xhdpi/ic_qs_wifi_in.png b/packages/SystemUI/res/drawable-xhdpi/ic_qs_wifi_in.png
deleted file mode 100644
index 1664688..0000000
--- a/packages/SystemUI/res/drawable-xhdpi/ic_qs_wifi_in.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xhdpi/ic_qs_wifi_inout.png b/packages/SystemUI/res/drawable-xhdpi/ic_qs_wifi_inout.png
deleted file mode 100644
index b38e3ef..0000000
--- a/packages/SystemUI/res/drawable-xhdpi/ic_qs_wifi_inout.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xhdpi/ic_qs_wifi_no_network.png b/packages/SystemUI/res/drawable-xhdpi/ic_qs_wifi_no_network.png
deleted file mode 100644
index b86f140..0000000
--- a/packages/SystemUI/res/drawable-xhdpi/ic_qs_wifi_no_network.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xhdpi/ic_qs_wifi_not_connected.png b/packages/SystemUI/res/drawable-xhdpi/ic_qs_wifi_not_connected.png
deleted file mode 100644
index 2afe504..0000000
--- a/packages/SystemUI/res/drawable-xhdpi/ic_qs_wifi_not_connected.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xhdpi/ic_qs_wifi_out.png b/packages/SystemUI/res/drawable-xhdpi/ic_qs_wifi_out.png
deleted file mode 100644
index c645859..0000000
--- a/packages/SystemUI/res/drawable-xhdpi/ic_qs_wifi_out.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xhdpi/stat_sys_data_fully_connected_1x.png b/packages/SystemUI/res/drawable-xhdpi/stat_sys_data_fully_connected_1x.png
deleted file mode 100644
index 2204093..0000000
--- a/packages/SystemUI/res/drawable-xhdpi/stat_sys_data_fully_connected_1x.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xhdpi/stat_sys_data_fully_connected_3g.png b/packages/SystemUI/res/drawable-xhdpi/stat_sys_data_fully_connected_3g.png
deleted file mode 100644
index 9f5e4af..0000000
--- a/packages/SystemUI/res/drawable-xhdpi/stat_sys_data_fully_connected_3g.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xhdpi/stat_sys_data_fully_connected_4g.png b/packages/SystemUI/res/drawable-xhdpi/stat_sys_data_fully_connected_4g.png
deleted file mode 100644
index a95b9e1..0000000
--- a/packages/SystemUI/res/drawable-xhdpi/stat_sys_data_fully_connected_4g.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xhdpi/stat_sys_data_fully_connected_e.png b/packages/SystemUI/res/drawable-xhdpi/stat_sys_data_fully_connected_e.png
deleted file mode 100644
index 42ad245..0000000
--- a/packages/SystemUI/res/drawable-xhdpi/stat_sys_data_fully_connected_e.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xhdpi/stat_sys_data_fully_connected_g.png b/packages/SystemUI/res/drawable-xhdpi/stat_sys_data_fully_connected_g.png
deleted file mode 100644
index fde5323..0000000
--- a/packages/SystemUI/res/drawable-xhdpi/stat_sys_data_fully_connected_g.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xhdpi/stat_sys_data_fully_connected_h.png b/packages/SystemUI/res/drawable-xhdpi/stat_sys_data_fully_connected_h.png
deleted file mode 100644
index c6cca3e..0000000
--- a/packages/SystemUI/res/drawable-xhdpi/stat_sys_data_fully_connected_h.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xhdpi/stat_sys_data_fully_connected_lte.png b/packages/SystemUI/res/drawable-xhdpi/stat_sys_data_fully_connected_lte.png
deleted file mode 100644
index 84f5cb1..0000000
--- a/packages/SystemUI/res/drawable-xhdpi/stat_sys_data_fully_connected_lte.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xhdpi/stat_sys_data_fully_connected_roam.png b/packages/SystemUI/res/drawable-xhdpi/stat_sys_data_fully_connected_roam.png
deleted file mode 100644
index 5228c29..0000000
--- a/packages/SystemUI/res/drawable-xhdpi/stat_sys_data_fully_connected_roam.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_0.png b/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_0.png
deleted file mode 100644
index 659275f..0000000
--- a/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_0.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_0_fully.png b/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_0_fully.png
deleted file mode 100644
index 17c0d99..0000000
--- a/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_0_fully.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_1_fully.png b/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_1_fully.png
deleted file mode 100644
index 8a5a476..0000000
--- a/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_1_fully.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_2_fully.png b/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_2_fully.png
deleted file mode 100644
index a6c12b2..0000000
--- a/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_2_fully.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_3_fully.png b/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_3_fully.png
deleted file mode 100644
index 3fdc60e..0000000
--- a/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_3_fully.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_4_fully.png b/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_4_fully.png
deleted file mode 100644
index b09247e..0000000
--- a/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_4_fully.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_null.png b/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_null.png
deleted file mode 100644
index 3b94b6b..0000000
--- a/packages/SystemUI/res/drawable-xhdpi/stat_sys_signal_null.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xhdpi/stat_sys_wifi_signal_0.png b/packages/SystemUI/res/drawable-xhdpi/stat_sys_wifi_signal_0.png
deleted file mode 100644
index e402ff6..0000000
--- a/packages/SystemUI/res/drawable-xhdpi/stat_sys_wifi_signal_0.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xhdpi/stat_sys_wifi_signal_1_fully.png b/packages/SystemUI/res/drawable-xhdpi/stat_sys_wifi_signal_1_fully.png
deleted file mode 100644
index 313ce4e..0000000
--- a/packages/SystemUI/res/drawable-xhdpi/stat_sys_wifi_signal_1_fully.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xhdpi/stat_sys_wifi_signal_2_fully.png b/packages/SystemUI/res/drawable-xhdpi/stat_sys_wifi_signal_2_fully.png
deleted file mode 100644
index 546c7a8..0000000
--- a/packages/SystemUI/res/drawable-xhdpi/stat_sys_wifi_signal_2_fully.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xhdpi/stat_sys_wifi_signal_3_fully.png b/packages/SystemUI/res/drawable-xhdpi/stat_sys_wifi_signal_3_fully.png
deleted file mode 100644
index ec45d86..0000000
--- a/packages/SystemUI/res/drawable-xhdpi/stat_sys_wifi_signal_3_fully.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xhdpi/stat_sys_wifi_signal_4_fully.png b/packages/SystemUI/res/drawable-xhdpi/stat_sys_wifi_signal_4_fully.png
deleted file mode 100644
index 459a1a2..0000000
--- a/packages/SystemUI/res/drawable-xhdpi/stat_sys_wifi_signal_4_fully.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xhdpi/stat_sys_wifi_signal_null.png b/packages/SystemUI/res/drawable-xhdpi/stat_sys_wifi_signal_null.png
deleted file mode 100644
index d6f752a..0000000
--- a/packages/SystemUI/res/drawable-xhdpi/stat_sys_wifi_signal_null.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xxhdpi/ic_qs_signal_0.png b/packages/SystemUI/res/drawable-xxhdpi/ic_qs_signal_0.png
deleted file mode 100644
index 76f39c0..0000000
--- a/packages/SystemUI/res/drawable-xxhdpi/ic_qs_signal_0.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xxhdpi/ic_qs_signal_1.png b/packages/SystemUI/res/drawable-xxhdpi/ic_qs_signal_1.png
deleted file mode 100644
index 746b9ea..0000000
--- a/packages/SystemUI/res/drawable-xxhdpi/ic_qs_signal_1.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xxhdpi/ic_qs_signal_1x.png b/packages/SystemUI/res/drawable-xxhdpi/ic_qs_signal_1x.png
deleted file mode 100644
index 6706ae2..0000000
--- a/packages/SystemUI/res/drawable-xxhdpi/ic_qs_signal_1x.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xxhdpi/ic_qs_signal_2.png b/packages/SystemUI/res/drawable-xxhdpi/ic_qs_signal_2.png
deleted file mode 100644
index 55ba5ab..0000000
--- a/packages/SystemUI/res/drawable-xxhdpi/ic_qs_signal_2.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xxhdpi/ic_qs_signal_3.png b/packages/SystemUI/res/drawable-xxhdpi/ic_qs_signal_3.png
deleted file mode 100644
index 547f875..0000000
--- a/packages/SystemUI/res/drawable-xxhdpi/ic_qs_signal_3.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xxhdpi/ic_qs_signal_3g.png b/packages/SystemUI/res/drawable-xxhdpi/ic_qs_signal_3g.png
deleted file mode 100644
index 4d1dc75..0000000
--- a/packages/SystemUI/res/drawable-xxhdpi/ic_qs_signal_3g.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xxhdpi/ic_qs_signal_4.png b/packages/SystemUI/res/drawable-xxhdpi/ic_qs_signal_4.png
deleted file mode 100644
index 1f65ad5..0000000
--- a/packages/SystemUI/res/drawable-xxhdpi/ic_qs_signal_4.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xxhdpi/ic_qs_signal_4g.png b/packages/SystemUI/res/drawable-xxhdpi/ic_qs_signal_4g.png
deleted file mode 100644
index aab9d27..0000000
--- a/packages/SystemUI/res/drawable-xxhdpi/ic_qs_signal_4g.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xxhdpi/ic_qs_signal_e.png b/packages/SystemUI/res/drawable-xxhdpi/ic_qs_signal_e.png
deleted file mode 100644
index cd92c5f..0000000
--- a/packages/SystemUI/res/drawable-xxhdpi/ic_qs_signal_e.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xxhdpi/ic_qs_signal_full_0.png b/packages/SystemUI/res/drawable-xxhdpi/ic_qs_signal_full_0.png
deleted file mode 100644
index eb4b855..0000000
--- a/packages/SystemUI/res/drawable-xxhdpi/ic_qs_signal_full_0.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xxhdpi/ic_qs_signal_full_1.png b/packages/SystemUI/res/drawable-xxhdpi/ic_qs_signal_full_1.png
deleted file mode 100644
index d8556b2..0000000
--- a/packages/SystemUI/res/drawable-xxhdpi/ic_qs_signal_full_1.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xxhdpi/ic_qs_signal_full_1x.png b/packages/SystemUI/res/drawable-xxhdpi/ic_qs_signal_full_1x.png
deleted file mode 100644
index ed1f7c5..0000000
--- a/packages/SystemUI/res/drawable-xxhdpi/ic_qs_signal_full_1x.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xxhdpi/ic_qs_signal_full_2.png b/packages/SystemUI/res/drawable-xxhdpi/ic_qs_signal_full_2.png
deleted file mode 100644
index b913f6e..0000000
--- a/packages/SystemUI/res/drawable-xxhdpi/ic_qs_signal_full_2.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xxhdpi/ic_qs_signal_full_3.png b/packages/SystemUI/res/drawable-xxhdpi/ic_qs_signal_full_3.png
deleted file mode 100644
index 7a1de13..0000000
--- a/packages/SystemUI/res/drawable-xxhdpi/ic_qs_signal_full_3.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xxhdpi/ic_qs_signal_full_3g.png b/packages/SystemUI/res/drawable-xxhdpi/ic_qs_signal_full_3g.png
deleted file mode 100644
index a4f4461..0000000
--- a/packages/SystemUI/res/drawable-xxhdpi/ic_qs_signal_full_3g.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xxhdpi/ic_qs_signal_full_4.png b/packages/SystemUI/res/drawable-xxhdpi/ic_qs_signal_full_4.png
deleted file mode 100644
index 7b3d06d..0000000
--- a/packages/SystemUI/res/drawable-xxhdpi/ic_qs_signal_full_4.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xxhdpi/ic_qs_signal_full_4g.png b/packages/SystemUI/res/drawable-xxhdpi/ic_qs_signal_full_4g.png
deleted file mode 100644
index 7cdcdf4..0000000
--- a/packages/SystemUI/res/drawable-xxhdpi/ic_qs_signal_full_4g.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xxhdpi/ic_qs_signal_full_e.png b/packages/SystemUI/res/drawable-xxhdpi/ic_qs_signal_full_e.png
deleted file mode 100644
index c9bed1a..0000000
--- a/packages/SystemUI/res/drawable-xxhdpi/ic_qs_signal_full_e.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xxhdpi/ic_qs_signal_full_g.png b/packages/SystemUI/res/drawable-xxhdpi/ic_qs_signal_full_g.png
deleted file mode 100644
index b9aca9a..0000000
--- a/packages/SystemUI/res/drawable-xxhdpi/ic_qs_signal_full_g.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xxhdpi/ic_qs_signal_full_h.png b/packages/SystemUI/res/drawable-xxhdpi/ic_qs_signal_full_h.png
deleted file mode 100644
index 25edf97..0000000
--- a/packages/SystemUI/res/drawable-xxhdpi/ic_qs_signal_full_h.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xxhdpi/ic_qs_signal_full_lte.png b/packages/SystemUI/res/drawable-xxhdpi/ic_qs_signal_full_lte.png
deleted file mode 100644
index 0dc66b4..0000000
--- a/packages/SystemUI/res/drawable-xxhdpi/ic_qs_signal_full_lte.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xxhdpi/ic_qs_signal_full_r.png b/packages/SystemUI/res/drawable-xxhdpi/ic_qs_signal_full_r.png
deleted file mode 100644
index b60cda6..0000000
--- a/packages/SystemUI/res/drawable-xxhdpi/ic_qs_signal_full_r.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xxhdpi/ic_qs_signal_g.png b/packages/SystemUI/res/drawable-xxhdpi/ic_qs_signal_g.png
deleted file mode 100644
index b686376..0000000
--- a/packages/SystemUI/res/drawable-xxhdpi/ic_qs_signal_g.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xxhdpi/ic_qs_signal_h.png b/packages/SystemUI/res/drawable-xxhdpi/ic_qs_signal_h.png
deleted file mode 100644
index bfe2271..0000000
--- a/packages/SystemUI/res/drawable-xxhdpi/ic_qs_signal_h.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xxhdpi/ic_qs_signal_in.png b/packages/SystemUI/res/drawable-xxhdpi/ic_qs_signal_in.png
deleted file mode 100644
index 3725b3f..0000000
--- a/packages/SystemUI/res/drawable-xxhdpi/ic_qs_signal_in.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xxhdpi/ic_qs_signal_inout.png b/packages/SystemUI/res/drawable-xxhdpi/ic_qs_signal_inout.png
deleted file mode 100644
index b72a274..0000000
--- a/packages/SystemUI/res/drawable-xxhdpi/ic_qs_signal_inout.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xxhdpi/ic_qs_signal_lte.png b/packages/SystemUI/res/drawable-xxhdpi/ic_qs_signal_lte.png
deleted file mode 100644
index b5def3e..0000000
--- a/packages/SystemUI/res/drawable-xxhdpi/ic_qs_signal_lte.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xxhdpi/ic_qs_signal_no_network.png b/packages/SystemUI/res/drawable-xxhdpi/ic_qs_signal_no_network.png
deleted file mode 100644
index 78fe964..0000000
--- a/packages/SystemUI/res/drawable-xxhdpi/ic_qs_signal_no_network.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xxhdpi/ic_qs_signal_no_signal.png b/packages/SystemUI/res/drawable-xxhdpi/ic_qs_signal_no_signal.png
deleted file mode 100644
index 9755011..0000000
--- a/packages/SystemUI/res/drawable-xxhdpi/ic_qs_signal_no_signal.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xxhdpi/ic_qs_signal_out.png b/packages/SystemUI/res/drawable-xxhdpi/ic_qs_signal_out.png
deleted file mode 100644
index aa2de43..0000000
--- a/packages/SystemUI/res/drawable-xxhdpi/ic_qs_signal_out.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xxhdpi/ic_qs_signal_r.png b/packages/SystemUI/res/drawable-xxhdpi/ic_qs_signal_r.png
deleted file mode 100644
index 60e2bd3..0000000
--- a/packages/SystemUI/res/drawable-xxhdpi/ic_qs_signal_r.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xxhdpi/ic_qs_wifi_0.png b/packages/SystemUI/res/drawable-xxhdpi/ic_qs_wifi_0.png
deleted file mode 100644
index 1951654..0000000
--- a/packages/SystemUI/res/drawable-xxhdpi/ic_qs_wifi_0.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xxhdpi/ic_qs_wifi_1.png b/packages/SystemUI/res/drawable-xxhdpi/ic_qs_wifi_1.png
deleted file mode 100644
index 01274a6..0000000
--- a/packages/SystemUI/res/drawable-xxhdpi/ic_qs_wifi_1.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xxhdpi/ic_qs_wifi_2.png b/packages/SystemUI/res/drawable-xxhdpi/ic_qs_wifi_2.png
deleted file mode 100644
index a02832d..0000000
--- a/packages/SystemUI/res/drawable-xxhdpi/ic_qs_wifi_2.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xxhdpi/ic_qs_wifi_3.png b/packages/SystemUI/res/drawable-xxhdpi/ic_qs_wifi_3.png
deleted file mode 100644
index 7e55bbb..0000000
--- a/packages/SystemUI/res/drawable-xxhdpi/ic_qs_wifi_3.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xxhdpi/ic_qs_wifi_4.png b/packages/SystemUI/res/drawable-xxhdpi/ic_qs_wifi_4.png
deleted file mode 100644
index eeb8989..0000000
--- a/packages/SystemUI/res/drawable-xxhdpi/ic_qs_wifi_4.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xxhdpi/ic_qs_wifi_full_1.png b/packages/SystemUI/res/drawable-xxhdpi/ic_qs_wifi_full_1.png
deleted file mode 100644
index f60d8a5..0000000
--- a/packages/SystemUI/res/drawable-xxhdpi/ic_qs_wifi_full_1.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xxhdpi/ic_qs_wifi_full_2.png b/packages/SystemUI/res/drawable-xxhdpi/ic_qs_wifi_full_2.png
deleted file mode 100644
index ac88239..0000000
--- a/packages/SystemUI/res/drawable-xxhdpi/ic_qs_wifi_full_2.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xxhdpi/ic_qs_wifi_full_3.png b/packages/SystemUI/res/drawable-xxhdpi/ic_qs_wifi_full_3.png
deleted file mode 100644
index 4a3c770..0000000
--- a/packages/SystemUI/res/drawable-xxhdpi/ic_qs_wifi_full_3.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xxhdpi/ic_qs_wifi_full_4.png b/packages/SystemUI/res/drawable-xxhdpi/ic_qs_wifi_full_4.png
deleted file mode 100644
index b7e7d6f..0000000
--- a/packages/SystemUI/res/drawable-xxhdpi/ic_qs_wifi_full_4.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xxhdpi/ic_qs_wifi_in.png b/packages/SystemUI/res/drawable-xxhdpi/ic_qs_wifi_in.png
deleted file mode 100644
index 5b80893..0000000
--- a/packages/SystemUI/res/drawable-xxhdpi/ic_qs_wifi_in.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xxhdpi/ic_qs_wifi_inout.png b/packages/SystemUI/res/drawable-xxhdpi/ic_qs_wifi_inout.png
deleted file mode 100644
index 21b2118..0000000
--- a/packages/SystemUI/res/drawable-xxhdpi/ic_qs_wifi_inout.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xxhdpi/ic_qs_wifi_no_network.png b/packages/SystemUI/res/drawable-xxhdpi/ic_qs_wifi_no_network.png
deleted file mode 100644
index 9bbb359..0000000
--- a/packages/SystemUI/res/drawable-xxhdpi/ic_qs_wifi_no_network.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xxhdpi/ic_qs_wifi_not_connected.png b/packages/SystemUI/res/drawable-xxhdpi/ic_qs_wifi_not_connected.png
deleted file mode 100644
index 89c8fc1..0000000
--- a/packages/SystemUI/res/drawable-xxhdpi/ic_qs_wifi_not_connected.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xxhdpi/ic_qs_wifi_out.png b/packages/SystemUI/res/drawable-xxhdpi/ic_qs_wifi_out.png
deleted file mode 100644
index 3f0447df..0000000
--- a/packages/SystemUI/res/drawable-xxhdpi/ic_qs_wifi_out.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_data_fully_connected_1x.png b/packages/SystemUI/res/drawable-xxhdpi/stat_sys_data_fully_connected_1x.png
deleted file mode 100644
index ba64922..0000000
--- a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_data_fully_connected_1x.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_data_fully_connected_3g.png b/packages/SystemUI/res/drawable-xxhdpi/stat_sys_data_fully_connected_3g.png
deleted file mode 100644
index 5b57c1e..0000000
--- a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_data_fully_connected_3g.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_data_fully_connected_4g.png b/packages/SystemUI/res/drawable-xxhdpi/stat_sys_data_fully_connected_4g.png
deleted file mode 100644
index 64b8b26..0000000
--- a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_data_fully_connected_4g.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_data_fully_connected_e.png b/packages/SystemUI/res/drawable-xxhdpi/stat_sys_data_fully_connected_e.png
deleted file mode 100644
index 02e7411..0000000
--- a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_data_fully_connected_e.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_data_fully_connected_g.png b/packages/SystemUI/res/drawable-xxhdpi/stat_sys_data_fully_connected_g.png
deleted file mode 100644
index 0a5dc61..0000000
--- a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_data_fully_connected_g.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_data_fully_connected_h.png b/packages/SystemUI/res/drawable-xxhdpi/stat_sys_data_fully_connected_h.png
deleted file mode 100644
index 96a747c..0000000
--- a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_data_fully_connected_h.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_data_fully_connected_lte.png b/packages/SystemUI/res/drawable-xxhdpi/stat_sys_data_fully_connected_lte.png
deleted file mode 100644
index 46584bc..0000000
--- a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_data_fully_connected_lte.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_data_fully_connected_roam.png b/packages/SystemUI/res/drawable-xxhdpi/stat_sys_data_fully_connected_roam.png
deleted file mode 100644
index 1f8549e..0000000
--- a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_data_fully_connected_roam.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_signal_0.png b/packages/SystemUI/res/drawable-xxhdpi/stat_sys_signal_0.png
deleted file mode 100644
index 3c9d3e6..0000000
--- a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_signal_0.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_signal_0_fully.png b/packages/SystemUI/res/drawable-xxhdpi/stat_sys_signal_0_fully.png
deleted file mode 100644
index 065f1da..0000000
--- a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_signal_0_fully.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_signal_1_fully.png b/packages/SystemUI/res/drawable-xxhdpi/stat_sys_signal_1_fully.png
deleted file mode 100644
index da2da18..0000000
--- a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_signal_1_fully.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_signal_2_fully.png b/packages/SystemUI/res/drawable-xxhdpi/stat_sys_signal_2_fully.png
deleted file mode 100644
index 30c5abf..0000000
--- a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_signal_2_fully.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_signal_3_fully.png b/packages/SystemUI/res/drawable-xxhdpi/stat_sys_signal_3_fully.png
deleted file mode 100644
index e49fd0a..0000000
--- a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_signal_3_fully.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_signal_4_fully.png b/packages/SystemUI/res/drawable-xxhdpi/stat_sys_signal_4_fully.png
deleted file mode 100644
index c5114e7..0000000
--- a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_signal_4_fully.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_signal_null.png b/packages/SystemUI/res/drawable-xxhdpi/stat_sys_signal_null.png
deleted file mode 100644
index b388b8f..0000000
--- a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_signal_null.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_wifi_signal_0.png b/packages/SystemUI/res/drawable-xxhdpi/stat_sys_wifi_signal_0.png
deleted file mode 100644
index bc272ed..0000000
--- a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_wifi_signal_0.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_wifi_signal_1_fully.png b/packages/SystemUI/res/drawable-xxhdpi/stat_sys_wifi_signal_1_fully.png
deleted file mode 100644
index d032db3..0000000
--- a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_wifi_signal_1_fully.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_wifi_signal_2_fully.png b/packages/SystemUI/res/drawable-xxhdpi/stat_sys_wifi_signal_2_fully.png
deleted file mode 100644
index 562101b..0000000
--- a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_wifi_signal_2_fully.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_wifi_signal_3_fully.png b/packages/SystemUI/res/drawable-xxhdpi/stat_sys_wifi_signal_3_fully.png
deleted file mode 100644
index ceb4163..0000000
--- a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_wifi_signal_3_fully.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_wifi_signal_4_fully.png b/packages/SystemUI/res/drawable-xxhdpi/stat_sys_wifi_signal_4_fully.png
deleted file mode 100644
index 494b005..0000000
--- a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_wifi_signal_4_fully.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_wifi_signal_null.png b/packages/SystemUI/res/drawable-xxhdpi/stat_sys_wifi_signal_null.png
deleted file mode 100644
index 3da56ad..0000000
--- a/packages/SystemUI/res/drawable-xxhdpi/stat_sys_wifi_signal_null.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable/ic_qs_rotation_unlocked.xml b/packages/SystemUI/res/drawable/ic_qs_rotation_unlocked.xml
index 6872a33..94b3a6b 100644
--- a/packages/SystemUI/res/drawable/ic_qs_rotation_unlocked.xml
+++ b/packages/SystemUI/res/drawable/ic_qs_rotation_unlocked.xml
@@ -18,14 +18,7 @@
android:height="64dp"
android:viewportWidth="24.0"
android:viewportHeight="24.0">
-
<path
android:fillColor="#FFFFFFFF"
- android:pathData="M10.25,1.75c-0.6,-0.6 -1.5,-0.6 -2.1,0.0l-6.4,6.4c-0.6,0.6 -0.6,1.5 0.0,2.1l12.0,12.0c0.6,0.6 1.5,0.6 2.1,0.0l6.4,-6.4c0.6,-0.6 0.6,-1.5 0.0,-2.1L10.25,1.75zM14.85,21.25l-12.0,-12.0l6.4,-6.4l12.0,12.0L14.85,21.25z"/>
- <path
- android:fillColor="#FFFFFFFF"
- android:pathData="M16.55,2.5c3.3,1.5 5.6,4.7 6.0,8.5l1.5,0.0c-0.6,-6.2 -5.7,-11.0 -12.0,-11.0c-0.2,0.0 -0.4,0.0 -0.7,0.0l3.8,3.8L16.55,2.5z"/>
- <path
- android:fillColor="#FFFFFFFF"
- android:pathData="M7.55,21.5c-3.3,-1.5 -5.6,-4.7 -6.0,-8.5l-1.4,0.0c0.5,6.2 5.6,11.0 11.9,11.0c0.2,0.0 0.4,0.0 0.7,0.0l-3.8,-3.8L7.55,21.5z"/>
+ android:pathData="M16.600000,2.500000c3.300000,1.500000 5.600000,4.700000 6.000000,8.500000l1.500000,0.000000c-0.600000,-6.200000 -5.700000,-11.000000 -12.000000,-11.000000c-0.200000,0.000000 -0.400000,0.000000 -0.700000,0.000000l3.800000,3.800000L16.600000,2.500000zM10.300000,1.700000c-0.600000,-0.600000 -1.500000,-0.600000 -2.100000,0.000000L1.800000,8.100000c-0.600000,0.600000 -0.600000,1.500000 0.000000,2.100000l12.000000,12.000000c0.600000,0.600000 1.500000,0.600000 2.100000,0.000000l6.400000,-6.400000c0.600000,-0.600000 0.600000,-1.500000 0.000000,-2.100000L10.300000,1.700000zM13.400000,19.700001l-9.200000,-9.200000l6.400000,-6.400000l9.200000,9.200000L13.400000,19.700001zM7.600000,21.500000C4.300000,20.000000 2.000000,16.799999 1.600000,13.000000L0.200000,13.000000c0.500000,6.200000 5.600000,11.000000 11.900000,11.000000c0.200000,0.000000 0.400000,0.000000 0.700000,0.000000L9.000000,20.200001L7.600000,21.500000z"/>
</vector>
diff --git a/packages/SystemUI/res/drawable/ic_qs_signal_0.xml b/packages/SystemUI/res/drawable/ic_qs_signal_0.xml
new file mode 100644
index 0000000..f63dfb12
--- /dev/null
+++ b/packages/SystemUI/res/drawable/ic_qs_signal_0.xml
@@ -0,0 +1,31 @@
+<!--
+Copyright (C) 2014 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+ android:autoMirrored="true"
+ android:width="32dp"
+ android:height="32dp"
+ android:viewportWidth="24.0"
+ android:viewportHeight="24.0">
+ <path
+ android:fillColor="#FFFFFFFF"
+ android:pathData="M19.700001,20.000000l2.000000,0.000000l0.000000,2.000000l-2.000000,0.000000z"/>
+ <path
+ android:fillColor="#FFFFFFFF"
+ android:pathData="M19.700001,10.000000l2.000000,0.000000l0.000000,8.100000l-2.000000,0.000000z"/>
+ <path
+ android:pathData="M17.700001,8.000000l4.299999,0.000000 0.000000,-6.000000 -20.000000,20.000000 15.700001,0.000000z"
+ android:fillColor="#4DFFFFFF"/>
+</vector>
diff --git a/packages/SystemUI/res/drawable/ic_qs_signal_1.xml b/packages/SystemUI/res/drawable/ic_qs_signal_1.xml
new file mode 100644
index 0000000..adbda4a
--- /dev/null
+++ b/packages/SystemUI/res/drawable/ic_qs_signal_1.xml
@@ -0,0 +1,34 @@
+<!--
+Copyright (C) 2014 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+ android:autoMirrored="true"
+ android:width="32dp"
+ android:height="32dp"
+ android:viewportWidth="24.0"
+ android:viewportHeight="24.0">
+ <path
+ android:fillColor="#FFFFFFFF"
+ android:pathData="M19.700001,20.000000l2.000000,0.000000l0.000000,2.000000l-2.000000,0.000000z"/>
+ <path
+ android:fillColor="#FFFFFFFF"
+ android:pathData="M19.700001,10.000000l2.000000,0.000000l0.000000,8.100000l-2.000000,0.000000z"/>
+ <path
+ android:fillColor="#FFFFFFFF"
+ android:pathData="M11.300000,12.700000l-9.300000,9.300000 9.300000,0.000000z"/>
+ <path
+ android:pathData="M17.700001,8.000000l4.299999,0.000000 0.000000,-6.000000 -20.000000,20.000000 15.700001,0.000000z"
+ android:fillColor="#4DFFFFFF"/>
+</vector>
diff --git a/packages/SystemUI/res/drawable/ic_qs_signal_1x.xml b/packages/SystemUI/res/drawable/ic_qs_signal_1x.xml
new file mode 100644
index 0000000..71c40df
--- /dev/null
+++ b/packages/SystemUI/res/drawable/ic_qs_signal_1x.xml
@@ -0,0 +1,27 @@
+<!--
+Copyright (C) 2014 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+ android:width="16.0dp"
+ android:height="32dp"
+ android:viewportWidth="12.0"
+ android:viewportHeight="24.0">
+ <path
+ android:fillColor="#FFFFFFFF"
+ android:pathData="M3.500000,11.000000L1.800000,11.000000L1.800000,4.400000L0.200000,5.100000L0.200000,3.700000l3.100000,-1.300000l0.200000,0.000000L3.500000,11.000000z"/>
+ <path
+ android:fillColor="#FFFFFFFF"
+ android:pathData="M8.600000,5.500000l1.200000,-3.000000l1.900000,0.000000L9.700000,6.700000l2.200000,4.300000L9.900000,11.000000L8.700000,7.900000L7.400000,11.000000L5.500000,11.000000l2.100000,-4.300000L5.600000,2.500000l1.900000,0.000000L8.600000,5.500000z"/>
+</vector>
diff --git a/packages/SystemUI/res/drawable/ic_qs_signal_2.xml b/packages/SystemUI/res/drawable/ic_qs_signal_2.xml
new file mode 100644
index 0000000..3358d65
--- /dev/null
+++ b/packages/SystemUI/res/drawable/ic_qs_signal_2.xml
@@ -0,0 +1,34 @@
+<!--
+Copyright (C) 2014 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+ android:autoMirrored="true"
+ android:width="32dp"
+ android:height="32dp"
+ android:viewportWidth="24.0"
+ android:viewportHeight="24.0">
+ <path
+ android:fillColor="#FFFFFFFF"
+ android:pathData="M19.700001,20.000000l2.000000,0.000000l0.000000,2.000000l-2.000000,0.000000z"/>
+ <path
+ android:fillColor="#FFFFFFFF"
+ android:pathData="M19.700001,10.000000l2.000000,0.000000l0.000000,8.100000l-2.000000,0.000000z"/>
+ <path
+ android:fillColor="#FFFFFFFF"
+ android:pathData="M13.900000,10.000000l-11.900000,12.000000 11.900000,0.000000z"/>
+ <path
+ android:pathData="M17.700001,8.000000l4.299999,0.000000 0.000000,-6.000000 -20.000000,20.000000 15.700001,0.000000z"
+ android:fillColor="#4DFFFFFF"/>
+</vector>
diff --git a/packages/SystemUI/res/drawable/ic_qs_signal_3.xml b/packages/SystemUI/res/drawable/ic_qs_signal_3.xml
new file mode 100644
index 0000000..63838a9
--- /dev/null
+++ b/packages/SystemUI/res/drawable/ic_qs_signal_3.xml
@@ -0,0 +1,34 @@
+<!--
+Copyright (C) 2014 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+ android:autoMirrored="true"
+ android:width="32dp"
+ android:height="32dp"
+ android:viewportWidth="24.0"
+ android:viewportHeight="24.0">
+ <path
+ android:fillColor="#FFFFFFFF"
+ android:pathData="M19.700001,19.900000l2.000000,0.000000l0.000000,2.000000l-2.000000,0.000000z"/>
+ <path
+ android:fillColor="#FFFFFFFF"
+ android:pathData="M19.700001,9.900000l2.000000,0.000000l0.000000,8.100000l-2.000000,0.000000z"/>
+ <path
+ android:fillColor="#FFFFFFFF"
+ android:pathData="M16.700001,7.200000l-14.700001,14.700000 14.700001,0.000000z"/>
+ <path
+ android:pathData="M17.700001,7.900000l4.299999,0.000000 0.000000,-6.000000 -20.000000,20.000000 15.700001,0.000000z"
+ android:fillColor="#4DFFFFFF"/>
+</vector>
diff --git a/packages/SystemUI/res/drawable/ic_qs_signal_3g.xml b/packages/SystemUI/res/drawable/ic_qs_signal_3g.xml
new file mode 100644
index 0000000..e9a57ea
--- /dev/null
+++ b/packages/SystemUI/res/drawable/ic_qs_signal_3g.xml
@@ -0,0 +1,27 @@
+<!--
+Copyright (C) 2014 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+ android:width="17.333334dp"
+ android:height="32dp"
+ android:viewportWidth="13.0"
+ android:viewportHeight="24.0">
+ <path
+ android:fillColor="#FFFFFFFF"
+ android:pathData="M2.000000,6.000000l0.800000,0.000000c0.300000,0.000000 0.500000,-0.100000 0.700000,-0.300000s0.200000,-0.500000 0.200000,-0.900000c0.000000,-0.300000 -0.100000,-0.600000 -0.200000,-0.800000S3.200000,3.700000 2.900000,3.700000C2.700000,3.700000 2.500000,3.800000 2.300000,4.000000S2.100000,4.400000 2.100000,4.700000L0.500000,4.700000C0.500000,4.000000 0.700000,3.400000 1.100000,3.000000s1.000000,-0.600000 1.700000,-0.600000c0.800000,0.000000 1.400000,0.200000 1.900000,0.600000s0.700000,1.000000 0.700000,1.800000c0.000000,0.400000 -0.100000,0.700000 -0.300000,1.100000S4.600000,6.500000 4.300000,6.600000C4.700000,6.800000 5.000000,7.100000 5.200000,7.400000s0.300000,0.700000 0.300000,1.200000c0.000000,0.800000 -0.200000,1.400000 -0.700000,1.800000s-1.100000,0.700000 -1.900000,0.700000c-0.700000,0.000000 -1.300000,-0.200000 -1.800000,-0.600000s-0.700000,-1.000000 -0.700000,-1.800000L2.000000,8.700000C2.000000,9.000000 2.100000,9.300000 2.300000,9.500000s0.400000,0.300000 0.600000,0.300000c0.300000,0.000000 0.500000,-0.100000 0.700000,-0.300000S3.900000,9.000000 3.900000,8.600000c0.000000,-0.500000 -0.100000,-0.800000 -0.300000,-1.000000S3.200000,7.300000 2.800000,7.300000L2.000000,7.300000L2.000000,6.000000z"/>
+ <path
+ android:fillColor="#FFFFFFFF"
+ android:pathData="M12.500000,9.900000c-0.200000,0.400000 -0.600000,0.700000 -1.000000,0.900000s-1.000000,0.400000 -1.800000,0.400000c-0.900000,0.000000 -1.700000,-0.300000 -2.200000,-0.800000S6.700000,9.000000 6.700000,7.900000L6.700000,5.600000c0.000000,-1.100000 0.300000,-1.900000 0.800000,-2.400000s1.200000,-0.800000 2.100000,-0.800000c1.000000,0.000000 1.700000,0.200000 2.100000,0.700000s0.700000,1.200000 0.700000,2.100000l-1.600000,0.000000c0.000000,-0.500000 -0.100000,-0.900000 -0.200000,-1.100000s-0.500000,-0.300000 -0.900000,-0.300000c-0.400000,0.000000 -0.700000,0.200000 -0.900000,0.500000S8.400000,5.000000 8.400000,5.600000l0.000000,2.300000c0.000000,0.700000 0.100000,1.100000 0.300000,1.400000s0.600000,0.500000 1.000000,0.500000c0.300000,0.000000 0.600000,0.000000 0.700000,-0.100000s0.300000,-0.200000 0.400000,-0.300000L10.799999,7.800000L9.600000,7.800000L9.600000,6.600000l2.900000,0.000000L12.500000,9.900000z"/>
+</vector>
diff --git a/packages/SystemUI/res/drawable/ic_qs_signal_4.xml b/packages/SystemUI/res/drawable/ic_qs_signal_4.xml
new file mode 100644
index 0000000..76690cc
--- /dev/null
+++ b/packages/SystemUI/res/drawable/ic_qs_signal_4.xml
@@ -0,0 +1,31 @@
+<!--
+Copyright (C) 2014 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+ android:autoMirrored="true"
+ android:width="32dp"
+ android:height="32dp"
+ android:viewportWidth="24.0"
+ android:viewportHeight="24.0">
+ <path
+ android:fillColor="#FFFFFFFF"
+ android:pathData="M19.700001,20.000000l2.000000,0.000000l0.000000,2.000000l-2.000000,0.000000z"/>
+ <path
+ android:fillColor="#FFFFFFFF"
+ android:pathData="M19.700001,10.000000l2.000000,0.000000l0.000000,8.100000l-2.000000,0.000000z"/>
+ <path
+ android:fillColor="#FFFFFFFF"
+ android:pathData="M2.000000,22.000000l15.700001,0.000000 0.000000,-14.000000 4.299999,0.000000 0.000000,-6.000000z"/>
+</vector>
diff --git a/packages/SystemUI/res/drawable/ic_qs_signal_4g.xml b/packages/SystemUI/res/drawable/ic_qs_signal_4g.xml
new file mode 100644
index 0000000..42045d1
--- /dev/null
+++ b/packages/SystemUI/res/drawable/ic_qs_signal_4g.xml
@@ -0,0 +1,27 @@
+<!--
+Copyright (C) 2014 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+ android:width="16.0dp"
+ android:height="32dp"
+ android:viewportWidth="12.0"
+ android:viewportHeight="24.0">
+ <path
+ android:fillColor="#FFFFFFFF"
+ android:pathData="M4.600000,7.800000l0.700000,0.000000l0.000000,1.300000L4.600000,9.100000L4.600000,11.000000L3.000000,11.000000L3.000000,9.200000L0.100000,9.200000L0.000000,8.100000L3.000000,2.500000l1.700000,0.000000L4.700000,7.800000zM1.600000,7.800000L3.000000,7.800000l0.000000,-3.000000L2.900000,5.000000L1.600000,7.800000z"/>
+ <path
+ android:fillColor="#FFFFFFFF"
+ android:pathData="M11.900000,9.900000c-0.200000,0.400000 -0.600000,0.700000 -1.000000,0.900000s-1.000000,0.400000 -1.800000,0.400000c-0.900000,0.000000 -1.700000,-0.300000 -2.200000,-0.800000S6.100000,9.000000 6.100000,7.900000L6.100000,5.600000c0.000000,-1.100000 0.300000,-1.900000 0.800000,-2.400000S8.100000,2.400000 9.000000,2.400000c1.000000,0.000000 1.700000,0.200000 2.100000,0.700000s0.700000,1.200000 0.700000,2.100000l-1.600000,0.000000c0.000000,-0.500000 -0.100000,-0.900000 -0.200000,-1.100000S9.500000,3.700000 9.000000,3.700000c-0.400000,0.000000 -0.700000,0.200000 -0.900000,0.500000S7.700000,5.000000 7.700000,5.600000l0.000000,2.300000c0.000000,0.700000 0.100000,1.100000 0.300000,1.400000s0.600000,0.500000 1.000000,0.500000c0.300000,0.000000 0.600000,0.000000 0.700000,-0.100000s0.300000,-0.200000 0.400000,-0.300000L10.099999,7.800000L9.000000,7.800000L9.000000,6.600000l2.900000,0.000000L11.900000,9.900000z"/>
+</vector>
diff --git a/packages/SystemUI/res/drawable/ic_qs_signal_disabled.xml b/packages/SystemUI/res/drawable/ic_qs_signal_disabled.xml
new file mode 100644
index 0000000..4f253e3
--- /dev/null
+++ b/packages/SystemUI/res/drawable/ic_qs_signal_disabled.xml
@@ -0,0 +1,28 @@
+<!--
+Copyright (C) 2014 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+ android:autoMirrored="true"
+ android:width="32dp"
+ android:height="32dp"
+ android:viewportWidth="24.0"
+ android:viewportHeight="24.0">
+ <path
+ android:fillColor="#4DFFFFFF"
+ android:pathData="M21.799999,22.299999l-1.199999,-1.299999 0.000000,0.000000 -9.600000,-10.000000 0.000000,0.000000 -6.400000,-6.700000 -1.300000,1.300000 6.400000,6.700000 -8.700000,8.700000 16.900000,0.000000 2.600000,2.700001z"/>
+ <path
+ android:fillColor="#4DFFFFFF"
+ android:pathData="M21.000000,1.000000l-8.600000,8.600000 8.600000,9.100000z"/>
+</vector>
diff --git a/packages/SystemUI/res/drawable/ic_qs_signal_e.xml b/packages/SystemUI/res/drawable/ic_qs_signal_e.xml
new file mode 100644
index 0000000..e49a409
--- /dev/null
+++ b/packages/SystemUI/res/drawable/ic_qs_signal_e.xml
@@ -0,0 +1,24 @@
+<!--
+Copyright (C) 2014 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+ android:width="6.6666665dp"
+ android:height="32dp"
+ android:viewportWidth="5.0"
+ android:viewportHeight="24.0">
+ <path
+ android:fillColor="#FFFFFFFF"
+ android:pathData="M4.400000,7.300000L1.700000,7.300000l0.000000,2.400000l3.300000,0.000000L5.000000,11.000000L0.000000,11.000000L0.000000,2.500000l4.900000,0.000000l0.000000,1.300000L1.700000,3.800000l0.000000,2.100000l2.800000,0.000000L4.500000,7.300000z"/>
+</vector>
diff --git a/packages/SystemUI/res/drawable/ic_qs_signal_full_0.xml b/packages/SystemUI/res/drawable/ic_qs_signal_full_0.xml
new file mode 100644
index 0000000..326373d
--- /dev/null
+++ b/packages/SystemUI/res/drawable/ic_qs_signal_full_0.xml
@@ -0,0 +1,25 @@
+<!--
+Copyright (C) 2014 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+ android:autoMirrored="true"
+ android:width="32dp"
+ android:height="32dp"
+ android:viewportWidth="24.0"
+ android:viewportHeight="24.0">
+ <path
+ android:fillColor="#4DFFFFFF"
+ android:pathData="M2.000000,22.000000l20.000000,0.000000 0.000000,-20.000000z"/>
+</vector>
diff --git a/packages/SystemUI/res/drawable/ic_qs_signal_full_1.xml b/packages/SystemUI/res/drawable/ic_qs_signal_full_1.xml
new file mode 100644
index 0000000..a71e33a
--- /dev/null
+++ b/packages/SystemUI/res/drawable/ic_qs_signal_full_1.xml
@@ -0,0 +1,28 @@
+<!--
+Copyright (C) 2014 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+ android:autoMirrored="true"
+ android:width="32dp"
+ android:height="32dp"
+ android:viewportWidth="24.0"
+ android:viewportHeight="24.0">
+ <path
+ android:fillColor="#4DFFFFFF"
+ android:pathData="M2.000000,22.000000l20.000000,0.000000 0.000000,-20.000000z"/>
+ <path
+ android:fillColor="#FFFFFFFF"
+ android:pathData="M11.300000,12.700000l-9.300000,9.300000 9.300000,0.000000z"/>
+</vector>
diff --git a/packages/SystemUI/res/drawable/ic_qs_signal_full_2.xml b/packages/SystemUI/res/drawable/ic_qs_signal_full_2.xml
new file mode 100644
index 0000000..bf19a718
--- /dev/null
+++ b/packages/SystemUI/res/drawable/ic_qs_signal_full_2.xml
@@ -0,0 +1,28 @@
+<!--
+Copyright (C) 2014 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+ android:autoMirrored="true"
+ android:width="32dp"
+ android:height="32dp"
+ android:viewportWidth="24.0"
+ android:viewportHeight="24.0">
+ <path
+ android:fillColor="#4DFFFFFF"
+ android:pathData="M2.000000,22.000000l20.000000,0.000000 0.000000,-20.000000z"/>
+ <path
+ android:fillColor="#FFFFFFFF"
+ android:pathData="M14.000000,10.000000l-12.000000,12.000000 12.000000,0.000000z"/>
+</vector>
diff --git a/packages/SystemUI/res/drawable/ic_qs_signal_full_3.xml b/packages/SystemUI/res/drawable/ic_qs_signal_full_3.xml
new file mode 100644
index 0000000..01839e85
--- /dev/null
+++ b/packages/SystemUI/res/drawable/ic_qs_signal_full_3.xml
@@ -0,0 +1,28 @@
+<!--
+Copyright (C) 2014 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+ android:autoMirrored="true"
+ android:width="32dp"
+ android:height="32dp"
+ android:viewportWidth="24.0"
+ android:viewportHeight="24.0">
+ <path
+ android:fillColor="#4DFFFFFF"
+ android:pathData="M2.000000,22.000000l20.000000,0.000000 0.000000,-20.000000z"/>
+ <path
+ android:fillColor="#FFFFFFFF"
+ android:pathData="M16.700001,7.300000l-14.700001,14.700000 14.700001,0.000000z"/>
+</vector>
diff --git a/packages/SystemUI/res/drawable/ic_qs_signal_full_4.xml b/packages/SystemUI/res/drawable/ic_qs_signal_full_4.xml
new file mode 100644
index 0000000..48151ad
--- /dev/null
+++ b/packages/SystemUI/res/drawable/ic_qs_signal_full_4.xml
@@ -0,0 +1,25 @@
+<!--
+Copyright (C) 2014 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+ android:autoMirrored="true"
+ android:width="32dp"
+ android:height="32dp"
+ android:viewportWidth="24.0"
+ android:viewportHeight="24.0">
+ <path
+ android:fillColor="#FFFFFFFF"
+ android:pathData="M2.000000,22.000000l20.000000,0.000000 0.000000,-20.000000z"/>
+</vector>
diff --git a/packages/SystemUI/res/drawable/ic_qs_signal_g.xml b/packages/SystemUI/res/drawable/ic_qs_signal_g.xml
new file mode 100644
index 0000000..9d42a44
--- /dev/null
+++ b/packages/SystemUI/res/drawable/ic_qs_signal_g.xml
@@ -0,0 +1,24 @@
+<!--
+Copyright (C) 2014 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+ android:width="9.333333dp"
+ android:height="32dp"
+ android:viewportWidth="7.0"
+ android:viewportHeight="24.0">
+ <path
+ android:fillColor="#FFFFFFFF"
+ android:pathData="M6.500000,9.900000c-0.200000,0.400000 -0.600000,0.700000 -1.000000,0.900000s-1.000000,0.400000 -1.800000,0.400000c-0.900000,0.000000 -1.700000,-0.300000 -2.200000,-0.800000S0.700000,9.000000 0.700000,7.900000L0.700000,5.600000c0.000000,-1.100000 0.300000,-1.900000 0.800000,-2.400000s1.200000,-0.800000 2.100000,-0.800000c1.000000,0.000000 1.700000,0.200000 2.100000,0.700000s0.700000,1.200000 0.700000,2.100000L4.700000,5.200000c0.000000,-0.500000 -0.100000,-0.900000 -0.200000,-1.100000S4.000000,3.700000 3.600000,3.700000c-0.400000,0.000000 -0.700000,0.200000 -0.900000,0.500000S2.300000,5.000000 2.300000,5.600000l0.000000,2.300000c0.000000,0.700000 0.100000,1.100000 0.300000,1.400000s0.600000,0.500000 1.000000,0.500000c0.300000,0.000000 0.600000,0.000000 0.700000,-0.100000s0.300000,-0.200000 0.400000,-0.300000L4.700000,7.800000L3.500000,7.800000L3.500000,6.600000l2.900000,0.000000L6.400000,9.900000z"/>
+</vector>
diff --git a/packages/SystemUI/res/drawable/ic_qs_signal_h.xml b/packages/SystemUI/res/drawable/ic_qs_signal_h.xml
new file mode 100644
index 0000000..f509d71
--- /dev/null
+++ b/packages/SystemUI/res/drawable/ic_qs_signal_h.xml
@@ -0,0 +1,24 @@
+<!--
+Copyright (C) 2014 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+ android:width="8.0dp"
+ android:height="32dp"
+ android:viewportWidth="6.0"
+ android:viewportHeight="24.0">
+ <path
+ android:fillColor="#FFFFFFFF"
+ android:pathData="M6.000000,11.000000L4.400000,11.000000L4.400000,7.500000L1.700000,7.500000L1.700000,11.000000L0.000000,11.000000L0.000000,2.500000l1.700000,0.000000l0.000000,3.700000l2.700000,0.000000L4.400000,2.500000L6.000000,2.500000L6.000000,11.000000z"/>
+</vector>
diff --git a/packages/SystemUI/res/drawable/ic_qs_signal_in.xml b/packages/SystemUI/res/drawable/ic_qs_signal_in.xml
new file mode 100644
index 0000000..236fdac
--- /dev/null
+++ b/packages/SystemUI/res/drawable/ic_qs_signal_in.xml
@@ -0,0 +1,24 @@
+<!--
+Copyright (C) 2014 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+ android:width="6.0dp"
+ android:height="32dp"
+ android:viewportWidth="6.0"
+ android:viewportHeight="24.0">
+ <path
+ android:fillColor="#FFFFFFFF"
+ android:pathData="M6.000000,15.700000l-3.000000,5.599999 -3.000000,-5.599999z"/>
+</vector>
diff --git a/packages/SystemUI/res/drawable/ic_qs_signal_lte.xml b/packages/SystemUI/res/drawable/ic_qs_signal_lte.xml
new file mode 100644
index 0000000..b7242e6
--- /dev/null
+++ b/packages/SystemUI/res/drawable/ic_qs_signal_lte.xml
@@ -0,0 +1,30 @@
+<!--
+Copyright (C) 2014 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+ android:width="17.333334dp"
+ android:height="32dp"
+ android:viewportWidth="13.0"
+ android:viewportHeight="24.0">
+ <path
+ android:fillColor="#FFFFFFFF"
+ android:pathData="M2.000000,9.700000l2.000000,0.000000L4.000000,11.000000L0.300000,11.000000L0.300000,2.500000L2.000000,2.500000L2.000000,9.700000z"/>
+ <path
+ android:fillColor="#FFFFFFFF"
+ android:pathData="M8.300000,3.800000L7.000000,3.800000L7.000000,11.000000L5.300000,11.000000L5.300000,3.800000L4.000000,3.800000L4.000000,2.500000l4.300000,0.000000L8.300000,3.800000z"/>
+ <path
+ android:fillColor="#FFFFFFFF"
+ android:pathData="M12.400000,7.300000l-1.700000,0.000000l0.000000,2.400000l2.100000,0.000000L12.799999,11.000000L9.000000,11.000000L9.000000,2.500000l3.700000,0.000000l0.000000,1.300000l-2.100000,0.000000l0.000000,2.100000l1.700000,0.000000L12.300000,7.300000z"/>
+</vector>
diff --git a/packages/SystemUI/res/drawable/ic_qs_signal_no_signal.xml b/packages/SystemUI/res/drawable/ic_qs_signal_no_signal.xml
new file mode 100644
index 0000000..f7fd97c
--- /dev/null
+++ b/packages/SystemUI/res/drawable/ic_qs_signal_no_signal.xml
@@ -0,0 +1,25 @@
+<!--
+Copyright (C) 2014 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+ android:autoMirrored="true"
+ android:width="32dp"
+ android:height="32dp"
+ android:viewportWidth="24.0"
+ android:viewportHeight="24.0">
+ <path
+ android:fillColor="#4DFFFFFF"
+ android:pathData="M2.000000,22.000000l20.000000,0.000000L22.000000,2.000000L2.000000,22.000000zM20.000000,20.000000L6.800000,20.000000L20.000000,6.800000L20.000000,20.000000z"/>
+</vector>
diff --git a/packages/SystemUI/res/drawable/ic_qs_signal_out.xml b/packages/SystemUI/res/drawable/ic_qs_signal_out.xml
new file mode 100644
index 0000000..c510972
--- /dev/null
+++ b/packages/SystemUI/res/drawable/ic_qs_signal_out.xml
@@ -0,0 +1,24 @@
+<!--
+Copyright (C) 2014 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+ android:width="6.0dp"
+ android:height="32dp"
+ android:viewportWidth="6.0"
+ android:viewportHeight="24.0">
+ <path
+ android:fillColor="#FFFFFFFF"
+ android:pathData="M0.000000,13.700000l3.000000,-5.700000 3.000000,5.700000z"/>
+</vector>
diff --git a/packages/SystemUI/res/drawable/ic_qs_signal_r.xml b/packages/SystemUI/res/drawable/ic_qs_signal_r.xml
new file mode 100644
index 0000000..66f64c9
--- /dev/null
+++ b/packages/SystemUI/res/drawable/ic_qs_signal_r.xml
@@ -0,0 +1,24 @@
+<!--
+Copyright (C) 2014 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+ android:width="8.0dp"
+ android:height="32dp"
+ android:viewportWidth="6.0"
+ android:viewportHeight="24.0">
+ <path
+ android:fillColor="#FFFFFFFF"
+ android:pathData="M2.800000,7.900000l-1.000000,0.000000L1.800000,11.000000L0.200000,11.000000L0.200000,2.500000l2.700000,0.000000c0.900000,0.000000 1.500000,0.200000 2.000000,0.700000s0.700000,1.100000 0.700000,1.900000c0.000000,0.600000 -0.100000,1.100000 -0.300000,1.500000S4.800000,7.200000 4.400000,7.400000l1.500000,3.500000L5.900000,11.000000L4.100000,11.000000L2.800000,7.900000zM1.800000,6.500000l1.100000,0.000000c0.400000,0.000000 0.600000,-0.100000 0.800000,-0.400000S4.000000,5.600000 4.000000,5.200000c0.000000,-0.400000 -0.100000,-0.800000 -0.300000,-1.000000S3.300000,3.800000 2.900000,3.800000L1.800000,3.800000L1.800000,6.500000z"/>
+</vector>
diff --git a/packages/SystemUI/res/drawable/ic_qs_vpn.xml b/packages/SystemUI/res/drawable/ic_qs_vpn.xml
new file mode 100644
index 0000000..e9141ef
--- /dev/null
+++ b/packages/SystemUI/res/drawable/ic_qs_vpn.xml
@@ -0,0 +1,25 @@
+<!--
+Copyright (C) 2014 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+ android:width="12.0dp"
+ android:height="12.0dp"
+ android:viewportWidth="24.0"
+ android:viewportHeight="24.0">
+
+ <path
+ android:fillColor="#4DFFFFFF"
+ android:pathData="M22.000000,4.000000L22.000000,3.500000C22.000000,2.100000 20.900000,1.000000 19.500000,1.000000C18.100000,1.000000 17.000000,2.100000 17.000000,3.500000L17.000000,4.000000c-0.600000,0.000000 -1.000000,0.400000 -1.000000,1.000000l0.000000,4.000000c0.000000,0.600000 0.400000,1.000000 1.000000,1.000000l5.000000,0.000000c0.600000,0.000000 1.000000,-0.400000 1.000000,-1.000000L23.000000,5.000000C23.000000,4.400000 22.600000,4.000000 22.000000,4.000000zM21.200001,4.000000l-3.400000,0.000000L17.800001,3.500000c0.000000,-0.900000 0.800000,-1.700000 1.700000,-1.700000c0.900000,0.000000 1.700000,0.800000 1.700000,1.700000L21.200003,4.000000zM18.900000,12.000000c0.000000,0.300000 0.100000,0.700000 0.100000,1.000000c0.000000,2.100000 -0.800000,4.000000 -2.100000,5.400000c-0.300000,-0.800000 -1.000000,-1.400000 -1.900000,-1.400000l-1.000000,0.000000l0.000000,-3.000000c0.000000,-0.600000 -0.400000,-1.000000 -1.000000,-1.000000L7.000000,13.000000l0.000000,-2.000000l2.000000,0.000000c0.600000,0.000000 1.000000,-0.400000 1.000000,-1.000000L10.000000,8.000000l2.000000,0.000000c1.100000,0.000000 2.000000,-0.900000 2.000000,-2.000000L14.000000,3.500000C13.100000,3.200000 12.000000,3.000000 11.000000,3.000000C5.500000,3.000000 1.000000,7.500000 1.000000,13.000000c0.000000,5.500000 4.500000,10.000000 10.000000,10.000000c5.500000,0.000000 10.000000,-4.500000 10.000000,-10.000000c0.000000,-0.300000 0.000000,-0.700000 -0.100000,-1.000000L18.900000,12.000000zM10.000000,20.900000c-3.900000,-0.500000 -7.000000,-3.900000 -7.000000,-7.900000c0.000000,-0.600000 0.100000,-1.200000 0.200000,-1.800000L8.000000,16.000000l0.000000,1.000000c0.000000,1.100000 0.900000,2.000000 2.000000,2.000000L10.000000,20.900000z"/>
+</vector>
diff --git a/packages/SystemUI/res/drawable/ic_qs_wifi_0.xml b/packages/SystemUI/res/drawable/ic_qs_wifi_0.xml
new file mode 100644
index 0000000..50c427e
--- /dev/null
+++ b/packages/SystemUI/res/drawable/ic_qs_wifi_0.xml
@@ -0,0 +1,30 @@
+<!--
+Copyright (C) 2014 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+ android:width="32.0dp"
+ android:height="29.5dp"
+ android:viewportWidth="26.0"
+ android:viewportHeight="24.0">
+ <path
+ android:fillColor="#4DFFFFFF"
+ android:pathData="M19.000000,8.000000l5.300000,0.000000l1.200000,-1.500000C25.100000,6.100000 20.299999,2.100000 13.000000,2.100000S0.900000,6.100000 0.400000,6.500000L13.000000,22.000000l0.000000,0.000000l0.000000,0.000000l0.000000,0.000000l0.000000,0.000000l6.000000,-7.400000L19.000000,8.000000z"/>
+ <path
+ android:fillColor="#FFFFFFFF"
+ android:pathData="M21.000000,20.000000l2.000000,0.000000l0.000000,2.000000l-2.000000,0.000000z"/>
+ <path
+ android:fillColor="#FFFFFFFF"
+ android:pathData="M21.000000,10.000000l2.000000,0.000000l0.000000,8.100000l-2.000000,0.000000z"/>
+</vector>
diff --git a/packages/SystemUI/res/drawable/ic_qs_wifi_1.xml b/packages/SystemUI/res/drawable/ic_qs_wifi_1.xml
new file mode 100644
index 0000000..a2d11a0
--- /dev/null
+++ b/packages/SystemUI/res/drawable/ic_qs_wifi_1.xml
@@ -0,0 +1,33 @@
+<!--
+Copyright (C) 2014 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+ android:width="32.0dp"
+ android:height="29.5dp"
+ android:viewportWidth="26.0"
+ android:viewportHeight="24.0">
+ <path
+ android:fillColor="#4DFFFFFF"
+ android:pathData="M19.000000,8.000000l5.300000,0.000000l1.300000,-1.600000C25.100000,6.000000 20.299999,2.000000 13.000000,2.000000S0.900000,6.000000 0.400000,6.400000L13.000000,22.000000l0.000000,0.000000l0.000000,0.000000l0.000000,0.000000l0.000000,0.000000l6.000000,-7.400000L19.000000,8.000000z"/>
+ <path
+ android:fillColor="#FFFFFFFF"
+ android:pathData="M13.000000,22.000000l5.500000,-6.800000c-0.200000,-0.200000 -2.300000,-1.900000 -5.500000,-1.900000s-5.300000,1.800000 -5.500000,1.900000L13.000000,22.000000L13.000000,22.000000L13.000000,22.000000L13.000000,22.000000L13.000000,22.000000z"/>
+ <path
+ android:fillColor="#FFFFFFFF"
+ android:pathData="M21.000000,20.000000l2.000000,0.000000l0.000000,2.000000l-2.000000,0.000000z"/>
+ <path
+ android:fillColor="#FFFFFFFF"
+ android:pathData="M21.000000,10.000000l2.000000,0.000000l0.000000,8.100000l-2.000000,0.000000z"/>
+</vector>
diff --git a/packages/SystemUI/res/drawable/ic_qs_wifi_2.xml b/packages/SystemUI/res/drawable/ic_qs_wifi_2.xml
new file mode 100644
index 0000000..f2043fc
--- /dev/null
+++ b/packages/SystemUI/res/drawable/ic_qs_wifi_2.xml
@@ -0,0 +1,33 @@
+<!--
+Copyright (C) 2014 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+ android:width="32.0dp"
+ android:height="29.5dp"
+ android:viewportWidth="26.0"
+ android:viewportHeight="24.0">
+ <path
+ android:fillColor="#4DFFFFFF"
+ android:pathData="M19.000000,8.000000l5.300000,0.000000l1.300000,-1.600000C25.100000,6.000000 20.299999,2.000000 13.000000,2.000000S0.900000,6.000000 0.400000,6.400000L13.000000,22.000000l0.000000,0.000000l0.000000,0.000000l0.000000,0.000000l0.000000,0.000000l6.000000,-7.400000L19.000000,8.000000z"/>
+ <path
+ android:fillColor="#FFFFFFFF"
+ android:pathData="M19.000000,11.600000c-1.300000,-0.700000 -3.400000,-1.600000 -6.000000,-1.600000c-4.400000,0.000000 -7.300000,2.400000 -7.600000,2.700000L13.000000,22.000000l0.000000,0.000000l0.000000,0.000000l0.000000,0.000000l0.000000,0.000000l6.000000,-7.400000L19.000000,11.600000z"/>
+ <path
+ android:fillColor="#FFFFFFFF"
+ android:pathData="M21.000000,20.000000l2.000000,0.000000l0.000000,2.000000l-2.000000,0.000000z"/>
+ <path
+ android:fillColor="#FFFFFFFF"
+ android:pathData="M21.000000,10.000000l2.000000,0.000000l0.000000,8.100000l-2.000000,0.000000z"/>
+</vector>
diff --git a/packages/SystemUI/res/drawable/ic_qs_wifi_3.xml b/packages/SystemUI/res/drawable/ic_qs_wifi_3.xml
new file mode 100644
index 0000000..b7a4f4c
--- /dev/null
+++ b/packages/SystemUI/res/drawable/ic_qs_wifi_3.xml
@@ -0,0 +1,33 @@
+<!--
+Copyright (C) 2014 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+ android:width="32.0dp"
+ android:height="29.5dp"
+ android:viewportWidth="26.0"
+ android:viewportHeight="24.0">
+ <path
+ android:fillColor="#4DFFFFFF"
+ android:pathData="M19.000000,8.000000l5.300000,0.000000l1.300000,-1.600000C25.100000,6.000000 20.299999,2.000000 13.000000,2.000000S0.900000,6.000000 0.400000,6.400000L13.000000,22.000000l0.000000,0.000000l0.000000,0.000000l0.000000,0.000000l0.000000,0.000000l6.000000,-7.400000L19.000000,8.000000z"/>
+ <path
+ android:fillColor="#FFFFFFFF"
+ android:pathData="M19.000000,8.600000c-1.600000,-0.700000 -3.600000,-1.300000 -6.000000,-1.300000c-5.300000,0.000000 -8.900000,3.000000 -9.200000,3.200000L13.000000,22.000000l0.000000,0.000000l0.000000,0.000000l0.000000,0.000000l0.000000,0.000000l6.000000,-7.400000L19.000000,8.600000z"/>
+ <path
+ android:fillColor="#FFFFFFFF"
+ android:pathData="M21.000000,20.000000l2.000000,0.000000l0.000000,2.000000l-2.000000,0.000000z"/>
+ <path
+ android:fillColor="#FFFFFFFF"
+ android:pathData="M21.000000,10.000000l2.000000,0.000000l0.000000,8.100000l-2.000000,0.000000z"/>
+</vector>
diff --git a/packages/SystemUI/res/drawable/ic_qs_wifi_4.xml b/packages/SystemUI/res/drawable/ic_qs_wifi_4.xml
new file mode 100644
index 0000000..35a9138
--- /dev/null
+++ b/packages/SystemUI/res/drawable/ic_qs_wifi_4.xml
@@ -0,0 +1,30 @@
+<!--
+Copyright (C) 2014 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+ android:width="32.0dp"
+ android:height="29.5dp"
+ android:viewportWidth="26.0"
+ android:viewportHeight="24.0">
+ <path
+ android:fillColor="#FFFFFFFF"
+ android:pathData="M19.000000,8.000000l5.300000,0.000000l1.300000,-1.600000C25.100000,6.000000 20.299999,2.000000 13.000000,2.000000S0.900000,6.000000 0.400000,6.400000L13.000000,22.000000l0.000000,0.000000l0.000000,0.000000l0.000000,0.000000l0.000000,0.000000l6.000000,-7.400000L19.000000,8.000000z"/>
+ <path
+ android:fillColor="#FFFFFFFF"
+ android:pathData="M21.000000,20.000000l2.000000,0.000000l0.000000,2.000000l-2.000000,0.000000z"/>
+ <path
+ android:fillColor="#FFFFFFFF"
+ android:pathData="M21.000000,10.000000l2.000000,0.000000l0.000000,8.100000l-2.000000,0.000000z"/>
+</vector>
diff --git a/packages/SystemUI/res/drawable/ic_qs_wifi_disabled.xml b/packages/SystemUI/res/drawable/ic_qs_wifi_disabled.xml
new file mode 100644
index 0000000..c505783
--- /dev/null
+++ b/packages/SystemUI/res/drawable/ic_qs_wifi_disabled.xml
@@ -0,0 +1,27 @@
+<!--
+Copyright (C) 2014 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+ android:width="32.0dp"
+ android:height="29.5dp"
+ android:viewportWidth="26.0"
+ android:viewportHeight="24.0">
+ <path
+ android:fillColor="#4DFFFFFF"
+ android:pathData="M17.500000,16.500000L5.800000,3.400000c0.000000,0.000000 0.000000,0.000000 0.000000,0.000000l-2.700000,-3.000000L1.600000,1.800000l2.200000,2.500000c-2.000000,1.000000 -3.200000,2.000000 -3.400000,2.200000L13.000000,22.000000l0.000000,0.000000l0.000000,0.000000l0.000000,0.000000l0.000000,0.000000l3.200000,-3.900000l2.400000,2.700000l1.500000,-1.400000L17.500000,16.500000L17.500000,16.500000z"/>
+ <path
+ android:fillColor="#4DFFFFFF"
+ android:pathData="M25.600000,6.500000C25.100000,6.100000 20.299999,2.100000 13.000000,2.100000c-1.900000,0.000000 -3.600000,0.300000 -5.200000,0.700000L18.700001,15.000000L25.600000,6.500000z"/>
+</vector>
diff --git a/packages/SystemUI/res/drawable/ic_qs_wifi_full_0.xml b/packages/SystemUI/res/drawable/ic_qs_wifi_full_0.xml
new file mode 100644
index 0000000..1bc7438
--- /dev/null
+++ b/packages/SystemUI/res/drawable/ic_qs_wifi_full_0.xml
@@ -0,0 +1,24 @@
+<!--
+Copyright (C) 2014 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+ android:width="32.0dp"
+ android:height="29.5dp"
+ android:viewportWidth="26.0"
+ android:viewportHeight="24.0">
+ <path
+ android:fillColor="#4DFFFFFF"
+ android:pathData="M13.000000,22.000000L25.600000,6.500000C25.100000,6.100000 20.299999,2.100000 13.000000,2.100000S0.900000,6.100000 0.400000,6.500000L13.000000,22.000000L13.000000,22.000000L13.000000,22.000000L13.000000,22.000000L13.000000,22.000000z"/>
+</vector>
diff --git a/packages/SystemUI/res/drawable/ic_qs_wifi_full_1.xml b/packages/SystemUI/res/drawable/ic_qs_wifi_full_1.xml
new file mode 100644
index 0000000..5856115
--- /dev/null
+++ b/packages/SystemUI/res/drawable/ic_qs_wifi_full_1.xml
@@ -0,0 +1,27 @@
+<!--
+Copyright (C) 2014 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+ android:width="32.0dp"
+ android:height="29.5dp"
+ android:viewportWidth="26.0"
+ android:viewportHeight="24.0">
+ <path
+ android:fillColor="#4DFFFFFF"
+ android:pathData="M13.100000,22.000000L25.600000,6.500000C25.100000,6.100000 20.299999,2.100000 13.000000,2.100000S0.900000,6.100000 0.500000,6.500000L13.100000,22.000000L13.100000,22.000000L13.100000,22.000000L13.100000,22.000000L13.100000,22.000000z"/>
+ <path
+ android:fillColor="#FFFFFFFF"
+ android:pathData="M13.100000,22.000000l5.500000,-6.800000c-0.200000,-0.200000 -2.300000,-1.900000 -5.500000,-1.900000s-5.300000,1.800000 -5.500000,1.900000L13.100000,22.000000L13.100000,22.000000L13.100000,22.000000L13.100000,22.000000L13.100000,22.000000z"/>
+</vector>
diff --git a/packages/SystemUI/res/drawable/ic_qs_wifi_full_2.xml b/packages/SystemUI/res/drawable/ic_qs_wifi_full_2.xml
new file mode 100644
index 0000000..4a5e1f8
--- /dev/null
+++ b/packages/SystemUI/res/drawable/ic_qs_wifi_full_2.xml
@@ -0,0 +1,27 @@
+<!--
+Copyright (C) 2014 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+ android:width="32.0dp"
+ android:height="29.5dp"
+ android:viewportWidth="26.0"
+ android:viewportHeight="24.0">
+ <path
+ android:fillColor="#4DFFFFFF"
+ android:pathData="M13.000000,22.000000L25.600000,6.500000C25.100000,6.100000 20.299999,2.100000 13.000000,2.100000S0.900000,6.100000 0.400000,6.500000L13.000000,22.000000L13.000000,22.000000L13.000000,22.000000L13.000000,22.000000L13.000000,22.000000z"/>
+ <path
+ android:fillColor="#FFFFFFFF"
+ android:pathData="M13.000000,22.000000l7.600000,-9.400000C20.299999,12.400000 17.400000,10.000000 13.000000,10.000000s-7.300000,2.400000 -7.600000,2.700000L13.000000,22.000000L13.000000,22.000000L13.000000,22.000000L13.000000,22.000000L13.000000,22.000000z"/>
+</vector>
diff --git a/packages/SystemUI/res/drawable/ic_qs_wifi_full_3.xml b/packages/SystemUI/res/drawable/ic_qs_wifi_full_3.xml
new file mode 100644
index 0000000..965442d
--- /dev/null
+++ b/packages/SystemUI/res/drawable/ic_qs_wifi_full_3.xml
@@ -0,0 +1,27 @@
+<!--
+Copyright (C) 2014 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+ android:width="32.0dp"
+ android:height="29.5dp"
+ android:viewportWidth="26.0"
+ android:viewportHeight="24.0">
+ <path
+ android:fillColor="#4DFFFFFF"
+ android:pathData="M13.000000,22.000000L25.600000,6.500000C25.100000,6.100000 20.299999,2.100000 13.000000,2.100000S0.900000,6.100000 0.400000,6.500000L13.000000,22.000000L13.000000,22.000000L13.000000,22.000000L13.000000,22.000000L13.000000,22.000000z"/>
+ <path
+ android:fillColor="#FFFFFFFF"
+ android:pathData="M13.000000,22.000000l9.200000,-11.400000c-0.400000,-0.300000 -3.900000,-3.200000 -9.200000,-3.200000s-8.900000,3.000000 -9.200000,3.200000L13.000000,22.000000L13.000000,22.000000L13.000000,22.000000L13.000000,22.000000L13.000000,22.000000z"/>
+</vector>
diff --git a/packages/SystemUI/res/drawable/ic_qs_wifi_full_4.xml b/packages/SystemUI/res/drawable/ic_qs_wifi_full_4.xml
new file mode 100644
index 0000000..b29d3f9
--- /dev/null
+++ b/packages/SystemUI/res/drawable/ic_qs_wifi_full_4.xml
@@ -0,0 +1,24 @@
+<!--
+Copyright (C) 2014 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+ android:width="32.0dp"
+ android:height="29.5dp"
+ android:viewportWidth="26.0"
+ android:viewportHeight="24.0">
+ <path
+ android:fillColor="#FFFFFFFF"
+ android:pathData="M13.000000,22.000000L25.600000,6.500000C25.100000,6.100000 20.299999,2.100000 13.000000,2.100000S0.900000,6.100000 0.400000,6.500000L13.000000,22.000000L13.000000,22.000000L13.000000,22.000000L13.000000,22.000000L13.000000,22.000000z"/>
+</vector>
diff --git a/packages/SystemUI/res/drawable/ic_qs_wifi_no_network.xml b/packages/SystemUI/res/drawable/ic_qs_wifi_no_network.xml
new file mode 100644
index 0000000..3d58869
--- /dev/null
+++ b/packages/SystemUI/res/drawable/ic_qs_wifi_no_network.xml
@@ -0,0 +1,24 @@
+<!--
+Copyright (C) 2014 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+ android:width="32.0dp"
+ android:height="29.5dp"
+ android:viewportWidth="26.0"
+ android:viewportHeight="24.0">
+ <path
+ android:fillColor="#4DFFFFFF"
+ android:pathData="M13.000000,2.000000C7.700000,2.000000 3.700000,3.900000 0.400000,6.400000L13.000000,22.000000L25.600000,6.500000C22.299999,4.000000 18.299999,2.000000 13.000000,2.000000zM13.000000,18.600000L3.300000,7.000000l0.000000,0.000000l0.000000,0.000000C6.000000,5.300000 8.700000,4.000000 13.000000,4.000000s7.000000,1.400000 9.700000,3.000000l0.000000,0.000000l0.000000,0.000000L13.000000,18.600000z"/>
+</vector>
diff --git a/packages/SystemUI/res/drawable/qs_detail_background.xml b/packages/SystemUI/res/drawable/qs_detail_background.xml
new file mode 100644
index 0000000..692cd44
--- /dev/null
+++ b/packages/SystemUI/res/drawable/qs_detail_background.xml
@@ -0,0 +1,19 @@
+<!--
+Copyright (C) 2014 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<transition xmlns:android="http://schemas.android.com/apk/res/android">
+ <item android:drawable="@color/qs_detail_transition" />
+ <item android:drawable="@color/system_primary_color" />
+</transition>
\ No newline at end of file
diff --git a/packages/SystemUI/res/drawable/stat_sys_data_fully_connected_1x.xml b/packages/SystemUI/res/drawable/stat_sys_data_fully_connected_1x.xml
new file mode 100644
index 0000000..26d2632
--- /dev/null
+++ b/packages/SystemUI/res/drawable/stat_sys_data_fully_connected_1x.xml
@@ -0,0 +1,27 @@
+<!--
+Copyright (C) 2014 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+ android:width="9.0dp"
+ android:height="18dp"
+ android:viewportWidth="12.0"
+ android:viewportHeight="24.0">
+ <path
+ android:fillColor="#FFFFFFFF"
+ android:pathData="M3.500000,11.000000L1.800000,11.000000L1.800000,4.400000L0.200000,5.100000L0.200000,3.700000l3.100000,-1.300000l0.200000,0.000000L3.500000,11.000000z"/>
+ <path
+ android:fillColor="#FFFFFFFF"
+ android:pathData="M8.600000,5.500000l1.200000,-3.000000l1.900000,0.000000L9.700000,6.700000l2.200000,4.300000L9.900000,11.000000L8.700000,7.900000L7.400000,11.000000L5.500000,11.000000l2.100000,-4.300000L5.600000,2.500000l1.900000,0.000000L8.600000,5.500000z"/>
+</vector>
diff --git a/packages/SystemUI/res/drawable/stat_sys_data_fully_connected_3g.xml b/packages/SystemUI/res/drawable/stat_sys_data_fully_connected_3g.xml
new file mode 100644
index 0000000..5aaf93b
--- /dev/null
+++ b/packages/SystemUI/res/drawable/stat_sys_data_fully_connected_3g.xml
@@ -0,0 +1,27 @@
+<!--
+Copyright (C) 2014 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+ android:width="9.75dp"
+ android:height="18dp"
+ android:viewportWidth="13.0"
+ android:viewportHeight="24.0">
+ <path
+ android:fillColor="#FFFFFFFF"
+ android:pathData="M2.000000,6.000000l0.800000,0.000000c0.300000,0.000000 0.500000,-0.100000 0.700000,-0.300000s0.200000,-0.500000 0.200000,-0.900000c0.000000,-0.300000 -0.100000,-0.600000 -0.200000,-0.800000S3.200000,3.700000 2.900000,3.700000C2.700000,3.700000 2.500000,3.800000 2.300000,4.000000S2.100000,4.400000 2.100000,4.700000L0.500000,4.700000C0.500000,4.000000 0.700000,3.400000 1.100000,3.000000s1.000000,-0.600000 1.700000,-0.600000c0.800000,0.000000 1.400000,0.200000 1.900000,0.600000s0.700000,1.000000 0.700000,1.800000c0.000000,0.400000 -0.100000,0.700000 -0.300000,1.100000S4.600000,6.500000 4.300000,6.600000C4.700000,6.800000 5.000000,7.100000 5.200000,7.400000s0.300000,0.700000 0.300000,1.200000c0.000000,0.800000 -0.200000,1.400000 -0.700000,1.800000s-1.100000,0.700000 -1.900000,0.700000c-0.700000,0.000000 -1.300000,-0.200000 -1.800000,-0.600000s-0.700000,-1.000000 -0.700000,-1.800000L2.000000,8.700000C2.000000,9.000000 2.100000,9.300000 2.300000,9.500000s0.400000,0.300000 0.600000,0.300000c0.300000,0.000000 0.500000,-0.100000 0.700000,-0.300000S3.900000,9.000000 3.900000,8.600000c0.000000,-0.500000 -0.100000,-0.800000 -0.300000,-1.000000S3.200000,7.300000 2.800000,7.300000L2.000000,7.300000L2.000000,6.000000z"/>
+ <path
+ android:fillColor="#FFFFFFFF"
+ android:pathData="M12.500000,9.900000c-0.200000,0.400000 -0.600000,0.700000 -1.000000,0.900000s-1.000000,0.400000 -1.800000,0.400000c-0.900000,0.000000 -1.700000,-0.300000 -2.200000,-0.800000S6.700000,9.000000 6.700000,7.900000L6.700000,5.600000c0.000000,-1.100000 0.300000,-1.900000 0.800000,-2.400000s1.200000,-0.800000 2.100000,-0.800000c1.000000,0.000000 1.700000,0.200000 2.100000,0.700000s0.700000,1.200000 0.700000,2.100000l-1.600000,0.000000c0.000000,-0.500000 -0.100000,-0.900000 -0.200000,-1.100000s-0.500000,-0.300000 -0.900000,-0.300000c-0.400000,0.000000 -0.700000,0.200000 -0.900000,0.500000S8.400000,5.000000 8.400000,5.600000l0.000000,2.300000c0.000000,0.700000 0.100000,1.100000 0.300000,1.400000s0.600000,0.500000 1.000000,0.500000c0.300000,0.000000 0.600000,0.000000 0.700000,-0.100000s0.300000,-0.200000 0.400000,-0.300000L10.799999,7.800000L9.600000,7.800000L9.600000,6.600000l2.900000,0.000000L12.500000,9.900000z"/>
+</vector>
diff --git a/packages/SystemUI/res/drawable/stat_sys_data_fully_connected_4g.xml b/packages/SystemUI/res/drawable/stat_sys_data_fully_connected_4g.xml
new file mode 100644
index 0000000..b7d84f0
--- /dev/null
+++ b/packages/SystemUI/res/drawable/stat_sys_data_fully_connected_4g.xml
@@ -0,0 +1,27 @@
+<!--
+Copyright (C) 2014 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+ android:width="9.0dp"
+ android:height="18dp"
+ android:viewportWidth="12.0"
+ android:viewportHeight="24.0">
+ <path
+ android:fillColor="#FFFFFFFF"
+ android:pathData="M4.600000,7.800000l0.700000,0.000000l0.000000,1.300000L4.600000,9.100000L4.600000,11.000000L3.000000,11.000000L3.000000,9.200000L0.100000,9.200000L0.000000,8.100000L3.000000,2.500000l1.700000,0.000000L4.700000,7.800000zM1.600000,7.800000L3.000000,7.800000l0.000000,-3.000000L2.900000,5.000000L1.600000,7.800000z"/>
+ <path
+ android:fillColor="#FFFFFFFF"
+ android:pathData="M11.900000,9.900000c-0.200000,0.400000 -0.600000,0.700000 -1.000000,0.900000s-1.000000,0.400000 -1.800000,0.400000c-0.900000,0.000000 -1.700000,-0.300000 -2.200000,-0.800000S6.100000,9.000000 6.100000,7.900000L6.100000,5.600000c0.000000,-1.100000 0.300000,-1.900000 0.800000,-2.400000S8.100000,2.400000 9.000000,2.400000c1.000000,0.000000 1.700000,0.200000 2.100000,0.700000s0.700000,1.200000 0.700000,2.100000l-1.600000,0.000000c0.000000,-0.500000 -0.100000,-0.900000 -0.200000,-1.100000S9.500000,3.700000 9.000000,3.700000c-0.400000,0.000000 -0.700000,0.200000 -0.900000,0.500000S7.700000,5.000000 7.700000,5.600000l0.000000,2.300000c0.000000,0.700000 0.100000,1.100000 0.300000,1.400000s0.600000,0.500000 1.000000,0.500000c0.300000,0.000000 0.600000,0.000000 0.700000,-0.100000s0.300000,-0.200000 0.400000,-0.300000L10.099999,7.800000L9.000000,7.800000L9.000000,6.600000l2.900000,0.000000L11.900000,9.900000z"/>
+</vector>
diff --git a/packages/SystemUI/res/drawable/stat_sys_data_fully_connected_e.xml b/packages/SystemUI/res/drawable/stat_sys_data_fully_connected_e.xml
new file mode 100644
index 0000000..7111457
--- /dev/null
+++ b/packages/SystemUI/res/drawable/stat_sys_data_fully_connected_e.xml
@@ -0,0 +1,24 @@
+<!--
+Copyright (C) 2014 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+ android:width="3.75dp"
+ android:height="18dp"
+ android:viewportWidth="5.0"
+ android:viewportHeight="24.0">
+ <path
+ android:fillColor="#FFFFFFFF"
+ android:pathData="M4.400000,7.300000L1.700000,7.300000l0.000000,2.400000l3.300000,0.000000L5.000000,11.000000L0.000000,11.000000L0.000000,2.500000l4.900000,0.000000l0.000000,1.300000L1.700000,3.800000l0.000000,2.100000l2.800000,0.000000L4.500000,7.300000z"/>
+</vector>
diff --git a/packages/SystemUI/res/drawable/stat_sys_data_fully_connected_g.xml b/packages/SystemUI/res/drawable/stat_sys_data_fully_connected_g.xml
new file mode 100644
index 0000000..97962b2
--- /dev/null
+++ b/packages/SystemUI/res/drawable/stat_sys_data_fully_connected_g.xml
@@ -0,0 +1,24 @@
+<!--
+Copyright (C) 2014 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+ android:width="5.25dp"
+ android:height="18dp"
+ android:viewportWidth="7.0"
+ android:viewportHeight="24.0">
+ <path
+ android:fillColor="#FFFFFFFF"
+ android:pathData="M6.500000,9.900000c-0.200000,0.400000 -0.600000,0.700000 -1.000000,0.900000s-1.000000,0.400000 -1.800000,0.400000c-0.900000,0.000000 -1.700000,-0.300000 -2.200000,-0.800000S0.700000,9.000000 0.700000,7.900000L0.700000,5.600000c0.000000,-1.100000 0.300000,-1.900000 0.800000,-2.400000s1.200000,-0.800000 2.100000,-0.800000c1.000000,0.000000 1.700000,0.200000 2.100000,0.700000s0.700000,1.200000 0.700000,2.100000L4.700000,5.200000c0.000000,-0.500000 -0.100000,-0.900000 -0.200000,-1.100000S4.000000,3.700000 3.600000,3.700000c-0.400000,0.000000 -0.700000,0.200000 -0.900000,0.500000S2.300000,5.000000 2.300000,5.600000l0.000000,2.300000c0.000000,0.700000 0.100000,1.100000 0.300000,1.400000s0.600000,0.500000 1.000000,0.500000c0.300000,0.000000 0.600000,0.000000 0.700000,-0.100000s0.300000,-0.200000 0.400000,-0.300000L4.700000,7.800000L3.500000,7.800000L3.500000,6.600000l2.900000,0.000000L6.400000,9.900000z"/>
+</vector>
diff --git a/packages/SystemUI/res/drawable/stat_sys_data_fully_connected_h.xml b/packages/SystemUI/res/drawable/stat_sys_data_fully_connected_h.xml
new file mode 100644
index 0000000..4859c14
--- /dev/null
+++ b/packages/SystemUI/res/drawable/stat_sys_data_fully_connected_h.xml
@@ -0,0 +1,24 @@
+<!--
+Copyright (C) 2014 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+ android:width="4.5dp"
+ android:height="18dp"
+ android:viewportWidth="6.0"
+ android:viewportHeight="24.0">
+ <path
+ android:fillColor="#FFFFFFFF"
+ android:pathData="M6.000000,11.000000L4.400000,11.000000L4.400000,7.500000L1.700000,7.500000L1.700000,11.000000L0.000000,11.000000L0.000000,2.500000l1.700000,0.000000l0.000000,3.700000l2.700000,0.000000L4.400000,2.500000L6.000000,2.500000L6.000000,11.000000z"/>
+</vector>
diff --git a/packages/SystemUI/res/drawable/stat_sys_data_fully_connected_lte.xml b/packages/SystemUI/res/drawable/stat_sys_data_fully_connected_lte.xml
new file mode 100644
index 0000000..d6446db
--- /dev/null
+++ b/packages/SystemUI/res/drawable/stat_sys_data_fully_connected_lte.xml
@@ -0,0 +1,30 @@
+<!--
+Copyright (C) 2014 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+ android:width="9.75dp"
+ android:height="18dp"
+ android:viewportWidth="13.0"
+ android:viewportHeight="24.0">
+ <path
+ android:fillColor="#FFFFFFFF"
+ android:pathData="M2.000000,9.700000l2.000000,0.000000L4.000000,11.000000L0.300000,11.000000L0.300000,2.500000L2.000000,2.500000L2.000000,9.700000z"/>
+ <path
+ android:fillColor="#FFFFFFFF"
+ android:pathData="M8.300000,3.800000L7.000000,3.800000L7.000000,11.000000L5.300000,11.000000L5.300000,3.800000L4.000000,3.800000L4.000000,2.500000l4.300000,0.000000L8.300000,3.800000z"/>
+ <path
+ android:fillColor="#FFFFFFFF"
+ android:pathData="M12.400000,7.300000l-1.700000,0.000000l0.000000,2.400000l2.100000,0.000000L12.799999,11.000000L9.000000,11.000000L9.000000,2.500000l3.700000,0.000000l0.000000,1.300000l-2.100000,0.000000l0.000000,2.100000l1.700000,0.000000L12.300000,7.300000z"/>
+</vector>
diff --git a/packages/SystemUI/res/drawable/stat_sys_data_fully_connected_roam.xml b/packages/SystemUI/res/drawable/stat_sys_data_fully_connected_roam.xml
new file mode 100644
index 0000000..7f7d5fc
--- /dev/null
+++ b/packages/SystemUI/res/drawable/stat_sys_data_fully_connected_roam.xml
@@ -0,0 +1,24 @@
+<!--
+Copyright (C) 2014 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+ android:width="4.5dp"
+ android:height="18dp"
+ android:viewportWidth="6.0"
+ android:viewportHeight="24.0">
+ <path
+ android:fillColor="#FFFFFFFF"
+ android:pathData="M2.800000,7.900000l-1.000000,0.000000L1.800000,11.000000L0.200000,11.000000L0.200000,2.500000l2.700000,0.000000c0.900000,0.000000 1.500000,0.200000 2.000000,0.700000s0.700000,1.100000 0.700000,1.900000c0.000000,0.600000 -0.100000,1.100000 -0.300000,1.500000S4.800000,7.200000 4.400000,7.400000l1.500000,3.500000L5.900000,11.000000L4.100000,11.000000L2.800000,7.900000zM1.800000,6.500000l1.100000,0.000000c0.400000,0.000000 0.600000,-0.100000 0.800000,-0.400000S4.000000,5.600000 4.000000,5.200000c0.000000,-0.400000 -0.100000,-0.800000 -0.300000,-1.000000S3.300000,3.800000 2.900000,3.800000L1.800000,3.800000L1.800000,6.500000z"/>
+</vector>
diff --git a/packages/SystemUI/res/drawable/stat_sys_signal_0.xml b/packages/SystemUI/res/drawable/stat_sys_signal_0.xml
new file mode 100644
index 0000000..67d9259
--- /dev/null
+++ b/packages/SystemUI/res/drawable/stat_sys_signal_0.xml
@@ -0,0 +1,31 @@
+<!--
+Copyright (C) 2014 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+ android:autoMirrored="true"
+ android:width="18dp"
+ android:height="18dp"
+ android:viewportWidth="24.0"
+ android:viewportHeight="24.0">
+ <path
+ android:fillColor="#FFFFFFFF"
+ android:pathData="M19.700001,20.000000l2.000000,0.000000l0.000000,2.000000l-2.000000,0.000000z"/>
+ <path
+ android:fillColor="#FFFFFFFF"
+ android:pathData="M19.700001,10.000000l2.000000,0.000000l0.000000,8.100000l-2.000000,0.000000z"/>
+ <path
+ android:pathData="M17.700001,8.000000l4.299999,0.000000 0.000000,-6.000000 -20.000000,20.000000 15.700001,0.000000z"
+ android:fillColor="#4DFFFFFF"/>
+</vector>
diff --git a/packages/SystemUI/res/drawable/stat_sys_signal_0_fully.xml b/packages/SystemUI/res/drawable/stat_sys_signal_0_fully.xml
new file mode 100644
index 0000000..3bbb800
--- /dev/null
+++ b/packages/SystemUI/res/drawable/stat_sys_signal_0_fully.xml
@@ -0,0 +1,25 @@
+<!--
+Copyright (C) 2014 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+ android:autoMirrored="true"
+ android:width="18dp"
+ android:height="18dp"
+ android:viewportWidth="24.0"
+ android:viewportHeight="24.0">
+ <path
+ android:fillColor="#4DFFFFFF"
+ android:pathData="M2.000000,22.000000l20.000000,0.000000 0.000000,-20.000000z"/>
+</vector>
diff --git a/packages/SystemUI/res/drawable/stat_sys_signal_1.xml b/packages/SystemUI/res/drawable/stat_sys_signal_1.xml
new file mode 100644
index 0000000..55f764a
--- /dev/null
+++ b/packages/SystemUI/res/drawable/stat_sys_signal_1.xml
@@ -0,0 +1,34 @@
+<!--
+Copyright (C) 2014 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+ android:autoMirrored="true"
+ android:width="18dp"
+ android:height="18dp"
+ android:viewportWidth="24.0"
+ android:viewportHeight="24.0">
+ <path
+ android:fillColor="#FFFFFFFF"
+ android:pathData="M19.700001,20.000000l2.000000,0.000000l0.000000,2.000000l-2.000000,0.000000z"/>
+ <path
+ android:fillColor="#FFFFFFFF"
+ android:pathData="M19.700001,10.000000l2.000000,0.000000l0.000000,8.100000l-2.000000,0.000000z"/>
+ <path
+ android:fillColor="#FFFFFFFF"
+ android:pathData="M11.300000,12.700000l-9.300000,9.300000 9.300000,0.000000z"/>
+ <path
+ android:pathData="M17.700001,8.000000l4.299999,0.000000 0.000000,-6.000000 -20.000000,20.000000 15.700001,0.000000z"
+ android:fillColor="#4DFFFFFF"/>
+</vector>
diff --git a/packages/SystemUI/res/drawable/stat_sys_signal_1_fully.xml b/packages/SystemUI/res/drawable/stat_sys_signal_1_fully.xml
new file mode 100644
index 0000000..b82e428
--- /dev/null
+++ b/packages/SystemUI/res/drawable/stat_sys_signal_1_fully.xml
@@ -0,0 +1,28 @@
+<!--
+Copyright (C) 2014 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+ android:autoMirrored="true"
+ android:width="18dp"
+ android:height="18dp"
+ android:viewportWidth="24.0"
+ android:viewportHeight="24.0">
+ <path
+ android:fillColor="#4DFFFFFF"
+ android:pathData="M2.000000,22.000000l20.000000,0.000000 0.000000,-20.000000z"/>
+ <path
+ android:fillColor="#FFFFFFFF"
+ android:pathData="M11.300000,12.700000l-9.300000,9.300000 9.300000,0.000000z"/>
+</vector>
diff --git a/packages/SystemUI/res/drawable/stat_sys_signal_2.xml b/packages/SystemUI/res/drawable/stat_sys_signal_2.xml
new file mode 100644
index 0000000..ca0eeb3
--- /dev/null
+++ b/packages/SystemUI/res/drawable/stat_sys_signal_2.xml
@@ -0,0 +1,34 @@
+<!--
+Copyright (C) 2014 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+ android:autoMirrored="true"
+ android:width="18dp"
+ android:height="18dp"
+ android:viewportWidth="24.0"
+ android:viewportHeight="24.0">
+ <path
+ android:fillColor="#FFFFFFFF"
+ android:pathData="M19.700001,20.000000l2.000000,0.000000l0.000000,2.000000l-2.000000,0.000000z"/>
+ <path
+ android:fillColor="#FFFFFFFF"
+ android:pathData="M19.700001,10.000000l2.000000,0.000000l0.000000,8.100000l-2.000000,0.000000z"/>
+ <path
+ android:fillColor="#FFFFFFFF"
+ android:pathData="M13.900000,10.000000l-11.900000,12.000000 11.900000,0.000000z"/>
+ <path
+ android:pathData="M17.700001,8.000000l4.299999,0.000000 0.000000,-6.000000 -20.000000,20.000000 15.700001,0.000000z"
+ android:fillColor="#4DFFFFFF"/>
+</vector>
diff --git a/packages/SystemUI/res/drawable/stat_sys_signal_2_fully.xml b/packages/SystemUI/res/drawable/stat_sys_signal_2_fully.xml
new file mode 100644
index 0000000..abc8dd1
--- /dev/null
+++ b/packages/SystemUI/res/drawable/stat_sys_signal_2_fully.xml
@@ -0,0 +1,28 @@
+<!--
+Copyright (C) 2014 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+ android:autoMirrored="true"
+ android:width="18dp"
+ android:height="18dp"
+ android:viewportWidth="24.0"
+ android:viewportHeight="24.0">
+ <path
+ android:fillColor="#4DFFFFFF"
+ android:pathData="M2.000000,22.000000l20.000000,0.000000 0.000000,-20.000000z"/>
+ <path
+ android:fillColor="#FFFFFFFF"
+ android:pathData="M14.000000,10.000000l-12.000000,12.000000 12.000000,0.000000z"/>
+</vector>
diff --git a/packages/SystemUI/res/drawable/stat_sys_signal_3.xml b/packages/SystemUI/res/drawable/stat_sys_signal_3.xml
new file mode 100644
index 0000000..2b3e571
--- /dev/null
+++ b/packages/SystemUI/res/drawable/stat_sys_signal_3.xml
@@ -0,0 +1,34 @@
+<!--
+Copyright (C) 2014 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+ android:autoMirrored="true"
+ android:width="18dp"
+ android:height="18dp"
+ android:viewportWidth="24.0"
+ android:viewportHeight="24.0">
+ <path
+ android:fillColor="#FFFFFFFF"
+ android:pathData="M19.700001,19.900000l2.000000,0.000000l0.000000,2.000000l-2.000000,0.000000z"/>
+ <path
+ android:fillColor="#FFFFFFFF"
+ android:pathData="M19.700001,9.900000l2.000000,0.000000l0.000000,8.100000l-2.000000,0.000000z"/>
+ <path
+ android:fillColor="#FFFFFFFF"
+ android:pathData="M16.700001,7.200000l-14.700001,14.700000 14.700001,0.000000z"/>
+ <path
+ android:pathData="M17.700001,7.900000l4.299999,0.000000 0.000000,-6.000000 -20.000000,20.000000 15.700001,0.000000z"
+ android:fillColor="#4DFFFFFF"/>
+</vector>
diff --git a/packages/SystemUI/res/drawable/stat_sys_signal_3_fully.xml b/packages/SystemUI/res/drawable/stat_sys_signal_3_fully.xml
new file mode 100644
index 0000000..d47f167
--- /dev/null
+++ b/packages/SystemUI/res/drawable/stat_sys_signal_3_fully.xml
@@ -0,0 +1,28 @@
+<!--
+Copyright (C) 2014 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+ android:autoMirrored="true"
+ android:width="18dp"
+ android:height="18dp"
+ android:viewportWidth="24.0"
+ android:viewportHeight="24.0">
+ <path
+ android:fillColor="#4DFFFFFF"
+ android:pathData="M2.000000,22.000000l20.000000,0.000000 0.000000,-20.000000z"/>
+ <path
+ android:fillColor="#FFFFFFFF"
+ android:pathData="M16.700001,7.300000l-14.700001,14.700000 14.700001,0.000000z"/>
+</vector>
diff --git a/packages/SystemUI/res/drawable/stat_sys_signal_4.xml b/packages/SystemUI/res/drawable/stat_sys_signal_4.xml
new file mode 100644
index 0000000..7d4dd8a
--- /dev/null
+++ b/packages/SystemUI/res/drawable/stat_sys_signal_4.xml
@@ -0,0 +1,31 @@
+<!--
+Copyright (C) 2014 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+ android:autoMirrored="true"
+ android:width="18dp"
+ android:height="18dp"
+ android:viewportWidth="24.0"
+ android:viewportHeight="24.0">
+ <path
+ android:fillColor="#FFFFFFFF"
+ android:pathData="M19.700001,20.000000l2.000000,0.000000l0.000000,2.000000l-2.000000,0.000000z"/>
+ <path
+ android:fillColor="#FFFFFFFF"
+ android:pathData="M19.700001,10.000000l2.000000,0.000000l0.000000,8.100000l-2.000000,0.000000z"/>
+ <path
+ android:fillColor="#FFFFFFFF"
+ android:pathData="M2.000000,22.000000l15.700001,0.000000 0.000000,-14.000000 4.299999,0.000000 0.000000,-6.000000z"/>
+</vector>
diff --git a/packages/SystemUI/res/drawable/stat_sys_signal_4_fully.xml b/packages/SystemUI/res/drawable/stat_sys_signal_4_fully.xml
new file mode 100644
index 0000000..5b1bac3
--- /dev/null
+++ b/packages/SystemUI/res/drawable/stat_sys_signal_4_fully.xml
@@ -0,0 +1,25 @@
+<!--
+Copyright (C) 2014 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+ android:autoMirrored="true"
+ android:width="18dp"
+ android:height="18dp"
+ android:viewportWidth="24.0"
+ android:viewportHeight="24.0">
+ <path
+ android:fillColor="#FFFFFFFF"
+ android:pathData="M2.000000,22.000000l20.000000,0.000000 0.000000,-20.000000z"/>
+</vector>
diff --git a/packages/SystemUI/res/drawable/stat_sys_signal_null.xml b/packages/SystemUI/res/drawable/stat_sys_signal_null.xml
new file mode 100644
index 0000000..45d34a2
--- /dev/null
+++ b/packages/SystemUI/res/drawable/stat_sys_signal_null.xml
@@ -0,0 +1,25 @@
+<!--
+Copyright (C) 2014 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+ android:autoMirrored="true"
+ android:width="18dp"
+ android:height="18dp"
+ android:viewportWidth="24.0"
+ android:viewportHeight="24.0">
+ <path
+ android:fillColor="#4DFFFFFF"
+ android:pathData="M2.000000,22.000000l20.000000,0.000000L22.000000,2.000000L2.000000,22.000000zM20.000000,20.000000L6.800000,20.000000L20.000000,6.800000L20.000000,20.000000z"/>
+</vector>
diff --git a/packages/SystemUI/res/drawable/stat_sys_wifi_signal_0.xml b/packages/SystemUI/res/drawable/stat_sys_wifi_signal_0.xml
new file mode 100644
index 0000000..4965674
--- /dev/null
+++ b/packages/SystemUI/res/drawable/stat_sys_wifi_signal_0.xml
@@ -0,0 +1,30 @@
+<!--
+Copyright (C) 2014 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+ android:width="20dp"
+ android:height="18dp"
+ android:viewportWidth="26.0"
+ android:viewportHeight="24.0">
+ <path
+ android:fillColor="#4DFFFFFF"
+ android:pathData="M19.000000,8.000000l5.300000,0.000000l1.200000,-1.500000C25.100000,6.100000 20.299999,2.100000 13.000000,2.100000S0.900000,6.100000 0.400000,6.500000L13.000000,22.000000l0.000000,0.000000l0.000000,0.000000l0.000000,0.000000l0.000000,0.000000l6.000000,-7.400000L19.000000,8.000000z"/>
+ <path
+ android:fillColor="#FFFFFFFF"
+ android:pathData="M21.000000,20.000000l2.000000,0.000000l0.000000,2.000000l-2.000000,0.000000z"/>
+ <path
+ android:fillColor="#FFFFFFFF"
+ android:pathData="M21.000000,10.000000l2.000000,0.000000l0.000000,8.100000l-2.000000,0.000000z"/>
+</vector>
diff --git a/packages/SystemUI/res/drawable/stat_sys_wifi_signal_0_fully.xml b/packages/SystemUI/res/drawable/stat_sys_wifi_signal_0_fully.xml
new file mode 100644
index 0000000..e9cad0e
--- /dev/null
+++ b/packages/SystemUI/res/drawable/stat_sys_wifi_signal_0_fully.xml
@@ -0,0 +1,24 @@
+<!--
+Copyright (C) 2014 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+ android:width="20dp"
+ android:height="18dp"
+ android:viewportWidth="26.0"
+ android:viewportHeight="24.0">
+ <path
+ android:fillColor="#4DFFFFFF"
+ android:pathData="M13.000000,22.000000L25.600000,6.500000C25.100000,6.100000 20.299999,2.100000 13.000000,2.100000S0.900000,6.100000 0.400000,6.500000L13.000000,22.000000L13.000000,22.000000L13.000000,22.000000L13.000000,22.000000L13.000000,22.000000z"/>
+</vector>
diff --git a/packages/SystemUI/res/drawable/stat_sys_wifi_signal_1.xml b/packages/SystemUI/res/drawable/stat_sys_wifi_signal_1.xml
new file mode 100644
index 0000000..7d588a3
--- /dev/null
+++ b/packages/SystemUI/res/drawable/stat_sys_wifi_signal_1.xml
@@ -0,0 +1,33 @@
+<!--
+Copyright (C) 2014 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+ android:width="20dp"
+ android:height="18dp"
+ android:viewportWidth="26.0"
+ android:viewportHeight="24.0">
+ <path
+ android:fillColor="#4DFFFFFF"
+ android:pathData="M19.000000,8.000000l5.300000,0.000000l1.300000,-1.600000C25.100000,6.000000 20.299999,2.000000 13.000000,2.000000S0.900000,6.000000 0.400000,6.400000L13.000000,22.000000l0.000000,0.000000l0.000000,0.000000l0.000000,0.000000l0.000000,0.000000l6.000000,-7.400000L19.000000,8.000000z"/>
+ <path
+ android:fillColor="#FFFFFFFF"
+ android:pathData="M13.000000,22.000000l5.500000,-6.800000c-0.200000,-0.200000 -2.300000,-1.900000 -5.500000,-1.900000s-5.300000,1.800000 -5.500000,1.900000L13.000000,22.000000L13.000000,22.000000L13.000000,22.000000L13.000000,22.000000L13.000000,22.000000z"/>
+ <path
+ android:fillColor="#FFFFFFFF"
+ android:pathData="M21.000000,20.000000l2.000000,0.000000l0.000000,2.000000l-2.000000,0.000000z"/>
+ <path
+ android:fillColor="#FFFFFFFF"
+ android:pathData="M21.000000,10.000000l2.000000,0.000000l0.000000,8.100000l-2.000000,0.000000z"/>
+</vector>
diff --git a/packages/SystemUI/res/drawable/stat_sys_wifi_signal_1_fully.xml b/packages/SystemUI/res/drawable/stat_sys_wifi_signal_1_fully.xml
new file mode 100644
index 0000000..348f963
--- /dev/null
+++ b/packages/SystemUI/res/drawable/stat_sys_wifi_signal_1_fully.xml
@@ -0,0 +1,27 @@
+<!--
+Copyright (C) 2014 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+ android:width="20dp"
+ android:height="18dp"
+ android:viewportWidth="26.0"
+ android:viewportHeight="24.0">
+ <path
+ android:fillColor="#4DFFFFFF"
+ android:pathData="M13.100000,22.000000L25.600000,6.500000C25.100000,6.100000 20.299999,2.100000 13.000000,2.100000S0.900000,6.100000 0.500000,6.500000L13.100000,22.000000L13.100000,22.000000L13.100000,22.000000L13.100000,22.000000L13.100000,22.000000z"/>
+ <path
+ android:fillColor="#FFFFFFFF"
+ android:pathData="M13.100000,22.000000l5.500000,-6.800000c-0.200000,-0.200000 -2.300000,-1.900000 -5.500000,-1.900000s-5.300000,1.800000 -5.500000,1.900000L13.100000,22.000000L13.100000,22.000000L13.100000,22.000000L13.100000,22.000000L13.100000,22.000000z"/>
+</vector>
diff --git a/packages/SystemUI/res/drawable/stat_sys_wifi_signal_2.xml b/packages/SystemUI/res/drawable/stat_sys_wifi_signal_2.xml
new file mode 100644
index 0000000..4fbdd69
--- /dev/null
+++ b/packages/SystemUI/res/drawable/stat_sys_wifi_signal_2.xml
@@ -0,0 +1,33 @@
+<!--
+Copyright (C) 2014 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+ android:width="20dp"
+ android:height="18dp"
+ android:viewportWidth="26.0"
+ android:viewportHeight="24.0">
+ <path
+ android:fillColor="#4DFFFFFF"
+ android:pathData="M19.000000,8.000000l5.300000,0.000000l1.300000,-1.600000C25.100000,6.000000 20.299999,2.000000 13.000000,2.000000S0.900000,6.000000 0.400000,6.400000L13.000000,22.000000l0.000000,0.000000l0.000000,0.000000l0.000000,0.000000l0.000000,0.000000l6.000000,-7.400000L19.000000,8.000000z"/>
+ <path
+ android:fillColor="#FFFFFFFF"
+ android:pathData="M19.000000,11.600000c-1.300000,-0.700000 -3.400000,-1.600000 -6.000000,-1.600000c-4.400000,0.000000 -7.300000,2.400000 -7.600000,2.700000L13.000000,22.000000l0.000000,0.000000l0.000000,0.000000l0.000000,0.000000l0.000000,0.000000l6.000000,-7.400000L19.000000,11.600000z"/>
+ <path
+ android:fillColor="#FFFFFFFF"
+ android:pathData="M21.000000,20.000000l2.000000,0.000000l0.000000,2.000000l-2.000000,0.000000z"/>
+ <path
+ android:fillColor="#FFFFFFFF"
+ android:pathData="M21.000000,10.000000l2.000000,0.000000l0.000000,8.100000l-2.000000,0.000000z"/>
+</vector>
diff --git a/packages/SystemUI/res/drawable/stat_sys_wifi_signal_2_fully.xml b/packages/SystemUI/res/drawable/stat_sys_wifi_signal_2_fully.xml
new file mode 100644
index 0000000..66588f0
--- /dev/null
+++ b/packages/SystemUI/res/drawable/stat_sys_wifi_signal_2_fully.xml
@@ -0,0 +1,27 @@
+<!--
+Copyright (C) 2014 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+ android:width="20dp"
+ android:height="18dp"
+ android:viewportWidth="26.0"
+ android:viewportHeight="24.0">
+ <path
+ android:fillColor="#4DFFFFFF"
+ android:pathData="M13.000000,22.000000L25.600000,6.500000C25.100000,6.100000 20.299999,2.100000 13.000000,2.100000S0.900000,6.100000 0.400000,6.500000L13.000000,22.000000L13.000000,22.000000L13.000000,22.000000L13.000000,22.000000L13.000000,22.000000z"/>
+ <path
+ android:fillColor="#FFFFFFFF"
+ android:pathData="M13.000000,22.000000l7.600000,-9.400000C20.299999,12.400000 17.400000,10.000000 13.000000,10.000000s-7.300000,2.400000 -7.600000,2.700000L13.000000,22.000000L13.000000,22.000000L13.000000,22.000000L13.000000,22.000000L13.000000,22.000000z"/>
+</vector>
diff --git a/packages/SystemUI/res/drawable/stat_sys_wifi_signal_3.xml b/packages/SystemUI/res/drawable/stat_sys_wifi_signal_3.xml
new file mode 100644
index 0000000..1f3de74
--- /dev/null
+++ b/packages/SystemUI/res/drawable/stat_sys_wifi_signal_3.xml
@@ -0,0 +1,33 @@
+<!--
+Copyright (C) 2014 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+ android:width="20dp"
+ android:height="18dp"
+ android:viewportWidth="26.0"
+ android:viewportHeight="24.0">
+ <path
+ android:fillColor="#4DFFFFFF"
+ android:pathData="M19.000000,8.000000l5.300000,0.000000l1.300000,-1.600000C25.100000,6.000000 20.299999,2.000000 13.000000,2.000000S0.900000,6.000000 0.400000,6.400000L13.000000,22.000000l0.000000,0.000000l0.000000,0.000000l0.000000,0.000000l0.000000,0.000000l6.000000,-7.400000L19.000000,8.000000z"/>
+ <path
+ android:fillColor="#FFFFFFFF"
+ android:pathData="M19.000000,8.600000c-1.600000,-0.700000 -3.600000,-1.300000 -6.000000,-1.300000c-5.300000,0.000000 -8.900000,3.000000 -9.200000,3.200000L13.000000,22.000000l0.000000,0.000000l0.000000,0.000000l0.000000,0.000000l0.000000,0.000000l6.000000,-7.400000L19.000000,8.600000z"/>
+ <path
+ android:fillColor="#FFFFFFFF"
+ android:pathData="M21.000000,20.000000l2.000000,0.000000l0.000000,2.000000l-2.000000,0.000000z"/>
+ <path
+ android:fillColor="#FFFFFFFF"
+ android:pathData="M21.000000,10.000000l2.000000,0.000000l0.000000,8.100000l-2.000000,0.000000z"/>
+</vector>
diff --git a/packages/SystemUI/res/drawable/stat_sys_wifi_signal_3_fully.xml b/packages/SystemUI/res/drawable/stat_sys_wifi_signal_3_fully.xml
new file mode 100644
index 0000000..aa5d2ed
--- /dev/null
+++ b/packages/SystemUI/res/drawable/stat_sys_wifi_signal_3_fully.xml
@@ -0,0 +1,27 @@
+<!--
+Copyright (C) 2014 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+ android:width="20dp"
+ android:height="18dp"
+ android:viewportWidth="26.0"
+ android:viewportHeight="24.0">
+ <path
+ android:fillColor="#4DFFFFFF"
+ android:pathData="M13.000000,22.000000L25.600000,6.500000C25.100000,6.100000 20.299999,2.100000 13.000000,2.100000S0.900000,6.100000 0.400000,6.500000L13.000000,22.000000L13.000000,22.000000L13.000000,22.000000L13.000000,22.000000L13.000000,22.000000z"/>
+ <path
+ android:fillColor="#FFFFFFFF"
+ android:pathData="M13.000000,22.000000l9.200000,-11.400000c-0.400000,-0.300000 -3.900000,-3.200000 -9.200000,-3.200000s-8.900000,3.000000 -9.200000,3.200000L13.000000,22.000000L13.000000,22.000000L13.000000,22.000000L13.000000,22.000000L13.000000,22.000000z"/>
+</vector>
diff --git a/packages/SystemUI/res/drawable/stat_sys_wifi_signal_4.xml b/packages/SystemUI/res/drawable/stat_sys_wifi_signal_4.xml
new file mode 100644
index 0000000..ca53b56
--- /dev/null
+++ b/packages/SystemUI/res/drawable/stat_sys_wifi_signal_4.xml
@@ -0,0 +1,30 @@
+<!--
+Copyright (C) 2014 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+ android:width="20dp"
+ android:height="18dp"
+ android:viewportWidth="26.0"
+ android:viewportHeight="24.0">
+ <path
+ android:fillColor="#FFFFFFFF"
+ android:pathData="M19.000000,8.000000l5.300000,0.000000l1.300000,-1.600000C25.100000,6.000000 20.299999,2.000000 13.000000,2.000000S0.900000,6.000000 0.400000,6.400000L13.000000,22.000000l0.000000,0.000000l0.000000,0.000000l0.000000,0.000000l0.000000,0.000000l6.000000,-7.400000L19.000000,8.000000z"/>
+ <path
+ android:fillColor="#FFFFFFFF"
+ android:pathData="M21.000000,20.000000l2.000000,0.000000l0.000000,2.000000l-2.000000,0.000000z"/>
+ <path
+ android:fillColor="#FFFFFFFF"
+ android:pathData="M21.000000,10.000000l2.000000,0.000000l0.000000,8.100000l-2.000000,0.000000z"/>
+</vector>
diff --git a/packages/SystemUI/res/drawable/stat_sys_wifi_signal_4_fully.xml b/packages/SystemUI/res/drawable/stat_sys_wifi_signal_4_fully.xml
new file mode 100644
index 0000000..1c7a539
--- /dev/null
+++ b/packages/SystemUI/res/drawable/stat_sys_wifi_signal_4_fully.xml
@@ -0,0 +1,24 @@
+<!--
+Copyright (C) 2014 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+ android:width="20dp"
+ android:height="18dp"
+ android:viewportWidth="26.0"
+ android:viewportHeight="24.0">
+ <path
+ android:fillColor="#FFFFFFFF"
+ android:pathData="M13.000000,22.000000L25.600000,6.500000C25.100000,6.100000 20.299999,2.100000 13.000000,2.100000S0.900000,6.100000 0.400000,6.500000L13.000000,22.000000L13.000000,22.000000L13.000000,22.000000L13.000000,22.000000L13.000000,22.000000z"/>
+</vector>
diff --git a/packages/SystemUI/res/drawable/stat_sys_wifi_signal_null.xml b/packages/SystemUI/res/drawable/stat_sys_wifi_signal_null.xml
new file mode 100644
index 0000000..c68fb49
--- /dev/null
+++ b/packages/SystemUI/res/drawable/stat_sys_wifi_signal_null.xml
@@ -0,0 +1,24 @@
+<!--
+Copyright (C) 2014 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+ android:width="20dp"
+ android:height="18dp"
+ android:viewportWidth="26.0"
+ android:viewportHeight="24.0">
+ <path
+ android:fillColor="#4DFFFFFF"
+ android:pathData="M13.000000,2.000000C7.700000,2.000000 3.700000,3.900000 0.400000,6.400000L13.000000,22.000000L25.600000,6.500000C22.299999,4.000000 18.299999,2.000000 13.000000,2.000000zM13.000000,18.600000L3.300000,7.000000l0.000000,0.000000l0.000000,0.000000C6.000000,5.300000 8.700000,4.000000 13.000000,4.000000s7.000000,1.400000 9.700000,3.000000l0.000000,0.000000l0.000000,0.000000L13.000000,18.600000z"/>
+</vector>
diff --git a/packages/SystemUI/res/layout/keyguard_status_bar.xml b/packages/SystemUI/res/layout/keyguard_status_bar.xml
new file mode 100644
index 0000000..d4b1214
--- /dev/null
+++ b/packages/SystemUI/res/layout/keyguard_status_bar.xml
@@ -0,0 +1,78 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ ~ Copyright (C) 2014 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License
+ -->
+
+<!-- Extends RelativeLayout -->
+<com.android.systemui.statusbar.phone.KeyguardStatusBarView
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:systemui="http://schemas.android.com/apk/res/com.android.systemui"
+ android:id="@+id/keyguard_header"
+ android:layout_width="match_parent"
+ android:layout_height="@dimen/status_bar_header_height_keyguard"
+ android:baselineAligned="false"
+ >
+
+ <com.android.systemui.statusbar.phone.MultiUserSwitch android:id="@+id/multi_user_switch"
+ android:layout_width="@dimen/multi_user_switch_width_keyguard"
+ android:layout_height="@dimen/status_bar_header_height_keyguard"
+ android:layout_alignParentEnd="true"
+ android:background="@drawable/ripple_drawable"
+ android:layout_marginEnd="@dimen/multi_user_switch_keyguard_margin">
+ <ImageView android:id="@+id/multi_user_avatar"
+ android:layout_width="@dimen/multi_user_avatar_keyguard_size"
+ android:layout_height="@dimen/multi_user_avatar_keyguard_size"
+ android:layout_gravity="center"
+ android:scaleType="centerInside"/>
+ </com.android.systemui.statusbar.phone.MultiUserSwitch>
+
+ <LinearLayout android:id="@+id/system_icons_super_container"
+ android:layout_width="wrap_content"
+ android:layout_height="@dimen/status_bar_header_height"
+ android:layout_toStartOf="@id/multi_user_switch"
+ android:layout_alignWithParentIfMissing="true"
+ android:layout_marginStart="16dp"
+ android:paddingEnd="2dp">
+ <FrameLayout android:id="@+id/system_icons_container"
+ android:layout_width="wrap_content"
+ android:layout_height="@dimen/status_bar_height"
+ android:layout_gravity="center_vertical"
+ >
+ <include layout="@layout/system_icons" />
+ </FrameLayout>
+ <TextView android:id="@+id/battery_level"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_gravity="center_vertical"
+ android:layout_marginStart="@dimen/header_battery_margin_keyguard"
+ android:paddingEnd="@dimen/battery_level_padding_end"
+ android:textColor="#ffffff"
+ android:visibility="gone"
+ android:textSize="12sp"/>
+ </LinearLayout>
+
+ <com.android.keyguard.CarrierText
+ android:id="@+id/keyguard_carrier_text"
+ android:layout_width="match_parent"
+ android:layout_height="@dimen/status_bar_header_height_keyguard"
+ android:layout_marginStart="@dimen/keyguard_carrier_text_margin"
+ android:layout_toStartOf="@id/system_icons_super_container"
+ android:gravity="center_vertical"
+ android:ellipsize="marquee"
+ android:textAppearance="?android:attr/textAppearanceSmall"
+ android:textColor="#ffffff"
+ android:singleLine="true" />
+
+</com.android.systemui.statusbar.phone.KeyguardStatusBarView>
diff --git a/packages/SystemUI/res/layout/qs_detail.xml b/packages/SystemUI/res/layout/qs_detail.xml
index ca46437..c6a7368 100644
--- a/packages/SystemUI/res/layout/qs_detail.xml
+++ b/packages/SystemUI/res/layout/qs_detail.xml
@@ -17,7 +17,7 @@
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
- android:background="@color/system_primary_color"
+ android:background="@drawable/qs_detail_background"
android:padding="16dp" >
<TextView
diff --git a/packages/SystemUI/res/layout/qs_panel.xml b/packages/SystemUI/res/layout/qs_panel.xml
index 087bf07..c76d442 100644
--- a/packages/SystemUI/res/layout/qs_panel.xml
+++ b/packages/SystemUI/res/layout/qs_panel.xml
@@ -19,6 +19,8 @@
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@drawable/qs_background_primary"
+ android:paddingTop="8dp"
+ android:paddingBottom="8dp"
android:elevation="2dp">
<com.android.systemui.qs.QSPanel
diff --git a/packages/SystemUI/res/layout/quick_settings_footer.xml b/packages/SystemUI/res/layout/quick_settings_footer.xml
new file mode 100644
index 0000000..53baf74
--- /dev/null
+++ b/packages/SystemUI/res/layout/quick_settings_footer.xml
@@ -0,0 +1,42 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Copyright (C) 2014 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:clickable="true"
+ android:paddingBottom="@dimen/qs_tile_padding_top"
+ android:paddingTop="@dimen/qs_tile_padding_top" >
+
+ <TextView
+ android:id="@+id/footer_text"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_centerHorizontal="true"
+ android:textSize="@dimen/qs_tile_text_size" />
+
+ <ImageView
+ android:id="@+id/footer_icon"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_centerVertical="true"
+ android:layout_marginEnd="8dp"
+ android:layout_toStartOf="@id/footer_text"
+ android:contentDescription="@null"
+ android:src="@drawable/ic_qs_vpn"
+ android:visibility="invisible" />
+
+</RelativeLayout>
\ No newline at end of file
diff --git a/packages/SystemUI/res/layout/signal_cluster_view.xml b/packages/SystemUI/res/layout/signal_cluster_view.xml
index 2b9cef91..ae54f8c 100644
--- a/packages/SystemUI/res/layout/signal_cluster_view.xml
+++ b/packages/SystemUI/res/layout/signal_cluster_view.xml
@@ -17,27 +17,23 @@
** limitations under the License.
*/
-->
-
+<!-- extends LinearLayout -->
<com.android.systemui.statusbar.SignalClusterView
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_height="match_parent"
android:layout_width="wrap_content"
- android:gravity="center"
+ android:gravity="center_vertical"
android:orientation="horizontal"
>
<FrameLayout
android:id="@+id/wifi_combo"
android:layout_height="wrap_content"
android:layout_width="wrap_content"
- android:layout_marginEnd="-6dp"
>
<ImageView
android:id="@+id/wifi_signal"
android:layout_height="wrap_content"
android:layout_width="wrap_content"
- android:layout_alignParentEnd="true"
- android:layout_centerVertical="true"
- android:scaleType="center"
/>
</FrameLayout>
<View
@@ -46,22 +42,6 @@
android:visibility="gone"
android:id="@+id/spacer"
/>
- <!--<FrameLayout
- android:id="@+id/wimax_combo"
- android:layout_height="wrap_content"
- android:layout_width="wrap_content"
- android:layout_marginEnd="-6dp"
- >
- <ImageView
- android:id="@+id/wimax_signal"
- android:layout_height="wrap_content"
- android:layout_width="wrap_content"
- android:layout_alignParentEnd="true"
- android:layout_centerVertical="true"
- android:scaleType="center"
- />
- </FrameLayout>
- -->
<FrameLayout
android:layout_height="wrap_content"
android:layout_width="wrap_content"
diff --git a/packages/SystemUI/res/layout/status_bar.xml b/packages/SystemUI/res/layout/status_bar.xml
index 19dc36d..beb8e00 100644
--- a/packages/SystemUI/res/layout/status_bar.xml
+++ b/packages/SystemUI/res/layout/status_bar.xml
@@ -82,33 +82,9 @@
android:layout_height="match_parent"
android:orientation="horizontal"
>
- <LinearLayout android:id="@+id/system_icons"
- android:layout_width="wrap_content"
- android:layout_height="match_parent"
- android:gravity="center_vertical"
- >
- <com.android.systemui.statusbar.AlphaOptimizedLinearLayout
- android:id="@+id/statusIcons"
- android:layout_width="wrap_content"
- android:layout_height="match_parent"
- android:gravity="center_vertical"
- android:orientation="horizontal"/>
- <include layout="@layout/signal_cluster_view"
- android:id="@+id/signal_cluster"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_marginStart="2dp"
- />
- <!-- battery must be padded below to match assets -->
- <com.android.systemui.BatteryMeterView
- android:id="@+id/battery"
- android:layout_height="16dp"
- android:layout_width="10.5dp"
- android:layout_marginBottom="0.33dp"
- android:layout_marginStart="4dip"
- />
- </LinearLayout>
+ <include layout="@layout/system_icons" />
+
<com.android.systemui.statusbar.policy.Clock
android:id="@+id/clock"
android:textAppearance="@style/TextAppearance.StatusBar.Clock"
diff --git a/packages/SystemUI/res/layout/status_bar_expanded.xml b/packages/SystemUI/res/layout/status_bar_expanded.xml
index 9af2879..53a832a 100644
--- a/packages/SystemUI/res/layout/status_bar_expanded.xml
+++ b/packages/SystemUI/res/layout/status_bar_expanded.xml
@@ -50,6 +50,10 @@
android:visibility="gone"
/>
+ <include
+ layout="@layout/keyguard_status_bar"
+ android:visibility="invisible" />
+
<com.android.systemui.statusbar.phone.NotificationsQuickSettingsContainer
style="@style/NotificationsQuickSettings"
android:id="@+id/notification_container_parent"
diff --git a/packages/SystemUI/res/layout/status_bar_expanded_header.xml b/packages/SystemUI/res/layout/status_bar_expanded_header.xml
index b260a4a..1afde69 100644
--- a/packages/SystemUI/res/layout/status_bar_expanded_header.xml
+++ b/packages/SystemUI/res/layout/status_bar_expanded_header.xml
@@ -68,7 +68,7 @@
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
- android:layout_marginStart="@dimen/header_battery_margin_keyguard"
+ android:layout_marginStart="@dimen/header_battery_margin_expanded"
android:paddingEnd="@dimen/battery_level_padding_end"
android:textColor="#ffffff"
android:textSize="12sp"/>
@@ -139,18 +139,6 @@
android:visibility="gone"
/>
- <com.android.keyguard.CarrierText
- android:id="@+id/keyguard_carrier_text"
- android:layout_width="match_parent"
- android:layout_height="@dimen/status_bar_header_height_keyguard"
- android:layout_marginStart="@dimen/keyguard_carrier_text_margin"
- android:layout_toStartOf="@id/system_icons_super_container"
- android:gravity="center_vertical"
- android:ellipsize="marquee"
- android:textAppearance="?android:attr/textAppearanceSmall"
- android:textColor="#ffffff"
- android:singleLine="true" />
-
<include
android:id="@+id/qs_detail_header"
layout="@layout/qs_detail_header"
diff --git a/packages/SystemUI/res/layout/system_icons.xml b/packages/SystemUI/res/layout/system_icons.xml
new file mode 100644
index 0000000..69f9c142
--- /dev/null
+++ b/packages/SystemUI/res/layout/system_icons.xml
@@ -0,0 +1,41 @@
+<?xml version="1.0" encoding="utf-8"?><!--
+ ~ Copyright (C) 2014 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License
+ -->
+
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ android:id="@+id/system_icons"
+ android:layout_width="wrap_content"
+ android:layout_height="match_parent"
+ android:gravity="center_vertical">
+
+ <com.android.systemui.statusbar.AlphaOptimizedLinearLayout android:id="@+id/statusIcons"
+ android:layout_width="wrap_content"
+ android:layout_height="match_parent"
+ android:gravity="center_vertical"
+ android:orientation="horizontal"/>
+
+ <include layout="@layout/signal_cluster_view"
+ android:id="@+id/signal_cluster"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_marginStart="2dp"/>
+
+ <!-- battery must be padded below to match assets -->
+ <com.android.systemui.BatteryMeterView android:id="@+id/battery"
+ android:layout_height="16dp"
+ android:layout_width="10.5dp"
+ android:layout_marginBottom="0.33dp"
+ android:layout_marginStart="4dip"/>
+</LinearLayout>
\ No newline at end of file
diff --git a/packages/SystemUI/res/values-af/strings.xml b/packages/SystemUI/res/values-af/strings.xml
index 77a8024..0aab723 100644
--- a/packages/SystemUI/res/values-af/strings.xml
+++ b/packages/SystemUI/res/values-af/strings.xml
@@ -39,10 +39,12 @@
<string name="invalid_charger_title" msgid="3515740382572798460">"Laai met USB word nie gesteun nie."</string>
<string name="invalid_charger_text" msgid="5474997287953892710">"Gebruik slegs die laaier wat verskaf is."</string>
<string name="battery_low_why" msgid="4553600287639198111">"Instellings"</string>
- <string name="battery_saver_confirmation_title" msgid="5987726159603849352">"Aktiveer batteryspaarder?"</string>
- <string name="battery_saver_confirmation_ok" msgid="7283108887345688413">"Begin"</string>
- <string name="battery_saver_start_action" msgid="7245333922937402896">"Aktiveer batteryspaarder"</string>
- <string name="battery_saver_confirmation_text" msgid="8417584516834617662">"Om die batteryleeftyd te help verbeter, sal Batteryspaarder jou toestel se werkverrigting verminder.\n\nBatteryspaarder sal gedeaktiveer word wanneer jou toestel ingeprop word."</string>
+ <!-- no translation found for battery_saver_confirmation_title (5299585433050361634) -->
+ <skip />
+ <!-- no translation found for battery_saver_confirmation_ok (7507968430447930257) -->
+ <skip />
+ <!-- no translation found for battery_saver_start_action (5576697451677486320) -->
+ <skip />
<string name="status_bar_settings_settings_button" msgid="3023889916699270224">"Instellings"</string>
<string name="status_bar_settings_wifi_button" msgid="1733928151698311923">"Wi-Fi"</string>
<string name="status_bar_settings_airplane" msgid="4879879698500955300">"Vliegtuigmodus"</string>
@@ -286,8 +288,10 @@
<item quantity="other" msgid="5408537517529822157">"%d uur lank"</item>
</plurals>
<string name="battery_saver_notification_title" msgid="237918726750955859">"Batteryspaarder is aan"</string>
- <string name="battery_saver_notification_text" msgid="7796554871101546872">"Toestel se werkverrigting is verminder."</string>
- <string name="battery_saver_notification_action_text" msgid="7546297220816993504">"Maak batteryspaarder se instellings oop"</string>
+ <!-- no translation found for battery_saver_notification_text (820318788126672692) -->
+ <skip />
+ <!-- no translation found for battery_saver_notification_action_text (109158658238110382) -->
+ <skip />
<string name="battery_level_template" msgid="1609636980292580020">"<xliff:g id="LEVEL">%d</xliff:g>%%"</string>
<string name="notification_hidden_text" msgid="1135169301897151909">"Inhoud versteek"</string>
<string name="media_projection_dialog_text" msgid="3071431025448218928">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> sal alles begin vasvang wat op jou skerm gewys word."</string>
diff --git a/packages/SystemUI/res/values-am/strings.xml b/packages/SystemUI/res/values-am/strings.xml
index d8959a5..d554e45 100644
--- a/packages/SystemUI/res/values-am/strings.xml
+++ b/packages/SystemUI/res/values-am/strings.xml
@@ -39,10 +39,12 @@
<string name="invalid_charger_title" msgid="3515740382572798460">"የUSB ኃይል መሙላት አይደገፍም።"</string>
<string name="invalid_charger_text" msgid="5474997287953892710">"የቀረበውን ኃይል መሙያ ብቻ ይጠቀሙ።"</string>
<string name="battery_low_why" msgid="4553600287639198111">"ቅንብሮች"</string>
- <string name="battery_saver_confirmation_title" msgid="5987726159603849352">"የባህሪ ኃይል ቆጣቢው ይጀመር?"</string>
- <string name="battery_saver_confirmation_ok" msgid="7283108887345688413">"ጀምር"</string>
- <string name="battery_saver_start_action" msgid="7245333922937402896">"የባህሪ ኃይል ቆጣቢው ይጀመር"</string>
- <string name="battery_saver_confirmation_text" msgid="8417584516834617662">"የባትሪ በህይወት የመቆየት ጊዜን ለማሻሻል እንዲያግዝ፣ የባትሪ ኃይል ቆጣቢው የመሳሪያዎን የመስራት አቅም ይቀንሰዋል።\n\nየባትሪ ኃይል ቆጣቢው መሳሪያዎ የተሰካ ሲሆን ይሰናከላል።"</string>
+ <!-- no translation found for battery_saver_confirmation_title (5299585433050361634) -->
+ <skip />
+ <!-- no translation found for battery_saver_confirmation_ok (7507968430447930257) -->
+ <skip />
+ <!-- no translation found for battery_saver_start_action (5576697451677486320) -->
+ <skip />
<string name="status_bar_settings_settings_button" msgid="3023889916699270224">"ቅንብሮች"</string>
<string name="status_bar_settings_wifi_button" msgid="1733928151698311923">"Wi-Fi"</string>
<string name="status_bar_settings_airplane" msgid="4879879698500955300">"የአውሮፕላን ሁነታ"</string>
@@ -286,8 +288,10 @@
<item quantity="other" msgid="5408537517529822157">"ለ%d ሰዓቶች"</item>
</plurals>
<string name="battery_saver_notification_title" msgid="237918726750955859">"የባትሪ ኃይል ቆጣቢ በርቷል"</string>
- <string name="battery_saver_notification_text" msgid="7796554871101546872">"የመሳሪያው የአሰራር ብቃት ተቀንሷል።"</string>
- <string name="battery_saver_notification_action_text" msgid="7546297220816993504">"የባትሪ ኃይል ቆጣቢ ቅንብሮች"</string>
+ <!-- no translation found for battery_saver_notification_text (820318788126672692) -->
+ <skip />
+ <!-- no translation found for battery_saver_notification_action_text (109158658238110382) -->
+ <skip />
<string name="battery_level_template" msgid="1609636980292580020">"<xliff:g id="LEVEL">%d</xliff:g>%%"</string>
<string name="notification_hidden_text" msgid="1135169301897151909">"ይዘቶች ተደብቀዋል"</string>
<string name="media_projection_dialog_text" msgid="3071431025448218928">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> በማያ ገጽዎ ላይ የታየውን ነገር በሙሉ ማንሳት ይጀምራል።"</string>
diff --git a/packages/SystemUI/res/values-ar/strings.xml b/packages/SystemUI/res/values-ar/strings.xml
index 93e3cbe..04812e5 100644
--- a/packages/SystemUI/res/values-ar/strings.xml
+++ b/packages/SystemUI/res/values-ar/strings.xml
@@ -39,10 +39,12 @@
<string name="invalid_charger_title" msgid="3515740382572798460">"لا يمكن إجراء الشحن عبر USB."</string>
<string name="invalid_charger_text" msgid="5474997287953892710">"لا تستخدم سوى الشاحن المزوّد."</string>
<string name="battery_low_why" msgid="4553600287639198111">"الإعدادات"</string>
- <string name="battery_saver_confirmation_title" msgid="5987726159603849352">"هل تريد بدء وضع توفير الطاقة؟"</string>
- <string name="battery_saver_confirmation_ok" msgid="7283108887345688413">"بدء"</string>
- <string name="battery_saver_start_action" msgid="7245333922937402896">"بدء وضع توفير الطاقة"</string>
- <string name="battery_saver_confirmation_text" msgid="8417584516834617662">"للمساعدة في إطالة عمر البطارية، فإن وضع توفير الطاقة سيقلل من أداء جهازك.\n\nسيتم تعطيل وضع توفير الطاقة عند توصيل جهازك بالشاحن."</string>
+ <!-- no translation found for battery_saver_confirmation_title (5299585433050361634) -->
+ <skip />
+ <!-- no translation found for battery_saver_confirmation_ok (7507968430447930257) -->
+ <skip />
+ <!-- no translation found for battery_saver_start_action (5576697451677486320) -->
+ <skip />
<string name="status_bar_settings_settings_button" msgid="3023889916699270224">"الإعدادات"</string>
<string name="status_bar_settings_wifi_button" msgid="1733928151698311923">"Wi-Fi"</string>
<string name="status_bar_settings_airplane" msgid="4879879698500955300">"وضع الطائرة"</string>
@@ -286,8 +288,10 @@
<item quantity="other" msgid="5408537517529822157">"لمدة %d من الساعات"</item>
</plurals>
<string name="battery_saver_notification_title" msgid="237918726750955859">"وضع توفير الطاقة قيد التشغيل"</string>
- <string name="battery_saver_notification_text" msgid="7796554871101546872">"تم تقليل أداء الجهاز."</string>
- <string name="battery_saver_notification_action_text" msgid="7546297220816993504">"فتح إعدادات وضع توفير الطاقة"</string>
+ <!-- no translation found for battery_saver_notification_text (820318788126672692) -->
+ <skip />
+ <!-- no translation found for battery_saver_notification_action_text (109158658238110382) -->
+ <skip />
<string name="battery_level_template" msgid="1609636980292580020">"<xliff:g id="LEVEL">%d</xliff:g>%%"</string>
<string name="notification_hidden_text" msgid="1135169301897151909">"المحتويات مخفية"</string>
<string name="media_projection_dialog_text" msgid="3071431025448218928">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> سيبدأ التقاط كل شيء يتم عرضه على الشاشة."</string>
diff --git a/packages/SystemUI/res/values-bg/strings.xml b/packages/SystemUI/res/values-bg/strings.xml
index 0e7d18c..e5ab744 100644
--- a/packages/SystemUI/res/values-bg/strings.xml
+++ b/packages/SystemUI/res/values-bg/strings.xml
@@ -39,10 +39,12 @@
<string name="invalid_charger_title" msgid="3515740382572798460">"Зареждането през USB не се поддържа."</string>
<string name="invalid_charger_text" msgid="5474997287953892710">"Използвайте само предоставеното зарядно устройство."</string>
<string name="battery_low_why" msgid="4553600287639198111">"Настройки"</string>
- <string name="battery_saver_confirmation_title" msgid="5987726159603849352">"Да се стартира ли режимът за запазване на батерията?"</string>
- <string name="battery_saver_confirmation_ok" msgid="7283108887345688413">"Стартиране"</string>
- <string name="battery_saver_start_action" msgid="7245333922937402896">"Стартиране на режима за запазване на батерията"</string>
- <string name="battery_saver_confirmation_text" msgid="8417584516834617662">"С цел удължаване на живота на батерията режимът за запазването й ще намали ефективността на устройството ви.\n\nКогато то е включено в захранването, режимът ще се деактивира."</string>
+ <!-- no translation found for battery_saver_confirmation_title (5299585433050361634) -->
+ <skip />
+ <!-- no translation found for battery_saver_confirmation_ok (7507968430447930257) -->
+ <skip />
+ <!-- no translation found for battery_saver_start_action (5576697451677486320) -->
+ <skip />
<string name="status_bar_settings_settings_button" msgid="3023889916699270224">"Настройки"</string>
<string name="status_bar_settings_wifi_button" msgid="1733928151698311923">"Wi-Fi"</string>
<string name="status_bar_settings_airplane" msgid="4879879698500955300">"Самолетен режим"</string>
@@ -286,8 +288,10 @@
<item quantity="other" msgid="5408537517529822157">"За %d часа"</item>
</plurals>
<string name="battery_saver_notification_title" msgid="237918726750955859">"Режимът за запазване на батерията е включен"</string>
- <string name="battery_saver_notification_text" msgid="7796554871101546872">"Ефективността на устройството е намалена."</string>
- <string name="battery_saver_notification_action_text" msgid="7546297220816993504">"Отваряне на настройките за режима за запазване на батерията"</string>
+ <!-- no translation found for battery_saver_notification_text (820318788126672692) -->
+ <skip />
+ <!-- no translation found for battery_saver_notification_action_text (109158658238110382) -->
+ <skip />
<string name="battery_level_template" msgid="1609636980292580020">"<xliff:g id="LEVEL">%d</xliff:g>%%"</string>
<string name="notification_hidden_text" msgid="1135169301897151909">"Скрито съдържание"</string>
<string name="media_projection_dialog_text" msgid="3071431025448218928">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> ще започне да заснема всичко, което се показва на екрана ви."</string>
diff --git a/packages/SystemUI/res/values-bn-rBD/strings.xml b/packages/SystemUI/res/values-bn-rBD/strings.xml
index bd18195..21f58b5 100644
--- a/packages/SystemUI/res/values-bn-rBD/strings.xml
+++ b/packages/SystemUI/res/values-bn-rBD/strings.xml
@@ -39,10 +39,12 @@
<string name="invalid_charger_title" msgid="3515740382572798460">"USB চার্জিং সমর্থিত নয়।"</string>
<string name="invalid_charger_text" msgid="5474997287953892710">"শুধুমাত্র সরবরাহকৃত চার্জার ব্যবহার করুন।"</string>
<string name="battery_low_why" msgid="4553600287639198111">"সেটিংস"</string>
- <string name="battery_saver_confirmation_title" msgid="5987726159603849352">"ব্যাটারি সেভার শুরু করুন?"</string>
- <string name="battery_saver_confirmation_ok" msgid="7283108887345688413">"আরম্ভ"</string>
- <string name="battery_saver_start_action" msgid="7245333922937402896">"ব্যাটারি সেভার শুরু করুন"</string>
- <string name="battery_saver_confirmation_text" msgid="8417584516834617662">"ব্যাটারি জীবন উন্নত করার ক্ষেত্রে সাহায্যের জন্য, ব্যাটারি সেভার আপনার ডিভাইসের কর্মক্ষমতা হ্রাস করবে।\n \n আপনার ডিভাইস প্লাগ ইন করা হলে ব্যাটারি সেভার অক্ষম হবে।"</string>
+ <!-- no translation found for battery_saver_confirmation_title (5299585433050361634) -->
+ <skip />
+ <!-- no translation found for battery_saver_confirmation_ok (7507968430447930257) -->
+ <skip />
+ <!-- no translation found for battery_saver_start_action (5576697451677486320) -->
+ <skip />
<string name="status_bar_settings_settings_button" msgid="3023889916699270224">"সেটিংস"</string>
<string name="status_bar_settings_wifi_button" msgid="1733928151698311923">"Wi-Fi"</string>
<string name="status_bar_settings_airplane" msgid="4879879698500955300">"বিমান মোড"</string>
@@ -286,8 +288,10 @@
<item quantity="other" msgid="5408537517529822157">"%d ঘন্টার জন্য"</item>
</plurals>
<string name="battery_saver_notification_title" msgid="237918726750955859">"ব্যাটারি সেভার চালু রয়েছে"</string>
- <string name="battery_saver_notification_text" msgid="7796554871101546872">"ডিভাইসের কর্মক্ষমতা কমে যাবে।"</string>
- <string name="battery_saver_notification_action_text" msgid="7546297220816993504">"ব্যাটারি সেভার সেটিংস খুলুন"</string>
+ <!-- no translation found for battery_saver_notification_text (820318788126672692) -->
+ <skip />
+ <!-- no translation found for battery_saver_notification_action_text (109158658238110382) -->
+ <skip />
<string name="battery_level_template" msgid="1609636980292580020">"<xliff:g id="LEVEL">%d</xliff:g>%%"</string>
<string name="notification_hidden_text" msgid="1135169301897151909">"লুকানো বিষয়বস্তু"</string>
<string name="media_projection_dialog_text" msgid="3071431025448218928">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> আপনার স্ক্রীনে দেখানো সব কিছু ক্যাপচার করা শুরু করবে।"</string>
diff --git a/packages/SystemUI/res/values-ca/strings.xml b/packages/SystemUI/res/values-ca/strings.xml
index d1e28af..c69b68ed 100644
--- a/packages/SystemUI/res/values-ca/strings.xml
+++ b/packages/SystemUI/res/values-ca/strings.xml
@@ -39,10 +39,12 @@
<string name="invalid_charger_title" msgid="3515740382572798460">"La càrrega per USB no és compatible."</string>
<string name="invalid_charger_text" msgid="5474997287953892710">"Fes servir només el carregador proporcionat amb el dispositiu."</string>
<string name="battery_low_why" msgid="4553600287639198111">"Configuració"</string>
- <string name="battery_saver_confirmation_title" msgid="5987726159603849352">"Vols iniciar la funció Estalvi de bateria?"</string>
- <string name="battery_saver_confirmation_ok" msgid="7283108887345688413">"Inicia"</string>
- <string name="battery_saver_start_action" msgid="7245333922937402896">"Inicia la funció Estalvi de bateria"</string>
- <string name="battery_saver_confirmation_text" msgid="8417584516834617662">"La funció Estalvi de bateria reduirà el rendiment del dispositiu per tal d\'augmentar la durada de la bateria.\n\nAquesta funció es desactivarà quan el dispositiu estigui connectat."</string>
+ <!-- no translation found for battery_saver_confirmation_title (5299585433050361634) -->
+ <skip />
+ <!-- no translation found for battery_saver_confirmation_ok (7507968430447930257) -->
+ <skip />
+ <!-- no translation found for battery_saver_start_action (5576697451677486320) -->
+ <skip />
<string name="status_bar_settings_settings_button" msgid="3023889916699270224">"Configuració"</string>
<string name="status_bar_settings_wifi_button" msgid="1733928151698311923">"Wi-Fi"</string>
<string name="status_bar_settings_airplane" msgid="4879879698500955300">"Mode d\'avió"</string>
@@ -288,8 +290,10 @@
<item quantity="other" msgid="5408537517529822157">"Durant %d hores"</item>
</plurals>
<string name="battery_saver_notification_title" msgid="237918726750955859">"La funció Estalvi de bateria està activada."</string>
- <string name="battery_saver_notification_text" msgid="7796554871101546872">"S\'ha reduït el rendiment del dispositiu."</string>
- <string name="battery_saver_notification_action_text" msgid="7546297220816993504">"Obre la configuració de la funció Estalvi de bateria"</string>
+ <!-- no translation found for battery_saver_notification_text (820318788126672692) -->
+ <skip />
+ <!-- no translation found for battery_saver_notification_action_text (109158658238110382) -->
+ <skip />
<string name="battery_level_template" msgid="1609636980292580020">"<xliff:g id="LEVEL">%d</xliff:g>%%"</string>
<string name="notification_hidden_text" msgid="1135169301897151909">"Contingut amagat"</string>
<string name="media_projection_dialog_text" msgid="3071431025448218928">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> començarà a enregistrar tot el que es mostri a la pantalla."</string>
diff --git a/packages/SystemUI/res/values-cs/strings.xml b/packages/SystemUI/res/values-cs/strings.xml
index efe8df5..1884c3a 100644
--- a/packages/SystemUI/res/values-cs/strings.xml
+++ b/packages/SystemUI/res/values-cs/strings.xml
@@ -39,10 +39,12 @@
<string name="invalid_charger_title" msgid="3515740382572798460">"Nabíjení přes USB není podporováno."</string>
<string name="invalid_charger_text" msgid="5474997287953892710">"Používejte pouze nabíječku, která je součástí balení."</string>
<string name="battery_low_why" msgid="4553600287639198111">"Nastavení"</string>
- <string name="battery_saver_confirmation_title" msgid="5987726159603849352">"Aktivovat režim Úspora baterie?"</string>
- <string name="battery_saver_confirmation_ok" msgid="7283108887345688413">"Spustit"</string>
- <string name="battery_saver_start_action" msgid="7245333922937402896">"Aktivovat režim Úspora baterie"</string>
- <string name="battery_saver_confirmation_text" msgid="8417584516834617662">"V režimu Úspora baterie se omezí výkon zařízení, aby se tak prodloužila výdrž baterie.\n\nRežim Úspora baterie se deaktivuje, když bude zařízení zapojeno do zásuvky."</string>
+ <!-- no translation found for battery_saver_confirmation_title (5299585433050361634) -->
+ <skip />
+ <!-- no translation found for battery_saver_confirmation_ok (7507968430447930257) -->
+ <skip />
+ <!-- no translation found for battery_saver_start_action (5576697451677486320) -->
+ <skip />
<string name="status_bar_settings_settings_button" msgid="3023889916699270224">"Nastavení"</string>
<string name="status_bar_settings_wifi_button" msgid="1733928151698311923">"Wi-Fi"</string>
<string name="status_bar_settings_airplane" msgid="4879879698500955300">"Režim V letadle"</string>
@@ -288,8 +290,10 @@
<item quantity="other" msgid="5408537517529822157">"Na %d h"</item>
</plurals>
<string name="battery_saver_notification_title" msgid="237918726750955859">"Režim Úspora baterie je zapnutý."</string>
- <string name="battery_saver_notification_text" msgid="7796554871101546872">"Výkon zařízení je snížen."</string>
- <string name="battery_saver_notification_action_text" msgid="7546297220816993504">"Otevřít nastavení režimu Úspora baterie"</string>
+ <!-- no translation found for battery_saver_notification_text (820318788126672692) -->
+ <skip />
+ <!-- no translation found for battery_saver_notification_action_text (109158658238110382) -->
+ <skip />
<string name="battery_level_template" msgid="1609636980292580020">"<xliff:g id="LEVEL">%d</xliff:g> %%"</string>
<string name="notification_hidden_text" msgid="1135169301897151909">"Skrytý obsah"</string>
<string name="media_projection_dialog_text" msgid="3071431025448218928">"Aplikace <xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> začne zaznamenávat vše, co je zobrazeno na obrazovce."</string>
diff --git a/packages/SystemUI/res/values-da/strings.xml b/packages/SystemUI/res/values-da/strings.xml
index aa09668..98353a9 100644
--- a/packages/SystemUI/res/values-da/strings.xml
+++ b/packages/SystemUI/res/values-da/strings.xml
@@ -39,10 +39,12 @@
<string name="invalid_charger_title" msgid="3515740382572798460">"USB-opladning understøttes ikke."</string>
<string name="invalid_charger_text" msgid="5474997287953892710">"Brug kun den oplader, der føler med."</string>
<string name="battery_low_why" msgid="4553600287639198111">"Indstillinger"</string>
- <string name="battery_saver_confirmation_title" msgid="5987726159603849352">"Vil du starte Batteribesparende?"</string>
- <string name="battery_saver_confirmation_ok" msgid="7283108887345688413">"Startet"</string>
- <string name="battery_saver_start_action" msgid="7245333922937402896">"Start Batteribesparende"</string>
- <string name="battery_saver_confirmation_text" msgid="8417584516834617662">"For at hjælpe med at forbedre batteriets levetid, reducerer Batteribesparende enhedens ydeevne.\n\nBatteribesparende slukkes, når strømstikket er sat i."</string>
+ <!-- no translation found for battery_saver_confirmation_title (5299585433050361634) -->
+ <skip />
+ <!-- no translation found for battery_saver_confirmation_ok (7507968430447930257) -->
+ <skip />
+ <!-- no translation found for battery_saver_start_action (5576697451677486320) -->
+ <skip />
<string name="status_bar_settings_settings_button" msgid="3023889916699270224">"Indstillinger"</string>
<string name="status_bar_settings_wifi_button" msgid="1733928151698311923">"Wi-Fi"</string>
<string name="status_bar_settings_airplane" msgid="4879879698500955300">"Flytilstand"</string>
@@ -286,8 +288,10 @@
<item quantity="other" msgid="5408537517529822157">"I %d timer"</item>
</plurals>
<string name="battery_saver_notification_title" msgid="237918726750955859">"Batteribesparende er slået til"</string>
- <string name="battery_saver_notification_text" msgid="7796554871101546872">"Enhedens ydeevne reduceres."</string>
- <string name="battery_saver_notification_action_text" msgid="7546297220816993504">"Åbn indstillinger for Batteribesparende"</string>
+ <!-- no translation found for battery_saver_notification_text (820318788126672692) -->
+ <skip />
+ <!-- no translation found for battery_saver_notification_action_text (109158658238110382) -->
+ <skip />
<string name="battery_level_template" msgid="1609636980292580020">"<xliff:g id="LEVEL">%d</xliff:g> %%"</string>
<string name="notification_hidden_text" msgid="1135169301897151909">"Indholdet er skjult"</string>
<string name="media_projection_dialog_text" msgid="3071431025448218928">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> vil begynde at optage alt, hvad der vises på din skærm."</string>
diff --git a/packages/SystemUI/res/values-de/strings.xml b/packages/SystemUI/res/values-de/strings.xml
index f2382e8..e7e629c 100644
--- a/packages/SystemUI/res/values-de/strings.xml
+++ b/packages/SystemUI/res/values-de/strings.xml
@@ -39,10 +39,12 @@
<string name="invalid_charger_title" msgid="3515740382572798460">"Laden per USB wird nicht unterstützt."</string>
<string name="invalid_charger_text" msgid="5474997287953892710">"Verwenden Sie nur das im Lieferumfang enthaltene Ladegerät."</string>
<string name="battery_low_why" msgid="4553600287639198111">"Einstellungen"</string>
- <string name="battery_saver_confirmation_title" msgid="5987726159603849352">"Energiesparmodus starten?"</string>
- <string name="battery_saver_confirmation_ok" msgid="7283108887345688413">"Starten"</string>
- <string name="battery_saver_start_action" msgid="7245333922937402896">"Energiesparmodus starten"</string>
- <string name="battery_saver_confirmation_text" msgid="8417584516834617662">"Im Energiesparmodus wird zur Schonung des Akkus die Leistung des Geräts herabgesetzt.\n\nSobald Ihr Gerät an eine Stromquelle angeschlossen ist, wird der Energiesparmodus deaktiviert."</string>
+ <!-- no translation found for battery_saver_confirmation_title (5299585433050361634) -->
+ <skip />
+ <!-- no translation found for battery_saver_confirmation_ok (7507968430447930257) -->
+ <skip />
+ <!-- no translation found for battery_saver_start_action (5576697451677486320) -->
+ <skip />
<string name="status_bar_settings_settings_button" msgid="3023889916699270224">"Einstellungen"</string>
<string name="status_bar_settings_wifi_button" msgid="1733928151698311923">"WLAN"</string>
<string name="status_bar_settings_airplane" msgid="4879879698500955300">"Flugmodus"</string>
@@ -288,8 +290,10 @@
<item quantity="other" msgid="5408537517529822157">"Für %d Stunden"</item>
</plurals>
<string name="battery_saver_notification_title" msgid="237918726750955859">"Energiesparmodus ist aktiviert"</string>
- <string name="battery_saver_notification_text" msgid="7796554871101546872">"Die Geräteleistung wurde herabgesetzt."</string>
- <string name="battery_saver_notification_action_text" msgid="7546297220816993504">"Einstellungen für den Energiesparmodus öffnen"</string>
+ <!-- no translation found for battery_saver_notification_text (820318788126672692) -->
+ <skip />
+ <!-- no translation found for battery_saver_notification_action_text (109158658238110382) -->
+ <skip />
<string name="battery_level_template" msgid="1609636980292580020">"<xliff:g id="LEVEL">%d</xliff:g> %%"</string>
<string name="notification_hidden_text" msgid="1135169301897151909">"Inhalte ausgeblendet"</string>
<string name="media_projection_dialog_text" msgid="3071431025448218928">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> nimmt alle auf Ihrem Bildschirm angezeigten Aktivitäten auf."</string>
diff --git a/packages/SystemUI/res/values-el/strings.xml b/packages/SystemUI/res/values-el/strings.xml
index dcc6638..5377c95 100644
--- a/packages/SystemUI/res/values-el/strings.xml
+++ b/packages/SystemUI/res/values-el/strings.xml
@@ -39,10 +39,12 @@
<string name="invalid_charger_title" msgid="3515740382572798460">"Δεν υποστηρίζεται η φόρτιση μέσω USB."</string>
<string name="invalid_charger_text" msgid="5474997287953892710">"Χρήση μόνο του παρεχόμενου φορτιστή."</string>
<string name="battery_low_why" msgid="4553600287639198111">"Ρυθμίσεις"</string>
- <string name="battery_saver_confirmation_title" msgid="5987726159603849352">"Έναρξη Εξοικονόμησης μπαταρίας;"</string>
- <string name="battery_saver_confirmation_ok" msgid="7283108887345688413">"Έναρξη"</string>
- <string name="battery_saver_start_action" msgid="7245333922937402896">"Έναρξη Εξοικονόμησης μπαταρίας"</string>
- <string name="battery_saver_confirmation_text" msgid="8417584516834617662">"Για να συμβάλει στη βελτίωση της διάρκειας ζωής της μπαταρίας, η Εξοικονόμηση μπαταρίας θα μειώσει την απόδοση της συσκευής σας.\n\nΗ Εξοικονόμηση μπαταρίας θα απενεργοποιηθεί όταν η συσκευή σας συνδεθεί για φόρτιση."</string>
+ <!-- no translation found for battery_saver_confirmation_title (5299585433050361634) -->
+ <skip />
+ <!-- no translation found for battery_saver_confirmation_ok (7507968430447930257) -->
+ <skip />
+ <!-- no translation found for battery_saver_start_action (5576697451677486320) -->
+ <skip />
<string name="status_bar_settings_settings_button" msgid="3023889916699270224">"Ρυθμίσεις"</string>
<string name="status_bar_settings_wifi_button" msgid="1733928151698311923">"Wi-Fi"</string>
<string name="status_bar_settings_airplane" msgid="4879879698500955300">"Λειτουργία πτήσης"</string>
@@ -288,8 +290,10 @@
<item quantity="other" msgid="5408537517529822157">"Για %d ώρες"</item>
</plurals>
<string name="battery_saver_notification_title" msgid="237918726750955859">"Η Εξοικονόμηση μπαταρίας είναι ενεργή"</string>
- <string name="battery_saver_notification_text" msgid="7796554871101546872">"Η απόδοση της συσκευής μειώνεται."</string>
- <string name="battery_saver_notification_action_text" msgid="7546297220816993504">"Άνοιγμα ρυθμίσεων Εξοικονόμησης μπαταρίας"</string>
+ <!-- no translation found for battery_saver_notification_text (820318788126672692) -->
+ <skip />
+ <!-- no translation found for battery_saver_notification_action_text (109158658238110382) -->
+ <skip />
<string name="battery_level_template" msgid="1609636980292580020">"<xliff:g id="LEVEL">%d</xliff:g>%%"</string>
<string name="notification_hidden_text" msgid="1135169301897151909">"Κρυφό περιεχόμενο"</string>
<string name="media_projection_dialog_text" msgid="3071431025448218928">"Θα ξεκινήσει η καταγραφή του περιεχομένου που εμφανίζεται στην οθόνη σας από την εφαρμογή <xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g>."</string>
diff --git a/packages/SystemUI/res/values-en-rGB/strings.xml b/packages/SystemUI/res/values-en-rGB/strings.xml
index b15791a..f7d959d 100644
--- a/packages/SystemUI/res/values-en-rGB/strings.xml
+++ b/packages/SystemUI/res/values-en-rGB/strings.xml
@@ -39,10 +39,12 @@
<string name="invalid_charger_title" msgid="3515740382572798460">"USB charging not supported."</string>
<string name="invalid_charger_text" msgid="5474997287953892710">"Use only the supplied charger."</string>
<string name="battery_low_why" msgid="4553600287639198111">"Settings"</string>
- <string name="battery_saver_confirmation_title" msgid="5987726159603849352">"Start battery saver?"</string>
- <string name="battery_saver_confirmation_ok" msgid="7283108887345688413">"Start"</string>
- <string name="battery_saver_start_action" msgid="7245333922937402896">"Start battery saver"</string>
- <string name="battery_saver_confirmation_text" msgid="8417584516834617662">"To help improve battery life, Battery saver will reduce your device’s performance.\n\nBattery saver will be disabled when your device is plugged in."</string>
+ <!-- no translation found for battery_saver_confirmation_title (5299585433050361634) -->
+ <skip />
+ <!-- no translation found for battery_saver_confirmation_ok (7507968430447930257) -->
+ <skip />
+ <!-- no translation found for battery_saver_start_action (5576697451677486320) -->
+ <skip />
<string name="status_bar_settings_settings_button" msgid="3023889916699270224">"Settings"</string>
<string name="status_bar_settings_wifi_button" msgid="1733928151698311923">"Wi-Fi"</string>
<string name="status_bar_settings_airplane" msgid="4879879698500955300">"Aeroplane mode"</string>
@@ -286,8 +288,10 @@
<item quantity="other" msgid="5408537517529822157">"For %d hours"</item>
</plurals>
<string name="battery_saver_notification_title" msgid="237918726750955859">"Battery saver is on"</string>
- <string name="battery_saver_notification_text" msgid="7796554871101546872">"Device performance is reduced."</string>
- <string name="battery_saver_notification_action_text" msgid="7546297220816993504">"Open battery saver settings"</string>
+ <!-- no translation found for battery_saver_notification_text (820318788126672692) -->
+ <skip />
+ <!-- no translation found for battery_saver_notification_action_text (109158658238110382) -->
+ <skip />
<string name="battery_level_template" msgid="1609636980292580020">"<xliff:g id="LEVEL">%d</xliff:g>%%"</string>
<string name="notification_hidden_text" msgid="1135169301897151909">"Contents hidden"</string>
<string name="media_projection_dialog_text" msgid="3071431025448218928">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> will start capturing everything that\'s displayed on your screen."</string>
diff --git a/packages/SystemUI/res/values-en-rIN/strings.xml b/packages/SystemUI/res/values-en-rIN/strings.xml
index b15791a..f7d959d 100644
--- a/packages/SystemUI/res/values-en-rIN/strings.xml
+++ b/packages/SystemUI/res/values-en-rIN/strings.xml
@@ -39,10 +39,12 @@
<string name="invalid_charger_title" msgid="3515740382572798460">"USB charging not supported."</string>
<string name="invalid_charger_text" msgid="5474997287953892710">"Use only the supplied charger."</string>
<string name="battery_low_why" msgid="4553600287639198111">"Settings"</string>
- <string name="battery_saver_confirmation_title" msgid="5987726159603849352">"Start battery saver?"</string>
- <string name="battery_saver_confirmation_ok" msgid="7283108887345688413">"Start"</string>
- <string name="battery_saver_start_action" msgid="7245333922937402896">"Start battery saver"</string>
- <string name="battery_saver_confirmation_text" msgid="8417584516834617662">"To help improve battery life, Battery saver will reduce your device’s performance.\n\nBattery saver will be disabled when your device is plugged in."</string>
+ <!-- no translation found for battery_saver_confirmation_title (5299585433050361634) -->
+ <skip />
+ <!-- no translation found for battery_saver_confirmation_ok (7507968430447930257) -->
+ <skip />
+ <!-- no translation found for battery_saver_start_action (5576697451677486320) -->
+ <skip />
<string name="status_bar_settings_settings_button" msgid="3023889916699270224">"Settings"</string>
<string name="status_bar_settings_wifi_button" msgid="1733928151698311923">"Wi-Fi"</string>
<string name="status_bar_settings_airplane" msgid="4879879698500955300">"Aeroplane mode"</string>
@@ -286,8 +288,10 @@
<item quantity="other" msgid="5408537517529822157">"For %d hours"</item>
</plurals>
<string name="battery_saver_notification_title" msgid="237918726750955859">"Battery saver is on"</string>
- <string name="battery_saver_notification_text" msgid="7796554871101546872">"Device performance is reduced."</string>
- <string name="battery_saver_notification_action_text" msgid="7546297220816993504">"Open battery saver settings"</string>
+ <!-- no translation found for battery_saver_notification_text (820318788126672692) -->
+ <skip />
+ <!-- no translation found for battery_saver_notification_action_text (109158658238110382) -->
+ <skip />
<string name="battery_level_template" msgid="1609636980292580020">"<xliff:g id="LEVEL">%d</xliff:g>%%"</string>
<string name="notification_hidden_text" msgid="1135169301897151909">"Contents hidden"</string>
<string name="media_projection_dialog_text" msgid="3071431025448218928">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> will start capturing everything that\'s displayed on your screen."</string>
diff --git a/packages/SystemUI/res/values-es-rUS/strings.xml b/packages/SystemUI/res/values-es-rUS/strings.xml
index f21472f..b19a157 100644
--- a/packages/SystemUI/res/values-es-rUS/strings.xml
+++ b/packages/SystemUI/res/values-es-rUS/strings.xml
@@ -39,10 +39,12 @@
<string name="invalid_charger_title" msgid="3515740382572798460">"No se admite la carga por USB."</string>
<string name="invalid_charger_text" msgid="5474997287953892710">"Usa solo el cargador suministrado."</string>
<string name="battery_low_why" msgid="4553600287639198111">"Configuración"</string>
- <string name="battery_saver_confirmation_title" msgid="5987726159603849352">"¿Quieres iniciar el ahorro de batería?"</string>
- <string name="battery_saver_confirmation_ok" msgid="7283108887345688413">"Iniciar"</string>
- <string name="battery_saver_start_action" msgid="7245333922937402896">"Iniciar ahorro de batería"</string>
- <string name="battery_saver_confirmation_text" msgid="8417584516834617662">"Para ayudar a mejorar la duración de la batería, el ahorro de batería reducirá el rendimiento del dispositivo.\n\nEsta función se inhabilitará cuando el dispositivo esté conectado."</string>
+ <!-- no translation found for battery_saver_confirmation_title (5299585433050361634) -->
+ <skip />
+ <!-- no translation found for battery_saver_confirmation_ok (7507968430447930257) -->
+ <skip />
+ <!-- no translation found for battery_saver_start_action (5576697451677486320) -->
+ <skip />
<string name="status_bar_settings_settings_button" msgid="3023889916699270224">"Configuración"</string>
<string name="status_bar_settings_wifi_button" msgid="1733928151698311923">"Wi-Fi"</string>
<string name="status_bar_settings_airplane" msgid="4879879698500955300">"Modo avión"</string>
@@ -288,8 +290,10 @@
<item quantity="other" msgid="5408537517529822157">"Durante %d horas"</item>
</plurals>
<string name="battery_saver_notification_title" msgid="237918726750955859">"Ahorro de batería activado"</string>
- <string name="battery_saver_notification_text" msgid="7796554871101546872">"Rendimiento del dispositivo reducido"</string>
- <string name="battery_saver_notification_action_text" msgid="7546297220816993504">"Abrir configuración del ahorro de batería"</string>
+ <!-- no translation found for battery_saver_notification_text (820318788126672692) -->
+ <skip />
+ <!-- no translation found for battery_saver_notification_action_text (109158658238110382) -->
+ <skip />
<string name="battery_level_template" msgid="1609636980292580020">"<xliff:g id="LEVEL">%d</xliff:g>%%"</string>
<string name="notification_hidden_text" msgid="1135169301897151909">"Contenidos ocultos"</string>
<string name="media_projection_dialog_text" msgid="3071431025448218928">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> comenzará la captura de todo lo que se muestre en la pantalla."</string>
diff --git a/packages/SystemUI/res/values-es/strings.xml b/packages/SystemUI/res/values-es/strings.xml
index be9d2fb..326d2ba 100644
--- a/packages/SystemUI/res/values-es/strings.xml
+++ b/packages/SystemUI/res/values-es/strings.xml
@@ -39,10 +39,12 @@
<string name="invalid_charger_title" msgid="3515740382572798460">"No se admite la carga por USB."</string>
<string name="invalid_charger_text" msgid="5474997287953892710">"Utiliza solo el cargador proporcionado."</string>
<string name="battery_low_why" msgid="4553600287639198111">"Ajustes"</string>
- <string name="battery_saver_confirmation_title" msgid="5987726159603849352">"¿Iniciar ahorro de batería?"</string>
- <string name="battery_saver_confirmation_ok" msgid="7283108887345688413">"Iniciar"</string>
- <string name="battery_saver_start_action" msgid="7245333922937402896">"Iniciar ahorro de batería"</string>
- <string name="battery_saver_confirmation_text" msgid="8417584516834617662">"Para ayudar a mejorar la duración de la batería, la función de ahorro de energía reducirá el rendimiento del dispositivo.\n\nEsta función estará inhabilitada cuando el dispositivo esté enchufado."</string>
+ <!-- no translation found for battery_saver_confirmation_title (5299585433050361634) -->
+ <skip />
+ <!-- no translation found for battery_saver_confirmation_ok (7507968430447930257) -->
+ <skip />
+ <!-- no translation found for battery_saver_start_action (5576697451677486320) -->
+ <skip />
<string name="status_bar_settings_settings_button" msgid="3023889916699270224">"Ajustes"</string>
<string name="status_bar_settings_wifi_button" msgid="1733928151698311923">"Wi-Fi"</string>
<string name="status_bar_settings_airplane" msgid="4879879698500955300">"Modo avión"</string>
@@ -286,8 +288,10 @@
<item quantity="other" msgid="5408537517529822157">"Durante %d horas"</item>
</plurals>
<string name="battery_saver_notification_title" msgid="237918726750955859">"Ahorro de batería activado"</string>
- <string name="battery_saver_notification_text" msgid="7796554871101546872">"Rendimiento del dispositivo reducido."</string>
- <string name="battery_saver_notification_action_text" msgid="7546297220816993504">"Abrir ajustes de la función de ahorro de batería"</string>
+ <!-- no translation found for battery_saver_notification_text (820318788126672692) -->
+ <skip />
+ <!-- no translation found for battery_saver_notification_action_text (109158658238110382) -->
+ <skip />
<string name="battery_level_template" msgid="1609636980292580020">"<xliff:g id="LEVEL">%d</xliff:g>%%"</string>
<string name="notification_hidden_text" msgid="1135169301897151909">"Contenidos ocultos"</string>
<string name="media_projection_dialog_text" msgid="3071431025448218928">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> empezará a capturar todo lo que aparezca en la pantalla."</string>
diff --git a/packages/SystemUI/res/values-et-rEE/strings.xml b/packages/SystemUI/res/values-et-rEE/strings.xml
index 36765c3..7600e15 100644
--- a/packages/SystemUI/res/values-et-rEE/strings.xml
+++ b/packages/SystemUI/res/values-et-rEE/strings.xml
@@ -39,10 +39,12 @@
<string name="invalid_charger_title" msgid="3515740382572798460">"USB-ga laadimist ei toetata."</string>
<string name="invalid_charger_text" msgid="5474997287953892710">"Kasutage ainult kaasasolevat laadijat."</string>
<string name="battery_low_why" msgid="4553600287639198111">"Seaded"</string>
- <string name="battery_saver_confirmation_title" msgid="5987726159603849352">"Kas käivitada akusäästja?"</string>
- <string name="battery_saver_confirmation_ok" msgid="7283108887345688413">"Käivita"</string>
- <string name="battery_saver_start_action" msgid="7245333922937402896">"Käivita akusäästja"</string>
- <string name="battery_saver_confirmation_text" msgid="8417584516834617662">"Aku tööea parandamiseks vähendab akusäästja teie seadme jõudlust.\n\nKui seade ühendatakse toiteallikaga, keelatakse akusäästja."</string>
+ <!-- no translation found for battery_saver_confirmation_title (5299585433050361634) -->
+ <skip />
+ <!-- no translation found for battery_saver_confirmation_ok (7507968430447930257) -->
+ <skip />
+ <!-- no translation found for battery_saver_start_action (5576697451677486320) -->
+ <skip />
<string name="status_bar_settings_settings_button" msgid="3023889916699270224">"Seaded"</string>
<string name="status_bar_settings_wifi_button" msgid="1733928151698311923">"WiFi"</string>
<string name="status_bar_settings_airplane" msgid="4879879698500955300">"Lennurežiim"</string>
@@ -286,8 +288,10 @@
<item quantity="other" msgid="5408537517529822157">"%d tunniks"</item>
</plurals>
<string name="battery_saver_notification_title" msgid="237918726750955859">"Akusäästja on sisse lülitatud"</string>
- <string name="battery_saver_notification_text" msgid="7796554871101546872">"Seadme jõudlust on vähendatud."</string>
- <string name="battery_saver_notification_action_text" msgid="7546297220816993504">"Ava akusäästja seaded"</string>
+ <!-- no translation found for battery_saver_notification_text (820318788126672692) -->
+ <skip />
+ <!-- no translation found for battery_saver_notification_action_text (109158658238110382) -->
+ <skip />
<string name="battery_level_template" msgid="1609636980292580020">"<xliff:g id="LEVEL">%d</xliff:g>%%"</string>
<string name="notification_hidden_text" msgid="1135169301897151909">"Sisu on peidetud"</string>
<string name="media_projection_dialog_text" msgid="3071431025448218928">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> hakkab jäädvustama kõike, mida ekraanil kuvatakse."</string>
diff --git a/packages/SystemUI/res/values-eu-rES/strings.xml b/packages/SystemUI/res/values-eu-rES/strings.xml
index a0a7eac..1ef6599 100644
--- a/packages/SystemUI/res/values-eu-rES/strings.xml
+++ b/packages/SystemUI/res/values-eu-rES/strings.xml
@@ -39,10 +39,12 @@
<string name="invalid_charger_title" msgid="3515740382572798460">"Ez da USB bidez kargatzea onartzen."</string>
<string name="invalid_charger_text" msgid="5474997287953892710">"Erabili jatorrizko kargagailua soilik."</string>
<string name="battery_low_why" msgid="4553600287639198111">"Ezarpenak"</string>
- <string name="battery_saver_confirmation_title" msgid="5987726159603849352">"Bateria aurrezlea aktibatu nahi duzu?"</string>
- <string name="battery_saver_confirmation_ok" msgid="7283108887345688413">"Hasi"</string>
- <string name="battery_saver_start_action" msgid="7245333922937402896">"Aktibatu bateria aurrezlea"</string>
- <string name="battery_saver_confirmation_text" msgid="8417584516834617662">"Bateria aurrezleak gailuaren funtzionamendua erregulatzen du, energiaren kontsumoa murriztuta bateriak gehiago iraun dezan.\n\nGailua kargagailura konektatzen duzunean Bateria aurrezlea desaktibatu egingo da."</string>
+ <!-- no translation found for battery_saver_confirmation_title (5299585433050361634) -->
+ <skip />
+ <!-- no translation found for battery_saver_confirmation_ok (7507968430447930257) -->
+ <skip />
+ <!-- no translation found for battery_saver_start_action (5576697451677486320) -->
+ <skip />
<string name="status_bar_settings_settings_button" msgid="3023889916699270224">"Ezarpenak"</string>
<string name="status_bar_settings_wifi_button" msgid="1733928151698311923">"Wi-Fi"</string>
<string name="status_bar_settings_airplane" msgid="4879879698500955300">"Hegaldi modua"</string>
@@ -286,13 +288,15 @@
<item quantity="other" msgid="5408537517529822157">"%d orduz"</item>
</plurals>
<string name="battery_saver_notification_title" msgid="237918726750955859">"Bateria aurrezlea aktibatuta dago"</string>
- <string name="battery_saver_notification_text" msgid="7796554871101546872">"Gailuaren funtzioak murrizten dira, energia gutxiago kontsumi dezan."</string>
- <string name="battery_saver_notification_action_text" msgid="7546297220816993504">"Ireki bateria aurrezlearen ezarpenak"</string>
+ <!-- no translation found for battery_saver_notification_text (820318788126672692) -->
+ <skip />
+ <!-- no translation found for battery_saver_notification_action_text (109158658238110382) -->
+ <skip />
<string name="battery_level_template" msgid="1609636980292580020">"%% <xliff:g id="LEVEL">%d</xliff:g>"</string>
<string name="notification_hidden_text" msgid="1135169301897151909">"Edukiak ezkutatuta daude"</string>
<string name="media_projection_dialog_text" msgid="3071431025448218928">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> aplikazioak pantailan bistaratzen den guztia grabatuko du."</string>
<string name="media_projection_remember_text" msgid="3103510882172746752">"Ez erakutsi berriro"</string>
- <string name="clear_all_notifications_text" msgid="814192889771462828">"Garbitu guztia"</string>
+ <string name="clear_all_notifications_text" msgid="814192889771462828">"Garbitu guztiak"</string>
<string name="media_projection_action_text" msgid="8470872969457985954">"Hasi"</string>
<string name="empty_shade_text" msgid="708135716272867002">"Ez dago jakinarazpenik"</string>
</resources>
diff --git a/packages/SystemUI/res/values-fa/strings.xml b/packages/SystemUI/res/values-fa/strings.xml
index 1037eea..c02d1e9 100644
--- a/packages/SystemUI/res/values-fa/strings.xml
+++ b/packages/SystemUI/res/values-fa/strings.xml
@@ -39,10 +39,12 @@
<string name="invalid_charger_title" msgid="3515740382572798460">"شارژ با USB پشتیبانی نمیشود."</string>
<string name="invalid_charger_text" msgid="5474997287953892710">"فقط از شارژر ارائه شده استفاده کنید."</string>
<string name="battery_low_why" msgid="4553600287639198111">"تنظیمات"</string>
- <string name="battery_saver_confirmation_title" msgid="5987726159603849352">"ذخیره کننده باتری شروع شود؟"</string>
- <string name="battery_saver_confirmation_ok" msgid="7283108887345688413">"شروع"</string>
- <string name="battery_saver_start_action" msgid="7245333922937402896">"شروع ذخیره کننده باتری"</string>
- <string name="battery_saver_confirmation_text" msgid="8417584516834617662">"ذخیره کننده باتری برای کمک به بهبود عمر باتری شما، عملکرد دستگاهتان را کاهش میدهد.\n\nهنگامی که دستگاه شما به برق وصل است، ذخیره کننده باتری خاموش میشود."</string>
+ <!-- no translation found for battery_saver_confirmation_title (5299585433050361634) -->
+ <skip />
+ <!-- no translation found for battery_saver_confirmation_ok (7507968430447930257) -->
+ <skip />
+ <!-- no translation found for battery_saver_start_action (5576697451677486320) -->
+ <skip />
<string name="status_bar_settings_settings_button" msgid="3023889916699270224">"تنظیمات"</string>
<string name="status_bar_settings_wifi_button" msgid="1733928151698311923">"Wi-Fi"</string>
<string name="status_bar_settings_airplane" msgid="4879879698500955300">"حالت هواپیما"</string>
@@ -286,8 +288,10 @@
<item quantity="other" msgid="5408537517529822157">"برای %d ساعت"</item>
</plurals>
<string name="battery_saver_notification_title" msgid="237918726750955859">"ذخیره کننده باتری روشن است."</string>
- <string name="battery_saver_notification_text" msgid="7796554871101546872">"عملکرد دستگاه کاهش یافته است."</string>
- <string name="battery_saver_notification_action_text" msgid="7546297220816993504">"باز کردن تنظیمات ذخیره کننده باتری"</string>
+ <!-- no translation found for battery_saver_notification_text (820318788126672692) -->
+ <skip />
+ <!-- no translation found for battery_saver_notification_action_text (109158658238110382) -->
+ <skip />
<string name="battery_level_template" msgid="1609636980292580020">"<xliff:g id="LEVEL">%d</xliff:g>٪٪"</string>
<string name="notification_hidden_text" msgid="1135169301897151909">"محتواها پنهان هستند"</string>
<string name="media_projection_dialog_text" msgid="3071431025448218928">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> شروع به ضبط هر چیزی میکند که در صفحهنمایش شما نمایش داده میشود."</string>
diff --git a/packages/SystemUI/res/values-fi/strings.xml b/packages/SystemUI/res/values-fi/strings.xml
index 139d12a..d9e53c5 100644
--- a/packages/SystemUI/res/values-fi/strings.xml
+++ b/packages/SystemUI/res/values-fi/strings.xml
@@ -39,10 +39,12 @@
<string name="invalid_charger_title" msgid="3515740382572798460">"USB-latausta ei tueta."</string>
<string name="invalid_charger_text" msgid="5474997287953892710">"Käytä vain laitteen mukana toimitettua laturia."</string>
<string name="battery_low_why" msgid="4553600287639198111">"Asetukset"</string>
- <string name="battery_saver_confirmation_title" msgid="5987726159603849352">"Käynnistetäänkö virransäästö?"</string>
- <string name="battery_saver_confirmation_ok" msgid="7283108887345688413">"Käynnistä"</string>
- <string name="battery_saver_start_action" msgid="7245333922937402896">"Käynnistä virransäästö"</string>
- <string name="battery_saver_confirmation_text" msgid="8417584516834617662">"Virransäästötoiminto pidentää akun kestoa vähentämällä laitteen virrankulutusta.\n\nLaitteen kytkeminen virtalähteeseen poistaa virransäästön käytöstä."</string>
+ <!-- no translation found for battery_saver_confirmation_title (5299585433050361634) -->
+ <skip />
+ <!-- no translation found for battery_saver_confirmation_ok (7507968430447930257) -->
+ <skip />
+ <!-- no translation found for battery_saver_start_action (5576697451677486320) -->
+ <skip />
<string name="status_bar_settings_settings_button" msgid="3023889916699270224">"Asetukset"</string>
<string name="status_bar_settings_wifi_button" msgid="1733928151698311923">"Wi-Fi"</string>
<string name="status_bar_settings_airplane" msgid="4879879698500955300">"Lentokonetila"</string>
@@ -286,8 +288,10 @@
<item quantity="other" msgid="5408537517529822157">"%d tunniksi"</item>
</plurals>
<string name="battery_saver_notification_title" msgid="237918726750955859">"Virransäästö on käytössä"</string>
- <string name="battery_saver_notification_text" msgid="7796554871101546872">"Laitteen virrankulutusta vähennetään."</string>
- <string name="battery_saver_notification_action_text" msgid="7546297220816993504">"Avaa virransäästöasetukset"</string>
+ <!-- no translation found for battery_saver_notification_text (820318788126672692) -->
+ <skip />
+ <!-- no translation found for battery_saver_notification_action_text (109158658238110382) -->
+ <skip />
<!-- String.format failed for translation -->
<!-- no translation found for battery_level_template (1609636980292580020) -->
<skip />
diff --git a/packages/SystemUI/res/values-fr-rCA/strings.xml b/packages/SystemUI/res/values-fr-rCA/strings.xml
index 970b133..ea63ccc 100644
--- a/packages/SystemUI/res/values-fr-rCA/strings.xml
+++ b/packages/SystemUI/res/values-fr-rCA/strings.xml
@@ -39,10 +39,12 @@
<string name="invalid_charger_title" msgid="3515740382572798460">"Le chargement par USB n\'est pas pris en charge."</string>
<string name="invalid_charger_text" msgid="5474997287953892710">"Utilisez uniquement le chargeur fourni."</string>
<string name="battery_low_why" msgid="4553600287639198111">"Paramètres"</string>
- <string name="battery_saver_confirmation_title" msgid="5987726159603849352">"Démarrer la fonction Économie d\'énergie?"</string>
- <string name="battery_saver_confirmation_ok" msgid="7283108887345688413">"Démarrer"</string>
- <string name="battery_saver_start_action" msgid="7245333922937402896">"Démarrer la fonction Économie d\'énergie"</string>
- <string name="battery_saver_confirmation_text" msgid="8417584516834617662">"Pour vous aider à prolonger l\'autonomie de votre appareil, la fonction Économie d\'énergie réduit les performances de l\'appareil.\n\nElle se désactive lorsque l\'appareil est branché."</string>
+ <!-- no translation found for battery_saver_confirmation_title (5299585433050361634) -->
+ <skip />
+ <!-- no translation found for battery_saver_confirmation_ok (7507968430447930257) -->
+ <skip />
+ <!-- no translation found for battery_saver_start_action (5576697451677486320) -->
+ <skip />
<string name="status_bar_settings_settings_button" msgid="3023889916699270224">"Paramètres"</string>
<string name="status_bar_settings_wifi_button" msgid="1733928151698311923">"Wi-Fi"</string>
<string name="status_bar_settings_airplane" msgid="4879879698500955300">"Mode Avion"</string>
@@ -288,8 +290,10 @@
<item quantity="other" msgid="5408537517529822157">"Pendant %d heures"</item>
</plurals>
<string name="battery_saver_notification_title" msgid="237918726750955859">"La fonction Économie d\'énergie est activée"</string>
- <string name="battery_saver_notification_text" msgid="7796554871101546872">"Les performances de l\'appareil sont réduites."</string>
- <string name="battery_saver_notification_action_text" msgid="7546297220816993504">"Ouvrir les paramètres d\'économie d\'énergie"</string>
+ <!-- no translation found for battery_saver_notification_text (820318788126672692) -->
+ <skip />
+ <!-- no translation found for battery_saver_notification_action_text (109158658238110382) -->
+ <skip />
<string name="battery_level_template" msgid="1609636980292580020">"<xliff:g id="LEVEL">%d</xliff:g> %%"</string>
<string name="notification_hidden_text" msgid="1135169301897151909">"Contenus masqués"</string>
<string name="media_projection_dialog_text" msgid="3071431025448218928">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> commencer à enregistrer tout ce qui s\'affiche sur votre écran."</string>
diff --git a/packages/SystemUI/res/values-fr/strings.xml b/packages/SystemUI/res/values-fr/strings.xml
index c85749a..8db8975 100644
--- a/packages/SystemUI/res/values-fr/strings.xml
+++ b/packages/SystemUI/res/values-fr/strings.xml
@@ -39,10 +39,12 @@
<string name="invalid_charger_title" msgid="3515740382572798460">"Chargeur USB non compatible."</string>
<string name="invalid_charger_text" msgid="5474997287953892710">"Veuillez n\'utiliser que le chargeur fourni."</string>
<string name="battery_low_why" msgid="4553600287639198111">"Paramètres"</string>
- <string name="battery_saver_confirmation_title" msgid="5987726159603849352">"Démarrer l\'économiseur de batterie ?"</string>
- <string name="battery_saver_confirmation_ok" msgid="7283108887345688413">"Démarrer"</string>
- <string name="battery_saver_start_action" msgid="7245333922937402896">"Démarrer l\'économiseur de batterie"</string>
- <string name="battery_saver_confirmation_text" msgid="8417584516834617662">"Pour vous aider à prolonger l\'autonomie de la batterie, les performances de l\'appareil sont réduites.\n\nL\'économiseur de batterie est désactivé lorsque l\'appareil est branché."</string>
+ <!-- no translation found for battery_saver_confirmation_title (5299585433050361634) -->
+ <skip />
+ <!-- no translation found for battery_saver_confirmation_ok (7507968430447930257) -->
+ <skip />
+ <!-- no translation found for battery_saver_start_action (5576697451677486320) -->
+ <skip />
<string name="status_bar_settings_settings_button" msgid="3023889916699270224">"Paramètres"</string>
<string name="status_bar_settings_wifi_button" msgid="1733928151698311923">"Wi-Fi"</string>
<string name="status_bar_settings_airplane" msgid="4879879698500955300">"Mode Avion"</string>
@@ -288,8 +290,10 @@
<item quantity="other" msgid="5408537517529822157">"Pendant %d heures"</item>
</plurals>
<string name="battery_saver_notification_title" msgid="237918726750955859">"L\'économiseur de batterie est activé"</string>
- <string name="battery_saver_notification_text" msgid="7796554871101546872">"Les performances de l\'appareil sont réduites."</string>
- <string name="battery_saver_notification_action_text" msgid="7546297220816993504">"Ouvrir les paramètres de l\'économiseur de batterie"</string>
+ <!-- no translation found for battery_saver_notification_text (820318788126672692) -->
+ <skip />
+ <!-- no translation found for battery_saver_notification_action_text (109158658238110382) -->
+ <skip />
<string name="battery_level_template" msgid="1609636980292580020">"<xliff:g id="LEVEL">%d</xliff:g> %%"</string>
<string name="notification_hidden_text" msgid="1135169301897151909">"Contenus masqués"</string>
<string name="media_projection_dialog_text" msgid="3071431025448218928">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> va commencer à capturer tous les contenus affichés à l\'écran."</string>
diff --git a/packages/SystemUI/res/values-gl-rES/strings.xml b/packages/SystemUI/res/values-gl-rES/strings.xml
index 500bb57..b3e88e6 100644
--- a/packages/SystemUI/res/values-gl-rES/strings.xml
+++ b/packages/SystemUI/res/values-gl-rES/strings.xml
@@ -39,10 +39,12 @@
<string name="invalid_charger_title" msgid="3515740382572798460">"Non se admite a carga mediante USB."</string>
<string name="invalid_charger_text" msgid="5474997287953892710">"Utiliza soamente o cargador fornecido."</string>
<string name="battery_low_why" msgid="4553600287639198111">"Configuración"</string>
- <string name="battery_saver_confirmation_title" msgid="5987726159603849352">"Iniciar aforrador de batería?"</string>
- <string name="battery_saver_confirmation_ok" msgid="7283108887345688413">"Iniciar"</string>
- <string name="battery_saver_start_action" msgid="7245333922937402896">"Iniciar o aforrador de batería"</string>
- <string name="battery_saver_confirmation_text" msgid="8417584516834617662">"Para axudar a mellorar a duración da batería, o aforrador de batería reducirá o rendemento do dispositivo.\n\nO aforrador de batería desactivarase cando enchufes o dispositivo."</string>
+ <!-- no translation found for battery_saver_confirmation_title (5299585433050361634) -->
+ <skip />
+ <!-- no translation found for battery_saver_confirmation_ok (7507968430447930257) -->
+ <skip />
+ <!-- no translation found for battery_saver_start_action (5576697451677486320) -->
+ <skip />
<string name="status_bar_settings_settings_button" msgid="3023889916699270224">"Configuración"</string>
<string name="status_bar_settings_wifi_button" msgid="1733928151698311923">"Wi-Fi"</string>
<string name="status_bar_settings_airplane" msgid="4879879698500955300">"Modo avión"</string>
@@ -288,8 +290,10 @@
<item quantity="other" msgid="5408537517529822157">"Durante %d horas"</item>
</plurals>
<string name="battery_saver_notification_title" msgid="237918726750955859">"O aforrador de batería está activado"</string>
- <string name="battery_saver_notification_text" msgid="7796554871101546872">"Reduciuse o rendemento do dispositivo."</string>
- <string name="battery_saver_notification_action_text" msgid="7546297220816993504">"Abrir a configuración do aforrador de batería"</string>
+ <!-- no translation found for battery_saver_notification_text (820318788126672692) -->
+ <skip />
+ <!-- no translation found for battery_saver_notification_action_text (109158658238110382) -->
+ <skip />
<string name="battery_level_template" msgid="1609636980292580020">"<xliff:g id="LEVEL">%d</xliff:g>%%"</string>
<string name="notification_hidden_text" msgid="1135169301897151909">"Contido oculto"</string>
<string name="media_projection_dialog_text" msgid="3071431025448218928">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> comezará a capturar todo o que apareza na túa pantalla."</string>
diff --git a/packages/SystemUI/res/values-hi/strings.xml b/packages/SystemUI/res/values-hi/strings.xml
index fa9622f..7001f82 100644
--- a/packages/SystemUI/res/values-hi/strings.xml
+++ b/packages/SystemUI/res/values-hi/strings.xml
@@ -39,10 +39,12 @@
<string name="invalid_charger_title" msgid="3515740382572798460">"USB चार्जिंग समर्थित नहीं है."</string>
<string name="invalid_charger_text" msgid="5474997287953892710">"केवल आपूर्ति किए गए चार्जर का उपयोग करें."</string>
<string name="battery_low_why" msgid="4553600287639198111">"सेटिंग"</string>
- <string name="battery_saver_confirmation_title" msgid="5987726159603849352">"बैटरी सेवर प्रारंभ करें?"</string>
- <string name="battery_saver_confirmation_ok" msgid="7283108887345688413">"प्रारंभ करें"</string>
- <string name="battery_saver_start_action" msgid="7245333922937402896">"बैटरी सेवर प्रारंभ करें"</string>
- <string name="battery_saver_confirmation_text" msgid="8417584516834617662">"बैटरी का जीवनकाल बेहतर बनाने में सहायता के लिए, बैटरी सेवर आपके उपकरण के प्रदर्शन को कम कर देगा.\n\nआपका उपकरण प्लग किए जाने पर बैटरी सेवर अक्षम हो जाएगा."</string>
+ <!-- no translation found for battery_saver_confirmation_title (5299585433050361634) -->
+ <skip />
+ <!-- no translation found for battery_saver_confirmation_ok (7507968430447930257) -->
+ <skip />
+ <!-- no translation found for battery_saver_start_action (5576697451677486320) -->
+ <skip />
<string name="status_bar_settings_settings_button" msgid="3023889916699270224">"सेटिंग"</string>
<string name="status_bar_settings_wifi_button" msgid="1733928151698311923">"वाई-फ़ाई"</string>
<string name="status_bar_settings_airplane" msgid="4879879698500955300">"हवाई जहाज मोड"</string>
@@ -286,8 +288,10 @@
<item quantity="other" msgid="5408537517529822157">"%d घंटे के लिए"</item>
</plurals>
<string name="battery_saver_notification_title" msgid="237918726750955859">"बैटरी सेवर चालू है"</string>
- <string name="battery_saver_notification_text" msgid="7796554871101546872">"उपकरण का प्रदर्शन कम हो गया है."</string>
- <string name="battery_saver_notification_action_text" msgid="7546297220816993504">"बैटरी सेवर सेटिंग चालू करें"</string>
+ <!-- no translation found for battery_saver_notification_text (820318788126672692) -->
+ <skip />
+ <!-- no translation found for battery_saver_notification_action_text (109158658238110382) -->
+ <skip />
<string name="battery_level_template" msgid="1609636980292580020">"<xliff:g id="LEVEL">%d</xliff:g>%%"</string>
<string name="notification_hidden_text" msgid="1135169301897151909">"छिपी हुई सामग्री"</string>
<string name="media_projection_dialog_text" msgid="3071431025448218928">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> आपके स्क्रीन पर प्रदर्शित प्रत्येक सामग्री को कैप्चर करना प्रारंभ कर देगी."</string>
diff --git a/packages/SystemUI/res/values-hr/strings.xml b/packages/SystemUI/res/values-hr/strings.xml
index 24bc8c9..4fc775c 100644
--- a/packages/SystemUI/res/values-hr/strings.xml
+++ b/packages/SystemUI/res/values-hr/strings.xml
@@ -39,10 +39,12 @@
<string name="invalid_charger_title" msgid="3515740382572798460">"Punjenje putem USB-a nije podržano."</string>
<string name="invalid_charger_text" msgid="5474997287953892710">"Upotrebljavajte samo priloženi punjač."</string>
<string name="battery_low_why" msgid="4553600287639198111">"Postavke"</string>
- <string name="battery_saver_confirmation_title" msgid="5987726159603849352">"Želite li pokrenuti štednju baterije?"</string>
- <string name="battery_saver_confirmation_ok" msgid="7283108887345688413">"Kreni"</string>
- <string name="battery_saver_start_action" msgid="7245333922937402896">"Pokretanje štednje baterije"</string>
- <string name="battery_saver_confirmation_text" msgid="8417584516834617662">"Da bi baterija trajala dulje, Štednja baterije smanjit će intenzitet rada uređaja.\n\nŠtednja baterije onemogućit će se kada je uređaj priključen."</string>
+ <!-- no translation found for battery_saver_confirmation_title (5299585433050361634) -->
+ <skip />
+ <!-- no translation found for battery_saver_confirmation_ok (7507968430447930257) -->
+ <skip />
+ <!-- no translation found for battery_saver_start_action (5576697451677486320) -->
+ <skip />
<string name="status_bar_settings_settings_button" msgid="3023889916699270224">"Postavke"</string>
<string name="status_bar_settings_wifi_button" msgid="1733928151698311923">"Wi-Fi"</string>
<string name="status_bar_settings_airplane" msgid="4879879698500955300">"Način rada u zrakoplovu"</string>
@@ -286,8 +288,10 @@
<item quantity="other" msgid="5408537517529822157">"%d h"</item>
</plurals>
<string name="battery_saver_notification_title" msgid="237918726750955859">"Štednja baterije je uključena"</string>
- <string name="battery_saver_notification_text" msgid="7796554871101546872">"Uređaj radi smanjenim intenzitetom."</string>
- <string name="battery_saver_notification_action_text" msgid="7546297220816993504">"Otvaranje postavki štednje baterije"</string>
+ <!-- no translation found for battery_saver_notification_text (820318788126672692) -->
+ <skip />
+ <!-- no translation found for battery_saver_notification_action_text (109158658238110382) -->
+ <skip />
<string name="battery_level_template" msgid="1609636980292580020">"<xliff:g id="LEVEL">%d</xliff:g>%%"</string>
<string name="notification_hidden_text" msgid="1135169301897151909">"Sadržaj je skriven"</string>
<string name="media_projection_dialog_text" msgid="3071431025448218928">"Aplikacija <xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> počet će snimati sve što se prikazuje na zaslonu."</string>
diff --git a/packages/SystemUI/res/values-hu/strings.xml b/packages/SystemUI/res/values-hu/strings.xml
index f537e8c..6d5a15c 100644
--- a/packages/SystemUI/res/values-hu/strings.xml
+++ b/packages/SystemUI/res/values-hu/strings.xml
@@ -39,10 +39,12 @@
<string name="invalid_charger_title" msgid="3515740382572798460">"Az USB-n keresztüli töltés nem támogatott."</string>
<string name="invalid_charger_text" msgid="5474997287953892710">"Kizárólag a tartozékként kapott töltőt használja."</string>
<string name="battery_low_why" msgid="4553600287639198111">"Beállítások"</string>
- <string name="battery_saver_confirmation_title" msgid="5987726159603849352">"Elindítja az Akkumulátorkímélő módot?"</string>
- <string name="battery_saver_confirmation_ok" msgid="7283108887345688413">"Indítás"</string>
- <string name="battery_saver_start_action" msgid="7245333922937402896">"Akkumulátorkímélő mód indítása"</string>
- <string name="battery_saver_confirmation_text" msgid="8417584516834617662">"Az Akkumulátorkímélő mód csökkenti az eszköz teljesítményét, hogy növelje az akkumulátor üzemidejét.\n\nAz eszköz töltésekor az Akkumulátorkímélő üzemmód kikapcsol."</string>
+ <!-- no translation found for battery_saver_confirmation_title (5299585433050361634) -->
+ <skip />
+ <!-- no translation found for battery_saver_confirmation_ok (7507968430447930257) -->
+ <skip />
+ <!-- no translation found for battery_saver_start_action (5576697451677486320) -->
+ <skip />
<string name="status_bar_settings_settings_button" msgid="3023889916699270224">"Beállítások"</string>
<string name="status_bar_settings_wifi_button" msgid="1733928151698311923">"Wi-Fi"</string>
<string name="status_bar_settings_airplane" msgid="4879879698500955300">"Repülőgép üzemmód"</string>
@@ -286,8 +288,10 @@
<item quantity="other" msgid="5408537517529822157">"%d órán át"</item>
</plurals>
<string name="battery_saver_notification_title" msgid="237918726750955859">"Akkumulátorkímélő mód bekapcsolva"</string>
- <string name="battery_saver_notification_text" msgid="7796554871101546872">"Az eszköz teljesítménye lecsökkentve."</string>
- <string name="battery_saver_notification_action_text" msgid="7546297220816993504">"Akkumulátorkímélő mód beállításainak megnyitása"</string>
+ <!-- no translation found for battery_saver_notification_text (820318788126672692) -->
+ <skip />
+ <!-- no translation found for battery_saver_notification_action_text (109158658238110382) -->
+ <skip />
<string name="battery_level_template" msgid="1609636980292580020">"<xliff:g id="LEVEL">%d</xliff:g>. szint"</string>
<string name="notification_hidden_text" msgid="1135169301897151909">"Tartalomjegyzék elrejtve"</string>
<string name="media_projection_dialog_text" msgid="3071431025448218928">"A(z) <xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> alkalmazás rögzíteni fog mindent, ami megjelenik a képernyőn."</string>
diff --git a/packages/SystemUI/res/values-hy-rAM/strings.xml b/packages/SystemUI/res/values-hy-rAM/strings.xml
index f4a44ff..f4375ce 100644
--- a/packages/SystemUI/res/values-hy-rAM/strings.xml
+++ b/packages/SystemUI/res/values-hy-rAM/strings.xml
@@ -39,10 +39,12 @@
<string name="invalid_charger_title" msgid="3515740382572798460">"USB լիցքավորումը չի աջակցվում:"</string>
<string name="invalid_charger_text" msgid="5474997287953892710">"Օգտագործեք միայն մատակարարի տրամադրած լիցքավորիչը:"</string>
<string name="battery_low_why" msgid="4553600287639198111">"Կարգավորումներ"</string>
- <string name="battery_saver_confirmation_title" msgid="5987726159603849352">"Գործարկե՞լ մարտկոցի տնտեսումը:"</string>
- <string name="battery_saver_confirmation_ok" msgid="7283108887345688413">"Մեկնարկել"</string>
- <string name="battery_saver_start_action" msgid="7245333922937402896">"Գործարկել մարտկոցի տնտեսումը"</string>
- <string name="battery_saver_confirmation_text" msgid="8417584516834617662">"Մարտկոցի տնտեսումը կնվազեցնի ձեր սարքի կատարողականը՝ մարտկոցն ավելի երկար օգտագործելու համար:\n\nՄարտկոցի տնտեսումը կանջատվի, հենց սարքը միացնեք հոսանքի աղբյուրին:"</string>
+ <!-- no translation found for battery_saver_confirmation_title (5299585433050361634) -->
+ <skip />
+ <!-- no translation found for battery_saver_confirmation_ok (7507968430447930257) -->
+ <skip />
+ <!-- no translation found for battery_saver_start_action (5576697451677486320) -->
+ <skip />
<string name="status_bar_settings_settings_button" msgid="3023889916699270224">"Կարգավորումներ"</string>
<string name="status_bar_settings_wifi_button" msgid="1733928151698311923">"Wi-Fi"</string>
<string name="status_bar_settings_airplane" msgid="4879879698500955300">"Ինքնաթիռային ռեժիմ"</string>
@@ -286,8 +288,10 @@
<item quantity="other" msgid="5408537517529822157">"%d ժամ"</item>
</plurals>
<string name="battery_saver_notification_title" msgid="237918726750955859">"Մարտկոցի տնտեսումը միացված է"</string>
- <string name="battery_saver_notification_text" msgid="7796554871101546872">"Սարքի կատարողականը նվազեցված է:"</string>
- <string name="battery_saver_notification_action_text" msgid="7546297220816993504">"Բացել մարտկոցի տնտեսման կարգավորումները"</string>
+ <!-- no translation found for battery_saver_notification_text (820318788126672692) -->
+ <skip />
+ <!-- no translation found for battery_saver_notification_action_text (109158658238110382) -->
+ <skip />
<string name="battery_level_template" msgid="1609636980292580020">"<xliff:g id="LEVEL">%d</xliff:g>%%"</string>
<string name="notification_hidden_text" msgid="1135169301897151909">"Բովանդակությունը թաքցված է"</string>
<string name="media_projection_dialog_text" msgid="3071431025448218928">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> ծրագիրը կսկսի հավաքագրել այն ամենն ինչ ցուցադրվում է ձեր էկրանին:"</string>
diff --git a/packages/SystemUI/res/values-in/strings.xml b/packages/SystemUI/res/values-in/strings.xml
index 43cf75d..96b1165d 100644
--- a/packages/SystemUI/res/values-in/strings.xml
+++ b/packages/SystemUI/res/values-in/strings.xml
@@ -39,10 +39,12 @@
<string name="invalid_charger_title" msgid="3515740382572798460">"Pengisian daya USB tidak didukung."</string>
<string name="invalid_charger_text" msgid="5474997287953892710">"Hanya gunakan pengisi daya yang disediakan."</string>
<string name="battery_low_why" msgid="4553600287639198111">"Setelan"</string>
- <string name="battery_saver_confirmation_title" msgid="5987726159603849352">"Mulai penghemat baterai?"</string>
- <string name="battery_saver_confirmation_ok" msgid="7283108887345688413">"Mulai"</string>
- <string name="battery_saver_start_action" msgid="7245333922937402896">"Mulai penghemat baterai"</string>
- <string name="battery_saver_confirmation_text" msgid="8417584516834617662">"Untuk membantu meningkatkan masa pakai baterai, Penghemat baterai akan mengurangi kinerja perangkat Anda.\n\nPenghemat baterai akan dinonaktifkan saat perangkat dihubungkan dengan sumber daya."</string>
+ <!-- no translation found for battery_saver_confirmation_title (5299585433050361634) -->
+ <skip />
+ <!-- no translation found for battery_saver_confirmation_ok (7507968430447930257) -->
+ <skip />
+ <!-- no translation found for battery_saver_start_action (5576697451677486320) -->
+ <skip />
<string name="status_bar_settings_settings_button" msgid="3023889916699270224">"Setelan"</string>
<string name="status_bar_settings_wifi_button" msgid="1733928151698311923">"Wi-Fi"</string>
<string name="status_bar_settings_airplane" msgid="4879879698500955300">"Mode pesawat"</string>
@@ -286,8 +288,10 @@
<item quantity="other" msgid="5408537517529822157">"Selama %d jam"</item>
</plurals>
<string name="battery_saver_notification_title" msgid="237918726750955859">"Penghemat baterai aktif"</string>
- <string name="battery_saver_notification_text" msgid="7796554871101546872">"Kinerja perangkat dikurangi."</string>
- <string name="battery_saver_notification_action_text" msgid="7546297220816993504">"Buka setelan penghemat baterai"</string>
+ <!-- no translation found for battery_saver_notification_text (820318788126672692) -->
+ <skip />
+ <!-- no translation found for battery_saver_notification_action_text (109158658238110382) -->
+ <skip />
<string name="battery_level_template" msgid="1609636980292580020">"<xliff:g id="LEVEL">%d</xliff:g>%%"</string>
<string name="notification_hidden_text" msgid="1135169301897151909">"Konten tersembunyi"</string>
<string name="media_projection_dialog_text" msgid="3071431025448218928">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> akan mulai menangkap apa saja yang ditampilkan pada layar Anda."</string>
diff --git a/packages/SystemUI/res/values-is-rIS/strings.xml b/packages/SystemUI/res/values-is-rIS/strings.xml
index 329bbc6..266af50 100644
--- a/packages/SystemUI/res/values-is-rIS/strings.xml
+++ b/packages/SystemUI/res/values-is-rIS/strings.xml
@@ -39,10 +39,12 @@
<string name="invalid_charger_title" msgid="3515740382572798460">"Ekki er stuðningur við USB-hleðslu."</string>
<string name="invalid_charger_text" msgid="5474997287953892710">"Notaðu eingöngu hleðslutækið sem fylgir með."</string>
<string name="battery_low_why" msgid="4553600287639198111">"Stillingar"</string>
- <string name="battery_saver_confirmation_title" msgid="5987726159603849352">"Kveikja á rafhlöðusparnaði?"</string>
- <string name="battery_saver_confirmation_ok" msgid="7283108887345688413">"Kveikja"</string>
- <string name="battery_saver_start_action" msgid="7245333922937402896">"Kveikja á rafhlöðusparnaði"</string>
- <string name="battery_saver_confirmation_text" msgid="8417584516834617662">"Til að lengja endingartíma rafhlöðunnar minnkar rafhlöðusparnaðareiginleikinn afköst tækisins.\n\nSlökkt er á sparnaðareiginleikanum þegar tækið er sett í samband."</string>
+ <!-- no translation found for battery_saver_confirmation_title (5299585433050361634) -->
+ <skip />
+ <!-- no translation found for battery_saver_confirmation_ok (7507968430447930257) -->
+ <skip />
+ <!-- no translation found for battery_saver_start_action (5576697451677486320) -->
+ <skip />
<string name="status_bar_settings_settings_button" msgid="3023889916699270224">"Stillingar"</string>
<string name="status_bar_settings_wifi_button" msgid="1733928151698311923">"Wi-Fi"</string>
<string name="status_bar_settings_airplane" msgid="4879879698500955300">"Flugstilling"</string>
@@ -286,8 +288,10 @@
<item quantity="other" msgid="5408537517529822157">"Í %d klukkustundir"</item>
</plurals>
<string name="battery_saver_notification_title" msgid="237918726750955859">"Kveikt er á rafhlöðusparnaði"</string>
- <string name="battery_saver_notification_text" msgid="7796554871101546872">"Þetta dregur úr afköstum tækisins."</string>
- <string name="battery_saver_notification_action_text" msgid="7546297220816993504">"Opna stillingar rafhlöðusparnaðar"</string>
+ <!-- no translation found for battery_saver_notification_text (820318788126672692) -->
+ <skip />
+ <!-- no translation found for battery_saver_notification_action_text (109158658238110382) -->
+ <skip />
<string name="battery_level_template" msgid="1609636980292580020">"<xliff:g id="LEVEL">%d</xliff:g>%%"</string>
<string name="notification_hidden_text" msgid="1135169301897151909">"Innihald falið"</string>
<string name="media_projection_dialog_text" msgid="3071431025448218928">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> mun fanga allt sem birtist á skjánum."</string>
diff --git a/packages/SystemUI/res/values-it/strings.xml b/packages/SystemUI/res/values-it/strings.xml
index b8d5f36..7da2268 100644
--- a/packages/SystemUI/res/values-it/strings.xml
+++ b/packages/SystemUI/res/values-it/strings.xml
@@ -39,10 +39,12 @@
<string name="invalid_charger_title" msgid="3515740382572798460">"Ricarica tramite USB non supportata."</string>
<string name="invalid_charger_text" msgid="5474997287953892710">"Utilizza solo il caricabatterie fornito in dotazione."</string>
<string name="battery_low_why" msgid="4553600287639198111">"Impostazioni"</string>
- <string name="battery_saver_confirmation_title" msgid="5987726159603849352">"Avviare risparmio batteria?"</string>
- <string name="battery_saver_confirmation_ok" msgid="7283108887345688413">"Avvia"</string>
- <string name="battery_saver_start_action" msgid="7245333922937402896">"Avvia risparmio batteria"</string>
- <string name="battery_saver_confirmation_text" msgid="8417584516834617662">"Per aumentare la durata della batteria, Risparmio batteria riduce le prestazioni del tuo dispositivo.\n\nRisparmio batteria si disattiva quando il dispositivo è collegato alla corrente."</string>
+ <!-- no translation found for battery_saver_confirmation_title (5299585433050361634) -->
+ <skip />
+ <!-- no translation found for battery_saver_confirmation_ok (7507968430447930257) -->
+ <skip />
+ <!-- no translation found for battery_saver_start_action (5576697451677486320) -->
+ <skip />
<string name="status_bar_settings_settings_button" msgid="3023889916699270224">"Impostazioni"</string>
<string name="status_bar_settings_wifi_button" msgid="1733928151698311923">"Wi-Fi"</string>
<string name="status_bar_settings_airplane" msgid="4879879698500955300">"Modalità aereo"</string>
@@ -288,8 +290,10 @@
<item quantity="other" msgid="5408537517529822157">"Per %d ore"</item>
</plurals>
<string name="battery_saver_notification_title" msgid="237918726750955859">"Risparmio batteria attivo"</string>
- <string name="battery_saver_notification_text" msgid="7796554871101546872">"Le prestazioni del dispositivo sono ridotte."</string>
- <string name="battery_saver_notification_action_text" msgid="7546297220816993504">"Apri impostazioni risparmio batteria"</string>
+ <!-- no translation found for battery_saver_notification_text (820318788126672692) -->
+ <skip />
+ <!-- no translation found for battery_saver_notification_action_text (109158658238110382) -->
+ <skip />
<string name="battery_level_template" msgid="1609636980292580020">"<xliff:g id="LEVEL">%d</xliff:g>%%"</string>
<string name="notification_hidden_text" msgid="1135169301897151909">"Contenuti nascosti"</string>
<string name="media_projection_dialog_text" msgid="3071431025448218928">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> inizierà ad acquisire tutto ciò che è visualizzato sul tuo schermo."</string>
diff --git a/packages/SystemUI/res/values-iw/strings.xml b/packages/SystemUI/res/values-iw/strings.xml
index ff15af0..fba167e 100644
--- a/packages/SystemUI/res/values-iw/strings.xml
+++ b/packages/SystemUI/res/values-iw/strings.xml
@@ -39,10 +39,12 @@
<string name="invalid_charger_title" msgid="3515740382572798460">"טעינה בחיבור USB אינה נתמכת."</string>
<string name="invalid_charger_text" msgid="5474997287953892710">"השתמש רק במטען שסופק."</string>
<string name="battery_low_why" msgid="4553600287639198111">"הגדרות"</string>
- <string name="battery_saver_confirmation_title" msgid="5987726159603849352">"האם להפעיל את \'חיסכון בסוללה\'?"</string>
- <string name="battery_saver_confirmation_ok" msgid="7283108887345688413">"התחל"</string>
- <string name="battery_saver_start_action" msgid="7245333922937402896">"הפעל את \'חיסכון בסוללה\'"</string>
- <string name="battery_saver_confirmation_text" msgid="8417584516834617662">"כדי לעזור בהארכת חיי הסוללה, תכונת \'חיסכון בסוללה\' תצמצם את פעילות המכשיר.\n\nתכונת \'חיסכון בסוללה\' תושבת כשהמכשיר יחובר לחשמל."</string>
+ <!-- no translation found for battery_saver_confirmation_title (5299585433050361634) -->
+ <skip />
+ <!-- no translation found for battery_saver_confirmation_ok (7507968430447930257) -->
+ <skip />
+ <!-- no translation found for battery_saver_start_action (5576697451677486320) -->
+ <skip />
<string name="status_bar_settings_settings_button" msgid="3023889916699270224">"הגדרות"</string>
<string name="status_bar_settings_wifi_button" msgid="1733928151698311923">"Wi-Fi"</string>
<string name="status_bar_settings_airplane" msgid="4879879698500955300">"מצב טיסה"</string>
@@ -286,8 +288,10 @@
<item quantity="other" msgid="5408537517529822157">"למשך %d שעות"</item>
</plurals>
<string name="battery_saver_notification_title" msgid="237918726750955859">"תכונת \'חיסכון בסוללה\' פועלת"</string>
- <string name="battery_saver_notification_text" msgid="7796554871101546872">"פעילות המכשיר צומצמה."</string>
- <string name="battery_saver_notification_action_text" msgid="7546297220816993504">"פתח את ההגדרות של \'חיסכון בסוללה\'"</string>
+ <!-- no translation found for battery_saver_notification_text (820318788126672692) -->
+ <skip />
+ <!-- no translation found for battery_saver_notification_action_text (109158658238110382) -->
+ <skip />
<string name="battery_level_template" msgid="1609636980292580020">"<xliff:g id="LEVEL">%d</xliff:g>%%"</string>
<string name="notification_hidden_text" msgid="1135169301897151909">"התוכן מוסתר"</string>
<string name="media_projection_dialog_text" msgid="3071431025448218928">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> יתחיל להקליט את כל התוכן המוצג במסך שלך."</string>
diff --git a/packages/SystemUI/res/values-ja/strings.xml b/packages/SystemUI/res/values-ja/strings.xml
index 280e7ed0..3baf0c8 100644
--- a/packages/SystemUI/res/values-ja/strings.xml
+++ b/packages/SystemUI/res/values-ja/strings.xml
@@ -39,10 +39,12 @@
<string name="invalid_charger_title" msgid="3515740382572798460">"USB充電には対応していません。"</string>
<string name="invalid_charger_text" msgid="5474997287953892710">"専用の充電器のみを使用してください。"</string>
<string name="battery_low_why" msgid="4553600287639198111">"設定"</string>
- <string name="battery_saver_confirmation_title" msgid="5987726159603849352">"バッテリーセーバーを開始しますか?"</string>
- <string name="battery_saver_confirmation_ok" msgid="7283108887345688413">"開始"</string>
- <string name="battery_saver_start_action" msgid="7245333922937402896">"バッテリーセーバーを開始"</string>
- <string name="battery_saver_confirmation_text" msgid="8417584516834617662">"バッテリーを長持ちさせるため、バッテリーセーバーは端末のパフォーマンスを制限します。\n\n端末が電源に接続されているときはバッテリーセーバーが無効になります。"</string>
+ <!-- no translation found for battery_saver_confirmation_title (5299585433050361634) -->
+ <skip />
+ <!-- no translation found for battery_saver_confirmation_ok (7507968430447930257) -->
+ <skip />
+ <!-- no translation found for battery_saver_start_action (5576697451677486320) -->
+ <skip />
<string name="status_bar_settings_settings_button" msgid="3023889916699270224">"設定"</string>
<string name="status_bar_settings_wifi_button" msgid="1733928151698311923">"Wi-Fi"</string>
<string name="status_bar_settings_airplane" msgid="4879879698500955300">"機内モード"</string>
@@ -288,8 +290,10 @@
<item quantity="other" msgid="5408537517529822157">"%d時間"</item>
</plurals>
<string name="battery_saver_notification_title" msgid="237918726750955859">"バッテリーセーバーがON"</string>
- <string name="battery_saver_notification_text" msgid="7796554871101546872">"端末のパフォーマンスが制限されています。"</string>
- <string name="battery_saver_notification_action_text" msgid="7546297220816993504">"バッテリーセーバーの設定を開く"</string>
+ <!-- no translation found for battery_saver_notification_text (820318788126672692) -->
+ <skip />
+ <!-- no translation found for battery_saver_notification_action_text (109158658238110382) -->
+ <skip />
<string name="battery_level_template" msgid="1609636980292580020">"<xliff:g id="LEVEL">%d</xliff:g>%%"</string>
<string name="notification_hidden_text" msgid="1135169301897151909">"コンテンツが非表示"</string>
<string name="media_projection_dialog_text" msgid="3071431025448218928">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g>で、画面に表示されているコンテンツのキャプチャを開始します。"</string>
diff --git a/packages/SystemUI/res/values-ka-rGE/strings.xml b/packages/SystemUI/res/values-ka-rGE/strings.xml
index 4d6b11b..13421f9 100644
--- a/packages/SystemUI/res/values-ka-rGE/strings.xml
+++ b/packages/SystemUI/res/values-ka-rGE/strings.xml
@@ -39,10 +39,12 @@
<string name="invalid_charger_title" msgid="3515740382572798460">"USB დატენვა მხარდაჭერილი არ არის."</string>
<string name="invalid_charger_text" msgid="5474997287953892710">"გამოიყენეთ მხოლოდ მოყოლილი დამტენი."</string>
<string name="battery_low_why" msgid="4553600287639198111">"პარამეტრები"</string>
- <string name="battery_saver_confirmation_title" msgid="5987726159603849352">"გსურთ ბატარეის დამზოგის დაწყება?"</string>
- <string name="battery_saver_confirmation_ok" msgid="7283108887345688413">"დაწყება"</string>
- <string name="battery_saver_start_action" msgid="7245333922937402896">"ბატარეის დამზოგის დაწყება"</string>
- <string name="battery_saver_confirmation_text" msgid="8417584516834617662">"ბატარეის მოქმედების გასახანგრძლივებლად ბატარეის დამზოგი შეამცირებს თქვენი მოწყობილობის წარმადობას.\n\nბატარეის დამზოგი გამოირთვება, როდესაც მოწყობილობას ელკვებაზე მიაერთებთ."</string>
+ <!-- no translation found for battery_saver_confirmation_title (5299585433050361634) -->
+ <skip />
+ <!-- no translation found for battery_saver_confirmation_ok (7507968430447930257) -->
+ <skip />
+ <!-- no translation found for battery_saver_start_action (5576697451677486320) -->
+ <skip />
<string name="status_bar_settings_settings_button" msgid="3023889916699270224">"პარამეტრები"</string>
<string name="status_bar_settings_wifi_button" msgid="1733928151698311923">"Wi-Fi"</string>
<string name="status_bar_settings_airplane" msgid="4879879698500955300">"თვითმფრინავის რეჟიმი"</string>
@@ -150,7 +152,7 @@
<string name="accessibility_tty_enabled" msgid="4613200365379426561">"ტელეტაიპი ჩართულია."</string>
<string name="accessibility_ringer_vibrate" msgid="666585363364155055">"ვიბრაციის რეჟიმი."</string>
<string name="accessibility_ringer_silent" msgid="9061243307939135383">"უხმო რეჟიმი."</string>
- <string name="accessibility_recents_item_will_be_dismissed" msgid="395770242498031481">"<xliff:g id="APP">%s</xliff:g>-ის გაშვება."</string>
+ <string name="accessibility_recents_item_will_be_dismissed" msgid="395770242498031481">"<xliff:g id="APP">%s</xliff:g>-ის უგულებელყოფა."</string>
<string name="accessibility_recents_item_dismissed" msgid="6803574935084867070">"<xliff:g id="APP">%s</xliff:g> ამოშლილია სიიდან."</string>
<string name="accessibility_recents_item_launched" msgid="7616039892382525203">"<xliff:g id="APP">%s</xliff:g> იწყება."</string>
<string name="accessibility_notification_dismissed" msgid="854211387186306927">"შეტყობინება წაიშალა."</string>
@@ -286,8 +288,10 @@
<item quantity="other" msgid="5408537517529822157">"%d საათით"</item>
</plurals>
<string name="battery_saver_notification_title" msgid="237918726750955859">"ბატარეის დამზოგი ჩართულია"</string>
- <string name="battery_saver_notification_text" msgid="7796554871101546872">"მოწყობილობის წარმადობა შემცირებულია."</string>
- <string name="battery_saver_notification_action_text" msgid="7546297220816993504">"ბატარეის დამზოგის პარამეტრების გახსნა"</string>
+ <!-- no translation found for battery_saver_notification_text (820318788126672692) -->
+ <skip />
+ <!-- no translation found for battery_saver_notification_action_text (109158658238110382) -->
+ <skip />
<string name="battery_level_template" msgid="1609636980292580020">"<xliff:g id="LEVEL">%d</xliff:g>%%"</string>
<string name="notification_hidden_text" msgid="1135169301897151909">"შიგთავსი დამალულია"</string>
<string name="media_projection_dialog_text" msgid="3071431025448218928">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> დაიწყებს იმ ყველაფრის აღბეჭდვას, რაც თქვენს ეკრანზე ჩანს."</string>
diff --git a/packages/SystemUI/res/values-kk-rKZ/strings.xml b/packages/SystemUI/res/values-kk-rKZ/strings.xml
index ad7a5ad..edbd25f 100644
--- a/packages/SystemUI/res/values-kk-rKZ/strings.xml
+++ b/packages/SystemUI/res/values-kk-rKZ/strings.xml
@@ -39,10 +39,12 @@
<string name="invalid_charger_title" msgid="3515740382572798460">"USB арқылы зарядтауға қолдау көрсетілмейді."</string>
<string name="invalid_charger_text" msgid="5474997287953892710">"Тек жинақтағы зарядтағышты пайдаланыңыз."</string>
<string name="battery_low_why" msgid="4553600287639198111">"Параметрлер"</string>
- <string name="battery_saver_confirmation_title" msgid="5987726159603849352">"Батарея үнемдегішті іске қосу керек пе?"</string>
- <string name="battery_saver_confirmation_ok" msgid="7283108887345688413">"Бастау"</string>
- <string name="battery_saver_start_action" msgid="7245333922937402896">"Батарея үнемдегішті іске қосу"</string>
- <string name="battery_saver_confirmation_text" msgid="8417584516834617662">"Батареяның жарамды мерзімін жақсартуға көмектесу үшін батарея үнемдегіш құрылғының өнімділігін азайтады.\n\nБатарея үнемдегіш құрылғыңыз розеткаға қосылған болса өшеді."</string>
+ <!-- no translation found for battery_saver_confirmation_title (5299585433050361634) -->
+ <skip />
+ <!-- no translation found for battery_saver_confirmation_ok (7507968430447930257) -->
+ <skip />
+ <!-- no translation found for battery_saver_start_action (5576697451677486320) -->
+ <skip />
<string name="status_bar_settings_settings_button" msgid="3023889916699270224">"Параметрлер"</string>
<string name="status_bar_settings_wifi_button" msgid="1733928151698311923">"Wi-Fi"</string>
<string name="status_bar_settings_airplane" msgid="4879879698500955300">"Ұшақ режимі"</string>
@@ -286,8 +288,10 @@
<item quantity="other" msgid="5408537517529822157">"%d сағат бойы"</item>
</plurals>
<string name="battery_saver_notification_title" msgid="237918726750955859">"Батарея үнемдегіш қосулы"</string>
- <string name="battery_saver_notification_text" msgid="7796554871101546872">"Құрылғы өнімділігі азайды."</string>
- <string name="battery_saver_notification_action_text" msgid="7546297220816993504">"Батарея үнемдегіш параметрлерін ашу"</string>
+ <!-- no translation found for battery_saver_notification_text (820318788126672692) -->
+ <skip />
+ <!-- no translation found for battery_saver_notification_action_text (109158658238110382) -->
+ <skip />
<string name="battery_level_template" msgid="1609636980292580020">"<xliff:g id="LEVEL">%d</xliff:g>%%"</string>
<string name="notification_hidden_text" msgid="1135169301897151909">"Мазмұн жасырылған"</string>
<string name="media_projection_dialog_text" msgid="3071431025448218928">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> экранда көрсетілгеннің барлығын түсіре бастайды."</string>
diff --git a/packages/SystemUI/res/values-km-rKH/strings.xml b/packages/SystemUI/res/values-km-rKH/strings.xml
index 1b72d10..ac210d4 100644
--- a/packages/SystemUI/res/values-km-rKH/strings.xml
+++ b/packages/SystemUI/res/values-km-rKH/strings.xml
@@ -39,10 +39,12 @@
<string name="invalid_charger_title" msgid="3515740382572798460">"មិនគាំទ្រការបញ្ចូលថ្មតាមយូអេសប៊ីទេ។"</string>
<string name="invalid_charger_text" msgid="5474997287953892710">"ប្រើតែឧបករណ៍បញ្ចូលថ្មដែលបានផ្ដល់ឲ្យ។"</string>
<string name="battery_low_why" msgid="4553600287639198111">"ការកំណត់"</string>
- <string name="battery_saver_confirmation_title" msgid="5987726159603849352">"ចាប់ផ្ដើមកម្មវិធីសន្សំថ្ម?"</string>
- <string name="battery_saver_confirmation_ok" msgid="7283108887345688413">"ចាប់ផ្ដើម"</string>
- <string name="battery_saver_start_action" msgid="7245333922937402896">"ចាប់ផ្ដើមកម្មវិធីសន្សំថ្ម"</string>
- <string name="battery_saver_confirmation_text" msgid="8417584516834617662">"ដើម្បីជួយបង្កើនអាយុកាលថ្ម កម្មវិធីសន្សំថ្មនឹងកាត់បន្ថយការអនុវត្តនៃឧបករណ៍របស់អ្នក។\n\nកម្មវិធីសន្សំថ្មនឹងបិទនៅពេលឧបករណ៍របស់អ្នកត្រូវបានដោតបញ្ចូលថ្ម។"</string>
+ <!-- no translation found for battery_saver_confirmation_title (5299585433050361634) -->
+ <skip />
+ <!-- no translation found for battery_saver_confirmation_ok (7507968430447930257) -->
+ <skip />
+ <!-- no translation found for battery_saver_start_action (5576697451677486320) -->
+ <skip />
<string name="status_bar_settings_settings_button" msgid="3023889916699270224">"ការកំណត់"</string>
<string name="status_bar_settings_wifi_button" msgid="1733928151698311923">"វ៉ាយហ្វាយ"</string>
<string name="status_bar_settings_airplane" msgid="4879879698500955300">"ពេលជិះយន្តហោះ"</string>
@@ -286,8 +288,10 @@
<item quantity="other" msgid="5408537517529822157">"សម្រាប់ %d ម៉ោង"</item>
</plurals>
<string name="battery_saver_notification_title" msgid="237918726750955859">"កម្មវិធីសន្សំថ្មគឺបើក"</string>
- <string name="battery_saver_notification_text" msgid="7796554871101546872">"ការអនុវត្តឧបករណ៍ត្រូវបានកាត់បន្ថយ។"</string>
- <string name="battery_saver_notification_action_text" msgid="7546297220816993504">"បើកការកំណត់កម្មវិធីសន្សំថ្ម"</string>
+ <!-- no translation found for battery_saver_notification_text (820318788126672692) -->
+ <skip />
+ <!-- no translation found for battery_saver_notification_action_text (109158658238110382) -->
+ <skip />
<string name="battery_level_template" msgid="1609636980292580020">"<xliff:g id="LEVEL">%d</xliff:g>%%"</string>
<string name="notification_hidden_text" msgid="1135169301897151909">"បានលាក់មាតិកា"</string>
<string name="media_projection_dialog_text" msgid="3071431025448218928">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> នឹងចាប់ផ្ដើមចាប់យកអ្វីៗគ្រប់យ៉ាងដែលបង្ហាញលើអេក្រង់របស់អ្នក។"</string>
diff --git a/packages/SystemUI/res/values-kn-rIN/strings.xml b/packages/SystemUI/res/values-kn-rIN/strings.xml
index 7d59e39..f86779e 100644
--- a/packages/SystemUI/res/values-kn-rIN/strings.xml
+++ b/packages/SystemUI/res/values-kn-rIN/strings.xml
@@ -39,10 +39,12 @@
<string name="invalid_charger_title" msgid="3515740382572798460">"USB ಚಾರ್ಜಿಂಗ್ ಬೆಂಬಲಿತವಾಗಿಲ್ಲ."</string>
<string name="invalid_charger_text" msgid="5474997287953892710">"ಒದಗಿಸಿರುವ ಚಾರ್ಜರ್ ಮಾತ್ರ ಬಳಸಿ."</string>
<string name="battery_low_why" msgid="4553600287639198111">"ಸೆಟ್ಟಿಂಗ್ಗಳು"</string>
- <string name="battery_saver_confirmation_title" msgid="5987726159603849352">"ಬ್ಯಾಟರಿ ರಕ್ಷಕ ಪ್ರಾರಂಭಿಸುವುದೇ?"</string>
- <string name="battery_saver_confirmation_ok" msgid="7283108887345688413">"ಪ್ರಾರಂಭಿಸು"</string>
- <string name="battery_saver_start_action" msgid="7245333922937402896">"ಬ್ಯಾಟರಿ ರಕ್ಷಕವನ್ನು ಪ್ರಾರಂಭಿಸಿ"</string>
- <string name="battery_saver_confirmation_text" msgid="8417584516834617662">"ಬ್ಯಾಟರಿ ಬಾಳಿಕೆಯನ್ನು ಸುಧಾರಿಸಲು, ಬ್ಯಾಟರಿ ರಕ್ಷಕ ನಿಮ್ಮ ಸಾಧನದ ಕಾರ್ಯಕ್ಷಮತೆಯನ್ನು ಕಡಿಮೆಗೊಳಿಸುತ್ತದೆ.\n\nನಿಮ್ಮ ಸಾಧನವನ್ನು ಪ್ಲಗ್ ಇನ್ ಮಾಡಿದಾಗ ಬ್ಯಾಟರಿ ರಕ್ಷಕ ನಿಷ್ಕ್ರಿಯಗೊಳ್ಳುತ್ತದೆ."</string>
+ <!-- no translation found for battery_saver_confirmation_title (5299585433050361634) -->
+ <skip />
+ <!-- no translation found for battery_saver_confirmation_ok (7507968430447930257) -->
+ <skip />
+ <!-- no translation found for battery_saver_start_action (5576697451677486320) -->
+ <skip />
<string name="status_bar_settings_settings_button" msgid="3023889916699270224">"ಸೆಟ್ಟಿಂಗ್ಗಳು"</string>
<string name="status_bar_settings_wifi_button" msgid="1733928151698311923">"Wi-Fi"</string>
<string name="status_bar_settings_airplane" msgid="4879879698500955300">"ಏರ್ಪ್ಲೇನ್ ಮೋಡ್"</string>
@@ -286,8 +288,10 @@
<item quantity="other" msgid="5408537517529822157">"%d ಗಂಟೆಗಳವರೆಗೆ"</item>
</plurals>
<string name="battery_saver_notification_title" msgid="237918726750955859">"ಬ್ಯಾಟರಿ ರಕ್ಷಕ ಆನ್ ಆಗಿದೆ"</string>
- <string name="battery_saver_notification_text" msgid="7796554871101546872">"ಸಾಧನದ ಕಾರ್ಯಕ್ಷಮತೆ ಕಡಿಮೆಯಾಗಿದೆ."</string>
- <string name="battery_saver_notification_action_text" msgid="7546297220816993504">"ಬ್ಯಾಟರಿ ರಕ್ಷಕದ ಸೆಟ್ಟಿಂಗ್ಗಳನ್ನು ತೆರೆಯಿರಿ"</string>
+ <!-- no translation found for battery_saver_notification_text (820318788126672692) -->
+ <skip />
+ <!-- no translation found for battery_saver_notification_action_text (109158658238110382) -->
+ <skip />
<string name="battery_level_template" msgid="1609636980292580020">"<xliff:g id="LEVEL">%d</xliff:g>%%"</string>
<string name="notification_hidden_text" msgid="1135169301897151909">"ವಿಷಯಗಳನ್ನು ಮರೆಮಾಡಲಾಗಿದೆ"</string>
<string name="media_projection_dialog_text" msgid="3071431025448218928">"ನಿಮ್ಮ ಪರದೆಯ ಮೇಲೆ ಪ್ರದರ್ಶಿಸಲಾಗುವ ಎಲ್ಲವನ್ನೂ <xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> ಯು ಸೆರೆಹಿಡಿಯಲು ಪ್ರಾರಂಭಿಸುತ್ತದೆ."</string>
diff --git a/packages/SystemUI/res/values-ko/strings.xml b/packages/SystemUI/res/values-ko/strings.xml
index 90fbfe9..a4e6712 100644
--- a/packages/SystemUI/res/values-ko/strings.xml
+++ b/packages/SystemUI/res/values-ko/strings.xml
@@ -41,10 +41,12 @@
<string name="invalid_charger_title" msgid="3515740382572798460">"USB 충전은 지원되지 않습니다."</string>
<string name="invalid_charger_text" msgid="5474997287953892710">"제공된 충전기만 사용하세요."</string>
<string name="battery_low_why" msgid="4553600287639198111">"설정"</string>
- <string name="battery_saver_confirmation_title" msgid="5987726159603849352">"배터리 세이버를 시작할까요?"</string>
- <string name="battery_saver_confirmation_ok" msgid="7283108887345688413">"시작"</string>
- <string name="battery_saver_start_action" msgid="7245333922937402896">"배터리 세이버 시작"</string>
- <string name="battery_saver_confirmation_text" msgid="8417584516834617662">"배터리 세이버는 기기의 성능을 저하시켜 배터리 수명을 늘립니다.\n\n기기에 전원이 연결되면 배터리 세이버는 사용 중지됩니다."</string>
+ <!-- no translation found for battery_saver_confirmation_title (5299585433050361634) -->
+ <skip />
+ <!-- no translation found for battery_saver_confirmation_ok (7507968430447930257) -->
+ <skip />
+ <!-- no translation found for battery_saver_start_action (5576697451677486320) -->
+ <skip />
<string name="status_bar_settings_settings_button" msgid="3023889916699270224">"설정"</string>
<string name="status_bar_settings_wifi_button" msgid="1733928151698311923">"Wi-Fi"</string>
<string name="status_bar_settings_airplane" msgid="4879879698500955300">"비행기 모드"</string>
@@ -75,7 +77,7 @@
<string name="screenshot_saved_title" msgid="6461865960961414961">"캡쳐화면 저장됨"</string>
<string name="screenshot_saved_text" msgid="1152839647677558815">"캡쳐화면을 보려면 터치하세요."</string>
<string name="screenshot_failed_title" msgid="705781116746922771">"캡쳐화면을 캡쳐하지 못했습니다."</string>
- <string name="screenshot_failed_text" msgid="1260203058661337274">"저장 공간이 부족하거나 앱 또는 소속 조직에서 허용하지 않기 때문에 스크린샷을 찍을 수 없습니다."</string>
+ <string name="screenshot_failed_text" msgid="1260203058661337274">"저장 공간이 부족하거나 앱 또는 소속 조직에서 허용하지 않아 스크린샷을 찍을 수 없습니다."</string>
<string name="usb_preference_title" msgid="6551050377388882787">"USB 파일 전송 옵션"</string>
<string name="use_mtp_button_title" msgid="4333504413563023626">"미디어 플레이어로 마운트(MTP)"</string>
<string name="use_ptp_button_title" msgid="7517127540301625751">"카메라로 마운트(PTP)"</string>
@@ -288,8 +290,10 @@
<item quantity="other" msgid="5408537517529822157">"%d시간 동안"</item>
</plurals>
<string name="battery_saver_notification_title" msgid="237918726750955859">"배터리 세이버 사용 중"</string>
- <string name="battery_saver_notification_text" msgid="7796554871101546872">"기기의 성능이 저하됩니다."</string>
- <string name="battery_saver_notification_action_text" msgid="7546297220816993504">"배터리 세이버 설정 열기"</string>
+ <!-- no translation found for battery_saver_notification_text (820318788126672692) -->
+ <skip />
+ <!-- no translation found for battery_saver_notification_action_text (109158658238110382) -->
+ <skip />
<string name="battery_level_template" msgid="1609636980292580020">"<xliff:g id="LEVEL">%d</xliff:g>%%"</string>
<string name="notification_hidden_text" msgid="1135169301897151909">"숨겨진 콘텐츠"</string>
<string name="media_projection_dialog_text" msgid="3071431025448218928">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g>에서 화면에 표시된 모든 것을 캡처하기 시작합니다."</string>
diff --git a/packages/SystemUI/res/values-ky-rKG/strings.xml b/packages/SystemUI/res/values-ky-rKG/strings.xml
index 8bb2cab..d726e24 100644
--- a/packages/SystemUI/res/values-ky-rKG/strings.xml
+++ b/packages/SystemUI/res/values-ky-rKG/strings.xml
@@ -46,10 +46,12 @@
<string name="invalid_charger_title" msgid="3515740382572798460">"USB аркылуу кубаттоого болбойт."</string>
<string name="invalid_charger_text" msgid="5474997287953892710">"Коштолгон кубаттагычты гана колдонуңуз."</string>
<string name="battery_low_why" msgid="4553600287639198111">"Жөндөөлөр"</string>
- <string name="battery_saver_confirmation_title" msgid="5987726159603849352">"Батареяны үнөмдөгүч иштетилсинби?"</string>
- <string name="battery_saver_confirmation_ok" msgid="7283108887345688413">"Баштоо"</string>
- <string name="battery_saver_start_action" msgid="7245333922937402896">"Батареяны үнөмдөгүчтү иштетүү"</string>
- <string name="battery_saver_confirmation_text" msgid="8417584516834617662">"Батареяны үнөмдөгүч түзмөгүңүздүн иштешин солгундатып, батареянын кубатын узартат.\n\nТүзмөктү кубаттагычка сайганда, батареяны үнөмдөгүч өчүп калат."</string>
+ <!-- no translation found for battery_saver_confirmation_title (5299585433050361634) -->
+ <skip />
+ <!-- no translation found for battery_saver_confirmation_ok (7507968430447930257) -->
+ <skip />
+ <!-- no translation found for battery_saver_start_action (5576697451677486320) -->
+ <skip />
<!-- no translation found for status_bar_settings_settings_button (3023889916699270224) -->
<skip />
<!-- no translation found for status_bar_settings_wifi_button (1733928151698311923) -->
@@ -312,8 +314,10 @@
<item quantity="other" msgid="5408537517529822157">"%d саатка"</item>
</plurals>
<string name="battery_saver_notification_title" msgid="237918726750955859">"Батареяны үнөмдөгүч күйгүзүлдү"</string>
- <string name="battery_saver_notification_text" msgid="7796554871101546872">"Түзмөктүн иштеши солгундады."</string>
- <string name="battery_saver_notification_action_text" msgid="7546297220816993504">"Батареяны үнөмдөгүчтүн жөндөөлөрүн ачуу"</string>
+ <!-- no translation found for battery_saver_notification_text (820318788126672692) -->
+ <skip />
+ <!-- no translation found for battery_saver_notification_action_text (109158658238110382) -->
+ <skip />
<string name="battery_level_template" msgid="1609636980292580020">"<xliff:g id="LEVEL">%d</xliff:g>%%"</string>
<string name="notification_hidden_text" msgid="1135169301897151909">"Мазмундар жашырылган"</string>
<string name="media_projection_dialog_text" msgid="3071431025448218928">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> экранга чыккан нерсенин баарын сүрөткө тарта баштайт."</string>
diff --git a/packages/SystemUI/res/values-lo-rLA/strings.xml b/packages/SystemUI/res/values-lo-rLA/strings.xml
index a3dac98..5950d8d 100644
--- a/packages/SystemUI/res/values-lo-rLA/strings.xml
+++ b/packages/SystemUI/res/values-lo-rLA/strings.xml
@@ -39,10 +39,12 @@
<string name="invalid_charger_title" msgid="3515740382572798460">"ບໍ່ຮອງຮັບການສາກຜ່ານ USB."</string>
<string name="invalid_charger_text" msgid="5474997287953892710">"ໃຊ້ສະເພາະສາຍສາກທີ່ມາກັບເຄື່ອງ."</string>
<string name="battery_low_why" msgid="4553600287639198111">"ການຕັ້ງຄ່າ"</string>
- <string name="battery_saver_confirmation_title" msgid="5987726159603849352">"ເລີ່ມໂຕປະຢັດແບັດເຕີຣີບໍ?"</string>
- <string name="battery_saver_confirmation_ok" msgid="7283108887345688413">"ເລີ່ມ"</string>
- <string name="battery_saver_start_action" msgid="7245333922937402896">"ເລີ່ມໂຕປະຢັດແບັດເຕີຣີ"</string>
- <string name="battery_saver_confirmation_text" msgid="8417584516834617662">"ເພື່ອຊ່ວຍຢືດອາຍຸແບັດເຕີຣີ, ໂຕປະຢັດແບັດເຕີຣີຈະຫຼຸດປະສິດທິພາບຂອງອຸປະກອນທ່ານລົງ.\n\nໂຕປະຢັດແບັດເຕີຣີຈະຖືກປິດການນຳໃຊ້ໂດຍອັດຕະໂນມັດເມື່ອທ່ານສຽບສາຍສາກອຸປະກອນຂອງທ່ານ."</string>
+ <!-- no translation found for battery_saver_confirmation_title (5299585433050361634) -->
+ <skip />
+ <!-- no translation found for battery_saver_confirmation_ok (7507968430447930257) -->
+ <skip />
+ <!-- no translation found for battery_saver_start_action (5576697451677486320) -->
+ <skip />
<string name="status_bar_settings_settings_button" msgid="3023889916699270224">"ການຕັ້ງຄ່າ"</string>
<string name="status_bar_settings_wifi_button" msgid="1733928151698311923">"Wi-Fi"</string>
<string name="status_bar_settings_airplane" msgid="4879879698500955300">"ໂໝດເທິງຍົນ"</string>
@@ -286,8 +288,10 @@
<item quantity="other" msgid="5408537517529822157">"ເປັນເວລາ %d ຊົ່ວໂມງ"</item>
</plurals>
<string name="battery_saver_notification_title" msgid="237918726750955859">"ເປີດໃຊ້ໂຕປະຢັດແບັດເຕີຣີແລ້ວ"</string>
- <string name="battery_saver_notification_text" msgid="7796554871101546872">"ປະສິດທິພາບຂອງອຸປະກອນຖືກຫຼຸດລົງແລ້ວ."</string>
- <string name="battery_saver_notification_action_text" msgid="7546297220816993504">"ເປີດການຕັ້ງຄ່າໂຕປະຢັດແບັດເຕີຣີ"</string>
+ <!-- no translation found for battery_saver_notification_text (820318788126672692) -->
+ <skip />
+ <!-- no translation found for battery_saver_notification_action_text (109158658238110382) -->
+ <skip />
<string name="battery_level_template" msgid="1609636980292580020">"<xliff:g id="LEVEL">%d</xliff:g>%%"</string>
<string name="notification_hidden_text" msgid="1135169301897151909">"ເນື້ອຫາຖືກເຊື່ອງແລ້ວ"</string>
<string name="media_projection_dialog_text" msgid="3071431025448218928">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> ຈະເລີ່ມບັນທຶກທຸກຢ່າງທີ່ສະແດງຜົນໃນໜ້າຈໍທ່ານ."</string>
diff --git a/packages/SystemUI/res/values-lt/strings.xml b/packages/SystemUI/res/values-lt/strings.xml
index b88cdf9..c39b885 100644
--- a/packages/SystemUI/res/values-lt/strings.xml
+++ b/packages/SystemUI/res/values-lt/strings.xml
@@ -39,10 +39,12 @@
<string name="invalid_charger_title" msgid="3515740382572798460">"USB įkrovimas nepalaikomas."</string>
<string name="invalid_charger_text" msgid="5474997287953892710">"Naudokite tik pateiktą kroviklį."</string>
<string name="battery_low_why" msgid="4553600287639198111">"Nustatymai"</string>
- <string name="battery_saver_confirmation_title" msgid="5987726159603849352">"Paleisti akumuliatoriaus tausojimo priemonę?"</string>
- <string name="battery_saver_confirmation_ok" msgid="7283108887345688413">"Paleisti"</string>
- <string name="battery_saver_start_action" msgid="7245333922937402896">"Paleisti akumuliatoriaus tausojimo priemonę"</string>
- <string name="battery_saver_confirmation_text" msgid="8417584516834617662">"Kad padėtų pailginti akumuliatoriaus naudojimo trukmę, akumuliatoriaus tausojimo priemonė sumažins įrenginio našumą.\n\nAkumuliatoriaus tausojimo priemonė bus išjungta, kai įrenginys bus prijungtas prie maitinimo šaltinio."</string>
+ <!-- no translation found for battery_saver_confirmation_title (5299585433050361634) -->
+ <skip />
+ <!-- no translation found for battery_saver_confirmation_ok (7507968430447930257) -->
+ <skip />
+ <!-- no translation found for battery_saver_start_action (5576697451677486320) -->
+ <skip />
<string name="status_bar_settings_settings_button" msgid="3023889916699270224">"Nustatymai"</string>
<string name="status_bar_settings_wifi_button" msgid="1733928151698311923">"Wi-Fi"</string>
<string name="status_bar_settings_airplane" msgid="4879879698500955300">"Lėktuvo režimas"</string>
@@ -286,8 +288,10 @@
<item quantity="other" msgid="5408537517529822157">"%d val."</item>
</plurals>
<string name="battery_saver_notification_title" msgid="237918726750955859">"Akumuliatoriaus tausojimo priemonė įjungta"</string>
- <string name="battery_saver_notification_text" msgid="7796554871101546872">"Įrenginio našumas sumažintas."</string>
- <string name="battery_saver_notification_action_text" msgid="7546297220816993504">"Atidaryti akumuliatoriaus tausojimo priemonės nustatymus"</string>
+ <!-- no translation found for battery_saver_notification_text (820318788126672692) -->
+ <skip />
+ <!-- no translation found for battery_saver_notification_action_text (109158658238110382) -->
+ <skip />
<string name="battery_level_template" msgid="1609636980292580020">"<xliff:g id="LEVEL">%d</xliff:g> %%"</string>
<string name="notification_hidden_text" msgid="1135169301897151909">"Turinys paslėptas"</string>
<string name="media_projection_dialog_text" msgid="3071431025448218928">"„<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g>“ pradės fiksuoti viską, kas rodoma jūsų ekrane."</string>
diff --git a/packages/SystemUI/res/values-lv/strings.xml b/packages/SystemUI/res/values-lv/strings.xml
index 93c9812..0a52f23 100644
--- a/packages/SystemUI/res/values-lv/strings.xml
+++ b/packages/SystemUI/res/values-lv/strings.xml
@@ -39,10 +39,12 @@
<string name="invalid_charger_title" msgid="3515740382572798460">"USB uzlāde netiek atbalstīta."</string>
<string name="invalid_charger_text" msgid="5474997287953892710">"Izmantojiet tikai komplektā iekļauto lādētāju."</string>
<string name="battery_low_why" msgid="4553600287639198111">"Iestatījumi"</string>
- <string name="battery_saver_confirmation_title" msgid="5987726159603849352">"Vai ieslēgt akumulatora enerģijas taupīšanas režīmu?"</string>
- <string name="battery_saver_confirmation_ok" msgid="7283108887345688413">"Ieslēgt"</string>
- <string name="battery_saver_start_action" msgid="7245333922937402896">"Ieslēgt akumulatora enerģijas taupīšanas režīmu"</string>
- <string name="battery_saver_confirmation_text" msgid="8417584516834617662">"Lai paildzinātu akumulatora darbības laiku, akumulatora enerģijas taupīšanas režīmā tiks pazemināta ierīces veiktspēja.\n\nAkumulatora enerģijas taupīšanas režīms tiks atspējots, kad ierīce tiks pievienota uzlādes avotam."</string>
+ <!-- no translation found for battery_saver_confirmation_title (5299585433050361634) -->
+ <skip />
+ <!-- no translation found for battery_saver_confirmation_ok (7507968430447930257) -->
+ <skip />
+ <!-- no translation found for battery_saver_start_action (5576697451677486320) -->
+ <skip />
<string name="status_bar_settings_settings_button" msgid="3023889916699270224">"Iestatījumi"</string>
<string name="status_bar_settings_wifi_button" msgid="1733928151698311923">"Wi-Fi"</string>
<string name="status_bar_settings_airplane" msgid="4879879698500955300">"Lidmašīnas režīms"</string>
@@ -286,8 +288,10 @@
<item quantity="other" msgid="5408537517529822157">"%d h"</item>
</plurals>
<string name="battery_saver_notification_title" msgid="237918726750955859">"Ieslēgts akumulatora enerģijas taupīšanas režīms"</string>
- <string name="battery_saver_notification_text" msgid="7796554871101546872">"Ierīces veiktspēja ir pazemināta."</string>
- <string name="battery_saver_notification_action_text" msgid="7546297220816993504">"Atvērt akumulatora enerģijas taupīšanas režīma iestatījumus"</string>
+ <!-- no translation found for battery_saver_notification_text (820318788126672692) -->
+ <skip />
+ <!-- no translation found for battery_saver_notification_action_text (109158658238110382) -->
+ <skip />
<string name="battery_level_template" msgid="1609636980292580020">"<xliff:g id="LEVEL">%d</xliff:g>%%"</string>
<string name="notification_hidden_text" msgid="1135169301897151909">"Saturs paslēpts"</string>
<string name="media_projection_dialog_text" msgid="3071431025448218928">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> sāks uzņemt visu, kas tiks rādīts jūsu ekrānā."</string>
diff --git a/packages/SystemUI/res/values-mk-rMK/strings.xml b/packages/SystemUI/res/values-mk-rMK/strings.xml
index 83302fd..03e665f 100644
--- a/packages/SystemUI/res/values-mk-rMK/strings.xml
+++ b/packages/SystemUI/res/values-mk-rMK/strings.xml
@@ -39,10 +39,12 @@
<string name="invalid_charger_title" msgid="3515740382572798460">"Полнењето преку УСБ не е поддржано."</string>
<string name="invalid_charger_text" msgid="5474997287953892710">"Користете го само доставениот полнач."</string>
<string name="battery_low_why" msgid="4553600287639198111">"Поставки"</string>
- <string name="battery_saver_confirmation_title" msgid="5987726159603849352">"Да се активира штедачот на батерија?"</string>
- <string name="battery_saver_confirmation_ok" msgid="7283108887345688413">"Започни"</string>
- <string name="battery_saver_start_action" msgid="7245333922937402896">"Активирајте го штедачот на батерија"</string>
- <string name="battery_saver_confirmation_text" msgid="8417584516834617662">"За да се подобри животот на батеријата, Штедачот на батерија ќе ја намали изведбата на вашиот уред.\n\nТој ќе се оневозможи кога уредот ќе се приклучи на полнење."</string>
+ <!-- no translation found for battery_saver_confirmation_title (5299585433050361634) -->
+ <skip />
+ <!-- no translation found for battery_saver_confirmation_ok (7507968430447930257) -->
+ <skip />
+ <!-- no translation found for battery_saver_start_action (5576697451677486320) -->
+ <skip />
<string name="status_bar_settings_settings_button" msgid="3023889916699270224">"Подесувања"</string>
<string name="status_bar_settings_wifi_button" msgid="1733928151698311923">"Wi-Fi"</string>
<string name="status_bar_settings_airplane" msgid="4879879698500955300">"Режим на работа во авион"</string>
@@ -288,8 +290,10 @@
<item quantity="other" msgid="5408537517529822157">"За %d часа"</item>
</plurals>
<string name="battery_saver_notification_title" msgid="237918726750955859">"Штедачот на батерија е вклучен"</string>
- <string name="battery_saver_notification_text" msgid="7796554871101546872">"Изведбата на уредот е намалена."</string>
- <string name="battery_saver_notification_action_text" msgid="7546297220816993504">"Отвори ги поставките за штедачот на батерија"</string>
+ <!-- no translation found for battery_saver_notification_text (820318788126672692) -->
+ <skip />
+ <!-- no translation found for battery_saver_notification_action_text (109158658238110382) -->
+ <skip />
<string name="battery_level_template" msgid="1609636980292580020">"<xliff:g id="LEVEL">%d</xliff:g>%%"</string>
<string name="notification_hidden_text" msgid="1135169301897151909">"Содржините се скриени"</string>
<string name="media_projection_dialog_text" msgid="3071431025448218928">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> ќе започне да презема сѐ што се прикажува на вашиот екран."</string>
diff --git a/packages/SystemUI/res/values-ml-rIN/strings.xml b/packages/SystemUI/res/values-ml-rIN/strings.xml
index 87aedfa..f87238f 100644
--- a/packages/SystemUI/res/values-ml-rIN/strings.xml
+++ b/packages/SystemUI/res/values-ml-rIN/strings.xml
@@ -39,10 +39,12 @@
<string name="invalid_charger_title" msgid="3515740382572798460">"USB ചാർജ്ജുചെയ്യൽ പിന്തുണച്ചില്ല."</string>
<string name="invalid_charger_text" msgid="5474997287953892710">"വിതരണം ചെയ്ത ചാർജ്ജർ മാത്രം ഉപയോഗിക്കുക."</string>
<string name="battery_low_why" msgid="4553600287639198111">"ക്രമീകരണങ്ങൾ"</string>
- <string name="battery_saver_confirmation_title" msgid="5987726159603849352">"ബാറ്ററി സേവർ ആരംഭിക്കണോ?"</string>
- <string name="battery_saver_confirmation_ok" msgid="7283108887345688413">"ആരംഭിക്കുക"</string>
- <string name="battery_saver_start_action" msgid="7245333922937402896">"ബാറ്ററി സേവർ ആരംഭിക്കുക"</string>
- <string name="battery_saver_confirmation_text" msgid="8417584516834617662">"ബാറ്ററി ആയുസ്സ് മെച്ചപ്പെടുത്താൻ സഹായിക്കുന്നതിന്, നിങ്ങളുടെ ഉപകരണത്തിന്റെ പ്രകടനത്തെ ബാറ്ററി സേവർ കുറയ്ക്കും.\n\nനിങ്ങളുടെ ഉപകരണം പ്ലഗ് ഇൻ ചെയ്തിരിക്കുമ്പോൾ ബാറ്ററി സേവർ അത് പ്രവർത്തനരഹിതമാക്കും."</string>
+ <!-- no translation found for battery_saver_confirmation_title (5299585433050361634) -->
+ <skip />
+ <!-- no translation found for battery_saver_confirmation_ok (7507968430447930257) -->
+ <skip />
+ <!-- no translation found for battery_saver_start_action (5576697451677486320) -->
+ <skip />
<string name="status_bar_settings_settings_button" msgid="3023889916699270224">"ക്രമീകരണങ്ങൾ"</string>
<string name="status_bar_settings_wifi_button" msgid="1733928151698311923">"Wi-Fi"</string>
<string name="status_bar_settings_airplane" msgid="4879879698500955300">"വിമാന മോഡ്"</string>
@@ -286,8 +288,10 @@
<item quantity="other" msgid="5408537517529822157">"%d മണിക്കൂർ ദൈർഘ്യം"</item>
</plurals>
<string name="battery_saver_notification_title" msgid="237918726750955859">"ബാറ്ററി സേവർ ഓണാണ്"</string>
- <string name="battery_saver_notification_text" msgid="7796554871101546872">"ഉപകരണത്തിന്റെ പ്രകടനം കുറച്ചു."</string>
- <string name="battery_saver_notification_action_text" msgid="7546297220816993504">"ബാറ്ററി സേവർ ക്രമീകരണങ്ങൾ തുറക്കുക"</string>
+ <!-- no translation found for battery_saver_notification_text (820318788126672692) -->
+ <skip />
+ <!-- no translation found for battery_saver_notification_action_text (109158658238110382) -->
+ <skip />
<string name="battery_level_template" msgid="1609636980292580020">"<xliff:g id="LEVEL">%d</xliff:g>%%"</string>
<string name="notification_hidden_text" msgid="1135169301897151909">"കോൺടാക്റ്റുകൾ മറച്ചു"</string>
<string name="media_projection_dialog_text" msgid="3071431025448218928">"നിങ്ങളുടെ സ്ക്രീനിൽ പ്രദർശിപ്പിച്ചിരിക്കുന്ന എല്ലാ കാര്യങ്ങളും <xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> ക്യാപ്ചർ ചെയ്യുന്നത് ആരംഭിക്കും."</string>
diff --git a/packages/SystemUI/res/values-mn-rMN/strings.xml b/packages/SystemUI/res/values-mn-rMN/strings.xml
index 44aa796..12c9741 100644
--- a/packages/SystemUI/res/values-mn-rMN/strings.xml
+++ b/packages/SystemUI/res/values-mn-rMN/strings.xml
@@ -39,10 +39,12 @@
<string name="invalid_charger_title" msgid="3515740382572798460">"USB-р цэнэглэх дэмжигддэггүй."</string>
<string name="invalid_charger_text" msgid="5474997287953892710">"Зөвхөн зориулалтын ирсэн цэнэглэгч ашиглана уу."</string>
<string name="battery_low_why" msgid="4553600287639198111">"Тохиргоо"</string>
- <string name="battery_saver_confirmation_title" msgid="5987726159603849352">"Батерей хэмнэгчийг эхлүүлэх үү?"</string>
- <string name="battery_saver_confirmation_ok" msgid="7283108887345688413">"Эхлэх"</string>
- <string name="battery_saver_start_action" msgid="7245333922937402896">"Батерей хэмнэгчийг эхлүүлэх"</string>
- <string name="battery_saver_confirmation_text" msgid="8417584516834617662">"Батарейны ашиглалтыг уртасгахын тулд Батарей хэмнэгч нь таны төхөөрөмжийн ажиллагааг бууруулах болно.\n\nБатарей хэмнэгч нь та төхөөрөмжөө цэнэглэх үед унтарна."</string>
+ <!-- no translation found for battery_saver_confirmation_title (5299585433050361634) -->
+ <skip />
+ <!-- no translation found for battery_saver_confirmation_ok (7507968430447930257) -->
+ <skip />
+ <!-- no translation found for battery_saver_start_action (5576697451677486320) -->
+ <skip />
<string name="status_bar_settings_settings_button" msgid="3023889916699270224">"Тохиргоо"</string>
<string name="status_bar_settings_wifi_button" msgid="1733928151698311923">"Wi-Fi"</string>
<string name="status_bar_settings_airplane" msgid="4879879698500955300">"Нислэгийн горим"</string>
@@ -286,8 +288,10 @@
<item quantity="other" msgid="5408537517529822157">"%d цагийн турш"</item>
</plurals>
<string name="battery_saver_notification_title" msgid="237918726750955859">"Батерей хэмнэгч асаалттай"</string>
- <string name="battery_saver_notification_text" msgid="7796554871101546872">"Төхөөрөмжийн ажиллагааг бууруулсан."</string>
- <string name="battery_saver_notification_action_text" msgid="7546297220816993504">"Батерей хэмнэгчийн тохиргоог нээх"</string>
+ <!-- no translation found for battery_saver_notification_text (820318788126672692) -->
+ <skip />
+ <!-- no translation found for battery_saver_notification_action_text (109158658238110382) -->
+ <skip />
<string name="battery_level_template" msgid="1609636980292580020">"<xliff:g id="LEVEL">%d</xliff:g>%%"</string>
<string name="notification_hidden_text" msgid="1135169301897151909">"Контентыг нуусан"</string>
<string name="media_projection_dialog_text" msgid="3071431025448218928">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> таны дэлгэц дээр гаргасан бүх зүйлийн зургийг авч эхэлнэ."</string>
diff --git a/packages/SystemUI/res/values-mr-rIN/strings.xml b/packages/SystemUI/res/values-mr-rIN/strings.xml
index 51f0797..d25fc41 100644
--- a/packages/SystemUI/res/values-mr-rIN/strings.xml
+++ b/packages/SystemUI/res/values-mr-rIN/strings.xml
@@ -39,10 +39,12 @@
<string name="invalid_charger_title" msgid="3515740382572798460">"USB चार्जिंग समर्थित नाही."</string>
<string name="invalid_charger_text" msgid="5474997287953892710">"केवळ पुरविलेले चार्जर वापरा."</string>
<string name="battery_low_why" msgid="4553600287639198111">"सेटिंग्ज"</string>
- <string name="battery_saver_confirmation_title" msgid="5987726159603849352">"बॅटरी बचतकर्ता प्रारंभ करायचा?"</string>
- <string name="battery_saver_confirmation_ok" msgid="7283108887345688413">"प्रारंभ करा"</string>
- <string name="battery_saver_start_action" msgid="7245333922937402896">"बॅटरी बचतकर्ता प्रारंभ करा"</string>
- <string name="battery_saver_confirmation_text" msgid="8417584516834617662">"बॅटरी आयुष्य सुधारण्यात मदत करण्यासाठी, बॅटरी बचतकर्ता आपल्या डिव्हाइसचे कार्यप्रदर्शन कमी करेल. \n \n आपले डिव्हाइस प्लग इन केलेले असते तेव्हा बॅटरी बचतकर्ता अक्षम केला जाईल."</string>
+ <!-- no translation found for battery_saver_confirmation_title (5299585433050361634) -->
+ <skip />
+ <!-- no translation found for battery_saver_confirmation_ok (7507968430447930257) -->
+ <skip />
+ <!-- no translation found for battery_saver_start_action (5576697451677486320) -->
+ <skip />
<string name="status_bar_settings_settings_button" msgid="3023889916699270224">"सेटिंग्ज"</string>
<string name="status_bar_settings_wifi_button" msgid="1733928151698311923">"Wi-Fi"</string>
<string name="status_bar_settings_airplane" msgid="4879879698500955300">"विमान मोड"</string>
@@ -286,8 +288,10 @@
<item quantity="other" msgid="5408537517529822157">"%d तासांसाठी"</item>
</plurals>
<string name="battery_saver_notification_title" msgid="237918726750955859">"बॅटरी बचतकर्ता चालू आहे"</string>
- <string name="battery_saver_notification_text" msgid="7796554871101546872">"डिव्हाइस कार्यप्रदर्शन कमी झाले आहे."</string>
- <string name="battery_saver_notification_action_text" msgid="7546297220816993504">"बॅटरी बचतकर्ता सेटिंग्ज उघडा"</string>
+ <!-- no translation found for battery_saver_notification_text (820318788126672692) -->
+ <skip />
+ <!-- no translation found for battery_saver_notification_action_text (109158658238110382) -->
+ <skip />
<string name="battery_level_template" msgid="1609636980292580020">"<xliff:g id="LEVEL">%d</xliff:g>%%"</string>
<string name="notification_hidden_text" msgid="1135169301897151909">"लपविलेली सामग्री"</string>
<string name="media_projection_dialog_text" msgid="3071431025448218928">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> आपल्या स्क्रीनवर प्रदर्शित होणारी प्रत्येक गोष्ट कॅप्चर करणे प्रारंभ करेल."</string>
diff --git a/packages/SystemUI/res/values-ms-rMY/strings.xml b/packages/SystemUI/res/values-ms-rMY/strings.xml
index 4d5be08..2ac2ba9 100644
--- a/packages/SystemUI/res/values-ms-rMY/strings.xml
+++ b/packages/SystemUI/res/values-ms-rMY/strings.xml
@@ -39,10 +39,12 @@
<string name="invalid_charger_title" msgid="3515740382572798460">"Pengecasan USB tidak disokong."</string>
<string name="invalid_charger_text" msgid="5474997287953892710">"Gunakan pengecas yang dibekalkan sahaja."</string>
<string name="battery_low_why" msgid="4553600287639198111">"Tetapan"</string>
- <string name="battery_saver_confirmation_title" msgid="5987726159603849352">"Mulakan penjimat bateri?"</string>
- <string name="battery_saver_confirmation_ok" msgid="7283108887345688413">"Mula"</string>
- <string name="battery_saver_start_action" msgid="7245333922937402896">"Mulakan penjimat bateri"</string>
- <string name="battery_saver_confirmation_text" msgid="8417584516834617662">"Untuk membantu meningkatkan hayat bateri, penjimat Bateri akan mengurangkan prestasi peranti anda.\n\nPenjimat bateri akan dilumpuhkan apabila peranti anda disambungkan kepada sumber kuasa."</string>
+ <!-- no translation found for battery_saver_confirmation_title (5299585433050361634) -->
+ <skip />
+ <!-- no translation found for battery_saver_confirmation_ok (7507968430447930257) -->
+ <skip />
+ <!-- no translation found for battery_saver_start_action (5576697451677486320) -->
+ <skip />
<string name="status_bar_settings_settings_button" msgid="3023889916699270224">"Tetapan"</string>
<string name="status_bar_settings_wifi_button" msgid="1733928151698311923">"Wi-Fi"</string>
<string name="status_bar_settings_airplane" msgid="4879879698500955300">"Mod pesawat"</string>
@@ -286,8 +288,10 @@
<item quantity="other" msgid="5408537517529822157">"Selama %d jam"</item>
</plurals>
<string name="battery_saver_notification_title" msgid="237918726750955859">"Penjimat bateri dihidupkan"</string>
- <string name="battery_saver_notification_text" msgid="7796554871101546872">"Prestasi peranti dikurangkan."</string>
- <string name="battery_saver_notification_action_text" msgid="7546297220816993504">"Buka tetapan penjimat bateri"</string>
+ <!-- no translation found for battery_saver_notification_text (820318788126672692) -->
+ <skip />
+ <!-- no translation found for battery_saver_notification_action_text (109158658238110382) -->
+ <skip />
<string name="battery_level_template" msgid="1609636980292580020">"<xliff:g id="LEVEL">%d</xliff:g>%%"</string>
<string name="notification_hidden_text" msgid="1135169301897151909">"Kandungan tersembunyi"</string>
<string name="media_projection_dialog_text" msgid="3071431025448218928">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> akan mula mengabadikan semua yang dipaparkan pada skrin anda.."</string>
diff --git a/packages/SystemUI/res/values-my-rMM/strings.xml b/packages/SystemUI/res/values-my-rMM/strings.xml
index 09f6cbe..934946f 100644
--- a/packages/SystemUI/res/values-my-rMM/strings.xml
+++ b/packages/SystemUI/res/values-my-rMM/strings.xml
@@ -37,10 +37,12 @@
<string name="invalid_charger_title" msgid="3515740382572798460">"USB အားသွင်းမှု မပံ့ပိုးပါ။"</string>
<string name="invalid_charger_text" msgid="5474997287953892710">"ပေးခဲ့သည့် အားသွင်းစက်ကိုသာ အသုံးပြုပါ"</string>
<string name="battery_low_why" msgid="4553600287639198111">"ဆက်တင်များ"</string>
- <string name="battery_saver_confirmation_title" msgid="5987726159603849352">"ဘက်ထရီ ချွေတာသူကို စဖွင့်ရမလား?"</string>
- <string name="battery_saver_confirmation_ok" msgid="7283108887345688413">"စတင်ရန်"</string>
- <string name="battery_saver_start_action" msgid="7245333922937402896">"ဘက်ထရီ ချွေတာသူ စတင်ရန်"</string>
- <string name="battery_saver_confirmation_text" msgid="8417584516834617662">"ဘက်ထရီ သက်တမ်း မြှင့်တင်ရန်၊ ဘက်ထရီ ချွေတာသူက သင့် ကိရိယာ၏ လုပ်ကိုင်မှုကို လျှော့ချမည်။ \n\n ကိရိယာကို ပလပ် ထိုးလိုက်လျှင် ဘက်ထရီ ချွေတာသူမှာ ပိတ်သွားမည်။"</string>
+ <!-- no translation found for battery_saver_confirmation_title (5299585433050361634) -->
+ <skip />
+ <!-- no translation found for battery_saver_confirmation_ok (7507968430447930257) -->
+ <skip />
+ <!-- no translation found for battery_saver_start_action (5576697451677486320) -->
+ <skip />
<string name="status_bar_settings_settings_button" msgid="3023889916699270224">"အပြင်အဆင်များ"</string>
<string name="status_bar_settings_wifi_button" msgid="1733928151698311923">"ဝိုင်ဖိုင်"</string>
<string name="status_bar_settings_airplane" msgid="4879879698500955300">"လေယာဥ်ပျံပေါ်အသုံးပြုသောစနစ်"</string>
@@ -282,8 +284,10 @@
<!-- String.format failed for translation -->
<!-- no translation found for zen_mode_duration_hours:other (5408537517529822157) -->
<string name="battery_saver_notification_title" msgid="237918726750955859">"ဘက်ထရီ ချွေတာသူ ဖွင့်ထား"</string>
- <string name="battery_saver_notification_text" msgid="7796554871101546872">"ကိရိယာ လုပ်ကိုင်မှုကို လျှော့ချခဲ့"</string>
- <string name="battery_saver_notification_action_text" msgid="7546297220816993504">"ဘက်ထရီ ချွေတာသူ ဆက်တင်များကို ဖွင့်ရန်"</string>
+ <!-- no translation found for battery_saver_notification_text (820318788126672692) -->
+ <skip />
+ <!-- no translation found for battery_saver_notification_action_text (109158658238110382) -->
+ <skip />
<string name="battery_level_template" msgid="1609636980292580020">"<xliff:g id="LEVEL">%d</xliff:g>%%"</string>
<string name="notification_hidden_text" msgid="1135169301897151909">"အကြောင်းအရာများ ဝှက်ထား"</string>
<string name="media_projection_dialog_text" msgid="3071431025448218928">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> က သင်၏ မျက်နှာပြင် ပေါ်မှာ ပြသထားသည့် အရာတိုင်းကို စတင် ဖမ်းယူမည်။"</string>
diff --git a/packages/SystemUI/res/values-nb/strings.xml b/packages/SystemUI/res/values-nb/strings.xml
index 07a63a2..697d016 100644
--- a/packages/SystemUI/res/values-nb/strings.xml
+++ b/packages/SystemUI/res/values-nb/strings.xml
@@ -39,10 +39,12 @@
<string name="invalid_charger_title" msgid="3515740382572798460">"Lading via USB støttes ikke."</string>
<string name="invalid_charger_text" msgid="5474997287953892710">"Bruk bare den tilhørende laderen."</string>
<string name="battery_low_why" msgid="4553600287639198111">"Innstillinger"</string>
- <string name="battery_saver_confirmation_title" msgid="5987726159603849352">"Vil du starte batterisparing?"</string>
- <string name="battery_saver_confirmation_ok" msgid="7283108887345688413">"Start"</string>
- <string name="battery_saver_start_action" msgid="7245333922937402896">"Start batterisparing"</string>
- <string name="battery_saver_confirmation_text" msgid="8417584516834617662">"For å spare batteritid reduserer Batterisparing enhetens ytelse.\n\nBatterisparing deaktiveres når enheten er koblet til en lader."</string>
+ <!-- no translation found for battery_saver_confirmation_title (5299585433050361634) -->
+ <skip />
+ <!-- no translation found for battery_saver_confirmation_ok (7507968430447930257) -->
+ <skip />
+ <!-- no translation found for battery_saver_start_action (5576697451677486320) -->
+ <skip />
<string name="status_bar_settings_settings_button" msgid="3023889916699270224">"Innstillinger"</string>
<string name="status_bar_settings_wifi_button" msgid="1733928151698311923">"Trådløse nettverk"</string>
<string name="status_bar_settings_airplane" msgid="4879879698500955300">"Flymodus"</string>
@@ -286,8 +288,10 @@
<item quantity="other" msgid="5408537517529822157">"I %d timer"</item>
</plurals>
<string name="battery_saver_notification_title" msgid="237918726750955859">"Batterisparing er på"</string>
- <string name="battery_saver_notification_text" msgid="7796554871101546872">"Enhetsytelsen er redusert."</string>
- <string name="battery_saver_notification_action_text" msgid="7546297220816993504">"Åpen innstilling for batterisparing"</string>
+ <!-- no translation found for battery_saver_notification_text (820318788126672692) -->
+ <skip />
+ <!-- no translation found for battery_saver_notification_action_text (109158658238110382) -->
+ <skip />
<string name="battery_level_template" msgid="1609636980292580020">"<xliff:g id="LEVEL">%d</xliff:g> %%"</string>
<string name="notification_hidden_text" msgid="1135169301897151909">"Innholdet er skjult"</string>
<string name="media_projection_dialog_text" msgid="3071431025448218928">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> tar opp alt som vies på skjermen din."</string>
diff --git a/packages/SystemUI/res/values-ne-rNP/strings.xml b/packages/SystemUI/res/values-ne-rNP/strings.xml
index 05f5ce8..ac0af13 100644
--- a/packages/SystemUI/res/values-ne-rNP/strings.xml
+++ b/packages/SystemUI/res/values-ne-rNP/strings.xml
@@ -39,10 +39,12 @@
<string name="invalid_charger_title" msgid="3515740382572798460">"USB चार्ज समर्थित छैन।"</string>
<string name="invalid_charger_text" msgid="5474997287953892710">"आपूर्ति गरिएको चार्जर मात्र प्रयोग गर्नुहोस्।"</string>
<string name="battery_low_why" msgid="4553600287639198111">"सेटिङ्हरू"</string>
- <string name="battery_saver_confirmation_title" msgid="5987726159603849352">"ब्याट्रि सेभर सुरु गर्ने?"</string>
- <string name="battery_saver_confirmation_ok" msgid="7283108887345688413">"सुरु गर्नुहोस्"</string>
- <string name="battery_saver_start_action" msgid="7245333922937402896">"ब्याट्रि सेभर सुरु भयो"</string>
- <string name="battery_saver_confirmation_text" msgid="8417584516834617662">"ब्याट्रि जीवन सुधार गर्न, ब्याट्री सेभरले आफ्नो उपकरणको कार्य क्षमता कम गर्ने छ।\n\nआफ्नो उपकरण जोडिएको समयमा ब्याट्रि सेभर असक्षम गरिने छ।"</string>
+ <!-- no translation found for battery_saver_confirmation_title (5299585433050361634) -->
+ <skip />
+ <!-- no translation found for battery_saver_confirmation_ok (7507968430447930257) -->
+ <skip />
+ <!-- no translation found for battery_saver_start_action (5576697451677486320) -->
+ <skip />
<string name="status_bar_settings_settings_button" msgid="3023889916699270224">"सेटिङहरू"</string>
<string name="status_bar_settings_wifi_button" msgid="1733928151698311923">"वाइफाइ"</string>
<string name="status_bar_settings_airplane" msgid="4879879698500955300">"हवाइजहाज मोड"</string>
@@ -286,8 +288,10 @@
<item quantity="other" msgid="5408537517529822157">"%d घण्टाको लागि"</item>
</plurals>
<string name="battery_saver_notification_title" msgid="237918726750955859">"ब्याट्रि सेभर चालु छ"</string>
- <string name="battery_saver_notification_text" msgid="7796554871101546872">"उपकरण कार्य क्षमता कम छ।"</string>
- <string name="battery_saver_notification_action_text" msgid="7546297220816993504">"ब्याट्री सेभर सेटिङ्हरू खुला गर्नुहोस्"</string>
+ <!-- no translation found for battery_saver_notification_text (820318788126672692) -->
+ <skip />
+ <!-- no translation found for battery_saver_notification_action_text (109158658238110382) -->
+ <skip />
<string name="battery_level_template" msgid="1609636980292580020">"<xliff:g id="LEVEL">%d</xliff:g>%%"</string>
<string name="notification_hidden_text" msgid="1135169301897151909">"लुकेका सामाग्रीहरू"</string>
<string name="media_projection_dialog_text" msgid="3071431025448218928">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> ले आफ्नो स्क्रीनमा प्रदर्शित हुने सबै खिच्न शुरू गर्नेछ।"</string>
diff --git a/packages/SystemUI/res/values-nl/strings.xml b/packages/SystemUI/res/values-nl/strings.xml
index dcbe9844..03088d8 100644
--- a/packages/SystemUI/res/values-nl/strings.xml
+++ b/packages/SystemUI/res/values-nl/strings.xml
@@ -39,10 +39,12 @@
<string name="invalid_charger_title" msgid="3515740382572798460">"Opladen via USB wordt niet ondersteund."</string>
<string name="invalid_charger_text" msgid="5474997287953892710">"Gebruik alleen de bijgeleverde oplader."</string>
<string name="battery_low_why" msgid="4553600287639198111">"Instellingen"</string>
- <string name="battery_saver_confirmation_title" msgid="5987726159603849352">"Accubesparing starten?"</string>
- <string name="battery_saver_confirmation_ok" msgid="7283108887345688413">"Starten"</string>
- <string name="battery_saver_start_action" msgid="7245333922937402896">"Accubesparing starten"</string>
- <string name="battery_saver_confirmation_text" msgid="8417584516834617662">"Om de gebruiksduur van de accu te verbeteren, beperkt Accubesparing de prestaties van uw apparaat.\n\nAccubesparing wordt uitgeschakeld wanneer uw apparaat wordt aangesloten op een stopcontact."</string>
+ <!-- no translation found for battery_saver_confirmation_title (5299585433050361634) -->
+ <skip />
+ <!-- no translation found for battery_saver_confirmation_ok (7507968430447930257) -->
+ <skip />
+ <!-- no translation found for battery_saver_start_action (5576697451677486320) -->
+ <skip />
<string name="status_bar_settings_settings_button" msgid="3023889916699270224">"Instellingen"</string>
<string name="status_bar_settings_wifi_button" msgid="1733928151698311923">"Wifi"</string>
<string name="status_bar_settings_airplane" msgid="4879879698500955300">"Vliegmodus"</string>
@@ -286,8 +288,10 @@
<item quantity="other" msgid="5408537517529822157">"%d uur"</item>
</plurals>
<string name="battery_saver_notification_title" msgid="237918726750955859">"Accubesparing is ingeschakeld"</string>
- <string name="battery_saver_notification_text" msgid="7796554871101546872">"De prestaties van het apparaat worden beperkt."</string>
- <string name="battery_saver_notification_action_text" msgid="7546297220816993504">"Instellingen voor Accubesparing openen"</string>
+ <!-- no translation found for battery_saver_notification_text (820318788126672692) -->
+ <skip />
+ <!-- no translation found for battery_saver_notification_action_text (109158658238110382) -->
+ <skip />
<string name="battery_level_template" msgid="1609636980292580020">"<xliff:g id="LEVEL">%d</xliff:g>%%"</string>
<string name="notification_hidden_text" msgid="1135169301897151909">"Inhoud verborgen"</string>
<string name="media_projection_dialog_text" msgid="3071431025448218928">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> gaat alles vastleggen dat wordt weergegeven op uw scherm."</string>
diff --git a/packages/SystemUI/res/values-pl/strings.xml b/packages/SystemUI/res/values-pl/strings.xml
index 56765e86..8fa2149 100644
--- a/packages/SystemUI/res/values-pl/strings.xml
+++ b/packages/SystemUI/res/values-pl/strings.xml
@@ -39,10 +39,12 @@
<string name="invalid_charger_title" msgid="3515740382572798460">"Ładowanie przez USB nie jest obsługiwane."</string>
<string name="invalid_charger_text" msgid="5474997287953892710">"Używaj tylko ładowarki dostarczonej z urządzeniem."</string>
<string name="battery_low_why" msgid="4553600287639198111">"Ustawienia"</string>
- <string name="battery_saver_confirmation_title" msgid="5987726159603849352">"Włączyć oszczędzanie baterii?"</string>
- <string name="battery_saver_confirmation_ok" msgid="7283108887345688413">"Włącz"</string>
- <string name="battery_saver_start_action" msgid="7245333922937402896">"Włącz oszczędzanie baterii"</string>
- <string name="battery_saver_confirmation_text" msgid="8417584516834617662">"Funkcja oszczędzania baterii zmniejszy szybkość działania urządzenia, by ograniczyć wykorzystanie energii.\n\nOszczędzanie baterii wyłączy się, kiedy urządzenie będzie podłączone do źródła zasilania."</string>
+ <!-- no translation found for battery_saver_confirmation_title (5299585433050361634) -->
+ <skip />
+ <!-- no translation found for battery_saver_confirmation_ok (7507968430447930257) -->
+ <skip />
+ <!-- no translation found for battery_saver_start_action (5576697451677486320) -->
+ <skip />
<string name="status_bar_settings_settings_button" msgid="3023889916699270224">"Ustawienia"</string>
<string name="status_bar_settings_wifi_button" msgid="1733928151698311923">"Wi-Fi"</string>
<string name="status_bar_settings_airplane" msgid="4879879698500955300">"Tryb samolotowy"</string>
@@ -286,8 +288,10 @@
<item quantity="other" msgid="5408537517529822157">"Przez %d godz."</item>
</plurals>
<string name="battery_saver_notification_title" msgid="237918726750955859">"Oszczędzanie baterii jest włączone"</string>
- <string name="battery_saver_notification_text" msgid="7796554871101546872">"Urządzenie działa z ograniczoną szybkością."</string>
- <string name="battery_saver_notification_action_text" msgid="7546297220816993504">"Otwórz ustawienia oszczędzania baterii"</string>
+ <!-- no translation found for battery_saver_notification_text (820318788126672692) -->
+ <skip />
+ <!-- no translation found for battery_saver_notification_action_text (109158658238110382) -->
+ <skip />
<string name="battery_level_template" msgid="1609636980292580020">"<xliff:g id="LEVEL">%d</xliff:g>%%"</string>
<string name="notification_hidden_text" msgid="1135169301897151909">"Treści ukryte"</string>
<string name="media_projection_dialog_text" msgid="3071431025448218928">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> będzie zapisywać wszystko, co wyświetli się na ekranie."</string>
diff --git a/packages/SystemUI/res/values-pt-rPT/strings.xml b/packages/SystemUI/res/values-pt-rPT/strings.xml
index b287a85..43d715a 100644
--- a/packages/SystemUI/res/values-pt-rPT/strings.xml
+++ b/packages/SystemUI/res/values-pt-rPT/strings.xml
@@ -39,10 +39,12 @@
<string name="invalid_charger_title" msgid="3515740382572798460">"O carregamento por USB não é suportado."</string>
<string name="invalid_charger_text" msgid="5474997287953892710">"Utilize apenas o carregador fornecido."</string>
<string name="battery_low_why" msgid="4553600287639198111">"Definições"</string>
- <string name="battery_saver_confirmation_title" msgid="5987726159603849352">"Iniciar a poupança de bateria?"</string>
- <string name="battery_saver_confirmation_ok" msgid="7283108887345688413">"Iniciar"</string>
- <string name="battery_saver_start_action" msgid="7245333922937402896">"Iniciar a poupança de bateria"</string>
- <string name="battery_saver_confirmation_text" msgid="8417584516834617662">"Para ajudar a aumentar a duração da bateria, a Poupança de bateria reduzirá o desempenho do seu dispositivo.\n\nA Poupança de bateria será desativada assim que o dispositivo for ligado à corrente elétrica."</string>
+ <!-- no translation found for battery_saver_confirmation_title (5299585433050361634) -->
+ <skip />
+ <!-- no translation found for battery_saver_confirmation_ok (7507968430447930257) -->
+ <skip />
+ <!-- no translation found for battery_saver_start_action (5576697451677486320) -->
+ <skip />
<string name="status_bar_settings_settings_button" msgid="3023889916699270224">"Definições"</string>
<string name="status_bar_settings_wifi_button" msgid="1733928151698311923">"Wi-Fi"</string>
<string name="status_bar_settings_airplane" msgid="4879879698500955300">"Modo de avião"</string>
@@ -286,8 +288,10 @@
<item quantity="other" msgid="5408537517529822157">"Durante %d horas"</item>
</plurals>
<string name="battery_saver_notification_title" msgid="237918726750955859">"A poupança de bateria está ligada"</string>
- <string name="battery_saver_notification_text" msgid="7796554871101546872">"O desempenho do dispositivo é reduzido."</string>
- <string name="battery_saver_notification_action_text" msgid="7546297220816993504">"Abrir as definições de poupança de bateria"</string>
+ <!-- no translation found for battery_saver_notification_text (820318788126672692) -->
+ <skip />
+ <!-- no translation found for battery_saver_notification_action_text (109158658238110382) -->
+ <skip />
<string name="battery_level_template" msgid="1609636980292580020">"<xliff:g id="LEVEL">%d</xliff:g>%%"</string>
<string name="notification_hidden_text" msgid="1135169301897151909">"Conteúdo oculto"</string>
<string name="media_projection_dialog_text" msgid="3071431025448218928">"O(a) <xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> vai começar a captar tudo o que é apresentado no ecrã."</string>
diff --git a/packages/SystemUI/res/values-pt/strings.xml b/packages/SystemUI/res/values-pt/strings.xml
index 8357280..6c384a6 100644
--- a/packages/SystemUI/res/values-pt/strings.xml
+++ b/packages/SystemUI/res/values-pt/strings.xml
@@ -39,10 +39,12 @@
<string name="invalid_charger_title" msgid="3515740382572798460">"O carregamento via USB não é suportado."</string>
<string name="invalid_charger_text" msgid="5474997287953892710">"Use apenas o carregador fornecido."</string>
<string name="battery_low_why" msgid="4553600287639198111">"Configurações"</string>
- <string name="battery_saver_confirmation_title" msgid="5987726159603849352">"Iniciar a economia de bateria?"</string>
- <string name="battery_saver_confirmation_ok" msgid="7283108887345688413">"Iniciar"</string>
- <string name="battery_saver_start_action" msgid="7245333922937402896">"Iniciar economia de bateria"</string>
- <string name="battery_saver_confirmation_text" msgid="8417584516834617662">"Para ajudar a melhorar a vida útil da bateria, a Economia de bateria reduzirá o desempenho do dispositivo.\n\nA Economia de bateria será desativada quando o dispositivo estiver carregando."</string>
+ <!-- no translation found for battery_saver_confirmation_title (5299585433050361634) -->
+ <skip />
+ <!-- no translation found for battery_saver_confirmation_ok (7507968430447930257) -->
+ <skip />
+ <!-- no translation found for battery_saver_start_action (5576697451677486320) -->
+ <skip />
<string name="status_bar_settings_settings_button" msgid="3023889916699270224">"Configurações"</string>
<string name="status_bar_settings_wifi_button" msgid="1733928151698311923">"Wi-Fi"</string>
<string name="status_bar_settings_airplane" msgid="4879879698500955300">"Modo avião"</string>
@@ -288,8 +290,10 @@
<item quantity="other" msgid="5408537517529822157">"Por %d horas"</item>
</plurals>
<string name="battery_saver_notification_title" msgid="237918726750955859">"A Economia de bateria está ativada"</string>
- <string name="battery_saver_notification_text" msgid="7796554871101546872">"O desempenho do dispositivo foi reduzido."</string>
- <string name="battery_saver_notification_action_text" msgid="7546297220816993504">"Abrir configurações de economia de bateria"</string>
+ <!-- no translation found for battery_saver_notification_text (820318788126672692) -->
+ <skip />
+ <!-- no translation found for battery_saver_notification_action_text (109158658238110382) -->
+ <skip />
<string name="battery_level_template" msgid="1609636980292580020">"<xliff:g id="LEVEL">%d</xliff:g>%%"</string>
<string name="notification_hidden_text" msgid="1135169301897151909">"Conteúdo oculto"</string>
<string name="media_projection_dialog_text" msgid="3071431025448218928">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> começará a capturar tudo o que for exibido na tela."</string>
diff --git a/packages/SystemUI/res/values-ro/strings.xml b/packages/SystemUI/res/values-ro/strings.xml
index ee03635..0c979ed 100644
--- a/packages/SystemUI/res/values-ro/strings.xml
+++ b/packages/SystemUI/res/values-ro/strings.xml
@@ -39,10 +39,12 @@
<string name="invalid_charger_title" msgid="3515740382572798460">"Încărcarea prin USB nu este acceptată."</string>
<string name="invalid_charger_text" msgid="5474997287953892710">"Utilizați numai încărcătorul furnizat."</string>
<string name="battery_low_why" msgid="4553600287639198111">"Setări"</string>
- <string name="battery_saver_confirmation_title" msgid="5987726159603849352">"Porniți economisirea bateriei?"</string>
- <string name="battery_saver_confirmation_ok" msgid="7283108887345688413">"Începeți"</string>
- <string name="battery_saver_start_action" msgid="7245333922937402896">"Porniți economisirea bateriei"</string>
- <string name="battery_saver_confirmation_text" msgid="8417584516834617662">"Pentru a mări autonomia bateriei, funcția Economisirea bateriei reduce performanța dispozitivului.\n\nEconomisirea bateriei se dezactivează când dispozitivul este conectat la priză."</string>
+ <!-- no translation found for battery_saver_confirmation_title (5299585433050361634) -->
+ <skip />
+ <!-- no translation found for battery_saver_confirmation_ok (7507968430447930257) -->
+ <skip />
+ <!-- no translation found for battery_saver_start_action (5576697451677486320) -->
+ <skip />
<string name="status_bar_settings_settings_button" msgid="3023889916699270224">"Setări"</string>
<string name="status_bar_settings_wifi_button" msgid="1733928151698311923">"Wi-Fi"</string>
<string name="status_bar_settings_airplane" msgid="4879879698500955300">"Mod Avion"</string>
@@ -292,8 +294,10 @@
<item quantity="other" msgid="5408537517529822157">"Timp de %d (de) ore"</item>
</plurals>
<string name="battery_saver_notification_title" msgid="237918726750955859">"Economisirea bateriei este activată"</string>
- <string name="battery_saver_notification_text" msgid="7796554871101546872">"Performanța dispozitivului s-a redus."</string>
- <string name="battery_saver_notification_action_text" msgid="7546297220816993504">"Deschideți setările pentru economisirea bateriei"</string>
+ <!-- no translation found for battery_saver_notification_text (820318788126672692) -->
+ <skip />
+ <!-- no translation found for battery_saver_notification_action_text (109158658238110382) -->
+ <skip />
<string name="battery_level_template" msgid="1609636980292580020">"<xliff:g id="LEVEL">%d</xliff:g>%%"</string>
<string name="notification_hidden_text" msgid="1135169301897151909">"Conținutul este ascuns"</string>
<string name="media_projection_dialog_text" msgid="3071431025448218928">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> va începe să captureze tot ceea ce se afișează pe ecran."</string>
diff --git a/packages/SystemUI/res/values-ru/strings.xml b/packages/SystemUI/res/values-ru/strings.xml
index d0f0a0c..3ee1e47 100644
--- a/packages/SystemUI/res/values-ru/strings.xml
+++ b/packages/SystemUI/res/values-ru/strings.xml
@@ -39,10 +39,12 @@
<string name="invalid_charger_title" msgid="3515740382572798460">"Зарядка через USB не поддерживается."</string>
<string name="invalid_charger_text" msgid="5474997287953892710">"Используйте только зарядное устройство, поставляемое в комплекте с устройством."</string>
<string name="battery_low_why" msgid="4553600287639198111">"Настройки"</string>
- <string name="battery_saver_confirmation_title" msgid="5987726159603849352">"Включить режим энергосбережения?"</string>
- <string name="battery_saver_confirmation_ok" msgid="7283108887345688413">"ОК"</string>
- <string name="battery_saver_start_action" msgid="7245333922937402896">"Включить режим энергосбережения"</string>
- <string name="battery_saver_confirmation_text" msgid="8417584516834617662">"Для экономии заряда батареи производительность устройства будет снижена.\n\nКогда устройство заряжается, режим энергосбережения отключен."</string>
+ <!-- no translation found for battery_saver_confirmation_title (5299585433050361634) -->
+ <skip />
+ <!-- no translation found for battery_saver_confirmation_ok (7507968430447930257) -->
+ <skip />
+ <!-- no translation found for battery_saver_start_action (5576697451677486320) -->
+ <skip />
<string name="status_bar_settings_settings_button" msgid="3023889916699270224">"Настройки"</string>
<string name="status_bar_settings_wifi_button" msgid="1733928151698311923">"Wi-Fi"</string>
<string name="status_bar_settings_airplane" msgid="4879879698500955300">"Режим полета"</string>
@@ -288,13 +290,15 @@
<item quantity="other" msgid="5408537517529822157">"%d ч."</item>
</plurals>
<string name="battery_saver_notification_title" msgid="237918726750955859">"Включен режим энергосбережения"</string>
- <string name="battery_saver_notification_text" msgid="7796554871101546872">"Производительность устройства снижена."</string>
- <string name="battery_saver_notification_action_text" msgid="7546297220816993504">"Открыть настройки режима энергосбережения"</string>
+ <!-- no translation found for battery_saver_notification_text (820318788126672692) -->
+ <skip />
+ <!-- no translation found for battery_saver_notification_action_text (109158658238110382) -->
+ <skip />
<string name="battery_level_template" msgid="1609636980292580020">"<xliff:g id="LEVEL">%d</xliff:g>%%"</string>
<string name="notification_hidden_text" msgid="1135169301897151909">"Содержимое скрыто"</string>
<string name="media_projection_dialog_text" msgid="3071431025448218928">"Приложение <xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> получит доступ к изображению на экране устройства."</string>
<string name="media_projection_remember_text" msgid="3103510882172746752">"Больше не показывать"</string>
- <string name="clear_all_notifications_text" msgid="814192889771462828">"Удалить все"</string>
+ <string name="clear_all_notifications_text" msgid="814192889771462828">"Очистить все"</string>
<string name="media_projection_action_text" msgid="8470872969457985954">"Начать"</string>
<string name="empty_shade_text" msgid="708135716272867002">"Нет уведомлений"</string>
</resources>
diff --git a/packages/SystemUI/res/values-si-rLK/strings.xml b/packages/SystemUI/res/values-si-rLK/strings.xml
index 37a4236..964f770 100644
--- a/packages/SystemUI/res/values-si-rLK/strings.xml
+++ b/packages/SystemUI/res/values-si-rLK/strings.xml
@@ -39,10 +39,12 @@
<string name="invalid_charger_title" msgid="3515740382572798460">"USB ආරෝපණය කිරීම සහාය නොදක්වයි."</string>
<string name="invalid_charger_text" msgid="5474997287953892710">"සපයන ලද අරෝපකය පමණක් භාවිතා කරන්න."</string>
<string name="battery_low_why" msgid="4553600287639198111">"සැකසීම්"</string>
- <string name="battery_saver_confirmation_title" msgid="5987726159603849352">"බැටරි සුරැකීම ආරම්භ කරන්නද?"</string>
- <string name="battery_saver_confirmation_ok" msgid="7283108887345688413">"ආරම්භ කරන්න"</string>
- <string name="battery_saver_start_action" msgid="7245333922937402896">"බැටරි ඉතිරි කරන්නා ආරම්භ කරන්න"</string>
- <string name="battery_saver_confirmation_text" msgid="8417584516834617662">"බැටරියේ ජීව දියුණු කිරීමට, බැටරි ඉතිරි කරන්නා ඔබගේ උපාංගයේ ක්රියාකාරිත්වය අඩු කරයි.\n\nඔබගේ උපාංගය පේනුගත කර ඇති විට බැටරි ඉතිරි කරන්නා අබල වේ."</string>
+ <!-- no translation found for battery_saver_confirmation_title (5299585433050361634) -->
+ <skip />
+ <!-- no translation found for battery_saver_confirmation_ok (7507968430447930257) -->
+ <skip />
+ <!-- no translation found for battery_saver_start_action (5576697451677486320) -->
+ <skip />
<string name="status_bar_settings_settings_button" msgid="3023889916699270224">"සැකසීම්"</string>
<string name="status_bar_settings_wifi_button" msgid="1733928151698311923">"Wi-Fi"</string>
<string name="status_bar_settings_airplane" msgid="4879879698500955300">"අහස්යානා ආකාරය"</string>
@@ -286,8 +288,10 @@
<item quantity="other" msgid="5408537517529822157">"පැය %d ක් සඳහා"</item>
</plurals>
<string name="battery_saver_notification_title" msgid="237918726750955859">"බැටරි ඉතිරි කරන්නා සක්රීයයි"</string>
- <string name="battery_saver_notification_text" msgid="7796554871101546872">"උපාංගය ක්රියාකාරිත්වය අඩු කරන ලදී."</string>
- <string name="battery_saver_notification_action_text" msgid="7546297220816993504">"බැටරි ඉතිරි කරන්නා සැකසීම් විවෘත කරන්න"</string>
+ <!-- no translation found for battery_saver_notification_text (820318788126672692) -->
+ <skip />
+ <!-- no translation found for battery_saver_notification_action_text (109158658238110382) -->
+ <skip />
<string name="battery_level_template" msgid="1609636980292580020">"<xliff:g id="LEVEL">%d</xliff:g>%%"</string>
<string name="notification_hidden_text" msgid="1135169301897151909">"සැඟවුණු සම්බන්ධතා"</string>
<string name="media_projection_dialog_text" msgid="3071431025448218928">"ඔබගේ තීරයේ දර්ශනය වන සෑම දෙයම <xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> ලබාගැනීම ආරම්භ කරන ලදි."</string>
diff --git a/packages/SystemUI/res/values-sk/strings.xml b/packages/SystemUI/res/values-sk/strings.xml
index 2797f14..f618864 100644
--- a/packages/SystemUI/res/values-sk/strings.xml
+++ b/packages/SystemUI/res/values-sk/strings.xml
@@ -39,10 +39,12 @@
<string name="invalid_charger_title" msgid="3515740382572798460">"Nabíjanie prostredníctvom USB nie je podporované."</string>
<string name="invalid_charger_text" msgid="5474997287953892710">"Používajte iba originálnu nabíjačku."</string>
<string name="battery_low_why" msgid="4553600287639198111">"Nastavenia"</string>
- <string name="battery_saver_confirmation_title" msgid="5987726159603849352">"Chcete spustiť šetrič batérie?"</string>
- <string name="battery_saver_confirmation_ok" msgid="7283108887345688413">"Spustiť"</string>
- <string name="battery_saver_start_action" msgid="7245333922937402896">"Spustiť šetrič batérie"</string>
- <string name="battery_saver_confirmation_text" msgid="8417584516834617662">"Šetrič batérie zníži výkonnosť vášho zariadenia, aby tak predĺžil výdrž batérie.\n\nPo pripojení zariadenia do zásuvky sa šetrič batérie deaktivuje."</string>
+ <!-- no translation found for battery_saver_confirmation_title (5299585433050361634) -->
+ <skip />
+ <!-- no translation found for battery_saver_confirmation_ok (7507968430447930257) -->
+ <skip />
+ <!-- no translation found for battery_saver_start_action (5576697451677486320) -->
+ <skip />
<string name="status_bar_settings_settings_button" msgid="3023889916699270224">"Nastavenia"</string>
<string name="status_bar_settings_wifi_button" msgid="1733928151698311923">"Wi-Fi"</string>
<string name="status_bar_settings_airplane" msgid="4879879698500955300">"Režim V lietadle"</string>
@@ -288,8 +290,10 @@
<item quantity="other" msgid="5408537517529822157">"Na %d h"</item>
</plurals>
<string name="battery_saver_notification_title" msgid="237918726750955859">"Šetrič batérie je zapnutý"</string>
- <string name="battery_saver_notification_text" msgid="7796554871101546872">"Výkonnosť zariadenia sa znížila."</string>
- <string name="battery_saver_notification_action_text" msgid="7546297220816993504">"Otvorte nastavenia šetriča batérie"</string>
+ <!-- no translation found for battery_saver_notification_text (820318788126672692) -->
+ <skip />
+ <!-- no translation found for battery_saver_notification_action_text (109158658238110382) -->
+ <skip />
<string name="battery_level_template" msgid="1609636980292580020">"<xliff:g id="LEVEL">%d</xliff:g> %%"</string>
<string name="notification_hidden_text" msgid="1135169301897151909">"Skrytý obsah"</string>
<string name="media_projection_dialog_text" msgid="3071431025448218928">"Aplikácia <xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> začne zaznamenávať všetok obsah zobrazený na vašej obrazovke."</string>
diff --git a/packages/SystemUI/res/values-sl/strings.xml b/packages/SystemUI/res/values-sl/strings.xml
index 29783f99..dc6ec17 100644
--- a/packages/SystemUI/res/values-sl/strings.xml
+++ b/packages/SystemUI/res/values-sl/strings.xml
@@ -39,10 +39,12 @@
<string name="invalid_charger_title" msgid="3515740382572798460">"Polnjenje prek USB-ja ni podprto."</string>
<string name="invalid_charger_text" msgid="5474997287953892710">"Uporabljajte samo priloženi polnilnik."</string>
<string name="battery_low_why" msgid="4553600287639198111">"Nastavitve"</string>
- <string name="battery_saver_confirmation_title" msgid="5987726159603849352">"Želite zagnati varčevanje z energijo akumulatorja?"</string>
- <string name="battery_saver_confirmation_ok" msgid="7283108887345688413">"Začni"</string>
- <string name="battery_saver_start_action" msgid="7245333922937402896">"Zaženi varčevanje z energijo akumulatorja"</string>
- <string name="battery_saver_confirmation_text" msgid="8417584516834617662">"Zaradi podaljšanja delovanja akumulatorja funkcija Varčevanje z energijo akumulatorja zmanjša zmogljivost delovanja naprave.\n\nVarčevanje z energijo akumulatorja se onemogoči, ko je naprava priklopljena na zunanje napajanje."</string>
+ <!-- no translation found for battery_saver_confirmation_title (5299585433050361634) -->
+ <skip />
+ <!-- no translation found for battery_saver_confirmation_ok (7507968430447930257) -->
+ <skip />
+ <!-- no translation found for battery_saver_start_action (5576697451677486320) -->
+ <skip />
<string name="status_bar_settings_settings_button" msgid="3023889916699270224">"Nastavitve"</string>
<string name="status_bar_settings_wifi_button" msgid="1733928151698311923">"Wi-Fi"</string>
<string name="status_bar_settings_airplane" msgid="4879879698500955300">"Način za letalo"</string>
@@ -286,8 +288,10 @@
<item quantity="other" msgid="5408537517529822157">"Za %d h"</item>
</plurals>
<string name="battery_saver_notification_title" msgid="237918726750955859">"Varčevanje z energijo akumulatorja je vklopljeno"</string>
- <string name="battery_saver_notification_text" msgid="7796554871101546872">"Zmogljivost delovanja naprave je zmanjšana."</string>
- <string name="battery_saver_notification_action_text" msgid="7546297220816993504">"Odpri nastavitve varčevanja z energijo akumulatorja"</string>
+ <!-- no translation found for battery_saver_notification_text (820318788126672692) -->
+ <skip />
+ <!-- no translation found for battery_saver_notification_action_text (109158658238110382) -->
+ <skip />
<string name="battery_level_template" msgid="1609636980292580020">"<xliff:g id="LEVEL">%d</xliff:g>%%"</string>
<string name="notification_hidden_text" msgid="1135169301897151909">"Vsebina je skrita"</string>
<string name="media_projection_dialog_text" msgid="3071431025448218928">"Aplikacija <xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> bo začela zajemati vse, kar je prikazano na zaslonu."</string>
diff --git a/packages/SystemUI/res/values-sr/strings.xml b/packages/SystemUI/res/values-sr/strings.xml
index 391bba8..e639caf 100644
--- a/packages/SystemUI/res/values-sr/strings.xml
+++ b/packages/SystemUI/res/values-sr/strings.xml
@@ -39,10 +39,12 @@
<string name="invalid_charger_title" msgid="3515740382572798460">"Пуњење преко USB-а није подржано."</string>
<string name="invalid_charger_text" msgid="5474997287953892710">"Користите само пуњач који сте добили."</string>
<string name="battery_low_why" msgid="4553600287639198111">"Подешавања"</string>
- <string name="battery_saver_confirmation_title" msgid="5987726159603849352">"Желите ли да покренете Штедњу батерије?"</string>
- <string name="battery_saver_confirmation_ok" msgid="7283108887345688413">"Покрени"</string>
- <string name="battery_saver_start_action" msgid="7245333922937402896">"Покрените Штедњу батерије"</string>
- <string name="battery_saver_confirmation_text" msgid="8417584516834617662">"Да би продужила век трајања батерије, Штедња батерије умањује перформансе уређаја.\n\nШтедња батерије ће се искључити када прикључите уређај на напајање."</string>
+ <!-- no translation found for battery_saver_confirmation_title (5299585433050361634) -->
+ <skip />
+ <!-- no translation found for battery_saver_confirmation_ok (7507968430447930257) -->
+ <skip />
+ <!-- no translation found for battery_saver_start_action (5576697451677486320) -->
+ <skip />
<string name="status_bar_settings_settings_button" msgid="3023889916699270224">"Подешавања"</string>
<string name="status_bar_settings_wifi_button" msgid="1733928151698311923">"Wi-Fi"</string>
<string name="status_bar_settings_airplane" msgid="4879879698500955300">"Режим рада у авиону"</string>
@@ -286,8 +288,10 @@
<item quantity="other" msgid="5408537517529822157">"%d с"</item>
</plurals>
<string name="battery_saver_notification_title" msgid="237918726750955859">"Штедња батерије је укључена"</string>
- <string name="battery_saver_notification_text" msgid="7796554871101546872">"Перформансе уређаја су умањене."</string>
- <string name="battery_saver_notification_action_text" msgid="7546297220816993504">"Отворите подешавања Штедње батерије"</string>
+ <!-- no translation found for battery_saver_notification_text (820318788126672692) -->
+ <skip />
+ <!-- no translation found for battery_saver_notification_action_text (109158658238110382) -->
+ <skip />
<string name="battery_level_template" msgid="1609636980292580020">"<xliff:g id="LEVEL">%d</xliff:g>%%"</string>
<string name="notification_hidden_text" msgid="1135169301897151909">"Садржај је сакривен"</string>
<string name="media_projection_dialog_text" msgid="3071431025448218928">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> ће почети да снима све што се приказује на екрану."</string>
diff --git a/packages/SystemUI/res/values-sv/strings.xml b/packages/SystemUI/res/values-sv/strings.xml
index 044b9ab..547699f 100644
--- a/packages/SystemUI/res/values-sv/strings.xml
+++ b/packages/SystemUI/res/values-sv/strings.xml
@@ -39,10 +39,12 @@
<string name="invalid_charger_title" msgid="3515740382572798460">"Det finns inget stöd för laddning via USB."</string>
<string name="invalid_charger_text" msgid="5474997287953892710">"Använd endast den medföljande laddaren."</string>
<string name="battery_low_why" msgid="4553600287639198111">"Inställningar"</string>
- <string name="battery_saver_confirmation_title" msgid="5987726159603849352">"Vill du aktivera batterisparläget?"</string>
- <string name="battery_saver_confirmation_ok" msgid="7283108887345688413">"Börja"</string>
- <string name="battery_saver_start_action" msgid="7245333922937402896">"Aktivera batterisparläget"</string>
- <string name="battery_saver_confirmation_text" msgid="8417584516834617662">"Med batterisparläget minskas enhetens prestanda i syfte att förlänga batteritiden.\n\nBatterisparläget inaktiveras när enheten ansluts till ett uttag."</string>
+ <!-- no translation found for battery_saver_confirmation_title (5299585433050361634) -->
+ <skip />
+ <!-- no translation found for battery_saver_confirmation_ok (7507968430447930257) -->
+ <skip />
+ <!-- no translation found for battery_saver_start_action (5576697451677486320) -->
+ <skip />
<string name="status_bar_settings_settings_button" msgid="3023889916699270224">"Inställningar"</string>
<string name="status_bar_settings_wifi_button" msgid="1733928151698311923">"Wi-Fi"</string>
<string name="status_bar_settings_airplane" msgid="4879879698500955300">"Flygplansläge"</string>
@@ -286,8 +288,10 @@
<item quantity="other" msgid="5408537517529822157">"I %d timmar"</item>
</plurals>
<string name="battery_saver_notification_title" msgid="237918726750955859">"Batterisparläget har aktiverats"</string>
- <string name="battery_saver_notification_text" msgid="7796554871101546872">"Enhetens prestanda har minskats."</string>
- <string name="battery_saver_notification_action_text" msgid="7546297220816993504">"Öppna inställningarna för batterisparläget"</string>
+ <!-- no translation found for battery_saver_notification_text (820318788126672692) -->
+ <skip />
+ <!-- no translation found for battery_saver_notification_action_text (109158658238110382) -->
+ <skip />
<string name="battery_level_template" msgid="1609636980292580020">"<xliff:g id="LEVEL">%d</xliff:g>%%"</string>
<string name="notification_hidden_text" msgid="1135169301897151909">"Innehåll har dolts"</string>
<string name="media_projection_dialog_text" msgid="3071431025448218928">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> tar en bild av allt som visas på skärmen."</string>
diff --git a/packages/SystemUI/res/values-sw/strings.xml b/packages/SystemUI/res/values-sw/strings.xml
index 54430ad..5c6f4ad 100644
--- a/packages/SystemUI/res/values-sw/strings.xml
+++ b/packages/SystemUI/res/values-sw/strings.xml
@@ -37,10 +37,12 @@
<string name="invalid_charger_title" msgid="3515740382572798460">"Kuchaji kwa kutumia USB hakutumiki."</string>
<string name="invalid_charger_text" msgid="5474997287953892710">"Tumia chaja iliyonunuliwa pamoja na kifaa pekee."</string>
<string name="battery_low_why" msgid="4553600287639198111">"Mipangilio"</string>
- <string name="battery_saver_confirmation_title" msgid="5987726159603849352">"Ungependa kuwasha kiokoa betri?"</string>
- <string name="battery_saver_confirmation_ok" msgid="7283108887345688413">"Anza"</string>
- <string name="battery_saver_start_action" msgid="7245333922937402896">"Washa kiokoa betri"</string>
- <string name="battery_saver_confirmation_text" msgid="8417584516834617662">"Ili kusaidia kuboresha muda wa matumizi ya betri, Kiokoa betri kitapunguza utendaji wa kifaa chako.\n\nKiokoa betri kitazimwa kifaa chako kitakapochomekwa kwenye nishati ya umeme."</string>
+ <!-- no translation found for battery_saver_confirmation_title (5299585433050361634) -->
+ <skip />
+ <!-- no translation found for battery_saver_confirmation_ok (7507968430447930257) -->
+ <skip />
+ <!-- no translation found for battery_saver_start_action (5576697451677486320) -->
+ <skip />
<string name="status_bar_settings_settings_button" msgid="3023889916699270224">"Mipangilio"</string>
<string name="status_bar_settings_wifi_button" msgid="1733928151698311923">"Mtandao-Hewa"</string>
<string name="status_bar_settings_airplane" msgid="4879879698500955300">"Hali ya Ndege"</string>
@@ -284,8 +286,10 @@
<item quantity="other" msgid="5408537517529822157">"Kwa saa %d"</item>
</plurals>
<string name="battery_saver_notification_title" msgid="237918726750955859">"Kiokoa betri kimewashwa"</string>
- <string name="battery_saver_notification_text" msgid="7796554871101546872">"Utendaji wa kifaa umepunguzwa."</string>
- <string name="battery_saver_notification_action_text" msgid="7546297220816993504">"Fungua mipangilio ya hali inayookoa betri"</string>
+ <!-- no translation found for battery_saver_notification_text (820318788126672692) -->
+ <skip />
+ <!-- no translation found for battery_saver_notification_action_text (109158658238110382) -->
+ <skip />
<string name="battery_level_template" msgid="1609636980292580020">"<xliff:g id="LEVEL">%d</xliff:g>%%"</string>
<string name="notification_hidden_text" msgid="1135169301897151909">"Maudhui yamefichwa"</string>
<string name="media_projection_dialog_text" msgid="3071431025448218928">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> itaanza kupiga picha kila kitu kinachoonyeshwa kwenye skrini yako."</string>
diff --git a/packages/SystemUI/res/values-ta-rIN/strings.xml b/packages/SystemUI/res/values-ta-rIN/strings.xml
index 6100497..fca4882 100644
--- a/packages/SystemUI/res/values-ta-rIN/strings.xml
+++ b/packages/SystemUI/res/values-ta-rIN/strings.xml
@@ -39,10 +39,12 @@
<string name="invalid_charger_title" msgid="3515740382572798460">"USB சார்ஜிங் ஆதரிக்கப்படவில்லை."</string>
<string name="invalid_charger_text" msgid="5474997287953892710">"வழங்கப்பட்ட சார்ஜரை மட்டும் பயன்படுத்துக."</string>
<string name="battery_low_why" msgid="4553600287639198111">"அமைப்புகள்"</string>
- <string name="battery_saver_confirmation_title" msgid="5987726159603849352">"பேட்டரி சேமிப்பானைத் தொடங்கவா?"</string>
- <string name="battery_saver_confirmation_ok" msgid="7283108887345688413">"தொடங்கு"</string>
- <string name="battery_saver_start_action" msgid="7245333922937402896">"பேட்டரி சேமிப்பானைத் தொடங்கு"</string>
- <string name="battery_saver_confirmation_text" msgid="8417584516834617662">"பேட்டரியின் ஆயுட்காலத்தை அதிகரிக்க, பேட்டரி சேமிப்பான் சாதனத்தின் செயல்திறனைக் குறைக்கும்.\n\nசாதனம் சாதனம் சார்ஜ் ஆகும் போது, பேட்டரி சேமிப்பான் முடக்கப்படும்."</string>
+ <!-- no translation found for battery_saver_confirmation_title (5299585433050361634) -->
+ <skip />
+ <!-- no translation found for battery_saver_confirmation_ok (7507968430447930257) -->
+ <skip />
+ <!-- no translation found for battery_saver_start_action (5576697451677486320) -->
+ <skip />
<string name="status_bar_settings_settings_button" msgid="3023889916699270224">"அமைப்புகள்"</string>
<string name="status_bar_settings_wifi_button" msgid="1733928151698311923">"வைஃபை"</string>
<string name="status_bar_settings_airplane" msgid="4879879698500955300">"விமானப் பயன்முறை"</string>
@@ -286,8 +288,10 @@
<item quantity="other" msgid="5408537517529822157">"%d மணிநேரம்"</item>
</plurals>
<string name="battery_saver_notification_title" msgid="237918726750955859">"பேட்டரி சேமிப்பான் இயக்கத்தில் உள்ளது"</string>
- <string name="battery_saver_notification_text" msgid="7796554871101546872">"சாதன செயல்திறன் குறைக்கப்பட்டது."</string>
- <string name="battery_saver_notification_action_text" msgid="7546297220816993504">"பேட்டரி சேமிப்பான் அமைப்புகளைத் திற"</string>
+ <!-- no translation found for battery_saver_notification_text (820318788126672692) -->
+ <skip />
+ <!-- no translation found for battery_saver_notification_action_text (109158658238110382) -->
+ <skip />
<string name="battery_level_template" msgid="1609636980292580020">"<xliff:g id="LEVEL">%d</xliff:g>%%"</string>
<string name="notification_hidden_text" msgid="1135169301897151909">"மறைந்துள்ள உள்ளடக்கம்"</string>
<string name="media_projection_dialog_text" msgid="3071431025448218928">"திரையில் காட்டப்படும் அனைத்தையும் <xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> படமெடுக்கும்."</string>
diff --git a/packages/SystemUI/res/values-te-rIN/strings.xml b/packages/SystemUI/res/values-te-rIN/strings.xml
index 6aa8500..c742810 100644
--- a/packages/SystemUI/res/values-te-rIN/strings.xml
+++ b/packages/SystemUI/res/values-te-rIN/strings.xml
@@ -39,10 +39,12 @@
<string name="invalid_charger_title" msgid="3515740382572798460">"USB ఛార్జింగ్కి మద్దతు లేదు."</string>
<string name="invalid_charger_text" msgid="5474997287953892710">"అందించిన ఛార్జర్ను మాత్రమే ఉపయోగించండి."</string>
<string name="battery_low_why" msgid="4553600287639198111">"సెట్టింగ్లు"</string>
- <string name="battery_saver_confirmation_title" msgid="5987726159603849352">"బ్యాటరీ సేవర్ను ప్రారంభించాలా?"</string>
- <string name="battery_saver_confirmation_ok" msgid="7283108887345688413">"ప్రారంభించు"</string>
- <string name="battery_saver_start_action" msgid="7245333922937402896">"బ్యాటరీ సేవర్ను ప్రారంభించు"</string>
- <string name="battery_saver_confirmation_text" msgid="8417584516834617662">"బ్యాటరీ జీవిత కాలం పెంచడంలో సహాయపడటానికి, బ్యాటరీ సేవర్ మీ పరికరం పనితీరును తగ్గిస్తుంది.\n\nమీ పరికరాన్ని ప్లగిన్ చేసినప్పుడు బ్యాటరీ సేవర్ నిలిపివేయబడుతుంది."</string>
+ <!-- no translation found for battery_saver_confirmation_title (5299585433050361634) -->
+ <skip />
+ <!-- no translation found for battery_saver_confirmation_ok (7507968430447930257) -->
+ <skip />
+ <!-- no translation found for battery_saver_start_action (5576697451677486320) -->
+ <skip />
<string name="status_bar_settings_settings_button" msgid="3023889916699270224">"సెట్టింగ్లు"</string>
<string name="status_bar_settings_wifi_button" msgid="1733928151698311923">"Wi-Fi"</string>
<string name="status_bar_settings_airplane" msgid="4879879698500955300">"ఎయిర్ప్లేన్ మోడ్"</string>
@@ -286,8 +288,10 @@
<item quantity="other" msgid="5408537517529822157">"%d గంటలకు"</item>
</plurals>
<string name="battery_saver_notification_title" msgid="237918726750955859">"బ్యాటర్ సేవర్ ఆన్ చేయబడింది"</string>
- <string name="battery_saver_notification_text" msgid="7796554871101546872">"పరికరం పనితీరు తగ్గించబడింది."</string>
- <string name="battery_saver_notification_action_text" msgid="7546297220816993504">"బ్యాటరీ సేవర్ సెట్టింగ్లను తెరువు"</string>
+ <!-- no translation found for battery_saver_notification_text (820318788126672692) -->
+ <skip />
+ <!-- no translation found for battery_saver_notification_action_text (109158658238110382) -->
+ <skip />
<string name="battery_level_template" msgid="1609636980292580020">"<xliff:g id="LEVEL">%d</xliff:g>%%"</string>
<string name="notification_hidden_text" msgid="1135169301897151909">"కంటెంట్లు దాచబడ్డాయి"</string>
<string name="media_projection_dialog_text" msgid="3071431025448218928">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> మీ స్క్రీన్పై కనిపించే ప్రతిదాన్ని క్యాప్చర్ చేయడం ప్రారంభిస్తుంది."</string>
diff --git a/packages/SystemUI/res/values-th/strings.xml b/packages/SystemUI/res/values-th/strings.xml
index a1126df..6693e08 100644
--- a/packages/SystemUI/res/values-th/strings.xml
+++ b/packages/SystemUI/res/values-th/strings.xml
@@ -39,10 +39,12 @@
<string name="invalid_charger_title" msgid="3515740382572798460">"ไม่รองรับการชาร์จผ่าน USB"</string>
<string name="invalid_charger_text" msgid="5474997287953892710">"ใช้เฉพาะที่ชาร์จที่ให้มา"</string>
<string name="battery_low_why" msgid="4553600287639198111">"การตั้งค่า"</string>
- <string name="battery_saver_confirmation_title" msgid="5987726159603849352">"เริ่มใช้โหมดประหยัดแบตเตอรี่ใช่ไหม"</string>
- <string name="battery_saver_confirmation_ok" msgid="7283108887345688413">"เริ่ม"</string>
- <string name="battery_saver_start_action" msgid="7245333922937402896">"เริ่มโหมดประหยัดแบตเตอรี่"</string>
- <string name="battery_saver_confirmation_text" msgid="8417584516834617662">"เพื่อช่วยให้ใช้งานแบตเตอรี่ได้ยาวนานขึ้น โหมดประหยัดแบตเตอรี่จะลดประสิทธิภาพการทำงานของอุปกรณ์ลง\n\nโหมดประหยัดแบตเตอรี่จะปิดเมื่อคุณเสียบปลั๊กไฟกับอุปกรณ์"</string>
+ <!-- no translation found for battery_saver_confirmation_title (5299585433050361634) -->
+ <skip />
+ <!-- no translation found for battery_saver_confirmation_ok (7507968430447930257) -->
+ <skip />
+ <!-- no translation found for battery_saver_start_action (5576697451677486320) -->
+ <skip />
<string name="status_bar_settings_settings_button" msgid="3023889916699270224">"การตั้งค่า"</string>
<string name="status_bar_settings_wifi_button" msgid="1733928151698311923">"WiFi"</string>
<string name="status_bar_settings_airplane" msgid="4879879698500955300">"โหมดใช้งานบนเครื่องบิน"</string>
@@ -286,8 +288,10 @@
<item quantity="other" msgid="5408537517529822157">"%d ชั่วโมง"</item>
</plurals>
<string name="battery_saver_notification_title" msgid="237918726750955859">"เปิดโหมดประหยัดแบตเตอรี่อยู่"</string>
- <string name="battery_saver_notification_text" msgid="7796554871101546872">"ประสิทธิภาพการทำงานของอุปกรณ์ลดลง"</string>
- <string name="battery_saver_notification_action_text" msgid="7546297220816993504">"เปิดการตั้งค่าโหมดประหยัดแบตเตอรี่"</string>
+ <!-- no translation found for battery_saver_notification_text (820318788126672692) -->
+ <skip />
+ <!-- no translation found for battery_saver_notification_action_text (109158658238110382) -->
+ <skip />
<string name="battery_level_template" msgid="1609636980292580020">"<xliff:g id="LEVEL">%d</xliff:g>%%"</string>
<string name="notification_hidden_text" msgid="1135169301897151909">"เนื้อหาที่ซ่อน"</string>
<string name="media_projection_dialog_text" msgid="3071431025448218928">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> จะเริ่มจับภาพทุกอย่างที่แสดงบนหน้าจอ"</string>
diff --git a/packages/SystemUI/res/values-tl/strings.xml b/packages/SystemUI/res/values-tl/strings.xml
index 850e6a1..2045be0 100644
--- a/packages/SystemUI/res/values-tl/strings.xml
+++ b/packages/SystemUI/res/values-tl/strings.xml
@@ -39,10 +39,12 @@
<string name="invalid_charger_title" msgid="3515740382572798460">"Hindi sinusuportahan ang pagtsa-charge gamit ang USB."</string>
<string name="invalid_charger_text" msgid="5474997287953892710">"Gamitin lang ang ibinigay na charger."</string>
<string name="battery_low_why" msgid="4553600287639198111">"Mga Setting"</string>
- <string name="battery_saver_confirmation_title" msgid="5987726159603849352">"Simulan ang tagatipid ng baterya?"</string>
- <string name="battery_saver_confirmation_ok" msgid="7283108887345688413">"Magsimula"</string>
- <string name="battery_saver_start_action" msgid="7245333922937402896">"Simulan ang tagatipid ng baterya"</string>
- <string name="battery_saver_confirmation_text" msgid="8417584516834617662">"Upang makatulong na patagalin ang baterya, babawasan ng Tagatipid ng baterya ang pagganap ng iyong device.\n\nIdi-disable ang tagatipid ng baterya kapag naka-plug in ang iyong device."</string>
+ <!-- no translation found for battery_saver_confirmation_title (5299585433050361634) -->
+ <skip />
+ <!-- no translation found for battery_saver_confirmation_ok (7507968430447930257) -->
+ <skip />
+ <!-- no translation found for battery_saver_start_action (5576697451677486320) -->
+ <skip />
<string name="status_bar_settings_settings_button" msgid="3023889916699270224">"Mga Setting"</string>
<string name="status_bar_settings_wifi_button" msgid="1733928151698311923">"Wi-Fi"</string>
<string name="status_bar_settings_airplane" msgid="4879879698500955300">"Airplane mode"</string>
@@ -286,8 +288,10 @@
<item quantity="other" msgid="5408537517529822157">"Sa loob ng %d (na) oras"</item>
</plurals>
<string name="battery_saver_notification_title" msgid="237918726750955859">"Naka-on ang tagatipid ng baterya"</string>
- <string name="battery_saver_notification_text" msgid="7796554871101546872">"Binawasan ang pagganap ng device."</string>
- <string name="battery_saver_notification_action_text" msgid="7546297220816993504">"Buksan ang mga setting ng tagatipid ng baterya"</string>
+ <!-- no translation found for battery_saver_notification_text (820318788126672692) -->
+ <skip />
+ <!-- no translation found for battery_saver_notification_action_text (109158658238110382) -->
+ <skip />
<string name="battery_level_template" msgid="1609636980292580020">"<xliff:g id="LEVEL">%d</xliff:g>%%"</string>
<string name="notification_hidden_text" msgid="1135169301897151909">"Nakatago ang mga content"</string>
<string name="media_projection_dialog_text" msgid="3071431025448218928">"Sisimulan ng i-capture ng <xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> ang lahat ng ipinapakita sa iyong screen."</string>
diff --git a/packages/SystemUI/res/values-tr/strings.xml b/packages/SystemUI/res/values-tr/strings.xml
index 4884b57..7cbfcc9 100644
--- a/packages/SystemUI/res/values-tr/strings.xml
+++ b/packages/SystemUI/res/values-tr/strings.xml
@@ -39,10 +39,12 @@
<string name="invalid_charger_title" msgid="3515740382572798460">"USB şarjı desteklenmiyor."</string>
<string name="invalid_charger_text" msgid="5474997287953892710">"Yalnızca ürünle birlikte verilen şarj cihazını kullanın."</string>
<string name="battery_low_why" msgid="4553600287639198111">"Ayarlar"</string>
- <string name="battery_saver_confirmation_title" msgid="5987726159603849352">"Pil tasarrufu başlatılsın mı?"</string>
- <string name="battery_saver_confirmation_ok" msgid="7283108887345688413">"Başlat"</string>
- <string name="battery_saver_start_action" msgid="7245333922937402896">"Pil tasarrufunu başlat"</string>
- <string name="battery_saver_confirmation_text" msgid="8417584516834617662">"Pil tasarrufu, pil ömrünü iyileştirmeye yardımcı olmak için cihazınızın performansını düşürür.\n\nCihazınız fişe takıldığında Pil tasarrufu devre dışı bırakılır."</string>
+ <!-- no translation found for battery_saver_confirmation_title (5299585433050361634) -->
+ <skip />
+ <!-- no translation found for battery_saver_confirmation_ok (7507968430447930257) -->
+ <skip />
+ <!-- no translation found for battery_saver_start_action (5576697451677486320) -->
+ <skip />
<string name="status_bar_settings_settings_button" msgid="3023889916699270224">"Ayarlar"</string>
<string name="status_bar_settings_wifi_button" msgid="1733928151698311923">"Kablosuz"</string>
<string name="status_bar_settings_airplane" msgid="4879879698500955300">"Uçak modu"</string>
@@ -286,8 +288,10 @@
<item quantity="other" msgid="5408537517529822157">"%d saat süreyle"</item>
</plurals>
<string name="battery_saver_notification_title" msgid="237918726750955859">"Pil tasarrufu açık"</string>
- <string name="battery_saver_notification_text" msgid="7796554871101546872">"Cihazın performansı düşürüldü."</string>
- <string name="battery_saver_notification_action_text" msgid="7546297220816993504">"Pil tasarrufu ayarlarını aç"</string>
+ <!-- no translation found for battery_saver_notification_text (820318788126672692) -->
+ <skip />
+ <!-- no translation found for battery_saver_notification_action_text (109158658238110382) -->
+ <skip />
<string name="battery_level_template" msgid="1609636980292580020">"%%<xliff:g id="LEVEL">%d</xliff:g>"</string>
<string name="notification_hidden_text" msgid="1135169301897151909">"İçerik gizlendi"</string>
<string name="media_projection_dialog_text" msgid="3071431025448218928">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g>, ekranınızda görüntülenen her şeyi kaydetmeye başlayacak."</string>
diff --git a/packages/SystemUI/res/values-uk/strings.xml b/packages/SystemUI/res/values-uk/strings.xml
index 7ec651b..803f381 100644
--- a/packages/SystemUI/res/values-uk/strings.xml
+++ b/packages/SystemUI/res/values-uk/strings.xml
@@ -39,10 +39,12 @@
<string name="invalid_charger_title" msgid="3515740382572798460">"Заряджання через USB не підтримується."</string>
<string name="invalid_charger_text" msgid="5474997287953892710">"Використовуйте лише зарядний пристрій, який постачається в комплекті."</string>
<string name="battery_low_why" msgid="4553600287639198111">"Налаштування"</string>
- <string name="battery_saver_confirmation_title" msgid="5987726159603849352">"Увімкнути режим заощадження заряду акумулятора?"</string>
- <string name="battery_saver_confirmation_ok" msgid="7283108887345688413">"Почати"</string>
- <string name="battery_saver_start_action" msgid="7245333922937402896">"Увімкнути режим заощадження заряду акумулятора"</string>
- <string name="battery_saver_confirmation_text" msgid="8417584516834617662">"Щоб подовжити роботу акумулятора, буде знижено продуктивність пристрою.\n\nРежим заощадження заряду акумулятора вимкнеться, коли пристрій буде підключено до мережі живлення."</string>
+ <!-- no translation found for battery_saver_confirmation_title (5299585433050361634) -->
+ <skip />
+ <!-- no translation found for battery_saver_confirmation_ok (7507968430447930257) -->
+ <skip />
+ <!-- no translation found for battery_saver_start_action (5576697451677486320) -->
+ <skip />
<string name="status_bar_settings_settings_button" msgid="3023889916699270224">"Налаштування"</string>
<string name="status_bar_settings_wifi_button" msgid="1733928151698311923">"Wi-Fi"</string>
<string name="status_bar_settings_airplane" msgid="4879879698500955300">"Режим польоту"</string>
@@ -286,8 +288,10 @@
<item quantity="other" msgid="5408537517529822157">"Протягом %d год"</item>
</plurals>
<string name="battery_saver_notification_title" msgid="237918726750955859">"Режим заощадження заряду акумулятора ввімкнено"</string>
- <string name="battery_saver_notification_text" msgid="7796554871101546872">"Продуктивність пристрою знижено."</string>
- <string name="battery_saver_notification_action_text" msgid="7546297220816993504">"Відкрийте налаштування режиму заощадження заряду акумулятора"</string>
+ <!-- no translation found for battery_saver_notification_text (820318788126672692) -->
+ <skip />
+ <!-- no translation found for battery_saver_notification_action_text (109158658238110382) -->
+ <skip />
<string name="battery_level_template" msgid="1609636980292580020">"<xliff:g id="LEVEL">%d</xliff:g>%%"</string>
<string name="notification_hidden_text" msgid="1135169301897151909">"Вміст сховано"</string>
<string name="media_projection_dialog_text" msgid="3071431025448218928">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> отримає доступ до всіх даних, які відображаються на вашому екрані."</string>
diff --git a/packages/SystemUI/res/values-ur-rPK/strings.xml b/packages/SystemUI/res/values-ur-rPK/strings.xml
index 6ff5a63..beaa55a 100644
--- a/packages/SystemUI/res/values-ur-rPK/strings.xml
+++ b/packages/SystemUI/res/values-ur-rPK/strings.xml
@@ -39,10 +39,12 @@
<string name="invalid_charger_title" msgid="3515740382572798460">"USB چارجنگ تعاون یافتہ نہیں ہے۔"</string>
<string name="invalid_charger_text" msgid="5474997287953892710">"صرف فراہم کردہ چارجر استعمال کریں۔"</string>
<string name="battery_low_why" msgid="4553600287639198111">"ترتیبات"</string>
- <string name="battery_saver_confirmation_title" msgid="5987726159603849352">"بیٹری سیور شروع کریں؟"</string>
- <string name="battery_saver_confirmation_ok" msgid="7283108887345688413">"شروع کریں"</string>
- <string name="battery_saver_start_action" msgid="7245333922937402896">"بیٹری سیور شروع کریں"</string>
- <string name="battery_saver_confirmation_text" msgid="8417584516834617662">"بیٹری کی میعاد کو بہتر بنانے میں مدد کرنے کیلئے، بیٹری سیور آپ کے آلے کی کارکردگی میں تخفیف کر دے گی۔\n\n آپ کا آلہ پلگ ان ہونے پر بیٹری سیور غیر فعال ہو جائے گی۔"</string>
+ <!-- no translation found for battery_saver_confirmation_title (5299585433050361634) -->
+ <skip />
+ <!-- no translation found for battery_saver_confirmation_ok (7507968430447930257) -->
+ <skip />
+ <!-- no translation found for battery_saver_start_action (5576697451677486320) -->
+ <skip />
<string name="status_bar_settings_settings_button" msgid="3023889916699270224">"ترتیبات"</string>
<string name="status_bar_settings_wifi_button" msgid="1733928151698311923">"Wi-Fi"</string>
<string name="status_bar_settings_airplane" msgid="4879879698500955300">"ہوائی جہاز وضع"</string>
@@ -286,8 +288,10 @@
<item quantity="other" msgid="5408537517529822157">"%d گھنٹوں کیلئے"</item>
</plurals>
<string name="battery_saver_notification_title" msgid="237918726750955859">"بیٹری سیور آن ہے"</string>
- <string name="battery_saver_notification_text" msgid="7796554871101546872">"آلہ کی کارکردگی کم ہوگئی ہے۔"</string>
- <string name="battery_saver_notification_action_text" msgid="7546297220816993504">"بیٹری سیور کی ترتیبات کھولیں"</string>
+ <!-- no translation found for battery_saver_notification_text (820318788126672692) -->
+ <skip />
+ <!-- no translation found for battery_saver_notification_action_text (109158658238110382) -->
+ <skip />
<string name="battery_level_template" msgid="1609636980292580020">"<xliff:g id="LEVEL">%d</xliff:g>%%"</string>
<string name="notification_hidden_text" msgid="1135169301897151909">"مواد مخفی ہیں"</string>
<string name="media_projection_dialog_text" msgid="3071431025448218928">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> آپ کی اسکرین پر ڈسپلے ہونے والی ہر چیز کو کیپچر کرنا شروع کر دیگی۔"</string>
diff --git a/packages/SystemUI/res/values-uz-rUZ/strings.xml b/packages/SystemUI/res/values-uz-rUZ/strings.xml
index d8b5699..d9ad468 100644
--- a/packages/SystemUI/res/values-uz-rUZ/strings.xml
+++ b/packages/SystemUI/res/values-uz-rUZ/strings.xml
@@ -39,10 +39,12 @@
<string name="invalid_charger_title" msgid="3515740382572798460">"USB orqali quvvat oldirish qo‘llab-quvvatlanmaydi."</string>
<string name="invalid_charger_text" msgid="5474997287953892710">"Faqat qurilma bilan kelgan quvvatlash moslamasidan foydalaning."</string>
<string name="battery_low_why" msgid="4553600287639198111">"Sozlamalar"</string>
- <string name="battery_saver_confirmation_title" msgid="5987726159603849352">"Quvvat tejash boshlansinmi?"</string>
- <string name="battery_saver_confirmation_ok" msgid="7283108887345688413">"Boshlash"</string>
- <string name="battery_saver_start_action" msgid="7245333922937402896">"Quvvat tejashni boshlash"</string>
- <string name="battery_saver_confirmation_text" msgid="8417584516834617662">"Batareya quvvatini ko‘proq vaqtga yetkazish uchun Quvvat tejash funksiyasi qurilmangizning unumdorligini kamaytiradi.\n\nQurilmangiz quvvat olish uchun elektr ta’minotiga ulanganda Quvvat tejash funksiyasi o‘chiriladi."</string>
+ <!-- no translation found for battery_saver_confirmation_title (5299585433050361634) -->
+ <skip />
+ <!-- no translation found for battery_saver_confirmation_ok (7507968430447930257) -->
+ <skip />
+ <!-- no translation found for battery_saver_start_action (5576697451677486320) -->
+ <skip />
<string name="status_bar_settings_settings_button" msgid="3023889916699270224">"Sozlamalar"</string>
<string name="status_bar_settings_wifi_button" msgid="1733928151698311923">"Wi-Fi"</string>
<string name="status_bar_settings_airplane" msgid="4879879698500955300">"Parvoz rejimi"</string>
@@ -286,8 +288,10 @@
<item quantity="other" msgid="5408537517529822157">"%d soat"</item>
</plurals>
<string name="battery_saver_notification_title" msgid="237918726750955859">"Quvvat tejash yoqilgan"</string>
- <string name="battery_saver_notification_text" msgid="7796554871101546872">"Qurilmaning unumdorligi kamaytirildi."</string>
- <string name="battery_saver_notification_action_text" msgid="7546297220816993504">"Quvvat tejash sozlamalarini ochish"</string>
+ <!-- no translation found for battery_saver_notification_text (820318788126672692) -->
+ <skip />
+ <!-- no translation found for battery_saver_notification_action_text (109158658238110382) -->
+ <skip />
<string name="battery_level_template" msgid="1609636980292580020">"<xliff:g id="LEVEL">%d</xliff:g>%%"</string>
<string name="notification_hidden_text" msgid="1135169301897151909">"Kontent yashirildi"</string>
<string name="media_projection_dialog_text" msgid="3071431025448218928">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> ilovasi qurilma ekranidagi har qanday tasvirni ko‘rishni boshlaydi."</string>
diff --git a/packages/SystemUI/res/values-vi/strings.xml b/packages/SystemUI/res/values-vi/strings.xml
index 360c087..c6e8c63 100644
--- a/packages/SystemUI/res/values-vi/strings.xml
+++ b/packages/SystemUI/res/values-vi/strings.xml
@@ -39,10 +39,12 @@
<string name="invalid_charger_title" msgid="3515740382572798460">"Sạc qua USB không được hỗ trợ."</string>
<string name="invalid_charger_text" msgid="5474997287953892710">"Chỉ sử dụng bộ sạc được cung cấp."</string>
<string name="battery_low_why" msgid="4553600287639198111">"Cài đặt"</string>
- <string name="battery_saver_confirmation_title" msgid="5987726159603849352">"Khởi động trình tiết kiệm pin?"</string>
- <string name="battery_saver_confirmation_ok" msgid="7283108887345688413">"Bắt đầu"</string>
- <string name="battery_saver_start_action" msgid="7245333922937402896">"Khởi động trình tiết kiệm pin"</string>
- <string name="battery_saver_confirmation_text" msgid="8417584516834617662">"Để giúp tăng tuổi thọ pin, trình tiết kiệm pin sẽ giảm hiệu suất của thiết bị.\n\nTrình tiết kiệm pin sẽ tắt khi thiết bị của bạn được cắm vào nguồn điện."</string>
+ <!-- no translation found for battery_saver_confirmation_title (5299585433050361634) -->
+ <skip />
+ <!-- no translation found for battery_saver_confirmation_ok (7507968430447930257) -->
+ <skip />
+ <!-- no translation found for battery_saver_start_action (5576697451677486320) -->
+ <skip />
<string name="status_bar_settings_settings_button" msgid="3023889916699270224">"Cài đặt"</string>
<string name="status_bar_settings_wifi_button" msgid="1733928151698311923">"Wi-Fi"</string>
<string name="status_bar_settings_airplane" msgid="4879879698500955300">"Chế độ trên máy bay"</string>
@@ -150,7 +152,7 @@
<string name="accessibility_tty_enabled" msgid="4613200365379426561">"Đã bật TeleTypewriter."</string>
<string name="accessibility_ringer_vibrate" msgid="666585363364155055">"Chuông rung."</string>
<string name="accessibility_ringer_silent" msgid="9061243307939135383">"Chuông im lặng."</string>
- <string name="accessibility_recents_item_will_be_dismissed" msgid="395770242498031481">"Loại bỏ <xliff:g id="APP">%s</xliff:g>."</string>
+ <string name="accessibility_recents_item_will_be_dismissed" msgid="395770242498031481">"Xóa bỏ <xliff:g id="APP">%s</xliff:g>."</string>
<string name="accessibility_recents_item_dismissed" msgid="6803574935084867070">"<xliff:g id="APP">%s</xliff:g> đã bị loại bỏ."</string>
<string name="accessibility_recents_item_launched" msgid="7616039892382525203">"Bắt đầu <xliff:g id="APP">%s</xliff:g>."</string>
<string name="accessibility_notification_dismissed" msgid="854211387186306927">"Đã loại bỏ thông báo."</string>
@@ -286,8 +288,10 @@
<item quantity="other" msgid="5408537517529822157">"Trong %d giờ"</item>
</plurals>
<string name="battery_saver_notification_title" msgid="237918726750955859">"Trình tiết kiệm pin đang bật"</string>
- <string name="battery_saver_notification_text" msgid="7796554871101546872">"Hiệu suất của thiết bị đã giảm."</string>
- <string name="battery_saver_notification_action_text" msgid="7546297220816993504">"Mở cài đặt trình tiết kiệm pin"</string>
+ <!-- no translation found for battery_saver_notification_text (820318788126672692) -->
+ <skip />
+ <!-- no translation found for battery_saver_notification_action_text (109158658238110382) -->
+ <skip />
<string name="battery_level_template" msgid="1609636980292580020">"<xliff:g id="LEVEL">%d</xliff:g>%%"</string>
<string name="notification_hidden_text" msgid="1135169301897151909">"Nội dung bị ẩn"</string>
<string name="media_projection_dialog_text" msgid="3071431025448218928">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> sẽ bắt đầu chụp mọi thứ hiển thị trên màn hình."</string>
diff --git a/packages/SystemUI/res/values-zh-rCN/strings.xml b/packages/SystemUI/res/values-zh-rCN/strings.xml
index 939bb49..3c62aa8 100644
--- a/packages/SystemUI/res/values-zh-rCN/strings.xml
+++ b/packages/SystemUI/res/values-zh-rCN/strings.xml
@@ -39,10 +39,12 @@
<string name="invalid_charger_title" msgid="3515740382572798460">"不支持USB充电。"</string>
<string name="invalid_charger_text" msgid="5474997287953892710">"仅限使用设备随附的充电器。"</string>
<string name="battery_low_why" msgid="4553600287639198111">"设置"</string>
- <string name="battery_saver_confirmation_title" msgid="5987726159603849352">"要开启节电助手吗?"</string>
- <string name="battery_saver_confirmation_ok" msgid="7283108887345688413">"开启"</string>
- <string name="battery_saver_start_action" msgid="7245333922937402896">"开启节电助手"</string>
- <string name="battery_saver_confirmation_text" msgid="8417584516834617662">"为了延长电池的续航时间,节电助手会减降设备的性能。\n\n设备接通电源后,节电助手会自动关闭。"</string>
+ <!-- no translation found for battery_saver_confirmation_title (5299585433050361634) -->
+ <skip />
+ <!-- no translation found for battery_saver_confirmation_ok (7507968430447930257) -->
+ <skip />
+ <!-- no translation found for battery_saver_start_action (5576697451677486320) -->
+ <skip />
<string name="status_bar_settings_settings_button" msgid="3023889916699270224">"设置"</string>
<string name="status_bar_settings_wifi_button" msgid="1733928151698311923">"WLAN"</string>
<string name="status_bar_settings_airplane" msgid="4879879698500955300">"飞行模式"</string>
@@ -152,7 +154,7 @@
<string name="accessibility_tty_enabled" msgid="4613200365379426561">"电传打字机已启用。"</string>
<string name="accessibility_ringer_vibrate" msgid="666585363364155055">"振铃器振动。"</string>
<string name="accessibility_ringer_silent" msgid="9061243307939135383">"振铃器静音。"</string>
- <string name="accessibility_recents_item_will_be_dismissed" msgid="395770242498031481">"关闭<xliff:g id="APP">%s</xliff:g>。"</string>
+ <string name="accessibility_recents_item_will_be_dismissed" msgid="395770242498031481">"移除<xliff:g id="APP">%s</xliff:g>。"</string>
<string name="accessibility_recents_item_dismissed" msgid="6803574935084867070">"已删除<xliff:g id="APP">%s</xliff:g>"</string>
<string name="accessibility_recents_item_launched" msgid="7616039892382525203">"正在启动<xliff:g id="APP">%s</xliff:g>。"</string>
<string name="accessibility_notification_dismissed" msgid="854211387186306927">"已关闭通知。"</string>
@@ -288,8 +290,10 @@
<item quantity="other" msgid="5408537517529822157">"%d小时"</item>
</plurals>
<string name="battery_saver_notification_title" msgid="237918726750955859">"节电助手已开启"</string>
- <string name="battery_saver_notification_text" msgid="7796554871101546872">"设备性能已减降。"</string>
- <string name="battery_saver_notification_action_text" msgid="7546297220816993504">"打开节电助手设置"</string>
+ <!-- no translation found for battery_saver_notification_text (820318788126672692) -->
+ <skip />
+ <!-- no translation found for battery_saver_notification_action_text (109158658238110382) -->
+ <skip />
<string name="battery_level_template" msgid="1609636980292580020">"<xliff:g id="LEVEL">%d</xliff:g>%%"</string>
<string name="notification_hidden_text" msgid="1135169301897151909">"内容已隐藏"</string>
<string name="media_projection_dialog_text" msgid="3071431025448218928">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g>将开始截取您的屏幕上显示的所有内容。"</string>
diff --git a/packages/SystemUI/res/values-zh-rHK/strings.xml b/packages/SystemUI/res/values-zh-rHK/strings.xml
index 832c507..1fd79573 100644
--- a/packages/SystemUI/res/values-zh-rHK/strings.xml
+++ b/packages/SystemUI/res/values-zh-rHK/strings.xml
@@ -39,10 +39,12 @@
<string name="invalid_charger_title" msgid="3515740382572798460">"不支援 USB 充電功能。"</string>
<string name="invalid_charger_text" msgid="5474997287953892710">"僅限使用裝置隨附的充電器。"</string>
<string name="battery_low_why" msgid="4553600287639198111">"設定"</string>
- <string name="battery_saver_confirmation_title" msgid="5987726159603849352">"啟動省電模式?"</string>
- <string name="battery_saver_confirmation_ok" msgid="7283108887345688413">"開始"</string>
- <string name="battery_saver_start_action" msgid="7245333922937402896">"啟動省電模式"</string>
- <string name="battery_saver_confirmation_text" msgid="8417584516834617662">"省電模式可延長電池使用時間,但會降低裝置的效能。\n\n裝置充電時,省電模式會自動停用。"</string>
+ <!-- no translation found for battery_saver_confirmation_title (5299585433050361634) -->
+ <skip />
+ <!-- no translation found for battery_saver_confirmation_ok (7507968430447930257) -->
+ <skip />
+ <!-- no translation found for battery_saver_start_action (5576697451677486320) -->
+ <skip />
<string name="status_bar_settings_settings_button" msgid="3023889916699270224">"設定"</string>
<string name="status_bar_settings_wifi_button" msgid="1733928151698311923">"Wi-Fi"</string>
<string name="status_bar_settings_airplane" msgid="4879879698500955300">"飛行模式"</string>
@@ -288,8 +290,10 @@
<item quantity="other" msgid="5408537517529822157">"%d 小時"</item>
</plurals>
<string name="battery_saver_notification_title" msgid="237918726750955859">"省電模式已開啟"</string>
- <string name="battery_saver_notification_text" msgid="7796554871101546872">"裝置效能已降低。"</string>
- <string name="battery_saver_notification_action_text" msgid="7546297220816993504">"開啟省電設定"</string>
+ <!-- no translation found for battery_saver_notification_text (820318788126672692) -->
+ <skip />
+ <!-- no translation found for battery_saver_notification_action_text (109158658238110382) -->
+ <skip />
<string name="battery_level_template" msgid="1609636980292580020">"<xliff:g id="LEVEL">%d</xliff:g>%%"</string>
<string name="notification_hidden_text" msgid="1135169301897151909">"內容已隱藏"</string>
<string name="media_projection_dialog_text" msgid="3071431025448218928">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> 將開始擷取您的螢幕上顯示的內容。"</string>
diff --git a/packages/SystemUI/res/values-zh-rTW/strings.xml b/packages/SystemUI/res/values-zh-rTW/strings.xml
index 24ed6bf..5cfdf54 100644
--- a/packages/SystemUI/res/values-zh-rTW/strings.xml
+++ b/packages/SystemUI/res/values-zh-rTW/strings.xml
@@ -39,10 +39,12 @@
<string name="invalid_charger_title" msgid="3515740382572798460">"不支援 USB 充電功能。"</string>
<string name="invalid_charger_text" msgid="5474997287953892710">"僅限使用裝置隨附的充電器。"</string>
<string name="battery_low_why" msgid="4553600287639198111">"設定"</string>
- <string name="battery_saver_confirmation_title" msgid="5987726159603849352">"啟動節約耗電量模式?"</string>
- <string name="battery_saver_confirmation_ok" msgid="7283108887345688413">"啟動"</string>
- <string name="battery_saver_start_action" msgid="7245333922937402896">"啟動節約耗電量模式"</string>
- <string name="battery_saver_confirmation_text" msgid="8417584516834617662">"節約耗電量模式有助於延長電池續航力,但會讓裝置的效能降低。\n\n裝置接上電源時,節約耗電量模式會自動停用。"</string>
+ <!-- no translation found for battery_saver_confirmation_title (5299585433050361634) -->
+ <skip />
+ <!-- no translation found for battery_saver_confirmation_ok (7507968430447930257) -->
+ <skip />
+ <!-- no translation found for battery_saver_start_action (5576697451677486320) -->
+ <skip />
<string name="status_bar_settings_settings_button" msgid="3023889916699270224">"設定"</string>
<string name="status_bar_settings_wifi_button" msgid="1733928151698311923">"Wi-Fi"</string>
<string name="status_bar_settings_airplane" msgid="4879879698500955300">"飛行模式"</string>
@@ -288,8 +290,10 @@
<item quantity="other" msgid="5408537517529822157">"%d 小時"</item>
</plurals>
<string name="battery_saver_notification_title" msgid="237918726750955859">"節約耗電量模式已啟用"</string>
- <string name="battery_saver_notification_text" msgid="7796554871101546872">"裝置效能已降低。"</string>
- <string name="battery_saver_notification_action_text" msgid="7546297220816993504">"開啟節約耗電量設定"</string>
+ <!-- no translation found for battery_saver_notification_text (820318788126672692) -->
+ <skip />
+ <!-- no translation found for battery_saver_notification_action_text (109158658238110382) -->
+ <skip />
<string name="battery_level_template" msgid="1609636980292580020">"<xliff:g id="LEVEL">%d</xliff:g>%%"</string>
<string name="notification_hidden_text" msgid="1135169301897151909">"內容已隱藏"</string>
<string name="media_projection_dialog_text" msgid="3071431025448218928">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> 將開始擷取您的螢幕上顯示的內容。"</string>
diff --git a/packages/SystemUI/res/values-zu/strings.xml b/packages/SystemUI/res/values-zu/strings.xml
index d815668..f71ec15 100644
--- a/packages/SystemUI/res/values-zu/strings.xml
+++ b/packages/SystemUI/res/values-zu/strings.xml
@@ -39,10 +39,12 @@
<string name="invalid_charger_title" msgid="3515740382572798460">"Ukushaja kwe-USB akusekelwe."</string>
<string name="invalid_charger_text" msgid="5474997287953892710">"Sebenzisa kuphela ishaja enikeziwe."</string>
<string name="battery_low_why" msgid="4553600287639198111">"Izilungiselelo"</string>
- <string name="battery_saver_confirmation_title" msgid="5987726159603849352">"Qala isilondolozi sebhethri?"</string>
- <string name="battery_saver_confirmation_ok" msgid="7283108887345688413">"Qala"</string>
- <string name="battery_saver_start_action" msgid="7245333922937402896">"Qala isilondolozi sebhethri"</string>
- <string name="battery_saver_confirmation_text" msgid="8417584516834617662">"Ukusiza ukuthuthukisa impilo yebhethri, Isilondolozi Sebhethri sizonciphisa ukusebenza kwedivayisi yakho.\n\nIsilondolozi Sebhethri sizokhutshazwa uma idivayisi yakho ixhunywa."</string>
+ <!-- no translation found for battery_saver_confirmation_title (5299585433050361634) -->
+ <skip />
+ <!-- no translation found for battery_saver_confirmation_ok (7507968430447930257) -->
+ <skip />
+ <!-- no translation found for battery_saver_start_action (5576697451677486320) -->
+ <skip />
<string name="status_bar_settings_settings_button" msgid="3023889916699270224">"Izilungiselelo"</string>
<string name="status_bar_settings_wifi_button" msgid="1733928151698311923">"I-Wi-Fi"</string>
<string name="status_bar_settings_airplane" msgid="4879879698500955300">"Imodi yendiza"</string>
@@ -286,8 +288,10 @@
<item quantity="other" msgid="5408537517529822157">"Amahora angu-%d"</item>
</plurals>
<string name="battery_saver_notification_title" msgid="237918726750955859">"Isilondolozi sebhethri sivuliwe"</string>
- <string name="battery_saver_notification_text" msgid="7796554871101546872">"Ukusebenza kwedivayisi kwehlisiwe."</string>
- <string name="battery_saver_notification_action_text" msgid="7546297220816993504">"Vula izilungiselelo zesilondolozi sebhethri"</string>
+ <!-- no translation found for battery_saver_notification_text (820318788126672692) -->
+ <skip />
+ <!-- no translation found for battery_saver_notification_action_text (109158658238110382) -->
+ <skip />
<string name="battery_level_template" msgid="1609636980292580020">"<xliff:g id="LEVEL">%d</xliff:g>%%"</string>
<string name="notification_hidden_text" msgid="1135169301897151909">"Okuqukethwe kufihliwe"</string>
<string name="media_projection_dialog_text" msgid="3071431025448218928">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> izoqala ukuthwebula yonke into eboniswa kusikrini sakho."</string>
diff --git a/packages/SystemUI/res/values/colors.xml b/packages/SystemUI/res/values/colors.xml
index a718f4f..a63deb0 100644
--- a/packages/SystemUI/res/values/colors.xml
+++ b/packages/SystemUI/res/values/colors.xml
@@ -44,6 +44,7 @@
<color name="qs_tile_text">#B3FFFFFF</color><!-- 70% white -->
<color name="qs_subhead">#99FFFFFF</color><!-- 60% white -->
<color name="qs_detail_empty">#24B0BEC5</color><!-- 14% blue grey 200-->
+ <color name="qs_detail_transition">#66FFFFFF</color>
<color name="data_usage_secondary">#99FFFFFF</color><!-- 60% white -->
<color name="data_usage_graph_track">#33FFFFFF</color><!-- 20% white -->
<color name="data_usage_graph_warning">#FFFFFFFF</color>
diff --git a/packages/SystemUI/res/values/config.xml b/packages/SystemUI/res/values/config.xml
index 230f4af..a4576bb 100644
--- a/packages/SystemUI/res/values/config.xml
+++ b/packages/SystemUI/res/values/config.xml
@@ -162,11 +162,17 @@
<!-- Doze: does this device support STATE_DOZE and STATE_DOZE_SUSPEND? -->
<bool name="doze_display_state_supported">false</bool>
- <!-- Doze: should the significant motion sensor be used as a tease signal? -->
- <bool name="doze_tease_on_significant_motion">false</bool>
+ <!-- Doze: should the significant motion sensor be used as a pulse signal? -->
+ <bool name="doze_pulse_on_significant_motion">false</bool>
- <!-- Doze: maximum brightness to use when teasing -->
- <integer name="doze_tease_brightness">80</integer>
+ <!-- Doze: maximum brightness to use when pulsing -->
+ <integer name="doze_pulse_brightness">40</integer>
+
+ <!-- Doze: number of pulses when doing multiple pulses in quick succession -->
+ <integer name="doze_multipulse_count">3</integer>
+
+ <!-- Doze: interval between pulses when following the notification light -->
+ <integer name="doze_notification_pulse_interval">30000</integer>
<!-- Volume: time to delay dismissing the volume panel after a click is performed -->
<integer name="volume_panel_dismiss_delay">200</integer>
diff --git a/packages/SystemUI/res/values/dimens.xml b/packages/SystemUI/res/values/dimens.xml
index 32474c9..32425ad 100644
--- a/packages/SystemUI/res/values/dimens.xml
+++ b/packages/SystemUI/res/values/dimens.xml
@@ -201,8 +201,8 @@
<!-- The min translation in the Z index for the last task. -->
<dimen name="recents_task_view_z_min">5dp</dimen>
- <!-- The translation in the Z index for each task above the last task. -->
- <dimen name="recents_task_view_z_increment">10dp</dimen>
+ <!-- The max translation in the Z index for the last task. -->
+ <dimen name="recents_task_view_z_max">65dp</dimen>
<!-- The amount to translate when animating the removal of a task. -->
<dimen name="recents_task_view_remove_anim_translation_x">100dp</dimen>
@@ -395,4 +395,8 @@
<!-- Margin on the left side of the battery % when on Keyguard. -->
<dimen name="header_battery_margin_keyguard">6dp</dimen>
+
+ <!-- Additional translation (downwards) for appearing notifications when going to the full shade
+ from Keyguard. -->
+ <dimen name="go_to_full_shade_appearing_translation">200dp</dimen>
</resources>
diff --git a/packages/SystemUI/res/values/strings.xml b/packages/SystemUI/res/values/strings.xml
index 085d2f9..83a9a81 100644
--- a/packages/SystemUI/res/values/strings.xml
+++ b/packages/SystemUI/res/values/strings.xml
@@ -86,16 +86,13 @@
<string name="battery_low_why">Settings</string>
<!-- Battery saver confirmation dialog title [CHAR LIMIT=NONE]-->
- <string name="battery_saver_confirmation_title">Start battery saver?</string>
+ <string name="battery_saver_confirmation_title">Turn on battery saver?</string>
<!-- Battery saver confirmation dialog ok text [CHAR LIMIT=40]-->
- <string name="battery_saver_confirmation_ok">Start</string>
+ <string name="battery_saver_confirmation_ok">Turn on</string>
<!-- Battery saver notification action [CHAR LIMIT=NONE]-->
- <string name="battery_saver_start_action">Start battery saver</string>
-
- <!-- Battery saver confirmation dialog text [CHAR LIMIT=NONE]-->
- <string name="battery_saver_confirmation_text">To help improve battery life, Battery saver will reduce your device’s performance.\n\nBattery saver will be disabled when your device is plugged in.</string>
+ <string name="battery_saver_start_action">Turn on battery saver</string>
<!-- Name of the button that links to the Settings app. [CHAR LIMIT=NONE] -->
<string name="status_bar_settings_settings_button">Settings</string>
@@ -719,10 +716,10 @@
<string name="battery_saver_notification_title">Battery saver is on</string>
<!-- Battery saver notification text. [CHAR LIMIT=60] -->
- <string name="battery_saver_notification_text">Device performance is reduced.</string>
+ <string name="battery_saver_notification_text">Reduces performance and background data</string>
<!-- Battery saver notification action text. [CHAR LIMIT=60] -->
- <string name="battery_saver_notification_action_text">Open battery saver settings</string>
+ <string name="battery_saver_notification_action_text">Turn off battery saver</string>
<!-- Battery level for expanded quick settings [CHAR LIMIT=2] -->
<string name="battery_level_template"><xliff:g id="level" example="45">%d</xliff:g>%%</string>
@@ -744,4 +741,38 @@
<!-- Text which is shown in the notification shade when there are no notifications. [CHAR LIMIT=30] -->
<string name="empty_shade_text">No notifications</string>
+
+ <!-- Footer device owned text [CHAR LIMIT=50] -->
+ <string name="device_owned_footer">Device may be monitored</string>
+
+ <!-- Footer vpn present text [CHAR LIMIT=50] -->
+ <string name="vpn_footer">Network may be monitored</string>
+
+ <!-- Monitoring dialog title for device owned devices [CHAR LIMIT=35] -->
+ <string name="monitoring_title_device_owned">Device monitoring</string>
+
+ <!-- Monitoring dialog title for normal devices [CHAR LIMIT=35]-->
+ <string name="monitoring_title">Network monitoring</string>
+
+ <!-- Monitoring dialog open app button [CHAR LIMIT=30] -->
+ <string name="open_app">Open app</string>
+
+ <!-- Monitoring dialog disconnect vpn button [CHAR LIMIT=30] -->
+ <string name="disconnect_vpn">Disconnect VPN</string>
+
+ <!-- Monitoring dialog device owner body text [CHAR LIMIT=300] -->
+ <string name="monitoring_description_device_owned">This device is managed by:\n<xliff:g id="organization">%1$s</xliff:g>\n\nYour administrator can monitor your network activity, including emails, apps and secure websites.\n\nFor more information, contact your administrator.</string>
+
+ <!-- Monitoring dialog non-legacy VPN text [CHAR LIMIT=300] -->
+ <string name="monitoring_description_vpn">You gave \"<xliff:g id="application">%1$s</xliff:g>\" permission to set up a VPN connection.\n\nThis app can monitor your network activity, including emails, apps and secure websites.</string>
+
+ <!-- Monitoring dialog legacy VPN text [CHAR LIMIT=300] -->
+ <string name="monitoring_description_legacy_vpn">You\'re connected to a VPN (\"<xliff:g id="application">%1$s</xliff:g>\").\n\nYour VPN service provider can monitor your network activity including emails, apps, and secure websites.</string>
+
+ <!-- Monitoring dialog non-legacy VPN with device owner text [CHAR LIMIT=300] -->
+ <string name="monitoring_description_vpn_device_owned">This device is managed by:\n<xliff:g id="organization">%1$s</xliff:g>\n\nYour administrator is capable of monitoring your network activity including emails, apps, and secure websites. For more information, contact your administrator.\n\nAlso, you gave \"<xliff:g id="application">%2$s</xliff:g>\" permission to set up a VPN connection. This app can monitor network activity too.</string>
+
+ <!-- Monitoring dialog legacy VPN with device owner text [CHAR LIMIT=300] -->
+ <string name="monitoring_description_legacy_vpn_device_owned">This device is managed by:\n<xliff:g id="organization">%1$s</xliff:g>\n\nYour administrator is capable of monitoring your network activity including emails, apps, and secure websites. For more information, contact your administrator.\n\nAlso, you\'re connected to a VPN (\"<xliff:g id="application">%2$s</xliff:g>\"). Your VPN service provider can monitor network activity too.</string>
+
</resources>
diff --git a/packages/SystemUI/src/com/android/systemui/EventLogTags.logtags b/packages/SystemUI/src/com/android/systemui/EventLogTags.logtags
index aa32e9c..5f2c348 100644
--- a/packages/SystemUI/src/com/android/systemui/EventLogTags.logtags
+++ b/packages/SystemUI/src/com/android/systemui/EventLogTags.logtags
@@ -6,6 +6,7 @@
# PhoneStatusBar.java
# ---------------------------
36000 sysui_statusbar_touch (type|1),(x|1),(y|1),(enabled|1)
+36001 sysui_heads_up_status (key|3),(visible|1)
# ---------------------------
# PhoneStatusBarView.java
diff --git a/packages/SystemUI/src/com/android/systemui/doze/DozeService.java b/packages/SystemUI/src/com/android/systemui/doze/DozeService.java
index 13c15f5..943a294 100644
--- a/packages/SystemUI/src/com/android/systemui/doze/DozeService.java
+++ b/packages/SystemUI/src/com/android/systemui/doze/DozeService.java
@@ -19,6 +19,8 @@
import static android.os.PowerManager.BRIGHTNESS_OFF;
import static android.os.PowerManager.BRIGHTNESS_ON;
+import android.app.AlarmManager;
+import android.app.PendingIntent;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
@@ -42,12 +44,16 @@
import java.io.FileDescriptor;
import java.io.PrintWriter;
+import java.util.Date;
public class DozeService extends DreamService {
private static final String TAG = "DozeService";
private static final boolean DEBUG = Log.isLoggable(TAG, Log.DEBUG);
- private static final String TEASE_ACTION = "com.android.systemui.doze.tease";
+ private static final String ACTION_BASE = "com.android.systemui.doze";
+ private static final String PULSE_ACTION = ACTION_BASE + ".pulse";
+ private static final String NOTIFICATION_PULSE_ACTION = ACTION_BASE + ".notification_pulse";
+ private static final String EXTRA_PULSES = "pulses";
private final String mTag = String.format(TAG + ".%08x", hashCode());
private final Context mContext = this;
@@ -58,13 +64,18 @@
private Sensor mSigMotionSensor;
private PowerManager mPowerManager;
private PowerManager.WakeLock mWakeLock;
+ private AlarmManager mAlarmManager;
private int mMaxBrightness;
private boolean mDreaming;
- private boolean mTeaseReceiverRegistered;
+ private boolean mBroadcastReceiverRegistered;
private boolean mSigMotionConfigured;
private boolean mSigMotionEnabled;
private boolean mDisplayStateSupported;
private int mDisplayStateWhenOn;
+ private boolean mNotificationLightOn;
+ private PendingIntent mNotificationPulseIntent;
+ private int mMultipulseCount;
+ private int mNotificationPulseInterval;
public DozeService() {
if (DEBUG) Log.d(mTag, "new DozeService()");
@@ -75,12 +86,15 @@
protected void dumpOnHandler(FileDescriptor fd, PrintWriter pw, String[] args) {
super.dumpOnHandler(fd, pw, args);
pw.print(" mDreaming: "); pw.println(mDreaming);
- pw.print(" mTeaseReceiverRegistered: "); pw.println(mTeaseReceiverRegistered);
+ pw.print(" mBroadcastReceiverRegistered: "); pw.println(mBroadcastReceiverRegistered);
pw.print(" mSigMotionSensor: "); pw.println(mSigMotionSensor);
pw.print(" mSigMotionConfigured: "); pw.println(mSigMotionConfigured);
pw.print(" mSigMotionEnabled: "); pw.println(mSigMotionEnabled);
pw.print(" mMaxBrightness: "); pw.println(mMaxBrightness);
pw.print(" mDisplayStateSupported: "); pw.println(mDisplayStateSupported);
+ pw.print(" mNotificationLightOn: "); pw.println(mNotificationLightOn);
+ pw.print(" mMultipulseCount: "); pw.println(mMultipulseCount);
+ pw.print(" mNotificationPulseInterval: "); pw.println(mNotificationPulseInterval);
}
@Override
@@ -99,14 +113,21 @@
mSigMotionSensor = mSensors.getDefaultSensor(Sensor.TYPE_SIGNIFICANT_MOTION);
mPowerManager = (PowerManager) mContext.getSystemService(Context.POWER_SERVICE);
mWakeLock = mPowerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, mTag);
+ mAlarmManager = (AlarmManager) mContext.getSystemService(Context.ALARM_SERVICE);
final Resources res = mContext.getResources();
- mSigMotionConfigured = SystemProperties.getBoolean("doze.tease.sigmotion",
- res.getBoolean(R.bool.doze_tease_on_significant_motion));
+ mSigMotionConfigured = SystemProperties.getBoolean("doze.pulse.sigmotion",
+ res.getBoolean(R.bool.doze_pulse_on_significant_motion));
mDisplayStateSupported = SystemProperties.getBoolean("doze.display.supported",
res.getBoolean(R.bool.doze_display_state_supported));
- mMaxBrightness = MathUtils.constrain(res.getInteger(R.integer.doze_tease_brightness),
+ mMaxBrightness = MathUtils.constrain(res.getInteger(R.integer.doze_pulse_brightness),
BRIGHTNESS_OFF, BRIGHTNESS_ON);
-
+ mNotificationPulseIntent = PendingIntent.getBroadcast(mContext, 0,
+ new Intent(NOTIFICATION_PULSE_ACTION).setPackage(getPackageName()),
+ PendingIntent.FLAG_CANCEL_CURRENT);
+ mMultipulseCount = SystemProperties.getInt("doze.multipulses",
+ res.getInteger(R.integer.doze_multipulse_count));
+ mNotificationPulseInterval = SystemProperties.getInt("doze.notification.pulse",
+ res.getInteger(R.integer.doze_notification_pulse_interval));
mDisplayStateWhenOn = mDisplayStateSupported ? Display.STATE_DOZE : Display.STATE_ON;
setDozeScreenState(mDisplayStateWhenOn);
}
@@ -122,7 +143,7 @@
super.onDreamingStarted();
if (DEBUG) Log.d(mTag, "onDreamingStarted canDoze=" + canDoze());
mDreaming = true;
- listenForTeaseSignals(true);
+ listenForPulseSignals(true);
requestDoze();
}
@@ -160,7 +181,7 @@
if (mWakeLock.isHeld()) {
mWakeLock.release();
}
- listenForTeaseSignals(false);
+ listenForPulseSignals(false);
stopDozing();
dozingStopped();
}
@@ -187,9 +208,17 @@
}
}
- private void requestTease() {
+ private void requestMultipulse() {
+ requestPulse(mMultipulseCount);
+ }
+
+ private void requestPulse() {
+ requestPulse(1);
+ }
+
+ private void requestPulse(int pulses) {
if (mHost != null) {
- mHost.requestTease(this);
+ mHost.requestPulse(pulses, this);
}
}
@@ -199,10 +228,10 @@
}
}
- private void listenForTeaseSignals(boolean listen) {
- if (DEBUG) Log.d(mTag, "listenForTeaseSignals: " + listen);
+ private void listenForPulseSignals(boolean listen) {
+ if (DEBUG) Log.d(mTag, "listenForPulseSignals: " + listen);
listenForSignificantMotion(listen);
- listenForBroadcast(listen);
+ listenForBroadcasts(listen);
listenForNotifications(listen);
}
@@ -216,15 +245,17 @@
}
}
- private void listenForBroadcast(boolean listen) {
+ private void listenForBroadcasts(boolean listen) {
if (listen) {
- mContext.registerReceiver(mTeaseReceiver, new IntentFilter(TEASE_ACTION));
- mTeaseReceiverRegistered = true;
+ final IntentFilter filter = new IntentFilter(PULSE_ACTION);
+ filter.addAction(NOTIFICATION_PULSE_ACTION);
+ mContext.registerReceiver(mBroadcastReceiver, filter);
+ mBroadcastReceiverRegistered = true;
} else {
- if (mTeaseReceiverRegistered) {
- mContext.unregisterReceiver(mTeaseReceiver);
+ if (mBroadcastReceiverRegistered) {
+ mContext.unregisterReceiver(mBroadcastReceiver);
}
- mTeaseReceiverRegistered = false;
+ mBroadcastReceiverRegistered = false;
}
}
@@ -237,6 +268,15 @@
}
}
+ private void rescheduleNotificationPulse() {
+ mAlarmManager.cancel(mNotificationPulseIntent);
+ if (mNotificationLightOn) {
+ final long time = System.currentTimeMillis() + mNotificationPulseInterval;
+ if (DEBUG) Log.d(TAG, "Scheduling pulse for " + new Date(time));
+ mAlarmManager.setExact(AlarmManager.RTC_WAKEUP, time, mNotificationPulseIntent);
+ }
+ }
+
private static String triggerEventToString(TriggerEvent event) {
if (event == null) return null;
final StringBuilder sb = new StringBuilder("TriggerEvent[")
@@ -269,16 +309,23 @@
v.vibrate(1000);
}
}
- requestTease();
+ requestPulse();
listenForSignificantMotion(true); // reregister, this sensor only fires once
}
};
- private final BroadcastReceiver mTeaseReceiver = new BroadcastReceiver() {
+ private final BroadcastReceiver mBroadcastReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
- if (DEBUG) Log.d(mTag, "Received tease intent");
- requestTease();
+ if (PULSE_ACTION.equals(intent.getAction())) {
+ if (DEBUG) Log.d(mTag, "Received pulse intent");
+ requestPulse(intent.getIntExtra(EXTRA_PULSES, mMultipulseCount));
+ }
+ if (NOTIFICATION_PULSE_ACTION.equals(intent.getAction())) {
+ if (DEBUG) Log.d(mTag, "Received notification pulse intent");
+ requestPulse();
+ rescheduleNotificationPulse();
+ }
}
};
@@ -288,10 +335,19 @@
if (DEBUG) Log.d(mTag, "onNewNotifications");
// noop for now
}
+
@Override
public void onBuzzBeepBlinked() {
if (DEBUG) Log.d(mTag, "onBuzzBeepBlinked");
- requestTease();
+ requestMultipulse();
+ }
+
+ @Override
+ public void onNotificationLight(boolean on) {
+ if (DEBUG) Log.d(mTag, "onNotificationLight on=" + on);
+ if (mNotificationLightOn == on) return;
+ mNotificationLightOn = on;
+ rescheduleNotificationPulse();
}
};
@@ -299,12 +355,13 @@
void addCallback(Callback callback);
void removeCallback(Callback callback);
void requestDoze(DozeService dozeService);
- void requestTease(DozeService dozeService);
+ void requestPulse(int pulses, DozeService dozeService);
void dozingStopped(DozeService dozeService);
public interface Callback {
void onNewNotifications();
void onBuzzBeepBlinked();
+ void onNotificationLight(boolean on);
}
}
}
diff --git a/packages/SystemUI/src/com/android/systemui/power/PowerDialogWarnings.java b/packages/SystemUI/src/com/android/systemui/power/PowerDialogWarnings.java
index 2943494..79fadbd 100644
--- a/packages/SystemUI/src/com/android/systemui/power/PowerDialogWarnings.java
+++ b/packages/SystemUI/src/com/android/systemui/power/PowerDialogWarnings.java
@@ -48,7 +48,6 @@
private int mBucket;
private long mScreenOffTime;
private boolean mSaver;
- private int mSaverTriggerLevel;
private AlertDialog mInvalidChargerDialog;
private AlertDialog mLowBatteryDialog;
@@ -222,9 +221,4 @@
public void showSaverMode(boolean mode) {
mSaver = mode;
}
-
- @Override
- public void setSaverTrigger(int level) {
- mSaverTriggerLevel = level;
- }
}
diff --git a/packages/SystemUI/src/com/android/systemui/power/PowerNotificationWarnings.java b/packages/SystemUI/src/com/android/systemui/power/PowerNotificationWarnings.java
index 186b570..9ffe0ef 100644
--- a/packages/SystemUI/src/com/android/systemui/power/PowerNotificationWarnings.java
+++ b/packages/SystemUI/src/com/android/systemui/power/PowerNotificationWarnings.java
@@ -16,7 +16,6 @@
package com.android.systemui.power;
-import android.app.AlertDialog;
import android.app.Notification;
import android.app.NotificationManager;
import android.app.PendingIntent;
@@ -25,9 +24,10 @@
import android.content.Context;
import android.content.DialogInterface;
import android.content.DialogInterface.OnClickListener;
+import android.content.DialogInterface.OnDismissListener;
import android.content.Intent;
import android.content.IntentFilter;
-import android.media.AudioManager;
+import android.media.AudioAttributes;
import android.net.Uri;
import android.os.AsyncTask;
import android.os.Handler;
@@ -35,11 +35,10 @@
import android.os.UserHandle;
import android.provider.Settings;
import android.util.Slog;
-import android.view.ContextThemeWrapper;
import android.view.View;
-import android.view.WindowManager;
import com.android.systemui.R;
+import com.android.systemui.statusbar.phone.SystemUIDialog;
import java.io.PrintWriter;
@@ -66,9 +65,14 @@
private static final String ACTION_SHOW_FALLBACK_CHARGER = "PNW.chargerFallback";
private static final String ACTION_SHOW_BATTERY_SETTINGS = "PNW.batterySettings";
private static final String ACTION_START_SAVER = "PNW.startSaver";
+ private static final String ACTION_STOP_SAVER = "PNW.stopSaver";
+
+ private static final AudioAttributes AUDIO_ATTRIBUTES = new AudioAttributes.Builder()
+ .setContentType(AudioAttributes.CONTENT_TYPE_SONIFICATION)
+ .setUsage(AudioAttributes.USAGE_ASSISTANCE_SONIFICATION)
+ .build();
private final Context mContext;
- private final Context mLightContext;
private final NotificationManager mNoMan;
private final Handler mHandler = new Handler();
private final PowerDialogWarnings mFallbackDialogs;
@@ -84,15 +88,13 @@
private long mBucketDroppedNegativeTimeMs;
private boolean mSaver;
- private int mSaverTriggerLevel;
private boolean mWarning;
private boolean mPlaySound;
private boolean mInvalidCharger;
+ private SystemUIDialog mSaverConfirmation;
public PowerNotificationWarnings(Context context) {
mContext = context;
- mLightContext = new ContextThemeWrapper(mContext,
- android.R.style.Theme_DeviceDefault_Light);
mNoMan = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
mFallbackDialogs = new PowerDialogWarnings(context);
mReceiver.init();
@@ -105,6 +107,7 @@
pw.print("mPlaySound="); pw.println(mPlaySound);
pw.print("mInvalidCharger="); pw.println(mInvalidCharger);
pw.print("mShowing="); pw.println(SHOWING_STRINGS[mShowing]);
+ pw.print("mSaverConfirmation="); pw.println(mSaverConfirmation != null ? "not null" : null);
}
@Override
@@ -123,12 +126,9 @@
@Override
public void showSaverMode(boolean mode) {
mSaver = mode;
- updateNotification();
- }
-
- @Override
- public void setSaverTrigger(int level) {
- mSaverTriggerLevel = level;
+ if (mSaver && mSaverConfirmation != null) {
+ mSaverConfirmation.dismiss();
+ }
updateNotification();
}
@@ -180,6 +180,7 @@
.setContentTitle(mContext.getString(R.string.battery_low_title))
.setContentText(mContext.getString(textRes, mBatteryLevel))
.setOngoing(true)
+ .setOnlyAlertOnce(true)
.setPriority(Notification.PRIORITY_MAX)
.setCategory(Notification.CATEGORY_SYSTEM)
.setVisibility(Notification.VISIBILITY_PUBLIC)
@@ -187,10 +188,12 @@
if (hasBatterySettings()) {
nb.setContentIntent(pendingBroadcast(ACTION_SHOW_BATTERY_SETTINGS));
}
- if (!mSaver && mSaverTriggerLevel <= 0) {
+ if (!mSaver) {
nb.addAction(R.drawable.ic_power_saver,
mContext.getString(R.string.battery_saver_start_action),
pendingBroadcast(ACTION_START_SAVER));
+ } else {
+ addStopSaverAction(nb);
}
if (mPlaySound) {
attachLowBatterySound(nb);
@@ -208,19 +211,28 @@
.setContentTitle(mContext.getString(R.string.battery_saver_notification_title))
.setContentText(mContext.getString(R.string.battery_saver_notification_text))
.setOngoing(true)
- .setWhen(0)
.setShowWhen(false)
.setCategory(Notification.CATEGORY_SYSTEM)
.setVisibility(Notification.VISIBILITY_PUBLIC);
+ addStopSaverAction(nb);
if (hasSaverSettings()) {
- nb.addAction(0,
- mContext.getString(R.string.battery_saver_notification_action_text),
- pendingActivity(mOpenSaverSettings));
nb.setContentIntent(pendingActivity(mOpenSaverSettings));
}
mNoMan.notifyAsUser(TAG_NOTIFICATION, ID_NOTIFICATION, nb.build(), UserHandle.CURRENT);
}
+ private void addStopSaverAction(Notification.Builder nb) {
+ nb.addAction(R.drawable.ic_power_saver,
+ mContext.getString(R.string.battery_saver_notification_action_text),
+ pendingBroadcast(ACTION_STOP_SAVER));
+ }
+
+ private void dismissSaverNotification() {
+ if (mSaver) Slog.i(TAG, "dismissing saver notification");
+ mSaver = false;
+ updateNotification();
+ }
+
private PendingIntent pendingActivity(Intent intent) {
return PendingIntent.getActivityAsUser(mContext,
0, intent, 0, null, UserHandle.CURRENT);
@@ -307,8 +319,8 @@
if (soundPath != null) {
final Uri soundUri = Uri.parse("file://" + soundPath);
if (soundUri != null) {
- b.setSound(soundUri, AudioManager.STREAM_SYSTEM);
- Slog.d(TAG, "playing sound " + soundUri);
+ b.setSound(soundUri, AUDIO_ATTRIBUTES);
+ if (DEBUG) Slog.d(TAG, "playing sound " + soundUri);
}
}
}
@@ -333,17 +345,21 @@
}
private void showStartSaverConfirmation() {
- final AlertDialog d = new AlertDialog.Builder(mLightContext)
- .setTitle(R.string.battery_saver_confirmation_title)
- .setMessage(R.string.battery_saver_confirmation_text)
- .setNegativeButton(android.R.string.cancel, null)
- .setPositiveButton(R.string.battery_saver_confirmation_ok, mStartSaverMode)
- .create();
-
- d.getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_ERROR);
- d.getWindow().getAttributes().privateFlags |=
- WindowManager.LayoutParams.PRIVATE_FLAG_SHOW_FOR_ALL_USERS;
+ if (mSaverConfirmation != null) return;
+ final SystemUIDialog d = new SystemUIDialog(mContext);
+ d.setTitle(R.string.battery_saver_confirmation_title);
+ d.setMessage(com.android.internal.R.string.battery_saver_description);
+ d.setNegativeButton(android.R.string.cancel, null);
+ d.setPositiveButton(R.string.battery_saver_confirmation_ok, mStartSaverMode);
+ d.setShowForAllUsers(true);
+ d.setOnDismissListener(new OnDismissListener() {
+ @Override
+ public void onDismiss(DialogInterface dialog) {
+ mSaverConfirmation = null;
+ }
+ });
d.show();
+ mSaverConfirmation = d;
}
private void setSaverSetting(boolean mode) {
@@ -359,6 +375,7 @@
filter.addAction(ACTION_SHOW_FALLBACK_CHARGER);
filter.addAction(ACTION_SHOW_BATTERY_SETTINGS);
filter.addAction(ACTION_START_SAVER);
+ filter.addAction(ACTION_STOP_SAVER);
mContext.registerReceiver(this, filter, null, mHandler);
}
@@ -378,6 +395,10 @@
} else if (action.equals(ACTION_START_SAVER)) {
dismissLowBatteryNotification();
showStartSaverConfirmation();
+ } else if (action.equals(ACTION_STOP_SAVER)) {
+ dismissSaverNotification();
+ dismissLowBatteryNotification();
+ setSaverSetting(false);
}
}
}
diff --git a/packages/SystemUI/src/com/android/systemui/power/PowerUI.java b/packages/SystemUI/src/com/android/systemui/power/PowerUI.java
index 1bb7edb..ccef8eb 100644
--- a/packages/SystemUI/src/com/android/systemui/power/PowerUI.java
+++ b/packages/SystemUI/src/com/android/systemui/power/PowerUI.java
@@ -22,13 +22,13 @@
import android.content.Intent;
import android.content.IntentFilter;
import android.database.ContentObserver;
-import android.net.Uri;
import android.os.BatteryManager;
import android.os.Handler;
import android.os.PowerManager;
import android.os.SystemClock;
import android.os.UserHandle;
import android.provider.Settings;
+import android.util.Log;
import android.util.Slog;
import com.android.systemui.SystemUI;
@@ -39,11 +39,9 @@
public class PowerUI extends SystemUI {
static final String TAG = "PowerUI";
- static final boolean DEBUG = false;
-
+ static final boolean DEBUG = Log.isLoggable(TAG, Log.DEBUG);
private final Handler mHandler = new Handler();
- private final SettingsObserver mObserver = new SettingsObserver(mHandler);
private final Receiver mReceiver = new Receiver();
private PowerManager mPowerManager;
@@ -75,17 +73,12 @@
false, obs, UserHandle.USER_ALL);
updateBatteryWarningLevels();
mReceiver.init();
- mObserver.init();
}
private void setSaverMode(boolean mode) {
mWarnings.showSaverMode(mode);
}
- private void setSaverTrigger(int level) {
- mWarnings.setSaverTrigger(level);
- }
-
void updateBatteryWarningLevels() {
int critLevel = mContext.getResources().getInteger(
com.android.internal.R.integer.config_criticalBatteryWarningLevel);
@@ -143,6 +136,7 @@
filter.addAction(Intent.ACTION_BATTERY_CHANGED);
filter.addAction(Intent.ACTION_SCREEN_OFF);
filter.addAction(Intent.ACTION_SCREEN_ON);
+ filter.addAction(PowerManager.ACTION_POWER_SAVE_MODE_CHANGING);
filter.addAction(PowerManager.ACTION_POWER_SAVE_MODE_CHANGED);
mContext.registerReceiver(this, filter, null, mHandler);
updateSaverMode();
@@ -214,6 +208,8 @@
mScreenOffTime = -1;
} else if (PowerManager.ACTION_POWER_SAVE_MODE_CHANGED.equals(action)) {
updateSaverMode();
+ } else if (PowerManager.ACTION_POWER_SAVE_MODE_CHANGING.equals(action)) {
+ setSaverMode(intent.getBooleanExtra(PowerManager.EXTRA_POWER_SAVE_MODE, false));
} else {
Slog.w(TAG, "unknown intent: " + intent);
}
@@ -251,7 +247,6 @@
public interface WarningsUI {
void update(int batteryLevel, int bucket, long screenOffTime);
- void setSaverTrigger(int level);
void showSaverMode(boolean mode);
void dismissLowBatteryWarning();
void showLowBatteryWarning(boolean playSound);
@@ -261,29 +256,5 @@
boolean isInvalidChargerWarningShowing();
void dump(PrintWriter pw);
}
-
- private final class SettingsObserver extends ContentObserver {
- private final Uri LOW_POWER_MODE_TRIGGER_LEVEL_URI =
- Settings.Global.getUriFor(Settings.Global.LOW_POWER_MODE_TRIGGER_LEVEL);
-
- public SettingsObserver(Handler handler) {
- super(handler);
- }
-
- public void init() {
- onChange(true, LOW_POWER_MODE_TRIGGER_LEVEL_URI);
- final ContentResolver cr = mContext.getContentResolver();
- cr.registerContentObserver(LOW_POWER_MODE_TRIGGER_LEVEL_URI, false, this);
- }
-
- @Override
- public void onChange(boolean selfChange, Uri uri) {
- if (LOW_POWER_MODE_TRIGGER_LEVEL_URI.equals(uri)) {
- final int level = Settings.Global.getInt(mContext.getContentResolver(),
- Settings.Global.LOW_POWER_MODE_TRIGGER_LEVEL, 0);
- setSaverTrigger(level);
- }
- }
- }
}
diff --git a/packages/SystemUI/src/com/android/systemui/qs/CircularClipper.java b/packages/SystemUI/src/com/android/systemui/qs/CircularClipper.java
deleted file mode 100644
index 90275c1..0000000
--- a/packages/SystemUI/src/com/android/systemui/qs/CircularClipper.java
+++ /dev/null
@@ -1,74 +0,0 @@
-/*
- * Copyright (C) 2014 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.systemui.qs;
-
-import android.animation.Animator;
-import android.animation.Animator.AnimatorListener;
-import android.animation.AnimatorListenerAdapter;
-import android.view.View;
-import android.view.ViewAnimationUtils;
-
-/** Helper for view-level circular clip animations. **/
-public class CircularClipper {
-
- private final View mTarget;
-
- private Animator mAnimator;
-
- public CircularClipper(View target) {
- mTarget = target;
- }
-
- public void animateCircularClip(int x, int y, boolean in, AnimatorListener listener) {
- if (mAnimator != null) {
- mAnimator.cancel();
- }
- final int w = mTarget.getWidth() - x;
- final int h = mTarget.getHeight() - y;
- int r = (int) Math.ceil(Math.sqrt(x * x + y * y));
- r = (int) Math.max(r, Math.ceil(Math.sqrt(w * w + y * y)));
- r = (int) Math.max(r, Math.ceil(Math.sqrt(w * w + h * h)));
- r = (int) Math.max(r, Math.ceil(Math.sqrt(x * x + h * h)));
-
- mAnimator = ViewAnimationUtils.createCircularReveal(mTarget, x, y, 0, r);
- mAnimator.removeAllListeners();
- if (listener != null) {
- mAnimator.addListener(listener);
- }
- if (in) {
- mAnimator.addListener(mVisibleOnStart);
- mAnimator.start();
- } else {
- mAnimator.addListener(mGoneOnEnd);
- mAnimator.reverse();
- }
- }
-
- private final AnimatorListenerAdapter mVisibleOnStart = new AnimatorListenerAdapter() {
- @Override
- public void onAnimationStart(Animator animation) {
- mTarget.setVisibility(View.VISIBLE);
- }
- };
-
- private final AnimatorListenerAdapter mGoneOnEnd = new AnimatorListenerAdapter() {
- @Override
- public void onAnimationEnd(Animator animation) {
- mTarget.setVisibility(View.GONE);
- };
- };
-}
diff --git a/packages/SystemUI/src/com/android/systemui/qs/QSDetailClipper.java b/packages/SystemUI/src/com/android/systemui/qs/QSDetailClipper.java
new file mode 100644
index 0000000..9c1ff9d
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/qs/QSDetailClipper.java
@@ -0,0 +1,96 @@
+/*
+ * Copyright (C) 2014 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.systemui.qs;
+
+import android.animation.Animator;
+import android.animation.Animator.AnimatorListener;
+import android.animation.AnimatorListenerAdapter;
+import android.graphics.drawable.TransitionDrawable;
+import android.view.View;
+import android.view.ViewAnimationUtils;
+
+/** Helper for quick settings detail panel clip animations. **/
+public class QSDetailClipper {
+
+ private final View mDetail;
+ private final TransitionDrawable mBackground;
+
+ private Animator mAnimator;
+
+ public QSDetailClipper(View detail) {
+ mDetail = detail;
+ mBackground = (TransitionDrawable) detail.getBackground();
+ }
+
+ public void animateCircularClip(int x, int y, boolean in, AnimatorListener listener) {
+ if (mAnimator != null) {
+ mAnimator.cancel();
+ }
+ final int w = mDetail.getWidth() - x;
+ final int h = mDetail.getHeight() - y;
+ int r = (int) Math.ceil(Math.sqrt(x * x + y * y));
+ r = (int) Math.max(r, Math.ceil(Math.sqrt(w * w + y * y)));
+ r = (int) Math.max(r, Math.ceil(Math.sqrt(w * w + h * h)));
+ r = (int) Math.max(r, Math.ceil(Math.sqrt(x * x + h * h)));
+ mAnimator = ViewAnimationUtils.createCircularReveal(mDetail, x, y, 0, r);
+ mAnimator.setDuration((long)(mAnimator.getDuration() * 1.5));
+ if (listener != null) {
+ mAnimator.addListener(listener);
+ }
+ mDetail.setLayerType(View.LAYER_TYPE_HARDWARE, null);
+ if (in) {
+ mBackground.startTransition((int)(mAnimator.getDuration() * 0.6));
+ mAnimator.addListener(mVisibleOnStart);
+ mAnimator.start();
+ } else {
+ mDetail.postDelayed(mReverseBackground, (long)(mAnimator.getDuration() * 0.65));
+ mAnimator.addListener(mGoneOnEnd);
+ mAnimator.reverse();
+ }
+ }
+
+ private final Runnable mReverseBackground = new Runnable() {
+ @Override
+ public void run() {
+ if (mAnimator != null) {
+ mBackground.reverseTransition((int)(mAnimator.getDuration() * 0.35));
+ }
+ }
+ };
+
+ private final AnimatorListenerAdapter mVisibleOnStart = new AnimatorListenerAdapter() {
+ @Override
+ public void onAnimationStart(Animator animation) {
+ mDetail.setVisibility(View.VISIBLE);
+ }
+
+ public void onAnimationEnd(Animator animation) {
+ mDetail.setLayerType(View.LAYER_TYPE_NONE, null);
+ mAnimator = null;
+ }
+ };
+
+ private final AnimatorListenerAdapter mGoneOnEnd = new AnimatorListenerAdapter() {
+ @Override
+ public void onAnimationEnd(Animator animation) {
+ mDetail.setLayerType(View.LAYER_TYPE_NONE, null);
+ mDetail.setVisibility(View.GONE);
+ mBackground.resetTransition();
+ mAnimator = null;
+ };
+ };
+}
diff --git a/packages/SystemUI/src/com/android/systemui/qs/QSFooter.java b/packages/SystemUI/src/com/android/systemui/qs/QSFooter.java
new file mode 100644
index 0000000..f04a7b6
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/qs/QSFooter.java
@@ -0,0 +1,218 @@
+/*
+ * Copyright (C) 2014 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.android.systemui.qs;
+
+import android.app.AlertDialog;
+import android.content.Context;
+import android.content.DialogInterface;
+import android.os.Handler;
+import android.os.Looper;
+import android.os.Message;
+import android.util.Log;
+import android.view.ContextThemeWrapper;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.View.OnClickListener;
+import android.view.WindowManager;
+import android.widget.ImageView;
+import android.widget.TextView;
+
+import com.android.systemui.R;
+import com.android.systemui.statusbar.phone.QSTileHost;
+import com.android.systemui.statusbar.phone.SystemUIDialog;
+import com.android.systemui.statusbar.policy.SecurityController;
+import com.android.systemui.statusbar.policy.SecurityController.VpnCallback;
+
+public class QSFooter implements OnClickListener, DialogInterface.OnClickListener {
+ protected static final String TAG = "QSFooter";
+ protected static final boolean DEBUG = Log.isLoggable(TAG, Log.DEBUG);
+
+ private final View mRootView;
+ private final TextView mFooterText;
+ private final ImageView mFooterIcon;
+ private final Context mContext;
+ private final Callback mCallback = new Callback();
+
+ private SecurityController mSecurityController;
+ private AlertDialog mDialog;
+ private QSTileHost mHost;
+ private Handler mHandler;
+
+ public QSFooter(QSPanel qsPanel, Context context) {
+ mRootView = LayoutInflater.from(context)
+ .inflate(R.layout.quick_settings_footer, qsPanel, false);
+ mRootView.setOnClickListener(this);
+ mFooterText = (TextView) mRootView.findViewById(R.id.footer_text);
+ mFooterIcon = (ImageView) mRootView.findViewById(R.id.footer_icon);
+ mContext = context;
+ }
+
+ public void setHost(QSTileHost host) {
+ mHost = host;
+ mSecurityController = host.getSecurityController();
+ mHandler = new H(host.getLooper());
+ }
+
+ public void setListening(boolean listening) {
+ if (listening) {
+ mSecurityController.addCallback(mCallback);
+ } else {
+ mSecurityController.removeCallback(mCallback);
+ }
+ }
+
+ public View getView() {
+ return mRootView;
+ }
+
+ public boolean hasFooter() {
+ return mRootView.getVisibility() != View.GONE;
+ }
+
+ @Override
+ public void onClick(View v) {
+ mHandler.sendEmptyMessage(H.CLICK);
+ }
+
+ private void handleClick() {
+ mHost.collapsePanels();
+ // TODO: Delay dialog creation until after panels are collapsed.
+ createDialog();
+ }
+
+ public void refreshState() {
+ mHandler.sendEmptyMessage(H.REFRESH_STATE);
+ }
+
+ private void handleRefreshState() {
+ if (mSecurityController.hasDeviceOwner()) {
+ mFooterText.setText(R.string.device_owned_footer);
+ mRootView.setVisibility(View.VISIBLE);
+ mFooterIcon.setVisibility(View.INVISIBLE);
+ } else if (mSecurityController.isVpnEnabled()) {
+ mFooterText.setText(R.string.vpn_footer);
+ mRootView.setVisibility(View.VISIBLE);
+ mFooterIcon.setVisibility(View.VISIBLE);
+ } else {
+ mRootView.setVisibility(View.GONE);
+ }
+ }
+
+ @Override
+ public void onClick(DialogInterface dialog, int which) {
+ if (which == DialogInterface.BUTTON_NEGATIVE) {
+ if (mSecurityController.isLegacyVpn()) {
+ mSecurityController.disconnectFromLegacyVpn();
+ } else {
+ mSecurityController.openVpnApp();
+ }
+ }
+ }
+
+ private void createDialog() {
+ mDialog = new SystemUIDialog(mContext);
+ mDialog.setTitle(getTitle());
+ mDialog.setMessage(getMessage());
+ mDialog.setButton(DialogInterface.BUTTON_POSITIVE, getPositiveButton(), this);
+ if (mSecurityController.isVpnEnabled()) {
+ mDialog.setButton(DialogInterface.BUTTON_NEGATIVE, getNegativeButton(), this);
+ }
+ mDialog.show();
+ }
+
+ private String getNegativeButton() {
+ if (mSecurityController.isLegacyVpn()) {
+ return mContext.getString(R.string.disconnect_vpn);
+ } else {
+ return mContext.getString(R.string.open_app);
+ }
+ }
+
+ private String getPositiveButton() {
+ return mContext.getString(R.string.quick_settings_done);
+ }
+
+ private String getMessage() {
+ if (mSecurityController.hasDeviceOwner()) {
+ if (mSecurityController.isVpnEnabled()) {
+ if (mSecurityController.isLegacyVpn()) {
+ return mContext.getString(
+ R.string.monitoring_description_legacy_vpn_device_owned,
+ mSecurityController.getDeviceOwnerName(),
+ mSecurityController.getLegacyVpnName());
+ } else {
+ return mContext.getString(R.string.monitoring_description_vpn_device_owned,
+ mSecurityController.getDeviceOwnerName(),
+ mSecurityController.getVpnApp());
+ }
+ } else {
+ return mContext.getString(R.string.monitoring_description_device_owned,
+ mSecurityController.getDeviceOwnerName());
+ }
+ } else {
+ if (mSecurityController.isLegacyVpn()) {
+ return mContext.getString(R.string.monitoring_description_legacy_vpn,
+ mSecurityController.getLegacyVpnName());
+
+ } else {
+ return mContext.getString(R.string.monitoring_description_vpn,
+ mSecurityController.getVpnApp());
+ }
+ }
+ }
+
+ private int getTitle() {
+ if (mSecurityController.hasDeviceOwner()) {
+ return R.string.monitoring_title_device_owned;
+ }
+ return R.string.monitoring_title;
+ }
+
+ private class Callback implements VpnCallback {
+ @Override
+ public void onVpnStateChanged() {
+ refreshState();
+ }
+ }
+
+ private class H extends Handler {
+ private static final int CLICK = 0;
+ private static final int REFRESH_STATE = 1;
+
+ private H(Looper looper) {
+ super(looper);
+ }
+
+ @Override
+ public void handleMessage(Message msg) {
+ String name = null;
+ try {
+ if (msg.what == REFRESH_STATE) {
+ name = "handleRefreshState";
+ handleRefreshState();
+ } else if (msg.what == CLICK) {
+ name = "handleClick";
+ handleClick();
+ }
+ } catch (Throwable t) {
+ final String error = "Error in " + name;
+ Log.w(TAG, error, t);
+ mHost.warn(error, t);
+ }
+ }
+ }
+
+}
diff --git a/packages/SystemUI/src/com/android/systemui/qs/QSPanel.java b/packages/SystemUI/src/com/android/systemui/qs/QSPanel.java
index 4901f40..59f3b3d 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/QSPanel.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/QSPanel.java
@@ -49,7 +49,7 @@
private final View mDetailSettingsButton;
private final View mDetailDoneButton;
private final View mBrightnessView;
- private final CircularClipper mClipper;
+ private final QSDetailClipper mClipper;
private final H mHandler = new H();
private int mColumns;
@@ -67,6 +67,8 @@
private BrightnessController mBrightnessController;
private QSTileHost mHost;
+ private QSFooter mFooter;
+
public QSPanel(Context context) {
this(context, null);
}
@@ -83,9 +85,11 @@
mDetail.setClickable(true);
mBrightnessView = LayoutInflater.from(context).inflate(
R.layout.quick_settings_brightness_dialog, this, false);
+ mFooter = new QSFooter(this, context);
addView(mDetail);
addView(mBrightnessView);
- mClipper = new CircularClipper(mDetail);
+ addView(mFooter.getView());
+ mClipper = new QSDetailClipper(mDetail);
updateResources();
mBrightnessController = new BrightnessController(getContext(),
@@ -95,7 +99,7 @@
mDetailDoneButton.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
- showDetail(false, mDetailRecord);
+ closeDetail();
}
});
}
@@ -106,6 +110,7 @@
public void setHost(QSTileHost host) {
mHost = host;
+ mFooter.setHost(host);
}
public QSTileHost getHost() {
@@ -134,7 +139,7 @@
if (mExpanded == expanded) return;
mExpanded = expanded;
if (!mExpanded) {
- showDetail(false /*show*/, mDetailRecord);
+ closeDetail();
}
}
@@ -144,6 +149,7 @@
for (TileRecord r : mRecords) {
r.tile.setListening(mListening);
}
+ mFooter.setListening(mListening);
if (mListening) {
refreshAllTiles();
}
@@ -158,6 +164,7 @@
for (TileRecord r : mRecords) {
r.tile.refreshState();
}
+ mFooter.refreshState();
}
public void showDetailAdapter(boolean show, DetailAdapter adapter) {
@@ -226,6 +233,14 @@
addView(r.tileView);
}
+ public boolean isShowingDetail() {
+ return mDetailRecord != null;
+ }
+
+ public void closeDetail() {
+ showDetail(false, mDetailRecord);
+ }
+
private void handleShowDetail(Record r, boolean show) {
if (r instanceof TileRecord) {
handleShowDetailTile((TileRecord) r, show);
@@ -279,6 +294,7 @@
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
final int width = MeasureSpec.getSize(widthMeasureSpec);
mBrightnessView.measure(exactly(width), MeasureSpec.UNSPECIFIED);
+ mFooter.getView().measure(exactly(width), MeasureSpec.UNSPECIFIED);
int r = -1;
int c = -1;
int rows = 0;
@@ -307,6 +323,9 @@
record.tileView.measure(exactly(cw), exactly(ch));
}
int h = rows == 0 ? mBrightnessView.getHeight() : (getRowTop(rows) + mPanelPaddingBottom);
+ if (mFooter.hasFooter()) {
+ h += mFooter.getView().getHeight();
+ }
mDetail.measure(exactly(width), exactly(h));
setMeasuredDimension(width, h);
}
@@ -333,6 +352,11 @@
}
final int dh = Math.max(mDetail.getMeasuredHeight(), getMeasuredHeight());
mDetail.layout(0, 0, mDetail.getMeasuredWidth(), dh);
+ if (mFooter.hasFooter()) {
+ View footer = mFooter.getView();
+ footer.layout(0, getMeasuredHeight() - footer.getMeasuredHeight(),
+ footer.getMeasuredWidth(), getMeasuredHeight());
+ }
}
private int getRowTop(int row) {
diff --git a/packages/SystemUI/src/com/android/systemui/qs/SignalTileView.java b/packages/SystemUI/src/com/android/systemui/qs/SignalTileView.java
index d9447f7..1a555f1 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/SignalTileView.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/SignalTileView.java
@@ -18,8 +18,6 @@
import android.animation.ValueAnimator;
import android.content.Context;
-import android.graphics.ColorFilter;
-import android.graphics.LightingColorFilter;
import android.view.View;
import android.widget.FrameLayout;
import android.widget.ImageView;
@@ -31,7 +29,6 @@
public final class SignalTileView extends QSTileView {
private static final long DEFAULT_DURATION = new ValueAnimator().getDuration();
private static final long SHORT_DURATION = DEFAULT_DURATION / 3;
- private static final ColorFilter FILTER = new LightingColorFilter(0xffffffff, 0xff283034);
private FrameLayout mIconFrame;
private ImageView mSignal;
@@ -49,7 +46,6 @@
private ImageView addTrafficView(int icon) {
final ImageView traffic = new ImageView(mContext);
traffic.setImageResource(icon);
- traffic.setColorFilter(FILTER);
traffic.setAlpha(0f);
addView(traffic);
return traffic;
@@ -61,7 +57,7 @@
mSignal = new ImageView(mContext);
mIconFrame.addView(mSignal);
mOverlay = new ImageView(mContext);
- mIconFrame.addView(mOverlay);
+ mIconFrame.addView(mOverlay, LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
return mIconFrame;
}
@@ -95,12 +91,10 @@
final SignalState s = (SignalState) state;
mSignal.setImageDrawable(null); // force refresh
mSignal.setImageResource(s.iconId);
- mSignal.setColorFilter(s.filter ? FILTER : null);
if (s.overlayIconId > 0) {
mOverlay.setVisibility(VISIBLE);
mOverlay.setImageDrawable(null); // force refresh
mOverlay.setImageResource(s.overlayIconId);
- mOverlay.setColorFilter(s.filter ? FILTER : null);
} else {
mOverlay.setVisibility(GONE);
}
diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/CellularTile.java b/packages/SystemUI/src/com/android/systemui/qs/tiles/CellularTile.java
index 42da282..ce42d47 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/tiles/CellularTile.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/CellularTile.java
@@ -91,10 +91,9 @@
if (cb == null) return;
final Resources r = mContext.getResources();
- state.iconId = cb.noSim
- ? R.drawable.stat_sys_no_sim
- : cb.enabled && (cb.mobileSignalIconId > 0) && !cb.airplaneModeEnabled
- ? cb.mobileSignalIconId
+ state.iconId = cb.noSim ? R.drawable.stat_sys_no_sim
+ : !cb.enabled || cb.airplaneModeEnabled ? R.drawable.ic_qs_signal_disabled
+ : cb.mobileSignalIconId > 0 ? cb.mobileSignalIconId
: R.drawable.ic_qs_signal_no_signal;
state.overlayIconId = cb.enabled && (cb.dataTypeIconId > 0) && !cb.wifiConnected
? cb.dataTypeIconId
diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/WifiTile.java b/packages/SystemUI/src/com/android/systemui/qs/tiles/WifiTile.java
index 1707b32..5651d49 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/tiles/WifiTile.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/WifiTile.java
@@ -113,7 +113,11 @@
state.filter = true;
final String signalContentDescription;
final Resources r = mContext.getResources();
- if (wifiConnected) {
+ if (!state.enabled) {
+ state.iconId = R.drawable.ic_qs_wifi_disabled;
+ state.label = r.getString(R.string.quick_settings_wifi_label);
+ signalContentDescription = r.getString(R.string.accessibility_wifi_off);
+ } else if (wifiConnected) {
state.iconId = cb.wifiSignalIconId;
state.label = removeDoubleQuotes(cb.enabledDesc);
signalContentDescription = cb.wifiSignalContentDescription;
diff --git a/packages/SystemUI/src/com/android/systemui/recents/AlternateRecentsComponent.java b/packages/SystemUI/src/com/android/systemui/recents/AlternateRecentsComponent.java
index cbcacc4..0b08b93 100644
--- a/packages/SystemUI/src/com/android/systemui/recents/AlternateRecentsComponent.java
+++ b/packages/SystemUI/src/com/android/systemui/recents/AlternateRecentsComponent.java
@@ -105,7 +105,8 @@
}
public void onStart() {
- // Do nothing
+ // Initialize some static datastructures
+ TaskStackViewLayoutAlgorithm.initializeCurve();
}
public void onBootCompleted() {
@@ -322,7 +323,7 @@
Rect taskStackBounds = new Rect(mTaskStackBounds);
taskStackBounds.bottom -= mSystemInsets.bottom;
tsv.computeRects(mWindowRect.width(), mWindowRect.height(), taskStackBounds);
- tsv.setStackScrollToInitialState();
+ tsv.getScroller().setStackScrollToInitialState();
// Find the running task in the TaskStack
Task task = null;
@@ -344,7 +345,7 @@
}
// Get the transform for the running task
- mTmpTransform = algo.getStackTransform(task, tsv.getStackScroll(), mTmpTransform);
+ mTmpTransform = algo.getStackTransform(task, tsv.getScroller().getStackScroll(), mTmpTransform, null);
return new Rect(mTmpTransform.rect);
}
diff --git a/packages/SystemUI/src/com/android/systemui/recents/Constants.java b/packages/SystemUI/src/com/android/systemui/recents/Constants.java
index c49e244..3d4d6c4 100644
--- a/packages/SystemUI/src/com/android/systemui/recents/Constants.java
+++ b/packages/SystemUI/src/com/android/systemui/recents/Constants.java
@@ -25,8 +25,6 @@
public static final boolean Verbose = false;
public static class App {
- // Enables the simulated task affiliations
- public static final boolean EnableSimulatedTaskGroups = false;
// Enables the screenshot app->Recents transition
public static final boolean EnableScreenshotAppTransition = false;
// Enables the filtering of tasks according to their grouping
@@ -43,11 +41,15 @@
public static final boolean EnableShadows = true;
// This disables the bitmap and icon caches
public static final boolean DisableBackgroundCache = false;
- // For debugging, this enables us to create mock recents tasks
+ // Enables the simulated task affiliations
+ public static final boolean EnableSimulatedTaskGroups = false;
+ // Defines the number of mock task affiliations per group
+ public static final int TaskAffiliationsGroupCount = 12;
+ // Enables us to create mock recents tasks
public static final boolean EnableSystemServicesProxy = false;
- // For debugging, this defines the number of mock recents packages to create
+ // Defines the number of mock recents packages to create
public static final int SystemServicesProxyMockPackageCount = 3;
- // For debugging, this defines the number of mock recents tasks to create
+ // Defines the number of mock recents tasks to create
public static final int SystemServicesProxyMockTaskCount = 100;
}
}
diff --git a/packages/SystemUI/src/com/android/systemui/recents/RecentsActivity.java b/packages/SystemUI/src/com/android/systemui/recents/RecentsActivity.java
index 4534897..75fbad8 100644
--- a/packages/SystemUI/src/com/android/systemui/recents/RecentsActivity.java
+++ b/packages/SystemUI/src/com/android/systemui/recents/RecentsActivity.java
@@ -383,9 +383,6 @@
filter.addAction(SearchManager.INTENT_GLOBAL_SEARCH_ACTIVITY_CHANGED);
registerReceiver(mSystemBroadcastReceiver, filter);
- // Register any broadcast receivers for the task loader
- RecentsTaskLoader.getInstance().registerReceivers(this, mRecentsView);
-
// Private API calls to make the shadows look better
try {
Utilities.setShadowProperty("ambientShadowStrength", String.valueOf(35f));
@@ -451,6 +448,9 @@
filter.addAction(ACTION_TOGGLE_RECENTS_ACTIVITY);
filter.addAction(ACTION_START_ENTER_ANIMATION);
registerReceiver(mServiceBroadcastReceiver, filter);
+
+ // Register any broadcast receivers for the task loader
+ RecentsTaskLoader.getInstance().registerReceivers(this, mRecentsView);
}
@Override
@@ -481,9 +481,15 @@
protected void onStop() {
super.onStop();
+ // Remove all the views
+ mRecentsView.removeAllTaskStacks();
+
// Unregister the RecentsService receiver
unregisterReceiver(mServiceBroadcastReceiver);
+ // Unregister any broadcast receivers for the task loader
+ RecentsTaskLoader.getInstance().unregisterReceivers();
+
// Stop listening for widget package changes if there was one bound
if (mAppWidgetHost.isListening()) {
mAppWidgetHost.stopListening();
@@ -496,7 +502,6 @@
// Unregister the system broadcast receivers
unregisterReceiver(mSystemBroadcastReceiver);
- RecentsTaskLoader.getInstance().unregisterReceivers();
}
@Override
diff --git a/packages/SystemUI/src/com/android/systemui/recents/RecentsConfiguration.java b/packages/SystemUI/src/com/android/systemui/recents/RecentsConfiguration.java
index fbcbe2cf4..cf0a1dc 100644
--- a/packages/SystemUI/src/com/android/systemui/recents/RecentsConfiguration.java
+++ b/packages/SystemUI/src/com/android/systemui/recents/RecentsConfiguration.java
@@ -76,7 +76,7 @@
public int taskViewRemoveAnimDuration;
public int taskViewRemoveAnimTranslationXPx;
public int taskViewTranslationZMinPx;
- public int taskViewTranslationZIncrementPx;
+ public int taskViewTranslationZMaxPx;
public int taskViewRoundedCornerRadiusPx;
public int taskViewHighlightPx;
public int taskViewAffiliateGroupEnterOffsetPx;
@@ -208,8 +208,7 @@
res.getDimensionPixelSize(R.dimen.recents_task_view_rounded_corners_radius);
taskViewHighlightPx = res.getDimensionPixelSize(R.dimen.recents_task_view_highlight);
taskViewTranslationZMinPx = res.getDimensionPixelSize(R.dimen.recents_task_view_z_min);
- taskViewTranslationZIncrementPx =
- res.getDimensionPixelSize(R.dimen.recents_task_view_z_increment);
+ taskViewTranslationZMaxPx = res.getDimensionPixelSize(R.dimen.recents_task_view_z_max);
taskViewAffiliateGroupEnterOffsetPx =
res.getDimensionPixelSize(R.dimen.recents_task_view_affiliate_group_enter_offset);
diff --git a/packages/SystemUI/src/com/android/systemui/recents/model/TaskStack.java b/packages/SystemUI/src/com/android/systemui/recents/model/TaskStack.java
index 04ee9dd..fd6303f 100644
--- a/packages/SystemUI/src/com/android/systemui/recents/model/TaskStack.java
+++ b/packages/SystemUI/src/com/android/systemui/recents/model/TaskStack.java
@@ -337,7 +337,7 @@
String prevPackage = "";
int prevAffiliation = -1;
Random r = new Random();
- int groupCountDown = 5;
+ int groupCountDown = Constants.DebugFlags.App.TaskAffiliationsGroupCount;
for (int i = 0; i < taskCount; i++) {
Task t = tasks.get(i);
String packageName = t.key.baseIntent.getComponent().getPackageName();
@@ -352,7 +352,7 @@
addGroup(group);
prevAffiliation = affiliation;
prevPackage = packageName;
- groupCountDown = 5;
+ groupCountDown = Constants.DebugFlags.App.TaskAffiliationsGroupCount;
}
group.addTask(t);
taskMap.put(t.key, t);
diff --git a/packages/SystemUI/src/com/android/systemui/recents/views/DebugOverlayView.java b/packages/SystemUI/src/com/android/systemui/recents/views/DebugOverlayView.java
index 4c3fbf0..452830d 100644
--- a/packages/SystemUI/src/com/android/systemui/recents/views/DebugOverlayView.java
+++ b/packages/SystemUI/src/com/android/systemui/recents/views/DebugOverlayView.java
@@ -26,6 +26,7 @@
import android.widget.FrameLayout;
import android.widget.SeekBar;
import com.android.systemui.R;
+import com.android.systemui.recents.RecentsConfiguration;
import java.util.ArrayList;
@@ -42,11 +43,14 @@
final static int sCornerRectSize = 50;
+ RecentsConfiguration mConfig;
DebugOverlayViewCallbacks mCb;
ArrayList<Pair<Rect, Integer>> mRects = new ArrayList<Pair<Rect, Integer>>();
+ String mText;
Paint mDebugOutline = new Paint();
Paint mTmpPaint = new Paint();
+ Rect mTmpRect = new Rect();
boolean mEnabled = true;
SeekBar mPrimarySeekBar;
@@ -66,6 +70,7 @@
public DebugOverlayView(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
super(context, attrs, defStyleAttr, defStyleRes);
+ mConfig = RecentsConfiguration.getInstance();
mDebugOutline.setColor(0xFFff0000);
mDebugOutline.setStyle(Paint.Style.STROKE);
mDebugOutline.setStrokeWidth(8f);
@@ -124,6 +129,12 @@
invalidate();
}
+ /** Sets the debug text at the bottom of the screen. */
+ void setText(String message) {
+ mText = message;
+ invalidate();
+ }
+
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
@@ -145,6 +156,14 @@
mTmpPaint.setColor(r.second);
canvas.drawRect(r.first, mTmpPaint);
}
+
+ // Draw the text
+ if (mText != null && mText.length() > 0) {
+ mTmpPaint.setColor(0xFFff0000);
+ mTmpPaint.setTextSize(60);
+ mTmpPaint.getTextBounds(mText, 0, 1, mTmpRect);
+ canvas.drawText(mText, 10f, getMeasuredHeight() - mTmpRect.height() - mConfig.systemInsets.bottom, mTmpPaint);
+ }
}
}
diff --git a/packages/SystemUI/src/com/android/systemui/recents/views/RecentsView.java b/packages/SystemUI/src/com/android/systemui/recents/views/RecentsView.java
index 189578c..1a32b81 100644
--- a/packages/SystemUI/src/com/android/systemui/recents/views/RecentsView.java
+++ b/packages/SystemUI/src/com/android/systemui/recents/views/RecentsView.java
@@ -121,6 +121,17 @@
}
}
+ /** Removes all the task stack views from this recents view. */
+ public void removeAllTaskStacks() {
+ int childCount = getChildCount();
+ for (int i = childCount - 1; i >= 0; i--) {
+ View child = getChildAt(i);
+ if (child != mSearchBar) {
+ removeViewAt(i);
+ }
+ }
+ }
+
/** Launches the focused task from the first stack if possible */
public boolean launchFocusedTask() {
// Get the first stack view
@@ -225,6 +236,8 @@
public void setSearchBarVisibility(int visibility) {
if (mSearchBar != null) {
mSearchBar.setVisibility(visibility);
+ // Always bring the search bar to the top
+ mSearchBar.bringToFront();
}
}
@@ -364,17 +377,17 @@
View sourceView = tv;
int offsetX = 0;
int offsetY = 0;
- int stackScroll = stackView.getStackScroll();
+ float stackScroll = stackView.getScroller().getStackScroll();
if (tv == null) {
// If there is no actual task view, then use the stack view as the source view
// and then offset to the expected transform rect, but bound this to just
// outside the display rect (to ensure we don't animate from too far away)
sourceView = stackView;
- transform = stackView.getStackAlgorithm().getStackTransform(task, stackScroll, transform);
+ transform = stackView.getStackAlgorithm().getStackTransform(task, stackScroll, transform, null);
offsetX = transform.rect.left;
offsetY = Math.min(transform.rect.top, mConfig.displayRect.height());
} else {
- transform = stackView.getStackAlgorithm().getStackTransform(task, stackScroll, transform);
+ transform = stackView.getStackAlgorithm().getStackTransform(task, stackScroll, transform, null);
}
// Compute the thumbnail to scale up from
diff --git a/packages/SystemUI/src/com/android/systemui/recents/views/TaskBarView.java b/packages/SystemUI/src/com/android/systemui/recents/views/TaskBarView.java
index 492e3aa..90bf12f 100644
--- a/packages/SystemUI/src/com/android/systemui/recents/views/TaskBarView.java
+++ b/packages/SystemUI/src/com/android/systemui/recents/views/TaskBarView.java
@@ -126,28 +126,6 @@
mIsFullscreen = isFullscreen;
}
- /** Synchronizes this bar view's properties with the task's transform */
- void updateViewPropertiesToTaskTransform(TaskViewTransform toTransform, int duration) {
- if (duration > 0 && (mDismissButton.getVisibility() == View.VISIBLE)) {
- ViewPropertyAnimator anim = mDismissButton.animate();
-
- // Animate to the final state
- if (toTransform.hasDismissAlphaChangedFrom(mDismissButton.getAlpha())) {
- anim.alpha(toTransform.dismissAlpha)
- .setStartDelay(0)
- .setDuration(duration)
- .setInterpolator(mConfig.fastOutSlowInInterpolator)
- .withLayer()
- .start();
- }
- } else {
- // Set the changed properties
- if (toTransform.hasDismissAlphaChangedFrom(mDismissButton.getAlpha())) {
- mDismissButton.setAlpha(toTransform.dismissAlpha);
- }
- }
- }
-
@Override
public boolean hasOverlappingRendering() {
return false;
diff --git a/packages/SystemUI/src/com/android/systemui/recents/views/TaskStackView.java b/packages/SystemUI/src/com/android/systemui/recents/views/TaskStackView.java
index aa67c1e..986df91 100644
--- a/packages/SystemUI/src/com/android/systemui/recents/views/TaskStackView.java
+++ b/packages/SystemUI/src/com/android/systemui/recents/views/TaskStackView.java
@@ -16,25 +16,17 @@
package com.android.systemui.recents.views;
-import android.animation.Animator;
-import android.animation.AnimatorListenerAdapter;
-import android.animation.ObjectAnimator;
-import android.animation.ValueAnimator;
import android.content.ComponentName;
import android.content.Context;
-import android.graphics.Canvas;
import android.graphics.Rect;
import android.view.LayoutInflater;
import android.view.MotionEvent;
import android.view.View;
import android.widget.FrameLayout;
-import android.widget.OverScroller;
import com.android.systemui.R;
import com.android.systemui.recents.Constants;
import com.android.systemui.recents.RecentsConfiguration;
import com.android.systemui.recents.misc.DozeTrigger;
-import com.android.systemui.recents.misc.ReferenceCountedTrigger;
-import com.android.systemui.recents.misc.Utilities;
import com.android.systemui.recents.model.RecentsPackageMonitor;
import com.android.systemui.recents.model.RecentsTaskLoader;
import com.android.systemui.recents.model.Task;
@@ -47,8 +39,8 @@
/* The visual representation of a task stack view */
public class TaskStackView extends FrameLayout implements TaskStack.TaskStackCallbacks,
- TaskView.TaskViewCallbacks, ViewPool.ViewPoolConsumer<TaskView, Task>,
- RecentsPackageMonitor.PackageCallbacks {
+ TaskView.TaskViewCallbacks, TaskStackViewScroller.TaskStackViewScrollerCallbacks,
+ ViewPool.ViewPoolConsumer<TaskView, Task>, RecentsPackageMonitor.PackageCallbacks {
/** The TaskView callbacks */
interface TaskStackViewCallbacks {
@@ -64,8 +56,9 @@
RecentsConfiguration mConfig;
TaskStack mStack;
- TaskStackViewLayoutAlgorithm mStackAlgorithm;
+ TaskStackViewLayoutAlgorithm mLayoutAlgorithm;
TaskStackViewFilterAlgorithm mFilterAlgorithm;
+ TaskStackViewScroller mStackScroller;
TaskStackViewTouchHandler mTouchHandler;
TaskStackViewCallbacks mCb;
ViewPool<TaskView, Task> mViewPool;
@@ -73,18 +66,9 @@
DozeTrigger mUIDozeTrigger;
DebugOverlayView mDebugOverlay;
Rect mTaskStackBounds = new Rect();
-
- // The virtual stack scroll that we use for the card layout
- int mStackScroll;
- int mMinScroll;
- int mMaxScroll;
- int mStashedScroll;
int mFocusedTaskIndex = -1;
- OverScroller mScroller;
- ObjectAnimator mScrollAnimator;
// Optimizations
- ReferenceCountedTrigger mHwLayersTrigger;
int mStackViewsAnimationDuration;
boolean mStackViewsDirty = true;
boolean mAwaitingFirstLayout = true;
@@ -114,12 +98,13 @@
mConfig = RecentsConfiguration.getInstance();
mStack = stack;
mStack.setCallbacks(this);
- mScroller = new OverScroller(context);
- mTouchHandler = new TaskStackViewTouchHandler(context, this);
mViewPool = new ViewPool<TaskView, Task>(context, this);
mInflater = LayoutInflater.from(context);
- mStackAlgorithm = new TaskStackViewLayoutAlgorithm(mConfig);
+ mLayoutAlgorithm = new TaskStackViewLayoutAlgorithm(mConfig);
mFilterAlgorithm = new TaskStackViewFilterAlgorithm(mConfig, this, mViewPool);
+ mStackScroller = new TaskStackViewScroller(context, mConfig, mLayoutAlgorithm);
+ mStackScroller.setCallbacks(this);
+ mTouchHandler = new TaskStackViewTouchHandler(context, this, mStackScroller);
mUIDozeTrigger = new DozeTrigger(mConfig.taskBarDismissDozeDelaySeconds, new Runnable() {
@Override
public void run() {
@@ -149,7 +134,7 @@
}
void requestSynchronizeStackViewsWithModel(int duration) {
if (!mStackViewsDirty) {
- invalidate(mStackAlgorithm.mStackRect);
+ invalidate();
mStackViewsDirty = true;
}
if (mAwaitingFirstLayout) {
@@ -174,7 +159,7 @@
/** Returns the stack algorithm for this task stack. */
public TaskStackViewLayoutAlgorithm getStackAlgorithm() {
- return mStackAlgorithm;
+ return mLayoutAlgorithm;
}
/**
@@ -182,7 +167,7 @@
*/
private boolean updateStackTransforms(ArrayList<TaskViewTransform> taskTransforms,
ArrayList<Task> tasks,
- int stackScroll,
+ float stackScroll,
int[] visibleRangeOut,
boolean boundTranslationsToRect) {
// XXX: We should be intelligent about where to look for the visible stack range using the
@@ -207,8 +192,10 @@
}
// Update the stack transforms
+ TaskViewTransform prevTransform = null;
for (int i = taskCount - 1; i >= 0; i--) {
- TaskViewTransform transform = mStackAlgorithm.getStackTransform(tasks.get(i), stackScroll, taskTransforms.get(i));
+ TaskViewTransform transform = mLayoutAlgorithm.getStackTransform(tasks.get(i),
+ stackScroll, taskTransforms.get(i), prevTransform);
if (transform.visible) {
if (frontMostVisibleIndex < 0) {
frontMostVisibleIndex = i;
@@ -228,8 +215,9 @@
if (boundTranslationsToRect) {
transform.translationY = Math.min(transform.translationY,
- mStackAlgorithm.mViewRect.bottom);
+ mLayoutAlgorithm.mViewRect.bottom);
}
+ prevTransform = transform;
}
if (visibleRangeOut != null) {
visibleRangeOut[0] = frontMostVisibleIndex;
@@ -243,7 +231,7 @@
* call is less optimal than calling updateStackTransforms directly.
*/
private ArrayList<TaskViewTransform> getStackTransforms(ArrayList<Task> tasks,
- int stackScroll,
+ float stackScroll,
int[] visibleRangeOut,
boolean boundTranslationsToRect) {
ArrayList<TaskViewTransform> taskTransforms = new ArrayList<TaskViewTransform>();
@@ -257,9 +245,13 @@
if (mStackViewsDirty) {
// Get all the task transforms
ArrayList<Task> tasks = mStack.getTasks();
- int stackScroll = getStackScroll();
+ float stackScroll = mStackScroller.getStackScroll();
int[] visibleRange = mTmpVisibleRange;
- boolean isValidVisibleRange = updateStackTransforms(mCurrentTaskTransforms, tasks, stackScroll, visibleRange, false);
+ boolean isValidVisibleRange = updateStackTransforms(mCurrentTaskTransforms, tasks,
+ stackScroll, visibleRange, false);
+ if (mDebugOverlay != null) {
+ mDebugOverlay.setText("vis[" + visibleRange[1] + "-" + visibleRange[0] + "]");
+ }
// Return all the invisible children to the pool
mTmpTaskViewMap.clear();
@@ -288,11 +280,10 @@
if (mStackViewsAnimationDuration > 0) {
// For items in the list, put them in start animating them from the
// approriate ends of the list where they are expected to appear
- if (transform.t < 0) {
- mTmpTransform = mStackAlgorithm.getStackTransform(tasks.get(0), stackScroll, mTmpTransform);
+ if (Float.compare(transform.p, 0f) <= 0) {
+ mLayoutAlgorithm.getStackTransform(0f, 0f, mTmpTransform, null);
} else {
- int nextTaskStackScroll = mStackAlgorithm.getStackScrollForTaskIndex(task, 1);
- mStackAlgorithm.getStackTransform(nextTaskStackScroll, stackScroll, mTmpTransform);
+ mLayoutAlgorithm.getStackTransform(1f, 0f, mTmpTransform, null);
}
tv.updateViewPropertiesToTaskTransform(mTmpTransform, 0);
}
@@ -357,143 +348,22 @@
mTaskStackBounds.set(r);
}
- /** Sets the current stack scroll */
- public void setStackScroll(int value) {
- mStackScroll = value;
- mUIDozeTrigger.poke();
- requestSynchronizeStackViewsWithModel();
- }
-
- /** Sets the current stack scroll without synchronizing the stack view with the model */
- public void setStackScrollRaw(int value) {
- mStackScroll = value;
- mUIDozeTrigger.poke();
- }
- /** Sets the current stack scroll to the initial state when you first enter recents */
- public void setStackScrollToInitialState() {
- setStackScroll(getInitialStackScroll());
- }
- /** Computes the initial stack scroll for the stack. */
- int getInitialStackScroll() {
- if (mStack.getTaskCount() > 2) {
- return Math.max(mMinScroll, mMaxScroll - (int) (mStackAlgorithm.mTaskRect.height() * (3f/4f)));
- }
- return mMaxScroll;
- }
-
- /** Gets the current stack scroll */
- public int getStackScroll() {
- return mStackScroll;
- }
-
- /** Animates the stack scroll into bounds */
- ObjectAnimator animateBoundScroll() {
- int curScroll = getStackScroll();
- int newScroll = Math.max(mMinScroll, Math.min(mMaxScroll, curScroll));
- if (newScroll != curScroll) {
- // Start a new scroll animation
- animateScroll(curScroll, newScroll, null);
- }
- return mScrollAnimator;
- }
-
- /** Animates the stack scroll */
- void animateScroll(int curScroll, int newScroll, final Runnable postRunnable) {
- // Abort any current animations
- abortScroller();
- abortBoundScrollAnimation();
-
- mScrollAnimator = ObjectAnimator.ofInt(this, "stackScroll", curScroll, newScroll);
- mScrollAnimator.setDuration(Utilities.calculateTranslationAnimationDuration(newScroll -
- curScroll, 250));
- mScrollAnimator.setInterpolator(mConfig.fastOutSlowInInterpolator);
- mScrollAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
- @Override
- public void onAnimationUpdate(ValueAnimator animation) {
- setStackScroll((Integer) animation.getAnimatedValue());
- }
- });
- mScrollAnimator.addListener(new AnimatorListenerAdapter() {
- @Override
- public void onAnimationEnd(Animator animation) {
- if (postRunnable != null) {
- postRunnable.run();
- }
- mScrollAnimator.removeAllListeners();
- }
- });
- mScrollAnimator.start();
- }
-
- /** Aborts any current stack scrolls */
- void abortBoundScrollAnimation() {
- if (mScrollAnimator != null) {
- mScrollAnimator.cancel();
- }
- }
-
- /** Aborts the scroller and any current fling */
- void abortScroller() {
- if (!mScroller.isFinished()) {
- // Abort the scroller
- mScroller.abortAnimation();
- }
- }
-
- /** Bounds the current scroll if necessary */
- public boolean boundScroll() {
- int curScroll = getStackScroll();
- int newScroll = Math.max(mMinScroll, Math.min(mMaxScroll, curScroll));
- if (newScroll != curScroll) {
- setStackScroll(newScroll);
- return true;
- }
- return false;
- }
-
- /**
- * Bounds the current scroll if necessary, but does not synchronize the stack view with the
- * model.
- */
- public boolean boundScrollRaw() {
- int curScroll = getStackScroll();
- int newScroll = Math.max(mMinScroll, Math.min(mMaxScroll, curScroll));
- if (newScroll != curScroll) {
- setStackScrollRaw(newScroll);
- return true;
- }
- return false;
- }
-
-
- /** Returns the amount that the scroll is out of bounds */
- int getScrollAmountOutOfBounds(int scroll) {
- if (scroll < mMinScroll) {
- return mMinScroll - scroll;
- } else if (scroll > mMaxScroll) {
- return scroll - mMaxScroll;
- }
- return 0;
- }
-
- /** Returns whether the specified scroll is out of bounds */
- boolean isScrollOutOfBounds() {
- return getScrollAmountOutOfBounds(mStackScroll) != 0;
- }
-
/** Updates the min and max virtual scroll bounds */
void updateMinMaxScroll(boolean boundScrollToNewMinMax) {
// Compute the min and max scroll values
- mStackAlgorithm.computeMinMaxScroll(mStack.getTasks());
- mMinScroll = mStackAlgorithm.mMinScroll;
- mMaxScroll = mStackAlgorithm.mMaxScroll;
+ mLayoutAlgorithm.computeMinMaxScroll(mStack.getTasks());
// Debug logging
if (boundScrollToNewMinMax) {
- boundScroll();
+ mStackScroller.boundScroll();
}
}
+ /** Returns the scroller. */
+ public TaskStackViewScroller getScroller() {
+ return mStackScroller;
+ }
+
/** Focuses the task at the specified index in the stack */
void focusTask(int taskIndex, boolean scrollToNewPosition) {
if (0 <= taskIndex && taskIndex < mStack.getTaskCount()) {
@@ -520,10 +390,10 @@
if (scrollToNewPosition) {
// Scroll the view into position
- int newScroll = Math.max(mMinScroll, Math.min(mMaxScroll,
- mStackAlgorithm.getStackScrollForTaskIndex(t)));
-
- animateScroll(getStackScroll(), newScroll, postScrollRunnable);
+ // XXX: We probably want this to be centered in view instead of p = 0f
+ float newScroll = mStackScroller.getBoundedStackScroll(
+ mLayoutAlgorithm.getStackScrollForTaskIndex(t));
+ mStackScroller.animateScroll(mStackScroller.getStackScroll(), newScroll, postScrollRunnable);
} else {
if (postScrollRunnable != null) {
postScrollRunnable.run();
@@ -558,24 +428,17 @@
@Override
public void computeScroll() {
- if (mScroller.computeScrollOffset()) {
- setStackScroll(mScroller.getCurrY());
- invalidate();
- }
- }
-
- @Override
- public void dispatchDraw(Canvas canvas) {
+ // Synchronize the views
if (synchronizeStackViewsWithModel()) {
clipTaskViews();
}
- super.dispatchDraw(canvas);
+ mStackScroller.computeScroll();
}
/** Computes the stack and task rects */
public void computeRects(int windowWidth, int windowHeight, Rect taskStackBounds) {
// Compute the rects in the stack algorithm
- mStackAlgorithm.computeRects(mStack.getTasks(), windowWidth, windowHeight, taskStackBounds);
+ mLayoutAlgorithm.computeRects(windowWidth, windowHeight, taskStackBounds);
// Update the scroll bounds
updateMinMaxScroll(false);
@@ -598,7 +461,7 @@
// If this is the first layout, then scroll to the front of the stack and synchronize the
// stack views immediately to load all the views
if (mAwaitingFirstLayout) {
- setStackScrollToInitialState();
+ mStackScroller.setStackScrollToInitialState();
requestSynchronizeStackViewsWithModel();
synchronizeStackViewsWithModel();
}
@@ -611,9 +474,9 @@
tv.measure(widthMeasureSpec, heightMeasureSpec);
} else {
tv.measure(
- MeasureSpec.makeMeasureSpec(mStackAlgorithm.mTaskRect.width(),
+ MeasureSpec.makeMeasureSpec(mLayoutAlgorithm.mTaskRect.width(),
MeasureSpec.EXACTLY),
- MeasureSpec.makeMeasureSpec(mStackAlgorithm.mTaskRect.height() +
+ MeasureSpec.makeMeasureSpec(mLayoutAlgorithm.mTaskRect.height() +
tv.getMaxFooterHeight(), MeasureSpec.EXACTLY));
}
}
@@ -635,8 +498,8 @@
if (tv.isFullScreenView()) {
tv.layout(left, top, left + tv.getMeasuredWidth(), top + tv.getMeasuredHeight());
} else {
- tv.layout(mStackAlgorithm.mTaskRect.left, mStackAlgorithm.mTaskRect.top,
- mStackAlgorithm.mTaskRect.right, mStackAlgorithm.mTaskRect.bottom +
+ tv.layout(mLayoutAlgorithm.mTaskRect.left, mLayoutAlgorithm.mTaskRect.top,
+ mLayoutAlgorithm.mTaskRect.right, mLayoutAlgorithm.mTaskRect.bottom +
tv.getMaxFooterHeight());
}
}
@@ -649,8 +512,8 @@
/** Handler for the first layout. */
void onFirstLayout() {
- int offscreenY = mStackAlgorithm.mViewRect.bottom -
- (mStackAlgorithm.mTaskRect.top - mStackAlgorithm.mViewRect.top);
+ int offscreenY = mLayoutAlgorithm.mViewRect.bottom -
+ (mLayoutAlgorithm.mTaskRect.top - mLayoutAlgorithm.mViewRect.top);
// Find the launch target task
Task launchTargetTask = null;
@@ -717,10 +580,10 @@
ctx.currentTaskTransform = new TaskViewTransform();
ctx.currentStackViewIndex = i;
ctx.currentStackViewCount = childCount;
- ctx.currentTaskRect = mStackAlgorithm.mTaskRect;
+ ctx.currentTaskRect = mLayoutAlgorithm.mTaskRect;
ctx.currentTaskOccludesLaunchTarget = (launchTargetTask != null) &&
launchTargetTask.group.isTaskAboveTask(task, launchTargetTask);
- mStackAlgorithm.getStackTransform(task, getStackScroll(), ctx.currentTaskTransform);
+ mLayoutAlgorithm.getStackTransform(task, mStackScroller.getStackScroll(), ctx.currentTaskTransform, null);
tv.startEnterRecentsAnimation(ctx);
}
@@ -737,9 +600,12 @@
/** Requests this task stacks to start it's exit-recents animation. */
public void startExitToHomeAnimation(ViewAnimation.TaskViewExitContext ctx) {
- // Animate all the task views into view
- ctx.offscreenTranslationY = mStackAlgorithm.mViewRect.bottom -
- (mStackAlgorithm.mTaskRect.top - mStackAlgorithm.mViewRect.top);
+ // Stop any scrolling
+ mStackScroller.stopScroller();
+ mStackScroller.stopBoundScrollAnimation();
+ // Animate all the task views out of view
+ ctx.offscreenTranslationY = mLayoutAlgorithm.mViewRect.bottom -
+ (mLayoutAlgorithm.mTaskRect.top - mLayoutAlgorithm.mViewRect.top);
int childCount = getChildCount();
for (int i = 0; i < childCount; i++) {
TaskView tv = (TaskView) getChildAt(i);
@@ -753,8 +619,6 @@
/** Animates a task view in this stack as it launches. */
public void startLaunchTaskAnimation(TaskView tv, final Runnable r) {
Task launchTargetTask = tv.getTask();
- int offscreenTranslationY = mStackAlgorithm.mViewRect.bottom -
- (mStackAlgorithm.mTaskRect.top - mStackAlgorithm.mViewRect.top);
int childCount = getChildCount();
for (int i = 0; i < childCount; i++) {
TaskView t = (TaskView) getChildAt(i);
@@ -788,17 +652,11 @@
@Override
public void onStackTaskAdded(TaskStack stack, Task t) {
- // Update the task offsets
- mStackAlgorithm.updateTaskOffsets(mStack.getTasks());
-
requestSynchronizeStackViewsWithModel();
}
@Override
public void onStackTaskRemoved(TaskStack stack, Task removedTask, Task newFrontMostTask) {
- // Update the task offsets
- mStackAlgorithm.updateTaskOffsets(mStack.getTasks());
-
// Remove the view associated with this task, we can't rely on updateTransforms
// to work here because the task is no longer in the list
TaskView tv = getChildViewForTask(removedTask);
@@ -811,8 +669,7 @@
// Update the min/max scroll and animate other task views into their new positions
updateMinMaxScroll(true);
- int movement = (int) mStackAlgorithm.getTaskOverlapHeight();
- requestSynchronizeStackViewsWithModel(Utilities.calculateTranslationAnimationDuration(movement));
+ requestSynchronizeStackViewsWithModel(200);
// Update the new front most task
if (newFrontMostTask != null) {
@@ -839,6 +696,7 @@
@Override
public void onStackFiltered(TaskStack newStack, final ArrayList<Task> curTasks,
Task filteredTask) {
+ /*
// Stash the scroll and filtered task for us to restore to when we unfilter
mStashedScroll = getStackScroll();
@@ -847,11 +705,11 @@
getStackTransforms(curTasks, getStackScroll(), null, true);
// Update the task offsets
- mStackAlgorithm.updateTaskOffsets(mStack.getTasks());
+ mLayoutAlgorithm.updateTaskOffsets(mStack.getTasks());
// Scroll the item to the top of the stack (sans-peek) rect so that we can see it better
updateMinMaxScroll(false);
- float overlapHeight = mStackAlgorithm.getTaskOverlapHeight();
+ float overlapHeight = mLayoutAlgorithm.getTaskOverlapHeight();
setStackScrollRaw((int) (newStack.indexOfTask(filteredTask) * overlapHeight));
boundScrollRaw();
@@ -865,16 +723,18 @@
// Notify any callbacks
mCb.onTaskStackFilterTriggered();
+ */
}
@Override
public void onStackUnfiltered(TaskStack newStack, final ArrayList<Task> curTasks) {
+ /*
// Calculate the current task transforms
final ArrayList<TaskViewTransform> curTaskTransforms =
getStackTransforms(curTasks, getStackScroll(), null, true);
// Update the task offsets
- mStackAlgorithm.updateTaskOffsets(mStack.getTasks());
+ mLayoutAlgorithm.updateTaskOffsets(mStack.getTasks());
// Restore the stashed scroll
updateMinMaxScroll(false);
@@ -894,6 +754,7 @@
// Notify any callbacks
mCb.onTaskStackUnfilterTriggered();
+ */
}
/**** ViewPoolConsumer Implementation ****/
@@ -1014,7 +875,7 @@
@Override
public void onTaskViewClipStateChanged(TaskView tv) {
- invalidate(mStackAlgorithm.mStackRect);
+ invalidate();
}
@Override
@@ -1022,6 +883,15 @@
requestSynchronizeStackViewsWithModel();
}
+ /**** TaskStackViewScroller.TaskStackViewScrollerCallbacks ****/
+
+ @Override
+ public void onScrollChanged(float p) {
+ mUIDozeTrigger.poke();
+ requestSynchronizeStackViewsWithModel();
+ invalidate();
+ }
+
/**** RecentsPackageMonitor.PackageCallbacks Implementation ****/
@Override
diff --git a/packages/SystemUI/src/com/android/systemui/recents/views/TaskStackViewLayoutAlgorithm.java b/packages/SystemUI/src/com/android/systemui/recents/views/TaskStackViewLayoutAlgorithm.java
index 0fd4e86..b1482bb 100644
--- a/packages/SystemUI/src/com/android/systemui/recents/views/TaskStackViewLayoutAlgorithm.java
+++ b/packages/SystemUI/src/com/android/systemui/recents/views/TaskStackViewLayoutAlgorithm.java
@@ -18,184 +18,276 @@
import android.graphics.Rect;
import com.android.systemui.recents.RecentsConfiguration;
+import com.android.systemui.recents.misc.Console;
import com.android.systemui.recents.misc.Utilities;
import com.android.systemui.recents.model.Task;
import java.util.ArrayList;
import java.util.HashMap;
-/* The layout logic for a TaskStackView */
+/* The layout logic for a TaskStackView.
+ *
+ * We are using a curve that defines the curve of the tasks as that go back in the recents list.
+ * The curve is defined such that at curve progress p = 0 is the end of the curve (the top of the
+ * stack rect), and p = 1 at the start of the curve and the bottom of the stack rect.
+ */
public class TaskStackViewLayoutAlgorithm {
// These are all going to change
- static final float StackOverlapPct = 0.65f; // The overlap height relative to the task height
- static final float StackPeekHeightPct = 0.075f; // The height of the peek space relative to the stack height
- static final float StackPeekMinScale = 0.8f; // The min scale of the last card in the peek area
- static final int StackPeekNumCards = 3; // The number of cards we see in the peek space
+ static final float StackPeekMinScale = 0.825f; // The min scale of the last card in the peek area
RecentsConfiguration mConfig;
// The various rects that define the stack view
Rect mViewRect = new Rect();
+ Rect mStackVisibleRect = new Rect();
Rect mStackRect = new Rect();
- Rect mStackRectSansPeek = new Rect();
Rect mTaskRect = new Rect();
- // The min/max scroll
- int mMinScroll;
- int mMaxScroll;
+ // The min/max scroll progress
+ float mMinScrollP;
+ float mMaxScrollP;
+ float mInitialScrollP;
+ int mWithinAffiliationOffset;
+ int mBetweenAffiliationOffset;
+ HashMap<Task.TaskKey, Float> mTaskProgressMap = new HashMap<Task.TaskKey, Float>();
- HashMap<Task.TaskKey, Integer> mTaskOffsetMap = new HashMap<Task.TaskKey, Integer>();
+ // Log function
+ static final float XScale = 1.75f; // The large the XScale, the longer the flat area of the curve
+ static final float LogBase = 300;
+ static final int PrecisionSteps = 250;
+ static float[] xp;
+ static float[] px;
public TaskStackViewLayoutAlgorithm(RecentsConfiguration config) {
mConfig = config;
+ mWithinAffiliationOffset = mConfig.taskBarHeight;
+ mBetweenAffiliationOffset = 4 * mConfig.taskBarHeight;
+
+ // Precompute the path
+ initializeCurve();
}
/** Computes the stack and task rects */
- public void computeRects(ArrayList<Task> tasks, int windowWidth, int windowHeight,
- Rect taskStackBounds) {
- // Note: We let the stack view be the full height because we want the cards to go under the
- // navigation bar if possible. However, the stack rects which we use to calculate
- // max scroll, etc. need to take the nav bar into account
-
+ public void computeRects(int windowWidth, int windowHeight, Rect taskStackBounds) {
// Compute the stack rects
mViewRect.set(0, 0, windowWidth, windowHeight);
mStackRect.set(taskStackBounds);
+ mStackVisibleRect.set(taskStackBounds);
+ mStackVisibleRect.bottom = mViewRect.bottom;
int widthPadding = (int) (mConfig.taskStackWidthPaddingPct * mStackRect.width());
int heightPadding = mConfig.taskStackTopPaddingPx;
mStackRect.inset(widthPadding, heightPadding);
- mStackRectSansPeek.set(mStackRect);
- mStackRectSansPeek.top += StackPeekHeightPct * windowHeight;
// Compute the task rect
int size = mStackRect.width();
int left = mStackRect.left + (mStackRect.width() - size) / 2;
- mTaskRect.set(left, mStackRectSansPeek.top,
- left + size, mStackRectSansPeek.top + size);
-
- // Update the task offsets once the size changes
- updateTaskOffsets(tasks);
+ mTaskRect.set(left, mStackRect.top,
+ left + size, mStackRect.top + size);
}
+ /** Computes the minimum and maximum scroll progress values */
void computeMinMaxScroll(ArrayList<Task> tasks) {
- // Compute the min and max scroll values
- int numTasks = Math.max(1, tasks.size());
- int taskHeight = mTaskRect.height();
- int stackHeight = mStackRectSansPeek.height();
+ // Clear the progress map
+ mTaskProgressMap.clear();
- if (numTasks <= 1) {
- // If there is only one task, then center the task in the stack rect (sans peek)
- mMinScroll = mMaxScroll = -(stackHeight -
- (taskHeight + mConfig.taskViewLockToAppButtonHeight)) / 2;
- } else {
- int maxScrollHeight = getStackScrollForTaskIndex(tasks.get(tasks.size() - 1))
- + taskHeight + mConfig.taskViewLockToAppButtonHeight;
- mMinScroll = Math.min(stackHeight, maxScrollHeight) - stackHeight;
- mMaxScroll = maxScrollHeight - stackHeight;
+ // Return early if we have no tasks
+ if (tasks.isEmpty()) {
+ mMinScrollP = mMaxScrollP = 0;
+ return;
}
+
+ int taskHeight = mTaskRect.height();
+ float pAtBottomOfStackRect = screenYToCurveProgress(mStackVisibleRect.bottom);
+ float pWithinAffiliateOffset = pAtBottomOfStackRect -
+ screenYToCurveProgress(mStackVisibleRect.bottom - mWithinAffiliationOffset);
+ float pBetweenAffiliateOffset = pAtBottomOfStackRect -
+ screenYToCurveProgress(mStackVisibleRect.bottom - mBetweenAffiliationOffset);
+ float pTaskHeightOffset = pAtBottomOfStackRect -
+ screenYToCurveProgress(mStackVisibleRect.bottom - taskHeight);
+ float pNavBarOffset = pAtBottomOfStackRect -
+ screenYToCurveProgress(mStackVisibleRect.bottom - (mStackVisibleRect.bottom - mStackRect.bottom));
+
+ // Update the task offsets
+ float pAtBackMostCardTop = screenYToCurveProgress(mStackVisibleRect.top +
+ (mStackVisibleRect.height() - taskHeight) / 2);
+ float pAtFrontMostCardTop = pAtBackMostCardTop;
+ float pAtSecondFrontMostCardTop = pAtBackMostCardTop;
+ int taskCount = tasks.size();
+ for (int i = 0; i < taskCount; i++) {
+ Task task = tasks.get(i);
+ mTaskProgressMap.put(task.key, pAtFrontMostCardTop);
+
+ if (i < (taskCount - 1)) {
+ // Increment the peek height
+ float pPeek = task.group.isFrontMostTask(task) ? pBetweenAffiliateOffset :
+ pWithinAffiliateOffset;
+ pAtSecondFrontMostCardTop = pAtFrontMostCardTop;
+ pAtFrontMostCardTop += pPeek;
+ }
+ }
+
+ mMinScrollP = 0f;
+ mMaxScrollP = pAtFrontMostCardTop - ((1f - pTaskHeightOffset - pNavBarOffset));
+ mInitialScrollP = pAtSecondFrontMostCardTop - ((1f - pTaskHeightOffset - pNavBarOffset));
}
/** Update/get the transform */
- public TaskViewTransform getStackTransform(Task task, int stackScroll, TaskViewTransform transformOut) {
+ public TaskViewTransform getStackTransform(Task task, float stackScroll, TaskViewTransform transformOut,
+ TaskViewTransform prevTransform) {
// Return early if we have an invalid index
if (task == null) {
transformOut.reset();
return transformOut;
}
- return getStackTransform(getStackScrollForTaskIndex(task), stackScroll, transformOut);
+ return getStackTransform(mTaskProgressMap.get(task.key), stackScroll, transformOut, prevTransform);
}
/** Update/get the transform */
- public TaskViewTransform getStackTransform(int taskStackScroll, int stackScroll, TaskViewTransform transformOut) {
- // Map the items to an continuous position relative to the specified scroll
- int numPeekCards = StackPeekNumCards;
- float overlapHeight = StackOverlapPct * mTaskRect.height();
- float peekHeight = StackPeekHeightPct * mStackRect.height();
- float t = (taskStackScroll - stackScroll) / overlapHeight;
- float boundedT = Math.max(t, -(numPeekCards + 1));
-
- // Set the scale relative to its position
- int numFrontScaledCards = 3;
- float minScale = StackPeekMinScale;
- float scaleRange = 1f - minScale;
- float scaleInc = scaleRange / (numPeekCards + numFrontScaledCards);
- float scale = Math.max(minScale, Math.min(1f, minScale +
- ((boundedT + (numPeekCards + 1)) * scaleInc)));
- float scaleYOffset = ((1f - scale) * mTaskRect.height()) / 2;
- // Account for the bar offsets being scaled?
- float scaleBarYOffset = (1f - scale) * mConfig.taskBarHeight;
- transformOut.scale = scale;
-
- // Set the y translation
- if (boundedT < 0f) {
- transformOut.translationY = (int) ((Math.max(-numPeekCards, boundedT) /
- numPeekCards) * peekHeight - scaleYOffset);
- } else {
- transformOut.translationY = (int) (boundedT * overlapHeight - scaleYOffset);
+ public TaskViewTransform getStackTransform(float taskProgress, float stackScroll, TaskViewTransform transformOut, TaskViewTransform prevTransform) {
+ float pTaskRelative = taskProgress - stackScroll;
+ float pBounded = Math.max(0, Math.min(pTaskRelative, 1f));
+ // If the task top is outside of the bounds below the screen, then immediately reset it
+ if (pTaskRelative > 1f) {
+ transformOut.reset();
+ return transformOut;
}
-
- // Set the z translation
+ // The check for the top is trickier, since we want to show the next task if it is at all
+ // visible, even if p < 0.
+ if (pTaskRelative < 0f) {
+ if (prevTransform != null && Float.compare(prevTransform.p, 0f) <= 0) {
+ transformOut.reset();
+ return transformOut;
+ }
+ }
+ float scale = curveProgressToScale(pBounded);
+ int scaleYOffset = (int) (((1f - scale) * mTaskRect.height()) / 2);
int minZ = mConfig.taskViewTranslationZMinPx;
- int incZ = mConfig.taskViewTranslationZIncrementPx;
- transformOut.translationZ = (int) Math.max(minZ, minZ + ((boundedT + numPeekCards) * incZ));
-
- // Set the alphas
- // transformOut.dismissAlpha = Math.max(-1f, Math.min(0f, t + 1)) + 1f;
- transformOut.dismissAlpha = 1f;
-
- // Update the rect and visibility
+ int maxZ = mConfig.taskViewTranslationZMaxPx;
+ transformOut.scale = scale;
+ transformOut.translationY = curveProgressToScreenY(pBounded) - mStackVisibleRect.top -
+ scaleYOffset;
+ transformOut.translationZ = Math.max(minZ, minZ + (pBounded * (maxZ - minZ)));
transformOut.rect.set(mTaskRect);
- if (t < -(numPeekCards + 1)) {
- transformOut.visible = false;
- } else {
- transformOut.rect.offset(0, transformOut.translationY);
- Utilities.scaleRectAboutCenter(transformOut.rect, transformOut.scale);
- transformOut.visible = Rect.intersects(mViewRect, transformOut.rect);
- }
- transformOut.t = t;
+ transformOut.rect.offset(0, transformOut.translationY);
+ Utilities.scaleRectAboutCenter(transformOut.rect, transformOut.scale);
+ transformOut.visible = true;
+ transformOut.p = pTaskRelative;
return transformOut;
}
/**
- * Returns the overlap between one task and the next.
+ * Returns the scroll to such task top = 1f;
*/
- float getTaskOverlapHeight() {
- return StackOverlapPct * mTaskRect.height();
+ float getStackScrollForTaskIndex(Task t) {
+ return mTaskProgressMap.get(t.key);
}
- /**
- * Returns the scroll to such that the task transform at that index will have t=0. (If the scroll
- * is not bounded)
- */
- int getStackScrollForTaskIndex(Task t) {
- return mTaskOffsetMap.get(t.key);
- }
+ /** Initializes the curve. */
+ public static void initializeCurve() {
+ if (xp != null && px != null) return;
+ xp = new float[PrecisionSteps + 1];
+ px = new float[PrecisionSteps + 1];
- /**
- * Returns the scroll to such that the task transform at that task + index will have t=0.
- * (If the scroll is not bounded)
- */
- int getStackScrollForTaskIndex(Task t, int relativeIndexOffset) {
- return mTaskOffsetMap.get(t.key) + (int) (relativeIndexOffset * getTaskOverlapHeight());
- }
-
- /**
- * Updates the cache of tasks to offsets.
- */
- void updateTaskOffsets(ArrayList<Task> tasks) {
- mTaskOffsetMap.clear();
- int offset = 0;
- int taskCount = tasks.size();
- for (int i = 0; i < taskCount; i++) {
- Task t = tasks.get(i);
- mTaskOffsetMap.put(t.key, offset);
- if (t.group.isFrontMostTask(t)) {
- offset += getTaskOverlapHeight();
- } else {
- offset += mConfig.taskBarHeight;
+ // Approximate f(x)
+ float[] fx = new float[PrecisionSteps + 1];
+ float step = 1f / PrecisionSteps;
+ float x = 0;
+ for (int xStep = 0; xStep <= PrecisionSteps; xStep++) {
+ fx[xStep] = logFunc(x);
+ x += step;
+ }
+ // Calculate the arc length for x:1->0
+ float pLength = 0;
+ float[] dx = new float[PrecisionSteps + 1];
+ dx[0] = 0;
+ for (int xStep = 1; xStep < PrecisionSteps; xStep++) {
+ dx[xStep] = (float) Math.sqrt(Math.pow(fx[xStep] - fx[xStep - 1], 2) + Math.pow(step, 2));
+ pLength += dx[xStep];
+ }
+ // Approximate p(x), a function of cumulative progress with x, normalized to 0..1
+ float p = 0;
+ px[0] = 0f;
+ px[PrecisionSteps] = 1f;
+ for (int xStep = 1; xStep <= PrecisionSteps; xStep++) {
+ p += Math.abs(dx[xStep] / pLength);
+ px[xStep] = p;
+ }
+ // Given p(x), calculate the inverse function x(p). This assumes that x(p) is also a valid
+ // function.
+ int xStep = 0;
+ p = 0;
+ xp[0] = 0f;
+ xp[PrecisionSteps] = 1f;
+ for (int pStep = 0; pStep < PrecisionSteps; pStep++) {
+ // Walk forward in px and find the x where px <= p && p < px+1
+ while (xStep < PrecisionSteps) {
+ if (px[xStep] > p) break;
+ xStep++;
}
+ // Now, px[xStep-1] <= p < px[xStep]
+ if (xStep == 0) {
+ xp[pStep] = 0;
+ } else {
+ // Find x such that proportionally, x is correct
+ float fraction = (p - px[xStep - 1]) / (px[xStep] - px[xStep - 1]);
+ x = (xStep - 1 + fraction) * step;
+ xp[pStep] = x;
+ }
+ p += step;
}
}
+ /** Reverses and scales out x. */
+ static float reverse(float x) {
+ return (-x * XScale) + 1;
+ }
+ /** The log function describing the curve. */
+ static float logFunc(float x) {
+ return 1f - (float) (Math.pow(LogBase, reverse(x))) / (LogBase);
+ }
+ /** The inverse of the log function describing the curve. */
+ float invLogFunc(float y) {
+ return (float) (Math.log((1f - reverse(y)) * (LogBase - 1) + 1) / Math.log(LogBase));
+ }
+
+ /** Converts from the progress along the curve to a screen coordinate. */
+ int curveProgressToScreenY(float p) {
+ if (p < 0 || p > 1) return mStackVisibleRect.top + (int) (p * mStackVisibleRect.height());
+ float pIndex = p * PrecisionSteps;
+ int pFloorIndex = (int) Math.floor(pIndex);
+ int pCeilIndex = (int) Math.ceil(pIndex);
+ float xFraction = 0;
+ if (pFloorIndex < PrecisionSteps && (pCeilIndex != pFloorIndex)) {
+ float pFraction = (pIndex - pFloorIndex) / (pCeilIndex - pFloorIndex);
+ xFraction = (xp[pCeilIndex] - xp[pFloorIndex]) * pFraction;
+ }
+ float x = xp[pFloorIndex] + xFraction;
+ return mStackVisibleRect.top + (int) (x * mStackVisibleRect.height());
+ }
+
+ /** Converts from the progress along the curve to a scale. */
+ float curveProgressToScale(float p) {
+ if (p < 0) return StackPeekMinScale;
+ if (p > 1) return 1f;
+ float scaleRange = (1f - StackPeekMinScale);
+ float scale = StackPeekMinScale + (p * scaleRange);
+ return scale;
+ }
+
+ /** Converts from a screen coordinate to the progress along the curve. */
+ float screenYToCurveProgress(int screenY) {
+ float x = (float) (screenY - mStackVisibleRect.top) / mStackVisibleRect.height();
+ if (x < 0 || x > 1) return x;
+ float xIndex = x * PrecisionSteps;
+ int xFloorIndex = (int) Math.floor(xIndex);
+ int xCeilIndex = (int) Math.ceil(xIndex);
+ float pFraction = 0;
+ if (xFloorIndex < PrecisionSteps && (xCeilIndex != xFloorIndex)) {
+ float xFraction = (xIndex - xFloorIndex) / (xCeilIndex - xFloorIndex);
+ pFraction = (px[xCeilIndex] - px[xFloorIndex]) * xFraction;
+ }
+ return px[xFloorIndex] + pFraction;
+ }
}
\ No newline at end of file
diff --git a/packages/SystemUI/src/com/android/systemui/recents/views/TaskStackViewScroller.java b/packages/SystemUI/src/com/android/systemui/recents/views/TaskStackViewScroller.java
new file mode 100644
index 0000000..0a12dab
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/recents/views/TaskStackViewScroller.java
@@ -0,0 +1,202 @@
+/*
+ * Copyright (C) 2014 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.systemui.recents.views;
+
+import android.animation.Animator;
+import android.animation.AnimatorListenerAdapter;
+import android.animation.ObjectAnimator;
+import android.animation.ValueAnimator;
+import android.content.Context;
+import android.widget.OverScroller;
+import com.android.systemui.recents.RecentsConfiguration;
+
+/* The scrolling logic for a TaskStackView */
+public class TaskStackViewScroller {
+ public interface TaskStackViewScrollerCallbacks {
+ public void onScrollChanged(float p);
+ }
+
+ RecentsConfiguration mConfig;
+ TaskStackViewLayoutAlgorithm mLayoutAlgorithm;
+ TaskStackViewScrollerCallbacks mCb;
+
+ float mStackScrollP;
+
+ OverScroller mScroller;
+ ObjectAnimator mScrollAnimator;
+
+ public TaskStackViewScroller(Context context, RecentsConfiguration config, TaskStackViewLayoutAlgorithm layoutAlgorithm) {
+ mConfig = config;
+ mScroller = new OverScroller(context);
+ mLayoutAlgorithm = layoutAlgorithm;
+ setStackScroll(getStackScroll());
+ }
+
+ /** Sets the callbacks */
+ void setCallbacks(TaskStackViewScrollerCallbacks cb) {
+ mCb = cb;
+ }
+
+ /** Gets the current stack scroll */
+ public float getStackScroll() {
+ return mStackScrollP;
+ }
+
+ /** Sets the current stack scroll */
+ public void setStackScroll(float s) {
+ mStackScrollP = s;
+ if (mCb != null) {
+ mCb.onScrollChanged(mStackScrollP);
+ }
+ }
+
+ /** Sets the current stack scroll without calling the callback. */
+ void setStackScrollRaw(float s) {
+ mStackScrollP = s;
+ }
+
+ /** Sets the current stack scroll to the initial state when you first enter recents */
+ public void setStackScrollToInitialState() {
+ setStackScroll(getBoundedStackScroll(mLayoutAlgorithm.mInitialScrollP));
+ }
+
+ /** Bounds the current scroll if necessary */
+ public boolean boundScroll() {
+ float curScroll = getStackScroll();
+ float newScroll = getBoundedStackScroll(curScroll);
+ if (Float.compare(newScroll, curScroll) != 0) {
+ setStackScroll(newScroll);
+ return true;
+ }
+ return false;
+ }
+ /** Bounds the current scroll if necessary, but does not synchronize the stack view with the model. */
+ public boolean boundScrollRaw() {
+ float curScroll = getStackScroll();
+ float newScroll = getBoundedStackScroll(curScroll);
+ if (Float.compare(newScroll, curScroll) != 0) {
+ setStackScrollRaw(newScroll);
+ return true;
+ }
+ return false;
+ }
+
+ /** Returns the bounded stack scroll */
+ float getBoundedStackScroll(float scroll) {
+ return Math.max(mLayoutAlgorithm.mMinScrollP, Math.min(mLayoutAlgorithm.mMaxScrollP, scroll));
+ }
+
+ /** Returns the amount that the aboslute value of how much the scroll is out of bounds. */
+ float getScrollAmountOutOfBounds(float scroll) {
+ if (scroll < mLayoutAlgorithm.mMinScrollP) {
+ return Math.abs(scroll - mLayoutAlgorithm.mMinScrollP);
+ } else if (scroll > mLayoutAlgorithm.mMaxScrollP) {
+ return Math.abs(scroll - mLayoutAlgorithm.mMaxScrollP);
+ }
+ return 0f;
+ }
+
+ /** Returns whether the specified scroll is out of bounds */
+ boolean isScrollOutOfBounds() {
+ return Float.compare(getScrollAmountOutOfBounds(mStackScrollP), 0f) != 0;
+ }
+
+ /** Animates the stack scroll into bounds */
+ ObjectAnimator animateBoundScroll() {
+ float curScroll = getStackScroll();
+ float newScroll = getBoundedStackScroll(curScroll);
+ if (Float.compare(newScroll, curScroll) != 0) {
+ // Start a new scroll animation
+ animateScroll(curScroll, newScroll, null);
+ }
+ return mScrollAnimator;
+ }
+
+ /** Animates the stack scroll */
+ void animateScroll(float curScroll, float newScroll, final Runnable postRunnable) {
+ // Abort any current animations
+ stopScroller();
+ stopBoundScrollAnimation();
+
+ mScrollAnimator = ObjectAnimator.ofFloat(this, "stackScroll", curScroll, newScroll);
+ mScrollAnimator.setDuration(250);
+ // We would have to project the difference into the screen coords, and then use that as the
+ // duration
+// mScrollAnimator.setDuration(Utilities.calculateTranslationAnimationDuration(newScroll -
+// curScroll, 250));
+ mScrollAnimator.setInterpolator(mConfig.fastOutSlowInInterpolator);
+ mScrollAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
+ @Override
+ public void onAnimationUpdate(ValueAnimator animation) {
+ setStackScroll((Float) animation.getAnimatedValue());
+ }
+ });
+ mScrollAnimator.addListener(new AnimatorListenerAdapter() {
+ @Override
+ public void onAnimationEnd(Animator animation) {
+ if (postRunnable != null) {
+ postRunnable.run();
+ }
+ mScrollAnimator.removeAllListeners();
+ }
+ });
+ mScrollAnimator.start();
+ }
+
+ /** Aborts any current stack scrolls */
+ void stopBoundScrollAnimation() {
+ if (mScrollAnimator != null) {
+ mScrollAnimator.removeAllListeners();
+ mScrollAnimator.cancel();
+ }
+ }
+
+ /**** OverScroller ****/
+
+ int progressToScrollRange(float p) {
+ return (int) (p * mLayoutAlgorithm.mStackVisibleRect.height());
+ }
+
+ float scrollRangeToProgress(int s) {
+ return (float) s / mLayoutAlgorithm.mStackVisibleRect.height();
+ }
+
+ /** Called from the view draw, computes the next scroll. */
+ boolean computeScroll() {
+ if (mScroller.computeScrollOffset()) {
+ float scroll = scrollRangeToProgress(mScroller.getCurrY());
+ setStackScrollRaw(scroll);
+ if (mCb != null) {
+ mCb.onScrollChanged(scroll);
+ }
+ return true;
+ }
+ return false;
+ }
+
+ /** Returns whether the overscroller is scrolling. */
+ boolean isScrolling() {
+ return !mScroller.isFinished();
+ }
+
+ /** Stops the scroller and any current fling. */
+ void stopScroller() {
+ if (!mScroller.isFinished()) {
+ mScroller.abortAnimation();
+ }
+ }
+}
\ No newline at end of file
diff --git a/packages/SystemUI/src/com/android/systemui/recents/views/TaskStackViewTouchHandler.java b/packages/SystemUI/src/com/android/systemui/recents/views/TaskStackViewTouchHandler.java
index b1c35f3..4cf6b82 100644
--- a/packages/SystemUI/src/com/android/systemui/recents/views/TaskStackViewTouchHandler.java
+++ b/packages/SystemUI/src/com/android/systemui/recents/views/TaskStackViewTouchHandler.java
@@ -29,16 +29,19 @@
static int INACTIVE_POINTER_ID = -1;
TaskStackView mSv;
+ TaskStackViewScroller mScroller;
VelocityTracker mVelocityTracker;
boolean mIsScrolling;
+ float mInitialP;
+ float mLastP;
+ float mTotalPMotion;
int mInitialMotionX, mInitialMotionY;
int mLastMotionX, mLastMotionY;
int mActivePointerId = INACTIVE_POINTER_ID;
TaskView mActiveTaskView = null;
- int mTotalScrollMotion;
int mMinimumVelocity;
int mMaximumVelocity;
// The scroll touch slop is used to calculate when we start scrolling
@@ -49,14 +52,14 @@
SwipeHelper mSwipeHelper;
boolean mInterceptedBySwipeHelper;
- public TaskStackViewTouchHandler(Context context, TaskStackView sv) {
+ public TaskStackViewTouchHandler(Context context, TaskStackView sv, TaskStackViewScroller scroller) {
ViewConfiguration configuration = ViewConfiguration.get(context);
mMinimumVelocity = configuration.getScaledMinimumFlingVelocity();
mMaximumVelocity = configuration.getScaledMaximumFlingVelocity();
mScrollTouchSlop = configuration.getScaledTouchSlop();
mPagingTouchSlop = configuration.getScaledPagingTouchSlop();
mSv = sv;
-
+ mScroller = scroller;
float densityScale = context.getResources().getDisplayMetrics().density;
mSwipeHelper = new SwipeHelper(SwipeHelper.X, this, densityScale, mPagingTouchSlop);
@@ -97,6 +100,13 @@
return null;
}
+ /** Constructs a simulated motion event for the current stack scroll. */
+ MotionEvent createMotionEventForStackScroll(MotionEvent ev) {
+ MotionEvent pev = MotionEvent.obtainNoHistory(ev);
+ pev.setLocation(0, mScroller.progressToScrollRange(mScroller.getStackScroll()));
+ return pev;
+ }
+
/** Touch preprocessing for handling below */
public boolean onInterceptTouchEvent(MotionEvent ev) {
// Return early if we have no children
@@ -111,24 +121,25 @@
return true;
}
- boolean wasScrolling = !mSv.mScroller.isFinished() ||
- (mSv.mScrollAnimator != null && mSv.mScrollAnimator.isRunning());
+ boolean wasScrolling = mScroller.isScrolling() ||
+ (mScroller.mScrollAnimator != null && mScroller.mScrollAnimator.isRunning());
int action = ev.getAction();
switch (action & MotionEvent.ACTION_MASK) {
case MotionEvent.ACTION_DOWN: {
// Save the touch down info
mInitialMotionX = mLastMotionX = (int) ev.getX();
mInitialMotionY = mLastMotionY = (int) ev.getY();
+ mInitialP = mLastP = mSv.mLayoutAlgorithm.screenYToCurveProgress(mLastMotionY);
mActivePointerId = ev.getPointerId(0);
mActiveTaskView = findViewAtPoint(mLastMotionX, mLastMotionY);
// Stop the current scroll if it is still flinging
- mSv.abortScroller();
- mSv.abortBoundScrollAnimation();
+ mScroller.stopScroller();
+ mScroller.stopBoundScrollAnimation();
// Initialize the velocity tracker
initOrResetVelocityTracker();
- mVelocityTracker.addMovement(ev);
+ mVelocityTracker.addMovement(createMotionEventForStackScroll(ev));
// Check if the scroller is finished yet
- mIsScrolling = !mSv.mScroller.isFinished();
+ mIsScrolling = mScroller.isScrolling();
break;
}
case MotionEvent.ACTION_MOVE: {
@@ -142,7 +153,7 @@
mIsScrolling = true;
// Initialize the velocity tracker if necessary
initVelocityTrackerIfNotExists();
- mVelocityTracker.addMovement(ev);
+ mVelocityTracker.addMovement(createMotionEventForStackScroll(ev));
// Disallow parents from intercepting touch events
final ViewParent parent = mSv.getParent();
if (parent != null) {
@@ -152,17 +163,18 @@
mLastMotionX = x;
mLastMotionY = y;
+ mLastP = mSv.mLayoutAlgorithm.screenYToCurveProgress(mLastMotionY);
break;
}
case MotionEvent.ACTION_CANCEL:
case MotionEvent.ACTION_UP: {
// Animate the scroll back if we've cancelled
- mSv.animateBoundScroll();
+ mScroller.animateBoundScroll();
// Reset the drag state and the velocity tracker
mIsScrolling = false;
mActivePointerId = INACTIVE_POINTER_ID;
mActiveTaskView = null;
- mTotalScrollMotion = 0;
+ mTotalPMotion = 0;
recycleVelocityTracker();
break;
}
@@ -186,7 +198,6 @@
// Update the velocity tracker
initVelocityTrackerIfNotExists();
- mVelocityTracker.addMovement(ev);
int action = ev.getAction();
switch (action & MotionEvent.ACTION_MASK) {
@@ -194,14 +205,15 @@
// Save the touch down info
mInitialMotionX = mLastMotionX = (int) ev.getX();
mInitialMotionY = mLastMotionY = (int) ev.getY();
+ mInitialP = mLastP = mSv.mLayoutAlgorithm.screenYToCurveProgress(mLastMotionY);
mActivePointerId = ev.getPointerId(0);
mActiveTaskView = findViewAtPoint(mLastMotionX, mLastMotionY);
// Stop the current scroll if it is still flinging
- mSv.abortScroller();
- mSv.abortBoundScrollAnimation();
+ mScroller.stopScroller();
+ mScroller.stopBoundScrollAnimation();
// Initialize the velocity tracker
initOrResetVelocityTracker();
- mVelocityTracker.addMovement(ev);
+ mVelocityTracker.addMovement(createMotionEventForStackScroll(ev));
// Disallow parents from intercepting touch events
final ViewParent parent = mSv.getParent();
if (parent != null) {
@@ -214,6 +226,7 @@
mActivePointerId = ev.getPointerId(index);
mLastMotionX = (int) ev.getX(index);
mLastMotionY = (int) ev.getY(index);
+ mLastP = mSv.mLayoutAlgorithm.screenYToCurveProgress(mLastMotionY);
break;
}
case MotionEvent.ACTION_MOVE: {
@@ -223,13 +236,14 @@
int x = (int) ev.getX(activePointerIndex);
int y = (int) ev.getY(activePointerIndex);
int yTotal = Math.abs(y - mInitialMotionY);
- int deltaY = mLastMotionY - y;
+ float curP = mSv.mLayoutAlgorithm.screenYToCurveProgress(y);
+ float deltaP = mLastP - curP;
if (!mIsScrolling) {
if (yTotal > mScrollTouchSlop) {
mIsScrolling = true;
// Initialize the velocity tracker
initOrResetVelocityTracker();
- mVelocityTracker.addMovement(ev);
+ mVelocityTracker.addMovement(createMotionEventForStackScroll(ev));
// Disallow parents from intercepting touch events
final ViewParent parent = mSv.getParent();
if (parent != null) {
@@ -238,23 +252,26 @@
}
}
if (mIsScrolling) {
- int curStackScroll = mSv.getStackScroll();
- int overScrollAmount = mSv.getScrollAmountOutOfBounds(curStackScroll + deltaY);
- if (overScrollAmount != 0) {
+ float curStackScroll = mScroller.getStackScroll();
+ float overScrollAmount = mScroller.getScrollAmountOutOfBounds(curStackScroll + deltaP);
+ if (Float.compare(overScrollAmount, 0f) != 0) {
// Bound the overscroll to a fixed amount, and inversely scale the y-movement
// relative to how close we are to the max overscroll
- float maxOverScroll = mSv.mStackAlgorithm.mTaskRect.height() / 3f;
- deltaY = Math.round(deltaY * (1f - (Math.min(maxOverScroll, overScrollAmount)
- / maxOverScroll)));
+ float maxOverScroll = 0.25f;
+ deltaP *= (1f - (Math.min(maxOverScroll, overScrollAmount)
+ / maxOverScroll));
}
- mSv.setStackScroll(curStackScroll + deltaY);
- if (mSv.isScrollOutOfBounds()) {
+ mScroller.setStackScroll(curStackScroll + deltaP);
+ if (mScroller.isScrollOutOfBounds()) {
mVelocityTracker.clear();
+ } else {
+ mVelocityTracker.addMovement(createMotionEventForStackScroll(ev));
}
}
mLastMotionX = x;
mLastMotionY = y;
- mTotalScrollMotion += Math.abs(deltaY);
+ mLastP = mSv.mLayoutAlgorithm.screenYToCurveProgress(mLastMotionY);
+ mTotalPMotion += Math.abs(deltaP);
break;
}
case MotionEvent.ACTION_UP: {
@@ -263,25 +280,27 @@
int velocity = (int) velocityTracker.getYVelocity(mActivePointerId);
if (mIsScrolling && (Math.abs(velocity) > mMinimumVelocity)) {
+ // XXX: Should this be calculated as a percentage of a curve?
int overscrollRange = (int) (Math.min(1f,
Math.abs((float) velocity / mMaximumVelocity)) *
Constants.Values.TaskStackView.TaskStackOverscrollRange);
// Fling scroll
- mSv.mScroller.fling(0, mSv.getStackScroll(),
- 0, -velocity,
+ mScroller.mScroller.fling(0, mScroller.progressToScrollRange(mScroller.getStackScroll()),
+ 0, velocity,
0, 0,
- mSv.mMinScroll, mSv.mMaxScroll,
+ mScroller.progressToScrollRange(mSv.mLayoutAlgorithm.mMinScrollP),
+ mScroller.progressToScrollRange(mSv.mLayoutAlgorithm.mMaxScrollP),
0, overscrollRange);
// Invalidate to kick off computeScroll
- mSv.invalidate(mSv.mStackAlgorithm.mStackRect);
- } else if (mSv.isScrollOutOfBounds()) {
+ mSv.invalidate();
+ } else if (mScroller.isScrollOutOfBounds()) {
// Animate the scroll back into bounds
- mSv.animateBoundScroll();
+ mScroller.animateBoundScroll();
}
mActivePointerId = INACTIVE_POINTER_ID;
mIsScrolling = false;
- mTotalScrollMotion = 0;
+ mTotalPMotion = 0;
recycleVelocityTracker();
break;
}
@@ -294,18 +313,19 @@
mActivePointerId = ev.getPointerId(newPointerIndex);
mLastMotionX = (int) ev.getX(newPointerIndex);
mLastMotionY = (int) ev.getY(newPointerIndex);
+ mLastP = mSv.mLayoutAlgorithm.screenYToCurveProgress(mLastMotionY);
mVelocityTracker.clear();
}
break;
}
case MotionEvent.ACTION_CANCEL: {
- if (mSv.isScrollOutOfBounds()) {
+ if (mScroller.isScrollOutOfBounds()) {
// Animate the scroll back into bounds
- mSv.animateBoundScroll();
+ mScroller.animateBoundScroll();
}
mActivePointerId = INACTIVE_POINTER_ID;
mIsScrolling = false;
- mTotalScrollMotion = 0;
+ mTotalPMotion = 0;
recycleVelocityTracker();
break;
}
diff --git a/packages/SystemUI/src/com/android/systemui/recents/views/TaskView.java b/packages/SystemUI/src/com/android/systemui/recents/views/TaskView.java
index 8a16d30..abf3c50 100644
--- a/packages/SystemUI/src/com/android/systemui/recents/views/TaskView.java
+++ b/packages/SystemUI/src/com/android/systemui/recents/views/TaskView.java
@@ -52,9 +52,11 @@
RecentsConfiguration mConfig;
+ float mTaskProgress;
+ ObjectAnimator mTaskProgressAnimator;
+ float mMaxDimScale;
int mDim;
- int mMaxDim;
- AccelerateInterpolator mDimInterpolator = new AccelerateInterpolator();
+ AccelerateInterpolator mDimInterpolator = new AccelerateInterpolator(1.25f);
PorterDuffColorFilter mDimColorFilter = new PorterDuffColorFilter(0, PorterDuff.Mode.MULTIPLY);
Task mTask;
@@ -76,7 +78,7 @@
new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator animation) {
- updateDimOverlayFromScale();
+ setTaskProgress((Float) animation.getAnimatedValue());
}
};
@@ -96,10 +98,11 @@
public TaskView(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
super(context, attrs, defStyleAttr, defStyleRes);
mConfig = RecentsConfiguration.getInstance();
- mMaxDim = mConfig.taskStackMaxDim;
+ mMaxDimScale = mConfig.taskStackMaxDim / 255f;
mClipViewInStack = true;
mViewBounds = new AnimateableViewBounds(this, mConfig.taskViewRoundedCornerRadiusPx);
setOutlineProvider(mViewBounds);
+ setTaskProgress(getTaskProgress());
setDim(getDim());
}
@@ -159,9 +162,6 @@
/** Synchronizes this view's properties with the task's transform */
void updateViewPropertiesToTaskTransform(TaskViewTransform toTransform, int duration) {
- // Update the bar view
- mBarView.updateViewPropertiesToTaskTransform(toTransform, duration);
-
// If we are a full screen view, then only update the Z to keep it in order
// XXX: Also update/animate the dim as well
if (mIsFullScreenView) {
@@ -173,8 +173,21 @@
}
// Apply the transform
- toTransform.applyToTaskView(this, duration, mConfig.fastOutSlowInInterpolator, false,
- mUpdateDimListener);
+ toTransform.applyToTaskView(this, duration, mConfig.fastOutSlowInInterpolator, false);
+
+ // Update the task progress
+ if (mTaskProgressAnimator != null) {
+ mTaskProgressAnimator.removeAllListeners();
+ mTaskProgressAnimator.cancel();
+ }
+ if (duration <= 0) {
+ setTaskProgress(toTransform.p);
+ } else {
+ mTaskProgressAnimator = ObjectAnimator.ofFloat(this, "taskProgress", toTransform.p);
+ mTaskProgressAnimator.setDuration(duration);
+ mTaskProgressAnimator.addUpdateListener(mUpdateDimListener);
+ mTaskProgressAnimator.start();
+ }
}
/** Resets this view's properties */
@@ -325,7 +338,7 @@
mThumbnailView.enableTaskBarClipAsRunnable(mBarView));
// Animate the dim into view as well
- ObjectAnimator anim = ObjectAnimator.ofInt(this, "dim", getDimOverlayFromScale());
+ ObjectAnimator anim = ObjectAnimator.ofInt(this, "dim", getDimFromTaskProgress());
anim.setStartDelay(mConfig.taskBarEnterAnimDelay);
anim.setDuration(mConfig.taskBarEnterAnimDuration);
anim.setInterpolator(mConfig.fastOutLinearInInterpolator);
@@ -556,6 +569,17 @@
}
}
+ /** Sets the current task progress. */
+ public void setTaskProgress(float p) {
+ mTaskProgress = p;
+ updateDimFromTaskProgress();
+ }
+
+ /** Returns the current task progress. */
+ public float getTaskProgress() {
+ return mTaskProgress;
+ }
+
/** Returns the current dim. */
public void setDim(int dim) {
mDim = dim;
@@ -571,17 +595,14 @@
}
/** Compute the dim as a function of the scale of this view. */
- int getDimOverlayFromScale() {
- float minScale = TaskStackViewLayoutAlgorithm.StackPeekMinScale;
- float scaleRange = 1f - minScale;
- float dim = (1f - getScaleX()) / scaleRange;
- dim = mDimInterpolator.getInterpolation(Math.min(dim, 1f));
- return Math.max(0, Math.min(mMaxDim, (int) (dim * 255)));
+ int getDimFromTaskProgress() {
+ float dim = mMaxDimScale * mDimInterpolator.getInterpolation(1f - mTaskProgress);
+ return (int) (dim * 255);
}
/** Update the dim as a function of the scale of this view. */
- void updateDimOverlayFromScale() {
- setDim(getDimOverlayFromScale());
+ void updateDimFromTaskProgress() {
+ setDim(getDimFromTaskProgress());
}
/**** View focus state ****/
@@ -650,9 +671,7 @@
}
mBarView.rebindToTask(mTask);
// Rebind any listeners
- if (Constants.DebugFlags.App.EnableTaskFiltering) {
- mBarView.mApplicationIcon.setOnClickListener(this);
- }
+ mBarView.mApplicationIcon.setOnClickListener(this);
mBarView.mDismissButton.setOnClickListener(this);
if (mFooterView != null) {
mFooterView.setOnClickListener(this);
@@ -675,9 +694,7 @@
mThumbnailView.unbindFromTask();
mBarView.unbindFromTask();
// Unbind any listeners
- if (Constants.DebugFlags.App.EnableTaskFiltering) {
- mBarView.mApplicationIcon.setOnClickListener(null);
- }
+ mBarView.mApplicationIcon.setOnClickListener(null);
mBarView.mDismissButton.setOnClickListener(null);
if (mFooterView != null) {
mFooterView.setOnClickListener(null);
@@ -717,7 +734,7 @@
postDelayed(new Runnable() {
@Override
public void run() {
- if (v == mBarView.mApplicationIcon) {
+ if (Constants.DebugFlags.App.EnableTaskFiltering && v == mBarView.mApplicationIcon) {
mCb.onTaskViewAppIconClicked(tv);
} else if (v == mBarView.mDismissButton) {
// Animate out the view and call the callback
@@ -729,7 +746,7 @@
});
// Hide the footer
tv.animateFooterVisibility(false, mConfig.taskViewRemoveAnimDuration);
- } else if (v == tv || (v == mFooterView || v == mActionButtonView)) {
+ } else {
mCb.onTaskViewClicked(tv, tv.getTask(),
(v == mFooterView || v == mActionButtonView));
}
diff --git a/packages/SystemUI/src/com/android/systemui/recents/views/TaskViewTransform.java b/packages/SystemUI/src/com/android/systemui/recents/views/TaskViewTransform.java
index aeb4fe4..ce2e80b 100644
--- a/packages/SystemUI/src/com/android/systemui/recents/views/TaskViewTransform.java
+++ b/packages/SystemUI/src/com/android/systemui/recents/views/TaskViewTransform.java
@@ -28,13 +28,12 @@
public class TaskViewTransform {
public int startDelay = 0;
public int translationY = 0;
- public int translationZ = 0;
+ public float translationZ = 0;
public float scale = 1f;
public float alpha = 1f;
- public float dismissAlpha = 1f;
public boolean visible = false;
public Rect rect = new Rect();
- float t = 0f;
+ float p = 0f;
public TaskViewTransform() {
// Do nothing
@@ -46,10 +45,9 @@
translationZ = o.translationZ;
scale = o.scale;
alpha = o.alpha;
- dismissAlpha = o.dismissAlpha;
visible = o.visible;
rect.set(o.rect);
- t = o.t;
+ p = o.p;
}
/** Resets the current transform */
@@ -59,19 +57,15 @@
translationZ = 0;
scale = 1f;
alpha = 1f;
- dismissAlpha = 1f;
visible = false;
rect.setEmpty();
- t = 0f;
+ p = 0f;
}
/** Convenience functions to compare against current property values */
public boolean hasAlphaChangedFrom(float v) {
return (Float.compare(alpha, v) != 0);
}
- public boolean hasDismissAlphaChangedFrom(float v) {
- return (Float.compare(dismissAlpha, v) != 0);
- }
public boolean hasScaleChangedFrom(float v) {
return (Float.compare(scale, v) != 0);
}
@@ -83,8 +77,7 @@
}
/** Applies this transform to a view. */
- public void applyToTaskView(View v, int duration, Interpolator interp, boolean allowLayers,
- ValueAnimator.AnimatorUpdateListener scaleUpdateListener) {
+ public void applyToTaskView(View v, int duration, Interpolator interp, boolean allowLayers) {
// Check to see if any properties have changed, and update the task view
if (duration > 0) {
ViewPropertyAnimator anim = v.animate();
@@ -100,8 +93,7 @@
}
if (hasScaleChangedFrom(v.getScaleX())) {
anim.scaleX(scale)
- .scaleY(scale)
- .setUpdateListener(scaleUpdateListener);
+ .scaleY(scale);
requiresLayers = true;
}
if (hasAlphaChangedFrom(v.getAlpha())) {
@@ -128,7 +120,6 @@
if (hasScaleChangedFrom(v.getScaleX())) {
v.setScaleX(scale);
v.setScaleY(scale);
- scaleUpdateListener.onAnimationUpdate(null);
}
if (hasAlphaChangedFrom(v.getAlpha())) {
v.setAlpha(alpha);
@@ -152,6 +143,6 @@
public String toString() {
return "TaskViewTransform delay: " + startDelay + " y: " + translationY + " z: " + translationZ +
" scale: " + scale + " alpha: " + alpha + " visible: " + visible + " rect: " + rect +
- " dismissAlpha: " + dismissAlpha;
+ " p: " + p;
}
}
diff --git a/packages/SystemUI/src/com/android/systemui/screenshot/GlobalScreenshot.java b/packages/SystemUI/src/com/android/systemui/screenshot/GlobalScreenshot.java
index 5771299..c559253 100644
--- a/packages/SystemUI/src/com/android/systemui/screenshot/GlobalScreenshot.java
+++ b/packages/SystemUI/src/com/android/systemui/screenshot/GlobalScreenshot.java
@@ -74,6 +74,8 @@
Runnable finisher;
int iconSize;
int result;
+ int previewWidth;
+ int previewheight;
void clearImage() {
image = null;
@@ -131,17 +133,19 @@
mImageWidth = data.image.getWidth();
mImageHeight = data.image.getHeight();
int iconSize = data.iconSize;
+ int previewWidth = data.previewWidth;
+ int previewHeight = data.previewheight;
final int shortSide = mImageWidth < mImageHeight ? mImageWidth : mImageHeight;
- Bitmap preview = Bitmap.createBitmap(shortSide, shortSide, data.image.getConfig());
+ Bitmap preview = Bitmap.createBitmap(previewWidth, previewHeight, data.image.getConfig());
Canvas c = new Canvas(preview);
Paint paint = new Paint();
ColorMatrix desat = new ColorMatrix();
desat.setSaturation(0.25f);
paint.setColorFilter(new ColorMatrixColorFilter(desat));
Matrix matrix = new Matrix();
- matrix.postTranslate((shortSide - mImageWidth) / 2,
- (shortSide - mImageHeight) / 2);
+ matrix.postTranslate((previewWidth - mImageWidth) / 2,
+ (previewHeight - mImageHeight) / 2);
c.drawBitmap(data.image, matrix, paint);
c.drawColor(0x40FFFFFF);
c.setBitmap(null);
@@ -343,6 +347,8 @@
private static final float SCREENSHOT_DROP_OUT_MIN_SCALE = SCREENSHOT_SCALE * 0.45f;
private static final float SCREENSHOT_FAST_DROP_OUT_MIN_SCALE = SCREENSHOT_SCALE * 0.6f;
private static final float SCREENSHOT_DROP_OUT_MIN_SCALE_OFFSET = 0f;
+ private final int mPreviewWidth;
+ private final int mPreviewHeight;
private Context mContext;
private WindowManager mWindowManager;
@@ -418,6 +424,16 @@
mBgPadding = (float) r.getDimensionPixelSize(R.dimen.global_screenshot_bg_padding);
mBgPaddingScale = mBgPadding / mDisplayMetrics.widthPixels;
+ // determine the optimal preview size
+ int panelWidth = 0;
+ try {
+ panelWidth = r.getDimensionPixelSize(R.dimen.notification_panel_width);
+ } catch (Resources.NotFoundException e) {
+ panelWidth = mDisplayMetrics.widthPixels;
+ }
+ mPreviewWidth = panelWidth;
+ mPreviewHeight = r.getDimensionPixelSize(R.dimen.notification_max_height);
+
// Setup the Camera shutter sound
mCameraSound = new MediaActionSound();
mCameraSound.load(MediaActionSound.SHUTTER_CLICK);
@@ -432,6 +448,8 @@
data.image = mScreenBitmap;
data.iconSize = mNotificationIconSize;
data.finisher = finisher;
+ data.previewWidth = mPreviewWidth;
+ data.previewheight = mPreviewHeight;
if (mSaveInBgTask != null) {
mSaveInBgTask.cancel(false);
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/ActivatableNotificationView.java b/packages/SystemUI/src/com/android/systemui/statusbar/ActivatableNotificationView.java
index 4d7698a..1cd18a0 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/ActivatableNotificationView.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/ActivatableNotificationView.java
@@ -43,7 +43,6 @@
import android.view.animation.PathInterpolator;
import com.android.systemui.R;
-import com.android.systemui.statusbar.stack.StackStateAnimator;
/**
* Base class for both {@link ExpandableNotificationRow} and {@link NotificationOverflowContainer}
@@ -449,19 +448,20 @@
}
@Override
- public void performRemoveAnimation(float translationDirection, Runnable onFinishedRunnable) {
+ public void performRemoveAnimation(long duration, float translationDirection,
+ Runnable onFinishedRunnable) {
enableAppearDrawing(true);
if (mDrawingAppearAnimation) {
startAppearAnimation(false /* isAppearing */, translationDirection,
- 0, onFinishedRunnable);
+ 0, duration, onFinishedRunnable);
}
}
@Override
- public void performAddAnimation(long delay) {
+ public void performAddAnimation(long delay, long duration) {
enableAppearDrawing(true);
if (mDrawingAppearAnimation) {
- startAppearAnimation(true /* isAppearing */, -1.0f, delay, null);
+ startAppearAnimation(true /* isAppearing */, -1.0f, delay, duration, null);
}
}
@@ -470,8 +470,8 @@
mScrimView.setAlpha(scrimAmount);
}
- private void startAppearAnimation(boolean isAppearing,
- float translationDirection, long delay, final Runnable onFinishedRunnable) {
+ private void startAppearAnimation(boolean isAppearing, float translationDirection, long delay,
+ long duration, final Runnable onFinishedRunnable) {
if (mAppearAnimator != null) {
mAppearAnimator.cancel();
}
@@ -501,8 +501,7 @@
targetValue);
mAppearAnimator.setInterpolator(mLinearInterpolator);
mAppearAnimator.setDuration(
- (long) (StackStateAnimator.ANIMATION_DURATION_APPEAR_DISAPPEAR
- * Math.abs(mAppearAnimationFraction - targetValue)));
+ (long) (duration * Math.abs(mAppearAnimationFraction - targetValue)));
mAppearAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator animation) {
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/BaseStatusBar.java b/packages/SystemUI/src/com/android/systemui/statusbar/BaseStatusBar.java
index 8eca0ae..617c445d 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/BaseStatusBar.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/BaseStatusBar.java
@@ -220,7 +220,7 @@
setZenMode(mode);
final boolean show = Settings.Global.getInt(mContext.getContentResolver(),
Settings.Global.LOCK_SCREEN_SHOW_NOTIFICATIONS, 1) != 0;
- setShowLockscreenNotifications(show);
+ mShowLockscreenNotifications = show;
}
};
@@ -1324,31 +1324,30 @@
return entry.notification;
}
- protected NotificationData.Entry createNotificationViews(StatusBarNotification notification) {
+ protected NotificationData.Entry createNotificationViews(StatusBarNotification sbn) {
if (DEBUG) {
- Log.d(TAG, "createNotificationViews(notification=" + notification);
+ Log.d(TAG, "createNotificationViews(notification=" + sbn);
}
// Construct the icon.
+ Notification n = sbn.getNotification();
final StatusBarIconView iconView = new StatusBarIconView(mContext,
- notification.getPackageName() + "/0x" + Integer.toHexString(notification.getId()),
- notification.getNotification());
+ sbn.getPackageName() + "/0x" + Integer.toHexString(sbn.getId()), n);
iconView.setScaleType(ImageView.ScaleType.CENTER_INSIDE);
- final StatusBarIcon ic = new StatusBarIcon(notification.getPackageName(),
- notification.getUser(),
- notification.getNotification().icon,
- notification.getNotification().iconLevel,
- notification.getNotification().number,
- notification.getNotification().tickerText);
+ final StatusBarIcon ic = new StatusBarIcon(sbn.getPackageName(),
+ sbn.getUser(),
+ n.icon,
+ n.iconLevel,
+ n.number,
+ n.tickerText);
if (!iconView.set(ic)) {
- handleNotificationError(notification, "Couldn't create icon: " + ic);
+ handleNotificationError(sbn, "Couldn't create icon: " + ic);
return null;
}
// Construct the expanded view.
- NotificationData.Entry entry = new NotificationData.Entry(notification, iconView);
+ NotificationData.Entry entry = new NotificationData.Entry(sbn, iconView);
if (!inflateViews(entry, mStackScroller)) {
- handleNotificationError(notification, "Couldn't expand RemoteViews for: "
- + notification);
+ handleNotificationError(sbn, "Couldn't expand RemoteViews for: " + sbn);
return null;
}
return entry;
@@ -1403,7 +1402,7 @@
entry.row.setVisibility(View.VISIBLE);
if (wasGone) {
// notify the scroller of a child addition
- mStackScroller.generateAddAnimation(entry.row);
+ mStackScroller.generateAddAnimation(entry.row, true /* fromMoreCard */);
}
visibleNotifications++;
}
@@ -1423,7 +1422,7 @@
}
private boolean shouldShowOnKeyguard(StatusBarNotification sbn) {
- return sbn.getNotification().priority >= Notification.PRIORITY_LOW;
+ return mShowLockscreenNotifications && !mNotificationData.isAmbient(sbn.getKey());
}
protected void setZenMode(int mode) {
@@ -1432,10 +1431,6 @@
updateNotifications();
}
- protected void setShowLockscreenNotifications(boolean show) {
- mShowLockscreenNotifications = show;
- }
-
protected abstract void haltTicker();
protected abstract void setAreThereNotifications();
protected abstract void updateNotifications();
@@ -1467,15 +1462,16 @@
// XXX: modify when we do something more intelligent with the two content views
final RemoteViews oldContentView = oldNotification.getNotification().contentView;
- final RemoteViews contentView = notification.getNotification().contentView;
+ Notification n = notification.getNotification();
+ final RemoteViews contentView = n.contentView;
final RemoteViews oldBigContentView = oldNotification.getNotification().bigContentView;
- final RemoteViews bigContentView = notification.getNotification().bigContentView;
+ final RemoteViews bigContentView = n.bigContentView;
final RemoteViews oldHeadsUpContentView = oldNotification.getNotification().headsUpContentView;
- final RemoteViews headsUpContentView = notification.getNotification().headsUpContentView;
+ final RemoteViews headsUpContentView = n.headsUpContentView;
final Notification oldPublicNotification = oldNotification.getNotification().publicVersion;
final RemoteViews oldPublicContentView = oldPublicNotification != null
? oldPublicNotification.contentView : null;
- final Notification publicNotification = notification.getNotification().publicVersion;
+ final Notification publicNotification = n.publicVersion;
final RemoteViews publicContentView = publicNotification != null
? publicNotification.contentView : null;
@@ -1487,7 +1483,7 @@
+ " bigContentView=" + oldBigContentView
+ " publicView=" + oldPublicContentView
+ " rowParent=" + oldEntry.row.getParent());
- Log.d(TAG, "new notification: when=" + notification.getNotification().when
+ Log.d(TAG, "new notification: when=" + n.when
+ " ongoing=" + oldNotification.isOngoing()
+ " contentView=" + contentView
+ " bigContentView=" + bigContentView
@@ -1524,8 +1520,8 @@
&& oldPublicContentView.getPackage() != null
&& oldPublicContentView.getPackage().equals(publicContentView.getPackage())
&& oldPublicContentView.getLayoutId() == publicContentView.getLayoutId());
- boolean updateTicker = notification.getNotification().tickerText != null
- && !TextUtils.equals(notification.getNotification().tickerText,
+ boolean updateTicker = n.tickerText != null
+ && !TextUtils.equals(n.tickerText,
oldEntry.notification.getNotification().tickerText);
final boolean shouldInterrupt = shouldInterrupt(notification);
@@ -1540,10 +1536,11 @@
// Update the icon
final StatusBarIcon ic = new StatusBarIcon(notification.getPackageName(),
notification.getUser(),
- notification.getNotification().icon,
- notification.getNotification().iconLevel,
- notification.getNotification().number,
- notification.getNotification().tickerText);
+ n.icon,
+ n.iconLevel,
+ n.number,
+ n.tickerText);
+ oldEntry.icon.setNotification(n);
if (!oldEntry.icon.set(ic)) {
handleNotificationError(notification, "Couldn't update icon: " + ic);
return;
@@ -1610,10 +1607,11 @@
oldEntry.notification = notification;
final StatusBarIcon ic = new StatusBarIcon(notification.getPackageName(),
notification.getUser(),
- notification.getNotification().icon,
- notification.getNotification().iconLevel,
- notification.getNotification().number,
- notification.getNotification().tickerText);
+ n.icon,
+ n.iconLevel,
+ n.number,
+ n.tickerText);
+ oldEntry.icon.setNotification(n);
oldEntry.icon.set(ic);
inflateViews(oldEntry, mStackScroller, wasHeadsUp);
mNotificationData.updateRanking(ranking);
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/CommandQueue.java b/packages/SystemUI/src/com/android/systemui/statusbar/CommandQueue.java
index a82c907..9107790 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/CommandQueue.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/CommandQueue.java
@@ -55,6 +55,8 @@
private static final int MSG_SHOW_RECENT_APPS = 14 << MSG_SHIFT;
private static final int MSG_HIDE_RECENT_APPS = 15 << MSG_SHIFT;
private static final int MSG_BUZZ_BEEP_BLINKED = 16 << MSG_SHIFT;
+ private static final int MSG_NOTIFICATION_LIGHT_OFF = 17 << MSG_SHIFT;
+ private static final int MSG_NOTIFICATION_LIGHT_PULSE = 18 << MSG_SHIFT;
public static final int FLAG_EXCLUDE_NONE = 0;
public static final int FLAG_EXCLUDE_SEARCH_PANEL = 1 << 0;
@@ -95,6 +97,8 @@
public void hideSearchPanel();
public void setWindowState(int window, int state);
public void buzzBeepBlinked();
+ public void notificationLightOff();
+ public void notificationLightPulse(int argb, int onMillis, int offMillis);
}
public CommandQueue(Callbacks callbacks, StatusBarIconList list) {
@@ -230,6 +234,19 @@
}
}
+ public void notificationLightOff() {
+ synchronized (mList) {
+ mHandler.sendEmptyMessage(MSG_NOTIFICATION_LIGHT_OFF);
+ }
+ }
+
+ public void notificationLightPulse(int argb, int onMillis, int offMillis) {
+ synchronized (mList) {
+ mHandler.obtainMessage(MSG_NOTIFICATION_LIGHT_PULSE, onMillis, offMillis, argb)
+ .sendToTarget();
+ }
+ }
+
private final class H extends Handler {
public void handleMessage(Message msg) {
final int what = msg.what & MSG_MASK;
@@ -306,7 +323,12 @@
case MSG_BUZZ_BEEP_BLINKED:
mCallbacks.buzzBeepBlinked();
break;
-
+ case MSG_NOTIFICATION_LIGHT_OFF:
+ mCallbacks.notificationLightOff();
+ break;
+ case MSG_NOTIFICATION_LIGHT_PULSE:
+ mCallbacks.notificationLightPulse((Integer) msg.obj, msg.arg1, msg.arg2);
+ break;
}
}
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/DismissView.java b/packages/SystemUI/src/com/android/systemui/statusbar/DismissView.java
index d60c17f..9712ee2 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/DismissView.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/DismissView.java
@@ -116,12 +116,15 @@
}
@Override
- public void performRemoveAnimation(float translationDirection, Runnable onFinishedRunnable) {
+ public void performRemoveAnimation(long duration, float translationDirection,
+ Runnable onFinishedRunnable) {
+ // TODO: Use duration
performVisibilityAnimation(false);
}
@Override
- public void performAddAnimation(long delay) {
+ public void performAddAnimation(long delay, long duration) {
+ // TODO: use delay and duration
performVisibilityAnimation(true);
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/DragDownHelper.java b/packages/SystemUI/src/com/android/systemui/statusbar/DragDownHelper.java
index e9989ab..df475d5 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/DragDownHelper.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/DragDownHelper.java
@@ -127,9 +127,7 @@
return true;
case MotionEvent.ACTION_UP:
if (mDraggedFarEnough && mDragDownCallback.onDraggedDown(mStartingChild)) {
- if (mStartingChild != null) {
- mCallback.setUserLockedChild(mStartingChild, false);
- } else {
+ if (mStartingChild == null) {
mDragDownCallback.setEmptyDragAmount(0f);
}
mDraggingDown = false;
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/ExpandableNotificationRow.java b/packages/SystemUI/src/com/android/systemui/statusbar/ExpandableNotificationRow.java
index 4b0af11..0960c00 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/ExpandableNotificationRow.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/ExpandableNotificationRow.java
@@ -37,6 +37,9 @@
private boolean mUserLocked;
/** Are we showing the "public" version */
private boolean mShowingPublic;
+ private boolean mSensitive;
+ private boolean mShowingPublicInitialized;
+ private boolean mShowingPublicForIntrinsicHeight;
/**
* Is this notification expanded by the system. The expansion state can be overridden by the
@@ -78,6 +81,8 @@
mHasUserChangedExpansion = false;
mUserLocked = false;
mShowingPublic = false;
+ mSensitive = false;
+ mShowingPublicInitialized = false;
mIsSystemExpanded = false;
mExpansionDisabled = false;
mPublicLayout.reset();
@@ -222,7 +227,7 @@
return mRowMinHeight;
}
- return mShowingPublic ? mRowMinHeight : getMaxExpandHeight();
+ return mShowingPublicForIntrinsicHeight ? mRowMinHeight : getMaxExpandHeight();
}
/**
@@ -248,17 +253,64 @@
}
}
- public void setShowingPublic(boolean show) {
- mShowingPublic = show;
+ public void setSensitive(boolean sensitive) {
+ mSensitive = sensitive;
+ }
+
+ public void setHideSensitiveForIntrinsicHeight(boolean hideSensitive) {
+ mShowingPublicForIntrinsicHeight = mSensitive && hideSensitive;
+ }
+
+ public void setHideSensitive(boolean hideSensitive, boolean animated, long delay,
+ long duration) {
+ boolean oldShowingPublic = mShowingPublic;
+ mShowingPublic = mSensitive && hideSensitive;
+ if (mShowingPublicInitialized && mShowingPublic == oldShowingPublic) {
+ return;
+ }
// bail out if no public version
if (mPublicLayout.getChildCount() == 0) return;
- // TODO: animation?
- mPublicLayout.setVisibility(show ? View.VISIBLE : View.GONE);
- mPrivateLayout.setVisibility(show ? View.GONE : View.VISIBLE);
+ if (!animated) {
+ mPublicLayout.animate().cancel();
+ mPrivateLayout.animate().cancel();
+ mPublicLayout.setAlpha(1f);
+ mPrivateLayout.setAlpha(1f);
+ mPublicLayout.setVisibility(mShowingPublic ? View.VISIBLE : View.INVISIBLE);
+ mPrivateLayout.setVisibility(mShowingPublic ? View.INVISIBLE : View.VISIBLE);
+ } else {
+ animateShowingPublic(delay, duration);
+ }
updateVetoButton();
+ mShowingPublicInitialized = true;
+ }
+
+ private void animateShowingPublic(long delay, long duration) {
+ final View source = mShowingPublic ? mPrivateLayout : mPublicLayout;
+ View target = mShowingPublic ? mPublicLayout : mPrivateLayout;
+ source.setVisibility(View.VISIBLE);
+ target.setVisibility(View.VISIBLE);
+ target.setAlpha(0f);
+ source.animate().cancel();
+ target.animate().cancel();
+ source.animate()
+ .alpha(0f)
+ .withLayer()
+ .setStartDelay(delay)
+ .setDuration(duration)
+ .withEndAction(new Runnable() {
+ @Override
+ public void run() {
+ source.setVisibility(View.INVISIBLE);
+ }
+ });
+ target.animate()
+ .alpha(1f)
+ .withLayer()
+ .setStartDelay(delay)
+ .setDuration(duration);
}
private void updateVetoButton() {
@@ -267,7 +319,7 @@
}
public int getMaxExpandHeight() {
- return mShowingPublic ? mRowMinHeight : mMaxExpandHeight;
+ return mShowingPublicForIntrinsicHeight ? mRowMinHeight : mMaxExpandHeight;
}
@Override
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/ExpandableView.java b/packages/SystemUI/src/com/android/systemui/statusbar/ExpandableView.java
index b71cd77..46d4a9a 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/ExpandableView.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/ExpandableView.java
@@ -176,6 +176,23 @@
}
/**
+ * See {@link #setHideSensitive}. This is a variant which notifies this view in advance about
+ * the upcoming state of hiding sensitive notifications. It gets called at the very beginning
+ * of a stack scroller update such that the updated intrinsic height (which is dependent on
+ * whether private or public layout is showing) gets taken into account into all layout
+ * calculations.
+ */
+ public void setHideSensitiveForIntrinsicHeight(boolean hideSensitive) {
+ }
+
+ /**
+ * Sets whether the notification should hide its private contents if it is sensitive.
+ */
+ public void setHideSensitive(boolean hideSensitive, boolean animated, long delay,
+ long duration) {
+ }
+
+ /**
* @return The desired notification height.
*/
public int getIntrinsicHeight() {
@@ -220,6 +237,7 @@
/**
* Perform a remove animation on this view.
*
+ * @param duration The duration of the remove animation.
* @param translationDirection The direction value from [-1 ... 1] indicating in which the
* animation should be performed. A value of -1 means that The
* remove animation should be performed upwards,
@@ -227,10 +245,10 @@
* Should mean the opposite.
* @param onFinishedRunnable A runnable which should be run when the animation is finished.
*/
- public abstract void performRemoveAnimation(float translationDirection,
+ public abstract void performRemoveAnimation(long duration, float translationDirection,
Runnable onFinishedRunnable);
- public abstract void performAddAnimation(long delay);
+ public abstract void performAddAnimation(long delay, long duration);
public abstract void setScrimAmount(float scrimAmount);
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/SignalClusterView.java b/packages/SystemUI/src/com/android/systemui/statusbar/SignalClusterView.java
index 8bae19a..fb13126 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/SignalClusterView.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/SignalClusterView.java
@@ -17,9 +17,6 @@
package com.android.systemui.statusbar;
import android.content.Context;
-import android.graphics.PorterDuff;
-import android.graphics.PorterDuffColorFilter;
-import android.os.Build;
import android.util.AttributeSet;
import android.util.Log;
import android.view.View;
@@ -36,16 +33,13 @@
extends LinearLayout
implements NetworkControllerImpl.SignalCluster {
- static final boolean DEBUG = false;
static final String TAG = "SignalClusterView";
- static final PorterDuffColorFilter PROBLEM_FILTER
- = new PorterDuffColorFilter(0xffab653b, PorterDuff.Mode.SRC_ATOP);
+ static final boolean DEBUG = Log.isLoggable(TAG, Log.DEBUG);
NetworkControllerImpl mNC;
private boolean mWifiVisible = false;
private int mWifiStrengthId = 0;
- private boolean mInetProblem;
private boolean mMobileVisible = false;
private int mMobileStrengthId = 0, mMobileTypeId = 0;
private boolean mIsAirplaneMode = false;
@@ -102,22 +96,19 @@
}
@Override
- public void setWifiIndicators(boolean visible, int strengthIcon, boolean problem,
- String contentDescription) {
+ public void setWifiIndicators(boolean visible, int strengthIcon, String contentDescription) {
mWifiVisible = visible;
mWifiStrengthId = strengthIcon;
- mInetProblem = problem;
mWifiDescription = contentDescription;
apply();
}
@Override
- public void setMobileDataIndicators(boolean visible, int strengthIcon, boolean problem,
- int typeIcon, String contentDescription, String typeContentDescription) {
+ public void setMobileDataIndicators(boolean visible, int strengthIcon, int typeIcon,
+ String contentDescription, String typeContentDescription) {
mMobileVisible = visible;
mMobileStrengthId = strengthIcon;
- mInetProblem = problem;
mMobileTypeId = typeIcon;
mMobileDescription = contentDescription;
mMobileTypeDescription = typeContentDescription;
@@ -172,17 +163,12 @@
return false;
}
- private void applyInetProblem(ImageView iv) {
- iv.setColorFilter(Build.IS_DEBUGGABLE && mInetProblem ? PROBLEM_FILTER : null);
- }
-
// Run after each indicator change.
private void apply() {
if (mWifiGroup == null) return;
if (mWifiVisible) {
mWifi.setImageResource(mWifiStrengthId);
- applyInetProblem(mWifi);
mWifiGroup.setContentDescription(mWifiDescription);
mWifiGroup.setVisibility(View.VISIBLE);
} else {
@@ -197,7 +183,6 @@
if (mMobileVisible && !mIsAirplaneMode) {
mMobile.setImageResource(mMobileStrengthId);
mMobileType.setImageResource(mMobileTypeId);
- applyInetProblem(mMobile);
mMobileGroup.setContentDescription(mMobileTypeDescription + " " + mMobileDescription);
mMobileGroup.setVisibility(View.VISIBLE);
} else {
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/SpeedBumpView.java b/packages/SystemUI/src/com/android/systemui/statusbar/SpeedBumpView.java
index dfeadc5..816612b 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/SpeedBumpView.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/SpeedBumpView.java
@@ -76,23 +76,25 @@
return true;
}
- public void performVisibilityAnimation(boolean nowVisible) {
- animateDivider(nowVisible, null /* onFinishedRunnable */);
+ public void performVisibilityAnimation(boolean nowVisible, long delay) {
+ animateDivider(nowVisible, delay, null /* onFinishedRunnable */);
}
/**
* Animate the divider to a new visibility.
*
* @param nowVisible should it now be visible
+ * @param delay the delay after the animation should start
* @param onFinishedRunnable A runnable which should be run when the animation is
* finished.
*/
- public void animateDivider(boolean nowVisible, Runnable onFinishedRunnable) {
+ public void animateDivider(boolean nowVisible, long delay, Runnable onFinishedRunnable) {
if (nowVisible != mIsVisible) {
// Animate dividers
float endValue = nowVisible ? 1.0f : 0.0f;
mLine.animate()
.alpha(endValue)
+ .setStartDelay(delay)
.scaleX(endValue)
.scaleY(endValue)
.setInterpolator(mFastOutSlowInInterpolator)
@@ -113,13 +115,16 @@
}
@Override
- public void performRemoveAnimation(float translationDirection, Runnable onFinishedRunnable) {
- performVisibilityAnimation(false);
+ public void performRemoveAnimation(long duration, float translationDirection,
+ Runnable onFinishedRunnable) {
+ // TODO: Use duration
+ performVisibilityAnimation(false, 0 /* delay */);
}
@Override
- public void performAddAnimation(long delay) {
- performVisibilityAnimation(true);
+ public void performAddAnimation(long delay, long duration) {
+ // TODO: Use duration
+ performVisibilityAnimation(true, delay);
}
@Override
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/StatusBarIconView.java b/packages/SystemUI/src/com/android/systemui/statusbar/StatusBarIconView.java
index 6f839bd..20dd3e7 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/StatusBarIconView.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/StatusBarIconView.java
@@ -57,8 +57,7 @@
mNumberPain.setTextAlign(Paint.Align.CENTER);
mNumberPain.setColor(res.getColor(R.drawable.notification_number_text_color));
mNumberPain.setAntiAlias(true);
- mNotification = notification;
- setContentDescription(notification);
+ setNotification(notification);
// We do not resize and scale system icons (on the right), only notification icons (on the
// left).
@@ -73,6 +72,11 @@
setScaleType(ImageView.ScaleType.CENTER);
}
+ public void setNotification(Notification notification) {
+ mNotification = notification;
+ setContentDescription(notification);
+ }
+
public StatusBarIconView(Context context, AttributeSet attrs) {
super(context, attrs);
final Resources res = context.getResources();
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardBouncer.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardBouncer.java
index e6ffde0..8996197 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardBouncer.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardBouncer.java
@@ -47,7 +47,6 @@
private StatusBarWindowManager mWindowManager;
private KeyguardViewBase mKeyguardView;
private ViewGroup mRoot;
- private Interpolator mFadeOutInterpolator = new LinearInterpolator();
private boolean mFadingOut;
public KeyguardBouncer(Context context, ViewMediatorCallback callback,
@@ -101,7 +100,7 @@
// Make it disappear faster, as the focus should be on the activity behind.
.setDuration(duration / 2)
- .setInterpolator(mFadeOutInterpolator)
+ .setInterpolator(PhoneStatusBar.ALPHA_OUT)
.setStartDelay(delay)
.withEndAction(new Runnable() {
@Override
@@ -109,7 +108,8 @@
mFadingOut = false;
hide(true /* destroyView */);
}
- });
+ })
+ .start();
} else {
hide(true /* destroyView */);
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardStatusBarView.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardStatusBarView.java
new file mode 100644
index 0000000..bf66c41
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardStatusBarView.java
@@ -0,0 +1,150 @@
+/*
+ * Copyright (C) 2014 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License
+ */
+
+package com.android.systemui.statusbar.phone;
+
+import android.content.Context;
+import android.graphics.drawable.Drawable;
+import android.util.AttributeSet;
+import android.view.View;
+import android.widget.ImageView;
+import android.widget.RelativeLayout;
+import android.widget.TextView;
+
+import com.android.systemui.R;
+import com.android.systemui.statusbar.policy.BatteryController;
+import com.android.systemui.statusbar.policy.KeyguardUserSwitcher;
+import com.android.systemui.statusbar.policy.UserInfoController;
+
+/**
+ * The header group on Keyguard.
+ */
+public class KeyguardStatusBarView extends RelativeLayout
+ implements BatteryController.BatteryStateChangeCallback {
+
+ private boolean mBatteryCharging;
+ private boolean mKeyguardUserSwitcherShowing;
+ private boolean mBatteryListening;
+
+ private View mSystemIconsSuperContainer;
+ private MultiUserSwitch mMultiUserSwitch;
+ private ImageView mMultiUserAvatar;
+ private TextView mBatteryLevel;
+
+ private BatteryController mBatteryController;
+ private KeyguardUserSwitcher mKeyguardUserSwitcher;
+
+ private int mSystemIconsSwitcherHiddenExpandedMargin;
+
+ public KeyguardStatusBarView(Context context, AttributeSet attrs) {
+ super(context, attrs);
+ }
+
+ @Override
+ protected void onFinishInflate() {
+ super.onFinishInflate();
+ mSystemIconsSuperContainer = findViewById(R.id.system_icons_super_container);
+ mMultiUserSwitch = (MultiUserSwitch) findViewById(R.id.multi_user_switch);
+ mMultiUserAvatar = (ImageView) findViewById(R.id.multi_user_avatar);
+ mBatteryLevel = (TextView) findViewById(R.id.battery_level);
+ loadDimens();
+ updateUserSwitcher();
+ }
+
+ private void loadDimens() {
+ mSystemIconsSwitcherHiddenExpandedMargin = getResources().getDimensionPixelSize(
+ R.dimen.system_icons_switcher_hidden_expanded_margin);
+ }
+
+ private void updateVisibilities() {
+ mMultiUserSwitch.setVisibility(!mKeyguardUserSwitcherShowing ? VISIBLE : GONE);
+ mBatteryLevel.setVisibility(mBatteryCharging ? View.VISIBLE : View.GONE);
+ }
+
+ private void updateSystemIconsLayoutParams() {
+ RelativeLayout.LayoutParams lp =
+ (LayoutParams) mSystemIconsSuperContainer.getLayoutParams();
+ int marginEnd = mKeyguardUserSwitcherShowing ? mSystemIconsSwitcherHiddenExpandedMargin : 0;
+ if (marginEnd != lp.getMarginEnd()) {
+ lp.setMarginEnd(marginEnd);
+ mSystemIconsSuperContainer.setLayoutParams(lp);
+ }
+ }
+
+ public void setListening(boolean listening) {
+ if (listening == mBatteryListening) {
+ return;
+ }
+ mBatteryListening = listening;
+ if (mBatteryListening) {
+ mBatteryController.addStateChangedCallback(this);
+ } else {
+ mBatteryController.removeStateChangedCallback(this);
+ }
+ }
+
+ private void updateUserSwitcher() {
+ boolean keyguardSwitcherAvailable = mKeyguardUserSwitcher != null;
+ mMultiUserSwitch.setClickable(keyguardSwitcherAvailable);
+ mMultiUserSwitch.setFocusable(keyguardSwitcherAvailable);
+ mMultiUserSwitch.setKeyguardMode(keyguardSwitcherAvailable);
+ }
+
+ public void setBatteryController(BatteryController batteryController) {
+ mBatteryController = batteryController;
+ }
+
+ public void setUserInfoController(UserInfoController userInfoController) {
+ userInfoController.addListener(new UserInfoController.OnUserInfoChangedListener() {
+ @Override
+ public void onUserInfoChanged(String name, Drawable picture) {
+ mMultiUserAvatar.setImageDrawable(picture);
+ }
+ });
+ }
+
+ @Override
+ public void onBatteryLevelChanged(int level, boolean pluggedIn, boolean charging) {
+ mBatteryLevel.setText(getResources().getString(R.string.battery_level_template, level));
+ boolean changed = mBatteryCharging != charging;
+ mBatteryCharging = charging;
+ if (changed) {
+ updateVisibilities();
+ }
+ }
+
+ @Override
+ public void onPowerSaveChanged() {
+ // could not care less
+ }
+
+ public void setKeyguardUserSwitcher(KeyguardUserSwitcher keyguardUserSwitcher) {
+ mKeyguardUserSwitcher = keyguardUserSwitcher;
+ mMultiUserSwitch.setKeyguardUserSwitcher(keyguardUserSwitcher);
+ updateUserSwitcher();
+ }
+
+ public void setKeyguardUserSwitcherShowing(boolean showing) {
+ mKeyguardUserSwitcherShowing = showing;
+ updateVisibilities();
+ updateSystemIconsLayoutParams();
+ }
+
+ @Override
+ public boolean hasOverlappingRendering() {
+ return false;
+ }
+}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelView.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelView.java
index cccfb7b..53c4740 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelView.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelView.java
@@ -19,6 +19,7 @@
import android.animation.Animator;
import android.animation.AnimatorListenerAdapter;
import android.animation.ObjectAnimator;
+import android.animation.PropertyValuesHolder;
import android.animation.ValueAnimator;
import android.content.Context;
import android.content.res.Configuration;
@@ -60,6 +61,7 @@
private KeyguardAffordanceHelper mAfforanceHelper;
private StatusBarHeaderView mHeader;
+ private KeyguardStatusBarView mKeyguardStatusBar;
private View mQsContainer;
private QSPanel mQsPanel;
private View mKeyguardStatusView;
@@ -91,6 +93,8 @@
private boolean mQsExpandedWhenExpandingStarted;
private boolean mQsFullyExpanded;
private boolean mKeyguardShowing;
+ private boolean mDozing;
+ private boolean mKeyguardStatusBarTransparent;
private int mStatusBarState;
private float mInitialHeightOnTouch;
private float mInitialTouchX;
@@ -114,6 +118,7 @@
private Interpolator mFastOutSlowInInterpolator;
private Interpolator mFastOutLinearInterpolator;
+ private Interpolator mLinearOutSlowInInterpolator;
private ObjectAnimator mClockAnimator;
private int mClockAnimationTarget = -1;
private int mTopPaddingAdjustment;
@@ -138,6 +143,9 @@
private boolean mIsLaunchTransitionRunning;
private Runnable mLaunchAnimationEndRunnable;
private boolean mOnlyAffordanceInThisMotion;
+ private boolean mKeyguardStatusViewAnimating;
+ private boolean mHeaderAnimatingIn;
+ private ObjectAnimator mQsContainerAnimator;
public NotificationPanelView(Context context, AttributeSet attrs) {
super(context, attrs);
@@ -153,6 +161,7 @@
super.onFinishInflate();
mHeader = (StatusBarHeaderView) findViewById(R.id.header);
mHeader.setOnClickListener(this);
+ mKeyguardStatusBar = (KeyguardStatusBarView) findViewById(R.id.keyguard_header);
mKeyguardStatusView = findViewById(R.id.keyguard_status_view);
mQsContainer = findViewById(R.id.quick_settings_container);
mQsPanel = (QSPanel) findViewById(R.id.quick_settings_panel);
@@ -169,6 +178,8 @@
android.R.interpolator.fast_out_slow_in);
mFastOutLinearInterpolator = AnimationUtils.loadInterpolator(getContext(),
android.R.interpolator.fast_out_linear_in);
+ mLinearOutSlowInInterpolator = AnimationUtils.loadInterpolator(getContext(),
+ android.R.interpolator.linear_out_slow_in);
mKeyguardBottomArea = (KeyguardBottomAreaView) findViewById(R.id.keyguard_bottom_area);
mAfforanceHelper = new KeyguardAffordanceHelper(this, getContext());
}
@@ -196,11 +207,10 @@
// Update Clock Pivot
mKeyguardStatusView.setPivotX(getWidth() / 2);
- mKeyguardStatusView.setPivotY(
- (FONT_HEIGHT - CAP_HEIGHT) / 2048f * mClockView.getTextSize());
+ mKeyguardStatusView.setPivotY((FONT_HEIGHT - CAP_HEIGHT) / 2048f * mClockView.getTextSize());
// Calculate quick setting heights.
- mQsMinExpansionHeight = mHeader.getCollapsedHeight() + mQsPeekHeight;
+ mQsMinExpansionHeight = mKeyguardShowing ? 0 : mHeader.getCollapsedHeight() + mQsPeekHeight;
mQsMaxExpansionHeight = mHeader.getExpandedHeight() + mQsContainer.getHeight();
if (mQsExpanded) {
if (mQsFullyExpanded) {
@@ -223,10 +233,11 @@
private void positionClockAndNotifications() {
boolean animate = mNotificationStackScroller.isAddOrRemoveAnimationPending();
int stackScrollerPadding;
- if (mStatusBar.getBarState() != StatusBarState.KEYGUARD) {
+ if (mStatusBarState != StatusBarState.KEYGUARD) {
int bottom = mHeader.getCollapsedHeight();
- stackScrollerPadding = bottom + mQsPeekHeight
- + mNotificationTopPadding;
+ stackScrollerPadding = mStatusBarState == StatusBarState.SHADE
+ ? bottom + mQsPeekHeight + mNotificationTopPadding
+ : mKeyguardStatusBar.getHeight() + mNotificationTopPadding;
mTopPaddingAdjustment = 0;
} else {
mClockPositionAlgorithm.setup(
@@ -282,14 +293,16 @@
}
private void updateClock(float alpha, float scale) {
- mKeyguardStatusView.setAlpha(alpha);
+ if (!mKeyguardStatusViewAnimating) {
+ mKeyguardStatusView.setAlpha(alpha);
+ }
mKeyguardStatusView.setScaleX(scale);
mKeyguardStatusView.setScaleY(scale);
}
- public void animateToFullShade() {
+ public void animateToFullShade(long delay) {
mAnimateNextTopPaddingChange = true;
- mNotificationStackScroller.goToFullShade();
+ mNotificationStackScroller.goToFullShade(delay);
requestLayout();
}
@@ -668,23 +681,200 @@
}
}
- public void setBarState(int statusBarState) {
+ public void setBarState(int statusBarState, boolean keyguardFadingAway,
+ boolean goingToFullShade) {
boolean keyguardShowing = statusBarState == StatusBarState.KEYGUARD
|| statusBarState == StatusBarState.SHADE_LOCKED;
if (!mKeyguardShowing && keyguardShowing) {
setQsTranslation(mQsExpansionHeight);
mHeader.setTranslationY(0f);
}
+ setKeyguardStatusViewVisibility(statusBarState, keyguardFadingAway, goingToFullShade);
+ setKeyguardBottomAreaVisibility(statusBarState, goingToFullShade);
+ if (goingToFullShade) {
+ animateKeyguardStatusBarOut();
+ } else {
+ mKeyguardStatusBar.setAlpha(1f);
+ mKeyguardStatusBar.setVisibility(keyguardShowing ? View.VISIBLE : View.INVISIBLE);
+ }
mStatusBarState = statusBarState;
mKeyguardShowing = keyguardShowing;
updateQsState();
+ if (goingToFullShade) {
+ animateHeaderSlidingIn();
+ }
+ }
+
+ private final Runnable mAnimateKeyguardStatusViewInvisibleEndRunnable = new Runnable() {
+ @Override
+ public void run() {
+ mKeyguardStatusViewAnimating = false;
+ mKeyguardStatusView.setVisibility(View.GONE);
+ }
+ };
+
+ private final Runnable mAnimateKeyguardStatusViewVisibleEndRunnable = new Runnable() {
+ @Override
+ public void run() {
+ mKeyguardStatusViewAnimating = false;
+ }
+ };
+
+ private final Animator.AnimatorListener mAnimateHeaderSlidingInListener
+ = new AnimatorListenerAdapter() {
+ @Override
+ public void onAnimationEnd(Animator animation) {
+ mHeaderAnimatingIn = false;
+ mQsContainerAnimator = null;
+ mQsContainer.removeOnLayoutChangeListener(mQsContainerAnimatorUpdater);
+ }
+ };
+
+ private final OnLayoutChangeListener mQsContainerAnimatorUpdater
+ = new OnLayoutChangeListener() {
+ @Override
+ public void onLayoutChange(View v, int left, int top, int right, int bottom, int oldLeft,
+ int oldTop, int oldRight, int oldBottom) {
+ int oldHeight = oldBottom - oldTop;
+ int height = bottom - top;
+ if (height != oldHeight && mQsContainerAnimator != null) {
+ PropertyValuesHolder[] values = mQsContainerAnimator.getValues();
+ float newEndValue = mHeader.getCollapsedHeight() + mQsPeekHeight - height - top;
+ float newStartValue = -height - top;
+ values[0].setFloatValues(newStartValue, newEndValue);
+ mQsContainerAnimator.setCurrentPlayTime(mQsContainerAnimator.getCurrentPlayTime());
+ }
+ }
+ };
+
+ private final ViewTreeObserver.OnPreDrawListener mStartHeaderSlidingIn
+ = new ViewTreeObserver.OnPreDrawListener() {
+ @Override
+ public boolean onPreDraw() {
+ getViewTreeObserver().removeOnPreDrawListener(this);
+ mHeader.setTranslationY(-mHeader.getCollapsedHeight() - mQsPeekHeight);
+ mHeader.animate()
+ .translationY(0f)
+ .setStartDelay(mStatusBar.calculateGoingToFullShadeDelay())
+ .setDuration(StackStateAnimator.ANIMATION_DURATION_GO_TO_FULL_SHADE)
+ .setInterpolator(mFastOutSlowInInterpolator)
+ .start();
+ mQsContainer.setY(-mQsContainer.getHeight());
+ mQsContainerAnimator = ObjectAnimator.ofFloat(mQsContainer, View.TRANSLATION_Y,
+ mQsContainer.getTranslationY(),
+ mHeader.getCollapsedHeight() + mQsPeekHeight - mQsContainer.getHeight()
+ - mQsContainer.getTop());
+ mQsContainerAnimator.setStartDelay(mStatusBar.calculateGoingToFullShadeDelay());
+ mQsContainerAnimator.setDuration(StackStateAnimator.ANIMATION_DURATION_GO_TO_FULL_SHADE);
+ mQsContainerAnimator.setInterpolator(mFastOutSlowInInterpolator);
+ mQsContainerAnimator.addListener(mAnimateHeaderSlidingInListener);
+ mQsContainerAnimator.start();
+ mQsContainer.addOnLayoutChangeListener(mQsContainerAnimatorUpdater);
+ return true;
+ }
+ };
+
+ private void animateHeaderSlidingIn() {
+ mHeaderAnimatingIn = true;
+ getViewTreeObserver().addOnPreDrawListener(mStartHeaderSlidingIn);
+
+ }
+
+ private final Runnable mAnimateKeyguardStatusBarInvisibleEndRunnable = new Runnable() {
+ @Override
+ public void run() {
+ mKeyguardStatusBar.setVisibility(View.INVISIBLE);
+ }
+ };
+
+ private void animateKeyguardStatusBarOut() {
+ mKeyguardStatusBar.animate()
+ .alpha(0f)
+ .setStartDelay(mStatusBar.getKeyguardFadingAwayDelay())
+ .setDuration(mStatusBar.getKeyguardFadingAwayDuration()/2)
+ .setInterpolator(PhoneStatusBar.ALPHA_OUT)
+ .withEndAction(mAnimateKeyguardStatusBarInvisibleEndRunnable)
+ .start();
+ }
+
+ private final Runnable mAnimateKeyguardBottomAreaInvisibleEndRunnable = new Runnable() {
+ @Override
+ public void run() {
+ mKeyguardBottomArea.setVisibility(View.GONE);
+ }
+ };
+
+ private void setKeyguardBottomAreaVisibility(int statusBarState,
+ boolean goingToFullShade) {
+ if (goingToFullShade) {
+ mKeyguardBottomArea.animate().cancel();
+ mKeyguardBottomArea.animate()
+ .alpha(0f)
+ .setStartDelay(mStatusBar.getKeyguardFadingAwayDelay())
+ .setDuration(mStatusBar.getKeyguardFadingAwayDuration()/2)
+ .setInterpolator(PhoneStatusBar.ALPHA_OUT)
+ .withEndAction(mAnimateKeyguardBottomAreaInvisibleEndRunnable)
+ .start();
+ } else if (statusBarState == StatusBarState.KEYGUARD
+ || statusBarState == StatusBarState.SHADE_LOCKED) {
+ mKeyguardBottomArea.animate().cancel();
+ mKeyguardBottomArea.setVisibility(View.VISIBLE);
+ mKeyguardBottomArea.setAlpha(1f);
+ } else {
+ mKeyguardBottomArea.animate().cancel();
+ mKeyguardBottomArea.setVisibility(View.GONE);
+ mKeyguardBottomArea.setAlpha(1f);
+ }
+ }
+
+ private void setKeyguardStatusViewVisibility(int statusBarState, boolean keyguardFadingAway,
+ boolean goingToFullShade) {
+ if ((!keyguardFadingAway && mStatusBarState == StatusBarState.KEYGUARD
+ && statusBarState != StatusBarState.KEYGUARD) || goingToFullShade) {
+ mKeyguardStatusView.animate().cancel();
+ mKeyguardStatusViewAnimating = true;
+ mKeyguardStatusView.animate()
+ .alpha(0f)
+ .setStartDelay(0)
+ .setDuration(160)
+ .setInterpolator(PhoneStatusBar.ALPHA_OUT)
+ .withEndAction(mAnimateKeyguardStatusViewInvisibleEndRunnable);
+ if (keyguardFadingAway) {
+ mKeyguardStatusView.animate()
+ .setStartDelay(mStatusBar.getKeyguardFadingAwayDelay())
+ .setDuration(mStatusBar.getKeyguardFadingAwayDuration()/2)
+ .start();
+ }
+ } else if (mStatusBarState == StatusBarState.SHADE_LOCKED
+ && statusBarState == StatusBarState.KEYGUARD) {
+ mKeyguardStatusView.animate().cancel();
+ mKeyguardStatusView.setVisibility(View.VISIBLE);
+ mKeyguardStatusViewAnimating = true;
+ mKeyguardStatusView.setAlpha(0f);
+ mKeyguardStatusView.animate()
+ .alpha(1f)
+ .setStartDelay(0)
+ .setDuration(320)
+ .setInterpolator(PhoneStatusBar.ALPHA_IN)
+ .withEndAction(mAnimateKeyguardStatusViewVisibleEndRunnable);
+ } else if (statusBarState == StatusBarState.KEYGUARD) {
+ mKeyguardStatusView.animate().cancel();
+ mKeyguardStatusView.setVisibility(View.VISIBLE);
+ mKeyguardStatusView.setAlpha(1f);
+ } else {
+ mKeyguardStatusView.animate().cancel();
+ mKeyguardStatusView.setVisibility(View.GONE);
+ mKeyguardStatusView.setAlpha(1f);
+ }
}
private void updateQsState() {
boolean expandVisually = mQsExpanded || mStackScrollerOverscrolling;
- mHeader.setExpanded(expandVisually, mStackScrollerOverscrolling);
- mNotificationStackScroller.setScrollingEnabled(mStatusBarState != StatusBarState.KEYGUARD
- && (!mQsExpanded || mQsExpansionFromOverscroll));
+ mHeader.setVisibility((mQsExpanded || !mKeyguardShowing) ? View.VISIBLE : View.INVISIBLE);
+ mHeader.setExpanded(mKeyguardShowing || (mQsExpanded && !mStackScrollerOverscrolling));
+ mNotificationStackScroller.setScrollingEnabled(
+ mStatusBarState != StatusBarState.KEYGUARD && (!mQsExpanded
+ || mQsExpansionFromOverscroll));
mQsPanel.setVisibility(expandVisually ? View.VISIBLE : View.INVISIBLE);
mQsContainer.setVisibility(
mKeyguardShowing && !expandVisually ? View.INVISIBLE : View.VISIBLE);
@@ -700,10 +890,21 @@
setQsExpanded(false);
}
mQsExpansionHeight = height;
- mHeader.setExpansion(getQsExpansionFraction());
+ mHeader.setExpansion(getHeaderExpansionFraction());
setQsTranslation(height);
requestScrollerTopPaddingUpdate(false /* animate */);
updateNotificationScrim(height);
+ if (mKeyguardShowing) {
+ float alpha = getQsExpansionFraction();
+ alpha *= 2;
+ alpha = Math.min(1, alpha);
+ alpha = 1 - alpha;
+ mKeyguardStatusBarTransparent = alpha == 0f;
+ updateKeyguardStatusBarVisibility();
+ if (!mKeyguardStatusBarTransparent) {
+ mKeyguardStatusBar.setAlpha(alpha);
+ }
+ }
}
private void updateNotificationScrim(float height) {
@@ -713,12 +914,35 @@
mNotificationStackScroller.setScrimAlpha(progress);
}
+ private float getHeaderExpansionFraction() {
+ if (!mKeyguardShowing) {
+ return getQsExpansionFraction();
+ } else {
+ return 1f;
+ }
+ }
+
private void setQsTranslation(float height) {
- mQsContainer.setY(height - mQsContainer.getHeight() + getHeaderTranslation());
+ if (!mHeaderAnimatingIn) {
+ mQsContainer.setY(height - mQsContainer.getHeight() + getHeaderTranslation());
+ }
+ if (mKeyguardShowing) {
+ mHeader.setY(interpolate(getQsExpansionFraction(), -mHeader.getHeight(), 0));
+ }
+ }
+
+ private float calculateQsTopPadding() {
+ if (mKeyguardShowing) {
+ return interpolate(getQsExpansionFraction(),
+ mNotificationStackScroller.getIntrinsicPadding() - mNotificationTopPadding,
+ mQsMaxExpansionHeight);
+ } else {
+ return mQsExpansionHeight;
+ }
}
private void requestScrollerTopPaddingUpdate(boolean animate) {
- mNotificationStackScroller.updateTopPadding(mQsExpansionHeight,
+ mNotificationStackScroller.updateTopPadding(calculateQsTopPadding(),
mScrollView.getScrollY(),
mAnimateNextTopPaddingChange || animate);
mAnimateNextTopPaddingChange = false;
@@ -794,8 +1018,9 @@
if (!mQsExpansionEnabled) {
return false;
}
- boolean onHeader = x >= mHeader.getLeft() && x <= mHeader.getRight()
- && y >= mHeader.getTop() && y <= mHeader.getBottom();
+ View header = mKeyguardShowing ? mKeyguardStatusBar : mHeader;
+ boolean onHeader = x >= header.getLeft() && x <= header.getRight()
+ && y >= header.getTop() && y <= header.getBottom();
if (mQsExpanded) {
return onHeader || (mScrollView.isScrolledToBottom() && yDiff < 0);
} else {
@@ -862,12 +1087,9 @@
}
int maxHeight;
if (mTwoFingerQsExpand || mQsExpanded || mIsExpanding && mQsExpandedWhenExpandingStarted) {
- maxHeight = (int) calculatePanelHeightQsExpanded();
+ maxHeight = Math.max(calculatePanelHeightQsExpanded(), calculatePanelHeightShade());
} else {
- int emptyBottomMargin = mNotificationStackScroller.getEmptyBottomMargin();
- maxHeight = mNotificationStackScroller.getHeight() - emptyBottomMargin
- - mTopPaddingAdjustment;
- maxHeight += mNotificationStackScroller.getTopPaddingOverflow();
+ maxHeight = calculatePanelHeightShade();
}
maxHeight = Math.max(maxHeight, min);
return maxHeight;
@@ -912,7 +1134,15 @@
return qsTempMaxExpansion;
}
- private float calculatePanelHeightQsExpanded() {
+ private int calculatePanelHeightShade() {
+ int emptyBottomMargin = mNotificationStackScroller.getEmptyBottomMargin();
+ int maxHeight = mNotificationStackScroller.getHeight() - emptyBottomMargin
+ - mTopPaddingAdjustment;
+ maxHeight += mNotificationStackScroller.getTopPaddingOverflow();
+ return maxHeight;
+ }
+
+ private int calculatePanelHeightQsExpanded() {
float notificationHeight = mNotificationStackScroller.getHeight()
- mNotificationStackScroller.getEmptyBottomMargin()
- mNotificationStackScroller.getTopPadding();
@@ -925,7 +1155,7 @@
- getScrollViewScrollY();
totalHeight = Math.max(fullyCollapsedHeight, mNotificationStackScroller.getHeight());
}
- return totalHeight;
+ return (int) totalHeight;
}
private int getScrollViewScrollY() {
@@ -993,8 +1223,9 @@
}
private void updateHeaderShade() {
- mHeader.setAlpha(1f);
- mHeader.setTranslationY(getHeaderTranslation());
+ if (!mHeaderAnimatingIn) {
+ mHeader.setTranslationY(getHeaderTranslation());
+ }
setQsTranslation(mQsExpansionHeight);
}
@@ -1014,7 +1245,6 @@
}
private void updateHeaderKeyguard() {
- mHeader.setTranslationY(0f);
float alpha;
if (mStatusBar.getBarState() == StatusBarState.KEYGUARD) {
@@ -1032,7 +1262,9 @@
}
alpha = Math.max(0, Math.min(alpha, 1));
alpha = (float) Math.pow(alpha, 0.75);
- mHeader.setAlpha(alpha);
+ if (!mQsExpanded) {
+ mKeyguardStatusBar.setAlpha(alpha);
+ }
mKeyguardBottomArea.setAlpha(alpha);
setQsTranslation(mQsExpansionHeight);
}
@@ -1062,21 +1294,24 @@
mIsExpanding = false;
mScrollYOverride = -1;
if (mExpandedHeight == 0f) {
- mHeader.setListening(false);
- mQsPanel.setListening(false);
+ setListening(false);
} else {
- mHeader.setListening(true);
- mQsPanel.setListening(true);
+ setListening(true);
}
mTwoFingerQsExpand = false;
mTwoFingerQsExpandPossible = false;
}
+ private void setListening(boolean listening) {
+ mHeader.setListening(listening);
+ mKeyguardStatusBar.setListening(listening);
+ mQsPanel.setListening(listening);
+ }
+
@Override
public void instantExpand() {
super.instantExpand();
- mHeader.setListening(true);
- mQsPanel.setListening(true);
+ setListening(true);
}
@Override
@@ -1325,6 +1560,14 @@
return mQsExpanded;
}
+ public boolean isQsDetailShowing() {
+ return mQsPanel.isShowingDetail();
+ }
+
+ public void closeQsDetail() {
+ mQsPanel.closeDetail();
+ }
+
@Override
public boolean shouldDelayChildPressedState() {
return true;
@@ -1352,4 +1595,24 @@
mEmptyDragAmount = amount * factor;
positionClockAndNotifications();
}
+
+ private static float interpolate(float t, float start, float end) {
+ return (1 - t) * start + t * end;
+ }
+
+ private void updateKeyguardStatusBarVisibility() {
+ mKeyguardStatusBar.setVisibility(mKeyguardShowing && !mKeyguardStatusBarTransparent
+ && !mDozing ? VISIBLE : INVISIBLE);
+ }
+
+ public void setDozing(boolean dozing) {
+ if (dozing == mDozing) return;
+ mDozing = dozing;
+ if (mDozing) {
+ setBackgroundColor(0xff000000);
+ } else {
+ setBackground(null);
+ }
+ updateKeyguardStatusBarVisibility();
+ }
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java
index 20a4092..99b0259 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java
@@ -22,7 +22,6 @@
import static android.app.StatusBarManager.WINDOW_STATE_HIDDEN;
import static android.app.StatusBarManager.WINDOW_STATE_SHOWING;
import static android.app.StatusBarManager.windowStateToString;
-import static com.android.keyguard.KeyguardHostView.OnDismissAction;
import static com.android.systemui.statusbar.phone.BarTransitions.MODE_LIGHTS_OUT;
import static com.android.systemui.statusbar.phone.BarTransitions.MODE_OPAQUE;
import static com.android.systemui.statusbar.phone.BarTransitions.MODE_SEMI_TRANSPARENT;
@@ -106,6 +105,7 @@
import android.widget.TextView;
import com.android.internal.statusbar.StatusBarIcon;
+import com.android.keyguard.KeyguardHostView.OnDismissAction;
import com.android.keyguard.ViewMediatorCallback;
import com.android.systemui.DemoMode;
import com.android.systemui.EventLogTags;
@@ -129,20 +129,21 @@
import com.android.systemui.statusbar.SpeedBumpView;
import com.android.systemui.statusbar.StatusBarIconView;
import com.android.systemui.statusbar.StatusBarState;
-import com.android.systemui.statusbar.policy.NextAlarmController;
import com.android.systemui.statusbar.policy.BatteryController;
import com.android.systemui.statusbar.policy.BatteryController.BatteryStateChangeCallback;
import com.android.systemui.statusbar.policy.BluetoothControllerImpl;
import com.android.systemui.statusbar.policy.CastControllerImpl;
import com.android.systemui.statusbar.policy.FlashlightController;
import com.android.systemui.statusbar.policy.HeadsUpNotificationView;
+import com.android.systemui.statusbar.policy.HotspotControllerImpl;
import com.android.systemui.statusbar.policy.KeyguardMonitor;
import com.android.systemui.statusbar.policy.KeyguardUserSwitcher;
-import com.android.systemui.statusbar.policy.HotspotControllerImpl;
-import com.android.systemui.statusbar.policy.UserInfoController;
import com.android.systemui.statusbar.policy.LocationControllerImpl;
import com.android.systemui.statusbar.policy.NetworkControllerImpl;
+import com.android.systemui.statusbar.policy.NextAlarmController;
import com.android.systemui.statusbar.policy.RotationLockControllerImpl;
+import com.android.systemui.statusbar.policy.SecurityControllerImpl;
+import com.android.systemui.statusbar.policy.UserInfoController;
import com.android.systemui.statusbar.policy.UserSwitcherController;
import com.android.systemui.statusbar.policy.ZenModeController;
import com.android.systemui.statusbar.stack.NotificationStackScrollLayout;
@@ -212,6 +213,7 @@
// These are no longer handled by the policy, because we need custom strategies for them
BluetoothControllerImpl mBluetoothController;
+ SecurityControllerImpl mSecurityController;
BatteryController mBatteryController;
LocationControllerImpl mLocationController;
NetworkControllerImpl mNetworkController;
@@ -252,6 +254,8 @@
// left-hand icons
LinearLayout mStatusIcons;
+ LinearLayout mStatusIconsKeyguard;
+
// the icons themselves
IconMerger mNotificationIcons;
View mNotificationIconArea;
@@ -273,6 +277,7 @@
// top bar
StatusBarHeaderView mHeader;
+ KeyguardStatusBarView mKeyguardStatusBar;
View mKeyguardStatusView;
KeyguardBottomAreaView mKeyguardBottomArea;
boolean mLeaveOpenOnKeyguardHide;
@@ -406,8 +411,8 @@
private Interpolator mLinearOutSlowIn;
private Interpolator mLinearInterpolator = new LinearInterpolator();
private Interpolator mBackdropInterpolator = new AccelerateDecelerateInterpolator();
- private Interpolator mAlphaIn = new PathInterpolator(0f, 0.2f, 1f, 1f);
- private Interpolator mAlphaOut = new PathInterpolator(0f, 0f, 0.8f, 1f);
+ public static final Interpolator ALPHA_IN = new PathInterpolator(0.4f, 0f, 1f, 1f);
+ public static final Interpolator ALPHA_OUT = new PathInterpolator(0f, 0f, 0.8f, 1f);
private FrameLayout mBackdrop;
private ImageView mBackdropFront, mBackdropBack;
@@ -452,6 +457,7 @@
private int mDrawCount;
private Runnable mLaunchTransitionEndRunnable;
private boolean mLaunchTransitionFadingAway;
+ private ExpandableNotificationRow mDraggedDownRow;
private static final int VISIBLE_LOCATIONS = ViewState.LOCATION_FIRST_CARD
| ViewState.LOCATION_TOP_STACK_PEEKING
@@ -534,12 +540,6 @@
};
@Override
- protected void setShowLockscreenNotifications(boolean show) {
- super.setShowLockscreenNotifications(show);
- updateStackScrollerState();
- }
-
- @Override
public void start() {
mDisplay = ((WindowManager)mContext.getSystemService(Context.WINDOW_SERVICE))
.getDefaultDisplay();
@@ -695,6 +695,8 @@
mHeader = (StatusBarHeaderView) mStatusBarWindow.findViewById(R.id.header);
mHeader.setActivityStarter(this);
+ mKeyguardStatusBar = (KeyguardStatusBarView) mStatusBarWindow.findViewById(R.id.keyguard_header);
+ mStatusIconsKeyguard = (LinearLayout) mKeyguardStatusBar.findViewById(R.id.statusIcons);
mKeyguardStatusView = mStatusBarWindow.findViewById(R.id.keyguard_status_view);
mKeyguardBottomArea =
(KeyguardBottomAreaView) mStatusBarWindow.findViewById(R.id.keyguard_bottom_area);
@@ -736,6 +738,7 @@
mNetworkController = new NetworkControllerImpl(mContext);
mHotspotController = new HotspotControllerImpl(mContext);
mBluetoothController = new BluetoothControllerImpl(mContext);
+ mSecurityController = new SecurityControllerImpl(mContext);
if (mContext.getResources().getBoolean(R.bool.config_showRotationLock)) {
mRotationLockController = new RotationLockControllerImpl(mContext);
}
@@ -744,10 +747,13 @@
mZenModeController = mVolumeComponent.getZenController();
mCastController = new CastControllerImpl(mContext);
final SignalClusterView signalCluster =
- (SignalClusterView)mStatusBarView.findViewById(R.id.signal_cluster);
-
+ (SignalClusterView) mStatusBarView.findViewById(R.id.signal_cluster);
+ final SignalClusterView signalClusterKeyguard =
+ (SignalClusterView) mKeyguardStatusBar.findViewById(R.id.signal_cluster);
mNetworkController.addSignalCluster(signalCluster);
+ mNetworkController.addSignalCluster(signalClusterKeyguard);
signalCluster.setNetworkController(mNetworkController);
+ signalClusterKeyguard.setNetworkController(mNetworkController);
final boolean isAPhone = mNetworkController.hasVoiceCallingFeature();
if (isAPhone) {
mNetworkController.addEmergencyLabelView(mHeader);
@@ -783,8 +789,8 @@
mKeyguardMonitor = new KeyguardMonitor();
mKeyguardUserSwitcher = new KeyguardUserSwitcher(mContext,
- (ViewStub) mStatusBarWindow.findViewById(R.id.keyguard_user_switcher), mHeader,
- mUserSwitcherController);
+ (ViewStub) mStatusBarWindow.findViewById(R.id.keyguard_user_switcher),
+ mKeyguardStatusBar, mUserSwitcherController);
// Set up the quick settings tile panel
@@ -794,7 +800,8 @@
mBluetoothController, mLocationController, mRotationLockController,
mNetworkController, mZenModeController, mHotspotController,
mCastController, mFlashlightController,
- mUserSwitcherController, mKeyguardMonitor);
+ mUserSwitcherController, mKeyguardMonitor,
+ mSecurityController);
mQSPanel.setHost(qsh);
for (QSTile<?> tile : qsh.getTiles()) {
mQSPanel.addTile(tile);
@@ -808,9 +815,11 @@
// User info. Trigger first load.
mHeader.setUserInfoController(mUserInfoController);
+ mKeyguardStatusBar.setUserInfoController(mUserInfoController);
mUserInfoController.reloadUserInfo();
mHeader.setBatteryController(mBatteryController);
+ mKeyguardStatusBar.setBatteryController(mBatteryController);
mHeader.setNextAlarmController(mNextAlarmController);
PowerManager pm = (PowerManager) mContext.getSystemService(Context.POWER_SERVICE);
@@ -1167,6 +1176,7 @@
public void refreshAllStatusBarIcons() {
refreshAllIconsForLayout(mStatusIcons);
+ refreshAllIconsForLayout(mStatusIconsKeyguard);
refreshAllIconsForLayout(mNotificationIcons);
}
@@ -1186,19 +1196,26 @@
StatusBarIconView view = new StatusBarIconView(mContext, slot, null);
view.set(icon);
mStatusIcons.addView(view, viewIndex, new LinearLayout.LayoutParams(mIconSize, mIconSize));
+ view = new StatusBarIconView(mContext, slot, null);
+ view.set(icon);
+ mStatusIconsKeyguard.addView(view, viewIndex,
+ new LinearLayout.LayoutParams(mIconSize, mIconSize));
}
public void updateIcon(String slot, int index, int viewIndex,
StatusBarIcon old, StatusBarIcon icon) {
if (SPEW) Log.d(TAG, "updateIcon slot=" + slot + " index=" + index + " viewIndex=" + viewIndex
+ " old=" + old + " icon=" + icon);
- StatusBarIconView view = (StatusBarIconView)mStatusIcons.getChildAt(viewIndex);
+ StatusBarIconView view = (StatusBarIconView) mStatusIcons.getChildAt(viewIndex);
+ view.set(icon);
+ view = (StatusBarIconView) mStatusIconsKeyguard.getChildAt(viewIndex);
view.set(icon);
}
public void removeIcon(String slot, int index, int viewIndex) {
if (SPEW) Log.d(TAG, "removeIcon slot=" + slot + " index=" + index + " viewIndex=" + viewIndex);
mStatusIcons.removeViewAt(viewIndex);
+ mStatusIconsKeyguard.removeViewAt(viewIndex);
}
public UserHandle getCurrentUserHandle() {
@@ -1349,10 +1366,15 @@
int vis = ent.notification.getNotification().visibility;
// Display public version of the notification if we need to redact.
- final boolean hideSensitive = shouldHideSensitiveContents(ent.notification.getUserId());
- boolean showingPublic = vis == Notification.VISIBILITY_PRIVATE && hideSensitive;
- ent.row.setShowingPublic(showingPublic);
+ final boolean hideSensitive =
+ !userAllowsPrivateNotificationsInPublic(ent.notification.getUserId());
+ boolean sensitive = vis == Notification.VISIBILITY_PRIVATE;
+ boolean showingPublic = sensitive && hideSensitive && isLockscreenPublicMode();
+ ent.row.setSensitive(sensitive && hideSensitive);
if (ent.autoRedacted && ent.legacy) {
+
+ // TODO: Also fade this? Or, maybe easier (and better), provide a dark redacted form
+ // for legacy auto redacted notifications.
if (showingPublic) {
ent.row.setShowingLegacyBackground(false);
} else {
@@ -1919,7 +1941,7 @@
.alpha(0f)
.setDuration(160)
.setStartDelay(0)
- .setInterpolator(mAlphaOut)
+ .setInterpolator(ALPHA_OUT)
.withEndAction(new Runnable() {
@Override
public void run() {
@@ -1941,7 +1963,7 @@
v.animate()
.alpha(1f)
.setDuration(320)
- .setInterpolator(mAlphaIn)
+ .setInterpolator(ALPHA_IN)
.setStartDelay(50);
// Synchronize the motion with the Keyguard fading if necessary.
@@ -2314,6 +2336,20 @@
}
}
+ @Override
+ public void notificationLightOff() {
+ if (mDozeServiceHost != null) {
+ mDozeServiceHost.fireNotificationLight(false);
+ }
+ }
+
+ @Override
+ public void notificationLightPulse(int argb, int onMillis, int offMillis) {
+ if (mDozeServiceHost != null) {
+ mDozeServiceHost.fireNotificationLight(true);
+ }
+ }
+
@Override // CommandQueue
public void setSystemUiVisibility(int vis, int mask) {
final int oldVal = mSystemUiVisibility;
@@ -2424,7 +2460,7 @@
final boolean powerSave = mBatteryController.isPowerSave();
final boolean anim = (mScreenOn == null || mScreenOn) && windowState != WINDOW_STATE_HIDDEN
&& !powerSave;
- if (powerSave && getBarState() != StatusBarState.KEYGUARD) {
+ if (powerSave && getBarState() == StatusBarState.SHADE) {
mode = MODE_WARNING;
}
transitions.transitionTo(mode, anim);
@@ -2758,6 +2794,9 @@
if (mNextAlarmController != null) {
mNextAlarmController.dump(fd, pw, args);
}
+ if (mSecurityController != null) {
+ mSecurityController.dump(fd, pw, args);
+ }
}
private String hunStateToString(Entry entry) {
@@ -2957,6 +2996,9 @@
private void setHeadsUpVisibility(boolean vis) {
if (!ENABLE_HEADS_UP) return;
if (DEBUG) Log.v(TAG, (vis ? "showing" : "hiding") + " heads up window");
+ EventLog.writeEvent(EventLogTags.SYSUI_HEADS_UP_STATUS,
+ vis ? mHeadsUpNotificationView.getKey() : "",
+ vis ? 1 : 0);
mHeadsUpNotificationView.setVisibility(vis ? View.VISIBLE : View.GONE);
}
@@ -3275,9 +3317,14 @@
public void showKeyguard() {
setBarState(StatusBarState.KEYGUARD);
- updateKeyguardState();
+ updateKeyguardState(false /* goingToFullShade */);
instantExpandNotificationsPanel();
mLeaveOpenOnKeyguardHide = false;
+ if (mDraggedDownRow != null) {
+ mDraggedDownRow.setUserLocked(false);
+ mDraggedDownRow.notifyHeightChanged();
+ mDraggedDownRow = null;
+ }
}
public boolean isInLaunchTransition() {
@@ -3326,15 +3373,28 @@
}
}
- public void hideKeyguard() {
+ /**
+ * @return true if we would like to stay in the shade, false if it should go away entirely
+ */
+ public boolean hideKeyguard() {
+ boolean staying = mLeaveOpenOnKeyguardHide;
setBarState(StatusBarState.SHADE);
if (mLeaveOpenOnKeyguardHide) {
mLeaveOpenOnKeyguardHide = false;
- mNotificationPanel.animateToFullShade();
+ mNotificationPanel.animateToFullShade(calculateGoingToFullShadeDelay());
+ if (mDraggedDownRow != null) {
+ mDraggedDownRow.setUserLocked(false);
+ mDraggedDownRow = null;
+ }
} else {
instantCollapseNotificationPanel();
}
- updateKeyguardState();
+ updateKeyguardState(staying);
+ return staying;
+ }
+
+ public long calculateGoingToFullShadeDelay() {
+ return mKeyguardFadingAwayDelay + mKeyguardFadingAwayDuration;
}
/**
@@ -3365,30 +3425,24 @@
&& mStatusBarKeyguardViewManager.isSecure());
}
- private void updateKeyguardState() {
+ private void updateKeyguardState(boolean goingToFullShade) {
if (mState == StatusBarState.KEYGUARD) {
- mKeyguardStatusView.setVisibility(View.VISIBLE);
mKeyguardIndicationController.setVisible(true);
mNotificationPanel.resetViews();
mKeyguardUserSwitcher.setKeyguard(true);
} else {
- mKeyguardStatusView.setVisibility(View.GONE);
mKeyguardIndicationController.setVisible(false);
mKeyguardUserSwitcher.setKeyguard(false);
}
if (mState == StatusBarState.KEYGUARD || mState == StatusBarState.SHADE_LOCKED) {
- mKeyguardBottomArea.setVisibility(View.VISIBLE);
- mHeader.setKeyguardShowing(true);
mScrimController.setKeyguardShowing(true);
} else {
- mKeyguardBottomArea.setVisibility(View.GONE);
- mHeader.setKeyguardShowing(false);
mScrimController.setKeyguardShowing(false);
}
- mNotificationPanel.setBarState(mState);
+ mNotificationPanel.setBarState(mState, mKeyguardFadingAway, goingToFullShade);
updateDozingState();
- updateStackScrollerState();
updatePublicMode();
+ updateStackScrollerState(goingToFullShade);
updateNotifications();
checkBarModes();
updateCarrierLabelVisibility(false);
@@ -3398,31 +3452,25 @@
}
private void updateDozingState() {
- final boolean bottomGone = mKeyguardBottomArea.getVisibility() == View.GONE;
+ if (mState != StatusBarState.KEYGUARD) {
+ return;
+ }
+ mNotificationPanel.setDozing(mDozing);
if (mDozing) {
- mNotificationPanel.setBackgroundColor(0xff000000);
- mHeader.setVisibility(View.INVISIBLE);
- if (!bottomGone) {
- mKeyguardBottomArea.setVisibility(View.INVISIBLE);
- }
+ mKeyguardBottomArea.setVisibility(View.INVISIBLE);
mStackScroller.setDark(true, false /*animate*/);
} else {
- mNotificationPanel.setBackground(null);
- mHeader.setVisibility(View.VISIBLE);
- if (!bottomGone) {
- mKeyguardBottomArea.setVisibility(View.VISIBLE);
- }
+ mKeyguardBottomArea.setVisibility(View.VISIBLE);
mStackScroller.setDark(false, false /*animate*/);
}
mScrimController.setDozing(mDozing);
}
- public void updateStackScrollerState() {
+ public void updateStackScrollerState(boolean goingToFullShade) {
if (mStackScroller == null) return;
boolean onKeyguard = mState == StatusBarState.KEYGUARD;
+ mStackScroller.setHideSensitive(isLockscreenPublicMode(), goingToFullShade);
mStackScroller.setDimmed(onKeyguard, false /* animate */);
- mStackScroller.setVisibility(!mShowLockscreenNotifications && onKeyguard
- ? View.INVISIBLE : View.VISIBLE);
mStackScroller.setExpandingEnabled(!onKeyguard);
ActivatableNotificationView activatedChild = mStackScroller.getActivatedChild();
mStackScroller.setActivatedChild(null);
@@ -3451,7 +3499,11 @@
return true;
}
if (mNotificationPanel.isQsExpanded()) {
- mNotificationPanel.animateCloseQs();
+ if (mNotificationPanel.isQsDetailShowing()) {
+ mNotificationPanel.closeQsDetail();
+ } else {
+ mNotificationPanel.animateCloseQs();
+ }
return true;
}
if (mState != StatusBarState.KEYGUARD && mState != StatusBarState.SHADE_LOCKED) {
@@ -3598,17 +3650,22 @@
* @param expandView The view to expand after going to the shade.
*/
public void goToLockedShade(View expandView) {
+ ExpandableNotificationRow row = null;
if (expandView instanceof ExpandableNotificationRow) {
- ExpandableNotificationRow row = (ExpandableNotificationRow) expandView;
+ row = (ExpandableNotificationRow) expandView;
row.setUserExpanded(true);
}
if (isLockscreenPublicMode() && !userAllowsPrivateNotificationsInPublic(mCurrentUserId)) {
mLeaveOpenOnKeyguardHide = true;
showBouncer();
+ mDraggedDownRow = row;
} else {
- mNotificationPanel.animateToFullShade();
+ mNotificationPanel.animateToFullShade(0 /* delay */);
setBarState(StatusBarState.SHADE_LOCKED);
- updateKeyguardState();
+ updateKeyguardState(false /* goingToFullShade */);
+ if (row != null) {
+ row.setUserLocked(false);
+ }
}
}
@@ -3618,7 +3675,7 @@
public void goToKeyguard() {
if (mState == StatusBarState.SHADE_LOCKED) {
setBarState(StatusBarState.KEYGUARD);
- updateKeyguardState();
+ updateKeyguardState(false /* goingToFullShade */);
}
}
@@ -3629,6 +3686,14 @@
return mNotificationPanel;
}
+ public long getKeyguardFadingAwayDelay() {
+ return mKeyguardFadingAwayDelay;
+ }
+
+ public long getKeyguardFadingAwayDuration() {
+ return mKeyguardFadingAwayDuration;
+ }
+
public LinearLayout getSystemIcons() {
return mSystemIcons;
}
@@ -3748,6 +3813,12 @@
}
}
+ public void fireNotificationLight(boolean on) {
+ for (Callback callback : mCallbacks) {
+ callback.onNotificationLight(on);
+ }
+ }
+
public void fireNewNotifications() {
for (Callback callback : mCallbacks) {
callback.onNewNotifications();
@@ -3772,10 +3843,10 @@
}
@Override
- public void requestTease(DozeService dozeService) {
+ public void requestPulse(int pulses, DozeService dozeService) {
if (dozeService == null) return;
dozeService.stayAwake(PROCESSING_TIME);
- mHandler.obtainMessage(H.REQUEST_TEASE, dozeService).sendToTarget();
+ mHandler.obtainMessage(H.REQUEST_PULSE, pulses, 0, dozeService).sendToTarget();
}
@Override
@@ -3794,9 +3865,9 @@
mCurrentDozeService.startDozing();
}
- private void handleRequestTease(DozeService dozeService) {
+ private void handleRequestPulse(int pulses, DozeService dozeService) {
if (!dozeService.equals(mCurrentDozeService)) return;
- final long stayAwake = mScrimController.tease();
+ final long stayAwake = mScrimController.pulse(pulses);
mCurrentDozeService.stayAwake(stayAwake);
}
@@ -3812,15 +3883,15 @@
private final class H extends Handler {
private static final int REQUEST_DOZE = 1;
- private static final int REQUEST_TEASE = 2;
+ private static final int REQUEST_PULSE = 2;
private static final int DOZING_STOPPED = 3;
@Override
public void handleMessage(Message msg) {
if (msg.what == REQUEST_DOZE) {
handleRequestDoze((DozeService) msg.obj);
- } else if (msg.what == REQUEST_TEASE) {
- handleRequestTease((DozeService) msg.obj);
+ } else if (msg.what == REQUEST_PULSE) {
+ handleRequestPulse(msg.arg1, (DozeService) msg.obj);
} else if (msg.what == DOZING_STOPPED) {
handleDozingStopped((DozeService) msg.obj);
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/QSTileHost.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/QSTileHost.java
index c2fd24c..8f25fb97 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/QSTileHost.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/QSTileHost.java
@@ -41,6 +41,7 @@
import com.android.systemui.statusbar.policy.NetworkController;
import com.android.systemui.statusbar.policy.RotationLockController;
import com.android.systemui.statusbar.policy.HotspotController;
+import com.android.systemui.statusbar.policy.SecurityController;
import com.android.systemui.statusbar.policy.UserSwitcherController;
import com.android.systemui.statusbar.policy.ZenModeController;
@@ -65,13 +66,15 @@
private final FlashlightController mFlashlight;
private final UserSwitcherController mUserSwitcherController;
private final KeyguardMonitor mKeyguard;
+ private final SecurityController mSecurity;
public QSTileHost(Context context, PhoneStatusBar statusBar,
BluetoothController bluetooth, LocationController location,
RotationLockController rotation, NetworkController network,
ZenModeController zen, HotspotController hotspot,
CastController cast, FlashlightController flashlight,
- UserSwitcherController userSwitcher, KeyguardMonitor keyguard) {
+ UserSwitcherController userSwitcher, KeyguardMonitor keyguard,
+ SecurityController security) {
mContext = context;
mStatusBar = statusBar;
mBluetooth = bluetooth;
@@ -84,6 +87,7 @@
mFlashlight = flashlight;
mUserSwitcherController = userSwitcher;
mKeyguard = keyguard;
+ mSecurity = security;
final HandlerThread ht = new HandlerThread(QSTileHost.class.getSimpleName());
ht.start();
@@ -189,4 +193,8 @@
public UserSwitcherController getUserSwitcherController() {
return mUserSwitcherController;
}
+
+ public SecurityController getSecurityController() {
+ return mSecurity;
+ }
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/ScrimController.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/ScrimController.java
index eb42401..cbd66aa 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/ScrimController.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/ScrimController.java
@@ -43,14 +43,13 @@
private static final long ANIMATION_DURATION = 220;
private static final int TAG_KEY_ANIM = R.id.scrim;
- private static final int NUM_TEASES = 3;
- private static final long TEASE_IN_ANIMATION_DURATION = 1000;
- private static final long TEASE_VISIBLE_DURATION = 2000;
- private static final long TEASE_OUT_ANIMATION_DURATION = 1000;
- private static final long TEASE_INVISIBLE_DURATION = 1000;
- private static final long TEASE_DURATION = TEASE_IN_ANIMATION_DURATION
- + TEASE_VISIBLE_DURATION + TEASE_OUT_ANIMATION_DURATION + TEASE_INVISIBLE_DURATION;
- private static final long PRE_TEASE_DELAY = 1000;
+ private static final long PULSE_IN_ANIMATION_DURATION = 1000;
+ private static final long PULSE_VISIBLE_DURATION = 2000;
+ private static final long PULSE_OUT_ANIMATION_DURATION = 1000;
+ private static final long PULSE_INVISIBLE_DURATION = 1000;
+ private static final long PULSE_DURATION = PULSE_IN_ANIMATION_DURATION
+ + PULSE_VISIBLE_DURATION + PULSE_OUT_ANIMATION_DURATION + PULSE_INVISIBLE_DURATION;
+ private static final long PRE_PULSE_DELAY = 1000;
private final View mScrimBehind;
private final View mScrimInFront;
@@ -70,7 +69,7 @@
private Runnable mOnAnimationFinished;
private boolean mAnimationStarted;
private boolean mDozing;
- private int mTeasesRemaining;
+ private int mPulsesRemaining;
private final Interpolator mInterpolator = new DecelerateInterpolator();
public ScrimController(View scrimBehind, View scrimInFront) {
@@ -115,27 +114,34 @@
scheduleUpdate();
}
+ public void animateGoingToFullShade(long delay, long duration) {
+ mDurationOverride = duration;
+ mAnimationDelay = delay;
+ mAnimateChange = true;
+ scheduleUpdate();
+ }
+
public void setDozing(boolean dozing) {
if (mDozing == dozing) return;
mDozing = dozing;
if (!mDozing) {
- cancelTeasing();
+ cancelPulsing();
}
scheduleUpdate();
}
/** When dozing, fade screen contents in and out a few times using the front scrim. */
- public long tease() {
+ public long pulse(int pulses) {
if (!mDozing) return 0;
- mTeasesRemaining = NUM_TEASES;
- mScrimInFront.postDelayed(mTeaseIn, PRE_TEASE_DELAY);
- return PRE_TEASE_DELAY + NUM_TEASES * TEASE_DURATION;
+ mPulsesRemaining = Math.max(pulses, mPulsesRemaining);
+ mScrimInFront.postDelayed(mPulseIn, PRE_PULSE_DELAY);
+ return PRE_PULSE_DELAY + mPulsesRemaining * PULSE_DURATION;
}
- private void cancelTeasing() {
- mTeasesRemaining = 0;
- mScrimInFront.removeCallbacks(mTeaseIn);
- mScrimInFront.removeCallbacks(mTeaseOut);
+ private void cancelPulsing() {
+ mPulsesRemaining = 0;
+ mScrimInFront.removeCallbacks(mPulseIn);
+ mScrimInFront.removeCallbacks(mPulseOut);
}
private void scheduleUpdate() {
@@ -278,49 +284,49 @@
return true;
}
- private final Runnable mTeaseIn = new Runnable() {
+ private final Runnable mPulseIn = new Runnable() {
@Override
public void run() {
- if (DEBUG) Log.d(TAG, "Tease in, mDozing=" + mDozing
- + " mTeasesRemaining=" + mTeasesRemaining);
- if (!mDozing || mTeasesRemaining == 0) return;
- mTeasesRemaining--;
- mDurationOverride = TEASE_IN_ANIMATION_DURATION;
+ if (DEBUG) Log.d(TAG, "Pulse in, mDozing=" + mDozing
+ + " mPulsesRemaining=" + mPulsesRemaining);
+ if (!mDozing || mPulsesRemaining == 0) return;
+ mPulsesRemaining--;
+ mDurationOverride = PULSE_IN_ANIMATION_DURATION;
mAnimationDelay = 0;
mAnimateChange = true;
- mOnAnimationFinished = mTeaseInFinished;
+ mOnAnimationFinished = mPulseInFinished;
setScrimColor(mScrimInFront, 0);
}
};
- private final Runnable mTeaseInFinished = new Runnable() {
+ private final Runnable mPulseInFinished = new Runnable() {
@Override
public void run() {
- if (DEBUG) Log.d(TAG, "Tease in finished, mDozing=" + mDozing);
+ if (DEBUG) Log.d(TAG, "Pulse in finished, mDozing=" + mDozing);
if (!mDozing) return;
- mScrimInFront.postDelayed(mTeaseOut, TEASE_VISIBLE_DURATION);
+ mScrimInFront.postDelayed(mPulseOut, PULSE_VISIBLE_DURATION);
}
};
- private final Runnable mTeaseOut = new Runnable() {
+ private final Runnable mPulseOut = new Runnable() {
@Override
public void run() {
- if (DEBUG) Log.d(TAG, "Tease in finished, mDozing=" + mDozing);
+ if (DEBUG) Log.d(TAG, "Pulse out, mDozing=" + mDozing);
if (!mDozing) return;
- mDurationOverride = TEASE_OUT_ANIMATION_DURATION;
+ mDurationOverride = PULSE_OUT_ANIMATION_DURATION;
mAnimationDelay = 0;
mAnimateChange = true;
- mOnAnimationFinished = mTeaseOutFinished;
+ mOnAnimationFinished = mPulseOutFinished;
setScrimColor(mScrimInFront, 1);
}
};
- private final Runnable mTeaseOutFinished = new Runnable() {
+ private final Runnable mPulseOutFinished = new Runnable() {
@Override
public void run() {
- if (DEBUG) Log.d(TAG, "Tease out finished, mTeasesRemaining=" + mTeasesRemaining);
- if (mTeasesRemaining > 0) {
- mScrimInFront.postDelayed(mTeaseIn, TEASE_INVISIBLE_DURATION);
+ if (DEBUG) Log.d(TAG, "Pulse out finished, mPulsesRemaining=" + mPulsesRemaining);
+ if (mPulsesRemaining > 0) {
+ mScrimInFront.postDelayed(mPulseIn, PULSE_INVISIBLE_DURATION);
}
}
};
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarHeaderView.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarHeaderView.java
index 197bb39..b3051b4 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarHeaderView.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarHeaderView.java
@@ -38,7 +38,6 @@
import com.android.systemui.qs.QSPanel;
import com.android.systemui.qs.QSTile;
import com.android.systemui.statusbar.policy.BatteryController;
-import com.android.systemui.statusbar.policy.KeyguardUserSwitcher;
import com.android.systemui.statusbar.policy.NextAlarmController;
import com.android.systemui.statusbar.policy.UserInfoController;
@@ -50,9 +49,6 @@
private boolean mExpanded;
private boolean mListening;
- private boolean mOverscrolled;
- private boolean mKeyguardShowing;
- private boolean mCharging;
private ViewGroup mSystemIconsContainer;
private View mSystemIconsSuperContainer;
@@ -60,7 +56,6 @@
private View mClock;
private View mTime;
private View mAmPm;
- private View mKeyguardCarrierText;
private MultiUserSwitch mMultiUserSwitch;
private ImageView mMultiUserAvatar;
private View mDateCollapsed;
@@ -77,29 +72,19 @@
private TextView mAlarmStatus;
private boolean mShowEmergencyCallsOnly;
- private boolean mKeyguardUserSwitcherShowing;
private boolean mAlarmShowing;
private AlarmClockInfo mNextAlarm;
private int mCollapsedHeight;
private int mExpandedHeight;
- private int mKeyguardHeight;
- private int mKeyguardWidth = ViewGroup.LayoutParams.MATCH_PARENT;
- private int mNormalWidth;
- private int mPadding;
private int mMultiUserExpandedMargin;
private int mMultiUserCollapsedMargin;
- private int mMultiUserKeyguardMargin;
- private int mSystemIconsSwitcherHiddenExpandedMargin;
+
private int mClockMarginBottomExpanded;
private int mClockMarginBottomCollapsed;
private int mMultiUserSwitchWidthCollapsed;
private int mMultiUserSwitchWidthExpanded;
- private int mMultiUserSwitchWidthKeyguard;
- private int mBatteryPaddingEnd;
- private int mBatteryMarginExpanded;
- private int mBatteryMarginKeyguard;
/**
* In collapsed QS, the clock and avatar are scaled down a bit post-layout to allow for a nice
@@ -107,13 +92,12 @@
*/
private float mClockCollapsedScaleFactor;
private float mAvatarCollapsedScaleFactor;
- private float mAvatarKeyguardScaleFactor;
private ActivityStarter mActivityStarter;
private BatteryController mBatteryController;
private NextAlarmController mNextAlarmController;
private QSPanel mQSPanel;
- private KeyguardUserSwitcher mKeyguardUserSwitcher;
+
private final Rect mClipBounds = new Rect();
@@ -139,7 +123,6 @@
mClock = findViewById(R.id.clock);
mTime = findViewById(R.id.time_view);
mAmPm = findViewById(R.id.am_pm_view);
- mKeyguardCarrierText = findViewById(R.id.keyguard_carrier_text);
mMultiUserSwitch = (MultiUserSwitch) findViewById(R.id.multi_user_switch);
mMultiUserAvatar = (ImageView) findViewById(R.id.multi_user_avatar);
mDateCollapsed = findViewById(R.id.date_collapsed);
@@ -187,7 +170,7 @@
protected void onLayout(boolean changed, int l, int t, int r, int b) {
super.onLayout(changed, l, t, r, b);
if (mCaptureValues) {
- if (mExpanded && !mOverscrolled) {
+ if (mExpanded) {
captureLayoutValues(mExpandedValues);
} else {
captureLayoutValues(mCollapsedValues);
@@ -207,18 +190,11 @@
mCollapsedHeight = getResources().getDimensionPixelSize(R.dimen.status_bar_header_height);
mExpandedHeight = getResources().getDimensionPixelSize(
R.dimen.status_bar_header_height_expanded);
- mKeyguardHeight = getResources().getDimensionPixelSize(
- R.dimen.status_bar_header_height_keyguard);
- mNormalWidth = getLayoutParams().width;
- mPadding = getResources().getDimensionPixelSize(R.dimen.notification_side_padding);
mMultiUserExpandedMargin =
getResources().getDimensionPixelSize(R.dimen.multi_user_switch_expanded_margin);
mMultiUserCollapsedMargin =
getResources().getDimensionPixelSize(R.dimen.multi_user_switch_collapsed_margin);
- mMultiUserKeyguardMargin =
- getResources().getDimensionPixelSize(R.dimen.multi_user_switch_keyguard_margin);
- mSystemIconsSwitcherHiddenExpandedMargin = getResources().getDimensionPixelSize(
- R.dimen.system_icons_switcher_hidden_expanded_margin);
+
mClockMarginBottomExpanded =
getResources().getDimensionPixelSize(R.dimen.clock_expanded_bottom_margin);
mClockMarginBottomCollapsed =
@@ -227,23 +203,12 @@
getResources().getDimensionPixelSize(R.dimen.multi_user_switch_width_collapsed);
mMultiUserSwitchWidthExpanded =
getResources().getDimensionPixelSize(R.dimen.multi_user_switch_width_expanded);
- mMultiUserSwitchWidthKeyguard =
- getResources().getDimensionPixelSize(R.dimen.multi_user_switch_width_keyguard);
mAvatarCollapsedScaleFactor =
getResources().getDimensionPixelSize(R.dimen.multi_user_avatar_collapsed_size)
/ (float) mMultiUserAvatar.getLayoutParams().width;
- mAvatarKeyguardScaleFactor =
- getResources().getDimensionPixelSize(R.dimen.multi_user_avatar_keyguard_size)
- / (float) mMultiUserAvatar.getLayoutParams().width;
mClockCollapsedScaleFactor =
(float) getResources().getDimensionPixelSize(R.dimen.qs_time_collapsed_size)
/ (float) getResources().getDimensionPixelSize(R.dimen.qs_time_expanded_size);
- mBatteryPaddingEnd =
- getResources().getDimensionPixelSize(R.dimen.battery_level_padding_end);
- mBatteryMarginExpanded =
- getResources().getDimensionPixelSize(R.dimen.header_battery_margin_expanded);
- mBatteryMarginKeyguard =
- getResources().getDimensionPixelSize(R.dimen.header_battery_margin_keyguard);
}
public void setActivityStarter(ActivityStarter activityStarter) {
@@ -259,7 +224,7 @@
}
public int getCollapsedHeight() {
- return mKeyguardShowing ? mKeyguardHeight : mCollapsedHeight;
+ return mCollapsedHeight;
}
public int getExpandedHeight() {
@@ -274,130 +239,73 @@
updateListeners();
}
- public void setExpanded(boolean expanded, boolean overscrolled) {
+ public void setExpanded(boolean expanded) {
boolean changed = expanded != mExpanded;
- boolean overscrollChanged = overscrolled != mOverscrolled;
mExpanded = expanded;
- mOverscrolled = overscrolled;
- if (changed || overscrollChanged) {
+ if (changed) {
updateHeights();
updateVisibilities();
updateSystemIconsLayoutParams();
- updateZTranslation();
updateClickTargets();
- updateWidth();
- updatePadding();
updateMultiUserSwitch();
if (mQSPanel != null) {
- mQSPanel.setExpanded(expanded && !overscrolled);
+ mQSPanel.setExpanded(expanded);
}
updateClockScale();
updateAvatarScale();
updateClockLp();
- updateBatteryLevelPaddingEnd();
- updateBatteryLevelLp();
requestCaptureValues();
}
}
private void updateHeights() {
- boolean onKeyguardAndCollapsed = mKeyguardShowing && !mExpanded;
- int height;
- if (mExpanded && !mOverscrolled) {
- height = mExpandedHeight;
- } else if (onKeyguardAndCollapsed) {
- height = mKeyguardHeight;
- } else {
- height = mCollapsedHeight;
- }
+ int height = mExpanded ? mExpandedHeight : mCollapsedHeight;
ViewGroup.LayoutParams lp = getLayoutParams();
if (lp.height != height) {
lp.height = height;
setLayoutParams(lp);
}
- int systemIconsContainerHeight = onKeyguardAndCollapsed ? mKeyguardHeight : mCollapsedHeight;
- lp = mSystemIconsSuperContainer.getLayoutParams();
- if (lp.height != systemIconsContainerHeight) {
- lp.height = systemIconsContainerHeight;
- mSystemIconsSuperContainer.setLayoutParams(lp);
- }
- lp = mMultiUserSwitch.getLayoutParams();
- if (lp.height != systemIconsContainerHeight) {
- lp.height = systemIconsContainerHeight;
- mMultiUserSwitch.setLayoutParams(lp);
- }
- }
-
- private void updateWidth() {
- int width = (mKeyguardShowing && !mExpanded) ? mKeyguardWidth : mNormalWidth;
- ViewGroup.LayoutParams lp = getLayoutParams();
- if (width != lp.width) {
- lp.width = width;
- setLayoutParams(lp);
- }
}
private void updateVisibilities() {
- boolean onKeyguardAndCollapsed = mKeyguardShowing && !mExpanded;
- if (onKeyguardAndCollapsed) {
- setBackground(null);
- } else {
- setBackgroundResource(R.drawable.notification_header_bg);
- }
- mDateGroup.setVisibility(onKeyguardAndCollapsed ? View.INVISIBLE : View.VISIBLE);
- mClock.setVisibility(onKeyguardAndCollapsed ? View.INVISIBLE : View.VISIBLE);
- mKeyguardCarrierText.setVisibility(onKeyguardAndCollapsed ? View.VISIBLE : View.GONE);
- mDateCollapsed.setVisibility(mExpanded && !mOverscrolled && mAlarmShowing
- ? View.VISIBLE : View.INVISIBLE);
- mDateExpanded.setVisibility(mExpanded && !mOverscrolled && mAlarmShowing
- ? View.INVISIBLE : View.VISIBLE);
- mAlarmStatus.setVisibility(mExpanded && !mOverscrolled && mAlarmShowing
- ? View.VISIBLE : View.INVISIBLE);
- mSettingsButton.setVisibility(mExpanded && !mOverscrolled ? View.VISIBLE : View.INVISIBLE);
+ mDateCollapsed.setVisibility(mExpanded && mAlarmShowing ? View.VISIBLE : View.INVISIBLE);
+ mDateExpanded.setVisibility(mExpanded && mAlarmShowing ? View.INVISIBLE : View.VISIBLE);
+ mAlarmStatus.setVisibility(mExpanded && mAlarmShowing ? View.VISIBLE : View.INVISIBLE);
+ mSettingsButton.setVisibility(mExpanded ? View.VISIBLE : View.INVISIBLE);
mQsDetailHeader.setVisibility(mExpanded ? View.VISIBLE : View.GONE);
- if (mStatusIcons != null) {
- mStatusIcons.setVisibility(mKeyguardShowing && (!mExpanded || mOverscrolled)
- ? View.VISIBLE : View.GONE);
- }
if (mSignalCluster != null) {
updateSignalClusterDetachment();
}
- mEmergencyCallsOnly.setVisibility(mExpanded && !mOverscrolled && mShowEmergencyCallsOnly
- ? VISIBLE : GONE);
- mMultiUserSwitch.setVisibility(mExpanded || !mKeyguardUserSwitcherShowing
- ? VISIBLE : GONE);
- mBatteryLevel.setVisibility(mKeyguardShowing && mCharging || mExpanded && !mOverscrolled
- ? View.VISIBLE : View.GONE);
- if (mExpanded && !mOverscrolled && mKeyguardUserSwitcherShowing) {
- mKeyguardUserSwitcher.hide();
- }
+ mEmergencyCallsOnly.setVisibility(mExpanded && mShowEmergencyCallsOnly ? VISIBLE : GONE);
+ mBatteryLevel.setVisibility(mExpanded ? View.VISIBLE : View.GONE);
}
private void updateSignalClusterDetachment() {
- boolean detached = mExpanded && !mOverscrolled;
+ boolean detached = mExpanded;
if (detached != mSignalClusterDetached) {
if (detached) {
getOverlay().add(mSignalCluster);
} else {
- getOverlay().remove(mSignalCluster);
- mSystemIcons.addView(mSignalCluster, 1);
+ reattachSignalCluster();
}
}
mSignalClusterDetached = detached;
}
+ private void reattachSignalCluster() {
+ getOverlay().remove(mSignalCluster);
+ mSystemIcons.addView(mSignalCluster, 1);
+ }
+
private void updateSystemIconsLayoutParams() {
RelativeLayout.LayoutParams lp = (LayoutParams) mSystemIconsSuperContainer.getLayoutParams();
- lp.addRule(RelativeLayout.START_OF, mExpanded && !mOverscrolled
+ int rule = mExpanded
? mSettingsButton.getId()
- : mMultiUserSwitch.getId());
- lp.removeRule(ALIGN_PARENT_START);
- if (mMultiUserSwitch.getVisibility() == GONE) {
- lp.setMarginEnd(mSystemIconsSwitcherHiddenExpandedMargin);
- } else {
- lp.setMarginEnd(0);
+ : mMultiUserSwitch.getId();
+ if (rule != lp.getRules()[RelativeLayout.START_OF]) {
+ lp.addRule(RelativeLayout.START_OF, rule);
+ mSystemIconsSuperContainer.setLayoutParams(lp);
}
- mSystemIconsSuperContainer.setLayoutParams(lp);
}
private void updateListeners() {
@@ -411,12 +319,9 @@
}
private void updateAvatarScale() {
- if (mExpanded && !mOverscrolled) {
+ if (mExpanded) {
mMultiUserAvatar.setScaleX(1f);
mMultiUserAvatar.setScaleY(1f);
- } else if (mKeyguardShowing) {
- mMultiUserAvatar.setScaleX(mAvatarKeyguardScaleFactor);
- mMultiUserAvatar.setScaleY(mAvatarKeyguardScaleFactor);
} else {
mMultiUserAvatar.setScaleX(mAvatarCollapsedScaleFactor);
mMultiUserAvatar.setScaleY(mAvatarCollapsedScaleFactor);
@@ -432,7 +337,7 @@
}
private float getTimeScale() {
- return !mExpanded || mOverscrolled ? mClockCollapsedScaleFactor : 1f;
+ return !mExpanded ? mClockCollapsedScaleFactor : 1f;
}
private void updateAmPmTranslation() {
@@ -440,20 +345,9 @@
mAmPm.setTranslationX((rtl ? 1 : -1) * mTime.getWidth() * (1 - mTime.getScaleX()));
}
- private void updateBatteryLevelPaddingEnd() {
- mBatteryLevel.setPaddingRelative(0, 0,
- mKeyguardShowing && !mExpanded ? 0 : mBatteryPaddingEnd, 0);
- }
-
@Override
public void onBatteryLevelChanged(int level, boolean pluggedIn, boolean charging) {
mBatteryLevel.setText(getResources().getString(R.string.battery_level_template, level));
- boolean changed = mCharging != charging;
- mCharging = charging;
- if (changed) {
- updateVisibilities();
- requestCaptureValues();
- }
}
@Override
@@ -472,37 +366,14 @@
requestCaptureValues();
}
-
private void updateClickTargets() {
- setClickable(!mKeyguardShowing || mExpanded);
-
- boolean keyguardSwitcherAvailable =
- mKeyguardUserSwitcher != null && mKeyguardShowing && !mExpanded;
- mMultiUserSwitch.setClickable(mExpanded || keyguardSwitcherAvailable);
- mMultiUserSwitch.setKeyguardMode(keyguardSwitcherAvailable);
+ mMultiUserSwitch.setClickable(mExpanded);
mSystemIconsSuperContainer.setClickable(mExpanded);
mAlarmStatus.setClickable(mNextAlarm != null && mNextAlarm.getShowIntent() != null);
}
- private void updateZTranslation() {
-
- // If we are on the Keyguard, we need to set our z position to zero, so we don't get
- // shadows.
- if (mKeyguardShowing && !mExpanded) {
- setZ(0);
- } else {
- setTranslationZ(0);
- }
- }
-
- private void updatePadding() {
- boolean padded = !mKeyguardShowing || mExpanded;
- int padding = padded ? mPadding : 0;
- setPaddingRelative(padding, 0, padding, 0);
- }
-
private void updateClockLp() {
- int marginBottom = mExpanded && !mOverscrolled
+ int marginBottom = mExpanded
? mClockMarginBottomExpanded
: mClockMarginBottomCollapsed;
LayoutParams lp = (LayoutParams) mDateGroup.getLayoutParams();
@@ -515,12 +386,9 @@
private void updateMultiUserSwitch() {
int marginEnd;
int width;
- if (mExpanded && !mOverscrolled) {
+ if (mExpanded) {
marginEnd = mMultiUserExpandedMargin;
width = mMultiUserSwitchWidthExpanded;
- } else if (mKeyguardShowing) {
- marginEnd = mMultiUserKeyguardMargin;
- width = mMultiUserSwitchWidthKeyguard;
} else {
marginEnd = mMultiUserCollapsedMargin;
width = mMultiUserSwitchWidthCollapsed;
@@ -533,19 +401,8 @@
}
}
- private void updateBatteryLevelLp() {
- int marginStart = mExpanded && !mOverscrolled
- ? mBatteryMarginExpanded
- : mBatteryMarginKeyguard;
- MarginLayoutParams lp = (MarginLayoutParams) mBatteryLevel.getLayoutParams();
- if (marginStart != lp.getMarginStart()) {
- lp.setMarginStart(marginStart);
- mBatteryLevel.setLayoutParams(lp);
- }
- }
-
public void setExpansion(float t) {
- if (mOverscrolled) {
+ if (!mExpanded) {
t = 0f;
}
mCurrentT = t;
@@ -580,12 +437,18 @@
mSignalCluster = systemIcons.findViewById(R.id.signal_cluster);
mSystemIcons = systemIcons;
updateVisibilities();
+ if (mStatusIcons != null) {
+ mStatusIcons.setVisibility(View.GONE);
+ }
}
public void onSystemIconsDetached() {
+ if (mSignalClusterDetached) {
+ reattachSignalCluster();
+ mSignalClusterDetached = false;
+ }
if (mStatusIcons != null) {
mStatusIcons.setVisibility(View.VISIBLE);
- mStatusIcons.setAlpha(1f);
}
if (mSignalCluster != null) {
mSignalCluster.setVisibility(View.VISIBLE);
@@ -598,20 +461,6 @@
mSystemIcons = null;
}
- public void setKeyguardShowing(boolean keyguardShowing) {
- mKeyguardShowing = keyguardShowing;
- updateHeights();
- updateWidth();
- updateVisibilities();
- updateZTranslation();
- updatePadding();
- updateMultiUserSwitch();
- updateClickTargets();
- updateBatteryLevelPaddingEnd();
- updateAvatarScale();
- mCaptureValues = true;
- }
-
public void setUserInfoController(UserInfoController userInfoController) {
userInfoController.addListener(new UserInfoController.OnUserInfoChangedListener() {
@Override
@@ -651,11 +500,6 @@
mMultiUserSwitch.setQsPanel(qsp);
}
- public void setKeyguarUserSwitcher(KeyguardUserSwitcher keyguardUserSwitcher) {
- mKeyguardUserSwitcher = keyguardUserSwitcher;
- mMultiUserSwitch.setKeyguardUserSwitcher(keyguardUserSwitcher);
- }
-
@Override
public boolean shouldDelayChildPressedState() {
return true;
@@ -665,20 +509,10 @@
mShowEmergencyCallsOnly = show;
if (mExpanded) {
updateVisibilities();
+ requestCaptureValues();
}
}
- public void setKeyguardUserSwitcherShowing(boolean showing) {
- mKeyguardUserSwitcherShowing = showing;
- updateVisibilities();
- updateSystemIconsLayoutParams();
- }
-
- @Override
- public boolean hasOverlappingRendering() {
- return !mKeyguardShowing || mExpanded;
- }
-
@Override
protected void dispatchSetPressed(boolean pressed) {
// We don't want that everything lights up when we click on the header, so block the request
@@ -700,11 +534,11 @@
target.batteryY = mSystemIconsSuperContainer.getTop() + mSystemIconsContainer.getTop();
target.batteryLevelAlpha = getAlphaForVisibility(mBatteryLevel);
target.settingsAlpha = getAlphaForVisibility(mSettingsButton);
- target.settingsTranslation = mExpanded && !mOverscrolled
+ target.settingsTranslation = mExpanded
? 0
: mMultiUserSwitch.getLeft() - mSettingsButton.getLeft();
target.signalClusterAlpha = mSignalClusterDetached ? 0f : 1f;
- target.settingsRotation = !mExpanded || mOverscrolled ? 90f : 0f;
+ target.settingsRotation = !mExpanded ? 90f : 0f;
}
private float getAlphaForVisibility(View v) {
@@ -735,7 +569,7 @@
mMultiUserAvatar.setY(values.avatarY - mMultiUserSwitch.getTop());
mSystemIconsSuperContainer.setX(values.batteryX - mSystemIconsContainer.getRight());
mSystemIconsSuperContainer.setY(values.batteryY - mSystemIconsContainer.getTop());
- if (mSignalCluster != null && mExpanded && !mOverscrolled) {
+ if (mSignalCluster != null && mExpanded) {
mSignalCluster.setX(mSystemIconsSuperContainer.getX()
- mSignalCluster.getWidth());
mSignalCluster.setY(
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarKeyguardViewManager.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarKeyguardViewManager.java
index af21f25..6831933 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarKeyguardViewManager.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarKeyguardViewManager.java
@@ -230,17 +230,22 @@
});
} else {
mPhoneStatusBar.setKeyguardFadingAway(delay, fadeoutDuration);
- mPhoneStatusBar.hideKeyguard();
- mStatusBarWindowManager.setKeyguardFadingAway(true);
+ boolean staying = mPhoneStatusBar.hideKeyguard();
+ if (!staying) {
+ mStatusBarWindowManager.setKeyguardFadingAway(true);
+ mScrimController.animateKeyguardFadingOut(delay, fadeoutDuration, new Runnable() {
+ @Override
+ public void run() {
+ mStatusBarWindowManager.setKeyguardFadingAway(false);
+ mPhoneStatusBar.finishKeyguardFadingAway();
+ }
+ });
+ } else {
+ mScrimController.animateGoingToFullShade(delay, fadeoutDuration);
+ mPhoneStatusBar.finishKeyguardFadingAway();
+ }
mStatusBarWindowManager.setKeyguardShowing(false);
mBouncer.animateHide(delay, fadeoutDuration);
- mScrimController.animateKeyguardFadingOut(delay, fadeoutDuration, new Runnable() {
- @Override
- public void run() {
- mStatusBarWindowManager.setKeyguardFadingAway(false);
- mPhoneStatusBar.finishKeyguardFadingAway();
- }
- });
mViewMediatorCallback.keyguardGone();
updateStates();
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/SystemUIDialog.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/SystemUIDialog.java
index 86a6622..d701b3c 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/SystemUIDialog.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/SystemUIDialog.java
@@ -27,8 +27,12 @@
*/
public class SystemUIDialog extends AlertDialog {
+ private final Context mContext;
+
public SystemUIDialog(Context context) {
super(context, R.style.Theme_SystemUI_Dialog);
+ mContext = context;
+
getWindow().setType(WindowManager.LayoutParams.TYPE_STATUS_BAR_PANEL);
getWindow().addFlags(WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM
| WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED);
@@ -36,4 +40,26 @@
attrs.setTitle(getClass().getSimpleName());
getWindow().setAttributes(attrs);
}
+
+ public void setShowForAllUsers(boolean show) {
+ if (show) {
+ getWindow().getAttributes().privateFlags |=
+ WindowManager.LayoutParams.PRIVATE_FLAG_SHOW_FOR_ALL_USERS;
+ } else {
+ getWindow().getAttributes().privateFlags &=
+ ~WindowManager.LayoutParams.PRIVATE_FLAG_SHOW_FOR_ALL_USERS;
+ }
+ }
+
+ public void setMessage(int resId) {
+ setMessage(mContext.getString(resId));
+ }
+
+ public void setPositiveButton(int resId, OnClickListener onClick) {
+ setButton(BUTTON_POSITIVE, mContext.getString(resId), onClick);
+ }
+
+ public void setNegativeButton(int resId, OnClickListener onClick) {
+ setButton(BUTTON_NEGATIVE, mContext.getString(resId), onClick);
+ }
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/BatteryController.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/BatteryController.java
index 1e65543..d1b69ab 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/BatteryController.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/BatteryController.java
@@ -47,6 +47,7 @@
IntentFilter filter = new IntentFilter();
filter.addAction(Intent.ACTION_BATTERY_CHANGED);
filter.addAction(PowerManager.ACTION_POWER_SAVE_MODE_CHANGED);
+ filter.addAction(PowerManager.ACTION_POWER_SAVE_MODE_CHANGING);
context.registerReceiver(this, filter);
updatePowerSave();
@@ -86,6 +87,8 @@
fireBatteryLevelChanged();
} else if (action.equals(PowerManager.ACTION_POWER_SAVE_MODE_CHANGED)) {
updatePowerSave();
+ } else if (action.equals(PowerManager.ACTION_POWER_SAVE_MODE_CHANGING)) {
+ setPowerSave(intent.getBooleanExtra(PowerManager.EXTRA_POWER_SAVE_MODE, false));
}
}
@@ -94,7 +97,10 @@
}
private void updatePowerSave() {
- final boolean powerSave = mPowerManager.isPowerSaveMode();
+ setPowerSave(mPowerManager.isPowerSaveMode());
+ }
+
+ private void setPowerSave(boolean powerSave) {
if (powerSave == mPowerSave) return;
mPowerSave = powerSave;
if (DEBUG) Log.d(TAG, "Power save is " + (mPowerSave ? "on" : "off"));
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/HeadsUpNotificationView.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/HeadsUpNotificationView.java
index ac260db..2aceb95 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/HeadsUpNotificationView.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/HeadsUpNotificationView.java
@@ -91,7 +91,9 @@
if (mHeadsUp != null) {
mHeadsUp.row.setSystemExpanded(true);
- mHeadsUp.row.setShowingPublic(false);
+ mHeadsUp.row.setSensitive(false);
+ mHeadsUp.row.setHideSensitive(
+ false, false /* animated */, 0 /* delay */, 0 /* duration */);
if (mContentHolder == null) {
// too soon!
return false;
@@ -338,6 +340,10 @@
mBar.scheduleHeadsUpEscalation();
}
+ public String getKey() {
+ return mHeadsUp == null ? null : mHeadsUp.notification.getKey();
+ }
+
private class EdgeSwipeHelper implements Gefingerpoken {
private static final boolean DEBUG_EDGE_SWIPE = false;
private final float mTouchSlop;
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/KeyguardUserSwitcher.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/KeyguardUserSwitcher.java
index 2be566c..a0312bcd 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/KeyguardUserSwitcher.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/KeyguardUserSwitcher.java
@@ -16,10 +16,6 @@
package com.android.systemui.statusbar.policy;
-import com.android.systemui.R;
-import com.android.systemui.statusbar.phone.StatusBarHeaderView;
-import com.android.systemui.statusbar.phone.UserAvatarView;
-
import android.content.Context;
import android.database.DataSetObserver;
import android.provider.Settings;
@@ -29,6 +25,10 @@
import android.view.ViewStub;
import android.widget.TextView;
+import com.android.systemui.R;
+import com.android.systemui.statusbar.phone.KeyguardStatusBarView;
+import com.android.systemui.statusbar.phone.UserAvatarView;
+
/**
* Manages the user switcher on the Keyguard.
*/
@@ -36,27 +36,24 @@
private static final String TAG = "KeyguardUserSwitcher";
private static final boolean ALWAYS_ON = false;
- private static final String SIMPLE_USER_SWITCHER_GLOBAL_SETTING =
- "lockscreenSimpleUserSwitcher";
private final ViewGroup mUserSwitcher;
- private final StatusBarHeaderView mHeader;
+ private final KeyguardStatusBarView mStatusBarView;
private final Adapter mAdapter;
private final boolean mSimpleUserSwitcher;
public KeyguardUserSwitcher(Context context, ViewStub userSwitcher,
- StatusBarHeaderView header, UserSwitcherController userSwitcherController) {
+ KeyguardStatusBarView statusBarView, UserSwitcherController userSwitcherController) {
if (context.getResources().getBoolean(R.bool.config_keyguardUserSwitcher) || ALWAYS_ON) {
mUserSwitcher = (ViewGroup) userSwitcher.inflate();
- mHeader = header;
- mHeader.setKeyguarUserSwitcher(this);
+ mStatusBarView = statusBarView;
+ mStatusBarView.setKeyguardUserSwitcher(this);
mAdapter = new Adapter(context, userSwitcherController);
mAdapter.registerDataSetObserver(mDataSetObserver);
- mSimpleUserSwitcher = Settings.Global.getInt(context.getContentResolver(),
- SIMPLE_USER_SWITCHER_GLOBAL_SETTING, 0) != 0;
+ mSimpleUserSwitcher = userSwitcherController.isSimpleUserSwitcher();
} else {
mUserSwitcher = null;
- mHeader = null;
+ mStatusBarView = null;
mAdapter = null;
mSimpleUserSwitcher = false;
}
@@ -84,7 +81,7 @@
if (mUserSwitcher != null) {
// TODO: animate
mUserSwitcher.setVisibility(View.VISIBLE);
- mHeader.setKeyguardUserSwitcherShowing(true);
+ mStatusBarView.setKeyguardUserSwitcherShowing(true);
}
}
@@ -92,7 +89,7 @@
if (mUserSwitcher != null) {
// TODO: animate
mUserSwitcher.setVisibility(View.GONE);
- mHeader.setKeyguardUserSwitcherShowing(false);
+ mStatusBarView.setKeyguardUserSwitcherShowing(false);
}
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/NetworkControllerImpl.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/NetworkControllerImpl.java
index 4fc2e06..4e9f37d 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/NetworkControllerImpl.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/NetworkControllerImpl.java
@@ -34,7 +34,6 @@
import android.os.Messenger;
import android.provider.Settings;
import android.telephony.PhoneStateListener;
-import android.telephony.Rlog;
import android.telephony.ServiceState;
import android.telephony.SignalStrength;
import android.telephony.TelephonyManager;
@@ -163,10 +162,9 @@
boolean mDataAndWifiStacked = false;
public interface SignalCluster {
- void setWifiIndicators(boolean visible, int strengthIcon, boolean problem,
- String contentDescription);
- void setMobileDataIndicators(boolean visible, int strengthIcon, boolean problem,
- int typeIcon, String contentDescription, String typeContentDescription);
+ void setWifiIndicators(boolean visible, int strengthIcon, String contentDescription);
+ void setMobileDataIndicators(boolean visible, int strengthIcon, int typeIcon,
+ String contentDescription, String typeContentDescription);
void setIsAirplaneMode(boolean is, int airplaneIcon);
}
@@ -365,7 +363,6 @@
// only show wifi in the cluster if connected or if wifi-only
mWifiEnabled && (mWifiConnected || !mHasMobileDataFeature),
mWifiIconId,
- mInetCondition == 0,
mContentDescriptionWifi);
if (mIsWimaxEnabled && mWimaxConnected) {
@@ -373,7 +370,6 @@
cluster.setMobileDataIndicators(
true,
mAlwaysShowCdmaRssi ? mPhoneSignalIconId : mWimaxIconId,
- mInetCondition == 0,
mDataTypeIconId,
mContentDescriptionWimax,
mContentDescriptionDataType);
@@ -382,7 +378,6 @@
cluster.setMobileDataIndicators(
mHasMobileDataFeature,
mShowPhoneRSSIForData ? mPhoneSignalIconId : mDataSignalIconId,
- mInetCondition == 0,
mDataTypeIconId,
mContentDescriptionPhoneSignal,
mContentDescriptionDataType);
@@ -475,8 +470,8 @@
PhoneStateListener mPhoneStateListener = new PhoneStateListener() {
@Override
public void onSignalStrengthsChanged(SignalStrength signalStrength) {
- if (true/*DEBUG*/) {
- Rlog.d(TAG, "onSignalStrengthsChanged signalStrength=" + signalStrength +
+ if (DEBUG) {
+ Log.d(TAG, "onSignalStrengthsChanged signalStrength=" + signalStrength +
((signalStrength == null) ? "" : (" level=" + signalStrength.getLevel())));
}
mSignalStrength = signalStrength;
@@ -486,8 +481,8 @@
@Override
public void onServiceStateChanged(ServiceState state) {
- if (true/*DEBUG*/) {
- Rlog.d(TAG, "onServiceStateChanged voiceState=" + state.getVoiceRegState()
+ if (DEBUG) {
+ Log.d(TAG, "onServiceStateChanged voiceState=" + state.getVoiceRegState()
+ " dataState=" + state.getDataRegState());
}
mServiceState = state;
@@ -499,8 +494,8 @@
@Override
public void onCallStateChanged(int state, String incomingNumber) {
- if (true/*DEBUG*/) {
- Rlog.d(TAG, "onCallStateChanged state=" + state);
+ if (DEBUG) {
+ Log.d(TAG, "onCallStateChanged state=" + state);
}
// In cdma, if a voice call is made, RSSI should switch to 1x.
if (isCdma()) {
@@ -511,8 +506,8 @@
@Override
public void onDataConnectionStateChanged(int state, int networkType) {
- if (true/*DEBUG*/) {
- Rlog.d(TAG, "onDataConnectionStateChanged: state=" + state
+ if (DEBUG) {
+ Log.d(TAG, "onDataConnectionStateChanged: state=" + state
+ " type=" + networkType);
}
mDataState = state;
@@ -524,8 +519,8 @@
@Override
public void onDataActivity(int direction) {
- if (true/*DEBUG*/) {
- Rlog.d(TAG, "onDataActivity: direction=" + direction);
+ if (DEBUG) {
+ Log.d(TAG, "onDataActivity: direction=" + direction);
}
mDataActivity = direction;
updateDataIcon();
@@ -556,7 +551,7 @@
} else {
mSimState = IccCardConstants.State.UNKNOWN;
}
- Rlog.d(TAG, "updateSimState: mSimState=" + mSimState);
+ if (DEBUG) Log.d(TAG, "updateSimState: mSimState=" + mSimState);
}
private boolean isCdma() {
@@ -584,7 +579,7 @@
} else {
retVal = false;
}
- Rlog.d(TAG, "hasService: mServiceState=" + mServiceState + " retVal=" + retVal);
+ if (DEBUG) Log.d(TAG, "hasService: mServiceState=" + mServiceState + " retVal=" + retVal);
return retVal;
}
@@ -598,15 +593,18 @@
}
private final void updateTelephonySignalStrength() {
- Rlog.d(TAG, "updateTelephonySignalStrength: hasService=" + hasService() + " ss=" + mSignalStrength);
+ if (DEBUG) {
+ Log.d(TAG, "updateTelephonySignalStrength: hasService=" + hasService()
+ + " ss=" + mSignalStrength);
+ }
if (!hasService()) {
- if (true/*CHATTY*/) Log.d(TAG, "updateTelephonySignalStrength: !hasService()");
+ if (CHATTY) Log.d(TAG, "updateTelephonySignalStrength: !hasService()");
mPhoneSignalIconId = R.drawable.stat_sys_signal_null;
mQSPhoneSignalIconId = R.drawable.ic_qs_signal_no_signal;
mDataSignalIconId = R.drawable.stat_sys_signal_null;
} else {
if (mSignalStrength == null) {
- if (true/*CHATTY*/) Rlog.d(TAG, "updateTelephonySignalStrength: mSignalStrength == null");
+ if (CHATTY) Log.d(TAG, "updateTelephonySignalStrength: mSignalStrength == null");
mPhoneSignalIconId = R.drawable.stat_sys_signal_null;
mQSPhoneSignalIconId = R.drawable.ic_qs_signal_no_signal;
mDataSignalIconId = R.drawable.stat_sys_signal_null;
@@ -617,9 +615,12 @@
int[] iconList;
if (isCdma() && mAlwaysShowCdmaRssi) {
mLastSignalLevel = iconLevel = mSignalStrength.getCdmaLevel();
- if(true/*DEBUG*/) Rlog.d(TAG, "updateTelephonySignalStrength: mAlwaysShowCdmaRssi=" + mAlwaysShowCdmaRssi
+ if (DEBUG) {
+ Log.d(TAG, "updateTelephonySignalStrength:"
+ + " mAlwaysShowCdmaRssi=" + mAlwaysShowCdmaRssi
+ " set to cdmaLevel=" + mSignalStrength.getCdmaLevel()
+ " instead of level=" + mSignalStrength.getLevel());
+ }
} else {
mLastSignalLevel = iconLevel = mSignalStrength.getLevel();
}
@@ -644,7 +645,7 @@
mContentDescriptionPhoneSignal = mContext.getString(
AccessibilityContentDescriptions.PHONE_SIGNAL_STRENGTH[iconLevel]);
mDataSignalIconId = TelephonyIcons.DATA_SIGNAL_STRENGTH[mInetCondition][iconLevel];
- Rlog.d(TAG, "updateTelephonySignalStrength: iconLevel=" + iconLevel);
+ if (DEBUG) Log.d(TAG, "updateTelephonySignalStrength: iconLevel=" + iconLevel);
}
}
}
@@ -1202,6 +1203,14 @@
}
}
+ if (mDemoMode) {
+ mQSWifiIconId = mDemoWifiLevel < 0 ? R.drawable.ic_qs_wifi_no_network
+ : WifiIcons.QS_WIFI_SIGNAL_STRENGTH[mDemoInetCondition][mDemoWifiLevel];
+ mQSPhoneSignalIconId = mDemoMobileLevel < 0 ? R.drawable.ic_qs_signal_no_signal :
+ TelephonyIcons.QS_TELEPHONY_SIGNAL_STRENGTH[mDemoInetCondition][mDemoMobileLevel];
+ mQSDataTypeIconId = mDemoQSDataTypeIconId;
+ }
+
if (DEBUG) {
Log.d(TAG, "refreshViews connected={"
+ (mWifiConnected?" wifi":"")
@@ -1473,6 +1482,7 @@
private int mDemoInetCondition;
private int mDemoWifiLevel;
private int mDemoDataTypeIconId;
+ private int mDemoQSDataTypeIconId;
private int mDemoMobileLevel;
@Override
@@ -1482,12 +1492,14 @@
mDemoWifiLevel = mWifiLevel;
mDemoInetCondition = mInetCondition;
mDemoDataTypeIconId = mDataTypeIconId;
+ mDemoQSDataTypeIconId = mQSDataTypeIconId;
mDemoMobileLevel = mLastSignalLevel;
} else if (mDemoMode && command.equals(COMMAND_EXIT)) {
mDemoMode = false;
for (SignalCluster cluster : mSignalClusters) {
refreshSignalCluster(cluster);
}
+ refreshViews();
} else if (mDemoMode && command.equals(COMMAND_NETWORK)) {
String airplane = args.getString("airplane");
if (airplane != null) {
@@ -1514,9 +1526,9 @@
cluster.setWifiIndicators(
show,
iconId,
- mDemoInetCondition == 0,
"Demo");
}
+ refreshViews();
}
String mobile = args.getString("mobile");
if (mobile != null) {
@@ -1534,6 +1546,16 @@
datatype.equals("roam")
? R.drawable.stat_sys_data_fully_connected_roam :
0;
+ mDemoQSDataTypeIconId =
+ datatype.equals("1x") ? R.drawable.ic_qs_signal_1x :
+ datatype.equals("3g") ? R.drawable.ic_qs_signal_3g :
+ datatype.equals("4g") ? R.drawable.ic_qs_signal_4g :
+ datatype.equals("e") ? R.drawable.ic_qs_signal_e :
+ datatype.equals("g") ? R.drawable.ic_qs_signal_g :
+ datatype.equals("h") ? R.drawable.ic_qs_signal_h :
+ datatype.equals("lte") ? R.drawable.ic_qs_signal_lte :
+ datatype.equals("roam") ? R.drawable.ic_qs_signal_r :
+ 0;
}
int[][] icons = TelephonyIcons.TELEPHONY_SIGNAL_STRENGTH;
String level = args.getString("level");
@@ -1547,11 +1569,11 @@
cluster.setMobileDataIndicators(
show,
iconId,
- mDemoInetCondition == 0,
mDemoDataTypeIconId,
"Demo",
"Demo");
}
+ refreshViews();
}
}
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/SecurityController.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/SecurityController.java
new file mode 100644
index 0000000..ede8129
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/SecurityController.java
@@ -0,0 +1,36 @@
+/*
+ * Copyright (C) 2014 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.android.systemui.statusbar.policy;
+
+public interface SecurityController {
+
+ boolean hasDeviceOwner();
+ String getDeviceOwnerName();
+ boolean isVpnEnabled();
+ String getVpnApp();
+ boolean isLegacyVpn();
+ String getLegacyVpnName();
+ void openVpnApp();
+ void disconnectFromLegacyVpn();
+
+ void addCallback(VpnCallback callback);
+ void removeCallback(VpnCallback callback);
+
+ public interface VpnCallback {
+ void onVpnStateChanged();
+ }
+
+}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/SecurityControllerImpl.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/SecurityControllerImpl.java
new file mode 100644
index 0000000..8e04e5e
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/SecurityControllerImpl.java
@@ -0,0 +1,176 @@
+/*
+ * Copyright (C) 2014 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.android.systemui.statusbar.policy;
+
+import android.app.admin.DevicePolicyManager;
+import android.content.Context;
+import android.content.Intent;
+import android.content.pm.ApplicationInfo;
+import android.content.pm.PackageManager.NameNotFoundException;
+import android.net.ConnectivityManager;
+import android.net.ConnectivityManager.NetworkCallback;
+import android.net.IConnectivityManager;
+import android.net.NetworkCapabilities;
+import android.net.NetworkRequest;
+import android.os.RemoteException;
+import android.os.ServiceManager;
+import android.text.TextUtils;
+import android.util.Log;
+
+import com.android.internal.net.VpnConfig;
+
+import java.io.FileDescriptor;
+import java.io.PrintWriter;
+import java.util.ArrayList;
+
+public class SecurityControllerImpl implements SecurityController {
+
+ private static final String TAG = "SecurityController";
+ private static final boolean DEBUG = Log.isLoggable(TAG, Log.DEBUG);
+
+ private static final NetworkRequest REQUEST = new NetworkRequest.Builder()
+ .removeCapability(NetworkCapabilities.NET_CAPABILITY_NOT_VPN)
+ .removeCapability(NetworkCapabilities.NET_CAPABILITY_NOT_RESTRICTED)
+ .removeCapability(NetworkCapabilities.NET_CAPABILITY_TRUSTED)
+ .build();
+ private final Context mContext;
+ private final ConnectivityManager mConnectivityManager;
+ private final IConnectivityManager mConnectivityService = IConnectivityManager.Stub.asInterface(
+ ServiceManager.getService(Context.CONNECTIVITY_SERVICE));
+ private final DevicePolicyManager mDevicePolicyManager;
+ private final ArrayList<VpnCallback> mCallbacks = new ArrayList<VpnCallback>();
+
+ private boolean mIsVpnEnabled;
+ private VpnConfig mVpnConfig;
+ private String mVpnName;
+
+ public SecurityControllerImpl(Context context) {
+ mContext = context;
+ mDevicePolicyManager = (DevicePolicyManager)
+ context.getSystemService(Context.DEVICE_POLICY_SERVICE);
+ mConnectivityManager = (ConnectivityManager)
+ context.getSystemService(Context.CONNECTIVITY_SERVICE);
+
+ // TODO: re-register network callback on user change.
+ mConnectivityManager.registerNetworkCallback(REQUEST, mNetworkCallback);
+ }
+
+ public void dump(FileDescriptor fd, PrintWriter pw, String[] args) {
+ pw.println("SecurityController state:");
+ pw.print(" mIsVpnEnabled="); pw.println(mIsVpnEnabled);
+ pw.print(" mVpnConfig="); pw.println(mVpnConfig);
+ pw.print(" mVpnName="); pw.println(mVpnName);
+ }
+
+ @Override
+ public boolean hasDeviceOwner() {
+ return !TextUtils.isEmpty(mDevicePolicyManager.getDeviceOwner());
+ }
+
+ @Override
+ public String getDeviceOwnerName() {
+ return mDevicePolicyManager.getDeviceOwnerName();
+ }
+
+ @Override
+ public boolean isVpnEnabled() {
+ // TODO: Remove once using NetworkCallback for updates.
+ updateState();
+
+ return mIsVpnEnabled;
+ }
+
+ @Override
+ public boolean isLegacyVpn() {
+ return mVpnConfig.legacy;
+ }
+
+ @Override
+ public String getVpnApp() {
+ return mVpnName;
+ }
+
+ @Override
+ public String getLegacyVpnName() {
+ return mVpnConfig.session;
+ }
+
+ @Override
+ public void openVpnApp() {
+ Intent i = mContext.getPackageManager().getLaunchIntentForPackage(mVpnConfig.user);
+ if (i != null) {
+ i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
+ mContext.startActivity(i);
+ }
+ }
+
+ @Override
+ public void disconnectFromLegacyVpn() {
+ try {
+ mConnectivityService.prepareVpn(VpnConfig.LEGACY_VPN, VpnConfig.LEGACY_VPN);
+ } catch (Exception e) {
+ Log.e(TAG, "Unable to disconnect from VPN", e);
+ }
+ }
+
+ @Override
+ public void addCallback(VpnCallback callback) {
+ if (callback == null) return;
+ if (DEBUG) Log.d(TAG, "removeCallback " + callback);
+ mCallbacks.remove(callback);
+ }
+
+ @Override
+ public void removeCallback(VpnCallback callback) {
+ if (callback == null || mCallbacks.contains(callback)) return;
+ if (DEBUG) Log.d(TAG, "addCallback " + callback);
+ mCallbacks.add(callback);
+ }
+
+ private void fireCallbacks() {
+ for (VpnCallback callback : mCallbacks) {
+ callback.onVpnStateChanged();
+ }
+ }
+
+ private void updateState() {
+ try {
+ mVpnConfig = mConnectivityService.getVpnConfig();
+
+ // TODO: Remove once using NetworkCallback for updates.
+ mIsVpnEnabled = mVpnConfig != null;
+
+ if (mVpnConfig != null && !mVpnConfig.legacy) {
+ ApplicationInfo info =
+ mContext.getPackageManager().getApplicationInfo(mVpnConfig.user, 0);
+ mVpnName = mContext.getPackageManager().getApplicationLabel(info).toString();
+ }
+ } catch (RemoteException | NameNotFoundException e) {
+ Log.w(TAG, "Unable to get current VPN", e);
+ }
+ }
+
+ private final NetworkCallback mNetworkCallback = new NetworkCallback() {
+ public void onCapabilitiesChanged(android.net.Network network,
+ android.net.NetworkCapabilities networkCapabilities) {
+ if (DEBUG) Log.d(TAG, "onCapabilitiesChanged " + networkCapabilities);
+ mIsVpnEnabled = networkCapabilities.hasTransport(NetworkCapabilities.TRANSPORT_VPN);
+ updateState();
+ fireCallbacks();
+ }
+ };
+
+}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/TelephonyIcons.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/TelephonyIcons.java
index 67ba879..84c53ce 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/TelephonyIcons.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/TelephonyIcons.java
@@ -23,11 +23,11 @@
//GSM/UMTS
static final int[][] TELEPHONY_SIGNAL_STRENGTH = {
- { R.drawable.stat_sys_signal_0_fully,
- R.drawable.stat_sys_signal_1_fully,
- R.drawable.stat_sys_signal_2_fully,
- R.drawable.stat_sys_signal_3_fully,
- R.drawable.stat_sys_signal_4_fully },
+ { R.drawable.stat_sys_signal_0,
+ R.drawable.stat_sys_signal_1,
+ R.drawable.stat_sys_signal_2,
+ R.drawable.stat_sys_signal_3,
+ R.drawable.stat_sys_signal_4 },
{ R.drawable.stat_sys_signal_0_fully,
R.drawable.stat_sys_signal_1_fully,
R.drawable.stat_sys_signal_2_fully,
@@ -49,11 +49,11 @@
};
static final int[][] TELEPHONY_SIGNAL_STRENGTH_ROAMING = {
- { R.drawable.stat_sys_signal_0_fully,
- R.drawable.stat_sys_signal_1_fully,
- R.drawable.stat_sys_signal_2_fully,
- R.drawable.stat_sys_signal_3_fully,
- R.drawable.stat_sys_signal_4_fully },
+ { R.drawable.stat_sys_signal_0,
+ R.drawable.stat_sys_signal_1,
+ R.drawable.stat_sys_signal_2,
+ R.drawable.stat_sys_signal_3,
+ R.drawable.stat_sys_signal_4 },
{ R.drawable.stat_sys_signal_0_fully,
R.drawable.stat_sys_signal_1_fully,
R.drawable.stat_sys_signal_2_fully,
@@ -63,7 +63,7 @@
static final int[] QS_DATA_R = {
R.drawable.ic_qs_signal_r,
- R.drawable.ic_qs_signal_full_r
+ R.drawable.ic_qs_signal_r
};
static final int[][] DATA_SIGNAL_STRENGTH = TELEPHONY_SIGNAL_STRENGTH;
@@ -84,7 +84,7 @@
static final int[] QS_DATA_G = {
R.drawable.ic_qs_signal_g,
- R.drawable.ic_qs_signal_full_g
+ R.drawable.ic_qs_signal_g
};
static final int[][] DATA_3G = {
@@ -100,7 +100,7 @@
static final int[] QS_DATA_3G = {
R.drawable.ic_qs_signal_3g,
- R.drawable.ic_qs_signal_full_3g
+ R.drawable.ic_qs_signal_3g
};
static final int[][] DATA_E = {
@@ -116,7 +116,7 @@
static final int[] QS_DATA_E = {
R.drawable.ic_qs_signal_e,
- R.drawable.ic_qs_signal_full_e
+ R.drawable.ic_qs_signal_e
};
//3.5G
@@ -133,7 +133,7 @@
static final int[] QS_DATA_H = {
R.drawable.ic_qs_signal_h,
- R.drawable.ic_qs_signal_full_h
+ R.drawable.ic_qs_signal_h
};
//CDMA
@@ -151,7 +151,7 @@
static final int[] QS_DATA_1X = {
R.drawable.ic_qs_signal_1x,
- R.drawable.ic_qs_signal_full_1x
+ R.drawable.ic_qs_signal_1x
};
// LTE and eHRPD
@@ -168,7 +168,7 @@
static final int[] QS_DATA_4G = {
R.drawable.ic_qs_signal_4g,
- R.drawable.ic_qs_signal_full_4g
+ R.drawable.ic_qs_signal_4g
};
// LTE branded "LTE"
@@ -185,7 +185,7 @@
static final int[] QS_DATA_LTE = {
R.drawable.ic_qs_signal_lte,
- R.drawable.ic_qs_signal_full_lte
+ R.drawable.ic_qs_signal_lte
};
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/UserSwitcherController.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/UserSwitcherController.java
index 7c00c7f..6e3656d 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/UserSwitcherController.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/UserSwitcherController.java
@@ -32,11 +32,14 @@
import android.content.Intent;
import android.content.IntentFilter;
import android.content.pm.UserInfo;
+import android.database.ContentObserver;
import android.graphics.Bitmap;
import android.os.AsyncTask;
+import android.os.Handler;
import android.os.RemoteException;
import android.os.UserHandle;
import android.os.UserManager;
+import android.provider.Settings;
import android.util.Log;
import android.util.SparseArray;
import android.view.View;
@@ -57,12 +60,15 @@
private static final String TAG = "UserSwitcherController";
private static final boolean DEBUG = false;
+ private static final String SIMPLE_USER_SWITCHER_GLOBAL_SETTING =
+ "lockscreenSimpleUserSwitcher";
private final Context mContext;
private final UserManager mUserManager;
private final ArrayList<WeakReference<BaseUserAdapter>> mAdapters = new ArrayList<>();
private final GuestResumeSessionReceiver mGuestResumeSessionReceiver
= new GuestResumeSessionReceiver();
+ private boolean mSimpleUserSwitcher;
private ArrayList<UserRecord> mUsers = new ArrayList<>();
private Dialog mExitGuestDialog;
@@ -80,6 +86,13 @@
filter.addAction(Intent.ACTION_USER_STOPPING);
mContext.registerReceiverAsUser(mReceiver, UserHandle.OWNER, filter,
null /* permission */, null /* scheduler */);
+
+ mSimpleUserSwitcher = Settings.Global.getInt(context.getContentResolver(),
+ SIMPLE_USER_SWITCHER_GLOBAL_SETTING, 0) != 0;
+ mContext.getContentResolver().registerContentObserver(
+ Settings.Global.getUriFor(SIMPLE_USER_SWITCHER_GLOBAL_SETTING), true,
+ mSimpleUserSwitcherObserver);
+
refreshUsers(UserHandle.USER_NULL);
}
@@ -136,11 +149,13 @@
}
}
- if (guestRecord == null) {
- records.add(new UserRecord(null /* info */, null /* picture */,
- true /* isGuest */, false /* isCurrent */));
- } else {
- records.add(guestRecord);
+ if (!mSimpleUserSwitcher) {
+ if (guestRecord == null) {
+ records.add(new UserRecord(null /* info */, null /* picture */,
+ true /* isGuest */, false /* isCurrent */));
+ } else {
+ records.add(guestRecord);
+ }
}
return records;
@@ -167,6 +182,10 @@
}
}
+ public boolean isSimpleUserSwitcher() {
+ return mSimpleUserSwitcher;
+ }
+
public void switchTo(UserRecord record) {
int id;
if (record.isGuest && record.info == null) {
@@ -253,6 +272,14 @@
}
};
+ private final ContentObserver mSimpleUserSwitcherObserver = new ContentObserver(new Handler()) {
+ public void onChange(boolean selfChange) {
+ mSimpleUserSwitcher = Settings.Global.getInt(mContext.getContentResolver(),
+ SIMPLE_USER_SWITCHER_GLOBAL_SETTING, 0) != 0;
+ refreshUsers(UserHandle.USER_NULL);
+ };
+ };
+
public void dump(FileDescriptor fd, PrintWriter pw, String[] args) {
pw.println("UserSwitcherController state:");
pw.println(" mLastNonGuestUser=" + mLastNonGuestUser);
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/WifiIcons.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/WifiIcons.java
index 57ddf7a..49af979 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/WifiIcons.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/WifiIcons.java
@@ -21,11 +21,11 @@
class WifiIcons {
static final int[][] WIFI_SIGNAL_STRENGTH = {
{ R.drawable.stat_sys_wifi_signal_0,
- R.drawable.stat_sys_wifi_signal_1_fully,
- R.drawable.stat_sys_wifi_signal_2_fully,
- R.drawable.stat_sys_wifi_signal_3_fully,
- R.drawable.stat_sys_wifi_signal_4_fully },
- { R.drawable.stat_sys_wifi_signal_0,
+ R.drawable.stat_sys_wifi_signal_1,
+ R.drawable.stat_sys_wifi_signal_2,
+ R.drawable.stat_sys_wifi_signal_3,
+ R.drawable.stat_sys_wifi_signal_4 },
+ { R.drawable.stat_sys_wifi_signal_0_fully,
R.drawable.stat_sys_wifi_signal_1_fully,
R.drawable.stat_sys_wifi_signal_2_fully,
R.drawable.stat_sys_wifi_signal_3_fully,
@@ -38,7 +38,7 @@
R.drawable.ic_qs_wifi_2,
R.drawable.ic_qs_wifi_3,
R.drawable.ic_qs_wifi_4 },
- { R.drawable.ic_qs_wifi_0,
+ { R.drawable.ic_qs_wifi_full_0,
R.drawable.ic_qs_wifi_full_1,
R.drawable.ic_qs_wifi_full_2,
R.drawable.ic_qs_wifi_full_3,
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/stack/AmbientState.java b/packages/SystemUI/src/com/android/systemui/statusbar/stack/AmbientState.java
index 0582140..ddb5cb8 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/stack/AmbientState.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/stack/AmbientState.java
@@ -34,6 +34,7 @@
private int mSpeedBumpIndex = -1;
private float mScrimAmount;
private boolean mDark;
+ private boolean mHideSensitive;
public int getScrollY() {
return mScrollY;
@@ -68,6 +69,10 @@
mDark = dark;
}
+ public void setHideSensitive(boolean hideSensitive) {
+ mHideSensitive = hideSensitive;
+ }
+
/**
* In dimmed mode, a child can be activated, which happens on the first tap of the double-tap
* interaction. This child is then scaled normally and its background is fully opaque.
@@ -84,6 +89,10 @@
return mDark;
}
+ public boolean isHideSensitive() {
+ return mHideSensitive;
+ }
+
public ActivatableNotificationView getActivatedChild() {
return mActivatedChild;
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/stack/AnimationFilter.java b/packages/SystemUI/src/com/android/systemui/statusbar/stack/AnimationFilter.java
index 99d3a01..3c93b19 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/stack/AnimationFilter.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/stack/AnimationFilter.java
@@ -30,7 +30,9 @@
boolean animateTopInset;
boolean animateDimmed;
boolean animateDark;
+ boolean animateHideSensitive;
boolean hasDelays;
+ boolean hasGoToFullShadeEvent;
public AnimationFilter animateAlpha() {
animateAlpha = true;
@@ -77,6 +79,11 @@
return this;
}
+ public AnimationFilter animateHideSensitive() {
+ animateHideSensitive = true;
+ return this;
+ }
+
/**
* Combines multiple filters into {@code this} filter, using or as the operand .
*
@@ -87,6 +94,10 @@
int size = events.size();
for (int i = 0; i < size; i++) {
combineFilter(events.get(i).filter);
+ if (events.get(i).animationType ==
+ NotificationStackScrollLayout.AnimationEvent.ANIMATION_TYPE_GO_TO_FULL_SHADE) {
+ hasGoToFullShadeEvent = true;
+ }
}
}
@@ -99,6 +110,7 @@
animateTopInset |= filter.animateTopInset;
animateDimmed |= filter.animateDimmed;
animateDark |= filter.animateDark;
+ animateHideSensitive |= filter.animateHideSensitive;
hasDelays |= filter.hasDelays;
}
@@ -111,6 +123,8 @@
animateTopInset = false;
animateDimmed = false;
animateDark = false;
+ animateHideSensitive = false;
hasDelays = false;
+ hasGoToFullShadeEvent = false;
}
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/stack/NotificationStackScrollLayout.java b/packages/SystemUI/src/com/android/systemui/statusbar/stack/NotificationStackScrollLayout.java
index e0167e9..943ee21 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/stack/NotificationStackScrollLayout.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/stack/NotificationStackScrollLayout.java
@@ -43,6 +43,7 @@
import com.android.systemui.statusbar.stack.StackScrollState.ViewState;
import java.util.ArrayList;
+import java.util.HashSet;
/**
* A layout which handles a dynamic amount of notifications and presents them in a scrollable stack.
@@ -108,6 +109,7 @@
private ArrayList<View> mSnappedBackChildren = new ArrayList<View>();
private ArrayList<View> mDragAnimPendingChildren = new ArrayList<View>();
private ArrayList<View> mChildrenChangingPositions = new ArrayList<View>();
+ private HashSet<View> mFromMoreCardAdditions = new HashSet<>();
private ArrayList<AnimationEvent> mAnimationEvents
= new ArrayList<AnimationEvent>();
private ArrayList<View> mSwipedOutViews = new ArrayList<View>();
@@ -131,8 +133,10 @@
private boolean mNeedsAnimation;
private boolean mTopPaddingNeedsAnimation;
private boolean mDimmedNeedsAnimation;
+ private boolean mHideSensitiveNeedsAnimation;
private boolean mDarkNeedsAnimation;
private boolean mActivateNeedsAnimation;
+ private boolean mGoToFullShadeNeedsAnimation;
private boolean mIsExpanded = true;
private boolean mChildrenUpdateRequested;
private SpeedBumpView mSpeedBumpView;
@@ -175,6 +179,7 @@
private boolean mInterceptDelegateEnabled;
private boolean mDelegateToScrollView;
private boolean mDisallowScrollingInThisMotion;
+ private long mGoToFullShadeDelay;
private ViewTreeObserver.OnPreDrawListener mChildrenUpdater
= new ViewTreeObserver.OnPreDrawListener() {
@@ -1214,6 +1219,9 @@
count++;
}
}
+ if (mDismissView.willBeGone()) {
+ count--;
+ }
return count;
}
@@ -1450,6 +1458,7 @@
return true;
} else {
mChildrenToAddAnimated.remove(child);
+ mFromMoreCardAdditions.remove(child);
return false;
}
}
@@ -1506,7 +1515,7 @@
super.onViewAdded(child);
mStackScrollAlgorithm.notifyChildrenChanged(this);
((ExpandableView) child).setOnHeightChangedListener(this);
- generateAddAnimation(child);
+ generateAddAnimation(child, false /* fromMoreCard */);
}
public void setAnimationsEnabled(boolean animationsEnabled) {
@@ -1521,11 +1530,15 @@
* Generate an animation for an added child view.
*
* @param child The view to be added.
+ * @param fromMoreCard Whether this add is coming from the "more" card on lockscreen.
*/
- public void generateAddAnimation(View child) {
+ public void generateAddAnimation(View child, boolean fromMoreCard) {
if (mIsExpanded && mAnimationsEnabled && !mChangePositionInProgress) {
// Generate Animations
mChildrenToAddAnimated.add(child);
+ if (fromMoreCard) {
+ mFromMoreCardAdditions.add(child);
+ }
mNeedsAnimation = true;
}
}
@@ -1556,11 +1569,13 @@
mNeedsAnimation = false;
}
if (!mAnimationEvents.isEmpty() || isCurrentlyAnimating()) {
- mStateAnimator.startAnimationForEvents(mAnimationEvents, mCurrentStackScrollState);
+ mStateAnimator.startAnimationForEvents(mAnimationEvents, mCurrentStackScrollState,
+ mGoToFullShadeDelay);
mAnimationEvents.clear();
} else {
applyCurrentState();
}
+ mGoToFullShadeDelay = 0;
}
private void generateChildHierarchyEvents() {
@@ -1572,7 +1587,9 @@
generateTopPaddingEvent();
generateActivateEvent();
generateDimmedEvent();
+ generateHideSensitiveEvent();
generateDarkEvent();
+ generateGoToFullShadeEvent();
mNeedsAnimation = false;
}
@@ -1618,10 +1635,17 @@
private void generateChildAdditionEvents() {
for (View child : mChildrenToAddAnimated) {
- mAnimationEvents.add(new AnimationEvent(child,
- AnimationEvent.ANIMATION_TYPE_ADD));
+ if (mFromMoreCardAdditions.contains(child)) {
+ mAnimationEvents.add(new AnimationEvent(child,
+ AnimationEvent.ANIMATION_TYPE_ADD,
+ StackStateAnimator.ANIMATION_DURATION_STANDARD));
+ } else {
+ mAnimationEvents.add(new AnimationEvent(child,
+ AnimationEvent.ANIMATION_TYPE_ADD));
+ }
}
mChildrenToAddAnimated.clear();
+ mFromMoreCardAdditions.clear();
}
private void generateTopPaddingEvent() {
@@ -1648,6 +1672,14 @@
mDimmedNeedsAnimation = false;
}
+ private void generateHideSensitiveEvent() {
+ if (mHideSensitiveNeedsAnimation) {
+ mAnimationEvents.add(
+ new AnimationEvent(null, AnimationEvent.ANIMATION_TYPE_HIDE_SENSITIVE));
+ }
+ mHideSensitiveNeedsAnimation = false;
+ }
+
private void generateDarkEvent() {
if (mDarkNeedsAnimation) {
mAnimationEvents.add(
@@ -1656,6 +1688,14 @@
mDarkNeedsAnimation = false;
}
+ private void generateGoToFullShadeEvent() {
+ if (mGoToFullShadeNeedsAnimation) {
+ mAnimationEvents.add(
+ new AnimationEvent(null, AnimationEvent.ANIMATION_TYPE_GO_TO_FULL_SHADE));
+ }
+ mGoToFullShadeNeedsAnimation = false;
+ }
+
private boolean onInterceptTouchEventScroll(MotionEvent ev) {
if (!isScrollingEnabled()) {
return false;
@@ -1883,6 +1923,22 @@
requestChildrenUpdate();
}
+ public void setHideSensitive(boolean hideSensitive, boolean animate) {
+ if (hideSensitive != mAmbientState.isHideSensitive()) {
+ int childCount = getChildCount();
+ for (int i = 0; i < childCount; i++) {
+ ExpandableView v = (ExpandableView) getChildAt(i);
+ v.setHideSensitiveForIntrinsicHeight(hideSensitive);
+ }
+ mAmbientState.setHideSensitive(hideSensitive);
+ if (animate && mAnimationsEnabled) {
+ mHideSensitiveNeedsAnimation = true;
+ mNeedsAnimation = true;
+ }
+ requestChildrenUpdate();
+ }
+ }
+
/**
* See {@link AmbientState#setActivatedChild}.
*/
@@ -1919,19 +1975,20 @@
if (visible) {
// Make invisible to ensure that the appear animation is played.
mSpeedBumpView.setInvisible();
- if (!mIsExpansionChanging) {
- generateAddAnimation(mSpeedBumpView);
- }
} else {
- mSpeedBumpView.performVisibilityAnimation(false);
+ // TODO: This doesn't really work, because the view is already set to GONE above.
generateRemoveAnimation(mSpeedBumpView);
}
}
}
- public void goToFullShade() {
+ public void goToFullShade(long delay) {
updateSpeedBump(true /* visibility */);
mDismissView.setInvisible();
+ mGoToFullShadeNeedsAnimation = true;
+ mGoToFullShadeDelay = delay;
+ mNeedsAnimation = true;
+ requestChildrenUpdate();
}
public void cancelExpandHelper() {
@@ -2104,7 +2161,8 @@
// ANIMATION_TYPE_SNAP_BACK
new AnimationFilter()
- .animateAlpha(),
+ .animateAlpha()
+ .animateHeight(),
// ANIMATION_TYPE_ACTIVATED_CHILD
new AnimationFilter()
@@ -2128,6 +2186,21 @@
// ANIMATION_TYPE_DARK
new AnimationFilter()
.animateDark(),
+
+ // ANIMATION_TYPE_GO_TO_FULL_SHADE
+ new AnimationFilter()
+ .animateAlpha()
+ .animateHeight()
+ .animateTopInset()
+ .animateY()
+ .animateDimmed()
+ .animateScale()
+ .animateZ()
+ .hasDelays(),
+
+ // ANIMATION_TYPE_HIDE_SENSITIVE
+ new AnimationFilter()
+ .animateHideSensitive(),
};
static int[] LENGTHS = new int[] {
@@ -2161,6 +2234,12 @@
// ANIMATION_TYPE_DARK
StackStateAnimator.ANIMATION_DURATION_STANDARD,
+
+ // ANIMATION_TYPE_GO_TO_FULL_SHADE
+ StackStateAnimator.ANIMATION_DURATION_GO_TO_FULL_SHADE,
+
+ // ANIMATION_TYPE_HIDE_SENSITIVE
+ StackStateAnimator.ANIMATION_DURATION_STANDARD,
};
static final int ANIMATION_TYPE_ADD = 0;
@@ -2173,6 +2252,8 @@
static final int ANIMATION_TYPE_DIMMED = 7;
static final int ANIMATION_TYPE_CHANGE_POSITION = 8;
static final int ANIMATION_TYPE_DARK = 9;
+ static final int ANIMATION_TYPE_GO_TO_FULL_SHADE = 10;
+ static final int ANIMATION_TYPE_HIDE_SENSITIVE = 11;
final long eventStartTime;
final View changingView;
@@ -2182,24 +2263,33 @@
View viewAfterChangingView;
AnimationEvent(View view, int type) {
+ this(view, type, LENGTHS[type]);
+ }
+
+ AnimationEvent(View view, int type, long length) {
eventStartTime = AnimationUtils.currentAnimationTimeMillis();
changingView = view;
animationType = type;
filter = FILTERS[type];
- length = LENGTHS[type];
+ this.length = length;
}
/**
* Combines the length of several animation events into a single value.
*
* @param events The events of the lengths to combine.
- * @return The combined length. This is just the maximum of all length.
+ * @return The combined length. Depending on the event types, this might be the maximum of
+ * all events or the length of a specific event.
*/
static long combineLength(ArrayList<AnimationEvent> events) {
long length = 0;
int size = events.size();
for (int i = 0; i < size; i++) {
- length = Math.max(length, events.get(i).length);
+ AnimationEvent event = events.get(i);
+ length = Math.max(length, event.length);
+ if (event.animationType == ANIMATION_TYPE_GO_TO_FULL_SHADE) {
+ return event.length;
+ }
}
return length;
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/stack/StackScrollAlgorithm.java b/packages/SystemUI/src/com/android/systemui/statusbar/stack/StackScrollAlgorithm.java
index fe2733b..ba3f339 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/stack/StackScrollAlgorithm.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/stack/StackScrollAlgorithm.java
@@ -159,7 +159,7 @@
updateZValuesForState(resultState, algorithmState);
handleDraggedViews(ambientState, resultState, algorithmState);
- updateDimmedActivated(ambientState, resultState, algorithmState);
+ updateDimmedActivatedHideSensitive(ambientState, resultState, algorithmState);
updateClipping(resultState, algorithmState);
updateScrimAmount(resultState, algorithmState, ambientState.getScrimAmount());
updateSpeedBumpState(resultState, algorithmState, ambientState.getSpeedBumpIndex());
@@ -251,12 +251,13 @@
}
/**
- * Updates the dimmed and activated states of the children.
+ * Updates the dimmed, activated and hiding sensitive states of the children.
*/
- private void updateDimmedActivated(AmbientState ambientState, StackScrollState resultState,
- StackScrollAlgorithmState algorithmState) {
+ private void updateDimmedActivatedHideSensitive(AmbientState ambientState,
+ StackScrollState resultState, StackScrollAlgorithmState algorithmState) {
boolean dimmed = ambientState.isDimmed();
boolean dark = ambientState.isDark();
+ boolean hideSensitive = ambientState.isHideSensitive();
View activatedChild = ambientState.getActivatedChild();
int childCount = algorithmState.visibleChildren.size();
for (int i = 0; i < childCount; i++) {
@@ -264,6 +265,7 @@
StackScrollState.ViewState childViewState = resultState.getViewStateForView(child);
childViewState.dimmed = dimmed;
childViewState.dark = dark;
+ childViewState.hideSensitive = hideSensitive;
boolean isActivatedChild = activatedChild == child;
childViewState.scale = !dimmed || isActivatedChild
? 1.0f
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/stack/StackScrollState.java b/packages/SystemUI/src/com/android/systemui/statusbar/stack/StackScrollState.java
index 7b90a351..a174952 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/stack/StackScrollState.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/stack/StackScrollState.java
@@ -157,6 +157,10 @@
// apply dark
child.setDark(state.dark, false /* animate */);
+ // apply hiding sensitive
+ child.setHideSensitive(
+ state.hideSensitive, false /* animated */, 0 /* delay */, 0 /* duration */);
+
// apply speed bump state
child.setBelowSpeedBump(state.belowSpeedBump);
@@ -171,8 +175,7 @@
updateChildClip(child, newHeight, state.topOverLap);
if(child instanceof SpeedBumpView) {
- float lineEnd = newYTranslation + newHeight / 2;
- performSpeedBumpAnimation(i, (SpeedBumpView) child, lineEnd);
+ performSpeedBumpAnimation(i, (SpeedBumpView) child, state, 0);
} else if (child instanceof DismissView) {
DismissView dismissView = (DismissView) child;
boolean visible = state.topOverLap < mClearAllTopPadding;
@@ -197,12 +200,14 @@
child.setClipBounds(mClipRect);
}
- private void performSpeedBumpAnimation(int i, SpeedBumpView speedBump, float speedBumpEnd) {
+ public void performSpeedBumpAnimation(int i, SpeedBumpView speedBump, ViewState state,
+ long delay) {
View nextChild = getNextChildNotGone(i);
if (nextChild != null) {
+ float lineEnd = state.yTranslation + state.height / 2;
ViewState nextState = getViewStateForView(nextChild);
- boolean startIsAboveNext = nextState.yTranslation > speedBumpEnd;
- speedBump.animateDivider(startIsAboveNext, null /* onFinishedRunnable */);
+ boolean startIsAboveNext = nextState.yTranslation > lineEnd;
+ speedBump.animateDivider(startIsAboveNext, delay, null /* onFinishedRunnable */);
}
}
@@ -237,6 +242,7 @@
float scale;
boolean dimmed;
boolean dark;
+ boolean hideSensitive;
boolean belowSpeedBump;
/**
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/stack/StackStateAnimator.java b/packages/SystemUI/src/com/android/systemui/statusbar/stack/StackStateAnimator.java
index 71524ec..afd7216 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/stack/StackStateAnimator.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/stack/StackStateAnimator.java
@@ -27,6 +27,7 @@
import com.android.systemui.R;
import com.android.systemui.statusbar.ExpandableView;
+import com.android.systemui.statusbar.SpeedBumpView;
import java.util.ArrayList;
import java.util.HashSet;
@@ -39,10 +40,12 @@
public class StackStateAnimator {
public static final int ANIMATION_DURATION_STANDARD = 360;
+ public static final int ANIMATION_DURATION_GO_TO_FULL_SHADE = 448;
public static final int ANIMATION_DURATION_APPEAR_DISAPPEAR = 464;
public static final int ANIMATION_DURATION_DIMMED_ACTIVATED = 220;
public static final int ANIMATION_DELAY_PER_ELEMENT_INTERRUPTING = 80;
public static final int ANIMATION_DELAY_PER_ELEMENT_MANUAL = 32;
+ public static final int ANIMATION_DELAY_PER_ELEMENT_GO_TO_FULL_SHADE = 48;
private static final int DELAY_EFFECT_MAX_INDEX_DIFFERENCE = 2;
private static final int TAG_ANIMATOR_TRANSLATION_Y = R.id.translation_y_animator_tag;
@@ -65,15 +68,19 @@
private static final int TAG_START_TOP_INSET = R.id.top_inset_animator_start_value_tag;
private final Interpolator mFastOutSlowInInterpolator;
+ private final int mGoToFullShadeAppearingTranslation;
public NotificationStackScrollLayout mHostLayout;
private ArrayList<NotificationStackScrollLayout.AnimationEvent> mNewEvents =
new ArrayList<>();
private ArrayList<View> mNewAddChildren = new ArrayList<>();
- private Set<Animator> mAnimatorSet = new HashSet<Animator>();
- private Stack<AnimatorListenerAdapter> mAnimationListenerPool
- = new Stack<AnimatorListenerAdapter>();
+ private Set<Animator> mAnimatorSet = new HashSet<>();
+ private Stack<AnimatorListenerAdapter> mAnimationListenerPool = new Stack<>();
private AnimationFilter mAnimationFilter = new AnimationFilter();
private long mCurrentLength;
+ private long mCurrentAdditionalDelay;
+
+ /** The current index for the last child which was not added in this event set. */
+ private int mCurrentLastNotAddedIndex;
private ValueAnimator mTopOverScrollAnimator;
private ValueAnimator mBottomOverScrollAnimator;
@@ -82,6 +89,9 @@
mHostLayout = hostLayout;
mFastOutSlowInInterpolator = AnimationUtils.loadInterpolator(hostLayout.getContext(),
android.R.interpolator.fast_out_slow_in);
+ mGoToFullShadeAppearingTranslation =
+ hostLayout.getContext().getResources().getDimensionPixelSize(
+ R.dimen.go_to_full_shade_appearing_translation);
}
public boolean isRunning() {
@@ -90,13 +100,15 @@
public void startAnimationForEvents(
ArrayList<NotificationStackScrollLayout.AnimationEvent> mAnimationEvents,
- StackScrollState finalState) {
+ StackScrollState finalState, long additionalDelay) {
processAnimationEvents(mAnimationEvents, finalState);
int childCount = mHostLayout.getChildCount();
mAnimationFilter.applyCombination(mNewEvents);
+ mCurrentAdditionalDelay = additionalDelay;
mCurrentLength = NotificationStackScrollLayout.AnimationEvent.combineLength(mNewEvents);
+ mCurrentLastNotAddedIndex = findLastNotAddedIndex(finalState);
for (int i = 0; i < childCount; i++) {
final ExpandableView child = (ExpandableView) mHostLayout.getChildAt(i);
@@ -106,7 +118,7 @@
}
child.setClipBounds(null);
- startAnimations(child, viewState, finalState);
+ startAnimations(child, viewState, finalState, i);
}
if (!isRunning()) {
// no child has preformed any animation, lets finish
@@ -116,11 +128,27 @@
mNewAddChildren.clear();
}
+ private int findLastNotAddedIndex(StackScrollState finalState) {
+ int childCount = mHostLayout.getChildCount();
+ for (int i = childCount - 1; i >= 0; i--) {
+ final ExpandableView child = (ExpandableView) mHostLayout.getChildAt(i);
+
+ StackScrollState.ViewState viewState = finalState.getViewStateForView(child);
+ if (viewState == null || child.getVisibility() == View.GONE) {
+ continue;
+ }
+ if (!mNewAddChildren.contains(child)) {
+ return viewState.notGoneIndex;
+ }
+ }
+ return -1;
+ }
+
/**
* Start an animation to the given viewState
*/
private void startAnimations(final ExpandableView child, StackScrollState.ViewState viewState,
- StackScrollState finalState) {
+ StackScrollState finalState, int i) {
int childVisibility = child.getVisibility();
boolean wasVisible = childVisibility == View.VISIBLE;
final float alpha = viewState.alpha;
@@ -139,38 +167,48 @@
boolean isDelayRelevant = yTranslationChanging || zTranslationChanging || scaleChanging ||
alphaChanging || heightChanging || topInsetChanging;
long delay = 0;
+ long duration = mCurrentLength;
if (hasDelays && isDelayRelevant || wasAdded) {
- delay = calculateChildAnimationDelay(viewState, finalState);
+ delay = mCurrentAdditionalDelay + calculateChildAnimationDelay(viewState, finalState);
+ }
+
+ if (wasAdded && mAnimationFilter.hasGoToFullShadeEvent) {
+ child.setTranslationY(child.getTranslationY() + mGoToFullShadeAppearingTranslation);
+ yTranslationChanging = true;
+ float longerDurationFactor = viewState.notGoneIndex - mCurrentLastNotAddedIndex;
+ longerDurationFactor = (float) Math.pow(longerDurationFactor, 0.7f);
+ duration = ANIMATION_DURATION_APPEAR_DISAPPEAR + 50 +
+ (long) (100 * longerDurationFactor);
}
// start translationY animation
if (yTranslationChanging) {
- startYTranslationAnimation(child, viewState, delay);
+ startYTranslationAnimation(child, viewState, duration, delay);
}
// start translationZ animation
if (zTranslationChanging) {
- startZTranslationAnimation(child, viewState, delay);
+ startZTranslationAnimation(child, viewState, duration, delay);
}
// start scale animation
if (scaleChanging) {
- startScaleAnimation(child, viewState);
+ startScaleAnimation(child, viewState, duration);
}
// start alpha animation
if (alphaChanging && child.getTranslationX() == 0) {
- startAlphaAnimation(child, viewState, delay);
+ startAlphaAnimation(child, viewState, duration, delay);
}
// start height animation
if (heightChanging) {
- startHeightAnimation(child, viewState, delay);
+ startHeightAnimation(child, viewState, duration, delay);
}
// start top inset animation
if (topInsetChanging) {
- startInsetAnimation(child, viewState, delay);
+ startInsetAnimation(child, viewState, duration, delay);
}
// start dimmed animation
@@ -182,16 +220,27 @@
// apply speed bump state
child.setBelowSpeedBump(viewState.belowSpeedBump);
+ // start hiding sensitive animation
+ child.setHideSensitive(viewState.hideSensitive,
+ mAnimationFilter.animateHideSensitive && !wasAdded, delay, duration);
+
// apply scrimming
child.setScrimAmount(viewState.scrimAmount);
if (wasAdded) {
- child.performAddAnimation(delay);
+ child.performAddAnimation(delay, mCurrentLength);
+ }
+ if (child instanceof SpeedBumpView) {
+ finalState.performSpeedBumpAnimation(i, (SpeedBumpView) child, viewState,
+ delay + duration);
}
}
private long calculateChildAnimationDelay(StackScrollState.ViewState viewState,
StackScrollState finalState) {
+ if (mAnimationFilter.hasGoToFullShadeEvent) {
+ return calculateDelayGoToFullShade(viewState);
+ }
long minDelay = 0;
for (NotificationStackScrollLayout.AnimationEvent event : mNewEvents) {
long delayPerElement = ANIMATION_DELAY_PER_ELEMENT_INTERRUPTING;
@@ -236,8 +285,14 @@
return minDelay;
}
+ private long calculateDelayGoToFullShade(StackScrollState.ViewState viewState) {
+ float index = viewState.notGoneIndex;
+ index = (float) Math.pow(index, 0.7f);
+ return (long) (index * ANIMATION_DELAY_PER_ELEMENT_GO_TO_FULL_SHADE);
+ }
+
private void startHeightAnimation(final ExpandableView child,
- StackScrollState.ViewState viewState, long delay) {
+ StackScrollState.ViewState viewState, long duration, long delay) {
Integer previousStartValue = getChildTag(child, TAG_START_HEIGHT);
Integer previousEndValue = getChildTag(child, TAG_END_HEIGHT);
int newEndValue = viewState.height;
@@ -274,7 +329,7 @@
}
});
animator.setInterpolator(mFastOutSlowInInterpolator);
- long newDuration = cancelAnimatorAndGetNewDuration(previousAnimator);
+ long newDuration = cancelAnimatorAndGetNewDuration(duration, previousAnimator);
animator.setDuration(newDuration);
if (delay > 0 && (previousAnimator == null || !previousAnimator.isRunning())) {
animator.setStartDelay(delay);
@@ -296,7 +351,7 @@
}
private void startInsetAnimation(final ExpandableView child,
- StackScrollState.ViewState viewState, long delay) {
+ StackScrollState.ViewState viewState, long duration, long delay) {
Integer previousStartValue = getChildTag(child, TAG_START_TOP_INSET);
Integer previousEndValue = getChildTag(child, TAG_END_TOP_INSET);
int newEndValue = viewState.clipTopAmount;
@@ -332,7 +387,7 @@
}
});
animator.setInterpolator(mFastOutSlowInInterpolator);
- long newDuration = cancelAnimatorAndGetNewDuration(previousAnimator);
+ long newDuration = cancelAnimatorAndGetNewDuration(duration, previousAnimator);
animator.setDuration(newDuration);
if (delay > 0 && (previousAnimator == null || !previousAnimator.isRunning())) {
animator.setStartDelay(delay);
@@ -354,7 +409,7 @@
}
private void startAlphaAnimation(final ExpandableView child,
- final StackScrollState.ViewState viewState, long delay) {
+ final StackScrollState.ViewState viewState, long duration, long delay) {
Float previousStartValue = getChildTag(child,TAG_START_ALPHA);
Float previousEndValue = getChildTag(child,TAG_END_ALPHA);
final float newEndValue = viewState.alpha;
@@ -413,7 +468,7 @@
mWasCancelled = false;
}
});
- long newDuration = cancelAnimatorAndGetNewDuration(previousAnimator);
+ long newDuration = cancelAnimatorAndGetNewDuration(duration, previousAnimator);
animator.setDuration(newDuration);
if (delay > 0 && (previousAnimator == null || !previousAnimator.isRunning())) {
animator.setStartDelay(delay);
@@ -433,7 +488,7 @@
}
private void startZTranslationAnimation(final ExpandableView child,
- final StackScrollState.ViewState viewState, long delay) {
+ final StackScrollState.ViewState viewState, long duration, long delay) {
Float previousStartValue = getChildTag(child,TAG_START_TRANSLATION_Z);
Float previousEndValue = getChildTag(child,TAG_END_TRANSLATION_Z);
float newEndValue = viewState.zTranslation;
@@ -463,7 +518,7 @@
ObjectAnimator animator = ObjectAnimator.ofFloat(child, View.TRANSLATION_Z,
child.getTranslationZ(), newEndValue);
animator.setInterpolator(mFastOutSlowInInterpolator);
- long newDuration = cancelAnimatorAndGetNewDuration(previousAnimator);
+ long newDuration = cancelAnimatorAndGetNewDuration(duration, previousAnimator);
animator.setDuration(newDuration);
if (delay > 0 && (previousAnimator == null || !previousAnimator.isRunning())) {
animator.setStartDelay(delay);
@@ -485,7 +540,7 @@
}
private void startYTranslationAnimation(final ExpandableView child,
- StackScrollState.ViewState viewState, long delay) {
+ StackScrollState.ViewState viewState, long duration, long delay) {
Float previousStartValue = getChildTag(child,TAG_START_TRANSLATION_Y);
Float previousEndValue = getChildTag(child,TAG_END_TRANSLATION_Y);
float newEndValue = viewState.yTranslation;
@@ -516,7 +571,7 @@
ObjectAnimator animator = ObjectAnimator.ofFloat(child, View.TRANSLATION_Y,
child.getTranslationY(), newEndValue);
animator.setInterpolator(mFastOutSlowInInterpolator);
- long newDuration = cancelAnimatorAndGetNewDuration(previousAnimator);
+ long newDuration = cancelAnimatorAndGetNewDuration(duration, previousAnimator);
animator.setDuration(newDuration);
if (delay > 0 && (previousAnimator == null || !previousAnimator.isRunning())) {
animator.setStartDelay(delay);
@@ -538,7 +593,7 @@
}
private void startScaleAnimation(final ExpandableView child,
- StackScrollState.ViewState viewState) {
+ StackScrollState.ViewState viewState, long duration) {
Float previousStartValue = getChildTag(child, TAG_START_SCALE);
Float previousEndValue = getChildTag(child, TAG_END_SCALE);
float newEndValue = viewState.scale;
@@ -573,7 +628,7 @@
PropertyValuesHolder.ofFloat(View.SCALE_Y, child.getScaleY(), newEndValue);
ObjectAnimator animator = ObjectAnimator.ofPropertyValuesHolder(child, holderX, holderY);
animator.setInterpolator(mFastOutSlowInInterpolator);
- long newDuration = cancelAnimatorAndGetNewDuration(previousAnimator);
+ long newDuration = cancelAnimatorAndGetNewDuration(duration, previousAnimator);
animator.setDuration(newDuration);
animator.addListener(getGlobalAnimationFinishedListener());
// remove the tag when the animation is finished
@@ -637,11 +692,12 @@
/**
* Cancel the previous animator and get the duration of the new animation.
*
+ * @param duration the new duration
* @param previousAnimator the animator which was running before
* @return the new duration
*/
- private long cancelAnimatorAndGetNewDuration(ValueAnimator previousAnimator) {
- long newDuration = mCurrentLength;
+ private long cancelAnimatorAndGetNewDuration(long duration, ValueAnimator previousAnimator) {
+ long newDuration = duration;
if (previousAnimator != null) {
// We take either the desired length of the new animation or the remaining time of
// the previous animator, whichever is longer.
@@ -710,7 +766,8 @@
translationDirection = Math.max(Math.min(translationDirection, 1.0f),-1.0f);
}
- changingView.performRemoveAnimation(translationDirection, new Runnable() {
+ changingView.performRemoveAnimation(ANIMATION_DURATION_APPEAR_DISAPPEAR,
+ translationDirection, new Runnable() {
@Override
public void run() {
// remove the temporary overlay
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/tv/TvStatusBar.java b/packages/SystemUI/src/com/android/systemui/statusbar/tv/TvStatusBar.java
index a123bf7..049add5 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/tv/TvStatusBar.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/tv/TvStatusBar.java
@@ -99,6 +99,14 @@
public void buzzBeepBlinked() {
}
+ @Override // CommandQueue
+ public void notificationLightOff() {
+ }
+
+ @Override // CommandQueue
+ public void notificationLightPulse(int argb, int onMillis, int offMillis) {
+ }
+
@Override
protected WindowManager.LayoutParams getSearchLayoutParams(
LayoutParams layoutParams) {
diff --git a/packages/SystemUI/src/com/android/systemui/volume/VolumePanel.java b/packages/SystemUI/src/com/android/systemui/volume/VolumePanel.java
index 149d09a..984a5f4 100644
--- a/packages/SystemUI/src/com/android/systemui/volume/VolumePanel.java
+++ b/packages/SystemUI/src/com/android/systemui/volume/VolumePanel.java
@@ -45,6 +45,7 @@
import android.util.Log;
import android.util.SparseArray;
import android.view.Gravity;
+import android.view.KeyEvent;
import android.view.LayoutInflater;
import android.view.MotionEvent;
import android.view.View;
@@ -249,6 +250,8 @@
private final VolumePanel mVolumePanel;
private final AudioManager mAudioManager;
+ private boolean mNewVolumeUp;
+
SafetyWarning(Context context, VolumePanel volumePanel, AudioManager audioManager) {
super(context);
mContext = context;
@@ -267,6 +270,24 @@
}
@Override
+ public boolean onKeyDown(int keyCode, KeyEvent event) {
+ if (keyCode == KeyEvent.KEYCODE_VOLUME_UP && event.getRepeatCount() == 0) {
+ mNewVolumeUp = true;
+ }
+ return super.onKeyDown(keyCode, event);
+ }
+
+ @Override
+ public boolean onKeyUp(int keyCode, KeyEvent event) {
+ if (keyCode == KeyEvent.KEYCODE_VOLUME_UP && mNewVolumeUp) {
+ if (LOGD) Log.d(TAG, "Confirmed warning via VOLUME_UP");
+ mAudioManager.disableSafeMediaVolume();
+ dismiss();
+ }
+ return super.onKeyUp(keyCode, event);
+ }
+
+ @Override
public void onClick(DialogInterface dialog, int which) {
mAudioManager.disableSafeMediaVolume();
}
diff --git a/policy/src/com/android/internal/policy/impl/PhoneWindow.java b/policy/src/com/android/internal/policy/impl/PhoneWindow.java
index fdc91a4..ff3cd9d 100644
--- a/policy/src/com/android/internal/policy/impl/PhoneWindow.java
+++ b/policy/src/com/android/internal/policy/impl/PhoneWindow.java
@@ -50,7 +50,6 @@
import android.graphics.drawable.Drawable;
import android.media.AudioManager;
import android.media.session.MediaController;
-import android.media.session.MediaSession;
import android.media.session.MediaSessionLegacyHelper;
import android.net.Uri;
import android.os.Bundle;
@@ -63,6 +62,7 @@
import android.transition.Transition;
import android.transition.TransitionInflater;
import android.transition.TransitionManager;
+import android.transition.TransitionSet;
import android.util.AndroidRuntimeException;
import android.util.DisplayMetrics;
import android.util.EventLog;
@@ -126,6 +126,8 @@
(1 << FEATURE_CONTENT_TRANSITIONS) |
(1 << FEATURE_ACTION_MODE_OVERLAY);
+ private static final Transition USE_DEFAULT_TRANSITION = new TransitionSet();
+
/**
* Simple callback used by the context menu and its submenus. The options
* menu submenus do not use this (their behavior is more complex).
@@ -254,10 +256,14 @@
}
};
- private Transition mEnterTransition;
- private Transition mExitTransition;
- private Transition mSharedElementEnterTransition;
- private Transition mSharedElementExitTransition;
+ private Transition mEnterTransition = null;
+ private Transition mReturnTransition = USE_DEFAULT_TRANSITION;
+ private Transition mExitTransition = null;
+ private Transition mReenterTransition = USE_DEFAULT_TRANSITION;
+ private Transition mSharedElementEnterTransition = null;
+ private Transition mSharedElementReturnTransition = USE_DEFAULT_TRANSITION;
+ private Transition mSharedElementExitTransition = null;
+ private Transition mSharedElementReenterTransition = USE_DEFAULT_TRANSITION;
private Boolean mAllowExitTransitionOverlap;
private Boolean mAllowEnterTransitionOverlap;
private long mBackgroundFadeDurationMillis = -1;
@@ -3513,40 +3519,47 @@
}
}
- mEnterTransition = getTransition(mEnterTransition,
+ mEnterTransition = getTransition(mEnterTransition, null,
R.styleable.Window_windowEnterTransition);
- mExitTransition = getTransition(mExitTransition,
+ mReturnTransition = getTransition(mReturnTransition, USE_DEFAULT_TRANSITION,
+ R.styleable.Window_windowReturnTransition);
+ mExitTransition = getTransition(mExitTransition, null,
R.styleable.Window_windowExitTransition);
- mSharedElementEnterTransition = getTransition(mSharedElementEnterTransition,
+ mReenterTransition = getTransition(mReenterTransition, USE_DEFAULT_TRANSITION,
+ R.styleable.Window_windowReenterTransition);
+ mSharedElementEnterTransition = getTransition(mSharedElementEnterTransition, null,
R.styleable.Window_windowSharedElementEnterTransition);
- mSharedElementExitTransition = getTransition(mSharedElementExitTransition,
+ mSharedElementReturnTransition = getTransition(mSharedElementReturnTransition,
+ USE_DEFAULT_TRANSITION,
+ R.styleable.Window_windowSharedElementReturnTransition);
+ mSharedElementExitTransition = getTransition(mSharedElementExitTransition, null,
R.styleable.Window_windowSharedElementExitTransition);
+ mSharedElementReenterTransition = getTransition(mSharedElementReenterTransition,
+ USE_DEFAULT_TRANSITION,
+ R.styleable.Window_windowSharedElementReenterTransition);
if (mAllowEnterTransitionOverlap == null) {
mAllowEnterTransitionOverlap = getWindowStyle().getBoolean(
- R.styleable.
- Window_windowAllowEnterTransitionOverlap, true);
+ R.styleable.Window_windowAllowEnterTransitionOverlap, true);
}
if (mAllowExitTransitionOverlap == null) {
mAllowExitTransitionOverlap = getWindowStyle().getBoolean(
- R.styleable.
- Window_windowAllowExitTransitionOverlap, true);
+ R.styleable.Window_windowAllowExitTransitionOverlap, true);
}
if (mBackgroundFadeDurationMillis < 0) {
mBackgroundFadeDurationMillis = getWindowStyle().getInteger(
- R.styleable.
- Window_windowTransitionBackgroundFadeDuration,
+ R.styleable.Window_windowTransitionBackgroundFadeDuration,
DEFAULT_BACKGROUND_FADE_DURATION_MS);
}
}
}
}
- private Transition getTransition(Transition currentValue, int id) {
- if (currentValue != null) {
+ private Transition getTransition(Transition currentValue, Transition defaultValue, int id) {
+ if (currentValue != defaultValue) {
return currentValue;
}
int transitionId = getWindowStyle().getResourceId(id, -1);
- Transition transition = null;
+ Transition transition = defaultValue;
if (transitionId != -1 && transitionId != R.transition.no_transition) {
TransitionInflater inflater = TransitionInflater.from(getContext());
transition = inflater.inflateTransition(transitionId);
@@ -3899,41 +3912,85 @@
}
@Override
+ public void setReturnTransition(Transition transition) {
+ mReturnTransition = transition;
+ }
+
+ @Override
public void setExitTransition(Transition exitTransition) {
mExitTransition = exitTransition;
}
@Override
+ public void setReenterTransition(Transition transition) {
+ mReenterTransition = transition;
+ }
+
+ @Override
public void setSharedElementEnterTransition(Transition sharedElementEnterTransition) {
mSharedElementEnterTransition = sharedElementEnterTransition;
}
@Override
+ public void setSharedElementReturnTransition(Transition transition) {
+ mSharedElementReturnTransition = transition;
+ }
+
+ @Override
public void setSharedElementExitTransition(Transition sharedElementExitTransition) {
mSharedElementExitTransition = sharedElementExitTransition;
}
@Override
+ public void setSharedElementReenterTransition(Transition transition) {
+ mSharedElementReenterTransition = transition;
+ }
+
+ @Override
public Transition getEnterTransition() {
return mEnterTransition;
}
@Override
+ public Transition getReturnTransition() {
+ return mReturnTransition == USE_DEFAULT_TRANSITION ? getEnterTransition()
+ : mReturnTransition;
+ }
+
+ @Override
public Transition getExitTransition() {
return mExitTransition;
}
@Override
+ public Transition getReenterTransition() {
+ return mReenterTransition == USE_DEFAULT_TRANSITION ? getExitTransition()
+ : mReenterTransition;
+ }
+
+ @Override
public Transition getSharedElementEnterTransition() {
return mSharedElementEnterTransition;
}
@Override
+ public Transition getSharedElementReturnTransition() {
+ return mSharedElementReturnTransition == USE_DEFAULT_TRANSITION
+ ? getSharedElementEnterTransition() : mSharedElementReturnTransition;
+ }
+
+ @Override
public Transition getSharedElementExitTransition() {
return mSharedElementExitTransition;
}
@Override
+ public Transition getSharedElementReenterTransition() {
+ return mSharedElementReenterTransition == USE_DEFAULT_TRANSITION
+ ? getSharedElementExitTransition() : mSharedElementReenterTransition;
+ }
+
+ @Override
public void setAllowEnterTransitionOverlap(boolean allow) {
mAllowEnterTransitionOverlap = allow;
}
diff --git a/services/core/java/com/android/server/ConnectivityService.java b/services/core/java/com/android/server/ConnectivityService.java
index 7aa69fd..a00fbf3 100644
--- a/services/core/java/com/android/server/ConnectivityService.java
+++ b/services/core/java/com/android/server/ConnectivityService.java
@@ -465,6 +465,11 @@
* changes.
*/
private class LegacyTypeTracker {
+
+ private static final boolean DBG = true;
+ private static final boolean VDBG = false;
+ private static final String TAG = "CSLegacyTypeTracker";
+
/**
* Array of lists, one per legacy network type (e.g., TYPE_MOBILE_MMS).
* Each list holds references to all NetworkAgentInfos that are used to
@@ -508,6 +513,15 @@
}
}
+ private void maybeLogBroadcast(NetworkAgentInfo nai, boolean connected, int type) {
+ if (DBG) {
+ log("Sending " + (connected ? "connected" : "disconnected") +
+ " broadcast for type " + type + " " + nai.name() +
+ " isDefaultNetwork=" + isDefaultNetwork(nai));
+ }
+ }
+
+ /** Adds the given network to the specified legacy type list. */
public void add(int type, NetworkAgentInfo nai) {
if (!isTypeSupported(type)) {
return; // Invalid network type.
@@ -521,41 +535,72 @@
}
if (list.isEmpty() || isDefaultNetwork(nai)) {
- if (VDBG) log("Sending connected broadcast for type " + type +
- "isDefaultNetwork=" + isDefaultNetwork(nai));
+ maybeLogBroadcast(nai, true, type);
sendLegacyNetworkBroadcast(nai, true, type);
}
list.add(nai);
}
+ /** Removes the given network from the specified legacy type list. */
+ public void remove(int type, NetworkAgentInfo nai) {
+ ArrayList<NetworkAgentInfo> list = mTypeLists[type];
+ if (list == null || list.isEmpty()) {
+ return;
+ }
+
+ boolean wasFirstNetwork = list.get(0).equals(nai);
+
+ if (!list.remove(nai)) {
+ return;
+ }
+
+ if (wasFirstNetwork || isDefaultNetwork(nai)) {
+ maybeLogBroadcast(nai, false, type);
+ sendLegacyNetworkBroadcast(nai, false, type);
+ }
+
+ if (!list.isEmpty() && wasFirstNetwork) {
+ if (DBG) log("Other network available for type " + type +
+ ", sending connected broadcast");
+ maybeLogBroadcast(list.get(0), false, type);
+ sendLegacyNetworkBroadcast(list.get(0), false, type);
+ }
+ }
+
+ /** Removes the given network from all legacy type lists. */
public void remove(NetworkAgentInfo nai) {
if (VDBG) log("Removing agent " + nai);
for (int type = 0; type < mTypeLists.length; type++) {
- ArrayList<NetworkAgentInfo> list = mTypeLists[type];
- if (list == null || list.isEmpty()) {
- continue;
- }
-
- boolean wasFirstNetwork = false;
- if (list.get(0).equals(nai)) {
- // This network was the first in the list. Send broadcast.
- wasFirstNetwork = true;
- }
- list.remove(nai);
-
- if (wasFirstNetwork || isDefaultNetwork(nai)) {
- if (VDBG) log("Sending disconnected broadcast for type " + type +
- "isDefaultNetwork=" + isDefaultNetwork(nai));
- sendLegacyNetworkBroadcast(nai, false, type);
- }
-
- if (!list.isEmpty() && wasFirstNetwork) {
- if (VDBG) log("Other network available for type " + type +
- ", sending connected broadcast");
- sendLegacyNetworkBroadcast(list.get(0), false, type);
- }
+ remove(type, nai);
}
}
+
+ private String naiToString(NetworkAgentInfo nai) {
+ String name = (nai != null) ? nai.name() : "null";
+ String state = (nai.networkInfo != null) ?
+ nai.networkInfo.getState() + "/" + nai.networkInfo.getDetailedState() :
+ "???/???";
+ return name + " " + state;
+ }
+
+ public void dump(IndentingPrintWriter pw) {
+ for (int type = 0; type < mTypeLists.length; type++) {
+ if (mTypeLists[type] == null) continue;
+ pw.print(type + " ");
+ pw.increaseIndent();
+ if (mTypeLists[type].size() == 0) pw.println("none");
+ for (NetworkAgentInfo nai : mTypeLists[type]) {
+ pw.println(naiToString(nai));
+ }
+ pw.decreaseIndent();
+ }
+ }
+
+ // This class needs its own log method because it has a different TAG.
+ private void log(String s) {
+ Slog.d(TAG, s);
+ }
+
}
private LegacyTypeTracker mLegacyTypeTracker = new LegacyTypeTracker();
@@ -793,9 +838,11 @@
// network is blocked; clone and override state
info = new NetworkInfo(info);
info.setDetailedState(DetailedState.BLOCKED, null, null);
+ if (VDBG) log("returning Blocked NetworkInfo");
}
if (mLockdownTracker != null) {
info = mLockdownTracker.augmentNetworkInfo(info);
+ if (VDBG) log("returning Locked NetworkInfo");
}
return info;
}
@@ -1680,6 +1727,22 @@
pw.println();
pw.decreaseIndent();
+ pw.print("mActiveDefaultNetwork: " + mActiveDefaultNetwork);
+ if (mActiveDefaultNetwork != TYPE_NONE) {
+ NetworkInfo activeNetworkInfo = getActiveNetworkInfo();
+ if (activeNetworkInfo != null) {
+ pw.print(" " + activeNetworkInfo.getState() +
+ "/" + activeNetworkInfo.getDetailedState());
+ }
+ }
+ pw.println();
+
+ pw.println("mLegacyTypeTracker:");
+ pw.increaseIndent();
+ mLegacyTypeTracker.dump(pw);
+ pw.decreaseIndent();
+ pw.println();
+
synchronized (this) {
pw.println("NetworkTranstionWakeLock is currently " +
(mNetTransitionWakeLock.isHeld() ? "" : "not ") + "held.");
@@ -1966,6 +2029,7 @@
synchronized (mNetworkForNetId) {
mNetworkForNetId.remove(nai.network.netId);
}
+ // Just in case.
mLegacyTypeTracker.remove(nai);
}
}
@@ -2067,15 +2131,14 @@
}
bestNetwork.addRequest(nri.request);
mNetworkForRequestId.put(nri.request.requestId, bestNetwork);
- int legacyType = nri.request.legacyType;
- if (legacyType != TYPE_NONE) {
- mLegacyTypeTracker.add(legacyType, bestNetwork);
- }
notifyNetworkCallback(bestNetwork, nri);
score = bestNetwork.currentScore;
+ if (nri.isRequest && nri.request.legacyType != TYPE_NONE) {
+ mLegacyTypeTracker.add(nri.request.legacyType, bestNetwork);
+ }
}
mNetworkRequests.put(nri.request, nri);
- if (msg.what == EVENT_REGISTER_NETWORK_REQUEST) {
+ if (nri.isRequest) {
if (DBG) log("sending new NetworkRequest to factories");
for (NetworkFactoryInfo nfi : mNetworkFactoryInfos.values()) {
nfi.asyncChannel.sendMessage(android.net.NetworkFactory.CMD_REQUEST_NETWORK, score,
@@ -2103,6 +2166,9 @@
log(" Removing from current network " + affectedNetwork.name() + ", leaving " +
affectedNetwork.networkRequests.size() + " requests.");
}
+ if (nri.isRequest && nri.request.legacyType != TYPE_NONE) {
+ mLegacyTypeTracker.remove(nri.request.legacyType, affectedNetwork);
+ }
}
if (nri.isRequest) {
@@ -4434,9 +4500,8 @@
}
mNetworkForRequestId.put(nri.request.requestId, newNetwork);
newNetwork.addRequest(nri.request);
- int legacyType = nri.request.legacyType;
- if (legacyType != TYPE_NONE) {
- mLegacyTypeTracker.add(legacyType, newNetwork);
+ if (nri.isRequest && nri.request.legacyType != TYPE_NONE) {
+ mLegacyTypeTracker.add(nri.request.legacyType, newNetwork);
}
keep = true;
// TODO - this could get expensive if we have alot of requests for this
@@ -4452,6 +4517,14 @@
} else {
setDefaultDnsSystemProperties(new ArrayList<InetAddress>());
}
+ // Maintain the illusion: since the legacy API only
+ // understands one network at a time, we must pretend
+ // that the current default network disconnected before
+ // the new one connected.
+ if (currentNetwork != null) {
+ mLegacyTypeTracker.remove(currentNetwork.networkInfo.getType(),
+ currentNetwork);
+ }
mLegacyTypeTracker.add(newNetwork.networkInfo.getType(), newNetwork);
}
}
@@ -4645,13 +4718,19 @@
}
private void sendLegacyNetworkBroadcast(NetworkAgentInfo nai, boolean connected, int type) {
+ // The NetworkInfo we actually send out has no bearing on the real
+ // state of affairs. For example, if the default connection is mobile,
+ // and a request for HIPRI has just gone away, we need to pretend that
+ // HIPRI has just disconnected. So we need to set the type to HIPRI and
+ // the state to DISCONNECTED, even though the network is of type MOBILE
+ // and is still connected.
+ NetworkInfo info = new NetworkInfo(nai.networkInfo);
+ info.setType(type);
if (connected) {
- NetworkInfo info = new NetworkInfo(nai.networkInfo);
- info.setType(type);
+ info.setDetailedState(DetailedState.CONNECTED, null, info.getExtraInfo());
sendConnectedBroadcastDelayed(info, getConnectivityChangeDelay());
} else {
- NetworkInfo info = new NetworkInfo(nai.networkInfo);
- info.setType(type);
+ info.setDetailedState(DetailedState.DISCONNECTED, null, info.getExtraInfo());
Intent intent = new Intent(ConnectivityManager.CONNECTIVITY_ACTION);
intent.putExtra(ConnectivityManager.EXTRA_NETWORK_INFO, info);
intent.putExtra(ConnectivityManager.EXTRA_NETWORK_TYPE, info.getType());
diff --git a/services/core/java/com/android/server/InputMethodManagerService.java b/services/core/java/com/android/server/InputMethodManagerService.java
index d4f141d..74ae812 100644
--- a/services/core/java/com/android/server/InputMethodManagerService.java
+++ b/services/core/java/com/android/server/InputMethodManagerService.java
@@ -51,6 +51,7 @@
import android.content.Context;
import android.content.DialogInterface;
import android.content.DialogInterface.OnCancelListener;
+import android.content.DialogInterface.OnClickListener;
import android.content.Intent;
import android.content.IntentFilter;
import android.content.ServiceConnection;
@@ -91,6 +92,7 @@
import android.util.Printer;
import android.util.Slog;
import android.util.Xml;
+import android.view.ContextThemeWrapper;
import android.view.IWindowManager;
import android.view.InputChannel;
import android.view.LayoutInflater;
@@ -2728,6 +2730,7 @@
return mKeyguardManager != null
&& mKeyguardManager.isKeyguardLocked() && mKeyguardManager.isKeyguardSecure();
}
+
private void showInputMethodMenuInternal(boolean showSubtypes) {
if (DEBUG) Slog.v(TAG, "Show switching menu");
@@ -2778,84 +2781,81 @@
}
}
}
- final TypedArray a = context.obtainStyledAttributes(null,
+ final Context themedContext = new ContextThemeWrapper(context,
+ android.R.style.Theme_DeviceDefault_Settings);
+ mDialogBuilder = new AlertDialog.Builder(themedContext);
+ final TypedArray a = themedContext.obtainStyledAttributes(null,
com.android.internal.R.styleable.DialogPreference,
com.android.internal.R.attr.alertDialogStyle, 0);
- mDialogBuilder = new AlertDialog.Builder(context)
- .setOnCancelListener(new OnCancelListener() {
- @Override
- public void onCancel(DialogInterface dialog) {
- hideInputMethodMenu();
- }
- })
- .setIcon(a.getDrawable(
- com.android.internal.R.styleable.DialogPreference_dialogTitle));
+ mDialogBuilder.setIcon(a.getDrawable(
+ com.android.internal.R.styleable.DialogPreference_dialogIcon));
a.recycle();
+ mDialogBuilder.setOnCancelListener(new OnCancelListener() {
+ @Override
+ public void onCancel(DialogInterface dialog) {
+ hideInputMethodMenu();
+ }
+ });
final LayoutInflater inflater =
- (LayoutInflater)mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
+ (LayoutInflater)themedContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
final View tv = inflater.inflate(
com.android.internal.R.layout.input_method_switch_dialog_title, null);
mDialogBuilder.setCustomTitle(tv);
// Setup layout for a toggle switch of the hardware keyboard
mSwitchingDialogTitleView = tv;
- mSwitchingDialogTitleView.findViewById(
- com.android.internal.R.id.hard_keyboard_section).setVisibility(
- mWindowManagerService.isHardKeyboardAvailable() ?
- View.VISIBLE : View.GONE);
- final Switch hardKeySwitch = ((Switch)mSwitchingDialogTitleView.findViewById(
- com.android.internal.R.id.hard_keyboard_switch));
+ mSwitchingDialogTitleView
+ .findViewById(com.android.internal.R.id.hard_keyboard_section)
+ .setVisibility(mWindowManagerService.isHardKeyboardAvailable()
+ ? View.VISIBLE : View.GONE);
+ final Switch hardKeySwitch = (Switch)mSwitchingDialogTitleView.findViewById(
+ com.android.internal.R.id.hard_keyboard_switch);
hardKeySwitch.setChecked(mWindowManagerService.isHardKeyboardEnabled());
- hardKeySwitch.setOnCheckedChangeListener(
- new OnCheckedChangeListener() {
- @Override
- public void onCheckedChanged(
- CompoundButton buttonView, boolean isChecked) {
- mWindowManagerService.setHardKeyboardEnabled(isChecked);
- // Ensure that the input method dialog is dismissed when changing
- // the hardware keyboard state.
- hideInputMethodMenu();
+ hardKeySwitch.setOnCheckedChangeListener(new OnCheckedChangeListener() {
+ @Override
+ public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
+ mWindowManagerService.setHardKeyboardEnabled(isChecked);
+ // Ensure that the input method dialog is dismissed when changing
+ // the hardware keyboard state.
+ hideInputMethodMenu();
+ }
+ });
+
+ final ImeSubtypeListAdapter adapter = new ImeSubtypeListAdapter(themedContext,
+ com.android.internal.R.layout.input_method_switch_item, imList, checkedItem);
+ final OnClickListener choiceListener = new OnClickListener() {
+ @Override
+ public void onClick(final DialogInterface dialog, final int which) {
+ synchronized (mMethodMap) {
+ if (mIms == null || mIms.length <= which || mSubtypeIds == null
+ || mSubtypeIds.length <= which) {
+ return;
}
- });
-
- final ImeSubtypeListAdapter adapter = new ImeSubtypeListAdapter(context,
- com.android.internal.R.layout.simple_list_item_2_single_choice, imList,
- checkedItem);
-
- mDialogBuilder.setSingleChoiceItems(adapter, checkedItem,
- new AlertDialog.OnClickListener() {
- @Override
- public void onClick(DialogInterface dialog, int which) {
- synchronized (mMethodMap) {
- if (mIms == null || mIms.length <= which
- || mSubtypeIds == null || mSubtypeIds.length <= which) {
- return;
- }
- InputMethodInfo im = mIms[which];
- int subtypeId = mSubtypeIds[which];
- adapter.mCheckedItem = which;
- adapter.notifyDataSetChanged();
- hideInputMethodMenu();
- if (im != null) {
- if ((subtypeId < 0)
- || (subtypeId >= im.getSubtypeCount())) {
- subtypeId = NOT_A_SUBTYPE_ID;
- }
- setInputMethodLocked(im.getId(), subtypeId);
- }
+ final InputMethodInfo im = mIms[which];
+ int subtypeId = mSubtypeIds[which];
+ adapter.mCheckedItem = which;
+ adapter.notifyDataSetChanged();
+ hideInputMethodMenu();
+ if (im != null) {
+ if (subtypeId < 0 || subtypeId >= im.getSubtypeCount()) {
+ subtypeId = NOT_A_SUBTYPE_ID;
}
+ setInputMethodLocked(im.getId(), subtypeId);
}
- });
+ }
+ }
+ };
+ mDialogBuilder.setSingleChoiceItems(adapter, checkedItem, choiceListener);
if (showSubtypes && !isScreenLocked) {
+ final OnClickListener positiveListener = new OnClickListener() {
+ @Override
+ public void onClick(DialogInterface dialog, int whichButton) {
+ showConfigureInputMethods();
+ }
+ };
mDialogBuilder.setPositiveButton(
- com.android.internal.R.string.configure_input_methods,
- new DialogInterface.OnClickListener() {
- @Override
- public void onClick(DialogInterface dialog, int whichButton) {
- showConfigureInputMethods();
- }
- });
+ com.android.internal.R.string.configure_input_methods, positiveListener);
}
mSwitchingDialog = mDialogBuilder.create();
mSwitchingDialog.setCanceledOnTouchOutside(true);
diff --git a/services/core/java/com/android/server/LocationManagerService.java b/services/core/java/com/android/server/LocationManagerService.java
index 3a4e2ee..28a6917 100644
--- a/services/core/java/com/android/server/LocationManagerService.java
+++ b/services/core/java/com/android/server/LocationManagerService.java
@@ -482,33 +482,36 @@
}
// bind to fused hardware provider if supported
+ // in devices without support, requesting an instance of FlpHardwareProvider will raise an
+ // exception, so make sure we only do that when supported
+ FlpHardwareProvider flpHardwareProvider;
if (FlpHardwareProvider.isSupported()) {
- FlpHardwareProvider flpHardwareProvider =
- FlpHardwareProvider.getInstance(mContext);
- FusedProxy fusedProxy = FusedProxy.createAndBind(
- mContext,
- mLocationHandler,
- flpHardwareProvider.getLocationHardware(),
- com.android.internal.R.bool.config_enableHardwareFlpOverlay,
- com.android.internal.R.string.config_hardwareFlpPackageName,
- com.android.internal.R.array.config_locationProviderPackageNames);
- if(fusedProxy == null) {
- Slog.e(TAG, "Unable to bind FusedProxy.");
- }
-
- // bind to geofence provider
- GeofenceProxy provider = GeofenceProxy.createAndBind(mContext,
- com.android.internal.R.bool.config_enableGeofenceOverlay,
- com.android.internal.R.string.config_geofenceProviderPackageName,
- com.android.internal.R.array.config_locationProviderPackageNames,
- mLocationHandler,
- gpsProvider.getGpsGeofenceProxy(),
- flpHardwareProvider.getGeofenceHardware());
- if (provider == null) {
- Slog.e(TAG, "Unable to bind FLP Geofence proxy.");
- }
+ flpHardwareProvider = FlpHardwareProvider.getInstance(mContext);
+ FusedProxy fusedProxy = FusedProxy.createAndBind(
+ mContext,
+ mLocationHandler,
+ flpHardwareProvider.getLocationHardware(),
+ com.android.internal.R.bool.config_enableHardwareFlpOverlay,
+ com.android.internal.R.string.config_hardwareFlpPackageName,
+ com.android.internal.R.array.config_locationProviderPackageNames);
+ if (fusedProxy == null) {
+ Slog.e(TAG, "Unable to bind FusedProxy.");
+ }
} else {
- Slog.e(TAG, "FLP HAL not supported.");
+ flpHardwareProvider = null;
+ Slog.e(TAG, "FLP HAL not supported");
+ }
+
+ // bind to geofence provider
+ GeofenceProxy provider = GeofenceProxy.createAndBind(
+ mContext,com.android.internal.R.bool.config_enableGeofenceOverlay,
+ com.android.internal.R.string.config_geofenceProviderPackageName,
+ com.android.internal.R.array.config_locationProviderPackageNames,
+ mLocationHandler,
+ gpsProvider.getGpsGeofenceProxy(),
+ flpHardwareProvider != null ? flpHardwareProvider.getGeofenceHardware() : null);
+ if (provider == null) {
+ Slog.e(TAG, "Unable to bind FLP Geofence proxy.");
}
// bind to the hardware activity recognition if supported
diff --git a/services/core/java/com/android/server/MmsServiceBroker.java b/services/core/java/com/android/server/MmsServiceBroker.java
index 2fad73e..df54c7f 100644
--- a/services/core/java/com/android/server/MmsServiceBroker.java
+++ b/services/core/java/com/android/server/MmsServiceBroker.java
@@ -49,6 +49,11 @@
private static final int MSG_TRY_CONNECTING = 1;
+ private static final Uri FAKE_SMS_SENT_URI = Uri.parse("content://sms/sent/0");
+ private static final Uri FAKE_MMS_SENT_URI = Uri.parse("content://mms/sent/0");
+ private static final Uri FAKE_SMS_DRAFT_URI = Uri.parse("content://sms/draft/0");
+ private static final Uri FAKE_MMS_DRAFT_URI = Uri.parse("content://mms/draft/0");
+
private Context mContext;
// The actual MMS service instance to invoke
private volatile IMms mService;
@@ -186,25 +191,28 @@
private final class BinderService extends IMms.Stub {
@Override
public void sendMessage(long subId, String callingPkg, byte[] pdu, String locationUrl,
- PendingIntent sentIntent) throws RemoteException {
+ ContentValues configOverrides, PendingIntent sentIntent) throws RemoteException {
mContext.enforceCallingPermission(Manifest.permission.SEND_SMS, "Send MMS message");
if (getAppOpsManager().noteOp(AppOpsManager.OP_SEND_SMS, Binder.getCallingUid(),
callingPkg) != AppOpsManager.MODE_ALLOWED) {
return;
}
- getServiceGuarded().sendMessage(subId, callingPkg, pdu, locationUrl, sentIntent);
+ getServiceGuarded().sendMessage(subId, callingPkg, pdu, locationUrl, configOverrides,
+ sentIntent);
}
@Override
public void downloadMessage(long subId, String callingPkg, String locationUrl,
- PendingIntent downloadedIntent) throws RemoteException {
+ ContentValues configOverrides, PendingIntent downloadedIntent)
+ throws RemoteException {
mContext.enforceCallingPermission(Manifest.permission.RECEIVE_MMS,
"Download MMS message");
if (getAppOpsManager().noteOp(AppOpsManager.OP_RECEIVE_MMS, Binder.getCallingUid(),
callingPkg) != AppOpsManager.MODE_ALLOWED) {
return;
}
- getServiceGuarded().downloadMessage(subId, callingPkg, locationUrl, downloadedIntent);
+ getServiceGuarded().downloadMessage(subId, callingPkg, locationUrl, configOverrides,
+ downloadedIntent);
}
@Override
@@ -220,53 +228,21 @@
}
@Override
- public boolean getCarrierConfigBoolean(String name, boolean defaultValue)
+ public boolean getCarrierConfigBoolean(long subId, String name, boolean defaultValue)
throws RemoteException {
- return getServiceGuarded().getCarrierConfigBoolean(name, defaultValue);
+ return getServiceGuarded().getCarrierConfigBoolean(subId, name, defaultValue);
}
@Override
- public int getCarrierConfigInt(String name, int defaultValue) throws RemoteException {
- return getServiceGuarded().getCarrierConfigInt(name, defaultValue);
+ public int getCarrierConfigInt(long subId, String name, int defaultValue)
+ throws RemoteException {
+ return getServiceGuarded().getCarrierConfigInt(subId, name, defaultValue);
}
@Override
- public String getCarrierConfigString(String name, String defaultValue)
+ public String getCarrierConfigString(long subId, String name, String defaultValue)
throws RemoteException {
- return getServiceGuarded().getCarrierConfigString(name, defaultValue);
- }
-
- @Override
- public void setCarrierConfigBoolean(String callingPkg, String name, boolean value)
- throws RemoteException {
- mContext.enforceCallingPermission(Manifest.permission.SEND_SMS, "Set MMS config");
- if (getAppOpsManager().noteOp(AppOpsManager.OP_SEND_SMS, Binder.getCallingUid(),
- callingPkg) != AppOpsManager.MODE_ALLOWED) {
- return;
- }
- getServiceGuarded().setCarrierConfigBoolean(callingPkg, name, value);
- }
-
- @Override
- public void setCarrierConfigInt(String callingPkg, String name, int value)
- throws RemoteException {
- mContext.enforceCallingPermission(Manifest.permission.SEND_SMS, "Set MMS config");
- if (getAppOpsManager().noteOp(AppOpsManager.OP_SEND_SMS, Binder.getCallingUid(),
- callingPkg) != AppOpsManager.MODE_ALLOWED) {
- return;
- }
- getServiceGuarded().setCarrierConfigInt(callingPkg, name, value);
- }
-
- @Override
- public void setCarrierConfigString(String callingPkg, String name, String value)
- throws RemoteException {
- mContext.enforceCallingPermission(Manifest.permission.SEND_SMS, "Set MMS config");
- if (getAppOpsManager().noteOp(AppOpsManager.OP_SEND_SMS, Binder.getCallingUid(),
- callingPkg) != AppOpsManager.MODE_ALLOWED) {
- return;
- }
- getServiceGuarded().setCarrierConfigString(callingPkg, name, value);
+ return getServiceGuarded().getCarrierConfigString(subId, name, defaultValue);
}
@Override
@@ -275,7 +251,9 @@
mContext.enforceCallingPermission(Manifest.permission.WRITE_SMS, "Import SMS message");
if (getAppOpsManager().noteOp(AppOpsManager.OP_WRITE_SMS, Binder.getCallingUid(),
callingPkg) != AppOpsManager.MODE_ALLOWED) {
- return null;
+ // Silently fail AppOps failure due to not being the default SMS app
+ // while writing the TelephonyProvider
+ return FAKE_SMS_SENT_URI;
}
return getServiceGuarded().importTextMessage(
callingPkg, address, type, text, timestampMillis, seen, read);
@@ -287,7 +265,9 @@
mContext.enforceCallingPermission(Manifest.permission.WRITE_SMS, "Import MMS message");
if (getAppOpsManager().noteOp(AppOpsManager.OP_WRITE_SMS, Binder.getCallingUid(),
callingPkg) != AppOpsManager.MODE_ALLOWED) {
- return null;
+ // Silently fail AppOps failure due to not being the default SMS app
+ // while writing the TelephonyProvider
+ return FAKE_MMS_SENT_URI;
}
return getServiceGuarded().importMultimediaMessage(
callingPkg, pdu, messageId, timestampSecs, seen, read);
@@ -340,7 +320,9 @@
mContext.enforceCallingPermission(Manifest.permission.WRITE_SMS, "Add SMS draft");
if (getAppOpsManager().noteOp(AppOpsManager.OP_WRITE_SMS, Binder.getCallingUid(),
callingPkg) != AppOpsManager.MODE_ALLOWED) {
- return null;
+ // Silently fail AppOps failure due to not being the default SMS app
+ // while writing the TelephonyProvider
+ return FAKE_SMS_DRAFT_URI;
}
return getServiceGuarded().addTextMessageDraft(callingPkg, address, text);
}
@@ -350,21 +332,24 @@
mContext.enforceCallingPermission(Manifest.permission.WRITE_SMS, "Add MMS draft");
if (getAppOpsManager().noteOp(AppOpsManager.OP_WRITE_SMS, Binder.getCallingUid(),
callingPkg) != AppOpsManager.MODE_ALLOWED) {
- return null;
+ // Silently fail AppOps failure due to not being the default SMS app
+ // while writing the TelephonyProvider
+ return FAKE_MMS_DRAFT_URI;
}
return getServiceGuarded().addMultimediaMessageDraft(callingPkg, pdu);
}
@Override
public void sendStoredMessage(long subId, String callingPkg, Uri messageUri,
- PendingIntent sentIntent) throws RemoteException {
+ ContentValues configOverrides, PendingIntent sentIntent) throws RemoteException {
mContext.enforceCallingPermission(Manifest.permission.SEND_SMS,
"Send stored MMS message");
if (getAppOpsManager().noteOp(AppOpsManager.OP_SEND_SMS, Binder.getCallingUid(),
callingPkg) != AppOpsManager.MODE_ALLOWED) {
return;
}
- getServiceGuarded().sendStoredMessage(subId, callingPkg, messageUri, sentIntent);
+ getServiceGuarded().sendStoredMessage(subId, callingPkg, messageUri, configOverrides,
+ sentIntent);
}
@Override
diff --git a/services/core/java/com/android/server/TelephonyRegistry.java b/services/core/java/com/android/server/TelephonyRegistry.java
index cb410ef..7624314 100644
--- a/services/core/java/com/android/server/TelephonyRegistry.java
+++ b/services/core/java/com/android/server/TelephonyRegistry.java
@@ -80,9 +80,9 @@
*/
class TelephonyRegistry extends ITelephonyRegistry.Stub {
private static final String TAG = "TelephonyRegistry";
- private static final boolean DBG = true; // STOPSHIP if true
+ private static final boolean DBG = false; // STOPSHIP if true
private static final boolean DBG_LOC = false; // STOPSHIP if true
- private static final boolean VDBG = true; // STOPSHIP if true
+ private static final boolean VDBG = false; // STOPSHIP if true
private static class Record {
String pkgForDebug;
diff --git a/services/core/java/com/android/server/UiModeManagerService.java b/services/core/java/com/android/server/UiModeManagerService.java
index f59edc7..4c6b772 100644
--- a/services/core/java/com/android/server/UiModeManagerService.java
+++ b/services/core/java/com/android/server/UiModeManagerService.java
@@ -73,6 +73,7 @@
private boolean mTelevision;
private boolean mWatch;
private boolean mComputedNightMode;
+ private int mCarModeEnableFlags;
int mCurUiMode = 0;
private int mSetUiMode = 0;
@@ -193,7 +194,7 @@
final long ident = Binder.clearCallingIdentity();
try {
synchronized (mLock) {
- setCarModeLocked(true);
+ setCarModeLocked(true, flags);
if (mSystemReady) {
updateLocked(flags, 0);
}
@@ -208,7 +209,7 @@
final long ident = Binder.clearCallingIdentity();
try {
synchronized (mLock) {
- setCarModeLocked(false);
+ setCarModeLocked(false, 0);
if (mSystemReady) {
updateLocked(0, flags);
}
@@ -285,7 +286,8 @@
pw.print(" mLastBroadcastState="); pw.println(mLastBroadcastState);
pw.print(" mNightMode="); pw.print(mNightMode);
pw.print(" mCarModeEnabled="); pw.print(mCarModeEnabled);
- pw.print(" mComputedNightMode="); pw.println(mComputedNightMode);
+ pw.print(" mComputedNightMode="); pw.print(mComputedNightMode);
+ pw.print(" mCarModeEnableFlags="); pw.println(mCarModeEnableFlags);
pw.print(" mCurUiMode=0x"); pw.print(Integer.toHexString(mCurUiMode));
pw.print(" mSetUiMode=0x"); pw.println(Integer.toHexString(mSetUiMode));
pw.print(" mHoldingConfiguration="); pw.print(mHoldingConfiguration);
@@ -311,17 +313,18 @@
return mCarModeEnabled || mDockState != Intent.EXTRA_DOCK_STATE_UNDOCKED;
}
- void setCarModeLocked(boolean enabled) {
+ void setCarModeLocked(boolean enabled, int flags) {
if (mCarModeEnabled != enabled) {
mCarModeEnabled = enabled;
}
+ mCarModeEnableFlags = flags;
}
private void updateDockState(int newState) {
synchronized (mLock) {
if (newState != mDockState) {
mDockState = newState;
- setCarModeLocked(mDockState == Intent.EXTRA_DOCK_STATE_CAR);
+ setCarModeLocked(mDockState == Intent.EXTRA_DOCK_STATE_CAR, 0);
if (mSystemReady) {
updateLocked(UiModeManager.ENABLE_CAR_MODE_GO_CAR_HOME, 0);
}
@@ -475,7 +478,8 @@
// keep screen on when charging and in car mode
boolean keepScreenOn = mCharging &&
- ((mCarModeEnabled && mCarModeKeepsScreenOn) ||
+ ((mCarModeEnabled && mCarModeKeepsScreenOn &&
+ (mCarModeEnableFlags & UiModeManager.ENABLE_CAR_MODE_NO_WAKE_LOCK) == 0) ||
(mCurUiMode == Configuration.UI_MODE_TYPE_DESK && mDeskModeKeepsScreenOn));
if (keepScreenOn != mWakeLock.isHeld()) {
if (keepScreenOn) {
diff --git a/services/core/java/com/android/server/accounts/AccountManagerService.java b/services/core/java/com/android/server/accounts/AccountManagerService.java
index 9a86136..2a66baf 100644
--- a/services/core/java/com/android/server/accounts/AccountManagerService.java
+++ b/services/core/java/com/android/server/accounts/AccountManagerService.java
@@ -3144,6 +3144,9 @@
DevicePolicyManager dpm = (DevicePolicyManager) mContext
.getSystemService(Context.DEVICE_POLICY_SERVICE);
String[] typesArray = dpm.getAccountTypesWithManagementDisabledAsUser(userId);
+ if (typesArray == null) {
+ return true;
+ }
for (String forbiddenType : typesArray) {
if (forbiddenType.equals(accountType)) {
return false;
diff --git a/services/core/java/com/android/server/am/ActivityManagerService.java b/services/core/java/com/android/server/am/ActivityManagerService.java
index cfdf7cf..275185a 100755
--- a/services/core/java/com/android/server/am/ActivityManagerService.java
+++ b/services/core/java/com/android/server/am/ActivityManagerService.java
@@ -1206,9 +1206,13 @@
}
return;
}
- if (!showBackground && UserHandle.getAppId(proc.uid)
- >= Process.FIRST_APPLICATION_UID && proc.userId != mCurrentUserId
- && proc.pid != MY_PID) {
+ boolean isBackground = (UserHandle.getAppId(proc.uid)
+ >= Process.FIRST_APPLICATION_UID
+ && proc.pid != MY_PID);
+ for (int userId : mCurrentProfileIds) {
+ isBackground &= (proc.userId != userId);
+ }
+ if (isBackground && !showBackground) {
Slog.w(TAG, "Skipping crash dialog of " + proc + ": background");
if (res != null) {
res.set(0);
@@ -2030,7 +2034,7 @@
mSystemThread.installSystemApplicationInfo(info);
synchronized (this) {
- ProcessRecord app = newProcessRecordLocked(info, info.processName, false);
+ ProcessRecord app = newProcessRecordLocked(info, info.processName, false, 0);
app.persistent = true;
app.pid = MY_PID;
app.maxAdj = ProcessList.SYSTEM_ADJ;
@@ -2830,10 +2834,45 @@
|| transit == AppTransition.TRANSIT_TASK_TO_FRONT;
}
+ int startIsolatedProcess(String entryPoint, String[] entryPointArgs,
+ String processName, String abiOverride, int uid, Runnable crashHandler) {
+ synchronized(this) {
+ ApplicationInfo info = new ApplicationInfo();
+ // In general the ApplicationInfo.uid isn't neccesarily equal to ProcessRecord.uid.
+ // For isolated processes, the former contains the parent's uid and the latter the
+ // actual uid of the isolated process.
+ // In the special case introduced by this method (which is, starting an isolated
+ // process directly from the SystemServer without an actual parent app process) the
+ // closest thing to a parent's uid is SYSTEM_UID.
+ // The only important thing here is to keep AI.uid != PR.uid, in order to trigger
+ // the |isolated| logic in the ProcessRecord constructor.
+ info.uid = Process.SYSTEM_UID;
+ info.processName = processName;
+ info.className = entryPoint;
+ info.packageName = "android";
+ ProcessRecord proc = startProcessLocked(processName, info /* info */,
+ false /* knownToBeDead */, 0 /* intentFlags */, "" /* hostingType */,
+ null /* hostingName */, true /* allowWhileBooting */, true /* isolated */,
+ uid, true /* keepIfLarge */, abiOverride, entryPoint, entryPointArgs,
+ crashHandler);
+ return proc != null ? proc.pid : 0;
+ }
+ }
+
final ProcessRecord startProcessLocked(String processName,
ApplicationInfo info, boolean knownToBeDead, int intentFlags,
String hostingType, ComponentName hostingName, boolean allowWhileBooting,
boolean isolated, boolean keepIfLarge) {
+ return startProcessLocked(processName, info, knownToBeDead, intentFlags, hostingType,
+ hostingName, allowWhileBooting, isolated, 0 /* isolatedUid */, keepIfLarge,
+ null /* ABI override */, null /* entryPoint */, null /* entryPointArgs */,
+ null /* crashHandler */);
+ }
+
+ final ProcessRecord startProcessLocked(String processName, ApplicationInfo info,
+ boolean knownToBeDead, int intentFlags, String hostingType, ComponentName hostingName,
+ boolean allowWhileBooting, boolean isolated, int isolatedUid, boolean keepIfLarge,
+ String abiOverride, String entryPoint, String[] entryPointArgs, Runnable crashHandler) {
ProcessRecord app;
if (!isolated) {
app = getProcessRecordLocked(processName, info.uid, keepIfLarge);
@@ -2901,7 +2940,8 @@
}
if (app == null) {
- app = newProcessRecordLocked(info, processName, isolated);
+ app = newProcessRecordLocked(info, processName, isolated, isolatedUid);
+ app.crashHandler = crashHandler;
if (app == null) {
Slog.w(TAG, "Failed making new process record for "
+ processName + "/" + info.uid + " isolated=" + isolated);
@@ -2928,7 +2968,8 @@
return app;
}
- startProcessLocked(app, hostingType, hostingNameStr, null /* ABI override */);
+ startProcessLocked(
+ app, hostingType, hostingNameStr, abiOverride, entryPoint, entryPointArgs);
return (app.pid != 0) ? app : null;
}
@@ -2937,7 +2978,13 @@
}
private final void startProcessLocked(ProcessRecord app,
- String hostingType, String hostingNameStr, String abiOverride) {
+ String hostingType, String hostingNameStr) {
+ startProcessLocked(app, hostingType, hostingNameStr, null /* abiOverride */,
+ null /* entryPoint */, null /* entryPointArgs */);
+ }
+
+ private final void startProcessLocked(ProcessRecord app, String hostingType,
+ String hostingNameStr, String abiOverride, String entryPoint, String[] entryPointArgs) {
if (app.pid > 0 && app.pid != MY_PID) {
synchronized (mPidsSelfLocked) {
mPidsSelfLocked.remove(app.pid);
@@ -3030,9 +3077,11 @@
// Start the process. It will either succeed and return a result containing
// the PID of the new process, or else throw a RuntimeException.
- Process.ProcessStartResult startResult = Process.start("android.app.ActivityThread",
+ boolean isActivityProcess = (entryPoint == null);
+ if (entryPoint == null) entryPoint = "android.app.ActivityThread";
+ Process.ProcessStartResult startResult = Process.start(entryPoint,
app.processName, uid, uid, gids, debugFlags, mountExternal,
- app.info.targetSdkVersion, app.info.seinfo, requiredAbi, null);
+ app.info.targetSdkVersion, app.info.seinfo, requiredAbi, entryPointArgs);
if (app.isolated) {
mBatteryStatsService.addIsolatedUid(app.uid, app.info.uid);
@@ -3052,6 +3101,11 @@
buf.setLength(0);
buf.append("Start proc ");
buf.append(app.processName);
+ if (!isActivityProcess) {
+ buf.append(" [");
+ buf.append(entryPoint);
+ buf.append("]");
+ }
buf.append(" for ");
buf.append(hostingType);
if (hostingNameStr != null) {
@@ -3082,10 +3136,12 @@
app.killedByAm = false;
synchronized (mPidsSelfLocked) {
this.mPidsSelfLocked.put(startResult.pid, app);
- Message msg = mHandler.obtainMessage(PROC_START_TIMEOUT_MSG);
- msg.obj = app;
- mHandler.sendMessageDelayed(msg, startResult.usingWrapper
- ? PROC_START_TIMEOUT_WITH_WRAPPER : PROC_START_TIMEOUT);
+ if (isActivityProcess) {
+ Message msg = mHandler.obtainMessage(PROC_START_TIMEOUT_MSG);
+ msg.obj = app;
+ mHandler.sendMessageDelayed(msg, startResult.usingWrapper
+ ? PROC_START_TIMEOUT_WITH_WRAPPER : PROC_START_TIMEOUT);
+ }
}
} catch (RuntimeException e) {
// XXX do better error recovery.
@@ -3638,6 +3694,27 @@
return ret;
}
+ //explicitly remove thd old information in mRecentTasks when removing existing user.
+ private void removeRecentTasksForUserLocked(int userId) {
+ if(userId <= 0) {
+ Slog.i(TAG, "Can't remove recent task on user " + userId);
+ return;
+ }
+
+ for (int i = mRecentTasks.size() - 1; i >= 0; --i) {
+ TaskRecord tr = mRecentTasks.get(i);
+ if (tr.userId == userId) {
+ if(DEBUG_TASKS) Slog.i(TAG, "remove RecentTask " + tr
+ + " when finishing user" + userId);
+ tr.disposeThumbnail();
+ mRecentTasks.remove(i);
+ }
+ }
+
+ // Remove tasks from persistent storage.
+ mTaskPersister.wakeup(null, true);
+ }
+
final void addRecentTaskLocked(TaskRecord task) {
int N = mRecentTasks.size();
// Quick case: check if the top-most recent task is the same.
@@ -5334,7 +5411,7 @@
app.deathRecipient = adr;
} catch (RemoteException e) {
app.resetPackageList(mProcessStats);
- startProcessLocked(app, "link fail", processName, null /* ABI override */);
+ startProcessLocked(app, "link fail", processName);
return false;
}
@@ -5427,7 +5504,7 @@
app.resetPackageList(mProcessStats);
app.unlinkDeathRecipient();
- startProcessLocked(app, "bind fail", processName, null /* ABI override */);
+ startProcessLocked(app, "bind fail", processName);
return false;
}
@@ -5582,7 +5659,7 @@
for (int ip=0; ip<NP; ip++) {
if (DEBUG_PROCESSES) Slog.v(TAG, "Starting process on hold: "
+ procs.get(ip));
- startProcessLocked(procs.get(ip), "on-hold", null, null /* ABI override */);
+ startProcessLocked(procs.get(ip), "on-hold", null);
}
}
@@ -8930,29 +9007,35 @@
// =========================================================
final ProcessRecord newProcessRecordLocked(ApplicationInfo info, String customProcess,
- boolean isolated) {
+ boolean isolated, int isolatedUid) {
String proc = customProcess != null ? customProcess : info.processName;
BatteryStatsImpl.Uid.Proc ps = null;
BatteryStatsImpl stats = mBatteryStatsService.getActiveStatistics();
int uid = info.uid;
if (isolated) {
- int userId = UserHandle.getUserId(uid);
- int stepsLeft = Process.LAST_ISOLATED_UID - Process.FIRST_ISOLATED_UID + 1;
- while (true) {
- if (mNextIsolatedProcessUid < Process.FIRST_ISOLATED_UID
- || mNextIsolatedProcessUid > Process.LAST_ISOLATED_UID) {
- mNextIsolatedProcessUid = Process.FIRST_ISOLATED_UID;
+ if (isolatedUid == 0) {
+ int userId = UserHandle.getUserId(uid);
+ int stepsLeft = Process.LAST_ISOLATED_UID - Process.FIRST_ISOLATED_UID + 1;
+ while (true) {
+ if (mNextIsolatedProcessUid < Process.FIRST_ISOLATED_UID
+ || mNextIsolatedProcessUid > Process.LAST_ISOLATED_UID) {
+ mNextIsolatedProcessUid = Process.FIRST_ISOLATED_UID;
+ }
+ uid = UserHandle.getUid(userId, mNextIsolatedProcessUid);
+ mNextIsolatedProcessUid++;
+ if (mIsolatedProcesses.indexOfKey(uid) < 0) {
+ // No process for this uid, use it.
+ break;
+ }
+ stepsLeft--;
+ if (stepsLeft <= 0) {
+ return null;
+ }
}
- uid = UserHandle.getUid(userId, mNextIsolatedProcessUid);
- mNextIsolatedProcessUid++;
- if (mIsolatedProcesses.indexOfKey(uid) < 0) {
- // No process for this uid, use it.
- break;
- }
- stepsLeft--;
- if (stepsLeft <= 0) {
- return null;
- }
+ } else {
+ // Special case for startIsolatedProcess (internal only), where
+ // the uid of the isolated process is specified by the caller.
+ uid = isolatedUid;
}
}
return new ProcessRecord(stats, info, proc, uid);
@@ -8968,7 +9051,7 @@
}
if (app == null) {
- app = newProcessRecordLocked(info, null, isolated);
+ app = newProcessRecordLocked(info, null, isolated, 0);
mProcessNames.put(info.processName, app.uid, app);
if (isolated) {
mIsolatedProcesses.put(app.uid, app);
@@ -8994,8 +9077,8 @@
}
if (app.thread == null && mPersistentStartingProcesses.indexOf(app) < 0) {
mPersistentStartingProcesses.add(app);
- startProcessLocked(app, "added application", app.processName,
- abiOverride);
+ startProcessLocked(app, "added application", app.processName, abiOverride,
+ null /* entryPoint */, null /* entryPointArgs */);
}
return app;
@@ -10494,6 +10577,7 @@
mProcessCrashTimes.put(app.info.processName, app.uid, now);
}
+ if (app.crashHandler != null) mHandler.post(app.crashHandler);
return true;
}
@@ -10966,11 +11050,17 @@
int uid = r != null ? r.info.uid : Binder.getCallingUid();
if (!mController.appCrashed(name, pid,
shortMsg, longMsg, timeMillis, crashInfo.stackTrace)) {
- Slog.w(TAG, "Force-killing crashed app " + name
- + " at watcher's request");
- Process.killProcess(pid);
- if (r != null) {
- Process.killProcessGroup(uid, pid);
+ if ("1".equals(SystemProperties.get(SYSTEM_DEBUGGABLE, "0"))
+ && "Native crash".equals(crashInfo.exceptionClassName)) {
+ Slog.w(TAG, "Skip killing native crashed app " + name
+ + "(" + pid + ") during testing");
+ } else {
+ Slog.w(TAG, "Force-killing crashed app " + name
+ + " at watcher's request");
+ Process.killProcess(pid);
+ if (r != null) {
+ Process.killProcessGroup(uid, pid);
+ }
}
return;
}
@@ -13486,7 +13576,7 @@
// We have components that still need to be running in the
// process, so re-launch it.
mProcessNames.put(app.processName, app.uid, app);
- startProcessLocked(app, "restart", app.processName, null /* ABI override */);
+ startProcessLocked(app, "restart", app.processName);
} else if (app.pid > 0 && app.pid != MY_PID) {
// Goodbye!
boolean removed;
@@ -17634,6 +17724,9 @@
// Kill all the processes for the user.
forceStopUserLocked(userId, "finish user");
}
+
+ // Explicitly remove the old information in mRecentTasks.
+ removeRecentTasksForUserLocked(userId);
}
for (int i=0; i<callbacks.size(); i++) {
@@ -17815,6 +17908,13 @@
public void wakingUp() {
ActivityManagerService.this.wakingUp();
}
+
+ @Override
+ public int startIsolatedProcess(String entryPoint, String[] entryPointArgs,
+ String processName, String abiOverride, int uid, Runnable crashHandler) {
+ return ActivityManagerService.this.startIsolatedProcess(entryPoint, entryPointArgs,
+ processName, abiOverride, uid, crashHandler);
+ }
}
/**
diff --git a/services/core/java/com/android/server/am/ActivityStack.java b/services/core/java/com/android/server/am/ActivityStack.java
index 75df136..c5bc7d3 100755
--- a/services/core/java/com/android/server/am/ActivityStack.java
+++ b/services/core/java/com/android/server/am/ActivityStack.java
@@ -1882,6 +1882,10 @@
boolean startIt = true;
for (int taskNdx = mTaskHistory.size() - 1; taskNdx >= 0; --taskNdx) {
task = mTaskHistory.get(taskNdx);
+ if (task.getTopActivity() == null) {
+ // All activities in task are finishing.
+ continue;
+ }
if (task == r.task) {
// Here it is! Now, if this is not yet visible to the
// user, then just add it without starting; it will
diff --git a/services/core/java/com/android/server/am/ProcessRecord.java b/services/core/java/com/android/server/am/ProcessRecord.java
index b33f7b7..f1bcb60 100644
--- a/services/core/java/com/android/server/am/ProcessRecord.java
+++ b/services/core/java/com/android/server/am/ProcessRecord.java
@@ -127,7 +127,8 @@
Object adjSource; // Debugging: option dependent object.
int adjSourceProcState; // Debugging: proc state of adjSource's process.
Object adjTarget; // Debugging: target component impacting oom_adj.
-
+ Runnable crashHandler; // Optional local handler to be invoked in the process crash.
+
// contains HistoryRecord objects
final ArrayList<ActivityRecord> activities = new ArrayList<ActivityRecord>();
// all ServiceRecord running in this process
diff --git a/services/core/java/com/android/server/connectivity/Vpn.java b/services/core/java/com/android/server/connectivity/Vpn.java
index b9dd609..eddf414 100644
--- a/services/core/java/com/android/server/connectivity/Vpn.java
+++ b/services/core/java/com/android/server/connectivity/Vpn.java
@@ -684,6 +684,11 @@
if (((app.flags & ApplicationInfo.FLAG_SYSTEM) != 0) && (appId == app.uid)) {
return;
}
+ // SystemUI dialogs are also allowed to control VPN.
+ ApplicationInfo sysUiApp = pm.getApplicationInfo("com.android.systemui", 0);
+ if (((sysUiApp.flags & ApplicationInfo.FLAG_SYSTEM) != 0) && (appId == sysUiApp.uid)) {
+ return;
+ }
} catch (Exception e) {
// ignore
} finally {
diff --git a/services/core/java/com/android/server/dreams/DreamManagerService.java b/services/core/java/com/android/server/dreams/DreamManagerService.java
index b894304..985f77a7 100644
--- a/services/core/java/com/android/server/dreams/DreamManagerService.java
+++ b/services/core/java/com/android/server/dreams/DreamManagerService.java
@@ -249,7 +249,7 @@
private ComponentName chooseDreamForUser(boolean doze, int userId) {
if (doze) {
- ComponentName dozeComponent = getDozeComponent();
+ ComponentName dozeComponent = getDozeComponent(userId);
return validateDream(dozeComponent) ? dozeComponent : null;
}
ComponentName[] dreams = getDreamComponentsForUser(userId);
@@ -314,6 +314,10 @@
}
private ComponentName getDozeComponent() {
+ return getDozeComponent(ActivityManager.getCurrentUser());
+ }
+
+ private ComponentName getDozeComponent(int userId) {
// Read the component from a system property to facilitate debugging.
// Note that for production devices, the dream should actually be declared in
// a config.xml resource.
@@ -324,7 +328,9 @@
name = mContext.getResources().getString(
com.android.internal.R.string.config_dozeComponent);
}
- return TextUtils.isEmpty(name) ? null : ComponentName.unflattenFromString(name);
+ boolean enabled = Settings.Secure.getIntForUser(mContext.getContentResolver(),
+ Settings.Secure.DOZE_ENABLED, 1, userId) != 0;
+ return TextUtils.isEmpty(name) || !enabled ? null : ComponentName.unflattenFromString(name);
}
private ServiceInfo getServiceInfo(ComponentName name) {
diff --git a/services/core/java/com/android/server/hdmi/ActiveSourceHandler.java b/services/core/java/com/android/server/hdmi/ActiveSourceHandler.java
index f3d570e..0b9094f 100644
--- a/services/core/java/com/android/server/hdmi/ActiveSourceHandler.java
+++ b/services/core/java/com/android/server/hdmi/ActiveSourceHandler.java
@@ -71,18 +71,16 @@
tv.startNewDeviceAction(newActive);
}
- ActiveSource current = tv.getActiveSource();
if (!tv.isProhibitMode()) {
tv.updateActiveSource(newActive);
- if (!current.equals(newActive)) {
- boolean notifyInputChange = (mCallback == null);
- tv.updateActiveInput(newActive.physicalAddress, notifyInputChange);
- }
+ boolean notifyInputChange = (mCallback == null);
+ tv.updateActiveInput(newActive.physicalAddress, notifyInputChange);
invokeCallback(HdmiControlManager.RESULT_SUCCESS);
} else {
// TV is in a mode that should keep its current source/input from
// being changed for its operation. Reclaim the active source
// or switch the port back to the one used for the current mode.
+ ActiveSource current = tv.getActiveSource();
if (current.logicalAddress == getSourceAddress()) {
HdmiCecMessage activeSourceCommand = HdmiCecMessageBuilder.buildActiveSource(
current.logicalAddress, current.physicalAddress);
diff --git a/services/core/java/com/android/server/hdmi/Constants.java b/services/core/java/com/android/server/hdmi/Constants.java
index 946d4ce..7552a6a 100644
--- a/services/core/java/com/android/server/hdmi/Constants.java
+++ b/services/core/java/com/android/server/hdmi/Constants.java
@@ -162,7 +162,7 @@
// Constants related to operands of HDMI CEC commands.
// Refer to CEC Table 29 in HDMI Spec v1.4b.
// [Abort Reason]
- static final int ABORT_UNRECOGNIZED_MODE = 0;
+ static final int ABORT_UNRECOGNIZED_OPCODE = 0;
static final int ABORT_NOT_IN_CORRECT_MODE = 1;
static final int ABORT_CANNOT_PROVIDE_SOURCE = 2;
static final int ABORT_INVALID_OPERAND = 3;
@@ -178,8 +178,8 @@
static final int ROUTING_PATH_TOP_MASK = 0xF000;
static final int ROUTING_PATH_TOP_SHIFT = 12;
- static final int INVALID_PORT_ID = -1;
- static final int INVALID_PHYSICAL_ADDRESS = 0xFFFF;
+ static final int INVALID_PORT_ID = HdmiCecDeviceInfo.PORT_INVALID;
+ static final int INVALID_PHYSICAL_ADDRESS = HdmiCecDeviceInfo.PATH_INVALID;
// Send result codes. It should be consistent with hdmi_cec.h's send_message error code.
static final int SEND_RESULT_SUCCESS = 0;
diff --git a/services/core/java/com/android/server/hdmi/HdmiCecLocalDevice.java b/services/core/java/com/android/server/hdmi/HdmiCecLocalDevice.java
index c16be50..aedd632 100644
--- a/services/core/java/com/android/server/hdmi/HdmiCecLocalDevice.java
+++ b/services/core/java/com/android/server/hdmi/HdmiCecLocalDevice.java
@@ -172,7 +172,7 @@
* @return true if consumed a message; otherwise, return false.
*/
@ServiceThreadOnly
- final boolean dispatchMessage(HdmiCecMessage message) {
+ boolean dispatchMessage(HdmiCecMessage message) {
assertRunOnServiceThread();
int dest = message.getDestination();
if (dest != mAddress && dest != Constants.ADDR_BROADCAST) {
@@ -309,7 +309,7 @@
mService.sendCecCommand(
HdmiCecMessageBuilder.buildFeatureAbortCommand(mAddress,
message.getSource(), Constants.MESSAGE_GET_MENU_LANGUAGE,
- Constants.ABORT_UNRECOGNIZED_MODE));
+ Constants.ABORT_UNRECOGNIZED_OPCODE));
return true;
}
@@ -381,7 +381,7 @@
return false;
}
- private static boolean isPowerOnOrToggleCommand(HdmiCecMessage message) {
+ static boolean isPowerOnOrToggleCommand(HdmiCecMessage message) {
byte[] params = message.getParams();
return message.getOpcode() == Constants.MESSAGE_USER_CONTROL_PRESSED
&& (params[0] == HdmiCecKeycode.CEC_KEYCODE_POWER
@@ -389,7 +389,7 @@
|| params[0] == HdmiCecKeycode.CEC_KEYCODE_POWER_TOGGLE_FUNCTION);
}
- private static boolean isPowerOffOrToggleCommand(HdmiCecMessage message) {
+ static boolean isPowerOffOrToggleCommand(HdmiCecMessage message) {
byte[] params = message.getParams();
return message.getOpcode() == Constants.MESSAGE_USER_CONTROL_PRESSED
&& (params[0] == HdmiCecKeycode.CEC_KEYCODE_POWER
@@ -431,7 +431,7 @@
Slog.v(TAG, "Wrong direct vendor command. Replying with <Feature Abort>");
mService.sendCecCommand(HdmiCecMessageBuilder.buildFeatureAbortCommand(mAddress,
message.getSource(), Constants.MESSAGE_VENDOR_COMMAND_WITH_ID,
- Constants.ABORT_UNRECOGNIZED_MODE));
+ Constants.ABORT_UNRECOGNIZED_OPCODE));
} else {
Slog.v(TAG, "Wrong broadcast vendor command. Ignoring");
}
@@ -444,9 +444,10 @@
}
protected boolean handleRecordTvScreen(HdmiCecMessage message) {
- // The default behavior of <Record TV Screen> is replying <Feature Abort> with "Refused".
+ // The default behavior of <Record TV Screen> is replying <Feature Abort> with
+ // "Cannot provide source".
mService.sendCecCommand(HdmiCecMessageBuilder.buildFeatureAbortCommand(mAddress,
- message.getSource(), message.getOpcode(), Constants.ABORT_REFUSED));
+ message.getSource(), message.getOpcode(), Constants.ABORT_CANNOT_PROVIDE_SOURCE));
return true;
}
diff --git a/services/core/java/com/android/server/hdmi/HdmiCecLocalDeviceTv.java b/services/core/java/com/android/server/hdmi/HdmiCecLocalDeviceTv.java
index 9038fbc..a4550a2 100644
--- a/services/core/java/com/android/server/hdmi/HdmiCecLocalDeviceTv.java
+++ b/services/core/java/com/android/server/hdmi/HdmiCecLocalDeviceTv.java
@@ -100,12 +100,15 @@
// If true, TV wakes itself up when receiving <Text/Image View On>.
private boolean mAutoWakeup;
+ private final HdmiCecStandbyModeHandler mStandbyHandler;
+
HdmiCecLocalDeviceTv(HdmiControlService service) {
super(service, HdmiCecDeviceInfo.DEVICE_TV);
mPrevPortId = Constants.INVALID_PORT_ID;
mAutoDeviceOff = mService.readBooleanSetting(Global.HDMI_CONTROL_AUTO_DEVICE_OFF_ENABLED,
true);
mAutoWakeup = mService.readBooleanSetting(Global.HDMI_CONTROL_AUTO_WAKEUP_ENABLED, true);
+ mStandbyHandler = new HdmiCecStandbyModeHandler(service, this);
}
@Override
@@ -135,6 +138,16 @@
SystemProperties.set(Constants.PROPERTY_PREFERRED_ADDRESS_TV, String.valueOf(addr));
}
+ @Override
+ @ServiceThreadOnly
+ boolean dispatchMessage(HdmiCecMessage message) {
+ assertRunOnServiceThread();
+ if (mService.isPowerStandby() && mStandbyHandler.handleCommand(message)) {
+ return true;
+ }
+ return super.onMessage(message);
+ }
+
/**
* Performs the action 'device select', or 'one touch play' initiated by TV.
*
@@ -148,6 +161,7 @@
handleSelectInternalSource();
// Switching to internal source is always successful even when CEC control is disabled.
setActiveSource(targetAddress, mService.getPhysicalAddress());
+ setActivePath(mService.getPhysicalAddress());
invokeCallback(callback, HdmiControlManager.RESULT_SUCCESS);
return;
}
@@ -237,9 +251,9 @@
if (path == getActivePath()) {
return;
}
+ setPrevPortId(getActivePortId());
int portId = mService.pathToPortId(path);
setActivePath(path);
- setPrevPortId(portId);
// TODO: Handle PAP/PIP case.
// Show OSD port change banner
if (notifyInputChange) {
@@ -439,9 +453,10 @@
if (isTailOfActivePath(path, getActivePath())) {
removeAction(RoutingControlAction.class);
int newPath = mService.portIdToPath(getActivePortId());
+ setActivePath(newPath);
mService.sendCecCommand(HdmiCecMessageBuilder.buildRoutingChange(
mAddress, getActivePath(), newPath));
- addAndStartAction(new RoutingControlAction(this, getActivePortId(), false, null));
+ addAndStartAction(new RoutingControlAction(this, newPath, false, null));
}
}
@@ -785,8 +800,6 @@
}
private boolean isSystemAudioOn() {
-
-
synchronized (mLock) {
return mSystemAudioActivated;
}
@@ -1181,6 +1194,12 @@
mService.writeBooleanSetting(Global.HDMI_CONTROL_AUTO_WAKEUP_ENABLED, enabled);
}
+ @ServiceThreadOnly
+ boolean getAutoWakeup() {
+ assertRunOnServiceThread();
+ return mAutoWakeup;
+ }
+
@Override
@ServiceThreadOnly
protected void disableDevice(boolean initiatedByCec, PendingActionClearedCallback callback) {
diff --git a/services/core/java/com/android/server/hdmi/HdmiCecStandbyModeHandler.java b/services/core/java/com/android/server/hdmi/HdmiCecStandbyModeHandler.java
new file mode 100644
index 0000000..c653125
--- /dev/null
+++ b/services/core/java/com/android/server/hdmi/HdmiCecStandbyModeHandler.java
@@ -0,0 +1,174 @@
+/*
+ * Copyright (C) 2014 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.server.hdmi;
+
+import android.util.SparseArray;
+
+/**
+ * This class handles the incoming messages when HdmiCecService is in the standby mode.
+ */
+public final class HdmiCecStandbyModeHandler {
+
+ private interface CecMessageHandler {
+ boolean handle(HdmiCecMessage message);
+ }
+
+ private static final class Bystander implements CecMessageHandler {
+ @Override
+ public boolean handle(HdmiCecMessage message) {
+ return true;
+ }
+ }
+
+ private static final class Bypasser implements CecMessageHandler {
+ @Override
+ public boolean handle(HdmiCecMessage message) {
+ return false;
+ }
+ }
+
+ private final class Aborter implements CecMessageHandler {
+ private final int mReason;
+ public Aborter(int reason) {
+ mReason = reason;
+ }
+ @Override
+ public boolean handle(HdmiCecMessage message) {
+ int src = message.getSource();
+ int dest = message.getDestination();
+ if (src == Constants.ADDR_BROADCAST || dest == Constants.ADDR_BROADCAST) {
+ // Do not send <Feature Abort> on the message from the unassigned device
+ // or the broadcasted message.
+ return true;
+ }
+ HdmiCecMessage cecMessage = HdmiCecMessageBuilder.buildFeatureAbortCommand(
+ dest, src, message.getOpcode(), mReason);
+ mService.sendCecCommand(cecMessage);
+ return true;
+ }
+ }
+
+ private final class AutoOnHandler implements CecMessageHandler {
+ @Override
+ public boolean handle(HdmiCecMessage message) {
+ if (!mTv.getAutoWakeup()) {
+ mAborterRefused.handle(message);
+ return true;
+ }
+ return false;
+ }
+ }
+
+ private final class UserControlProcessedHandler implements CecMessageHandler {
+ @Override
+ public boolean handle(HdmiCecMessage message) {
+ // The power status here is always standby.
+ if (HdmiCecLocalDevice.isPowerOnOrToggleCommand(message)) {
+ return false;
+ } else if (HdmiCecLocalDevice.isPowerOffOrToggleCommand(message)) {
+ return true;
+ }
+ return mAborterIncorrectMode.handle(message);
+ }
+ }
+
+ private final HdmiControlService mService;
+ private final HdmiCecLocalDeviceTv mTv;
+
+ private final SparseArray<CecMessageHandler> mCecMessageHandlers = new SparseArray<>();
+ private final CecMessageHandler mDefaultHandler = new Aborter(
+ Constants.ABORT_UNRECOGNIZED_OPCODE);
+ private final CecMessageHandler mAborterIncorrectMode = new Aborter(
+ Constants.ABORT_NOT_IN_CORRECT_MODE);
+ private final CecMessageHandler mAborterRefused = new Aborter(Constants.ABORT_REFUSED);
+ private final CecMessageHandler mAutoOnHandler = new AutoOnHandler();
+ private final CecMessageHandler mBypasser = new Bypasser();
+ private final CecMessageHandler mBystander = new Bystander();
+ private final UserControlProcessedHandler
+ mUserControlProcessedHandler = new UserControlProcessedHandler();
+
+ public HdmiCecStandbyModeHandler(HdmiControlService service, HdmiCecLocalDeviceTv tv) {
+ mService = service;
+ mTv = tv;
+
+ addHandler(Constants.MESSAGE_IMAGE_VIEW_ON, mAutoOnHandler);
+ addHandler(Constants.MESSAGE_TEXT_VIEW_ON, mAutoOnHandler);
+
+ addHandler(Constants.MESSAGE_ACTIVE_SOURCE, mBystander);
+ addHandler(Constants.MESSAGE_REQUEST_ACTIVE_SOURCE, mBystander);
+ addHandler(Constants.MESSAGE_ROUTING_CHANGE, mBystander);
+ addHandler(Constants.MESSAGE_ROUTING_INFORMATION, mBystander);
+ addHandler(Constants.MESSAGE_SET_STREAM_PATH, mBystander);
+ addHandler(Constants.MESSAGE_STANDBY, mBystander);
+ addHandler(Constants.MESSAGE_SET_MENU_LANGUAGE, mBystander);
+ addHandler(Constants.MESSAGE_DEVICE_VENDOR_ID, mBystander);
+ addHandler(Constants.MESSAGE_USER_CONTROL_RELEASED, mBystander);
+ addHandler(Constants.MESSAGE_REPORT_POWER_STATUS, mBystander);
+ addHandler(Constants.MESSAGE_FEATURE_ABORT, mBystander);
+ addHandler(Constants.MESSAGE_INACTIVE_SOURCE, mBystander);
+ addHandler(Constants.MESSAGE_SYSTEM_AUDIO_MODE_STATUS, mBystander);
+ addHandler(Constants.MESSAGE_REPORT_AUDIO_STATUS, mBystander);
+
+ // If TV supports the following messages during power-on, ignore them and do nothing,
+ // else reply with <Feature Abort>["Unrecognized Opcode"]
+ // <Deck Status>, <Tuner Device Status>, <Tuner Cleared Status>, <Timer Status>
+ addHandler(Constants.MESSAGE_RECORD_STATUS, mBystander);
+
+ // If TV supports the following messages during power-on, reply with <Feature Abort>["Not
+ // in correct mode to respond"], else reply with <Feature Abort>["Unrecognized Opcode"]
+ // <Give Tuner Device Status>, <Select Digital Service>, <Tuner Step Decrement>,
+ // <Tuner Stem Increment>, <Menu Status>.
+ addHandler(Constants.MESSAGE_RECORD_TV_SCREEN, mAborterIncorrectMode);
+ addHandler(Constants.MESSAGE_INITIATE_ARC, mAborterIncorrectMode);
+ addHandler(Constants.MESSAGE_TERMINATE_ARC, mAborterIncorrectMode);
+
+ addHandler(Constants.MESSAGE_GIVE_PHYSICAL_ADDRESS, mBypasser);
+ addHandler(Constants.MESSAGE_GET_MENU_LANGUAGE, mBypasser);
+ addHandler(Constants.MESSAGE_REPORT_PHYSICAL_ADDRESS, mBypasser);
+ addHandler(Constants.MESSAGE_GIVE_DEVICE_VENDOR_ID, mBypasser);
+ addHandler(Constants.MESSAGE_GIVE_OSD_NAME, mBypasser);
+ addHandler(Constants.MESSAGE_SET_OSD_NAME, mBypasser);
+
+ addHandler(Constants.MESSAGE_USER_CONTROL_PRESSED, mUserControlProcessedHandler);
+
+ addHandler(Constants.MESSAGE_GIVE_DEVICE_POWER_STATUS, mBypasser);
+ addHandler(Constants.MESSAGE_ABORT, mBypasser);
+ addHandler(Constants.MESSAGE_GET_CEC_VERSION, mBypasser);
+
+ addHandler(Constants.MESSAGE_VENDOR_COMMAND_WITH_ID, mAborterIncorrectMode);
+ addHandler(Constants.MESSAGE_SET_SYSTEM_AUDIO_MODE, mAborterIncorrectMode);
+ }
+
+ private void addHandler(int opcode, CecMessageHandler handler) {
+ mCecMessageHandlers.put(opcode, handler);
+ }
+
+ /**
+ * Handles the CEC message in the standby mode.
+ *
+ * @param message {@link HdmiCecMessage} to be processed
+ * @return true if the message is handled in the handler, false means that the message is need
+ * to be dispatched to the local device.
+ */
+ boolean handleCommand(HdmiCecMessage message) {
+ CecMessageHandler handler = mCecMessageHandlers.get(message.getOpcode());
+ if (handler != null) {
+ return handler.handle(message);
+ }
+ return mDefaultHandler.handle(message);
+ }
+}
diff --git a/services/core/java/com/android/server/hdmi/HdmiControlService.java b/services/core/java/com/android/server/hdmi/HdmiControlService.java
index 390d121..613ae4f 100644
--- a/services/core/java/com/android/server/hdmi/HdmiControlService.java
+++ b/services/core/java/com/android/server/hdmi/HdmiControlService.java
@@ -54,6 +54,7 @@
import com.android.server.SystemService;
import com.android.server.hdmi.HdmiAnnotations.ServiceThreadOnly;
import com.android.server.hdmi.HdmiCecController.AllocateAddressCallback;
+import com.android.server.hdmi.HdmiCecLocalDevice.ActiveSource;
import com.android.server.hdmi.HdmiCecLocalDevice.PendingActionClearedCallback;
import libcore.util.EmptyArray;
@@ -259,6 +260,16 @@
}
}
+ /**
+ * Called when the initialization of local devices is complete.
+ */
+ private void onInitializeCecComplete() {
+ if (isTvDevice()) {
+ mCecController.setOption(HdmiTvClient.OPTION_CEC_AUTO_WAKEUP,
+ tv().getAutoWakeup() ? HdmiTvClient.ENABLED : HdmiTvClient.DISABLED);
+ }
+ }
+
boolean readBooleanSetting(String key, boolean defVal) {
ContentResolver cr = getContext().getContentResolver();
return Global.getInt(cr, key, defVal ? Constants.TRUE : Constants.FALSE) == Constants.TRUE;
@@ -281,7 +292,7 @@
// A container for [Logical Address, Local device info].
final SparseArray<HdmiCecLocalDevice> devices = new SparseArray<>();
final SparseIntArray finished = new SparseIntArray();
- mCecController.clearLogicalAddress();
+ clearLocalDevices();
for (int type : deviceTypes) {
final HdmiCecLocalDevice localDevice = HdmiCecLocalDevice.create(this, type);
localDevice.init();
@@ -321,6 +332,7 @@
HdmiCecLocalDevice device = devices.valueAt(i);
device.handleAddressAllocated(address, fromBootup);
}
+ onInitializeCecComplete();
}
// Initialize HDMI port information. Combine the information from CEC and MHL HAL and
@@ -720,6 +732,26 @@
}
@Override
+ public HdmiCecDeviceInfo getActiveSource() {
+ HdmiCecLocalDeviceTv tv = tv();
+ if (tv == null) {
+ Slog.w(TAG, "Local tv device not available");
+ return null;
+ }
+ ActiveSource activeSource = tv.getActiveSource();
+ if (activeSource.isValid()) {
+ return new HdmiCecDeviceInfo(activeSource.logicalAddress,
+ activeSource.physicalAddress, HdmiCecDeviceInfo.PORT_INVALID,
+ HdmiCecDeviceInfo.DEVICE_INACTIVE, 0, "");
+ }
+ int activePath = tv.getActivePath();
+ if (activePath != HdmiCecDeviceInfo.PATH_INVALID) {
+ return new HdmiCecDeviceInfo(activePath, tv.getActivePortId());
+ }
+ return null;
+ }
+
+ @Override
public void deviceSelect(final int logicalAddress, final IHdmiControlCallback callback) {
enforceAccessPermission();
runOnServiceThread(new Runnable() {
@@ -975,6 +1007,7 @@
}
switch (key) {
case HdmiTvClient.OPTION_CEC_AUTO_WAKEUP:
+ tv().setAutoWakeup(value == HdmiTvClient.ENABLED);
mCecController.setOption(key, value);
break;
case HdmiTvClient.OPTION_CEC_AUTO_DEVICE_OFF:
@@ -1415,7 +1448,9 @@
devices.remove(device);
if (devices.isEmpty()) {
onStandbyCompleted();
- clearLocalDevices();
+ // We will not clear local devices here, since some OEM/SOC will keep passing
+ // the received packets until the application processor enters to the sleep
+ // actually.
}
}
});
diff --git a/services/core/java/com/android/server/hdmi/RoutingControlAction.java b/services/core/java/com/android/server/hdmi/RoutingControlAction.java
index f05394f..f50ae9b 100644
--- a/services/core/java/com/android/server/hdmi/RoutingControlAction.java
+++ b/services/core/java/com/android/server/hdmi/RoutingControlAction.java
@@ -101,12 +101,12 @@
// If the routing path doesn't belong to the currently active one, we should
// ignore it since it might have come from other routing change sequence.
int routingPath = HdmiUtils.twoBytesToInt(params);
- if (HdmiUtils.isInActiveRoutingPath(mCurrentRoutingPath, routingPath)) {
+ if (!HdmiUtils.isInActiveRoutingPath(mCurrentRoutingPath, routingPath)) {
return true;
}
mCurrentRoutingPath = routingPath;
// Stop possible previous routing change sequence if in progress.
- removeAction(RoutingControlAction.class);
+ removeActionExcept(RoutingControlAction.class, this);
addTimer(mState, TIMEOUT_ROUTING_INFORMATION_MS);
return true;
} else if (mState == STATE_WAIT_FOR_REPORT_POWER_STATUS
diff --git a/services/core/java/com/android/server/notification/NotificationManagerService.java b/services/core/java/com/android/server/notification/NotificationManagerService.java
index a277f91..822bd5a 100644
--- a/services/core/java/com/android/server/notification/NotificationManagerService.java
+++ b/services/core/java/com/android/server/notification/NotificationManagerService.java
@@ -50,6 +50,7 @@
import android.media.IRingtonePlayer;
import android.net.Uri;
import android.os.Binder;
+import android.os.Build;
import android.os.Environment;
import android.os.Handler;
import android.os.HandlerThread;
@@ -708,6 +709,7 @@
} else if (action.equals(Intent.ACTION_USER_PRESENT)) {
// turn off LED when user passes through lock screen
mNotificationLight.turnOff();
+ mStatusBar.notificationLightOff();
} else if (action.equals(Intent.ACTION_USER_SWITCHED)) {
// reload per-user settings
mSettingsObserver.update(null);
@@ -1273,7 +1275,7 @@
final int N = mNotificationList.size();
for (int i=0; i<N; i++) {
StatusBarNotification sbn = mNotificationList.get(i).sbn;
- if (info.enabledAndUserMatches(sbn.getUserId())) {
+ if (isVisibleToListener(sbn, info)) {
list.add(sbn);
}
}
@@ -1441,7 +1443,8 @@
}
pw.println(" ");
}
-
+ pw.println(" mUseAttentionLight=" + mUseAttentionLight);
+ pw.println(" mNotificationPulseEnabled=" + mNotificationPulseEnabled);
pw.println(" mSoundNotification=" + mSoundNotification);
pw.println(" mVibrateNotification=" + mVibrateNotification);
pw.println(" mDisableNotificationAlerts=" + mDisableNotificationAlerts);
@@ -1625,7 +1628,6 @@
// Make sure we don't lose the foreground service state.
notification.flags |=
old.getNotification().flags & Notification.FLAG_FOREGROUND_SERVICE;
- mNotificationsByKey.remove(old.sbn.getKey());
r.isUpdate = true;
}
@@ -1643,7 +1645,8 @@
mRankingHelper.sort(mNotificationList);
if (notification.icon != 0) {
- mListeners.notifyPostedLocked(n);
+ StatusBarNotification oldSbn = (old != null) ? old.sbn : null;
+ mListeners.notifyPostedLocked(n, oldSbn);
} else {
Slog.e(TAG, "Not posting notification with icon==0: " + notification);
if (old != null && !old.isCanceled) {
@@ -2154,6 +2157,8 @@
break;
}
+ mNotificationsByKey.remove(r.sbn.getKey());
+
// Save it for users of getHistoricalNotifications()
mArchive.record(r.sbn);
}
@@ -2196,7 +2201,6 @@
}
mNotificationList.remove(index);
- mNotificationsByKey.remove(r.sbn.getKey());
cancelNotificationLocked(r, sendDelete, reason);
cancelGroupChildrenLocked(r, callingUid, callingPid, listenerName);
@@ -2272,7 +2276,6 @@
return true;
}
mNotificationList.remove(i);
- mNotificationsByKey.remove(r.sbn.getKey());
cancelNotificationLocked(r, false, reason);
}
if (doit && canceledNotifications != null) {
@@ -2312,7 +2315,6 @@
if ((r.getFlags() & (Notification.FLAG_ONGOING_EVENT
| Notification.FLAG_NO_CLEAR)) == 0) {
mNotificationList.remove(i);
- mNotificationsByKey.remove(r.sbn.getKey());
cancelNotificationLocked(r, true, reason);
// Make a note so we can cancel children later.
if (canceledNotifications == null) {
@@ -2333,7 +2335,7 @@
private void cancelGroupChildrenLocked(NotificationRecord r, int callingUid, int callingPid,
String listenerName) {
Notification n = r.getNotification();
- if (n.getGroup() == null || (n.flags & Notification.FLAG_GROUP_SUMMARY) == 0) {
+ if (!n.isGroupSummary()) {
return;
}
@@ -2356,7 +2358,6 @@
pkg, childSbn.getId(), childSbn.getTag(), userId, 0, 0,
REASON_GROUP_SUMMARY_CANCELED, listenerName);
mNotificationList.remove(i);
- mNotificationsByKey.remove(childR.getKey());
cancelNotificationLocked(childR, false, REASON_GROUP_SUMMARY_CANCELED);
}
}
@@ -2377,6 +2378,7 @@
// Don't flash while we are in a call or screen is on
if (mLedNotification == null || mInCall || mScreenOn) {
mNotificationLight.turnOff();
+ mStatusBar.notificationLightOff();
} else {
final Notification ledno = mLedNotification.sbn.getNotification();
int ledARGB = ledno.ledARGB;
@@ -2391,6 +2393,7 @@
// pulse repeatedly
mNotificationLight.setFlashing(ledARGB, Light.LIGHT_FLASH_TIMED,
ledOnMS, ledOffMS);
+ mStatusBar.notificationLightPulse(ledARGB, ledOnMS, ledOffMS);
}
}
}
@@ -2487,7 +2490,7 @@
ArrayList<String> interceptedKeys = new ArrayList<String>(N);
for (int i = 0; i < N; i++) {
NotificationRecord record = mNotificationList.get(i);
- if (!info.enabledAndUserMatches(record.sbn.getUserId())) {
+ if (!isVisibleToListener(record.sbn, info)) {
continue;
}
keys.add(record.sbn.getKey());
@@ -2504,6 +2507,17 @@
return new NotificationRankingUpdate(keysAr, interceptedKeysAr, speedBumpIndex);
}
+ private boolean isVisibleToListener(StatusBarNotification sbn, ManagedServiceInfo listener) {
+ if (!listener.enabledAndUserMatches(sbn.getUserId())) {
+ return false;
+ }
+ Notification n = sbn.getNotification();
+ if (listener.targetSdkVersion < Build.VERSION_CODES.L && n.isGroupChild()) {
+ return false;
+ }
+ return true;
+ }
+
public class NotificationListeners extends ManagedServices {
public NotificationListeners() {
@@ -2550,22 +2564,39 @@
/**
* asynchronously notify all listeners about a new notification
+ *
+ * <p>
+ * Also takes care of removing a notification that has been visible to a listener before,
+ * but isn't anymore.
*/
- public void notifyPostedLocked(StatusBarNotification sbn) {
+ public void notifyPostedLocked(StatusBarNotification sbn, StatusBarNotification oldSbn) {
// make a copy in case changes are made to the underlying Notification object
final StatusBarNotification sbnClone = sbn.clone();
for (final ManagedServiceInfo info : mServices) {
- if (!info.isEnabledForCurrentProfiles()) {
+ boolean sbnVisible = isVisibleToListener(sbn, info);
+ boolean oldSbnVisible = oldSbn != null ? isVisibleToListener(oldSbn, info) : false;
+ // This notification hasn't been and still isn't visible -> ignore.
+ if (!oldSbnVisible && !sbnVisible) {
continue;
}
final NotificationRankingUpdate update = makeRankingUpdateLocked(info);
- if (update.getOrderedKeys().length == 0) {
+
+ // This notification became invisible -> remove the old one.
+ if (oldSbnVisible && !sbnVisible) {
+ final StatusBarNotification oldSbnLightClone = oldSbn.cloneLight();
+ mHandler.post(new Runnable() {
+ @Override
+ public void run() {
+ notifyRemoved(info, oldSbnLightClone, update);
+ }
+ });
continue;
}
+
mHandler.post(new Runnable() {
@Override
public void run() {
- notifyPostedIfUserMatch(info, sbnClone, update);
+ notifyPosted(info, sbnClone, update);
}
});
}
@@ -2580,14 +2611,14 @@
// notification
final StatusBarNotification sbnLight = sbn.cloneLight();
for (final ManagedServiceInfo info : mServices) {
- if (!info.isEnabledForCurrentProfiles()) {
+ if (!isVisibleToListener(sbn, info)) {
continue;
}
final NotificationRankingUpdate update = makeRankingUpdateLocked(info);
mHandler.post(new Runnable() {
@Override
public void run() {
- notifyRemovedIfUserMatch(info, sbnLight, update);
+ notifyRemoved(info, sbnLight, update);
}
});
}
@@ -2601,8 +2632,7 @@
if (!serviceInfo.isEnabledForCurrentProfiles()) {
continue;
}
- final NotificationRankingUpdate update =
- makeRankingUpdateLocked(serviceInfo);
+ final NotificationRankingUpdate update = makeRankingUpdateLocked(serviceInfo);
mHandler.post(new Runnable() {
@Override
public void run() {
@@ -2626,11 +2656,8 @@
}
}
- private void notifyPostedIfUserMatch(final ManagedServiceInfo info,
+ private void notifyPosted(final ManagedServiceInfo info,
final StatusBarNotification sbn, NotificationRankingUpdate rankingUpdate) {
- if (!info.enabledAndUserMatches(sbn.getUserId())) {
- return;
- }
final INotificationListener listener = (INotificationListener)info.service;
try {
listener.onNotificationPosted(sbn, rankingUpdate);
@@ -2639,7 +2666,7 @@
}
}
- private void notifyRemovedIfUserMatch(ManagedServiceInfo info, StatusBarNotification sbn,
+ private void notifyRemoved(ManagedServiceInfo info, StatusBarNotification sbn,
NotificationRankingUpdate rankingUpdate) {
if (!info.enabledAndUserMatches(sbn.getUserId())) {
return;
diff --git a/services/core/java/com/android/server/notification/NotificationUsageStats.java b/services/core/java/com/android/server/notification/NotificationUsageStats.java
index 9b56464..4a7a971 100644
--- a/services/core/java/com/android/server/notification/NotificationUsageStats.java
+++ b/services/core/java/com/android/server/notification/NotificationUsageStats.java
@@ -468,7 +468,7 @@
private static final int MSG_DISMISS = 4;
private static final String DB_NAME = "notification_log.db";
- private static final int DB_VERSION = 3;
+ private static final int DB_VERSION = 4;
/** Age in ms after which events are pruned from the DB. */
private static final long HORIZON_MS = 7 * 24 * 60 * 60 * 1000L; // 1 week
@@ -559,32 +559,19 @@
COL_CATEGORY + " TEXT," +
COL_ACTION_COUNT + " INT," +
COL_POSTTIME_MS + " INT," +
- COL_AIRTIME_MS + " INT" +
- COL_FIRST_EXPANSIONTIME_MS + " INT" +
- COL_AIRTIME_EXPANDED_MS + " INT" +
+ COL_AIRTIME_MS + " INT," +
+ COL_FIRST_EXPANSIONTIME_MS + " INT," +
+ COL_AIRTIME_EXPANDED_MS + " INT," +
COL_EXPAND_COUNT + " INT" +
")");
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
- switch (oldVersion) {
- case 1:
- // Add COL_POSTTIME_MS, COL_AIRTIME_MS columns,
- db.execSQL("ALTER TABLE " + TAB_LOG + " ADD COLUMN " +
- COL_POSTTIME_MS + " INT");
- db.execSQL("ALTER TABLE " + TAB_LOG + " ADD COLUMN " +
- COL_AIRTIME_MS + " INT");
- case 2:
- // Add COL_EXPANSIONTIME_MS column
- db.execSQL("ALTER TABLE " + TAB_LOG + " ADD COLUMN " +
- COL_FIRST_EXPANSIONTIME_MS + " INT");
- // Add COL_AIRTIME_EXPANDED_MS column
- db.execSQL("ALTER TABLE " + TAB_LOG + " ADD COLUMN " +
- COL_AIRTIME_EXPANDED_MS + " INT");
- // Add COL_EXPAND_COUNT column
- db.execSQL("ALTER TABLE " + TAB_LOG + " ADD COLUMN " +
- COL_EXPAND_COUNT + " INT");
+ if (oldVersion <= 3) {
+ // Version 3 creation left 'log' in a weird state. Just reset for now.
+ db.execSQL("DROP TABLE IF EXISTS " + TAB_LOG);
+ onCreate(db);
}
}
};
diff --git a/services/core/java/com/android/server/pm/PackageInstallerService.java b/services/core/java/com/android/server/pm/PackageInstallerService.java
index 6036bcf..1650768 100644
--- a/services/core/java/com/android/server/pm/PackageInstallerService.java
+++ b/services/core/java/com/android/server/pm/PackageInstallerService.java
@@ -19,7 +19,22 @@
import static android.content.pm.PackageManager.INSTALL_ALL_USERS;
import static android.content.pm.PackageManager.INSTALL_FROM_ADB;
import static android.content.pm.PackageManager.INSTALL_REPLACE_EXISTING;
+import static com.android.internal.util.XmlUtils.readBitmapAttribute;
+import static com.android.internal.util.XmlUtils.readBooleanAttribute;
+import static com.android.internal.util.XmlUtils.readIntAttribute;
+import static com.android.internal.util.XmlUtils.readLongAttribute;
+import static com.android.internal.util.XmlUtils.readStringAttribute;
+import static com.android.internal.util.XmlUtils.readUriAttribute;
+import static com.android.internal.util.XmlUtils.writeBitmapAttribute;
+import static com.android.internal.util.XmlUtils.writeBooleanAttribute;
+import static com.android.internal.util.XmlUtils.writeIntAttribute;
+import static com.android.internal.util.XmlUtils.writeLongAttribute;
+import static com.android.internal.util.XmlUtils.writeStringAttribute;
+import static com.android.internal.util.XmlUtils.writeUriAttribute;
+import static org.xmlpull.v1.XmlPullParser.END_DOCUMENT;
+import static org.xmlpull.v1.XmlPullParser.START_TAG;
+import android.app.ActivityManager;
import android.app.AppOpsManager;
import android.content.Context;
import android.content.pm.IPackageDeleteObserver;
@@ -29,9 +44,14 @@
import android.content.pm.InstallSessionInfo;
import android.content.pm.InstallSessionParams;
import android.content.pm.PackageManager;
+import android.graphics.Bitmap;
import android.os.Binder;
+import android.os.Environment;
import android.os.FileUtils;
+import android.os.Handler;
import android.os.HandlerThread;
+import android.os.Looper;
+import android.os.Message;
import android.os.Process;
import android.os.RemoteCallbackList;
import android.os.RemoteException;
@@ -40,30 +60,70 @@
import android.os.UserManager;
import android.system.ErrnoException;
import android.system.Os;
+import android.text.format.DateUtils;
import android.util.ArraySet;
+import android.util.AtomicFile;
import android.util.ExceptionUtils;
+import android.util.Log;
import android.util.Slog;
import android.util.SparseArray;
+import android.util.Xml;
import com.android.internal.annotations.GuardedBy;
+import com.android.internal.util.FastXmlSerializer;
import com.android.internal.util.IndentingPrintWriter;
import com.android.server.IoThread;
+import com.android.server.pm.PackageInstallerSession.Snapshot;
import com.google.android.collect.Sets;
+import libcore.io.IoUtils;
+
+import org.xmlpull.v1.XmlPullParser;
+import org.xmlpull.v1.XmlPullParserException;
+import org.xmlpull.v1.XmlSerializer;
+
import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileNotFoundException;
+import java.io.FileOutputStream;
import java.io.FilenameFilter;
import java.io.IOException;
+import java.security.SecureRandom;
import java.util.ArrayList;
import java.util.List;
import java.util.Objects;
+import java.util.Random;
public class PackageInstallerService extends IPackageInstaller.Stub {
private static final String TAG = "PackageInstaller";
+ private static final boolean LOGD = true;
- // TODO: destroy sessions with old timestamps
// TODO: remove outstanding sessions when installer package goes away
// TODO: notify listeners in other users when package has been installed there
+ /** XML constants used in {@link #mSessionsFile} */
+ private static final String TAG_SESSIONS = "sessions";
+ private static final String TAG_SESSION = "session";
+ private static final String ATTR_SESSION_ID = "sessionId";
+ private static final String ATTR_USER_ID = "userId";
+ private static final String ATTR_INSTALLER_PACKAGE_NAME = "installerPackageName";
+ private static final String ATTR_CREATED_MILLIS = "createdMillis";
+ private static final String ATTR_SESSION_STAGE_DIR = "sessionStageDir";
+ private static final String ATTR_SEALED = "sealed";
+ private static final String ATTR_MODE = "mode";
+ private static final String ATTR_INSTALL_FLAGS = "installFlags";
+ private static final String ATTR_INSTALL_LOCATION = "installLocation";
+ private static final String ATTR_SIZE_BYTES = "sizeBytes";
+ private static final String ATTR_APP_PACKAGE_NAME = "appPackageName";
+ private static final String ATTR_APP_ICON = "appIcon";
+ private static final String ATTR_APP_LABEL = "appLabel";
+ private static final String ATTR_ORIGINATING_URI = "originatingUri";
+ private static final String ATTR_REFERRER_URI = "referrerUri";
+ private static final String ATTR_ABI_OVERRIDE = "abiOverride";
+
+ private static final long MAX_AGE_MILLIS = 3 * DateUtils.DAY_IN_MILLIS;
+ private static final long MAX_ACTIVE_SESSIONS = 1024;
+
private final Context mContext;
private final PackageManagerService mPm;
private final AppOpsManager mAppOps;
@@ -71,10 +131,21 @@
private final File mStagingDir;
private final HandlerThread mInstallThread;
- private final Callback mCallback = new Callback();
+ private final Callbacks mCallbacks;
- @GuardedBy("mSessions")
- private int mNextSessionId;
+ /**
+ * File storing persisted {@link #mSessions}.
+ */
+ private final AtomicFile mSessionsFile;
+
+ private final InternalCallback mInternalCallback = new InternalCallback();
+
+ /**
+ * Used for generating session IDs. Since this is created at boot time,
+ * normal random might be predictable.
+ */
+ private final Random mRandom = new SecureRandom();
+
@GuardedBy("mSessions")
private final SparseArray<PackageInstallerSession> mSessions = new SparseArray<>();
@@ -82,8 +153,6 @@
@GuardedBy("mSessions")
private final SparseArray<PackageInstallerSession> mHistoricalSessions = new SparseArray<>();
- private RemoteCallbackList<IPackageInstallerCallback> mCallbacks = new RemoteCallbackList<>();
-
private static final FilenameFilter sStageFilter = new FilenameFilter() {
@Override
public boolean accept(File dir, String name) {
@@ -101,6 +170,11 @@
mInstallThread = new HandlerThread(TAG);
mInstallThread.start();
+ mCallbacks = new Callbacks(mInstallThread.getLooper());
+
+ mSessionsFile = new AtomicFile(
+ new File(Environment.getSystemSecureDirectory(), "install_sessions.xml"));
+
synchronized (mSessions) {
readSessionsLocked();
@@ -133,13 +207,140 @@
}
private void readSessionsLocked() {
- // TODO: implement persisting
+ if (LOGD) Slog.v(TAG, "readSessionsLocked()");
+
mSessions.clear();
- mNextSessionId = 1;
+
+ FileInputStream fis = null;
+ try {
+ fis = mSessionsFile.openRead();
+ final XmlPullParser in = Xml.newPullParser();
+ in.setInput(fis, null);
+
+ int type;
+ while ((type = in.next()) != END_DOCUMENT) {
+ if (type == START_TAG) {
+ final String tag = in.getName();
+ if (TAG_SESSION.equals(tag)) {
+ final PackageInstallerSession session = readSessionLocked(in);
+ final long age = System.currentTimeMillis() - session.createdMillis;
+
+ final boolean valid;
+ if (age >= MAX_AGE_MILLIS) {
+ Slog.w(TAG, "Abandoning old session first created at "
+ + session.createdMillis);
+ valid = false;
+ } else if (!session.sessionStageDir.exists()) {
+ Slog.w(TAG, "Abandoning session with missing stage "
+ + session.sessionStageDir);
+ valid = false;
+ } else {
+ valid = true;
+ }
+
+ if (valid) {
+ mSessions.put(session.sessionId, session);
+ } else {
+ // Since this is early during boot we don't send
+ // any observer events about the session, but we
+ // keep details around for dumpsys.
+ mHistoricalSessions.put(session.sessionId, session);
+ }
+ }
+ }
+ }
+ } catch (FileNotFoundException e) {
+ // Missing sessions are okay, probably first boot
+ } catch (IOException e) {
+ Log.wtf(TAG, "Failed reading install sessions", e);
+ } catch (XmlPullParserException e) {
+ Log.wtf(TAG, "Failed reading install sessions", e);
+ } finally {
+ IoUtils.closeQuietly(fis);
+ }
+ }
+
+ private PackageInstallerSession readSessionLocked(XmlPullParser in) throws IOException {
+ final int sessionId = readIntAttribute(in, ATTR_SESSION_ID);
+ final int userId = readIntAttribute(in, ATTR_USER_ID);
+ final String installerPackageName = readStringAttribute(in, ATTR_INSTALLER_PACKAGE_NAME);
+ final long createdMillis = readLongAttribute(in, ATTR_CREATED_MILLIS);
+ final File sessionStageDir = new File(readStringAttribute(in, ATTR_SESSION_STAGE_DIR));
+ final boolean sealed = readBooleanAttribute(in, ATTR_SEALED);
+
+ final InstallSessionParams params = new InstallSessionParams(
+ InstallSessionParams.MODE_INVALID);
+ params.mode = readIntAttribute(in, ATTR_MODE);
+ params.installFlags = readIntAttribute(in, ATTR_INSTALL_FLAGS);
+ params.installLocation = readIntAttribute(in, ATTR_INSTALL_LOCATION);
+ params.sizeBytes = readLongAttribute(in, ATTR_SIZE_BYTES);
+ params.appPackageName = readStringAttribute(in, ATTR_APP_PACKAGE_NAME);
+ params.appIcon = readBitmapAttribute(in, ATTR_APP_ICON);
+ params.appLabel = readStringAttribute(in, ATTR_APP_LABEL);
+ params.originatingUri = readUriAttribute(in, ATTR_ORIGINATING_URI);
+ params.referrerUri = readUriAttribute(in, ATTR_REFERRER_URI);
+ params.abiOverride = readStringAttribute(in, ATTR_ABI_OVERRIDE);
+
+ return new PackageInstallerSession(mInternalCallback, mPm, mInstallThread.getLooper(),
+ sessionId, userId, installerPackageName, params, createdMillis, sessionStageDir,
+ sealed);
}
private void writeSessionsLocked() {
- // TODO: implement persisting
+ if (LOGD) Slog.v(TAG, "writeSessionsLocked()");
+
+ FileOutputStream fos = null;
+ try {
+ fos = mSessionsFile.startWrite();
+
+ XmlSerializer out = new FastXmlSerializer();
+ out.setOutput(fos, "utf-8");
+ out.startDocument(null, true);
+ out.startTag(null, TAG_SESSIONS);
+ final int size = mSessions.size();
+ for (int i = 0; i < size; i++) {
+ final PackageInstallerSession session = mSessions.valueAt(i);
+ writeSessionLocked(out, session);
+ }
+ out.endTag(null, TAG_SESSIONS);
+ out.endDocument();
+
+ mSessionsFile.finishWrite(fos);
+ } catch (IOException e) {
+ if (fos != null) {
+ mSessionsFile.failWrite(fos);
+ }
+ }
+ }
+
+ private void writeSessionLocked(XmlSerializer out, PackageInstallerSession session)
+ throws IOException {
+ final InstallSessionParams params = session.params;
+ final Snapshot snapshot = session.snapshot();
+
+ out.startTag(null, TAG_SESSION);
+
+ writeIntAttribute(out, ATTR_SESSION_ID, session.sessionId);
+ writeIntAttribute(out, ATTR_USER_ID, session.userId);
+ writeStringAttribute(out, ATTR_INSTALLER_PACKAGE_NAME,
+ session.installerPackageName);
+ writeLongAttribute(out, ATTR_CREATED_MILLIS, session.createdMillis);
+ writeStringAttribute(out, ATTR_SESSION_STAGE_DIR,
+ session.sessionStageDir.getAbsolutePath());
+ writeBooleanAttribute(out, ATTR_SEALED, snapshot.sealed);
+
+ writeIntAttribute(out, ATTR_MODE, params.mode);
+ writeIntAttribute(out, ATTR_INSTALL_FLAGS, params.installFlags);
+ writeIntAttribute(out, ATTR_INSTALL_LOCATION, params.installLocation);
+ writeLongAttribute(out, ATTR_SIZE_BYTES, params.sizeBytes);
+ writeStringAttribute(out, ATTR_APP_PACKAGE_NAME, params.appPackageName);
+ writeBitmapAttribute(out, ATTR_APP_ICON, params.appIcon);
+ writeStringAttribute(out, ATTR_APP_LABEL, params.appLabel);
+ writeUriAttribute(out, ATTR_ORIGINATING_URI, params.originatingUri);
+ writeUriAttribute(out, ATTR_REFERRER_URI, params.referrerUri);
+ writeStringAttribute(out, ATTR_ABI_OVERRIDE, params.abiOverride);
+
+ out.endTag(null, TAG_SESSION);
}
private void writeSessionsAsync() {
@@ -163,8 +364,11 @@
throw new SecurityException("User restriction prevents installing");
}
- if ((callingUid == Process.SHELL_UID) || (callingUid == 0)) {
+ if ((callingUid == Process.SHELL_UID) || (callingUid == Process.ROOT_UID)) {
+ installerPackageName = "com.android.shell";
+
params.installFlags |= INSTALL_FROM_ADB;
+
} else {
mAppOps.checkPackage(callingUid, installerPackageName);
@@ -181,6 +385,18 @@
throw new IllegalArgumentException("Params must have valid mode set");
}
+ // Defensively resize giant app icons
+ if (params.appIcon != null) {
+ final ActivityManager am = (ActivityManager) mContext.getSystemService(
+ Context.ACTIVITY_SERVICE);
+ final int iconSize = am.getLauncherLargeIconSize();
+ if ((params.appIcon.getWidth() > iconSize * 2)
+ || (params.appIcon.getHeight() > iconSize * 2)) {
+ params.appIcon = Bitmap.createScaledBitmap(params.appIcon, iconSize, iconSize,
+ true);
+ }
+ }
+
// Sanity check that install could fit
if (params.sizeBytes > 0) {
try {
@@ -193,18 +409,24 @@
final int sessionId;
final PackageInstallerSession session;
synchronized (mSessions) {
+ // Sanity check that installer isn't going crazy
+ final int activeCount = getSessionCountLocked(callingUid);
+ if (activeCount >= MAX_ACTIVE_SESSIONS) {
+ throw new IllegalStateException("Too many active sessions for UID " + callingUid);
+ }
+
sessionId = allocateSessionIdLocked();
final long createdMillis = System.currentTimeMillis();
final File sessionStageDir = prepareSessionStageDir(sessionId);
- session = new PackageInstallerSession(mCallback, mPm, sessionId, userId,
- installerPackageName, callingUid, params, createdMillis, sessionStageDir,
- mInstallThread.getLooper());
+ session = new PackageInstallerSession(mInternalCallback, mPm,
+ mInstallThread.getLooper(), sessionId, userId, installerPackageName, params,
+ createdMillis, sessionStageDir, false);
mSessions.put(sessionId, session);
}
- notifySessionCreated(session.generateInfo());
+ mCallbacks.notifySessionCreated(session.sessionId, session.userId);
writeSessionsAsync();
return sessionId;
}
@@ -216,25 +438,34 @@
if (session == null) {
throw new IllegalStateException("Missing session " + sessionId);
}
- if (Binder.getCallingUid() != session.installerUid) {
+ if (!isCallingUidOwner(session)) {
throw new SecurityException("Caller has no access to session " + sessionId);
}
+ if (session.openCount.getAndIncrement() == 0) {
+ mCallbacks.notifySessionOpened(sessionId, session.userId);
+ }
return session;
}
}
private int allocateSessionIdLocked() {
- if (mSessions.get(mNextSessionId) != null) {
- throw new IllegalStateException("Next session already allocated");
- }
- return mNextSessionId++;
+ int n = 0;
+ int sessionId;
+ do {
+ sessionId = mRandom.nextInt(Integer.MAX_VALUE);
+ if (mSessions.get(sessionId) == null) {
+ return sessionId;
+ }
+ } while (n++ < 32);
+
+ throw new IllegalStateException("Failed to allocate session ID");
}
private File prepareSessionStageDir(int sessionId) {
final File file = new File(mStagingDir, "vmdl" + sessionId + ".tmp");
if (file.exists()) {
- throw new IllegalStateException();
+ throw new IllegalStateException("Session dir already exists: " + file);
}
try {
@@ -246,7 +477,7 @@
}
if (!SELinux.restorecon(file)) {
- throw new IllegalStateException("Failed to prepare session dir");
+ throw new IllegalStateException("Failed to restorecon session dir");
}
return file;
@@ -256,9 +487,7 @@
public InstallSessionInfo getSessionInfo(int sessionId) {
synchronized (mSessions) {
final PackageInstallerSession session = mSessions.get(sessionId);
- final boolean isOwner = (session != null)
- && (session.installerUid == Binder.getCallingUid());
- if (!isOwner) {
+ if (!isCallingUidOwner(session)) {
enforceCallerCanReadSessions();
}
return session != null ? session.generateInfo() : null;
@@ -323,7 +552,7 @@
mPm.enforceCrossUserPermission(Binder.getCallingUid(), userId, true, "registerCallback");
enforceCallerCanReadSessions();
- mCallbacks.register(callback, new UserHandle(userId));
+ mCallbacks.register(callback, userId);
}
@Override
@@ -331,9 +560,24 @@
mCallbacks.unregister(callback);
}
- private int getSessionUserId(int sessionId) {
- synchronized (mSessions) {
- return UserHandle.getUserId(mSessions.get(sessionId).installerUid);
+ private int getSessionCountLocked(int installerUid) {
+ int count = 0;
+ final int size = mSessions.size();
+ for (int i = 0; i < size; i++) {
+ final PackageInstallerSession session = mSessions.valueAt(i);
+ if (session.installerUid == installerUid) {
+ count++;
+ }
+ }
+ return count;
+ }
+
+ private boolean isCallingUidOwner(PackageInstallerSession session) {
+ final int callingUid = Binder.getCallingUid();
+ if (callingUid == Process.ROOT_UID) {
+ return true;
+ } else {
+ return (session != null) && (callingUid == session.installerUid);
}
}
@@ -352,53 +596,87 @@
}
}
- private void notifySessionCreated(InstallSessionInfo info) {
- final int userId = getSessionUserId(info.sessionId);
- final int n = mCallbacks.beginBroadcast();
- for (int i = 0; i < n; i++) {
- final IPackageInstallerCallback callback = mCallbacks.getBroadcastItem(i);
- final UserHandle user = (UserHandle) mCallbacks.getBroadcastCookie(i);
- // TODO: dispatch notifications for slave profiles
- if (userId == user.getIdentifier()) {
- try {
- callback.onSessionCreated(info.sessionId);
- } catch (RemoteException ignored) {
- }
- }
- }
- mCallbacks.finishBroadcast();
- }
+ private static class Callbacks extends Handler {
+ private static final int MSG_SESSION_CREATED = 1;
+ private static final int MSG_SESSION_OPENED = 2;
+ private static final int MSG_SESSION_PROGRESS_CHANGED = 3;
+ private static final int MSG_SESSION_CLOSED = 4;
+ private static final int MSG_SESSION_FINISHED = 5;
- private void notifySessionProgressChanged(int sessionId, float progress) {
- final int userId = getSessionUserId(sessionId);
- final int n = mCallbacks.beginBroadcast();
- for (int i = 0; i < n; i++) {
- final IPackageInstallerCallback callback = mCallbacks.getBroadcastItem(i);
- final UserHandle user = (UserHandle) mCallbacks.getBroadcastCookie(i);
- if (userId == user.getIdentifier()) {
- try {
- callback.onSessionProgressChanged(sessionId, progress);
- } catch (RemoteException ignored) {
- }
- }
- }
- mCallbacks.finishBroadcast();
- }
+ private final RemoteCallbackList<IPackageInstallerCallback>
+ mCallbacks = new RemoteCallbackList<>();
- private void notifySessionFinished(int sessionId, boolean success) {
- final int userId = getSessionUserId(sessionId);
- final int n = mCallbacks.beginBroadcast();
- for (int i = 0; i < n; i++) {
- final IPackageInstallerCallback callback = mCallbacks.getBroadcastItem(i);
- final UserHandle user = (UserHandle) mCallbacks.getBroadcastCookie(i);
- if (userId == user.getIdentifier()) {
- try {
- callback.onSessionFinished(sessionId, success);
- } catch (RemoteException ignored) {
+ public Callbacks(Looper looper) {
+ super(looper);
+ }
+
+ public void register(IPackageInstallerCallback callback, int userId) {
+ mCallbacks.register(callback, new UserHandle(userId));
+ }
+
+ public void unregister(IPackageInstallerCallback callback) {
+ mCallbacks.unregister(callback);
+ }
+
+ @Override
+ public void handleMessage(Message msg) {
+ final int userId = msg.arg2;
+ final int n = mCallbacks.beginBroadcast();
+ for (int i = 0; i < n; i++) {
+ final IPackageInstallerCallback callback = mCallbacks.getBroadcastItem(i);
+ final UserHandle user = (UserHandle) mCallbacks.getBroadcastCookie(i);
+ // TODO: dispatch notifications for slave profiles
+ if (userId == user.getIdentifier()) {
+ try {
+ invokeCallback(callback, msg);
+ } catch (RemoteException ignored) {
+ }
}
}
+ mCallbacks.finishBroadcast();
}
- mCallbacks.finishBroadcast();
+
+ private void invokeCallback(IPackageInstallerCallback callback, Message msg)
+ throws RemoteException {
+ final int sessionId = msg.arg1;
+ switch (msg.what) {
+ case MSG_SESSION_CREATED:
+ callback.onSessionCreated(sessionId);
+ break;
+ case MSG_SESSION_OPENED:
+ callback.onSessionOpened(sessionId);
+ break;
+ case MSG_SESSION_PROGRESS_CHANGED:
+ callback.onSessionProgressChanged(sessionId, (float) msg.obj);
+ break;
+ case MSG_SESSION_CLOSED:
+ callback.onSessionClosed(sessionId);
+ break;
+ case MSG_SESSION_FINISHED:
+ callback.onSessionFinished(sessionId, (boolean) msg.obj);
+ break;
+ }
+ }
+
+ private void notifySessionCreated(int sessionId, int userId) {
+ obtainMessage(MSG_SESSION_CREATED, sessionId, userId).sendToTarget();
+ }
+
+ private void notifySessionOpened(int sessionId, int userId) {
+ obtainMessage(MSG_SESSION_OPENED, sessionId, userId).sendToTarget();
+ }
+
+ private void notifySessionProgressChanged(int sessionId, int userId, float progress) {
+ obtainMessage(MSG_SESSION_PROGRESS_CHANGED, sessionId, userId, progress).sendToTarget();
+ }
+
+ private void notifySessionClosed(int sessionId, int userId) {
+ obtainMessage(MSG_SESSION_CLOSED, sessionId, userId).sendToTarget();
+ }
+
+ public void notifySessionFinished(int sessionId, int userId, boolean success) {
+ obtainMessage(MSG_SESSION_FINISHED, sessionId, userId, success).sendToTarget();
+ }
}
void dump(IndentingPrintWriter pw) {
@@ -427,13 +705,17 @@
}
}
- class Callback {
+ class InternalCallback {
public void onSessionProgressChanged(PackageInstallerSession session, float progress) {
- notifySessionProgressChanged(session.sessionId, progress);
+ mCallbacks.notifySessionProgressChanged(session.sessionId, session.userId, progress);
+ }
+
+ public void onSessionClosed(PackageInstallerSession session) {
+ mCallbacks.notifySessionClosed(session.sessionId, session.userId);
}
public void onSessionFinished(PackageInstallerSession session, boolean success) {
- notifySessionFinished(session.sessionId, success);
+ mCallbacks.notifySessionFinished(session.sessionId, session.userId, success);
synchronized (mSessions) {
mSessions.remove(session.sessionId);
mHistoricalSessions.put(session.sessionId, session);
diff --git a/services/core/java/com/android/server/pm/PackageInstallerSession.java b/services/core/java/com/android/server/pm/PackageInstallerSession.java
index 06e1d53..26019db 100644
--- a/services/core/java/com/android/server/pm/PackageInstallerSession.java
+++ b/services/core/java/com/android/server/pm/PackageInstallerSession.java
@@ -21,6 +21,7 @@
import static android.content.pm.PackageManager.INSTALL_FAILED_INVALID_APK;
import static android.content.pm.PackageManager.INSTALL_FAILED_PACKAGE_CHANGED;
import static android.system.OsConstants.O_CREAT;
+import static android.system.OsConstants.O_RDONLY;
import static android.system.OsConstants.O_WRONLY;
import android.content.pm.ApplicationInfo;
@@ -40,7 +41,6 @@
import android.os.Looper;
import android.os.Message;
import android.os.ParcelFileDescriptor;
-import android.os.Process;
import android.os.RemoteException;
import android.os.UserHandle;
import android.system.ErrnoException;
@@ -52,6 +52,7 @@
import android.util.MathUtils;
import android.util.Slog;
+import com.android.internal.annotations.GuardedBy;
import com.android.internal.util.ArrayUtils;
import com.android.internal.util.IndentingPrintWriter;
import com.android.internal.util.Preconditions;
@@ -62,33 +63,64 @@
import java.io.FileDescriptor;
import java.io.IOException;
import java.util.ArrayList;
+import java.util.concurrent.atomic.AtomicInteger;
public class PackageInstallerSession extends IPackageInstallerSession.Stub {
private static final String TAG = "PackageInstaller";
private static final boolean LOGD = true;
+ private static final int MSG_COMMIT = 0;
+
// TODO: enforce INSTALL_ALLOW_TEST
// TODO: enforce INSTALL_ALLOW_DOWNGRADE
// TODO: handle INSTALL_EXTERNAL, INSTALL_INTERNAL
// TODO: treat INHERIT_EXISTING as installExistingPackage()
- private final PackageInstallerService.Callback mCallback;
+ private final PackageInstallerService.InternalCallback mCallback;
private final PackageManagerService mPm;
private final Handler mHandler;
- public final int sessionId;
- public final int userId;
- public final String installerPackageName;
- /** UID not persisted */
- public final int installerUid;
- public final InstallSessionParams params;
- public final long createdMillis;
- public final File sessionStageDir;
+ final int sessionId;
+ final int userId;
+ final String installerPackageName;
+ final InstallSessionParams params;
+ final long createdMillis;
+ final File sessionStageDir;
- private static final int MSG_COMMIT = 0;
+ /** Note that UID is not persisted; it's always derived at runtime. */
+ final int installerUid;
- private Handler.Callback mHandlerCallback = new Handler.Callback() {
+ AtomicInteger openCount = new AtomicInteger();
+
+ private final Object mLock = new Object();
+
+ @GuardedBy("mLock")
+ private float mClientProgress = 0;
+ @GuardedBy("mLock")
+ private float mProgress = 0;
+ @GuardedBy("mLock")
+ private float mReportedProgress = -1;
+
+ @GuardedBy("mLock")
+ private boolean mSealed = false;
+ @GuardedBy("mLock")
+ private boolean mPermissionsConfirmed = false;
+ @GuardedBy("mLock")
+ private boolean mDestroyed = false;
+
+ @GuardedBy("mLock")
+ private ArrayList<FileBridge> mBridges = new ArrayList<>();
+
+ @GuardedBy("mLock")
+ private IPackageInstallObserver2 mRemoteObserver;
+
+ /** Fields derived from commit parsing */
+ private String mPackageName;
+ private int mVersionCode;
+ private Signature[] mSignatures;
+
+ private final Handler.Callback mHandlerCallback = new Handler.Callback() {
@Override
public boolean handleMessage(Message msg) {
synchronized (mLock) {
@@ -114,27 +146,10 @@
}
};
- private final Object mLock = new Object();
-
- private float mClientProgress;
- private float mProgress = 0;
-
- private String mPackageName;
- private int mVersionCode;
- private Signature[] mSignatures;
-
- private boolean mMutationsAllowed;
- private boolean mPermissionsConfirmed;
- private boolean mInvalid;
-
- private ArrayList<FileBridge> mBridges = new ArrayList<>();
-
- private IPackageInstallObserver2 mRemoteObserver;
-
- public PackageInstallerSession(PackageInstallerService.Callback callback,
- PackageManagerService pm, int sessionId, int userId, String installerPackageName,
- int installerUid, InstallSessionParams params, long createdMillis, File sessionStageDir,
- Looper looper) {
+ public PackageInstallerSession(PackageInstallerService.InternalCallback callback,
+ PackageManagerService pm, Looper looper, int sessionId, int userId,
+ String installerPackageName, InstallSessionParams params, long createdMillis,
+ File sessionStageDir, boolean sealed) {
mCallback = callback;
mPm = pm;
mHandler = new Handler(looper, mHandlerCallback);
@@ -142,24 +157,23 @@
this.sessionId = sessionId;
this.userId = userId;
this.installerPackageName = installerPackageName;
- this.installerUid = installerUid;
this.params = params;
this.createdMillis = createdMillis;
this.sessionStageDir = sessionStageDir;
- // Check against any explicitly provided signatures
- mSignatures = params.signatures;
+ mSealed = sealed;
- // TODO: splice in flag when restoring persisted session
- mMutationsAllowed = true;
+ // Always derived at runtime
+ installerUid = mPm.getPackageUid(installerPackageName, userId);
- if (pm.checkPermission(android.Manifest.permission.INSTALL_PACKAGES, installerPackageName)
- == PackageManager.PERMISSION_GRANTED) {
+ if (mPm.checkPermission(android.Manifest.permission.INSTALL_PACKAGES,
+ installerPackageName) == PackageManager.PERMISSION_GRANTED) {
mPermissionsConfirmed = true;
+ } else {
+ mPermissionsConfirmed = false;
}
- if (installerUid == Process.SHELL_UID || installerUid == 0) {
- mPermissionsConfirmed = true;
- }
+
+ computeProgressLocked();
}
public InstallSessionInfo generateInfo() {
@@ -168,6 +182,7 @@
info.sessionId = sessionId;
info.installerPackageName = installerPackageName;
info.progress = mProgress;
+ info.open = openCount.get() > 0;
info.mode = params.mode;
info.sizeBytes = params.sizeBytes;
@@ -178,16 +193,48 @@
return info;
}
+ private void assertNotSealed(String cookie) {
+ synchronized (mLock) {
+ if (mSealed) {
+ throw new SecurityException(cookie + " not allowed after commit");
+ }
+ }
+ }
+
@Override
public void setClientProgress(float progress) {
- mClientProgress = progress;
- mProgress = MathUtils.constrain(mClientProgress * 0.8f, 0f, 0.8f);
- mCallback.onSessionProgressChanged(this, mProgress);
+ synchronized (mLock) {
+ mClientProgress = progress;
+ computeProgressLocked();
+ }
+ maybePublishProgress();
}
@Override
public void addClientProgress(float progress) {
- setClientProgress(mClientProgress + progress);
+ synchronized (mLock) {
+ mClientProgress += progress;
+ computeProgressLocked();
+ }
+ maybePublishProgress();
+ }
+
+ private void computeProgressLocked() {
+ mProgress = MathUtils.constrain(mClientProgress * 0.8f, 0f, 0.8f);
+ }
+
+ private void maybePublishProgress() {
+ // Only publish when meaningful change
+ if (Math.abs(mProgress - mReportedProgress) > 0.01) {
+ mReportedProgress = mProgress;
+ mCallback.onSessionProgressChanged(this, mProgress);
+ }
+ }
+
+ @Override
+ public String[] list() {
+ assertNotSealed("list");
+ return sessionStageDir.list();
}
@Override
@@ -208,9 +255,7 @@
// will block any attempted install transitions.
final FileBridge bridge;
synchronized (mLock) {
- if (!mMutationsAllowed) {
- throw new IllegalStateException("Mutations not allowed");
- }
+ assertNotSealed("openWrite");
bridge = new FileBridge();
mBridges.add(bridge);
@@ -252,25 +297,51 @@
}
@Override
+ public ParcelFileDescriptor openRead(String name) {
+ try {
+ return openReadInternal(name);
+ } catch (IOException e) {
+ throw ExceptionUtils.wrap(e);
+ }
+ }
+
+ private ParcelFileDescriptor openReadInternal(String name) throws IOException {
+ assertNotSealed("openRead");
+
+ try {
+ if (!FileUtils.isValidExtFilename(name)) {
+ throw new IllegalArgumentException("Invalid name: " + name);
+ }
+ final File target = new File(sessionStageDir, name);
+
+ final FileDescriptor targetFd = Libcore.os.open(target.getAbsolutePath(), O_RDONLY, 0);
+ return new ParcelFileDescriptor(targetFd);
+
+ } catch (ErrnoException e) {
+ throw e.rethrowAsIOException();
+ }
+ }
+
+ @Override
public void commit(IPackageInstallObserver2 observer) {
Preconditions.checkNotNull(observer);
mHandler.obtainMessage(MSG_COMMIT, observer).sendToTarget();
}
private void commitLocked() throws PackageManagerException {
- if (mInvalid) {
+ if (mDestroyed) {
throw new PackageManagerException(INSTALL_FAILED_ALREADY_EXISTS, "Invalid session");
}
// Verify that all writers are hands-off
- if (mMutationsAllowed) {
+ if (!mSealed) {
for (FileBridge bridge : mBridges) {
if (!bridge.isClosed()) {
throw new PackageManagerException(INSTALL_FAILED_PACKAGE_CHANGED,
"Files still open");
}
}
- mMutationsAllowed = false;
+ mSealed = true;
// TODO: persist disabled mutations before going forward, since
// beyond this point we may have hardlinks to the valid install
@@ -331,6 +402,7 @@
private void validateInstallLocked() throws PackageManagerException {
mPackageName = null;
mVersionCode = -1;
+ mSignatures = null;
final File[] files = sessionStageDir.listFiles();
if (ArrayUtils.isEmpty(files)) {
@@ -461,7 +533,9 @@
@Override
public void close() {
- // Currently ignored
+ if (openCount.decrementAndGet() == 0) {
+ mCallback.onSessionClosed(this);
+ }
}
@Override
@@ -475,7 +549,8 @@
private void destroyInternal() {
synchronized (mLock) {
- mInvalid = true;
+ mSealed = true;
+ mDestroyed = true;
}
FileUtils.deleteContents(sessionStageDir);
sessionStageDir.delete();
@@ -496,11 +571,26 @@
pw.printPair("mClientProgress", mClientProgress);
pw.printPair("mProgress", mProgress);
- pw.printPair("mMutationsAllowed", mMutationsAllowed);
+ pw.printPair("mSealed", mSealed);
pw.printPair("mPermissionsConfirmed", mPermissionsConfirmed);
+ pw.printPair("mDestroyed", mDestroyed);
pw.printPair("mBridges", mBridges.size());
pw.println();
pw.decreaseIndent();
}
+
+ Snapshot snapshot() {
+ return new Snapshot(this);
+ }
+
+ static class Snapshot {
+ final float clientProgress;
+ final boolean sealed;
+
+ public Snapshot(PackageInstallerSession session) {
+ clientProgress = session.mClientProgress;
+ sealed = session.mSealed;
+ }
+ }
}
diff --git a/services/core/java/com/android/server/pm/PackageManagerService.java b/services/core/java/com/android/server/pm/PackageManagerService.java
index ee6d4d0..2b55bf5 100644
--- a/services/core/java/com/android/server/pm/PackageManagerService.java
+++ b/services/core/java/com/android/server/pm/PackageManagerService.java
@@ -8257,11 +8257,11 @@
// A restore should be performed at this point if (a) the install
// succeeded, (b) the operation is not an update, and (c) the new
- // package has a backupAgent defined.
+ // package has not opted out of backup participation.
final boolean update = res.removedInfo.removedPackage != null;
- boolean doRestore = (!update
- && res.pkg != null
- && res.pkg.applicationInfo.backupAgentName != null);
+ final int flags = (res.pkg == null) ? 0 : res.pkg.applicationInfo.flags;
+ boolean doRestore = !update
+ && ((flags & ApplicationInfo.FLAG_ALLOW_BACKUP) != 0);
// Set up the post-install work request bookkeeping. This will be used
// and cleaned up by the post-install event handling regardless of whether
diff --git a/services/core/java/com/android/server/power/PowerManagerService.java b/services/core/java/com/android/server/power/PowerManagerService.java
index 8c52fad..d1182e9 100644
--- a/services/core/java/com/android/server/power/PowerManagerService.java
+++ b/services/core/java/com/android/server/power/PowerManagerService.java
@@ -422,6 +422,9 @@
// Current state of whether the settings are allowing auto low power mode.
private boolean mAutoLowPowerModeEnabled;
+ // The user turned off low power mode below the trigger level
+ private boolean mAutoLowPowerModeSnoozing;
+
// True if the battery level is currently considered low.
private boolean mBatteryLevelLow;
@@ -650,9 +653,23 @@
final boolean lowPowerModeEnabled = Settings.Global.getInt(resolver,
Settings.Global.LOW_POWER_MODE, 0) != 0;
final boolean autoLowPowerModeEnabled = Settings.Global.getInt(resolver,
- Settings.Global.LOW_POWER_MODE_TRIGGER_LEVEL, 15) != 0;
+ Settings.Global.LOW_POWER_MODE_TRIGGER_LEVEL, 0) != 0;
if (lowPowerModeEnabled != mLowPowerModeSetting
|| autoLowPowerModeEnabled != mAutoLowPowerModeEnabled) {
+ if (lowPowerModeEnabled != mLowPowerModeSetting) {
+ if (!mAutoLowPowerModeSnoozing && !lowPowerModeEnabled && !mIsPowered
+ && mAutoLowPowerModeEnabled) {
+ if (DEBUG_SPEW) {
+ Slog.d(TAG, "updateSettingsLocked: snoozing low power mode");
+ }
+ mAutoLowPowerModeSnoozing = true;
+ } else if (mAutoLowPowerModeSnoozing && lowPowerModeEnabled) {
+ if (DEBUG_SPEW) {
+ Slog.d(TAG, "updateSettingsLocked: no longer snoozing low power mode");
+ }
+ mAutoLowPowerModeSnoozing = true;
+ }
+ }
mLowPowerModeSetting = lowPowerModeEnabled;
mAutoLowPowerModeEnabled = autoLowPowerModeEnabled;
updateLowPowerModeLocked();
@@ -662,8 +679,25 @@
}
void updateLowPowerModeLocked() {
- final boolean lowPowerModeEnabled = !mIsPowered
- && (mLowPowerModeSetting || (mAutoLowPowerModeEnabled && mBatteryLevelLow));
+ if (mIsPowered && mLowPowerModeSetting) {
+ if (DEBUG_SPEW) {
+ Slog.d(TAG, "updateLowPowerModeLocked: powered, turning setting off");
+ }
+ // Turn setting off if powered
+ Settings.Global.putInt(mContext.getContentResolver(),
+ Settings.Global.LOW_POWER_MODE, 0);
+ mLowPowerModeSetting = false;
+ } else if (!mIsPowered && mAutoLowPowerModeEnabled && !mAutoLowPowerModeSnoozing
+ && mBatteryLevelLow && !mLowPowerModeSetting) {
+ if (DEBUG_SPEW) {
+ Slog.d(TAG, "updateLowPowerModeLocked: trigger level reached, turning setting on");
+ }
+ // Turn setting on if trigger level is enabled, and we're now below it
+ Settings.Global.putInt(mContext.getContentResolver(),
+ Settings.Global.LOW_POWER_MODE, 1);
+ mLowPowerModeSetting = true;
+ }
+ final boolean lowPowerModeEnabled = mLowPowerModeSetting;
if (mLowPowerModeEnabled != lowPowerModeEnabled) {
mLowPowerModeEnabled = lowPowerModeEnabled;
powerHintInternal(POWER_HINT_LOW_POWER_MODE, lowPowerModeEnabled ? 1 : 0);
@@ -672,6 +706,10 @@
BackgroundThread.getHandler().post(new Runnable() {
@Override
public void run() {
+ Intent intent = new Intent(PowerManager.ACTION_POWER_SAVE_MODE_CHANGING)
+ .putExtra(PowerManager.EXTRA_POWER_SAVE_MODE, mLowPowerModeEnabled)
+ .addFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY);
+ mContext.sendBroadcast(intent);
ArrayList<PowerManagerInternal.LowPowerModeListener> listeners;
synchronized (mLock) {
listeners = new ArrayList<PowerManagerInternal.LowPowerModeListener>(
@@ -680,7 +718,7 @@
for (int i=0; i<listeners.size(); i++) {
listeners.get(i).onLowPowerModeChanged(lowPowerModeEnabled);
}
- Intent intent = new Intent(PowerManager.ACTION_POWER_SAVE_MODE_CHANGED);
+ intent = new Intent(PowerManager.ACTION_POWER_SAVE_MODE_CHANGED);
intent.addFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY);
mContext.sendBroadcast(intent);
}
@@ -1218,6 +1256,12 @@
}
if (wasPowered != mIsPowered || oldLevelLow != mBatteryLevelLow) {
+ if (oldLevelLow != mBatteryLevelLow && !mBatteryLevelLow) {
+ if (DEBUG_SPEW) {
+ Slog.d(TAG, "updateIsPoweredLocked: resetting low power snooze");
+ }
+ mAutoLowPowerModeSnoozing = false;
+ }
updateLowPowerModeLocked();
}
}
@@ -2265,6 +2309,7 @@
pw.println(" mDreamsActivateOnDockSetting=" + mDreamsActivateOnDockSetting);
pw.println(" mLowPowerModeSetting=" + mLowPowerModeSetting);
pw.println(" mAutoLowPowerModeEnabled=" + mAutoLowPowerModeEnabled);
+ pw.println(" mAutoLowPowerModeSnoozing=" + mAutoLowPowerModeSnoozing);
pw.println(" mMinimumScreenOffTimeoutConfig=" + mMinimumScreenOffTimeoutConfig);
pw.println(" mMaximumScreenDimDurationConfig=" + mMaximumScreenDimDurationConfig);
pw.println(" mMaximumScreenDimRatioConfig=" + mMaximumScreenDimRatioConfig);
diff --git a/services/core/java/com/android/server/statusbar/StatusBarManagerInternal.java b/services/core/java/com/android/server/statusbar/StatusBarManagerInternal.java
index 463f763..c28e0bc 100644
--- a/services/core/java/com/android/server/statusbar/StatusBarManagerInternal.java
+++ b/services/core/java/com/android/server/statusbar/StatusBarManagerInternal.java
@@ -21,4 +21,6 @@
public interface StatusBarManagerInternal {
void setNotificationDelegate(NotificationDelegate delegate);
void buzzBeepBlinked();
+ void notificationLightPulse(int argb, int onMillis, int offMillis);
+ void notificationLightOff();
}
diff --git a/services/core/java/com/android/server/statusbar/StatusBarManagerService.java b/services/core/java/com/android/server/statusbar/StatusBarManagerService.java
index f33943d..263767d 100644
--- a/services/core/java/com/android/server/statusbar/StatusBarManagerService.java
+++ b/services/core/java/com/android/server/statusbar/StatusBarManagerService.java
@@ -107,10 +107,13 @@
* Private API used by NotificationManagerService.
*/
private final StatusBarManagerInternal mInternalService = new StatusBarManagerInternal() {
+ private boolean mNotificationLightOn;
+
@Override
public void setNotificationDelegate(NotificationDelegate delegate) {
mNotificationDelegate = delegate;
}
+
@Override
public void buzzBeepBlinked() {
if (mBar != null) {
@@ -120,6 +123,30 @@
}
}
}
+
+ @Override
+ public void notificationLightPulse(int argb, int onMillis, int offMillis) {
+ mNotificationLightOn = true;
+ if (mBar != null) {
+ try {
+ mBar.notificationLightPulse(argb, onMillis, offMillis);
+ } catch (RemoteException ex) {
+ }
+ }
+ }
+
+ @Override
+ public void notificationLightOff() {
+ if (mNotificationLightOn) {
+ mNotificationLightOn = false;
+ if (mBar != null) {
+ try {
+ mBar.notificationLightOff();
+ } catch (RemoteException ex) {
+ }
+ }
+ }
+ }
};
// ================================================================================
diff --git a/services/core/java/com/android/server/tv/TvInputHal.java b/services/core/java/com/android/server/tv/TvInputHal.java
index c6213f9..e7dd82d 100644
--- a/services/core/java/com/android/server/tv/TvInputHal.java
+++ b/services/core/java/com/android/server/tv/TvInputHal.java
@@ -23,6 +23,8 @@
import android.os.Message;
import android.view.Surface;
import android.util.Slog;
+import android.util.SparseArray;
+import android.util.SparseIntArray;
import java.util.LinkedList;
import java.util.Queue;
@@ -62,58 +64,70 @@
int generation);
private static native void nativeClose(long ptr);
+ private Object mLock = new Object();
private long mPtr = 0;
private final Callback mCallback;
private final Handler mHandler;
- private int mStreamConfigGeneration = 0;
- private TvStreamConfig[] mStreamConfigs;
+ private SparseIntArray mStreamConfigGenerations = new SparseIntArray();
+ private SparseArray<TvStreamConfig[]> mStreamConfigs = new SparseArray<>();;
public TvInputHal(Callback callback) {
mCallback = callback;
mHandler = new Handler(this);
}
- public synchronized void init() {
- mPtr = nativeOpen();
- }
-
- public synchronized int addStream(int deviceId, Surface surface, TvStreamConfig streamConfig) {
- if (mPtr == 0) {
- return ERROR_NO_INIT;
- }
- if (mStreamConfigGeneration != streamConfig.getGeneration()) {
- return ERROR_STALE_CONFIG;
- }
- if (nativeAddStream(mPtr, deviceId, streamConfig.getStreamId(), surface) == 0) {
- return SUCCESS;
- } else {
- return ERROR_UNKNOWN;
+ public void init() {
+ synchronized (mLock) {
+ mPtr = nativeOpen();
}
}
- public synchronized int removeStream(int deviceId, TvStreamConfig streamConfig) {
- if (mPtr == 0) {
- return ERROR_NO_INIT;
- }
- if (mStreamConfigGeneration != streamConfig.getGeneration()) {
- return ERROR_STALE_CONFIG;
- }
- if (nativeRemoveStream(mPtr, deviceId, streamConfig.getStreamId()) == 0) {
- return SUCCESS;
- } else {
- return ERROR_UNKNOWN;
+ public int addStream(int deviceId, Surface surface, TvStreamConfig streamConfig) {
+ synchronized (mLock) {
+ if (mPtr == 0) {
+ return ERROR_NO_INIT;
+ }
+ int generation = mStreamConfigGenerations.get(deviceId, 0);
+ if (generation != streamConfig.getGeneration()) {
+ return ERROR_STALE_CONFIG;
+ }
+ if (nativeAddStream(mPtr, deviceId, streamConfig.getStreamId(), surface) == 0) {
+ return SUCCESS;
+ } else {
+ return ERROR_UNKNOWN;
+ }
}
}
- public synchronized void close() {
- if (mPtr != 0l) {
- nativeClose(mPtr);
+ public int removeStream(int deviceId, TvStreamConfig streamConfig) {
+ synchronized (mLock) {
+ if (mPtr == 0) {
+ return ERROR_NO_INIT;
+ }
+ int generation = mStreamConfigGenerations.get(deviceId, 0);
+ if (generation != streamConfig.getGeneration()) {
+ return ERROR_STALE_CONFIG;
+ }
+ if (nativeRemoveStream(mPtr, deviceId, streamConfig.getStreamId()) == 0) {
+ return SUCCESS;
+ } else {
+ return ERROR_UNKNOWN;
+ }
}
}
- private synchronized void retrieveStreamConfigs(int deviceId) {
- ++mStreamConfigGeneration;
- mStreamConfigs = nativeGetStreamConfigs(mPtr, deviceId, mStreamConfigGeneration);
+ public void close() {
+ synchronized (mLock) {
+ if (mPtr != 0l) {
+ nativeClose(mPtr);
+ }
+ }
+ }
+
+ private void retrieveStreamConfigsLocked(int deviceId) {
+ int generation = mStreamConfigGenerations.get(deviceId, 0) + 1;
+ mStreamConfigs.put(deviceId, nativeGetStreamConfigs(mPtr, deviceId, generation));
+ mStreamConfigGenerations.put(deviceId, generation);
}
// Called from native
@@ -145,12 +159,16 @@
public boolean handleMessage(Message msg) {
switch (msg.what) {
case EVENT_DEVICE_AVAILABLE: {
+ TvStreamConfig[] configs;
TvInputHardwareInfo info = (TvInputHardwareInfo)msg.obj;
- retrieveStreamConfigs(info.getDeviceId());
- if (DEBUG) {
- Slog.d(TAG, "EVENT_DEVICE_AVAILABLE: info = " + info);
+ synchronized (mLock) {
+ retrieveStreamConfigsLocked(info.getDeviceId());
+ if (DEBUG) {
+ Slog.d(TAG, "EVENT_DEVICE_AVAILABLE: info = " + info);
+ }
+ configs = mStreamConfigs.get(info.getDeviceId());
}
- mCallback.onDeviceAvailable(info, mStreamConfigs);
+ mCallback.onDeviceAvailable(info, configs);
break;
}
@@ -164,12 +182,16 @@
}
case EVENT_STREAM_CONFIGURATION_CHANGED: {
+ TvStreamConfig[] configs;
int deviceId = msg.arg1;
- if (DEBUG) {
- Slog.d(TAG, "EVENT_STREAM_CONFIGURATION_CHANGED: deviceId = " + deviceId);
+ synchronized (mLock) {
+ if (DEBUG) {
+ Slog.d(TAG, "EVENT_STREAM_CONFIGURATION_CHANGED: deviceId = " + deviceId);
+ }
+ retrieveStreamConfigsLocked(deviceId);
+ configs = mStreamConfigs.get(deviceId);
}
- retrieveStreamConfigs(deviceId);
- mCallback.onStreamConfigurationChanged(deviceId, mStreamConfigs);
+ mCallback.onStreamConfigurationChanged(deviceId, configs);
break;
}
diff --git a/services/core/java/com/android/server/tv/TvInputHardwareManager.java b/services/core/java/com/android/server/tv/TvInputHardwareManager.java
index 80ea2c8..4d375ee 100644
--- a/services/core/java/com/android/server/tv/TvInputHardwareManager.java
+++ b/services/core/java/com/android/server/tv/TvInputHardwareManager.java
@@ -28,6 +28,7 @@
import android.hardware.hdmi.IHdmiHotplugEventListener;
import android.hardware.hdmi.IHdmiInputChangeListener;
import android.media.AudioDevicePort;
+import android.media.AudioFormat;
import android.media.AudioManager;
import android.media.AudioPatch;
import android.media.AudioPort;
@@ -556,41 +557,54 @@
private final Object mImplLock = new Object();
private final AudioDevicePort mAudioSource;
- private final AudioDevicePort mAudioSink;
+ private AudioDevicePort mAudioSink;
private AudioPatch mAudioPatch = null;
private TvStreamConfig mActiveConfig = null;
+ private int mDesiredSamplingRate = 0;
+ private int mDesiredChannelMask = AudioFormat.CHANNEL_OUT_DEFAULT;
+ private int mDesiredFormat = AudioFormat.ENCODING_DEFAULT;
+
public TvInputHardwareImpl(TvInputHardwareInfo info) {
mInfo = info;
AudioDevicePort audioSource = null;
- AudioDevicePort audioSink = null;
if (mInfo.getAudioType() != AudioManager.DEVICE_NONE) {
- ArrayList<AudioPort> devicePorts = new ArrayList<AudioPort>();
- if (mAudioManager.listAudioDevicePorts(devicePorts) == AudioManager.SUCCESS) {
- // Find source
- for (AudioPort port : devicePorts) {
- AudioDevicePort devicePort = (AudioDevicePort) port;
- if (devicePort.type() == mInfo.getAudioType() &&
- devicePort.address().equals(mInfo.getAudioAddress())) {
- audioSource = devicePort;
- break;
- }
- }
- // Find sink
- // TODO: App may want to specify sink device?
- int sinkDevices = mAudioManager.getDevicesForStream(AudioManager.STREAM_MUSIC);
- for (AudioPort port : devicePorts) {
- AudioDevicePort devicePort = (AudioDevicePort) port;
- if (devicePort.type() == sinkDevices) {
- audioSink = devicePort;
- break;
- }
+ audioSource = findAudioDevicePort(mInfo.getAudioType(), mInfo.getAudioAddress());
+ mAudioSink = findAudioSinkFromAudioPolicy();
+ }
+ mAudioSource = audioSource;
+ }
+
+ private AudioDevicePort findAudioSinkFromAudioPolicy() {
+ ArrayList<AudioPort> devicePorts = new ArrayList<AudioPort>();
+ if (mAudioManager.listAudioDevicePorts(devicePorts) == AudioManager.SUCCESS) {
+ int sinkDevice = mAudioManager.getDevicesForStream(AudioManager.STREAM_MUSIC);
+ for (AudioPort port : devicePorts) {
+ AudioDevicePort devicePort = (AudioDevicePort) port;
+ if (devicePort.type() == sinkDevice) {
+ return devicePort;
}
}
}
- mAudioSource = audioSource;
- mAudioSink = audioSink;
+ return null;
+ }
+
+ private AudioDevicePort findAudioDevicePort(int type, String address) {
+ if (type == AudioManager.DEVICE_NONE) {
+ return null;
+ }
+ ArrayList<AudioPort> devicePorts = new ArrayList<AudioPort>();
+ if (mAudioManager.listAudioDevicePorts(devicePorts) != AudioManager.SUCCESS) {
+ return null;
+ }
+ for (AudioPort port : devicePorts) {
+ AudioDevicePort devicePort = (AudioDevicePort) port;
+ if (devicePort.type() == type && devicePort.address().equals(address)) {
+ return devicePort;
+ }
+ }
+ return null;
}
public void release() {
@@ -621,15 +635,7 @@
}
if (mAudioSource != null && mAudioSink != null) {
if (surface != null) {
- AudioPortConfig sourceConfig = mAudioSource.activeConfig();
- AudioPortConfig sinkConfig = mAudioSink.activeConfig();
- AudioPatch[] audioPatchArray = new AudioPatch[] { mAudioPatch };
- // TODO: build config if activeConfig() == null
- mAudioManager.createAudioPatch(
- audioPatchArray,
- new AudioPortConfig[] { sourceConfig },
- new AudioPortConfig[] { sinkConfig });
- mAudioPatch = audioPatchArray[0];
+ updateAudioPatchLocked();
} else {
mAudioManager.releaseAudioPatch(mAudioPatch);
mAudioPatch = null;
@@ -656,6 +662,31 @@
}
}
+ private void updateAudioPatchLocked() {
+ AudioPortConfig sourceConfig = mAudioSource.activeConfig();
+ AudioPortConfig sinkConfig = mAudioSink.activeConfig();
+ AudioPatch[] audioPatchArray = new AudioPatch[] { mAudioPatch };
+ if (sinkConfig == null
+ || (mDesiredSamplingRate != 0
+ && sinkConfig.samplingRate() != mDesiredSamplingRate)
+ || (mDesiredChannelMask != AudioFormat.CHANNEL_OUT_DEFAULT
+ && sinkConfig.channelMask() != mDesiredChannelMask)
+ || (mDesiredFormat != AudioFormat.ENCODING_DEFAULT
+ && sinkConfig.format() != mDesiredFormat)) {
+ sinkConfig = mAudioSource.buildConfig(mDesiredSamplingRate, mDesiredChannelMask,
+ mDesiredFormat, null);
+ }
+ if (sourceConfig == null) {
+ sourceConfig = mAudioSource.buildConfig(sinkConfig.samplingRate(),
+ sinkConfig.channelMask(), sinkConfig.format(), null);
+ }
+ mAudioManager.createAudioPatch(
+ audioPatchArray,
+ new AudioPortConfig[] { sourceConfig },
+ new AudioPortConfig[] { sinkConfig });
+ mAudioPatch = audioPatchArray[0];
+ }
+
@Override
public void setVolume(float volume) throws RemoteException {
synchronized (mImplLock) {
@@ -710,6 +741,28 @@
return result == TvInputHal.SUCCESS;
}
}
+
+ @Override
+ public void overrideAudioSink(int audioType, String audioAddress, int samplingRate,
+ int channelMask, int format) {
+ synchronized (mImplLock) {
+ if (audioType == AudioManager.DEVICE_NONE) {
+ mAudioSink = findAudioSinkFromAudioPolicy();
+ } else {
+ AudioDevicePort audioSink = findAudioDevicePort(audioType, audioAddress);
+ if (audioSink != null) {
+ mAudioSink = audioSink;
+ }
+ }
+ mDesiredSamplingRate = samplingRate;
+ mDesiredChannelMask = channelMask;
+ mDesiredFormat = format;
+
+ if (mAudioPatch != null) {
+ updateAudioPatchLocked();
+ }
+ }
+ }
}
interface Listener {
diff --git a/services/core/java/com/android/server/tv/TvInputManagerService.java b/services/core/java/com/android/server/tv/TvInputManagerService.java
index 5d34eda..e11b6a7 100644
--- a/services/core/java/com/android/server/tv/TvInputManagerService.java
+++ b/services/core/java/com/android/server/tv/TvInputManagerService.java
@@ -35,6 +35,7 @@
import android.content.pm.PackageManager;
import android.content.pm.ResolveInfo;
import android.content.pm.ServiceInfo;
+import android.content.res.Resources;
import android.database.Cursor;
import android.graphics.Rect;
import android.hardware.hdmi.HdmiCecDeviceInfo;
@@ -51,6 +52,7 @@
import android.media.tv.TvContract;
import android.media.tv.TvInputHardwareInfo;
import android.media.tv.TvInputInfo;
+import android.media.tv.TvInputManager;
import android.media.tv.TvInputService;
import android.media.tv.TvStreamConfig;
import android.media.tv.TvTrackInfo;
@@ -281,6 +283,18 @@
userState.inputMap.clear();
userState.inputMap = inputMap;
+
+ Resources r = Resources.getSystem();
+ userState.ratingSystemXmlUriSet.clear();
+ userState.ratingSystemXmlUriSet.add(TvContentRating.SYSTEM_CONTENT_RATING_SYSTEM_XML);
+ for (TvInputState state : userState.inputMap.values()) {
+ Uri ratingSystemXmlUri = state.mInfo.getRatingSystemXmlUri();
+ if (ratingSystemXmlUri != null) {
+ // TODO: need to check the validation of xml format and the duplication of rating
+ // systems.
+ userState.ratingSystemXmlUriSet.add(state.mInfo.getRatingSystemXmlUri());
+ }
+ }
}
private void switchUser(int userId) {
@@ -537,6 +551,24 @@
}
@Override
+ public void onTrackSelectionChanged(List<TvTrackInfo> selectedTracks) {
+ synchronized (mLock) {
+ if (DEBUG) {
+ Slog.d(TAG, "onTrackSelectionChanged(" + selectedTracks + ")");
+ }
+ if (sessionState.mSession == null || sessionState.mClient == null) {
+ return;
+ }
+ try {
+ sessionState.mClient.onTrackSelectionChanged(selectedTracks,
+ sessionState.mSeq);
+ } catch (RemoteException e) {
+ Slog.e(TAG, "error in onTrackSelectionChanged");
+ }
+ }
+ }
+
+ @Override
public void onVideoAvailable() {
synchronized (mLock) {
if (DEBUG) {
@@ -796,6 +828,23 @@
}
@Override
+ public List<Uri> getTvContentRatingSystemXmls(int userId) {
+ final int resolvedUserId = resolveCallingUserId(Binder.getCallingPid(),
+ Binder.getCallingUid(), userId, "getTvContentRatingSystemXmls");
+ final long identity = Binder.clearCallingIdentity();
+ try {
+ synchronized (mLock) {
+ UserState userState = getUserStateLocked(resolvedUserId);
+ List<Uri> ratingSystemXmlUriList = new ArrayList<Uri>();
+ ratingSystemXmlUriList.addAll(userState.ratingSystemXmlUriSet);
+ return ratingSystemXmlUriList;
+ }
+ } finally {
+ Binder.restoreCallingIdentity(identity);
+ }
+ }
+
+ @Override
public void registerCallback(final ITvInputManagerCallback callback, int userId) {
final int resolvedUserId = resolveCallingUserId(Binder.getCallingPid(),
Binder.getCallingUid(), userId, "registerCallback");
@@ -1117,7 +1166,7 @@
}
@Override
- public void tune(IBinder sessionToken, final Uri channelUri, int userId) {
+ public void tune(IBinder sessionToken, final Uri channelUri, Bundle params, int userId) {
final int callingUid = Binder.getCallingUid();
final int resolvedUserId = resolveCallingUserId(Binder.getCallingPid(), callingUid,
userId, "tune");
@@ -1125,7 +1174,8 @@
try {
synchronized (mLock) {
try {
- getSessionLocked(sessionToken, callingUid, resolvedUserId).tune(channelUri);
+ getSessionLocked(sessionToken, callingUid, resolvedUserId).tune(
+ channelUri, params);
if (TvContract.isChannelUriForPassthroughTvInput(channelUri)) {
// Do not log the watch history for passthrough inputs.
return;
@@ -1152,6 +1202,10 @@
currentTime);
values.put(TvContract.WatchedPrograms.COLUMN_WATCH_END_TIME_UTC_MILLIS, 0);
values.put(TvContract.WatchedPrograms.COLUMN_CHANNEL_ID, channelId);
+ if (params != null) {
+ values.put(TvContract.WatchedPrograms.COLUMN_TUNE_PARAMS,
+ encodeTuneParams(params));
+ }
sessionState.mLogUri = mContentResolver.insert(
TvContract.WatchedPrograms.CONTENT_URI, values);
@@ -1564,6 +1618,39 @@
}
}
}
+
+ private String encodeTuneParams(Bundle tuneParams) {
+ StringBuilder builder = new StringBuilder();
+ Set<String> keySet = tuneParams.keySet();
+ Iterator<String> it = keySet.iterator();
+ while (it.hasNext()) {
+ String key = it.next();
+ Object value = tuneParams.get(key);
+ if (value == null) {
+ continue;
+ }
+ builder.append(replaceEscapeCharacters(key));
+ builder.append("=");
+ builder.append(replaceEscapeCharacters(value.toString()));
+ if (it.hasNext()) {
+ builder.append(", ");
+ }
+ }
+ return builder.toString();
+ }
+
+ private String replaceEscapeCharacters(String src) {
+ final char ESCAPE_CHARACTER = '%';
+ final String ENCODING_TARGET_CHARACTERS = "%=,";
+ StringBuilder builder = new StringBuilder();
+ for (char ch : src.toCharArray()) {
+ if (ENCODING_TARGET_CHARACTERS.indexOf(ch) >= 0) {
+ builder.append(ESCAPE_CHARACTER);
+ }
+ builder.append(ch);
+ }
+ return builder.toString();
+ }
}
private static final class TvInputState {
@@ -1586,6 +1673,9 @@
// A set of all TV input packages.
private final Set<String> packageSet = new HashSet<String>();
+ // A set of all TV content rating system xml uris.
+ private final Set<Uri> ratingSystemXmlUriSet = new HashSet<Uri>();
+
// A mapping from the token of a client to its state.
private final Map<IBinder, ClientState> clientStateMap =
new HashMap<IBinder, ClientState>();
diff --git a/services/core/java/com/android/server/webkit/WebViewUpdateService.java b/services/core/java/com/android/server/webkit/WebViewUpdateService.java
index 60724e7..d4c5f87 100644
--- a/services/core/java/com/android/server/webkit/WebViewUpdateService.java
+++ b/services/core/java/com/android/server/webkit/WebViewUpdateService.java
@@ -22,17 +22,20 @@
import android.content.IntentFilter;
import android.os.Binder;
import android.os.Process;
-import android.util.Log;
+import android.util.Slog;
import android.webkit.IWebViewUpdateService;
import android.webkit.WebViewFactory;
+import com.android.server.SystemService;
+
/**
* Private service to wait for the updatable WebView to be ready for use.
* @hide
*/
-public class WebViewUpdateService extends IWebViewUpdateService.Stub {
+public class WebViewUpdateService extends SystemService {
private static final String TAG = "WebViewUpdateService";
+ private static final int WAIT_TIMEOUT_MS = 5000; // Same as KEY_DISPATCHING_TIMEOUT.
private boolean mRelroReady32Bit = false;
private boolean mRelroReady64Bit = false;
@@ -40,6 +43,11 @@
private BroadcastReceiver mWebViewUpdatedReceiver;
public WebViewUpdateService(Context context) {
+ super(context);
+ }
+
+ @Override
+ public void onStart() {
mWebViewUpdatedReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
@@ -52,57 +60,76 @@
IntentFilter filter = new IntentFilter();
filter.addAction(Intent.ACTION_PACKAGE_REPLACED);
filter.addDataScheme("package");
- context.registerReceiver(mWebViewUpdatedReceiver, filter);
- }
+ getContext().registerReceiver(mWebViewUpdatedReceiver, filter);
- /**
- * The shared relro process calls this to notify us that it's done trying to create a relro
- * file.
- */
- public void notifyRelroCreationCompleted(boolean is64Bit, boolean success) {
- // Verify that the caller is the shared relro process.
- if (Binder.getCallingUid() != Process.SHARED_RELRO_UID) {
- return;
- }
-
- synchronized (this) {
- if (is64Bit) {
- mRelroReady64Bit = true;
- } else {
- mRelroReady32Bit = true;
- }
- this.notifyAll();
- }
- }
-
- /**
- * WebViewFactory calls this to block WebView loading until the relro file is created.
- */
- public void waitForRelroCreationCompleted(boolean is64Bit) {
- synchronized (this) {
- if (is64Bit) {
- while (!mRelroReady64Bit) {
- try {
- this.wait();
- } catch (InterruptedException e) {}
- }
- } else {
- while (!mRelroReady32Bit) {
- try {
- this.wait();
- } catch (InterruptedException e) {}
- }
- }
- }
+ publishBinderService("webviewupdate", new BinderService());
}
private void onWebViewUpdateInstalled() {
- Log.d(TAG, "WebView Package updated!");
+ Slog.d(TAG, "WebView Package updated!");
synchronized (this) {
mRelroReady32Bit = false;
mRelroReady64Bit = false;
}
- WebViewFactory.prepareWebViewInSystemServer();
+ WebViewFactory.onWebViewUpdateInstalled();
}
+
+ private class BinderService extends IWebViewUpdateService.Stub {
+
+ /**
+ * The shared relro process calls this to notify us that it's done trying to create a relro
+ * file. This method gets called even if the relro creation has failed or the process
+ * crashed.
+ */
+ @Override // Binder call
+ public void notifyRelroCreationCompleted(boolean is64Bit, boolean success) {
+ // Verify that the caller is either the shared relro process (nominal case) or the
+ // system server (only in the case the relro process crashes and we get here via the
+ // crashHandler).
+ if (Binder.getCallingUid() != Process.SHARED_RELRO_UID &&
+ Binder.getCallingUid() != Process.SYSTEM_UID) {
+ return;
+ }
+
+ synchronized (WebViewUpdateService.this) {
+ if (is64Bit) {
+ mRelroReady64Bit = true;
+ } else {
+ mRelroReady32Bit = true;
+ }
+ WebViewUpdateService.this.notifyAll();
+ }
+ }
+
+ /**
+ * WebViewFactory calls this to block WebView loading until the relro file is created.
+ */
+ @Override // Binder call
+ public void waitForRelroCreationCompleted(boolean is64Bit) {
+ // The WebViewUpdateService depends on the prepareWebViewInSystemServer call, which
+ // happens later (during the PHASE_ACTIVITY_MANAGER_READY) in SystemServer.java. If
+ // another service there tries to bring up a WebView in the between, the wait below
+ // would deadlock without the check below.
+ if (Binder.getCallingPid() == Process.myPid()) {
+ throw new IllegalStateException("Cannot create a WebView from the SystemServer");
+ }
+
+ final long NS_PER_MS = 1000000;
+ final long timeoutTimeMs = System.nanoTime() / NS_PER_MS + WAIT_TIMEOUT_MS;
+ boolean relroReady = (is64Bit ? mRelroReady64Bit : mRelroReady32Bit);
+ synchronized (WebViewUpdateService.this) {
+ while (!relroReady) {
+ final long timeNowMs = System.nanoTime() / NS_PER_MS;
+ if (timeNowMs >= timeoutTimeMs) break;
+ try {
+ WebViewUpdateService.this.wait(timeoutTimeMs - timeNowMs);
+ } catch (InterruptedException e) {}
+ relroReady = (is64Bit ? mRelroReady64Bit : mRelroReady32Bit);
+ }
+ }
+ if (!relroReady) Slog.w(TAG, "creating relro file timed out");
+ }
+ }
+
}
diff --git a/services/core/java/com/android/server/wm/WindowManagerService.java b/services/core/java/com/android/server/wm/WindowManagerService.java
index 670ba55..80dfb91 100644
--- a/services/core/java/com/android/server/wm/WindowManagerService.java
+++ b/services/core/java/com/android/server/wm/WindowManagerService.java
@@ -19,7 +19,6 @@
import static android.view.WindowManager.LayoutParams.*;
import static android.view.WindowManagerPolicy.FINISH_LAYOUT_REDO_WALLPAPER;
-import android.app.admin.DevicePolicyManager;
import android.app.AppOpsManager;
import android.util.ArraySet;
import android.util.TimeUtils;
@@ -2455,37 +2454,24 @@
*/
boolean isScreenCaptureDisabledLocked(int userId) {
Boolean disabled = mScreenCaptureDisabled.get(userId);
- if (disabled != null) {
- return disabled;
- }
-
- // mScreenCaptureDisabled not set yet, try to update it.
- updateScreenCaptureDisabledLocked(userId);
- disabled = mScreenCaptureDisabled.get(userId);
if (disabled == null) {
- // Not able to update, return false by default.
return false;
- } else {
- return disabled;
}
+ return disabled;
}
/**
- * Update mScreenCaptureDisabled for specific user according to the device policy manager.
+ * Set mScreenCaptureDisabled for specific user
*/
@Override
- public void updateScreenCaptureDisabled(int userId) {
- mH.sendMessage(mH.obtainMessage(H.UPDATE_SCRN_CAP, userId, 0 /* unused argument */));
- }
+ public void setScreenCaptureDisabled(int userId, boolean disabled) {
+ int callingUid = Binder.getCallingUid();
+ if (callingUid != Process.SYSTEM_UID) {
+ throw new SecurityException("Only system can call setScreenCaptureDisabled.");
+ }
- void updateScreenCaptureDisabledLocked(int userId) {
- DevicePolicyManager dpm = (DevicePolicyManager) mContext
- .getSystemService(Context.DEVICE_POLICY_SERVICE);
- if (dpm != null) {
- boolean disabled = dpm.getScreenCaptureDisabled(null, userId);
+ synchronized(mWindowMap) {
mScreenCaptureDisabled.put(userId, disabled);
- } else {
- Slog.e(TAG, "Could not get DevicePolicyManager.");
}
}
@@ -7293,9 +7279,7 @@
public static final int NEW_ANIMATOR_SCALE = 34;
- public static final int UPDATE_SCRN_CAP = 35;
-
- public static final int SHOW_DISPLAY_MASK = 36;
+ public static final int SHOW_DISPLAY_MASK = 35;
@Override
public void handleMessage(Message msg) {
@@ -7776,13 +7760,6 @@
}
}
break;
-
- case UPDATE_SCRN_CAP: {
- synchronized (mWindowMap) {
- updateScreenCaptureDisabledLocked(msg.arg1);
- }
- }
- break;
}
if (DEBUG_WINDOW_TRACE) {
Slog.v(TAG, "handleMessage: exit");
diff --git a/services/core/jni/com_android_server_location_FlpHardwareProvider.cpp b/services/core/jni/com_android_server_location_FlpHardwareProvider.cpp
index c2fccc1..2519ff8 100644
--- a/services/core/jni/com_android_server_location_FlpHardwareProvider.cpp
+++ b/services/core/jni/com_android_server_location_FlpHardwareProvider.cpp
@@ -364,7 +364,9 @@
"()I");
options->last_transition = env->CallIntMethod(geofenceRequestObject, getLastTransition);
- // TODO: set data.sources_to_use when available
+ jmethodID getSourceTechnologies =
+ env->GetMethodID(geofenceRequestClass, "getSourceTechnologies", "()I");
+ options->sources_to_use = env->CallIntMethod(geofenceRequestObject, getSourceTechnologies);
env->DeleteLocalRef(geofenceRequestClass);
}
diff --git a/services/core/jni/com_android_server_tv_TvInputHal.cpp b/services/core/jni/com_android_server_tv_TvInputHal.cpp
index 41976ff..5eb627b 100644
--- a/services/core/jni/com_android_server_tv_TvInputHal.cpp
+++ b/services/core/jni/com_android_server_tv_TvInputHal.cpp
@@ -351,6 +351,8 @@
ALOGE("Cannot find a config with given stream ID: %d", streamId);
return BAD_VALUE;
}
+ connection.mStreamType = configs[configIndex].type;
+
tv_stream_t stream;
stream.stream_id = configs[configIndex].stream_id;
if (connection.mStreamType == TV_STREAM_TYPE_BUFFER_PRODUCER) {
diff --git a/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java b/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java
index 6ab504c..c6730bf 100644
--- a/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java
+++ b/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java
@@ -791,6 +791,7 @@
policyFile.delete();
Slog.i(LOG_TAG, "Removed device policy file " + policyFile.getAbsolutePath());
}
+ updateScreenCaptureDisabledInWindowManager(userHandle, false /* default value */);
}
void loadDeviceOwner() {
@@ -1367,6 +1368,16 @@
new SetupContentObserver(mHandler).register(mContext.getContentResolver());
// Initialize the user setup state, to handle the upgrade case.
updateUserSetupComplete();
+
+ // Update the screen capture disabled cache in the window manager
+ List<UserInfo> users = mUserManager.getUsers(true);
+ final int N = users.size();
+ for (int i = 0; i < N; i++) {
+ int userHandle = users.get(i).id;
+ updateScreenCaptureDisabledInWindowManager(userHandle,
+ getScreenCaptureDisabled(null, userHandle));
+ }
+
}
private void cleanUpOldUsers() {
@@ -3062,11 +3073,7 @@
if (ap.disableScreenCapture != disabled) {
ap.disableScreenCapture = disabled;
saveSettingsLocked(userHandle);
- try {
- getWindowManager().updateScreenCaptureDisabled(userHandle);
- } catch (RemoteException e) {
- Log.w(LOG_TAG, "Unable to notify WindowManager.", e);
- }
+ updateScreenCaptureDisabledInWindowManager(userHandle, disabled);
}
}
}
@@ -3097,6 +3104,17 @@
}
}
+ private void updateScreenCaptureDisabledInWindowManager(int userHandle, boolean disabled) {
+ long ident = Binder.clearCallingIdentity();
+ try {
+ getWindowManager().setScreenCaptureDisabled(userHandle, disabled);
+ } catch (RemoteException e) {
+ Log.w(LOG_TAG, "Unable to notify WindowManager.", e);
+ } finally {
+ Binder.restoreCallingIdentity(ident);
+ }
+ }
+
/**
* The system property used to share the state of the camera. The native camera service
* is expected to read this property and act accordingly.
diff --git a/services/java/com/android/server/SystemServer.java b/services/java/com/android/server/SystemServer.java
index d955354..e8d6773 100644
--- a/services/java/com/android/server/SystemServer.java
+++ b/services/java/com/android/server/SystemServer.java
@@ -376,6 +376,9 @@
mSystemServiceManager.startService(UsageStatsService.class);
mActivityManagerService.setUsageStatsManager(
LocalServices.getService(UsageStatsManagerInternal.class));
+
+ // Tracks whether the updatable WebView is in a ready state and watches for update installs.
+ mSystemServiceManager.startService(WebViewUpdateService.class);
}
/**
@@ -422,12 +425,6 @@
Slog.i(TAG, "Reading configuration...");
SystemConfig.getInstance();
- Slog.i(TAG, "WebView Update Service");
- ServiceManager.addService("webviewupdate", new WebViewUpdateService(context));
-
- Slog.i(TAG, "WebViewFactory preparation");
- WebViewFactory.prepareWebViewInSystemServer();
-
Slog.i(TAG, "Scheduling Policy");
ServiceManager.addService("scheduling_policy", new SchedulingPolicyService());
@@ -1080,6 +1077,10 @@
} catch (Throwable e) {
reportWtf("observing native crashes", e);
}
+
+ Slog.i(TAG, "WebViewFactory preparation");
+ WebViewFactory.prepareWebViewInSystemServer();
+
try {
startSystemUi(context);
} catch (Throwable e) {
diff --git a/services/voiceinteraction/java/com/android/server/voiceinteraction/SoundTriggerHelper.java b/services/voiceinteraction/java/com/android/server/voiceinteraction/SoundTriggerHelper.java
index 15ec629..f3ede88 100644
--- a/services/voiceinteraction/java/com/android/server/voiceinteraction/SoundTriggerHelper.java
+++ b/services/voiceinteraction/java/com/android/server/voiceinteraction/SoundTriggerHelper.java
@@ -31,6 +31,7 @@
import android.util.SparseArray;
import java.util.ArrayList;
+import java.util.UUID;
/**
* Helper for {@link SoundTrigger} APIs.
@@ -63,6 +64,9 @@
private final SparseArray<IRecognitionStatusCallback> mActiveListeners;
private int mCurrentSoundModelHandle = INVALID_SOUND_MODEL_HANDLE;
+ private UUID mCurrentSoundModelUuid = null;
+ // FIXME: Ideally this should not be stored if allowMultipleTriggers happens at a lower layer.
+ private RecognitionConfig mRecognitionConfig = null;
SoundTriggerHelper() {
ArrayList <ModuleProperties> modules = new ArrayList<>();
@@ -109,18 +113,25 @@
+ ", recognitionConfig=" + recognitionConfig);
Slog.d(TAG, "moduleProperties=" + moduleProperties);
Slog.d(TAG, "# of current listeners=" + mActiveListeners.size());
- Slog.d(TAG, "mCurrentSoundModelHandle=" + mCurrentSoundModelHandle);
+ Slog.d(TAG, "current SoundModel handle=" + mCurrentSoundModelHandle);
+ Slog.d(TAG, "current SoundModel UUID="
+ + (mCurrentSoundModelUuid == null ? null : mCurrentSoundModelUuid));
}
if (moduleProperties == null || mModule == null) {
Slog.w(TAG, "Attempting startRecognition without the capability");
return STATUS_ERROR;
}
- if (mCurrentSoundModelHandle != INVALID_SOUND_MODEL_HANDLE) {
+ if (mCurrentSoundModelHandle != INVALID_SOUND_MODEL_HANDLE
+ && !soundModel.uuid.equals(mCurrentSoundModelUuid)) {
Slog.w(TAG, "Unloading previous sound model");
- // TODO: Inspect the return codes here.
- mModule.unloadSoundModel(mCurrentSoundModelHandle);
+ int status = mModule.unloadSoundModel(mCurrentSoundModelHandle);
+ if (status != SoundTrigger.STATUS_OK) {
+ Slog.w(TAG, "unloadSoundModel call failed with " + status);
+ return status;
+ }
mCurrentSoundModelHandle = INVALID_SOUND_MODEL_HANDLE;
+ mCurrentSoundModelUuid = null;
}
// If the previous recognition was by a different listener,
@@ -136,26 +147,36 @@
mActiveListeners.remove(keyphraseId);
}
- int[] handle = new int[] { INVALID_SOUND_MODEL_HANDLE };
- int status = mModule.loadSoundModel(soundModel, handle);
- if (status != SoundTrigger.STATUS_OK) {
- Slog.w(TAG, "loadSoundModel call failed with " + status);
- return STATUS_ERROR;
- }
- if (handle[0] == INVALID_SOUND_MODEL_HANDLE) {
- Slog.w(TAG, "loadSoundModel call returned invalid sound model handle");
- return STATUS_ERROR;
+ // Load the sound model if the current one is null.
+ int soundModelHandle = mCurrentSoundModelHandle;
+ if (mCurrentSoundModelHandle == INVALID_SOUND_MODEL_HANDLE
+ || mCurrentSoundModelUuid == null) {
+ int[] handle = new int[] { INVALID_SOUND_MODEL_HANDLE };
+ int status = mModule.loadSoundModel(soundModel, handle);
+ if (status != SoundTrigger.STATUS_OK) {
+ Slog.w(TAG, "loadSoundModel call failed with " + status);
+ return status;
+ }
+ if (handle[0] == INVALID_SOUND_MODEL_HANDLE) {
+ Slog.w(TAG, "loadSoundModel call returned invalid sound model handle");
+ return STATUS_ERROR;
+ }
+ soundModelHandle = handle[0];
+ } else {
+ if (DBG) Slog.d(TAG, "Reusing previously loaded sound model");
}
// Start the recognition.
- status = mModule.startRecognition(handle[0], recognitionConfig);
+ int status = mModule.startRecognition(soundModelHandle, recognitionConfig);
if (status != SoundTrigger.STATUS_OK) {
Slog.w(TAG, "startRecognition failed with " + status);
- return STATUS_ERROR;
+ return status;
}
// Everything went well!
- mCurrentSoundModelHandle = handle[0];
+ mCurrentSoundModelHandle = soundModelHandle;
+ mCurrentSoundModelUuid = soundModel.uuid;
+ mRecognitionConfig = recognitionConfig;
// Register the new listener. This replaces the old one.
// There can only be a maximum of one active listener for a keyphrase
// at any given time.
@@ -194,31 +215,55 @@
Slog.w(TAG, "Attempting stopRecognition without a successful startRecognition");
return STATUS_ERROR;
} else if (currentListener.asBinder() != listener.asBinder()) {
- // TODO: Figure out if this should match the listener that was passed in during
- // startRecognition, or should we allow a different listener to stop the recognition,
- // in which case we don't need to pass in a listener here.
+ // We don't allow a different listener to stop the recognition than the one
+ // that started it.
Slog.w(TAG, "Attempting stopRecognition for another recognition");
return STATUS_ERROR;
} else {
// Stop recognition if it's the current one, ignore otherwise.
- // TODO: Inspect the return codes here.
int status = mModule.stopRecognition(mCurrentSoundModelHandle);
if (status != SoundTrigger.STATUS_OK) {
Slog.w(TAG, "stopRecognition call failed with " + status);
- return STATUS_ERROR;
+ return status;
}
status = mModule.unloadSoundModel(mCurrentSoundModelHandle);
if (status != SoundTrigger.STATUS_OK) {
Slog.w(TAG, "unloadSoundModel call failed with " + status);
- return STATUS_ERROR;
+ return status;
}
mCurrentSoundModelHandle = INVALID_SOUND_MODEL_HANDLE;
+ mCurrentSoundModelUuid = null;
+
mActiveListeners.remove(keyphraseId);
return STATUS_OK;
}
}
+ synchronized void stopAllRecognitions() {
+ if (moduleProperties == null || mModule == null) {
+ return;
+ }
+
+ if (mCurrentSoundModelHandle == INVALID_SOUND_MODEL_HANDLE) {
+ return;
+ }
+
+ int status = mModule.stopRecognition(mCurrentSoundModelHandle);
+ if (status != SoundTrigger.STATUS_OK) {
+ Slog.w(TAG, "stopRecognition call failed with " + status);
+ }
+ status = mModule.unloadSoundModel(mCurrentSoundModelHandle);
+ if (status != SoundTrigger.STATUS_OK) {
+ Slog.w(TAG, "unloadSoundModel call failed with " + status);
+ }
+
+ mCurrentSoundModelHandle = INVALID_SOUND_MODEL_HANDLE;
+ mCurrentSoundModelUuid = null;
+
+ mActiveListeners.clear();
+ }
+
//---- SoundTrigger.StatusListener methods
@Override
public void onRecognition(RecognitionEvent event) {
@@ -266,6 +311,17 @@
Slog.w(TAG, "received onRecognition event without any listener for it");
return;
}
+
+ // FIXME: Remove this block if the lower layer supports multiple triggers.
+ if (mRecognitionConfig != null
+ && mRecognitionConfig.allowMultipleTriggers) {
+ int status = mModule.startRecognition(
+ mCurrentSoundModelHandle, mRecognitionConfig);
+ if (status != STATUS_OK) {
+ Slog.w(TAG, "Error in restarting recognition after a trigger");
+ listener.onError(status);
+ }
+ }
}
} catch (RemoteException e) {
Slog.w(TAG, "RemoteException in onDetectionStopped");
@@ -285,6 +341,7 @@
Slog.w(TAG, "RemoteException in onDetectionStopped");
}
mCurrentSoundModelHandle = INVALID_SOUND_MODEL_HANDLE;
+ mCurrentSoundModelUuid = null;
// Remove all listeners.
mActiveListeners.clear();
}
diff --git a/services/voiceinteraction/java/com/android/server/voiceinteraction/VoiceInteractionManagerService.java b/services/voiceinteraction/java/com/android/server/voiceinteraction/VoiceInteractionManagerService.java
index a3d578a..75d41aa 100644
--- a/services/voiceinteraction/java/com/android/server/voiceinteraction/VoiceInteractionManagerService.java
+++ b/services/voiceinteraction/java/com/android/server/voiceinteraction/VoiceInteractionManagerService.java
@@ -49,9 +49,6 @@
import java.io.FileDescriptor;
import java.io.PrintWriter;
-import java.util.List;
-import java.util.UUID;
-
/**
* SystemService that publishes an IVoiceInteractionManagerService.
@@ -151,6 +148,7 @@
}
if (force || mImpl == null || mImpl.mUser != mCurUser
|| !mImpl.mComponent.equals(serviceComponent)) {
+ mSoundTriggerHelper.stopAllRecognitions();
if (mImpl != null) {
mImpl.shutdownLocked();
}
diff --git a/telecomm/java/android/telecomm/Connection.java b/telecomm/java/android/telecomm/Connection.java
index 8845821..b55f62a 100644
--- a/telecomm/java/android/telecomm/Connection.java
+++ b/telecomm/java/android/telecomm/Connection.java
@@ -19,6 +19,9 @@
import android.app.PendingIntent;
import android.net.Uri;
import android.os.Bundle;
+import android.os.Handler;
+import android.os.Message;
+import com.android.internal.os.SomeArgs;
import java.util.ArrayList;
import java.util.HashSet;
@@ -30,6 +33,32 @@
*/
public abstract class Connection {
+ private static final int MSG_ADD_CONNECTION_LISTENER = 1;
+ private static final int MSG_REMOVE_CONNECTION_LISTENER = 2;
+ private static final int MSG_SET_AUDIO_STATE = 3;
+ private static final int MSG_SET_PARENT_CONNECTION = 4;
+ private static final int MSG_SET_HANDLE = 5;
+ private static final int MSG_SET_CALLER_DISPLAY_NAME = 6;
+ private static final int MSG_SET_CANCELED = 7;
+ private static final int MSG_SET_FAILED = 8;
+ private static final int MSG_SET_VIDEO_STATE = 9;
+ private static final int MSG_SET_ACTIVE = 10;
+ private static final int MSG_SET_RINGING = 11;
+ private static final int MSG_SET_INITIALIZING = 12;
+ private static final int MSG_SET_INITIALIZED = 13;
+ private static final int MSG_SET_DIALING = 14;
+ private static final int MSG_SET_ON_HOLD = 15;
+ private static final int MSG_SET_VIDEO_CALL_PROVIDER = 16;
+ private static final int MSG_SET_DISCONNECTED = 17;
+ private static final int MSG_SET_POST_DIAL_WAIT = 18;
+ private static final int MSG_SET_REQUESTING_RINGBACK = 19;
+ private static final int MSG_SET_CALL_CAPABILITIES = 20;
+ private static final int MSG_DESTROY = 21;
+ private static final int MSG_SET_SIGNAL = 22;
+ private static final int MSG_SET_AUDIO_MODE_IS_VOIP = 23;
+ private static final int MSG_SET_STATUS_HINTS = 24;
+ private static final int MSG_START_ACTIVITY_FROM_IN_CALL = 25;
+
/** @hide */
public abstract static class Listener {
public void onStateChanged(Connection c, int state) {}
@@ -49,7 +78,6 @@
public void onAudioModeIsVoipChanged(Connection c, boolean isVoip) {}
public void onStatusHintsChanged(Connection c, StatusHints statusHints) {}
public void onStartActivityFromInCall(Connection c, PendingIntent intent) {}
- public void onFailed(Connection c, int code, String msg) {}
}
public final class State {
@@ -87,6 +115,220 @@
private String mFailureMessage;
private boolean mIsCanceled;
+ private final Handler mHandler = new Handler() {
+ @Override
+ public void handleMessage(Message msg) {
+ switch (msg.what) {
+ case MSG_ADD_CONNECTION_LISTENER: {
+ Listener listener = (Listener) msg.obj;
+ mListeners.add(listener);
+ }
+ break;
+ case MSG_REMOVE_CONNECTION_LISTENER: {
+ Listener listener = (Listener) msg.obj;
+ mListeners.remove(listener);
+ }
+ break;
+ case MSG_SET_AUDIO_STATE: {
+ CallAudioState state = (CallAudioState) msg.obj;
+ mCallAudioState = state;
+ onSetAudioState(state);
+ }
+ break;
+ case MSG_SET_PARENT_CONNECTION: {
+ Connection parentConnection = (Connection) msg.obj;
+ if (mParentConnection != parentConnection) {
+ if (mParentConnection != null) {
+ mParentConnection.removeChild(Connection.this);
+ }
+ mParentConnection = parentConnection;
+ if (mParentConnection != null) {
+ mParentConnection.addChild(Connection.this);
+ // do something if the child connections goes down to ZERO.
+ }
+ for (Listener l : mListeners) {
+ l.onParentConnectionChanged(Connection.this, mParentConnection);
+ }
+ }
+ }
+ break;
+ case MSG_SET_HANDLE: {
+ SomeArgs args = (SomeArgs) msg.obj;
+ try {
+ Uri handle = (Uri) args.arg1;
+ int presentation = args.argi1;
+ mHandle = handle;
+ mHandlePresentation = presentation;
+ for (Listener l : mListeners) {
+ l.onHandleChanged(Connection.this, handle, presentation);
+ }
+ } finally {
+ args.recycle();
+ }
+ }
+ break;
+ case MSG_SET_CALLER_DISPLAY_NAME: {
+ SomeArgs args = (SomeArgs) msg.obj;
+ try {
+ String callerDisplayName = (String) args.arg1;
+ int presentation = args.argi1;
+ mCallerDisplayName = callerDisplayName;
+ mCallerDisplayNamePresentation = presentation;
+ for (Listener l : mListeners) {
+ l.onCallerDisplayNameChanged(Connection.this, callerDisplayName,
+ presentation);
+ }
+ } finally {
+ args.recycle();
+ }
+ }
+ break;
+ case MSG_SET_CANCELED: {
+ setState(State.CANCELED);
+ }
+ break;
+ case MSG_SET_FAILED: {
+ SomeArgs args = (SomeArgs) msg.obj;
+ try {
+ int code = args.argi1;
+ String message = (String) args.arg1;
+ mFailureCode = code;
+ mFailureMessage = message;
+ setState(State.FAILED);
+ } finally {
+ args.recycle();
+ }
+ }
+ break;
+ case MSG_SET_VIDEO_STATE: {
+ int videoState = ((Integer) msg.obj).intValue();
+ mVideoState = videoState;
+ for (Listener l : mListeners) {
+ l.onVideoStateChanged(Connection.this, mVideoState);
+ }
+ }
+ break;
+ case MSG_SET_ACTIVE: {
+ setRequestingRingback(false);
+ setState(State.ACTIVE);
+ }
+ break;
+ case MSG_SET_RINGING: {
+ setState(State.RINGING);
+ }
+ break;
+ case MSG_SET_INITIALIZING: {
+ setState(State.INITIALIZING);
+ }
+ break;
+ case MSG_SET_INITIALIZED: {
+ setState(State.NEW);
+ }
+ break;
+ case MSG_SET_DIALING: {
+ setState(State.DIALING);
+ }
+ break;
+ case MSG_SET_ON_HOLD: {
+ setState(State.HOLDING);
+ }
+ break;
+ case MSG_SET_VIDEO_CALL_PROVIDER: {
+ ConnectionService.VideoCallProvider videoCallProvider =
+ (ConnectionService.VideoCallProvider) msg.obj;
+ mVideoCallProvider = videoCallProvider;
+ for (Listener l : mListeners) {
+ l.onVideoCallProviderChanged(Connection.this, videoCallProvider);
+ }
+ }
+ break;
+ case MSG_SET_DISCONNECTED: {
+ SomeArgs args = (SomeArgs) msg.obj;
+ try {
+ int cause = args.argi1;
+ String message = (String) args.arg1;
+ setState(State.DISCONNECTED);
+ Log.d(this, "Disconnected with cause %d message %s", cause, message);
+ for (Listener l : mListeners) {
+ l.onDisconnected(Connection.this, cause, message);
+ }
+ } finally {
+ args.recycle();
+ }
+ }
+ break;
+ case MSG_SET_POST_DIAL_WAIT: {
+ String remaining = (String) msg.obj;
+ for (Listener l : mListeners) {
+ l.onPostDialWait(Connection.this, remaining);
+ }
+ }
+ break;
+ case MSG_SET_REQUESTING_RINGBACK: {
+ boolean ringback = ((Boolean) msg.obj).booleanValue();
+ if (mRequestingRingback != ringback) {
+ mRequestingRingback = ringback;
+ for (Listener l : mListeners) {
+ l.onRequestingRingback(Connection.this, ringback);
+ }
+ }
+ } break;
+ case MSG_SET_CALL_CAPABILITIES: {
+ int callCapabilities = ((Integer) msg.obj).intValue();
+ if (mCallCapabilities != callCapabilities) {
+ mCallCapabilities = callCapabilities;
+ for (Listener l : mListeners) {
+ l.onCallCapabilitiesChanged(Connection.this, mCallCapabilities);
+ }
+ }
+ }
+ break;
+ case MSG_DESTROY: {
+ // TODO: Is this still relevant because everything is on the main thread now.
+ // It is possible that onDestroy() will trigger the listener to remove itself
+ // which will result in a concurrent modification exception. To counteract
+ // this we make a copy of the listeners and iterate on that.
+ for (Listener l : new ArrayList<>(mListeners)) {
+ if (mListeners.contains(l)) {
+ l.onDestroyed(Connection.this);
+ }
+ }
+ }
+ break;
+ case MSG_SET_SIGNAL: {
+ Bundle details = (Bundle) msg.obj;
+ for (Listener l : mListeners) {
+ l.onSignalChanged(Connection.this, details);
+ }
+ }
+ break;
+ case MSG_SET_AUDIO_MODE_IS_VOIP: {
+ boolean isVoip = ((Boolean) msg.obj).booleanValue();
+ mAudioModeIsVoip = isVoip;
+ for (Listener l : mListeners) {
+ l.onAudioModeIsVoipChanged(Connection.this, isVoip);
+ }
+ }
+ break;
+ case MSG_SET_STATUS_HINTS: {
+ StatusHints statusHints = (StatusHints) msg.obj;
+ mStatusHints = statusHints;
+ for (Listener l : mListeners) {
+ l.onStatusHintsChanged(Connection.this, statusHints);
+ }
+ }
+ break;
+ case MSG_START_ACTIVITY_FROM_IN_CALL: {
+ PendingIntent intent = (PendingIntent) msg.obj;
+ for (Listener l : mListeners) {
+ l.onStartActivityFromInCall(Connection.this, intent);
+ }
+ }
+ break;
+ }
+ }
+ };
+
/**
* Create a new Connection.
*/
@@ -188,7 +430,7 @@
* @hide
*/
public final Connection addConnectionListener(Listener l) {
- mListeners.add(l);
+ mHandler.obtainMessage(MSG_ADD_CONNECTION_LISTENER, l).sendToTarget();
return this;
}
@@ -201,7 +443,7 @@
* @hide
*/
public final Connection removeConnectionListener(Listener l) {
- mListeners.remove(l);
+ mHandler.obtainMessage(MSG_REMOVE_CONNECTION_LISTENER, l).sendToTarget();
return this;
}
@@ -227,8 +469,7 @@
*/
final void setAudioState(CallAudioState state) {
Log.d(this, "setAudioState %s", state);
- mCallAudioState = state;
- onSetAudioState(state);
+ mHandler.obtainMessage(MSG_SET_AUDIO_STATE, state).sendToTarget();
}
/**
@@ -266,19 +507,7 @@
*/
public final void setParentConnection(Connection parentConnection) {
Log.d(this, "parenting %s to %s", this, parentConnection);
- if (mParentConnection != parentConnection) {
- if (mParentConnection != null) {
- mParentConnection.removeChild(this);
- }
- mParentConnection = parentConnection;
- if (mParentConnection != null) {
- mParentConnection.addChild(this);
- // do something if the child connections goes down to ZERO.
- }
- for (Listener l : mListeners) {
- l.onParentConnectionChanged(this, mParentConnection);
- }
- }
+ mHandler.obtainMessage(MSG_SET_PARENT_CONNECTION, parentConnection).sendToTarget();
}
public final Connection getParentConnection() {
@@ -305,11 +534,10 @@
*/
public final void setHandle(Uri handle, int presentation) {
Log.d(this, "setHandle %s", handle);
- mHandle = handle;
- mHandlePresentation = presentation;
- for (Listener l : mListeners) {
- l.onHandleChanged(this, handle, presentation);
- }
+ SomeArgs args = SomeArgs.obtain();
+ args.arg1 = handle;
+ args.argi1 = presentation;
+ mHandler.obtainMessage(MSG_SET_HANDLE, args).sendToTarget();
}
/**
@@ -321,11 +549,10 @@
*/
public final void setCallerDisplayName(String callerDisplayName, int presentation) {
Log.d(this, "setCallerDisplayName %s", callerDisplayName);
- mCallerDisplayName = callerDisplayName;
- mCallerDisplayNamePresentation = presentation;
- for (Listener l : mListeners) {
- l.onCallerDisplayNameChanged(this, callerDisplayName, presentation);
- }
+ SomeArgs args = SomeArgs.obtain();
+ args.arg1 = callerDisplayName;
+ args.argi1 = presentation;
+ mHandler.obtainMessage(MSG_SET_CALLER_DISPLAY_NAME, args).sendToTarget();
}
/**
@@ -334,7 +561,7 @@
*/
public final void setCanceled() {
Log.d(this, "setCanceled");
- setState(State.CANCELED);
+ mHandler.obtainMessage(MSG_SET_CANCELED).sendToTarget();
}
/**
@@ -350,9 +577,10 @@
*/
public final void setFailed(int code, String message) {
Log.d(this, "setFailed (%d: %s)", code, message);
- mFailureCode = code;
- mFailureMessage = message;
- setState(State.FAILED);
+ SomeArgs args = SomeArgs.obtain();
+ args.argi1 = code;
+ args.arg1 = message;
+ mHandler.obtainMessage(MSG_SET_FAILED, args).sendToTarget();
}
/**
@@ -366,10 +594,7 @@
*/
public final void setVideoState(int videoState) {
Log.d(this, "setVideoState %d", videoState);
- mVideoState = videoState;
- for (Listener l : mListeners) {
- l.onVideoStateChanged(this, mVideoState);
- }
+ mHandler.obtainMessage(MSG_SET_VIDEO_STATE, Integer.valueOf(videoState)).sendToTarget();
}
/**
@@ -377,28 +602,28 @@
* communicate).
*/
public final void setActive() {
- setRequestingRingback(false);
- setState(State.ACTIVE);
+ mHandler.obtainMessage(MSG_SET_ACTIVE).sendToTarget();
}
/**
* Sets state to ringing (e.g., an inbound ringing call).
*/
public final void setRinging() {
- setState(State.RINGING);
+ mHandler.obtainMessage(MSG_SET_RINGING).sendToTarget();
}
/**
* Sets state to initializing (this Connection is not yet ready to be used).
*/
public final void setInitializing() {
- setState(State.INITIALIZING);
+ mHandler.obtainMessage(MSG_SET_INITIALIZING).sendToTarget();
}
/**
* Sets state to initialized (the Connection has been set up and is now ready to be used).
*/
public final void setInitialized() {
+ mHandler.obtainMessage(MSG_SET_INITIALIZED).sendToTarget();
setState(State.NEW);
}
@@ -406,14 +631,14 @@
* Sets state to dialing (e.g., dialing an outbound call).
*/
public final void setDialing() {
- setState(State.DIALING);
+ mHandler.obtainMessage(MSG_SET_DIALING).sendToTarget();
}
/**
* Sets state to be on hold.
*/
public final void setOnHold() {
- setState(State.HOLDING);
+ mHandler.obtainMessage(MSG_SET_ON_HOLD).sendToTarget();
}
/**
@@ -421,10 +646,7 @@
* @param videoCallProvider The video call provider.
*/
public final void setVideoCallProvider(ConnectionService.VideoCallProvider videoCallProvider) {
- mVideoCallProvider = videoCallProvider;
- for (Listener l : mListeners) {
- l.onVideoCallProviderChanged(this, videoCallProvider);
- }
+ mHandler.obtainMessage(MSG_SET_VIDEO_CALL_PROVIDER, videoCallProvider).sendToTarget();
}
public final ConnectionService.VideoCallProvider getVideoCallProvider() {
@@ -439,20 +661,17 @@
* @param message Optional call-service-provided message about the disconnect.
*/
public final void setDisconnected(int cause, String message) {
- setState(State.DISCONNECTED);
- Log.d(this, "Disconnected with cause %d message %s", cause, message);
- for (Listener l : mListeners) {
- l.onDisconnected(this, cause, message);
- }
+ SomeArgs args = SomeArgs.obtain();
+ args.argi1 = cause;
+ args.arg1 = message;
+ mHandler.obtainMessage(MSG_SET_DISCONNECTED, args).sendToTarget();
}
/**
* TODO(santoscordon): Needs documentation.
*/
public final void setPostDialWait(String remaining) {
- for (Listener l : mListeners) {
- l.onPostDialWait(this, remaining);
- }
+ mHandler.obtainMessage(MSG_SET_POST_DIAL_WAIT, remaining).sendToTarget();
}
/**
@@ -462,12 +681,8 @@
* @param ringback Whether the ringback tone is to be played.
*/
public final void setRequestingRingback(boolean ringback) {
- if (mRequestingRingback != ringback) {
- mRequestingRingback = ringback;
- for (Listener l : mListeners) {
- l.onRequestingRingback(this, ringback);
- }
- }
+ mHandler.obtainMessage(MSG_SET_REQUESTING_RINGBACK, Boolean.valueOf(ringback))
+ .sendToTarget();
}
/**
@@ -476,26 +691,15 @@
* @param callCapabilities The new call capabilities.
*/
public final void setCallCapabilities(int callCapabilities) {
- if (mCallCapabilities != callCapabilities) {
- mCallCapabilities = callCapabilities;
- for (Listener l : mListeners) {
- l.onCallCapabilitiesChanged(this, mCallCapabilities);
- }
- }
+ mHandler.obtainMessage(MSG_SET_CALL_CAPABILITIES, Integer.valueOf(callCapabilities))
+ .sendToTarget();
}
/**
* TODO(santoscordon): Needs documentation.
*/
public final void destroy() {
- // It is possible that onDestroy() will trigger the listener to remove itself which will
- // result in a concurrent modification exception. To counteract this we make a copy of the
- // listeners and iterate on that.
- for (Listener l : new ArrayList<>(mListeners)) {
- if (mListeners.contains(l)) {
- l.onDestroyed(this);
- }
- }
+ mHandler.obtainMessage(MSG_DESTROY).sendToTarget();
}
/**
@@ -504,9 +708,7 @@
* @param details A {@link android.os.Bundle} containing details of the current level.
*/
public final void setSignal(Bundle details) {
- for (Listener l : mListeners) {
- l.onSignalChanged(this, details);
- }
+ mHandler.obtainMessage(MSG_SET_SIGNAL, details).sendToTarget();
}
/**
@@ -515,10 +717,7 @@
* @param isVoip True if the audio mode is VOIP.
*/
public final void setAudioModeIsVoip(boolean isVoip) {
- mAudioModeIsVoip = isVoip;
- for (Listener l : mListeners) {
- l.onAudioModeIsVoipChanged(this, isVoip);
- }
+ mHandler.obtainMessage(MSG_SET_AUDIO_MODE_IS_VOIP, Boolean.valueOf(isVoip)).sendToTarget();
}
/**
@@ -527,10 +726,7 @@
* @param statusHints The status label and icon to set.
*/
public final void setStatusHints(StatusHints statusHints) {
- mStatusHints = statusHints;
- for (Listener l : mListeners) {
- l.onStatusHintsChanged(this, statusHints);
- }
+ mHandler.obtainMessage(MSG_SET_STATUS_HINTS, statusHints).sendToTarget();
}
/**
@@ -542,13 +738,13 @@
if (!intent.isActivity()) {
throw new IllegalArgumentException("Activity intent required.");
}
- for (Listener l : mListeners) {
- l.onStartActivityFromInCall(this, intent);
- }
+ mHandler.obtainMessage(MSG_START_ACTIVITY_FROM_IN_CALL, intent).sendToTarget();
}
/**
* Notifies this Connection that the {@link #getCallAudioState()} property has a new value.
+ * <p>
+ * This callback will happen on the main thread.
*
* @param state The new call audio state.
*/
@@ -557,6 +753,8 @@
/**
* Notifies this Connection of an internal state change. This method is called after the
* state is changed.
+ * <p>
+ * This callback will happen on the main thread.
*
* @param state The new state, a {@link Connection.State} member.
*/
@@ -564,6 +762,8 @@
/**
* Notifies this Connection of a request to play a DTMF tone.
+ * <p>
+ * This callback will happen on the main thread.
*
* @param c A DTMF character.
*/
@@ -571,61 +771,81 @@
/**
* Notifies this Connection of a request to stop any currently playing DTMF tones.
+ * <p>
+ * This callback will happen on the main thread.
*/
public void onStopDtmfTone() {}
/**
* Notifies this Connection of a request to disconnect.
+ * <p>
+ * This callback will happen on the main thread.
*/
public void onDisconnect() {}
/**
* Notifies this Connection of a request to disconnect.
+ * <p>
+ * This callback will happen on the main thread.
*/
public void onSeparate() {}
/**
* Notifies this Connection of a request to abort.
+ * <p>
+ * This callback will happen on the main thread.
*/
public void onAbort() {}
/**
* Notifies this Connection of a request to hold.
+ * <p>
+ * This callback will happen on the main thread.
*/
public void onHold() {}
/**
* Notifies this Connection of a request to exit a hold state.
+ * <p>
+ * This callback will happen on the main thread.
*/
public void onUnhold() {}
/**
- * Notifies this Connection, which is in {@link State#RINGING}, of
- * a request to accept.
+ * Notifies this Connection, which is in {@link State#RINGING}, of a request to accept.
+ * <p>
+ * This callback will happen on the main thread.
*
* @param videoState The video state in which to answer the call.
*/
public void onAnswer(int videoState) {}
/**
- * Notifies this Connection, which is in {@link State#RINGING}, of
- * a request to reject.
+ * Notifies this Connection, which is in {@link State#RINGING}, of a request to reject.
+ * <p>
+ * This callback will happen on the main thread.
*/
public void onReject() {}
/**
* Notifies this Connection whether the user wishes to proceed with the post-dial DTMF codes.
+ * <p>
+ * This callback will happen on the main thread.
*/
public void onPostDialContinue(boolean proceed) {}
/**
* Swap this call with a background call. This is used for calls that don't support hold,
* e.g. CDMA.
+ * <p>
+ * This callback will happen on the main thread.
*/
public void onSwapWithBackgroundCall() {}
/**
* TODO(santoscordon): Needs documentation.
+ * <p>
+ * This callback will happen on the main thread.
*/
public void onChildrenChanged(List<Connection> children) {}
@@ -634,12 +854,14 @@
*/
public void onPhoneAccountClicked() {}
+ /** This must be called from the main thread. */
private void addChild(Connection connection) {
Log.d(this, "adding child %s", connection);
mChildConnections.add(connection);
onChildrenChanged(mChildConnections);
}
+ /** This must be called from the main thread. */
private void removeChild(Connection connection) {
Log.d(this, "removing child %s", connection);
mChildConnections.remove(connection);
diff --git a/telephony/java/android/telephony/IccOpenLogicalChannelResponse.aidl b/telephony/java/android/telephony/IccOpenLogicalChannelResponse.aidl
new file mode 100644
index 0000000..fe28c97
--- /dev/null
+++ b/telephony/java/android/telephony/IccOpenLogicalChannelResponse.aidl
@@ -0,0 +1,20 @@
+/*
+**
+** Copyright 2014, The Android Open Source Project
+**
+** Licensed under the Apache License, Version 2.0 (the "License");
+** you may not use this file except in compliance with the License.
+** You may obtain a copy of the License at
+**
+** http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+** See the License for the specific language governing permissions and
+** limitations under the License.
+*/
+
+package android.telephony;
+
+parcelable IccOpenLogicalChannelResponse;
diff --git a/telephony/java/android/telephony/IccOpenLogicalChannelResponse.java b/telephony/java/android/telephony/IccOpenLogicalChannelResponse.java
new file mode 100644
index 0000000..e9db030
--- /dev/null
+++ b/telephony/java/android/telephony/IccOpenLogicalChannelResponse.java
@@ -0,0 +1,121 @@
+/*
+ * Copyright (C) 2014 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.telephony;
+
+import android.os.Parcel;
+import android.os.Parcelable;
+
+
+/**
+ * Response to the {@link TelephonyManager#iccOpenLogicalChannel} command.
+ */
+public class IccOpenLogicalChannelResponse implements Parcelable {
+ // Indicates an invalid channel.
+ public static int INVALID_CHANNEL = -1;
+
+ // Possible status values.
+ public static int NO_ERROR = 1;
+ public static int MISSING_RESOURCE = 2;
+ public static int NO_SUCH_ELEMENT = 3;
+ public static int UNKNOWN_ERROR = 4;
+
+ private final int mChannel;
+ private final int mStatus;
+ private final byte[] mSelectResponse;
+
+ /**
+ * Constructor.
+ *
+ * @hide
+ */
+ public IccOpenLogicalChannelResponse(int channel, int status, byte[] selectResponse) {
+ mChannel = channel;
+ mStatus = status;
+ mSelectResponse = selectResponse;
+ }
+
+ /**
+ * Construct a IccOpenLogicalChannelResponse from a given parcel.
+ */
+ private IccOpenLogicalChannelResponse(Parcel in) {
+ mChannel = in.readInt();
+ mStatus = in.readInt();
+ int arrayLength = in.readInt();
+ if (arrayLength > 0) {
+ mSelectResponse = new byte[arrayLength];
+ in.readByteArray(mSelectResponse);
+ } else {
+ mSelectResponse = null;
+ }
+ }
+
+ /**
+ * @return the channel id.
+ */
+ public int getChannel() {
+ return mChannel;
+ }
+
+ /**
+ * @return the status of the command.
+ */
+ public int getStatus() {
+ return mStatus;
+ }
+
+ /**
+ * @return the select response.
+ */
+ public byte[] getSelectResponse() {
+ return mSelectResponse;
+ }
+
+ @Override
+ public int describeContents() {
+ return 0;
+ }
+
+ @Override
+ public void writeToParcel(Parcel out, int flags) {
+ out.writeInt(mChannel);
+ out.writeInt(mStatus);
+ if (mSelectResponse != null && mSelectResponse.length > 0) {
+ out.writeInt(mSelectResponse.length);
+ out.writeByteArray(mSelectResponse);
+ } else {
+ out.writeInt(0);
+ }
+ }
+
+ public static final Parcelable.Creator<IccOpenLogicalChannelResponse> CREATOR
+ = new Parcelable.Creator<IccOpenLogicalChannelResponse>() {
+
+ @Override
+ public IccOpenLogicalChannelResponse createFromParcel(Parcel in) {
+ return new IccOpenLogicalChannelResponse(in);
+ }
+
+ public IccOpenLogicalChannelResponse[] newArray(int size) {
+ return new IccOpenLogicalChannelResponse[size];
+ }
+ };
+
+ @Override
+ public String toString() {
+ return "Channel: " + mChannel + " Status: " + mStatus;
+ }
+}
diff --git a/telephony/java/android/telephony/PhoneStateListener.java b/telephony/java/android/telephony/PhoneStateListener.java
index c8c3063..350c27e 100644
--- a/telephony/java/android/telephony/PhoneStateListener.java
+++ b/telephony/java/android/telephony/PhoneStateListener.java
@@ -50,7 +50,8 @@
* appropriate LISTEN_ flags.
*/
public class PhoneStateListener {
- private static final String TAG = "PhoneStateListener";
+ private static final String LOG_TAG = "PhoneStateListener";
+ private static final boolean DBG = false; // STOPSHIP if true
/**
* Stop listening for updates.
@@ -233,12 +234,14 @@
/** @hide */
public PhoneStateListener(long subId, Looper looper) {
- Rlog.d(TAG, "ctor: subId=" + subId + " looper=" + looper);
+ if (DBG) log("ctor: subId=" + subId + " looper=" + looper);
mSubId = subId;
mHandler = new Handler(looper) {
public void handleMessage(Message msg) {
- Rlog.d(TAG, "mSubId=" + mSubId + " what=0x" + Integer.toHexString(msg.what)
- + " msg=" + msg);
+ if (DBG) {
+ log("mSubId=" + mSubId + " what=0x" + Integer.toHexString(msg.what)
+ + " msg=" + msg);
+ }
switch (msg.what) {
case LISTEN_SERVICE_STATE:
PhoneStateListener.this.onServiceStateChanged((ServiceState)msg.obj);
@@ -528,4 +531,8 @@
Message.obtain(mHandler, LISTEN_VOLTE_STATE, 0, 0, lteState).sendToTarget();
}
};
+
+ private void log(String s) {
+ Rlog.d(LOG_TAG, s);
+ }
}
diff --git a/telephony/java/android/telephony/TelephonyManager.java b/telephony/java/android/telephony/TelephonyManager.java
index 35568cf..0772687 100644
--- a/telephony/java/android/telephony/TelephonyManager.java
+++ b/telephony/java/android/telephony/TelephonyManager.java
@@ -26,6 +26,7 @@
import android.os.ServiceManager;
import android.os.SystemProperties;
import android.util.Log;
+import android.util.Pair;
import com.android.internal.telecomm.ITelecommService;
import com.android.internal.telephony.IPhoneSubInfo;
@@ -2348,15 +2349,15 @@
* Or the calling app has carrier privileges. @see #hasCarrierPrivileges
*
* @param AID Application id. See ETSI 102.221 and 101.220.
- * @return The logical channel id which is negative on error.
+ * @return an IccOpenLogicalChannelResponse object.
*/
- public int iccOpenLogicalChannel(String AID) {
+ public IccOpenLogicalChannelResponse iccOpenLogicalChannel(String AID) {
try {
return getITelephony().iccOpenLogicalChannel(AID);
} catch (RemoteException ex) {
} catch (NullPointerException ex) {
}
- return -1;
+ return null;
}
/**
@@ -2414,6 +2415,62 @@
}
/**
+ * Transmit an APDU to the ICC card over the basic channel.
+ *
+ * Input parameters equivalent to TS 27.007 AT+CSIM command.
+ *
+ * <p>Requires Permission:
+ * {@link android.Manifest.permission#MODIFY_PHONE_STATE MODIFY_PHONE_STATE}
+ * Or the calling app has carrier privileges. @see #hasCarrierPrivileges
+ *
+ * @param cla Class of the APDU command.
+ * @param instruction Instruction of the APDU command.
+ * @param p1 P1 value of the APDU command.
+ * @param p2 P2 value of the APDU command.
+ * @param p3 P3 value of the APDU command. If p3 is negative a 4 byte APDU
+ * is sent to the SIM.
+ * @param data Data to be sent with the APDU.
+ * @return The APDU response from the ICC card with the status appended at
+ * the end. If an error occurs, an empty string is returned.
+ */
+ public String iccTransmitApduBasicChannel(int cla,
+ int instruction, int p1, int p2, int p3, String data) {
+ try {
+ return getITelephony().iccTransmitApduBasicChannel(cla,
+ instruction, p1, p2, p3, data);
+ } catch (RemoteException ex) {
+ } catch (NullPointerException ex) {
+ }
+ return "";
+ }
+
+ /**
+ * Returns the response APDU for a command APDU sent through SIM_IO.
+ *
+ * <p>Requires Permission:
+ * {@link android.Manifest.permission#MODIFY_PHONE_STATE MODIFY_PHONE_STATE}
+ * Or the calling app has carrier privileges. @see #hasCarrierPrivileges
+ *
+ * @param fileID
+ * @param command
+ * @param p1 P1 value of the APDU command.
+ * @param p2 P2 value of the APDU command.
+ * @param p3 P3 value of the APDU command.
+ * @param filePath
+ * @return The APDU response.
+ */
+ byte[] iccExchangeSimIO(int fileID, int command, int p1, int p2, int p3,
+ String filePath) {
+ try {
+ return getITelephony().iccExchangeSimIO(fileID, command, p1, p2,
+ p3, filePath);
+ } catch (RemoteException ex) {
+ } catch (NullPointerException ex) {
+ }
+ return null;
+ }
+
+ /**
* Send ENVELOPE to the SIM and return the response.
*
* <p>Requires Permission:
diff --git a/telephony/java/com/android/ims/ImsReasonInfo.java b/telephony/java/com/android/ims/ImsReasonInfo.java
index 99faba6..d2b6725 100644
--- a/telephony/java/com/android/ims/ImsReasonInfo.java
+++ b/telephony/java/com/android/ims/ImsReasonInfo.java
@@ -218,7 +218,10 @@
public static final int CODE_UT_OPERATION_NOT_ALLOWED = 803;
public static final int CODE_UT_CB_PASSWORD_MISMATCH = 821;
-
+ /**
+ * ECBM
+ */
+ public static final int CODE_ECBM_NOT_SUPPORTED = 901;
// For reason type
public int mReasonType;
diff --git a/telephony/java/com/android/ims/internal/IImsEcbm.aidl b/telephony/java/com/android/ims/internal/IImsEcbm.aidl
new file mode 100644
index 0000000..f890bc2
--- /dev/null
+++ b/telephony/java/com/android/ims/internal/IImsEcbm.aidl
@@ -0,0 +1,49 @@
+/*
+ * Copyright (c) 2014, The Linux Foundation. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ * * Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following
+ * disclaimer in the documentation and/or other materials provided
+ * with the distribution.
+ * * Neither the name of The Linux Foundation nor the names of its
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
+ * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+ * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
+ * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
+ * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package com.android.ims.internal;
+
+import com.android.ims.internal.IImsEcbmListener;
+
+/**
+ * Provides the ECBM interface
+ *
+ * {@hide}
+ */
+interface IImsEcbm {
+ /**
+ * Sets the listener.
+ */
+ void setListener(in IImsEcbmListener listener);
+
+ /**
+ * Requests Modem to come out of ECBM mode
+ */
+ void exitEmergencyCallbackMode();
+}
diff --git a/telephony/java/com/android/ims/internal/IImsEcbmListener.aidl b/telephony/java/com/android/ims/internal/IImsEcbmListener.aidl
new file mode 100644
index 0000000..d866ecb
--- /dev/null
+++ b/telephony/java/com/android/ims/internal/IImsEcbmListener.aidl
@@ -0,0 +1,48 @@
+/*
+ * Copyright (c) 2014, The Linux Foundation. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ * * Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following
+ * disclaimer in the documentation and/or other materials provided
+ * with the distribution.
+ * * Neither the name of The Linux Foundation nor the names of its
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
+ * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+ * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
+ * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
+ * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package com.android.ims.internal;
+
+/**
+ * A listener type for receiving notifications about the changes to
+ * Emergency Callback Mode through IMS.
+ *
+ * {@hide}
+ */
+interface IImsEcbmListener {
+ /**
+ * Notifies the application when the device enters Emergency Callback Mode.
+ */
+ void enteredECBM();
+
+ /**
+ * Notifies the application when the device exits Emergency Callback Mode.
+ */
+ void exitedECBM();
+}
diff --git a/telephony/java/com/android/ims/internal/IImsService.aidl b/telephony/java/com/android/ims/internal/IImsService.aidl
index 869cd9f..5138305 100644
--- a/telephony/java/com/android/ims/internal/IImsService.aidl
+++ b/telephony/java/com/android/ims/internal/IImsService.aidl
@@ -22,6 +22,7 @@
import com.android.ims.internal.IImsRegistrationListener;
import com.android.ims.internal.IImsCallSession;
import com.android.ims.internal.IImsCallSessionListener;
+import com.android.ims.internal.IImsEcbm;
import com.android.ims.internal.IImsUt;
import com.android.ims.internal.IImsConfig;
@@ -62,4 +63,11 @@
* When IMS is OFF, device will behave as CSFB'ed.
*/
void turnOffIms();
+
+
+ /**
+ * ECBM interface for Emergency Callback mode mechanism.
+ */
+ IImsEcbm getEcbmInterface(int serviceId);
+
}
diff --git a/telephony/java/com/android/internal/telephony/IMms.aidl b/telephony/java/com/android/internal/telephony/IMms.aidl
index 30ef725..cbcef25 100644
--- a/telephony/java/com/android/internal/telephony/IMms.aidl
+++ b/telephony/java/com/android/internal/telephony/IMms.aidl
@@ -31,11 +31,14 @@
* @param callingPkg the package name of the calling app
* @param pdu the MMS message encoded in standard MMS PDU format
* @param locationUrl the optional location url for where this message should be sent to
+ * @param configOverrides the carrier-specific messaging configuration values to override for
+ * sending the message. See {@link android.telephony.MessagingConfigurationManager} for the
+ * value names and types.
* @param sentIntent if not NULL this <code>PendingIntent</code> is
* broadcast when the message is successfully sent, or failed
*/
void sendMessage(long subId, String callingPkg, in byte[] pdu, String locationUrl,
- in PendingIntent sentIntent);
+ in ContentValues configOverrides, in PendingIntent sentIntent);
/**
* Download an MMS message using known location and transaction id
@@ -44,11 +47,14 @@
* @param callingPkg the package name of the calling app
* @param locationUrl the location URL of the MMS message to be downloaded, usually obtained
* from the MMS WAP push notification
+ * @param configOverrides the carrier-specific messaging configuration values to override for
+ * downloading the message. See {@link android.telephony.MessagingConfigurationManager} for the
+ * value names and types.
* @param downloadedIntent if not NULL this <code>PendingIntent</code> is
* broadcast when the message is downloaded, or the download is failed
*/
void downloadMessage(long subId, String callingPkg, String locationUrl,
- in PendingIntent downloadedIntent);
+ in ContentValues configOverrides, in PendingIntent downloadedIntent);
/**
* Update the status of a pending (send-by-IP) MMS message handled by the carrier app.
@@ -75,53 +81,30 @@
* Get carrier-dependent configuration value as boolean. For example, if multipart SMS
* is supported.
*
+ * @param subId the SIM id
* @param name the configuration name
* @param defaultValue the default value if fail to find the name
*/
- boolean getCarrierConfigBoolean(String name, boolean defaultValue);
+ boolean getCarrierConfigBoolean(long subId, String name, boolean defaultValue);
/**
* Get carrier-dependent configuration value as int. For example, the MMS message size limit.
*
+ * @param subId the SIM id
* @param name the configuration name
* @param defaultValue the default value if fail to find the name
*/
- int getCarrierConfigInt(String name, int defaultValue);
+ int getCarrierConfigInt(long subId, String name, int defaultValue);
/**
* Get carrier-dependent configuration value as String. For example, extra HTTP headers for
* MMS request.
*
+ * @param subId the SIM id
* @param name the configuration name
* @param defaultValue the default value if fail to find the name
*/
- String getCarrierConfigString(String name, String defaultValue);
-
- /**
- * Set carrier-dependent configuration value as boolean. For example, if multipart SMS
- * is supported.
- *
- * @param name the configuration name
- * @param value the configuration value
- */
- void setCarrierConfigBoolean(String callingPkg, String name, boolean value);
-
- /**
- * Set carrier-dependent configuration value as int. For example, the MMS message size limit.
- *
- * @param name the configuration name
- * @param value the configuration value
- */
- void setCarrierConfigInt(String callingPkg, String name, int value);
-
- /**
- * Set carrier-dependent configuration value as String. For example, extra HTTP headers for
- * MMS request.
- *
- * @param name the configuration name
- * @param value the configuration value
- */
- void setCarrierConfigString(String callingPkg, String name, String value);
+ String getCarrierConfigString(long subId, String name, String defaultValue);
/**
* Import a text message into system's SMS store
@@ -220,11 +203,14 @@
* @param subId the SIM id
* @param callingPkg the package name of the calling app
* @param messageUri the URI of the stored message
+ * @param configOverrides the carrier-specific messaging configuration values to override for
+ * sending the message. See {@link android.telephony.MessagingConfigurationManager} for the
+ * value names and types.
* @param sentIntent if not NULL this <code>PendingIntent</code> is
* broadcast when the message is successfully sent, or failed
*/
void sendStoredMessage(long subId, String callingPkg, in Uri messageUri,
- in PendingIntent sentIntent);
+ in ContentValues configOverrides, in PendingIntent sentIntent);
/**
* Turns on/off the flag to automatically write sent/received SMS/MMS messages into system
diff --git a/telephony/java/com/android/internal/telephony/ITelephony.aidl b/telephony/java/com/android/internal/telephony/ITelephony.aidl
index 886de40..72b04cf 100644
--- a/telephony/java/com/android/internal/telephony/ITelephony.aidl
+++ b/telephony/java/com/android/internal/telephony/ITelephony.aidl
@@ -18,9 +18,10 @@
import android.content.Intent;
import android.os.Bundle;
-import java.util.List;
-import android.telephony.NeighboringCellInfo;
import android.telephony.CellInfo;
+import android.telephony.IccOpenLogicalChannelResponse;
+import android.telephony.NeighboringCellInfo;
+import java.util.List;
/**
@@ -499,9 +500,9 @@
* Input parameters equivalent to TS 27.007 AT+CCHO command.
*
* @param AID Application id. See ETSI 102.221 and 101.220.
- * @return The logical channel id which is set to -1 on error.
+ * @return an IccOpenLogicalChannelResponse object.
*/
- int iccOpenLogicalChannel(String AID);
+ IccOpenLogicalChannelResponse iccOpenLogicalChannel(String AID);
/**
* Closes a previously opened logical channel to the ICC card.
@@ -535,6 +536,38 @@
int p1, int p2, int p3, String data);
/**
+ * Transmit an APDU to the ICC card over the basic channel.
+ *
+ * Input parameters equivalent to TS 27.007 AT+CSIM command.
+ *
+ * @param cla Class of the APDU command.
+ * @param instruction Instruction of the APDU command.
+ * @param p1 P1 value of the APDU command.
+ * @param p2 P2 value of the APDU command.
+ * @param p3 P3 value of the APDU command. If p3 is negative a 4 byte APDU
+ * is sent to the SIM.
+ * @param data Data to be sent with the APDU.
+ * @return The APDU response from the ICC card with the status appended at
+ * the end. If an error occurs, an empty string is returned.
+ */
+ String iccTransmitApduBasicChannel(int cla, int instruction,
+ int p1, int p2, int p3, String data);
+
+ /**
+ * Returns the response APDU for a command APDU sent through SIM_IO.
+ *
+ * @param fileID
+ * @param command
+ * @param p1 P1 value of the APDU command.
+ * @param p2 P2 value of the APDU command.
+ * @param p3 P3 value of the APDU command.
+ * @param filePath
+ * @return The APDU response.
+ */
+ byte[] iccExchangeSimIO(int fileID, int command, int p1, int p2, int p3,
+ String filePath);
+
+ /**
* Send ENVELOPE to the SIM and returns the response.
*
* @param contents String containing SAT/USAT response in hexadecimal
diff --git a/telephony/java/com/android/internal/telephony/TelephonyProperties.java b/telephony/java/com/android/internal/telephony/TelephonyProperties.java
index 5ec4247..41b6b76 100644
--- a/telephony/java/com/android/internal/telephony/TelephonyProperties.java
+++ b/telephony/java/com/android/internal/telephony/TelephonyProperties.java
@@ -209,4 +209,14 @@
* Set to the sim count.
*/
static final String PROPERTY_SIM_COUNT = "ro.telephony.sim.count";
+
+ /**
+ * Enable VoLTE/VT over IMS: debug option
+ * If 1: use IMS if provisioned/registered etc (i.e. standard operation)
+ * If 0: use CS.
+ * If missing: use PROPERTY_DBG_IMS_VOLTE_ENABLE_DEAFULT
+ */
+ static final String PROPERTY_DBG_IMS_VOLTE_ENABLE = "persist.dbg.ims_volte_enable";
+
+ static final int PROPERTY_DBG_IMS_VOLTE_ENABLE_DEAFULT = 0;
}
diff --git a/tests/SharedLibrary/lib/AndroidManifest.xml b/tests/SharedLibrary/lib/AndroidManifest.xml
index 31fac20..bb939dd 100644
--- a/tests/SharedLibrary/lib/AndroidManifest.xml
+++ b/tests/SharedLibrary/lib/AndroidManifest.xml
@@ -19,7 +19,8 @@
android:versionCode="2">
<application android:label="SharedLibrary">
<library android:name="com.google.android.test.shared_library" />
- <activity android:name="ActivityMain">
+ <activity android:name="ActivityMain"
+ android:icon="@drawable/size_48x48">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
diff --git a/tests/SharedLibrary/lib/res/drawable/size_48x48.jpg b/tests/SharedLibrary/lib/res/drawable/size_48x48.jpg
new file mode 100644
index 0000000..5c2291e
--- /dev/null
+++ b/tests/SharedLibrary/lib/res/drawable/size_48x48.jpg
Binary files differ
diff --git a/tests/VoiceInteraction/src/com/android/test/voiceinteraction/MainInteractionService.java b/tests/VoiceInteraction/src/com/android/test/voiceinteraction/MainInteractionService.java
index 49c3d0a..02610f8 100644
--- a/tests/VoiceInteraction/src/com/android/test/voiceinteraction/MainInteractionService.java
+++ b/tests/VoiceInteraction/src/com/android/test/voiceinteraction/MainInteractionService.java
@@ -20,6 +20,7 @@
import android.os.Bundle;
import android.service.voice.AlwaysOnHotwordDetector;
import android.service.voice.AlwaysOnHotwordDetector.Callback;
+import android.service.voice.AlwaysOnHotwordDetector.TriggerAudio;
import android.service.voice.VoiceInteractionService;
import android.util.Log;
@@ -36,21 +37,11 @@
}
@Override
- public void onDetected(byte[] data) {
+ public void onDetected(TriggerAudio triggerAudio) {
Log.i(TAG, "onDetected");
}
@Override
- public void onDetectionStarted() {
- Log.i(TAG, "onDetectionStarted");
- }
-
- @Override
- public void onDetectionStopped() {
- Log.i(TAG, "onDetectionStopped");
- }
-
- @Override
public void onError() {
Log.i(TAG, "onError");
}
@@ -81,11 +72,6 @@
private void hotwordAvailabilityChangeHelper(int availability) {
Log.i(TAG, "Hotword availability = " + availability);
switch (availability) {
- case AlwaysOnHotwordDetector.STATE_INVALID:
- Log.i(TAG, "STATE_INVALID");
- mHotwordDetector =
- createAlwaysOnHotwordDetector("Hello There", "en-US", mHotwordCallback);
- break;
case AlwaysOnHotwordDetector.STATE_HARDWARE_UNAVAILABLE:
Log.i(TAG, "STATE_HARDWARE_UNAVAILABLE");
break;
@@ -100,8 +86,12 @@
break;
case AlwaysOnHotwordDetector.STATE_KEYPHRASE_ENROLLED:
Log.i(TAG, "STATE_KEYPHRASE_ENROLLED - starting recognition");
- mHotwordDetector.startRecognition(
- AlwaysOnHotwordDetector.RECOGNITION_FLAG_NONE);
+ if (mHotwordDetector.startRecognition(
+ AlwaysOnHotwordDetector.RECOGNITION_FLAG_NONE)) {
+ Log.i(TAG, "startRecognition succeeded");
+ } else {
+ Log.i(TAG, "startRecognition failed");
+ }
break;
}
}
diff --git a/tools/aapt/Command.cpp b/tools/aapt/Command.cpp
index afeb546..755a77a 100644
--- a/tools/aapt/Command.cpp
+++ b/tools/aapt/Command.cpp
@@ -714,7 +714,6 @@
int doDump(Bundle* bundle)
{
status_t result = UNKNOWN_ERROR;
- Asset* asset = NULL;
if (bundle->getFileSpecCount() < 1) {
fprintf(stderr, "ERROR: no dump option specified\n");
@@ -758,12 +757,21 @@
const ResTable& res = assets.getResources(false);
if (&res == NULL) {
fprintf(stderr, "ERROR: dump failed because no resource table was found\n");
- goto bail;
+ return 1;
} else if (res.getError() != NO_ERROR) {
fprintf(stderr, "ERROR: dump failed because the resource table is invalid/corrupt.\n");
- goto bail;
+ return 1;
}
+ const DynamicRefTable* dynamicRefTable = res.getDynamicRefTableForCookie(assetsCookie);
+ if (dynamicRefTable == NULL) {
+ fprintf(stderr, "ERROR: failed to find dynamic reference table for asset cookie %d\n",
+ assetsCookie);
+ return 1;
+ }
+
+ Asset* asset = NULL;
+
if (strcmp("resources", option) == 0) {
#ifndef HAVE_ANDROID_OS
res.print(bundle->getValues());
@@ -781,8 +789,8 @@
for (int i=2; i<bundle->getFileSpecCount(); i++) {
const char* resname = bundle->getFileSpecEntry(i);
- ResXMLTree tree;
- asset = assets.openNonAsset(resname, Asset::ACCESS_BUFFER);
+ ResXMLTree tree(dynamicRefTable);
+ asset = assets.openNonAsset(assetsCookie, resname, Asset::ACCESS_BUFFER);
if (asset == NULL) {
fprintf(stderr, "ERROR: dump failed because resource %s found\n", resname);
goto bail;
@@ -808,13 +816,13 @@
for (int i=2; i<bundle->getFileSpecCount(); i++) {
const char* resname = bundle->getFileSpecEntry(i);
- ResXMLTree tree;
- asset = assets.openNonAsset(resname, Asset::ACCESS_BUFFER);
+ asset = assets.openNonAsset(assetsCookie, resname, Asset::ACCESS_BUFFER);
if (asset == NULL) {
fprintf(stderr, "ERROR: dump failed because resource %s found\n", resname);
goto bail;
}
+ ResXMLTree tree(dynamicRefTable);
if (tree.setTo(asset->getBuffer(true),
asset->getLength()) != NO_ERROR) {
fprintf(stderr, "ERROR: Resource %s is corrupt\n", resname);
@@ -826,14 +834,13 @@
}
} else {
- ResXMLTree tree;
- asset = assets.openNonAsset("AndroidManifest.xml",
- Asset::ACCESS_BUFFER);
+ asset = assets.openNonAsset(assetsCookie, "AndroidManifest.xml", Asset::ACCESS_BUFFER);
if (asset == NULL) {
fprintf(stderr, "ERROR: dump failed because no AndroidManifest.xml found\n");
goto bail;
}
+ ResXMLTree tree(dynamicRefTable);
if (tree.setTo(asset->getBuffer(true),
asset->getLength()) != NO_ERROR) {
fprintf(stderr, "ERROR: AndroidManifest.xml is corrupt\n");
diff --git a/tools/aapt/Images.cpp b/tools/aapt/Images.cpp
index 28de933..cf3dd0a 100644
--- a/tools/aapt/Images.cpp
+++ b/tools/aapt/Images.cpp
@@ -83,7 +83,7 @@
int32_t outlineInsetsRight;
int32_t outlineInsetsBottom;
float outlineRadius;
- bool outlineFilled;
+ uint8_t outlineAlpha;
png_uint_32 allocHeight;
png_bytepp allocRows;
@@ -410,12 +410,12 @@
int* out_inset)
{
bool opaque_within_inset = true;
- unsigned char max_opacity = 0;
+ uint8_t max_opacity = 0;
int inset = 0;
*out_inset = 0;
for (int x = startX, y = startY; x != endX && y != endY; x += dX, y += dY, inset++) {
png_byte* color = rows[y] + x * 4;
- unsigned char opacity = color[3];
+ uint8_t opacity = color[3];
if (opacity > max_opacity) {
max_opacity = opacity;
*out_inset = inset;
@@ -424,22 +424,24 @@
}
}
-static bool is_opaque_over_row(png_byte* row, int startX, int endX)
+static uint8_t max_alpha_over_row(png_byte* row, int startX, int endX)
{
+ uint8_t max_alpha = 0;
for (int x = startX; x < endX; x++) {
- png_byte* color = row + x * 4;
- if (color[3] != 0xff) return false;
+ uint8_t alpha = (row + x * 4)[3];
+ if (alpha > max_alpha) max_alpha = alpha;
}
- return true;
+ return max_alpha;
}
-static bool is_opaque_over_col(png_byte** rows, int offsetX, int startY, int endY)
+static uint8_t max_alpha_over_col(png_byte** rows, int offsetX, int startY, int endY)
{
+ uint8_t max_alpha = 0;
for (int y = startY; y < endY; y++) {
- png_byte* color = rows[y] + offsetX * 4;
- if (color[3] != 0xff) return false;
+ uint8_t alpha = (rows[y] + offsetX * 4)[3];
+ if (alpha > max_alpha) max_alpha = alpha;
}
- return true;
+ return max_alpha;
}
static void get_outline(image_info* image)
@@ -476,8 +478,8 @@
// assuming the image is a round rect, compute the radius by marching
// diagonally from the top left corner towards the center
- image->outlineFilled = is_opaque_over_row(image->rows[innerMidY], innerStartX, innerEndX)
- && is_opaque_over_col(image->rows, innerMidX, innerStartY, innerStartY);
+ image->outlineAlpha = max(max_alpha_over_row(image->rows[innerMidY], innerStartX, innerEndX),
+ max_alpha_over_col(image->rows, innerMidX, innerStartY, innerStartY));
int diagonalInset = 0;
find_max_opacity(image->rows, innerStartX, innerStartY, innerMidX, innerMidY, 1, 1,
@@ -487,14 +489,13 @@
// radius = 1 / (sqrt(2) - 1) * inset
image->outlineRadius = 2.4142f * diagonalInset;
- NOISY(printf("outline insets %d %d %d %d, rad %f, filled %d\n",
- image->outlineFilled,
+ NOISY(printf("outline insets %d %d %d %d, rad %f, alpha %x\n",
image->outlineInsetsLeft,
image->outlineInsetsTop,
image->outlineInsetsRight,
image->outlineInsetsBottom,
image->outlineRadius,
- image->outlineFilled));
+ image->outlineAlpha));
}
@@ -691,8 +692,8 @@
}
NOISY(printf("Size ticks for %s: x0=%d, x1=%d, y0=%d, y1=%d\n", imageName,
- image->info9Patch.xDivs[0], image->info9Patch.xDivs[1],
- image->info9Patch.yDivs[0], image->info9Patch.yDivs[1]));
+ xDivs[0], xDivs[1],
+ yDivs[0], yDivs[1]));
NOISY(printf("padding ticks for %s: l=%d, r=%d, t=%d, b=%d\n", imageName,
image->info9Patch.paddingLeft, image->info9Patch.paddingRight,
image->info9Patch.paddingTop, image->info9Patch.paddingBottom));
@@ -1167,7 +1168,7 @@
png_byte outputData[chunk_size];
memcpy(&outputData, &imageInfo.outlineInsetsLeft, 4 * sizeof(png_uint_32));
((float*) outputData)[4] = imageInfo.outlineRadius;
- ((png_uint_32*) outputData)[5] = imageInfo.outlineFilled ? 1 : 0;
+ ((png_uint_32*) outputData)[5] = imageInfo.outlineAlpha;
memcpy(unknowns[o_index].data, &outputData, chunk_size);
unknowns[o_index].size = chunk_size;
diff --git a/tools/layoutlib/bridge/src/android/view/IWindowManagerImpl.java b/tools/layoutlib/bridge/src/android/view/IWindowManagerImpl.java
index 2ffe4a2..09b57fe 100644
--- a/tools/layoutlib/bridge/src/android/view/IWindowManagerImpl.java
+++ b/tools/layoutlib/bridge/src/android/view/IWindowManagerImpl.java
@@ -360,7 +360,7 @@
}
@Override
- public void updateScreenCaptureDisabled(int userId) {
+ public void setScreenCaptureDisabled(int userId, boolean disabled) {
// TODO Auto-generated method stub
}
diff --git a/tools/layoutlib/create/src/com/android/tools/layoutlib/create/ReplaceMethodCallsAdapter.java b/tools/layoutlib/create/src/com/android/tools/layoutlib/create/ReplaceMethodCallsAdapter.java
index 0b5fb46..94d5975 100644
--- a/tools/layoutlib/create/src/com/android/tools/layoutlib/create/ReplaceMethodCallsAdapter.java
+++ b/tools/layoutlib/create/src/com/android/tools/layoutlib/create/ReplaceMethodCallsAdapter.java
@@ -78,7 +78,7 @@
assert isNeeded(owner, name, desc) && output.length == 3
&& opcodeOut.length == 1;
opcodeOut[0] = Opcodes.INVOKESTATIC;
- output[0] = "com.android.layoutlib.bridge.android.AndroidLocale";
+ output[0] = "com/android/layoutlib/bridge/android/AndroidLocale";
output[1] = name;
output[2] = "(Ljava/util/Locale;)Ljava/lang/String;";
}
diff --git a/wifi/java/android/net/wifi/ScanResult.java b/wifi/java/android/net/wifi/ScanResult.java
index 67ff868..f0a7f38 100644
--- a/wifi/java/android/net/wifi/ScanResult.java
+++ b/wifi/java/android/net/wifi/ScanResult.java
@@ -185,6 +185,14 @@
public static class InformationElement {
public int id;
public byte[] bytes;
+
+ public InformationElement() {
+ }
+
+ public InformationElement(InformationElement rhs) {
+ this.id = rhs.id;
+ this.bytes = rhs.bytes.clone();
+ }
}
/** information elements found in the beacon
diff --git a/wifi/java/android/net/wifi/WifiScanner.java b/wifi/java/android/net/wifi/WifiScanner.java
index 4cdbc44..c5c44b5 100644
--- a/wifi/java/android/net/wifi/WifiScanner.java
+++ b/wifi/java/android/net/wifi/WifiScanner.java
@@ -145,6 +145,8 @@
public int periodInMs;
/** must have a valid REPORT_EVENT value */
public int reportEvents;
+ /** defines number of bssids to cache from each scan */
+ public int numBssidsPerScan;
/** Implement the Parcelable interface {@hide} */
public int describeContents() {
@@ -267,13 +269,6 @@
public void onFullResult(ScanResult fullScanResult);
}
- /** @hide */
- public void scan(ScanSettings settings, ScanListener listener) {
- validateChannel();
- settings.periodInMs = 0;
- sAsyncChannel.sendMessage(CMD_SCAN, 0, putListener(listener), settings);
- }
-
/** start wifi scan in background
* @param settings specifies various parameters for the scan; for more information look at
* {@link ScanSettings}
@@ -305,7 +300,7 @@
}
/** specifies information about an access point of interest */
- public static class HotspotInfo {
+ public static class BssidInfo {
/** bssid of the access point; in XX:XX:XX:XX:XX:XX format */
public String bssid;
/** low signal strength threshold; more information at {@link ScanResult#level} */
@@ -324,7 +319,7 @@
public int unchangedSampleSize; /* samples to confirm no change */
public int minApsBreachingThreshold; /* change threshold to trigger event */
public int periodInMs; /* scan period in millisecond */
- public HotspotInfo[] hotspotInfos;
+ public BssidInfo[] bssidInfos;
/** Implement the Parcelable interface {@hide} */
public int describeContents() {
@@ -338,10 +333,10 @@
dest.writeInt(unchangedSampleSize);
dest.writeInt(minApsBreachingThreshold);
dest.writeInt(periodInMs);
- if (hotspotInfos != null) {
- dest.writeInt(hotspotInfos.length);
- for (int i = 0; i < hotspotInfos.length; i++) {
- HotspotInfo info = hotspotInfos[i];
+ if (bssidInfos != null) {
+ dest.writeInt(bssidInfos.length);
+ for (int i = 0; i < bssidInfos.length; i++) {
+ BssidInfo info = bssidInfos[i];
dest.writeString(info.bssid);
dest.writeInt(info.low);
dest.writeInt(info.high);
@@ -363,14 +358,14 @@
settings.minApsBreachingThreshold = in.readInt();
settings.periodInMs = in.readInt();
int len = in.readInt();
- settings.hotspotInfos = new HotspotInfo[len];
+ settings.bssidInfos = new BssidInfo[len];
for (int i = 0; i < len; i++) {
- HotspotInfo info = new HotspotInfo();
+ BssidInfo info = new BssidInfo();
info.bssid = in.readString();
info.low = in.readInt();
info.high = in.readInt();
info.frequencyHint = in.readInt();
- settings.hotspotInfos[i] = info;
+ settings.bssidInfos[i] = info;
}
return settings;
}
@@ -389,7 +384,7 @@
* @param minApsBreachingThreshold minimum number of access points that need to be
* out of range to detect WifiChange
* @param periodInMs indicates period of scan to find changes
- * @param hotspotInfos access points to watch
+ * @param bssidInfos access points to watch
*/
public void configureWifiChange(
int rssiSampleSize, /* sample size for RSSI averaging */
@@ -397,7 +392,7 @@
int unchangedSampleSize, /* samples to confirm no change */
int minApsBreachingThreshold, /* change threshold to trigger event */
int periodInMs, /* period of scan */
- HotspotInfo[] hotspotInfos /* signal thresholds to crosss */
+ BssidInfo[] bssidInfos /* signal thresholds to crosss */
)
{
validateChannel();
@@ -408,7 +403,7 @@
settings.unchangedSampleSize = unchangedSampleSize;
settings.minApsBreachingThreshold = minApsBreachingThreshold;
settings.periodInMs = periodInMs;
- settings.hotspotInfos = hotspotInfos;
+ settings.bssidInfos = bssidInfos;
configureWifiChange(settings);
}
@@ -455,7 +450,7 @@
}
/** interface to receive hotlist events on; use this on {@link #setHotlist} */
- public static interface HotspotListener extends ActionListener {
+ public static interface BssidListener extends ActionListener {
/** indicates that access points were found by on going scans
* @param results list of scan results, one for each access point visible currently
*/
@@ -465,7 +460,7 @@
/** @hide */
@SystemApi
public static class HotlistSettings implements Parcelable {
- public HotspotInfo[] hotspotInfos;
+ public BssidInfo[] bssidInfos;
public int apLostThreshold;
/** Implement the Parcelable interface {@hide} */
@@ -477,10 +472,10 @@
public void writeToParcel(Parcel dest, int flags) {
dest.writeInt(apLostThreshold);
- if (hotspotInfos != null) {
- dest.writeInt(hotspotInfos.length);
- for (int i = 0; i < hotspotInfos.length; i++) {
- HotspotInfo info = hotspotInfos[i];
+ if (bssidInfos != null) {
+ dest.writeInt(bssidInfos.length);
+ for (int i = 0; i < bssidInfos.length; i++) {
+ BssidInfo info = bssidInfos[i];
dest.writeString(info.bssid);
dest.writeInt(info.low);
dest.writeInt(info.high);
@@ -498,14 +493,14 @@
HotlistSettings settings = new HotlistSettings();
settings.apLostThreshold = in.readInt();
int n = in.readInt();
- settings.hotspotInfos = new HotspotInfo[n];
+ settings.bssidInfos = new BssidInfo[n];
for (int i = 0; i < n; i++) {
- HotspotInfo info = new HotspotInfo();
+ BssidInfo info = new BssidInfo();
info.bssid = in.readString();
info.low = in.readInt();
info.high = in.readInt();
info.frequencyHint = in.readInt();
- settings.hotspotInfos[i] = info;
+ settings.bssidInfos[i] = info;
}
return settings;
}
@@ -518,24 +513,24 @@
/**
* set interesting access points to find
- * @param hotspots access points of interest
+ * @param bssidInfos access points of interest
* @param apLostThreshold number of scans needed to indicate that AP is lost
* @param listener object provided to report events on; this object must be unique and must
- * also be provided on {@link #stopTrackingHotspots}
+ * also be provided on {@link #stopTrackingBssids}
*/
- public void startTrackingHotspots(HotspotInfo[] hotspots,
- int apLostThreshold, HotspotListener listener) {
+ public void startTrackingBssids(BssidInfo[] bssidInfos,
+ int apLostThreshold, BssidListener listener) {
validateChannel();
HotlistSettings settings = new HotlistSettings();
- settings.hotspotInfos = hotspots;
+ settings.bssidInfos = bssidInfos;
sAsyncChannel.sendMessage(CMD_SET_HOTLIST, 0, putListener(listener), settings);
}
/**
* remove tracking of interesting access points
- * @param listener same object provided in {@link #startTrackingHotspots}
+ * @param listener same object provided in {@link #startTrackingBssids}
*/
- public void stopTrackingHotspots(HotspotListener listener) {
+ public void stopTrackingBssids(BssidListener listener) {
validateChannel();
sAsyncChannel.sendMessage(CMD_RESET_HOTLIST, 0, removeListener(listener));
}
@@ -802,7 +797,7 @@
((ScanListener) listener).onPeriodChanged(msg.arg1);
return;
case CMD_AP_FOUND:
- ((HotspotListener) listener).onFound(
+ ((BssidListener) listener).onFound(
((ParcelableScanResults) msg.obj).getResults());
return;
case CMD_WIFI_CHANGE_DETECTED: