Merge "Fix build."
diff --git a/Android.mk b/Android.mk
index 6851765..53e892f 100644
--- a/Android.mk
+++ b/Android.mk
@@ -442,6 +442,7 @@
LOCAL_NO_STANDARD_LIBRARIES := true
LOCAL_JAVA_LIBRARIES := core-oj core-libart conscrypt okhttp core-junit bouncycastle ext
+LOCAL_STATIC_JAVA_LIBRARIES := framework-protos
LOCAL_MODULE := framework
diff --git a/api/current.txt b/api/current.txt
index ed04a6f..230d22e 100644
--- a/api/current.txt
+++ b/api/current.txt
@@ -3676,9 +3676,6 @@
method public void startActivity(android.content.Context, android.content.Intent, android.os.Bundle);
}
- public static abstract class ActivityManager.BugreportMode implements java.lang.annotation.Annotation {
- }
-
public static class ActivityManager.MemoryInfo implements android.os.Parcelable {
ctor public ActivityManager.MemoryInfo();
method public int describeContents();
@@ -5783,9 +5780,6 @@
field public static final java.lang.String EXTRA_LOCK_TASK_PACKAGE = "android.app.extra.LOCK_TASK_PACKAGE";
}
- public static abstract class DeviceAdminReceiver.BugreportFailureCode implements java.lang.annotation.Annotation {
- }
-
public class DevicePolicyManager {
method public void addCrossProfileIntentFilter(android.content.ComponentName, android.content.IntentFilter, int);
method public boolean addCrossProfileWidgetProvider(android.content.ComponentName, java.lang.String);
@@ -5796,6 +5790,7 @@
method public void clearPackagePersistentPreferredActivities(android.content.ComponentName, java.lang.String);
method public void clearUserRestriction(android.content.ComponentName, java.lang.String);
method public deprecated android.os.UserHandle createAndInitializeUser(android.content.ComponentName, java.lang.String, java.lang.String, android.content.ComponentName, android.os.Bundle);
+ method public android.os.UserHandle createAndManageUser(android.content.ComponentName, java.lang.String, android.content.ComponentName, android.os.PersistableBundle, int);
method public deprecated android.os.UserHandle createUser(android.content.ComponentName, java.lang.String);
method public void enableSystemApp(android.content.ComponentName, java.lang.String);
method public int enableSystemApp(android.content.ComponentName, android.content.Intent);
@@ -5988,6 +5983,7 @@
field public static final int PERMISSION_POLICY_PROMPT = 0; // 0x0
field public static final int RESET_PASSWORD_DO_NOT_ASK_CREDENTIALS_ON_BOOT = 2; // 0x2
field public static final int RESET_PASSWORD_REQUIRE_ENTRY = 1; // 0x1
+ field public static final int SKIP_SETUP_WIZARD = 1; // 0x1
field public static final int WIPE_EXTERNAL_STORAGE = 1; // 0x1
field public static final int WIPE_RESET_PROTECTION_DATA = 2; // 0x2
}
@@ -6197,6 +6193,7 @@
method public long getMinLatencyMillis();
method public int getNetworkType();
method public android.content.ComponentName getService();
+ method public android.app.job.JobInfo.TriggerContentUri[] getTriggerContentUris();
method public boolean isPeriodic();
method public boolean isPersisted();
method public boolean isRequireCharging();
@@ -6216,6 +6213,7 @@
public static final class JobInfo.Builder {
ctor public JobInfo.Builder(int, android.content.ComponentName);
+ method public android.app.job.JobInfo.Builder addTriggerContentUri(android.app.job.JobInfo.TriggerContentUri);
method public android.app.job.JobInfo build();
method public android.app.job.JobInfo.Builder setBackoffCriteria(long, int);
method public android.app.job.JobInfo.Builder setExtras(android.os.PersistableBundle);
@@ -6229,10 +6227,22 @@
method public android.app.job.JobInfo.Builder setRequiresDeviceIdle(boolean);
}
+ public static final class JobInfo.TriggerContentUri implements android.os.Parcelable {
+ ctor public JobInfo.TriggerContentUri(android.net.Uri, int);
+ method public int describeContents();
+ method public int getFlags();
+ method public android.net.Uri getUri();
+ method public void writeToParcel(android.os.Parcel, int);
+ field public static final android.os.Parcelable.Creator<android.app.job.JobInfo.TriggerContentUri> CREATOR;
+ field public static final int FLAG_NOTIFY_FOR_DESCENDANTS = 1; // 0x1
+ }
+
public class JobParameters implements android.os.Parcelable {
method public int describeContents();
method public android.os.PersistableBundle getExtras();
method public int getJobId();
+ method public java.lang.String[] getTriggeredContentAuthorities();
+ method public android.net.Uri[] getTriggeredContentUris();
method public boolean isOverrideDeadlineExpired();
method public void writeToParcel(android.os.Parcel, int);
field public static final android.os.Parcelable.Creator<android.app.job.JobParameters> CREATOR;
@@ -8379,7 +8389,6 @@
field public static final java.lang.String ACTION_APP_ERROR = "android.intent.action.APP_ERROR";
field public static final java.lang.String ACTION_ASSIST = "android.intent.action.ASSIST";
field public static final java.lang.String ACTION_ATTACH_DATA = "android.intent.action.ATTACH_DATA";
- field public static final java.lang.String ACTION_AVAILABILITY_CHANGED = "android.intent.action.AVAILABILITY_CHANGED";
field public static final java.lang.String ACTION_BATTERY_CHANGED = "android.intent.action.BATTERY_CHANGED";
field public static final java.lang.String ACTION_BATTERY_LOW = "android.intent.action.BATTERY_LOW";
field public static final java.lang.String ACTION_BATTERY_OKAY = "android.intent.action.BATTERY_OKAY";
@@ -13366,6 +13375,7 @@
field public static final java.lang.String STRING_TYPE_MAGNETIC_FIELD = "android.sensor.magnetic_field";
field public static final java.lang.String STRING_TYPE_MAGNETIC_FIELD_UNCALIBRATED = "android.sensor.magnetic_field_uncalibrated";
field public static final deprecated java.lang.String STRING_TYPE_ORIENTATION = "android.sensor.orientation";
+ field public static final java.lang.String STRING_TYPE_POSE_6DOF = "android.sensor.pose_6dof";
field public static final java.lang.String STRING_TYPE_PRESSURE = "android.sensor.pressure";
field public static final java.lang.String STRING_TYPE_PROXIMITY = "android.sensor.proximity";
field public static final java.lang.String STRING_TYPE_RELATIVE_HUMIDITY = "android.sensor.relative_humidity";
@@ -13388,6 +13398,7 @@
field public static final int TYPE_MAGNETIC_FIELD = 2; // 0x2
field public static final int TYPE_MAGNETIC_FIELD_UNCALIBRATED = 14; // 0xe
field public static final deprecated int TYPE_ORIENTATION = 3; // 0x3
+ field public static final int TYPE_POSE_6DOF = 28; // 0x1c
field public static final int TYPE_PRESSURE = 6; // 0x6
field public static final int TYPE_PROXIMITY = 8; // 0x8
field public static final int TYPE_RELATIVE_HUMIDITY = 12; // 0xc
@@ -22205,6 +22216,7 @@
method public static final android.net.Uri buildProgramsUriForChannel(android.net.Uri);
method public static final android.net.Uri buildProgramsUriForChannel(long, long, long);
method public static final android.net.Uri buildProgramsUriForChannel(android.net.Uri, long, long);
+ method public static final android.net.Uri buildRecordedProgramUri(long);
field public static final java.lang.String AUTHORITY = "android.media.tv";
}
@@ -22341,13 +22353,49 @@
field public static final java.lang.String TRAVEL = "TRAVEL";
}
+ public static final class TvContract.RecordedPrograms implements android.media.tv.TvContract.BaseTvColumns {
+ field public static final java.lang.String COLUMN_AUDIO_LANGUAGE = "audio_language";
+ field public static final java.lang.String COLUMN_BROADCAST_GENRE = "broadcast_genre";
+ field public static final java.lang.String COLUMN_CANONICAL_GENRE = "canonical_genre";
+ field public static final java.lang.String COLUMN_CHANNEL_ID = "channel_id";
+ field public static final java.lang.String COLUMN_CONTENT_RATING = "content_rating";
+ field public static final java.lang.String COLUMN_END_TIME_UTC_MILLIS = "end_time_utc_millis";
+ field public static final java.lang.String COLUMN_EPISODE_NUMBER = "episode_number";
+ field public static final java.lang.String COLUMN_EPISODE_TITLE = "episode_title";
+ field public static final java.lang.String COLUMN_INTERNAL_PROVIDER_DATA = "internal_provider_data";
+ field public static final java.lang.String COLUMN_INTERNAL_PROVIDER_FLAG1 = "internal_provider_flag1";
+ field public static final java.lang.String COLUMN_INTERNAL_PROVIDER_FLAG2 = "internal_provider_flag2";
+ field public static final java.lang.String COLUMN_INTERNAL_PROVIDER_FLAG3 = "internal_provider_flag3";
+ field public static final java.lang.String COLUMN_INTERNAL_PROVIDER_FLAG4 = "internal_provider_flag4";
+ field public static final java.lang.String COLUMN_LONG_DESCRIPTION = "long_description";
+ field public static final java.lang.String COLUMN_POSTER_ART_URI = "poster_art_uri";
+ field public static final java.lang.String COLUMN_RECORDING_DATA_BYTES = "recording_data_bytes";
+ field public static final java.lang.String COLUMN_RECORDING_DATA_URI = "recording_data_uri";
+ field public static final java.lang.String COLUMN_RECORDING_DURATION_MILLIS = "recording_duration_millis";
+ field public static final java.lang.String COLUMN_RECORDING_EXPIRE_TIME_UTC_MILLIS = "recording_expire_time_utc_millis";
+ field public static final java.lang.String COLUMN_SEARCHABLE = "searchable";
+ field public static final java.lang.String COLUMN_SEASON_NUMBER = "season_number";
+ field public static final java.lang.String COLUMN_SHORT_DESCRIPTION = "short_description";
+ field public static final java.lang.String COLUMN_START_TIME_UTC_MILLIS = "start_time_utc_millis";
+ field public static final java.lang.String COLUMN_THUMBNAIL_URI = "thumbnail_uri";
+ field public static final java.lang.String COLUMN_TITLE = "title";
+ field public static final java.lang.String COLUMN_VERSION_NUMBER = "version_number";
+ field public static final java.lang.String COLUMN_VIDEO_HEIGHT = "video_height";
+ field public static final java.lang.String COLUMN_VIDEO_WIDTH = "video_width";
+ field public static final java.lang.String CONTENT_ITEM_TYPE = "vnd.android.cursor.item/recorded_program";
+ field public static final java.lang.String CONTENT_TYPE = "vnd.android.cursor.dir/recorded_program";
+ field public static final android.net.Uri CONTENT_URI;
+ }
+
public final class TvInputInfo implements android.os.Parcelable {
+ method public boolean canRecord();
method public android.content.Intent createSettingsIntent();
method public android.content.Intent createSetupIntent();
method public int describeContents();
method public java.lang.String getId();
method public java.lang.String getParentId();
method public android.content.pm.ServiceInfo getServiceInfo();
+ method public int getTunerCount();
method public int getType();
method public boolean isPassthroughInput();
method public android.graphics.drawable.Drawable loadIcon(android.content.Context);
@@ -22382,6 +22430,10 @@
field public static final int INPUT_STATE_CONNECTED_STANDBY = 1; // 0x1
field public static final int INPUT_STATE_DISCONNECTED = 2; // 0x2
field public static final java.lang.String META_DATA_CONTENT_RATING_SYSTEMS = "android.media.tv.metadata.CONTENT_RATING_SYSTEMS";
+ field public static final int RECORDING_ERROR_CONNECTION_FAILED = 1; // 0x1
+ field public static final int RECORDING_ERROR_INSUFFICIENT_SPACE = 2; // 0x2
+ field public static final int RECORDING_ERROR_RESOURCE_BUSY = 3; // 0x3
+ field public static final int RECORDING_ERROR_UNKNOWN = 0; // 0x0
field public static final long TIME_SHIFT_INVALID_TIME = -9223372036854775808L; // 0x8000000000000000L
field public static final int TIME_SHIFT_STATUS_AVAILABLE = 3; // 0x3
field public static final int TIME_SHIFT_STATUS_UNAVAILABLE = 2; // 0x2
@@ -22399,12 +22451,15 @@
method public void onInputAdded(java.lang.String);
method public void onInputRemoved(java.lang.String);
method public void onInputStateChanged(java.lang.String, int);
+ method public void onTvInputInfoChanged(java.lang.String, android.media.tv.TvInputInfo);
}
public abstract class TvInputService extends android.app.Service {
ctor public TvInputService();
method public final android.os.IBinder onBind(android.content.Intent);
+ method public abstract android.media.tv.TvInputService.RecordingSession onCreateRecordingSession(java.lang.String);
method public abstract android.media.tv.TvInputService.Session onCreateSession(java.lang.String);
+ method public final void setTvInputInfo(java.lang.String, android.media.tv.TvInputInfo);
field public static final java.lang.String SERVICE_INTERFACE = "android.media.tv.TvInputService";
field public static final java.lang.String SERVICE_META_DATA = "android.media.tv.input";
}
@@ -22417,6 +22472,18 @@
method public final boolean onSetSurface(android.view.Surface);
}
+ public static abstract class TvInputService.RecordingSession {
+ ctor public TvInputService.RecordingSession(android.content.Context);
+ method public void notifyConnected();
+ method public void notifyError(int);
+ method public void notifyRecordingStarted();
+ method public void notifyRecordingStopped(android.net.Uri);
+ method public abstract void onConnect(android.net.Uri);
+ method public abstract void onDisconnect();
+ method public abstract void onStartRecording();
+ method public abstract void onStopRecording();
+ }
+
public static abstract class TvInputService.Session implements android.view.KeyEvent.Callback {
ctor public TvInputService.Session(android.content.Context);
method public void layoutSurface(int, int, int, int);
@@ -22444,6 +22511,7 @@
method public long onTimeShiftGetCurrentPosition();
method public long onTimeShiftGetStartPosition();
method public void onTimeShiftPause();
+ method public void onTimeShiftPlay(android.net.Uri);
method public void onTimeShiftResume();
method public void onTimeShiftSeekTo(long);
method public void onTimeShiftSetPlaybackParams(android.media.PlaybackParams);
@@ -22454,6 +22522,23 @@
method public void setOverlayViewEnabled(boolean);
}
+ public class TvRecordingClient {
+ ctor public TvRecordingClient(android.content.Context, java.lang.String, android.media.tv.TvRecordingClient.RecordingCallback, android.os.Handler);
+ method public void connect(java.lang.String, android.net.Uri);
+ method public void disconnect();
+ method public void startRecording();
+ method public void stopRecording();
+ }
+
+ public class TvRecordingClient.RecordingCallback {
+ ctor public TvRecordingClient.RecordingCallback();
+ method public void onConnected();
+ method public void onDisconnected();
+ method public void onError(int);
+ method public void onRecordingStarted();
+ method public void onRecordingStopped(android.net.Uri);
+ }
+
public final class TvTrackInfo implements android.os.Parcelable {
method public int describeContents();
method public final int getAudioChannelCount();
@@ -22505,6 +22590,7 @@
method public void setStreamVolume(float);
method public void setTimeShiftPositionCallback(android.media.tv.TvView.TimeShiftPositionCallback);
method public void timeShiftPause();
+ method public void timeShiftPlay(java.lang.String, android.net.Uri);
method public void timeShiftResume();
method public void timeShiftSeekTo(long);
method public void timeShiftSetPlaybackParams(android.media.PlaybackParams);
@@ -22856,9 +22942,6 @@
method public abstract void onNetworkActive();
}
- public static abstract class ConnectivityManager.RestrictBackgroundStatus implements java.lang.annotation.Annotation {
- }
-
public class Credentials {
ctor public Credentials(int, int, int);
method public int getGid();
@@ -32849,6 +32932,7 @@
method public void getVarV(int, android.renderscript.FieldPacker);
method protected void invoke(int);
method protected void invoke(int, android.renderscript.FieldPacker);
+ method protected void reduce(int, android.renderscript.Allocation[], android.renderscript.Allocation, android.renderscript.Script.LaunchOptions);
method public void setTimeZone(java.lang.String);
method public void setVar(int, float);
method public void setVar(int, double);
@@ -34412,6 +34496,8 @@
public abstract class UtteranceProgressListener {
ctor public UtteranceProgressListener();
+ method public void onAudioAvailable(java.lang.String, byte[]);
+ method public void onBeginSynthesis(java.lang.String, int, int, int);
method public abstract void onDone(java.lang.String);
method public abstract deprecated void onError(java.lang.String);
method public void onError(java.lang.String, int);
@@ -35865,6 +35951,8 @@
public final class CellIdentityGsm implements android.os.Parcelable {
method public int describeContents();
+ method public int getArfcn();
+ method public int getBsic();
method public int getCid();
method public int getLac();
method public int getMcc();
@@ -35877,6 +35965,7 @@
public final class CellIdentityLte implements android.os.Parcelable {
method public int describeContents();
method public int getCi();
+ method public int getEarfcn();
method public int getMcc();
method public int getMnc();
method public int getPci();
@@ -35892,6 +35981,7 @@
method public int getMcc();
method public int getMnc();
method public int getPsc();
+ method public int getUarfcn();
method public void writeToParcel(android.os.Parcel, int);
field public static final android.os.Parcelable.Creator<android.telephony.CellIdentityWcdma> CREATOR;
}
diff --git a/api/system-current.txt b/api/system-current.txt
index 825fe75..e4f42c0 100644
--- a/api/system-current.txt
+++ b/api/system-current.txt
@@ -2903,6 +2903,7 @@
method public android.accounts.AccountManagerFuture<android.os.Bundle> confirmCredentials(android.accounts.Account, android.os.Bundle, android.app.Activity, android.accounts.AccountManagerCallback<android.os.Bundle>, android.os.Handler);
method public android.accounts.AccountManagerFuture<android.os.Bundle> editProperties(java.lang.String, android.app.Activity, android.accounts.AccountManagerCallback<android.os.Bundle>, android.os.Handler);
method public android.accounts.AccountManagerFuture<android.os.Bundle> finishSession(android.os.Bundle, android.app.Activity, android.accounts.AccountManagerCallback<android.os.Bundle>, android.os.Handler);
+ method public android.accounts.AccountManagerFuture<android.os.Bundle> finishSessionAsUser(android.os.Bundle, android.app.Activity, android.os.UserHandle, android.accounts.AccountManagerCallback<android.os.Bundle>, android.os.Handler);
method public static android.accounts.AccountManager get(android.content.Context);
method public android.accounts.Account[] getAccounts();
method public android.accounts.Account[] getAccountsByType(java.lang.String);
@@ -3798,9 +3799,6 @@
method public void startActivity(android.content.Context, android.content.Intent, android.os.Bundle);
}
- public static abstract class ActivityManager.BugreportMode implements java.lang.annotation.Annotation {
- }
-
public static class ActivityManager.MemoryInfo implements android.os.Parcelable {
ctor public ActivityManager.MemoryInfo();
method public int describeContents();
@@ -5918,9 +5916,6 @@
field public static final java.lang.String EXTRA_LOCK_TASK_PACKAGE = "android.app.extra.LOCK_TASK_PACKAGE";
}
- public static abstract class DeviceAdminReceiver.BugreportFailureCode implements java.lang.annotation.Annotation {
- }
-
public class DevicePolicyManager {
method public void addCrossProfileIntentFilter(android.content.ComponentName, android.content.IntentFilter, int);
method public boolean addCrossProfileWidgetProvider(android.content.ComponentName, java.lang.String);
@@ -5932,6 +5927,7 @@
method public void clearProfileOwner(android.content.ComponentName);
method public void clearUserRestriction(android.content.ComponentName, java.lang.String);
method public deprecated android.os.UserHandle createAndInitializeUser(android.content.ComponentName, java.lang.String, java.lang.String, android.content.ComponentName, android.os.Bundle);
+ method public android.os.UserHandle createAndManageUser(android.content.ComponentName, java.lang.String, android.content.ComponentName, android.os.PersistableBundle, int);
method public deprecated android.os.UserHandle createUser(android.content.ComponentName, java.lang.String);
method public void enableSystemApp(android.content.ComponentName, java.lang.String);
method public int enableSystemApp(android.content.ComponentName, android.content.Intent);
@@ -6136,6 +6132,7 @@
field public static final int PERMISSION_POLICY_PROMPT = 0; // 0x0
field public static final int RESET_PASSWORD_DO_NOT_ASK_CREDENTIALS_ON_BOOT = 2; // 0x2
field public static final int RESET_PASSWORD_REQUIRE_ENTRY = 1; // 0x1
+ field public static final int SKIP_SETUP_WIZARD = 1; // 0x1
field public static final int WIPE_EXTERNAL_STORAGE = 1; // 0x1
field public static final int WIPE_RESET_PROTECTION_DATA = 2; // 0x2
}
@@ -6451,6 +6448,7 @@
method public long getMinLatencyMillis();
method public int getNetworkType();
method public android.content.ComponentName getService();
+ method public android.app.job.JobInfo.TriggerContentUri[] getTriggerContentUris();
method public boolean isPeriodic();
method public boolean isPersisted();
method public boolean isRequireCharging();
@@ -6470,6 +6468,7 @@
public static final class JobInfo.Builder {
ctor public JobInfo.Builder(int, android.content.ComponentName);
+ method public android.app.job.JobInfo.Builder addTriggerContentUri(android.app.job.JobInfo.TriggerContentUri);
method public android.app.job.JobInfo build();
method public android.app.job.JobInfo.Builder setBackoffCriteria(long, int);
method public android.app.job.JobInfo.Builder setExtras(android.os.PersistableBundle);
@@ -6483,10 +6482,22 @@
method public android.app.job.JobInfo.Builder setRequiresDeviceIdle(boolean);
}
+ public static final class JobInfo.TriggerContentUri implements android.os.Parcelable {
+ ctor public JobInfo.TriggerContentUri(android.net.Uri, int);
+ method public int describeContents();
+ method public int getFlags();
+ method public android.net.Uri getUri();
+ method public void writeToParcel(android.os.Parcel, int);
+ field public static final android.os.Parcelable.Creator<android.app.job.JobInfo.TriggerContentUri> CREATOR;
+ field public static final int FLAG_NOTIFY_FOR_DESCENDANTS = 1; // 0x1
+ }
+
public class JobParameters implements android.os.Parcelable {
method public int describeContents();
method public android.os.PersistableBundle getExtras();
method public int getJobId();
+ method public java.lang.String[] getTriggeredContentAuthorities();
+ method public android.net.Uri[] getTriggeredContentUris();
method public boolean isOverrideDeadlineExpired();
method public void writeToParcel(android.os.Parcel, int);
field public static final android.os.Parcelable.Creator<android.app.job.JobParameters> CREATOR;
@@ -8678,7 +8689,6 @@
field public static final java.lang.String ACTION_APP_ERROR = "android.intent.action.APP_ERROR";
field public static final java.lang.String ACTION_ASSIST = "android.intent.action.ASSIST";
field public static final java.lang.String ACTION_ATTACH_DATA = "android.intent.action.ATTACH_DATA";
- field public static final java.lang.String ACTION_AVAILABILITY_CHANGED = "android.intent.action.AVAILABILITY_CHANGED";
field public static final java.lang.String ACTION_BATTERY_CHANGED = "android.intent.action.BATTERY_CHANGED";
field public static final java.lang.String ACTION_BATTERY_LOW = "android.intent.action.BATTERY_LOW";
field public static final java.lang.String ACTION_BATTERY_OKAY = "android.intent.action.BATTERY_OKAY";
@@ -13762,6 +13772,7 @@
field public static final java.lang.String STRING_TYPE_MAGNETIC_FIELD = "android.sensor.magnetic_field";
field public static final java.lang.String STRING_TYPE_MAGNETIC_FIELD_UNCALIBRATED = "android.sensor.magnetic_field_uncalibrated";
field public static final deprecated java.lang.String STRING_TYPE_ORIENTATION = "android.sensor.orientation";
+ field public static final java.lang.String STRING_TYPE_POSE_6DOF = "android.sensor.pose_6dof";
field public static final java.lang.String STRING_TYPE_PRESSURE = "android.sensor.pressure";
field public static final java.lang.String STRING_TYPE_PROXIMITY = "android.sensor.proximity";
field public static final java.lang.String STRING_TYPE_RELATIVE_HUMIDITY = "android.sensor.relative_humidity";
@@ -13785,6 +13796,7 @@
field public static final int TYPE_MAGNETIC_FIELD = 2; // 0x2
field public static final int TYPE_MAGNETIC_FIELD_UNCALIBRATED = 14; // 0xe
field public static final deprecated int TYPE_ORIENTATION = 3; // 0x3
+ field public static final int TYPE_POSE_6DOF = 28; // 0x1c
field public static final int TYPE_PRESSURE = 6; // 0x6
field public static final int TYPE_PROXIMITY = 8; // 0x8
field public static final int TYPE_RELATIVE_HUMIDITY = 12; // 0xc
@@ -23631,6 +23643,7 @@
method public static final android.net.Uri buildProgramsUriForChannel(android.net.Uri);
method public static final android.net.Uri buildProgramsUriForChannel(long, long, long);
method public static final android.net.Uri buildProgramsUriForChannel(android.net.Uri, long, long);
+ method public static final android.net.Uri buildRecordedProgramUri(long);
method public static final boolean isChannelUriForPassthroughInput(android.net.Uri);
field public static final java.lang.String AUTHORITY = "android.media.tv";
}
@@ -23771,6 +23784,40 @@
field public static final java.lang.String TRAVEL = "TRAVEL";
}
+ public static final class TvContract.RecordedPrograms implements android.media.tv.TvContract.BaseTvColumns {
+ field public static final java.lang.String COLUMN_AUDIO_LANGUAGE = "audio_language";
+ field public static final java.lang.String COLUMN_BROADCAST_GENRE = "broadcast_genre";
+ field public static final java.lang.String COLUMN_CANONICAL_GENRE = "canonical_genre";
+ field public static final java.lang.String COLUMN_CHANNEL_ID = "channel_id";
+ field public static final java.lang.String COLUMN_CONTENT_RATING = "content_rating";
+ field public static final java.lang.String COLUMN_END_TIME_UTC_MILLIS = "end_time_utc_millis";
+ field public static final java.lang.String COLUMN_EPISODE_NUMBER = "episode_number";
+ field public static final java.lang.String COLUMN_EPISODE_TITLE = "episode_title";
+ field public static final java.lang.String COLUMN_INTERNAL_PROVIDER_DATA = "internal_provider_data";
+ field public static final java.lang.String COLUMN_INTERNAL_PROVIDER_FLAG1 = "internal_provider_flag1";
+ field public static final java.lang.String COLUMN_INTERNAL_PROVIDER_FLAG2 = "internal_provider_flag2";
+ field public static final java.lang.String COLUMN_INTERNAL_PROVIDER_FLAG3 = "internal_provider_flag3";
+ field public static final java.lang.String COLUMN_INTERNAL_PROVIDER_FLAG4 = "internal_provider_flag4";
+ field public static final java.lang.String COLUMN_LONG_DESCRIPTION = "long_description";
+ field public static final java.lang.String COLUMN_POSTER_ART_URI = "poster_art_uri";
+ field public static final java.lang.String COLUMN_RECORDING_DATA_BYTES = "recording_data_bytes";
+ field public static final java.lang.String COLUMN_RECORDING_DATA_URI = "recording_data_uri";
+ field public static final java.lang.String COLUMN_RECORDING_DURATION_MILLIS = "recording_duration_millis";
+ field public static final java.lang.String COLUMN_RECORDING_EXPIRE_TIME_UTC_MILLIS = "recording_expire_time_utc_millis";
+ field public static final java.lang.String COLUMN_SEARCHABLE = "searchable";
+ field public static final java.lang.String COLUMN_SEASON_NUMBER = "season_number";
+ field public static final java.lang.String COLUMN_SHORT_DESCRIPTION = "short_description";
+ field public static final java.lang.String COLUMN_START_TIME_UTC_MILLIS = "start_time_utc_millis";
+ field public static final java.lang.String COLUMN_THUMBNAIL_URI = "thumbnail_uri";
+ field public static final java.lang.String COLUMN_TITLE = "title";
+ field public static final java.lang.String COLUMN_VERSION_NUMBER = "version_number";
+ field public static final java.lang.String COLUMN_VIDEO_HEIGHT = "video_height";
+ field public static final java.lang.String COLUMN_VIDEO_WIDTH = "video_width";
+ field public static final java.lang.String CONTENT_ITEM_TYPE = "vnd.android.cursor.item/recorded_program";
+ field public static final java.lang.String CONTENT_TYPE = "vnd.android.cursor.dir/recorded_program";
+ field public static final android.net.Uri CONTENT_URI;
+ }
+
public static final class TvContract.WatchedPrograms implements android.media.tv.TvContract.BaseTvColumns {
field public static final java.lang.String COLUMN_CHANNEL_ID = "channel_id";
field public static final java.lang.String COLUMN_DESCRIPTION = "description";
@@ -23819,6 +23866,7 @@
}
public final class TvInputInfo implements android.os.Parcelable {
+ method public boolean canRecord();
method public android.content.Intent createSettingsIntent();
method public android.content.Intent createSetupIntent();
method public static android.media.tv.TvInputInfo createTvInputInfo(android.content.Context, android.content.pm.ResolveInfo, android.hardware.hdmi.HdmiDeviceInfo, java.lang.String, java.lang.String, android.net.Uri) throws java.io.IOException, org.xmlpull.v1.XmlPullParserException;
@@ -23830,6 +23878,7 @@
method public java.lang.String getId();
method public java.lang.String getParentId();
method public android.content.pm.ServiceInfo getServiceInfo();
+ method public int getTunerCount();
method public int getType();
method public boolean isConnectedToHdmiSwitch();
method public boolean isHardwareInput();
@@ -23864,6 +23913,7 @@
method public android.media.tv.TvInputManager.Hardware acquireTvInputHardware(int, android.media.tv.TvInputManager.HardwareCallback, android.media.tv.TvInputInfo);
method public void addBlockedRating(android.media.tv.TvContentRating);
method public boolean captureFrame(java.lang.String, android.view.Surface, android.media.tv.TvStreamConfig);
+ method public void createRecordingSession(java.lang.String, android.media.tv.TvInputManager.SessionCallback, android.os.Handler);
method public void createSession(java.lang.String, android.media.tv.TvInputManager.SessionCallback, android.os.Handler);
method public java.util.List<android.media.tv.TvStreamConfig> getAvailableTvStreamConfigList(java.lang.String);
method public java.util.List<android.media.tv.TvContentRating> getBlockedRatings();
@@ -23887,6 +23937,10 @@
field public static final int INPUT_STATE_CONNECTED_STANDBY = 1; // 0x1
field public static final int INPUT_STATE_DISCONNECTED = 2; // 0x2
field public static final java.lang.String META_DATA_CONTENT_RATING_SYSTEMS = "android.media.tv.metadata.CONTENT_RATING_SYSTEMS";
+ field public static final int RECORDING_ERROR_CONNECTION_FAILED = 1; // 0x1
+ field public static final int RECORDING_ERROR_INSUFFICIENT_SPACE = 2; // 0x2
+ field public static final int RECORDING_ERROR_RESOURCE_BUSY = 3; // 0x3
+ field public static final int RECORDING_ERROR_UNKNOWN = 0; // 0x0
field public static final long TIME_SHIFT_INVALID_TIME = -9223372036854775808L; // 0x8000000000000000L
field public static final int TIME_SHIFT_STATUS_AVAILABLE = 3; // 0x3
field public static final int TIME_SHIFT_STATUS_UNAVAILABLE = 2; // 0x2
@@ -23951,16 +24005,19 @@
method public void onInputRemoved(java.lang.String);
method public void onInputStateChanged(java.lang.String, int);
method public void onInputUpdated(java.lang.String);
+ method public void onTvInputInfoChanged(java.lang.String, android.media.tv.TvInputInfo);
}
public abstract class TvInputService extends android.app.Service {
ctor public TvInputService();
method public final android.os.IBinder onBind(android.content.Intent);
+ method public abstract android.media.tv.TvInputService.RecordingSession onCreateRecordingSession(java.lang.String);
method public abstract android.media.tv.TvInputService.Session onCreateSession(java.lang.String);
method public android.media.tv.TvInputInfo onHardwareAdded(android.media.tv.TvInputHardwareInfo);
method public java.lang.String onHardwareRemoved(android.media.tv.TvInputHardwareInfo);
method public android.media.tv.TvInputInfo onHdmiDeviceAdded(android.hardware.hdmi.HdmiDeviceInfo);
method public java.lang.String onHdmiDeviceRemoved(android.hardware.hdmi.HdmiDeviceInfo);
+ method public final void setTvInputInfo(java.lang.String, android.media.tv.TvInputInfo);
field public static final java.lang.String SERVICE_INTERFACE = "android.media.tv.TvInputService";
field public static final java.lang.String SERVICE_META_DATA = "android.media.tv.input";
}
@@ -23973,6 +24030,21 @@
method public final boolean onSetSurface(android.view.Surface);
}
+ public static abstract class TvInputService.RecordingSession {
+ ctor public TvInputService.RecordingSession(android.content.Context);
+ method public void notifyConnected();
+ method public void notifyError(int);
+ method public void notifyRecordingStarted();
+ method public void notifyRecordingStopped(android.net.Uri);
+ method public void notifySessionEvent(java.lang.String, android.os.Bundle);
+ method public void onAppPrivateCommand(java.lang.String, android.os.Bundle);
+ method public abstract void onConnect(android.net.Uri);
+ method public void onConnect(android.net.Uri, android.os.Bundle);
+ method public abstract void onDisconnect();
+ method public abstract void onStartRecording();
+ method public abstract void onStopRecording();
+ }
+
public static abstract class TvInputService.Session implements android.view.KeyEvent.Callback {
ctor public TvInputService.Session(android.content.Context);
method public void layoutSurface(int, int, int, int);
@@ -24003,6 +24075,7 @@
method public long onTimeShiftGetCurrentPosition();
method public long onTimeShiftGetStartPosition();
method public void onTimeShiftPause();
+ method public void onTimeShiftPlay(android.net.Uri);
method public void onTimeShiftResume();
method public void onTimeShiftSeekTo(long);
method public void onTimeShiftSetPlaybackParams(android.media.PlaybackParams);
@@ -24014,6 +24087,26 @@
method public void setOverlayViewEnabled(boolean);
}
+ public class TvRecordingClient {
+ ctor public TvRecordingClient(android.content.Context, java.lang.String, android.media.tv.TvRecordingClient.RecordingCallback, android.os.Handler);
+ method public void connect(java.lang.String, android.net.Uri);
+ method public void connect(java.lang.String, android.net.Uri, android.os.Bundle);
+ method public void disconnect();
+ method public void sendAppPrivateCommand(java.lang.String, android.os.Bundle);
+ method public void startRecording();
+ method public void stopRecording();
+ }
+
+ public class TvRecordingClient.RecordingCallback {
+ ctor public TvRecordingClient.RecordingCallback();
+ method public void onConnected();
+ method public void onDisconnected();
+ method public void onError(int);
+ method public void onEvent(java.lang.String, java.lang.String, android.os.Bundle);
+ method public void onRecordingStarted();
+ method public void onRecordingStopped(android.net.Uri);
+ }
+
public class TvStreamConfig implements android.os.Parcelable {
method public int describeContents();
method public int getFlags();
@@ -24096,6 +24189,7 @@
method public void setZOrderMediaOverlay(boolean);
method public void setZOrderOnTop(boolean);
method public void timeShiftPause();
+ method public void timeShiftPlay(java.lang.String, android.net.Uri);
method public void timeShiftResume();
method public void timeShiftSeekTo(long);
method public void timeShiftSetPlaybackParams(android.media.PlaybackParams);
@@ -24451,9 +24545,6 @@
method public abstract void onNetworkActive();
}
- public static abstract class ConnectivityManager.RestrictBackgroundStatus implements java.lang.annotation.Annotation {
- }
-
public class Credentials {
ctor public Credentials(int, int, int);
method public int getGid();
@@ -25955,6 +26046,7 @@
field public static final int REASON_UNSPECIFIED = -1; // 0xffffffff
field public static final deprecated int REPORT_EVENT_AFTER_BUFFER_FULL = 0; // 0x0
field public static final int REPORT_EVENT_AFTER_EACH_SCAN = 1; // 0x1
+ field public static final int REPORT_EVENT_CONTEXT_HUB = 8; // 0x8
field public static final int REPORT_EVENT_FULL_SCAN_RESULT = 2; // 0x2
field public static final int REPORT_EVENT_NO_BATCH = 4; // 0x4
field public static final int WIFI_BAND_24_GHZ = 1; // 0x1
@@ -35044,6 +35136,7 @@
method public void getVarV(int, android.renderscript.FieldPacker);
method protected void invoke(int);
method protected void invoke(int, android.renderscript.FieldPacker);
+ method protected void reduce(int, android.renderscript.Allocation[], android.renderscript.Allocation, android.renderscript.Script.LaunchOptions);
method public void setTimeZone(java.lang.String);
method public void setVar(int, float);
method public void setVar(int, double);
@@ -36662,6 +36755,8 @@
public abstract class UtteranceProgressListener {
ctor public UtteranceProgressListener();
+ method public void onAudioAvailable(java.lang.String, byte[]);
+ method public void onBeginSynthesis(java.lang.String, int, int, int);
method public abstract void onDone(java.lang.String);
method public abstract deprecated void onError(java.lang.String);
method public void onError(java.lang.String, int);
@@ -38232,6 +38327,8 @@
public final class CellIdentityGsm implements android.os.Parcelable {
method public int describeContents();
+ method public int getArfcn();
+ method public int getBsic();
method public int getCid();
method public int getLac();
method public int getMcc();
@@ -38244,6 +38341,7 @@
public final class CellIdentityLte implements android.os.Parcelable {
method public int describeContents();
method public int getCi();
+ method public int getEarfcn();
method public int getMcc();
method public int getMnc();
method public int getPci();
@@ -38259,6 +38357,7 @@
method public int getMcc();
method public int getMnc();
method public int getPsc();
+ method public int getUarfcn();
method public void writeToParcel(android.os.Parcel, int);
field public static final android.os.Parcelable.Creator<android.telephony.CellIdentityWcdma> CREATOR;
}
diff --git a/api/test-current.txt b/api/test-current.txt
index f096d56..1a9b469 100644
--- a/api/test-current.txt
+++ b/api/test-current.txt
@@ -3676,9 +3676,6 @@
method public void startActivity(android.content.Context, android.content.Intent, android.os.Bundle);
}
- public static abstract class ActivityManager.BugreportMode implements java.lang.annotation.Annotation {
- }
-
public static class ActivityManager.MemoryInfo implements android.os.Parcelable {
ctor public ActivityManager.MemoryInfo();
method public int describeContents();
@@ -5785,9 +5782,6 @@
field public static final java.lang.String EXTRA_LOCK_TASK_PACKAGE = "android.app.extra.LOCK_TASK_PACKAGE";
}
- public static abstract class DeviceAdminReceiver.BugreportFailureCode implements java.lang.annotation.Annotation {
- }
-
public class DevicePolicyManager {
method public void addCrossProfileIntentFilter(android.content.ComponentName, android.content.IntentFilter, int);
method public boolean addCrossProfileWidgetProvider(android.content.ComponentName, java.lang.String);
@@ -5798,6 +5792,7 @@
method public void clearPackagePersistentPreferredActivities(android.content.ComponentName, java.lang.String);
method public void clearUserRestriction(android.content.ComponentName, java.lang.String);
method public deprecated android.os.UserHandle createAndInitializeUser(android.content.ComponentName, java.lang.String, java.lang.String, android.content.ComponentName, android.os.Bundle);
+ method public android.os.UserHandle createAndManageUser(android.content.ComponentName, java.lang.String, android.content.ComponentName, android.os.PersistableBundle, int);
method public deprecated android.os.UserHandle createUser(android.content.ComponentName, java.lang.String);
method public void enableSystemApp(android.content.ComponentName, java.lang.String);
method public int enableSystemApp(android.content.ComponentName, android.content.Intent);
@@ -5990,6 +5985,7 @@
field public static final int PERMISSION_POLICY_PROMPT = 0; // 0x0
field public static final int RESET_PASSWORD_DO_NOT_ASK_CREDENTIALS_ON_BOOT = 2; // 0x2
field public static final int RESET_PASSWORD_REQUIRE_ENTRY = 1; // 0x1
+ field public static final int SKIP_SETUP_WIZARD = 1; // 0x1
field public static final int WIPE_EXTERNAL_STORAGE = 1; // 0x1
field public static final int WIPE_RESET_PROTECTION_DATA = 2; // 0x2
}
@@ -6199,6 +6195,7 @@
method public long getMinLatencyMillis();
method public int getNetworkType();
method public android.content.ComponentName getService();
+ method public android.app.job.JobInfo.TriggerContentUri[] getTriggerContentUris();
method public boolean isPeriodic();
method public boolean isPersisted();
method public boolean isRequireCharging();
@@ -6218,6 +6215,7 @@
public static final class JobInfo.Builder {
ctor public JobInfo.Builder(int, android.content.ComponentName);
+ method public android.app.job.JobInfo.Builder addTriggerContentUri(android.app.job.JobInfo.TriggerContentUri);
method public android.app.job.JobInfo build();
method public android.app.job.JobInfo.Builder setBackoffCriteria(long, int);
method public android.app.job.JobInfo.Builder setExtras(android.os.PersistableBundle);
@@ -6231,10 +6229,22 @@
method public android.app.job.JobInfo.Builder setRequiresDeviceIdle(boolean);
}
+ public static final class JobInfo.TriggerContentUri implements android.os.Parcelable {
+ ctor public JobInfo.TriggerContentUri(android.net.Uri, int);
+ method public int describeContents();
+ method public int getFlags();
+ method public android.net.Uri getUri();
+ method public void writeToParcel(android.os.Parcel, int);
+ field public static final android.os.Parcelable.Creator<android.app.job.JobInfo.TriggerContentUri> CREATOR;
+ field public static final int FLAG_NOTIFY_FOR_DESCENDANTS = 1; // 0x1
+ }
+
public class JobParameters implements android.os.Parcelable {
method public int describeContents();
method public android.os.PersistableBundle getExtras();
method public int getJobId();
+ method public java.lang.String[] getTriggeredContentAuthorities();
+ method public android.net.Uri[] getTriggeredContentUris();
method public boolean isOverrideDeadlineExpired();
method public void writeToParcel(android.os.Parcel, int);
field public static final android.os.Parcelable.Creator<android.app.job.JobParameters> CREATOR;
@@ -8384,7 +8394,6 @@
field public static final java.lang.String ACTION_APP_ERROR = "android.intent.action.APP_ERROR";
field public static final java.lang.String ACTION_ASSIST = "android.intent.action.ASSIST";
field public static final java.lang.String ACTION_ATTACH_DATA = "android.intent.action.ATTACH_DATA";
- field public static final java.lang.String ACTION_AVAILABILITY_CHANGED = "android.intent.action.AVAILABILITY_CHANGED";
field public static final java.lang.String ACTION_BATTERY_CHANGED = "android.intent.action.BATTERY_CHANGED";
field public static final java.lang.String ACTION_BATTERY_LOW = "android.intent.action.BATTERY_LOW";
field public static final java.lang.String ACTION_BATTERY_OKAY = "android.intent.action.BATTERY_OKAY";
@@ -13374,6 +13383,7 @@
field public static final java.lang.String STRING_TYPE_MAGNETIC_FIELD = "android.sensor.magnetic_field";
field public static final java.lang.String STRING_TYPE_MAGNETIC_FIELD_UNCALIBRATED = "android.sensor.magnetic_field_uncalibrated";
field public static final deprecated java.lang.String STRING_TYPE_ORIENTATION = "android.sensor.orientation";
+ field public static final java.lang.String STRING_TYPE_POSE_6DOF = "android.sensor.pose_6dof";
field public static final java.lang.String STRING_TYPE_PRESSURE = "android.sensor.pressure";
field public static final java.lang.String STRING_TYPE_PROXIMITY = "android.sensor.proximity";
field public static final java.lang.String STRING_TYPE_RELATIVE_HUMIDITY = "android.sensor.relative_humidity";
@@ -13396,6 +13406,7 @@
field public static final int TYPE_MAGNETIC_FIELD = 2; // 0x2
field public static final int TYPE_MAGNETIC_FIELD_UNCALIBRATED = 14; // 0xe
field public static final deprecated int TYPE_ORIENTATION = 3; // 0x3
+ field public static final int TYPE_POSE_6DOF = 28; // 0x1c
field public static final int TYPE_PRESSURE = 6; // 0x6
field public static final int TYPE_PROXIMITY = 8; // 0x8
field public static final int TYPE_RELATIVE_HUMIDITY = 12; // 0xc
@@ -22213,6 +22224,7 @@
method public static final android.net.Uri buildProgramsUriForChannel(android.net.Uri);
method public static final android.net.Uri buildProgramsUriForChannel(long, long, long);
method public static final android.net.Uri buildProgramsUriForChannel(android.net.Uri, long, long);
+ method public static final android.net.Uri buildRecordedProgramUri(long);
field public static final java.lang.String AUTHORITY = "android.media.tv";
}
@@ -22349,13 +22361,49 @@
field public static final java.lang.String TRAVEL = "TRAVEL";
}
+ public static final class TvContract.RecordedPrograms implements android.media.tv.TvContract.BaseTvColumns {
+ field public static final java.lang.String COLUMN_AUDIO_LANGUAGE = "audio_language";
+ field public static final java.lang.String COLUMN_BROADCAST_GENRE = "broadcast_genre";
+ field public static final java.lang.String COLUMN_CANONICAL_GENRE = "canonical_genre";
+ field public static final java.lang.String COLUMN_CHANNEL_ID = "channel_id";
+ field public static final java.lang.String COLUMN_CONTENT_RATING = "content_rating";
+ field public static final java.lang.String COLUMN_END_TIME_UTC_MILLIS = "end_time_utc_millis";
+ field public static final java.lang.String COLUMN_EPISODE_NUMBER = "episode_number";
+ field public static final java.lang.String COLUMN_EPISODE_TITLE = "episode_title";
+ field public static final java.lang.String COLUMN_INTERNAL_PROVIDER_DATA = "internal_provider_data";
+ field public static final java.lang.String COLUMN_INTERNAL_PROVIDER_FLAG1 = "internal_provider_flag1";
+ field public static final java.lang.String COLUMN_INTERNAL_PROVIDER_FLAG2 = "internal_provider_flag2";
+ field public static final java.lang.String COLUMN_INTERNAL_PROVIDER_FLAG3 = "internal_provider_flag3";
+ field public static final java.lang.String COLUMN_INTERNAL_PROVIDER_FLAG4 = "internal_provider_flag4";
+ field public static final java.lang.String COLUMN_LONG_DESCRIPTION = "long_description";
+ field public static final java.lang.String COLUMN_POSTER_ART_URI = "poster_art_uri";
+ field public static final java.lang.String COLUMN_RECORDING_DATA_BYTES = "recording_data_bytes";
+ field public static final java.lang.String COLUMN_RECORDING_DATA_URI = "recording_data_uri";
+ field public static final java.lang.String COLUMN_RECORDING_DURATION_MILLIS = "recording_duration_millis";
+ field public static final java.lang.String COLUMN_RECORDING_EXPIRE_TIME_UTC_MILLIS = "recording_expire_time_utc_millis";
+ field public static final java.lang.String COLUMN_SEARCHABLE = "searchable";
+ field public static final java.lang.String COLUMN_SEASON_NUMBER = "season_number";
+ field public static final java.lang.String COLUMN_SHORT_DESCRIPTION = "short_description";
+ field public static final java.lang.String COLUMN_START_TIME_UTC_MILLIS = "start_time_utc_millis";
+ field public static final java.lang.String COLUMN_THUMBNAIL_URI = "thumbnail_uri";
+ field public static final java.lang.String COLUMN_TITLE = "title";
+ field public static final java.lang.String COLUMN_VERSION_NUMBER = "version_number";
+ field public static final java.lang.String COLUMN_VIDEO_HEIGHT = "video_height";
+ field public static final java.lang.String COLUMN_VIDEO_WIDTH = "video_width";
+ field public static final java.lang.String CONTENT_ITEM_TYPE = "vnd.android.cursor.item/recorded_program";
+ field public static final java.lang.String CONTENT_TYPE = "vnd.android.cursor.dir/recorded_program";
+ field public static final android.net.Uri CONTENT_URI;
+ }
+
public final class TvInputInfo implements android.os.Parcelable {
+ method public boolean canRecord();
method public android.content.Intent createSettingsIntent();
method public android.content.Intent createSetupIntent();
method public int describeContents();
method public java.lang.String getId();
method public java.lang.String getParentId();
method public android.content.pm.ServiceInfo getServiceInfo();
+ method public int getTunerCount();
method public int getType();
method public boolean isPassthroughInput();
method public android.graphics.drawable.Drawable loadIcon(android.content.Context);
@@ -22390,6 +22438,10 @@
field public static final int INPUT_STATE_CONNECTED_STANDBY = 1; // 0x1
field public static final int INPUT_STATE_DISCONNECTED = 2; // 0x2
field public static final java.lang.String META_DATA_CONTENT_RATING_SYSTEMS = "android.media.tv.metadata.CONTENT_RATING_SYSTEMS";
+ field public static final int RECORDING_ERROR_CONNECTION_FAILED = 1; // 0x1
+ field public static final int RECORDING_ERROR_INSUFFICIENT_SPACE = 2; // 0x2
+ field public static final int RECORDING_ERROR_RESOURCE_BUSY = 3; // 0x3
+ field public static final int RECORDING_ERROR_UNKNOWN = 0; // 0x0
field public static final long TIME_SHIFT_INVALID_TIME = -9223372036854775808L; // 0x8000000000000000L
field public static final int TIME_SHIFT_STATUS_AVAILABLE = 3; // 0x3
field public static final int TIME_SHIFT_STATUS_UNAVAILABLE = 2; // 0x2
@@ -22407,12 +22459,15 @@
method public void onInputAdded(java.lang.String);
method public void onInputRemoved(java.lang.String);
method public void onInputStateChanged(java.lang.String, int);
+ method public void onTvInputInfoChanged(java.lang.String, android.media.tv.TvInputInfo);
}
public abstract class TvInputService extends android.app.Service {
ctor public TvInputService();
method public final android.os.IBinder onBind(android.content.Intent);
+ method public abstract android.media.tv.TvInputService.RecordingSession onCreateRecordingSession(java.lang.String);
method public abstract android.media.tv.TvInputService.Session onCreateSession(java.lang.String);
+ method public final void setTvInputInfo(java.lang.String, android.media.tv.TvInputInfo);
field public static final java.lang.String SERVICE_INTERFACE = "android.media.tv.TvInputService";
field public static final java.lang.String SERVICE_META_DATA = "android.media.tv.input";
}
@@ -22425,6 +22480,18 @@
method public final boolean onSetSurface(android.view.Surface);
}
+ public static abstract class TvInputService.RecordingSession {
+ ctor public TvInputService.RecordingSession(android.content.Context);
+ method public void notifyConnected();
+ method public void notifyError(int);
+ method public void notifyRecordingStarted();
+ method public void notifyRecordingStopped(android.net.Uri);
+ method public abstract void onConnect(android.net.Uri);
+ method public abstract void onDisconnect();
+ method public abstract void onStartRecording();
+ method public abstract void onStopRecording();
+ }
+
public static abstract class TvInputService.Session implements android.view.KeyEvent.Callback {
ctor public TvInputService.Session(android.content.Context);
method public void layoutSurface(int, int, int, int);
@@ -22452,6 +22519,7 @@
method public long onTimeShiftGetCurrentPosition();
method public long onTimeShiftGetStartPosition();
method public void onTimeShiftPause();
+ method public void onTimeShiftPlay(android.net.Uri);
method public void onTimeShiftResume();
method public void onTimeShiftSeekTo(long);
method public void onTimeShiftSetPlaybackParams(android.media.PlaybackParams);
@@ -22462,6 +22530,23 @@
method public void setOverlayViewEnabled(boolean);
}
+ public class TvRecordingClient {
+ ctor public TvRecordingClient(android.content.Context, java.lang.String, android.media.tv.TvRecordingClient.RecordingCallback, android.os.Handler);
+ method public void connect(java.lang.String, android.net.Uri);
+ method public void disconnect();
+ method public void startRecording();
+ method public void stopRecording();
+ }
+
+ public class TvRecordingClient.RecordingCallback {
+ ctor public TvRecordingClient.RecordingCallback();
+ method public void onConnected();
+ method public void onDisconnected();
+ method public void onError(int);
+ method public void onRecordingStarted();
+ method public void onRecordingStopped(android.net.Uri);
+ }
+
public final class TvTrackInfo implements android.os.Parcelable {
method public int describeContents();
method public final int getAudioChannelCount();
@@ -22513,6 +22598,7 @@
method public void setStreamVolume(float);
method public void setTimeShiftPositionCallback(android.media.tv.TvView.TimeShiftPositionCallback);
method public void timeShiftPause();
+ method public void timeShiftPlay(java.lang.String, android.net.Uri);
method public void timeShiftResume();
method public void timeShiftSeekTo(long);
method public void timeShiftSetPlaybackParams(android.media.PlaybackParams);
@@ -22864,9 +22950,6 @@
method public abstract void onNetworkActive();
}
- public static abstract class ConnectivityManager.RestrictBackgroundStatus implements java.lang.annotation.Annotation {
- }
-
public class Credentials {
ctor public Credentials(int, int, int);
method public int getGid();
@@ -32863,6 +32946,7 @@
method public void getVarV(int, android.renderscript.FieldPacker);
method protected void invoke(int);
method protected void invoke(int, android.renderscript.FieldPacker);
+ method protected void reduce(int, android.renderscript.Allocation[], android.renderscript.Allocation, android.renderscript.Script.LaunchOptions);
method public void setTimeZone(java.lang.String);
method public void setVar(int, float);
method public void setVar(int, double);
@@ -34426,6 +34510,8 @@
public abstract class UtteranceProgressListener {
ctor public UtteranceProgressListener();
+ method public void onAudioAvailable(java.lang.String, byte[]);
+ method public void onBeginSynthesis(java.lang.String, int, int, int);
method public abstract void onDone(java.lang.String);
method public abstract deprecated void onError(java.lang.String);
method public void onError(java.lang.String, int);
@@ -35879,6 +35965,8 @@
public final class CellIdentityGsm implements android.os.Parcelable {
method public int describeContents();
+ method public int getArfcn();
+ method public int getBsic();
method public int getCid();
method public int getLac();
method public int getMcc();
@@ -35891,6 +35979,7 @@
public final class CellIdentityLte implements android.os.Parcelable {
method public int describeContents();
method public int getCi();
+ method public int getEarfcn();
method public int getMcc();
method public int getMnc();
method public int getPci();
@@ -35906,6 +35995,7 @@
method public int getMcc();
method public int getMnc();
method public int getPsc();
+ method public int getUarfcn();
method public void writeToParcel(android.os.Parcel, int);
field public static final android.os.Parcelable.Creator<android.telephony.CellIdentityWcdma> CREATOR;
}
diff --git a/core/java/android/accounts/AccountManager.java b/core/java/android/accounts/AccountManager.java
index 259f0da..1d9e3bb 100644
--- a/core/java/android/accounts/AccountManager.java
+++ b/core/java/android/accounts/AccountManager.java
@@ -592,6 +592,7 @@
if (accountType == null) throw new IllegalArgumentException("accountType is null");
if (authTokenType == null) throw new IllegalArgumentException("authTokenType is null");
return new Future2Task<String>(handler, callback) {
+ @Override
public void doWork() throws RemoteException {
mService.getAuthTokenLabel(mResponse, accountType, authTokenType);
}
@@ -637,9 +638,11 @@
if (account == null) throw new IllegalArgumentException("account is null");
if (features == null) throw new IllegalArgumentException("features is null");
return new Future2Task<Boolean>(handler, callback) {
+ @Override
public void doWork() throws RemoteException {
mService.hasFeatures(mResponse, account, features, mContext.getOpPackageName());
}
+ @Override
public Boolean bundleToResult(Bundle bundle) throws AuthenticatorException {
if (!bundle.containsKey(KEY_BOOLEAN_RESULT)) {
throw new AuthenticatorException("no result in response");
@@ -689,10 +692,12 @@
AccountManagerCallback<Account[]> callback, Handler handler) {
if (type == null) throw new IllegalArgumentException("type is null");
return new Future2Task<Account[]>(handler, callback) {
+ @Override
public void doWork() throws RemoteException {
mService.getAccountsByFeatures(mResponse, type, features,
mContext.getOpPackageName());
}
+ @Override
public Account[] bundleToResult(Bundle bundle) throws AuthenticatorException {
if (!bundle.containsKey(KEY_ACCOUNTS)) {
throw new AuthenticatorException("no result in response");
@@ -971,6 +976,7 @@
if (userHandle == null)
throw new IllegalArgumentException("userHandle is null");
return new AmsTask(activity, handler, callback) {
+ @Override
public void doWork() throws RemoteException {
mService.removeAccountAsUser(mResponse, account, activity != null,
userHandle.getIdentifier());
@@ -1051,7 +1057,7 @@
* is needed for those platforms. See docs for this function in API level 22.
*
* @param account The account for which an auth token is to be fetched. Cannot be {@code null}.
- * @param authTokenType The type of auth token to fetch. Cannot be {@code null}.
+ * @param authTokenType The type of auth token to fetch. Cannot be {@code null}.
* @return The cached auth token for this account and type, or null if
* no auth token is cached or the account does not exist.
* @see #getAuthToken
@@ -1245,7 +1251,7 @@
* tokens to access Gmail and Google Calendar for the same account.
*
* <p><b>NOTE:</b> If targeting your app to work on API level 22 and before,
- * USE_CREDENTIALS permission is needed for those platforms. See docs for
+ * USE_CREDENTIALS permission is needed for those platforms. See docs for
* this function in API level 22.
*
* <p>This method may be called from any thread, but the returned
@@ -1295,6 +1301,7 @@
}
optionsIn.putString(KEY_ANDROID_PACKAGE_NAME, mContext.getPackageName());
return new AmsTask(activity, handler, callback) {
+ @Override
public void doWork() throws RemoteException {
mService.getAuthToken(mResponse, account, authTokenType,
false /* notifyOnAuthFailure */, true /* expectActivityLaunch */,
@@ -1412,7 +1419,7 @@
* {@link AccountManagerFuture} must not be used on the main thread.
*
* <p><b>NOTE:</b> If targeting your app to work on API level 22 and before,
- * USE_CREDENTIALS permission is needed for those platforms. See docs for
+ * USE_CREDENTIALS permission is needed for those platforms. See docs for
* this function in API level 22.
*
* @param account The account to fetch an auth token for
@@ -1463,6 +1470,7 @@
}
optionsIn.putString(KEY_ANDROID_PACKAGE_NAME, mContext.getPackageName());
return new AmsTask(null, handler, callback) {
+ @Override
public void doWork() throws RemoteException {
mService.getAuthToken(mResponse, account, authTokenType,
notifyAuthFailure, false /* expectActivityLaunch */, optionsIn);
@@ -1478,7 +1486,7 @@
*
* <p>This method may be called from any thread, but the returned
* {@link AccountManagerFuture} must not be used on the main thread.
- *
+ *
* <p><b>NOTE:</b> If targeting your app to work on API level 22 and before,
* MANAGE_ACCOUNTS permission is needed for those platforms. See docs for
* this function in API level 22.
@@ -1532,6 +1540,7 @@
optionsIn.putString(KEY_ANDROID_PACKAGE_NAME, mContext.getPackageName());
return new AmsTask(activity, handler, callback) {
+ @Override
public void doWork() throws RemoteException {
mService.addAccount(mResponse, accountType, authTokenType,
requiredFeatures, activity != null, optionsIn);
@@ -1556,6 +1565,7 @@
optionsIn.putString(KEY_ANDROID_PACKAGE_NAME, mContext.getPackageName());
return new AmsTask(activity, handler, callback) {
+ @Override
public void doWork() throws RemoteException {
mService.addAccountAsUser(mResponse, accountType, authTokenType,
requiredFeatures, activity != null, optionsIn, userHandle.getIdentifier());
@@ -1732,6 +1742,7 @@
if (account == null) throw new IllegalArgumentException("account is null");
final int userId = userHandle.getIdentifier();
return new AmsTask(activity, handler, callback) {
+ @Override
public void doWork() throws RemoteException {
mService.confirmCredentialsAsUser(mResponse, account, options, activity != null,
userId);
@@ -1794,6 +1805,7 @@
final Handler handler) {
if (account == null) throw new IllegalArgumentException("account is null");
return new AmsTask(activity, handler, callback) {
+ @Override
public void doWork() throws RemoteException {
mService.updateCredentials(mResponse, account, authTokenType, activity != null,
options);
@@ -1847,6 +1859,7 @@
final Handler handler) {
if (accountType == null) throw new IllegalArgumentException("accountType is null");
return new AmsTask(activity, handler, callback) {
+ @Override
public void doWork() throws RemoteException {
mService.editProperties(mResponse, accountType, activity != null);
}
@@ -1886,6 +1899,7 @@
final AccountManagerFuture<Bundle> future) {
handler = handler == null ? mMainHandler : handler;
handler.post(new Runnable() {
+ @Override
public void run() {
callback.run(future);
}
@@ -1900,6 +1914,7 @@
System.arraycopy(accounts, 0, accountsCopy, 0, accountsCopy.length);
handler = (handler == null) ? mMainHandler : handler;
handler.post(new Runnable() {
+ @Override
public void run() {
try {
listener.onAccountsUpdated(accountsCopy);
@@ -1919,6 +1934,7 @@
final Activity mActivity;
public AmsTask(Activity activity, Handler handler, AccountManagerCallback<Bundle> callback) {
super(new Callable<Bundle>() {
+ @Override
public Bundle call() throws Exception {
throw new IllegalStateException("this should never be called");
}
@@ -1939,6 +1955,7 @@
return this;
}
+ @Override
protected void set(Bundle bundle) {
// TODO: somehow a null is being set as the result of the Future. Log this
// case to help debug where this is occurring. When this bug is fixed this
@@ -1989,16 +2006,19 @@
throw new OperationCanceledException();
}
+ @Override
public Bundle getResult()
throws OperationCanceledException, IOException, AuthenticatorException {
return internalGetResult(null, null);
}
+ @Override
public Bundle getResult(long timeout, TimeUnit unit)
throws OperationCanceledException, IOException, AuthenticatorException {
return internalGetResult(timeout, unit);
}
+ @Override
protected void done() {
if (mCallback != null) {
postToHandler(mHandler, mCallback, this);
@@ -2007,6 +2027,7 @@
/** Handles the responses from the AccountManager */
private class Response extends IAccountManagerResponse.Stub {
+ @Override
public void onResult(Bundle bundle) {
Intent intent = bundle.getParcelable(KEY_INTENT);
if (intent != null && mActivity != null) {
@@ -2026,6 +2047,7 @@
}
}
+ @Override
public void onError(int code, String message) {
if (code == ERROR_CODE_CANCELED || code == ERROR_CODE_USER_RESTRICTED
|| code == ERROR_CODE_MANAGEMENT_DISABLED_FOR_ACCOUNT_TYPE) {
@@ -2046,6 +2068,7 @@
public BaseFutureTask(Handler handler) {
super(new Callable<T>() {
+ @Override
public T call() throws Exception {
throw new IllegalStateException("this should never be called");
}
@@ -2072,6 +2095,7 @@
}
protected class Response extends IAccountManagerResponse.Stub {
+ @Override
public void onResult(Bundle bundle) {
try {
T result = bundleToResult(bundle);
@@ -2088,6 +2112,7 @@
onError(ERROR_CODE_INVALID_RESPONSE, "no result in response");
}
+ @Override
public void onError(int code, String message) {
if (code == ERROR_CODE_CANCELED || code == ERROR_CODE_USER_RESTRICTED
|| code == ERROR_CODE_MANAGEMENT_DISABLED_FOR_ACCOUNT_TYPE) {
@@ -2109,9 +2134,11 @@
mCallback = callback;
}
+ @Override
protected void done() {
if (mCallback != null) {
postRunnableToHandler(new Runnable() {
+ @Override
public void run() {
mCallback.run(Future2Task.this);
}
@@ -2162,11 +2189,13 @@
throw new OperationCanceledException();
}
+ @Override
public T getResult()
throws OperationCanceledException, IOException, AuthenticatorException {
return internalGetResult(null, null);
}
+ @Override
public T getResult(long timeout, TimeUnit unit)
throws OperationCanceledException, IOException, AuthenticatorException {
return internalGetResult(timeout, unit);
@@ -2218,9 +2247,11 @@
final AccountManagerCallback<Bundle> mMyCallback;
private volatile int mNumAccounts = 0;
+ @Override
public void doWork() throws RemoteException {
getAccountsByTypeAndFeatures(mAccountType, mFeatures,
new AccountManagerCallback<Account[]>() {
+ @Override
public void run(AccountManagerFuture<Account[]> future) {
Account[] accounts;
try {
@@ -2271,6 +2302,7 @@
if (mActivity != null) {
IAccountManagerResponse chooseResponse =
new IAccountManagerResponse.Stub() {
+ @Override
public void onResult(Bundle value) throws RemoteException {
Account account = new Account(
value.getString(KEY_ACCOUNT_NAME),
@@ -2279,6 +2311,7 @@
mActivity, mMyCallback, mHandler);
}
+ @Override
public void onError(int errorCode, String errorMessage)
throws RemoteException {
mResponse.onError(errorCode, errorMessage);
@@ -2311,6 +2344,7 @@
}}, mHandler);
}
+ @Override
public void run(AccountManagerFuture<Bundle> future) {
try {
final Bundle result = future.getResult();
@@ -2531,6 +2565,7 @@
* in mAccountsUpdatedListeners.
*/
private final BroadcastReceiver mAccountsChangedBroadcastReceiver = new BroadcastReceiver() {
+ @Override
public void onReceive(final Context context, final Intent intent) {
final Account[] accounts = getAccounts();
// send the result to the listeners
@@ -2851,6 +2886,25 @@
final Activity activity,
AccountManagerCallback<Bundle> callback,
Handler handler) {
+ return finishSessionAsUser(
+ sessionBundle,
+ activity,
+ Process.myUserHandle(),
+ callback,
+ handler);
+ }
+
+ /**
+ * @see #finishSession
+ * @hide
+ */
+ @SystemApi
+ public AccountManagerFuture<Bundle> finishSessionAsUser(
+ final Bundle sessionBundle,
+ final Activity activity,
+ final UserHandle userHandle,
+ AccountManagerCallback<Bundle> callback,
+ Handler handler) {
if (sessionBundle == null) {
throw new IllegalArgumentException("sessionBundle is null");
}
@@ -2862,7 +2916,12 @@
return new AmsTask(activity, handler, callback) {
@Override
public void doWork() throws RemoteException {
- mService.finishSession(mResponse, sessionBundle, activity != null, appInfo);
+ mService.finishSessionAsUser(
+ mResponse,
+ sessionBundle,
+ activity != null,
+ appInfo,
+ userHandle.getIdentifier());
}
}.start();
}
@@ -2898,12 +2957,14 @@
}
return new Future2Task<Boolean>(handler, callback) {
+ @Override
public void doWork() throws RemoteException {
mService.isCredentialsUpdateSuggested(
mResponse,
account,
statusToken);
}
+ @Override
public Boolean bundleToResult(Bundle bundle) throws AuthenticatorException {
if (!bundle.containsKey(KEY_BOOLEAN_RESULT)) {
throw new AuthenticatorException("no result in response");
diff --git a/core/java/android/accounts/IAccountManager.aidl b/core/java/android/accounts/IAccountManager.aidl
index 39dedf4..7199288 100644
--- a/core/java/android/accounts/IAccountManager.aidl
+++ b/core/java/android/accounts/IAccountManager.aidl
@@ -92,9 +92,9 @@
void startUpdateCredentialsSession(in IAccountManagerResponse response, in Account account,
String authTokenType, boolean expectActivityLaunch, in Bundle options);
- /* Finish session started by startAddAccountSession(...) or startUpdateCredentialsSession(...) */
- void finishSession(in IAccountManagerResponse response, in Bundle sessionBundle,
- boolean expectActivityLaunch, in Bundle appInfo);
+ /* Finish session started by startAddAccountSession(...) or startUpdateCredentialsSession(...) for user */
+ void finishSessionAsUser(in IAccountManagerResponse response, in Bundle sessionBundle,
+ boolean expectActivityLaunch, in Bundle appInfo, int userId);
/* Check if an account exists on any user on the device. */
boolean someUserHasAccount(in Account account);
diff --git a/core/java/android/app/ActivityManager.java b/core/java/android/app/ActivityManager.java
index 2dc4fb9..420bf31 100644
--- a/core/java/android/app/ActivityManager.java
+++ b/core/java/android/app/ActivityManager.java
@@ -85,16 +85,16 @@
private final Context mContext;
private final Handler mHandler;
+ /**
+ * Defines acceptable types of bugreports.
+ * @hide
+ */
@Retention(RetentionPolicy.SOURCE)
@IntDef({
BUGREPORT_OPTION_FULL,
BUGREPORT_OPTION_INTERACTIVE,
BUGREPORT_OPTION_REMOTE
})
- /**
- * Defines acceptable types of bugreports.
- * @hide
- */
public @interface BugreportMode {}
/**
* Takes a bugreport without user interference (and hence causing less
@@ -608,6 +608,14 @@
public static boolean resizeStackWithLaunchBounds(int stackId) {
return stackId == PINNED_STACK_ID;
}
+
+ /**
+ * Returns true if any visible windows belonging to apps in this stack should be kept on
+ * screen when the app is killed due to something like the low memory killer.
+ */
+ public static boolean keepVisibleDeadAppWindowOnScreen(int stackId) {
+ return stackId != PINNED_STACK_ID;
+ }
}
/**
diff --git a/core/java/android/app/ITaskStackListener.aidl b/core/java/android/app/ITaskStackListener.aidl
index 560e22a..fa11234 100644
--- a/core/java/android/app/ITaskStackListener.aidl
+++ b/core/java/android/app/ITaskStackListener.aidl
@@ -23,4 +23,11 @@
/** Called whenever an Activity is moved to the pinned stack from another stack. */
void onActivityPinned();
+
+ /**
+ * Called whenever IActivityManager.startActivity is called on an activity that is already
+ * running in the pinned stack and the activity is not actually started, but the task is either
+ * brought to the front or a new Intent is delivered to it.
+ */
+ void onPinnedActivityRestartAttempt();
}
diff --git a/core/java/android/app/LoadedApk.java b/core/java/android/app/LoadedApk.java
index 855b21e..1e22bef 100644
--- a/core/java/android/app/LoadedApk.java
+++ b/core/java/android/app/LoadedApk.java
@@ -366,7 +366,7 @@
}
}
- String libraryPermittedPath = mAppDir + File.pathSeparator + mDataDir;
+ String libraryPermittedPath = mDataDir;
boolean isBundledApp = false;
if (mApplicationInfo.isSystemApp()) {
diff --git a/core/java/android/app/admin/DeviceAdminReceiver.java b/core/java/android/app/admin/DeviceAdminReceiver.java
index cfd5ca8..3c1ecc7 100644
--- a/core/java/android/app/admin/DeviceAdminReceiver.java
+++ b/core/java/android/app/admin/DeviceAdminReceiver.java
@@ -283,17 +283,17 @@
public static final String EXTRA_BUGREPORT_FAILURE_REASON =
"android.app.extra.BUGREPORT_FAILURE_REASON";
- @Retention(RetentionPolicy.SOURCE)
- @IntDef({
- BUGREPORT_FAILURE_FAILED_COMPLETING,
- BUGREPORT_FAILURE_FILE_NO_LONGER_AVAILABLE
- })
/**
* An interface representing reason of bugreport failure.
*
* @see #EXTRA_BUGREPORT_FAILURE_REASON
* @hide
*/
+ @Retention(RetentionPolicy.SOURCE)
+ @IntDef({
+ BUGREPORT_FAILURE_FAILED_COMPLETING,
+ BUGREPORT_FAILURE_FILE_NO_LONGER_AVAILABLE
+ })
public @interface BugreportFailureCode {}
/** Bugreport completion process failed. */
public static final int BUGREPORT_FAILURE_FAILED_COMPLETING = 0;
diff --git a/core/java/android/app/admin/DevicePolicyManager.java b/core/java/android/app/admin/DevicePolicyManager.java
index 25c54fa..7007afe 100644
--- a/core/java/android/app/admin/DevicePolicyManager.java
+++ b/core/java/android/app/admin/DevicePolicyManager.java
@@ -4125,6 +4125,50 @@
}
/**
+ * Flag used by {@link #createAndManageUser} to skip setup wizard after creating a new user.
+ */
+ public static final int SKIP_SETUP_WIZARD = 0x0001;
+
+ /**
+ * Called by a device owner to create a user with the specified name and a given component of
+ * the calling package as profile owner. The UserHandle returned by this method should not be
+ * persisted as user handles are recycled as users are removed and created. If you need to
+ * persist an identifier for this user, use {@link UserManager#getSerialNumberForUser}. The new
+ * user will not be started in the background.
+ *
+ * <p>admin is the {@link DeviceAdminReceiver} which is the device owner. profileOwner is also
+ * a DeviceAdminReceiver in the same package as admin, and will become the profile owner and
+ * will be registered as an active admin on the new user. The profile owner package will be
+ * installed on the new user.
+ *
+ * <p>If the adminExtras are not null, they will be stored on the device until the user is
+ * started for the first time. Then the extras will be passed to the admin when
+ * onEnable is called.
+ *
+ * @param admin Which {@link DeviceAdminReceiver} this request is associated with.
+ * @param name The user's name.
+ * @param profileOwner Which {@link DeviceAdminReceiver} will be profile owner. Has to be in the
+ * same package as admin, otherwise no user is created and an IllegalArgumentException is
+ * thrown.
+ * @param adminExtras Extras that will be passed to onEnable of the admin receiver on the new
+ * user.
+ * @param flags {@link #SKIP_SETUP_WIZARD} is supported.
+ * @see UserHandle
+ * @return the {@link android.os.UserHandle} object for the created user, or {@code null} if the
+ * user could not be created.
+ */
+ public UserHandle createAndManageUser(@NonNull ComponentName admin, @NonNull String name,
+ @NonNull ComponentName profileOwner, @Nullable PersistableBundle adminExtras,
+ int flags) {
+ try {
+ return mService.createAndManageUser(admin, name, profileOwner, adminExtras, flags);
+ } catch (RemoteException re) {
+ Log.w(TAG, REMOTE_EXCEPTION_MESSAGE, re);
+ }
+ return null;
+ }
+
+ /**
* Called by a device owner to remove a user and all associated data. The primary user can
* not be removed.
*
diff --git a/core/java/android/app/admin/IDevicePolicyManager.aidl b/core/java/android/app/admin/IDevicePolicyManager.aidl
index 2b378a4..e97bdf2b 100644
--- a/core/java/android/app/admin/IDevicePolicyManager.aidl
+++ b/core/java/android/app/admin/IDevicePolicyManager.aidl
@@ -179,6 +179,7 @@
UserHandle createUser(in ComponentName who, in String name);
UserHandle createAndInitializeUser(in ComponentName who, in String name, in String profileOwnerName, in ComponentName profileOwnerComponent, in Bundle adminExtras);
+ UserHandle createAndManageUser(in ComponentName who, in String name, in ComponentName profileOwner, in PersistableBundle adminExtras, in int flags);
boolean removeUser(in ComponentName who, in UserHandle userHandle);
boolean switchUser(in ComponentName who, in UserHandle userHandle);
diff --git a/core/java/android/app/job/JobInfo.java b/core/java/android/app/job/JobInfo.java
index 9ad35d4..0143797 100644
--- a/core/java/android/app/job/JobInfo.java
+++ b/core/java/android/app/job/JobInfo.java
@@ -16,11 +16,16 @@
package android.app.job;
+import android.annotation.NonNull;
+import android.annotation.Nullable;
import android.content.ComponentName;
+import android.net.Uri;
import android.os.Parcel;
import android.os.Parcelable;
import android.os.PersistableBundle;
+import java.util.ArrayList;
+
/**
* Container of data passed to the {@link android.app.job.JobScheduler} fully encapsulating the
* parameters required to schedule work against the calling application. These are constructed
@@ -80,6 +85,7 @@
private final ComponentName service;
private final boolean requireCharging;
private final boolean requireDeviceIdle;
+ private final TriggerContentUri[] triggerContentUris;
private final boolean hasEarlyConstraint;
private final boolean hasLateConstraint;
private final int networkType;
@@ -134,6 +140,15 @@
}
/**
+ * Which content: URIs must change for the job to be scheduled. Returns null
+ * if there are none required.
+ */
+ @Nullable
+ public TriggerContentUri[] getTriggerContentUris() {
+ return triggerContentUris;
+ }
+
+ /**
* One of {@link android.app.job.JobInfo#NETWORK_TYPE_ANY},
* {@link android.app.job.JobInfo#NETWORK_TYPE_NONE}, or
* {@link android.app.job.JobInfo#NETWORK_TYPE_UNMETERED}.
@@ -232,6 +247,7 @@
service = in.readParcelable(null);
requireCharging = in.readInt() == 1;
requireDeviceIdle = in.readInt() == 1;
+ triggerContentUris = in.createTypedArray(TriggerContentUri.CREATOR);
networkType = in.readInt();
minLatencyMillis = in.readLong();
maxExecutionDelayMillis = in.readLong();
@@ -252,6 +268,9 @@
service = b.mJobService;
requireCharging = b.mRequiresCharging;
requireDeviceIdle = b.mRequiresDeviceIdle;
+ triggerContentUris = b.mTriggerContentUris != null
+ ? b.mTriggerContentUris.toArray(new TriggerContentUri[b.mTriggerContentUris.size()])
+ : null;
networkType = b.mNetworkType;
minLatencyMillis = b.mMinLatencyMillis;
maxExecutionDelayMillis = b.mMaxExecutionDelayMillis;
@@ -278,6 +297,7 @@
out.writeParcelable(service, flags);
out.writeInt(requireCharging ? 1 : 0);
out.writeInt(requireDeviceIdle ? 1 : 0);
+ out.writeTypedArray(triggerContentUris, flags);
out.writeInt(networkType);
out.writeLong(minLatencyMillis);
out.writeLong(maxExecutionDelayMillis);
@@ -309,6 +329,75 @@
return "(job:" + jobId + "/" + service.flattenToShortString() + ")";
}
+ /**
+ * Information about a content URI modification that a job would like to
+ * trigger on.
+ */
+ public static final class TriggerContentUri implements Parcelable {
+ private final Uri mUri;
+ private final int mFlags;
+
+ /**
+ * Flag for trigger: also trigger if any descendants of the given URI change.
+ * Corresponds to the <var>notifyForDescendants</var> of
+ * {@link android.content.ContentResolver#registerContentObserver}.
+ */
+ public static final int FLAG_NOTIFY_FOR_DESCENDANTS = 1<<0;
+
+ /**
+ * Create a new trigger description.
+ * @param uri The URI to observe. Must be non-null.
+ * @param flags Optional flags for the observer, either 0 or
+ * {@link #FLAG_NOTIFY_FOR_DESCENDANTS}.
+ */
+ public TriggerContentUri(@NonNull Uri uri, int flags) {
+ mUri = uri;
+ mFlags = flags;
+ }
+
+ /**
+ * Return the Uri this trigger was created for.
+ */
+ public Uri getUri() {
+ return mUri;
+ }
+
+ /**
+ * Return the flags supplied for the trigger.
+ */
+ public int getFlags() {
+ return mFlags;
+ }
+
+ private TriggerContentUri(Parcel in) {
+ mUri = Uri.CREATOR.createFromParcel(in);
+ mFlags = in.readInt();
+ }
+
+ @Override
+ public int describeContents() {
+ return 0;
+ }
+
+ @Override
+ public void writeToParcel(Parcel out, int flags) {
+ mUri.writeToParcel(out, flags);
+ out.writeInt(mFlags);
+ }
+
+ public static final Creator<TriggerContentUri> CREATOR = new Creator<TriggerContentUri>() {
+ @Override
+ public TriggerContentUri createFromParcel(Parcel in) {
+ return new TriggerContentUri(in);
+ }
+
+ @Override
+ public TriggerContentUri[] newArray(int size) {
+ return new TriggerContentUri[size];
+ }
+ };
+ }
+
/** Builder class for constructing {@link JobInfo} objects. */
public static final class Builder {
private int mJobId;
@@ -319,6 +408,7 @@
private boolean mRequiresCharging;
private boolean mRequiresDeviceIdle;
private int mNetworkType;
+ private ArrayList<TriggerContentUri> mTriggerContentUris;
private boolean mIsPersisted;
// One-off parameters.
private long mMinLatencyMillis;
@@ -403,6 +493,25 @@
}
/**
+ * Add a new content: URI that will be monitored with a
+ * {@link android.database.ContentObserver}, and will cause the job to execute if changed.
+ * If you have any trigger content URIs associated with a job, it will not execute until
+ * there has been a change report for one or more of them.
+ * <p>Note that trigger URIs can not be used in combination with
+ * {@link #setPeriodic(long)} or {@link #setPersisted(boolean)}. To continually monitor
+ * for content changes, you need to schedule a new JobInfo observing the same URIs
+ * before you finish execution of the JobService handling the most recent changes.</p>
+ * @param uri The content: URI to monitor.
+ */
+ public Builder addTriggerContentUri(@NonNull TriggerContentUri uri) {
+ if (mTriggerContentUris == null) {
+ mTriggerContentUris = new ArrayList<>();
+ }
+ mTriggerContentUris.add(uri);
+ return this;
+ }
+
+ /**
* Specify that this job should recur with the provided interval, not more than once per
* period. You have no control over when within this interval this job will be executed,
* only the guarantee that it will be executed at most once within this interval.
@@ -498,7 +607,8 @@
public JobInfo build() {
// Allow jobs with no constraints - What am I, a database?
if (!mHasEarlyConstraint && !mHasLateConstraint && !mRequiresCharging &&
- !mRequiresDeviceIdle && mNetworkType == NETWORK_TYPE_NONE) {
+ !mRequiresDeviceIdle && mNetworkType == NETWORK_TYPE_NONE &&
+ mTriggerContentUris == null) {
throw new IllegalArgumentException("You're trying to build a job with no " +
"constraints, this is not allowed.");
}
@@ -512,6 +622,14 @@
throw new IllegalArgumentException("Can't call setMinimumLatency() on a " +
"periodic job");
}
+ if (mIsPeriodic && (mTriggerContentUris != null)) {
+ throw new IllegalArgumentException("Can't call addTriggerContentUri() on a " +
+ "periodic job");
+ }
+ if (mIsPersisted && (mTriggerContentUris != null)) {
+ throw new IllegalArgumentException("Can't call addTriggerContentUri() on a " +
+ "persisted job");
+ }
if (mBackoffPolicySet && mRequiresDeviceIdle) {
throw new IllegalArgumentException("An idle mode job will not respect any" +
" back-off policy, so calling setBackoffCriteria with" +
diff --git a/core/java/android/app/job/JobParameters.java b/core/java/android/app/job/JobParameters.java
index a0a60e8..8b309e11 100644
--- a/core/java/android/app/job/JobParameters.java
+++ b/core/java/android/app/job/JobParameters.java
@@ -17,6 +17,7 @@
package android.app.job;
import android.app.job.IJobCallback;
+import android.net.Uri;
import android.os.IBinder;
import android.os.Parcel;
import android.os.Parcelable;
@@ -43,15 +44,21 @@
private final PersistableBundle extras;
private final IBinder callback;
private final boolean overrideDeadlineExpired;
+ private final Uri[] mTriggeredContentUris;
+ private final String[] mTriggeredContentAuthorities;
+
private int stopReason; // Default value of stopReason is REASON_CANCELED
/** @hide */
public JobParameters(IBinder callback, int jobId, PersistableBundle extras,
- boolean overrideDeadlineExpired) {
+ boolean overrideDeadlineExpired, Uri[] triggeredContentUris,
+ String[] triggeredContentAuthorities) {
this.jobId = jobId;
this.extras = extras;
this.callback = callback;
this.overrideDeadlineExpired = overrideDeadlineExpired;
+ this.mTriggeredContentUris = triggeredContentUris;
+ this.mTriggeredContentAuthorities = triggeredContentAuthorities;
}
/**
@@ -88,6 +95,30 @@
return overrideDeadlineExpired;
}
+ /**
+ * For jobs with {@link android.app.job.JobInfo.Builder#addTriggerContentUri} set, this
+ * reports which URIs have triggered the job. This will be null if either no URIs have
+ * triggered it (it went off due to a deadline or other reason), or the number of changed
+ * URIs is too large to report. Whether or not the number of URIs is too large, you can
+ * always use {@link #getTriggeredContentAuthorities()} to determine whether the job was
+ * triggered due to any content changes and the authorities they are associated with.
+ */
+ public Uri[] getTriggeredContentUris() {
+ return mTriggeredContentUris;
+ }
+
+ /**
+ * For jobs with {@link android.app.job.JobInfo.Builder#addTriggerContentUri} set, this
+ * reports which content authorities have triggered the job. It will only be null if no
+ * authorities have triggered it -- that is, the job executed for some other reason, such
+ * as a deadline expiring. If this is non-null, you can use {@link #getTriggeredContentUris()}
+ * to retrieve the details of which URIs changed (as long as that has not exceeded the maximum
+ * number it can reported).
+ */
+ public String[] getTriggeredContentAuthorities() {
+ return mTriggeredContentAuthorities;
+ }
+
/** @hide */
public IJobCallback getCallback() {
return IJobCallback.Stub.asInterface(callback);
@@ -98,6 +129,8 @@
extras = in.readPersistableBundle();
callback = in.readStrongBinder();
overrideDeadlineExpired = in.readInt() == 1;
+ mTriggeredContentUris = in.createTypedArray(Uri.CREATOR);
+ mTriggeredContentAuthorities = in.createStringArray();
stopReason = in.readInt();
}
@@ -117,6 +150,8 @@
dest.writePersistableBundle(extras);
dest.writeStrongBinder(callback);
dest.writeInt(overrideDeadlineExpired ? 1 : 0);
+ dest.writeTypedArray(mTriggeredContentUris, flags);
+ dest.writeStringArray(mTriggeredContentAuthorities);
dest.writeInt(stopReason);
}
diff --git a/core/java/android/app/trust/ITrustManager.aidl b/core/java/android/app/trust/ITrustManager.aidl
index a3fe6ab..d3d02e5 100644
--- a/core/java/android/app/trust/ITrustManager.aidl
+++ b/core/java/android/app/trust/ITrustManager.aidl
@@ -32,4 +32,5 @@
void setDeviceLockedForUser(int userId, boolean locked);
boolean isDeviceLocked(int userId);
boolean isDeviceSecure(int userId);
+ boolean isTrustUsuallyManaged(int userId);
}
diff --git a/core/java/android/app/trust/TrustManager.java b/core/java/android/app/trust/TrustManager.java
index 88ba874..999d826 100644
--- a/core/java/android/app/trust/TrustManager.java
+++ b/core/java/android/app/trust/TrustManager.java
@@ -16,21 +16,17 @@
package android.app.trust;
+import com.android.internal.widget.LockPatternUtils;
+
import android.Manifest;
-import android.annotation.IntDef;
import android.annotation.RequiresPermission;
import android.os.Handler;
import android.os.IBinder;
import android.os.Looper;
import android.os.Message;
import android.os.RemoteException;
-import android.os.UserHandle;
import android.util.ArrayMap;
import android.util.Log;
-import android.util.SparseIntArray;
-
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
/**
* See {@link com.android.server.trust.TrustManagerService}
@@ -158,6 +154,21 @@
}
}
+ /**
+ * @return whether {@param userId} has enabled and configured trust agents. Ignores short-term
+ * unavailability of trust due to {@link LockPatternUtils.StrongAuthTracker}.
+ */
+ @RequiresPermission(android.Manifest.permission.TRUST_LISTENER)
+ public boolean isTrustUsuallyManaged(int userId) {
+ try {
+ return mService.isTrustUsuallyManaged(userId);
+ } catch (RemoteException e) {
+ return false;
+ }
+ }
+
+
+
private void onError(Exception e) {
Log.e(TAG, "Error while calling TrustManagerService", e);
}
diff --git a/core/java/android/content/ContentResolver.java b/core/java/android/content/ContentResolver.java
index 684a85e..3461c11 100644
--- a/core/java/android/content/ContentResolver.java
+++ b/core/java/android/content/ContentResolver.java
@@ -1592,20 +1592,20 @@
*
* @param uri The URI to watch for changes. This can be a specific row URI, or a base URI
* for a whole class of content.
- * @param notifyForDescendents When false, the observer will be notified whenever a
+ * @param notifyForDescendants When false, the observer will be notified whenever a
* change occurs to the exact URI specified by <code>uri</code> or to one of the
* URI's ancestors in the path hierarchy. When true, the observer will also be notified
* whenever a change occurs to the URI's descendants in the path hierarchy.
* @param observer The object that receives callbacks when changes occur.
* @see #unregisterContentObserver
*/
- public final void registerContentObserver(@NonNull Uri uri, boolean notifyForDescendents,
+ public final void registerContentObserver(@NonNull Uri uri, boolean notifyForDescendants,
@NonNull ContentObserver observer) {
Preconditions.checkNotNull(uri, "uri");
Preconditions.checkNotNull(observer, "observer");
registerContentObserver(
ContentProvider.getUriWithoutUserId(uri),
- notifyForDescendents,
+ notifyForDescendants,
observer,
ContentProvider.getUserIdFromUri(uri, UserHandle.myUserId()));
}
diff --git a/core/java/android/content/Intent.java b/core/java/android/content/Intent.java
index 40d7604..06da4955 100644
--- a/core/java/android/content/Intent.java
+++ b/core/java/android/content/Intent.java
@@ -3032,27 +3032,15 @@
/**
* Broadcast sent to the primary user when an associated managed profile's availability has
- * changed. This includes when the user toggles the profile's quiet mode, or when the profile
- * owner suspends the profile. Carries an extra {@link #EXTRA_USER} that specifies the
- * UserHandle of the profile. When quiet mode is changed, this broadcast will carry a boolean
- * extra {@link #EXTRA_QUIET_MODE} indicating the new state of quiet mode. This is only sent to
- * registered receivers, not manifest receivers.
+ * changed. This includes when the user toggles the profile's quiet mode. Carries an extra
+ * {@link #EXTRA_USER} that specifies the UserHandle of the profile. When quiet mode is changed,
+ * this broadcast will carry a boolean extra {@link #EXTRA_QUIET_MODE} indicating the new state
+ * of quiet mode. This is only sent to registered receivers, not manifest receivers.
*/
public static final String ACTION_MANAGED_PROFILE_AVAILABILITY_CHANGED =
"android.intent.action.MANAGED_PROFILE_AVAILABILITY_CHANGED";
/**
- * Broadcast sent to the managed profile when its availability has changed. This includes when
- * the user toggles the profile's quiet mode, or when the profile owner suspends the profile.
- * When quiet mode is changed, this broadcast will carry a boolean extra
- * {@link #EXTRA_QUIET_MODE} indicating the new state of quiet mode. This is only sent to
- * registered receivers, not manifest receivers. See also
- * {@link #ACTION_MANAGED_PROFILE_AVAILABILITY_CHANGED}
- */
- public static final String ACTION_AVAILABILITY_CHANGED =
- "android.intent.action.AVAILABILITY_CHANGED";
-
- /**
* Sent when the user taps on the clock widget in the system's "quick settings" area.
*/
public static final String ACTION_QUICK_CLOCK =
diff --git a/core/java/android/content/pm/ApplicationInfo.java b/core/java/android/content/pm/ApplicationInfo.java
index 0168908..654396b 100644
--- a/core/java/android/content/pm/ApplicationInfo.java
+++ b/core/java/android/content/pm/ApplicationInfo.java
@@ -176,7 +176,7 @@
/**
* Value for {@link #flags}: this is set if this application has been
- * install as an update to a built-in system application.
+ * installed as an update to a built-in system application.
*/
public static final int FLAG_UPDATED_SYSTEM_APP = 1<<7;
diff --git a/core/java/android/hardware/Sensor.java b/core/java/android/hardware/Sensor.java
index 6935174..e5efd56 100644
--- a/core/java/android/hardware/Sensor.java
+++ b/core/java/android/hardware/Sensor.java
@@ -551,6 +551,29 @@
*/
public static final String STRING_TYPE_DEVICE_ORIENTATION = "android.sensor.device_orientation";
+ /**
+ * A constant describing a pose sensor with 6 degrees of freedom.
+ *
+ * Similar to {@link #TYPE_ROTATION_VECTOR}, with additional delta
+ * translation from an arbitrary reference point.
+ *
+ * Can use camera, depth sensor etc to compute output value.
+ *
+ * This is expected to be a high power sensor and expected only to be
+ * used when the screen is on.
+ *
+ * Expected to be more accurate than the rotation vector alone.
+ *
+ */
+ public static final int TYPE_POSE_6DOF = 28;
+
+ /**
+ * A constant string describing a pose sensor with 6 degrees of freedom.
+ *
+ * @see #TYPE_POSE_6DOF
+ */
+ public static final String STRING_TYPE_POSE_6DOF = "android.sensor.pose_6dof";
+
/**
* A constant describing all sensor types.
*/
@@ -637,6 +660,7 @@
1, // SENSOR_TYPE_PICK_UP_GESTURE
1, // SENSOR_TYPE_WRIST_TILT_GESTURE
1, // SENSOR_TYPE_DEVICE_ORIENTATION
+ 16, // SENSOR_TYPE_POSE_6DOF
};
/**
diff --git a/core/java/android/hardware/SensorEvent.java b/core/java/android/hardware/SensorEvent.java
index 9937b2c..416c74c 100644
--- a/core/java/android/hardware/SensorEvent.java
+++ b/core/java/android/hardware/SensorEvent.java
@@ -497,6 +497,40 @@
* <li> 3: device is rotated 90 degrees clockwise from default orientation (X axis
* is vertical and points down)
* </ul>
+ *
+ * <h4>{@link android.hardware.Sensor#TYPE_POSE_6DOF
+ * Sensor.TYPE_POSE_6DOF}:</h4>
+ *
+ * A TYPE_POSE_6DOF event consists of a rotation expressed as a quaternion and a translation
+ * expressed in SI units. The event also contains a delta rotation and translation that show
+ * how the device?s pose has changed since the previous sequence numbered pose.
+ * The event uses the cannonical Android Sensor axes.
+ *
+ *
+ * <ul>
+ * <li> values[0]: x*sin(θ/2) </li>
+ * <li> values[1]: y*sin(θ/2) </li>
+ * <li> values[2]: z*sin(θ/2) </li>
+ * <li> values[3]: cos(θ/2) </li>
+ *
+ *
+ * <li> values[4]: Translation along x axis from an arbitrary origin. </li>
+ * li> values[5]: Translation along y axis from an arbitrary origin. </li>
+ * <li> values[6]: Translation along z axis from an arbitrary origin. </li>
+ *
+ * <li> values[7]: Delta quaternion rotation x*sin(θ/2) </li>
+ * <li> values[8]: Delta quaternion rotation y*sin(θ/2) </li>
+ * <li> values[9]: Delta quaternion rotation z*sin(θ/2) </li>
+ * <li> values[10]: Delta quaternion rotation cos(θ/2) </li>
+ *
+ * <li> values[11]: Delta translation along x axis. </li>
+ * <li> values[12]: Delta translation along y axis. </li>
+ * <li> values[13]: Delta translation along z axis. </li>
+ *
+ * <li> values[14]: Sequence number </li>
+ *
+ * </ul>
+ *
*/
public final float[] values;
diff --git a/core/java/android/net/ConnectivityManager.java b/core/java/android/net/ConnectivityManager.java
index 5584cde..08c0c09 100644
--- a/core/java/android/net/ConnectivityManager.java
+++ b/core/java/android/net/ConnectivityManager.java
@@ -3051,12 +3051,13 @@
*/
public static final int RESTRICT_BACKGROUND_STATUS_ENABLED = 3;
+ /** @hide */
+ @Retention(RetentionPolicy.SOURCE)
@IntDef(flag = false, value = {
RESTRICT_BACKGROUND_STATUS_DISABLED,
RESTRICT_BACKGROUND_STATUS_WHITELISTED,
RESTRICT_BACKGROUND_STATUS_ENABLED,
})
- @Retention(RetentionPolicy.SOURCE)
public @interface RestrictBackgroundStatus {
}
diff --git a/core/java/android/security/NetworkSecurityPolicy.java b/core/java/android/security/NetworkSecurityPolicy.java
index 37ec725..733a092 100644
--- a/core/java/android/security/NetworkSecurityPolicy.java
+++ b/core/java/android/security/NetworkSecurityPolicy.java
@@ -16,6 +16,11 @@
package android.security;
+import android.content.Context;
+import android.content.pm.PackageManager;
+import android.security.net.config.ApplicationConfig;
+import android.security.net.config.ManifestConfigSource;
+
/**
* Network security policy.
*
@@ -86,4 +91,17 @@
FrameworkNetworkSecurityPolicy policy = new FrameworkNetworkSecurityPolicy(permitted);
libcore.net.NetworkSecurityPolicy.setInstance(policy);
}
+
+
+ /**
+ * Returns an {@link ApplicationConfig} based on the configuration for {@code packageName}.
+ *
+ * @hide
+ */
+ public static ApplicationConfig getApplicationConfigForPackage(Context context,
+ String packageName) throws PackageManager.NameNotFoundException {
+ Context appContext = context.createPackageContext(packageName, 0);
+ ManifestConfigSource source = new ManifestConfigSource(appContext);
+ return new ApplicationConfig(source);
+ }
}
diff --git a/core/java/android/speech/tts/FileSynthesisCallback.java b/core/java/android/speech/tts/FileSynthesisCallback.java
index dea766b..ca9931a 100644
--- a/core/java/android/speech/tts/FileSynthesisCallback.java
+++ b/core/java/android/speech/tts/FileSynthesisCallback.java
@@ -111,6 +111,7 @@
"of AudioFormat.ENCODING_PCM_8BIT, AudioFormat.ENCODING_PCM_16BIT or " +
"AudioFormat.ENCODING_PCM_FLOAT");
}
+ mDispatcher.dispatchOnBeginSynthesis(sampleRateInHz, audioFormat, channelCount);
FileChannel fileChannel = null;
synchronized (mStateLock) {
@@ -176,6 +177,10 @@
fileChannel = mFileChannel;
}
+ final byte[] bufferCopy = new byte[length];
+ System.arraycopy(buffer, offset, bufferCopy, 0, length);
+ mDispatcher.dispatchOnAudioAvailable(bufferCopy);
+
try {
fileChannel.write(ByteBuffer.wrap(buffer, offset, length));
return TextToSpeech.SUCCESS;
diff --git a/core/java/android/speech/tts/ITextToSpeechCallback.aidl b/core/java/android/speech/tts/ITextToSpeechCallback.aidl
index d785c3f..4e3acf6 100644
--- a/core/java/android/speech/tts/ITextToSpeechCallback.aidl
+++ b/core/java/android/speech/tts/ITextToSpeechCallback.aidl
@@ -22,33 +22,65 @@
*/
oneway interface ITextToSpeechCallback {
/**
- * Tells the client that the synthesis has started.
+ * Tells the client that the synthesis has started playing.
*
- * @param utteranceId Unique id identifying synthesis request.
+ * @param utteranceId Unique id identifying the synthesis request.
*/
void onStart(String utteranceId);
/**
- * Tells the client that the synthesis has finished.
+ * Tells the client that the synthesis has finished playing.
*
- * @param utteranceId Unique id identifying synthesis request.
+ * @param utteranceId Unique id identifying the synthesis request.
*/
void onSuccess(String utteranceId);
/**
* Tells the client that the synthesis was stopped.
*
- * @param utteranceId Unique id identifying synthesis request.
+ * @param utteranceId Unique id identifying the synthesis request.
*/
void onStop(String utteranceId, boolean isStarted);
/**
* Tells the client that the synthesis has failed.
*
- * @param utteranceId Unique id identifying synthesis request.
+ * @param utteranceId Unique id identifying the synthesis request.
* @param errorCode One of the values from
* {@link android.speech.tts.v2.TextToSpeech}.
*/
void onError(String utteranceId, int errorCode);
+ /**
+ * Tells the client that the TTS engine has started synthesizing the audio for a request.
+ *
+ * <p>
+ * This doesn't mean the synthesis request has already started playing (for example when there
+ * are synthesis requests ahead of it in the queue), but after receiving this callback you can
+ * expect onAudioAvailable to be called.
+ * </p>
+ *
+ * @param utteranceId Unique id identifying the synthesis request.
+ * @param sampleRateInHz Sample rate in HZ of the generated audio.
+ * @param audioFormat The audio format of the generated audio in the {@link #onAudioAvailable}
+ * call. Should be one of {@link android.media.AudioFormat.ENCODING_PCM_8BIT},
+ * {@link android.media.AudioFormat.ENCODING_PCM_16BIT} or
+ * {@link android.media.AudioFormat.ENCODING_PCM_FLOAT}.
+ * @param channelCount The number of channels.
+ */
+ void onBeginSynthesis(String utteranceId, int sampleRateInHz, int audioFormat, int channelCount);
+
+ /**
+ * Tells the client about a chunk of the synthesized audio.
+ *
+ * <p>
+ * Called when a chunk of the synthesized audio is ready. This may be called more than once for
+ * every synthesis request, thereby streaming the audio to the client.
+ * </p>
+ *
+ * @param utteranceId Unique id identifying the synthesis request.
+ * @param audio The raw audio bytes. Its format is specified by the {@link #onStartAudio}
+ * callback.
+ */
+ void onAudioAvailable(String utteranceId, in byte[] audio);
}
diff --git a/core/java/android/speech/tts/PlaybackSynthesisCallback.java b/core/java/android/speech/tts/PlaybackSynthesisCallback.java
index dcc0095..778aa86 100644
--- a/core/java/android/speech/tts/PlaybackSynthesisCallback.java
+++ b/core/java/android/speech/tts/PlaybackSynthesisCallback.java
@@ -15,6 +15,7 @@
*/
package android.speech.tts;
+import android.annotation.NonNull;
import android.media.AudioFormat;
import android.speech.tts.TextToSpeechService.AudioOutputParams;
import android.speech.tts.TextToSpeechService.UtteranceProgressDispatcher;
@@ -51,9 +52,10 @@
private final Object mCallerIdentity;
private final AbstractEventLogger mLogger;
- PlaybackSynthesisCallback(AudioOutputParams audioParams, AudioPlaybackHandler audioTrackHandler,
- UtteranceProgressDispatcher dispatcher, Object callerIdentity,
- AbstractEventLogger logger, boolean clientIsUsingV2) {
+ PlaybackSynthesisCallback(@NonNull AudioOutputParams audioParams,
+ @NonNull AudioPlaybackHandler audioTrackHandler,
+ @NonNull UtteranceProgressDispatcher dispatcher, @NonNull Object callerIdentity,
+ @NonNull AbstractEventLogger logger, boolean clientIsUsingV2) {
super(clientIsUsingV2);
mAudioParams = audioParams;
mAudioTrackHandler = audioTrackHandler;
@@ -130,6 +132,7 @@
"of AudioFormat.ENCODING_PCM_8BIT, AudioFormat.ENCODING_PCM_16BIT or " +
"AudioFormat.ENCODING_PCM_FLOAT");
}
+ mDispatcher.dispatchOnBeginSynthesis(sampleRateInHz, audioFormat, channelCount);
int channelConfig = BlockingAudioTrack.getChannelConfig(channelCount);
@@ -190,6 +193,7 @@
// Sigh, another copy.
final byte[] bufferCopy = new byte[length];
System.arraycopy(buffer, offset, bufferCopy, 0, length);
+ mDispatcher.dispatchOnAudioAvailable(bufferCopy);
// Might block on mItem.this, if there are too many buffers waiting to
// be consumed.
diff --git a/core/java/android/speech/tts/TextToSpeech.java b/core/java/android/speech/tts/TextToSpeech.java
index 61c33ff..d55c7bd 100644
--- a/core/java/android/speech/tts/TextToSpeech.java
+++ b/core/java/android/speech/tts/TextToSpeech.java
@@ -16,6 +16,7 @@
package android.speech.tts;
import android.annotation.IntDef;
+import android.annotation.Nullable;
import android.annotation.RawRes;
import android.annotation.SdkConstant;
import android.annotation.SdkConstant.SdkConstantType;
@@ -665,7 +666,7 @@
private OnInitListener mInitListener;
// Written from an unspecified application thread, read from
// a binder thread.
- private volatile UtteranceProgressListener mUtteranceProgressListener;
+ @Nullable private volatile UtteranceProgressListener mUtteranceProgressListener;
private final Object mStartLock = new Object();
private String mRequestedEngine;
@@ -2133,6 +2134,23 @@
listener.onStart(utteranceId);
}
}
+
+ @Override
+ public void onBeginSynthesis(String utteranceId, int sampleRateInHz, int audioFormat,
+ int channelCount) {
+ UtteranceProgressListener listener = mUtteranceProgressListener;
+ if (listener != null) {
+ listener.onBeginSynthesis(utteranceId, sampleRateInHz, audioFormat, channelCount);
+ }
+ }
+
+ @Override
+ public void onAudioAvailable(String utteranceId, byte[] audio) {
+ UtteranceProgressListener listener = mUtteranceProgressListener;
+ if (listener != null) {
+ listener.onAudioAvailable(utteranceId, audio);
+ }
+ }
};
private class SetupConnectionAsyncTask extends AsyncTask<Void, Void, Integer> {
diff --git a/core/java/android/speech/tts/TextToSpeechService.java b/core/java/android/speech/tts/TextToSpeechService.java
index 8c355d8..fc075de 100644
--- a/core/java/android/speech/tts/TextToSpeechService.java
+++ b/core/java/android/speech/tts/TextToSpeechService.java
@@ -15,6 +15,7 @@
*/
package android.speech.tts;
+import android.annotation.NonNull;
import android.app.Service;
import android.content.Intent;
import android.media.AudioAttributes;
@@ -111,7 +112,7 @@
// A thread and it's associated handler for playing back any audio
// associated with this TTS engine. Will handle all requests except synthesis
// to file requests, which occur on the synthesis thread.
- private AudioPlaybackHandler mAudioPlaybackHandler;
+ @NonNull private AudioPlaybackHandler mAudioPlaybackHandler;
private TtsEngines mEngineHelper;
private CallbackMap mCallbacks;
@@ -649,6 +650,8 @@
public void dispatchOnSuccess();
public void dispatchOnStart();
public void dispatchOnError(int errorCode);
+ public void dispatchOnBeginSynthesis(int sampleRateInHz, int audioFormat, int channelCount);
+ public void dispatchOnAudioAvailable(byte[] audio);
}
/** Set of parameters affecting audio output. */
@@ -853,6 +856,22 @@
}
}
+ @Override
+ public void dispatchOnBeginSynthesis(int sampleRateInHz, int audioFormat, int channelCount) {
+ final String utteranceId = getUtteranceId();
+ if (utteranceId != null) {
+ mCallbacks.dispatchOnBeginSynthesis(getCallerIdentity(), utteranceId, sampleRateInHz, audioFormat, channelCount);
+ }
+ }
+
+ @Override
+ public void dispatchOnAudioAvailable(byte[] audio) {
+ final String utteranceId = getUtteranceId();
+ if (utteranceId != null) {
+ mCallbacks.dispatchOnAudioAvailable(getCallerIdentity(), utteranceId, audio);
+ }
+ }
+
abstract public String getUtteranceId();
String getStringParam(Bundle params, String key, String defaultValue) {
@@ -1430,7 +1449,6 @@
} catch (RemoteException e) {
Log.e(TAG, "Callback onStart failed: " + e);
}
-
}
public void dispatchOnError(Object callerIdentity, String utteranceId,
@@ -1444,6 +1462,26 @@
}
}
+ public void dispatchOnBeginSynthesis(Object callerIdentity, String utteranceId, int sampleRateInHz, int audioFormat, int channelCount) {
+ ITextToSpeechCallback cb = getCallbackFor(callerIdentity);
+ if (cb == null) return;
+ try {
+ cb.onBeginSynthesis(utteranceId, sampleRateInHz, audioFormat, channelCount);
+ } catch (RemoteException e) {
+ Log.e(TAG, "Callback dispatchOnBeginSynthesis(String, int, int, int) failed: " + e);
+ }
+ }
+
+ public void dispatchOnAudioAvailable(Object callerIdentity, String utteranceId, byte[] buffer) {
+ ITextToSpeechCallback cb = getCallbackFor(callerIdentity);
+ if (cb == null) return;
+ try {
+ cb.onAudioAvailable(utteranceId, buffer);
+ } catch (RemoteException e) {
+ Log.e(TAG, "Callback dispatchOnAudioAvailable(String, byte[]) failed: " + e);
+ }
+ }
+
@Override
public void onCallbackDied(ITextToSpeechCallback callback, Object cookie) {
IBinder caller = (IBinder) cookie;
diff --git a/core/java/android/speech/tts/UtteranceProgressListener.java b/core/java/android/speech/tts/UtteranceProgressListener.java
index 890ea3d..72a5228 100644
--- a/core/java/android/speech/tts/UtteranceProgressListener.java
+++ b/core/java/android/speech/tts/UtteranceProgressListener.java
@@ -2,6 +2,8 @@
package android.speech.tts;
+import android.media.AudioFormat;
+
/**
* Listener for events relating to the progress of an utterance through
* the synthesis queue. Each utterance is associated with a call to
@@ -14,10 +16,10 @@
/**
* Called when an utterance "starts" as perceived by the caller. This will
* be soon before audio is played back in the case of a {@link TextToSpeech#speak}
- * or before the first bytes of a file are written to storage in the case
+ * or before the first bytes of a file are written to the file system in the case
* of {@link TextToSpeech#synthesizeToFile}.
*
- * @param utteranceId the utterance ID of the utterance.
+ * @param utteranceId The utterance ID of the utterance.
*/
public abstract void onStart(String utteranceId);
@@ -28,7 +30,7 @@
*
* This request is guaranteed to be called after {@link #onStart(String)}.
*
- * @param utteranceId the utterance ID of the utterance.
+ * @param utteranceId The utterance ID of the utterance.
*/
public abstract void onDone(String utteranceId);
@@ -39,7 +41,7 @@
* be a call to both {@link #onDone(String)} and {@link #onError(String)} for
* the same utterance.
*
- * @param utteranceId the utterance ID of the utterance.
+ * @param utteranceId The utterance ID of the utterance.
* @deprecated Use {@link #onError(String,int)} instead
*/
@Deprecated
@@ -52,7 +54,7 @@
* be a call to both {@link #onDone(String)} and {@link #onError(String,int)} for
* the same utterance. The default implementation calls {@link #onError(String)}.
*
- * @param utteranceId the utterance ID of the utterance.
+ * @param utteranceId The utterance ID of the utterance.
* @param errorCode one of the ERROR_* codes from {@link TextToSpeech}
*/
public void onError(String utteranceId, int errorCode) {
@@ -65,7 +67,7 @@
* or uses {@link TextToSpeech#QUEUE_FLUSH} as an argument with the
* {@link TextToSpeech#speak} or {@link TextToSpeech#synthesizeToFile} methods.
*
- * @param utteranceId the utterance ID of the utterance.
+ * @param utteranceId The utterance ID of the utterance.
* @param interrupted If true, then the utterance was interrupted while being synthesized
* and its output is incomplete. If false, then the utterance was flushed
* before the synthesis started.
@@ -74,6 +76,52 @@
}
/**
+ * Called when the TTS engine begins to synthesize the audio for a request.
+ *
+ * <p>
+ * It provides information about the format of the byte array for subsequent
+ * {@link #onAudioAvailable} calls.
+ * </p>
+ *
+ * <p>
+ * This is called when the TTS engine starts synthesizing audio for the request. If an
+ * application wishes to know when the audio is about to start playing, {#onStart(String)}
+ * should be used instead.
+ * </p>
+ *
+ * @param utteranceId The utterance ID of the utterance.
+ * @param sampleRateInHz Sample rate in hertz of the generated audio.
+ * @param audioFormat Audio format of the generated audio. Should be one of
+ * {@link AudioFormat#ENCODING_PCM_8BIT}, {@link AudioFormat#ENCODING_PCM_16BIT} or
+ * {@link AudioFormat#ENCODING_PCM_FLOAT}.
+ * @param channelCount The number of channels.
+ */
+ public void onBeginSynthesis(String utteranceId, int sampleRateInHz, int audioFormat, int channelCount) {
+ }
+
+ /**
+ * This is called when a chunk of audio is ready for consumption.
+ *
+ * <p>
+ * The audio parameter is a copy of what will be synthesized to the speakers (when synthesis was
+ * initiated with a {@link TextToSpeech#speak} call) or written to the file system (for
+ * {@link TextToSpeech#synthesizeToFile}). The audio bytes are delivered in one or more chunks;
+ * if {@link #onDone} or {@link #onError} is called all chunks have been received.
+ * </p>
+ *
+ * <p>
+ * The audio received here may not be played for some time depending on buffer sizes and the
+ * amount of items on the synthesis queue.
+ * </p>
+ *
+ * @param utteranceId The utterance ID of the utterance.
+ * @param audio A chunk of audio; the format can be known by listening to
+ * {@link #onBeginSynthesis(String, int, int, int)}.
+ */
+ public void onAudioAvailable(String utteranceId, byte[] audio) {
+ }
+
+ /**
* Wraps an old deprecated OnUtteranceCompletedListener with a shiny new
* progress listener.
*
diff --git a/core/java/android/text/SpannableStringBuilder.java b/core/java/android/text/SpannableStringBuilder.java
index e34560b8..787202e 100644
--- a/core/java/android/text/SpannableStringBuilder.java
+++ b/core/java/android/text/SpannableStringBuilder.java
@@ -965,10 +965,10 @@
(spanStart != queryEnd && spanEnd != queryStart)) &&
(Object.class == kind || kind.isInstance(mSpans[i]))) {
int spanPriority = mSpanFlags[i] & SPAN_PRIORITY;
- if(sort) {
- ret[count] = (T) mSpans[i];
- priority[count] = spanPriority;
- insertionOrder[count] = mSpanOrder[i];
+ int target = count;
+ if (sort) {
+ priority[target] = spanPriority;
+ insertionOrder[target] = mSpanOrder[i];
} else if (spanPriority != 0) {
//insertion sort for elements with priority
int j = 0;
@@ -977,8 +977,9 @@
if (spanPriority > p) break;
}
System.arraycopy(ret, j, ret, j + 1, count - j);
- ret[j] = (T) mSpans[i];
+ target = j;
}
+ ret[target] = (T) mSpans[i];
count++;
}
if (count < ret.length && (i & 1) != 0) {
diff --git a/core/java/android/view/FrameStatsObserver.java b/core/java/android/view/FrameStatsObserver.java
new file mode 100644
index 0000000..0add607
--- /dev/null
+++ b/core/java/android/view/FrameStatsObserver.java
@@ -0,0 +1,122 @@
+/*
+ * Copyright (C) 2016 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.view;
+
+import android.annotation.NonNull;
+import android.util.Log;
+import android.os.Looper;
+import android.os.MessageQueue;
+
+import com.android.internal.util.VirtualRefBasePtr;
+
+import java.lang.NullPointerException;
+import java.lang.ref.WeakReference;
+import java.lang.SuppressWarnings;
+
+/**
+ * Provides streaming access to frame stats information from the rendering
+ * subsystem to apps.
+ *
+ * @hide
+ */
+public abstract class FrameStatsObserver {
+ private static final String TAG = "FrameStatsObserver";
+
+ private MessageQueue mMessageQueue;
+ private long[] mBuffer;
+
+ private FrameStats mFrameStats;
+
+ /* package */ ThreadedRenderer mRenderer;
+ /* package */ VirtualRefBasePtr mNative;
+
+ /**
+ * Containing class for frame statistics reported
+ * by the rendering subsystem.
+ */
+ public static class FrameStats {
+ /**
+ * Precise timing data for various milestones in a frame
+ * lifecycle.
+ *
+ * This data is exactly the same as what is returned by
+ * `adb shell dumpsys gfxinfo <PACKAGE_NAME> framestats`
+ *
+ * The fields reported may change from release to release.
+ *
+ * @see {@link http://developer.android.com/training/testing/performance.html}
+ * for a description of the fields present.
+ */
+ public long[] mTimingData;
+ }
+
+ /**
+ * Creates a FrameStatsObserver
+ *
+ * @param looper the looper to use when invoking callbacks
+ */
+ public FrameStatsObserver(@NonNull Looper looper) {
+ if (looper == null) {
+ throw new NullPointerException("looper cannot be null");
+ }
+
+ mMessageQueue = looper.getQueue();
+ if (mMessageQueue == null) {
+ throw new IllegalStateException("invalid looper, null message queue\n");
+ }
+
+ mFrameStats = new FrameStats();
+ }
+
+ /**
+ * Called on provided looper when frame stats data is available
+ * for the previous frame.
+ *
+ * Clients of this class must do as little work as possible within
+ * this callback, as the buffer is shared between the producer and consumer.
+ *
+ * If the consumer is still executing within this method when there is new
+ * data available that data will be dropped. The producer cannot
+ * wait on the consumer.
+ *
+ * @param data the newly available data
+ */
+ public abstract void onDataAvailable(FrameStats data);
+
+ /**
+ * Returns the number of reports dropped as a result of a slow
+ * consumer.
+ */
+ public long getDroppedReportCount() {
+ if (mRenderer == null) {
+ return 0;
+ }
+
+ return mRenderer.getDroppedFrameReportCount();
+ }
+
+ public boolean isRegistered() {
+ return mRenderer != null && mNative != null;
+ }
+
+ // === called by native === //
+ @SuppressWarnings("unused")
+ private void notifyDataAvailable() {
+ mFrameStats.mTimingData = mBuffer;
+ onDataAvailable(mFrameStats);
+ }
+}
diff --git a/core/java/android/view/IWindow.aidl b/core/java/android/view/IWindow.aidl
index 9231394..c5ed39a 100644
--- a/core/java/android/view/IWindow.aidl
+++ b/core/java/android/view/IWindow.aidl
@@ -76,6 +76,11 @@
void dispatchDragEvent(in DragEvent event);
/**
+ * Pointer icon events
+ */
+ void updatePointerIcon(float x, float y);
+
+ /**
* System chrome visibility changes
*/
void dispatchSystemUiVisibilityChanged(int seq, int globalVisibility,
diff --git a/core/java/android/view/ThreadedRenderer.java b/core/java/android/view/ThreadedRenderer.java
index 0e4bc84..78a63a6 100644
--- a/core/java/android/view/ThreadedRenderer.java
+++ b/core/java/android/view/ThreadedRenderer.java
@@ -24,7 +24,9 @@
import android.graphics.Point;
import android.graphics.Rect;
import android.os.Binder;
+import android.os.Handler;
import android.os.IBinder;
+import android.os.Message;
import android.os.ParcelFileDescriptor;
import android.os.RemoteException;
import android.os.ServiceManager;
@@ -34,12 +36,14 @@
import android.view.View.AttachInfo;
import com.android.internal.R;
+import com.android.internal.util.VirtualRefBasePtr;
import java.io.File;
import java.io.FileDescriptor;
import java.io.PrintWriter;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
+import java.util.HashSet;
/**
* Hardware renderer that proxies the rendering to a render thread. Most calls
@@ -339,6 +343,8 @@
private boolean mEnabled;
private boolean mRequested = true;
+ private HashSet<FrameStatsObserver> mFrameStatsObservers;
+
ThreadedRenderer(Context context, boolean translucent) {
final TypedArray a = context.obtainStyledAttributes(null, R.styleable.Lighting, 0, 0);
mLightY = a.getDimension(R.styleable.Lighting_lightY, 0);
@@ -947,6 +953,31 @@
}
}
+ void addFrameStatsObserver(FrameStatsObserver fso) {
+ if (mFrameStatsObservers == null) {
+ mFrameStatsObservers = new HashSet<>();
+ }
+
+ long nativeFso = nAddFrameStatsObserver(mNativeProxy, fso);
+ fso.mRenderer = this;
+ fso.mNative = new VirtualRefBasePtr(nativeFso);
+ mFrameStatsObservers.add(fso);
+ }
+
+ void removeFrameStatsObserver(FrameStatsObserver fso) {
+ if (!mFrameStatsObservers.remove(fso)) {
+ throw new IllegalArgumentException("attempt to remove FrameStatsObserver that was never added");
+ }
+
+ nRemoveFrameStatsObserver(mNativeProxy, fso.mNative.get());
+ fso.mRenderer = null;
+ fso.mNative = null;
+ }
+
+ long getDroppedFrameReportCount() {
+ return nGetDroppedFrameReportCount(mNativeProxy);
+ }
+
static native void setupShadersDiskCache(String cacheFile);
private static native void nSetAtlas(long nativeProxy, GraphicBuffer buffer, long[] map);
@@ -1000,4 +1031,8 @@
private static native void nDrawRenderNode(long nativeProxy, long rootRenderNode);
private static native void nSetContentDrawBounds(long nativeProxy, int left,
int top, int right, int bottom);
+
+ private static native long nAddFrameStatsObserver(long nativeProxy, FrameStatsObserver fso);
+ private static native void nRemoveFrameStatsObserver(long nativeProxy, long nativeFso);
+ private static native long nGetDroppedFrameReportCount(long nativeProxy);
}
diff --git a/core/java/android/view/View.java b/core/java/android/view/View.java
index fff141a..dd0887f 100644
--- a/core/java/android/view/View.java
+++ b/core/java/android/view/View.java
@@ -100,16 +100,17 @@
import android.widget.Checkable;
import android.widget.FrameLayout;
import android.widget.ScrollBarDrawable;
-
import static android.os.Build.VERSION_CODES.*;
import static java.lang.Math.max;
import com.android.internal.R;
import com.android.internal.util.Predicate;
import com.android.internal.view.menu.MenuBuilder;
+import com.android.internal.widget.ScrollBarUtils;
import com.google.android.collect.Lists;
import com.google.android.collect.Maps;
+import java.lang.NullPointerException;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.ref.WeakReference;
@@ -3702,6 +3703,11 @@
private ViewPropertyAnimator mAnimator = null;
/**
+ * List of FrameStatsObservers pending registration when mAttachInfo is null.
+ */
+ private ArrayList<FrameStatsObserver> mPendingFrameStatsObservers;
+
+ /**
* Flag indicating that a drag can cross window boundaries. When
* {@link #startDragAndDrop(ClipData, DragShadowBuilder, Object, int)} is called
* with this flag set, all visible applications will be able to participate
@@ -5122,6 +5128,88 @@
return mVerticalScrollbarPosition;
}
+ boolean isOnScrollbar(float x, float y) {
+ if (mScrollCache == null) {
+ return false;
+ }
+ x += getScrollX();
+ y += getScrollY();
+ if (isVerticalScrollBarEnabled() && !isVerticalScrollBarHidden()) {
+ final Rect bounds = mScrollCache.mScrollBarBounds;
+ getVerticalScrollBarBounds(bounds);
+ if (bounds.contains((int)x, (int)y)) {
+ return true;
+ }
+ }
+ if (isHorizontalScrollBarEnabled()) {
+ final Rect bounds = mScrollCache.mScrollBarBounds;
+ getHorizontalScrollBarBounds(bounds);
+ if (bounds.contains((int)x, (int)y)) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ boolean isOnScrollbarThumb(float x, float y) {
+ return isOnVerticalScrollbarThumb(x, y) || isOnHorizontalScrollbarThumb(x, y);
+ }
+
+ private boolean isOnVerticalScrollbarThumb(float x, float y) {
+ if (mScrollCache == null) {
+ return false;
+ }
+ if (isVerticalScrollBarEnabled() && !isVerticalScrollBarHidden()) {
+ x += getScrollX();
+ y += getScrollY();
+ final Rect bounds = mScrollCache.mScrollBarBounds;
+ getVerticalScrollBarBounds(bounds);
+ final int range = computeVerticalScrollRange();
+ final int offset = computeVerticalScrollOffset();
+ final int extent = computeVerticalScrollExtent();
+ final int thumbLength = ScrollBarUtils.getThumbLength(bounds.height(), bounds.width(),
+ extent, range);
+ final int thumbOffset = ScrollBarUtils.getThumbOffset(bounds.height(), thumbLength,
+ extent, range, offset);
+ final int thumbTop = bounds.top + thumbOffset;
+ if (x >= bounds.left && x <= bounds.right && y >= thumbTop
+ && y <= thumbTop + thumbLength) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ private boolean isOnHorizontalScrollbarThumb(float x, float y) {
+ if (mScrollCache == null) {
+ return false;
+ }
+ if (isHorizontalScrollBarEnabled()) {
+ x += getScrollX();
+ y += getScrollY();
+ final Rect bounds = mScrollCache.mScrollBarBounds;
+ getHorizontalScrollBarBounds(bounds);
+ final int range = computeHorizontalScrollRange();
+ final int offset = computeHorizontalScrollOffset();
+ final int extent = computeHorizontalScrollExtent();
+ final int thumbLength = ScrollBarUtils.getThumbLength(bounds.width(), bounds.height(),
+ extent, range);
+ final int thumbOffset = ScrollBarUtils.getThumbOffset(bounds.width(), thumbLength,
+ extent, range, offset);
+ final int thumbLeft = bounds.left + thumbOffset;
+ if (x >= thumbLeft && x <= thumbLeft + thumbLength && y >= bounds.top
+ && y <= bounds.bottom) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ boolean isDraggingScrollBar() {
+ return mScrollCache != null
+ && mScrollCache.mScrollBarDraggingState != ScrollabilityCache.NOT_DRAGGING;
+ }
+
/**
* Sets the state of all scroll indicators.
* <p>
@@ -5381,6 +5469,58 @@
}
/**
+ * Set an observer to collect stats for each frame rendered for this view.
+ *
+ * @hide
+ */
+ public void addFrameStatsObserver(FrameStatsObserver fso) {
+ if (mAttachInfo != null) {
+ if (mAttachInfo.mHardwareRenderer != null) {
+ mAttachInfo.mHardwareRenderer.addFrameStatsObserver(fso);
+ } else {
+ Log.w(VIEW_LOG_TAG, "View not hardware-accelerated. Unable to observe frame stats");
+ }
+ } else {
+ if (mPendingFrameStatsObservers == null) {
+ mPendingFrameStatsObservers = new ArrayList<>();
+ }
+
+ mPendingFrameStatsObservers.add(fso);
+ }
+ }
+
+ /**
+ * Remove observer configured to collect frame stats for this view.
+ *
+ * @hide
+ */
+ public void removeFrameStatsObserver(FrameStatsObserver fso) {
+ ThreadedRenderer renderer = getHardwareRenderer();
+
+ if (mPendingFrameStatsObservers != null) {
+ mPendingFrameStatsObservers.remove(fso);
+ }
+
+ if (renderer != null) {
+ renderer.removeFrameStatsObserver(fso);
+ }
+ }
+
+ private void registerPendingFrameStatsObservers() {
+ if (mPendingFrameStatsObservers != null) {
+ ThreadedRenderer renderer = getHardwareRenderer();
+ if (renderer != null) {
+ for (FrameStatsObserver fso : mPendingFrameStatsObservers) {
+ renderer.addFrameStatsObserver(fso);
+ }
+ } else {
+ Log.w(VIEW_LOG_TAG, "View not hardware-accelerated. Unable to observe frame stats");
+ }
+ mPendingFrameStatsObservers = null;
+ }
+ }
+
+ /**
* Call this view's OnClickListener, if it is defined. Performs all normal
* actions associated with clicking: reporting accessibility event, playing
* a sound, etc.
@@ -5737,8 +5877,11 @@
* <p>A View should call this if it maintains some notion of which part
* of its content is interesting. For example, a text editing view
* should call this when its cursor moves.
+ * <p>The Rectangle passed into this method should be in the View's content coordinate space.
+ * It should not be affected by which part of the View is currently visible or its scroll
+ * position.
*
- * @param rectangle The rectangle.
+ * @param rectangle The rectangle in the View's content coordinate space
* @return Whether any parent scrolled.
*/
public boolean requestRectangleOnScreen(Rect rectangle) {
@@ -5752,11 +5895,13 @@
* <p>A View should call this if it maintains some notion of which part
* of its content is interesting. For example, a text editing view
* should call this when its cursor moves.
- *
+ * <p>The Rectangle passed into this method should be in the View's content coordinate space.
+ * It should not be affected by which part of the View is currently visible or its scroll
+ * position.
* <p>When <code>immediate</code> is set to true, scrolling will not be
* animated.
*
- * @param rectangle The rectangle.
+ * @param rectangle The rectangle in the View's content coordinate space
* @param immediate True to forbid animated scrolling, false otherwise
* @return Whether any parent scrolled.
*/
@@ -5776,24 +5921,16 @@
rectangle.set((int) position.left, (int) position.top,
(int) position.right, (int) position.bottom);
- scrolled |= parent.requestChildRectangleOnScreen(child,
- rectangle, immediate);
-
- if (!child.hasIdentityMatrix()) {
- child.getMatrix().mapRect(position);
- }
-
- position.offset(child.mLeft, child.mTop);
+ scrolled |= parent.requestChildRectangleOnScreen(child, rectangle, immediate);
if (!(parent instanceof View)) {
break;
}
- View parentView = (View) parent;
+ // move it from child's content coordinate space to parent's content coordinate space
+ position.offset(child.mLeft - child.getScrollX(), child.mTop -child.getScrollY());
- position.offset(-parentView.getScrollX(), -parentView.getScrollY());
-
- child = parentView;
+ child = (View) parent;
parent = child.getParent();
}
@@ -9660,6 +9797,9 @@
}
if (onFilterTouchEventForSecurity(event)) {
+ if ((mViewFlags & ENABLED_MASK) == ENABLED && handleScrollBarDragging(event)) {
+ result = true;
+ }
//noinspection SimplifiableIfStatement
ListenerInfo li = mListenerInfo;
if (li != null && li.mOnTouchListener != null
@@ -10524,6 +10664,11 @@
}
}
+ if ((action == MotionEvent.ACTION_HOVER_ENTER || action == MotionEvent.ACTION_HOVER_MOVE)
+ && event.isFromSource(InputDevice.SOURCE_MOUSE)
+ && isOnScrollbar(event.getX(), event.getY())) {
+ awakenScrollBars();
+ }
if (isHoverable()) {
switch (action) {
case MotionEvent.ACTION_HOVER_ENTER:
@@ -10627,6 +10772,110 @@
}
/**
+ * Handles scroll bar dragging by mouse input.
+ *
+ * @hide
+ * @param event The motion event.
+ *
+ * @return true if the event was handled as a scroll bar dragging, false otherwise.
+ */
+ protected boolean handleScrollBarDragging(MotionEvent event) {
+ if (mScrollCache == null) {
+ return false;
+ }
+ final float x = event.getX();
+ final float y = event.getY();
+ final int action = event.getAction();
+ if ((mScrollCache.mScrollBarDraggingState == ScrollabilityCache.NOT_DRAGGING
+ && action != MotionEvent.ACTION_DOWN)
+ || !event.isFromSource(InputDevice.SOURCE_MOUSE)
+ || !event.isButtonPressed(MotionEvent.BUTTON_PRIMARY)) {
+ mScrollCache.mScrollBarDraggingState = ScrollabilityCache.NOT_DRAGGING;
+ return false;
+ }
+
+ switch (action) {
+ case MotionEvent.ACTION_MOVE:
+ if (mScrollCache.mScrollBarDraggingState == ScrollabilityCache.NOT_DRAGGING) {
+ return false;
+ }
+ if (mScrollCache.mScrollBarDraggingState
+ == ScrollabilityCache.DRAGGING_VERTICAL_SCROLL_BAR) {
+ final Rect bounds = mScrollCache.mScrollBarBounds;
+ getVerticalScrollBarBounds(bounds);
+ final int range = computeVerticalScrollRange();
+ final int offset = computeVerticalScrollOffset();
+ final int extent = computeVerticalScrollExtent();
+
+ final int thumbLength = ScrollBarUtils.getThumbLength(
+ bounds.height(), bounds.width(), extent, range);
+ final int thumbOffset = ScrollBarUtils.getThumbOffset(
+ bounds.height(), thumbLength, extent, range, offset);
+
+ final float diff = y - mScrollCache.mScrollBarDraggingPos;
+ final float maxThumbOffset = bounds.height() - thumbLength;
+ final float newThumbOffset =
+ Math.min(Math.max(thumbOffset + diff, 0.0f), maxThumbOffset);
+ final int height = getHeight();
+ if (Math.round(newThumbOffset) != thumbOffset && maxThumbOffset > 0
+ && height > 0 && extent > 0) {
+ final int newY = Math.round((range - extent)
+ / ((float)extent / height) * (newThumbOffset / maxThumbOffset));
+ if (newY != getScrollY()) {
+ mScrollCache.mScrollBarDraggingPos = y;
+ setScrollY(newY);
+ }
+ }
+ return true;
+ }
+ if (mScrollCache.mScrollBarDraggingState
+ == ScrollabilityCache.DRAGGING_HORIZONTAL_SCROLL_BAR) {
+ final Rect bounds = mScrollCache.mScrollBarBounds;
+ getHorizontalScrollBarBounds(bounds);
+ final int range = computeHorizontalScrollRange();
+ final int offset = computeHorizontalScrollOffset();
+ final int extent = computeHorizontalScrollExtent();
+
+ final int thumbLength = ScrollBarUtils.getThumbLength(
+ bounds.width(), bounds.height(), extent, range);
+ final int thumbOffset = ScrollBarUtils.getThumbOffset(
+ bounds.width(), thumbLength, extent, range, offset);
+
+ final float diff = x - mScrollCache.mScrollBarDraggingPos;
+ final float maxThumbOffset = bounds.width() - thumbLength;
+ final float newThumbOffset =
+ Math.min(Math.max(thumbOffset + diff, 0.0f), maxThumbOffset);
+ final int width = getWidth();
+ if (Math.round(newThumbOffset) != thumbOffset && maxThumbOffset > 0
+ && width > 0 && extent > 0) {
+ final int newX = Math.round((range - extent)
+ / ((float)extent / width) * (newThumbOffset / maxThumbOffset));
+ if (newX != getScrollX()) {
+ mScrollCache.mScrollBarDraggingPos = x;
+ setScrollX(newX);
+ }
+ }
+ return true;
+ }
+ case MotionEvent.ACTION_DOWN:
+ if (isOnVerticalScrollbarThumb(x, y)) {
+ mScrollCache.mScrollBarDraggingState =
+ ScrollabilityCache.DRAGGING_VERTICAL_SCROLL_BAR;
+ mScrollCache.mScrollBarDraggingPos = y;
+ return true;
+ }
+ if (isOnHorizontalScrollbarThumb(x, y)) {
+ mScrollCache.mScrollBarDraggingState =
+ ScrollabilityCache.DRAGGING_HORIZONTAL_SCROLL_BAR;
+ mScrollCache.mScrollBarDraggingPos = x;
+ return true;
+ }
+ }
+ mScrollCache.mScrollBarDraggingState = ScrollabilityCache.NOT_DRAGGING;
+ return false;
+ }
+
+ /**
* Implement this method to handle touch screen motion events.
* <p>
* If this method is used to detect click actions, it is recommended that
@@ -10659,7 +10908,6 @@
|| (viewFlags & LONG_CLICKABLE) == LONG_CLICKABLE)
|| (viewFlags & CONTEXT_CLICKABLE) == CONTEXT_CLICKABLE);
}
-
if (mTouchDelegate != null) {
if (mTouchDelegate.onTouchEvent(event)) {
return true;
@@ -14220,6 +14468,45 @@
}
}
+ private void getHorizontalScrollBarBounds(Rect bounds) {
+ final int inside = (mViewFlags & SCROLLBARS_OUTSIDE_MASK) == 0 ? ~0 : 0;
+ final boolean drawVerticalScrollBar = isVerticalScrollBarEnabled()
+ && !isVerticalScrollBarHidden();
+ final int size = getHorizontalScrollbarHeight();
+ final int verticalScrollBarGap = drawVerticalScrollBar ?
+ getVerticalScrollbarWidth() : 0;
+ final int width = mRight - mLeft;
+ final int height = mBottom - mTop;
+ bounds.top = mScrollY + height - size - (mUserPaddingBottom & inside);
+ bounds.left = mScrollX + (mPaddingLeft & inside);
+ bounds.right = mScrollX + width - (mUserPaddingRight & inside) - verticalScrollBarGap;
+ bounds.bottom = bounds.top + size;
+ }
+
+ private void getVerticalScrollBarBounds(Rect bounds) {
+ final int inside = (mViewFlags & SCROLLBARS_OUTSIDE_MASK) == 0 ? ~0 : 0;
+ final int size = getVerticalScrollbarWidth();
+ int verticalScrollbarPosition = mVerticalScrollbarPosition;
+ if (verticalScrollbarPosition == SCROLLBAR_POSITION_DEFAULT) {
+ verticalScrollbarPosition = isLayoutRtl() ?
+ SCROLLBAR_POSITION_LEFT : SCROLLBAR_POSITION_RIGHT;
+ }
+ final int width = mRight - mLeft;
+ final int height = mBottom - mTop;
+ switch (verticalScrollbarPosition) {
+ default:
+ case SCROLLBAR_POSITION_RIGHT:
+ bounds.left = mScrollX + width - size - (mUserPaddingRight & inside);
+ break;
+ case SCROLLBAR_POSITION_LEFT:
+ bounds.left = mScrollX + (mUserPaddingLeft & inside);
+ break;
+ }
+ bounds.top = mScrollY + (mPaddingTop & inside);
+ bounds.right = bounds.left + size;
+ bounds.bottom = mScrollY + height - (mUserPaddingBottom & inside);
+ }
+
/**
* <p>Request the drawing of the horizontal and the vertical scrollbar. The
* scrollbars are painted only if they have been awakened first.</p>
@@ -14267,80 +14554,36 @@
cache.scrollBar.mutate().setAlpha(255);
}
-
- final int viewFlags = mViewFlags;
-
- final boolean drawHorizontalScrollBar =
- (viewFlags & SCROLLBARS_HORIZONTAL) == SCROLLBARS_HORIZONTAL;
- final boolean drawVerticalScrollBar =
- (viewFlags & SCROLLBARS_VERTICAL) == SCROLLBARS_VERTICAL
- && !isVerticalScrollBarHidden();
+ final boolean drawHorizontalScrollBar = isHorizontalScrollBarEnabled();
+ final boolean drawVerticalScrollBar = isVerticalScrollBarEnabled()
+ && !isVerticalScrollBarHidden();
if (drawVerticalScrollBar || drawHorizontalScrollBar) {
- final int width = mRight - mLeft;
- final int height = mBottom - mTop;
-
final ScrollBarDrawable scrollBar = cache.scrollBar;
- final int scrollX = mScrollX;
- final int scrollY = mScrollY;
- final int inside = (viewFlags & SCROLLBARS_OUTSIDE_MASK) == 0 ? ~0 : 0;
-
- int left;
- int top;
- int right;
- int bottom;
-
if (drawHorizontalScrollBar) {
- int size = scrollBar.getSize(false);
- if (size <= 0) {
- size = cache.scrollBarSize;
- }
-
scrollBar.setParameters(computeHorizontalScrollRange(),
computeHorizontalScrollOffset(),
computeHorizontalScrollExtent(), false);
- final int verticalScrollBarGap = drawVerticalScrollBar ?
- getVerticalScrollbarWidth() : 0;
- top = scrollY + height - size - (mUserPaddingBottom & inside);
- left = scrollX + (mPaddingLeft & inside);
- right = scrollX + width - (mUserPaddingRight & inside) - verticalScrollBarGap;
- bottom = top + size;
- onDrawHorizontalScrollBar(canvas, scrollBar, left, top, right, bottom);
+ final Rect bounds = cache.mScrollBarBounds;
+ getHorizontalScrollBarBounds(bounds);
+ onDrawHorizontalScrollBar(canvas, scrollBar, bounds.left, bounds.top,
+ bounds.right, bounds.bottom);
if (invalidate) {
- invalidate(left, top, right, bottom);
+ invalidate(bounds);
}
}
if (drawVerticalScrollBar) {
- int size = scrollBar.getSize(true);
- if (size <= 0) {
- size = cache.scrollBarSize;
- }
-
scrollBar.setParameters(computeVerticalScrollRange(),
computeVerticalScrollOffset(),
computeVerticalScrollExtent(), true);
- int verticalScrollbarPosition = mVerticalScrollbarPosition;
- if (verticalScrollbarPosition == SCROLLBAR_POSITION_DEFAULT) {
- verticalScrollbarPosition = isLayoutRtl() ?
- SCROLLBAR_POSITION_LEFT : SCROLLBAR_POSITION_RIGHT;
- }
- switch (verticalScrollbarPosition) {
- default:
- case SCROLLBAR_POSITION_RIGHT:
- left = scrollX + width - size - (mUserPaddingRight & inside);
- break;
- case SCROLLBAR_POSITION_LEFT:
- left = scrollX + (mUserPaddingLeft & inside);
- break;
- }
- top = scrollY + (mPaddingTop & inside);
- right = left + size;
- bottom = scrollY + height - (mUserPaddingBottom & inside);
- onDrawVerticalScrollBar(canvas, scrollBar, left, top, right, bottom);
+ final Rect bounds = cache.mScrollBarBounds;
+ getVerticalScrollBarBounds(bounds);
+ onDrawVerticalScrollBar(canvas, scrollBar, bounds.left, bounds.top,
+ bounds.right, bounds.bottom);
if (invalidate) {
- invalidate(left, top, right, bottom);
+ invalidate(bounds);
}
}
}
@@ -14903,6 +15146,9 @@
info.mTreeObserver.merge(mFloatingTreeObserver);
mFloatingTreeObserver = null;
}
+
+ registerPendingFrameStatsObservers();
+
if ((mPrivateFlags&PFLAG_SCROLL_CONTAINER) != 0) {
mAttachInfo.mScrollContainers.add(this);
mPrivateFlags |= PFLAG_SCROLL_CONTAINER_ADDED;
@@ -21277,6 +21523,9 @@
* @see PointerIcon
*/
public PointerIcon getPointerIcon(MotionEvent event, float x, float y) {
+ if (isDraggingScrollBar() || isOnScrollbarThumb(x, y)) {
+ return PointerIcon.getSystemIcon(mContext, PointerIcon.STYLE_ARROW);
+ }
return mPointerIcon;
}
@@ -22548,6 +22797,15 @@
private int mLastColor;
+ public final Rect mScrollBarBounds = new Rect();
+
+ public static final int NOT_DRAGGING = 0;
+ public static final int DRAGGING_VERTICAL_SCROLL_BAR = 1;
+ public static final int DRAGGING_HORIZONTAL_SCROLL_BAR = 2;
+ public int mScrollBarDraggingState = NOT_DRAGGING;
+
+ public float mScrollBarDraggingPos = 0;
+
public ScrollabilityCache(ViewConfiguration configuration, View host) {
fadingEdgeLength = configuration.getScaledFadingEdgeLength();
scrollBarSize = configuration.getScaledScrollBarSize();
diff --git a/core/java/android/view/ViewGroup.java b/core/java/android/view/ViewGroup.java
index 27e2ea3..3fe6b8e 100644
--- a/core/java/android/view/ViewGroup.java
+++ b/core/java/android/view/ViewGroup.java
@@ -59,6 +59,7 @@
import java.util.HashSet;
import java.util.List;
import java.util.Map;
+
import static android.os.Build.VERSION_CODES.JELLY_BEAN_MR1;
/**
@@ -1651,6 +1652,9 @@
@Override
public PointerIcon getPointerIcon(MotionEvent event, float x, float y) {
+ if (isOnScrollbarThumb(x, y) || isDraggingScrollBar()) {
+ return PointerIcon.getSystemIcon(mContext, PointerIcon.STYLE_ARROW);
+ }
// Check what the child under the pointer says about the pointer.
final int childrenCount = mChildrenCount;
if (childrenCount != 0) {
@@ -1974,7 +1978,7 @@
* hover exit event in {@link #onHoverEvent} and then the hovered child will
* receive a hover enter event.
* </p><p>
- * The default implementation always returns false.
+ * The default implementation handles mouse hover on the scroll bars.
* </p>
*
* @param event The motion event that describes the hover.
@@ -1982,6 +1986,15 @@
* and prevent its children from receiving it.
*/
public boolean onInterceptHoverEvent(MotionEvent event) {
+ if (event.isFromSource(InputDevice.SOURCE_MOUSE)) {
+ final int action = event.getAction();
+ final float x = event.getX();
+ final float y = event.getY();
+ if ((action == MotionEvent.ACTION_HOVER_MOVE
+ || action == MotionEvent.ACTION_HOVER_ENTER) && isOnScrollbar(x, y)) {
+ return true;
+ }
+ }
return false;
}
@@ -2716,6 +2729,12 @@
* messages will be delivered here.
*/
public boolean onInterceptTouchEvent(MotionEvent ev) {
+ if (ev.isFromSource(InputDevice.SOURCE_MOUSE)
+ && ev.getAction() == MotionEvent.ACTION_DOWN
+ && ev.isButtonPressed(MotionEvent.BUTTON_PRIMARY)
+ && isOnScrollbarThumb(ev.getX(), ev.getY())) {
+ return true;
+ }
return false;
}
diff --git a/core/java/android/view/ViewParent.java b/core/java/android/view/ViewParent.java
index e9b123b5..1962be8 100644
--- a/core/java/android/view/ViewParent.java
+++ b/core/java/android/view/ViewParent.java
@@ -266,14 +266,14 @@
* intercept touch events.
*/
public void requestDisallowInterceptTouchEvent(boolean disallowIntercept);
-
+
/**
* Called when a child of this group wants a particular rectangle to be
* positioned onto the screen. {@link ViewGroup}s overriding this can trust
* that:
* <ul>
* <li>child will be a direct child of this group</li>
- * <li>rectangle will be in the child's coordinates</li>
+ * <li>rectangle will be in the child's content coordinates</li>
* </ul>
*
* <p>{@link ViewGroup}s overriding this should uphold the contract:</p>
diff --git a/core/java/android/view/ViewRootImpl.java b/core/java/android/view/ViewRootImpl.java
index 131ad4c..5d41477 100644
--- a/core/java/android/view/ViewRootImpl.java
+++ b/core/java/android/view/ViewRootImpl.java
@@ -3278,6 +3278,7 @@
private final static int MSG_SYNTHESIZE_INPUT_EVENT = 24;
private final static int MSG_DISPATCH_WINDOW_SHOWN = 25;
private final static int MSG_REQUEST_KEYBOARD_SHORTCUTS = 26;
+ private final static int MSG_UPDATE_POINTER_ICON = 27;
final class ViewRootHandler extends Handler {
@Override
@@ -3327,6 +3328,8 @@
return "MSG_SYNTHESIZE_INPUT_EVENT";
case MSG_DISPATCH_WINDOW_SHOWN:
return "MSG_DISPATCH_WINDOW_SHOWN";
+ case MSG_UPDATE_POINTER_ICON:
+ return "MSG_UPDATE_POINTER_ICON";
}
return super.getMessageName(message);
}
@@ -3568,6 +3571,10 @@
IResultReceiver receiver = (IResultReceiver) msg.obj;
handleRequestKeyboardShortcuts(receiver);
} break;
+ case MSG_UPDATE_POINTER_ICON: {
+ MotionEvent event = (MotionEvent) msg.obj;
+ resetPointerIcon(event);
+ } break;
}
}
}
@@ -4309,31 +4316,11 @@
mPointerIconShape = PointerIcon.STYLE_NOT_SPECIFIED;
}
- final float x = event.getX();
- final float y = event.getY();
- if (event.getActionMasked() != MotionEvent.ACTION_HOVER_EXIT
- && x >= 0 && x < mView.getWidth() && y >= 0 && y < mView.getHeight()) {
- PointerIcon pointerIcon = mView.getPointerIcon(event, x, y);
- int pointerShape = (pointerIcon != null) ?
- pointerIcon.getStyle() : PointerIcon.STYLE_DEFAULT;
-
- final InputDevice inputDevice = event.getDevice();
- if (inputDevice != null) {
- if (mPointerIconShape != pointerShape) {
- mPointerIconShape = pointerShape;
- if (mPointerIconShape != PointerIcon.STYLE_CUSTOM) {
- mCustomPointerIcon = null;
- inputDevice.setPointerShape(pointerShape);
- }
- }
- if (mPointerIconShape == PointerIcon.STYLE_CUSTOM &&
- !pointerIcon.equals(mCustomPointerIcon)) {
- mCustomPointerIcon = pointerIcon;
- inputDevice.setCustomPointerIcon(mCustomPointerIcon);
- }
+ if (event.getActionMasked() != MotionEvent.ACTION_HOVER_EXIT) {
+ if (!updatePointerIcon(event) &&
+ event.getActionMasked() == MotionEvent.ACTION_HOVER_MOVE) {
+ mPointerIconShape = PointerIcon.STYLE_NOT_SPECIFIED;
}
- } else if (event.getActionMasked() == MotionEvent.ACTION_HOVER_MOVE) {
- mPointerIconShape = PointerIcon.STYLE_NOT_SPECIFIED;
}
}
@@ -4371,6 +4358,38 @@
}
}
+ private void resetPointerIcon(MotionEvent event) {
+ mPointerIconShape = PointerIcon.STYLE_NOT_SPECIFIED;
+ updatePointerIcon(event);
+ }
+
+ private boolean updatePointerIcon(MotionEvent event) {
+ final float x = event.getX();
+ final float y = event.getY();
+ if (x < 0 || x >= mView.getWidth() || y < 0 || y >= mView.getHeight()) {
+ Slog.e(mTag, "updatePointerIcon called with position out of bounds");
+ return false;
+ }
+ final PointerIcon pointerIcon = mView.getPointerIcon(event, x, y);
+ final int pointerShape = (pointerIcon != null) ?
+ pointerIcon.getStyle() : PointerIcon.STYLE_DEFAULT;
+
+ if (mPointerIconShape != pointerShape) {
+ mPointerIconShape = pointerShape;
+ if (mPointerIconShape != PointerIcon.STYLE_CUSTOM) {
+ mCustomPointerIcon = null;
+ InputManager.getInstance().setPointerIconShape(pointerShape);
+ return true;
+ }
+ }
+ if (mPointerIconShape == PointerIcon.STYLE_CUSTOM &&
+ !pointerIcon.equals(mCustomPointerIcon)) {
+ mCustomPointerIcon = pointerIcon;
+ InputManager.getInstance().setCustomPointerIcon(mCustomPointerIcon);
+ }
+ return true;
+ }
+
/**
* Performs synthesis of new input events from unhandled input events.
*/
@@ -6389,6 +6408,16 @@
mHandler.sendMessage(msg);
}
+ public void updatePointerIcon(float x, float y) {
+ final int what = MSG_UPDATE_POINTER_ICON;
+ mHandler.removeMessages(what);
+ final long now = SystemClock.uptimeMillis();
+ final MotionEvent event = MotionEvent.obtain(
+ 0, now, MotionEvent.ACTION_HOVER_MOVE, x, y, 0);
+ Message msg = mHandler.obtainMessage(what, event);
+ mHandler.sendMessage(msg);
+ }
+
public void dispatchSystemUiVisibilityChanged(int seq, int globalVisibility,
int localValue, int localChanges) {
SystemUiVisibilityInfo args = new SystemUiVisibilityInfo();
@@ -6700,16 +6729,19 @@
@Override
public boolean requestChildRectangleOnScreen(View child, Rect rectangle, boolean immediate) {
+ if (rectangle == null) {
+ return scrollToRectOrFocus(null, immediate);
+ }
+ rectangle.offset(child.getLeft() - child.getScrollX(),
+ child.getTop() - child.getScrollY());
final boolean scrolled = scrollToRectOrFocus(rectangle, immediate);
- if (rectangle != null) {
- mTempRect.set(rectangle);
- mTempRect.offset(0, -mCurScrollY);
- mTempRect.offset(mAttachInfo.mWindowLeft, mAttachInfo.mWindowTop);
- try {
- mWindowSession.onRectangleOnScreenRequested(mWindow, mTempRect);
- } catch (RemoteException re) {
- /* ignore */
- }
+ mTempRect.set(rectangle);
+ mTempRect.offset(0, -mCurScrollY);
+ mTempRect.offset(mAttachInfo.mWindowLeft, mAttachInfo.mWindowTop);
+ try {
+ mWindowSession.onRectangleOnScreenRequested(mWindow, mTempRect);
+ } catch (RemoteException re) {
+ /* ignore */
}
return scrolled;
}
@@ -6967,6 +6999,14 @@
}
@Override
+ public void updatePointerIcon(float x, float y) {
+ final ViewRootImpl viewAncestor = mViewAncestor.get();
+ if (viewAncestor != null) {
+ viewAncestor.updatePointerIcon(x, y);
+ }
+ }
+
+ @Override
public void dispatchSystemUiVisibilityChanged(int seq, int globalVisibility,
int localValue, int localChanges) {
final ViewRootImpl viewAncestor = mViewAncestor.get();
diff --git a/core/java/android/view/Window.java b/core/java/android/view/Window.java
index dfe0cc7..ee70891 100644
--- a/core/java/android/view/Window.java
+++ b/core/java/android/view/Window.java
@@ -34,6 +34,7 @@
import android.media.session.MediaController;
import android.net.Uri;
import android.os.Bundle;
+import android.os.Handler;
import android.os.IBinder;
import android.os.RemoteException;
import android.os.SystemProperties;
@@ -794,6 +795,40 @@
return mCallback;
}
+ /**
+ * Set an observer to collect frame stats for each frame rendererd in this window.
+ *
+ * Must be in hardware rendering mode.
+ * @hide
+ */
+ public final void addFrameStatsObserver(@NonNull FrameStatsObserver fso) {
+ final View decorView = getDecorView();
+ if (decorView == null) {
+ throw new IllegalStateException("can't observe a Window without an attached view");
+ }
+
+ if (fso == null) {
+ throw new NullPointerException("FrameStatsObserver cannot be null");
+ }
+
+ if (fso.isRegistered()) {
+ throw new IllegalStateException("FrameStatsObserver already registered on a Window.");
+ }
+
+ decorView.addFrameStatsObserver(fso);
+ }
+
+ /**
+ * Remove observer and stop listening to frame stats for this window.
+ * @hide
+ */
+ public final void removeFrameStatsObserver(FrameStatsObserver fso) {
+ final View decorView = getDecorView();
+ if (decorView != null) {
+ getDecorView().removeFrameStatsObserver(fso);
+ }
+ }
+
/** @hide */
public final void setOnWindowDismissedCallback(OnWindowDismissedCallback dcb) {
mOnWindowDismissedCallback = dcb;
diff --git a/core/java/android/widget/AbsListView.java b/core/java/android/widget/AbsListView.java
index 6c2c956..9561f08 100644
--- a/core/java/android/widget/AbsListView.java
+++ b/core/java/android/widget/AbsListView.java
@@ -3701,6 +3701,13 @@
}
}
+ /** @hide */
+ @Override
+ protected boolean handleScrollBarDragging(MotionEvent event) {
+ // Doesn't support normal scroll bar dragging. Use FastScroller.
+ return false;
+ }
+
@Override
public boolean onTouchEvent(MotionEvent ev) {
if (!isEnabled()) {
diff --git a/core/java/android/widget/Editor.java b/core/java/android/widget/Editor.java
index 4355eb3..67473c6 100644
--- a/core/java/android/widget/Editor.java
+++ b/core/java/android/widget/Editor.java
@@ -1082,6 +1082,20 @@
return true;
}
+ private void startDragAndDrop() {
+ final int start = mTextView.getSelectionStart();
+ final int end = mTextView.getSelectionEnd();
+ CharSequence selectedText = mTextView.getTransformedText(start, end);
+ ClipData data = ClipData.newPlainText(null, selectedText);
+ DragLocalState localState = new DragLocalState(mTextView, start, end);
+ mTextView.startDragAndDrop(data, getTextThumbnailBuilder(selectedText), localState,
+ View.DRAG_FLAG_GLOBAL);
+ stopTextActionMode();
+ if (hasSelectionController()) {
+ getSelectionController().resetTouchOffsets();
+ }
+ }
+
public boolean performLongClick(boolean handled) {
// Long press in empty space moves cursor and starts the insertion action mode.
if (!handled && !isPositionOnText(mLastDownPositionX, mLastDownPositionY) &&
@@ -1097,15 +1111,7 @@
if (!handled && mTextActionMode != null) {
if (touchPositionIsInSelection()) {
- // Start a drag
- final int start = mTextView.getSelectionStart();
- final int end = mTextView.getSelectionEnd();
- CharSequence selectedText = mTextView.getTransformedText(start, end);
- ClipData data = ClipData.newPlainText(null, selectedText);
- DragLocalState localState = new DragLocalState(mTextView, start, end);
- mTextView.startDrag(data, getTextThumbnailBuilder(selectedText), localState,
- View.DRAG_FLAG_GLOBAL);
- stopTextActionMode();
+ startDragAndDrop();
} else {
stopTextActionMode();
selectCurrentWordAndStartDrag();
@@ -4925,6 +4931,14 @@
if (isMouse && !isDragAcceleratorActive()) {
final int offset = mTextView.getOffsetForPosition(eventX, eventY);
+ if (mTextView.hasSelection()
+ && (!mHaventMovedEnoughToStartDrag || mStartOffset != offset)
+ && offset >= mTextView.getSelectionStart()
+ && offset <= mTextView.getSelectionEnd()) {
+ startDragAndDrop();
+ break;
+ }
+
if (mStartOffset != offset) {
// Start character based drag accelerator.
if (mTextActionMode != null) {
diff --git a/core/java/android/widget/HorizontalScrollView.java b/core/java/android/widget/HorizontalScrollView.java
index ebc7eb3..f16fdd6 100644
--- a/core/java/android/widget/HorizontalScrollView.java
+++ b/core/java/android/widget/HorizontalScrollView.java
@@ -454,6 +454,10 @@
return true;
}
+ if (super.onInterceptTouchEvent(ev)) {
+ return true;
+ }
+
switch (action & MotionEvent.ACTION_MASK) {
case MotionEvent.ACTION_MOVE: {
/*
diff --git a/core/java/android/widget/ScrollBarDrawable.java b/core/java/android/widget/ScrollBarDrawable.java
index 91d6232..8880217 100644
--- a/core/java/android/widget/ScrollBarDrawable.java
+++ b/core/java/android/widget/ScrollBarDrawable.java
@@ -16,6 +16,8 @@
package android.widget;
+import com.android.internal.widget.ScrollBarUtils;
+
import android.graphics.Canvas;
import android.graphics.ColorFilter;
import android.graphics.PixelFormat;
@@ -135,23 +137,15 @@
}
if (drawThumb) {
- final int size = vertical ? r.height() : r.width();
+ final int scrollBarLength = vertical ? r.height() : r.width();
final int thickness = vertical ? r.width() : r.height();
- final int minLength = thickness * 2;
+ final int thumbLength =
+ ScrollBarUtils.getThumbLength(scrollBarLength, thickness, extent, range);
+ final int thumbOffset =
+ ScrollBarUtils.getThumbOffset(scrollBarLength, thumbLength, extent, range,
+ mOffset);
- // Avoid the tiny thumb.
- int length = Math.round((float) size * extent / range);
- if (length < minLength) {
- length = minLength;
- }
-
- // Avoid the too-big thumb.
- int offset = Math.round((float) (size - length) * mOffset / (range - extent));
- if (offset > size - length) {
- offset = size - length;
- }
-
- drawThumb(canvas, r, offset, length, vertical);
+ drawThumb(canvas, r, thumbOffset, thumbLength, vertical);
}
}
diff --git a/core/java/android/widget/ScrollView.java b/core/java/android/widget/ScrollView.java
index 78b931d..3f7a07b 100644
--- a/core/java/android/widget/ScrollView.java
+++ b/core/java/android/widget/ScrollView.java
@@ -489,6 +489,10 @@
return true;
}
+ if (super.onInterceptTouchEvent(ev)) {
+ return true;
+ }
+
/*
* Don't try to intercept touch if we can't scroll anyway.
*/
diff --git a/core/java/com/android/internal/app/UnlaunchableAppActivity.java b/core/java/com/android/internal/app/UnlaunchableAppActivity.java
new file mode 100644
index 0000000..aada6e3
--- /dev/null
+++ b/core/java/com/android/internal/app/UnlaunchableAppActivity.java
@@ -0,0 +1,158 @@
+/*
+ * Copyright (C) 2016 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.internal.app;
+
+import static android.content.Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS;
+import static android.content.Intent.FLAG_ACTIVITY_NEW_TASK;
+
+import android.app.Activity;
+import android.app.AlertDialog;
+import android.app.admin.DevicePolicyManager;
+import android.content.ComponentName;
+import android.content.Context;
+import android.content.DialogInterface;
+import android.content.Intent;
+import android.content.pm.ApplicationInfo;
+import android.content.pm.PackageManager;
+import android.content.pm.PackageManager.NameNotFoundException;
+import android.os.Bundle;
+import android.os.UserHandle;
+import android.os.UserManager;
+import android.util.Log;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.widget.TextView;
+
+import com.android.internal.R;
+
+/**
+ * A dialog shown to the user when they try to launch an app from a quiet profile
+ * ({@link UserManager#isQuietModeEnabled(UserHandle)}, or when the app is suspended by the
+ * profile owner or device owner.
+ */
+public class UnlaunchableAppActivity extends Activity
+ implements DialogInterface.OnDismissListener, DialogInterface.OnClickListener {
+ private static final String TAG = "UnlaunchableAppActivity";
+
+ private static final int UNLAUNCHABLE_REASON_QUIET_MODE = 1;
+ private static final int UNLAUNCHABLE_REASON_SUSPENDED_PACKAGE = 2;
+ private static final String EXTRA_UNLAUNCHABLE_REASON = "unlaunchable_reason";
+
+ private int mUserId;
+ private int mReason;
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ Intent intent = getIntent();
+ mReason = intent.getIntExtra(EXTRA_UNLAUNCHABLE_REASON, -1);
+ mUserId = intent.getIntExtra(Intent.EXTRA_USER_HANDLE, UserHandle.USER_NULL);
+
+ if (mUserId == UserHandle.USER_NULL) {
+ Log.wtf(TAG, "Invalid user id: " + mUserId + ". Stopping.");
+ finish();
+ return;
+ }
+
+ String dialogTitle;
+ String dialogMessage;
+ if (mReason == UNLAUNCHABLE_REASON_QUIET_MODE) {
+ dialogTitle = getResources().getString(R.string.work_mode_off_title);
+ dialogMessage = getResources().getString(R.string.work_mode_off_message);
+ } else if (mReason == UNLAUNCHABLE_REASON_SUSPENDED_PACKAGE) {
+ PackageManager pm = getPackageManager();
+ DevicePolicyManager dpm = (DevicePolicyManager) getSystemService(
+ Context.DEVICE_POLICY_SERVICE);
+ String packageName = intent.getStringExtra(Intent.EXTRA_PACKAGE_NAME);
+ String packageLabel = packageName;
+ try {
+ Context userContext = createPackageContextAsUser(packageName, 0,
+ UserHandle.of(mUserId));
+ ApplicationInfo appInfo = userContext.getApplicationInfo();
+ if (appInfo != null) {
+ packageLabel = userContext.getPackageManager().getApplicationLabel(appInfo)
+ .toString();
+ }
+ } catch (NameNotFoundException e) {
+ }
+ dialogTitle = String.format(getResources().getString(R.string.suspended_package_title),
+ packageLabel);
+ dialogMessage = dpm.getShortSupportMessageForUser(dpm.getProfileOwnerAsUser(mUserId),
+ mUserId);
+ if (dialogMessage == null) {
+ dialogMessage = String.format(
+ getResources().getString(R.string.suspended_package_message),
+ dpm.getProfileOwnerNameAsUser(mUserId));
+ }
+ } else {
+ Log.wtf(TAG, "Invalid unlaunchable type: " + mReason);
+ finish();
+ return;
+ }
+
+ View rootView = LayoutInflater.from(this).inflate(R.layout.unlaunchable_app_activity, null);
+ TextView titleView = (TextView)rootView.findViewById(R.id.unlaunchable_app_title);
+ TextView messageView = (TextView)rootView.findViewById(R.id.unlaunchable_app_message);
+ titleView.setText(dialogTitle);
+ messageView.setText(dialogMessage);
+
+ AlertDialog.Builder builder = new AlertDialog.Builder(this)
+ .setView(rootView)
+ .setOnDismissListener(this);
+ if (mReason == UNLAUNCHABLE_REASON_QUIET_MODE) {
+ builder.setPositiveButton(R.string.work_mode_turn_on, this)
+ .setNegativeButton(R.string.cancel, null);
+ } else {
+ builder.setPositiveButton(R.string.ok, null);
+ }
+ builder.show();
+ }
+
+ @Override
+ public void onDismiss(DialogInterface dialog) {
+ finish();
+ }
+
+ @Override
+ public void onClick(DialogInterface dialog, int which) {
+ if (mReason == UNLAUNCHABLE_REASON_QUIET_MODE && which == DialogInterface.BUTTON_POSITIVE) {
+ UserManager.get(this).setQuietModeEnabled(mUserId, false);
+ }
+ }
+
+ private static final Intent createBaseIntent() {
+ Intent intent = new Intent();
+ intent.setComponent(new ComponentName("android", UnlaunchableAppActivity.class.getName()));
+ intent.setFlags(FLAG_ACTIVITY_NEW_TASK | FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS);
+ return intent;
+ }
+
+ public static Intent createInQuietModeDialogIntent(int userId) {
+ Intent intent = createBaseIntent();
+ intent.putExtra(EXTRA_UNLAUNCHABLE_REASON, UNLAUNCHABLE_REASON_QUIET_MODE);
+ intent.putExtra(Intent.EXTRA_USER_HANDLE, userId);
+ return intent;
+ }
+
+ public static Intent createPackageSuspendedDialogIntent(String packageName, int userId) {
+ Intent intent = createBaseIntent();
+ intent.putExtra(EXTRA_UNLAUNCHABLE_REASON, UNLAUNCHABLE_REASON_SUSPENDED_PACKAGE);
+ intent.putExtra(Intent.EXTRA_USER_HANDLE, userId);
+ intent.putExtra(Intent.EXTRA_PACKAGE_NAME, packageName);
+ return intent;
+ }
+}
diff --git a/core/java/com/android/internal/logging/MetricsConstants.java b/core/java/com/android/internal/logging/MetricsConstants.java
index 37bf71c..522732d 100644
--- a/core/java/com/android/internal/logging/MetricsConstants.java
+++ b/core/java/com/android/internal/logging/MetricsConstants.java
@@ -22,8 +22,7 @@
*/
public interface MetricsConstants {
// These constants must match those in the analytic pipeline, do not edit.
- // Add temporary values to the top of MetricsLogger instead.
- public static final int VIEW_UNKNOWN = 0;
+ // define metric categories in frameworks/base/core/proto/src/metrics_constants.proto.
public static final int MAIN_SETTINGS = 1;
public static final int ACCESSIBILITY = 2;
public static final int ACCESSIBILITY_CAPTION_PROPERTIES = 3;
@@ -65,7 +64,7 @@
public static final int DEVELOPMENT = 39;
public static final int DEVICEINFO = 40;
public static final int DEVICEINFO_IMEI_INFORMATION = 41;
- public static final int DEVICEINFO_MEMORY = 42;
+ public static final int DEVICEINFO_STORAGE = 42;
public static final int DEVICEINFO_SIM_STATUS = 43;
public static final int DEVICEINFO_STATUS = 44;
public static final int DEVICEINFO_USB = 45;
@@ -134,7 +133,6 @@
public static final int WIFI_INFO = 108;
public static final int WIFI_P2P = 109;
public static final int WIRELESS = 110;
- public static final int QS_PANEL = 111;
public static final int QS_AIRPLANEMODE = 112;
public static final int QS_BLUETOOTH = 113;
public static final int QS_CAST = 114;
@@ -282,10 +280,73 @@
public static final int ACTION_WIGGLE_CAMERA_GESTURE = 256;
public static final int QS_WORKMODE = 257;
public static final int BACKGROUND_CHECK_SUMMARY = 258;
+ public static final int QS_LOCK_TILE = 259;
+ public static final int QS_USER_TILE = 260;
+ public static final int QS_BATTERY_TILE = 261;
+ public static final int NOTIFICATION_ZEN_MODE_VISUAL_INTERRUPTIONS = 262;
+ public static final int ACTION_ZEN_ALLOW_PEEK = 263;
+ public static final int ACTION_ZEN_ALLOW_LIGHTS = 264;
+ public static final int NOTIFICATION_TOPIC_NOTIFICATION = 265;
+ public static final int ACTION_DEFAULT_SMS_APP_CHANGED = 266;
+ public static final int QS_COLOR_MATRIX = 267;
+ public static final int QS_CUSTOM = 268;
+ public static final int ACTION_ZEN_ALLOW_SCREEN_ON = 269;
- // These constants must match those in the analytic pipeline, do not edit.
- // Add temporary values to the top of MetricsLogger instead.
+ /**
+ * Logged when the user docks a window from recents by longpressing a task and dragging it to
+ * the dock area.
+ */
+ public static final int ACTION_WINDOW_DOCK_DRAG_DROP = 270;
- //aliases
- public static final int DEVICEINFO_STORAGE = DEVICEINFO_MEMORY;
+ /**
+ * Logged when the user docks a fullscreen window by long pressing recents which also opens
+ * recents on the lower/right side.
+ */
+ public static final int ACTION_WINDOW_DOCK_LONGPRESS = 271;
+
+ /**
+ * Logged when the user docks a window by dragging from the navbar which also opens recents on
+ * the lower/right side.
+ */
+ public static final int ACTION_WINDOW_DOCK_SWIPE = 272;
+
+ /**
+ * Logged when the user launches a profile-specific app and we intercept it with the confirm
+ * credentials UI.
+ */
+ public static final int PROFILE_CHALLENGE = 273;
+ public static final int QS_BATTERY_DETAIL = 274;
+
+ /**
+ * Logged when the user goes into the overview history.
+ */
+ public static final int OVERVIEW_HISTORY = 275;
+
+ /**
+ * Logged when the user pages through overview.
+ */
+ public static final int ACTION_OVERVIEW_PAGE = 276;
+
+ /**
+ * Logged when the user launches a task from overview.
+ */
+ public static final int ACTION_OVERVIEW_SELECT = 277;
+
+ /** Logged when the user views the emergency info. */
+ public static final int ACTION_VIEW_EMERGENCY_INFO = 278;
+
+ /** Logged when the user views the edit emergency info activity. */
+ public static final int ACTION_EDIT_EMERGENCY_INFO = 279;
+
+ /** Logged when the user edits an emergency info field. */
+ public static final int ACTION_EDIT_EMERGENCY_INFO_FIELD = 280;
+
+ /** Logged when the user adds a new emergency contact. */
+ public static final int ACTION_ADD_EMERGENCY_CONTACT = 281;
+
+ /** Logged when the user deletes an emergency contact. */
+ public static final int ACTION_DELETE_EMERGENCY_CONTACT = 282;
+
+ /** Logged when the user calls an emergency contact. */
+ public static final int ACTION_CALL_EMERGENCY_CONTACT = 283;
}
diff --git a/core/java/com/android/internal/logging/MetricsLogger.java b/core/java/com/android/internal/logging/MetricsLogger.java
index b0b25d3..183d8d7 100644
--- a/core/java/com/android/internal/logging/MetricsLogger.java
+++ b/core/java/com/android/internal/logging/MetricsLogger.java
@@ -15,69 +15,21 @@
*/
package com.android.internal.logging;
-
import android.content.Context;
import android.os.Build;
import android.view.View;
+import com.android.internal.logging.MetricsProto.MetricsEvent;
+
/**
* Log all the things.
*
* @hide
*/
-public class MetricsLogger implements MetricsConstants {
- // Temporary constants go here, to await migration to MetricsConstants.
- public static final int QS_USER_TILE = 258;
- public static final int QS_BATTERY_TILE = 259;
- public static final int NOTIFICATION_ZEN_MODE_VISUAL_INTERRUPTIONS = 260;
- public static final int ACTION_ZEN_ALLOW_PEEK = 261;
- public static final int ACTION_ZEN_ALLOW_LIGHTS = 262;
- public static final int NOTIFICATION_TOPIC_NOTIFICATION = 263;
- public static final int ACTION_DEFAULT_SMS_APP_CHANGED = 264;
- public static final int QS_COLOR_MATRIX = 265;
- public static final int QS_CUSTOM = 266;
- public static final int ACTION_ZEN_ALLOW_SCREEN_ON = 267;
+public class MetricsLogger implements com.android.internal.logging.MetricsConstants {
+ // define metric categories in frameworks/base/core/proto/src/metrics_constants.proto.
- /**
- * Logged when the user docks a window from recents by longpressing a task and dragging it to
- * the dock area.
- */
- public static final int ACTION_WINDOW_DOCK_DRAG_DROP = 268;
-
- /**
- * Logged when the user docks a fullscreen window by long pressing recents which also opens
- * recents on the lower/right side.
- */
- public static final int ACTION_WINDOW_DOCK_LONGPRESS = 269;
-
- /**
- * Logged when the user docks a window by dragging from the navbar which also opens recents on
- * the lower/right side.
- */
- public static final int ACTION_WINDOW_DOCK_SWIPE = 270;
-
- /**
- * Logged when the user launches a profile-specific app and we intercept it with the confirm
- * credentials UI.
- */
- public static final int PROFILE_CHALLENGE = 271;
- public static final int QS_BATTERY_DETAIL = 272;
-
- /**
- * Logged when the user goes into the overview history.
- */
- public static final int OVERVIEW_HISTORY = 273;
-
- /**
- * Logged when the user pages through overview.
- */
- public static final int ACTION_OVERVIEW_PAGE = 274;
-
- /**
- * Logged when the user launches a task from overview.
- */
- public static final int ACTION_OVERVIEW_SELECT = 275;
-
+ public static final int VIEW_UNKNOWN = MetricsEvent.VIEW_UNKNOWN;
public static void visible(Context context, int category) throws IllegalArgumentException {
if (Build.IS_DEBUGGABLE && category == VIEW_UNKNOWN) {
diff --git a/core/java/com/android/internal/view/BaseIWindow.java b/core/java/com/android/internal/view/BaseIWindow.java
index aa4b564c..7dfc15d 100644
--- a/core/java/com/android/internal/view/BaseIWindow.java
+++ b/core/java/com/android/internal/view/BaseIWindow.java
@@ -86,6 +86,10 @@
}
@Override
+ public void updatePointerIcon(float x, float y) {
+ }
+
+ @Override
public void dispatchSystemUiVisibilityChanged(int seq, int globalUi,
int localValue, int localChanges) {
mSeq = seq;
diff --git a/core/java/com/android/internal/widget/LockPatternUtils.java b/core/java/com/android/internal/widget/LockPatternUtils.java
index 4e8f19c..a1b18fe 100644
--- a/core/java/com/android/internal/widget/LockPatternUtils.java
+++ b/core/java/com/android/internal/widget/LockPatternUtils.java
@@ -136,6 +136,7 @@
private static final String LOCK_SCREEN_DEVICE_OWNER_INFO = "lockscreen.device_owner_info";
private static final String ENABLED_TRUST_AGENTS = "lockscreen.enabledtrustagents";
+ private static final String IS_TRUST_USUALLY_MANAGED = "lockscreen.istrustusuallymanaged";
private static final String SEPARATE_PROFILE_CHALLENGE_KEY = "lockscreen.profilechallenge";
@@ -149,6 +150,30 @@
private ILockSettings mLockSettingsService;
private UserManager mUserManager;
+ /**
+ * Use {@link TrustManager#isTrustUsuallyManaged(int)}.
+ *
+ * This returns the lazily-peristed value and should only be used by TrustManagerService.
+ */
+ public boolean isTrustUsuallyManaged(int userId) {
+ if (!(mLockSettingsService instanceof ILockSettings.Stub)) {
+ throw new IllegalStateException("May only be called by TrustManagerService. "
+ + "Use TrustManager.isTrustUsuallyManaged()");
+ }
+ try {
+ return getLockSettings().getBoolean(IS_TRUST_USUALLY_MANAGED, false, userId);
+ } catch (RemoteException e) {
+ return false;
+ }
+ }
+
+ public void setTrustUsuallyManaged(boolean managed, int userId) {
+ try {
+ getLockSettings().setBoolean(IS_TRUST_USUALLY_MANAGED, managed, userId);
+ } catch (RemoteException e) {
+ // System dead.
+ }
+ }
public static final class RequestThrottledException extends Exception {
private int mTimeoutMs;
diff --git a/core/java/com/android/internal/widget/ScrollBarUtils.java b/core/java/com/android/internal/widget/ScrollBarUtils.java
new file mode 100644
index 0000000..0ae9f74
--- /dev/null
+++ b/core/java/com/android/internal/widget/ScrollBarUtils.java
@@ -0,0 +1,39 @@
+/*
+ * Copyright (C) 2016 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.internal.widget;
+
+public class ScrollBarUtils {
+
+ public static int getThumbLength(int size, int thickness, int extent, int range) {
+ // Avoid the tiny thumb.
+ final int minLength = thickness * 2;
+ int length = Math.round((float) size * extent / range);
+ if (length < minLength) {
+ length = minLength;
+ }
+ return length;
+ }
+
+ public static int getThumbOffset(int size, int thumbLength, int extent, int range, int offset) {
+ // Avoid the too-big thumb.
+ int thumbOffset = Math.round((float) (size - thumbLength) * offset / (range - extent));
+ if (thumbOffset > size - thumbLength) {
+ thumbOffset = size - thumbLength;
+ }
+ return thumbOffset;
+ }
+}
diff --git a/core/jni/android_view_ThreadedRenderer.cpp b/core/jni/android_view_ThreadedRenderer.cpp
index 5aa6a73..edced56 100644
--- a/core/jni/android_view_ThreadedRenderer.cpp
+++ b/core/jni/android_view_ThreadedRenderer.cpp
@@ -28,14 +28,18 @@
#include <EGL/eglext.h>
#include <EGL/egl_cache.h>
+#include <utils/Looper.h>
+#include <utils/RefBase.h>
#include <utils/StrongPointer.h>
#include <android_runtime/android_view_Surface.h>
#include <system/window.h>
#include "android_view_GraphicBuffer.h"
+#include "android_os_MessageQueue.h"
#include <Animator.h>
#include <AnimationContext.h>
+#include <FrameInfo.h>
#include <IContextFactory.h>
#include <JankTracker.h>
#include <RenderNode.h>
@@ -50,6 +54,12 @@
using namespace android::uirenderer;
using namespace android::uirenderer::renderthread;
+struct {
+ jfieldID buffer;
+ jfieldID messageQueue;
+ jmethodID notifyData;
+} gFrameStatsObserverClassInfo;
+
static JNIEnv* getenv(JavaVM* vm) {
JNIEnv* env;
if (vm->GetEnv(reinterpret_cast<void**>(&env), JNI_VERSION_1_6) != JNI_OK) {
@@ -207,6 +217,99 @@
RootRenderNode* mRootNode;
};
+class ObserverProxy;
+
+class NotifyHandler : public MessageHandler {
+public:
+ NotifyHandler(JavaVM* vm) : mVm(vm) {}
+
+ void setObserver(ObserverProxy* observer) {
+ mObserver = observer;
+ }
+
+ void setBuffer(BufferPool::Buffer* buffer) {
+ mBuffer = buffer;
+ }
+
+ virtual void handleMessage(const Message& message);
+
+private:
+ JavaVM* mVm;
+
+ sp<ObserverProxy> mObserver;
+ BufferPool::Buffer* mBuffer;
+};
+
+class ObserverProxy : public FrameStatsObserver {
+public:
+ ObserverProxy(JavaVM *vm, jobject fso) : mVm(vm) {
+ JNIEnv* env = getenv(mVm);
+
+ jlongArray longArrayLocal = env->NewLongArray(kBufferSize);
+ LOG_ALWAYS_FATAL_IF(longArrayLocal == nullptr,
+ "OOM: can't allocate frame stats buffer");
+ env->SetObjectField(fso, gFrameStatsObserverClassInfo.buffer, longArrayLocal);
+
+ mFsoWeak = env->NewWeakGlobalRef(fso);
+ LOG_ALWAYS_FATAL_IF(mFsoWeak == nullptr,
+ "unable to create frame stats observer reference");
+
+ jobject messageQueueLocal =
+ env->GetObjectField(fso, gFrameStatsObserverClassInfo.messageQueue);
+ mMessageQueue = android_os_MessageQueue_getMessageQueue(env, messageQueueLocal);
+ LOG_ALWAYS_FATAL_IF(mMessageQueue == nullptr, "message queue not available");
+
+ mMessageHandler = new NotifyHandler(mVm);
+ LOG_ALWAYS_FATAL_IF(mMessageHandler == nullptr,
+ "OOM: unable to allocate NotifyHandler");
+ }
+
+ ~ObserverProxy() {
+ JNIEnv* env = getenv(mVm);
+ env->DeleteWeakGlobalRef(mFsoWeak);
+ }
+
+ jweak getJavaObjectRef() {
+ return mFsoWeak;
+ }
+
+ virtual void notify(BufferPool::Buffer* buffer) {
+ buffer->incRef();
+ mMessageHandler->setBuffer(buffer);
+ mMessageHandler->setObserver(this);
+ mMessageQueue->getLooper()->sendMessage(mMessageHandler, mMessage);
+ }
+
+private:
+ static const int kBufferSize = static_cast<int>(FrameInfoIndex::NumIndexes);
+
+ JavaVM* mVm;
+ jweak mFsoWeak;
+
+ sp<MessageQueue> mMessageQueue;
+ sp<NotifyHandler> mMessageHandler;
+ Message mMessage;
+};
+
+void NotifyHandler::handleMessage(const Message& message) {
+ JNIEnv* env = getenv(mVm);
+
+ jobject target = env->NewLocalRef(mObserver->getJavaObjectRef());
+
+ if (target != nullptr) {
+ jobject javaBuffer = env->GetObjectField(target, gFrameStatsObserverClassInfo.buffer);
+ if (javaBuffer != nullptr) {
+ env->SetLongArrayRegion(reinterpret_cast<jlongArray>(javaBuffer),
+ 0, mBuffer->getSize(), mBuffer->getBuffer());
+ env->CallVoidMethod(target, gFrameStatsObserverClassInfo.notifyData);
+ env->DeleteLocalRef(target);
+ }
+ }
+
+ mBuffer->release();
+ mObserver.clear();
+}
+
static void android_view_ThreadedRenderer_setAtlas(JNIEnv* env, jobject clazz,
jlong proxyPtr, jobject graphicBuffer, jlongArray atlasMapArray) {
sp<GraphicBuffer> buffer = graphicBufferForJavaObject(env, graphicBuffer);
@@ -468,6 +571,42 @@
}
// ----------------------------------------------------------------------------
+// FrameStatsObserver
+// ----------------------------------------------------------------------------
+
+static jlong android_view_ThreadedRenderer_addFrameStatsObserver(JNIEnv* env,
+ jclass clazz, jlong proxyPtr, jobject fso) {
+ JavaVM* vm = nullptr;
+ if (env->GetJavaVM(&vm) != JNI_OK) {
+ LOG_ALWAYS_FATAL("Unable to get Java VM");
+ return 0;
+ }
+
+ renderthread::RenderProxy* renderProxy =
+ reinterpret_cast<renderthread::RenderProxy*>(proxyPtr);
+
+ FrameStatsObserver* observer = new ObserverProxy(vm, fso);
+ renderProxy->addFrameStatsObserver(observer);
+ return reinterpret_cast<jlong>(observer);
+}
+
+static void android_view_ThreadedRenderer_removeFrameStatsObserver(JNIEnv* env, jclass clazz,
+ jlong proxyPtr, jlong observerPtr) {
+ FrameStatsObserver* observer = reinterpret_cast<FrameStatsObserver*>(observerPtr);
+ renderthread::RenderProxy* renderProxy =
+ reinterpret_cast<renderthread::RenderProxy*>(proxyPtr);
+
+ renderProxy->removeFrameStatsObserver(observer);
+}
+
+static jint android_view_ThreadedRenderer_getDroppedFrameReportCount(JNIEnv* env, jclass clazz,
+ jlong proxyPtr) {
+ renderthread::RenderProxy* renderProxy =
+ reinterpret_cast<renderthread::RenderProxy*>(proxyPtr);
+ return renderProxy->getDroppedFrameReportCount();
+}
+
+// ----------------------------------------------------------------------------
// Shaders
// ----------------------------------------------------------------------------
@@ -523,9 +662,26 @@
{ "nRemoveRenderNode", "(JJ)V", (void*) android_view_ThreadedRenderer_removeRenderNode},
{ "nDrawRenderNode", "(JJ)V", (void*) android_view_ThreadedRendererd_drawRenderNode},
{ "nSetContentDrawBounds", "(JIIII)V", (void*)android_view_ThreadedRenderer_setContentDrawBounds},
+ { "nAddFrameStatsObserver",
+ "(JLandroid/view/FrameStatsObserver;)J",
+ (void*)android_view_ThreadedRenderer_addFrameStatsObserver },
+ { "nRemoveFrameStatsObserver",
+ "(JJ)V",
+ (void*)android_view_ThreadedRenderer_removeFrameStatsObserver },
+ { "nGetDroppedFrameReportCount",
+ "(J)J",
+ (void*)android_view_ThreadedRenderer_getDroppedFrameReportCount },
};
int register_android_view_ThreadedRenderer(JNIEnv* env) {
+ jclass clazz = FindClassOrDie(env, "android/view/FrameStatsObserver");
+ gFrameStatsObserverClassInfo.messageQueue =
+ GetFieldIDOrDie(env, clazz, "mMessageQueue", "Landroid/os/MessageQueue;");
+ gFrameStatsObserverClassInfo.buffer =
+ GetFieldIDOrDie(env, clazz, "mBuffer", "[J");
+ gFrameStatsObserverClassInfo.notifyData =
+ GetMethodIDOrDie(env, clazz, "notifyDataAvailable", "()V");
+
return RegisterMethodsOrDie(env, kClassPathName, gMethods, NELEM(gMethods));
}
diff --git a/core/res/AndroidManifest.xml b/core/res/AndroidManifest.xml
index a82bfbe..3d4b8b4 100644
--- a/core/res/AndroidManifest.xml
+++ b/core/res/AndroidManifest.xml
@@ -339,7 +339,6 @@
<protected-broadcast android:name="android.app.action.DEVICE_OWNER_CHANGED" />
<protected-broadcast android:name="android.intent.action.MANAGED_PROFILE_AVAILABILITY_CHANGED" />
- <protected-broadcast android:name="android.intent.action.AVAILABILITY_CHANGED" />
<!-- Added in N -->
<protected-broadcast android:name="android.intent.action.ANR" />
@@ -3020,6 +3019,12 @@
</intent-filter>
</activity>
+ <activity android:name="com.android.internal.app.UnlaunchableAppActivity"
+ android:theme="@style/Theme.Material.DayNight.Dialog.Alert"
+ android:excludeFromRecents="true"
+ android:process=":ui">
+ </activity>
+
<receiver android:name="com.android.server.BootReceiver"
android:systemUserOnly="true">
<intent-filter android:priority="1000">
diff --git a/core/res/res/drawable-xhdpi/pointer_alias_large.png b/core/res/res/drawable-xhdpi/pointer_alias_large.png
new file mode 100644
index 0000000..813cd2a
--- /dev/null
+++ b/core/res/res/drawable-xhdpi/pointer_alias_large.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/pointer_all_scroll_large.png b/core/res/res/drawable-xhdpi/pointer_all_scroll_large.png
new file mode 100644
index 0000000..f101077
--- /dev/null
+++ b/core/res/res/drawable-xhdpi/pointer_all_scroll_large.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/pointer_arrow_large.png b/core/res/res/drawable-xhdpi/pointer_arrow_large.png
new file mode 100644
index 0000000..0f9165b
--- /dev/null
+++ b/core/res/res/drawable-xhdpi/pointer_arrow_large.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/pointer_cell_large.png b/core/res/res/drawable-xhdpi/pointer_cell_large.png
new file mode 100644
index 0000000..b41f855
--- /dev/null
+++ b/core/res/res/drawable-xhdpi/pointer_cell_large.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/pointer_context_menu_large.png b/core/res/res/drawable-xhdpi/pointer_context_menu_large.png
new file mode 100644
index 0000000..6264e0b
--- /dev/null
+++ b/core/res/res/drawable-xhdpi/pointer_context_menu_large.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/pointer_copy_large.png b/core/res/res/drawable-xhdpi/pointer_copy_large.png
new file mode 100644
index 0000000..5e7f375
--- /dev/null
+++ b/core/res/res/drawable-xhdpi/pointer_copy_large.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/pointer_crosshair_large.png b/core/res/res/drawable-xhdpi/pointer_crosshair_large.png
new file mode 100644
index 0000000..d5f4502
--- /dev/null
+++ b/core/res/res/drawable-xhdpi/pointer_crosshair_large.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/pointer_grab_large.png b/core/res/res/drawable-xhdpi/pointer_grab_large.png
new file mode 100644
index 0000000..bf99b79
--- /dev/null
+++ b/core/res/res/drawable-xhdpi/pointer_grab_large.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/pointer_grabbing_large.png b/core/res/res/drawable-xhdpi/pointer_grabbing_large.png
new file mode 100644
index 0000000..e576bcd
--- /dev/null
+++ b/core/res/res/drawable-xhdpi/pointer_grabbing_large.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/pointer_hand_large.png b/core/res/res/drawable-xhdpi/pointer_hand_large.png
new file mode 100644
index 0000000..76fa09b
--- /dev/null
+++ b/core/res/res/drawable-xhdpi/pointer_hand_large.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/pointer_help_large.png b/core/res/res/drawable-xhdpi/pointer_help_large.png
new file mode 100644
index 0000000..a45f039
--- /dev/null
+++ b/core/res/res/drawable-xhdpi/pointer_help_large.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/pointer_horizontal_double_arrow_large.png b/core/res/res/drawable-xhdpi/pointer_horizontal_double_arrow_large.png
new file mode 100644
index 0000000..9b2a312
--- /dev/null
+++ b/core/res/res/drawable-xhdpi/pointer_horizontal_double_arrow_large.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/pointer_nodrop_large.png b/core/res/res/drawable-xhdpi/pointer_nodrop_large.png
new file mode 100644
index 0000000..f140532
--- /dev/null
+++ b/core/res/res/drawable-xhdpi/pointer_nodrop_large.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/pointer_text_large.png b/core/res/res/drawable-xhdpi/pointer_text_large.png
new file mode 100644
index 0000000..56be154
--- /dev/null
+++ b/core/res/res/drawable-xhdpi/pointer_text_large.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/pointer_top_left_diagonal_double_arrow_large.png b/core/res/res/drawable-xhdpi/pointer_top_left_diagonal_double_arrow_large.png
new file mode 100644
index 0000000..9e6a8b6
--- /dev/null
+++ b/core/res/res/drawable-xhdpi/pointer_top_left_diagonal_double_arrow_large.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/pointer_top_right_diagonal_double_arrow_large.png b/core/res/res/drawable-xhdpi/pointer_top_right_diagonal_double_arrow_large.png
new file mode 100644
index 0000000..2631094c8
--- /dev/null
+++ b/core/res/res/drawable-xhdpi/pointer_top_right_diagonal_double_arrow_large.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/pointer_vertical_double_arrow_large.png b/core/res/res/drawable-xhdpi/pointer_vertical_double_arrow_large.png
new file mode 100644
index 0000000..5ec65e01
--- /dev/null
+++ b/core/res/res/drawable-xhdpi/pointer_vertical_double_arrow_large.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/pointer_vertical_text_large.png b/core/res/res/drawable-xhdpi/pointer_vertical_text_large.png
new file mode 100644
index 0000000..26c46de
--- /dev/null
+++ b/core/res/res/drawable-xhdpi/pointer_vertical_text_large.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/pointer_zoom_in_large.png b/core/res/res/drawable-xhdpi/pointer_zoom_in_large.png
new file mode 100644
index 0000000..c2b845f
--- /dev/null
+++ b/core/res/res/drawable-xhdpi/pointer_zoom_in_large.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/pointer_zoom_out_large.png b/core/res/res/drawable-xhdpi/pointer_zoom_out_large.png
new file mode 100644
index 0000000..148ed25
--- /dev/null
+++ b/core/res/res/drawable-xhdpi/pointer_zoom_out_large.png
Binary files differ
diff --git a/core/res/res/layout/unlaunchable_app_activity.xml b/core/res/res/layout/unlaunchable_app_activity.xml
new file mode 100644
index 0000000..429d5ed
--- /dev/null
+++ b/core/res/res/layout/unlaunchable_app_activity.xml
@@ -0,0 +1,35 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2016 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:padding="@dimen/dialog_padding"
+ android:orientation="vertical">
+ <TextView android:id="@+id/unlaunchable_app_title"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:paddingStart="@dimen/dialog_padding"
+ android:paddingBottom="@dimen/dialog_padding"
+ android:textAppearance="@android:style/TextAppearance.Material.Title" />
+
+ <TextView android:id="@+id/unlaunchable_app_message"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:paddingStart="@dimen/dialog_padding"
+ android:textAppearance="@android:style/TextAppearance.Material.Subhead"
+ android:textColor="?android:attr/textColorSecondary" />
+</LinearLayout>
+
diff --git a/core/res/res/values-af/strings.xml b/core/res/res/values-af/strings.xml
index 463ee0a..eae2c44 100644
--- a/core/res/res/values-af/strings.xml
+++ b/core/res/res/values-af/strings.xml
@@ -211,15 +211,15 @@
<string name="global_action_bug_report" msgid="7934010578922304799">"Foutverslag"</string>
<string name="bugreport_title" msgid="2667494803742548533">"Neem foutverslag"</string>
<string name="bugreport_message" msgid="398447048750350456">"Dit sal inligting oor die huidige toestand van jou toestel insamel om as \'n e-posboodskap te stuur. Dit sal \'n tydjie neem vandat die foutverslag begin is totdat dit reg is om gestuur te word; wees asseblief geduldig."</string>
- <!-- no translation found for bugreport_option_interactive_title (8635056131768862479) -->
+ <string name="bugreport_option_interactive_title" msgid="8635056131768862479">"Interaktiewe verslag"</string>
+ <string name="bugreport_option_interactive_summary" msgid="8180152634022797629">"Gebruik dit in die meeste omstandighede. Maak dit vir jou moontlik om die vordering van die verslag na te spoor en meer besonderhede oor die probleem in te voer. Dit sal dalk sommige afdelings weglaat wat minder gebruik word en waarvoor verslagdoening lank duur."</string>
+ <string name="bugreport_option_full_title" msgid="6354382025840076439">"Volle verslag"</string>
+ <!-- no translation found for bugreport_option_full_summary (6687306111256813257) -->
<skip />
- <!-- no translation found for bugreport_option_interactive_summary (8180152634022797629) -->
- <skip />
- <!-- no translation found for bugreport_option_full_title (6354382025840076439) -->
- <skip />
- <!-- no translation found for bugreport_option_full_summary (6440582052207304578) -->
- <skip />
- <!-- no translation found for bugreport_countdown (6878900193900090368) -->
+ <plurals name="bugreport_countdown" formatted="false" msgid="6878900193900090368">
+ <item quantity="other">Neem skermkiekie vir foutverslag oor <xliff:g id="NUMBER_1">%d</xliff:g> sekondes.</item>
+ <item quantity="one">Neem skermkiekie vir foutverslag oor <xliff:g id="NUMBER_0">%d</xliff:g> sekonde.</item>
+ </plurals>
<string name="global_action_toggle_silent_mode" msgid="8219525344246810925">"Stilmodus"</string>
<string name="global_action_silent_mode_on_status" msgid="3289841937003758806">"Klank is AF"</string>
<string name="global_action_silent_mode_off_status" msgid="1506046579177066419">"Klank is AAN"</string>
@@ -1049,8 +1049,8 @@
<string name="remote_bugreport_progress_notification_message_can_cancel" msgid="5743435483005099451">"Raak om te kanselleer"</string>
<string name="select_input_method" msgid="8547250819326693584">"Verander sleutelbord"</string>
<string name="configure_input_methods" msgid="4769971288371946846">"Kies sleutelborde"</string>
- <string name="show_ime" msgid="9157568568695230830">"Wys invoermetode"</string>
- <string name="hardware" msgid="7517821086888990278">"Hardeware"</string>
+ <string name="show_ime" msgid="2506087537466597099">"Hou dit op die skerm terwyl fisieke sleutelbord aktief is"</string>
+ <string name="hardware" msgid="194658061510127999">"Wys virtuele sleutelbord"</string>
<string name="select_keyboard_layout_notification_title" msgid="1407367017263030773">"Kies sleutelborduitleg"</string>
<string name="select_keyboard_layout_notification_message" msgid="4465907700449257063">"Raak om \'n sleutelborduitleg te kies."</string>
<string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
@@ -1531,4 +1531,10 @@
<string name="user_creation_cannot_add_any_more" msgid="6244197709981359266"><b>"<xliff:g id="APP">%1$s</xliff:g>"</b>" probeer tans om \'n nuwe gebruiker by te voeg, maar die gebruikerlimiet is bereik."</string>
<string name="user_creation_account_exists" msgid="4880171855014489789"><b>"<xliff:g id="APP">%1$s</xliff:g>"</b>" probeer tans om \'n nuwe gebruiker by te voeg, maar die rekening "<b>"<xliff:g id="ACCOUNT">%2$s</xliff:g>"</b>" bestaan reeds op hierdie toestel. Gaan in elk geval voort?"</string>
<string name="user_creation_adding" msgid="3206420861363021392"><b>"<xliff:g id="APP">%1$s</xliff:g>"</b>" probeer tans om \'n nuwe gebruiker vir die rekening "<b>"<xliff:g id="ACCOUNT">%2$s</xliff:g>"</b>" by te voeg. Gaan voort?"</string>
+ <string name="language_selection_title" msgid="7181332986330337171">"Taalvoorkeur"</string>
+ <string name="country_selection_title" msgid="2954859441620215513">"Streekvoorkeur"</string>
+ <string name="search_language_hint" msgid="7042102592055108574">"Voer taalnaam in"</string>
+ <string name="language_picker_section_suggested" msgid="8414489646861640885">"Voorgestel"</string>
+ <string name="language_picker_section_all" msgid="3097279199511617537">"Alle tale"</string>
+ <string name="locale_search_menu" msgid="2560710726687249178">"Soek"</string>
</resources>
diff --git a/core/res/res/values-am/strings.xml b/core/res/res/values-am/strings.xml
index a4b502c..85ef3c5 100644
--- a/core/res/res/values-am/strings.xml
+++ b/core/res/res/values-am/strings.xml
@@ -211,15 +211,15 @@
<string name="global_action_bug_report" msgid="7934010578922304799">"የሳንካ ሪፖርት"</string>
<string name="bugreport_title" msgid="2667494803742548533">"የሳንካ ሪፖርት ውሰድ"</string>
<string name="bugreport_message" msgid="398447048750350456">"ይሄ እንደ የኢሜይል መልዕክት አድርጎ የሚልከውን ስለመሣሪያዎ የአሁኑ ሁኔታ መረጃ ይሰበስባል። የሳንካ ሪፖርቱን ከመጀመር ጀምሮ እስኪላክ ድረስ ትንሽ ጊዜ ይወስዳል፤ እባክዎ ይታገሱ።"</string>
- <!-- no translation found for bugreport_option_interactive_title (8635056131768862479) -->
+ <string name="bugreport_option_interactive_title" msgid="8635056131768862479">"መስተጋብራዊ ሪፖርት"</string>
+ <string name="bugreport_option_interactive_summary" msgid="8180152634022797629">"በአብዛኛዎቹ ሁኔታዎች ይህን ይጠቀሙ። የሪፖርቱን ሂደት እንዲከታተሉ እና ስለችግሩ ተጨማሪ ዝርዝሮችን እንዲያስገቡ ያስችልዎታል። ሪፖርት ለማድረግ በጣም ረዥም ጊዜ የሚወስዱ አንዳንድ ብዙም ጥቅም ላይ የማይውሉ ክፍሎችን ሊያልፋቸው ይችላል።"</string>
+ <string name="bugreport_option_full_title" msgid="6354382025840076439">"ሙሉ ሪፖርት"</string>
+ <!-- no translation found for bugreport_option_full_summary (6687306111256813257) -->
<skip />
- <!-- no translation found for bugreport_option_interactive_summary (8180152634022797629) -->
- <skip />
- <!-- no translation found for bugreport_option_full_title (6354382025840076439) -->
- <skip />
- <!-- no translation found for bugreport_option_full_summary (6440582052207304578) -->
- <skip />
- <!-- no translation found for bugreport_countdown (6878900193900090368) -->
+ <plurals name="bugreport_countdown" formatted="false" msgid="6878900193900090368">
+ <item quantity="one">በ<xliff:g id="NUMBER_1">%d</xliff:g> ሰከንዶች ውስጥ ለሳንካ ሪፖርት ቅጽበታዊ ገጽ ዕይታን በማንሳት ላይ።</item>
+ <item quantity="other">በ<xliff:g id="NUMBER_1">%d</xliff:g> ሰከንዶች ውስጥ ለሳንካ ሪፖርት ቅጽበታዊ ገጽ ዕይታን በማንሳት ላይ።</item>
+ </plurals>
<string name="global_action_toggle_silent_mode" msgid="8219525344246810925">"የፀጥታ ሁነታ"</string>
<string name="global_action_silent_mode_on_status" msgid="3289841937003758806">"ድምፅ ጠፍቷል"</string>
<string name="global_action_silent_mode_off_status" msgid="1506046579177066419">"ድምፅ በርቷል"</string>
@@ -1049,8 +1049,8 @@
<string name="remote_bugreport_progress_notification_message_can_cancel" msgid="5743435483005099451">"ለመሰረዝ ይንኩ"</string>
<string name="select_input_method" msgid="8547250819326693584">"ቁልፍ ሰሌዳ ይቀይሩ"</string>
<string name="configure_input_methods" msgid="4769971288371946846">"ቁልፍ ሰሌዳዎችን ምረጥ"</string>
- <string name="show_ime" msgid="9157568568695230830">"የግቤት ስልት አሳይ"</string>
- <string name="hardware" msgid="7517821086888990278">"ሃርድዌር"</string>
+ <string name="show_ime" msgid="2506087537466597099">"አካላዊ የቁልፍ ሰሌዳ ገቢር ሆኖ ሳለ በማያ ገጽ ላይ አቆየው"</string>
+ <string name="hardware" msgid="194658061510127999">"ምናባዊ የቁልፍ ሰሌዳን አሳይ"</string>
<string name="select_keyboard_layout_notification_title" msgid="1407367017263030773">"የቁልፍ ሰሌዳ አቀማመጥ ምረጥ"</string>
<string name="select_keyboard_layout_notification_message" msgid="4465907700449257063">"የቁልፍ ሰሌዳ አቀማመጥ ለመምረጥ ንካ።"</string>
<string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
@@ -1531,4 +1531,10 @@
<string name="user_creation_cannot_add_any_more" msgid="6244197709981359266"><b>"<xliff:g id="APP">%1$s</xliff:g>"</b>" አዲስ ተጠቃሚ ለማከል እየሞከረ ነው፣ ሆኖም ግን የተጠቃሚ ብዛት ገደብ ላይ ተደርሷል።"</string>
<string name="user_creation_account_exists" msgid="4880171855014489789"><b>"<xliff:g id="APP">%1$s</xliff:g>"</b>" አዲስ ተጠቃሚ ለማከል እየሞከረ ነው፣ ነገር ግን መለያ "<b>"<xliff:g id="ACCOUNT">%2$s</xliff:g>"</b>" አስቀድሞ በዚህ መሣሪያ ላይ አለ። የሆነው ሆኖ ይቀጥል?"</string>
<string name="user_creation_adding" msgid="3206420861363021392"><b>"<xliff:g id="APP">%1$s</xliff:g>"</b>" ለ"<b>"<xliff:g id="ACCOUNT">%2$s</xliff:g>"</b>" መለያ አዲስ ተጠቃሚ ለማከል እየሞከረ ነው። ይቀጥል?"</string>
+ <string name="language_selection_title" msgid="7181332986330337171">"የቋንቋ ምርጫ"</string>
+ <string name="country_selection_title" msgid="2954859441620215513">"የክልል ምርጫ"</string>
+ <string name="search_language_hint" msgid="7042102592055108574">"የቋንቋ ስም ይተይቡ"</string>
+ <string name="language_picker_section_suggested" msgid="8414489646861640885">"የተጠቆሙ"</string>
+ <string name="language_picker_section_all" msgid="3097279199511617537">"ሁሉም ቋንቋዎች"</string>
+ <string name="locale_search_menu" msgid="2560710726687249178">"ፈልግ"</string>
</resources>
diff --git a/core/res/res/values-ar/strings.xml b/core/res/res/values-ar/strings.xml
index ae22ede..bcab357 100644
--- a/core/res/res/values-ar/strings.xml
+++ b/core/res/res/values-ar/strings.xml
@@ -215,15 +215,19 @@
<string name="global_action_bug_report" msgid="7934010578922304799">"تقرير الأخطاء"</string>
<string name="bugreport_title" msgid="2667494803742548533">"إعداد تقرير بالأخطاء"</string>
<string name="bugreport_message" msgid="398447048750350456">"سيجمع هذا معلومات حول حالة جهازك الحالي لإرسالها كرسالة إلكترونية، ولكنه سيستغرق وقتًا قليلاً من بدء عرض تقرير بالأخطاء. وحتى يكون جاهزًا للإرسال، الرجاء الانتظار."</string>
- <!-- no translation found for bugreport_option_interactive_title (8635056131768862479) -->
+ <string name="bugreport_option_interactive_title" msgid="8635056131768862479">"تقرير تفاعلي"</string>
+ <string name="bugreport_option_interactive_summary" msgid="8180152634022797629">"يمكنك استخدام هذا الخيار في معظم الأحيان، حيث يتيح لك إمكانية تتبع مستوى تقدم التقرير والحصول على مزيد من المعلومات حول المشكلة. وقد يتم إسقاط بعض الأقسام الأقل استخدامًا والتي تستغرق وقتًا طويلاً أثناء إعداد التقرير."</string>
+ <string name="bugreport_option_full_title" msgid="6354382025840076439">"تقرير كامل"</string>
+ <!-- no translation found for bugreport_option_full_summary (6687306111256813257) -->
<skip />
- <!-- no translation found for bugreport_option_interactive_summary (8180152634022797629) -->
- <skip />
- <!-- no translation found for bugreport_option_full_title (6354382025840076439) -->
- <skip />
- <!-- no translation found for bugreport_option_full_summary (6440582052207304578) -->
- <skip />
- <!-- no translation found for bugreport_countdown (6878900193900090368) -->
+ <plurals name="bugreport_countdown" formatted="false" msgid="6878900193900090368">
+ <item quantity="zero">سيتم التقاط لقطة شاشة لتقرير الخطأ خلال <xliff:g id="NUMBER_1">%d</xliff:g> ثانية.</item>
+ <item quantity="two">سيتم التقاط لقطة شاشة لتقرير الخطأ خلال ثانيتين (<xliff:g id="NUMBER_1">%d</xliff:g>).</item>
+ <item quantity="few">سيتم التقاط لقطة شاشة لتقرير الخطأ خلال <xliff:g id="NUMBER_1">%d</xliff:g> ثوانٍ.</item>
+ <item quantity="many">سيتم التقاط لقطة شاشة لتقرير الخطأ خلال <xliff:g id="NUMBER_1">%d</xliff:g> ثانية.</item>
+ <item quantity="other">سيتم التقاط لقطة شاشة لتقرير الخطأ خلال <xliff:g id="NUMBER_1">%d</xliff:g> ثانية.</item>
+ <item quantity="one">سيتم التقاط لقطة شاشة لتقرير الخطأ خلال <xliff:g id="NUMBER_0">%d</xliff:g> ثانية.</item>
+ </plurals>
<string name="global_action_toggle_silent_mode" msgid="8219525344246810925">"وضع صامت"</string>
<string name="global_action_silent_mode_on_status" msgid="3289841937003758806">"الصوت متوقف"</string>
<string name="global_action_silent_mode_off_status" msgid="1506046579177066419">"الصوت قيد التشغيل"</string>
@@ -1077,8 +1081,8 @@
<string name="remote_bugreport_progress_notification_message_can_cancel" msgid="5743435483005099451">"المس للإلغاء"</string>
<string name="select_input_method" msgid="8547250819326693584">"تغيير لوحة المفاتيح"</string>
<string name="configure_input_methods" msgid="4769971288371946846">"اختيار لوحات المفاتيح"</string>
- <string name="show_ime" msgid="9157568568695230830">"إظهار طريقة الإدخال"</string>
- <string name="hardware" msgid="7517821086888990278">"أجهزة"</string>
+ <string name="show_ime" msgid="2506087537466597099">"استمرار عرضها على الشاشة أثناء نشاط لوحة المفاتيح الفعلية"</string>
+ <string name="hardware" msgid="194658061510127999">"إظهار لوحة المفاتيح الظاهرية"</string>
<string name="select_keyboard_layout_notification_title" msgid="1407367017263030773">"تحديد تخطيط لوحة مفاتيح"</string>
<string name="select_keyboard_layout_notification_message" msgid="4465907700449257063">"المس لتحديد تخطيط لوحة مفاتيح."</string>
<string name="fast_scroll_alphabet" msgid="5433275485499039199">" أ ب ت ث ج ح خ د ذ ر ز س ش ص ض ط ظ ع غ ف ق ك ل م ن ه و ي"</string>
@@ -1603,4 +1607,10 @@
<string name="user_creation_cannot_add_any_more" msgid="6244197709981359266">"هناك محاولة من "<b>"<xliff:g id="APP">%1$s</xliff:g>"</b>" لإضافة مستخدم جديد إلا أنه قد تم الوصول إلى الحد الأقصى للمستخدمين."</string>
<string name="user_creation_account_exists" msgid="4880171855014489789">"هناك محاولة من "<b>"<xliff:g id="APP">%1$s</xliff:g>"</b>" لإضافة مستخدم جديد إلا أن الحساب "<b>"<xliff:g id="ACCOUNT">%2$s</xliff:g>"</b>" موجود مسبقًا على هذا الجهاز، فهل تريد المتابعة على أي حال؟"</string>
<string name="user_creation_adding" msgid="3206420861363021392">"هناك محاولة من "<b>"<xliff:g id="APP">%1$s</xliff:g>"</b>" لإضافة مستخدم جديد إلى الحساب "<b>"<xliff:g id="ACCOUNT">%2$s</xliff:g>"</b>"، فهل تريد المتابعة؟"</string>
+ <string name="language_selection_title" msgid="7181332986330337171">"تفضيل اللغة"</string>
+ <string name="country_selection_title" msgid="2954859441620215513">"تفضيل المنطقة"</string>
+ <string name="search_language_hint" msgid="7042102592055108574">"اكتب اسم اللغة"</string>
+ <string name="language_picker_section_suggested" msgid="8414489646861640885">"المقترحة"</string>
+ <string name="language_picker_section_all" msgid="3097279199511617537">"جميع اللغات"</string>
+ <string name="locale_search_menu" msgid="2560710726687249178">"البحث"</string>
</resources>
diff --git a/core/res/res/values-az-rAZ/strings.xml b/core/res/res/values-az-rAZ/strings.xml
index b38d303..05ce1c0 100644
--- a/core/res/res/values-az-rAZ/strings.xml
+++ b/core/res/res/values-az-rAZ/strings.xml
@@ -211,15 +211,15 @@
<string name="global_action_bug_report" msgid="7934010578922304799">"Baq hesabatı"</string>
<string name="bugreport_title" msgid="2667494803742548533">"Baqı xəbər verin"</string>
<string name="bugreport_message" msgid="398447048750350456">"Bu, sizin hazırkı cihaz durumu haqqında məlumat toplayacaq ki, elektron məktub şəklində göndərsin. Baq raportuna başlamaq üçün bir az vaxt lazım ola bilər, bir az səbr edin."</string>
- <!-- no translation found for bugreport_option_interactive_title (8635056131768862479) -->
+ <string name="bugreport_option_interactive_title" msgid="8635056131768862479">"İnteraktiv hesabat"</string>
+ <string name="bugreport_option_interactive_summary" msgid="8180152634022797629">"Bir çox hallarda bundan istifadə edin. Bu hesabatın gedişatını izləməyə və problem haqqında daha ətraflı məlumat daxil etməyə imkan verir. Bu, çox vaxt tələb edən bəzi az istifadə olunan bölmələri ixtisar edə bilər."</string>
+ <string name="bugreport_option_full_title" msgid="6354382025840076439">"Tam hesabat"</string>
+ <!-- no translation found for bugreport_option_full_summary (6687306111256813257) -->
<skip />
- <!-- no translation found for bugreport_option_interactive_summary (8180152634022797629) -->
- <skip />
- <!-- no translation found for bugreport_option_full_title (6354382025840076439) -->
- <skip />
- <!-- no translation found for bugreport_option_full_summary (6440582052207304578) -->
- <skip />
- <!-- no translation found for bugreport_countdown (6878900193900090368) -->
+ <plurals name="bugreport_countdown" formatted="false" msgid="6878900193900090368">
+ <item quantity="other">Baq hesabatı üçün <xliff:g id="NUMBER_1">%d</xliff:g> saniyədə sktinşot çəkilir.</item>
+ <item quantity="one">Baq hesabatı üçün <xliff:g id="NUMBER_0">%d</xliff:g> saniyədə skrinşot çəkilir.</item>
+ </plurals>
<string name="global_action_toggle_silent_mode" msgid="8219525344246810925">"Səssiz rejim"</string>
<string name="global_action_silent_mode_on_status" msgid="3289841937003758806">"Səs qapalıdır"</string>
<string name="global_action_silent_mode_off_status" msgid="1506046579177066419">"Səs Aktivdir"</string>
@@ -1049,8 +1049,8 @@
<string name="remote_bugreport_progress_notification_message_can_cancel" msgid="5743435483005099451">"Ləğv etmək üçün toxunun"</string>
<string name="select_input_method" msgid="8547250819326693584">"Klaviaturanı dəyişin"</string>
<string name="configure_input_methods" msgid="4769971288371946846">"Klaviaturaları seçin"</string>
- <string name="show_ime" msgid="9157568568695230830">"Daxiletmə metodunu göstərin"</string>
- <string name="hardware" msgid="7517821086888990278">"Hardware"</string>
+ <string name="show_ime" msgid="2506087537466597099">"Fiziki klaviatura aktiv olduğu halda ekranda saxlayın"</string>
+ <string name="hardware" msgid="194658061510127999">"Virtual klaviaturanı göstərin"</string>
<string name="select_keyboard_layout_notification_title" msgid="1407367017263030773">"Klaviatura sxemi seçin"</string>
<string name="select_keyboard_layout_notification_message" msgid="4465907700449257063">"Klaviatura tərtibatı seçmək üçün toxunun."</string>
<string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCÇDEƏFGĞHXIİJKQLMNOÖPRSŞTUÜVYZ"</string>
@@ -1531,4 +1531,10 @@
<string name="user_creation_cannot_add_any_more" msgid="6244197709981359266"><b>"<xliff:g id="APP">%1$s</xliff:g>"</b>" yeni istifadəçi əlavə etməyə çalışır, lakin istifadəçi limitinə çatılıb."</string>
<string name="user_creation_account_exists" msgid="4880171855014489789"><b>"<xliff:g id="APP">%1$s</xliff:g>"</b>" yeni istifadəçi əlavə etməyə çalışır, lakin "<b>"<xliff:g id="ACCOUNT">%2$s</xliff:g>"</b>" hesabı bu cihazda artıq mövcuddur. Hər bir halda davam edilsin?"</string>
<string name="user_creation_adding" msgid="3206420861363021392"><b>"<xliff:g id="APP">%1$s</xliff:g>"</b>" "<b>"<xliff:g id="ACCOUNT">%2$s</xliff:g>"</b>" hesabı üçün yeni istifadəçi əlavə etməyə çalışır. Davam edilsin?"</string>
+ <string name="language_selection_title" msgid="7181332986330337171">"Dil seçimi"</string>
+ <string name="country_selection_title" msgid="2954859441620215513">"Region seçimi"</string>
+ <string name="search_language_hint" msgid="7042102592055108574">"Dil adını daxil edin"</string>
+ <string name="language_picker_section_suggested" msgid="8414489646861640885">"Təklif edilmiş"</string>
+ <string name="language_picker_section_all" msgid="3097279199511617537">"Bütün dillər"</string>
+ <string name="locale_search_menu" msgid="2560710726687249178">"Axtarın"</string>
</resources>
diff --git a/core/res/res/values-b+sr+Latn/strings.xml b/core/res/res/values-b+sr+Latn/strings.xml
index e69dd9a..7e5106a 100644
--- a/core/res/res/values-b+sr+Latn/strings.xml
+++ b/core/res/res/values-b+sr+Latn/strings.xml
@@ -212,15 +212,16 @@
<string name="global_action_bug_report" msgid="7934010578922304799">"Izveštaj o grešci"</string>
<string name="bugreport_title" msgid="2667494803742548533">"Napravi izveštaj o grešci"</string>
<string name="bugreport_message" msgid="398447048750350456">"Ovim će se prikupiti informacije o trenutnom stanju uređaja kako bi bile poslate u poruci e-pošte. Od započinjanja izveštaja o grešci do trenutka za njegovo slanje proći će neko vreme; budite strpljivi."</string>
- <!-- no translation found for bugreport_option_interactive_title (8635056131768862479) -->
+ <string name="bugreport_option_interactive_title" msgid="8635056131768862479">"Interaktiv. izveštaj"</string>
+ <string name="bugreport_option_interactive_summary" msgid="8180152634022797629">"Koristite ovo u većini slučajeva. To vam omogućava da pratite napredak izveštaja i da unosite dodatne detalje o problemu. Verovatno će izostaviti neke manje korišćene odeljke za koje pravljenje izveštaja dugo traje."</string>
+ <string name="bugreport_option_full_title" msgid="6354382025840076439">"Kompletan izveštaj"</string>
+ <!-- no translation found for bugreport_option_full_summary (6687306111256813257) -->
<skip />
- <!-- no translation found for bugreport_option_interactive_summary (8180152634022797629) -->
- <skip />
- <!-- no translation found for bugreport_option_full_title (6354382025840076439) -->
- <skip />
- <!-- no translation found for bugreport_option_full_summary (6440582052207304578) -->
- <skip />
- <!-- no translation found for bugreport_countdown (6878900193900090368) -->
+ <plurals name="bugreport_countdown" formatted="false" msgid="6878900193900090368">
+ <item quantity="one">Napravićemo snimak ekrana radi izveštaja o grešci za <xliff:g id="NUMBER_1">%d</xliff:g> sekundu.</item>
+ <item quantity="few">Napravićemo snimak ekrana radi izveštaja o grešci za <xliff:g id="NUMBER_1">%d</xliff:g> sekunde.</item>
+ <item quantity="other">Napravićemo snimak ekrana radi izveštaja o grešci za <xliff:g id="NUMBER_1">%d</xliff:g> sekundi.</item>
+ </plurals>
<string name="global_action_toggle_silent_mode" msgid="8219525344246810925">"Nečujni režim"</string>
<string name="global_action_silent_mode_on_status" msgid="3289841937003758806">"Zvuk je ISKLJUČEN"</string>
<string name="global_action_silent_mode_off_status" msgid="1506046579177066419">"Zvuk je UKLJUČEN"</string>
@@ -1056,8 +1057,8 @@
<string name="remote_bugreport_progress_notification_message_can_cancel" msgid="5743435483005099451">"Dodirnite da biste otkazali"</string>
<string name="select_input_method" msgid="8547250819326693584">"Promenite tastaturu"</string>
<string name="configure_input_methods" msgid="4769971288371946846">"Izaberite tastature"</string>
- <string name="show_ime" msgid="9157568568695230830">"Prikazivanje metoda unosa"</string>
- <string name="hardware" msgid="7517821086888990278">"Hardver"</string>
+ <string name="show_ime" msgid="2506087537466597099">"Zadrži ga na ekranu dok je fizička tastatura aktivna"</string>
+ <string name="hardware" msgid="194658061510127999">"Prikaži virtuelnu tastaturu"</string>
<string name="select_keyboard_layout_notification_title" msgid="1407367017263030773">"Izbor rasporeda tastature"</string>
<string name="select_keyboard_layout_notification_message" msgid="4465907700449257063">"Dodirnite da biste izabrali raspored tastature."</string>
<string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
@@ -1549,4 +1550,10 @@
<string name="user_creation_cannot_add_any_more" msgid="6244197709981359266"><b>"<xliff:g id="APP">%1$s</xliff:g>"</b>" pokušava da doda novog korisnika, ali je ograničenje za broj korisnika dostignuto."</string>
<string name="user_creation_account_exists" msgid="4880171855014489789"><b>"<xliff:g id="APP">%1$s</xliff:g>"</b>" pokušava da doda novog korisnika, ali nalog "<b>"<xliff:g id="ACCOUNT">%2$s</xliff:g>"</b>" već postoji na ovom uređaju. Želite li ipak da nastavite?"</string>
<string name="user_creation_adding" msgid="3206420861363021392"><b>"<xliff:g id="APP">%1$s</xliff:g>"</b>" pokušava da doda novog korisnika za nalog "<b>"<xliff:g id="ACCOUNT">%2$s</xliff:g>"</b>". Želite li da nastavite?"</string>
+ <string name="language_selection_title" msgid="7181332986330337171">"Podešavanje jezika"</string>
+ <string name="country_selection_title" msgid="2954859441620215513">"Podešavanje regiona"</string>
+ <string name="search_language_hint" msgid="7042102592055108574">"Unesite naziv jezika"</string>
+ <string name="language_picker_section_suggested" msgid="8414489646861640885">"Predloženi"</string>
+ <string name="language_picker_section_all" msgid="3097279199511617537">"Svi jezici"</string>
+ <string name="locale_search_menu" msgid="2560710726687249178">"Pretraži"</string>
</resources>
diff --git a/core/res/res/values-bg/strings.xml b/core/res/res/values-bg/strings.xml
index d15a738..297d50b 100644
--- a/core/res/res/values-bg/strings.xml
+++ b/core/res/res/values-bg/strings.xml
@@ -211,15 +211,15 @@
<string name="global_action_bug_report" msgid="7934010578922304799">"Сигнал за програмна грешка"</string>
<string name="bugreport_title" msgid="2667494803742548533">"Сигнал за програмна грешка"</string>
<string name="bugreport_message" msgid="398447048750350456">"По този начин ще се събере информация за текущото състояние на устройството ви, която да се изпрати като имейл съобщение. След стартирането на процеса ще мине известно време, докато сигналът за програмна грешка бъде готов за подаване. Моля, имайте търпение."</string>
- <!-- no translation found for bugreport_option_interactive_title (8635056131768862479) -->
+ <string name="bugreport_option_interactive_title" msgid="8635056131768862479">"Интерактивен сигнал"</string>
+ <string name="bugreport_option_interactive_summary" msgid="8180152634022797629">"Използвайте тази опция в повечето случаи. Тя ви позволява да проследявате напредъка на сигнала и да въвеждате още данни за проблема. Възможно е някои по-малко използвани секции, за които подаването на сигнал отнема дълго време, да бъдат пропуснати."</string>
+ <string name="bugreport_option_full_title" msgid="6354382025840076439">"Пълен сигнал"</string>
+ <!-- no translation found for bugreport_option_full_summary (6687306111256813257) -->
<skip />
- <!-- no translation found for bugreport_option_interactive_summary (8180152634022797629) -->
- <skip />
- <!-- no translation found for bugreport_option_full_title (6354382025840076439) -->
- <skip />
- <!-- no translation found for bugreport_option_full_summary (6440582052207304578) -->
- <skip />
- <!-- no translation found for bugreport_countdown (6878900193900090368) -->
+ <plurals name="bugreport_countdown" formatted="false" msgid="6878900193900090368">
+ <item quantity="other">Екранната снимка за сигнала за програмна грешка ще бъде направена след <xliff:g id="NUMBER_1">%d</xliff:g> секунди.</item>
+ <item quantity="one">Екранната снимка за сигнала за програмна грешка ще бъде направена след <xliff:g id="NUMBER_0">%d</xliff:g> секунда.</item>
+ </plurals>
<string name="global_action_toggle_silent_mode" msgid="8219525344246810925">"Тих режим"</string>
<string name="global_action_silent_mode_on_status" msgid="3289841937003758806">"Звукът е ИЗКЛЮЧЕН"</string>
<string name="global_action_silent_mode_off_status" msgid="1506046579177066419">"Звукът е ВКЛЮЧЕН"</string>
@@ -1049,8 +1049,8 @@
<string name="remote_bugreport_progress_notification_message_can_cancel" msgid="5743435483005099451">"Докоснете, за да анулирате"</string>
<string name="select_input_method" msgid="8547250819326693584">"Промяна на клавиатурата"</string>
<string name="configure_input_methods" msgid="4769971288371946846">"Избиране на клавиатури"</string>
- <string name="show_ime" msgid="9157568568695230830">"Метод на въвежд.: Показв."</string>
- <string name="hardware" msgid="7517821086888990278">"Хардуер"</string>
+ <string name="show_ime" msgid="2506087537466597099">"Показване на екрана, докато физическата клавиатура е активна"</string>
+ <string name="hardware" msgid="194658061510127999">"Показване на вирт. клавиатура"</string>
<string name="select_keyboard_layout_notification_title" msgid="1407367017263030773">"Избиране на клавиатурна подредба"</string>
<string name="select_keyboard_layout_notification_message" msgid="4465907700449257063">"Докоснете, за да изберете клавиатурна подредба."</string>
<string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
@@ -1531,4 +1531,10 @@
<string name="user_creation_cannot_add_any_more" msgid="6244197709981359266"><b>"<xliff:g id="APP">%1$s</xliff:g>"</b>" опитва да добави нов потребител, но ограничението за брой потребители е достигнато."</string>
<string name="user_creation_account_exists" msgid="4880171855014489789"><b>"<xliff:g id="APP">%1$s</xliff:g>"</b>" опитва да добави нов потребител, но профилът "<b>"<xliff:g id="ACCOUNT">%2$s</xliff:g>"</b>" вече съществува на устройството. Да се продължи ли въпреки това?"</string>
<string name="user_creation_adding" msgid="3206420861363021392"><b>"<xliff:g id="APP">%1$s</xliff:g>"</b>" опитва да добави нов потребител за профила "<b>"<xliff:g id="ACCOUNT">%2$s</xliff:g>"</b>". Да се продължи ли?"</string>
+ <string name="language_selection_title" msgid="7181332986330337171">"Езиково предпочитание"</string>
+ <string name="country_selection_title" msgid="2954859441620215513">"Предпочитание за региона"</string>
+ <string name="search_language_hint" msgid="7042102592055108574">"Въведете име на език"</string>
+ <string name="language_picker_section_suggested" msgid="8414489646861640885">"Предложени"</string>
+ <string name="language_picker_section_all" msgid="3097279199511617537">"Всички езици"</string>
+ <string name="locale_search_menu" msgid="2560710726687249178">"Търсене"</string>
</resources>
diff --git a/core/res/res/values-bn-rBD/strings.xml b/core/res/res/values-bn-rBD/strings.xml
index bb267f3..b9a1cd8 100644
--- a/core/res/res/values-bn-rBD/strings.xml
+++ b/core/res/res/values-bn-rBD/strings.xml
@@ -211,15 +211,15 @@
<string name="global_action_bug_report" msgid="7934010578922304799">"ত্রুটির প্রতিবেদন"</string>
<string name="bugreport_title" msgid="2667494803742548533">"ত্রুটির প্রতিবেদন করুন"</string>
<string name="bugreport_message" msgid="398447048750350456">"এটি একটি ই-মেল বার্তা পাঠানোর জন্য আপনার ডিভাইসের বর্তমান অবস্থা সম্পর্কে তথ্য সংগ্রহ করবে৷ ত্রুটির প্রতিবেদন শুরুর সময় থেকে এটি পাঠানোর জন্য প্রস্তুত হতে কিছুটা সময় নেবে; দয়া করে ধৈর্য রাখুন৷"</string>
- <!-- no translation found for bugreport_option_interactive_title (8635056131768862479) -->
+ <string name="bugreport_option_interactive_title" msgid="8635056131768862479">"ইন্টারেক্টিভ প্রতিবেদন"</string>
+ <string name="bugreport_option_interactive_summary" msgid="8180152634022797629">"বেশিভাগ পরিস্থিতিতে এটিকে ব্যবহার করুন৷ এটি আপনাকে প্রতিবেদনের কাজ কতটা হয়েছে তার উপর নজর রাখতে দেয় এবং সমস্যাটির সম্পর্কে আরো অনেক কিছু লিখতে দেয়৷ এটি হয়ত প্রতিবেদন করতে খুব বেশি সময় নেয় এমন কম-ব্যবহৃত বিভাগগুলি সরিয়ে দিতে পারে৷"</string>
+ <string name="bugreport_option_full_title" msgid="6354382025840076439">"সম্পূর্ণ প্রতিবেদন"</string>
+ <!-- no translation found for bugreport_option_full_summary (6687306111256813257) -->
<skip />
- <!-- no translation found for bugreport_option_interactive_summary (8180152634022797629) -->
- <skip />
- <!-- no translation found for bugreport_option_full_title (6354382025840076439) -->
- <skip />
- <!-- no translation found for bugreport_option_full_summary (6440582052207304578) -->
- <skip />
- <!-- no translation found for bugreport_countdown (6878900193900090368) -->
+ <plurals name="bugreport_countdown" formatted="false" msgid="6878900193900090368">
+ <item quantity="one"><xliff:g id="NUMBER_1">%d</xliff:g> সেকেন্ডের মধ্যে ত্রুটির প্রতিবেদনের জন্য স্ক্রীনশট নেওয়া হচ্ছে৷</item>
+ <item quantity="other"><xliff:g id="NUMBER_1">%d</xliff:g> সেকেন্ডের মধ্যে ত্রুটির প্রতিবেদনের জন্য স্ক্রীনশট নেওয়া হচ্ছে৷</item>
+ </plurals>
<string name="global_action_toggle_silent_mode" msgid="8219525344246810925">"নীরব মোড"</string>
<string name="global_action_silent_mode_on_status" msgid="3289841937003758806">"শব্দ বন্ধ করা আছে"</string>
<string name="global_action_silent_mode_off_status" msgid="1506046579177066419">"শব্দ চালু করা আছে"</string>
@@ -1049,8 +1049,8 @@
<string name="remote_bugreport_progress_notification_message_can_cancel" msgid="5743435483005099451">"বাতিল করতে স্পর্শ করুন"</string>
<string name="select_input_method" msgid="8547250819326693584">"কীবোর্ড পরিবর্তন করুন"</string>
<string name="configure_input_methods" msgid="4769971288371946846">"কীবোর্ড চয়ন করুন"</string>
- <string name="show_ime" msgid="9157568568695230830">"ইনপুট পদ্ধতি দেখান"</string>
- <string name="hardware" msgid="7517821086888990278">"হার্ডওয়্যার"</string>
+ <string name="show_ime" msgid="2506087537466597099">"ফিজিক্যাল কীবোর্ড সক্রিয় থাকার সময় এটিকে স্ক্রীনে রাখুন"</string>
+ <string name="hardware" msgid="194658061510127999">"ভার্চুয়াল কীবোর্ড দেখান"</string>
<string name="select_keyboard_layout_notification_title" msgid="1407367017263030773">"কীবোর্ডের লেআউট নির্বাচন করুন"</string>
<string name="select_keyboard_layout_notification_message" msgid="4465907700449257063">"একটি কীবোর্ডের লেআউট নির্বাচন করতে স্পর্শ করুন৷"</string>
<string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
@@ -1531,4 +1531,10 @@
<string name="user_creation_cannot_add_any_more" msgid="6244197709981359266"><b>"<xliff:g id="APP">%1$s</xliff:g>"</b>" একজন নতুন ব্যবহারকারী যোগ করার চেষ্টা করছে, তবে ব্যবহারকারীর সীমা অতিক্রান্ত হয়েছে।"</string>
<string name="user_creation_account_exists" msgid="4880171855014489789"><b>"<xliff:g id="APP">%1$s</xliff:g>"</b>" একজন নতুন ব্যবহারকারীকে যোগ করার চেষ্টা করছে, তবে "<b>"<xliff:g id="ACCOUNT">%2$s</xliff:g>"</b>" অ্যাকাউন্ট আগে থেকেই এই ডিভাইসটিতে বিদ্যমান আছে। তবুও এগোতে চান?"</string>
<string name="user_creation_adding" msgid="3206420861363021392"><b>"<xliff:g id="APP">%1$s</xliff:g>"</b>" "<b>"<xliff:g id="ACCOUNT">%2$s</xliff:g>"</b>" অ্যাকাউন্টের জন্য একজন নতুন ব্যবহারকারীকে যোগ করার চেষ্টা করছে। এগোতে চান?"</string>
+ <string name="language_selection_title" msgid="7181332986330337171">"পছন্দের ভাষা"</string>
+ <string name="country_selection_title" msgid="2954859441620215513">"পছন্দের অঞ্চল"</string>
+ <string name="search_language_hint" msgid="7042102592055108574">"ভাষার নাম লিখুন"</string>
+ <string name="language_picker_section_suggested" msgid="8414489646861640885">"প্রস্তাবিত"</string>
+ <string name="language_picker_section_all" msgid="3097279199511617537">"সকল ভাষা"</string>
+ <string name="locale_search_menu" msgid="2560710726687249178">"অনুসন্ধান করুন"</string>
</resources>
diff --git a/core/res/res/values-bs-rBA/strings.xml b/core/res/res/values-bs-rBA/strings.xml
new file mode 100644
index 0000000..6a5ef12
--- /dev/null
+++ b/core/res/res/values-bs-rBA/strings.xml
@@ -0,0 +1,2858 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/* //device/apps/common/assets/res/any/strings.xml
+**
+** Copyright 2006, 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.
+*/
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <!-- no translation found for byteShort (8340973892742019101) -->
+ <skip />
+ <!-- no translation found for kilobyteShort (5973789783504771878) -->
+ <skip />
+ <!-- no translation found for megabyteShort (6355851576770428922) -->
+ <skip />
+ <!-- no translation found for gigabyteShort (3259882455212193214) -->
+ <skip />
+ <!-- no translation found for terabyteShort (231613018159186962) -->
+ <skip />
+ <!-- no translation found for petabyteShort (5637816680144990219) -->
+ <skip />
+ <!-- no translation found for fileSizeSuffix (8897567456150907538) -->
+ <skip />
+ <!-- no translation found for durationDays (6652371460511178259) -->
+ <skip />
+ <!-- no translation found for durationDayHours (2713107458736744435) -->
+ <skip />
+ <!-- no translation found for durationDayHour (7293789639090958917) -->
+ <skip />
+ <!-- no translation found for durationHours (4266858287167358988) -->
+ <skip />
+ <!-- no translation found for durationHourMinutes (9029176248692041549) -->
+ <skip />
+ <!-- no translation found for durationHourMinute (2741677355177402539) -->
+ <skip />
+ <!-- no translation found for durationMinutes (3134226679883579347) -->
+ <skip />
+ <!-- no translation found for durationMinute (7155301744174623818) -->
+ <skip />
+ <!-- no translation found for durationMinuteSeconds (1424656185379003751) -->
+ <skip />
+ <!-- no translation found for durationMinuteSecond (3989228718067466680) -->
+ <skip />
+ <!-- no translation found for durationSeconds (8050088505238241405) -->
+ <skip />
+ <!-- no translation found for durationSecond (985669622276420331) -->
+ <skip />
+ <!-- no translation found for untitled (4638956954852782576) -->
+ <skip />
+ <!-- no translation found for emptyPhoneNumber (7694063042079676517) -->
+ <skip />
+ <!-- no translation found for unknownName (6867811765370350269) -->
+ <skip />
+ <!-- no translation found for defaultVoiceMailAlphaTag (2660020990097733077) -->
+ <skip />
+ <!-- no translation found for defaultMsisdnAlphaTag (2850889754919584674) -->
+ <skip />
+ <!-- no translation found for mmiError (5154499457739052907) -->
+ <skip />
+ <!-- no translation found for mmiFdnError (5224398216385316471) -->
+ <skip />
+ <!-- no translation found for serviceEnabled (8147278346414714315) -->
+ <skip />
+ <!-- no translation found for serviceEnabledFor (6856228140453471041) -->
+ <skip />
+ <!-- no translation found for serviceDisabled (1937553226592516411) -->
+ <skip />
+ <!-- no translation found for serviceRegistered (6275019082598102493) -->
+ <skip />
+ <!-- no translation found for serviceErased (1288584695297200972) -->
+ <skip />
+ <!-- no translation found for passwordIncorrect (7612208839450128715) -->
+ <skip />
+ <!-- no translation found for mmiComplete (8232527495411698359) -->
+ <skip />
+ <!-- no translation found for badPin (9015277645546710014) -->
+ <skip />
+ <!-- no translation found for badPuk (5487257647081132201) -->
+ <skip />
+ <!-- no translation found for mismatchPin (609379054496863419) -->
+ <skip />
+ <!-- no translation found for invalidPin (3850018445187475377) -->
+ <skip />
+ <!-- no translation found for invalidPuk (8761456210898036513) -->
+ <skip />
+ <!-- no translation found for needPuk (919668385956251611) -->
+ <skip />
+ <!-- no translation found for needPuk2 (4526033371987193070) -->
+ <skip />
+ <!-- no translation found for enablePin (209412020907207950) -->
+ <skip />
+ <!-- no translation found for pinpuk_attempts (1251012001539225582) -->
+ <!-- no translation found for imei (2625429890869005782) -->
+ <skip />
+ <!-- no translation found for meid (4841221237681254195) -->
+ <skip />
+ <!-- no translation found for ClipMmi (6952821216480289285) -->
+ <skip />
+ <!-- no translation found for ClirMmi (7784673673446833091) -->
+ <skip />
+ <!-- no translation found for ColpMmi (3065121483740183974) -->
+ <skip />
+ <!-- no translation found for ColrMmi (4996540314421889589) -->
+ <skip />
+ <!-- no translation found for CfMmi (5123218989141573515) -->
+ <skip />
+ <!-- no translation found for CwMmi (9129678056795016867) -->
+ <skip />
+ <!-- no translation found for BaMmi (455193067926770581) -->
+ <skip />
+ <!-- no translation found for PwdMmi (7043715687905254199) -->
+ <skip />
+ <!-- no translation found for PinMmi (3113117780361190304) -->
+ <skip />
+ <!-- no translation found for CnipMmi (3110534680557857162) -->
+ <skip />
+ <!-- no translation found for CnirMmi (3062102121430548731) -->
+ <skip />
+ <!-- no translation found for ThreeWCMmi (9051047170321190368) -->
+ <skip />
+ <!-- no translation found for RuacMmi (7827887459138308886) -->
+ <skip />
+ <!-- no translation found for CndMmi (3116446237081575808) -->
+ <skip />
+ <!-- no translation found for DndMmi (1265478932418334331) -->
+ <skip />
+ <!-- no translation found for CLIRDefaultOnNextCallOn (429415409145781923) -->
+ <skip />
+ <!-- no translation found for CLIRDefaultOnNextCallOff (3092918006077864624) -->
+ <skip />
+ <!-- no translation found for CLIRDefaultOffNextCallOn (6179425182856418465) -->
+ <skip />
+ <!-- no translation found for CLIRDefaultOffNextCallOff (2567998633124408552) -->
+ <skip />
+ <!-- no translation found for serviceNotProvisioned (8614830180508686666) -->
+ <skip />
+ <!-- no translation found for CLIRPermanent (3377371145926835671) -->
+ <skip />
+ <!-- no translation found for RestrictedChangedTitle (5592189398956187498) -->
+ <skip />
+ <!-- no translation found for RestrictedOnData (8653794784690065540) -->
+ <skip />
+ <!-- no translation found for RestrictedOnEmergency (6581163779072833665) -->
+ <skip />
+ <!-- no translation found for RestrictedOnNormal (4953867011389750673) -->
+ <skip />
+ <!-- no translation found for RestrictedOnAllVoice (3396963652108151260) -->
+ <skip />
+ <!-- no translation found for RestrictedOnSms (8314352327461638897) -->
+ <skip />
+ <!-- no translation found for RestrictedOnVoiceData (996636487106171320) -->
+ <skip />
+ <!-- no translation found for RestrictedOnVoiceSms (1888588152792023873) -->
+ <skip />
+ <!-- no translation found for RestrictedOnAll (5643028264466092821) -->
+ <skip />
+ <!-- no translation found for peerTtyModeFull (6165351790010341421) -->
+ <skip />
+ <!-- no translation found for peerTtyModeHco (5728602160669216784) -->
+ <skip />
+ <!-- no translation found for peerTtyModeVco (1742404978686538049) -->
+ <skip />
+ <!-- no translation found for peerTtyModeOff (3280819717850602205) -->
+ <skip />
+ <!-- no translation found for serviceClassVoice (1258393812335258019) -->
+ <skip />
+ <!-- no translation found for serviceClassData (872456782077937893) -->
+ <skip />
+ <!-- no translation found for serviceClassFAX (5566624998840486475) -->
+ <skip />
+ <!-- no translation found for serviceClassSMS (2015460373701527489) -->
+ <skip />
+ <!-- no translation found for serviceClassDataAsync (4523454783498551468) -->
+ <skip />
+ <!-- no translation found for serviceClassDataSync (7530000519646054776) -->
+ <skip />
+ <!-- no translation found for serviceClassPacket (6991006557993423453) -->
+ <skip />
+ <!-- no translation found for serviceClassPAD (3235259085648271037) -->
+ <skip />
+ <!-- no translation found for roamingText0 (7170335472198694945) -->
+ <skip />
+ <!-- no translation found for roamingText1 (5314861519752538922) -->
+ <skip />
+ <!-- no translation found for roamingText2 (8969929049081268115) -->
+ <skip />
+ <!-- no translation found for roamingText3 (5148255027043943317) -->
+ <skip />
+ <!-- no translation found for roamingText4 (8808456682550796530) -->
+ <skip />
+ <!-- no translation found for roamingText5 (7604063252850354350) -->
+ <skip />
+ <!-- no translation found for roamingText6 (2059440825782871513) -->
+ <skip />
+ <!-- no translation found for roamingText7 (7112078724097233605) -->
+ <skip />
+ <!-- no translation found for roamingText8 (5989569778604089291) -->
+ <skip />
+ <!-- no translation found for roamingText9 (7969296811355152491) -->
+ <skip />
+ <!-- no translation found for roamingText10 (3992906999815316417) -->
+ <skip />
+ <!-- no translation found for roamingText11 (4154476854426920970) -->
+ <skip />
+ <!-- no translation found for roamingText12 (1189071119992726320) -->
+ <skip />
+ <!-- no translation found for roamingTextSearching (8360141885972279963) -->
+ <skip />
+ <!-- no translation found for wfcRegErrorTitle (2301376280632110664) -->
+ <skip />
+ <string-array name="wfcOperatorErrorAlertMessages">
+ </string-array>
+ <string-array name="wfcOperatorErrorNotificationMessages">
+ </string-array>
+ <!-- no translation found for wfcSpnFormat (8211621332478306568) -->
+ <skip />
+ <!-- no translation found for wfcDataSpnFormat (1118052028767666883) -->
+ <skip />
+ <!-- no translation found for wifi_calling_off_summary (8720659586041656098) -->
+ <skip />
+ <!-- no translation found for wfc_mode_wifi_preferred_summary (1994113411286935263) -->
+ <skip />
+ <!-- no translation found for wfc_mode_cellular_preferred_summary (5920549484600758786) -->
+ <skip />
+ <!-- no translation found for wfc_mode_wifi_only_summary (2379919155237869320) -->
+ <skip />
+ <!-- no translation found for cfTemplateNotForwarded (1683685883841272560) -->
+ <skip />
+ <!-- no translation found for cfTemplateForwarded (1302922117498590521) -->
+ <skip />
+ <!-- no translation found for cfTemplateForwardedTime (9206251736527085256) -->
+ <skip />
+ <!-- no translation found for cfTemplateRegistered (5073237827620166285) -->
+ <skip />
+ <!-- no translation found for cfTemplateRegisteredTime (6781621964320635172) -->
+ <skip />
+ <!-- no translation found for fcComplete (3118848230966886575) -->
+ <skip />
+ <!-- no translation found for fcError (3327560126588500777) -->
+ <skip />
+ <!-- no translation found for httpErrorOk (1191919378083472204) -->
+ <skip />
+ <!-- no translation found for httpError (7956392511146698522) -->
+ <skip />
+ <!-- no translation found for httpErrorLookup (4711687456111963163) -->
+ <skip />
+ <!-- no translation found for httpErrorUnsupportedAuthScheme (6299980280442076799) -->
+ <skip />
+ <!-- no translation found for httpErrorAuth (1435065629438044534) -->
+ <skip />
+ <!-- no translation found for httpErrorProxyAuth (1788207010559081331) -->
+ <skip />
+ <!-- no translation found for httpErrorConnect (8714273236364640549) -->
+ <skip />
+ <!-- no translation found for httpErrorIO (2340558197489302188) -->
+ <skip />
+ <!-- no translation found for httpErrorTimeout (4743403703762883954) -->
+ <skip />
+ <!-- no translation found for httpErrorRedirectLoop (8679596090392779516) -->
+ <skip />
+ <!-- no translation found for httpErrorUnsupportedScheme (5015730812906192208) -->
+ <skip />
+ <!-- no translation found for httpErrorFailedSslHandshake (96549606000658641) -->
+ <skip />
+ <!-- no translation found for httpErrorBadUrl (3636929722728881972) -->
+ <skip />
+ <!-- no translation found for httpErrorFile (2170788515052558676) -->
+ <skip />
+ <!-- no translation found for httpErrorFileNotFound (6203856612042655084) -->
+ <skip />
+ <!-- no translation found for httpErrorTooManyRequests (1235396927087188253) -->
+ <skip />
+ <!-- no translation found for notification_title (8967710025036163822) -->
+ <skip />
+ <!-- no translation found for contentServiceSync (8353523060269335667) -->
+ <skip />
+ <!-- no translation found for contentServiceSyncNotificationTitle (397743349191901458) -->
+ <skip />
+ <!-- no translation found for contentServiceTooManyDeletesNotificationDesc (8100981435080696431) -->
+ <skip />
+ <!-- no translation found for low_memory (6494019234102154896) -->
+ <skip />
+ <!-- no translation found for low_memory (4415914910770005166) -->
+ <skip />
+ <!-- no translation found for low_memory (516619861191025923) -->
+ <skip />
+ <!-- no translation found for low_memory (3475999286680000541) -->
+ <skip />
+ <!-- no translation found for ssl_ca_cert_warning (5848402127455021714) -->
+ <skip />
+ <!-- no translation found for ssl_ca_cert_noti_by_unknown (4475437862189850602) -->
+ <skip />
+ <!-- no translation found for ssl_ca_cert_noti_by_administrator (550758088185764312) -->
+ <skip />
+ <!-- no translation found for ssl_ca_cert_noti_managed (4030263497686867141) -->
+ <skip />
+ <!-- no translation found for work_profile_deleted (5005572078641980632) -->
+ <skip />
+ <!-- no translation found for work_profile_deleted_description (6305147513054341102) -->
+ <skip />
+ <!-- no translation found for work_profile_deleted_details (226615743462361248) -->
+ <skip />
+ <!-- no translation found for work_profile_deleted_description_dpm_wipe (6019770344820507579) -->
+ <skip />
+ <!-- no translation found for factory_reset_warning (5423253125642394387) -->
+ <skip />
+ <!-- no translation found for factory_reset_message (4905025204141900666) -->
+ <skip />
+ <!-- no translation found for me (6545696007631404292) -->
+ <skip />
+ <!-- no translation found for power_dialog (8545351420865202853) -->
+ <skip />
+ <!-- no translation found for power_dialog (6153888706430556356) -->
+ <skip />
+ <!-- no translation found for power_dialog (1319919075463988638) -->
+ <skip />
+ <!-- no translation found for silent_mode (7167703389802618663) -->
+ <skip />
+ <!-- no translation found for turn_on_radio (3912793092339962371) -->
+ <skip />
+ <!-- no translation found for turn_off_radio (8198784949987062346) -->
+ <skip />
+ <!-- no translation found for screen_lock (799094655496098153) -->
+ <skip />
+ <!-- no translation found for power_off (4266614107412865048) -->
+ <skip />
+ <!-- no translation found for silent_mode_silent (319298163018473078) -->
+ <skip />
+ <!-- no translation found for silent_mode_vibrate (7072043388581551395) -->
+ <skip />
+ <!-- no translation found for silent_mode_ring (8592241816194074353) -->
+ <skip />
+ <!-- no translation found for reboot_to_update_title (6212636802536823850) -->
+ <skip />
+ <!-- no translation found for reboot_to_update_prepare (6305853831955310890) -->
+ <skip />
+ <!-- no translation found for reboot_to_update_package (3871302324500927291) -->
+ <skip />
+ <!-- no translation found for reboot_to_update_reboot (6428441000951565185) -->
+ <skip />
+ <!-- no translation found for reboot_to_reset_title (4142355915340627490) -->
+ <skip />
+ <!-- no translation found for reboot_to_reset_message (2432077491101416345) -->
+ <skip />
+ <!-- no translation found for shutdown_progress (2281079257329981203) -->
+ <skip />
+ <!-- no translation found for shutdown_confirm (3385745179555731470) -->
+ <skip />
+ <!-- no translation found for shutdown_confirm (476672373995075359) -->
+ <skip />
+ <!-- no translation found for shutdown_confirm (3490275567476369184) -->
+ <skip />
+ <!-- no translation found for shutdown_confirm (649792175242821353) -->
+ <skip />
+ <!-- no translation found for shutdown_confirm_question (2906544768881136183) -->
+ <skip />
+ <!-- no translation found for reboot_safemode_title (7054509914500140361) -->
+ <skip />
+ <!-- no translation found for reboot_safemode_confirm (55293944502784668) -->
+ <skip />
+ <!-- no translation found for recent_tasks_title (3691764623638127888) -->
+ <skip />
+ <!-- no translation found for no_recent_tasks (8794906658732193473) -->
+ <skip />
+ <!-- no translation found for global_actions (408477140088053665) -->
+ <skip />
+ <!-- no translation found for global_actions (7240386462508182976) -->
+ <skip />
+ <!-- no translation found for global_actions (2406416831541615258) -->
+ <skip />
+ <!-- no translation found for global_action_lock (2844945191792119712) -->
+ <skip />
+ <!-- no translation found for global_action_power_off (4471879440839879722) -->
+ <skip />
+ <!-- no translation found for global_action_bug_report (7934010578922304799) -->
+ <skip />
+ <!-- no translation found for bugreport_title (2667494803742548533) -->
+ <skip />
+ <!-- no translation found for bugreport_message (398447048750350456) -->
+ <skip />
+ <!-- no translation found for bugreport_option_interactive_title (8635056131768862479) -->
+ <skip />
+ <!-- no translation found for bugreport_option_interactive_summary (8180152634022797629) -->
+ <skip />
+ <!-- no translation found for bugreport_option_full_title (6354382025840076439) -->
+ <skip />
+ <!-- no translation found for bugreport_option_full_summary (6687306111256813257) -->
+ <skip />
+ <!-- no translation found for bugreport_countdown (6878900193900090368) -->
+ <!-- no translation found for global_action_toggle_silent_mode (8219525344246810925) -->
+ <skip />
+ <!-- no translation found for global_action_silent_mode_on_status (3289841937003758806) -->
+ <skip />
+ <!-- no translation found for global_action_silent_mode_off_status (1506046579177066419) -->
+ <skip />
+ <!-- no translation found for global_actions_toggle_airplane_mode (5884330306926307456) -->
+ <skip />
+ <!-- no translation found for global_actions_airplane_mode_on_status (2719557982608919750) -->
+ <skip />
+ <!-- no translation found for global_actions_airplane_mode_off_status (5075070442854490296) -->
+ <skip />
+ <!-- no translation found for global_action_settings (1756531602592545966) -->
+ <skip />
+ <!-- no translation found for global_action_assist (3892832961594295030) -->
+ <skip />
+ <!-- no translation found for global_action_voice_assist (7751191495200504480) -->
+ <skip />
+ <!-- no translation found for global_action_lockdown (8751542514724332873) -->
+ <skip />
+ <!-- no translation found for status_bar_notification_info_overflow (5301981741705354993) -->
+ <skip />
+ <!-- no translation found for notification_children_count_bracketed (1769425473168347839) -->
+ <skip />
+ <!-- no translation found for notification_hidden_text (1135169301897151909) -->
+ <skip />
+ <!-- no translation found for safeMode (2788228061547930246) -->
+ <skip />
+ <!-- no translation found for android_system_label (6577375335728551336) -->
+ <skip />
+ <!-- no translation found for user_owner_label (2804351898001038951) -->
+ <skip />
+ <!-- no translation found for managed_profile_label (6260850669674791528) -->
+ <skip />
+ <!-- no translation found for permgrouplab_contacts (3657758145679177612) -->
+ <skip />
+ <!-- no translation found for permgroupdesc_contacts (6951499528303668046) -->
+ <skip />
+ <!-- no translation found for permgrouplab_location (7275582855722310164) -->
+ <skip />
+ <!-- no translation found for permgroupdesc_location (1346617465127855033) -->
+ <skip />
+ <!-- no translation found for permgrouplab_calendar (5863508437783683902) -->
+ <skip />
+ <!-- no translation found for permgroupdesc_calendar (3889615280211184106) -->
+ <skip />
+ <!-- no translation found for permgrouplab_sms (228308803364967808) -->
+ <skip />
+ <!-- no translation found for permgroupdesc_sms (4656988620100940350) -->
+ <skip />
+ <!-- no translation found for permgrouplab_storage (1971118770546336966) -->
+ <skip />
+ <!-- no translation found for permgroupdesc_storage (637758554581589203) -->
+ <skip />
+ <!-- no translation found for permgrouplab_microphone (171539900250043464) -->
+ <skip />
+ <!-- no translation found for permgroupdesc_microphone (4988812113943554584) -->
+ <skip />
+ <!-- no translation found for permgrouplab_camera (4820372495894586615) -->
+ <skip />
+ <!-- no translation found for permgroupdesc_camera (3250611594678347720) -->
+ <skip />
+ <!-- no translation found for permgrouplab_phone (5229115638567440675) -->
+ <skip />
+ <!-- no translation found for permgroupdesc_phone (6234224354060641055) -->
+ <skip />
+ <!-- no translation found for permgrouplab_sensors (416037179223226722) -->
+ <skip />
+ <!-- no translation found for permgroupdesc_sensors (7147968539346634043) -->
+ <skip />
+ <!-- no translation found for capability_title_canRetrieveWindowContent (3901717936930170320) -->
+ <skip />
+ <!-- no translation found for capability_desc_canRetrieveWindowContent (3772225008605310672) -->
+ <skip />
+ <!-- no translation found for capability_title_canRequestTouchExploration (3108723364676667320) -->
+ <skip />
+ <!-- no translation found for capability_desc_canRequestTouchExploration (5800552516779249356) -->
+ <skip />
+ <!-- no translation found for capability_title_canRequestEnhancedWebAccessibility (1739881766522594073) -->
+ <skip />
+ <!-- no translation found for capability_desc_canRequestEnhancedWebAccessibility (7881063961507511765) -->
+ <skip />
+ <!-- no translation found for capability_title_canRequestFilterKeyEvents (2103440391902412174) -->
+ <skip />
+ <!-- no translation found for capability_desc_canRequestFilterKeyEvents (7463135292204152818) -->
+ <skip />
+ <!-- no translation found for capability_title_canControlMagnification (3593493281059424855) -->
+ <skip />
+ <!-- no translation found for capability_desc_canControlMagnification (4791858203568383773) -->
+ <skip />
+ <!-- no translation found for capability_title_canPerformGestures (7418984730362576862) -->
+ <skip />
+ <!-- no translation found for capability_desc_canPerformGestures (8296373021636981249) -->
+ <skip />
+ <!-- no translation found for permlab_statusBar (7417192629601890791) -->
+ <skip />
+ <!-- no translation found for permdesc_statusBar (8434669549504290975) -->
+ <skip />
+ <!-- no translation found for permlab_statusBarService (4826835508226139688) -->
+ <skip />
+ <!-- no translation found for permdesc_statusBarService (716113660795976060) -->
+ <skip />
+ <!-- no translation found for permlab_expandStatusBar (1148198785937489264) -->
+ <skip />
+ <!-- no translation found for permdesc_expandStatusBar (6917549437129401132) -->
+ <skip />
+ <!-- no translation found for permlab_install_shortcut (4279070216371564234) -->
+ <skip />
+ <!-- no translation found for permdesc_install_shortcut (8341295916286736996) -->
+ <skip />
+ <!-- no translation found for permlab_uninstall_shortcut (4729634524044003699) -->
+ <skip />
+ <!-- no translation found for permdesc_uninstall_shortcut (6745743474265057975) -->
+ <skip />
+ <!-- no translation found for permlab_processOutgoingCalls (3906007831192990946) -->
+ <skip />
+ <!-- no translation found for permdesc_processOutgoingCalls (5156385005547315876) -->
+ <skip />
+ <!-- no translation found for permlab_receiveSms (8673471768947895082) -->
+ <skip />
+ <!-- no translation found for permdesc_receiveSms (6424387754228766939) -->
+ <skip />
+ <!-- no translation found for permlab_receiveMms (1821317344668257098) -->
+ <skip />
+ <!-- no translation found for permdesc_receiveMms (533019437263212260) -->
+ <skip />
+ <!-- no translation found for permlab_readCellBroadcasts (1598328843619646166) -->
+ <skip />
+ <!-- no translation found for permdesc_readCellBroadcasts (6361972776080458979) -->
+ <skip />
+ <!-- no translation found for permlab_subscribedFeedsRead (4756609637053353318) -->
+ <skip />
+ <!-- no translation found for permdesc_subscribedFeedsRead (5557058907906144505) -->
+ <skip />
+ <!-- no translation found for permlab_sendSms (7544599214260982981) -->
+ <skip />
+ <!-- no translation found for permdesc_sendSms (7094729298204937667) -->
+ <skip />
+ <!-- no translation found for permlab_readSms (8745086572213270480) -->
+ <skip />
+ <!-- no translation found for permdesc_readSms (2467981548684735522) -->
+ <skip />
+ <!-- no translation found for permdesc_readSms (5102425513647038535) -->
+ <skip />
+ <!-- no translation found for permdesc_readSms (3695967533457240550) -->
+ <skip />
+ <!-- no translation found for permlab_receiveWapPush (5991398711936590410) -->
+ <skip />
+ <!-- no translation found for permdesc_receiveWapPush (748232190220583385) -->
+ <skip />
+ <!-- no translation found for permlab_getTasks (6466095396623933906) -->
+ <skip />
+ <!-- no translation found for permdesc_getTasks (7454215995847658102) -->
+ <skip />
+ <!-- no translation found for permlab_manageProfileAndDeviceOwners (7918181259098220004) -->
+ <skip />
+ <!-- no translation found for permdesc_manageProfileAndDeviceOwners (106894851498657169) -->
+ <skip />
+ <!-- no translation found for permlab_reorderTasks (2018575526934422779) -->
+ <skip />
+ <!-- no translation found for permdesc_reorderTasks (7734217754877439351) -->
+ <skip />
+ <!-- no translation found for permlab_enableCarMode (5684504058192921098) -->
+ <skip />
+ <!-- no translation found for permdesc_enableCarMode (4853187425751419467) -->
+ <skip />
+ <!-- no translation found for permlab_killBackgroundProcesses (3914026687420177202) -->
+ <skip />
+ <!-- no translation found for permdesc_killBackgroundProcesses (4593353235959733119) -->
+ <skip />
+ <!-- no translation found for permlab_systemAlertWindow (3543347980839518613) -->
+ <skip />
+ <!-- no translation found for permdesc_systemAlertWindow (8584678381972820118) -->
+ <skip />
+ <!-- no translation found for permlab_persistentActivity (8841113627955563938) -->
+ <skip />
+ <!-- no translation found for permdesc_persistentActivity (8525189272329086137) -->
+ <skip />
+ <!-- no translation found for permdesc_persistentActivity (5086862529499103587) -->
+ <skip />
+ <!-- no translation found for permdesc_persistentActivity (4384760047508278272) -->
+ <skip />
+ <!-- no translation found for permlab_getPackageSize (7472921768357981986) -->
+ <skip />
+ <!-- no translation found for permdesc_getPackageSize (3921068154420738296) -->
+ <skip />
+ <!-- no translation found for permlab_writeSettings (2226195290955224730) -->
+ <skip />
+ <!-- no translation found for permdesc_writeSettings (7775723441558907181) -->
+ <skip />
+ <!-- no translation found for permlab_receiveBootCompleted (5312965565987800025) -->
+ <skip />
+ <!-- no translation found for permdesc_receiveBootCompleted (7390304664116880704) -->
+ <skip />
+ <!-- no translation found for permdesc_receiveBootCompleted (4525890122209673621) -->
+ <skip />
+ <!-- no translation found for permdesc_receiveBootCompleted (513950589102617504) -->
+ <skip />
+ <!-- no translation found for permlab_broadcastSticky (7919126372606881614) -->
+ <skip />
+ <!-- no translation found for permdesc_broadcastSticky (7749760494399915651) -->
+ <skip />
+ <!-- no translation found for permdesc_broadcastSticky (6839285697565389467) -->
+ <skip />
+ <!-- no translation found for permdesc_broadcastSticky (2825803764232445091) -->
+ <skip />
+ <!-- no translation found for permlab_readContacts (8348481131899886131) -->
+ <skip />
+ <!-- no translation found for permdesc_readContacts (5294866856941149639) -->
+ <skip />
+ <!-- no translation found for permdesc_readContacts (1839238344654834087) -->
+ <skip />
+ <!-- no translation found for permdesc_readContacts (8440654152457300662) -->
+ <skip />
+ <!-- no translation found for permlab_writeContacts (5107492086416793544) -->
+ <skip />
+ <!-- no translation found for permdesc_writeContacts (897243932521953602) -->
+ <skip />
+ <!-- no translation found for permdesc_writeContacts (5438230957000018959) -->
+ <skip />
+ <!-- no translation found for permdesc_writeContacts (589869224625163558) -->
+ <skip />
+ <!-- no translation found for permlab_readCallLog (3478133184624102739) -->
+ <skip />
+ <!-- no translation found for permdesc_readCallLog (3700645184870760285) -->
+ <skip />
+ <!-- no translation found for permdesc_readCallLog (5611770887047387926) -->
+ <skip />
+ <!-- no translation found for permdesc_readCallLog (5777725796813217244) -->
+ <skip />
+ <!-- no translation found for permlab_writeCallLog (8552045664743499354) -->
+ <skip />
+ <!-- no translation found for permdesc_writeCallLog (6661806062274119245) -->
+ <skip />
+ <!-- no translation found for permdesc_writeCallLog (4225034892248398019) -->
+ <skip />
+ <!-- no translation found for permdesc_writeCallLog (683941736352787842) -->
+ <skip />
+ <!-- no translation found for permlab_bodySensors (4683341291818520277) -->
+ <skip />
+ <!-- no translation found for permdesc_bodySensors (4380015021754180431) -->
+ <skip />
+ <!-- no translation found for permlab_readCalendar (5972727560257612398) -->
+ <skip />
+ <!-- no translation found for permdesc_readCalendar (4216462049057658723) -->
+ <skip />
+ <!-- no translation found for permdesc_readCalendar (3191352452242394196) -->
+ <skip />
+ <!-- no translation found for permdesc_readCalendar (7434548682470851583) -->
+ <skip />
+ <!-- no translation found for permlab_writeCalendar (8438874755193825647) -->
+ <skip />
+ <!-- no translation found for permdesc_writeCalendar (6679035520113668528) -->
+ <skip />
+ <!-- no translation found for permdesc_writeCalendar (1273290605500902507) -->
+ <skip />
+ <!-- no translation found for permdesc_writeCalendar (2324469496327249376) -->
+ <skip />
+ <!-- no translation found for permlab_accessLocationExtraCommands (2836308076720553837) -->
+ <skip />
+ <!-- no translation found for permdesc_accessLocationExtraCommands (6078307221056649927) -->
+ <skip />
+ <!-- no translation found for permlab_accessFineLocation (251034415460950944) -->
+ <skip />
+ <!-- no translation found for permdesc_accessFineLocation (5295047563564981250) -->
+ <skip />
+ <!-- no translation found for permlab_accessCoarseLocation (7715277613928539434) -->
+ <skip />
+ <!-- no translation found for permdesc_accessCoarseLocation (2538200184373302295) -->
+ <skip />
+ <!-- no translation found for permlab_modifyAudioSettings (6095859937069146086) -->
+ <skip />
+ <!-- no translation found for permdesc_modifyAudioSettings (3522565366806248517) -->
+ <skip />
+ <!-- no translation found for permlab_recordAudio (3876049771427466323) -->
+ <skip />
+ <!-- no translation found for permdesc_recordAudio (4906839301087980680) -->
+ <skip />
+ <!-- no translation found for permlab_sim_communication (2935852302216852065) -->
+ <skip />
+ <!-- no translation found for permdesc_sim_communication (5725159654279639498) -->
+ <skip />
+ <!-- no translation found for permlab_camera (3616391919559751192) -->
+ <skip />
+ <!-- no translation found for permdesc_camera (8497216524735535009) -->
+ <skip />
+ <!-- no translation found for permlab_vibrate (7696427026057705834) -->
+ <skip />
+ <!-- no translation found for permdesc_vibrate (6284989245902300945) -->
+ <skip />
+ <!-- no translation found for permlab_callPhone (3925836347681847954) -->
+ <skip />
+ <!-- no translation found for permdesc_callPhone (3740797576113760827) -->
+ <skip />
+ <!-- no translation found for permlab_accessImsCallService (3574943847181793918) -->
+ <skip />
+ <!-- no translation found for permdesc_accessImsCallService (8992884015198298775) -->
+ <skip />
+ <!-- no translation found for permlab_readPhoneState (9178228524507610486) -->
+ <skip />
+ <!-- no translation found for permdesc_readPhoneState (1639212771826125528) -->
+ <skip />
+ <!-- no translation found for permlab_wakeLock (1531731435011495015) -->
+ <skip />
+ <!-- no translation found for permlab_wakeLock (2601193288949154131) -->
+ <skip />
+ <!-- no translation found for permlab_wakeLock (573480187941496130) -->
+ <skip />
+ <!-- no translation found for permdesc_wakeLock (7311319824400447868) -->
+ <skip />
+ <!-- no translation found for permdesc_wakeLock (3208534859208996974) -->
+ <skip />
+ <!-- no translation found for permdesc_wakeLock (8559100677372928754) -->
+ <skip />
+ <!-- no translation found for permlab_transmitIr (7545858504238530105) -->
+ <skip />
+ <!-- no translation found for permdesc_transmitIr (5358308854306529170) -->
+ <skip />
+ <!-- no translation found for permdesc_transmitIr (3926790828514867101) -->
+ <skip />
+ <!-- no translation found for permdesc_transmitIr (7957763745020300725) -->
+ <skip />
+ <!-- no translation found for permlab_setWallpaper (6627192333373465143) -->
+ <skip />
+ <!-- no translation found for permdesc_setWallpaper (7373447920977624745) -->
+ <skip />
+ <!-- no translation found for permlab_setWallpaperHints (3278608165977736538) -->
+ <skip />
+ <!-- no translation found for permdesc_setWallpaperHints (8235784384223730091) -->
+ <skip />
+ <!-- no translation found for permlab_setTimeZone (2945079801013077340) -->
+ <skip />
+ <!-- no translation found for permdesc_setTimeZone (1676983712315827645) -->
+ <skip />
+ <!-- no translation found for permdesc_setTimeZone (888864653946175955) -->
+ <skip />
+ <!-- no translation found for permdesc_setTimeZone (4499943488436633398) -->
+ <skip />
+ <!-- no translation found for permlab_getAccounts (1086795467760122114) -->
+ <skip />
+ <!-- no translation found for permdesc_getAccounts (2741496534769660027) -->
+ <skip />
+ <!-- no translation found for permdesc_getAccounts (4190633395633907543) -->
+ <skip />
+ <!-- no translation found for permdesc_getAccounts (3448316822451807382) -->
+ <skip />
+ <!-- no translation found for permlab_accessNetworkState (4951027964348974773) -->
+ <skip />
+ <!-- no translation found for permdesc_accessNetworkState (8318964424675960975) -->
+ <skip />
+ <!-- no translation found for permlab_createNetworkSockets (7934516631384168107) -->
+ <skip />
+ <!-- no translation found for permdesc_createNetworkSockets (3403062187779724185) -->
+ <skip />
+ <!-- no translation found for permlab_changeNetworkState (958884291454327309) -->
+ <skip />
+ <!-- no translation found for permdesc_changeNetworkState (6789123912476416214) -->
+ <skip />
+ <!-- no translation found for permlab_changeTetherState (5952584964373017960) -->
+ <skip />
+ <!-- no translation found for permdesc_changeTetherState (1524441344412319780) -->
+ <skip />
+ <!-- no translation found for permlab_accessWifiState (5202012949247040011) -->
+ <skip />
+ <!-- no translation found for permdesc_accessWifiState (5002798077387803726) -->
+ <skip />
+ <!-- no translation found for permlab_changeWifiState (6550641188749128035) -->
+ <skip />
+ <!-- no translation found for permdesc_changeWifiState (7137950297386127533) -->
+ <skip />
+ <!-- no translation found for permlab_changeWifiMulticastState (1368253871483254784) -->
+ <skip />
+ <!-- no translation found for permdesc_changeWifiMulticastState (7969774021256336548) -->
+ <skip />
+ <!-- no translation found for permdesc_changeWifiMulticastState (9031975661145014160) -->
+ <skip />
+ <!-- no translation found for permdesc_changeWifiMulticastState (6851949706025349926) -->
+ <skip />
+ <!-- no translation found for permlab_bluetoothAdmin (6006967373935926659) -->
+ <skip />
+ <!-- no translation found for permdesc_bluetoothAdmin (6921177471748882137) -->
+ <skip />
+ <!-- no translation found for permdesc_bluetoothAdmin (3373125682645601429) -->
+ <skip />
+ <!-- no translation found for permdesc_bluetoothAdmin (8931682159331542137) -->
+ <skip />
+ <!-- no translation found for permlab_accessWimaxState (4195907010610205703) -->
+ <skip />
+ <!-- no translation found for permdesc_accessWimaxState (6360102877261978887) -->
+ <skip />
+ <!-- no translation found for permlab_changeWimaxState (340465839241528618) -->
+ <skip />
+ <!-- no translation found for permdesc_changeWimaxState (3156456504084201805) -->
+ <skip />
+ <!-- no translation found for permdesc_changeWimaxState (6022307083934827718) -->
+ <skip />
+ <!-- no translation found for permdesc_changeWimaxState (697025043004923798) -->
+ <skip />
+ <!-- no translation found for permlab_bluetooth (6127769336339276828) -->
+ <skip />
+ <!-- no translation found for permdesc_bluetooth (3480722181852438628) -->
+ <skip />
+ <!-- no translation found for permdesc_bluetooth (3974124940101104206) -->
+ <skip />
+ <!-- no translation found for permdesc_bluetooth (3207106324452312739) -->
+ <skip />
+ <!-- no translation found for permlab_nfc (4423351274757876953) -->
+ <skip />
+ <!-- no translation found for permdesc_nfc (7120611819401789907) -->
+ <skip />
+ <!-- no translation found for permlab_disableKeyguard (3598496301486439258) -->
+ <skip />
+ <!-- no translation found for permdesc_disableKeyguard (6034203065077122992) -->
+ <skip />
+ <!-- no translation found for permlab_manageFingerprint (5640858826254575638) -->
+ <skip />
+ <!-- no translation found for permdesc_manageFingerprint (178208705828055464) -->
+ <skip />
+ <!-- no translation found for permlab_useFingerprint (3150478619915124905) -->
+ <skip />
+ <!-- no translation found for permdesc_useFingerprint (9165097460730684114) -->
+ <skip />
+ <!-- no translation found for fingerprint_acquired_partial (735082772341716043) -->
+ <skip />
+ <!-- no translation found for fingerprint_acquired_insufficient (4596546021310923214) -->
+ <skip />
+ <!-- no translation found for fingerprint_acquired_imager_dirty (1087209702421076105) -->
+ <skip />
+ <!-- no translation found for fingerprint_acquired_too_fast (6470642383109155969) -->
+ <skip />
+ <!-- no translation found for fingerprint_acquired_too_slow (59250885689661653) -->
+ <skip />
+ <string-array name="fingerprint_acquired_vendor">
+ </string-array>
+ <!-- no translation found for fingerprint_error_hw_not_available (7955921658939936596) -->
+ <skip />
+ <!-- no translation found for fingerprint_error_no_space (1055819001126053318) -->
+ <skip />
+ <!-- no translation found for fingerprint_error_timeout (3927186043737732875) -->
+ <skip />
+ <!-- no translation found for fingerprint_error_canceled (4402024612660774395) -->
+ <skip />
+ <!-- no translation found for fingerprint_error_lockout (5536934748136933450) -->
+ <skip />
+ <!-- no translation found for fingerprint_error_unable_to_process (6107816084103552441) -->
+ <skip />
+ <!-- no translation found for fingerprint_name_template (5870957565512716938) -->
+ <skip />
+ <string-array name="fingerprint_error_vendor">
+ </string-array>
+ <!-- no translation found for fingerprint_icon_content_description (2340202869968465936) -->
+ <skip />
+ <!-- no translation found for permlab_readSyncSettings (6201810008230503052) -->
+ <skip />
+ <!-- no translation found for permdesc_readSyncSettings (2706745674569678644) -->
+ <skip />
+ <!-- no translation found for permlab_writeSyncSettings (5408694875793945314) -->
+ <skip />
+ <!-- no translation found for permdesc_writeSyncSettings (8956262591306369868) -->
+ <skip />
+ <!-- no translation found for permlab_readSyncStats (7396577451360202448) -->
+ <skip />
+ <!-- no translation found for permdesc_readSyncStats (1510143761757606156) -->
+ <skip />
+ <!-- no translation found for permlab_sdcardRead (367275095159405468) -->
+ <skip />
+ <!-- no translation found for permlab_sdcardRead (2188156462934977940) -->
+ <skip />
+ <!-- no translation found for permdesc_sdcardRead (3446988712598386079) -->
+ <skip />
+ <!-- no translation found for permdesc_sdcardRead (2607362473654975411) -->
+ <skip />
+ <!-- no translation found for permlab_sdcardWrite (8485979062254666748) -->
+ <skip />
+ <!-- no translation found for permlab_sdcardWrite (8805693630050458763) -->
+ <skip />
+ <!-- no translation found for permdesc_sdcardWrite (6175406299445710888) -->
+ <skip />
+ <!-- no translation found for permdesc_sdcardWrite (4337417790936632090) -->
+ <skip />
+ <!-- no translation found for permlab_use_sip (2052499390128979920) -->
+ <skip />
+ <!-- no translation found for permdesc_use_sip (2297804849860225257) -->
+ <skip />
+ <!-- no translation found for permlab_register_sim_subscription (3166535485877549177) -->
+ <skip />
+ <!-- no translation found for permdesc_register_sim_subscription (2138909035926222911) -->
+ <skip />
+ <!-- no translation found for permlab_register_call_provider (108102120289029841) -->
+ <skip />
+ <!-- no translation found for permdesc_register_call_provider (7034310263521081388) -->
+ <skip />
+ <!-- no translation found for permlab_connection_manager (1116193254522105375) -->
+ <skip />
+ <!-- no translation found for permdesc_connection_manager (5925480810356483565) -->
+ <skip />
+ <!-- no translation found for permlab_bind_incall_service (6773648341975287125) -->
+ <skip />
+ <!-- no translation found for permdesc_bind_incall_service (8343471381323215005) -->
+ <skip />
+ <!-- no translation found for permlab_bind_connection_service (3557341439297014940) -->
+ <skip />
+ <!-- no translation found for permdesc_bind_connection_service (4008754499822478114) -->
+ <skip />
+ <!-- no translation found for permlab_control_incall_experience (9061024437607777619) -->
+ <skip />
+ <!-- no translation found for permdesc_control_incall_experience (915159066039828124) -->
+ <skip />
+ <!-- no translation found for permlab_readNetworkUsageHistory (7862593283611493232) -->
+ <skip />
+ <!-- no translation found for permdesc_readNetworkUsageHistory (7689060749819126472) -->
+ <skip />
+ <!-- no translation found for permlab_manageNetworkPolicy (2562053592339859990) -->
+ <skip />
+ <!-- no translation found for permdesc_manageNetworkPolicy (7537586771559370668) -->
+ <skip />
+ <!-- no translation found for permlab_modifyNetworkAccounting (5088217309088729650) -->
+ <skip />
+ <!-- no translation found for permdesc_modifyNetworkAccounting (5443412866746198123) -->
+ <skip />
+ <!-- no translation found for permlab_accessNotifications (7673416487873432268) -->
+ <skip />
+ <!-- no translation found for permdesc_accessNotifications (458457742683431387) -->
+ <skip />
+ <!-- no translation found for permlab_bindNotificationListenerService (7057764742211656654) -->
+ <skip />
+ <!-- no translation found for permdesc_bindNotificationListenerService (985697918576902986) -->
+ <skip />
+ <!-- no translation found for permlab_bindConditionProviderService (1180107672332704641) -->
+ <skip />
+ <!-- no translation found for permdesc_bindConditionProviderService (1680513931165058425) -->
+ <skip />
+ <!-- no translation found for permlab_bindDreamService (4153646965978563462) -->
+ <skip />
+ <!-- no translation found for permdesc_bindDreamService (7325825272223347863) -->
+ <skip />
+ <!-- no translation found for permlab_invokeCarrierSetup (3699600833975117478) -->
+ <skip />
+ <!-- no translation found for permdesc_invokeCarrierSetup (4159549152529111920) -->
+ <skip />
+ <!-- no translation found for permlab_accessNetworkConditions (8206077447838909516) -->
+ <skip />
+ <!-- no translation found for permdesc_accessNetworkConditions (6899102075825272211) -->
+ <skip />
+ <!-- no translation found for permlab_setInputCalibration (4902620118878467615) -->
+ <skip />
+ <!-- no translation found for permdesc_setInputCalibration (4527511047549456929) -->
+ <skip />
+ <!-- no translation found for permlab_accessDrmCertificates (7436886640723203615) -->
+ <skip />
+ <!-- no translation found for permdesc_accessDrmCertificates (8073288354426159089) -->
+ <skip />
+ <!-- no translation found for permlab_handoverStatus (7820353257219300883) -->
+ <skip />
+ <!-- no translation found for permdesc_handoverStatus (4788144087245714948) -->
+ <skip />
+ <!-- no translation found for permlab_removeDrmCertificates (7044888287209892751) -->
+ <skip />
+ <!-- no translation found for permdesc_removeDrmCertificates (7272999075113400993) -->
+ <skip />
+ <!-- no translation found for permlab_bindCarrierMessagingService (1490229371796969158) -->
+ <skip />
+ <!-- no translation found for permdesc_bindCarrierMessagingService (2762882888502113944) -->
+ <skip />
+ <!-- no translation found for permlab_bindCarrierServices (3233108656245526783) -->
+ <skip />
+ <!-- no translation found for permdesc_bindCarrierServices (1391552602551084192) -->
+ <skip />
+ <!-- no translation found for permlab_access_notification_policy (4247510821662059671) -->
+ <skip />
+ <!-- no translation found for permdesc_access_notification_policy (3296832375218749580) -->
+ <skip />
+ <!-- no translation found for policylab_limitPassword (4497420728857585791) -->
+ <skip />
+ <!-- no translation found for policydesc_limitPassword (2502021457917874968) -->
+ <skip />
+ <!-- no translation found for policylab_watchLogin (914130646942199503) -->
+ <skip />
+ <!-- no translation found for policydesc_watchLogin (3215729294215070072) -->
+ <skip />
+ <!-- no translation found for policydesc_watchLogin (2707817988309890256) -->
+ <skip />
+ <!-- no translation found for policydesc_watchLogin (5712323091846761073) -->
+ <skip />
+ <!-- no translation found for policydesc_watchLogin_secondaryUser (4280246270601044505) -->
+ <skip />
+ <!-- no translation found for policydesc_watchLogin_secondaryUser (3484832653564483250) -->
+ <skip />
+ <!-- no translation found for policydesc_watchLogin_secondaryUser (2185480427217127147) -->
+ <skip />
+ <!-- no translation found for policylab_resetPassword (4934707632423915395) -->
+ <skip />
+ <!-- no translation found for policydesc_resetPassword (1278323891710619128) -->
+ <skip />
+ <!-- no translation found for policylab_forceLock (2274085384704248431) -->
+ <skip />
+ <!-- no translation found for policydesc_forceLock (1141797588403827138) -->
+ <skip />
+ <!-- no translation found for policylab_wipeData (3910545446758639713) -->
+ <skip />
+ <!-- no translation found for policydesc_wipeData (4306184096067756876) -->
+ <skip />
+ <!-- no translation found for policydesc_wipeData (5816221315214527028) -->
+ <skip />
+ <!-- no translation found for policydesc_wipeData (5096895604574188391) -->
+ <skip />
+ <!-- no translation found for policylab_wipeData_secondaryUser (8362863289455531813) -->
+ <skip />
+ <!-- no translation found for policydesc_wipeData_secondaryUser (6336255514635308054) -->
+ <skip />
+ <!-- no translation found for policydesc_wipeData_secondaryUser (2086473496848351810) -->
+ <skip />
+ <!-- no translation found for policydesc_wipeData_secondaryUser (6787904546711590238) -->
+ <skip />
+ <!-- no translation found for policylab_setGlobalProxy (2784828293747791446) -->
+ <skip />
+ <!-- no translation found for policydesc_setGlobalProxy (8459859731153370499) -->
+ <skip />
+ <!-- no translation found for policylab_expirePassword (5610055012328825874) -->
+ <skip />
+ <!-- no translation found for policydesc_expirePassword (5367525762204416046) -->
+ <skip />
+ <!-- no translation found for policylab_encryptedStorage (8901326199909132915) -->
+ <skip />
+ <!-- no translation found for policydesc_encryptedStorage (2637732115325316992) -->
+ <skip />
+ <!-- no translation found for policylab_disableCamera (6395301023152297826) -->
+ <skip />
+ <!-- no translation found for policydesc_disableCamera (2306349042834754597) -->
+ <skip />
+ <!-- no translation found for policylab_disableKeyguardFeatures (8552277871075367771) -->
+ <skip />
+ <!-- no translation found for policydesc_disableKeyguardFeatures (2044755691354158439) -->
+ <skip />
+ <!-- no translation found for phoneTypes:0 (8901098336658710359) -->
+ <!-- no translation found for phoneTypes:1 (869923650527136615) -->
+ <!-- no translation found for phoneTypes:2 (7897544654242874543) -->
+ <!-- no translation found for phoneTypes:3 (1103601433382158155) -->
+ <!-- no translation found for phoneTypes:4 (1735177144948329370) -->
+ <!-- no translation found for phoneTypes:5 (603878674477207394) -->
+ <!-- no translation found for phoneTypes:6 (1650824275177931637) -->
+ <!-- no translation found for phoneTypes:7 (9192514806975898961) -->
+ <!-- no translation found for emailAddressTypes:0 (8073994352956129127) -->
+ <!-- no translation found for emailAddressTypes:1 (7084237356602625604) -->
+ <!-- no translation found for emailAddressTypes:2 (1112044410659011023) -->
+ <!-- no translation found for emailAddressTypes:3 (2374913952870110618) -->
+ <!-- no translation found for postalAddressTypes:0 (6880257626740047286) -->
+ <!-- no translation found for postalAddressTypes:1 (5629153956045109251) -->
+ <!-- no translation found for postalAddressTypes:2 (4966604264500343469) -->
+ <!-- no translation found for postalAddressTypes:3 (4932682847595299369) -->
+ <!-- no translation found for imAddressTypes:0 (1738585194601476694) -->
+ <!-- no translation found for imAddressTypes:1 (1359644565647383708) -->
+ <!-- no translation found for imAddressTypes:2 (7868549401053615677) -->
+ <!-- no translation found for imAddressTypes:3 (3145118944639869809) -->
+ <!-- no translation found for organizationTypes:0 (7546335612189115615) -->
+ <!-- no translation found for organizationTypes:1 (4378074129049520373) -->
+ <!-- no translation found for organizationTypes:2 (3455047468583965104) -->
+ <!-- no translation found for imProtocols:0 (8595261363518459565) -->
+ <!-- no translation found for imProtocols:1 (7390473628275490700) -->
+ <!-- no translation found for imProtocols:2 (7882877134931458217) -->
+ <!-- no translation found for imProtocols:3 (5035376313200585242) -->
+ <!-- no translation found for imProtocols:4 (7532363178459444943) -->
+ <!-- no translation found for imProtocols:5 (3713441034299660749) -->
+ <!-- no translation found for imProtocols:6 (2506857312718630823) -->
+ <!-- no translation found for imProtocols:7 (1648797903785279353) -->
+ <!-- no translation found for phoneTypeCustom (1644738059053355820) -->
+ <skip />
+ <!-- no translation found for phoneTypeHome (2570923463033985887) -->
+ <skip />
+ <!-- no translation found for phoneTypeMobile (6501463557754751037) -->
+ <skip />
+ <!-- no translation found for phoneTypeWork (8863939667059911633) -->
+ <skip />
+ <!-- no translation found for phoneTypeFaxWork (3517792160008890912) -->
+ <skip />
+ <!-- no translation found for phoneTypeFaxHome (2067265972322971467) -->
+ <skip />
+ <!-- no translation found for phoneTypePager (7582359955394921732) -->
+ <skip />
+ <!-- no translation found for phoneTypeOther (1544425847868765990) -->
+ <skip />
+ <!-- no translation found for phoneTypeCallback (2712175203065678206) -->
+ <skip />
+ <!-- no translation found for phoneTypeCar (8738360689616716982) -->
+ <skip />
+ <!-- no translation found for phoneTypeCompanyMain (540434356461478916) -->
+ <skip />
+ <!-- no translation found for phoneTypeIsdn (8022453193171370337) -->
+ <skip />
+ <!-- no translation found for phoneTypeMain (6766137010628326916) -->
+ <skip />
+ <!-- no translation found for phoneTypeOtherFax (8587657145072446565) -->
+ <skip />
+ <!-- no translation found for phoneTypeRadio (4093738079908667513) -->
+ <skip />
+ <!-- no translation found for phoneTypeTelex (3367879952476250512) -->
+ <skip />
+ <!-- no translation found for phoneTypeTtyTdd (8606514378585000044) -->
+ <skip />
+ <!-- no translation found for phoneTypeWorkMobile (1311426989184065709) -->
+ <skip />
+ <!-- no translation found for phoneTypeWorkPager (649938731231157056) -->
+ <skip />
+ <!-- no translation found for phoneTypeAssistant (5596772636128562884) -->
+ <skip />
+ <!-- no translation found for phoneTypeMms (7254492275502768992) -->
+ <skip />
+ <!-- no translation found for eventTypeCustom (7837586198458073404) -->
+ <skip />
+ <!-- no translation found for eventTypeBirthday (2813379844211390740) -->
+ <skip />
+ <!-- no translation found for eventTypeAnniversary (3876779744518284000) -->
+ <skip />
+ <!-- no translation found for eventTypeOther (7388178939010143077) -->
+ <skip />
+ <!-- no translation found for emailTypeCustom (8525960257804213846) -->
+ <skip />
+ <!-- no translation found for emailTypeHome (449227236140433919) -->
+ <skip />
+ <!-- no translation found for emailTypeWork (3548058059601149973) -->
+ <skip />
+ <!-- no translation found for emailTypeOther (2923008695272639549) -->
+ <skip />
+ <!-- no translation found for emailTypeMobile (119919005321166205) -->
+ <skip />
+ <!-- no translation found for postalTypeCustom (8903206903060479902) -->
+ <skip />
+ <!-- no translation found for postalTypeHome (8165756977184483097) -->
+ <skip />
+ <!-- no translation found for postalTypeWork (5268172772387694495) -->
+ <skip />
+ <!-- no translation found for postalTypeOther (2726111966623584341) -->
+ <skip />
+ <!-- no translation found for imTypeCustom (2074028755527826046) -->
+ <skip />
+ <!-- no translation found for imTypeHome (6241181032954263892) -->
+ <skip />
+ <!-- no translation found for imTypeWork (1371489290242433090) -->
+ <skip />
+ <!-- no translation found for imTypeOther (5377007495735915478) -->
+ <skip />
+ <!-- no translation found for imProtocolCustom (6919453836618749992) -->
+ <skip />
+ <!-- no translation found for imProtocolAim (7050360612368383417) -->
+ <skip />
+ <!-- no translation found for imProtocolMsn (144556545420769442) -->
+ <skip />
+ <!-- no translation found for imProtocolYahoo (8271439408469021273) -->
+ <skip />
+ <!-- no translation found for imProtocolSkype (9019296744622832951) -->
+ <skip />
+ <!-- no translation found for imProtocolQq (8887484379494111884) -->
+ <skip />
+ <!-- no translation found for imProtocolGoogleTalk (493902321140277304) -->
+ <skip />
+ <!-- no translation found for imProtocolIcq (1574870433606517315) -->
+ <skip />
+ <!-- no translation found for imProtocolJabber (2279917630875771722) -->
+ <skip />
+ <!-- no translation found for imProtocolNetMeeting (8287625655986827971) -->
+ <skip />
+ <!-- no translation found for orgTypeWork (29268870505363872) -->
+ <skip />
+ <!-- no translation found for orgTypeOther (3951781131570124082) -->
+ <skip />
+ <!-- no translation found for orgTypeCustom (225523415372088322) -->
+ <skip />
+ <!-- no translation found for relationTypeCustom (3542403679827297300) -->
+ <skip />
+ <!-- no translation found for relationTypeAssistant (6274334825195379076) -->
+ <skip />
+ <!-- no translation found for relationTypeBrother (8757913506784067713) -->
+ <skip />
+ <!-- no translation found for relationTypeChild (1890746277276881626) -->
+ <skip />
+ <!-- no translation found for relationTypeDomesticPartner (6904807112121122133) -->
+ <skip />
+ <!-- no translation found for relationTypeFather (5228034687082050725) -->
+ <skip />
+ <!-- no translation found for relationTypeFriend (7313106762483391262) -->
+ <skip />
+ <!-- no translation found for relationTypeManager (6365677861610137895) -->
+ <skip />
+ <!-- no translation found for relationTypeMother (4578571352962758304) -->
+ <skip />
+ <!-- no translation found for relationTypeParent (4755635567562925226) -->
+ <skip />
+ <!-- no translation found for relationTypePartner (7266490285120262781) -->
+ <skip />
+ <!-- no translation found for relationTypeReferredBy (101573059844135524) -->
+ <skip />
+ <!-- no translation found for relationTypeRelative (1799819930085610271) -->
+ <skip />
+ <!-- no translation found for relationTypeSister (1735983554479076481) -->
+ <skip />
+ <!-- no translation found for relationTypeSpouse (394136939428698117) -->
+ <skip />
+ <!-- no translation found for sipAddressTypeCustom (2473580593111590945) -->
+ <skip />
+ <!-- no translation found for sipAddressTypeHome (6093598181069359295) -->
+ <skip />
+ <!-- no translation found for sipAddressTypeWork (6920725730797099047) -->
+ <skip />
+ <!-- no translation found for sipAddressTypeOther (4408436162950119849) -->
+ <skip />
+ <!-- no translation found for quick_contacts_not_available (746098007828579688) -->
+ <skip />
+ <!-- no translation found for keyguard_password_enter_pin_code (3037685796058495017) -->
+ <skip />
+ <!-- no translation found for keyguard_password_enter_puk_code (4800725266925845333) -->
+ <skip />
+ <!-- no translation found for keyguard_password_enter_puk_prompt (1341112146710087048) -->
+ <skip />
+ <!-- no translation found for keyguard_password_enter_pin_prompt (8027680321614196258) -->
+ <skip />
+ <!-- no translation found for keyguard_password_entry_touch_hint (7858547464982981384) -->
+ <skip />
+ <!-- no translation found for keyguard_password_enter_password_code (1054721668279049780) -->
+ <skip />
+ <!-- no translation found for keyguard_password_enter_pin_password_code (6391755146112503443) -->
+ <skip />
+ <!-- no translation found for keyguard_password_wrong_pin_code (2422225591006134936) -->
+ <skip />
+ <!-- no translation found for keyguard_label_text (861796461028298424) -->
+ <skip />
+ <!-- no translation found for emergency_call_dialog_number_for_display (696192103195090970) -->
+ <skip />
+ <!-- no translation found for lockscreen_carrier_default (6169005837238288522) -->
+ <skip />
+ <!-- no translation found for lockscreen_screen_locked (7288443074806832904) -->
+ <skip />
+ <!-- no translation found for lockscreen_instructions_when_pattern_enabled (46154051614126049) -->
+ <skip />
+ <!-- no translation found for lockscreen_instructions_when_pattern_disabled (686260028797158364) -->
+ <skip />
+ <!-- no translation found for lockscreen_pattern_instructions (7478703254964810302) -->
+ <skip />
+ <!-- no translation found for lockscreen_emergency_call (5298642613417801888) -->
+ <skip />
+ <!-- no translation found for lockscreen_return_to_call (5244259785500040021) -->
+ <skip />
+ <!-- no translation found for lockscreen_pattern_correct (9039008650362261237) -->
+ <skip />
+ <!-- no translation found for lockscreen_pattern_wrong (4317955014948108794) -->
+ <skip />
+ <!-- no translation found for lockscreen_password_wrong (5737815393253165301) -->
+ <skip />
+ <!-- no translation found for faceunlock_multiple_failures (754137583022792429) -->
+ <skip />
+ <!-- no translation found for lockscreen_missing_sim_message_short (5099439277819215399) -->
+ <skip />
+ <!-- no translation found for lockscreen_missing_sim_message (151659196095791474) -->
+ <skip />
+ <!-- no translation found for lockscreen_missing_sim_message (1943633865476989599) -->
+ <skip />
+ <!-- no translation found for lockscreen_missing_sim_message (2186920585695169078) -->
+ <skip />
+ <!-- no translation found for lockscreen_missing_sim_instructions (5372787138023272615) -->
+ <skip />
+ <!-- no translation found for lockscreen_missing_sim_instructions_long (3526573099019319472) -->
+ <skip />
+ <!-- no translation found for lockscreen_permanent_disabled_sim_message_short (5096149665138916184) -->
+ <skip />
+ <!-- no translation found for lockscreen_permanent_disabled_sim_instructions (910904643433151371) -->
+ <skip />
+ <!-- no translation found for lockscreen_transport_prev_description (6300840251218161534) -->
+ <skip />
+ <!-- no translation found for lockscreen_transport_next_description (573285210424377338) -->
+ <skip />
+ <!-- no translation found for lockscreen_transport_pause_description (3980308465056173363) -->
+ <skip />
+ <!-- no translation found for lockscreen_transport_play_description (1901258823643886401) -->
+ <skip />
+ <!-- no translation found for lockscreen_transport_stop_description (5907083260651210034) -->
+ <skip />
+ <!-- no translation found for lockscreen_transport_rew_description (6944412838651990410) -->
+ <skip />
+ <!-- no translation found for lockscreen_transport_ffw_description (42987149870928985) -->
+ <skip />
+ <!-- no translation found for emergency_calls_only (6733978304386365407) -->
+ <!-- no translation found for emergency_calls_only (2485604591272668370) -->
+ <skip />
+ <!-- no translation found for lockscreen_network_locked_message (143389224986028501) -->
+ <skip />
+ <!-- no translation found for lockscreen_sim_puk_locked_message (7441797339976230) -->
+ <skip />
+ <!-- no translation found for lockscreen_sim_puk_locked_instructions (8127916255245181063) -->
+ <skip />
+ <!-- no translation found for lockscreen_sim_locked_message (8066660129206001039) -->
+ <skip />
+ <!-- no translation found for lockscreen_sim_unlock_progress_dialog_message (595323214052881264) -->
+ <skip />
+ <!-- no translation found for lockscreen_too_many_failed_attempts_dialog_message (6481623830344107222) -->
+ <skip />
+ <!-- no translation found for lockscreen_too_many_failed_password_attempts_dialog_message (2725973286239344555) -->
+ <skip />
+ <!-- no translation found for lockscreen_too_many_failed_pin_attempts_dialog_message (6216672706545696955) -->
+ <skip />
+ <!-- no translation found for lockscreen_failed_attempts_almost_glogin (9191611984625460820) -->
+ <skip />
+ <!-- no translation found for lockscreen_failed_attempts_almost_glogin (5316664559603394684) -->
+ <skip />
+ <!-- no translation found for lockscreen_failed_attempts_almost_glogin (2590227559763762751) -->
+ <skip />
+ <!-- no translation found for lockscreen_failed_attempts_almost_at_wipe (6128106399745755604) -->
+ <skip />
+ <!-- no translation found for lockscreen_failed_attempts_almost_at_wipe (950408382418270260) -->
+ <skip />
+ <!-- no translation found for lockscreen_failed_attempts_almost_at_wipe (8603565142156826565) -->
+ <skip />
+ <!-- no translation found for lockscreen_failed_attempts_now_wiping (280873516493934365) -->
+ <skip />
+ <!-- no translation found for lockscreen_failed_attempts_now_wiping (3195755534096192191) -->
+ <skip />
+ <!-- no translation found for lockscreen_failed_attempts_now_wiping (3025504721764922246) -->
+ <skip />
+ <!-- no translation found for lockscreen_too_many_failed_attempts_countdown (6251480343394389665) -->
+ <skip />
+ <!-- no translation found for lockscreen_forgot_pattern_button_text (2626999449610695930) -->
+ <skip />
+ <!-- no translation found for lockscreen_glogin_forgot_pattern (2588521501166032747) -->
+ <skip />
+ <!-- no translation found for lockscreen_glogin_too_many_attempts (2751368605287288808) -->
+ <skip />
+ <!-- no translation found for lockscreen_glogin_instructions (3931816256100707784) -->
+ <skip />
+ <!-- no translation found for lockscreen_glogin_username_hint (8846881424106484447) -->
+ <skip />
+ <!-- no translation found for lockscreen_glogin_password_hint (5958028383954738528) -->
+ <skip />
+ <!-- no translation found for lockscreen_glogin_submit_button (7130893694795786300) -->
+ <skip />
+ <!-- no translation found for lockscreen_glogin_invalid_input (1364051473347485908) -->
+ <skip />
+ <!-- no translation found for lockscreen_glogin_account_recovery_hint (1696924763690379073) -->
+ <skip />
+ <!-- no translation found for lockscreen_glogin_checking_password (7114627351286933867) -->
+ <skip />
+ <!-- no translation found for lockscreen_unlock_label (737440483220667054) -->
+ <skip />
+ <!-- no translation found for lockscreen_sound_on_label (9068877576513425970) -->
+ <skip />
+ <!-- no translation found for lockscreen_sound_off_label (996822825154319026) -->
+ <skip />
+ <!-- no translation found for lockscreen_access_pattern_start (3941045502933142847) -->
+ <skip />
+ <!-- no translation found for lockscreen_access_pattern_cleared (5583479721001639579) -->
+ <skip />
+ <!-- no translation found for lockscreen_access_pattern_cell_added (6756031208359292487) -->
+ <skip />
+ <!-- no translation found for lockscreen_access_pattern_cell_added_verbose (7264580781744026939) -->
+ <skip />
+ <!-- no translation found for lockscreen_access_pattern_detected (4988730895554057058) -->
+ <skip />
+ <!-- no translation found for lockscreen_access_pattern_area (400813207572953209) -->
+ <!-- no translation found for lockscreen_access_pattern_area () -->
+ <skip />
+ <!-- no translation found for keyguard_accessibility_widget_changed (5678624624681400191) -->
+ <skip />
+ <!-- no translation found for keyguard_accessibility_add_widget (8273277058724924654) -->
+ <skip />
+ <!-- no translation found for keyguard_accessibility_widget_empty_slot (1281505703307930757) -->
+ <skip />
+ <!-- no translation found for keyguard_accessibility_unlock_area_expanded (2278106022311170299) -->
+ <skip />
+ <!-- no translation found for keyguard_accessibility_unlock_area_collapsed (6366992066936076396) -->
+ <skip />
+ <!-- no translation found for keyguard_accessibility_widget (6527131039741808240) -->
+ <skip />
+ <!-- no translation found for keyguard_accessibility_user_selector (1226798370913698896) -->
+ <skip />
+ <!-- no translation found for keyguard_accessibility_status (8008264603935930611) -->
+ <skip />
+ <!-- no translation found for keyguard_accessibility_camera (8904231194181114603) -->
+ <skip />
+ <!-- no translation found for keygaurd_accessibility_media_controls (262209654292161806) -->
+ <skip />
+ <!-- no translation found for keyguard_accessibility_widget_reorder_start (8736853615588828197) -->
+ <skip />
+ <!-- no translation found for keyguard_accessibility_widget_reorder_end (7170190950870468320) -->
+ <skip />
+ <!-- no translation found for keyguard_accessibility_widget_deleted (4426204263929224434) -->
+ <skip />
+ <!-- no translation found for keyguard_accessibility_expand_lock_area (519859720934178024) -->
+ <skip />
+ <!-- no translation found for keyguard_accessibility_slide_unlock (2959928478764697254) -->
+ <skip />
+ <!-- no translation found for keyguard_accessibility_pattern_unlock (1490840706075246612) -->
+ <skip />
+ <!-- no translation found for keyguard_accessibility_face_unlock (4817282543351718535) -->
+ <skip />
+ <!-- no translation found for keyguard_accessibility_pin_unlock (2469687111784035046) -->
+ <skip />
+ <!-- no translation found for keyguard_accessibility_password_unlock (7675777623912155089) -->
+ <skip />
+ <!-- no translation found for keyguard_accessibility_pattern_area (7679891324509597904) -->
+ <skip />
+ <!-- no translation found for keyguard_accessibility_slide_area (6736064494019979544) -->
+ <skip />
+ <!-- no translation found for password_keyboard_label_symbol_key (992280756256536042) -->
+ <skip />
+ <!-- no translation found for password_keyboard_label_alpha_key (8001096175167485649) -->
+ <skip />
+ <!-- no translation found for password_keyboard_label_alt_key (1284820942620288678) -->
+ <skip />
+ <!-- no translation found for granularity_label_character (7336470535385009523) -->
+ <skip />
+ <!-- no translation found for granularity_label_word (7075570328374918660) -->
+ <skip />
+ <!-- no translation found for granularity_label_link (5815508880782488267) -->
+ <skip />
+ <!-- no translation found for granularity_label_line (5764267235026120888) -->
+ <skip />
+ <!-- no translation found for factorytest_failed (5410270329114212041) -->
+ <skip />
+ <!-- no translation found for factorytest_not_system (4435201656767276723) -->
+ <skip />
+ <!-- no translation found for factorytest_no_action (872991874799998561) -->
+ <skip />
+ <!-- no translation found for factorytest_reboot (6320168203050791643) -->
+ <skip />
+ <!-- no translation found for js_dialog_title (1987483977834603872) -->
+ <skip />
+ <!-- no translation found for js_dialog_title_default (6961903213729667573) -->
+ <skip />
+ <!-- no translation found for js_dialog_before_unload_title (2619376555525116593) -->
+ <skip />
+ <!-- no translation found for js_dialog_before_unload_positive_button (3112752010600484130) -->
+ <skip />
+ <!-- no translation found for js_dialog_before_unload_negative_button (5614861293026099715) -->
+ <skip />
+ <!-- no translation found for js_dialog_before_unload (3468816357095378590) -->
+ <skip />
+ <!-- no translation found for save_password_label (6860261758665825069) -->
+ <skip />
+ <!-- no translation found for double_tap_toast (4595046515400268881) -->
+ <skip />
+ <!-- no translation found for autofill_this_form (4616758841157816676) -->
+ <skip />
+ <!-- no translation found for setup_autofill (7103495070180590814) -->
+ <skip />
+ <!-- no translation found for autofill_address_name_separator (6350145154779706772) -->
+ <skip />
+ <!-- no translation found for autofill_address_summary_name_format (3268041054899214945) -->
+ <skip />
+ <!-- no translation found for autofill_address_summary_separator (7483307893170324129) -->
+ <skip />
+ <!-- no translation found for autofill_address_summary_format (4874459455786827344) -->
+ <skip />
+ <!-- no translation found for autofill_province (2231806553863422300) -->
+ <skip />
+ <!-- no translation found for autofill_postal_code (4696430407689377108) -->
+ <skip />
+ <!-- no translation found for autofill_state (6988894195520044613) -->
+ <skip />
+ <!-- no translation found for autofill_zip_code (8697544592627322946) -->
+ <skip />
+ <!-- no translation found for autofill_county (237073771020362891) -->
+ <skip />
+ <!-- no translation found for autofill_island (4020100875984667025) -->
+ <skip />
+ <!-- no translation found for autofill_district (8400735073392267672) -->
+ <skip />
+ <!-- no translation found for autofill_department (5343279462564453309) -->
+ <skip />
+ <!-- no translation found for autofill_prefecture (2028499485065800419) -->
+ <skip />
+ <!-- no translation found for autofill_parish (8202206105468820057) -->
+ <skip />
+ <!-- no translation found for autofill_area (3547409050889952423) -->
+ <skip />
+ <!-- no translation found for autofill_emirate (2893880978835698818) -->
+ <skip />
+ <!-- no translation found for permlab_readHistoryBookmarks (3775265775405106983) -->
+ <skip />
+ <!-- no translation found for permdesc_readHistoryBookmarks (8462378226600439658) -->
+ <skip />
+ <!-- no translation found for permlab_writeHistoryBookmarks (3714785165273314490) -->
+ <skip />
+ <!-- no translation found for permdesc_writeHistoryBookmarks (6825527469145760922) -->
+ <skip />
+ <!-- no translation found for permdesc_writeHistoryBookmarks (7007393823197766548) -->
+ <skip />
+ <!-- no translation found for permdesc_writeHistoryBookmarks (8497389531014185509) -->
+ <skip />
+ <!-- no translation found for permlab_setAlarm (1379294556362091814) -->
+ <skip />
+ <!-- no translation found for permdesc_setAlarm (316392039157473848) -->
+ <skip />
+ <!-- no translation found for permlab_addVoicemail (5525660026090959044) -->
+ <skip />
+ <!-- no translation found for permdesc_addVoicemail (6604508651428252437) -->
+ <skip />
+ <!-- no translation found for permlab_writeGeolocationPermissions (5962224158955273932) -->
+ <skip />
+ <!-- no translation found for permdesc_writeGeolocationPermissions (1083743234522638747) -->
+ <skip />
+ <!-- no translation found for save_password_message (767344687139195790) -->
+ <skip />
+ <!-- no translation found for save_password_notnow (6389675316706699758) -->
+ <skip />
+ <!-- no translation found for save_password_remember (6491879678996749466) -->
+ <skip />
+ <!-- no translation found for save_password_never (8274330296785855105) -->
+ <skip />
+ <!-- no translation found for open_permission_deny (7374036708316629800) -->
+ <skip />
+ <!-- no translation found for text_copied (4985729524670131385) -->
+ <skip />
+ <!-- no translation found for more_item_label (4650918923083320495) -->
+ <skip />
+ <!-- no translation found for prepend_shortcut_label (2572214461676015642) -->
+ <skip />
+ <!-- no translation found for menu_space_shortcut_label (2410328639272162537) -->
+ <skip />
+ <!-- no translation found for menu_enter_shortcut_label (2743362785111309668) -->
+ <skip />
+ <!-- no translation found for menu_delete_shortcut_label (3658178007202748164) -->
+ <skip />
+ <!-- no translation found for search_go (8298016669822141719) -->
+ <skip />
+ <!-- no translation found for search_hint (1733947260773056054) -->
+ <skip />
+ <!-- no translation found for searchview_description_search (6749826639098512120) -->
+ <skip />
+ <!-- no translation found for searchview_description_query (5911778593125355124) -->
+ <skip />
+ <!-- no translation found for searchview_description_clear (1330281990951833033) -->
+ <skip />
+ <!-- no translation found for searchview_description_submit (2688450133297983542) -->
+ <skip />
+ <!-- no translation found for searchview_description_voice (2453203695674994440) -->
+ <skip />
+ <!-- no translation found for enable_explore_by_touch_warning_title (7460694070309730149) -->
+ <skip />
+ <!-- no translation found for enable_explore_by_touch_warning_message (8655887539089910577) -->
+ <skip />
+ <!-- no translation found for enable_explore_by_touch_warning_message (2708199672852373195) -->
+ <skip />
+ <!-- no translation found for oneMonthDurationPast (7396384508953779925) -->
+ <skip />
+ <!-- no translation found for beforeOneMonthDurationPast (909134546836499826) -->
+ <skip />
+ <!-- no translation found for last_num_days (5104533550723932025) -->
+ <!-- no translation found for last_month (3959346739979055432) -->
+ <skip />
+ <!-- no translation found for older (5211975022815554840) -->
+ <skip />
+ <!-- no translation found for preposition_for_date (9093949757757445117) -->
+ <skip />
+ <!-- no translation found for preposition_for_time (5506831244263083793) -->
+ <skip />
+ <!-- no translation found for preposition_for_year (5040395640711867177) -->
+ <skip />
+ <!-- no translation found for day (8144195776058119424) -->
+ <skip />
+ <!-- no translation found for days (4774547661021344602) -->
+ <skip />
+ <!-- no translation found for hour (2126771916426189481) -->
+ <skip />
+ <!-- no translation found for hours (894424005266852993) -->
+ <skip />
+ <!-- no translation found for minute (9148878657703769868) -->
+ <skip />
+ <!-- no translation found for minutes (5646001005827034509) -->
+ <skip />
+ <!-- no translation found for second (3184235808021478) -->
+ <skip />
+ <!-- no translation found for seconds (3161515347216589235) -->
+ <skip />
+ <!-- no translation found for week (5617961537173061583) -->
+ <skip />
+ <!-- no translation found for weeks (6509623834583944518) -->
+ <skip />
+ <!-- no translation found for year (4001118221013892076) -->
+ <skip />
+ <!-- no translation found for years (6881577717993213522) -->
+ <skip />
+ <!-- no translation found for duration_seconds (4527986939729687805) -->
+ <!-- no translation found for duration_minutes (643786953939956125) -->
+ <!-- no translation found for duration_hours (6826233369186668274) -->
+ <!-- no translation found for VideoView_error_title (3534509135438353077) -->
+ <skip />
+ <!-- no translation found for VideoView_error_text_invalid_progressive_playback (3186670335938670444) -->
+ <skip />
+ <!-- no translation found for VideoView_error_text_unknown (3450439155187810085) -->
+ <skip />
+ <!-- no translation found for VideoView_error_button (2822238215100679592) -->
+ <skip />
+ <!-- no translation found for relative_time (1818557177829411417) -->
+ <skip />
+ <!-- no translation found for noon (7245353528818587908) -->
+ <skip />
+ <!-- no translation found for Noon (3342127745230013127) -->
+ <skip />
+ <!-- no translation found for midnight (7166259508850457595) -->
+ <skip />
+ <!-- no translation found for Midnight (5630806906897892201) -->
+ <skip />
+ <!-- no translation found for elapsed_time_short_format_mm_ss (4431555943828711473) -->
+ <skip />
+ <!-- no translation found for elapsed_time_short_format_h_mm_ss (1846071997616654124) -->
+ <skip />
+ <!-- no translation found for selectAll (6876518925844129331) -->
+ <skip />
+ <!-- no translation found for cut (3092569408438626261) -->
+ <skip />
+ <!-- no translation found for copy (2681946229533511987) -->
+ <skip />
+ <!-- no translation found for paste (5629880836805036433) -->
+ <skip />
+ <!-- no translation found for paste_as_plain_text (5427792741908010675) -->
+ <skip />
+ <!-- no translation found for replace (5781686059063148930) -->
+ <skip />
+ <!-- no translation found for delete (6098684844021697789) -->
+ <skip />
+ <!-- no translation found for copyUrl (2538211579596067402) -->
+ <skip />
+ <!-- no translation found for selectTextMode (1018691815143165326) -->
+ <skip />
+ <!-- no translation found for undo (7905788502491742328) -->
+ <skip />
+ <!-- no translation found for redo (7759464876566803888) -->
+ <skip />
+ <!-- no translation found for textSelectionCABTitle (5236850394370820357) -->
+ <skip />
+ <!-- no translation found for addToDictionary (4352161534510057874) -->
+ <skip />
+ <!-- no translation found for deleteText (6979668428458199034) -->
+ <skip />
+ <!-- no translation found for inputMethod (1653630062304567879) -->
+ <skip />
+ <!-- no translation found for editTextMenuTitle (4909135564941815494) -->
+ <skip />
+ <!-- no translation found for low_internal_storage_view_title (5576272496365684834) -->
+ <skip />
+ <!-- no translation found for low_internal_storage_view_text (6640505817617414371) -->
+ <skip />
+ <!-- no translation found for low_internal_storage_view_text_no_boot (6935190099204693424) -->
+ <skip />
+ <!-- no translation found for app_running_notification_title (8718335121060787914) -->
+ <skip />
+ <!-- no translation found for app_running_notification_text (4653586947747330058) -->
+ <skip />
+ <!-- no translation found for ok (5970060430562524910) -->
+ <skip />
+ <!-- no translation found for cancel (6442560571259935130) -->
+ <skip />
+ <!-- no translation found for yes (5362982303337969312) -->
+ <skip />
+ <!-- no translation found for no (5141531044935541497) -->
+ <skip />
+ <!-- no translation found for dialog_alert_title (2049658708609043103) -->
+ <skip />
+ <!-- no translation found for loading (7933681260296021180) -->
+ <skip />
+ <!-- no translation found for capital_on (1544682755514494298) -->
+ <skip />
+ <!-- no translation found for capital_off (6815870386972805832) -->
+ <skip />
+ <!-- no translation found for whichApplication (4533185947064773386) -->
+ <skip />
+ <!-- no translation found for whichApplicationNamed (8260158865936942783) -->
+ <skip />
+ <!-- no translation found for whichViewApplication (3272778576700572102) -->
+ <skip />
+ <!-- no translation found for whichViewApplicationNamed (2286418824011249620) -->
+ <skip />
+ <!-- no translation found for whichEditApplication (144727838241402655) -->
+ <skip />
+ <!-- no translation found for whichEditApplicationNamed (1775815530156447790) -->
+ <skip />
+ <!-- no translation found for whichSendApplication (6902512414057341668) -->
+ <skip />
+ <!-- no translation found for whichSendApplicationNamed (2799370240005424391) -->
+ <skip />
+ <!-- no translation found for whichHomeApplication (4307587691506919691) -->
+ <skip />
+ <!-- no translation found for whichHomeApplicationNamed (4493438593214760979) -->
+ <skip />
+ <!-- no translation found for alwaysUse (4583018368000610438) -->
+ <skip />
+ <!-- no translation found for use_a_different_app (8134926230585710243) -->
+ <skip />
+ <!-- no translation found for clearDefaultHintMsg (3252584689512077257) -->
+ <skip />
+ <!-- no translation found for chooseActivity (7486876147751803333) -->
+ <skip />
+ <!-- no translation found for chooseUsbActivity (6894748416073583509) -->
+ <skip />
+ <!-- no translation found for noApplications (2991814273936504689) -->
+ <skip />
+ <string name="aerr_title" msgid="1905800560317137752"></string>
+ <!-- no translation found for aerr_application (932628488013092776) -->
+ <skip />
+ <!-- no translation found for aerr_process (4507058997035697579) -->
+ <skip />
+ <!-- no translation found for aerr_process_silence (4226685530196000222) -->
+ <skip />
+ <string name="anr_title" msgid="4351948481459135709"></string>
+ <!-- no translation found for anr_activity_application (1904477189057199066) -->
+ <skip />
+ <!-- no translation found for anr_activity_process (5776209883299089767) -->
+ <skip />
+ <!-- no translation found for anr_application_process (8941757607340481057) -->
+ <skip />
+ <!-- no translation found for anr_process (6513209874880517125) -->
+ <skip />
+ <!-- no translation found for force_close (8346072094521265605) -->
+ <skip />
+ <!-- no translation found for report (4060218260984795706) -->
+ <skip />
+ <!-- no translation found for wait (7147118217226317732) -->
+ <skip />
+ <!-- no translation found for webpage_unresponsive (3272758351138122503) -->
+ <skip />
+ <!-- no translation found for launch_warning_title (1547997780506713581) -->
+ <skip />
+ <!-- no translation found for launch_warning_replace (6202498949970281412) -->
+ <skip />
+ <!-- no translation found for launch_warning_original (188102023021668683) -->
+ <skip />
+ <!-- no translation found for screen_compat_mode_scale (3202955667675944499) -->
+ <skip />
+ <!-- no translation found for screen_compat_mode_show (4013878876486655892) -->
+ <skip />
+ <!-- no translation found for screen_compat_mode_hint (1064524084543304459) -->
+ <skip />
+ <!-- no translation found for smv_application (3307209192155442829) -->
+ <skip />
+ <!-- no translation found for smv_process (5120397012047462446) -->
+ <skip />
+ <!-- no translation found for android_upgrading_title (1584192285441405746) -->
+ <skip />
+ <!-- no translation found for android_start_title (8418054686415318207) -->
+ <skip />
+ <!-- no translation found for android_upgrading_fstrim (8036718871534640010) -->
+ <skip />
+ <!-- no translation found for android_upgrading_apk (7904042682111526169) -->
+ <skip />
+ <!-- no translation found for android_preparing_apk (8162599310274079154) -->
+ <skip />
+ <!-- no translation found for android_upgrading_starting_apps (451464516346926713) -->
+ <skip />
+ <!-- no translation found for android_upgrading_complete (1405954754112999229) -->
+ <skip />
+ <!-- no translation found for heavy_weight_notification (9087063985776626166) -->
+ <skip />
+ <!-- no translation found for heavy_weight_notification_detail (1721681741617898865) -->
+ <skip />
+ <!-- no translation found for heavy_weight_switcher_title (7153167085403298169) -->
+ <skip />
+ <!-- no translation found for heavy_weight_switcher_text (7022631924534406403) -->
+ <skip />
+ <!-- no translation found for old_app_action (493129172238566282) -->
+ <skip />
+ <!-- no translation found for old_app_description (2082094275580358049) -->
+ <skip />
+ <!-- no translation found for new_app_action (5472756926945440706) -->
+ <skip />
+ <!-- no translation found for new_app_description (1932143598371537340) -->
+ <skip />
+ <!-- no translation found for dump_heap_notification (2618183274836056542) -->
+ <skip />
+ <!-- no translation found for dump_heap_notification_detail (2075673362317481664) -->
+ <skip />
+ <!-- no translation found for dump_heap_title (5864292264307651673) -->
+ <skip />
+ <!-- no translation found for dump_heap_text (4809417337240334941) -->
+ <skip />
+ <!-- no translation found for sendText (5209874571959469142) -->
+ <skip />
+ <!-- no translation found for volume_ringtone (6885421406845734650) -->
+ <skip />
+ <!-- no translation found for volume_music (5421651157138628171) -->
+ <skip />
+ <!-- no translation found for volume_music_hint_playing_through_bluetooth (9165984379394601533) -->
+ <skip />
+ <!-- no translation found for volume_music_hint_silent_ringtone_selected (8310739960973156272) -->
+ <skip />
+ <!-- no translation found for volume_call (3941680041282788711) -->
+ <skip />
+ <!-- no translation found for volume_bluetooth_call (2002891926351151534) -->
+ <skip />
+ <!-- no translation found for volume_alarm (1985191616042689100) -->
+ <skip />
+ <!-- no translation found for volume_notification (2422265656744276715) -->
+ <skip />
+ <!-- no translation found for volume_unknown (1400219669770445902) -->
+ <skip />
+ <!-- no translation found for volume_icon_description_bluetooth (6538894177255964340) -->
+ <skip />
+ <!-- no translation found for volume_icon_description_ringer (3326003847006162496) -->
+ <skip />
+ <!-- no translation found for volume_icon_description_incall (8890073218154543397) -->
+ <skip />
+ <!-- no translation found for volume_icon_description_media (4217311719665194215) -->
+ <skip />
+ <!-- no translation found for volume_icon_description_notification (7044986546477282274) -->
+ <skip />
+ <!-- no translation found for ringtone_default (3789758980357696936) -->
+ <skip />
+ <!-- no translation found for ringtone_default_with_actual (8129563480895990372) -->
+ <skip />
+ <!-- no translation found for ringtone_silent (7937634392408977062) -->
+ <skip />
+ <!-- no translation found for ringtone_picker_title (3515143939175119094) -->
+ <skip />
+ <!-- no translation found for ringtone_unknown (5477919988701784788) -->
+ <skip />
+ <!-- no translation found for wifi_available (7900333017752027322) -->
+ <!-- no translation found for wifi_available_detailed (1140699367193975606) -->
+ <!-- no translation found for wifi_available_sign_in (9157196203958866662) -->
+ <skip />
+ <!-- no translation found for network_available_sign_in (1848877297365446605) -->
+ <skip />
+ <!-- no translation found for network_available_sign_in_detailed (8000081941447976118) -->
+ <skip />
+ <!-- no translation found for wifi_no_internet (8451173622563841546) -->
+ <skip />
+ <!-- no translation found for wifi_no_internet_detailed (7593858887662270131) -->
+ <skip />
+ <!-- no translation found for wifi_watchdog_network_disabled (7904214231651546347) -->
+ <skip />
+ <!-- no translation found for wifi_watchdog_network_disabled_detailed (5548780776418332675) -->
+ <skip />
+ <!-- no translation found for wifi_connect_alert_title (8455846016001810172) -->
+ <skip />
+ <!-- no translation found for wifi_connect_alert_message (6451273376815958922) -->
+ <skip />
+ <!-- no translation found for wifi_connect_default_application (7143109390475484319) -->
+ <skip />
+ <!-- no translation found for wifi_p2p_dialog_title (97611782659324517) -->
+ <skip />
+ <!-- no translation found for wifi_p2p_turnon_message (2909250942299627244) -->
+ <skip />
+ <!-- no translation found for wifi_p2p_failed_message (3763669677935623084) -->
+ <skip />
+ <!-- no translation found for wifi_p2p_enabled_notification_title (2068321881673734886) -->
+ <skip />
+ <!-- no translation found for wifi_p2p_enabled_notification_message (1638949953993894335) -->
+ <skip />
+ <!-- no translation found for accept (1645267259272829559) -->
+ <skip />
+ <!-- no translation found for decline (2112225451706137894) -->
+ <skip />
+ <!-- no translation found for wifi_p2p_invitation_sent_title (1318975185112070734) -->
+ <skip />
+ <!-- no translation found for wifi_p2p_invitation_to_connect_title (4958803948658533637) -->
+ <skip />
+ <!-- no translation found for wifi_p2p_from_message (570389174731951769) -->
+ <skip />
+ <!-- no translation found for wifi_p2p_to_message (248968974522044099) -->
+ <skip />
+ <!-- no translation found for wifi_p2p_enter_pin_message (5920929550367828970) -->
+ <skip />
+ <!-- no translation found for wifi_p2p_show_pin_message (8530563323880921094) -->
+ <skip />
+ <!-- no translation found for wifi_p2p_frequency_conflict_message (8012981257742232475) -->
+ <skip />
+ <!-- no translation found for wifi_p2p_frequency_conflict_message (3087858235069421128) -->
+ <skip />
+ <!-- no translation found for wifi_p2p_frequency_conflict_message (7363907213787469151) -->
+ <skip />
+ <!-- no translation found for select_character (3365550120617701745) -->
+ <skip />
+ <!-- no translation found for sms_control_title (7296612781128917719) -->
+ <skip />
+ <!-- no translation found for sms_control_message (3867899169651496433) -->
+ <skip />
+ <!-- no translation found for sms_control_yes (3663725993855816807) -->
+ <skip />
+ <!-- no translation found for sms_control_no (625438561395534982) -->
+ <skip />
+ <!-- no translation found for sms_short_code_confirm_message (1645436466285310855) -->
+ <skip />
+ <!-- no translation found for sms_short_code_details (5873295990846059400) -->
+ <skip />
+ <!-- no translation found for sms_premium_short_code_details (7869234868023975) -->
+ <skip />
+ <!-- no translation found for sms_short_code_confirm_allow (4458878637111023413) -->
+ <skip />
+ <!-- no translation found for sms_short_code_confirm_deny (2927389840209170706) -->
+ <skip />
+ <!-- no translation found for sms_short_code_remember_choice (5289538592272218136) -->
+ <skip />
+ <!-- no translation found for sms_short_code_remember_undo_instruction (4960944133052287484) -->
+ <skip />
+ <!-- no translation found for sms_short_code_confirm_always_allow (3241181154869493368) -->
+ <skip />
+ <!-- no translation found for sms_short_code_confirm_never_allow (446992765774269673) -->
+ <skip />
+ <!-- no translation found for sim_removed_title (6227712319223226185) -->
+ <skip />
+ <!-- no translation found for sim_removed_message (5450336489923274918) -->
+ <skip />
+ <!-- no translation found for sim_done_button (827949989369963775) -->
+ <skip />
+ <!-- no translation found for sim_added_title (3719670512889674693) -->
+ <skip />
+ <!-- no translation found for sim_added_message (7797975656153714319) -->
+ <skip />
+ <!-- no translation found for sim_restart_button (4722407842815232347) -->
+ <skip />
+ <!-- no translation found for time_picker_dialog_title (8349362623068819295) -->
+ <skip />
+ <!-- no translation found for date_picker_dialog_title (5879450659453782278) -->
+ <skip />
+ <!-- no translation found for date_time_set (5777075614321087758) -->
+ <skip />
+ <!-- no translation found for date_time_done (2507683751759308828) -->
+ <skip />
+ <!-- no translation found for perms_new_perm_prefix (8257740710754301407) -->
+ <skip />
+ <!-- no translation found for perms_description_app (5139836143293299417) -->
+ <skip />
+ <!-- no translation found for no_permissions (7283357728219338112) -->
+ <skip />
+ <!-- no translation found for perm_costs_money (4902470324142151116) -->
+ <skip />
+ <!-- no translation found for dlg_ok (7376953167039865701) -->
+ <skip />
+ <!-- no translation found for usb_charging_notification_title (4004114449249406402) -->
+ <skip />
+ <!-- no translation found for usb_mtp_notification_title (8396264943589760855) -->
+ <skip />
+ <!-- no translation found for usb_ptp_notification_title (1347328437083192112) -->
+ <skip />
+ <!-- no translation found for usb_midi_notification_title (4850904915889144654) -->
+ <skip />
+ <!-- no translation found for usb_accessory_notification_title (7848236974087653666) -->
+ <skip />
+ <!-- no translation found for usb_notification_message (7347368030849048437) -->
+ <skip />
+ <!-- no translation found for adb_active_notification_title (6729044778949189918) -->
+ <skip />
+ <!-- no translation found for adb_active_notification_message (1016654627626476142) -->
+ <skip />
+ <!-- no translation found for share_remote_bugreport_notification_title (3116061729914615290) -->
+ <skip />
+ <!-- no translation found for share_remote_bugreport_notification_message (1310517845557771773) -->
+ <skip />
+ <!-- no translation found for share_remote_bugreport_notification_accept (8203856129078669677) -->
+ <skip />
+ <!-- no translation found for share_remote_bugreport_notification_decline (6337969352057443969) -->
+ <skip />
+ <!-- no translation found for remote_bugreport_progress_notification_title (2785600634417078622) -->
+ <skip />
+ <!-- no translation found for remote_bugreport_progress_notification_message_can_cancel (5743435483005099451) -->
+ <skip />
+ <!-- no translation found for select_input_method (8547250819326693584) -->
+ <skip />
+ <!-- no translation found for configure_input_methods (4769971288371946846) -->
+ <skip />
+ <!-- no translation found for show_ime (2506087537466597099) -->
+ <skip />
+ <!-- no translation found for hardware (194658061510127999) -->
+ <skip />
+ <!-- no translation found for select_keyboard_layout_notification_title (1407367017263030773) -->
+ <skip />
+ <!-- no translation found for select_keyboard_layout_notification_message (4465907700449257063) -->
+ <skip />
+ <!-- no translation found for fast_scroll_alphabet (5433275485499039199) -->
+ <skip />
+ <!-- no translation found for fast_scroll_numeric_alphabet (4030170524595123610) -->
+ <skip />
+ <!-- no translation found for candidates_style (4333913089637062257) -->
+ <skip />
+ <!-- no translation found for ext_media_checking_notification_title (5734005953288045806) -->
+ <skip />
+ <!-- no translation found for ext_media_checking_notification_message (4747432538578886744) -->
+ <skip />
+ <!-- no translation found for ext_media_new_notification_message (7589986898808506239) -->
+ <skip />
+ <!-- no translation found for ext_media_ready_notification_message (4083398150380114462) -->
+ <skip />
+ <!-- no translation found for ext_media_unmountable_notification_title (8295123366236989588) -->
+ <skip />
+ <!-- no translation found for ext_media_unmountable_notification_message (1586311304430052169) -->
+ <skip />
+ <!-- no translation found for ext_media_unsupported_notification_title (3797642322958803257) -->
+ <skip />
+ <!-- no translation found for ext_media_unsupported_notification_message (8789610369456474891) -->
+ <skip />
+ <!-- no translation found for ext_media_badremoval_notification_title (3206248947375505416) -->
+ <skip />
+ <!-- no translation found for ext_media_badremoval_notification_message (380176703346946313) -->
+ <skip />
+ <!-- no translation found for ext_media_nomedia_notification_title (1704840188641749091) -->
+ <skip />
+ <!-- no translation found for ext_media_nomedia_notification_message (6471542972147056586) -->
+ <skip />
+ <!-- no translation found for ext_media_unmounting_notification_title (640674168454809372) -->
+ <skip />
+ <!-- no translation found for ext_media_unmounting_notification_message (4182843895023357756) -->
+ <skip />
+ <!-- no translation found for ext_media_init_action (7952885510091978278) -->
+ <skip />
+ <!-- no translation found for ext_media_unmount_action (1121883233103278199) -->
+ <skip />
+ <!-- no translation found for ext_media_browse_action (8322172381028546087) -->
+ <skip />
+ <!-- no translation found for ext_media_missing_title (620980315821543904) -->
+ <skip />
+ <!-- no translation found for ext_media_missing_message (5761133583368750174) -->
+ <skip />
+ <!-- no translation found for ext_media_move_specific_title (1471100343872375842) -->
+ <skip />
+ <!-- no translation found for ext_media_move_title (1022809140035962662) -->
+ <skip />
+ <!-- no translation found for ext_media_move_success_title (8575300932957954671) -->
+ <skip />
+ <!-- no translation found for ext_media_move_success_message (4199002148206265426) -->
+ <skip />
+ <!-- no translation found for ext_media_move_failure_title (7613189040358789908) -->
+ <skip />
+ <!-- no translation found for ext_media_move_failure_message (1978096440816403360) -->
+ <skip />
+ <!-- no translation found for ext_media_status_removed (6576172423185918739) -->
+ <skip />
+ <!-- no translation found for ext_media_status_unmounted (2551560878416417752) -->
+ <skip />
+ <!-- no translation found for ext_media_status_checking (6193921557423194949) -->
+ <skip />
+ <!-- no translation found for ext_media_status_mounted (7253821726503179202) -->
+ <skip />
+ <!-- no translation found for ext_media_status_mounted_ro (8020978752406021015) -->
+ <skip />
+ <!-- no translation found for ext_media_status_bad_removal (8395398567890329422) -->
+ <skip />
+ <!-- no translation found for ext_media_status_unmountable (805594039236667894) -->
+ <skip />
+ <!-- no translation found for ext_media_status_unsupported (4691436711745681828) -->
+ <skip />
+ <!-- no translation found for ext_media_status_ejecting (5463887263101234174) -->
+ <skip />
+ <!-- no translation found for ext_media_status_formatting (1085079556538644861) -->
+ <skip />
+ <!-- no translation found for ext_media_status_missing (5638633895221670766) -->
+ <skip />
+ <!-- no translation found for activity_list_empty (1675388330786841066) -->
+ <skip />
+ <!-- no translation found for permlab_route_media_output (6243022988998972085) -->
+ <skip />
+ <!-- no translation found for permdesc_route_media_output (4932818749547244346) -->
+ <skip />
+ <!-- no translation found for permlab_readInstallSessions (3713753067455750349) -->
+ <skip />
+ <!-- no translation found for permdesc_readInstallSessions (2049771699626019849) -->
+ <skip />
+ <!-- no translation found for permlab_requestInstallPackages (5782013576218172577) -->
+ <skip />
+ <!-- no translation found for permdesc_requestInstallPackages (5740101072486783082) -->
+ <skip />
+ <!-- no translation found for tutorial_double_tap_to_zoom_message_short (4070433208160063538) -->
+ <skip />
+ <!-- no translation found for gadget_host_error_inflating (4882004314906466162) -->
+ <skip />
+ <!-- no translation found for ime_action_go (8320845651737369027) -->
+ <skip />
+ <!-- no translation found for ime_action_search (658110271822807811) -->
+ <skip />
+ <!-- no translation found for ime_action_send (2316166556349314424) -->
+ <skip />
+ <!-- no translation found for ime_action_next (3138843904009813834) -->
+ <skip />
+ <!-- no translation found for ime_action_done (8971516117910934605) -->
+ <skip />
+ <!-- no translation found for ime_action_previous (1443550039250105948) -->
+ <skip />
+ <!-- no translation found for ime_action_default (2840921885558045721) -->
+ <skip />
+ <!-- no translation found for dial_number_using (5789176425167573586) -->
+ <skip />
+ <!-- no translation found for create_contact_using (4947405226788104538) -->
+ <skip />
+ <!-- no translation found for grant_credentials_permission_message_header (2106103817937859662) -->
+ <skip />
+ <!-- no translation found for grant_credentials_permission_message_footer (3125211343379376561) -->
+ <skip />
+ <!-- no translation found for grant_permissions_header_text (6874497408201826708) -->
+ <skip />
+ <!-- no translation found for allow (7225948811296386551) -->
+ <skip />
+ <!-- no translation found for deny (2081879885755434506) -->
+ <skip />
+ <!-- no translation found for permission_request_notification_title (6486759795926237907) -->
+ <skip />
+ <!-- no translation found for permission_request_notification_with_subtitle (8530393139639560189) -->
+ <skip />
+ <!-- no translation found for forward_intent_to_owner (1207197447013960896) -->
+ <skip />
+ <!-- no translation found for forward_intent_to_work (621480743856004612) -->
+ <skip />
+ <!-- no translation found for input_method_binding_label (1283557179944992649) -->
+ <skip />
+ <!-- no translation found for sync_binding_label (3687969138375092423) -->
+ <skip />
+ <!-- no translation found for accessibility_binding_label (4148120742096474641) -->
+ <skip />
+ <!-- no translation found for wallpaper_binding_label (1240087844304687662) -->
+ <skip />
+ <!-- no translation found for chooser_wallpaper (7873476199295190279) -->
+ <skip />
+ <!-- no translation found for notification_listener_binding_label (2014162835481906429) -->
+ <skip />
+ <!-- no translation found for condition_provider_service_binding_label (1321343352906524564) -->
+ <skip />
+ <!-- no translation found for notification_assistant_binding_label (909456055569102952) -->
+ <skip />
+ <!-- no translation found for vpn_title (19615213552042827) -->
+ <skip />
+ <!-- no translation found for vpn_title_long (6400714798049252294) -->
+ <skip />
+ <!-- no translation found for vpn_text (3011306607126450322) -->
+ <skip />
+ <!-- no translation found for vpn_text_long (6407351006249174473) -->
+ <skip />
+ <!-- no translation found for vpn_lockdown_connecting (6443438964440960745) -->
+ <skip />
+ <!-- no translation found for vpn_lockdown_connected (8202679674819213931) -->
+ <skip />
+ <!-- no translation found for vpn_lockdown_error (6009249814034708175) -->
+ <skip />
+ <!-- no translation found for vpn_lockdown_config (6415899150671537970) -->
+ <skip />
+ <!-- no translation found for upload_file (2897957172366730416) -->
+ <skip />
+ <!-- no translation found for no_file_chosen (6363648562170759465) -->
+ <skip />
+ <!-- no translation found for reset (2448168080964209908) -->
+ <skip />
+ <!-- no translation found for submit (1602335572089911941) -->
+ <skip />
+ <!-- no translation found for car_mode_disable_notification_title (3164768212003864316) -->
+ <skip />
+ <!-- no translation found for car_mode_disable_notification_message (8035230537563503262) -->
+ <skip />
+ <!-- no translation found for tethered_notification_title (3146694234398202601) -->
+ <skip />
+ <!-- no translation found for tethered_notification_message (6857031760103062982) -->
+ <skip />
+ <!-- no translation found for back_button_label (2300470004503343439) -->
+ <skip />
+ <!-- no translation found for next_button_label (1080555104677992408) -->
+ <skip />
+ <!-- no translation found for skip_button_label (1275362299471631819) -->
+ <skip />
+ <!-- no translation found for no_matches (8129421908915840737) -->
+ <skip />
+ <!-- no translation found for find_on_page (1946799233822820384) -->
+ <skip />
+ <!-- no translation found for matches_found (1210884353962081884) -->
+ <!-- no translation found for action_mode_done (7217581640461922289) -->
+ <skip />
+ <!-- no translation found for progress_erasing (4521573321524340058) -->
+ <skip />
+ <!-- no translation found for progress_erasing (6596988875507043042) -->
+ <skip />
+ <!-- no translation found for share (1778686618230011964) -->
+ <skip />
+ <!-- no translation found for find (4808270900322985960) -->
+ <skip />
+ <!-- no translation found for websearch (4337157977400211589) -->
+ <skip />
+ <!-- no translation found for find_next (5742124618942193978) -->
+ <skip />
+ <!-- no translation found for find_previous (2196723669388360506) -->
+ <skip />
+ <!-- no translation found for gpsNotifTicker (5622683912616496172) -->
+ <skip />
+ <!-- no translation found for gpsNotifTitle (5446858717157416839) -->
+ <skip />
+ <!-- no translation found for gpsNotifMessage (1374718023224000702) -->
+ <skip />
+ <!-- no translation found for gpsVerifYes (2346566072867213563) -->
+ <skip />
+ <!-- no translation found for gpsVerifNo (1146564937346454865) -->
+ <skip />
+ <!-- no translation found for sync_too_many_deletes (5296321850662746890) -->
+ <skip />
+ <!-- no translation found for sync_too_many_deletes_desc (496551671008694245) -->
+ <skip />
+ <!-- no translation found for sync_really_delete (2572600103122596243) -->
+ <skip />
+ <!-- no translation found for sync_undo_deletes (2941317360600338602) -->
+ <skip />
+ <!-- no translation found for sync_do_nothing (3743764740430821845) -->
+ <skip />
+ <!-- no translation found for choose_account_label (5655203089746423927) -->
+ <skip />
+ <!-- no translation found for add_account_label (2935267344849993553) -->
+ <skip />
+ <!-- no translation found for add_account_button_label (3611982894853435874) -->
+ <skip />
+ <!-- no translation found for number_picker_increment_button (2412072272832284313) -->
+ <skip />
+ <!-- no translation found for number_picker_decrement_button (476050778386779067) -->
+ <skip />
+ <!-- no translation found for number_picker_increment_scroll_mode (3073101067441638428) -->
+ <skip />
+ <!-- no translation found for number_picker_increment_scroll_action (9101473045891835490) -->
+ <skip />
+ <!-- no translation found for time_picker_increment_minute_button (8865885114028614321) -->
+ <skip />
+ <!-- no translation found for time_picker_decrement_minute_button (6246834937080684791) -->
+ <skip />
+ <!-- no translation found for time_picker_increment_hour_button (3652056055810223139) -->
+ <skip />
+ <!-- no translation found for time_picker_decrement_hour_button (1377479863429214792) -->
+ <skip />
+ <!-- no translation found for time_picker_increment_set_pm_button (4147590696151230863) -->
+ <skip />
+ <!-- no translation found for time_picker_decrement_set_am_button (8302140353539486752) -->
+ <skip />
+ <!-- no translation found for date_picker_increment_month_button (5369998479067934110) -->
+ <skip />
+ <!-- no translation found for date_picker_decrement_month_button (1832698995541726019) -->
+ <skip />
+ <!-- no translation found for date_picker_increment_day_button (7130465412308173903) -->
+ <skip />
+ <!-- no translation found for date_picker_decrement_day_button (4131881521818750031) -->
+ <skip />
+ <!-- no translation found for date_picker_increment_year_button (6318697384310808899) -->
+ <skip />
+ <!-- no translation found for date_picker_decrement_year_button (4482021813491121717) -->
+ <skip />
+ <!-- no translation found for date_picker_prev_month_button (2858244643992056505) -->
+ <skip />
+ <!-- no translation found for date_picker_next_month_button (5559507736887605055) -->
+ <skip />
+ <!-- no translation found for keyboardview_keycode_alt (4856868820040051939) -->
+ <skip />
+ <!-- no translation found for keyboardview_keycode_cancel (1203984017245783244) -->
+ <skip />
+ <!-- no translation found for keyboardview_keycode_delete (3337914833206635744) -->
+ <skip />
+ <!-- no translation found for keyboardview_keycode_done (1992571118466679775) -->
+ <skip />
+ <!-- no translation found for keyboardview_keycode_mode_change (4547387741906537519) -->
+ <skip />
+ <!-- no translation found for keyboardview_keycode_shift (2270748814315147690) -->
+ <skip />
+ <!-- no translation found for keyboardview_keycode_enter (2985864015076059467) -->
+ <skip />
+ <!-- no translation found for activitychooserview_choose_application (2125168057199941199) -->
+ <skip />
+ <!-- no translation found for activitychooserview_choose_application_error (8624618365481126668) -->
+ <skip />
+ <!-- no translation found for shareactionprovider_share_with (806688056141131819) -->
+ <skip />
+ <!-- no translation found for shareactionprovider_share_with_application (5627411384638389738) -->
+ <skip />
+ <!-- no translation found for content_description_sliding_handle (415975056159262248) -->
+ <skip />
+ <!-- no translation found for description_target_unlock_tablet (3833195335629795055) -->
+ <skip />
+ <!-- no translation found for keyboard_headset_required_to_hear_password (7011927352267668657) -->
+ <skip />
+ <!-- no translation found for keyboard_password_character_no_headset (2859873770886153678) -->
+ <skip />
+ <!-- no translation found for action_bar_home_description (5293600496601490216) -->
+ <skip />
+ <!-- no translation found for action_bar_up_description (2237496562952152589) -->
+ <skip />
+ <!-- no translation found for action_menu_overflow_description (2295659037509008453) -->
+ <skip />
+ <!-- no translation found for action_bar_home_description_format (7965984360903693903) -->
+ <skip />
+ <!-- no translation found for action_bar_home_subtitle_description_format (6985546530471780727) -->
+ <skip />
+ <!-- no translation found for storage_internal (4891916833657929263) -->
+ <skip />
+ <!-- no translation found for storage_sd_card (3282948861378286745) -->
+ <skip />
+ <!-- no translation found for storage_sd_card_label (6347111320774379257) -->
+ <skip />
+ <!-- no translation found for storage_usb_drive (6261899683292244209) -->
+ <skip />
+ <!-- no translation found for storage_usb_drive_label (4501418548927759953) -->
+ <skip />
+ <!-- no translation found for storage_usb (3017954059538517278) -->
+ <skip />
+ <!-- no translation found for extract_edit_menu_button (8940478730496610137) -->
+ <skip />
+ <!-- no translation found for data_usage_warning_title (1955638862122232342) -->
+ <skip />
+ <!-- no translation found for data_usage_warning_body (2814673551471969954) -->
+ <skip />
+ <!-- no translation found for data_usage_3g_limit_title (4361523876818447683) -->
+ <skip />
+ <!-- no translation found for data_usage_4g_limit_title (4609566827219442376) -->
+ <skip />
+ <!-- no translation found for data_usage_mobile_limit_title (557158376602636112) -->
+ <skip />
+ <!-- no translation found for data_usage_wifi_limit_title (5803363779034792676) -->
+ <skip />
+ <!-- no translation found for data_usage_limit_body (291731708279614081) -->
+ <skip />
+ <!-- no translation found for data_usage_3g_limit_snoozed_title (7026739121138005231) -->
+ <skip />
+ <!-- no translation found for data_usage_4g_limit_snoozed_title (1106562779311209039) -->
+ <skip />
+ <!-- no translation found for data_usage_mobile_limit_snoozed_title (4941346653729943789) -->
+ <skip />
+ <!-- no translation found for data_usage_wifi_limit_snoozed_title (8743856006384825974) -->
+ <skip />
+ <!-- no translation found for data_usage_limit_snoozed_body (7035490278298441767) -->
+ <skip />
+ <!-- no translation found for data_usage_restricted_title (5965157361036321914) -->
+ <skip />
+ <!-- no translation found for data_usage_restricted_body (6741521330997452990) -->
+ <skip />
+ <!-- no translation found for ssl_certificate (6510040486049237639) -->
+ <skip />
+ <!-- no translation found for ssl_certificate_is_valid (6825263250774569373) -->
+ <skip />
+ <!-- no translation found for issued_to (454239480274921032) -->
+ <skip />
+ <!-- no translation found for common_name (2233209299434172646) -->
+ <skip />
+ <!-- no translation found for org_name (6973561190762085236) -->
+ <skip />
+ <!-- no translation found for org_unit (7265981890422070383) -->
+ <skip />
+ <!-- no translation found for issued_by (2647584988057481566) -->
+ <skip />
+ <!-- no translation found for validity_period (8818886137545983110) -->
+ <skip />
+ <!-- no translation found for issued_on (5895017404361397232) -->
+ <skip />
+ <!-- no translation found for expires_on (3676242949915959821) -->
+ <skip />
+ <!-- no translation found for serial_number (758814067660862493) -->
+ <skip />
+ <!-- no translation found for fingerprints (4516019619850763049) -->
+ <skip />
+ <!-- no translation found for sha256_fingerprint (4391271286477279263) -->
+ <skip />
+ <!-- no translation found for sha1_fingerprint (7930330235269404581) -->
+ <skip />
+ <!-- no translation found for activity_chooser_view_see_all (4292569383976636200) -->
+ <skip />
+ <!-- no translation found for activity_chooser_view_dialog_title_default (4710013864974040615) -->
+ <skip />
+ <!-- no translation found for share_action_provider_share_with (5247684435979149216) -->
+ <skip />
+ <!-- no translation found for sending (3245653681008218030) -->
+ <skip />
+ <!-- no translation found for launchBrowserDefault (2057951947297614725) -->
+ <skip />
+ <!-- no translation found for SetupCallDefault (5834948469253758575) -->
+ <skip />
+ <!-- no translation found for activity_resolver_use_always (8017770747801494933) -->
+ <skip />
+ <!-- no translation found for activity_resolver_use_once (2404644797149173758) -->
+ <skip />
+ <!-- no translation found for activity_resolver_work_profiles_support (185598180676883455) -->
+ <skip />
+ <!-- no translation found for default_audio_route_name (4617053898167127471) -->
+ <skip />
+ <!-- no translation found for default_audio_route_name (9158088547603019321) -->
+ <skip />
+ <!-- no translation found for default_audio_route_name (4239291273420140123) -->
+ <skip />
+ <!-- no translation found for default_audio_route_name_headphones (8119971843803439110) -->
+ <skip />
+ <!-- no translation found for default_audio_route_name_dock_speakers (6240602982276591864) -->
+ <skip />
+ <!-- no translation found for default_media_route_name_hdmi (2450970399023478055) -->
+ <skip />
+ <!-- no translation found for default_audio_route_category_name (3722811174003886946) -->
+ <skip />
+ <!-- no translation found for bluetooth_a2dp_audio_route_name (8575624030406771015) -->
+ <skip />
+ <!-- no translation found for wireless_display_route_description (9070346425023979651) -->
+ <skip />
+ <!-- no translation found for media_route_button_content_description (591703006349356016) -->
+ <skip />
+ <!-- no translation found for media_route_chooser_title (1751618554539087622) -->
+ <skip />
+ <!-- no translation found for media_route_chooser_title_for_remote_display (3395541745872017583) -->
+ <skip />
+ <!-- no translation found for media_route_chooser_searching (4776236202610828706) -->
+ <skip />
+ <!-- no translation found for media_route_chooser_extended_settings (87015534236701604) -->
+ <skip />
+ <!-- no translation found for media_route_controller_disconnect (8966120286374158649) -->
+ <skip />
+ <!-- no translation found for media_route_status_scanning (7279908761758293783) -->
+ <skip />
+ <!-- no translation found for media_route_status_connecting (6422571716007825440) -->
+ <skip />
+ <!-- no translation found for media_route_status_available (6983258067194649391) -->
+ <skip />
+ <!-- no translation found for media_route_status_not_available (6739899962681886401) -->
+ <skip />
+ <!-- no translation found for media_route_status_in_use (4533786031090198063) -->
+ <skip />
+ <!-- no translation found for display_manager_built_in_display_name (2583134294292563941) -->
+ <skip />
+ <!-- no translation found for display_manager_hdmi_display_name (1555264559227470109) -->
+ <skip />
+ <!-- no translation found for display_manager_overlay_display_name (5142365982271620716) -->
+ <skip />
+ <!-- no translation found for display_manager_overlay_display_title (652124517672257172) -->
+ <skip />
+ <!-- no translation found for display_manager_overlay_display_secure_suffix (6022119702628572080) -->
+ <skip />
+ <!-- no translation found for kg_forgot_pattern_button_text (8852021467868220608) -->
+ <skip />
+ <!-- no translation found for kg_wrong_pattern (1850806070801358830) -->
+ <skip />
+ <!-- no translation found for kg_wrong_password (2333281762128113157) -->
+ <skip />
+ <!-- no translation found for kg_wrong_pin (1131306510833563801) -->
+ <skip />
+ <!-- no translation found for kg_too_many_failed_attempts_countdown (6358110221603297548) -->
+ <skip />
+ <!-- no translation found for kg_pattern_instructions (398978611683075868) -->
+ <skip />
+ <!-- no translation found for kg_sim_pin_instructions (2319508550934557331) -->
+ <skip />
+ <!-- no translation found for kg_pin_instructions (2377242233495111557) -->
+ <skip />
+ <!-- no translation found for kg_password_instructions (5753646556186936819) -->
+ <skip />
+ <!-- no translation found for kg_puk_enter_puk_hint (453227143861735537) -->
+ <skip />
+ <!-- no translation found for kg_puk_enter_pin_hint (7871604527429602024) -->
+ <skip />
+ <!-- no translation found for kg_enter_confirm_pin_hint (325676184762529976) -->
+ <skip />
+ <!-- no translation found for kg_sim_unlock_progress_dialog_message (8950398016976865762) -->
+ <skip />
+ <!-- no translation found for kg_password_wrong_pin_code (1139324887413846912) -->
+ <skip />
+ <!-- no translation found for kg_invalid_sim_pin_hint (8795159358110620001) -->
+ <skip />
+ <!-- no translation found for kg_invalid_sim_puk_hint (6025069204539532000) -->
+ <skip />
+ <!-- no translation found for kg_invalid_puk (3638289409676051243) -->
+ <skip />
+ <!-- no translation found for kg_invalid_confirm_pin_hint (7003469261464593516) -->
+ <skip />
+ <!-- no translation found for kg_login_too_many_attempts (6486842094005698475) -->
+ <skip />
+ <!-- no translation found for kg_login_instructions (1100551261265506448) -->
+ <skip />
+ <!-- no translation found for kg_login_username_hint (5718534272070920364) -->
+ <skip />
+ <!-- no translation found for kg_login_password_hint (9057289103827298549) -->
+ <skip />
+ <!-- no translation found for kg_login_submit_button (5355904582674054702) -->
+ <skip />
+ <!-- no translation found for kg_login_invalid_input (5754664119319872197) -->
+ <skip />
+ <!-- no translation found for kg_login_account_recovery_hint (5690709132841752974) -->
+ <skip />
+ <!-- no translation found for kg_login_checking_password (1052685197710252395) -->
+ <skip />
+ <!-- no translation found for kg_too_many_failed_pin_attempts_dialog_message (8276745642049502550) -->
+ <skip />
+ <!-- no translation found for kg_too_many_failed_password_attempts_dialog_message (7813713389422226531) -->
+ <skip />
+ <!-- no translation found for kg_too_many_failed_pattern_attempts_dialog_message (74089475965050805) -->
+ <skip />
+ <!-- no translation found for kg_failed_attempts_almost_at_wipe (1575557200627128949) -->
+ <skip />
+ <!-- no translation found for kg_failed_attempts_almost_at_wipe (5621231220154419413) -->
+ <skip />
+ <!-- no translation found for kg_failed_attempts_almost_at_wipe (4051015943038199910) -->
+ <skip />
+ <!-- no translation found for kg_failed_attempts_now_wiping (2072996269148483637) -->
+ <skip />
+ <!-- no translation found for kg_failed_attempts_now_wiping (4987878286750741463) -->
+ <skip />
+ <!-- no translation found for kg_failed_attempts_now_wiping (4817627474419471518) -->
+ <skip />
+ <!-- no translation found for kg_failed_attempts_almost_at_login (3253575572118914370) -->
+ <skip />
+ <!-- no translation found for kg_failed_attempts_almost_at_login (4224651132862313471) -->
+ <skip />
+ <!-- no translation found for kg_failed_attempts_almost_at_login (1437638152015574839) -->
+ <skip />
+ <!-- no translation found for kg_text_message_separator (4160700433287233771) -->
+ <skip />
+ <!-- no translation found for kg_reordering_delete_drop_target_text (7899202978204438708) -->
+ <skip />
+ <!-- no translation found for safe_media_volume_warning (2276318909314492312) -->
+ <skip />
+ <!-- no translation found for continue_to_enable_accessibility (1626427372316070258) -->
+ <skip />
+ <!-- no translation found for accessibility_enabled (1381972048564547685) -->
+ <skip />
+ <!-- no translation found for enable_accessibility_canceled (3833923257966635673) -->
+ <skip />
+ <!-- no translation found for user_switched (3768006783166984410) -->
+ <skip />
+ <!-- no translation found for user_switching_message (2871009331809089783) -->
+ <skip />
+ <!-- no translation found for user_logging_out_message (8939524935808875155) -->
+ <skip />
+ <!-- no translation found for owner_name (2716755460376028154) -->
+ <!-- no translation found for owner_name (3879126011135546571) -->
+ <skip />
+ <!-- no translation found for error_message_title (4510373083082500195) -->
+ <skip />
+ <!-- no translation found for error_message_change_not_allowed (1347282344200417578) -->
+ <skip />
+ <!-- no translation found for app_not_found (3429141853498927379) -->
+ <skip />
+ <!-- no translation found for revoke (5404479185228271586) -->
+ <skip />
+ <!-- no translation found for mediasize_iso_a0 (1994474252931294172) -->
+ <skip />
+ <!-- no translation found for mediasize_iso_a1 (3333060421529791786) -->
+ <skip />
+ <!-- no translation found for mediasize_iso_a2 (3097535991925798280) -->
+ <skip />
+ <!-- no translation found for mediasize_iso_a3 (3023213259314236123) -->
+ <skip />
+ <!-- no translation found for mediasize_iso_a4 (231745325296873764) -->
+ <skip />
+ <!-- no translation found for mediasize_iso_a5 (3484327407340865411) -->
+ <skip />
+ <!-- no translation found for mediasize_iso_a6 (4861908487129577530) -->
+ <skip />
+ <!-- no translation found for mediasize_iso_a7 (5890208588072936130) -->
+ <skip />
+ <!-- no translation found for mediasize_iso_a8 (4319425041085816612) -->
+ <skip />
+ <!-- no translation found for mediasize_iso_a9 (4882220529506432008) -->
+ <skip />
+ <!-- no translation found for mediasize_iso_a10 (2382866026365359391) -->
+ <skip />
+ <!-- no translation found for mediasize_iso_b0 (3651827147402009675) -->
+ <skip />
+ <!-- no translation found for mediasize_iso_b1 (6072859628278739957) -->
+ <skip />
+ <!-- no translation found for mediasize_iso_b2 (1348731852150380378) -->
+ <skip />
+ <!-- no translation found for mediasize_iso_b3 (2612510181259261379) -->
+ <skip />
+ <!-- no translation found for mediasize_iso_b4 (695151378838115434) -->
+ <skip />
+ <!-- no translation found for mediasize_iso_b5 (4863754285582212487) -->
+ <skip />
+ <!-- no translation found for mediasize_iso_b6 (5305816292139647241) -->
+ <skip />
+ <!-- no translation found for mediasize_iso_b7 (531673542602786624) -->
+ <skip />
+ <!-- no translation found for mediasize_iso_b8 (9164474595708850034) -->
+ <skip />
+ <!-- no translation found for mediasize_iso_b9 (282102976764774160) -->
+ <skip />
+ <!-- no translation found for mediasize_iso_b10 (4517141714407898976) -->
+ <skip />
+ <!-- no translation found for mediasize_iso_c0 (3103521357901591100) -->
+ <skip />
+ <!-- no translation found for mediasize_iso_c1 (1231954105985048595) -->
+ <skip />
+ <!-- no translation found for mediasize_iso_c2 (927702816980087462) -->
+ <skip />
+ <!-- no translation found for mediasize_iso_c3 (835154173518304159) -->
+ <skip />
+ <!-- no translation found for mediasize_iso_c4 (5095951985108194011) -->
+ <skip />
+ <!-- no translation found for mediasize_iso_c5 (1985397450332305739) -->
+ <skip />
+ <!-- no translation found for mediasize_iso_c6 (8147421924174693013) -->
+ <skip />
+ <!-- no translation found for mediasize_iso_c7 (8993994925276122950) -->
+ <skip />
+ <!-- no translation found for mediasize_iso_c8 (6871178104139598957) -->
+ <skip />
+ <!-- no translation found for mediasize_iso_c9 (7983532635227561362) -->
+ <skip />
+ <!-- no translation found for mediasize_iso_c10 (5040764293406765584) -->
+ <skip />
+ <!-- no translation found for mediasize_na_letter (2841414839888344296) -->
+ <skip />
+ <!-- no translation found for mediasize_na_gvrnmt_letter (5295836838862962809) -->
+ <skip />
+ <!-- no translation found for mediasize_na_legal (8621364037680465666) -->
+ <skip />
+ <!-- no translation found for mediasize_na_junior_legal (3309324162155085904) -->
+ <skip />
+ <!-- no translation found for mediasize_na_ledger (5567030340509075333) -->
+ <skip />
+ <!-- no translation found for mediasize_na_tabloid (4571735038501661757) -->
+ <skip />
+ <!-- no translation found for mediasize_na_index_3x5 (5182901917818625126) -->
+ <skip />
+ <!-- no translation found for mediasize_na_index_4x6 (7687620625422312396) -->
+ <skip />
+ <!-- no translation found for mediasize_na_index_5x8 (8834215284646872800) -->
+ <skip />
+ <!-- no translation found for mediasize_na_monarch (213639906956550754) -->
+ <skip />
+ <!-- no translation found for mediasize_na_quarto (835778493593023223) -->
+ <skip />
+ <!-- no translation found for mediasize_na_foolscap (1573911237983677138) -->
+ <skip />
+ <!-- no translation found for mediasize_chinese_roc_8k (3626855847189438896) -->
+ <skip />
+ <!-- no translation found for mediasize_chinese_roc_16k (9182191577022943355) -->
+ <skip />
+ <!-- no translation found for mediasize_chinese_prc_1 (4793232644980170500) -->
+ <skip />
+ <!-- no translation found for mediasize_chinese_prc_2 (5404109730975720670) -->
+ <skip />
+ <!-- no translation found for mediasize_chinese_prc_3 (1335092253339363526) -->
+ <skip />
+ <!-- no translation found for mediasize_chinese_prc_4 (9167997800486569834) -->
+ <skip />
+ <!-- no translation found for mediasize_chinese_prc_5 (845875168823541497) -->
+ <skip />
+ <!-- no translation found for mediasize_chinese_prc_6 (3220325667692648789) -->
+ <skip />
+ <!-- no translation found for mediasize_chinese_prc_7 (1776792138507038527) -->
+ <skip />
+ <!-- no translation found for mediasize_chinese_prc_8 (1417176642687456692) -->
+ <skip />
+ <!-- no translation found for mediasize_chinese_prc_9 (4785983473123798365) -->
+ <skip />
+ <!-- no translation found for mediasize_chinese_prc_10 (7847982299391851899) -->
+ <skip />
+ <!-- no translation found for mediasize_chinese_prc_16k (262793383539980677) -->
+ <skip />
+ <!-- no translation found for mediasize_chinese_om_pa_kai (5256815579447959814) -->
+ <skip />
+ <!-- no translation found for mediasize_chinese_om_dai_pa_kai (7336412963441354407) -->
+ <skip />
+ <!-- no translation found for mediasize_chinese_om_jurro_ku_kai (6324465444100490742) -->
+ <skip />
+ <!-- no translation found for mediasize_japanese_jis_b10 (1787262845627694376) -->
+ <skip />
+ <!-- no translation found for mediasize_japanese_jis_b9 (3336035783663287470) -->
+ <skip />
+ <!-- no translation found for mediasize_japanese_jis_b8 (6195398299104345731) -->
+ <skip />
+ <!-- no translation found for mediasize_japanese_jis_b7 (1674621886902828884) -->
+ <skip />
+ <!-- no translation found for mediasize_japanese_jis_b6 (4170576286062657435) -->
+ <skip />
+ <!-- no translation found for mediasize_japanese_jis_b5 (4899297958100032533) -->
+ <skip />
+ <!-- no translation found for mediasize_japanese_jis_b4 (4213158129126666847) -->
+ <skip />
+ <!-- no translation found for mediasize_japanese_jis_b3 (8513715307410310696) -->
+ <skip />
+ <!-- no translation found for mediasize_japanese_jis_b2 (4777690211897131190) -->
+ <skip />
+ <!-- no translation found for mediasize_japanese_jis_b1 (4608142385457034603) -->
+ <skip />
+ <!-- no translation found for mediasize_japanese_jis_b0 (7587108366572243991) -->
+ <skip />
+ <!-- no translation found for mediasize_japanese_jis_exec (5244075432263649068) -->
+ <skip />
+ <!-- no translation found for mediasize_japanese_chou4 (4941652015032631361) -->
+ <skip />
+ <!-- no translation found for mediasize_japanese_chou3 (6387319169263957010) -->
+ <skip />
+ <!-- no translation found for mediasize_japanese_chou2 (1299112025415343982) -->
+ <skip />
+ <!-- no translation found for mediasize_japanese_hagaki (8070115620644254565) -->
+ <skip />
+ <!-- no translation found for mediasize_japanese_oufuku (6049065587307896564) -->
+ <skip />
+ <!-- no translation found for mediasize_japanese_kahu (6872696027560065173) -->
+ <skip />
+ <!-- no translation found for mediasize_japanese_kaku2 (2359077233775455405) -->
+ <skip />
+ <!-- no translation found for mediasize_japanese_you4 (2091777168747058008) -->
+ <skip />
+ <!-- no translation found for mediasize_unknown_portrait (3088043641616409762) -->
+ <skip />
+ <!-- no translation found for mediasize_unknown_landscape (4876995327029361552) -->
+ <skip />
+ <!-- no translation found for write_fail_reason_cancelled (7091258378121627624) -->
+ <skip />
+ <!-- no translation found for write_fail_reason_cannot_write (8132505417935337724) -->
+ <skip />
+ <!-- no translation found for reason_unknown (6048913880184628119) -->
+ <skip />
+ <!-- no translation found for reason_service_unavailable (7824008732243903268) -->
+ <skip />
+ <!-- no translation found for print_service_installed_title (2246317169444081628) -->
+ <skip />
+ <!-- no translation found for print_service_installed_message (5897362931070459152) -->
+ <skip />
+ <!-- no translation found for restr_pin_enter_admin_pin (783643731895143970) -->
+ <skip />
+ <!-- no translation found for restr_pin_enter_pin (3395953421368476103) -->
+ <skip />
+ <!-- no translation found for restr_pin_incorrect (8571512003955077924) -->
+ <skip />
+ <!-- no translation found for restr_pin_enter_old_pin (1462206225512910757) -->
+ <skip />
+ <!-- no translation found for restr_pin_enter_new_pin (5959606691619959184) -->
+ <skip />
+ <!-- no translation found for restr_pin_confirm_pin (8501523829633146239) -->
+ <skip />
+ <!-- no translation found for restr_pin_create_pin (8017600000263450337) -->
+ <skip />
+ <!-- no translation found for restr_pin_error_doesnt_match (2224214190906994548) -->
+ <skip />
+ <!-- no translation found for restr_pin_error_too_short (8173982756265777792) -->
+ <skip />
+ <!-- no translation found for restr_pin_countdown (9061246974881224688) -->
+ <!-- no translation found for restr_pin_try_later (973144472490532377) -->
+ <skip />
+ <!-- no translation found for immersive_cling_title (8394201622932303336) -->
+ <skip />
+ <!-- no translation found for immersive_cling_description (3482371193207536040) -->
+ <skip />
+ <!-- no translation found for immersive_cling_positive (5016839404568297683) -->
+ <skip />
+ <!-- no translation found for done_label (2093726099505892398) -->
+ <skip />
+ <!-- no translation found for hour_picker_description (6698199186859736512) -->
+ <skip />
+ <!-- no translation found for minute_picker_description (8606010966873791190) -->
+ <skip />
+ <!-- no translation found for select_hours (6043079511766008245) -->
+ <skip />
+ <!-- no translation found for select_minutes (3974345615920336087) -->
+ <skip />
+ <!-- no translation found for select_day (7774759604701773332) -->
+ <skip />
+ <!-- no translation found for select_year (7952052866994196170) -->
+ <skip />
+ <!-- no translation found for deleted_key (7659477886625566590) -->
+ <skip />
+ <!-- no translation found for managed_profile_label_badge (2355652472854327647) -->
+ <skip />
+ <!-- no translation found for lock_to_app_toast (7570091317001980053) -->
+ <skip />
+ <!-- no translation found for lock_to_app_toast_accessible (8239120109365070664) -->
+ <skip />
+ <!-- no translation found for lock_to_app_toast_locked (9125176335701699164) -->
+ <skip />
+ <!-- no translation found for lock_to_app_start (6643342070839862795) -->
+ <skip />
+ <!-- no translation found for lock_to_app_exit (8598219838213787430) -->
+ <skip />
+ <!-- no translation found for lock_to_app_unlock_pin (2552556656504331634) -->
+ <skip />
+ <!-- no translation found for lock_to_app_unlock_pattern (4182192144797225137) -->
+ <skip />
+ <!-- no translation found for lock_to_app_unlock_password (6380979775916974414) -->
+ <skip />
+ <!-- no translation found for dock_non_resizeble_text (9156251681042762723) -->
+ <skip />
+ <!-- no translation found for package_installed_device_owner (8420696545959087545) -->
+ <skip />
+ <!-- no translation found for package_updated_device_owner (8856631322440187071) -->
+ <skip />
+ <!-- no translation found for package_deleted_device_owner (7650577387493101353) -->
+ <skip />
+ <!-- no translation found for battery_saver_description (1960431123816253034) -->
+ <skip />
+ <!-- no translation found for zen_mode_duration_minutes_summary (4367877408072000848) -->
+ <!-- no translation found for zen_mode_duration_minutes_summary_short (6830154222366042597) -->
+ <!-- no translation found for zen_mode_duration_hours_summary (8152974162096743862) -->
+ <!-- no translation found for zen_mode_duration_hours_summary_short (4787552595253082371) -->
+ <!-- no translation found for zen_mode_duration_minutes (5127407202506485571) -->
+ <!-- no translation found for zen_mode_duration_minutes_short (2199350154433426128) -->
+ <!-- no translation found for zen_mode_duration_hours (3938821308277433854) -->
+ <!-- no translation found for zen_mode_duration_hours_short (6748277774662434217) -->
+ <!-- no translation found for zen_mode_until (7336308492289875088) -->
+ <skip />
+ <!-- no translation found for zen_mode_alarm (9128205721301330797) -->
+ <skip />
+ <!-- no translation found for zen_mode_forever (7420011936770086993) -->
+ <skip />
+ <!-- no translation found for zen_mode_forever_dnd (3792132696572189081) -->
+ <skip />
+ <!-- no translation found for zen_mode_rule_name_combination (191109939968076477) -->
+ <skip />
+ <!-- no translation found for toolbar_collapse_description (2821479483960330739) -->
+ <skip />
+ <!-- no translation found for zen_mode_feature_name (5254089399895895004) -->
+ <skip />
+ <!-- no translation found for zen_mode_downtime_feature_name (2626974636779860146) -->
+ <skip />
+ <!-- no translation found for zen_mode_default_weeknights_name (3081318299464998143) -->
+ <skip />
+ <!-- no translation found for zen_mode_default_weekends_name (2786495801019345244) -->
+ <skip />
+ <!-- no translation found for zen_mode_default_events_name (8158334939013085363) -->
+ <skip />
+ <!-- no translation found for muted_by (6147073845094180001) -->
+ <skip />
+ <!-- no translation found for system_error_wipe_data (6608165524785354962) -->
+ <skip />
+ <!-- no translation found for system_error_manufacturer (8086872414744210668) -->
+ <skip />
+ <!-- no translation found for stk_cc_ussd_to_dial (5202342984749947872) -->
+ <skip />
+ <!-- no translation found for stk_cc_ussd_to_ss (2345360594181405482) -->
+ <skip />
+ <!-- no translation found for stk_cc_ussd_to_ussd (7466087659967191653) -->
+ <skip />
+ <!-- no translation found for stk_cc_ss_to_dial (2151304435775557162) -->
+ <skip />
+ <!-- no translation found for stk_cc_ss_to_ussd (3951862188105305589) -->
+ <skip />
+ <!-- no translation found for stk_cc_ss_to_ss (5470768854991452695) -->
+ <skip />
+ <!-- no translation found for notification_work_profile_content_description (4600554564103770764) -->
+ <skip />
+ <!-- no translation found for usb_midi_peripheral_name (7221113987741003817) -->
+ <skip />
+ <!-- no translation found for usb_midi_peripheral_manufacturer_name (7176526170008970168) -->
+ <skip />
+ <!-- no translation found for usb_midi_peripheral_product_name (4971827859165280403) -->
+ <skip />
+ <!-- no translation found for floating_toolbar_open_overflow_description (4797287862999444631) -->
+ <skip />
+ <!-- no translation found for floating_toolbar_close_overflow_description (559796923090723804) -->
+ <skip />
+ <!-- no translation found for maximize_button_text (7543285286182446254) -->
+ <skip />
+ <!-- no translation found for close_button_text (3937902162644062866) -->
+ <skip />
+ <!-- no translation found for selected_count (7187339492915744615) -->
+ <!-- no translation found for default_notification_topic_label (227586145791870829) -->
+ <skip />
+ <!-- no translation found for importance_from_topic (3572280439880023233) -->
+ <skip />
+ <!-- no translation found for importance_from_person (9160133597262938296) -->
+ <skip />
+ <!-- no translation found for user_creation_cannot_add (7740333663230045315) -->
+ <skip />
+ <!-- no translation found for user_creation_cannot_add_any_more (6244197709981359266) -->
+ <skip />
+ <!-- no translation found for user_creation_account_exists (4880171855014489789) -->
+ <skip />
+ <!-- no translation found for user_creation_adding (3206420861363021392) -->
+ <skip />
+ <!-- no translation found for language_selection_title (7181332986330337171) -->
+ <skip />
+ <!-- no translation found for country_selection_title (2954859441620215513) -->
+ <skip />
+ <!-- no translation found for search_language_hint (7042102592055108574) -->
+ <skip />
+ <!-- no translation found for language_picker_section_suggested (8414489646861640885) -->
+ <skip />
+ <!-- no translation found for language_picker_section_all (3097279199511617537) -->
+ <skip />
+ <!-- no translation found for locale_search_menu (2560710726687249178) -->
+ <skip />
+</resources>
diff --git a/core/res/res/values-ca/strings.xml b/core/res/res/values-ca/strings.xml
index ba52781..602532c 100644
--- a/core/res/res/values-ca/strings.xml
+++ b/core/res/res/values-ca/strings.xml
@@ -211,15 +211,15 @@
<string name="global_action_bug_report" msgid="7934010578922304799">"Informe d\'error"</string>
<string name="bugreport_title" msgid="2667494803742548533">"Crea informe d\'errors"</string>
<string name="bugreport_message" msgid="398447048750350456">"Es recopilarà informació sobre l\'estat actual del dispositiu i se t\'enviarà per correu electrònic. Passaran uns quants minuts des de l\'inici de l\'informe d\'errors fins al seu enviament, per la qual cosa et recomanem que tinguis paciència."</string>
- <!-- no translation found for bugreport_option_interactive_title (8635056131768862479) -->
+ <string name="bugreport_option_interactive_title" msgid="8635056131768862479">"Informe interactiu"</string>
+ <string name="bugreport_option_interactive_summary" msgid="8180152634022797629">"Utilitza aquesta opció en la majoria de circumstàncies. Et permet fer un seguiment del progrés de l\'informe i introduir més dades sobre el problema. És possible que ometi seccions menys utilitzades que requereixen molt de temps i que no n\'informi."</string>
+ <string name="bugreport_option_full_title" msgid="6354382025840076439">"Informe complet"</string>
+ <!-- no translation found for bugreport_option_full_summary (6687306111256813257) -->
<skip />
- <!-- no translation found for bugreport_option_interactive_summary (8180152634022797629) -->
- <skip />
- <!-- no translation found for bugreport_option_full_title (6354382025840076439) -->
- <skip />
- <!-- no translation found for bugreport_option_full_summary (6440582052207304578) -->
- <skip />
- <!-- no translation found for bugreport_countdown (6878900193900090368) -->
+ <plurals name="bugreport_countdown" formatted="false" msgid="6878900193900090368">
+ <item quantity="other">Es farà una captura de pantalla de l\'informe d\'errors d\'aquí a <xliff:g id="NUMBER_1">%d</xliff:g> segons.</item>
+ <item quantity="one">Es farà una captura de pantalla de l\'informe d\'errors d\'aquí a <xliff:g id="NUMBER_0">%d</xliff:g> segon.</item>
+ </plurals>
<string name="global_action_toggle_silent_mode" msgid="8219525344246810925">"Mode silenciós"</string>
<string name="global_action_silent_mode_on_status" msgid="3289841937003758806">"So desactivat"</string>
<string name="global_action_silent_mode_off_status" msgid="1506046579177066419">"El so està activat"</string>
@@ -1049,8 +1049,8 @@
<string name="remote_bugreport_progress_notification_message_can_cancel" msgid="5743435483005099451">"Toca per cancel·lar"</string>
<string name="select_input_method" msgid="8547250819326693584">"Canvia el teclat"</string>
<string name="configure_input_methods" msgid="4769971288371946846">"Tria els teclats"</string>
- <string name="show_ime" msgid="9157568568695230830">"Mostra mètode d\'introducció"</string>
- <string name="hardware" msgid="7517821086888990278">"Maquinari"</string>
+ <string name="show_ime" msgid="2506087537466597099">"El deixa a la pantalla mentre el teclat físic està actiu"</string>
+ <string name="hardware" msgid="194658061510127999">"Mostra el teclat virtual"</string>
<string name="select_keyboard_layout_notification_title" msgid="1407367017263030773">"Selecciona una disposició de teclat"</string>
<string name="select_keyboard_layout_notification_message" msgid="4465907700449257063">"Toca per seleccionar una disposició de teclat."</string>
<string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
@@ -1531,4 +1531,10 @@
<string name="user_creation_cannot_add_any_more" msgid="6244197709981359266"><b>"<xliff:g id="APP">%1$s</xliff:g>"</b>" està provant d\'afegir un usuari, però s\'ha assolit el límit d\'usuaris."</string>
<string name="user_creation_account_exists" msgid="4880171855014489789"><b>"<xliff:g id="APP">%1$s</xliff:g>"</b>" està provant d\'afegir un usuari, però el compte "<b>"<xliff:g id="ACCOUNT">%2$s</xliff:g>"</b>" ja existeix en aquest dispositiu. Vols continuar igualment?"</string>
<string name="user_creation_adding" msgid="3206420861363021392"><b>"<xliff:g id="APP">%1$s</xliff:g>"</b>" està provant d\'afegir un usuari per al compte "<b>"<xliff:g id="ACCOUNT">%2$s</xliff:g>"</b>". Vols continuar?"</string>
+ <string name="language_selection_title" msgid="7181332986330337171">"Preferència d\'idioma"</string>
+ <string name="country_selection_title" msgid="2954859441620215513">"Preferència de regió"</string>
+ <string name="search_language_hint" msgid="7042102592055108574">"Nom de l\'idioma"</string>
+ <string name="language_picker_section_suggested" msgid="8414489646861640885">"Suggerits"</string>
+ <string name="language_picker_section_all" msgid="3097279199511617537">"Tots els idiomes"</string>
+ <string name="locale_search_menu" msgid="2560710726687249178">"Cerca"</string>
</resources>
diff --git a/core/res/res/values-cs/strings.xml b/core/res/res/values-cs/strings.xml
index 1a73069..4c830f9 100644
--- a/core/res/res/values-cs/strings.xml
+++ b/core/res/res/values-cs/strings.xml
@@ -213,15 +213,17 @@
<string name="global_action_bug_report" msgid="7934010578922304799">"Hlášení chyb"</string>
<string name="bugreport_title" msgid="2667494803742548533">"Vytvořit chybové hlášení"</string>
<string name="bugreport_message" msgid="398447048750350456">"Shromažďuje informace o aktuálním stavu zařízení. Tyto informace je následně možné poslat v e-mailové zprávě, chvíli však potrvá, než bude hlášení o chybě připraveno k odeslání. Buďte prosím trpěliví."</string>
- <!-- no translation found for bugreport_option_interactive_title (8635056131768862479) -->
+ <string name="bugreport_option_interactive_title" msgid="8635056131768862479">"Interaktivní přehled"</string>
+ <string name="bugreport_option_interactive_summary" msgid="8180152634022797629">"Tato možnost se používá ve většině případů. Umožňuje sledovat průběh přehledu a zadat další podrobnosti o problému. Mohou být vynechány některé méně používané sekce, jejichž kontrola trvá dlouho."</string>
+ <string name="bugreport_option_full_title" msgid="6354382025840076439">"Úplný přehled"</string>
+ <!-- no translation found for bugreport_option_full_summary (6687306111256813257) -->
<skip />
- <!-- no translation found for bugreport_option_interactive_summary (8180152634022797629) -->
- <skip />
- <!-- no translation found for bugreport_option_full_title (6354382025840076439) -->
- <skip />
- <!-- no translation found for bugreport_option_full_summary (6440582052207304578) -->
- <skip />
- <!-- no translation found for bugreport_countdown (6878900193900090368) -->
+ <plurals name="bugreport_countdown" formatted="false" msgid="6878900193900090368">
+ <item quantity="few">Snímek obrazovky pro zprávu o chybě bude pořízen za <xliff:g id="NUMBER_1">%d</xliff:g> sekundy.</item>
+ <item quantity="many">Snímek obrazovky pro zprávu o chybě bude pořízen za <xliff:g id="NUMBER_1">%d</xliff:g> sekundy.</item>
+ <item quantity="other">Snímek obrazovky pro zprávu o chybě bude pořízen za <xliff:g id="NUMBER_1">%d</xliff:g> sekund.</item>
+ <item quantity="one">Snímek obrazovky pro zprávu o chybě bude pořízen za <xliff:g id="NUMBER_0">%d</xliff:g> sekundu.</item>
+ </plurals>
<string name="global_action_toggle_silent_mode" msgid="8219525344246810925">"Tichý režim"</string>
<string name="global_action_silent_mode_on_status" msgid="3289841937003758806">"Zvuk je VYPNUTÝ."</string>
<string name="global_action_silent_mode_off_status" msgid="1506046579177066419">"Zvuk je zapnutý"</string>
@@ -1063,8 +1065,8 @@
<string name="remote_bugreport_progress_notification_message_can_cancel" msgid="5743435483005099451">"Klepnutím zrušíte"</string>
<string name="select_input_method" msgid="8547250819326693584">"Změna klávesnice"</string>
<string name="configure_input_methods" msgid="4769971288371946846">"Vybrat klávesnici"</string>
- <string name="show_ime" msgid="9157568568695230830">"Zobrazit metodu zadávání"</string>
- <string name="hardware" msgid="7517821086888990278">"Hardware"</string>
+ <string name="show_ime" msgid="2506087537466597099">"Ponechat na obrazovce, když je aktivní fyzická klávesnice"</string>
+ <string name="hardware" msgid="194658061510127999">"Zobrazit virtuální klávesnici"</string>
<string name="select_keyboard_layout_notification_title" msgid="1407367017263030773">"Výběr rozložení klávesnice"</string>
<string name="select_keyboard_layout_notification_message" msgid="4465907700449257063">"Dotykem vyberte rozložení klávesnice."</string>
<string name="fast_scroll_alphabet" msgid="5433275485499039199">" AÁBCČDĎEÉĚFGHCHIÍJKLMNŇOÓPQRŘSŠTŤUÚVWXYÝZŽ"</string>
@@ -1567,4 +1569,10 @@
<string name="user_creation_cannot_add_any_more" msgid="6244197709981359266">"Aplikace "<b>"<xliff:g id="APP">%1$s</xliff:g>"</b>" se pokouší přidat nového uživatele, avšak byl dosažen maximální počet uživatelů."</string>
<string name="user_creation_account_exists" msgid="4880171855014489789">"Aplikace "<b>"<xliff:g id="APP">%1$s</xliff:g>"</b>" se pokouší přidat nového uživatele, avšak účet "<b>"<xliff:g id="ACCOUNT">%2$s</xliff:g>"</b>" již v zařízení existuje. Chcete přesto pokračovat?"</string>
<string name="user_creation_adding" msgid="3206420861363021392">"Aplikace "<b>"<xliff:g id="APP">%1$s</xliff:g>"</b>" se pro účet "<b>"<xliff:g id="ACCOUNT">%2$s</xliff:g>"</b>" pokouší přidat nového uživatele. Pokračovat?"</string>
+ <string name="language_selection_title" msgid="7181332986330337171">"Preferovaný jazyk"</string>
+ <string name="country_selection_title" msgid="2954859441620215513">"Preferovaná oblast"</string>
+ <string name="search_language_hint" msgid="7042102592055108574">"Zadejte název jazyka"</string>
+ <string name="language_picker_section_suggested" msgid="8414489646861640885">"Navrhované"</string>
+ <string name="language_picker_section_all" msgid="3097279199511617537">"Všechny jazyky"</string>
+ <string name="locale_search_menu" msgid="2560710726687249178">"Vyhledávání"</string>
</resources>
diff --git a/core/res/res/values-da/strings.xml b/core/res/res/values-da/strings.xml
index 791a379..164ae6b 100644
--- a/core/res/res/values-da/strings.xml
+++ b/core/res/res/values-da/strings.xml
@@ -211,15 +211,15 @@
<string name="global_action_bug_report" msgid="7934010578922304799">"Fejlrapport"</string>
<string name="bugreport_title" msgid="2667494803742548533">"Lav fejlrapport"</string>
<string name="bugreport_message" msgid="398447048750350456">"Der indsamles oplysninger om din enheds aktuelle status, der efterfølgende sendes i en e-mail. Der går lidt tid, fra fejlrapporten påbegyndes, til den er klar til at blive sendt. Tak for tålmodigheden."</string>
- <!-- no translation found for bugreport_option_interactive_title (8635056131768862479) -->
+ <string name="bugreport_option_interactive_title" msgid="8635056131768862479">"Interaktiv rapport"</string>
+ <string name="bugreport_option_interactive_summary" msgid="8180152634022797629">"Brug dette workflow under de fleste omstændigheder. Det giver dig mulighed for at se status på rapporten og angive flere oplysninger om problemet. Nogle mindre brugte sektioner, der tager lang tid at rapportere, udelades muligvis."</string>
+ <string name="bugreport_option_full_title" msgid="6354382025840076439">"Fuld rapport"</string>
+ <!-- no translation found for bugreport_option_full_summary (6687306111256813257) -->
<skip />
- <!-- no translation found for bugreport_option_interactive_summary (8180152634022797629) -->
- <skip />
- <!-- no translation found for bugreport_option_full_title (6354382025840076439) -->
- <skip />
- <!-- no translation found for bugreport_option_full_summary (6440582052207304578) -->
- <skip />
- <!-- no translation found for bugreport_countdown (6878900193900090368) -->
+ <plurals name="bugreport_countdown" formatted="false" msgid="6878900193900090368">
+ <item quantity="one">Der tages et skærmbillede til fejlrapporten om <xliff:g id="NUMBER_1">%d</xliff:g> sekund.</item>
+ <item quantity="other">Der tages et skærmbillede til fejlrapporten om <xliff:g id="NUMBER_1">%d</xliff:g> sekunder.</item>
+ </plurals>
<string name="global_action_toggle_silent_mode" msgid="8219525344246810925">"Lydløs"</string>
<string name="global_action_silent_mode_on_status" msgid="3289841937003758806">"Lyden er slået FRA"</string>
<string name="global_action_silent_mode_off_status" msgid="1506046579177066419">"Lyden er TIL"</string>
@@ -1049,8 +1049,8 @@
<string name="remote_bugreport_progress_notification_message_can_cancel" msgid="5743435483005099451">"Tryk for at annullere"</string>
<string name="select_input_method" msgid="8547250819326693584">"Skift tastatur"</string>
<string name="configure_input_methods" msgid="4769971288371946846">"Vælg tastaturer"</string>
- <string name="show_ime" msgid="9157568568695230830">"Vis indtastningsmetode"</string>
- <string name="hardware" msgid="7517821086888990278">"Hardware"</string>
+ <string name="show_ime" msgid="2506087537466597099">"Behold den på skærmen, mens det fysiske tastatur er aktivt"</string>
+ <string name="hardware" msgid="194658061510127999">"Vis virtuelt tastatur"</string>
<string name="select_keyboard_layout_notification_title" msgid="1407367017263030773">"Vælg tastaturlayout"</string>
<string name="select_keyboard_layout_notification_message" msgid="4465907700449257063">"Tryk for at vælge et tastaturlayout."</string>
<string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
@@ -1531,4 +1531,10 @@
<string name="user_creation_cannot_add_any_more" msgid="6244197709981359266"><b>"<xliff:g id="APP">%1$s</xliff:g>"</b>" forsøger at tilføje en ny bruger, men grænsen for antal brugere er nået."</string>
<string name="user_creation_account_exists" msgid="4880171855014489789"><b>"<xliff:g id="APP">%1$s</xliff:g>"</b>" forsøger at tilføje en ny bruger, men kontoen "<b>"<xliff:g id="ACCOUNT">%2$s</xliff:g>"</b>" findes allerede på denne enhed. Vil du fortsætte?"</string>
<string name="user_creation_adding" msgid="3206420861363021392"><b>"<xliff:g id="APP">%1$s</xliff:g>"</b>" forsøger at føje en ny bruger til kontoen "<b>"<xliff:g id="ACCOUNT">%2$s</xliff:g>"</b>". Vil du fortsætte?"</string>
+ <string name="language_selection_title" msgid="7181332986330337171">"Sprogindstilling"</string>
+ <string name="country_selection_title" msgid="2954859441620215513">"Områdeindstilling"</string>
+ <string name="search_language_hint" msgid="7042102592055108574">"Angiv sprogets navn"</string>
+ <string name="language_picker_section_suggested" msgid="8414489646861640885">"Foreslået"</string>
+ <string name="language_picker_section_all" msgid="3097279199511617537">"Alle sprog"</string>
+ <string name="locale_search_menu" msgid="2560710726687249178">"Søg"</string>
</resources>
diff --git a/core/res/res/values-de/strings.xml b/core/res/res/values-de/strings.xml
index a28d2b8..4f43c2a 100644
--- a/core/res/res/values-de/strings.xml
+++ b/core/res/res/values-de/strings.xml
@@ -211,15 +211,15 @@
<string name="global_action_bug_report" msgid="7934010578922304799">"Fehlerbericht"</string>
<string name="bugreport_title" msgid="2667494803742548533">"Fehlerbericht abrufen"</string>
<string name="bugreport_message" msgid="398447048750350456">"Bei diesem Fehlerbericht werden Daten zum aktuellen Status deines Geräts erfasst und als E-Mail versandt. Vom Start des Berichts bis zu seinem Versand kann es eine Weile dauern. Bitte habe etwas Geduld."</string>
- <!-- no translation found for bugreport_option_interactive_title (8635056131768862479) -->
+ <string name="bugreport_option_interactive_title" msgid="8635056131768862479">"Interaktiver Bericht"</string>
+ <string name="bugreport_option_interactive_summary" msgid="8180152634022797629">"Diese Option kann in den meisten Fällen verwendet werden. Du kannst darüber den aktuellen Stand der Berichterstellung verfolgen und genauere Angaben zu dem Problem machen. Einige selten genutzte Bereiche, deren Berichterstellung längere Zeit in Anspruch nimmt, werden unter Umständen ausgelassen."</string>
+ <string name="bugreport_option_full_title" msgid="6354382025840076439">"Vollständiger Bericht"</string>
+ <!-- no translation found for bugreport_option_full_summary (6687306111256813257) -->
<skip />
- <!-- no translation found for bugreport_option_interactive_summary (8180152634022797629) -->
- <skip />
- <!-- no translation found for bugreport_option_full_title (6354382025840076439) -->
- <skip />
- <!-- no translation found for bugreport_option_full_summary (6440582052207304578) -->
- <skip />
- <!-- no translation found for bugreport_countdown (6878900193900090368) -->
+ <plurals name="bugreport_countdown" formatted="false" msgid="6878900193900090368">
+ <item quantity="other">Screenshot für den Fehlerbericht wird in <xliff:g id="NUMBER_1">%d</xliff:g> Sekunden aufgenommen.</item>
+ <item quantity="one">Screenshot für den Fehlerbericht wird in <xliff:g id="NUMBER_0">%d</xliff:g> Sekunde aufgenommen.</item>
+ </plurals>
<string name="global_action_toggle_silent_mode" msgid="8219525344246810925">"Lautlos-Modus"</string>
<string name="global_action_silent_mode_on_status" msgid="3289841937003758806">"Ton ist AUS."</string>
<string name="global_action_silent_mode_off_status" msgid="1506046579177066419">"Ton ist AN."</string>
@@ -1049,8 +1049,8 @@
<string name="remote_bugreport_progress_notification_message_can_cancel" msgid="5743435483005099451">"Zum Abbrechen tippen"</string>
<string name="select_input_method" msgid="8547250819326693584">"Tastatur ändern"</string>
<string name="configure_input_methods" msgid="4769971288371946846">"Tastatur auswählen"</string>
- <string name="show_ime" msgid="9157568568695230830">"Eingabemethode anzeigen"</string>
- <string name="hardware" msgid="7517821086888990278">"Hardware"</string>
+ <string name="show_ime" msgid="2506087537466597099">"Auf dem Display einblenden, wenn die physische Tastatur aktiv ist"</string>
+ <string name="hardware" msgid="194658061510127999">"Virtuelle Tastatur einblenden"</string>
<string name="select_keyboard_layout_notification_title" msgid="1407367017263030773">"Tastaturlayout auswählen"</string>
<string name="select_keyboard_layout_notification_message" msgid="4465907700449257063">"Zum Auswählen eines Tastaturlayouts berühren"</string>
<string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
@@ -1531,4 +1531,10 @@
<string name="user_creation_cannot_add_any_more" msgid="6244197709981359266"><b>"<xliff:g id="APP">%1$s</xliff:g>"</b>" versucht, einen neuen Nutzer hinzuzufügen. Die maximal zulässige Anzahl an Nutzern ist aber schon erreicht."</string>
<string name="user_creation_account_exists" msgid="4880171855014489789"><b>"<xliff:g id="APP">%1$s</xliff:g>"</b>" versucht, einen neuen Nutzer hinzuzufügen, aber das Konto "<b>"<xliff:g id="ACCOUNT">%2$s</xliff:g>"</b>" besteht bereits auf diesem Gerät. Trotzdem fortfahren?"</string>
<string name="user_creation_adding" msgid="3206420861363021392"><b>"<xliff:g id="APP">%1$s</xliff:g>"</b>" versucht, einen neuen Nutzer für das Konto "<b>"<xliff:g id="ACCOUNT">%2$s</xliff:g>"</b>" hinzuzufügen. Fortfahren?"</string>
+ <string name="language_selection_title" msgid="7181332986330337171">"Spracheinstellung"</string>
+ <string name="country_selection_title" msgid="2954859441620215513">"Region auswählen"</string>
+ <string name="search_language_hint" msgid="7042102592055108574">"Sprache eingeben"</string>
+ <string name="language_picker_section_suggested" msgid="8414489646861640885">"Vorschläge"</string>
+ <string name="language_picker_section_all" msgid="3097279199511617537">"Alle Sprachen"</string>
+ <string name="locale_search_menu" msgid="2560710726687249178">"Suche"</string>
</resources>
diff --git a/core/res/res/values-el/strings.xml b/core/res/res/values-el/strings.xml
index 40d2e5b..d572e22 100644
--- a/core/res/res/values-el/strings.xml
+++ b/core/res/res/values-el/strings.xml
@@ -211,15 +211,15 @@
<string name="global_action_bug_report" msgid="7934010578922304799">"Αναφορά σφαλμάτων"</string>
<string name="bugreport_title" msgid="2667494803742548533">"Λήψη αναφοράς σφάλματος"</string>
<string name="bugreport_message" msgid="398447048750350456">"Θα συλλέξει πληροφορίες σχετικά με την τρέχουσα κατάσταση της συσκευής σας και θα τις στείλει μέσω μηνύματος ηλεκτρονικού ταχυδρομείου. Απαιτείται λίγος χρόνος για τη σύνταξη της αναφοράς σφάλματος και την αποστολή της. Κάντε λίγη υπομονή."</string>
- <!-- no translation found for bugreport_option_interactive_title (8635056131768862479) -->
+ <string name="bugreport_option_interactive_title" msgid="8635056131768862479">"Διαδραστική αναφορά"</string>
+ <string name="bugreport_option_interactive_summary" msgid="8180152634022797629">"Χρησιμοποιήστε αυτήν την επιλογή στις περισσότερες περιπτώσεις. Σας επιτρέπει να παρακολουθείτε την πρόοδο της αναφοράς και να εισάγετε περισσότερες λεπτομέρειες σχετικά με το πρόβλημα που αντιμετωπίζετε. Ενδέχεται να παραλείψει ορισμένες ενότητες που δεν χρησιμοποιούνται συχνά και για τις οποίες απαιτείται μεγάλο χρονικό διάστημα για τη δημιουργία αναφορών."</string>
+ <string name="bugreport_option_full_title" msgid="6354382025840076439">"Πλήρης αναφορά"</string>
+ <!-- no translation found for bugreport_option_full_summary (6687306111256813257) -->
<skip />
- <!-- no translation found for bugreport_option_interactive_summary (8180152634022797629) -->
- <skip />
- <!-- no translation found for bugreport_option_full_title (6354382025840076439) -->
- <skip />
- <!-- no translation found for bugreport_option_full_summary (6440582052207304578) -->
- <skip />
- <!-- no translation found for bugreport_countdown (6878900193900090368) -->
+ <plurals name="bugreport_countdown" formatted="false" msgid="6878900193900090368">
+ <item quantity="other">Λήψη στιγμιότυπου οθόνης για αναφορά σφαλμάτων σε <xliff:g id="NUMBER_1">%d</xliff:g> δευτερόλεπτα.</item>
+ <item quantity="one">Λήψη στιγμιότυπου οθόνης για αναφορά σφαλμάτων σε <xliff:g id="NUMBER_0">%d</xliff:g> δευτερόλεπτο.</item>
+ </plurals>
<string name="global_action_toggle_silent_mode" msgid="8219525344246810925">"Λειτουργία σίγασης"</string>
<string name="global_action_silent_mode_on_status" msgid="3289841937003758806">"Ο ήχος είναι απενεργοποιημένος"</string>
<string name="global_action_silent_mode_off_status" msgid="1506046579177066419">"Ο ήχος είναι ενεργοποιημένος"</string>
@@ -1049,8 +1049,8 @@
<string name="remote_bugreport_progress_notification_message_can_cancel" msgid="5743435483005099451">"Αγγίξτε για ακύρωση"</string>
<string name="select_input_method" msgid="8547250819326693584">"Αλλαγή πληκτρολογίου"</string>
<string name="configure_input_methods" msgid="4769971288371946846">"Επιλογή πληκτρολογίων"</string>
- <string name="show_ime" msgid="9157568568695230830">"Εμφάνιση μεθόδου εισαγ."</string>
- <string name="hardware" msgid="7517821086888990278">"Υλικό"</string>
+ <string name="show_ime" msgid="2506087537466597099">"Να παραμένει στην οθόνη όταν είναι ενεργό το φυσικό πληκτρολόγιο"</string>
+ <string name="hardware" msgid="194658061510127999">"Εμφάνιση εικονικού πληκτρολ."</string>
<string name="select_keyboard_layout_notification_title" msgid="1407367017263030773">"Επιλογή διάταξης πληκτρολογίου"</string>
<string name="select_keyboard_layout_notification_message" msgid="4465907700449257063">"Αγγίξτε για να επιλέξετε διάταξη πληκτρολογίου."</string>
<string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
@@ -1531,4 +1531,10 @@
<string name="user_creation_cannot_add_any_more" msgid="6244197709981359266">"Το "<b>"<xliff:g id="APP">%1$s</xliff:g>"</b>" προσπαθεί να προσθέσει έναν νέο χρήστη, αλλά έχετε φτάσει το όριο χρηστών."</string>
<string name="user_creation_account_exists" msgid="4880171855014489789">"Το "<b>"<xliff:g id="APP">%1$s</xliff:g>"</b>" προσπαθεί να προσθέσει έναν νέο χρήστη, αλλά ο λογαριασμός "<b>"<xliff:g id="ACCOUNT">%2$s</xliff:g>"</b>" υπάρχει ήδη σε αυτήν τη συσκευή. Θέλετε να συνεχίσετε ούτως ή άλλως;"</string>
<string name="user_creation_adding" msgid="3206420861363021392">"Το "<b>"<xliff:g id="APP">%1$s</xliff:g>"</b>" προσπαθεί να προσθέσει έναν νέο χρήστη για το λογαριασμό "<b>"<xliff:g id="ACCOUNT">%2$s</xliff:g>"</b>". Θέλετε να συνεχίσετε;"</string>
+ <string name="language_selection_title" msgid="7181332986330337171">"Προτίμηση γλώσσας"</string>
+ <string name="country_selection_title" msgid="2954859441620215513">"Προτίμηση περιοχής"</string>
+ <string name="search_language_hint" msgid="7042102592055108574">"Εισαγ. όνομα γλώσσας"</string>
+ <string name="language_picker_section_suggested" msgid="8414489646861640885">"Προτεινόμενες"</string>
+ <string name="language_picker_section_all" msgid="3097279199511617537">"Όλες οι γλώσσες"</string>
+ <string name="locale_search_menu" msgid="2560710726687249178">"Αναζήτηση"</string>
</resources>
diff --git a/core/res/res/values-en-rAU/strings.xml b/core/res/res/values-en-rAU/strings.xml
index 80d2efe..ee7dd71 100644
--- a/core/res/res/values-en-rAU/strings.xml
+++ b/core/res/res/values-en-rAU/strings.xml
@@ -211,15 +211,15 @@
<string name="global_action_bug_report" msgid="7934010578922304799">"Bug report"</string>
<string name="bugreport_title" msgid="2667494803742548533">"Take bug report"</string>
<string name="bugreport_message" msgid="398447048750350456">"This will collect information about your current device state, to send as an email message. It will take a little time from starting the bug report until it is ready to be sent. Please be patient."</string>
- <!-- no translation found for bugreport_option_interactive_title (8635056131768862479) -->
+ <string name="bugreport_option_interactive_title" msgid="8635056131768862479">"Interactive report"</string>
+ <string name="bugreport_option_interactive_summary" msgid="8180152634022797629">"Use this under most circumstances. It allows you to track progress of the report and enter more details about the problem. It might omit some less-used sections that take a long time to report."</string>
+ <string name="bugreport_option_full_title" msgid="6354382025840076439">"Full report"</string>
+ <!-- no translation found for bugreport_option_full_summary (6687306111256813257) -->
<skip />
- <!-- no translation found for bugreport_option_interactive_summary (8180152634022797629) -->
- <skip />
- <!-- no translation found for bugreport_option_full_title (6354382025840076439) -->
- <skip />
- <!-- no translation found for bugreport_option_full_summary (6440582052207304578) -->
- <skip />
- <!-- no translation found for bugreport_countdown (6878900193900090368) -->
+ <plurals name="bugreport_countdown" formatted="false" msgid="6878900193900090368">
+ <item quantity="other">Taking screenshot for bug report in <xliff:g id="NUMBER_1">%d</xliff:g> seconds.</item>
+ <item quantity="one">Taking screenshot for bug report in <xliff:g id="NUMBER_0">%d</xliff:g> second.</item>
+ </plurals>
<string name="global_action_toggle_silent_mode" msgid="8219525344246810925">"Silent mode"</string>
<string name="global_action_silent_mode_on_status" msgid="3289841937003758806">"Sound is OFF"</string>
<string name="global_action_silent_mode_off_status" msgid="1506046579177066419">"Sound is ON"</string>
@@ -1049,8 +1049,8 @@
<string name="remote_bugreport_progress_notification_message_can_cancel" msgid="5743435483005099451">"Touch to cancel"</string>
<string name="select_input_method" msgid="8547250819326693584">"Change keyboard"</string>
<string name="configure_input_methods" msgid="4769971288371946846">"Choose keyboards"</string>
- <string name="show_ime" msgid="9157568568695230830">"Show input method"</string>
- <string name="hardware" msgid="7517821086888990278">"Hardware"</string>
+ <string name="show_ime" msgid="2506087537466597099">"Keep it on screen while physical keyboard is active"</string>
+ <string name="hardware" msgid="194658061510127999">"Show virtual keyboard"</string>
<string name="select_keyboard_layout_notification_title" msgid="1407367017263030773">"Select keyboard layout"</string>
<string name="select_keyboard_layout_notification_message" msgid="4465907700449257063">"Touch to select a keyboard layout."</string>
<string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
@@ -1531,4 +1531,10 @@
<string name="user_creation_cannot_add_any_more" msgid="6244197709981359266"><b>"<xliff:g id="APP">%1$s</xliff:g>"</b>" is trying to add a new user, but the user limit has been reached."</string>
<string name="user_creation_account_exists" msgid="4880171855014489789"><b>"<xliff:g id="APP">%1$s</xliff:g>"</b>" is trying to add a new user, but the account "<b>"<xliff:g id="ACCOUNT">%2$s</xliff:g>"</b>" already exists on this device. Proceed anyway?"</string>
<string name="user_creation_adding" msgid="3206420861363021392"><b>"<xliff:g id="APP">%1$s</xliff:g>"</b>" is trying to add a new user for the account "<b>"<xliff:g id="ACCOUNT">%2$s</xliff:g>"</b>". Proceed?"</string>
+ <string name="language_selection_title" msgid="7181332986330337171">"Language preference"</string>
+ <string name="country_selection_title" msgid="2954859441620215513">"Region preference"</string>
+ <string name="search_language_hint" msgid="7042102592055108574">"Type language name"</string>
+ <string name="language_picker_section_suggested" msgid="8414489646861640885">"Suggested"</string>
+ <string name="language_picker_section_all" msgid="3097279199511617537">"All languages"</string>
+ <string name="locale_search_menu" msgid="2560710726687249178">"Search"</string>
</resources>
diff --git a/core/res/res/values-en-rGB/strings.xml b/core/res/res/values-en-rGB/strings.xml
index 80d2efe..ee7dd71 100644
--- a/core/res/res/values-en-rGB/strings.xml
+++ b/core/res/res/values-en-rGB/strings.xml
@@ -211,15 +211,15 @@
<string name="global_action_bug_report" msgid="7934010578922304799">"Bug report"</string>
<string name="bugreport_title" msgid="2667494803742548533">"Take bug report"</string>
<string name="bugreport_message" msgid="398447048750350456">"This will collect information about your current device state, to send as an email message. It will take a little time from starting the bug report until it is ready to be sent. Please be patient."</string>
- <!-- no translation found for bugreport_option_interactive_title (8635056131768862479) -->
+ <string name="bugreport_option_interactive_title" msgid="8635056131768862479">"Interactive report"</string>
+ <string name="bugreport_option_interactive_summary" msgid="8180152634022797629">"Use this under most circumstances. It allows you to track progress of the report and enter more details about the problem. It might omit some less-used sections that take a long time to report."</string>
+ <string name="bugreport_option_full_title" msgid="6354382025840076439">"Full report"</string>
+ <!-- no translation found for bugreport_option_full_summary (6687306111256813257) -->
<skip />
- <!-- no translation found for bugreport_option_interactive_summary (8180152634022797629) -->
- <skip />
- <!-- no translation found for bugreport_option_full_title (6354382025840076439) -->
- <skip />
- <!-- no translation found for bugreport_option_full_summary (6440582052207304578) -->
- <skip />
- <!-- no translation found for bugreport_countdown (6878900193900090368) -->
+ <plurals name="bugreport_countdown" formatted="false" msgid="6878900193900090368">
+ <item quantity="other">Taking screenshot for bug report in <xliff:g id="NUMBER_1">%d</xliff:g> seconds.</item>
+ <item quantity="one">Taking screenshot for bug report in <xliff:g id="NUMBER_0">%d</xliff:g> second.</item>
+ </plurals>
<string name="global_action_toggle_silent_mode" msgid="8219525344246810925">"Silent mode"</string>
<string name="global_action_silent_mode_on_status" msgid="3289841937003758806">"Sound is OFF"</string>
<string name="global_action_silent_mode_off_status" msgid="1506046579177066419">"Sound is ON"</string>
@@ -1049,8 +1049,8 @@
<string name="remote_bugreport_progress_notification_message_can_cancel" msgid="5743435483005099451">"Touch to cancel"</string>
<string name="select_input_method" msgid="8547250819326693584">"Change keyboard"</string>
<string name="configure_input_methods" msgid="4769971288371946846">"Choose keyboards"</string>
- <string name="show_ime" msgid="9157568568695230830">"Show input method"</string>
- <string name="hardware" msgid="7517821086888990278">"Hardware"</string>
+ <string name="show_ime" msgid="2506087537466597099">"Keep it on screen while physical keyboard is active"</string>
+ <string name="hardware" msgid="194658061510127999">"Show virtual keyboard"</string>
<string name="select_keyboard_layout_notification_title" msgid="1407367017263030773">"Select keyboard layout"</string>
<string name="select_keyboard_layout_notification_message" msgid="4465907700449257063">"Touch to select a keyboard layout."</string>
<string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
@@ -1531,4 +1531,10 @@
<string name="user_creation_cannot_add_any_more" msgid="6244197709981359266"><b>"<xliff:g id="APP">%1$s</xliff:g>"</b>" is trying to add a new user, but the user limit has been reached."</string>
<string name="user_creation_account_exists" msgid="4880171855014489789"><b>"<xliff:g id="APP">%1$s</xliff:g>"</b>" is trying to add a new user, but the account "<b>"<xliff:g id="ACCOUNT">%2$s</xliff:g>"</b>" already exists on this device. Proceed anyway?"</string>
<string name="user_creation_adding" msgid="3206420861363021392"><b>"<xliff:g id="APP">%1$s</xliff:g>"</b>" is trying to add a new user for the account "<b>"<xliff:g id="ACCOUNT">%2$s</xliff:g>"</b>". Proceed?"</string>
+ <string name="language_selection_title" msgid="7181332986330337171">"Language preference"</string>
+ <string name="country_selection_title" msgid="2954859441620215513">"Region preference"</string>
+ <string name="search_language_hint" msgid="7042102592055108574">"Type language name"</string>
+ <string name="language_picker_section_suggested" msgid="8414489646861640885">"Suggested"</string>
+ <string name="language_picker_section_all" msgid="3097279199511617537">"All languages"</string>
+ <string name="locale_search_menu" msgid="2560710726687249178">"Search"</string>
</resources>
diff --git a/core/res/res/values-en-rIN/strings.xml b/core/res/res/values-en-rIN/strings.xml
index 80d2efe..ee7dd71 100644
--- a/core/res/res/values-en-rIN/strings.xml
+++ b/core/res/res/values-en-rIN/strings.xml
@@ -211,15 +211,15 @@
<string name="global_action_bug_report" msgid="7934010578922304799">"Bug report"</string>
<string name="bugreport_title" msgid="2667494803742548533">"Take bug report"</string>
<string name="bugreport_message" msgid="398447048750350456">"This will collect information about your current device state, to send as an email message. It will take a little time from starting the bug report until it is ready to be sent. Please be patient."</string>
- <!-- no translation found for bugreport_option_interactive_title (8635056131768862479) -->
+ <string name="bugreport_option_interactive_title" msgid="8635056131768862479">"Interactive report"</string>
+ <string name="bugreport_option_interactive_summary" msgid="8180152634022797629">"Use this under most circumstances. It allows you to track progress of the report and enter more details about the problem. It might omit some less-used sections that take a long time to report."</string>
+ <string name="bugreport_option_full_title" msgid="6354382025840076439">"Full report"</string>
+ <!-- no translation found for bugreport_option_full_summary (6687306111256813257) -->
<skip />
- <!-- no translation found for bugreport_option_interactive_summary (8180152634022797629) -->
- <skip />
- <!-- no translation found for bugreport_option_full_title (6354382025840076439) -->
- <skip />
- <!-- no translation found for bugreport_option_full_summary (6440582052207304578) -->
- <skip />
- <!-- no translation found for bugreport_countdown (6878900193900090368) -->
+ <plurals name="bugreport_countdown" formatted="false" msgid="6878900193900090368">
+ <item quantity="other">Taking screenshot for bug report in <xliff:g id="NUMBER_1">%d</xliff:g> seconds.</item>
+ <item quantity="one">Taking screenshot for bug report in <xliff:g id="NUMBER_0">%d</xliff:g> second.</item>
+ </plurals>
<string name="global_action_toggle_silent_mode" msgid="8219525344246810925">"Silent mode"</string>
<string name="global_action_silent_mode_on_status" msgid="3289841937003758806">"Sound is OFF"</string>
<string name="global_action_silent_mode_off_status" msgid="1506046579177066419">"Sound is ON"</string>
@@ -1049,8 +1049,8 @@
<string name="remote_bugreport_progress_notification_message_can_cancel" msgid="5743435483005099451">"Touch to cancel"</string>
<string name="select_input_method" msgid="8547250819326693584">"Change keyboard"</string>
<string name="configure_input_methods" msgid="4769971288371946846">"Choose keyboards"</string>
- <string name="show_ime" msgid="9157568568695230830">"Show input method"</string>
- <string name="hardware" msgid="7517821086888990278">"Hardware"</string>
+ <string name="show_ime" msgid="2506087537466597099">"Keep it on screen while physical keyboard is active"</string>
+ <string name="hardware" msgid="194658061510127999">"Show virtual keyboard"</string>
<string name="select_keyboard_layout_notification_title" msgid="1407367017263030773">"Select keyboard layout"</string>
<string name="select_keyboard_layout_notification_message" msgid="4465907700449257063">"Touch to select a keyboard layout."</string>
<string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
@@ -1531,4 +1531,10 @@
<string name="user_creation_cannot_add_any_more" msgid="6244197709981359266"><b>"<xliff:g id="APP">%1$s</xliff:g>"</b>" is trying to add a new user, but the user limit has been reached."</string>
<string name="user_creation_account_exists" msgid="4880171855014489789"><b>"<xliff:g id="APP">%1$s</xliff:g>"</b>" is trying to add a new user, but the account "<b>"<xliff:g id="ACCOUNT">%2$s</xliff:g>"</b>" already exists on this device. Proceed anyway?"</string>
<string name="user_creation_adding" msgid="3206420861363021392"><b>"<xliff:g id="APP">%1$s</xliff:g>"</b>" is trying to add a new user for the account "<b>"<xliff:g id="ACCOUNT">%2$s</xliff:g>"</b>". Proceed?"</string>
+ <string name="language_selection_title" msgid="7181332986330337171">"Language preference"</string>
+ <string name="country_selection_title" msgid="2954859441620215513">"Region preference"</string>
+ <string name="search_language_hint" msgid="7042102592055108574">"Type language name"</string>
+ <string name="language_picker_section_suggested" msgid="8414489646861640885">"Suggested"</string>
+ <string name="language_picker_section_all" msgid="3097279199511617537">"All languages"</string>
+ <string name="locale_search_menu" msgid="2560710726687249178">"Search"</string>
</resources>
diff --git a/core/res/res/values-es-rUS/strings.xml b/core/res/res/values-es-rUS/strings.xml
index 1900e8d..45a0e02 100644
--- a/core/res/res/values-es-rUS/strings.xml
+++ b/core/res/res/values-es-rUS/strings.xml
@@ -211,15 +211,15 @@
<string name="global_action_bug_report" msgid="7934010578922304799">"Informe de errores"</string>
<string name="bugreport_title" msgid="2667494803742548533">"Iniciar informe de errores"</string>
<string name="bugreport_message" msgid="398447048750350456">"Se recopilará información sobre el estado actual de tu dispositivo, que se enviará por correo. Pasarán unos minutos desde que se inicie el informe de errores hasta que se envíe, por lo que te recomendamos que tengas paciencia."</string>
- <!-- no translation found for bugreport_option_interactive_title (8635056131768862479) -->
+ <string name="bugreport_option_interactive_title" msgid="8635056131768862479">"Informe interactivo"</string>
+ <string name="bugreport_option_interactive_summary" msgid="8180152634022797629">"Usa esta opción en la mayoría de los casos. Te permite ingresar más detalles acerca del problema y realizar un seguimiento del progreso del informe. Es posible que se omitan secciones menos usadas cuyos informes demoran más en completarse."</string>
+ <string name="bugreport_option_full_title" msgid="6354382025840076439">"Informe completo"</string>
+ <!-- no translation found for bugreport_option_full_summary (6687306111256813257) -->
<skip />
- <!-- no translation found for bugreport_option_interactive_summary (8180152634022797629) -->
- <skip />
- <!-- no translation found for bugreport_option_full_title (6354382025840076439) -->
- <skip />
- <!-- no translation found for bugreport_option_full_summary (6440582052207304578) -->
- <skip />
- <!-- no translation found for bugreport_countdown (6878900193900090368) -->
+ <plurals name="bugreport_countdown" formatted="false" msgid="6878900193900090368">
+ <item quantity="other">Se tomará una captura de pantalla para el informe de errores en <xliff:g id="NUMBER_1">%d</xliff:g> segundos.</item>
+ <item quantity="one">Se tomará una captura de pantalla para el informe de errores en <xliff:g id="NUMBER_0">%d</xliff:g> segundo.</item>
+ </plurals>
<string name="global_action_toggle_silent_mode" msgid="8219525344246810925">"Modo silencioso"</string>
<string name="global_action_silent_mode_on_status" msgid="3289841937003758806">"El sonido está Desactivado"</string>
<string name="global_action_silent_mode_off_status" msgid="1506046579177066419">"El sonido está Activado"</string>
@@ -1049,8 +1049,8 @@
<string name="remote_bugreport_progress_notification_message_can_cancel" msgid="5743435483005099451">"Toca para cancelar"</string>
<string name="select_input_method" msgid="8547250819326693584">"Cambiar el teclado"</string>
<string name="configure_input_methods" msgid="4769971288371946846">"Seleccionar teclados"</string>
- <string name="show_ime" msgid="9157568568695230830">"Mostrar método de entrada"</string>
- <string name="hardware" msgid="7517821086888990278">"Hardware"</string>
+ <string name="show_ime" msgid="2506087537466597099">"Mantener en la pantalla cuando el teclado físico está activo"</string>
+ <string name="hardware" msgid="194658061510127999">"Mostrar teclado virtual"</string>
<string name="select_keyboard_layout_notification_title" msgid="1407367017263030773">"Selecciona un diseño de teclado"</string>
<string name="select_keyboard_layout_notification_message" msgid="4465907700449257063">"Toca para seleccionar un diseño de teclado."</string>
<string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
@@ -1531,4 +1531,10 @@
<string name="user_creation_cannot_add_any_more" msgid="6244197709981359266"><b>"<xliff:g id="APP">%1$s</xliff:g>"</b>" está intentado agregar un usuario nuevo, pero ya se alcanzó el límite máximo de usuarios."</string>
<string name="user_creation_account_exists" msgid="4880171855014489789"><b>"<xliff:g id="APP">%1$s</xliff:g>"</b>" está intentado agregar un usuario nuevo, pero la cuenta "<b>"<xliff:g id="ACCOUNT">%2$s</xliff:g>"</b>" ya existe en este dispositivo. ¿Deseas continuar de todas formas?"</string>
<string name="user_creation_adding" msgid="3206420861363021392"><b>"<xliff:g id="APP">%1$s</xliff:g>"</b>" está intentando agregar un usuario nuevo a la cuenta "<b>"<xliff:g id="ACCOUNT">%2$s</xliff:g>"</b>". ¿Deseas continuar?"</string>
+ <string name="language_selection_title" msgid="7181332986330337171">"Preferencia de idioma"</string>
+ <string name="country_selection_title" msgid="2954859441620215513">"Preferencia de región"</string>
+ <string name="search_language_hint" msgid="7042102592055108574">"Nombre del idioma"</string>
+ <string name="language_picker_section_suggested" msgid="8414489646861640885">"Sugeridos"</string>
+ <string name="language_picker_section_all" msgid="3097279199511617537">"Todos los idiomas"</string>
+ <string name="locale_search_menu" msgid="2560710726687249178">"Búsqueda"</string>
</resources>
diff --git a/core/res/res/values-es/strings.xml b/core/res/res/values-es/strings.xml
index 846b9dc..2f1c4a8 100644
--- a/core/res/res/values-es/strings.xml
+++ b/core/res/res/values-es/strings.xml
@@ -211,15 +211,15 @@
<string name="global_action_bug_report" msgid="7934010578922304799">"Informe de error"</string>
<string name="bugreport_title" msgid="2667494803742548533">"Crear informe de errores"</string>
<string name="bugreport_message" msgid="398447048750350456">"Se recopilará información sobre el estado actual de tu dispositivo y se enviará por correo electrónico. Pasarán unos minutos desde que empiece a generarse el informe de errores hasta que se envíe."</string>
- <!-- no translation found for bugreport_option_interactive_title (8635056131768862479) -->
+ <string name="bugreport_option_interactive_title" msgid="8635056131768862479">"Informe interactivo"</string>
+ <string name="bugreport_option_interactive_summary" msgid="8180152634022797629">"Usa esta opción en la mayoría de los casos. Te permite realizar un seguimiento del progreso de la notificación e introducir más información sobre el problema. Es posible que se omitan algunas secciones menos utilizadas y que requieran más tiempo."</string>
+ <string name="bugreport_option_full_title" msgid="6354382025840076439">"Informe completo"</string>
+ <!-- no translation found for bugreport_option_full_summary (6687306111256813257) -->
<skip />
- <!-- no translation found for bugreport_option_interactive_summary (8180152634022797629) -->
- <skip />
- <!-- no translation found for bugreport_option_full_title (6354382025840076439) -->
- <skip />
- <!-- no translation found for bugreport_option_full_summary (6440582052207304578) -->
- <skip />
- <!-- no translation found for bugreport_countdown (6878900193900090368) -->
+ <plurals name="bugreport_countdown" formatted="false" msgid="6878900193900090368">
+ <item quantity="other">La captura de pantalla para el informe de errores se realizará en <xliff:g id="NUMBER_1">%d</xliff:g> segundos.</item>
+ <item quantity="one">La captura de pantalla para el informe de errores se realizará en <xliff:g id="NUMBER_0">%d</xliff:g> segundo.</item>
+ </plurals>
<string name="global_action_toggle_silent_mode" msgid="8219525344246810925">"Modo silencio"</string>
<string name="global_action_silent_mode_on_status" msgid="3289841937003758806">"El sonido está desactivado. Activar"</string>
<string name="global_action_silent_mode_off_status" msgid="1506046579177066419">"El sonido está activado. Desactivar"</string>
@@ -1049,8 +1049,8 @@
<string name="remote_bugreport_progress_notification_message_can_cancel" msgid="5743435483005099451">"Toca para cancelar"</string>
<string name="select_input_method" msgid="8547250819326693584">"Cambiar teclado"</string>
<string name="configure_input_methods" msgid="4769971288371946846">"Elegir teclados"</string>
- <string name="show_ime" msgid="9157568568695230830">"Mostrar método de entrada"</string>
- <string name="hardware" msgid="7517821086888990278">"Hardware"</string>
+ <string name="show_ime" msgid="2506087537466597099">"Debe seguir en pantalla mientras el teclado físico esté activo"</string>
+ <string name="hardware" msgid="194658061510127999">"Mostrar teclado virtual"</string>
<string name="select_keyboard_layout_notification_title" msgid="1407367017263030773">"Selecciona un diseño de teclado"</string>
<string name="select_keyboard_layout_notification_message" msgid="4465907700449257063">"Toca para seleccionar un diseño de teclado."</string>
<string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
@@ -1531,4 +1531,10 @@
<string name="user_creation_cannot_add_any_more" msgid="6244197709981359266"><b>"<xliff:g id="APP">%1$s</xliff:g>"</b>" quiere añadir un usuario nuevo, pero se ha alcanzado el límite de usuarios."</string>
<string name="user_creation_account_exists" msgid="4880171855014489789"><b>"<xliff:g id="APP">%1$s</xliff:g>"</b>" quiere añadir un usuario nuevo, pero la cuenta "<b>"<xliff:g id="ACCOUNT">%2$s</xliff:g>"</b>" ya existe en este dispositivo. ¿Quieres continuar de todas formas?"</string>
<string name="user_creation_adding" msgid="3206420861363021392"><b>"<xliff:g id="APP">%1$s</xliff:g>"</b>" quiere añadir un usuario nuevo a la cuenta "<b>"<xliff:g id="ACCOUNT">%2$s</xliff:g>"</b>". ¿Quieres continuar?"</string>
+ <string name="language_selection_title" msgid="7181332986330337171">"Preferencia de idioma"</string>
+ <string name="country_selection_title" msgid="2954859441620215513">"Preferencia de región"</string>
+ <string name="search_language_hint" msgid="7042102592055108574">"Nombre de idioma"</string>
+ <string name="language_picker_section_suggested" msgid="8414489646861640885">"Sugeridos"</string>
+ <string name="language_picker_section_all" msgid="3097279199511617537">"Todos los idiomas"</string>
+ <string name="locale_search_menu" msgid="2560710726687249178">"Buscar"</string>
</resources>
diff --git a/core/res/res/values-et-rEE/strings.xml b/core/res/res/values-et-rEE/strings.xml
index 09d031b..3a4f2af 100644
--- a/core/res/res/values-et-rEE/strings.xml
+++ b/core/res/res/values-et-rEE/strings.xml
@@ -211,15 +211,15 @@
<string name="global_action_bug_report" msgid="7934010578922304799">"Veaaruanne"</string>
<string name="bugreport_title" msgid="2667494803742548533">"Veaaruande võtmine"</string>
<string name="bugreport_message" msgid="398447048750350456">"Nii kogutakse teavet teie seadme praeguse oleku kohta, et saata see meilisõnumina. Enne kui saate veaaruande ära saata, võtab selle loomine natuke aega; varuge kannatust."</string>
- <!-- no translation found for bugreport_option_interactive_title (8635056131768862479) -->
+ <string name="bugreport_option_interactive_title" msgid="8635056131768862479">"Interakt. aruanne"</string>
+ <string name="bugreport_option_interactive_summary" msgid="8180152634022797629">"Kasutage seda enamikul juhtudel. See võimaldab jälgida aruande edenemist ja sisestada probleemi kohta täpsemat teavet. Vahele võivad jääda mõned vähem kasutatud jaotised, millest teavitamine võtab rohkem aega."</string>
+ <string name="bugreport_option_full_title" msgid="6354382025840076439">"Täielik aruanne"</string>
+ <!-- no translation found for bugreport_option_full_summary (6687306111256813257) -->
<skip />
- <!-- no translation found for bugreport_option_interactive_summary (8180152634022797629) -->
- <skip />
- <!-- no translation found for bugreport_option_full_title (6354382025840076439) -->
- <skip />
- <!-- no translation found for bugreport_option_full_summary (6440582052207304578) -->
- <skip />
- <!-- no translation found for bugreport_countdown (6878900193900090368) -->
+ <plurals name="bugreport_countdown" formatted="false" msgid="6878900193900090368">
+ <item quantity="other">Veaaruande jaoks ekraanipildi jäädvustamine <xliff:g id="NUMBER_1">%d</xliff:g> sekundi pärast.</item>
+ <item quantity="one">Veaaruande jaoks ekraanipildi jäädvustamine <xliff:g id="NUMBER_0">%d</xliff:g> sekundi pärast.</item>
+ </plurals>
<string name="global_action_toggle_silent_mode" msgid="8219525344246810925">"Hääletu režiim"</string>
<string name="global_action_silent_mode_on_status" msgid="3289841937003758806">"Heli on VÄLJAS"</string>
<string name="global_action_silent_mode_off_status" msgid="1506046579177066419">"Heli on SEES"</string>
@@ -1049,8 +1049,8 @@
<string name="remote_bugreport_progress_notification_message_can_cancel" msgid="5743435483005099451">"Puudutage tühistamiseks"</string>
<string name="select_input_method" msgid="8547250819326693584">"Klaviatuuri muutmine"</string>
<string name="configure_input_methods" msgid="4769971288371946846">"Vali klaviatuurid"</string>
- <string name="show_ime" msgid="9157568568695230830">"Sisestusmeetodi kuvamine"</string>
- <string name="hardware" msgid="7517821086888990278">"Riistvara"</string>
+ <string name="show_ime" msgid="2506087537466597099">"Hoia seda ekraanil, kui füüsiline klaviatuur on aktiivne"</string>
+ <string name="hardware" msgid="194658061510127999">"Virtuaalse klaviatuuri kuvam."</string>
<string name="select_keyboard_layout_notification_title" msgid="1407367017263030773">"Klaviatuuri paigutuse valimine"</string>
<string name="select_keyboard_layout_notification_message" msgid="4465907700449257063">"Puudutage klaviatuuri paigutuse valimiseks."</string>
<string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSŠZŽTUVWÕÄÖÜXY"</string>
@@ -1531,4 +1531,10 @@
<string name="user_creation_cannot_add_any_more" msgid="6244197709981359266"><b>"<xliff:g id="APP">%1$s</xliff:g>"</b>" üritab lisada uut kasutajat, ent olete jõudnud kasutajate maksimumarvuni."</string>
<string name="user_creation_account_exists" msgid="4880171855014489789"><b>"<xliff:g id="APP">%1$s</xliff:g>"</b>" üritab lisada uut kasutajat, ent konto "<b>"<xliff:g id="ACCOUNT">%2$s</xliff:g>"</b>" on juba seadmes olemas. Kas soovite siiski jätkata?"</string>
<string name="user_creation_adding" msgid="3206420861363021392"><b>"<xliff:g id="APP">%1$s</xliff:g>"</b>" üritab lisada uut kasutajat kontole "<b>"<xliff:g id="ACCOUNT">%2$s</xliff:g>"</b>". Kas soovite jätkata?"</string>
+ <string name="language_selection_title" msgid="7181332986330337171">"Keele-eelistus"</string>
+ <string name="country_selection_title" msgid="2954859441620215513">"Piirkonnaeelistus"</string>
+ <string name="search_language_hint" msgid="7042102592055108574">"Sisestage keele nimi"</string>
+ <string name="language_picker_section_suggested" msgid="8414489646861640885">"Soovitatud"</string>
+ <string name="language_picker_section_all" msgid="3097279199511617537">"Kõik keeled"</string>
+ <string name="locale_search_menu" msgid="2560710726687249178">"Otsing"</string>
</resources>
diff --git a/core/res/res/values-eu-rES/strings.xml b/core/res/res/values-eu-rES/strings.xml
index 59cc71e..35d67e9 100644
--- a/core/res/res/values-eu-rES/strings.xml
+++ b/core/res/res/values-eu-rES/strings.xml
@@ -211,15 +211,15 @@
<string name="global_action_bug_report" msgid="7934010578922304799">"Akatsen txostena"</string>
<string name="bugreport_title" msgid="2667494803742548533">"Sortu akatsen txostena"</string>
<string name="bugreport_message" msgid="398447048750350456">"Gailuaren uneko egoerari buruzko informazioa bilduko da, mezu elektroniko gisa bidaltzeko. Minutu batzuk igaroko dira akatsen txostena sortzen hasten denetik bidaltzeko prest egon arte. Itxaron, mesedez."</string>
- <!-- no translation found for bugreport_option_interactive_title (8635056131768862479) -->
+ <string name="bugreport_option_interactive_title" msgid="8635056131768862479">"Txosten dinamikoa"</string>
+ <string name="bugreport_option_interactive_summary" msgid="8180152634022797629">"Aukera hau erabili beharko zenuke ia beti. Txostenaren jarraipena egin ahal izango duzu eta arazoari buruzko xehetasunak eman ahal izango dituzu. Baliteke gutxitan erabili behar izaten diren atalak ez agertzea, denbora aurrezteko."</string>
+ <string name="bugreport_option_full_title" msgid="6354382025840076439">"Txosten osoa"</string>
+ <!-- no translation found for bugreport_option_full_summary (6687306111256813257) -->
<skip />
- <!-- no translation found for bugreport_option_interactive_summary (8180152634022797629) -->
- <skip />
- <!-- no translation found for bugreport_option_full_title (6354382025840076439) -->
- <skip />
- <!-- no translation found for bugreport_option_full_summary (6440582052207304578) -->
- <skip />
- <!-- no translation found for bugreport_countdown (6878900193900090368) -->
+ <plurals name="bugreport_countdown" formatted="false" msgid="6878900193900090368">
+ <item quantity="other">Akatsen txostenaren argazkia aterako da <xliff:g id="NUMBER_1">%d</xliff:g> segundo barru.</item>
+ <item quantity="one">Akatsen txostenaren argazkia aterako da <xliff:g id="NUMBER_0">%d</xliff:g> segundo barru.</item>
+ </plurals>
<string name="global_action_toggle_silent_mode" msgid="8219525344246810925">"Isilik modua"</string>
<string name="global_action_silent_mode_on_status" msgid="3289841937003758806">"Soinua DESAKTIBATUTA dago"</string>
<string name="global_action_silent_mode_off_status" msgid="1506046579177066419">"Soinua AKTIBATUTA dago"</string>
@@ -1049,8 +1049,8 @@
<string name="remote_bugreport_progress_notification_message_can_cancel" msgid="5743435483005099451">"Ukitu bertan behera uzteko"</string>
<string name="select_input_method" msgid="8547250819326693584">"Aldatu teklatua"</string>
<string name="configure_input_methods" msgid="4769971288371946846">"Aukeratu teklatuak"</string>
- <string name="show_ime" msgid="9157568568695230830">"Erakutsi idazketa-metodoa"</string>
- <string name="hardware" msgid="7517821086888990278">"Hardwarea"</string>
+ <string name="show_ime" msgid="2506087537466597099">"Erakutsi pantailan teklatu fisikoa aktibo dagoen bitartean"</string>
+ <string name="hardware" msgid="194658061510127999">"Erakutsi teklatu birtuala"</string>
<string name="select_keyboard_layout_notification_title" msgid="1407367017263030773">"Hautatu teklatuaren diseinua"</string>
<string name="select_keyboard_layout_notification_message" msgid="4465907700449257063">"Ukitu teklatuaren diseinua hautatzeko."</string>
<string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
@@ -1531,4 +1531,10 @@
<string name="user_creation_cannot_add_any_more" msgid="6244197709981359266"><b>"<xliff:g id="APP">%1$s</xliff:g>"</b>" beste erabiltzaile bat gehitzen saiatzen ari da, baina erabiltzaileen mugara irisi da."</string>
<string name="user_creation_account_exists" msgid="4880171855014489789"><b>"<xliff:g id="APP">%1$s</xliff:g>"</b>" beste erabiltzaile bat gehitzen saiatzen ari da, baina "<b>"<xliff:g id="ACCOUNT">%2$s</xliff:g>"</b>" badago gailuan. Jarraitu nahi duzu halere?"</string>
<string name="user_creation_adding" msgid="3206420861363021392"><b>"<xliff:g id="APP">%1$s</xliff:g>"</b>" beste erabiltzaile bat gehitzen saiatzen ari da "<b>"<xliff:g id="ACCOUNT">%2$s</xliff:g>"</b>" kontuan. Jarraitu nahi duzu?"</string>
+ <string name="language_selection_title" msgid="7181332986330337171">"Hizkuntza-hobespena"</string>
+ <string name="country_selection_title" msgid="2954859441620215513">"Lurralde-hobespena"</string>
+ <string name="search_language_hint" msgid="7042102592055108574">"Adierazi hizkuntza"</string>
+ <string name="language_picker_section_suggested" msgid="8414489646861640885">"Iradokitakoak"</string>
+ <string name="language_picker_section_all" msgid="3097279199511617537">"Hizkuntza guztiak"</string>
+ <string name="locale_search_menu" msgid="2560710726687249178">"Bilaketa"</string>
</resources>
diff --git a/core/res/res/values-fa/strings.xml b/core/res/res/values-fa/strings.xml
index 41c6729..e1adfb9 100644
--- a/core/res/res/values-fa/strings.xml
+++ b/core/res/res/values-fa/strings.xml
@@ -211,15 +211,15 @@
<string name="global_action_bug_report" msgid="7934010578922304799">"گزارش اشکال"</string>
<string name="bugreport_title" msgid="2667494803742548533">"گرفتن گزارش اشکال"</string>
<string name="bugreport_message" msgid="398447048750350456">"این گزارش اطلاعات مربوط به وضعیت دستگاه کنونی شما را جمعآوری میکند تا به صورت یک پیام ایمیل ارسال شود. از زمان شروع گزارش اشکال تا آماده شدن برای ارسال اندکی زمان میبرد؛ لطفاً شکیبا باشید."</string>
- <!-- no translation found for bugreport_option_interactive_title (8635056131768862479) -->
+ <string name="bugreport_option_interactive_title" msgid="8635056131768862479">"گزارش تعاملی"</string>
+ <string name="bugreport_option_interactive_summary" msgid="8180152634022797629">"در بیشتر شرایط از این گزینه استفاده کنید. به شما امکان ردیابی پیشرفت گزارش و وارد کردن جزئیات بیشتری درباره مشکل را میدهد. ممکن است برخی از بخشهایی را که کمتر استفاده شده و باعث افزایش طول زمان گزارش میشود حذف کند."</string>
+ <string name="bugreport_option_full_title" msgid="6354382025840076439">"گزارش کامل"</string>
+ <!-- no translation found for bugreport_option_full_summary (6687306111256813257) -->
<skip />
- <!-- no translation found for bugreport_option_interactive_summary (8180152634022797629) -->
- <skip />
- <!-- no translation found for bugreport_option_full_title (6354382025840076439) -->
- <skip />
- <!-- no translation found for bugreport_option_full_summary (6440582052207304578) -->
- <skip />
- <!-- no translation found for bugreport_countdown (6878900193900090368) -->
+ <plurals name="bugreport_countdown" formatted="false" msgid="6878900193900090368">
+ <item quantity="one">تا <xliff:g id="NUMBER_1">%d</xliff:g> ثانیه دیگر عکس صفحهنمایش برای گزارش اشکال گرفته میشود.</item>
+ <item quantity="other">تا <xliff:g id="NUMBER_1">%d</xliff:g> ثانیه دیگر عکس صفحهنمایش برای گزارش اشکال گرفته میشود.</item>
+ </plurals>
<string name="global_action_toggle_silent_mode" msgid="8219525344246810925">"حالت ساکت"</string>
<string name="global_action_silent_mode_on_status" msgid="3289841937003758806">"صدا خاموش است"</string>
<string name="global_action_silent_mode_off_status" msgid="1506046579177066419">"صدا روشن است"</string>
@@ -1049,8 +1049,8 @@
<string name="remote_bugreport_progress_notification_message_can_cancel" msgid="5743435483005099451">"برای لغو کردن لمس کنید"</string>
<string name="select_input_method" msgid="8547250819326693584">"تغییر صفحهکلید"</string>
<string name="configure_input_methods" msgid="4769971288371946846">"انتخاب صفحهکلیدها"</string>
- <string name="show_ime" msgid="9157568568695230830">"نمایش روش ورودی"</string>
- <string name="hardware" msgid="7517821086888990278">"سختافزار"</string>
+ <string name="show_ime" msgid="2506087537466597099">"وقتی صفحهکلید فیزیکی فعال است این ویرایشگر را روی صفحه نگهمیدارد"</string>
+ <string name="hardware" msgid="194658061510127999">"نمایش صفحهکلید مجازی"</string>
<string name="select_keyboard_layout_notification_title" msgid="1407367017263030773">"انتخاب طرحبندی صفحهکلید"</string>
<string name="select_keyboard_layout_notification_message" msgid="4465907700449257063">"برای انتخاب یک طرحبندی صفحهکلید لمس کنید…"</string>
<string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
@@ -1531,4 +1531,10 @@
<string name="user_creation_cannot_add_any_more" msgid="6244197709981359266"><b>"<xliff:g id="APP">%1$s</xliff:g>"</b>" در تلاش است کاربر جدیدی اضافه کند، اما تعداد کاربران به حداکثر مجاز رسیده است."</string>
<string name="user_creation_account_exists" msgid="4880171855014489789"><b>"<xliff:g id="APP">%1$s</xliff:g>"</b>" در تلاش است کاربر جدیدی اضافه کند، اما حساب "<b>"<xliff:g id="ACCOUNT">%2$s</xliff:g>"</b>" از قبل در این دستگاه وجود دارد. در هر صورت ادامه داده شود؟"</string>
<string name="user_creation_adding" msgid="3206420861363021392"><b>"<xliff:g id="APP">%1$s</xliff:g>"</b>" در تلاش است کاربر جدیدی برای حساب "<b>"<xliff:g id="ACCOUNT">%2$s</xliff:g>"</b>" اضافه کند. ادامه میدهید؟"</string>
+ <string name="language_selection_title" msgid="7181332986330337171">"اولویتهای زبان"</string>
+ <string name="country_selection_title" msgid="2954859441620215513">"اولویتهای منطقه"</string>
+ <string name="search_language_hint" msgid="7042102592055108574">"نام زبان را تایپ کنید"</string>
+ <string name="language_picker_section_suggested" msgid="8414489646861640885">"پیشنهادشده"</string>
+ <string name="language_picker_section_all" msgid="3097279199511617537">"همه زبانها"</string>
+ <string name="locale_search_menu" msgid="2560710726687249178">"جستجو"</string>
</resources>
diff --git a/core/res/res/values-fi/strings.xml b/core/res/res/values-fi/strings.xml
index 70b1bd28..9274b87 100644
--- a/core/res/res/values-fi/strings.xml
+++ b/core/res/res/values-fi/strings.xml
@@ -211,15 +211,15 @@
<string name="global_action_bug_report" msgid="7934010578922304799">"Virheraportti"</string>
<string name="bugreport_title" msgid="2667494803742548533">"Luo virheraportti"</string>
<string name="bugreport_message" msgid="398447048750350456">"Toiminto kerää tietoja laitteen tilasta ja lähettää ne sähköpostitse. Virheraportti on valmis lähetettäväksi hetken kuluttua - kiitos kärsivällisyydestäsi."</string>
- <!-- no translation found for bugreport_option_interactive_title (8635056131768862479) -->
+ <string name="bugreport_option_interactive_title" msgid="8635056131768862479">"Interaktiivinen"</string>
+ <string name="bugreport_option_interactive_summary" msgid="8180152634022797629">"Valitse tämä vaihtoehto useimmissa tapauksissa. Voit seurata raportin etenemistä ja antaa lisätietoja ongelmasta. Tämä vaihtoehto saattaa ohittaa joitakin harvoin käytettyjä osioita, joiden käsittely raportissa kestää kauan."</string>
+ <string name="bugreport_option_full_title" msgid="6354382025840076439">"Koko raportti"</string>
+ <!-- no translation found for bugreport_option_full_summary (6687306111256813257) -->
<skip />
- <!-- no translation found for bugreport_option_interactive_summary (8180152634022797629) -->
- <skip />
- <!-- no translation found for bugreport_option_full_title (6354382025840076439) -->
- <skip />
- <!-- no translation found for bugreport_option_full_summary (6440582052207304578) -->
- <skip />
- <!-- no translation found for bugreport_countdown (6878900193900090368) -->
+ <plurals name="bugreport_countdown" formatted="false" msgid="6878900193900090368">
+ <item quantity="other">Virheraporttiin otetaan kuvakaappaus <xliff:g id="NUMBER_1">%d</xliff:g> sekunnin kuluttua.</item>
+ <item quantity="one">Virheraporttiin otetaan kuvakaappaus <xliff:g id="NUMBER_0">%d</xliff:g> sekunnin kuluttua.</item>
+ </plurals>
<string name="global_action_toggle_silent_mode" msgid="8219525344246810925">"Äänetön tila"</string>
<string name="global_action_silent_mode_on_status" msgid="3289841937003758806">"Äänet ovat POISSA KÄYTÖSTÄ"</string>
<string name="global_action_silent_mode_off_status" msgid="1506046579177066419">"Äänet ovat KÄYTÖSSÄ"</string>
@@ -1049,8 +1049,8 @@
<string name="remote_bugreport_progress_notification_message_can_cancel" msgid="5743435483005099451">"Peruuta koskettamalla"</string>
<string name="select_input_method" msgid="8547250819326693584">"Vaihda näppäimistö"</string>
<string name="configure_input_methods" msgid="4769971288371946846">"Valitse näppäimistöt"</string>
- <string name="show_ime" msgid="9157568568695230830">"Näytä syöttötapa"</string>
- <string name="hardware" msgid="7517821086888990278">"Laitteisto"</string>
+ <string name="show_ime" msgid="2506087537466597099">"Pidä näytöllä, kun fyysinen näppäimistö on aktiivinen."</string>
+ <string name="hardware" msgid="194658061510127999">"Näytä virtuaalinen näppäimistö"</string>
<string name="select_keyboard_layout_notification_title" msgid="1407367017263030773">"Valitse näppäimistöasettelu"</string>
<string name="select_keyboard_layout_notification_message" msgid="4465907700449257063">"Kosketa ja valitse näppäimistöasettelu."</string>
<string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSTUVWXYZÅÄÖ"</string>
@@ -1531,4 +1531,10 @@
<string name="user_creation_cannot_add_any_more" msgid="6244197709981359266"><b>"<xliff:g id="APP">%1$s</xliff:g>"</b>" yrittää lisätä uutta käyttäjää, mutta käyttäjiä on jo enimmäismäärä."</string>
<string name="user_creation_account_exists" msgid="4880171855014489789"><b>"<xliff:g id="APP">%1$s</xliff:g>"</b>" yrittää lisätä uutta käyttäjää, mutta tili "<b>"<xliff:g id="ACCOUNT">%2$s</xliff:g>"</b>" on jo tässä laitteessa. Jatketaanko silti?"</string>
<string name="user_creation_adding" msgid="3206420861363021392"><b>"<xliff:g id="APP">%1$s</xliff:g>"</b>" yrittää lisätä uutta käyttäjää tilille "<b>"<xliff:g id="ACCOUNT">%2$s</xliff:g>"</b>". Jatketaanko?"</string>
+ <string name="language_selection_title" msgid="7181332986330337171">"Kieliasetus"</string>
+ <string name="country_selection_title" msgid="2954859441620215513">"Alueasetus"</string>
+ <string name="search_language_hint" msgid="7042102592055108574">"Anna kielen nimi"</string>
+ <string name="language_picker_section_suggested" msgid="8414489646861640885">"Ehdotukset"</string>
+ <string name="language_picker_section_all" msgid="3097279199511617537">"Kaikki kielet"</string>
+ <string name="locale_search_menu" msgid="2560710726687249178">"Haku"</string>
</resources>
diff --git a/core/res/res/values-fr-rCA/strings.xml b/core/res/res/values-fr-rCA/strings.xml
index 4cbda57..965a83c 100644
--- a/core/res/res/values-fr-rCA/strings.xml
+++ b/core/res/res/values-fr-rCA/strings.xml
@@ -211,15 +211,15 @@
<string name="global_action_bug_report" msgid="7934010578922304799">"Rapport de bogue"</string>
<string name="bugreport_title" msgid="2667494803742548533">"Créer un rapport de bogue"</string>
<string name="bugreport_message" msgid="398447048750350456">"Cela permet de recueillir des informations concernant l\'état actuel de votre appareil. Ces informations sont ensuite envoyées sous forme de courriel. Merci de patienter pendant la préparation du rapport de bogue. Cette opération peut prendre quelques instants."</string>
- <!-- no translation found for bugreport_option_interactive_title (8635056131768862479) -->
+ <string name="bugreport_option_interactive_title" msgid="8635056131768862479">"Rapport interactif"</string>
+ <string name="bugreport_option_interactive_summary" msgid="8180152634022797629">"Utilisez cette option dans la plupart des circonstances. Elle vous permet de suivre la progression du rapport et d\'entrer plus de données sur le problème. Certaines sections moins utilisées et dont le remplissage demande beaucoup de temps peuvent être omises."</string>
+ <string name="bugreport_option_full_title" msgid="6354382025840076439">"Rapport complet"</string>
+ <!-- no translation found for bugreport_option_full_summary (6687306111256813257) -->
<skip />
- <!-- no translation found for bugreport_option_interactive_summary (8180152634022797629) -->
- <skip />
- <!-- no translation found for bugreport_option_full_title (6354382025840076439) -->
- <skip />
- <!-- no translation found for bugreport_option_full_summary (6440582052207304578) -->
- <skip />
- <!-- no translation found for bugreport_countdown (6878900193900090368) -->
+ <plurals name="bugreport_countdown" formatted="false" msgid="6878900193900090368">
+ <item quantity="one">Saisie d\'écran pour le rapport de bogue dans <xliff:g id="NUMBER_1">%d</xliff:g> seconde.</item>
+ <item quantity="other">Saisie d\'écran pour le rapport de bogue dans <xliff:g id="NUMBER_1">%d</xliff:g> secondes.</item>
+ </plurals>
<string name="global_action_toggle_silent_mode" msgid="8219525344246810925">"Mode silencieux"</string>
<string name="global_action_silent_mode_on_status" msgid="3289841937003758806">"Le son est désactivé."</string>
<string name="global_action_silent_mode_off_status" msgid="1506046579177066419">"Le son est activé."</string>
@@ -1049,8 +1049,8 @@
<string name="remote_bugreport_progress_notification_message_can_cancel" msgid="5743435483005099451">"Touchez pour annuler"</string>
<string name="select_input_method" msgid="8547250819326693584">"Changer de clavier"</string>
<string name="configure_input_methods" msgid="4769971288371946846">"Choisir les claviers"</string>
- <string name="show_ime" msgid="9157568568695230830">"Afficher le mode d\'entrée"</string>
- <string name="hardware" msgid="7517821086888990278">"Matériel"</string>
+ <string name="show_ime" msgid="2506087537466597099">"Afficher lorsque le clavier physique est activé"</string>
+ <string name="hardware" msgid="194658061510127999">"Afficher le clavier virtuel"</string>
<string name="select_keyboard_layout_notification_title" msgid="1407367017263030773">"Sélectionnez la disposition du clavier"</string>
<string name="select_keyboard_layout_notification_message" msgid="4465907700449257063">"Appuyez ici pour sélectionner une disposition de clavier."</string>
<string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
@@ -1531,4 +1531,10 @@
<string name="user_creation_cannot_add_any_more" msgid="6244197709981359266"><b>"<xliff:g id="APP">%1$s</xliff:g>"</b>" essaie d\'ajouter un utilisateur, mais le nombre maximal d\'utilisateurs a été atteint."</string>
<string name="user_creation_account_exists" msgid="4880171855014489789"><b>"<xliff:g id="APP">%1$s</xliff:g>"</b>" essaie d\'ajouter un utilisateur, mais le compte "<b>"<xliff:g id="ACCOUNT">%2$s</xliff:g>"</b>" existe déjà sur cet appareil. Continuer?"</string>
<string name="user_creation_adding" msgid="3206420861363021392"><b>"<xliff:g id="APP">%1$s</xliff:g>"</b>" essaie d\'ajouter un utilisateur, mais le compte "<b>"<xliff:g id="ACCOUNT">%2$s</xliff:g>"</b>". Continuer?"</string>
+ <string name="language_selection_title" msgid="7181332986330337171">"Préférences linguistiques"</string>
+ <string name="country_selection_title" msgid="2954859441620215513">"Préférence régionales"</string>
+ <string name="search_language_hint" msgid="7042102592055108574">"Entrez la langue"</string>
+ <string name="language_picker_section_suggested" msgid="8414489646861640885">"Suggestions"</string>
+ <string name="language_picker_section_all" msgid="3097279199511617537">"Toutes les langues"</string>
+ <string name="locale_search_menu" msgid="2560710726687249178">"Rechercher"</string>
</resources>
diff --git a/core/res/res/values-fr/strings.xml b/core/res/res/values-fr/strings.xml
index 2daaff4..b0260ef 100644
--- a/core/res/res/values-fr/strings.xml
+++ b/core/res/res/values-fr/strings.xml
@@ -211,15 +211,15 @@
<string name="global_action_bug_report" msgid="7934010578922304799">"Rapport de bug"</string>
<string name="bugreport_title" msgid="2667494803742548533">"Créer un rapport de bug"</string>
<string name="bugreport_message" msgid="398447048750350456">"Cela permet de recueillir des informations concernant l\'état actuel de votre appareil. Ces informations sont ensuite envoyées sous forme d\'e-mail. Merci de patienter pendant la préparation du rapport de bug. Cette opération peut prendre quelques instants."</string>
- <!-- no translation found for bugreport_option_interactive_title (8635056131768862479) -->
+ <string name="bugreport_option_interactive_title" msgid="8635056131768862479">"Rapport interactif"</string>
+ <string name="bugreport_option_interactive_summary" msgid="8180152634022797629">"Utilisez cette option dans la plupart des circonstances. Elle vous permet de suivre la progression du rapport et de saisir plus d\'informations sur le problème. Certaines sections moins utilisées et dont le remplissage demande beaucoup de temps peuvent être omises."</string>
+ <string name="bugreport_option_full_title" msgid="6354382025840076439">"Rapport complet"</string>
+ <!-- no translation found for bugreport_option_full_summary (6687306111256813257) -->
<skip />
- <!-- no translation found for bugreport_option_interactive_summary (8180152634022797629) -->
- <skip />
- <!-- no translation found for bugreport_option_full_title (6354382025840076439) -->
- <skip />
- <!-- no translation found for bugreport_option_full_summary (6440582052207304578) -->
- <skip />
- <!-- no translation found for bugreport_countdown (6878900193900090368) -->
+ <plurals name="bugreport_countdown" formatted="false" msgid="6878900193900090368">
+ <item quantity="one">Capture d\'écran pour le rapport de bug dans <xliff:g id="NUMBER_1">%d</xliff:g> seconde</item>
+ <item quantity="other">Capture d\'écran pour le rapport de bug dans <xliff:g id="NUMBER_1">%d</xliff:g> secondes</item>
+ </plurals>
<string name="global_action_toggle_silent_mode" msgid="8219525344246810925">"Mode silencieux"</string>
<string name="global_action_silent_mode_on_status" msgid="3289841937003758806">"Le son est désactivé."</string>
<string name="global_action_silent_mode_off_status" msgid="1506046579177066419">"Le son est activé."</string>
@@ -1049,8 +1049,8 @@
<string name="remote_bugreport_progress_notification_message_can_cancel" msgid="5743435483005099451">"Appuyer pour annuler"</string>
<string name="select_input_method" msgid="8547250819326693584">"Changer de clavier"</string>
<string name="configure_input_methods" msgid="4769971288371946846">"Sélectionner des claviers"</string>
- <string name="show_ime" msgid="9157568568695230830">"Afficher mode de saisie"</string>
- <string name="hardware" msgid="7517821086888990278">"Matériel"</string>
+ <string name="show_ime" msgid="2506087537466597099">"Afficher lorsque le clavier physique est activé"</string>
+ <string name="hardware" msgid="194658061510127999">"Afficher le clavier virtuel"</string>
<string name="select_keyboard_layout_notification_title" msgid="1407367017263030773">"Sélectionnez la disposition du clavier"</string>
<string name="select_keyboard_layout_notification_message" msgid="4465907700449257063">"Appuyez ici pour sélectionner une disposition de clavier."</string>
<string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
@@ -1531,4 +1531,10 @@
<string name="user_creation_cannot_add_any_more" msgid="6244197709981359266"><b>"<xliff:g id="APP">%1$s</xliff:g>"</b>" essaie d\'ajouter un utilisateur, mais le nombre maximal d\'utilisateurs a été atteint."</string>
<string name="user_creation_account_exists" msgid="4880171855014489789"><b>"<xliff:g id="APP">%1$s</xliff:g>"</b>" essaie d\'ajouter un utilisateur, mais le compte "<b>"<xliff:g id="ACCOUNT">%2$s</xliff:g>"</b>" existe déjà sur cet appareil. Continuer ?"</string>
<string name="user_creation_adding" msgid="3206420861363021392"><b>"<xliff:g id="APP">%1$s</xliff:g>"</b>" essaie d\'ajouter un utilisateur au compte "<b>"<xliff:g id="ACCOUNT">%2$s</xliff:g>"</b>". Continuer ?"</string>
+ <string name="language_selection_title" msgid="7181332986330337171">"Préférences linguistiques"</string>
+ <string name="country_selection_title" msgid="2954859441620215513">"Préférences régionales"</string>
+ <string name="search_language_hint" msgid="7042102592055108574">"Saisissez la langue"</string>
+ <string name="language_picker_section_suggested" msgid="8414489646861640885">"Recommandations"</string>
+ <string name="language_picker_section_all" msgid="3097279199511617537">"Toutes les langues"</string>
+ <string name="locale_search_menu" msgid="2560710726687249178">"Rechercher"</string>
</resources>
diff --git a/core/res/res/values-gl-rES/strings.xml b/core/res/res/values-gl-rES/strings.xml
index a74a013..b2a69fc 100644
--- a/core/res/res/values-gl-rES/strings.xml
+++ b/core/res/res/values-gl-rES/strings.xml
@@ -211,15 +211,15 @@
<string name="global_action_bug_report" msgid="7934010578922304799">"Informe de erros"</string>
<string name="bugreport_title" msgid="2667494803742548533">"Crear informe de erros"</string>
<string name="bugreport_message" msgid="398447048750350456">"Este informe recompilará información acerca do estado actual do teu dispositivo para enviala en forma de mensaxe de correo electrónico. O informe de erros tardará un pouco en completarse desde o seu inicio ata que estea preparado para enviarse, polo que che recomendamos que teñas paciencia."</string>
- <!-- no translation found for bugreport_option_interactive_title (8635056131768862479) -->
+ <string name="bugreport_option_interactive_title" msgid="8635056131768862479">"Informe interactivo"</string>
+ <string name="bugreport_option_interactive_summary" msgid="8180152634022797629">"Usa esta opción na maioría das circunstancias. Permíteche realizar un seguimento do progreso do informe e introducir máis detalles sobre o problema. Pode que omita algunhas seccións menos usadas para as que se tarda máis en facer o informe."</string>
+ <string name="bugreport_option_full_title" msgid="6354382025840076439">"Informe completo"</string>
+ <!-- no translation found for bugreport_option_full_summary (6687306111256813257) -->
<skip />
- <!-- no translation found for bugreport_option_interactive_summary (8180152634022797629) -->
- <skip />
- <!-- no translation found for bugreport_option_full_title (6354382025840076439) -->
- <skip />
- <!-- no translation found for bugreport_option_full_summary (6440582052207304578) -->
- <skip />
- <!-- no translation found for bugreport_countdown (6878900193900090368) -->
+ <plurals name="bugreport_countdown" formatted="false" msgid="6878900193900090368">
+ <item quantity="other">Facendo captura de pantalla para informe de erros en <xliff:g id="NUMBER_1">%d</xliff:g> segundos.</item>
+ <item quantity="one">Facendo captura de pantalla para informe de erros en <xliff:g id="NUMBER_0">%d</xliff:g> segundo.</item>
+ </plurals>
<string name="global_action_toggle_silent_mode" msgid="8219525344246810925">"Modo de silencio"</string>
<string name="global_action_silent_mode_on_status" msgid="3289841937003758806">"O son está desactivado"</string>
<string name="global_action_silent_mode_off_status" msgid="1506046579177066419">"O son está activado"</string>
@@ -1049,8 +1049,8 @@
<string name="remote_bugreport_progress_notification_message_can_cancel" msgid="5743435483005099451">"Tocar para cancelar o informe de erros"</string>
<string name="select_input_method" msgid="8547250819326693584">"Cambiar teclado"</string>
<string name="configure_input_methods" msgid="4769971288371946846">"Seleccionar teclados"</string>
- <string name="show_ime" msgid="9157568568695230830">"Mostra método de entrada"</string>
- <string name="hardware" msgid="7517821086888990278">"Hardware"</string>
+ <string name="show_ime" msgid="2506087537466597099">"Manteno na pantalla mentres o teclado físico estea activo"</string>
+ <string name="hardware" msgid="194658061510127999">"Mostrar teclado virtual"</string>
<string name="select_keyboard_layout_notification_title" msgid="1407367017263030773">"Seleccionar deseño de teclado"</string>
<string name="select_keyboard_layout_notification_message" msgid="4465907700449257063">"Toca para seleccionar un deseño de teclado."</string>
<string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNÑOPQRSTUVWXYZ"</string>
@@ -1531,4 +1531,10 @@
<string name="user_creation_cannot_add_any_more" msgid="6244197709981359266"><b>"<xliff:g id="APP">%1$s</xliff:g>"</b>" está tentando engadir un usuario novo, pero alcanzouse o límite de usuarios."</string>
<string name="user_creation_account_exists" msgid="4880171855014489789"><b>"<xliff:g id="APP">%1$s</xliff:g>"</b>" está tentando engadir un usuario novo, pero a conta "<b>"<xliff:g id="ACCOUNT">%2$s</xliff:g>"</b>" xa existe neste dispositivo. Queres continuar igualmente?"</string>
<string name="user_creation_adding" msgid="3206420861363021392"><b>"<xliff:g id="APP">%1$s</xliff:g>"</b>" está tentando engadir un usuario novo á conta "<b>"<xliff:g id="ACCOUNT">%2$s</xliff:g>"</b>". Queres continuar?"</string>
+ <string name="language_selection_title" msgid="7181332986330337171">"Preferencia de idioma"</string>
+ <string name="country_selection_title" msgid="2954859441620215513">"Preferencia de rexión"</string>
+ <string name="search_language_hint" msgid="7042102592055108574">"Escribe o nome"</string>
+ <string name="language_picker_section_suggested" msgid="8414489646861640885">"Suxeridos"</string>
+ <string name="language_picker_section_all" msgid="3097279199511617537">"Todos os idiomas"</string>
+ <string name="locale_search_menu" msgid="2560710726687249178">"Buscar"</string>
</resources>
diff --git a/core/res/res/values-gu-rIN/strings.xml b/core/res/res/values-gu-rIN/strings.xml
index 97404e9..9848cfb 100644
--- a/core/res/res/values-gu-rIN/strings.xml
+++ b/core/res/res/values-gu-rIN/strings.xml
@@ -211,15 +211,15 @@
<string name="global_action_bug_report" msgid="7934010578922304799">"બગ રિપોર્ટ"</string>
<string name="bugreport_title" msgid="2667494803742548533">"બગ રિપોર્ટ લો"</string>
<string name="bugreport_message" msgid="398447048750350456">"આ, એક ઇ-મેઇલ સંદેશ તરીકે મોકલવા માટે, તમારા વર્તમાન ઉપકરણ સ્થિતિ વિશેની માહિતી એકત્રિત કરશે. એક બગ રિપોર્ટ પ્રારંભ કરીને તે મોકલવા માટે તૈયાર ન થઈ જાય ત્યાં સુધી તેમાં થોડો સમય લાગશે; કૃપા કરીને ધીરજ રાખો."</string>
- <!-- no translation found for bugreport_option_interactive_title (8635056131768862479) -->
+ <string name="bugreport_option_interactive_title" msgid="8635056131768862479">"ક્રિયાપ્રતિક્રિયાત્મક રિપોર્ટ"</string>
+ <string name="bugreport_option_interactive_summary" msgid="8180152634022797629">"મોટાભાગના સંજોગોમાં આનો ઉપયોગ કરો. તે રિપોર્ટની પ્રગતિને ટ્રૅક કરવા અમે સમસ્યા વિશે વધુ વિગતો દાખલ કરવાની મંજૂરી આપે છે. તે કેટલાંક ઓછા ઉપયોગમાં આવતા વિભાગો કે જે જાણ કરવામાં વધુ સમય લેતા હોય તેને છોડી દઈ શકે છે."</string>
+ <string name="bugreport_option_full_title" msgid="6354382025840076439">"પૂર્ણ રિપોર્ટ"</string>
+ <!-- no translation found for bugreport_option_full_summary (6687306111256813257) -->
<skip />
- <!-- no translation found for bugreport_option_interactive_summary (8180152634022797629) -->
- <skip />
- <!-- no translation found for bugreport_option_full_title (6354382025840076439) -->
- <skip />
- <!-- no translation found for bugreport_option_full_summary (6440582052207304578) -->
- <skip />
- <!-- no translation found for bugreport_countdown (6878900193900090368) -->
+ <plurals name="bugreport_countdown" formatted="false" msgid="6878900193900090368">
+ <item quantity="one">બગ રિપોર્ટ માટે <xliff:g id="NUMBER_1">%d</xliff:g> સેકન્ડમાં સ્ક્રીનશોટ લઈ રહ્યાં છે.</item>
+ <item quantity="other">બગ રિપોર્ટ માટે <xliff:g id="NUMBER_1">%d</xliff:g> સેકન્ડમાં સ્ક્રીનશોટ લઈ રહ્યાં છે.</item>
+ </plurals>
<string name="global_action_toggle_silent_mode" msgid="8219525344246810925">"સાઇલેન્ટ મોડ"</string>
<string name="global_action_silent_mode_on_status" msgid="3289841937003758806">"અવાજ બંધ છે"</string>
<string name="global_action_silent_mode_off_status" msgid="1506046579177066419">"ધ્વનિ ચાલુ છે"</string>
@@ -1049,8 +1049,8 @@
<string name="remote_bugreport_progress_notification_message_can_cancel" msgid="5743435483005099451">"રદ કરવા માટે ટચ કરો"</string>
<string name="select_input_method" msgid="8547250819326693584">"કીબોર્ડ બદલો"</string>
<string name="configure_input_methods" msgid="4769971288371946846">"કીબોર્ડ્સ પસંદ કરો"</string>
- <string name="show_ime" msgid="9157568568695230830">"ઇનપુટ પદ્ધતિ બતાવો"</string>
- <string name="hardware" msgid="7517821086888990278">"હાર્ડવેર"</string>
+ <string name="show_ime" msgid="2506087537466597099">"જ્યારે ભૌતિક કીબોર્ડ સક્રિય હોય ત્યારે તેને સ્ક્રીન પર રાખો"</string>
+ <string name="hardware" msgid="194658061510127999">"વર્ચ્યુઅલ કીબોર્ડ બતાવો"</string>
<string name="select_keyboard_layout_notification_title" msgid="1407367017263030773">"કીબોર્ડ લેઆઉટ પસંદ કરો."</string>
<string name="select_keyboard_layout_notification_message" msgid="4465907700449257063">"કીબોર્ડ લેઆઉટ પસંદ કરવા માટે ટચ કરો."</string>
<string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
@@ -1531,4 +1531,10 @@
<string name="user_creation_cannot_add_any_more" msgid="6244197709981359266"><b>"<xliff:g id="APP">%1$s</xliff:g>"</b>", નવા વપરાશકર્તાને ઉમેરવાનો પ્રયાસ કરી રહી છે, પરંતુ વપરાશકર્તા મર્યાદા સુધી પહોંચી ગયા છો."</string>
<string name="user_creation_account_exists" msgid="4880171855014489789"><b>"<xliff:g id="APP">%1$s</xliff:g>"</b>", નવા વપરાશકર્તાને ઉમેરવાનો પ્રયાસ કરી રહી છે, પરંતુ "<b>"<xliff:g id="ACCOUNT">%2$s</xliff:g>"</b>" એકાઉન્ટ પહેલાંથી જ આ ઉપકરણ પર અસ્તિત્વમાં છે. કોઇપણ રીતે આગળ વધીએ?"</string>
<string name="user_creation_adding" msgid="3206420861363021392"><b>"<xliff:g id="APP">%1$s</xliff:g>"</b>", "<b>"<xliff:g id="ACCOUNT">%2$s</xliff:g>"</b>" એકાઉન્ટ માટે એક નવા વપરાશકર્તાને ઉમેરવાનો પ્રયાસ કરી રહી છે. આગળ વધીએ?"</string>
+ <string name="language_selection_title" msgid="7181332986330337171">"ભાષા પસંદગી"</string>
+ <string name="country_selection_title" msgid="2954859441620215513">"પ્રદેશ પસંદગી"</string>
+ <string name="search_language_hint" msgid="7042102592055108574">"ભાષાનું નામ ટાઇપ કરો"</string>
+ <string name="language_picker_section_suggested" msgid="8414489646861640885">"સૂચવેલા"</string>
+ <string name="language_picker_section_all" msgid="3097279199511617537">"બધી ભાષાઓ"</string>
+ <string name="locale_search_menu" msgid="2560710726687249178">"શોધ"</string>
</resources>
diff --git a/core/res/res/values-hi/strings.xml b/core/res/res/values-hi/strings.xml
index 39bc701..39608cb 100644
--- a/core/res/res/values-hi/strings.xml
+++ b/core/res/res/values-hi/strings.xml
@@ -211,15 +211,15 @@
<string name="global_action_bug_report" msgid="7934010578922304799">"बग रिपोर्ट"</string>
<string name="bugreport_title" msgid="2667494803742548533">"बग रिपोर्ट प्राप्त करें"</string>
<string name="bugreport_message" msgid="398447048750350456">"ईमेल संदेश के रूप में भेजने के लिए, इसके द्वारा आपके डिवाइस की वर्तमान स्थिति के बारे में जानकारी एकत्र की जाएगी. बग रिपोर्ट प्रारंभ करने से लेकर भेजने के लिए तैयार होने तक कुछ समय लगेगा; कृपया धैर्य रखें."</string>
- <!-- no translation found for bugreport_option_interactive_title (8635056131768862479) -->
+ <string name="bugreport_option_interactive_title" msgid="8635056131768862479">"सहभागी रिपोर्ट"</string>
+ <string name="bugreport_option_interactive_summary" msgid="8180152634022797629">"अधिकांश परिस्थितियों में इसका उपयोग करें. यह आपको रिपोर्ट की प्रगति ट्रैक करने देता है और समस्या के बारे में अधिक विवरण डालने देता है. यह आपको ऐसे कम उपयोग किए गए अनुभाग मिटाने दे सकता है जिनकी रिपोर्ट करने में अधिक समय लगता है."</string>
+ <string name="bugreport_option_full_title" msgid="6354382025840076439">"पूर्ण रिपोर्ट"</string>
+ <!-- no translation found for bugreport_option_full_summary (6687306111256813257) -->
<skip />
- <!-- no translation found for bugreport_option_interactive_summary (8180152634022797629) -->
- <skip />
- <!-- no translation found for bugreport_option_full_title (6354382025840076439) -->
- <skip />
- <!-- no translation found for bugreport_option_full_summary (6440582052207304578) -->
- <skip />
- <!-- no translation found for bugreport_countdown (6878900193900090368) -->
+ <plurals name="bugreport_countdown" formatted="false" msgid="6878900193900090368">
+ <item quantity="one">बग रिपोर्ट के लिए <xliff:g id="NUMBER_1">%d</xliff:g> सेकंड में स्क्रीनशॉट लिया जा रहा है.</item>
+ <item quantity="other">बग रिपोर्ट के लिए <xliff:g id="NUMBER_1">%d</xliff:g> सेकंड में स्क्रीनशॉट लिया जा रहा है.</item>
+ </plurals>
<string name="global_action_toggle_silent_mode" msgid="8219525344246810925">"मौन मोड"</string>
<string name="global_action_silent_mode_on_status" msgid="3289841937003758806">"ध्वनि बंद है"</string>
<string name="global_action_silent_mode_off_status" msgid="1506046579177066419">"ध्वनि चालू है"</string>
@@ -1049,8 +1049,8 @@
<string name="remote_bugreport_progress_notification_message_can_cancel" msgid="5743435483005099451">"रद्द करने के लिए स्पर्श करें"</string>
<string name="select_input_method" msgid="8547250819326693584">"कीबोर्ड बदलें"</string>
<string name="configure_input_methods" msgid="4769971288371946846">"कीबोर्ड चुनें"</string>
- <string name="show_ime" msgid="9157568568695230830">"इनपुट विधि दिखाएं"</string>
- <string name="hardware" msgid="7517821086888990278">"हार्डवेयर"</string>
+ <string name="show_ime" msgid="2506087537466597099">"भौतिक कीबोर्ड के सक्रिय होने के दौरान इसे स्क्रीन पर बनाए रखें"</string>
+ <string name="hardware" msgid="194658061510127999">"वर्चुअल कीबोर्ड दिखाएं"</string>
<string name="select_keyboard_layout_notification_title" msgid="1407367017263030773">"कीबोर्ड लेआउट को चुनें"</string>
<string name="select_keyboard_layout_notification_message" msgid="4465907700449257063">"कीबोर्ड लेआउट का चयन करने के लिए स्पर्श करें."</string>
<string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
@@ -1531,4 +1531,10 @@
<string name="user_creation_cannot_add_any_more" msgid="6244197709981359266"><b>"<xliff:g id="APP">%1$s</xliff:g>"</b>" नए उपयोगकर्ता को जोड़ने का प्रयास कर रहा है, लेकिन उपयोगकर्ता की सीमा पूरी हो गई है."</string>
<string name="user_creation_account_exists" msgid="4880171855014489789"><b>"<xliff:g id="APP">%1$s</xliff:g>"</b>" नए उपयोगकर्ता को जोड़ने का प्रयास कर रहा है, लेकिन "<b>"<xliff:g id="ACCOUNT">%2$s</xliff:g>"</b>" खाता इस डिवाइस पर पहले से मौजूद है. फिर भी आगे बढ़ें?"</string>
<string name="user_creation_adding" msgid="3206420861363021392"><b>"<xliff:g id="APP">%1$s</xliff:g>"</b>" इस "<b>"<xliff:g id="ACCOUNT">%2$s</xliff:g>"</b>" खाते के लिए नया उपयोगकर्ता जोड़ने का प्रयास कर रहा है. आगे बढ़ें?"</string>
+ <string name="language_selection_title" msgid="7181332986330337171">"भाषा प्राथमिकता"</string>
+ <string name="country_selection_title" msgid="2954859441620215513">"क्षेत्र प्राथमिकता"</string>
+ <string name="search_language_hint" msgid="7042102592055108574">"भाषा का नाम लिखें"</string>
+ <string name="language_picker_section_suggested" msgid="8414489646861640885">"सुझाए गए"</string>
+ <string name="language_picker_section_all" msgid="3097279199511617537">"सभी भाषाएं"</string>
+ <string name="locale_search_menu" msgid="2560710726687249178">"खोजें"</string>
</resources>
diff --git a/core/res/res/values-hr/strings.xml b/core/res/res/values-hr/strings.xml
index fbb347f..2584260 100644
--- a/core/res/res/values-hr/strings.xml
+++ b/core/res/res/values-hr/strings.xml
@@ -212,15 +212,16 @@
<string name="global_action_bug_report" msgid="7934010578922304799">"Izvješće o bugovima"</string>
<string name="bugreport_title" msgid="2667494803742548533">"Izvješće o programskoj pogrešci"</string>
<string name="bugreport_message" msgid="398447048750350456">"Time će se prikupiti podaci o trenutačnom stanju vašeg uređaja koje ćete nam poslati u e-poruci. Za pripremu izvješća o programskoj pogrešci potrebno je nešto vremena pa vas molimo za strpljenje."</string>
- <!-- no translation found for bugreport_option_interactive_title (8635056131768862479) -->
+ <string name="bugreport_option_interactive_title" msgid="8635056131768862479">"Interaktivno izvješće"</string>
+ <string name="bugreport_option_interactive_summary" msgid="8180152634022797629">"To možete upotrebljavati u većini slučajeva. Moći ćete pratiti izradu izvješća i unijeti više pojedinosti o problemu. Mogu se izostaviti neki odjeljci koji se upotrebljavaju rjeđe i produljuju izradu izvješća."</string>
+ <string name="bugreport_option_full_title" msgid="6354382025840076439">"Potpuno izvješće"</string>
+ <!-- no translation found for bugreport_option_full_summary (6687306111256813257) -->
<skip />
- <!-- no translation found for bugreport_option_interactive_summary (8180152634022797629) -->
- <skip />
- <!-- no translation found for bugreport_option_full_title (6354382025840076439) -->
- <skip />
- <!-- no translation found for bugreport_option_full_summary (6440582052207304578) -->
- <skip />
- <!-- no translation found for bugreport_countdown (6878900193900090368) -->
+ <plurals name="bugreport_countdown" formatted="false" msgid="6878900193900090368">
+ <item quantity="one">Izrada snimke zaslona za izvješće o programskoj pogrešci za <xliff:g id="NUMBER_1">%d</xliff:g> sekundu.</item>
+ <item quantity="few">Izrada snimke zaslona za izvješće o programskoj pogrešci za <xliff:g id="NUMBER_1">%d</xliff:g> sekunde.</item>
+ <item quantity="other">Izrada snimke zaslona za izvješće o programskoj pogrešci za <xliff:g id="NUMBER_1">%d</xliff:g> sekundi.</item>
+ </plurals>
<string name="global_action_toggle_silent_mode" msgid="8219525344246810925">"Bešumni način"</string>
<string name="global_action_silent_mode_on_status" msgid="3289841937003758806">"Zvuk je isključen"</string>
<string name="global_action_silent_mode_off_status" msgid="1506046579177066419">"Zvuk je uključen"</string>
@@ -1056,8 +1057,8 @@
<string name="remote_bugreport_progress_notification_message_can_cancel" msgid="5743435483005099451">"Dodirnite da biste otkazali"</string>
<string name="select_input_method" msgid="8547250819326693584">"Promjena tipkovnice"</string>
<string name="configure_input_methods" msgid="4769971288371946846">"Odaberi tipkovnice"</string>
- <string name="show_ime" msgid="9157568568695230830">"Prikaz način unosa"</string>
- <string name="hardware" msgid="7517821086888990278">"Hardver"</string>
+ <string name="show_ime" msgid="2506087537466597099">"Zadržava se na zaslonu dok je fizička tipkovnica aktivna"</string>
+ <string name="hardware" msgid="194658061510127999">"Prikaži virtualnu tipkovnicu"</string>
<string name="select_keyboard_layout_notification_title" msgid="1407367017263030773">"Odaberite izgled tipkovnice"</string>
<string name="select_keyboard_layout_notification_message" msgid="4465907700449257063">"Dodirnite za odabir izgleda tipkovnice."</string>
<string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
@@ -1549,4 +1550,10 @@
<string name="user_creation_cannot_add_any_more" msgid="6244197709981359266"><b>"<xliff:g id="APP">%1$s</xliff:g>"</b>" pokušava dodati novog korisnika, no dosegnuto je ograničenje broja korisnika."</string>
<string name="user_creation_account_exists" msgid="4880171855014489789"><b>"<xliff:g id="APP">%1$s</xliff:g>"</b>" pokušava dodati novog korisnika, ali račun "<b>"<xliff:g id="ACCOUNT">%2$s</xliff:g>"</b>" već postoji na ovom uređaju. Želite li ipak nastaviti?"</string>
<string name="user_creation_adding" msgid="3206420861363021392"><b>"<xliff:g id="APP">%1$s</xliff:g>"</b>" pokušava dodati novog korisnika za račun "<b>"<xliff:g id="ACCOUNT">%2$s</xliff:g>"</b>". Želite li nastaviti?"</string>
+ <string name="language_selection_title" msgid="7181332986330337171">"Postavke jezika"</string>
+ <string name="country_selection_title" msgid="2954859441620215513">"Postavke regije"</string>
+ <string name="search_language_hint" msgid="7042102592055108574">"Unesite naziv jezika"</string>
+ <string name="language_picker_section_suggested" msgid="8414489646861640885">"Predloženo"</string>
+ <string name="language_picker_section_all" msgid="3097279199511617537">"Svi jezici"</string>
+ <string name="locale_search_menu" msgid="2560710726687249178">"Pretraži"</string>
</resources>
diff --git a/core/res/res/values-hu/strings.xml b/core/res/res/values-hu/strings.xml
index 569e725..a5d8f14 100644
--- a/core/res/res/values-hu/strings.xml
+++ b/core/res/res/values-hu/strings.xml
@@ -211,15 +211,15 @@
<string name="global_action_bug_report" msgid="7934010578922304799">"Programhiba bejelentése"</string>
<string name="bugreport_title" msgid="2667494803742548533">"Hibajelentés készítése"</string>
<string name="bugreport_message" msgid="398447048750350456">"Ezzel információt fog gyűjteni az eszköz jelenlegi állapotáról, amelyet a rendszer e-mailben fog elküldeni. Kérjük, legyen türelemmel, amíg a hibajelentés elkészül, és küldhető állapotba kerül."</string>
- <!-- no translation found for bugreport_option_interactive_title (8635056131768862479) -->
+ <string name="bugreport_option_interactive_title" msgid="8635056131768862479">"Interaktív jelentés"</string>
+ <string name="bugreport_option_interactive_summary" msgid="8180152634022797629">"Ezt használja a legtöbb esetben. Segítségével nyomon követheti a jelentés folyamatát, és további információkat kaphat a problémáról. A folyamat során kimaradhatnak az olyan kevésbé használt részek, amelyek jelentése túl sok időt igényel."</string>
+ <string name="bugreport_option_full_title" msgid="6354382025840076439">"Teljes jelentés"</string>
+ <!-- no translation found for bugreport_option_full_summary (6687306111256813257) -->
<skip />
- <!-- no translation found for bugreport_option_interactive_summary (8180152634022797629) -->
- <skip />
- <!-- no translation found for bugreport_option_full_title (6354382025840076439) -->
- <skip />
- <!-- no translation found for bugreport_option_full_summary (6440582052207304578) -->
- <skip />
- <!-- no translation found for bugreport_countdown (6878900193900090368) -->
+ <plurals name="bugreport_countdown" formatted="false" msgid="6878900193900090368">
+ <item quantity="other">Képernyőkép készítése a hibajelentéshez <xliff:g id="NUMBER_1">%d</xliff:g> másodpercen belül.</item>
+ <item quantity="one">Képernyőkép készítése a hibajelentéshez <xliff:g id="NUMBER_0">%d</xliff:g> másodpercen belül.</item>
+ </plurals>
<string name="global_action_toggle_silent_mode" msgid="8219525344246810925">"Néma üzemmód"</string>
<string name="global_action_silent_mode_on_status" msgid="3289841937003758806">"Hang kikapcsolva"</string>
<string name="global_action_silent_mode_off_status" msgid="1506046579177066419">"Hang bekapcsolva"</string>
@@ -1049,8 +1049,8 @@
<string name="remote_bugreport_progress_notification_message_can_cancel" msgid="5743435483005099451">"A visszavonáshoz érintse meg"</string>
<string name="select_input_method" msgid="8547250819326693584">"Billentyűzet megváltoztatása"</string>
<string name="configure_input_methods" msgid="4769971288371946846">"Billentyűzetek kiválasztása"</string>
- <string name="show_ime" msgid="9157568568695230830">"Beviteli mód megjelenítése"</string>
- <string name="hardware" msgid="7517821086888990278">"Hardver"</string>
+ <string name="show_ime" msgid="2506087537466597099">"Maradjon a képernyőn, amíg a billentyűzet aktív"</string>
+ <string name="hardware" msgid="194658061510127999">"Virtuális billentyűzet"</string>
<string name="select_keyboard_layout_notification_title" msgid="1407367017263030773">"Válasszon billentyűzetkiosztást"</string>
<string name="select_keyboard_layout_notification_message" msgid="4465907700449257063">"Érintse meg az egyik billentyűzetkiosztás kiválasztásához."</string>
<string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
@@ -1531,4 +1531,10 @@
<string name="user_creation_cannot_add_any_more" msgid="6244197709981359266">"A(z) "<b>"<xliff:g id="APP">%1$s</xliff:g>"</b>" alkalmazás egy új felhasználót szeretne megadni, azonban Ön elérte a felhasználók számára vonatkozó felső korlátot."</string>
<string name="user_creation_account_exists" msgid="4880171855014489789">"A(z) "<b>"<xliff:g id="APP">%1$s</xliff:g>"</b>" alkalmazás egy új felhasználót szeretne megadni, de a(z) "<b>"<xliff:g id="ACCOUNT">%2$s</xliff:g>"</b>" fiók már létezik ezen az eszközön. Ettől függetlenül is folytatja?"</string>
<string name="user_creation_adding" msgid="3206420861363021392">"A(z) "<b>"<xliff:g id="APP">%1$s</xliff:g>"</b>" alkalmazás egy új felhasználót szeretne hozzáadni a(z) "<b>"<xliff:g id="ACCOUNT">%2$s</xliff:g>"</b>" fiókhoz. Folytatja a műveletet?"</string>
+ <string name="language_selection_title" msgid="7181332986330337171">"Nyelvi beállítás"</string>
+ <string name="country_selection_title" msgid="2954859441620215513">"Régió beállítása"</string>
+ <string name="search_language_hint" msgid="7042102592055108574">"Adja meg a nyelvet"</string>
+ <string name="language_picker_section_suggested" msgid="8414489646861640885">"Javasolt"</string>
+ <string name="language_picker_section_all" msgid="3097279199511617537">"Minden nyelv"</string>
+ <string name="locale_search_menu" msgid="2560710726687249178">"Keresés"</string>
</resources>
diff --git a/core/res/res/values-hy-rAM/strings.xml b/core/res/res/values-hy-rAM/strings.xml
index cbe058e..1149ec1 100644
--- a/core/res/res/values-hy-rAM/strings.xml
+++ b/core/res/res/values-hy-rAM/strings.xml
@@ -211,15 +211,15 @@
<string name="global_action_bug_report" msgid="7934010578922304799">"Վրիպակի զեկույց"</string>
<string name="bugreport_title" msgid="2667494803742548533">"Գրել սխալի զեկույց"</string>
<string name="bugreport_message" msgid="398447048750350456">"Սա տեղեկություններ կհավաքագրի ձեր սարքի առկա կարգավիճակի մասին և կուղարկի այն էլեկտրոնային նամակով: Որոշակի ժամանակ կպահանջվի վրիպակի մասին զեկուցելու պահից սկսած մինչ ուղարկելը: Խնդրում ենք փոքր-ինչ համբերատար լինել:"</string>
- <!-- no translation found for bugreport_option_interactive_title (8635056131768862479) -->
+ <string name="bugreport_option_interactive_title" msgid="8635056131768862479">"Ինտերակտիվ զեկույց"</string>
+ <string name="bugreport_option_interactive_summary" msgid="8180152634022797629">"Հիմնականում օգտագործեք այս տարբերակը: Այն ձեզ թույլ է տալիս հետագծել զեկույցի ստեղծման գործընթացը և խնդրի մասին լրացուցիչ տեղեկություններ մուտքագրել: Կարող է բաց թողնել որոշ քիչ օգտագործվող բաժինները, որոնց ստեղծումը երկար է տևում:"</string>
+ <string name="bugreport_option_full_title" msgid="6354382025840076439">"Ամբողջական զեկույց"</string>
+ <!-- no translation found for bugreport_option_full_summary (6687306111256813257) -->
<skip />
- <!-- no translation found for bugreport_option_interactive_summary (8180152634022797629) -->
- <skip />
- <!-- no translation found for bugreport_option_full_title (6354382025840076439) -->
- <skip />
- <!-- no translation found for bugreport_option_full_summary (6440582052207304578) -->
- <skip />
- <!-- no translation found for bugreport_countdown (6878900193900090368) -->
+ <plurals name="bugreport_countdown" formatted="false" msgid="6878900193900090368">
+ <item quantity="one">Վրիպակի զեկույցի համար էկրանի պատկերի լուսանկարումը կատարվելու է <xliff:g id="NUMBER_1">%d</xliff:g> վայրկյանից:</item>
+ <item quantity="other">Վրիպակի զեկույցի համար էկրանի պատկերի լուսանկարումը կատարվելու է <xliff:g id="NUMBER_1">%d</xliff:g> վայրկյանից:</item>
+ </plurals>
<string name="global_action_toggle_silent_mode" msgid="8219525344246810925">"Անձայն ռեժիմ"</string>
<string name="global_action_silent_mode_on_status" msgid="3289841937003758806">"Ձայնը անջատված է"</string>
<string name="global_action_silent_mode_off_status" msgid="1506046579177066419">"Ձայնը միացված է"</string>
@@ -1049,8 +1049,8 @@
<string name="remote_bugreport_progress_notification_message_can_cancel" msgid="5743435483005099451">"Հպեք՝ չեղարկելու համար"</string>
<string name="select_input_method" msgid="8547250819326693584">"Փոխել ստեղնաշարը"</string>
<string name="configure_input_methods" msgid="4769971288371946846">"Ընտրել ստեղնաշար"</string>
- <string name="show_ime" msgid="9157568568695230830">"Ցուցադրել մուտքագրման եղանակը"</string>
- <string name="hardware" msgid="7517821086888990278">"Սարքաշար"</string>
+ <string name="show_ime" msgid="2506087537466597099">"Պահել էկրանին մինչդեռ ֆիզիկական ստեղնաշարն ակտիվ է"</string>
+ <string name="hardware" msgid="194658061510127999">"Ցույց տալ վիրտուալ ստեղնաշարը"</string>
<string name="select_keyboard_layout_notification_title" msgid="1407367017263030773">"Ընտրեք ստեղնաշարի դիրքը"</string>
<string name="select_keyboard_layout_notification_message" msgid="4465907700449257063">"Հպեք` ստեղնաշարի դիրքը ընտրելու համար:"</string>
<string name="fast_scroll_alphabet" msgid="5433275485499039199">" ԱԲԳԴԵԶԷԸԹԺԻԼԽԾԿՀՁՂՃՄՅՆՇՈՉՊՋՌՍՎՏՐՑՈՒՓՔԵւՕՖ"</string>
@@ -1531,4 +1531,10 @@
<string name="user_creation_cannot_add_any_more" msgid="6244197709981359266"><b>"<xliff:g id="APP">%1$s</xliff:g>"</b>" հավելվածը փորձում է նոր օգտվող ավելացնել, սակայն օգտվողների քանակի սահմանաչափը լրացել է:"</string>
<string name="user_creation_account_exists" msgid="4880171855014489789"><b>"<xliff:g id="APP">%1$s</xliff:g>"</b>" հավելվածը փորձում է նոր օգտվող ավելացնել, սակայն "<b>"<xliff:g id="ACCOUNT">%2$s</xliff:g>"</b>" հաշիվն այս սարքում արդեն գոյություն ունի: Շարունակե՞լ:"</string>
<string name="user_creation_adding" msgid="3206420861363021392"><b>"<xliff:g id="APP">%1$s</xliff:g>"</b>" հավելվածը փորձում է "<b>"<xliff:g id="ACCOUNT">%2$s</xliff:g>"</b>" հաշվի համար նոր օգտվող ավելացնել: Շարունակե՞լ:"</string>
+ <string name="language_selection_title" msgid="7181332986330337171">"Նախընտրելի լեզու"</string>
+ <string name="country_selection_title" msgid="2954859441620215513">"Նախընտրելի տարածաշրջան"</string>
+ <string name="search_language_hint" msgid="7042102592055108574">"Մուտքագրեք լեզուն"</string>
+ <string name="language_picker_section_suggested" msgid="8414489646861640885">"Առաջարկներ"</string>
+ <string name="language_picker_section_all" msgid="3097279199511617537">"Բոլոր լեզուները"</string>
+ <string name="locale_search_menu" msgid="2560710726687249178">"Որոնում"</string>
</resources>
diff --git a/core/res/res/values-in/strings.xml b/core/res/res/values-in/strings.xml
index 15efd94..37084e3 100644
--- a/core/res/res/values-in/strings.xml
+++ b/core/res/res/values-in/strings.xml
@@ -211,15 +211,15 @@
<string name="global_action_bug_report" msgid="7934010578922304799">"Laporan bug"</string>
<string name="bugreport_title" msgid="2667494803742548533">"Ambil laporan bug"</string>
<string name="bugreport_message" msgid="398447048750350456">"Ini akan mengumpulkan informasi status perangkat Anda saat ini, untuk dikirimkan sebagai pesan email. Harap bersabar, mungkin perlu waktu untuk memulai laporan bug hingga siap dikirim."</string>
- <!-- no translation found for bugreport_option_interactive_title (8635056131768862479) -->
+ <string name="bugreport_option_interactive_title" msgid="8635056131768862479">"Laporan interaktif"</string>
+ <string name="bugreport_option_interactive_summary" msgid="8180152634022797629">"Gunakan ini di berbagai keadaan. Ini memungkinkan Anda melacak kemajuan laporan dan memasukkan detail masalah selengkapnya. Mungkin menghilangkan beberapa bagian yang jarang digunakan dan yang perlu waktu lama untuk dilaporkan."</string>
+ <string name="bugreport_option_full_title" msgid="6354382025840076439">"Laporan lengkap"</string>
+ <!-- no translation found for bugreport_option_full_summary (6687306111256813257) -->
<skip />
- <!-- no translation found for bugreport_option_interactive_summary (8180152634022797629) -->
- <skip />
- <!-- no translation found for bugreport_option_full_title (6354382025840076439) -->
- <skip />
- <!-- no translation found for bugreport_option_full_summary (6440582052207304578) -->
- <skip />
- <!-- no translation found for bugreport_countdown (6878900193900090368) -->
+ <plurals name="bugreport_countdown" formatted="false" msgid="6878900193900090368">
+ <item quantity="other">Mengambil tangkapan layar untuk laporan bug dalam <xliff:g id="NUMBER_1">%d</xliff:g> detik.</item>
+ <item quantity="one">Mengambil tangkapan layar untuk laporan bug dalam <xliff:g id="NUMBER_0">%d</xliff:g> detik.</item>
+ </plurals>
<string name="global_action_toggle_silent_mode" msgid="8219525344246810925">"Mode senyap"</string>
<string name="global_action_silent_mode_on_status" msgid="3289841937003758806">"Suara MATI"</string>
<string name="global_action_silent_mode_off_status" msgid="1506046579177066419">"Suara AKTIF"</string>
@@ -1049,8 +1049,8 @@
<string name="remote_bugreport_progress_notification_message_can_cancel" msgid="5743435483005099451">"Sentuh untuk membatalkan"</string>
<string name="select_input_method" msgid="8547250819326693584">"Ubah keyboard"</string>
<string name="configure_input_methods" msgid="4769971288371946846">"Pilih keyboard"</string>
- <string name="show_ime" msgid="9157568568695230830">"Tampilkan metode masukan"</string>
- <string name="hardware" msgid="7517821086888990278">"Perangkat Keras"</string>
+ <string name="show_ime" msgid="2506087537466597099">"Pertahankan di layar jika keyboard fisik masih aktif"</string>
+ <string name="hardware" msgid="194658061510127999">"Tampilkan keyboard virtual"</string>
<string name="select_keyboard_layout_notification_title" msgid="1407367017263030773">"Pilih tata letak keyboard"</string>
<string name="select_keyboard_layout_notification_message" msgid="4465907700449257063">"Sentuh untuk memilih tata letak keyboard."</string>
<string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
@@ -1531,4 +1531,10 @@
<string name="user_creation_cannot_add_any_more" msgid="6244197709981359266"><b>"<xliff:g id="APP">%1$s</xliff:g>"</b>" mencoba menambahkan pengguna baru, tetapi batas jumlah pengguna telah tercapai."</string>
<string name="user_creation_account_exists" msgid="4880171855014489789"><b>"<xliff:g id="APP">%1$s</xliff:g>"</b>" mencoba menambahkan pengguna baru, tetapi akun "<b>"<xliff:g id="ACCOUNT">%2$s</xliff:g>"</b>" sudah ada di perangkat. Tetap lanjutkan?"</string>
<string name="user_creation_adding" msgid="3206420861363021392"><b>"<xliff:g id="APP">%1$s</xliff:g>"</b>" mencoba menambahkan pengguna baru untuk akun "<b>"<xliff:g id="ACCOUNT">%2$s</xliff:g>"</b>". Lanjutkan?"</string>
+ <string name="language_selection_title" msgid="7181332986330337171">"Preferensi bahasa"</string>
+ <string name="country_selection_title" msgid="2954859441620215513">"Preferensi wilayah"</string>
+ <string name="search_language_hint" msgid="7042102592055108574">"Ketik nama bahasa"</string>
+ <string name="language_picker_section_suggested" msgid="8414489646861640885">"Disarankan"</string>
+ <string name="language_picker_section_all" msgid="3097279199511617537">"Semua bahasa"</string>
+ <string name="locale_search_menu" msgid="2560710726687249178">"Telusuri"</string>
</resources>
diff --git a/core/res/res/values-is-rIS/strings.xml b/core/res/res/values-is-rIS/strings.xml
index 88d58b0..662d1dd 100644
--- a/core/res/res/values-is-rIS/strings.xml
+++ b/core/res/res/values-is-rIS/strings.xml
@@ -211,15 +211,15 @@
<string name="global_action_bug_report" msgid="7934010578922304799">"Villutilkynning"</string>
<string name="bugreport_title" msgid="2667494803742548533">"Útbúa villutilkynningu"</string>
<string name="bugreport_message" msgid="398447048750350456">"Þetta safnar upplýsingum um núverandi stöðu tækisins til að senda með tölvupósti. Það tekur smástund frá því villutilkynningin er ræst og þar til hún er tilbúin til sendingar – sýndu biðlund."</string>
- <!-- no translation found for bugreport_option_interactive_title (8635056131768862479) -->
+ <string name="bugreport_option_interactive_title" msgid="8635056131768862479">"Gagnvirk skýrsla"</string>
+ <string name="bugreport_option_interactive_summary" msgid="8180152634022797629">"Þú getur notað þetta í flestum tilvikum. Með þessu móti geturðu fylgst með framgangi skýrslunnar og slegið inn viðbótarupplýsingar um vandamálið. Hugsanlegt er að lítið notuðum hlutum verði sleppt til að spara tíma."</string>
+ <string name="bugreport_option_full_title" msgid="6354382025840076439">"Heildarskýrsla"</string>
+ <!-- no translation found for bugreport_option_full_summary (6687306111256813257) -->
<skip />
- <!-- no translation found for bugreport_option_interactive_summary (8180152634022797629) -->
- <skip />
- <!-- no translation found for bugreport_option_full_title (6354382025840076439) -->
- <skip />
- <!-- no translation found for bugreport_option_full_summary (6440582052207304578) -->
- <skip />
- <!-- no translation found for bugreport_countdown (6878900193900090368) -->
+ <plurals name="bugreport_countdown" formatted="false" msgid="6878900193900090368">
+ <item quantity="one">Tekur skjámynd fyrir villutilkynningu eftir <xliff:g id="NUMBER_1">%d</xliff:g> sekúndu.</item>
+ <item quantity="other">Tekur skjámynd fyrir villutilkynningu eftir <xliff:g id="NUMBER_1">%d</xliff:g> sekúndur.</item>
+ </plurals>
<string name="global_action_toggle_silent_mode" msgid="8219525344246810925">"Hljóðlaus stilling"</string>
<string name="global_action_silent_mode_on_status" msgid="3289841937003758806">"SLÖKKT er á hljóði"</string>
<string name="global_action_silent_mode_off_status" msgid="1506046579177066419">"KVEIKT er á hljóði"</string>
@@ -1049,8 +1049,8 @@
<string name="remote_bugreport_progress_notification_message_can_cancel" msgid="5743435483005099451">"Snertu til að hætta við"</string>
<string name="select_input_method" msgid="8547250819326693584">"Skipta um lyklaborð"</string>
<string name="configure_input_methods" msgid="4769971288371946846">"Velja lyklaborð"</string>
- <string name="show_ime" msgid="9157568568695230830">"Sýna innsláttaraðferð"</string>
- <string name="hardware" msgid="7517821086888990278">"Vélbúnaður"</string>
+ <string name="show_ime" msgid="2506087537466597099">"Haltu því á skjánum meðan vélbúnaðarlyklaborðið er virkt"</string>
+ <string name="hardware" msgid="194658061510127999">"Sýna sýndarlyklaborð"</string>
<string name="select_keyboard_layout_notification_title" msgid="1407367017263030773">"Veldu lyklaskipan"</string>
<string name="select_keyboard_layout_notification_message" msgid="4465907700449257063">"Snertu til að velja lyklaskipan."</string>
<string name="fast_scroll_alphabet" msgid="5433275485499039199">" AÁBCDÐEÉFGHIÍJKLMNOÓPQRSTUÚVWXYÝZÞÆÖ"</string>
@@ -1531,4 +1531,10 @@
<string name="user_creation_cannot_add_any_more" msgid="6244197709981359266"><b>"<xliff:g id="APP">%1$s</xliff:g>"</b>" er að reyna að bæta við nýjum notanda, en notandahámarkinu hefur þegar verið náð."</string>
<string name="user_creation_account_exists" msgid="4880171855014489789"><b>"<xliff:g id="APP">%1$s</xliff:g>"</b>" er að reyna að bæta við nýjum notanda, en reikningurinn "<b>"<xliff:g id="ACCOUNT">%2$s</xliff:g>"</b>" er nú þegar til á þessu tæki. Halda samt áfram?"</string>
<string name="user_creation_adding" msgid="3206420861363021392"><b>"<xliff:g id="APP">%1$s</xliff:g>"</b>" er að reyna að bæta nýjum notanda við reikninginn "<b>"<xliff:g id="ACCOUNT">%2$s</xliff:g>"</b>". Halda áfram?"</string>
+ <string name="language_selection_title" msgid="7181332986330337171">"Val tungumáls"</string>
+ <string name="country_selection_title" msgid="2954859441620215513">"Svæðisval"</string>
+ <string name="search_language_hint" msgid="7042102592055108574">"Sláðu inn heiti tungumáls"</string>
+ <string name="language_picker_section_suggested" msgid="8414489646861640885">"Tillögur"</string>
+ <string name="language_picker_section_all" msgid="3097279199511617537">"Öll tungumál"</string>
+ <string name="locale_search_menu" msgid="2560710726687249178">"Leita"</string>
</resources>
diff --git a/core/res/res/values-it/strings.xml b/core/res/res/values-it/strings.xml
index da34b35..230f3e0 100644
--- a/core/res/res/values-it/strings.xml
+++ b/core/res/res/values-it/strings.xml
@@ -211,15 +211,15 @@
<string name="global_action_bug_report" msgid="7934010578922304799">"Segnalazione di bug"</string>
<string name="bugreport_title" msgid="2667494803742548533">"Apri segnalazione bug"</string>
<string name="bugreport_message" msgid="398447048750350456">"Verranno raccolte informazioni sullo stato corrente del dispositivo che saranno inviate sotto forma di messaggio email. Passerà un po\' di tempo prima che la segnalazione di bug aperta sia pronta per essere inviata; ti preghiamo di avere pazienza."</string>
- <!-- no translation found for bugreport_option_interactive_title (8635056131768862479) -->
+ <string name="bugreport_option_interactive_title" msgid="8635056131768862479">"Rapporto interattivo"</string>
+ <string name="bugreport_option_interactive_summary" msgid="8180152634022797629">"Utilizza questa opzione nella maggior parte dei casi. Ti consente di monitorare l\'avanzamento del rapporto e di inserire maggiori dettagli relativi al problema. Potrebbero essere omesse alcune sezioni meno utilizzate il cui inserimento nel rapporto richiede molto tempo."</string>
+ <string name="bugreport_option_full_title" msgid="6354382025840076439">"Rapporto completo"</string>
+ <!-- no translation found for bugreport_option_full_summary (6687306111256813257) -->
<skip />
- <!-- no translation found for bugreport_option_interactive_summary (8180152634022797629) -->
- <skip />
- <!-- no translation found for bugreport_option_full_title (6354382025840076439) -->
- <skip />
- <!-- no translation found for bugreport_option_full_summary (6440582052207304578) -->
- <skip />
- <!-- no translation found for bugreport_countdown (6878900193900090368) -->
+ <plurals name="bugreport_countdown" formatted="false" msgid="6878900193900090368">
+ <item quantity="other">Lo screenshot per la segnalazione di bug verrà acquisito tra <xliff:g id="NUMBER_1">%d</xliff:g> secondi.</item>
+ <item quantity="one">Lo screenshot per la segnalazione di bug verrà acquisito tra <xliff:g id="NUMBER_0">%d</xliff:g> secondo.</item>
+ </plurals>
<string name="global_action_toggle_silent_mode" msgid="8219525344246810925">"Modalità silenziosa"</string>
<string name="global_action_silent_mode_on_status" msgid="3289841937003758806">"Audio non attivo"</string>
<string name="global_action_silent_mode_off_status" msgid="1506046579177066419">"Audio attivo"</string>
@@ -1049,8 +1049,8 @@
<string name="remote_bugreport_progress_notification_message_can_cancel" msgid="5743435483005099451">"Tocca per annullare"</string>
<string name="select_input_method" msgid="8547250819326693584">"Cambia tastiera"</string>
<string name="configure_input_methods" msgid="4769971288371946846">"Scegli tastiera"</string>
- <string name="show_ime" msgid="9157568568695230830">"Mostra metodo immissione"</string>
- <string name="hardware" msgid="7517821086888990278">"Hardware"</string>
+ <string name="show_ime" msgid="2506087537466597099">"Tieni sullo schermo quando è attiva la tastiera fisica"</string>
+ <string name="hardware" msgid="194658061510127999">"Mostra tastiera virtuale"</string>
<string name="select_keyboard_layout_notification_title" msgid="1407367017263030773">"Seleziona layout tastiera"</string>
<string name="select_keyboard_layout_notification_message" msgid="4465907700449257063">"Tocca per selezionare un layout di tastiera."</string>
<string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
@@ -1531,4 +1531,10 @@
<string name="user_creation_cannot_add_any_more" msgid="6244197709981359266"><b>"<xliff:g id="APP">%1$s</xliff:g>"</b>" sta cercando di aggiungere un nuovo utente, ma è stato raggiunto il limite massimo di utenti."</string>
<string name="user_creation_account_exists" msgid="4880171855014489789"><b>"<xliff:g id="APP">%1$s</xliff:g>"</b>" sta cercando di aggiungere un nuovo utente, ma l\'account "<b>"<xliff:g id="ACCOUNT">%2$s</xliff:g>"</b>" esiste già su questo dispositivo. Continuare comunque?"</string>
<string name="user_creation_adding" msgid="3206420861363021392"><b>"<xliff:g id="APP">%1$s</xliff:g>"</b>" sta cercando di aggiungere un nuovo utente per l\'account "<b>"<xliff:g id="ACCOUNT">%2$s</xliff:g>"</b>". Continuare?"</string>
+ <string name="language_selection_title" msgid="7181332986330337171">"Preferenza lingua"</string>
+ <string name="country_selection_title" msgid="2954859441620215513">"Area geografica preferita"</string>
+ <string name="search_language_hint" msgid="7042102592055108574">"Digita nome lingua"</string>
+ <string name="language_picker_section_suggested" msgid="8414489646861640885">"Suggerite"</string>
+ <string name="language_picker_section_all" msgid="3097279199511617537">"Tutte le lingue"</string>
+ <string name="locale_search_menu" msgid="2560710726687249178">"Cerca"</string>
</resources>
diff --git a/core/res/res/values-iw/strings.xml b/core/res/res/values-iw/strings.xml
index 54c1fb1..0278191 100644
--- a/core/res/res/values-iw/strings.xml
+++ b/core/res/res/values-iw/strings.xml
@@ -213,15 +213,17 @@
<string name="global_action_bug_report" msgid="7934010578922304799">"דיווח על באג"</string>
<string name="bugreport_title" msgid="2667494803742548533">"שלח דיווח על באג"</string>
<string name="bugreport_message" msgid="398447048750350456">"פעולה זו תאסוף מידע על מצב המכשיר הנוכחי שלך על מנת לשלוח אותו כהודעת אימייל. היא תימשך זמן קצר מרגע פתיחת דיווח הבאג ועד לשליחת ההודעה בפועל. אנא המתן בסבלנות."</string>
- <!-- no translation found for bugreport_option_interactive_title (8635056131768862479) -->
+ <string name="bugreport_option_interactive_title" msgid="8635056131768862479">"דוח אינטראקטיבי"</string>
+ <string name="bugreport_option_interactive_summary" msgid="8180152634022797629">"השתמש באפשרות זו ברוב המקרים. היא מאפשרת לך לעקוב אחר התקדמות הדוח ולהזין פרטים נוספים על הבעיה. היא עשויה להשמיט כמה קטעים שנמצאים פחות בשימוש ואשר יצירת הדיווח עליהם נמשכת זמן רב."</string>
+ <string name="bugreport_option_full_title" msgid="6354382025840076439">"דוח מלא"</string>
+ <!-- no translation found for bugreport_option_full_summary (6687306111256813257) -->
<skip />
- <!-- no translation found for bugreport_option_interactive_summary (8180152634022797629) -->
- <skip />
- <!-- no translation found for bugreport_option_full_title (6354382025840076439) -->
- <skip />
- <!-- no translation found for bugreport_option_full_summary (6440582052207304578) -->
- <skip />
- <!-- no translation found for bugreport_countdown (6878900193900090368) -->
+ <plurals name="bugreport_countdown" formatted="false" msgid="6878900193900090368">
+ <item quantity="two">יוצר צילום מסך לדוח על באג בעוד <xliff:g id="NUMBER_1">%d</xliff:g> שניות.</item>
+ <item quantity="many">יוצר צילום מסך לדוח על באג בעוד <xliff:g id="NUMBER_1">%d</xliff:g> שניות.</item>
+ <item quantity="other">יוצר צילום מסך לדוח על באג בעוד <xliff:g id="NUMBER_1">%d</xliff:g> שניות.</item>
+ <item quantity="one">יוצר צילום מסך לדוח על באג בעוד <xliff:g id="NUMBER_0">%d</xliff:g> שנייה.</item>
+ </plurals>
<string name="global_action_toggle_silent_mode" msgid="8219525344246810925">"מצב שקט"</string>
<string name="global_action_silent_mode_on_status" msgid="3289841937003758806">"הקול כבוי"</string>
<string name="global_action_silent_mode_off_status" msgid="1506046579177066419">"קול מופעל"</string>
@@ -1063,8 +1065,8 @@
<string name="remote_bugreport_progress_notification_message_can_cancel" msgid="5743435483005099451">"גע כדי לבטל"</string>
<string name="select_input_method" msgid="8547250819326693584">"שינוי מקלדת"</string>
<string name="configure_input_methods" msgid="4769971288371946846">"בחר מקלדות"</string>
- <string name="show_ime" msgid="9157568568695230830">"הצג שיטת קלט"</string>
- <string name="hardware" msgid="7517821086888990278">"חומרה"</string>
+ <string name="show_ime" msgid="2506087537466597099">"השאר אותו במסך בזמן שהמקלדת הפיזית פעילה"</string>
+ <string name="hardware" msgid="194658061510127999">"הצג מקלדת וירטואלית"</string>
<string name="select_keyboard_layout_notification_title" msgid="1407367017263030773">"בחירת פריסת מקלדת"</string>
<string name="select_keyboard_layout_notification_message" msgid="4465907700449257063">"גע כדי לבחור פריסת מקלדת."</string>
<string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
@@ -1567,4 +1569,10 @@
<string name="user_creation_cannot_add_any_more" msgid="6244197709981359266"><b>"<xliff:g id="APP">%1$s</xliff:g>"</b>" מנסה להוסיף משתמש חדש, אך מכסת המשתמשים כבר מלאה."</string>
<string name="user_creation_account_exists" msgid="4880171855014489789"><b>"<xliff:g id="APP">%1$s</xliff:g>"</b>" מנסה להוסיף משתמש חדש, אך החשבון "<b>"<xliff:g id="ACCOUNT">%2$s</xliff:g>"</b>" כבר קיים במכשיר זה. להמשיך בכל זאת?"</string>
<string name="user_creation_adding" msgid="3206420861363021392"><b>"<xliff:g id="APP">%1$s</xliff:g>"</b>" מנסה להוסיף משתמש חדש לחשבון "<b>"<xliff:g id="ACCOUNT">%2$s</xliff:g>"</b>". להמשיך?"</string>
+ <string name="language_selection_title" msgid="7181332986330337171">"העדפת שפה"</string>
+ <string name="country_selection_title" msgid="2954859441620215513">"העדפת אזור"</string>
+ <string name="search_language_hint" msgid="7042102592055108574">"הקלד שם שפה"</string>
+ <string name="language_picker_section_suggested" msgid="8414489646861640885">"הצעות"</string>
+ <string name="language_picker_section_all" msgid="3097279199511617537">"כל השפות"</string>
+ <string name="locale_search_menu" msgid="2560710726687249178">"חיפוש"</string>
</resources>
diff --git a/core/res/res/values-ja/strings.xml b/core/res/res/values-ja/strings.xml
index 35dbd24..a92a800 100644
--- a/core/res/res/values-ja/strings.xml
+++ b/core/res/res/values-ja/strings.xml
@@ -211,15 +211,15 @@
<string name="global_action_bug_report" msgid="7934010578922304799">"バグレポート"</string>
<string name="bugreport_title" msgid="2667494803742548533">"バグレポートを取得"</string>
<string name="bugreport_message" msgid="398447048750350456">"現在の端末の状態に関する情報が収集され、その内容がメールで送信されます。バグレポートが開始してから送信可能な状態となるまでには多少の時間がかかりますのでご了承ください。"</string>
- <!-- no translation found for bugreport_option_interactive_title (8635056131768862479) -->
+ <string name="bugreport_option_interactive_title" msgid="8635056131768862479">"対話型レポート"</string>
+ <string name="bugreport_option_interactive_summary" msgid="8180152634022797629">"ほとんどの場合はこのオプションを使用します。レポートの進行状況を追跡し、問題についての詳細情報を確認することができます。レポート作成に時間がかかってもあまり使用されないセクションは省略されることがあります。"</string>
+ <string name="bugreport_option_full_title" msgid="6354382025840076439">"完全レポート"</string>
+ <!-- no translation found for bugreport_option_full_summary (6687306111256813257) -->
<skip />
- <!-- no translation found for bugreport_option_interactive_summary (8180152634022797629) -->
- <skip />
- <!-- no translation found for bugreport_option_full_title (6354382025840076439) -->
- <skip />
- <!-- no translation found for bugreport_option_full_summary (6440582052207304578) -->
- <skip />
- <!-- no translation found for bugreport_countdown (6878900193900090368) -->
+ <plurals name="bugreport_countdown" formatted="false" msgid="6878900193900090368">
+ <item quantity="other"><xliff:g id="NUMBER_1">%d</xliff:g> 秒後にバグレポートのスクリーンショットが作成されます。</item>
+ <item quantity="one"><xliff:g id="NUMBER_0">%d</xliff:g> 秒後にバグレポートのスクリーンショットが作成されます。</item>
+ </plurals>
<string name="global_action_toggle_silent_mode" msgid="8219525344246810925">"マナーモード"</string>
<string name="global_action_silent_mode_on_status" msgid="3289841937003758806">"サウンドOFF"</string>
<string name="global_action_silent_mode_off_status" msgid="1506046579177066419">"サウンドON"</string>
@@ -246,13 +246,13 @@
<string name="permgrouplab_sms" msgid="228308803364967808">"SMS"</string>
<string name="permgroupdesc_sms" msgid="4656988620100940350">"SMSメッセージの送信と表示"</string>
<string name="permgrouplab_storage" msgid="1971118770546336966">"ストレージ"</string>
- <string name="permgroupdesc_storage" msgid="637758554581589203">"端末上の写真、メディア、ファイルへのアクセス"</string>
+ <string name="permgroupdesc_storage" msgid="637758554581589203">"端末内の写真、メディア、ファイルへのアクセス"</string>
<string name="permgrouplab_microphone" msgid="171539900250043464">"マイク"</string>
<string name="permgroupdesc_microphone" msgid="4988812113943554584">"音声の録音"</string>
<string name="permgrouplab_camera" msgid="4820372495894586615">"カメラ"</string>
- <string name="permgroupdesc_camera" msgid="3250611594678347720">"写真の撮影と動画の記録"</string>
+ <string name="permgroupdesc_camera" msgid="3250611594678347720">"写真と動画の撮影"</string>
<string name="permgrouplab_phone" msgid="5229115638567440675">"電話"</string>
- <string name="permgroupdesc_phone" msgid="6234224354060641055">"通話の発信と管理"</string>
+ <string name="permgroupdesc_phone" msgid="6234224354060641055">"電話の発信と管理"</string>
<string name="permgrouplab_sensors" msgid="416037179223226722">"ボディーセンサー"</string>
<string name="permgroupdesc_sensors" msgid="7147968539346634043">"バイタルサインに関するセンサーデータへのアクセス"</string>
<string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"ウィンドウコンテンツの取得"</string>
@@ -1049,8 +1049,8 @@
<string name="remote_bugreport_progress_notification_message_can_cancel" msgid="5743435483005099451">"キャンセルするにはタップしてください"</string>
<string name="select_input_method" msgid="8547250819326693584">"キーボードの変更"</string>
<string name="configure_input_methods" msgid="4769971288371946846">"キーボードの選択"</string>
- <string name="show_ime" msgid="9157568568695230830">"スクリーンキーボードを表示する"</string>
- <string name="hardware" msgid="7517821086888990278">"ハードウェア"</string>
+ <string name="show_ime" msgid="2506087537466597099">"物理キーボードが有効になっている間は、画面に表示されます"</string>
+ <string name="hardware" msgid="194658061510127999">"仮想キーボードの表示"</string>
<string name="select_keyboard_layout_notification_title" msgid="1407367017263030773">"キーボードレイアウトの選択"</string>
<string name="select_keyboard_layout_notification_message" msgid="4465907700449257063">"タップしてキーボードレイアウトを選択してください。"</string>
<string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
@@ -1531,4 +1531,10 @@
<string name="user_creation_cannot_add_any_more" msgid="6244197709981359266"><b>"<xliff:g id="APP">%1$s</xliff:g>"</b>" で新しいユーザーを追加しようとしていますが、ユーザー数の上限に達しています。"</string>
<string name="user_creation_account_exists" msgid="4880171855014489789"><b>"<xliff:g id="APP">%1$s</xliff:g>"</b>" で新しいユーザーを追加しようとしていますが、アカウント "<b>"<xliff:g id="ACCOUNT">%2$s</xliff:g>"</b>" は既にこの端末に存在します。続行しますか?"</string>
<string name="user_creation_adding" msgid="3206420861363021392"><b>"<xliff:g id="APP">%1$s</xliff:g>"</b>" でアカウント "<b>"<xliff:g id="ACCOUNT">%2$s</xliff:g>"</b>" に新しいユーザーを追加しようとしています。続行しますか?"</string>
+ <string name="language_selection_title" msgid="7181332986330337171">"言語設定"</string>
+ <string name="country_selection_title" msgid="2954859441620215513">"地域設定"</string>
+ <string name="search_language_hint" msgid="7042102592055108574">"言語名を入力"</string>
+ <string name="language_picker_section_suggested" msgid="8414489646861640885">"言語の候補"</string>
+ <string name="language_picker_section_all" msgid="3097279199511617537">"すべての言語"</string>
+ <string name="locale_search_menu" msgid="2560710726687249178">"検索"</string>
</resources>
diff --git a/core/res/res/values-ka-rGE/strings.xml b/core/res/res/values-ka-rGE/strings.xml
index 864e495..3f5ad1f 100644
--- a/core/res/res/values-ka-rGE/strings.xml
+++ b/core/res/res/values-ka-rGE/strings.xml
@@ -211,15 +211,15 @@
<string name="global_action_bug_report" msgid="7934010578922304799">"ხარვეზის შესახებ ანგარიში"</string>
<string name="bugreport_title" msgid="2667494803742548533">"შექმენით შეცდომის ანგარიში"</string>
<string name="bugreport_message" msgid="398447048750350456">"იგი შეაგროვებს ინფორმაციას თქვენი მოწყობილობის ამჟამინდელი მდგომარეობის შესახებ, რათა ის ელფოსტის შეტყობინების სახით გააგზავნოს. ხარვეზის ანგარიშის მომზადებასა და შეტყობინების გაგზავნას გარკვეული დრო სჭირდება. გთხოვთ, მოითმინოთ."</string>
- <!-- no translation found for bugreport_option_interactive_title (8635056131768862479) -->
+ <string name="bugreport_option_interactive_title" msgid="8635056131768862479">"ინტერაქტიული ანგარიში"</string>
+ <string name="bugreport_option_interactive_summary" msgid="8180152634022797629">"გამოიყენეთ ეს ვარიანტი შემთხვევათა უმეტესობაში. ის საშუალებას მოგცემთ, თვალი მიადევნოთ ანგარიშის პროგრესს და პრობლემის შესახებ მეტი დეტალი შეიყვანოთ. ამ ვარიანტის არჩევის შემთხვევაში, შეიძლება მოხდეს ზოგიერთი ნაკლებად გამოყენებადი სექციის გამოტოვება, რომელთა შესახებ მოხსენებასაც დიდი დრო სჭირდება."</string>
+ <string name="bugreport_option_full_title" msgid="6354382025840076439">"სრული ანგარიში"</string>
+ <!-- no translation found for bugreport_option_full_summary (6687306111256813257) -->
<skip />
- <!-- no translation found for bugreport_option_interactive_summary (8180152634022797629) -->
- <skip />
- <!-- no translation found for bugreport_option_full_title (6354382025840076439) -->
- <skip />
- <!-- no translation found for bugreport_option_full_summary (6440582052207304578) -->
- <skip />
- <!-- no translation found for bugreport_countdown (6878900193900090368) -->
+ <plurals name="bugreport_countdown" formatted="false" msgid="6878900193900090368">
+ <item quantity="other">ხარვეზის შესახებ ანგარიშის ეკრანის ანაბეჭდის გადაღება მოხდება <xliff:g id="NUMBER_1">%d</xliff:g> წამში.</item>
+ <item quantity="one">ხარვეზის შესახებ ანგარიშის ეკრანის ანაბეჭდის გადაღება მოხდება <xliff:g id="NUMBER_0">%d</xliff:g> წამში.</item>
+ </plurals>
<string name="global_action_toggle_silent_mode" msgid="8219525344246810925">"ჩუმი რეჟიმი"</string>
<string name="global_action_silent_mode_on_status" msgid="3289841937003758806">"ხმა გამორთულია"</string>
<string name="global_action_silent_mode_off_status" msgid="1506046579177066419">"ხმა ჩართულია"</string>
@@ -1049,8 +1049,8 @@
<string name="remote_bugreport_progress_notification_message_can_cancel" msgid="5743435483005099451">"შეეხეთ გასაუქმებლად"</string>
<string name="select_input_method" msgid="8547250819326693584">"კლავიატურის შეცვლა"</string>
<string name="configure_input_methods" msgid="4769971288371946846">"კლავიატურების არჩევა"</string>
- <string name="show_ime" msgid="9157568568695230830">"შეყვანის მეთოდის ჩვენება"</string>
- <string name="hardware" msgid="7517821086888990278">"მოწყობილობა"</string>
+ <string name="show_ime" msgid="2506087537466597099">"აქტიური ფიზიკური კლავიატურისას ეკრანზე შენარჩუნება"</string>
+ <string name="hardware" msgid="194658061510127999">"ვირტუალური კლავიატურის ჩვენება"</string>
<string name="select_keyboard_layout_notification_title" msgid="1407367017263030773">"შეარჩიეთ კლავიატურის განლაგება."</string>
<string name="select_keyboard_layout_notification_message" msgid="4465907700449257063">"კლავიატურის განლაგების შესარჩევად შეეხეთ."</string>
<string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
@@ -1531,4 +1531,10 @@
<string name="user_creation_cannot_add_any_more" msgid="6244197709981359266"><b>"<xliff:g id="APP">%1$s</xliff:g>"</b>" ახალი მომხმარებლის დამატებას ცდილობს, მაგრამ მიღწეულია მომხმარებლების ლიმიტი."</string>
<string name="user_creation_account_exists" msgid="4880171855014489789"><b>"<xliff:g id="APP">%1$s</xliff:g>"</b>" ახალი მომხმარებლის დამატებას ცდილობს, მაგრამ ანგარიში — "<b>"<xliff:g id="ACCOUNT">%2$s</xliff:g>"</b>" უკვე არსებობს ამ მოწყობილობაში. მაინც გსურთ გაგრძელება?"</string>
<string name="user_creation_adding" msgid="3206420861363021392"><b>"<xliff:g id="APP">%1$s</xliff:g>"</b>" ცდილობს, ანგარიშს — "<b>"<xliff:g id="ACCOUNT">%2$s</xliff:g>"</b>" ახალი მომხმარებელი დაუმატოს. გსურთ გაგრძელება?"</string>
+ <string name="language_selection_title" msgid="7181332986330337171">"ენის პარამეტრები"</string>
+ <string name="country_selection_title" msgid="2954859441620215513">"რეგიონის პარამეტრები"</string>
+ <string name="search_language_hint" msgid="7042102592055108574">"აკრიფეთ ენის სახელი"</string>
+ <string name="language_picker_section_suggested" msgid="8414489646861640885">"რეკომენდებული"</string>
+ <string name="language_picker_section_all" msgid="3097279199511617537">"ყველა ენა"</string>
+ <string name="locale_search_menu" msgid="2560710726687249178">"ძიება"</string>
</resources>
diff --git a/core/res/res/values-kk-rKZ/strings.xml b/core/res/res/values-kk-rKZ/strings.xml
index 8062208..25de46b 100644
--- a/core/res/res/values-kk-rKZ/strings.xml
+++ b/core/res/res/values-kk-rKZ/strings.xml
@@ -211,15 +211,15 @@
<string name="global_action_bug_report" msgid="7934010578922304799">"Вирус туралы хабарлау"</string>
<string name="bugreport_title" msgid="2667494803742548533">"Қате туралы есеп құру"</string>
<string name="bugreport_message" msgid="398447048750350456">"Құрылғының қазіргі күйі туралы ақпаратты жинап, электрондық хабармен жібереді. Есеп әзір болғанша біраз уақыт кетеді, шыдай тұрыңыз."</string>
- <!-- no translation found for bugreport_option_interactive_title (8635056131768862479) -->
+ <string name="bugreport_option_interactive_title" msgid="8635056131768862479">"Интерактивті есеп"</string>
+ <string name="bugreport_option_interactive_summary" msgid="8180152634022797629">"Мұны жағдайлардың көпшілігінде пайдаланыңыз. Ол есептің орындалу барысын бақылауға және мәселе туралы қосымша мәліметтер енгізуге мүмкіндік береді. Ол есеп беруге ұзақ уақыт кететін кейбір азырақ пайдаланылатын бөлімдерді өткізіп жіберуі мүмкін."</string>
+ <string name="bugreport_option_full_title" msgid="6354382025840076439">"Толық есеп"</string>
+ <!-- no translation found for bugreport_option_full_summary (6687306111256813257) -->
<skip />
- <!-- no translation found for bugreport_option_interactive_summary (8180152634022797629) -->
- <skip />
- <!-- no translation found for bugreport_option_full_title (6354382025840076439) -->
- <skip />
- <!-- no translation found for bugreport_option_full_summary (6440582052207304578) -->
- <skip />
- <!-- no translation found for bugreport_countdown (6878900193900090368) -->
+ <plurals name="bugreport_countdown" formatted="false" msgid="6878900193900090368">
+ <item quantity="other"><xliff:g id="NUMBER_1">%d</xliff:g> секундтан кейін қате туралы есептің скриншоты түсіріледі.</item>
+ <item quantity="one"><xliff:g id="NUMBER_0">%d</xliff:g> секундтан кейін қате туралы есептің скриншоты түсіріледі.</item>
+ </plurals>
<string name="global_action_toggle_silent_mode" msgid="8219525344246810925">"Үнсіз режимі"</string>
<string name="global_action_silent_mode_on_status" msgid="3289841937003758806">"Дыбыс ӨШІРУЛІ"</string>
<string name="global_action_silent_mode_off_status" msgid="1506046579177066419">"Дыбыс ҚОСУЛЫ"</string>
@@ -1049,8 +1049,8 @@
<string name="remote_bugreport_progress_notification_message_can_cancel" msgid="5743435483005099451">"Бас тарту үшін түртіңіз"</string>
<string name="select_input_method" msgid="8547250819326693584">"Пернетақтаны өзгерту"</string>
<string name="configure_input_methods" msgid="4769971288371946846">"Пернетақталарды таңдау"</string>
- <string name="show_ime" msgid="9157568568695230830">"Енгізу әдісін көрсету"</string>
- <string name="hardware" msgid="7517821086888990278">"Компьютерлік жабдық"</string>
+ <string name="show_ime" msgid="2506087537466597099">"Физикалық пернетақта белсенді кезде оны экранда ұстау"</string>
+ <string name="hardware" msgid="194658061510127999">"Виртуалды пернетақтаны көрсету"</string>
<string name="select_keyboard_layout_notification_title" msgid="1407367017263030773">"Пернетақта орналасуын таңдау"</string>
<string name="select_keyboard_layout_notification_message" msgid="4465907700449257063">"Пернетақта орналасуын таңдау үшін түртіңіз."</string>
<string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
@@ -1531,4 +1531,10 @@
<string name="user_creation_cannot_add_any_more" msgid="6244197709981359266"><b>"<xliff:g id="APP">%1$s</xliff:g>"</b>" жаңа пайдаланушыны қосуға тырысуда, бірақ пайдаланушылар саны шегіне жетті."</string>
<string name="user_creation_account_exists" msgid="4880171855014489789"><b>"<xliff:g id="APP">%1$s</xliff:g>"</b>" жаңа пайдаланушыны қосуға тырысуда, бірақ "<b>"<xliff:g id="ACCOUNT">%2$s</xliff:g>"</b>" есептік жазбасы осы құрылғыда әлдеқашан бар. Бәрібір жалғастыру керек пе?"</string>
<string name="user_creation_adding" msgid="3206420861363021392"><b>"<xliff:g id="APP">%1$s</xliff:g>"</b>" "<b>"<xliff:g id="ACCOUNT">%2$s</xliff:g>"</b>" есептік жазбасы үшін жаңа пайдаланушыны қосуға тырысуда. Жалғастыру керек пе?"</string>
+ <string name="language_selection_title" msgid="7181332986330337171">"Тіл параметрі"</string>
+ <string name="country_selection_title" msgid="2954859441620215513">"Аймақ параметрі"</string>
+ <string name="search_language_hint" msgid="7042102592055108574">"Тіл атауын теріңіз"</string>
+ <string name="language_picker_section_suggested" msgid="8414489646861640885">"Ұсынылған"</string>
+ <string name="language_picker_section_all" msgid="3097279199511617537">"Барлық тілдер"</string>
+ <string name="locale_search_menu" msgid="2560710726687249178">"Іздеу"</string>
</resources>
diff --git a/core/res/res/values-km-rKH/strings.xml b/core/res/res/values-km-rKH/strings.xml
index db743b5..6b51f61 100644
--- a/core/res/res/values-km-rKH/strings.xml
+++ b/core/res/res/values-km-rKH/strings.xml
@@ -211,15 +211,15 @@
<string name="global_action_bug_report" msgid="7934010578922304799">"របាយការណ៍កំហុស"</string>
<string name="bugreport_title" msgid="2667494803742548533">"យករបាយការណ៍កំហុស"</string>
<string name="bugreport_message" msgid="398447048750350456">"វានឹងប្រមូលព័ត៌មានអំពីស្ថានភាពឧបករណ៍របស់អ្នក ដើម្បីផ្ញើជាសារអ៊ីមែល។ វានឹងចំណាយពេលតិចពីពេលចាប់ផ្ដើមរបាយការណ៍រហូតដល់ពេលវារួចរាល់ដើម្បីផ្ញើ សូមអត់ធ្មត់។"</string>
- <!-- no translation found for bugreport_option_interactive_title (8635056131768862479) -->
+ <string name="bugreport_option_interactive_title" msgid="8635056131768862479">"របាយការណ៍អន្តរកម្ម"</string>
+ <string name="bugreport_option_interactive_summary" msgid="8180152634022797629">"ប្រើវាគ្រប់កាលៈទេសៈទាំងអស់។ វាអនុញ្ញាតឲ្យអ្នកតាមដានដំណើរការនៃរបាយការណ៍ និងចូលទៅព័ត៌មានលម្អិតបន្ថែមអំពីបញ្ហានេះ។ វាអាចនឹងលុបផ្នែកមួយចំនួនដែលមិនសូវប្រើចេញ ដែលធ្វើឲ្យចំណាយពេលយូរក្នុងការរាយការណ៍។"</string>
+ <string name="bugreport_option_full_title" msgid="6354382025840076439">"របាយការណ៍ពេញលេញ"</string>
+ <!-- no translation found for bugreport_option_full_summary (6687306111256813257) -->
<skip />
- <!-- no translation found for bugreport_option_interactive_summary (8180152634022797629) -->
- <skip />
- <!-- no translation found for bugreport_option_full_title (6354382025840076439) -->
- <skip />
- <!-- no translation found for bugreport_option_full_summary (6440582052207304578) -->
- <skip />
- <!-- no translation found for bugreport_countdown (6878900193900090368) -->
+ <plurals name="bugreport_countdown" formatted="false" msgid="6878900193900090368">
+ <item quantity="other">នឹងថតរូបអេក្រង់សម្រាប់របាយការណ៍កំហុសក្នុងរយៈពេល <xliff:g id="NUMBER_1">%d</xliff:g> វិនាទីទៀត។</item>
+ <item quantity="one">នឹងថតរូបអេក្រង់សម្រាប់របាយការណ៍កំហុសក្នុងរយៈពេល <xliff:g id="NUMBER_0">%d</xliff:g> វិនាទីទៀត។</item>
+ </plurals>
<string name="global_action_toggle_silent_mode" msgid="8219525344246810925">"របៀបស្ងាត់"</string>
<string name="global_action_silent_mode_on_status" msgid="3289841937003758806">"បិទសំឡេង"</string>
<string name="global_action_silent_mode_off_status" msgid="1506046579177066419">"បើកសំឡេង"</string>
@@ -1051,8 +1051,8 @@
<string name="remote_bugreport_progress_notification_message_can_cancel" msgid="5743435483005099451">"ប៉ះដើម្បីបោះបង់"</string>
<string name="select_input_method" msgid="8547250819326693584">"ប្ដូរក្ដារចុច"</string>
<string name="configure_input_methods" msgid="4769971288371946846">"ជ្រើសក្ដារចុច"</string>
- <string name="show_ime" msgid="9157568568695230830">"បង្ហាញវិធីសាស្ត្របញ្ចូល"</string>
- <string name="hardware" msgid="7517821086888990278">"ផ្នែករឹង"</string>
+ <string name="show_ime" msgid="2506087537466597099">"ទុកវានៅលើអេក្រង់ខណៈពេលក្តារចុចពិតប្រាកដកំពុងសកម្ម"</string>
+ <string name="hardware" msgid="194658061510127999">"បង្ហាញក្ដារចុចនិម្មិត"</string>
<string name="select_keyboard_layout_notification_title" msgid="1407367017263030773">"ជ្រើសប្លង់ក្ដារចុច"</string>
<string name="select_keyboard_layout_notification_message" msgid="4465907700449257063">"ប៉ះ ដើម្បីជ្រើសប្លង់ក្ដារចុច។"</string>
<string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
@@ -1533,4 +1533,10 @@
<string name="user_creation_cannot_add_any_more" msgid="6244197709981359266"><b>"<xliff:g id="APP">%1$s</xliff:g>"</b>" កំពុងព្យាយាមបន្ថែមអ្នកប្រើថ្មី ប៉ុន្តែបានឈានដល់ចំនួនកំណត់អ្នកប្រើហើយ។"</string>
<string name="user_creation_account_exists" msgid="4880171855014489789"><b>"<xliff:g id="APP">%1$s</xliff:g>"</b>" កំពុងព្យាយាមបន្ថែមអ្នកប្រើថ្មី ប៉ុន្តែគណនី "<b>"<xliff:g id="ACCOUNT">%2$s</xliff:g>"</b>" មានរួចទៅហើយនៅលើឧបករណ៍នេះ។ បន្តទោះយ៉ាងណាក៏ដោយ?"</string>
<string name="user_creation_adding" msgid="3206420861363021392"><b>"<xliff:g id="APP">%1$s</xliff:g>"</b>" កំពុងព្យាយាមបន្ថែមអ្នកប្រើថ្មីសម្រាប់គណនី "<b>"<xliff:g id="ACCOUNT">%2$s</xliff:g>"</b>"។ បន្តឬ?"</string>
+ <string name="language_selection_title" msgid="7181332986330337171">"ចំណូលចិត្តភាសា"</string>
+ <string name="country_selection_title" msgid="2954859441620215513">"ចំណូលចិត្តតំបន់"</string>
+ <string name="search_language_hint" msgid="7042102592055108574">"វាយបញ្ចូលឈ្មោះភាសា"</string>
+ <string name="language_picker_section_suggested" msgid="8414489646861640885">"បានស្នើ"</string>
+ <string name="language_picker_section_all" msgid="3097279199511617537">"ភាសាទាំងអស់"</string>
+ <string name="locale_search_menu" msgid="2560710726687249178">"ស្វែងរក"</string>
</resources>
diff --git a/core/res/res/values-kn-rIN/strings.xml b/core/res/res/values-kn-rIN/strings.xml
index cde0901..d85d3984 100644
--- a/core/res/res/values-kn-rIN/strings.xml
+++ b/core/res/res/values-kn-rIN/strings.xml
@@ -211,15 +211,15 @@
<string name="global_action_bug_report" msgid="7934010578922304799">"ದೋಷದ ವರದಿ"</string>
<string name="bugreport_title" msgid="2667494803742548533">"ದೋಷ ವರದಿ ರಚಿಸಿ"</string>
<string name="bugreport_message" msgid="398447048750350456">"ನಿಮ್ಮ ಸಾಧನದ ಪ್ರಸ್ತುತ ಸ್ಥಿತಿಯ ಕುರಿತು ಮಾಹಿತಿಯನ್ನು ಸಂಗ್ರಹಿಸಿಕೊಳ್ಳುವುದರ ಜೊತೆ ಇ-ಮೇಲ್ ರೂಪದಲ್ಲಿ ನಿಮಗೆ ರವಾನಿಸುತ್ತದೆ. ಇದು ದೋಷ ವರದಿಯನ್ನು ಪ್ರಾರಂಭಿಸಿದ ಸಮಯದಿಂದ ಅದನ್ನು ಕಳುಹಿಸುವವರೆಗೆ ಸ್ವಲ್ಪ ಸಮಯವನ್ನು ತೆಗೆದುಕೊಳ್ಳುತ್ತದೆ; ದಯವಿಟ್ಟು ತಾಳ್ಮೆಯಿಂದಿರಿ."</string>
- <!-- no translation found for bugreport_option_interactive_title (8635056131768862479) -->
+ <string name="bugreport_option_interactive_title" msgid="8635056131768862479">"ಪರಸ್ಪರ ಸಂವಹನ ವರದಿ"</string>
+ <string name="bugreport_option_interactive_summary" msgid="8180152634022797629">"ಹೆಚ್ಚಿನ ಸಂದರ್ಭಗಳಲ್ಲಿ ಇದನ್ನು ಬಳಸಿ. ಇದು ವರದಿಯ ಪ್ರಗತಿಯನ್ನು ಟ್ರ್ಯಾಕ್ ಮಾಡಲು ಮತ್ತು ಸಮಸ್ಯೆ ಕುರಿತು ಹೆಚ್ಚಿನ ವಿವರಗಳನ್ನು ನಮೂದಿಸಲು ಅನುಮತಿಸುತ್ತದೆ. ಇದು ವರದಿ ಮಾಡಲು ಹೆಚ್ಚು ಸಮಯ ತೆಗೆದುಕೊಳ್ಳುವಂತಹ ಕೆಲವು ಕಡಿಮೆ ಬಳಸಲಾದ ವಿಭಾಗಗಳನ್ನು ತ್ಯಜಿಸಬಹುದು."</string>
+ <string name="bugreport_option_full_title" msgid="6354382025840076439">"ಪೂರ್ಣ ವರದಿ"</string>
+ <!-- no translation found for bugreport_option_full_summary (6687306111256813257) -->
<skip />
- <!-- no translation found for bugreport_option_interactive_summary (8180152634022797629) -->
- <skip />
- <!-- no translation found for bugreport_option_full_title (6354382025840076439) -->
- <skip />
- <!-- no translation found for bugreport_option_full_summary (6440582052207304578) -->
- <skip />
- <!-- no translation found for bugreport_countdown (6878900193900090368) -->
+ <plurals name="bugreport_countdown" formatted="false" msgid="6878900193900090368">
+ <item quantity="one">ಬಗ್ ವರದಿ ಮಾಡಲು <xliff:g id="NUMBER_1">%d</xliff:g> ಸೆಕೆಂಡುಗಳಲ್ಲಿ ಸ್ಕ್ರೀನ್ಶಾಟ್ ತೆಗೆದುಕೊಳ್ಳಲಾಗುತ್ತಿದೆ.</item>
+ <item quantity="other">ಬಗ್ ವರದಿ ಮಾಡಲು <xliff:g id="NUMBER_1">%d</xliff:g> ಸೆಕೆಂಡುಗಳಲ್ಲಿ ಸ್ಕ್ರೀನ್ಶಾಟ್ ತೆಗೆದುಕೊಳ್ಳಲಾಗುತ್ತಿದೆ.</item>
+ </plurals>
<string name="global_action_toggle_silent_mode" msgid="8219525344246810925">"ಶಾಂತ ಮೋಡ್"</string>
<string name="global_action_silent_mode_on_status" msgid="3289841937003758806">"ಶಬ್ಧ ಆಫ್ ಆಗಿದೆ"</string>
<string name="global_action_silent_mode_off_status" msgid="1506046579177066419">"ಶಬ್ಧ ಆನ್ ಆಗಿದೆ"</string>
@@ -1049,8 +1049,8 @@
<string name="remote_bugreport_progress_notification_message_can_cancel" msgid="5743435483005099451">"ರದ್ದುಗೊಳಿಸಲು ಸ್ಪರ್ಶಿಸಿ"</string>
<string name="select_input_method" msgid="8547250819326693584">"ಕೀಬೋರ್ಡ್ ಬದಲಿಸಿ"</string>
<string name="configure_input_methods" msgid="4769971288371946846">"ಕೀಬೋರ್ಡ್ಗಳನ್ನು ಆಯ್ಕೆಮಾಡಿ"</string>
- <string name="show_ime" msgid="9157568568695230830">"ಇನ್ಪುಟ್ ವಿಧಾನವನ್ನು ತೋರಿಸು"</string>
- <string name="hardware" msgid="7517821086888990278">"ಹಾರ್ಡ್ವೇರ್"</string>
+ <string name="show_ime" msgid="2506087537466597099">"ಭೌತಿಕ ಕೀಬೋರ್ಡ್ ಸಕ್ರಿಯವಾಗಿರುವಾಗ ಅದನ್ನು ಪರದೆಯ ಮೇಲೆ ಇರಿಸಿಕೊಳ್ಳಿ"</string>
+ <string name="hardware" msgid="194658061510127999">"ವರ್ಚ್ಯುಯಲ್ ಕೀಬೋರ್ಡ್ ತೋರಿಸು"</string>
<string name="select_keyboard_layout_notification_title" msgid="1407367017263030773">"ಕೀಬೋರ್ಡ್ ಲೇಔಟ್ ಆಯ್ಕೆಮಾಡಿ"</string>
<string name="select_keyboard_layout_notification_message" msgid="4465907700449257063">"ಕೀಬೋರ್ಡ್ ಲೇಔಟ್ ಆಯ್ಕೆ ಮಾಡಲು ಸ್ಪರ್ಶಿಸಿ"</string>
<string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
@@ -1531,4 +1531,10 @@
<string name="user_creation_cannot_add_any_more" msgid="6244197709981359266"><b>"<xliff:g id="APP">%1$s</xliff:g>"</b>" ಹೊಸ ಬಳಕೆದಾರರನ್ನು ಸೇರಿಸಲು ಪ್ರಯತ್ನಿಸುತ್ತಿದ್ದಾರೆ, ಆದರೆ ಬಳಕೆದಾರರ ಮಿತಿಯನ್ನು ತಲುಪಲಾಗಿದೆ."</string>
<string name="user_creation_account_exists" msgid="4880171855014489789"><b>"<xliff:g id="APP">%1$s</xliff:g>"</b>" ಹೊಸ ಬಳಕೆದಾರರನ್ನು ಸೇರಿಸಲು ಪ್ರಯತ್ನಿಸುತ್ತಿದ್ದಾರೆ, ಆದರೆ ಈ ಸಾಧನದಲ್ಲಿ "<b>"<xliff:g id="ACCOUNT">%2$s</xliff:g>"</b>" ಖಾತೆ ಈಗಾಗಲೇ ಅಸ್ತಿತ್ವದಲ್ಲಿದೆ. ಹೇಗಾದರೂ ಮುಂದುವರೆಯುವುದೇ?"</string>
<string name="user_creation_adding" msgid="3206420861363021392"><b>"<xliff:g id="ACCOUNT">%2$s</xliff:g>"</b>" ಖಾತೆಗೆ ಹೊಸ ಬಳಕೆದಾರರನ್ನು ಸೇರಿಸಲು "<b>"<xliff:g id="APP">%1$s</xliff:g>"</b>" ಪ್ರಯತ್ನಿಸುತ್ತಿದ್ದಾರೆ. ಮುಂದುವರೆಯುವುದೇ?"</string>
+ <string name="language_selection_title" msgid="7181332986330337171">"ಭಾಷೆಯ ಪ್ರಾಶಸ್ತ್ಯ"</string>
+ <string name="country_selection_title" msgid="2954859441620215513">"ಪ್ರದೇಶ ಪ್ರಾಶಸ್ತ್ಯ"</string>
+ <string name="search_language_hint" msgid="7042102592055108574">"ಭಾಷೆ ಹೆಸರನ್ನು ಟೈಪ್ ಮಾಡಿ"</string>
+ <string name="language_picker_section_suggested" msgid="8414489646861640885">"ಸಲಹೆ ಮಾಡಿರುವುದು"</string>
+ <string name="language_picker_section_all" msgid="3097279199511617537">"ಎಲ್ಲಾ ಭಾಷೆಗಳು"</string>
+ <string name="locale_search_menu" msgid="2560710726687249178">"ಹುಡುಕು"</string>
</resources>
diff --git a/core/res/res/values-ko/strings.xml b/core/res/res/values-ko/strings.xml
index f3c6c69..1a92e93 100644
--- a/core/res/res/values-ko/strings.xml
+++ b/core/res/res/values-ko/strings.xml
@@ -211,15 +211,15 @@
<string name="global_action_bug_report" msgid="7934010578922304799">"버그 신고"</string>
<string name="bugreport_title" msgid="2667494803742548533">"버그 신고"</string>
<string name="bugreport_message" msgid="398447048750350456">"현재 기기 상태에 대한 정보를 수집하여 이메일 메시지로 전송합니다. 버그 신고를 시작하여 전송할 준비가 되려면 약간 시간이 걸립니다."</string>
- <!-- no translation found for bugreport_option_interactive_title (8635056131768862479) -->
+ <string name="bugreport_option_interactive_title" msgid="8635056131768862479">"대화형 보고서"</string>
+ <string name="bugreport_option_interactive_summary" msgid="8180152634022797629">"대부분의 경우 이 옵션을 사용합니다. 신고 진행 상황을 추적할 수 있고 문제에 대한 세부정보를 입력할 수 있습니다. 신고하기에 시간이 너무 오래 걸리고 사용 빈도가 낮은 일부 섹션을 생략할 수 있습니다."</string>
+ <string name="bugreport_option_full_title" msgid="6354382025840076439">"전체 보고서"</string>
+ <!-- no translation found for bugreport_option_full_summary (6687306111256813257) -->
<skip />
- <!-- no translation found for bugreport_option_interactive_summary (8180152634022797629) -->
- <skip />
- <!-- no translation found for bugreport_option_full_title (6354382025840076439) -->
- <skip />
- <!-- no translation found for bugreport_option_full_summary (6440582052207304578) -->
- <skip />
- <!-- no translation found for bugreport_countdown (6878900193900090368) -->
+ <plurals name="bugreport_countdown" formatted="false" msgid="6878900193900090368">
+ <item quantity="other">버그 신고 스크린샷을 <xliff:g id="NUMBER_1">%d</xliff:g>초 후에 찍습니다.</item>
+ <item quantity="one">버그 신고 스크린샷을 <xliff:g id="NUMBER_0">%d</xliff:g>초 후에 찍습니다.</item>
+ </plurals>
<string name="global_action_toggle_silent_mode" msgid="8219525344246810925">"무음 모드"</string>
<string name="global_action_silent_mode_on_status" msgid="3289841937003758806">"소리 꺼짐"</string>
<string name="global_action_silent_mode_off_status" msgid="1506046579177066419">"소리 켜짐"</string>
@@ -238,23 +238,23 @@
<string name="user_owner_label" msgid="2804351898001038951">"개인"</string>
<string name="managed_profile_label" msgid="6260850669674791528">"직장"</string>
<string name="permgrouplab_contacts" msgid="3657758145679177612">"주소록"</string>
- <string name="permgroupdesc_contacts" msgid="6951499528303668046">"주소록 액세스"</string>
+ <string name="permgroupdesc_contacts" msgid="6951499528303668046">"주소록에 접근할 수 있도록"</string>
<string name="permgrouplab_location" msgid="7275582855722310164">"위치"</string>
- <string name="permgroupdesc_location" msgid="1346617465127855033">"이 기기의 위치에 액세스"</string>
+ <string name="permgroupdesc_location" msgid="1346617465127855033">"이 기기의 위치정보에 접근할 수 있도록"</string>
<string name="permgrouplab_calendar" msgid="5863508437783683902">"캘린더"</string>
- <string name="permgroupdesc_calendar" msgid="3889615280211184106">"캘린더 액세스"</string>
+ <string name="permgroupdesc_calendar" msgid="3889615280211184106">"일정에 접근할 수 있도록"</string>
<string name="permgrouplab_sms" msgid="228308803364967808">"SMS"</string>
- <string name="permgroupdesc_sms" msgid="4656988620100940350">"SMS 메시지 전송 및 보기"</string>
+ <string name="permgroupdesc_sms" msgid="4656988620100940350">"문자 메시지를 보내고 확인할 수 있도록"</string>
<string name="permgrouplab_storage" msgid="1971118770546336966">"저장"</string>
- <string name="permgroupdesc_storage" msgid="637758554581589203">"기기 사진, 미디어, 파일 액세스"</string>
+ <string name="permgroupdesc_storage" msgid="637758554581589203">"기기 사진, 미디어, 파일에 접근할 수 있도록"</string>
<string name="permgrouplab_microphone" msgid="171539900250043464">"마이크"</string>
- <string name="permgroupdesc_microphone" msgid="4988812113943554584">"오디오 녹음"</string>
+ <string name="permgroupdesc_microphone" msgid="4988812113943554584">"오디오를 녹음할 수 있도록"</string>
<string name="permgrouplab_camera" msgid="4820372495894586615">"카메라"</string>
- <string name="permgroupdesc_camera" msgid="3250611594678347720">"사진 및 동영상 촬영"</string>
+ <string name="permgroupdesc_camera" msgid="3250611594678347720">"사진 및 동영상을 촬영할 수 있도록"</string>
<string name="permgrouplab_phone" msgid="5229115638567440675">"전화"</string>
- <string name="permgroupdesc_phone" msgid="6234224354060641055">"전화 걸기 및 관리"</string>
+ <string name="permgroupdesc_phone" msgid="6234224354060641055">"통화 상태를 관리하거나 전화를 걸 수 있도록"</string>
<string name="permgrouplab_sensors" msgid="416037179223226722">"신체 센서"</string>
- <string name="permgroupdesc_sensors" msgid="7147968539346634043">"생체 신호에 관한 센서 데이터에 액세스"</string>
+ <string name="permgroupdesc_sensors" msgid="7147968539346634043">"생체 신호에 관한 센서 데이터에 접근할 수 있도록"</string>
<string name="capability_title_canRetrieveWindowContent" msgid="3901717936930170320">"창 콘텐츠 가져오기"</string>
<string name="capability_desc_canRetrieveWindowContent" msgid="3772225008605310672">"상호작용 중인 창의 콘텐츠를 검사합니다."</string>
<string name="capability_title_canRequestTouchExploration" msgid="3108723364676667320">"터치하여 탐색 사용"</string>
@@ -1049,8 +1049,8 @@
<string name="remote_bugreport_progress_notification_message_can_cancel" msgid="5743435483005099451">"취소하려면 터치하세요."</string>
<string name="select_input_method" msgid="8547250819326693584">"키보드 변경"</string>
<string name="configure_input_methods" msgid="4769971288371946846">"키보드 선택"</string>
- <string name="show_ime" msgid="9157568568695230830">"입력 방법 표시"</string>
- <string name="hardware" msgid="7517821086888990278">"하드웨어"</string>
+ <string name="show_ime" msgid="2506087537466597099">"물리적 키보드가 활성 상태인 경우 화면에 켜 둠"</string>
+ <string name="hardware" msgid="194658061510127999">"가상 키보드 표시"</string>
<string name="select_keyboard_layout_notification_title" msgid="1407367017263030773">"키보드 레이아웃 선택"</string>
<string name="select_keyboard_layout_notification_message" msgid="4465907700449257063">"터치하여 키보드 레이아웃을 선택합니다."</string>
<string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
@@ -1531,4 +1531,10 @@
<string name="user_creation_cannot_add_any_more" msgid="6244197709981359266"><b>"<xliff:g id="APP">%1$s</xliff:g>"</b>"에서 새 사용자를 추가하려고 하지만 사용자 한도에 도달했습니다."</string>
<string name="user_creation_account_exists" msgid="4880171855014489789"><b>"<xliff:g id="APP">%1$s</xliff:g>"</b>"에서 새 사용자를 추가하려고 하지만 계정 "<b>"<xliff:g id="ACCOUNT">%2$s</xliff:g>"</b>"이(가) 이미 기기에 있습니다. 계속할까요?"</string>
<string name="user_creation_adding" msgid="3206420861363021392"><b>"<xliff:g id="APP">%1$s</xliff:g>"</b>"에서 계정 "<b>"<xliff:g id="ACCOUNT">%2$s</xliff:g>"</b>"에 새 사용자를 추가하려고 합니다. 계속할까요?"</string>
+ <string name="language_selection_title" msgid="7181332986330337171">"언어 환경설정"</string>
+ <string name="country_selection_title" msgid="2954859441620215513">"지역 환경설정"</string>
+ <string name="search_language_hint" msgid="7042102592055108574">"언어 이름 입력"</string>
+ <string name="language_picker_section_suggested" msgid="8414489646861640885">"추천"</string>
+ <string name="language_picker_section_all" msgid="3097279199511617537">"모든 언어"</string>
+ <string name="locale_search_menu" msgid="2560710726687249178">"검색"</string>
</resources>
diff --git a/core/res/res/values-ky-rKG/strings.xml b/core/res/res/values-ky-rKG/strings.xml
index 58402e9..f9dcce5 100644
--- a/core/res/res/values-ky-rKG/strings.xml
+++ b/core/res/res/values-ky-rKG/strings.xml
@@ -211,15 +211,15 @@
<string name="global_action_bug_report" msgid="7934010578922304799">"Ката тууралуу билдирүү"</string>
<string name="bugreport_title" msgid="2667494803742548533">"Ката тууралуу билдирүү түзүү"</string>
<string name="bugreport_message" msgid="398447048750350456">"Бул сиздин түзмөгүңүздүн учурдагы абалын эмейл билдирүүсү катары жөнөтүш максатында маалымат чогултат. Ката тууралуу билдирүү түзүлүп башталып, жөнөтүлгөнгө чейин бир аз убакыт керек болот; сураныч, бир аз күтө туруңуз."</string>
- <!-- no translation found for bugreport_option_interactive_title (8635056131768862479) -->
+ <string name="bugreport_option_interactive_title" msgid="8635056131768862479">"Интерактивдүү кабар"</string>
+ <string name="bugreport_option_interactive_summary" msgid="8180152634022797629">"Ката жөнүндө кабардын абалын жана көйгөй тууралуу кошумча маалыматты көрсөтүү үчүн ушул функцияны колдонууну сунуштайбыз. Ката жөнүндө кабар жөнөтүлүп жатканда көп убакыт талап кылынбашы үчүн негизги бөлүмдөр гана көрүнөт."</string>
+ <string name="bugreport_option_full_title" msgid="6354382025840076439">"Толук кабар берүү"</string>
+ <!-- no translation found for bugreport_option_full_summary (6687306111256813257) -->
<skip />
- <!-- no translation found for bugreport_option_interactive_summary (8180152634022797629) -->
- <skip />
- <!-- no translation found for bugreport_option_full_title (6354382025840076439) -->
- <skip />
- <!-- no translation found for bugreport_option_full_summary (6440582052207304578) -->
- <skip />
- <!-- no translation found for bugreport_countdown (6878900193900090368) -->
+ <plurals name="bugreport_countdown" formatted="false" msgid="6878900193900090368">
+ <item quantity="other">Мүчүлүштүк тууралуу кабарлоо үчүн <xliff:g id="NUMBER_1">%d</xliff:g> секундда скриншот алынат.</item>
+ <item quantity="one">Мүчүлүштүк тууралуу кабарлоо үчүн <xliff:g id="NUMBER_0">%d</xliff:g> секундда скриншот алынат.</item>
+ </plurals>
<string name="global_action_toggle_silent_mode" msgid="8219525344246810925">"Үнсүз режим"</string>
<string name="global_action_silent_mode_on_status" msgid="3289841937003758806">"Добушу ӨЧҮК"</string>
<string name="global_action_silent_mode_off_status" msgid="1506046579177066419">"Добушу КҮЙҮК"</string>
@@ -1043,15 +1043,15 @@
<string name="adb_active_notification_title" msgid="6729044778949189918">"USB мүчүлүштүктөрдү оңдоо туташтырылган"</string>
<string name="adb_active_notification_message" msgid="1016654627626476142">"USB мүчүлүштүктөрдү жоюу мүмкүнчүлүгүн өчүрүү үчүн тийип коюңуз."</string>
<string name="share_remote_bugreport_notification_title" msgid="3116061729914615290">"Администратор менен мүчүлүштүктөр тууралуу кабар бөлүшүлсүнбү?"</string>
- <string name="share_remote_bugreport_notification_message" msgid="1310517845557771773">"IT администраторуңуз бузулууларды аныктап оңдоого жардам берүү үчүн мүчүлүштүктөр тууралу кабар берүүнү суранды"</string>
+ <string name="share_remote_bugreport_notification_message" msgid="1310517845557771773">"IT администраторуңуз мүчүлүштүктөр тууралуу маалыматты сурап жатат. Бул маалыматтын жардамы менен бузулган жерлерди аныктап, оңдоп берет."</string>
<string name="share_remote_bugreport_notification_accept" msgid="8203856129078669677">"КАБЫЛ АЛУУ"</string>
<string name="share_remote_bugreport_notification_decline" msgid="6337969352057443969">"ЧЕТКЕ КАГУУ"</string>
<string name="remote_bugreport_progress_notification_title" msgid="2785600634417078622">"Мүчүлүштүк тууралуу кабар алынууда…"</string>
<string name="remote_bugreport_progress_notification_message_can_cancel" msgid="5743435483005099451">"Жокко чыгаруу үчүн тийип коюңуз"</string>
<string name="select_input_method" msgid="8547250819326693584">"Баскычтопту өзгөртүү"</string>
<string name="configure_input_methods" msgid="4769971288371946846">"Баскычтопторду тандаңыз"</string>
- <string name="show_ime" msgid="9157568568695230830">"Киргизүү ыкмасын көрсөтүү"</string>
- <string name="hardware" msgid="7517821086888990278">"Аппараттык"</string>
+ <string name="show_ime" msgid="2506087537466597099">"Баскычтоп иштетилгенде экранда көрүнүп турсун"</string>
+ <string name="hardware" msgid="194658061510127999">"Виртуалдык баскычтоп"</string>
<string name="select_keyboard_layout_notification_title" msgid="1407367017263030773">"Тергичтин жайгашуусун тандоо"</string>
<string name="select_keyboard_layout_notification_message" msgid="4465907700449257063">"Тергичтин жайгашуусун тандаш үчүн басыңыз."</string>
<string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
@@ -1528,8 +1528,14 @@
<string name="default_notification_topic_label" msgid="227586145791870829">"Калган-каткандар"</string>
<string name="importance_from_topic" msgid="3572280439880023233">"Бул эскертмелердин маанилүүлүгүн белгиледиңиз."</string>
<string name="importance_from_person" msgid="9160133597262938296">"Булар сиз үчүн маанилүү адамдар."</string>
- <string name="user_creation_cannot_add" msgid="7740333663230045315"><b>"<xliff:g id="APP">%1$s</xliff:g>"</b>" жаңы колдонуучу кошууга аракет кылууда, бирок учурда ага тыюу салынган."</string>
- <string name="user_creation_cannot_add_any_more" msgid="6244197709981359266"><b>"<xliff:g id="APP">%1$s</xliff:g>"</b>" жаңы колдонуучу кошууга аракет кылууда, бирок колдонуучулар чегине жетип калды."</string>
- <string name="user_creation_account_exists" msgid="4880171855014489789"><b>"<xliff:g id="APP">%1$s</xliff:g>"</b>" жаңы колдонуучу кошууга аракет кылууда, бирок "<b>"<xliff:g id="ACCOUNT">%2$s</xliff:g>"</b>" каттоо эсеби мурунтан эле бул түзмөктө бар. Баары бир уланта берсинби?"</string>
+ <string name="user_creation_cannot_add" msgid="7740333663230045315"><b>"<xliff:g id="APP">%1$s</xliff:g>"</b>" жаңы колдонуучуну кошууга аракет кылууда, бирок учурда ага тыюу салынган."</string>
+ <string name="user_creation_cannot_add_any_more" msgid="6244197709981359266"><b>"<xliff:g id="APP">%1$s</xliff:g>"</b>" жаңы колдонуучуну кошууга аракет кылууда, бирок колдонуучулардын саны эң жогорку чекке жетип калды."</string>
+ <string name="user_creation_account_exists" msgid="4880171855014489789"><b>"<xliff:g id="APP">%1$s</xliff:g>"</b>" жаңы колдонуучуну кошууга аракет кылууда, бирок түзмөктө мындай каттоо эсеби "<b>"<xliff:g id="ACCOUNT">%2$s</xliff:g>"</b>" мурунтан эле бар. Баары бир уланта бересизби?"</string>
<string name="user_creation_adding" msgid="3206420861363021392"><b>"<xliff:g id="APP">%1$s</xliff:g>"</b>" жаңы колдонуучуну "<b>"<xliff:g id="ACCOUNT">%2$s</xliff:g>"</b>" каттоо эсебине кошууга аракет кылууда. Улантылсынбы?"</string>
+ <string name="language_selection_title" msgid="7181332986330337171">"Тил жөндөөлөрү"</string>
+ <string name="country_selection_title" msgid="2954859441620215513">"Чөлкөмдүк жөндөөлөр"</string>
+ <string name="search_language_hint" msgid="7042102592055108574">"Тилди киргизиңиз"</string>
+ <string name="language_picker_section_suggested" msgid="8414489646861640885">"Сунушталган"</string>
+ <string name="language_picker_section_all" msgid="3097279199511617537">"Бардык тилдер"</string>
+ <string name="locale_search_menu" msgid="2560710726687249178">"Издөө"</string>
</resources>
diff --git a/core/res/res/values-lo-rLA/strings.xml b/core/res/res/values-lo-rLA/strings.xml
index 94897ac..1fe72ac 100644
--- a/core/res/res/values-lo-rLA/strings.xml
+++ b/core/res/res/values-lo-rLA/strings.xml
@@ -211,15 +211,15 @@
<string name="global_action_bug_report" msgid="7934010578922304799">"ລາຍງານຂໍ້ຜິດພາດ"</string>
<string name="bugreport_title" msgid="2667494803742548533">"ໃຊ້ລາຍງານຂໍ້ບົກພ່ອງ"</string>
<string name="bugreport_message" msgid="398447048750350456">"ນີ້ຈະເປັນການເກັບກຳຂໍ້ມູນກ່ຽວກັບ ສະຖານະປັດຈຸບັນຂອງອຸປະກອນທ່ານ ເພື່ອສົ່ງເປັນຂໍ້ຄວາມທາງອີເມວ. ມັນຈະໃຊ້ເວລາໜ້ອຍນຶ່ງ ໃນການເລີ່ມຕົ້ນການລາຍງານຂໍ້ຜິດພາດ ຈົນກວ່າຈະພ້ອມທີ່ຈະສົ່ງໄດ້, ກະລຸນາລໍຖ້າ."</string>
- <!-- no translation found for bugreport_option_interactive_title (8635056131768862479) -->
+ <string name="bugreport_option_interactive_title" msgid="8635056131768862479">"ລາຍງານແບບໂຕ້ຕອບ"</string>
+ <string name="bugreport_option_interactive_summary" msgid="8180152634022797629">"ໃຊ້ອັນນີ້ພາຍໃຕ້ສະພາບການສ່ວນໃຫຍ່. ມັນອະນຸຍາດໃຫ້ທ່ານຕິດຕາມຄວາມຄືບໜ້າຂອງລາຍງານ ແລະ ປ້ອນລາຍລະອຽດເພີ່ມເຕີມກ່ຽວກັບບັນຫາ. ມັນອາດຈະຕັດບາງສ່ວນທີ່ບໍ່ຄ່ອຍໄດ້ໃຊ້ທີ່ໃຊ້ເວລາດົນໃນການລາຍງານອອກໄປ."</string>
+ <string name="bugreport_option_full_title" msgid="6354382025840076439">"ລາຍງານເຕັມ"</string>
+ <!-- no translation found for bugreport_option_full_summary (6687306111256813257) -->
<skip />
- <!-- no translation found for bugreport_option_interactive_summary (8180152634022797629) -->
- <skip />
- <!-- no translation found for bugreport_option_full_title (6354382025840076439) -->
- <skip />
- <!-- no translation found for bugreport_option_full_summary (6440582052207304578) -->
- <skip />
- <!-- no translation found for bugreport_countdown (6878900193900090368) -->
+ <plurals name="bugreport_countdown" formatted="false" msgid="6878900193900090368">
+ <item quantity="other">ກຳລັງຈະຖ່າຍພາບໜ້າຈໍສຳລັບການລາຍງານຂໍ້ຜິດພາດໃນ <xliff:g id="NUMBER_1">%d</xliff:g> ວິນາທີ.</item>
+ <item quantity="one">ກຳລັງຈະຖ່າຍພາບໜ້າຈໍສຳລັບການລາຍງານຂໍ້ຜິດພາດໃນ <xliff:g id="NUMBER_0">%d</xliff:g> ວິນາທີ.</item>
+ </plurals>
<string name="global_action_toggle_silent_mode" msgid="8219525344246810925">"ໂໝດປິດສຽງ"</string>
<string name="global_action_silent_mode_on_status" msgid="3289841937003758806">"ປິດສຽງແລ້ວ"</string>
<string name="global_action_silent_mode_off_status" msgid="1506046579177066419">"ເປິດສຽງແລ້ວ"</string>
@@ -1049,8 +1049,8 @@
<string name="remote_bugreport_progress_notification_message_can_cancel" msgid="5743435483005099451">"ແຕະເພື່ອຍົກເລີກ"</string>
<string name="select_input_method" msgid="8547250819326693584">"ປ່ຽນແປ້ນພິມ"</string>
<string name="configure_input_methods" msgid="4769971288371946846">"ເລືອກແປ້ນພິມ"</string>
- <string name="show_ime" msgid="9157568568695230830">"ສະແດງຮູບແບບການປ້ອນຂໍ້ມູນ"</string>
- <string name="hardware" msgid="7517821086888990278">"ຮາດແວ"</string>
+ <string name="show_ime" msgid="2506087537466597099">"ເປີດໃຊ້ໃຫ້ມັນຢູ່ໃນໜ້າຈໍໃນຂະນະທີ່ໃຊ້ແປ້ນພິມພາຍນອກຢູ່"</string>
+ <string name="hardware" msgid="194658061510127999">"ສະແດງແປ້ນພິມສະເໝືອນ"</string>
<string name="select_keyboard_layout_notification_title" msgid="1407367017263030773">"ເລືອກຮູບແບບແປ້ນພິມ"</string>
<string name="select_keyboard_layout_notification_message" msgid="4465907700449257063">"ກົດເພື່ອເລືອກຮູບແບບແປ້ນພິມ."</string>
<string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
@@ -1531,4 +1531,10 @@
<string name="user_creation_cannot_add_any_more" msgid="6244197709981359266"><b>"<xliff:g id="APP">%1$s</xliff:g>"</b>" ກຳລັງພະຍາຍາມເພີ່ມຜູ້ໃຊ້ໃໝ່, ແຕ່ໄດ້ຮອດຂີດຈຳກັດຜູ້ໃຊ້ແລ້ວ."</string>
<string name="user_creation_account_exists" msgid="4880171855014489789"><b>"<xliff:g id="APP">%1$s</xliff:g>"</b>" ກຳລັງພະຍາຍາມເພີ່ມຜູ້ໃຊ້ໃໝ່, ແຕ່ບັນຊີ "<b>"<xliff:g id="ACCOUNT">%2$s</xliff:g>"</b>" ມີຢູ່ແລ້ວໃນອຸປະກອນນີ້. ແນວໃດກໍດຳເນີນຕໍ່ບໍ?"</string>
<string name="user_creation_adding" msgid="3206420861363021392"><b>"<xliff:g id="APP">%1$s</xliff:g>"</b>" ກຳລັງພະຍາຍາມເພີ່ມຜູ້ໃຊ້ໃໝ່ສຳລັບບັນຊີ "<b>"<xliff:g id="ACCOUNT">%2$s</xliff:g>"</b>". ດຳເນີນຕໍ່ບໍ?"</string>
+ <string name="language_selection_title" msgid="7181332986330337171">"ການຕັ້ງຄ່າພາສາ"</string>
+ <string name="country_selection_title" msgid="2954859441620215513">"ການຕັ້ງຄ່າພາກພື້ນ"</string>
+ <string name="search_language_hint" msgid="7042102592055108574">"ພິມຊື່ພາສາ"</string>
+ <string name="language_picker_section_suggested" msgid="8414489646861640885">"ແນະນຳ"</string>
+ <string name="language_picker_section_all" msgid="3097279199511617537">"ທຸກພາສາ"</string>
+ <string name="locale_search_menu" msgid="2560710726687249178">"ຄົ້ນຫາ"</string>
</resources>
diff --git a/core/res/res/values-lt/strings.xml b/core/res/res/values-lt/strings.xml
index 5da0a81..2e78344 100644
--- a/core/res/res/values-lt/strings.xml
+++ b/core/res/res/values-lt/strings.xml
@@ -213,15 +213,17 @@
<string name="global_action_bug_report" msgid="7934010578922304799">"Pranešimas apie riktą"</string>
<string name="bugreport_title" msgid="2667494803742548533">"Pranešti apie riktą"</string>
<string name="bugreport_message" msgid="398447048750350456">"Bus surinkta informacija apie dabartinę įrenginio būseną ir išsiųsta el. pašto pranešimu. Šiek tiek užtruks, kol pranešimas apie riktą bus paruoštas siųsti; būkite kantrūs."</string>
- <!-- no translation found for bugreport_option_interactive_title (8635056131768862479) -->
+ <string name="bugreport_option_interactive_title" msgid="8635056131768862479">"Interakt. ataskaita"</string>
+ <string name="bugreport_option_interactive_summary" msgid="8180152634022797629">"Naudokite tai esant daugumai aplinkybių. Galite stebėti ataskaitos eigą ir įvesti daugiau išsamios informacijos apie problemą. Gali būti praleidžiamos kelios nelabai naudingos skiltys, kurių ataskaitų teikimas ilgai trunka."</string>
+ <string name="bugreport_option_full_title" msgid="6354382025840076439">"Išsami ataskaita"</string>
+ <!-- no translation found for bugreport_option_full_summary (6687306111256813257) -->
<skip />
- <!-- no translation found for bugreport_option_interactive_summary (8180152634022797629) -->
- <skip />
- <!-- no translation found for bugreport_option_full_title (6354382025840076439) -->
- <skip />
- <!-- no translation found for bugreport_option_full_summary (6440582052207304578) -->
- <skip />
- <!-- no translation found for bugreport_countdown (6878900193900090368) -->
+ <plurals name="bugreport_countdown" formatted="false" msgid="6878900193900090368">
+ <item quantity="one">Pranešimo apie riktą ekrano kopija bus užfiksuota po <xliff:g id="NUMBER_1">%d</xliff:g> sekundės.</item>
+ <item quantity="few">Pranešimo apie riktą ekrano kopija bus užfiksuota po <xliff:g id="NUMBER_1">%d</xliff:g> sekundžių.</item>
+ <item quantity="many">Pranešimo apie riktą ekrano kopija bus užfiksuota po <xliff:g id="NUMBER_1">%d</xliff:g> sekundės.</item>
+ <item quantity="other">Pranešimo apie riktą ekrano kopija bus užfiksuota po <xliff:g id="NUMBER_1">%d</xliff:g> sekundžių.</item>
+ </plurals>
<string name="global_action_toggle_silent_mode" msgid="8219525344246810925">"Tylus režimas"</string>
<string name="global_action_silent_mode_on_status" msgid="3289841937003758806">"Garsas IŠJUNGTAS"</string>
<string name="global_action_silent_mode_off_status" msgid="1506046579177066419">"Garsas ĮJUNGTAS"</string>
@@ -1063,8 +1065,8 @@
<string name="remote_bugreport_progress_notification_message_can_cancel" msgid="5743435483005099451">"Palieskite, kad atšauktumėte"</string>
<string name="select_input_method" msgid="8547250819326693584">"Klaviatūros keitimas"</string>
<string name="configure_input_methods" msgid="4769971288371946846">"Pasirinkti klaviatūras"</string>
- <string name="show_ime" msgid="9157568568695230830">"Rodyti įvesties metodą"</string>
- <string name="hardware" msgid="7517821086888990278">"Apar. įr."</string>
+ <string name="show_ime" msgid="2506087537466597099">"Palikti ekrane, kol fizinė klaviatūra aktyvi"</string>
+ <string name="hardware" msgid="194658061510127999">"Rodyti virtualiąją klaviatūrą"</string>
<string name="select_keyboard_layout_notification_title" msgid="1407367017263030773">"Pasirinkite klaviatūros išdėstymą"</string>
<string name="select_keyboard_layout_notification_message" msgid="4465907700449257063">"Palieskite, kad pasirinktumėte klaviatūros išdėstymą."</string>
<string name="fast_scroll_alphabet" msgid="5433275485499039199">" AĄBCČDEĘĖFGHIĮYJKLMNOPRSŠTUŲŪVZŽ"</string>
@@ -1567,4 +1569,10 @@
<string name="user_creation_cannot_add_any_more" msgid="6244197709981359266"><b>"„<xliff:g id="APP">%1$s</xliff:g>“"</b>" bando pridėti naują naudotoją, tačiau pasiektas naudotojų skaičiaus apribojimas."</string>
<string name="user_creation_account_exists" msgid="4880171855014489789"><b>"„<xliff:g id="APP">%1$s</xliff:g>“"</b>" bando pridėti naują naudotoją, tačiau paskyra "<b>"„<xliff:g id="ACCOUNT">%2$s</xliff:g>“"</b>" jau yra šiame įrenginyje. Vis tiek tęsti?"</string>
<string name="user_creation_adding" msgid="3206420861363021392"><b>"„<xliff:g id="APP">%1$s</xliff:g>“"</b>" bando pridėti naują paskyros "<b>"„<xliff:g id="ACCOUNT">%2$s</xliff:g>“"</b>" naudotoją. Tęsti?"</string>
+ <string name="language_selection_title" msgid="7181332986330337171">"Kalbos nuostata"</string>
+ <string name="country_selection_title" msgid="2954859441620215513">"Regiono nuostata"</string>
+ <string name="search_language_hint" msgid="7042102592055108574">"Įveskite kalbos pav."</string>
+ <string name="language_picker_section_suggested" msgid="8414489646861640885">"Siūloma"</string>
+ <string name="language_picker_section_all" msgid="3097279199511617537">"Visos kalbos"</string>
+ <string name="locale_search_menu" msgid="2560710726687249178">"Paieška"</string>
</resources>
diff --git a/core/res/res/values-lv/strings.xml b/core/res/res/values-lv/strings.xml
index 86d6600..9da04df 100644
--- a/core/res/res/values-lv/strings.xml
+++ b/core/res/res/values-lv/strings.xml
@@ -212,15 +212,16 @@
<string name="global_action_bug_report" msgid="7934010578922304799">"Kļūdu ziņojums"</string>
<string name="bugreport_title" msgid="2667494803742548533">"Kļūdu ziņojuma sagatavošana"</string>
<string name="bugreport_message" msgid="398447048750350456">"Veicot šo darbību, tiks apkopota informācija par jūsu ierīces pašreizējo stāvokli un nosūtīta e-pasta ziņojuma veidā. Kļūdu ziņojuma pabeigšanai un nosūtīšanai var būt nepieciešams laiks. Lūdzu, esiet pacietīgs."</string>
- <!-- no translation found for bugreport_option_interactive_title (8635056131768862479) -->
+ <string name="bugreport_option_interactive_title" msgid="8635056131768862479">"Interaktīvs pārskats"</string>
+ <string name="bugreport_option_interactive_summary" msgid="8180152634022797629">"Izmantojiet lielākajā daļā gadījumu. Varat izsekot pārskata izveides norisi un ievadīt papildu informāciju par problēmu. Var tikt izlaistas dažas mazāk izmantotas sadaļas, kuru izveidei nepieciešams daudz laika."</string>
+ <string name="bugreport_option_full_title" msgid="6354382025840076439">"Viss pārskats"</string>
+ <!-- no translation found for bugreport_option_full_summary (6687306111256813257) -->
<skip />
- <!-- no translation found for bugreport_option_interactive_summary (8180152634022797629) -->
- <skip />
- <!-- no translation found for bugreport_option_full_title (6354382025840076439) -->
- <skip />
- <!-- no translation found for bugreport_option_full_summary (6440582052207304578) -->
- <skip />
- <!-- no translation found for bugreport_countdown (6878900193900090368) -->
+ <plurals name="bugreport_countdown" formatted="false" msgid="6878900193900090368">
+ <item quantity="zero">Pēc <xliff:g id="NUMBER_1">%d</xliff:g> sekundēm tiks veikts ekrānuzņēmums kļūdas pārskatam.</item>
+ <item quantity="one">Pēc <xliff:g id="NUMBER_1">%d</xliff:g> sekundes tiks veikts ekrānuzņēmums kļūdas pārskatam.</item>
+ <item quantity="other">Pēc <xliff:g id="NUMBER_1">%d</xliff:g> sekundēm tiks veikts ekrānuzņēmums kļūdas pārskatam.</item>
+ </plurals>
<string name="global_action_toggle_silent_mode" msgid="8219525344246810925">"Klusuma režīms"</string>
<string name="global_action_silent_mode_on_status" msgid="3289841937003758806">"Skaņa ir IZSLĒGTA."</string>
<string name="global_action_silent_mode_off_status" msgid="1506046579177066419">"Skaņa ir IESLĒGTA."</string>
@@ -1056,8 +1057,8 @@
<string name="remote_bugreport_progress_notification_message_can_cancel" msgid="5743435483005099451">"Pieskarieties, lai atceltu"</string>
<string name="select_input_method" msgid="8547250819326693584">"Tastatūras maiņa"</string>
<string name="configure_input_methods" msgid="4769971288371946846">"Izvēlēties tastatūru"</string>
- <string name="show_ime" msgid="9157568568695230830">"Rādīt ievades metodi"</string>
- <string name="hardware" msgid="7517821086888990278">"Aparatūra"</string>
+ <string name="show_ime" msgid="2506087537466597099">"Paturēt ekrānā, kamēr ir aktīva fiziskā tastatūra"</string>
+ <string name="hardware" msgid="194658061510127999">"Virtuālās tastatūras rādīšana"</string>
<string name="select_keyboard_layout_notification_title" msgid="1407367017263030773">"Atlasiet tastatūras izkārtojumu"</string>
<string name="select_keyboard_layout_notification_message" msgid="4465907700449257063">"Pieskarieties, lai atlasītu tastatūras izkārtojumu."</string>
<string name="fast_scroll_alphabet" msgid="5433275485499039199">" AĀBCČDEĒFGĢHIĪJKĶLĻMNŅOPRSŠTUŪVZŽ"</string>
@@ -1549,4 +1550,10 @@
<string name="user_creation_cannot_add_any_more" msgid="6244197709981359266"><b>"<xliff:g id="APP">%1$s</xliff:g>"</b>" mēģina pievienot jaunu lietotāju, taču ir sasniegts lietotāju skaita ierobežojums."</string>
<string name="user_creation_account_exists" msgid="4880171855014489789"><b>"<xliff:g id="APP">%1$s</xliff:g>"</b>" mēģina pievienot jaunu lietotāju, taču šajā ierīcē jau ir izveidots konts "<b>"<xliff:g id="ACCOUNT">%2$s</xliff:g>"</b>". Vai turpināt?"</string>
<string name="user_creation_adding" msgid="3206420861363021392"><b>"<xliff:g id="APP">%1$s</xliff:g>"</b>" mēģina pievienot jaunu lietotāju kontam "<b>"<xliff:g id="ACCOUNT">%2$s</xliff:g>"</b>". Vai turpināt?"</string>
+ <string name="language_selection_title" msgid="7181332986330337171">"Valodas preference"</string>
+ <string name="country_selection_title" msgid="2954859441620215513">"Reģiona preference"</string>
+ <string name="search_language_hint" msgid="7042102592055108574">"Ierakstiet valodas nosaukumu"</string>
+ <string name="language_picker_section_suggested" msgid="8414489646861640885">"Ieteiktās"</string>
+ <string name="language_picker_section_all" msgid="3097279199511617537">"Visas valodas"</string>
+ <string name="locale_search_menu" msgid="2560710726687249178">"Meklēt"</string>
</resources>
diff --git a/core/res/res/values-mk-rMK/strings.xml b/core/res/res/values-mk-rMK/strings.xml
index 6acdb45..14fe940 100644
--- a/core/res/res/values-mk-rMK/strings.xml
+++ b/core/res/res/values-mk-rMK/strings.xml
@@ -211,15 +211,15 @@
<string name="global_action_bug_report" msgid="7934010578922304799">"Извештај за грешка"</string>
<string name="bugreport_title" msgid="2667494803742548533">"Земи извештај за грешки"</string>
<string name="bugreport_message" msgid="398447048750350456">"Ова ќе собира информации за моменталната состојба на вашиот уред, за да ги испрати како порака по е-пошта. Тоа ќе одземе малку време почнувајќи од извештајот за грешки додека не се подготви за праќање; бидете трпеливи."</string>
- <!-- no translation found for bugreport_option_interactive_title (8635056131768862479) -->
+ <string name="bugreport_option_interactive_title" msgid="8635056131768862479">"Интерактивен извештај"</string>
+ <string name="bugreport_option_interactive_summary" msgid="8180152634022797629">"Користете го ова во повеќето ситуации. Ви дозволува да го следите напредокот на извештајот и да внесете повеќе детали во врска со проблемот. Може да испушти некои помалку користени делови за коишто е потребно долго време за да се пријават."</string>
+ <string name="bugreport_option_full_title" msgid="6354382025840076439">"Целосен извештај"</string>
+ <!-- no translation found for bugreport_option_full_summary (6687306111256813257) -->
<skip />
- <!-- no translation found for bugreport_option_interactive_summary (8180152634022797629) -->
- <skip />
- <!-- no translation found for bugreport_option_full_title (6354382025840076439) -->
- <skip />
- <!-- no translation found for bugreport_option_full_summary (6440582052207304578) -->
- <skip />
- <!-- no translation found for bugreport_countdown (6878900193900090368) -->
+ <plurals name="bugreport_countdown" formatted="false" msgid="6878900193900090368">
+ <item quantity="one">Ќе се направи слика од екранот за извештајот за грешки за <xliff:g id="NUMBER_1">%d</xliff:g> секунда.</item>
+ <item quantity="other">Ќе се направи слика од екранот за извештајот за грешки за <xliff:g id="NUMBER_1">%d</xliff:g> секунди.</item>
+ </plurals>
<string name="global_action_toggle_silent_mode" msgid="8219525344246810925">"Тивок режим"</string>
<string name="global_action_silent_mode_on_status" msgid="3289841937003758806">"Звукот е исклучен"</string>
<string name="global_action_silent_mode_off_status" msgid="1506046579177066419">"Звукот е вклучен"</string>
@@ -1049,8 +1049,8 @@
<string name="remote_bugreport_progress_notification_message_can_cancel" msgid="5743435483005099451">"Допрете за да откажете"</string>
<string name="select_input_method" msgid="8547250819326693584">"Измени тастатура"</string>
<string name="configure_input_methods" msgid="4769971288371946846">"Избери тастатури"</string>
- <string name="show_ime" msgid="9157568568695230830">"Прикажи влезен метод"</string>
- <string name="hardware" msgid="7517821086888990278">"Хардвер"</string>
+ <string name="show_ime" msgid="2506087537466597099">"Прикажувај го на екранот додека е активна физичката тастатура"</string>
+ <string name="hardware" msgid="194658061510127999">"Прикажи виртуелна тастатура"</string>
<string name="select_keyboard_layout_notification_title" msgid="1407367017263030773">"Избери изглед на тастатура"</string>
<string name="select_keyboard_layout_notification_message" msgid="4465907700449257063">"Допри за да избереш изглед на тастатура."</string>
<string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
@@ -1533,4 +1533,10 @@
<string name="user_creation_cannot_add_any_more" msgid="6244197709981359266"><b>"<xliff:g id="APP">%1$s</xliff:g>"</b>" се обидува да додаде нов корисник, но ограничувањето за корисници е достигнато."</string>
<string name="user_creation_account_exists" msgid="4880171855014489789"><b>"<xliff:g id="APP">%1$s</xliff:g>"</b>" се обидува да додаде нов корисник, но сметката "<b>"<xliff:g id="ACCOUNT">%2$s</xliff:g>"</b>" веќе постои на уредот. Сепак продолжете?"</string>
<string name="user_creation_adding" msgid="3206420861363021392"><b>"<xliff:g id="APP">%1$s</xliff:g>"</b>" се обидува да додаде нов корисник за сметката "<b>"<xliff:g id="ACCOUNT">%2$s</xliff:g>"</b>". Продолжете?"</string>
+ <string name="language_selection_title" msgid="7181332986330337171">"Претпочитувања за јазик"</string>
+ <string name="country_selection_title" msgid="2954859441620215513">"Претпочитувања за регион"</string>
+ <string name="search_language_hint" msgid="7042102592055108574">"Внеси име на јазик"</string>
+ <string name="language_picker_section_suggested" msgid="8414489646861640885">"Предложени"</string>
+ <string name="language_picker_section_all" msgid="3097279199511617537">"Сите јазици"</string>
+ <string name="locale_search_menu" msgid="2560710726687249178">"Пребарај"</string>
</resources>
diff --git a/core/res/res/values-ml-rIN/strings.xml b/core/res/res/values-ml-rIN/strings.xml
index 58fc6e1..ce3c32f 100644
--- a/core/res/res/values-ml-rIN/strings.xml
+++ b/core/res/res/values-ml-rIN/strings.xml
@@ -211,15 +211,15 @@
<string name="global_action_bug_report" msgid="7934010578922304799">"ബഗ് റിപ്പോർട്ട്"</string>
<string name="bugreport_title" msgid="2667494803742548533">"ബഗ് റിപ്പോർട്ട് എടുക്കുക"</string>
<string name="bugreport_message" msgid="398447048750350456">"ഒരു ഇമെയിൽ സന്ദേശമായി അയയ്ക്കുന്നതിന്, ഇത് നിങ്ങളുടെ നിലവിലെ ഉപകരണ നിലയെക്കുറിച്ചുള്ള വിവരങ്ങൾ ശേഖരിക്കും. ബഗ് റിപ്പോർട്ട് ആരംഭിക്കുന്നതിൽ നിന്ന് ഇത് അയയ്ക്കാനായി തയ്യാറാകുന്നതുവരെ അൽപ്പസമയമെടുക്കും; ക്ഷമയോടെ കാത്തിരിക്കുക."</string>
- <!-- no translation found for bugreport_option_interactive_title (8635056131768862479) -->
+ <string name="bugreport_option_interactive_title" msgid="8635056131768862479">"ഇന്റരാക്റ്റീവ് റിപ്പോർട്ട്"</string>
+ <string name="bugreport_option_interactive_summary" msgid="8180152634022797629">"മിക്ക സാഹചര്യങ്ങളിലും ഇത് ഉപയോഗിക്കുക. റിപ്പോർട്ടിന്റെ പുരോഗതി കാണാനും പ്രശ്നത്തിന്റെ കൂടുതൽ വിശദാംശങ്ങളിലേക്ക് പ്രവേശിക്കാനും ഇത് അനുവദിക്കുന്നു. റിപ്പോർട്ടുചെയ്യാൻ നീണ്ട സമയം എടുക്കുന്ന, നിങ്ങൾ കുറവായി ഉപയോഗിക്കുന്ന ചില വിഭാഗങ്ങളെ ഇത് വിട്ടുകളഞ്ഞേക്കാം."</string>
+ <string name="bugreport_option_full_title" msgid="6354382025840076439">"പൂർണ്ണ റിപ്പോർട്ട്"</string>
+ <!-- no translation found for bugreport_option_full_summary (6687306111256813257) -->
<skip />
- <!-- no translation found for bugreport_option_interactive_summary (8180152634022797629) -->
- <skip />
- <!-- no translation found for bugreport_option_full_title (6354382025840076439) -->
- <skip />
- <!-- no translation found for bugreport_option_full_summary (6440582052207304578) -->
- <skip />
- <!-- no translation found for bugreport_countdown (6878900193900090368) -->
+ <plurals name="bugreport_countdown" formatted="false" msgid="6878900193900090368">
+ <item quantity="other">ബഗ് റിപ്പോർട്ടിനായി <xliff:g id="NUMBER_1">%d</xliff:g> സെക്കൻഡിൽ സ്ക്രീൻഷോട്ട് എടുക്കുന്നു.</item>
+ <item quantity="one">ബഗ് റിപ്പോർട്ടിനായി <xliff:g id="NUMBER_0">%d</xliff:g> സെക്കൻഡിൽ സ്ക്രീൻഷോട്ട് എടുക്കുന്നു.</item>
+ </plurals>
<string name="global_action_toggle_silent_mode" msgid="8219525344246810925">"നിശബ്ദ മോഡ്"</string>
<string name="global_action_silent_mode_on_status" msgid="3289841937003758806">"ശബ്ദം ഓഫാണ്"</string>
<string name="global_action_silent_mode_off_status" msgid="1506046579177066419">"ശബ്ദം ഓണാണ്"</string>
@@ -1049,8 +1049,8 @@
<string name="remote_bugreport_progress_notification_message_can_cancel" msgid="5743435483005099451">"റദ്ദാക്കുന്നതിന് സ്പർശിക്കുക"</string>
<string name="select_input_method" msgid="8547250819326693584">"കീബോഡ് മാറ്റുക"</string>
<string name="configure_input_methods" msgid="4769971288371946846">"കീബോർഡുകൾ തിരഞ്ഞെടുക്കുക"</string>
- <string name="show_ime" msgid="9157568568695230830">"ടൈപ്പുചെയ്യൽ രീതി കാണിക്കുക"</string>
- <string name="hardware" msgid="7517821086888990278">"ഹാർഡ്വെയർ"</string>
+ <string name="show_ime" msgid="2506087537466597099">"ഭൗതിക കീബോർഡ് സജീവമായിരിക്കുമ്പോൾ സ്ക്രീനിൽ നിലനിർത്തുക"</string>
+ <string name="hardware" msgid="194658061510127999">"വെർച്വൽ കീബോർഡ് കാണിക്കുക"</string>
<string name="select_keyboard_layout_notification_title" msgid="1407367017263030773">"കീബോർഡ് ലേഔട്ട് തിരഞ്ഞെടുക്കുക"</string>
<string name="select_keyboard_layout_notification_message" msgid="4465907700449257063">"ഒരു കീബോർഡ് ലേഔട്ട് തിരഞ്ഞെടുക്കാൻ സ്പർശിക്കുക."</string>
<string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
@@ -1531,4 +1531,10 @@
<string name="user_creation_cannot_add_any_more" msgid="6244197709981359266">"പുതിയൊരു ഉപയോക്താവിനെ ചേർക്കാൻ "<b>"<xliff:g id="APP">%1$s</xliff:g>"</b>" ശ്രമിക്കുന്നു, എന്നാൽ ഉപയോക്തൃ പരിധി എത്തിക്കഴിഞ്ഞിരിക്കുന്നു."</string>
<string name="user_creation_account_exists" msgid="4880171855014489789">"പുതിയൊരു ഉപയോക്താവിനെ ചേർക്കാൻ "<b>"<xliff:g id="APP">%1$s</xliff:g>"</b>" ശ്രമിക്കുന്നു, എന്നാൽ "<b>"<xliff:g id="ACCOUNT">%2$s</xliff:g>"</b>" എന്ന അക്കൗണ്ട് ഇതിനകം തന്നെ ഈ ഉപകരണത്തിൽ നിലവിലുണ്ട്. എന്തായാലും തുടരണോ?"</string>
<string name="user_creation_adding" msgid="3206420861363021392"><b>"<xliff:g id="ACCOUNT">%2$s</xliff:g>"</b>" എന്ന അക്കൗണ്ടിനായി പുതിയൊരു ഉപയോക്താവിനെ ചേർക്കാൻ "<b>"<xliff:g id="APP">%1$s</xliff:g>"</b>" ശ്രമിക്കുന്നു. തുടരണോ?"</string>
+ <string name="language_selection_title" msgid="7181332986330337171">"ഭാഷാ മുൻഗണന"</string>
+ <string name="country_selection_title" msgid="2954859441620215513">"മേഖലാ മുൻഗണന"</string>
+ <string name="search_language_hint" msgid="7042102592055108574">"ഭാഷയുടെ പേര് ടൈപ്പുചെയ്യുക"</string>
+ <string name="language_picker_section_suggested" msgid="8414489646861640885">"നിര്ദ്ദേശിച്ചത്"</string>
+ <string name="language_picker_section_all" msgid="3097279199511617537">"എല്ലാ ഭാഷകളും"</string>
+ <string name="locale_search_menu" msgid="2560710726687249178">"തിരയുക"</string>
</resources>
diff --git a/core/res/res/values-mn-rMN/strings.xml b/core/res/res/values-mn-rMN/strings.xml
index b59863b..08233f8 100644
--- a/core/res/res/values-mn-rMN/strings.xml
+++ b/core/res/res/values-mn-rMN/strings.xml
@@ -211,15 +211,15 @@
<string name="global_action_bug_report" msgid="7934010578922304799">"Алдаа мэдээллэх"</string>
<string name="bugreport_title" msgid="2667494803742548533">"Согог репорт авах"</string>
<string name="bugreport_message" msgid="398447048750350456">"Энэ таны төхөөрөмжийн одоогийн статусын талаарх мэдээллийг цуглуулах ба имэйл мессеж болгон илгээнэ. Алдааны мэдэгдлээс эхэлж илгээхэд бэлэн болоход хэсэг хугацаа зарцуулагдана тэвчээртэй байна уу."</string>
- <!-- no translation found for bugreport_option_interactive_title (8635056131768862479) -->
+ <string name="bugreport_option_interactive_title" msgid="8635056131768862479">"Интерактив тайлан"</string>
+ <string name="bugreport_option_interactive_summary" msgid="8180152634022797629">"Ихэнх тохиолдолд үүнийг хэрэглэнэ үү. Энэ нь танд тайлангийн явцыг хянах болон асуудлын талаар дэлгэрэнгүйг мэдэх боломж олгоно. Таны бага ашигладаг, тайлагнахад хугацаа их шаарддаг зарим хэсгийг алгана."</string>
+ <string name="bugreport_option_full_title" msgid="6354382025840076439">"Бүрэн тайлан"</string>
+ <!-- no translation found for bugreport_option_full_summary (6687306111256813257) -->
<skip />
- <!-- no translation found for bugreport_option_interactive_summary (8180152634022797629) -->
- <skip />
- <!-- no translation found for bugreport_option_full_title (6354382025840076439) -->
- <skip />
- <!-- no translation found for bugreport_option_full_summary (6440582052207304578) -->
- <skip />
- <!-- no translation found for bugreport_countdown (6878900193900090368) -->
+ <plurals name="bugreport_countdown" formatted="false" msgid="6878900193900090368">
+ <item quantity="other">Алдааны тайлангийн дэлгэцийн зургийг <xliff:g id="NUMBER_1">%d</xliff:g> секундад авна.</item>
+ <item quantity="one">Алдааны тайлангийн дэлгэцийн зургийг <xliff:g id="NUMBER_0">%d</xliff:g> секундад авна.</item>
+ </plurals>
<string name="global_action_toggle_silent_mode" msgid="8219525344246810925">"Чимээгүй горим"</string>
<string name="global_action_silent_mode_on_status" msgid="3289841937003758806">"Дуу хаагдсан"</string>
<string name="global_action_silent_mode_off_status" msgid="1506046579177066419">"Дуу асав"</string>
@@ -1049,8 +1049,8 @@
<string name="remote_bugreport_progress_notification_message_can_cancel" msgid="5743435483005099451">"Цуцлахын тулд хүрэх"</string>
<string name="select_input_method" msgid="8547250819326693584">"Гарыг өөрчлөх"</string>
<string name="configure_input_methods" msgid="4769971288371946846">"Гар сонгох"</string>
- <string name="show_ime" msgid="9157568568695230830">"Оруулах аргыг харуулах"</string>
- <string name="hardware" msgid="7517821086888990278">"Хардвер"</string>
+ <string name="show_ime" msgid="2506087537466597099">"Бодит гар идэвхтэй үед үүнийг дэлгэцэнд харуулна уу"</string>
+ <string name="hardware" msgid="194658061510127999">"Хийсвэр гарыг харуулах"</string>
<string name="select_keyboard_layout_notification_title" msgid="1407367017263030773">"Гарын схемийг сонгох"</string>
<string name="select_keyboard_layout_notification_message" msgid="4465907700449257063">"Гарын схемийг сонгох бол хүрнэ үү."</string>
<string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
@@ -1527,6 +1527,12 @@
<string name="importance_from_person" msgid="9160133597262938296">"Оролцсон хүмүүсээс шалтгаалан энэ нь өндөр ач холбогдолтой."</string>
<string name="user_creation_cannot_add" msgid="7740333663230045315"><b>"<xliff:g id="APP">%1$s</xliff:g>"</b>" шинэ хэрэглэгч нэмэхээр оролдож байгаа боловч одоогоор боломжгүй байна."</string>
<string name="user_creation_cannot_add_any_more" msgid="6244197709981359266"><b>"<xliff:g id="APP">%1$s</xliff:g>"</b>" шинэ хэрэглэгч нэмэхээр оролдож байгаа ч хэрэглэгчийн тооны хязгаарт хүрсэн байна."</string>
- <string name="user_creation_account_exists" msgid="4880171855014489789"><b>"<xliff:g id="APP">%1$s</xliff:g>"</b>" шинэ хэрэглэгч нэмэх гэсэн боловч "<b>"<xliff:g id="ACCOUNT">%2$s</xliff:g>"</b>" бүртгэл нь энэ төхөөрөмжид аль хэдийн байна. Гэсэн хэдий ч үргэлжлүүлэх үү?"</string>
+ <string name="user_creation_account_exists" msgid="4880171855014489789"><b>"<xliff:g id="APP">%1$s</xliff:g>"</b>" шинэ хэрэглэгч нэмэх гэсэн боловч "<b>"<xliff:g id="ACCOUNT">%2$s</xliff:g>"</b>" бүртгэл нь энэ төхөөрөмжид аль хэдийн бүртгэгдсэн байна. Үргэлжлүүлэх үү?"</string>
<string name="user_creation_adding" msgid="3206420861363021392"><b>"<xliff:g id="APP">%1$s</xliff:g>"</b>" нь "<b>"<xliff:g id="ACCOUNT">%2$s</xliff:g>"</b>" бүртгэлд шинэ хэрэглэгч нэмэх гэж байна. Үргэлжлүүлэх үү?"</string>
+ <string name="language_selection_title" msgid="7181332986330337171">"Хэлний тохиргоо"</string>
+ <string name="country_selection_title" msgid="2954859441620215513">"Бүс нутгийн тохиргоо"</string>
+ <string name="search_language_hint" msgid="7042102592055108574">"Улсын хэлийг бичнэ үү"</string>
+ <string name="language_picker_section_suggested" msgid="8414489646861640885">"Санал болгосон"</string>
+ <string name="language_picker_section_all" msgid="3097279199511617537">"Бүх хэл"</string>
+ <string name="locale_search_menu" msgid="2560710726687249178">"Хайх"</string>
</resources>
diff --git a/core/res/res/values-mr-rIN/strings.xml b/core/res/res/values-mr-rIN/strings.xml
index bf52c38..30edff7 100644
--- a/core/res/res/values-mr-rIN/strings.xml
+++ b/core/res/res/values-mr-rIN/strings.xml
@@ -211,15 +211,15 @@
<string name="global_action_bug_report" msgid="7934010578922304799">"दोष अहवाल"</string>
<string name="bugreport_title" msgid="2667494803742548533">"दोष अहवाल घ्या"</string>
<string name="bugreport_message" msgid="398447048750350456">"ई-मेल संदेश म्हणून पाठविण्यासाठी, हे आपल्या वर्तमान डिव्हाइस स्थितीविषयी माहिती संकलित करेल. दोष अहवाल प्रारंभ करण्यापासून तो पाठविण्यापर्यंत थोडा वेळ लागेल; कृपया धीर धरा."</string>
- <!-- no translation found for bugreport_option_interactive_title (8635056131768862479) -->
+ <string name="bugreport_option_interactive_title" msgid="8635056131768862479">"परस्परसंवादी अहवाल"</string>
+ <string name="bugreport_option_interactive_summary" msgid="8180152634022797629">"बहुतांश प्रसंगांमध्ये याचा वापर करा. ते आपल्याला अहवालाच्या प्रगतीचा मागोवा घेण्याची आणि समस्येविषयी अधिक तपशील प्रविष्ट करण्याची अनुमती देतात. ते अहवाल देण्यासाठी बराच वेळ घेणार्या कमी वापरलेल्या विभागांना कदाचित वगळेल."</string>
+ <string name="bugreport_option_full_title" msgid="6354382025840076439">"संपूर्ण अहवाल"</string>
+ <!-- no translation found for bugreport_option_full_summary (6687306111256813257) -->
<skip />
- <!-- no translation found for bugreport_option_interactive_summary (8180152634022797629) -->
- <skip />
- <!-- no translation found for bugreport_option_full_title (6354382025840076439) -->
- <skip />
- <!-- no translation found for bugreport_option_full_summary (6440582052207304578) -->
- <skip />
- <!-- no translation found for bugreport_countdown (6878900193900090368) -->
+ <plurals name="bugreport_countdown" formatted="false" msgid="6878900193900090368">
+ <item quantity="one">दोष अहवालासाठी <xliff:g id="NUMBER_1">%d</xliff:g> सेकंदामध्ये स्क्रीनशॉट घेत आहे.</item>
+ <item quantity="other">दोष अहवालासाठी <xliff:g id="NUMBER_1">%d</xliff:g> सेकंदांमध्ये स्क्रीनशॉट घेत आहे.</item>
+ </plurals>
<string name="global_action_toggle_silent_mode" msgid="8219525344246810925">"मूक मोड"</string>
<string name="global_action_silent_mode_on_status" msgid="3289841937003758806">"ध्वनी बंद आहे"</string>
<string name="global_action_silent_mode_off_status" msgid="1506046579177066419">"ध्वनी चालू आहे"</string>
@@ -1049,8 +1049,8 @@
<string name="remote_bugreport_progress_notification_message_can_cancel" msgid="5743435483005099451">"रद्द करण्यासाठी स्पर्श करा"</string>
<string name="select_input_method" msgid="8547250819326693584">"कीबोर्ड बदला"</string>
<string name="configure_input_methods" msgid="4769971288371946846">"कीबोर्ड निवडा"</string>
- <string name="show_ime" msgid="9157568568695230830">"इनपुट पद्धत दर्शवा"</string>
- <string name="hardware" msgid="7517821086888990278">"हार्डवेअर"</string>
+ <string name="show_ime" msgid="2506087537466597099">"भौतिक कीबोर्ड सक्रिय असताना त्यास स्क्रीनवर ठेवा"</string>
+ <string name="hardware" msgid="194658061510127999">"व्हर्च्युअल कीबोर्ड दर्शवा"</string>
<string name="select_keyboard_layout_notification_title" msgid="1407367017263030773">"कीबोर्ड लेआउट निवडा"</string>
<string name="select_keyboard_layout_notification_message" msgid="4465907700449257063">"कीबोर्ड लेआउट निवडण्यासाठी स्पर्श करा."</string>
<string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
@@ -1531,4 +1531,10 @@
<string name="user_creation_cannot_add_any_more" msgid="6244197709981359266"><b>"<xliff:g id="APP">%1$s</xliff:g>"</b>" नवीन वापरकर्ता जोडण्यासाठी प्रयत्न करीत आहे परंतु वापरकर्ता मर्यादा गाठली गेली आहे."</string>
<string name="user_creation_account_exists" msgid="4880171855014489789"><b>"<xliff:g id="APP">%1$s</xliff:g>"</b>" नवीन वापरकर्ता जोडण्याचा प्रयत्न करीत आहे परंतु या डिव्हाइसवर "<b>"<xliff:g id="ACCOUNT">%2$s</xliff:g>"</b>" खाते आधीपासून अस्तित्वात आहे. तरीही पुढे सुरु ठेवायचे?"</string>
<string name="user_creation_adding" msgid="3206420861363021392"><b>"<xliff:g id="ACCOUNT">%2$s</xliff:g>"</b>" खात्यासाठी "<b>"<xliff:g id="APP">%1$s</xliff:g>"</b>" नवीन वापरकर्ता जोडण्याचा प्रयत्न करीत आहे. पुढे सुरु ठेवायचे?"</string>
+ <string name="language_selection_title" msgid="7181332986330337171">"भाषा प्राधान्य"</string>
+ <string name="country_selection_title" msgid="2954859441620215513">"प्रदेश प्राधान्य"</string>
+ <string name="search_language_hint" msgid="7042102592055108574">"भाषा नाव टाइप करा"</string>
+ <string name="language_picker_section_suggested" msgid="8414489646861640885">"सूचित केलेले"</string>
+ <string name="language_picker_section_all" msgid="3097279199511617537">"सर्व भाषा"</string>
+ <string name="locale_search_menu" msgid="2560710726687249178">"शोध"</string>
</resources>
diff --git a/core/res/res/values-ms-rMY/strings.xml b/core/res/res/values-ms-rMY/strings.xml
index eaa3dcf..3f1bb14 100644
--- a/core/res/res/values-ms-rMY/strings.xml
+++ b/core/res/res/values-ms-rMY/strings.xml
@@ -211,15 +211,15 @@
<string name="global_action_bug_report" msgid="7934010578922304799">"Laporan pepijat"</string>
<string name="bugreport_title" msgid="2667494803742548533">"Ambil laporan pepijat"</string>
<string name="bugreport_message" msgid="398447048750350456">"Ini akan mengumpul maklumat tentang keadaan peranti semasa anda untuk dihantarkan sebagai mesej e-mel. Harap bersabar, mungkin perlu sedikit masa untuk memulakan laporan sehingga siap untuk dihantar."</string>
- <!-- no translation found for bugreport_option_interactive_title (8635056131768862479) -->
+ <string name="bugreport_option_interactive_title" msgid="8635056131768862479">"Laporan interaktif"</string>
+ <string name="bugreport_option_interactive_summary" msgid="8180152634022797629">"Gunakan laporan ini dalam kebanyakan keadaan. Anda boleh menjejak kemajuan dan memasukkan butiran lanjut tentang masalah tersebut. Laporan ini mungkin meninggalkan beberapa bahagian yang kurang digunakan, yang mengambil masa lama untuk dilaporkan."</string>
+ <string name="bugreport_option_full_title" msgid="6354382025840076439">"Laporan penuh"</string>
+ <!-- no translation found for bugreport_option_full_summary (6687306111256813257) -->
<skip />
- <!-- no translation found for bugreport_option_interactive_summary (8180152634022797629) -->
- <skip />
- <!-- no translation found for bugreport_option_full_title (6354382025840076439) -->
- <skip />
- <!-- no translation found for bugreport_option_full_summary (6440582052207304578) -->
- <skip />
- <!-- no translation found for bugreport_countdown (6878900193900090368) -->
+ <plurals name="bugreport_countdown" formatted="false" msgid="6878900193900090368">
+ <item quantity="other">Mengambil tangkapan skrin untuk laporan pepijat dalam masa <xliff:g id="NUMBER_1">%d</xliff:g> saat.</item>
+ <item quantity="one">Mengambil tangkapan skrin untuk laporan pepijat dalam masa <xliff:g id="NUMBER_0">%d</xliff:g> saat.</item>
+ </plurals>
<string name="global_action_toggle_silent_mode" msgid="8219525344246810925">"Mod senyap"</string>
<string name="global_action_silent_mode_on_status" msgid="3289841937003758806">"Bunyi DIMATIKAN"</string>
<string name="global_action_silent_mode_off_status" msgid="1506046579177066419">"Bunyi DIHIDUPKAN"</string>
@@ -1049,8 +1049,8 @@
<string name="remote_bugreport_progress_notification_message_can_cancel" msgid="5743435483005099451">"Sentuh untuk membatalkan"</string>
<string name="select_input_method" msgid="8547250819326693584">"Tukar papan kekunci"</string>
<string name="configure_input_methods" msgid="4769971288371946846">"Pilih papan kekunci"</string>
- <string name="show_ime" msgid="9157568568695230830">"Tunjukkan kaedah input"</string>
- <string name="hardware" msgid="7517821086888990278">"Perkakasan"</string>
+ <string name="show_ime" msgid="2506087537466597099">"Pastikannya pada skrin, semasa papan kekunci fizikal aktif"</string>
+ <string name="hardware" msgid="194658061510127999">"Tunjukkan papan kekunci maya"</string>
<string name="select_keyboard_layout_notification_title" msgid="1407367017263030773">"Pilih susun atur papan kekunci"</string>
<string name="select_keyboard_layout_notification_message" msgid="4465907700449257063">"Sentuh untuk memilih susun atur papan kekunci."</string>
<string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
@@ -1529,6 +1529,12 @@
<string name="importance_from_person" msgid="9160133597262938296">"Mesej ini penting disebabkan orang yang terlibat."</string>
<string name="user_creation_cannot_add" msgid="7740333663230045315"><b>"<xliff:g id="APP">%1$s</xliff:g>"</b>" cuba menambahkan pengguna baharu tetapi dilarang pada masa ini."</string>
<string name="user_creation_cannot_add_any_more" msgid="6244197709981359266"><b>"<xliff:g id="APP">%1$s</xliff:g>"</b>" cuba menambahkan pengguna baharu tetapi had pengguna telah dicapai."</string>
- <string name="user_creation_account_exists" msgid="4880171855014489789"><b>"<xliff:g id="APP">%1$s</xliff:g>"</b>" cuba menambahkan pengguna baharu tetapi akaun "<b>"<xliff:g id="ACCOUNT">%2$s</xliff:g>"</b>" telah wujud pada peranti ini. Teruskan juga?"</string>
+ <string name="user_creation_account_exists" msgid="4880171855014489789"><b>"<xliff:g id="APP">%1$s</xliff:g>"</b>" cuba menambahkan pengguna baharu tetapi akaun "<b>"<xliff:g id="ACCOUNT">%2$s</xliff:g>"</b>" sudah wujud pada peranti ini. Teruskan juga?"</string>
<string name="user_creation_adding" msgid="3206420861363021392"><b>"<xliff:g id="APP">%1$s</xliff:g>"</b>" cuba menambahkan pengguna baharu untuk akaun "<b>"<xliff:g id="ACCOUNT">%2$s</xliff:g>"</b>". Teruskan?"</string>
+ <string name="language_selection_title" msgid="7181332986330337171">"Pilihan bahasa"</string>
+ <string name="country_selection_title" msgid="2954859441620215513">"Pilihan wilayah"</string>
+ <string name="search_language_hint" msgid="7042102592055108574">"Taipkan nama bahasa"</string>
+ <string name="language_picker_section_suggested" msgid="8414489646861640885">"Dicadangkan"</string>
+ <string name="language_picker_section_all" msgid="3097279199511617537">"Semua bahasa"</string>
+ <string name="locale_search_menu" msgid="2560710726687249178">"Cari"</string>
</resources>
diff --git a/core/res/res/values-my-rMM/strings.xml b/core/res/res/values-my-rMM/strings.xml
index c9807314..17c1eda 100644
--- a/core/res/res/values-my-rMM/strings.xml
+++ b/core/res/res/values-my-rMM/strings.xml
@@ -211,15 +211,15 @@
<string name="global_action_bug_report" msgid="7934010578922304799">"အမှားရှာဖွေပြင်ဆင်မှုမှတ်တမ်း"</string>
<string name="bugreport_title" msgid="2667494803742548533">"အမှားရှာဖွေပြင်ဆင်မှုမှတ်တမ်းအား ယူရန်"</string>
<string name="bugreport_message" msgid="398447048750350456">"သင့်ရဲ့ လက်ရှိ စက်အခြေအနေ အချက်အလက်များကို အီးမေးလ် အနေဖြင့် ပေးပို့ရန် စုဆောင်းပါမည်။ အမှားရှာဖွေပြင်ဆင်မှုမှတ်တမ်းမှ ပေးပို့ရန် အသင့်ဖြစ်သည်အထိ အချိန် အနည်းငယ်ကြာမြင့်မှာ ဖြစ်သဖြင့် သည်းခံပြီး စောင့်ပါရန်"</string>
- <!-- no translation found for bugreport_option_interactive_title (8635056131768862479) -->
+ <string name="bugreport_option_interactive_title" msgid="8635056131768862479">"လက်ငင်းတုံ့ပြန်နိုင်သည့် အစီရင်ခံချက်"</string>
+ <string name="bugreport_option_interactive_summary" msgid="8180152634022797629">"အများအားဖြင့် ၎င်းကိုအသုံးပြုပါ။ ၎င်းသည် အစီရင်ခံချက်ကို ခြေရာခံခွင့်ပေးပြီး ပြဿနာအကြောင်း အသေးစိတ်များကို ထည့်ခွင့်ပြုပါသည်။ အစီရင်ခံရန်ကြာသည့် သိပ်မသုံးသော ကဏ္ဍများကို ချန်ထားခဲ့နိုင်ပါသည်။"</string>
+ <string name="bugreport_option_full_title" msgid="6354382025840076439">"အစီရင်ခံချက်အပြည့်"</string>
+ <!-- no translation found for bugreport_option_full_summary (6687306111256813257) -->
<skip />
- <!-- no translation found for bugreport_option_interactive_summary (8180152634022797629) -->
- <skip />
- <!-- no translation found for bugreport_option_full_title (6354382025840076439) -->
- <skip />
- <!-- no translation found for bugreport_option_full_summary (6440582052207304578) -->
- <skip />
- <!-- no translation found for bugreport_countdown (6878900193900090368) -->
+ <plurals name="bugreport_countdown" formatted="false" msgid="6878900193900090368">
+ <item quantity="other"><xliff:g id="NUMBER_1">%d</xliff:g> စက္ကန့်အတွင်း ချွတ်ယွင်းချက် အစီရင်ခံရန်အတွက် မျက်နှာပြင်ဓာတ်ပုံ ရိုက်ပါမည်။</item>
+ <item quantity="one"><xliff:g id="NUMBER_0">%d</xliff:g> စက္ကန့်အတွင်း ချွတ်ယွင်းချက် အစီရင်ခံရန်အတွက် မျက်နှာပြင်ဓာတ်ပုံ ရိုက်ပါမည်။</item>
+ </plurals>
<string name="global_action_toggle_silent_mode" msgid="8219525344246810925">"အသံတိတ်စနစ်"</string>
<string name="global_action_silent_mode_on_status" msgid="3289841937003758806">"အသံပိတ်ထားသည်"</string>
<string name="global_action_silent_mode_off_status" msgid="1506046579177066419">"အသံဖွင့်ထားသည်"</string>
@@ -1049,8 +1049,8 @@
<string name="remote_bugreport_progress_notification_message_can_cancel" msgid="5743435483005099451">"ဖျက်သိမ်းရန် တို့ပါ"</string>
<string name="select_input_method" msgid="8547250819326693584">"ကီးဘုတ် ပြောင်းလဲရန်"</string>
<string name="configure_input_methods" msgid="4769971288371946846">"ကီးဘုတ်များကို ရွေးရန်"</string>
- <string name="show_ime" msgid="9157568568695230830">"ရိုက်သွင်းမှု နည်းလမ်းကို ပြရန်"</string>
- <string name="hardware" msgid="7517821086888990278">"ဟာ့ဒ်ဝဲ"</string>
+ <string name="show_ime" msgid="2506087537466597099">"စက်၏ကီးဘုတ်ကိုအသုံးပြုနေစဉ် ၎င်းကိုမျက်နှာပြင်ပေါ်တွင် ထားပါ"</string>
+ <string name="hardware" msgid="194658061510127999">"ကီးဘုတ်အတုပြရန်"</string>
<string name="select_keyboard_layout_notification_title" msgid="1407367017263030773">"လက်ကွက် အပြင်အဆင်ရွေးရန်"</string>
<string name="select_keyboard_layout_notification_message" msgid="4465907700449257063">"လက်ကွက် အပြင်အဆင်ရွေးရန် တို့ထိပါ"</string>
<string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
@@ -1531,4 +1531,10 @@
<string name="user_creation_cannot_add_any_more" msgid="6244197709981359266"><b>"<xliff:g id="APP">%1$s</xliff:g>"</b>"က အသုံးပြုသူ အသစ်ကို ထည့်ရန် ကြိုးစားနေပါသည်၊ သို့သော် အသုံးပြုသူ ကန့်သတ်ချက် ပြည့်မီသွားပါပြီ။"</string>
<string name="user_creation_account_exists" msgid="4880171855014489789"><b>"<xliff:g id="APP">%1$s</xliff:g>"</b>"က အသုံးပြုသူ အသစ်ကို ထည့်ရန် ကြိုးစားနေပါသည်၊ သို့သော် အကောင့် "<b>"<xliff:g id="ACCOUNT">%2$s</xliff:g>"</b>"မှာ ဤကိရိယာထဲတွင် ရှိနှင့်နေပါပြီ။ မည်သို့ပင်ဖြစ်စေ ဆက်လက်လုပ်ဆောင်ရမလား။"</string>
<string name="user_creation_adding" msgid="3206420861363021392"><b>"<xliff:g id="APP">%1$s</xliff:g>"</b>"က အကောင့် "<b>"<xliff:g id="ACCOUNT">%2$s</xliff:g>"</b>"အတွက် အသုံးပြုသူ အသစ်ကို ထည့်ရန် ကြိုးစားနေပါသည်။ ဆက်လက်လုပ်ဆောင်ရမလား။"</string>
+ <string name="language_selection_title" msgid="7181332986330337171">"ဘာသာစကားရွေးချယ်မှု"</string>
+ <string name="country_selection_title" msgid="2954859441620215513">"ဒေသရွေးချယ်မှု"</string>
+ <string name="search_language_hint" msgid="7042102592055108574">"ဘာသာစကားအမည် ထည့်ပါ"</string>
+ <string name="language_picker_section_suggested" msgid="8414489646861640885">"အကြံပြုထားသော"</string>
+ <string name="language_picker_section_all" msgid="3097279199511617537">"ဘာသာစကားများအားလုံး"</string>
+ <string name="locale_search_menu" msgid="2560710726687249178">"ရှာဖွေရန်"</string>
</resources>
diff --git a/core/res/res/values-nb/strings.xml b/core/res/res/values-nb/strings.xml
index 9efa863..2385ad7 100644
--- a/core/res/res/values-nb/strings.xml
+++ b/core/res/res/values-nb/strings.xml
@@ -211,15 +211,15 @@
<string name="global_action_bug_report" msgid="7934010578922304799">"Feilrapport"</string>
<string name="bugreport_title" msgid="2667494803742548533">"Utfør feilrapport"</string>
<string name="bugreport_message" msgid="398447048750350456">"Informasjon om tilstanden til enheten din samles inn og sendes som en e-post. Det tar litt tid fra du starter feilrapporten til e-posten er klar, så vær tålmodig."</string>
- <!-- no translation found for bugreport_option_interactive_title (8635056131768862479) -->
+ <string name="bugreport_option_interactive_title" msgid="8635056131768862479">"Interaktiv rapport"</string>
+ <string name="bugreport_option_interactive_summary" msgid="8180152634022797629">"Bruk dette alternativet i de fleste tilfeller. Da kan du spore fremgangen for rapporten samt skrive inn flere detaljer om problemet. Noen deler som tar lang tid å behandle, blir kanskje utelatt."</string>
+ <string name="bugreport_option_full_title" msgid="6354382025840076439">"Fullstendig rapport"</string>
+ <!-- no translation found for bugreport_option_full_summary (6687306111256813257) -->
<skip />
- <!-- no translation found for bugreport_option_interactive_summary (8180152634022797629) -->
- <skip />
- <!-- no translation found for bugreport_option_full_title (6354382025840076439) -->
- <skip />
- <!-- no translation found for bugreport_option_full_summary (6440582052207304578) -->
- <skip />
- <!-- no translation found for bugreport_countdown (6878900193900090368) -->
+ <plurals name="bugreport_countdown" formatted="false" msgid="6878900193900090368">
+ <item quantity="other">Tar skjermdump for feilrapporten om <xliff:g id="NUMBER_1">%d</xliff:g> sekunder.</item>
+ <item quantity="one">Tar skjermdump for feilrapporten om <xliff:g id="NUMBER_0">%d</xliff:g> sekund.</item>
+ </plurals>
<string name="global_action_toggle_silent_mode" msgid="8219525344246810925">"Stillemodus"</string>
<string name="global_action_silent_mode_on_status" msgid="3289841937003758806">"Lyden er av"</string>
<string name="global_action_silent_mode_off_status" msgid="1506046579177066419">"Lyden er på"</string>
@@ -1049,8 +1049,8 @@
<string name="remote_bugreport_progress_notification_message_can_cancel" msgid="5743435483005099451">"Trykk for å avbryte"</string>
<string name="select_input_method" msgid="8547250819326693584">"Endre tastatur"</string>
<string name="configure_input_methods" msgid="4769971288371946846">"Velg tastatur"</string>
- <string name="show_ime" msgid="9157568568695230830">"Vis inndatametode"</string>
- <string name="hardware" msgid="7517821086888990278">"Maskinvare"</string>
+ <string name="show_ime" msgid="2506087537466597099">"Ha den på skjermen mens det fysiske tastaturet er aktivt"</string>
+ <string name="hardware" msgid="194658061510127999">"Vis det virtuelle tastaturet"</string>
<string name="select_keyboard_layout_notification_title" msgid="1407367017263030773">"Velg tastaturoppsett"</string>
<string name="select_keyboard_layout_notification_message" msgid="4465907700449257063">"Trykk for å velge et tastaturoppsett"</string>
<string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSTUVWXYZÆØÅ"</string>
@@ -1531,4 +1531,10 @@
<string name="user_creation_cannot_add_any_more" msgid="6244197709981359266"><b>"<xliff:g id="APP">%1$s</xliff:g>"</b>" prøver å legge til en ny bruker, men brukergrensen er nådd."</string>
<string name="user_creation_account_exists" msgid="4880171855014489789"><b>"<xliff:g id="APP">%1$s</xliff:g>"</b>" prøver å legge til en ny bruker, men kontoen "<b>"<xliff:g id="ACCOUNT">%2$s</xliff:g>"</b>" finnes allerede på denne enheten. Vil du fortsette likevel?"</string>
<string name="user_creation_adding" msgid="3206420861363021392"><b>"<xliff:g id="APP">%1$s</xliff:g>"</b>" prøver å legge til en ny bruker på kontoen "<b>"<xliff:g id="ACCOUNT">%2$s</xliff:g>"</b>". Vil du fortsette?"</string>
+ <string name="language_selection_title" msgid="7181332986330337171">"Språkinnstilling"</string>
+ <string name="country_selection_title" msgid="2954859441620215513">"Regionsinnstilling"</string>
+ <string name="search_language_hint" msgid="7042102592055108574">"Skriv inn språknavn"</string>
+ <string name="language_picker_section_suggested" msgid="8414489646861640885">"Foreslått"</string>
+ <string name="language_picker_section_all" msgid="3097279199511617537">"Alle språk"</string>
+ <string name="locale_search_menu" msgid="2560710726687249178">"Søk"</string>
</resources>
diff --git a/core/res/res/values-ne-rNP/strings.xml b/core/res/res/values-ne-rNP/strings.xml
index f7b96d9..3e0cb29 100644
--- a/core/res/res/values-ne-rNP/strings.xml
+++ b/core/res/res/values-ne-rNP/strings.xml
@@ -146,7 +146,7 @@
<string name="httpErrorLookup" msgid="4711687456111963163">"URL भेटाउन सकेन।"</string>
<string name="httpErrorUnsupportedAuthScheme" msgid="6299980280442076799">"साइटको आधिकारिकता योजना समर्थित छैन।"</string>
<string name="httpErrorAuth" msgid="1435065629438044534">"प्रमाणीकरण गर्न सकेन।"</string>
- <string name="httpErrorProxyAuth" msgid="1788207010559081331">"प्रोक्सी सर्भरको माध्यमद्वारा प्रमाणिकरण असफल भएको छ।"</string>
+ <string name="httpErrorProxyAuth" msgid="1788207010559081331">"प्रोक्सी सर्भरको माध्यमद्वारा प्रमाणीकरण असफल भएको छ।"</string>
<string name="httpErrorConnect" msgid="8714273236364640549">"सर्भरसँग जोड्न सकेन।"</string>
<string name="httpErrorIO" msgid="2340558197489302188">"सर्भरसँग संचार गर्न सकेन। फेरि पछि कोसिस गर्नुहोस्।"</string>
<string name="httpErrorTimeout" msgid="4743403703762883954">"सर्भर संगको सम्पर्क प्रक्रिया समय सकियो।"</string>
@@ -211,15 +211,15 @@
<string name="global_action_bug_report" msgid="7934010578922304799">"बग रिपोर्ट"</string>
<string name="bugreport_title" msgid="2667494803742548533">"बग रिपोर्ट लिनुहोस्"</string>
<string name="bugreport_message" msgid="398447048750350456">"एउटा इमेल सन्देशको रूपमा पठाउनलाई यसले तपाईँको हालैको उपकरणको अवस्थाको बारेमा सूचना जम्मा गर्ने छ। बग रिपोर्ट सुरु गरेदेखि पठाउन तयार नभएसम्म यसले केही समय लिन्छ; कृपया धैर्य गर्नुहोस्।"</string>
- <!-- no translation found for bugreport_option_interactive_title (8635056131768862479) -->
+ <string name="bugreport_option_interactive_title" msgid="8635056131768862479">"पारस्परिक रिपोर्ट"</string>
+ <string name="bugreport_option_interactive_summary" msgid="8180152634022797629">"यसलाई धेरै परिस्थिति भन्दा मुनि प्रयोग गर्नुहोस्। यसले तपाईंलाई रिपोर्टको प्रगति ट्र्याक गर्न र समस्या सम्बन्धी थप विवरणहरू प्रविष्ट गर्न अनुमति दिन्छ। यसले रिपोर्ट गर्न धेरै नै समय लिने केही कम प्रयोग भएका खण्डहरू मेटाउन सक्छ।"</string>
+ <string name="bugreport_option_full_title" msgid="6354382025840076439">"पूर्ण रिपोर्ट"</string>
+ <!-- no translation found for bugreport_option_full_summary (6687306111256813257) -->
<skip />
- <!-- no translation found for bugreport_option_interactive_summary (8180152634022797629) -->
- <skip />
- <!-- no translation found for bugreport_option_full_title (6354382025840076439) -->
- <skip />
- <!-- no translation found for bugreport_option_full_summary (6440582052207304578) -->
- <skip />
- <!-- no translation found for bugreport_countdown (6878900193900090368) -->
+ <plurals name="bugreport_countdown" formatted="false" msgid="6878900193900090368">
+ <item quantity="other"> बग रिपोर्टको लागि <xliff:g id="NUMBER_1">%d</xliff:g> सेकेन्डमा स्क्रिनशट लिँदै।</item>
+ <item quantity="one"> बग रिपोर्टको लागि <xliff:g id="NUMBER_0">%d</xliff:g> सेकेन्डमा स्क्रिनशट लिँदै।</item>
+ </plurals>
<string name="global_action_toggle_silent_mode" msgid="8219525344246810925">"मौन मोड"</string>
<string name="global_action_silent_mode_on_status" msgid="3289841937003758806">"आवाज बन्द छ"</string>
<string name="global_action_silent_mode_off_status" msgid="1506046579177066419">"ध्वनि खुल्ला छ"</string>
@@ -1047,7 +1047,7 @@
<string name="usb_notification_message" msgid="7347368030849048437">"थप विकल्पहरूका लागि छुनुहोस्।"</string>
<string name="adb_active_notification_title" msgid="6729044778949189918">"USB डिबग गर्ने जडित छ"</string>
<string name="adb_active_notification_message" msgid="1016654627626476142">"USB डिबग गर्ने असक्षम पार्न छुनुहोस्।"</string>
- <string name="share_remote_bugreport_notification_title" msgid="3116061729914615290">"व्यवस्थापकसँग बग रिपोर्ट साझेदारी गर्ने हो?"</string>
+ <string name="share_remote_bugreport_notification_title" msgid="3116061729914615290">"प्रशासकसँग बग रिपोर्ट साझेदारी गर्ने हो?"</string>
<string name="share_remote_bugreport_notification_message" msgid="1310517845557771773">"तपाईंको IT व्यवस्थापकले समस्या निवारणमा मद्दत गर्न बग रिपोर्ट अनुरोध गर्नुभयो"</string>
<string name="share_remote_bugreport_notification_accept" msgid="8203856129078669677">"स्वीकार गर्नुहोस्"</string>
<string name="share_remote_bugreport_notification_decline" msgid="6337969352057443969">"अस्वीकार गर्नुहोस्"</string>
@@ -1055,8 +1055,8 @@
<string name="remote_bugreport_progress_notification_message_can_cancel" msgid="5743435483005099451">"रद्द गर्न छुनुहोस्"</string>
<string name="select_input_method" msgid="8547250819326693584">"कुञ्जीपाटी परिवर्तन गर्नुहोस्"</string>
<string name="configure_input_methods" msgid="4769971288371946846">"कीबोर्ड छान्नुहोस्"</string>
- <string name="show_ime" msgid="9157568568695230830">"आगत विधि देखाउनुहोस्"</string>
- <string name="hardware" msgid="7517821086888990278">"हार्डवेयर"</string>
+ <string name="show_ime" msgid="2506087537466597099">"भौतिक किबोर्ड सक्रिय हुँदा यसलाई स्क्रिनमा राख्नुहोस्"</string>
+ <string name="hardware" msgid="194658061510127999">"भर्चुअल किबोर्ड देखाउनुहोस्"</string>
<string name="select_keyboard_layout_notification_title" msgid="1407367017263030773">"किबोर्ड रूपरेखा चयन गर्नुहोस्"</string>
<string name="select_keyboard_layout_notification_message" msgid="4465907700449257063">"किबोर्ड रूपरेखा चयन गर्न टच गर्नुहोस्।"</string>
<string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
@@ -1533,8 +1533,14 @@
<string name="default_notification_topic_label" msgid="227586145791870829">"विविध"</string>
<string name="importance_from_topic" msgid="3572280439880023233">"तपाईंले यी सूचनाहरूको महत्त्व सेट गर्नुहुन्छ।"</string>
<string name="importance_from_person" msgid="9160133597262938296">"यसमा सङ्लग्न भएका मानिसहरूको कारणले गर्दा यो महत्वपूर्ण छ।"</string>
- <string name="user_creation_cannot_add" msgid="7740333663230045315"><b>"<xliff:g id="APP">%1$s</xliff:g>"</b>" ले नयाँ प्रयोगकर्ता थप्ने प्रयास गरिरहेको छ तर हाललाई निषेध छ।"</string>
+ <string name="user_creation_cannot_add" msgid="7740333663230045315"><b>"<xliff:g id="APP">%1$s</xliff:g>"</b>" ले नयाँ प्रयोगकर्ता थप्ने प्रयास गरिरहेको छ तर हाललाई निषेधित छ।"</string>
<string name="user_creation_cannot_add_any_more" msgid="6244197709981359266"><b>"<xliff:g id="APP">%1$s</xliff:g>"</b>" ले नयाँ प्रयोगकर्ता थप्ने प्रयास गरिरहेको छ तर प्रयोगकर्ताको सीमा पुगेको छ।"</string>
<string name="user_creation_account_exists" msgid="4880171855014489789"><b>"<xliff:g id="APP">%1$s</xliff:g>"</b>" ले नयाँ प्रयोगकर्ता थप्ने प्रयास गरिरहेको छ तर यो यन्त्रमा खाता "<b>"<xliff:g id="ACCOUNT">%2$s</xliff:g>"</b>" पहिले नै अवस्थित छ। जे भए पनि अगाडि बढ्ने हो?"</string>
<string name="user_creation_adding" msgid="3206420861363021392"><b>"<xliff:g id="APP">%1$s</xliff:g>"</b>" ले खाता "<b>"<xliff:g id="ACCOUNT">%2$s</xliff:g>"</b>" मा नयाँ प्रयोगकर्ता थप्ने प्रयास गरिरहेको छ। अगाडि बढ्ने हो?"</string>
+ <string name="language_selection_title" msgid="7181332986330337171">"भाषाको प्राथमिकता"</string>
+ <string name="country_selection_title" msgid="2954859441620215513">"क्षेत्रको प्राथमिकता"</string>
+ <string name="search_language_hint" msgid="7042102592055108574">"भाषाको नाम टाइप गर्नुहोस्"</string>
+ <string name="language_picker_section_suggested" msgid="8414489646861640885">"सुझाव दिइयो"</string>
+ <string name="language_picker_section_all" msgid="3097279199511617537">"सम्पूर्ण भाषाहरू"</string>
+ <string name="locale_search_menu" msgid="2560710726687249178">"खोज"</string>
</resources>
diff --git a/core/res/res/values-nl/strings.xml b/core/res/res/values-nl/strings.xml
index cd70afa..d0a333b 100644
--- a/core/res/res/values-nl/strings.xml
+++ b/core/res/res/values-nl/strings.xml
@@ -211,15 +211,15 @@
<string name="global_action_bug_report" msgid="7934010578922304799">"Foutenrapport"</string>
<string name="bugreport_title" msgid="2667494803742548533">"Foutenrapport genereren"</string>
<string name="bugreport_message" msgid="398447048750350456">"Hiermee worden gegevens over de huidige status van je apparaat verzameld en als e-mail verzonden. Wanneer u een foutenrapport start, duurt het even voordat het kan worden verzonden. Even geduld alstublieft."</string>
- <!-- no translation found for bugreport_option_interactive_title (8635056131768862479) -->
+ <string name="bugreport_option_interactive_title" msgid="8635056131768862479">"Interactief rapport"</string>
+ <string name="bugreport_option_interactive_summary" msgid="8180152634022797629">"Gebruik deze optie in de meeste situaties. Hiermee kun je de voortgang van het rapport bijhouden en meer gegevens over het probleem opgeven. Mogelijk worden bepaalde minder vaak gebruikte gedeelten weggelaten (waarvoor het lang zou duren om een rapport te genereren)."</string>
+ <string name="bugreport_option_full_title" msgid="6354382025840076439">"Volledig rapport"</string>
+ <!-- no translation found for bugreport_option_full_summary (6687306111256813257) -->
<skip />
- <!-- no translation found for bugreport_option_interactive_summary (8180152634022797629) -->
- <skip />
- <!-- no translation found for bugreport_option_full_title (6354382025840076439) -->
- <skip />
- <!-- no translation found for bugreport_option_full_summary (6440582052207304578) -->
- <skip />
- <!-- no translation found for bugreport_countdown (6878900193900090368) -->
+ <plurals name="bugreport_countdown" formatted="false" msgid="6878900193900090368">
+ <item quantity="other">Er wordt over <xliff:g id="NUMBER_1">%d</xliff:g> seconden een screenshot gemaakt voor het bugrapport.</item>
+ <item quantity="one">Er wordt over <xliff:g id="NUMBER_0">%d</xliff:g> seconde een screenshot gemaakt voor het bugrapport.</item>
+ </plurals>
<string name="global_action_toggle_silent_mode" msgid="8219525344246810925">"Stille modus"</string>
<string name="global_action_silent_mode_on_status" msgid="3289841937003758806">"Geluid is UIT"</string>
<string name="global_action_silent_mode_off_status" msgid="1506046579177066419">"Geluid is AAN"</string>
@@ -1049,8 +1049,8 @@
<string name="remote_bugreport_progress_notification_message_can_cancel" msgid="5743435483005099451">"Tik om te annuleren"</string>
<string name="select_input_method" msgid="8547250819326693584">"Toetsenbord wijzigen"</string>
<string name="configure_input_methods" msgid="4769971288371946846">"Toetsenborden kiezen"</string>
- <string name="show_ime" msgid="9157568568695230830">"Invoermethode weergeven"</string>
- <string name="hardware" msgid="7517821086888990278">"Hardware"</string>
+ <string name="show_ime" msgid="2506087537466597099">"Dit op het scherm weergeven terwijl het fysieke toetsenbord actief is"</string>
+ <string name="hardware" msgid="194658061510127999">"Virtueel toetsenbord tonen"</string>
<string name="select_keyboard_layout_notification_title" msgid="1407367017263030773">"Toetsenbordindeling selecteren"</string>
<string name="select_keyboard_layout_notification_message" msgid="4465907700449257063">"Tik om een toetsenbordindeling te selecteren."</string>
<string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
@@ -1531,4 +1531,10 @@
<string name="user_creation_cannot_add_any_more" msgid="6244197709981359266"><b>"<xliff:g id="APP">%1$s</xliff:g>"</b>" probeert een nieuwe gebruiker toe te voegen, maar de gebruikerslimiet is al bereikt."</string>
<string name="user_creation_account_exists" msgid="4880171855014489789"><b>"<xliff:g id="APP">%1$s</xliff:g>"</b>" probeert een nieuwe gebruiker toe te voegen, maar het account "<b>"<xliff:g id="ACCOUNT">%2$s</xliff:g>"</b>" bestaat al op dit apparaat. Toch doorgaan?"</string>
<string name="user_creation_adding" msgid="3206420861363021392"><b>"<xliff:g id="APP">%1$s</xliff:g>"</b>" probeert een nieuwe gebruiker toe te voegen voor het account "<b>"<xliff:g id="ACCOUNT">%2$s</xliff:g>"</b>". Doorgaan?"</string>
+ <string name="language_selection_title" msgid="7181332986330337171">"Taalvoorkeur"</string>
+ <string name="country_selection_title" msgid="2954859441620215513">"Regiovoorkeur"</string>
+ <string name="search_language_hint" msgid="7042102592055108574">"Typ een taalnaam"</string>
+ <string name="language_picker_section_suggested" msgid="8414489646861640885">"Voorgesteld"</string>
+ <string name="language_picker_section_all" msgid="3097279199511617537">"Alle talen"</string>
+ <string name="locale_search_menu" msgid="2560710726687249178">"Zoeken"</string>
</resources>
diff --git a/core/res/res/values-pa-rIN/strings.xml b/core/res/res/values-pa-rIN/strings.xml
index 7c9f1b4..7e762b00 100644
--- a/core/res/res/values-pa-rIN/strings.xml
+++ b/core/res/res/values-pa-rIN/strings.xml
@@ -211,15 +211,15 @@
<string name="global_action_bug_report" msgid="7934010578922304799">"ਬਗ ਰਿਪੋਰਟ"</string>
<string name="bugreport_title" msgid="2667494803742548533">"ਬਗ ਰਿਪੋਰਟ ਲਓ"</string>
<string name="bugreport_message" msgid="398447048750350456">"ਇਹ ਇੱਕ ਈ-ਮੇਲ ਸੁਨੇਹਾ ਭੇਜਣ ਲਈ, ਤੁਹਾਡੀ ਵਰਤਮਾਨ ਡਿਵਾਈਸ ਬਾਰੇ ਜਾਣਕਾਰੀ ਇਕੱਤਰ ਕਰੇਗਾ। ਬਗ ਰਿਪੋਰਟ ਸ਼ੁਰੂ ਕਰਨ ਵਿੱਚ ਥੋੜ੍ਹਾ ਸਮਾਂ ਲੱਗੇਗਾ ਜਦੋਂ ਤੱਕ ਇਹ ਭੇਜੇ ਜਾਣ ਲਈ ਤਿਆਰ ਨਾ ਹੋਵੇ, ਕਿਰਪਾ ਕਰਕੇ ਧੀਰਜ ਰੱਖੋ।"</string>
- <!-- no translation found for bugreport_option_interactive_title (8635056131768862479) -->
+ <string name="bugreport_option_interactive_title" msgid="8635056131768862479">"ਅੰਤਰਕਿਰਿਆਤਮਕ ਰਿਪੋਰਟ"</string>
+ <string name="bugreport_option_interactive_summary" msgid="8180152634022797629">"ਜ਼ਿਆਦਾਤਰ ਹਾਲਾਤਾਂ ਵਿੱਚ ਇਸ ਦੀ ਵਰਤੋਂ ਕਰੋ। ਇਹ ਤੁਹਾਨੂੰ ਰਿਪੋਰਟ ਦੀ ਪ੍ਰਗਤੀ ਨੂੰ ਟਰੈਕ ਕਰਨ ਦਿੰਦਾ ਹੈ ਅਤੇ ਸਮੱਸਿਆ ਬਾਰੇ ਹੋਰ ਵੇਰਵੇ ਦਾਖਲ ਕਰਨ ਦਿੰਦਾ ਹੈ। ਇਹ ਉਹਨਾਂ ਘੱਟ-ਵਰਤੇ ਗਏ ਕੁਝ ਭਾਗਾਂ ਨੂੰ ਨਜ਼ਰ-ਅੰਦਾਜ਼ ਕਰ ਸਕਦਾ ਹੈ ਜਿਨ੍ਹਾਂ ਦੀ ਰਿਪੋਰਟ ਕਰਨ ਵਿੱਚ ਵੱਧ ਸਮਾਂ ਲੱਗ ਸਕਦਾ ਹੈ।"</string>
+ <string name="bugreport_option_full_title" msgid="6354382025840076439">"ਪੂਰੀ ਰਿਪੋਰਟ"</string>
+ <!-- no translation found for bugreport_option_full_summary (6687306111256813257) -->
<skip />
- <!-- no translation found for bugreport_option_interactive_summary (8180152634022797629) -->
- <skip />
- <!-- no translation found for bugreport_option_full_title (6354382025840076439) -->
- <skip />
- <!-- no translation found for bugreport_option_full_summary (6440582052207304578) -->
- <skip />
- <!-- no translation found for bugreport_countdown (6878900193900090368) -->
+ <plurals name="bugreport_countdown" formatted="false" msgid="6878900193900090368">
+ <item quantity="one">ਬੱਗ ਰਿਪੋਰਟ ਲਈ <xliff:g id="NUMBER_1">%d</xliff:g> ਸਕਿੰਟ ਵਿੱਚ ਸਕ੍ਰੀਨਸ਼ਾਟ ਲਿਆ ਜਾ ਰਿਹਾ ਹੈ।</item>
+ <item quantity="other">ਬੱਗ ਰਿਪੋਰਟ ਲਈ <xliff:g id="NUMBER_1">%d</xliff:g> ਸਕਿੰਟ ਵਿੱਚ ਸਕ੍ਰੀਨਸ਼ਾਟ ਲਿਆ ਜਾ ਰਿਹਾ ਹੈ।</item>
+ </plurals>
<string name="global_action_toggle_silent_mode" msgid="8219525344246810925">"ਸਾਈਲੈਂਟ ਮੋਡ"</string>
<string name="global_action_silent_mode_on_status" msgid="3289841937003758806">"ਅਵਾਜ਼ ਬੰਦ ਹੈ"</string>
<string name="global_action_silent_mode_off_status" msgid="1506046579177066419">"ਅਵਾਜ਼ ਚਾਲੂ ਹੈ"</string>
@@ -1049,8 +1049,8 @@
<string name="remote_bugreport_progress_notification_message_can_cancel" msgid="5743435483005099451">"ਰੱਦ ਕਰਨ ਲਈ ਸਪਰਸ਼ ਕਰੋ"</string>
<string name="select_input_method" msgid="8547250819326693584">"ਕੀਬੋਰਡ ਬਦਲੋ"</string>
<string name="configure_input_methods" msgid="4769971288371946846">"ਕੀਬੋਰਡਸ ਚੁਣੋ"</string>
- <string name="show_ime" msgid="9157568568695230830">"ਇਨਪੁਟ ਵਿਧੀ ਦਿਖਾਓ"</string>
- <string name="hardware" msgid="7517821086888990278">"ਹਾਰਡਵੇਅਰ"</string>
+ <string name="show_ime" msgid="2506087537466597099">"ਭੌਤਿਕ ਕੀ-ਬੋਰਡ ਸਰਗਰਮ ਹੋਣ ਦੌਰਾਨ ਇਸ ਨੂੰ ਸਕ੍ਰੀਨ \'ਤੇ ਬਣਾਈ ਰੱਖੋ"</string>
+ <string name="hardware" msgid="194658061510127999">"ਵਰਚੁਅਲ ਕੀ-ਬੋਰਡ ਵਿਖਾਓ"</string>
<string name="select_keyboard_layout_notification_title" msgid="1407367017263030773">"ਕੀਬੋਰਡ ਲੇਆਊਟ ਚੁਣੋ"</string>
<string name="select_keyboard_layout_notification_message" msgid="4465907700449257063">"ਇੱਕ ਕੀਬੋਰਡ ਲੇਆਊਟ ਚੁਣਨ ਲਈ ਛੋਹਵੋ।"</string>
<string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
@@ -1531,4 +1531,10 @@
<string name="user_creation_cannot_add_any_more" msgid="6244197709981359266"><b>"<xliff:g id="APP">%1$s</xliff:g>"</b>" ਇੱਕ ਨਵੇਂ ਵਰਤੋਂਕਾਰ ਨੂੰ ਸ਼ਾਮਲ ਕਰਨ ਦੀ ਕੋਸ਼ਿਸ਼ ਕਰ ਰਿਹਾ ਹੈ, ਪਰ ਵਰਤੋਂਕਾਰ ਮਿਆਦ ਪੂਰੀ ਹੋ ਚੁੱਕੀ ਹੈ।"</string>
<string name="user_creation_account_exists" msgid="4880171855014489789"><b>"<xliff:g id="APP">%1$s</xliff:g>"</b>" ਇੱਕ ਨਵੇਂ ਵਰਤੋਂਕਾਰ ਨੂੰ ਸ਼ਾਮਲ ਕਰਨ ਦੀ ਕੋਸ਼ਿਸ਼ ਕਰ ਰਿਹਾ ਹੈ, ਪਰ "<b>"<xliff:g id="ACCOUNT">%2$s</xliff:g>"</b>" ਖਾਤਾ ਇਸ ਡੀਵਾਈਸ \'ਤੇ ਪਹਿਲਾਂ ਤੋਂ ਹੀ ਮੌਜੂਦ ਹੈ। ਕੀ ਫਿਰ ਵੀ ਅੱਗੇ ਵੱਧਣਾ ਚਾਹੁੰਦੇ ਹੋ?"</string>
<string name="user_creation_adding" msgid="3206420861363021392"><b>"<xliff:g id="APP">%1$s</xliff:g>"</b>" "<b>"<xliff:g id="ACCOUNT">%2$s</xliff:g>"</b>" ਖਾਤੇ ਵਿੱਚ ਇੱਕ ਨਵੇਂ ਵਰਤੋਂਕਾਰ ਨੂੰ ਸ਼ਾਮਲ ਕਰਨ ਦੀ ਕੋਸ਼ਿਸ਼ ਕਰ ਰਿਹਾ ਹੈ। ਕੀ ਅੱਗੇ ਵੱਧਣਾ ਹੈ?"</string>
+ <string name="language_selection_title" msgid="7181332986330337171">"ਭਾਸ਼ਾ ਤਰਜੀਹ"</string>
+ <string name="country_selection_title" msgid="2954859441620215513">"ਖੇਤਰ ਤਰਜੀਹ"</string>
+ <string name="search_language_hint" msgid="7042102592055108574">"ਭਾਸ਼ਾ ਨਾਮ ਟਾਈਪ ਕਰੋ"</string>
+ <string name="language_picker_section_suggested" msgid="8414489646861640885">"ਸੁਝਾਈਆਂ ਗਈਆਂ"</string>
+ <string name="language_picker_section_all" msgid="3097279199511617537">"ਸਾਰੀਆਂ ਭਾਸ਼ਾਵਾਂ"</string>
+ <string name="locale_search_menu" msgid="2560710726687249178">"ਖੋਜ"</string>
</resources>
diff --git a/core/res/res/values-pl/strings.xml b/core/res/res/values-pl/strings.xml
index 1e5bc5f..8f475d5 100644
--- a/core/res/res/values-pl/strings.xml
+++ b/core/res/res/values-pl/strings.xml
@@ -213,15 +213,17 @@
<string name="global_action_bug_report" msgid="7934010578922304799">"Zgłoszenie błędu"</string>
<string name="bugreport_title" msgid="2667494803742548533">"Zgłoś błąd"</string>
<string name="bugreport_message" msgid="398447048750350456">"Informacje o bieżącym stanie urządzenia zostaną zebrane i wysłane e-mailem. Przygotowanie zgłoszenia błędu do wysłania chwilę potrwa, więc zachowaj cierpliwość."</string>
- <!-- no translation found for bugreport_option_interactive_title (8635056131768862479) -->
+ <string name="bugreport_option_interactive_title" msgid="8635056131768862479">"Raport interaktywny"</string>
+ <string name="bugreport_option_interactive_summary" msgid="8180152634022797629">"Używaj tej opcji w większości przypadków. Umożliwia śledzenie postępów raportu i podanie dodatkowych szczegółów problemu. Raport może pomijać niektóre rzadko używane sekcje, których utworzenie zajmuje dużo czasu."</string>
+ <string name="bugreport_option_full_title" msgid="6354382025840076439">"Pełny raport"</string>
+ <!-- no translation found for bugreport_option_full_summary (6687306111256813257) -->
<skip />
- <!-- no translation found for bugreport_option_interactive_summary (8180152634022797629) -->
- <skip />
- <!-- no translation found for bugreport_option_full_title (6354382025840076439) -->
- <skip />
- <!-- no translation found for bugreport_option_full_summary (6440582052207304578) -->
- <skip />
- <!-- no translation found for bugreport_countdown (6878900193900090368) -->
+ <plurals name="bugreport_countdown" formatted="false" msgid="6878900193900090368">
+ <item quantity="few">Zrzut ekranu do raportu o błędzie zostanie zrobiony za <xliff:g id="NUMBER_1">%d</xliff:g> sekundy.</item>
+ <item quantity="many">Zrzut ekranu do raportu o błędzie zostanie zrobiony za <xliff:g id="NUMBER_1">%d</xliff:g> sekund.</item>
+ <item quantity="other">Zrzut ekranu do raportu o błędzie zostanie zrobiony za <xliff:g id="NUMBER_1">%d</xliff:g> sekundy.</item>
+ <item quantity="one">Zrzut ekranu do raportu o błędzie zostanie zrobiony za <xliff:g id="NUMBER_0">%d</xliff:g> sekundę.</item>
+ </plurals>
<string name="global_action_toggle_silent_mode" msgid="8219525344246810925">"Tryb cichy"</string>
<string name="global_action_silent_mode_on_status" msgid="3289841937003758806">"Dźwięk jest wyłączony"</string>
<string name="global_action_silent_mode_off_status" msgid="1506046579177066419">"Dźwięk jest włączony"</string>
@@ -1063,8 +1065,8 @@
<string name="remote_bugreport_progress_notification_message_can_cancel" msgid="5743435483005099451">"Kliknij, by anulować"</string>
<string name="select_input_method" msgid="8547250819326693584">"Zmień klawiaturę"</string>
<string name="configure_input_methods" msgid="4769971288371946846">"Wybierz klawiatury"</string>
- <string name="show_ime" msgid="9157568568695230830">"Pokaż metodę wprowadzania"</string>
- <string name="hardware" msgid="7517821086888990278">"Sprzęt"</string>
+ <string name="show_ime" msgid="2506087537466597099">"Pozostaw na ekranie, gdy aktywna jest klawiatura fizyczna"</string>
+ <string name="hardware" msgid="194658061510127999">"Pokaż klawiaturę wirtualną"</string>
<string name="select_keyboard_layout_notification_title" msgid="1407367017263030773">"Wybierz układ klawiatury"</string>
<string name="select_keyboard_layout_notification_message" msgid="4465907700449257063">"Kliknij, by wybrać układ klawiatury."</string>
<string name="fast_scroll_alphabet" msgid="5433275485499039199">" AĄBCĆDEĘFGHIJKLŁMNŃOÓPQRSŚTUVWXYZŹŻ"</string>
@@ -1567,4 +1569,10 @@
<string name="user_creation_cannot_add_any_more" msgid="6244197709981359266">"Aplikacja "<b>"<xliff:g id="APP">%1$s</xliff:g>"</b>" próbuje dodać nowego użytkownika, ale osiągnięto już limit użytkowników."</string>
<string name="user_creation_account_exists" msgid="4880171855014489789">"Aplikacja "<b>"<xliff:g id="APP">%1$s</xliff:g>"</b>" próbuje dodać nowego użytkownika, ale na tym urządzeniu istnieje już konto "<b>"<xliff:g id="ACCOUNT">%2$s</xliff:g>"</b>". Kontynuować mimo to?"</string>
<string name="user_creation_adding" msgid="3206420861363021392">"Aplikacja "<b>"<xliff:g id="APP">%1$s</xliff:g>"</b>" próbuje dodać nowego użytkownika do konta "<b>"<xliff:g id="ACCOUNT">%2$s</xliff:g>"</b>". Kontynuować?"</string>
+ <string name="language_selection_title" msgid="7181332986330337171">"Ustawienie języka"</string>
+ <string name="country_selection_title" msgid="2954859441620215513">"Ustawienie regionu"</string>
+ <string name="search_language_hint" msgid="7042102592055108574">"Wpisz nazwę języka"</string>
+ <string name="language_picker_section_suggested" msgid="8414489646861640885">"Sugerowane"</string>
+ <string name="language_picker_section_all" msgid="3097279199511617537">"Wszystkie języki"</string>
+ <string name="locale_search_menu" msgid="2560710726687249178">"Szukaj"</string>
</resources>
diff --git a/core/res/res/values-pt-rBR/strings.xml b/core/res/res/values-pt-rBR/strings.xml
index 1d0d9e5..60d4860 100644
--- a/core/res/res/values-pt-rBR/strings.xml
+++ b/core/res/res/values-pt-rBR/strings.xml
@@ -211,15 +211,15 @@
<string name="global_action_bug_report" msgid="7934010578922304799">"Relatório de bugs"</string>
<string name="bugreport_title" msgid="2667494803742548533">"Obter relatório de bugs"</string>
<string name="bugreport_message" msgid="398447048750350456">"Isto coletará informações sobre o estado atual do dispositivo para enviá-las em uma mensagem de e-mail. Após iniciar o relatório de bugs, será necessário aguardar algum tempo até que esteja pronto para ser enviado."</string>
- <!-- no translation found for bugreport_option_interactive_title (8635056131768862479) -->
+ <string name="bugreport_option_interactive_title" msgid="8635056131768862479">"Relatório interativo"</string>
+ <string name="bugreport_option_interactive_summary" msgid="8180152634022797629">"Use este recurso na maioria das circunstâncias. Ele permite que você acompanhe o progresso do relatório e informe mais detalhes sobre o problema. É possível que ele omita algumas seções menos utilizadas que levam muito tempo na emissão dos relatórios."</string>
+ <string name="bugreport_option_full_title" msgid="6354382025840076439">"Relatório completo"</string>
+ <!-- no translation found for bugreport_option_full_summary (6687306111256813257) -->
<skip />
- <!-- no translation found for bugreport_option_interactive_summary (8180152634022797629) -->
- <skip />
- <!-- no translation found for bugreport_option_full_title (6354382025840076439) -->
- <skip />
- <!-- no translation found for bugreport_option_full_summary (6440582052207304578) -->
- <skip />
- <!-- no translation found for bugreport_countdown (6878900193900090368) -->
+ <plurals name="bugreport_countdown" formatted="false" msgid="6878900193900090368">
+ <item quantity="one">Capturas de tela para o relatório do bug serão feitas em <xliff:g id="NUMBER_1">%d</xliff:g> segundos.</item>
+ <item quantity="other">Capturas de tela para o relatório do bug serão feitas em <xliff:g id="NUMBER_1">%d</xliff:g> segundos.</item>
+ </plurals>
<string name="global_action_toggle_silent_mode" msgid="8219525344246810925">"Modo silencioso"</string>
<string name="global_action_silent_mode_on_status" msgid="3289841937003758806">"Som DESATIVADO"</string>
<string name="global_action_silent_mode_off_status" msgid="1506046579177066419">"O som está ATIVADO"</string>
@@ -1049,8 +1049,8 @@
<string name="remote_bugreport_progress_notification_message_can_cancel" msgid="5743435483005099451">"Toque para cancelar"</string>
<string name="select_input_method" msgid="8547250819326693584">"Alterar teclado"</string>
<string name="configure_input_methods" msgid="4769971288371946846">"Escolher teclados"</string>
- <string name="show_ime" msgid="9157568568695230830">"Mostrar método de entrada"</string>
- <string name="hardware" msgid="7517821086888990278">"Hardware"</string>
+ <string name="show_ime" msgid="2506087537466597099">"Manter na tela enquanto o teclado físico estiver ativo"</string>
+ <string name="hardware" msgid="194658061510127999">"Mostrar teclado virtual"</string>
<string name="select_keyboard_layout_notification_title" msgid="1407367017263030773">"Selecione o layout de teclado"</string>
<string name="select_keyboard_layout_notification_message" msgid="4465907700449257063">"Toque para selecionar um layout de teclado."</string>
<string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
@@ -1531,4 +1531,10 @@
<string name="user_creation_cannot_add_any_more" msgid="6244197709981359266"><b>"<xliff:g id="APP">%1$s</xliff:g>"</b>" está tentando adicionar um novo usuário, mas o limite de usuários foi atingido."</string>
<string name="user_creation_account_exists" msgid="4880171855014489789"><b>"<xliff:g id="APP">%1$s</xliff:g>"</b>" está tentando adicionar um novo usuário, mas a conta "<b>"<xliff:g id="ACCOUNT">%2$s</xliff:g>"</b>" já existe neste dispositivo. Continuar mesmo assim?"</string>
<string name="user_creation_adding" msgid="3206420861363021392"><b>"<xliff:g id="APP">%1$s</xliff:g>"</b>" está tentando adicionar um novo usuário à conta "<b>"<xliff:g id="ACCOUNT">%2$s</xliff:g>"</b>". Continuar?"</string>
+ <string name="language_selection_title" msgid="7181332986330337171">"Preferência de idioma"</string>
+ <string name="country_selection_title" msgid="2954859441620215513">"Preferência de região"</string>
+ <string name="search_language_hint" msgid="7042102592055108574">"Digitar nome do idioma"</string>
+ <string name="language_picker_section_suggested" msgid="8414489646861640885">"Sugeridos"</string>
+ <string name="language_picker_section_all" msgid="3097279199511617537">"Todos os idiomas"</string>
+ <string name="locale_search_menu" msgid="2560710726687249178">"Pesquisa"</string>
</resources>
diff --git a/core/res/res/values-pt-rPT/strings.xml b/core/res/res/values-pt-rPT/strings.xml
index 453179a..e58e693 100644
--- a/core/res/res/values-pt-rPT/strings.xml
+++ b/core/res/res/values-pt-rPT/strings.xml
@@ -211,15 +211,15 @@
<string name="global_action_bug_report" msgid="7934010578922304799">"Relatório de erros"</string>
<string name="bugreport_title" msgid="2667494803742548533">"Criar relatório de erros"</string>
<string name="bugreport_message" msgid="398447048750350456">"Será recolhida informação sobre o estado atual do seu dispositivo a enviar através de uma mensagem de email. Demorará algum tempo até que o relatório de erro esteja pronto para ser enviado. Aguarde um pouco."</string>
- <!-- no translation found for bugreport_option_interactive_title (8635056131768862479) -->
+ <string name="bugreport_option_interactive_title" msgid="8635056131768862479">"Relatório interativo"</string>
+ <string name="bugreport_option_interactive_summary" msgid="8180152634022797629">"Utilize esta opção na maioria das circunstâncias. Permite monitorizar o progresso do relatório e introduzir mais detalhes acerca do problema. Pode omitir algumas secções menos utilizadas que demoram muito tempo a comunicar."</string>
+ <string name="bugreport_option_full_title" msgid="6354382025840076439">"Relatório completo"</string>
+ <!-- no translation found for bugreport_option_full_summary (6687306111256813257) -->
<skip />
- <!-- no translation found for bugreport_option_interactive_summary (8180152634022797629) -->
- <skip />
- <!-- no translation found for bugreport_option_full_title (6354382025840076439) -->
- <skip />
- <!-- no translation found for bugreport_option_full_summary (6440582052207304578) -->
- <skip />
- <!-- no translation found for bugreport_countdown (6878900193900090368) -->
+ <plurals name="bugreport_countdown" formatted="false" msgid="6878900193900090368">
+ <item quantity="other">A tirar uma captura de ecrã do relatório de erro dentro de <xliff:g id="NUMBER_1">%d</xliff:g> segundos.</item>
+ <item quantity="one">A tirar uma captura de ecrã do relatório de erro dentro de <xliff:g id="NUMBER_0">%d</xliff:g> segundo.</item>
+ </plurals>
<string name="global_action_toggle_silent_mode" msgid="8219525344246810925">"Modo silencioso"</string>
<string name="global_action_silent_mode_on_status" msgid="3289841937003758806">"Som desativado"</string>
<string name="global_action_silent_mode_off_status" msgid="1506046579177066419">"O som está ativado"</string>
@@ -1049,8 +1049,8 @@
<string name="remote_bugreport_progress_notification_message_can_cancel" msgid="5743435483005099451">"Toque para cancelar"</string>
<string name="select_input_method" msgid="8547250819326693584">"Alterar teclado"</string>
<string name="configure_input_methods" msgid="4769971288371946846">"Escolher teclados"</string>
- <string name="show_ime" msgid="9157568568695230830">"Mostrar método de entrada"</string>
- <string name="hardware" msgid="7517821086888990278">"Hardware"</string>
+ <string name="show_ime" msgid="2506087537466597099">"Manter no ecrã enquanto o teclado físico estiver ativo"</string>
+ <string name="hardware" msgid="194658061510127999">"Mostrar o teclado virtual"</string>
<string name="select_keyboard_layout_notification_title" msgid="1407367017263030773">"Selecionar esquema de teclado"</string>
<string name="select_keyboard_layout_notification_message" msgid="4465907700449257063">"Toque para selecionar um esquema de teclado."</string>
<string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
@@ -1527,8 +1527,14 @@
<string name="default_notification_topic_label" msgid="227586145791870829">"Diversos"</string>
<string name="importance_from_topic" msgid="3572280439880023233">"Definiu a importância destas notificações."</string>
<string name="importance_from_person" msgid="9160133597262938296">"É importante devido às pessoas envolvidas."</string>
- <string name="user_creation_cannot_add" msgid="7740333663230045315"><b>"<xliff:g id="APP">%1$s</xliff:g>"</b>" está a tentar adicionar um novo utilizador, mas está atualmente proibido."</string>
+ <string name="user_creation_cannot_add" msgid="7740333663230045315"><b>"<xliff:g id="APP">%1$s</xliff:g>"</b>" está a tentar adicionar um novo utilizador, mas está atualmente proibido(a)."</string>
<string name="user_creation_cannot_add_any_more" msgid="6244197709981359266"><b>"<xliff:g id="APP">%1$s</xliff:g>"</b>" está a tentar adicionar um novo utilizador, mas foi atingido o limite de utilizadores."</string>
<string name="user_creation_account_exists" msgid="4880171855014489789"><b>"<xliff:g id="APP">%1$s</xliff:g>"</b>" está a tentar adicionar um novo utilizador, mas a conta "<b>"<xliff:g id="ACCOUNT">%2$s</xliff:g>"</b>" já existe neste dispositivo. Pretende continuar mesmo assim?"</string>
<string name="user_creation_adding" msgid="3206420861363021392"><b>"<xliff:g id="APP">%1$s</xliff:g>"</b>" está a tentar adicionar um novo utilizador à conta "<b>"<xliff:g id="ACCOUNT">%2$s</xliff:g>"</b>". Pretende continuar?"</string>
+ <string name="language_selection_title" msgid="7181332986330337171">"Preferência de idioma"</string>
+ <string name="country_selection_title" msgid="2954859441620215513">"Preferência de região"</string>
+ <string name="search_language_hint" msgid="7042102592055108574">"Intr. nome do idioma"</string>
+ <string name="language_picker_section_suggested" msgid="8414489646861640885">"Sugeridos"</string>
+ <string name="language_picker_section_all" msgid="3097279199511617537">"Todos os idiomas"</string>
+ <string name="locale_search_menu" msgid="2560710726687249178">"Pesquisa"</string>
</resources>
diff --git a/core/res/res/values-pt/strings.xml b/core/res/res/values-pt/strings.xml
index 1d0d9e5..60d4860 100644
--- a/core/res/res/values-pt/strings.xml
+++ b/core/res/res/values-pt/strings.xml
@@ -211,15 +211,15 @@
<string name="global_action_bug_report" msgid="7934010578922304799">"Relatório de bugs"</string>
<string name="bugreport_title" msgid="2667494803742548533">"Obter relatório de bugs"</string>
<string name="bugreport_message" msgid="398447048750350456">"Isto coletará informações sobre o estado atual do dispositivo para enviá-las em uma mensagem de e-mail. Após iniciar o relatório de bugs, será necessário aguardar algum tempo até que esteja pronto para ser enviado."</string>
- <!-- no translation found for bugreport_option_interactive_title (8635056131768862479) -->
+ <string name="bugreport_option_interactive_title" msgid="8635056131768862479">"Relatório interativo"</string>
+ <string name="bugreport_option_interactive_summary" msgid="8180152634022797629">"Use este recurso na maioria das circunstâncias. Ele permite que você acompanhe o progresso do relatório e informe mais detalhes sobre o problema. É possível que ele omita algumas seções menos utilizadas que levam muito tempo na emissão dos relatórios."</string>
+ <string name="bugreport_option_full_title" msgid="6354382025840076439">"Relatório completo"</string>
+ <!-- no translation found for bugreport_option_full_summary (6687306111256813257) -->
<skip />
- <!-- no translation found for bugreport_option_interactive_summary (8180152634022797629) -->
- <skip />
- <!-- no translation found for bugreport_option_full_title (6354382025840076439) -->
- <skip />
- <!-- no translation found for bugreport_option_full_summary (6440582052207304578) -->
- <skip />
- <!-- no translation found for bugreport_countdown (6878900193900090368) -->
+ <plurals name="bugreport_countdown" formatted="false" msgid="6878900193900090368">
+ <item quantity="one">Capturas de tela para o relatório do bug serão feitas em <xliff:g id="NUMBER_1">%d</xliff:g> segundos.</item>
+ <item quantity="other">Capturas de tela para o relatório do bug serão feitas em <xliff:g id="NUMBER_1">%d</xliff:g> segundos.</item>
+ </plurals>
<string name="global_action_toggle_silent_mode" msgid="8219525344246810925">"Modo silencioso"</string>
<string name="global_action_silent_mode_on_status" msgid="3289841937003758806">"Som DESATIVADO"</string>
<string name="global_action_silent_mode_off_status" msgid="1506046579177066419">"O som está ATIVADO"</string>
@@ -1049,8 +1049,8 @@
<string name="remote_bugreport_progress_notification_message_can_cancel" msgid="5743435483005099451">"Toque para cancelar"</string>
<string name="select_input_method" msgid="8547250819326693584">"Alterar teclado"</string>
<string name="configure_input_methods" msgid="4769971288371946846">"Escolher teclados"</string>
- <string name="show_ime" msgid="9157568568695230830">"Mostrar método de entrada"</string>
- <string name="hardware" msgid="7517821086888990278">"Hardware"</string>
+ <string name="show_ime" msgid="2506087537466597099">"Manter na tela enquanto o teclado físico estiver ativo"</string>
+ <string name="hardware" msgid="194658061510127999">"Mostrar teclado virtual"</string>
<string name="select_keyboard_layout_notification_title" msgid="1407367017263030773">"Selecione o layout de teclado"</string>
<string name="select_keyboard_layout_notification_message" msgid="4465907700449257063">"Toque para selecionar um layout de teclado."</string>
<string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
@@ -1531,4 +1531,10 @@
<string name="user_creation_cannot_add_any_more" msgid="6244197709981359266"><b>"<xliff:g id="APP">%1$s</xliff:g>"</b>" está tentando adicionar um novo usuário, mas o limite de usuários foi atingido."</string>
<string name="user_creation_account_exists" msgid="4880171855014489789"><b>"<xliff:g id="APP">%1$s</xliff:g>"</b>" está tentando adicionar um novo usuário, mas a conta "<b>"<xliff:g id="ACCOUNT">%2$s</xliff:g>"</b>" já existe neste dispositivo. Continuar mesmo assim?"</string>
<string name="user_creation_adding" msgid="3206420861363021392"><b>"<xliff:g id="APP">%1$s</xliff:g>"</b>" está tentando adicionar um novo usuário à conta "<b>"<xliff:g id="ACCOUNT">%2$s</xliff:g>"</b>". Continuar?"</string>
+ <string name="language_selection_title" msgid="7181332986330337171">"Preferência de idioma"</string>
+ <string name="country_selection_title" msgid="2954859441620215513">"Preferência de região"</string>
+ <string name="search_language_hint" msgid="7042102592055108574">"Digitar nome do idioma"</string>
+ <string name="language_picker_section_suggested" msgid="8414489646861640885">"Sugeridos"</string>
+ <string name="language_picker_section_all" msgid="3097279199511617537">"Todos os idiomas"</string>
+ <string name="locale_search_menu" msgid="2560710726687249178">"Pesquisa"</string>
</resources>
diff --git a/core/res/res/values-ro/strings.xml b/core/res/res/values-ro/strings.xml
index 3602d91..4db1209 100644
--- a/core/res/res/values-ro/strings.xml
+++ b/core/res/res/values-ro/strings.xml
@@ -212,15 +212,16 @@
<string name="global_action_bug_report" msgid="7934010578922304799">"Raport despre erori"</string>
<string name="bugreport_title" msgid="2667494803742548533">"Executați un raport despre erori"</string>
<string name="bugreport_message" msgid="398447048750350456">"Acest raport va colecta informații despre starea actuală a dispozitivului, pentru a le trimite într-un e-mail. Aveți răbdare după pornirea raportului despre erori până când va fi gata de trimis."</string>
- <!-- no translation found for bugreport_option_interactive_title (8635056131768862479) -->
+ <string name="bugreport_option_interactive_title" msgid="8635056131768862479">"Raport interactiv"</string>
+ <string name="bugreport_option_interactive_summary" msgid="8180152634022797629">"Folosiți această opțiune în majoritatea situațiilor. Astfel, puteți să urmăriți progresul raportului și să introduceți mai multe detalii în privința problemei. Pot fi omise unele secțiuni mai puțin folosite pentru care raportarea durează prea mult."</string>
+ <string name="bugreport_option_full_title" msgid="6354382025840076439">"Raport complet"</string>
+ <!-- no translation found for bugreport_option_full_summary (6687306111256813257) -->
<skip />
- <!-- no translation found for bugreport_option_interactive_summary (8180152634022797629) -->
- <skip />
- <!-- no translation found for bugreport_option_full_title (6354382025840076439) -->
- <skip />
- <!-- no translation found for bugreport_option_full_summary (6440582052207304578) -->
- <skip />
- <!-- no translation found for bugreport_countdown (6878900193900090368) -->
+ <plurals name="bugreport_countdown" formatted="false" msgid="6878900193900090368">
+ <item quantity="few">Peste <xliff:g id="NUMBER_1">%d</xliff:g> secunde se va realiza o captură de ecran pentru raportul de eroare.</item>
+ <item quantity="other">Peste <xliff:g id="NUMBER_1">%d</xliff:g> de secunde se va realiza o captură de ecran pentru raportul de eroare.</item>
+ <item quantity="one">Peste <xliff:g id="NUMBER_0">%d</xliff:g> secundă se va realiza o captură de ecran pentru raportul de eroare.</item>
+ </plurals>
<string name="global_action_toggle_silent_mode" msgid="8219525344246810925">"Mod Silențios"</string>
<string name="global_action_silent_mode_on_status" msgid="3289841937003758806">"Sunetul este DEZACTIVAT"</string>
<string name="global_action_silent_mode_off_status" msgid="1506046579177066419">"Sunetul este ACTIVAT"</string>
@@ -1056,8 +1057,8 @@
<string name="remote_bugreport_progress_notification_message_can_cancel" msgid="5743435483005099451">"Atingeți pentru a anula"</string>
<string name="select_input_method" msgid="8547250819326693584">"Schimbați tastatura"</string>
<string name="configure_input_methods" msgid="4769971288371946846">"Alegeți tastaturi"</string>
- <string name="show_ime" msgid="9157568568695230830">"Afișați metoda de introducere a textului"</string>
- <string name="hardware" msgid="7517821086888990278">"Hardware"</string>
+ <string name="show_ime" msgid="2506087537466597099">"Se păstrează pe ecran cât timp este activată tastatura fizică"</string>
+ <string name="hardware" msgid="194658061510127999">"Afișați tastatura virtuală"</string>
<string name="select_keyboard_layout_notification_title" msgid="1407367017263030773">"Selectați aspectul tastaturii"</string>
<string name="select_keyboard_layout_notification_message" msgid="4465907700449257063">"Atingeți pentru a selecta un aspect de tastatură."</string>
<string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
@@ -1549,4 +1550,10 @@
<string name="user_creation_cannot_add_any_more" msgid="6244197709981359266"><b>"<xliff:g id="APP">%1$s</xliff:g>"</b>" încearcă să adauge un nou utilizator, dar a fost atinsă limita de utilizatori."</string>
<string name="user_creation_account_exists" msgid="4880171855014489789"><b>"<xliff:g id="APP">%1$s</xliff:g>"</b>" încearcă să adauge un nou utilizator, dar contul "<b>"<xliff:g id="ACCOUNT">%2$s</xliff:g>"</b>" există deja pe acest dispozitiv. Continuați oricum?"</string>
<string name="user_creation_adding" msgid="3206420861363021392"><b>"<xliff:g id="APP">%1$s</xliff:g>"</b>" încearcă să adauge un nou utilizator pentru contul "<b>"<xliff:g id="ACCOUNT">%2$s</xliff:g>"</b>". Continuați?"</string>
+ <string name="language_selection_title" msgid="7181332986330337171">"Limba preferată"</string>
+ <string name="country_selection_title" msgid="2954859441620215513">"Regiunea preferată"</string>
+ <string name="search_language_hint" msgid="7042102592055108574">"Scrieți nume limbă"</string>
+ <string name="language_picker_section_suggested" msgid="8414489646861640885">"Sugerate"</string>
+ <string name="language_picker_section_all" msgid="3097279199511617537">"Toate limbile"</string>
+ <string name="locale_search_menu" msgid="2560710726687249178">"Căutați"</string>
</resources>
diff --git a/core/res/res/values-ru/strings.xml b/core/res/res/values-ru/strings.xml
index 2d69607..1185422 100644
--- a/core/res/res/values-ru/strings.xml
+++ b/core/res/res/values-ru/strings.xml
@@ -213,15 +213,17 @@
<string name="global_action_bug_report" msgid="7934010578922304799">"Отчет об ошибке"</string>
<string name="bugreport_title" msgid="2667494803742548533">"Отчет об ошибке"</string>
<string name="bugreport_message" msgid="398447048750350456">"Информация о текущем состоянии вашего устройства будет собрана и отправлена по электронной почте. Подготовка отчета займет некоторое время."</string>
- <!-- no translation found for bugreport_option_interactive_title (8635056131768862479) -->
+ <string name="bugreport_option_interactive_title" msgid="8635056131768862479">"Интерактивный отчет"</string>
+ <string name="bugreport_option_interactive_summary" msgid="8180152634022797629">"Рекомендуем пользоваться этой функцией, чтобы отслеживать статус отчета и указывать дополнительные данные о проблеме. Показываются только основные разделы (чтобы отправка отчета об ошибке занимала меньше времени)."</string>
+ <string name="bugreport_option_full_title" msgid="6354382025840076439">"Подробный отчет"</string>
+ <!-- no translation found for bugreport_option_full_summary (6687306111256813257) -->
<skip />
- <!-- no translation found for bugreport_option_interactive_summary (8180152634022797629) -->
- <skip />
- <!-- no translation found for bugreport_option_full_title (6354382025840076439) -->
- <skip />
- <!-- no translation found for bugreport_option_full_summary (6440582052207304578) -->
- <skip />
- <!-- no translation found for bugreport_countdown (6878900193900090368) -->
+ <plurals name="bugreport_countdown" formatted="false" msgid="6878900193900090368">
+ <item quantity="one">Скриншот будет сделан через <xliff:g id="NUMBER_1">%d</xliff:g> секунду</item>
+ <item quantity="few">Скриншот будет сделан через <xliff:g id="NUMBER_1">%d</xliff:g> секунды</item>
+ <item quantity="many">Скриншот будет сделан через <xliff:g id="NUMBER_1">%d</xliff:g> секунд</item>
+ <item quantity="other">Скриншот будет сделан через <xliff:g id="NUMBER_1">%d</xliff:g> секунды</item>
+ </plurals>
<string name="global_action_toggle_silent_mode" msgid="8219525344246810925">"Режим без звука"</string>
<string name="global_action_silent_mode_on_status" msgid="3289841937003758806">"Выключить"</string>
<string name="global_action_silent_mode_off_status" msgid="1506046579177066419">"Включить"</string>
@@ -1063,8 +1065,8 @@
<string name="remote_bugreport_progress_notification_message_can_cancel" msgid="5743435483005099451">"Нажмите, чтобы отменить"</string>
<string name="select_input_method" msgid="8547250819326693584">"Выбор раскладки"</string>
<string name="configure_input_methods" msgid="4769971288371946846">"Выбрать раскладку"</string>
- <string name="show_ime" msgid="9157568568695230830">"Показать способ ввода"</string>
- <string name="hardware" msgid="7517821086888990278">"Аппаратная"</string>
+ <string name="show_ime" msgid="2506087537466597099">"Показывать на экране, когда физическая клавиатура включена"</string>
+ <string name="hardware" msgid="194658061510127999">"Виртуальная клавиатура"</string>
<string name="select_keyboard_layout_notification_title" msgid="1407367017263030773">"Выберите раскладку клавиатуры"</string>
<string name="select_keyboard_layout_notification_message" msgid="4465907700449257063">"Нажмите, чтобы выбрать раскладку клавиатуры."</string>
<string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
@@ -1567,4 +1569,10 @@
<string name="user_creation_cannot_add_any_more" msgid="6244197709981359266">"Приложение "<b>"<xliff:g id="APP">%1$s</xliff:g>"</b>" хочет добавить пользователя, однако лимит уже достигнут."</string>
<string name="user_creation_account_exists" msgid="4880171855014489789">"Приложение "<b>"<xliff:g id="APP">%1$s</xliff:g>"</b>" хочет добавить пользователя, однако аккаунт "<b>"<xliff:g id="ACCOUNT">%2$s</xliff:g>"</b>" уже есть на этом устройстве. Продолжить?"</string>
<string name="user_creation_adding" msgid="3206420861363021392">"Приложение "<b>"<xliff:g id="APP">%1$s</xliff:g>"</b>" хочет добавить пользователя для аккаунта "<b>"<xliff:g id="ACCOUNT">%2$s</xliff:g>"</b>". Продолжить?"</string>
+ <string name="language_selection_title" msgid="7181332986330337171">"Языковые настройки"</string>
+ <string name="country_selection_title" msgid="2954859441620215513">"Региональные настройки"</string>
+ <string name="search_language_hint" msgid="7042102592055108574">"Введите язык"</string>
+ <string name="language_picker_section_suggested" msgid="8414489646861640885">"Рекомендуемые"</string>
+ <string name="language_picker_section_all" msgid="3097279199511617537">"Все языки"</string>
+ <string name="locale_search_menu" msgid="2560710726687249178">"Поиск"</string>
</resources>
diff --git a/core/res/res/values-si-rLK/strings.xml b/core/res/res/values-si-rLK/strings.xml
index fb36adc..2cbf5ad 100644
--- a/core/res/res/values-si-rLK/strings.xml
+++ b/core/res/res/values-si-rLK/strings.xml
@@ -211,15 +211,15 @@
<string name="global_action_bug_report" msgid="7934010578922304799">"දෝෂ වර්තාව"</string>
<string name="bugreport_title" msgid="2667494803742548533">"දෝෂ වාර්තාවක් ගන්න"</string>
<string name="bugreport_message" msgid="398447048750350456">"ඊ-තැපැල් පණිවිඩයක් ලෙස යැවීමට මෙය ඔබගේ වත්මන් උපාංග තත්වය ගැන තොරතුරු එකතු කරනු ඇත. දෝෂ වාර්තාව ආරම්භ කර එය යැවීමට සූදානම් කරන තෙක් එයට කිසියම් කාලයක් ගතවනු ඇත; කරුණාකර ඉවසන්න."</string>
- <!-- no translation found for bugreport_option_interactive_title (8635056131768862479) -->
+ <string name="bugreport_option_interactive_title" msgid="8635056131768862479">"අන්තර්ක්රියා වාර්."</string>
+ <string name="bugreport_option_interactive_summary" msgid="8180152634022797629">"බොහොමයක් වාතාවරණ යටතේ මෙය භාවිත කරන්න. එය ඔබට වාර්තාවේ ප්රගතිය හඹා යාමට සහ ගැටලුව පිළිබඳ වැඩිපුර විස්තර ඇතුළත් කිරීමට ඉඩ දෙයි. එය වාර්තා කිරීමට දිගු වේලාවක් ගන්නා සමහර අඩුවෙන්-භාවිත වන කොටස් මග හැරීමට හැකිය."</string>
+ <string name="bugreport_option_full_title" msgid="6354382025840076439">"සම්පූර්ණ වාර්තාව"</string>
+ <!-- no translation found for bugreport_option_full_summary (6687306111256813257) -->
<skip />
- <!-- no translation found for bugreport_option_interactive_summary (8180152634022797629) -->
- <skip />
- <!-- no translation found for bugreport_option_full_title (6354382025840076439) -->
- <skip />
- <!-- no translation found for bugreport_option_full_summary (6440582052207304578) -->
- <skip />
- <!-- no translation found for bugreport_countdown (6878900193900090368) -->
+ <plurals name="bugreport_countdown" formatted="false" msgid="6878900193900090368">
+ <item quantity="one">තත්පර <xliff:g id="NUMBER_1">%d</xliff:g>කින් දෝෂ වාර්තාව සඳහා තිර රුවක් ලබා ගනිමින්</item>
+ <item quantity="other">තත්පර <xliff:g id="NUMBER_1">%d</xliff:g>කින් දෝෂ වාර්තාව සඳහා තිර රුවක් ලබා ගනිමින්</item>
+ </plurals>
<string name="global_action_toggle_silent_mode" msgid="8219525344246810925">"නිහඬ ආකාරය"</string>
<string name="global_action_silent_mode_on_status" msgid="3289841937003758806">"ශබ්දය අක්රියයි"</string>
<string name="global_action_silent_mode_off_status" msgid="1506046579177066419">"හඬ සක්රියයි"</string>
@@ -1051,8 +1051,8 @@
<string name="remote_bugreport_progress_notification_message_can_cancel" msgid="5743435483005099451">"අවලංගු කිරීමට ස්පර්ශ කරන්න"</string>
<string name="select_input_method" msgid="8547250819326693584">"යතුරු පුවරු වෙනස් කිරීම"</string>
<string name="configure_input_methods" msgid="4769971288371946846">"යතුරු පුවරු තෝරන්න"</string>
- <string name="show_ime" msgid="9157568568695230830">"ආදාන ක්රමය පෙන්වන්න"</string>
- <string name="hardware" msgid="7517821086888990278">"දෘඨාංග"</string>
+ <string name="show_ime" msgid="2506087537466597099">"භෞතික යතුරු පුවරුව සක්රිය අතරතුර එය තිරය මත තබා ගන්න"</string>
+ <string name="hardware" msgid="194658061510127999">"අතථ්ය යතුරු පුවරුව පෙන්වන්න"</string>
<string name="select_keyboard_layout_notification_title" msgid="1407367017263030773">"යතුරු පුවරුවට පිරිසැලැස්ම තෝරන්න"</string>
<string name="select_keyboard_layout_notification_message" msgid="4465907700449257063">"යතුරු පුවරුවට පිරිසැලැස්මක් තේරීමට ස්පර්ශ කරන්න."</string>
<string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
@@ -1533,4 +1533,10 @@
<string name="user_creation_cannot_add_any_more" msgid="6244197709981359266"><b>"<xliff:g id="APP">%1$s</xliff:g>"</b>" නව පරිශීලකයෙකු එක් කිරීමට උත්සාහ කරමින් සිටින නමුත්, පරිශීලක සීමාවට ළඟා වී ඇත."</string>
<string name="user_creation_account_exists" msgid="4880171855014489789"><b>"<xliff:g id="APP">%1$s</xliff:g>"</b>" නව පරිශීලකයෙකු එක් කිරීමට උත්සාහ කරමින් සිටී, නමුත් "<b>"<xliff:g id="ACCOUNT">%2$s</xliff:g>"</b>" ගිණුම මෙම උපාංගය මත දැනටමත් පවතී. කෙසේ වෙතත් ඉදිරියට යන්නද?"</string>
<string name="user_creation_adding" msgid="3206420861363021392"><b>"<xliff:g id="APP">%1$s</xliff:g>"</b>" නව පරිශීලකයෙකු "<b>"<xliff:g id="ACCOUNT">%2$s</xliff:g>"</b>" ගිණුම සඳහා එක් කිරීමට උත්සාහ කරමින් සිටී. ඉදිරියට යන්නද?"</string>
+ <string name="language_selection_title" msgid="7181332986330337171">"භාෂා මනාප"</string>
+ <string name="country_selection_title" msgid="2954859441620215513">"ප්රදේශ මනාපය"</string>
+ <string name="search_language_hint" msgid="7042102592055108574">"භාෂා නම ටයිප් කරන්න"</string>
+ <string name="language_picker_section_suggested" msgid="8414489646861640885">"යෝජිත"</string>
+ <string name="language_picker_section_all" msgid="3097279199511617537">"සියලු භාෂා"</string>
+ <string name="locale_search_menu" msgid="2560710726687249178">"සෙවීම"</string>
</resources>
diff --git a/core/res/res/values-sk/strings.xml b/core/res/res/values-sk/strings.xml
index d81e4e73..8e08adc 100644
--- a/core/res/res/values-sk/strings.xml
+++ b/core/res/res/values-sk/strings.xml
@@ -213,15 +213,17 @@
<string name="global_action_bug_report" msgid="7934010578922304799">"Hlásenie o chybách"</string>
<string name="bugreport_title" msgid="2667494803742548533">"Vytvoriť hlásenie chyby"</string>
<string name="bugreport_message" msgid="398447048750350456">"Týmto zhromaždíte informácie o aktuálnom stave zariadenia. Informácie je potom možné odoslať e-mailom, chvíľu však potrvá, kým bude hlásenie chyby pripravené na odoslanie. Prosíme vás preto o trpezlivosť."</string>
- <!-- no translation found for bugreport_option_interactive_title (8635056131768862479) -->
+ <string name="bugreport_option_interactive_title" msgid="8635056131768862479">"Interaktívne nahlásenie"</string>
+ <string name="bugreport_option_interactive_summary" msgid="8180152634022797629">"Táto možnosť je vhodná pre väčšinu prípadov. Umožňuje sledovať priebeh nahlásenia a zadať ďalšie podrobnosti o probléme. Môžu byť vynechané niektoré menej používané sekcie, ktorých nahlásenie trvá dlho."</string>
+ <string name="bugreport_option_full_title" msgid="6354382025840076439">"Úplné nahlásenie"</string>
+ <!-- no translation found for bugreport_option_full_summary (6687306111256813257) -->
<skip />
- <!-- no translation found for bugreport_option_interactive_summary (8180152634022797629) -->
- <skip />
- <!-- no translation found for bugreport_option_full_title (6354382025840076439) -->
- <skip />
- <!-- no translation found for bugreport_option_full_summary (6440582052207304578) -->
- <skip />
- <!-- no translation found for bugreport_countdown (6878900193900090368) -->
+ <plurals name="bugreport_countdown" formatted="false" msgid="6878900193900090368">
+ <item quantity="few">Snímka obrazovky pre hlásenie chyby sa vytvorí o <xliff:g id="NUMBER_1">%d</xliff:g> sekundy.</item>
+ <item quantity="many">Snímka obrazovky pre hlásenie chyby sa vytvorí o <xliff:g id="NUMBER_1">%d</xliff:g> sekundy.</item>
+ <item quantity="other">Snímka obrazovky pre hlásenie chyby sa vytvorí o <xliff:g id="NUMBER_1">%d</xliff:g> sekúnd.</item>
+ <item quantity="one">Snímka obrazovky pre hlásenie chyby sa vytvorí o <xliff:g id="NUMBER_0">%d</xliff:g> sekundu.</item>
+ </plurals>
<string name="global_action_toggle_silent_mode" msgid="8219525344246810925">"Tichý režim"</string>
<string name="global_action_silent_mode_on_status" msgid="3289841937003758806">"Zvuk je VYPNUTÝ."</string>
<string name="global_action_silent_mode_off_status" msgid="1506046579177066419">"Zvuk je zapnutý"</string>
@@ -1063,8 +1065,8 @@
<string name="remote_bugreport_progress_notification_message_can_cancel" msgid="5743435483005099451">"Dotykom zrušíte"</string>
<string name="select_input_method" msgid="8547250819326693584">"Zmeniť klávesnicu"</string>
<string name="configure_input_methods" msgid="4769971288371946846">"Vybrať klávesnicu"</string>
- <string name="show_ime" msgid="9157568568695230830">"Zobraziť metódu vstupu"</string>
- <string name="hardware" msgid="7517821086888990278">"Hardvér"</string>
+ <string name="show_ime" msgid="2506087537466597099">"Ponechať na obrazovke, keď je aktívna fyzická klávesnica"</string>
+ <string name="hardware" msgid="194658061510127999">"Zobraziť virtuálnu klávesnicu"</string>
<string name="select_keyboard_layout_notification_title" msgid="1407367017263030773">"Zvoľte rozloženie klávesnice"</string>
<string name="select_keyboard_layout_notification_message" msgid="4465907700449257063">"Dotykom zvoľte rozloženie klávesnice."</string>
<string name="fast_scroll_alphabet" msgid="5433275485499039199">" AÁÄBCČDĎDZDŽEÉFGHCHIÍJKLĽMNŇOÓÔPRŔSŠTŤUÚVWXYÝZŽ"</string>
@@ -1567,4 +1569,10 @@
<string name="user_creation_cannot_add_any_more" msgid="6244197709981359266">"Aplikácia "<b>"<xliff:g id="APP">%1$s</xliff:g>"</b>" sa pokúša pridať nového používateľa, bol však prekročený limit počtu používateľov."</string>
<string name="user_creation_account_exists" msgid="4880171855014489789">"Aplikácia "<b>"<xliff:g id="APP">%1$s</xliff:g>"</b>" sa pokúša pridať nového používateľa, účet "<b>"<xliff:g id="ACCOUNT">%2$s</xliff:g>"</b>" však na tomto zariadení už existuje. Chcete napriek tomu pokračovať?"</string>
<string name="user_creation_adding" msgid="3206420861363021392">"Aplikácia "<b>"<xliff:g id="APP">%1$s</xliff:g>"</b>" sa pokúša pridať nového používateľa pre účet "<b>"<xliff:g id="ACCOUNT">%2$s</xliff:g>"</b>". Chcete pokračovať?"</string>
+ <string name="language_selection_title" msgid="7181332986330337171">"Jazykové predvoľby"</string>
+ <string name="country_selection_title" msgid="2954859441620215513">"Preferovaný región"</string>
+ <string name="search_language_hint" msgid="7042102592055108574">"Zadajte názov jazyka"</string>
+ <string name="language_picker_section_suggested" msgid="8414489646861640885">"Navrhované"</string>
+ <string name="language_picker_section_all" msgid="3097279199511617537">"Všetky jazyky"</string>
+ <string name="locale_search_menu" msgid="2560710726687249178">"Vyhľadávanie"</string>
</resources>
diff --git a/core/res/res/values-sl/strings.xml b/core/res/res/values-sl/strings.xml
index c86227e..c85f7b5 100644
--- a/core/res/res/values-sl/strings.xml
+++ b/core/res/res/values-sl/strings.xml
@@ -213,15 +213,17 @@
<string name="global_action_bug_report" msgid="7934010578922304799">"Poročilo o napakah"</string>
<string name="bugreport_title" msgid="2667494803742548533">"Ustvari poročilo o napakah"</string>
<string name="bugreport_message" msgid="398447048750350456">"S tem bodo zbrani podatki o trenutnem stanju naprave, ki bodo poslani v e-poštnem sporočilu. Izvedba poročila o napakah in priprava trajata nekaj časa, zato bodite potrpežljivi."</string>
- <!-- no translation found for bugreport_option_interactive_title (8635056131768862479) -->
+ <string name="bugreport_option_interactive_title" msgid="8635056131768862479">"Interaktivno poročilo"</string>
+ <string name="bugreport_option_interactive_summary" msgid="8180152634022797629">"To možnost uporabite v večini primerov. Omogoča sledenje napredka poročila in vnos več podrobnosti o težavi. Morda bodo izpuščeni nekateri redkeje uporabljani razdelki, za katere je poročanje dolgotrajno."</string>
+ <string name="bugreport_option_full_title" msgid="6354382025840076439">"Celotno poročilo"</string>
+ <!-- no translation found for bugreport_option_full_summary (6687306111256813257) -->
<skip />
- <!-- no translation found for bugreport_option_interactive_summary (8180152634022797629) -->
- <skip />
- <!-- no translation found for bugreport_option_full_title (6354382025840076439) -->
- <skip />
- <!-- no translation found for bugreport_option_full_summary (6440582052207304578) -->
- <skip />
- <!-- no translation found for bugreport_countdown (6878900193900090368) -->
+ <plurals name="bugreport_countdown" formatted="false" msgid="6878900193900090368">
+ <item quantity="one">Posnetek zaslona za poročilo o napakah bo narejen čez <xliff:g id="NUMBER_1">%d</xliff:g> s.</item>
+ <item quantity="two">Posnetek zaslona za poročilo o napakah bo narejen čez <xliff:g id="NUMBER_1">%d</xliff:g> s.</item>
+ <item quantity="few">Posnetek zaslona za poročilo o napakah bo narejen čez <xliff:g id="NUMBER_1">%d</xliff:g> s.</item>
+ <item quantity="other">Posnetek zaslona za poročilo o napakah bo narejen čez <xliff:g id="NUMBER_1">%d</xliff:g> s.</item>
+ </plurals>
<string name="global_action_toggle_silent_mode" msgid="8219525344246810925">"Tihi način"</string>
<string name="global_action_silent_mode_on_status" msgid="3289841937003758806">"Zvok je IZKLOPLJEN"</string>
<string name="global_action_silent_mode_off_status" msgid="1506046579177066419">"Zvok je VKLOPLJEN"</string>
@@ -1063,8 +1065,8 @@
<string name="remote_bugreport_progress_notification_message_can_cancel" msgid="5743435483005099451">"Če želite prekiniti, se dotaknite"</string>
<string name="select_input_method" msgid="8547250819326693584">"Sprememba tipkovnice"</string>
<string name="configure_input_methods" msgid="4769971288371946846">"Izbira tipkovnic"</string>
- <string name="show_ime" msgid="9157568568695230830">"Pokaži način vnosa"</string>
- <string name="hardware" msgid="7517821086888990278">"Strojna oprema"</string>
+ <string name="show_ime" msgid="2506087537466597099">"Ohrani na zaslonu, dokler je aktivna fizična tipkovnica"</string>
+ <string name="hardware" msgid="194658061510127999">"Pokaži navidezno tipkovnico"</string>
<string name="select_keyboard_layout_notification_title" msgid="1407367017263030773">"Izberite razporeditev tipkovnice"</string>
<string name="select_keyboard_layout_notification_message" msgid="4465907700449257063">"Dotaknite se, da izberete razporeditev tipkovnice"</string>
<string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
@@ -1567,4 +1569,10 @@
<string name="user_creation_cannot_add_any_more" msgid="6244197709981359266">"Aplikacija "<b>"<xliff:g id="APP">%1$s</xliff:g>"</b>" poskuša dodati novega uporabnika, vendar je dosežena omejitev števila uporabnikov."</string>
<string name="user_creation_account_exists" msgid="4880171855014489789">"Aplikacija "<b>"<xliff:g id="APP">%1$s</xliff:g>"</b>" poskuša dodati novega uporabnika, vendar račun "<b>"<xliff:g id="ACCOUNT">%2$s</xliff:g>"</b>" v napravi že obstaja. Ali želite kljub temu nadaljevati?"</string>
<string name="user_creation_adding" msgid="3206420861363021392">"Aplikacija "<b>"<xliff:g id="APP">%1$s</xliff:g>"</b>" poskuša dodati novega uporabnika za račun "<b>"<xliff:g id="ACCOUNT">%2$s</xliff:g>"</b>". Ali želite nadaljevati?"</string>
+ <string name="language_selection_title" msgid="7181332986330337171">"Nastavitev jezika"</string>
+ <string name="country_selection_title" msgid="2954859441620215513">"Nastavitev območja"</string>
+ <string name="search_language_hint" msgid="7042102592055108574">"Vnesite ime jezika"</string>
+ <string name="language_picker_section_suggested" msgid="8414489646861640885">"Predlagano"</string>
+ <string name="language_picker_section_all" msgid="3097279199511617537">"Vsi jeziki"</string>
+ <string name="locale_search_menu" msgid="2560710726687249178">"Išči"</string>
</resources>
diff --git a/core/res/res/values-sq-rAL/strings.xml b/core/res/res/values-sq-rAL/strings.xml
index c33dc5b..65156f0 100644
--- a/core/res/res/values-sq-rAL/strings.xml
+++ b/core/res/res/values-sq-rAL/strings.xml
@@ -211,15 +211,15 @@
<string name="global_action_bug_report" msgid="7934010578922304799">"Raporti i defekteve në kod"</string>
<string name="bugreport_title" msgid="2667494803742548533">"Merr raportin e defekteve në kod"</string>
<string name="bugreport_message" msgid="398447048750350456">"Ky funksion mundëson mbledhjen e informacioneve mbi gjendjen aktuale të pajisjes për ta dërguar si mesazh mail-i. Do të duhet pak kohë nga nisja e raportit të defekteve në kod. Faleminderit për durimin."</string>
- <!-- no translation found for bugreport_option_interactive_title (8635056131768862479) -->
+ <string name="bugreport_option_interactive_title" msgid="8635056131768862479">"Raport interaktiv"</string>
+ <string name="bugreport_option_interactive_summary" msgid="8180152634022797629">"Përdore këtë në shumicën e rrethanave. Të lejon të gjurmosh progresin e raportit dhe të fusësh më shumë detaje rreth problemit. Mund të fshijë disa seksione që përdoren më pak të cilat kërkojnë shumë kohë për t\'u raportuar."</string>
+ <string name="bugreport_option_full_title" msgid="6354382025840076439">"Raporti i plotë"</string>
+ <!-- no translation found for bugreport_option_full_summary (6687306111256813257) -->
<skip />
- <!-- no translation found for bugreport_option_interactive_summary (8180152634022797629) -->
- <skip />
- <!-- no translation found for bugreport_option_full_title (6354382025840076439) -->
- <skip />
- <!-- no translation found for bugreport_option_full_summary (6440582052207304578) -->
- <skip />
- <!-- no translation found for bugreport_countdown (6878900193900090368) -->
+ <plurals name="bugreport_countdown" formatted="false" msgid="6878900193900090368">
+ <item quantity="other">Marrja e pamjes së ekranit për raportin e defektit në kod në <xliff:g id="NUMBER_1">%d</xliff:g> sekonda.</item>
+ <item quantity="one">Marrja e pamjes së ekranit për raportin e defektit në kod në <xliff:g id="NUMBER_0">%d</xliff:g> sekondë.</item>
+ </plurals>
<string name="global_action_toggle_silent_mode" msgid="8219525344246810925">"Modaliteti \"në heshtje\""</string>
<string name="global_action_silent_mode_on_status" msgid="3289841937003758806">"Zëri është çaktivizuar"</string>
<string name="global_action_silent_mode_off_status" msgid="1506046579177066419">"Zëri është i aktivizuar"</string>
@@ -1049,8 +1049,8 @@
<string name="remote_bugreport_progress_notification_message_can_cancel" msgid="5743435483005099451">"Prek për ta anuluar"</string>
<string name="select_input_method" msgid="8547250819326693584">"Ndërro tastierë"</string>
<string name="configure_input_methods" msgid="4769971288371946846">"Zgjidh tastierat"</string>
- <string name="show_ime" msgid="9157568568695230830">"Shfaq metodën e hyrjes"</string>
- <string name="hardware" msgid="7517821086888990278">"Harduer"</string>
+ <string name="show_ime" msgid="2506087537466597099">"Mbaje në ekran ndërsa tastiera fizike është aktive"</string>
+ <string name="hardware" msgid="194658061510127999">"Shfaq tastierën virtuale"</string>
<string name="select_keyboard_layout_notification_title" msgid="1407367017263030773">"Përzgjidh planin e tastierës"</string>
<string name="select_keyboard_layout_notification_message" msgid="4465907700449257063">"Prek për të përzgjedhur tastierën."</string>
<string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
@@ -1531,4 +1531,10 @@
<string name="user_creation_cannot_add_any_more" msgid="6244197709981359266"><b>"<xliff:g id="APP">%1$s</xliff:g>"</b>" po përpiqet të shtojë një përdorues të ri, por është arritur limiti i përdoruesve."</string>
<string name="user_creation_account_exists" msgid="4880171855014489789"><b>"<xliff:g id="APP">%1$s</xliff:g>"</b>" po provon të shtojë një përdorues të ri, por llogaria "<b>"<xliff:g id="ACCOUNT">%2$s</xliff:g>"</b>" ekziston tashmë në këtë pajisje. Dëshiron të vazhdosh gjithsesi?"</string>
<string name="user_creation_adding" msgid="3206420861363021392"><b>"<xliff:g id="APP">%1$s</xliff:g>"</b>" po provon të shtojë një përdorues të ri për llogarinë "<b>"<xliff:g id="ACCOUNT">%2$s</xliff:g>"</b>". Dëshiron të vazhdosh?"</string>
+ <string name="language_selection_title" msgid="7181332986330337171">"Preferenca për gjuhën"</string>
+ <string name="country_selection_title" msgid="2954859441620215513">"Preferenca e rajonit"</string>
+ <string name="search_language_hint" msgid="7042102592055108574">"Shkruaj emrin e gjuhës"</string>
+ <string name="language_picker_section_suggested" msgid="8414489646861640885">"Sugjeruar"</string>
+ <string name="language_picker_section_all" msgid="3097279199511617537">"Të gjitha gjuhët"</string>
+ <string name="locale_search_menu" msgid="2560710726687249178">"Kërko"</string>
</resources>
diff --git a/core/res/res/values-sr/strings.xml b/core/res/res/values-sr/strings.xml
index 04a170c..fe7b0d7 100644
--- a/core/res/res/values-sr/strings.xml
+++ b/core/res/res/values-sr/strings.xml
@@ -212,15 +212,16 @@
<string name="global_action_bug_report" msgid="7934010578922304799">"Извештај о грешци"</string>
<string name="bugreport_title" msgid="2667494803742548533">"Направи извештај о грешци"</string>
<string name="bugreport_message" msgid="398447048750350456">"Овим ће се прикупити информације о тренутном стању уређаја како би биле послате у поруци е-поште. Од започињања извештаја о грешци до тренутка за његово слање проћи ће неко време; будите стрпљиви."</string>
- <!-- no translation found for bugreport_option_interactive_title (8635056131768862479) -->
+ <string name="bugreport_option_interactive_title" msgid="8635056131768862479">"Интерактив. извештај"</string>
+ <string name="bugreport_option_interactive_summary" msgid="8180152634022797629">"Користите ово у већини случајева. То вам омогућава да пратите напредак извештаја и да уносите додатне детаље о проблему. Вероватно ће изоставити неке мање коришћене одељке за које прављење извештаја дуго траје."</string>
+ <string name="bugreport_option_full_title" msgid="6354382025840076439">"Комплетан извештај"</string>
+ <!-- no translation found for bugreport_option_full_summary (6687306111256813257) -->
<skip />
- <!-- no translation found for bugreport_option_interactive_summary (8180152634022797629) -->
- <skip />
- <!-- no translation found for bugreport_option_full_title (6354382025840076439) -->
- <skip />
- <!-- no translation found for bugreport_option_full_summary (6440582052207304578) -->
- <skip />
- <!-- no translation found for bugreport_countdown (6878900193900090368) -->
+ <plurals name="bugreport_countdown" formatted="false" msgid="6878900193900090368">
+ <item quantity="one">Направићемо снимак екрана ради извештаја о грешци за <xliff:g id="NUMBER_1">%d</xliff:g> секунду.</item>
+ <item quantity="few">Направићемо снимак екрана ради извештаја о грешци за <xliff:g id="NUMBER_1">%d</xliff:g> секунде.</item>
+ <item quantity="other">Направићемо снимак екрана ради извештаја о грешци за <xliff:g id="NUMBER_1">%d</xliff:g> секунди.</item>
+ </plurals>
<string name="global_action_toggle_silent_mode" msgid="8219525344246810925">"Нечујни режим"</string>
<string name="global_action_silent_mode_on_status" msgid="3289841937003758806">"Звук је ИСКЉУЧЕН"</string>
<string name="global_action_silent_mode_off_status" msgid="1506046579177066419">"Звук је УКЉУЧЕН"</string>
@@ -1056,8 +1057,8 @@
<string name="remote_bugreport_progress_notification_message_can_cancel" msgid="5743435483005099451">"Додирните да бисте отказали"</string>
<string name="select_input_method" msgid="8547250819326693584">"Промените тастатуру"</string>
<string name="configure_input_methods" msgid="4769971288371946846">"Изаберите тастатуре"</string>
- <string name="show_ime" msgid="9157568568695230830">"Приказивање метода уноса"</string>
- <string name="hardware" msgid="7517821086888990278">"Хардвер"</string>
+ <string name="show_ime" msgid="2506087537466597099">"Задржи га на екрану док је физичка тастатура активна"</string>
+ <string name="hardware" msgid="194658061510127999">"Прикажи виртуелну тастатуру"</string>
<string name="select_keyboard_layout_notification_title" msgid="1407367017263030773">"Избор распореда тастатуре"</string>
<string name="select_keyboard_layout_notification_message" msgid="4465907700449257063">"Додирните да бисте изабрали распоред тастатуре."</string>
<string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
@@ -1549,4 +1550,10 @@
<string name="user_creation_cannot_add_any_more" msgid="6244197709981359266"><b>"<xliff:g id="APP">%1$s</xliff:g>"</b>" покушава да дода новог корисника, али је ограничење за број корисника достигнуто."</string>
<string name="user_creation_account_exists" msgid="4880171855014489789"><b>"<xliff:g id="APP">%1$s</xliff:g>"</b>" покушава да дода новог корисника, али налог "<b>"<xliff:g id="ACCOUNT">%2$s</xliff:g>"</b>" већ постоји на овом уређају. Желите ли ипак да наставите?"</string>
<string name="user_creation_adding" msgid="3206420861363021392"><b>"<xliff:g id="APP">%1$s</xliff:g>"</b>" покушава да дода новог корисника за налог "<b>"<xliff:g id="ACCOUNT">%2$s</xliff:g>"</b>". Желите ли да наставите?"</string>
+ <string name="language_selection_title" msgid="7181332986330337171">"Подешавање језика"</string>
+ <string name="country_selection_title" msgid="2954859441620215513">"Подешавање региона"</string>
+ <string name="search_language_hint" msgid="7042102592055108574">"Унесите назив језика"</string>
+ <string name="language_picker_section_suggested" msgid="8414489646861640885">"Предложени"</string>
+ <string name="language_picker_section_all" msgid="3097279199511617537">"Сви језици"</string>
+ <string name="locale_search_menu" msgid="2560710726687249178">"Претражи"</string>
</resources>
diff --git a/core/res/res/values-sv/strings.xml b/core/res/res/values-sv/strings.xml
index 346b1234..d80b4c2 100644
--- a/core/res/res/values-sv/strings.xml
+++ b/core/res/res/values-sv/strings.xml
@@ -211,15 +211,15 @@
<string name="global_action_bug_report" msgid="7934010578922304799">"Felrapport"</string>
<string name="bugreport_title" msgid="2667494803742548533">"Skapa felrapport"</string>
<string name="bugreport_message" msgid="398447048750350456">"Nu hämtas information om aktuell status för enheten, som sedan skickas i ett e-postmeddelade. Det tar en liten stund innan felrapporten är färdig och kan skickas, så vi ber dig ha tålamod."</string>
- <!-- no translation found for bugreport_option_interactive_title (8635056131768862479) -->
+ <string name="bugreport_option_interactive_title" msgid="8635056131768862479">"Interaktiv rapport"</string>
+ <string name="bugreport_option_interactive_summary" msgid="8180152634022797629">"Bör användas i de flesta fall. Då kan du spåra rapportförloppet och ange mer information om problemet. En del mindre använda avsnitt, som det tar lång tid att rapportera om, kan uteslutas."</string>
+ <string name="bugreport_option_full_title" msgid="6354382025840076439">"Fullständig rapport"</string>
+ <!-- no translation found for bugreport_option_full_summary (6687306111256813257) -->
<skip />
- <!-- no translation found for bugreport_option_interactive_summary (8180152634022797629) -->
- <skip />
- <!-- no translation found for bugreport_option_full_title (6354382025840076439) -->
- <skip />
- <!-- no translation found for bugreport_option_full_summary (6440582052207304578) -->
- <skip />
- <!-- no translation found for bugreport_countdown (6878900193900090368) -->
+ <plurals name="bugreport_countdown" formatted="false" msgid="6878900193900090368">
+ <item quantity="other">Tar en skärmdump till felrapporten om <xliff:g id="NUMBER_1">%d</xliff:g> sekunder.</item>
+ <item quantity="one">Tar en skärmdump till felrapporten om <xliff:g id="NUMBER_0">%d</xliff:g> sekund.</item>
+ </plurals>
<string name="global_action_toggle_silent_mode" msgid="8219525344246810925">"Tyst läge"</string>
<string name="global_action_silent_mode_on_status" msgid="3289841937003758806">"Ljudet är AV"</string>
<string name="global_action_silent_mode_off_status" msgid="1506046579177066419">"Ljudet är PÅ"</string>
@@ -1049,8 +1049,8 @@
<string name="remote_bugreport_progress_notification_message_can_cancel" msgid="5743435483005099451">"Tryck här om du vill avbryta"</string>
<string name="select_input_method" msgid="8547250819326693584">"Byt tangentbord"</string>
<string name="configure_input_methods" msgid="4769971288371946846">"Välj tangentbord"</string>
- <string name="show_ime" msgid="9157568568695230830">"Visa inmatningsmetod"</string>
- <string name="hardware" msgid="7517821086888990278">"Maskinvara"</string>
+ <string name="show_ime" msgid="2506087537466597099">"Ha kvar den på skärmen när det fysiska tangentbordet används"</string>
+ <string name="hardware" msgid="194658061510127999">"Visa virtuellt tangentbord"</string>
<string name="select_keyboard_layout_notification_title" msgid="1407367017263030773">"Välj en tangentbordslayout"</string>
<string name="select_keyboard_layout_notification_message" msgid="4465907700449257063">"Välj en tangentbordslayout genom att trycka."</string>
<string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
@@ -1531,4 +1531,10 @@
<string name="user_creation_cannot_add_any_more" msgid="6244197709981359266"><b>"<xliff:g id="APP">%1$s</xliff:g>"</b>" försöker lägga till en ny användare, men gränsen för antal användare har uppnåtts."</string>
<string name="user_creation_account_exists" msgid="4880171855014489789"><b>"<xliff:g id="APP">%1$s</xliff:g>"</b>" försöker lägga till en ny användare, men kontot "<b>"<xliff:g id="ACCOUNT">%2$s</xliff:g>"</b>" finns redan på den här enheten. Vill du fortsätta ändå?"</string>
<string name="user_creation_adding" msgid="3206420861363021392"><b>"<xliff:g id="APP">%1$s</xliff:g>"</b>" försöker lägga till en ny användare för kontot "<b>"<xliff:g id="ACCOUNT">%2$s</xliff:g>"</b>". Vill du fortsätta?"</string>
+ <string name="language_selection_title" msgid="7181332986330337171">"Språkinställning"</string>
+ <string name="country_selection_title" msgid="2954859441620215513">"Regionsinställningar"</string>
+ <string name="search_language_hint" msgid="7042102592055108574">"Ange språket"</string>
+ <string name="language_picker_section_suggested" msgid="8414489646861640885">"Förslag"</string>
+ <string name="language_picker_section_all" msgid="3097279199511617537">"Alla språk"</string>
+ <string name="locale_search_menu" msgid="2560710726687249178">"Söka"</string>
</resources>
diff --git a/core/res/res/values-sw/strings.xml b/core/res/res/values-sw/strings.xml
index 714827c..5ae50b8 100644
--- a/core/res/res/values-sw/strings.xml
+++ b/core/res/res/values-sw/strings.xml
@@ -213,15 +213,15 @@
<string name="global_action_bug_report" msgid="7934010578922304799">"Ripoti ya hitilafu"</string>
<string name="bugreport_title" msgid="2667494803742548533">"Chukua ripoti ya hitilafu"</string>
<string name="bugreport_message" msgid="398447048750350456">"Hii itakusanya maelezo kuhusu hali ya kifaa chako kwa sasa, na itume kama barua pepe. Itachukua muda mfupi tangu ripoti ya hitilafu ianze kuzalishwa hadi iwe tayari kutumwa; vumilia."</string>
- <!-- no translation found for bugreport_option_interactive_title (8635056131768862479) -->
+ <string name="bugreport_option_interactive_title" msgid="8635056131768862479">"Ripoti ya kushirikiana"</string>
+ <string name="bugreport_option_interactive_summary" msgid="8180152634022797629">"Itumie katika hali nyingi. Inakuruhusu kufuatilia maendeleo ya ripoti na kuweka maelezo zaidi kuhusu tatizo. Huenda ikaondoa sehemu ambazo hazitumiki sana, ambazo huchukua muda mrefu kuripoti."</string>
+ <string name="bugreport_option_full_title" msgid="6354382025840076439">"Ripoti kamili"</string>
+ <!-- no translation found for bugreport_option_full_summary (6687306111256813257) -->
<skip />
- <!-- no translation found for bugreport_option_interactive_summary (8180152634022797629) -->
- <skip />
- <!-- no translation found for bugreport_option_full_title (6354382025840076439) -->
- <skip />
- <!-- no translation found for bugreport_option_full_summary (6440582052207304578) -->
- <skip />
- <!-- no translation found for bugreport_countdown (6878900193900090368) -->
+ <plurals name="bugreport_countdown" formatted="false" msgid="6878900193900090368">
+ <item quantity="other">Inapiga picha ya skrini ili iripoti hitilafu baada ya sekunde <xliff:g id="NUMBER_1">%d</xliff:g>.</item>
+ <item quantity="one">Inapiga picha ya skrini ili iripoti hitilafu baada ya sekunde <xliff:g id="NUMBER_0">%d</xliff:g>.</item>
+ </plurals>
<string name="global_action_toggle_silent_mode" msgid="8219525344246810925">"Mtindo wa kimya"</string>
<string name="global_action_silent_mode_on_status" msgid="3289841937003758806">"Sauti Imezimwa"</string>
<string name="global_action_silent_mode_off_status" msgid="1506046579177066419">"Sauti imewashwa"</string>
@@ -1051,8 +1051,8 @@
<string name="remote_bugreport_progress_notification_message_can_cancel" msgid="5743435483005099451">"Gusa ili ufute"</string>
<string name="select_input_method" msgid="8547250819326693584">"Badilisha kibodi"</string>
<string name="configure_input_methods" msgid="4769971288371946846">"Chagua kibodi"</string>
- <string name="show_ime" msgid="9157568568695230830">"Onyesha mbinu ya kuingiza"</string>
- <string name="hardware" msgid="7517821086888990278">"Maunzi"</string>
+ <string name="show_ime" msgid="2506087537466597099">"Iweke kwenye skrini wakati kibodi inapotumika"</string>
+ <string name="hardware" msgid="194658061510127999">"Onyesha kibodi pepe"</string>
<string name="select_keyboard_layout_notification_title" msgid="1407367017263030773">"Teua mpangilio wa kibodi"</string>
<string name="select_keyboard_layout_notification_message" msgid="4465907700449257063">"Gusa ili kuchagua mpangilio wa kibodi."</string>
<string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
@@ -1533,4 +1533,10 @@
<string name="user_creation_cannot_add_any_more" msgid="6244197709981359266"><b>"<xliff:g id="APP">%1$s</xliff:g>"</b>" inajaribu kuongeza mtumiaji mpya, lakini idadi ya juu ya watumiaji imefikiwa."</string>
<string name="user_creation_account_exists" msgid="4880171855014489789"><b>"<xliff:g id="APP">%1$s</xliff:g>"</b>" inajaribu kuongeza mtumiaji mpya, lakini akaunti ya "<b>"<xliff:g id="ACCOUNT">%2$s</xliff:g>"</b>" tayari ipo kwenye kifaa hiki. Ungependa kundelea?"</string>
<string name="user_creation_adding" msgid="3206420861363021392"><b>"<xliff:g id="APP">%1$s</xliff:g>"</b>" inajaribu kuongeza mtumiaji mpya kwenye akaunti ya "<b>"<xliff:g id="ACCOUNT">%2$s</xliff:g>"</b>". Ungependa kuendelea?"</string>
+ <string name="language_selection_title" msgid="7181332986330337171">"Lugha ninayopendelea"</string>
+ <string name="country_selection_title" msgid="2954859441620215513">"Mapendeleo ya eneo"</string>
+ <string name="search_language_hint" msgid="7042102592055108574">"Weka jina la lugha"</string>
+ <string name="language_picker_section_suggested" msgid="8414489646861640885">"Inayopendekezwa"</string>
+ <string name="language_picker_section_all" msgid="3097279199511617537">"Lugha zote"</string>
+ <string name="locale_search_menu" msgid="2560710726687249178">"Tafuta"</string>
</resources>
diff --git a/core/res/res/values-ta-rIN/strings.xml b/core/res/res/values-ta-rIN/strings.xml
index 38c2e26..4671344 100644
--- a/core/res/res/values-ta-rIN/strings.xml
+++ b/core/res/res/values-ta-rIN/strings.xml
@@ -211,15 +211,15 @@
<string name="global_action_bug_report" msgid="7934010578922304799">"பிழை அறிக்கை"</string>
<string name="bugreport_title" msgid="2667494803742548533">"பிழை அறிக்கையை எடு"</string>
<string name="bugreport_message" msgid="398447048750350456">"உங்கள் நடப்புச் சாதன நிலையை மின்னஞ்சல் செய்தியாக அனுப்ப, அது குறித்த தகவலை இது சேகரிக்கும். பிழை அறிக்கையைத் தொடங்குவதில் இருந்து, அது அனுப்புவதற்குத் தயாராகும் வரை, இதற்குச் சிறிது நேரம் ஆகும்; பொறுமையாகக் காத்திருக்கவும்."</string>
- <!-- no translation found for bugreport_option_interactive_title (8635056131768862479) -->
+ <string name="bugreport_option_interactive_title" msgid="8635056131768862479">"ஊடாடத்தக்க அறிக்கை"</string>
+ <string name="bugreport_option_interactive_summary" msgid="8180152634022797629">"பெரும்பாலான சூழ்நிலைகளில் இதைப் பயன்படுத்தவும். இது அறிக்கையின் நிலையைக் கண்காணிக்கவும், சிக்கலைப் பற்றிய மேலும் விவரங்களை உள்ளிடவும் அனுமதிக்கும். அறிக்கையிட நீண்ட நேரம் எடுக்கக்கூடிய குறைவாகப் பயன்படுத்தப்படும் பிரிவுகள் சிலவற்றை இது தவிர்க்கக்கூடும்."</string>
+ <string name="bugreport_option_full_title" msgid="6354382025840076439">"முழு அறிக்கை"</string>
+ <!-- no translation found for bugreport_option_full_summary (6687306111256813257) -->
<skip />
- <!-- no translation found for bugreport_option_interactive_summary (8180152634022797629) -->
- <skip />
- <!-- no translation found for bugreport_option_full_title (6354382025840076439) -->
- <skip />
- <!-- no translation found for bugreport_option_full_summary (6440582052207304578) -->
- <skip />
- <!-- no translation found for bugreport_countdown (6878900193900090368) -->
+ <plurals name="bugreport_countdown" formatted="false" msgid="6878900193900090368">
+ <item quantity="other"><xliff:g id="NUMBER_1">%d</xliff:g> வினாடிகளில் பிழை அறிக்கைக்கான ஸ்கிரீன் ஷாட் எடுக்கப்படும்.</item>
+ <item quantity="one"><xliff:g id="NUMBER_0">%d</xliff:g> வினாடியில் பிழை அறிக்கைக்கான ஸ்கிரீன் ஷாட் எடுக்கப்படும்.</item>
+ </plurals>
<string name="global_action_toggle_silent_mode" msgid="8219525344246810925">"நிசப்த பயன்முறை"</string>
<string name="global_action_silent_mode_on_status" msgid="3289841937003758806">"ஒலி முடக்கத்தில் உள்ளது"</string>
<string name="global_action_silent_mode_off_status" msgid="1506046579177066419">"ஒலி இயக்கத்தில் உள்ளது"</string>
@@ -1044,13 +1044,13 @@
<string name="share_remote_bugreport_notification_title" msgid="3116061729914615290">"பிழை அறிக்கையை நிர்வாகியுடன் பகிரவா?"</string>
<string name="share_remote_bugreport_notification_message" msgid="1310517845557771773">"பிழைகாண்பதற்கு உதவ, உங்கள் ஐடி நிர்வாகி பிழை அறிக்கையைக் கோரியுள்ளார்"</string>
<string name="share_remote_bugreport_notification_accept" msgid="8203856129078669677">"சரி"</string>
- <string name="share_remote_bugreport_notification_decline" msgid="6337969352057443969">"நிராகரி"</string>
+ <string name="share_remote_bugreport_notification_decline" msgid="6337969352057443969">"வேண்டாம்"</string>
<string name="remote_bugreport_progress_notification_title" msgid="2785600634417078622">"பிழை அறிக்கையை எடுக்கிறது…"</string>
<string name="remote_bugreport_progress_notification_message_can_cancel" msgid="5743435483005099451">"ரத்துசெய்ய, தொடவும்"</string>
<string name="select_input_method" msgid="8547250819326693584">"விசைப்பலகையை மாற்று"</string>
<string name="configure_input_methods" msgid="4769971288371946846">"விசைப்பலகைகளைத் தேர்வுசெய்க"</string>
- <string name="show_ime" msgid="9157568568695230830">"உள்ளீட்டு முறையைக் காட்டு"</string>
- <string name="hardware" msgid="7517821086888990278">"வன்பொருள்"</string>
+ <string name="show_ime" msgid="2506087537466597099">"கைமுறை விசைப்பலகை இயக்கத்தில் இருக்கும் போது IMEஐ திரையில் வைத்திரு"</string>
+ <string name="hardware" msgid="194658061510127999">"விர்ச்சுவல் விசைப்பலகையை காட்டு"</string>
<string name="select_keyboard_layout_notification_title" msgid="1407367017263030773">"விசைப்பலகைத் தளவமைப்பைத் தேர்ந்தெடுக்கவும்"</string>
<string name="select_keyboard_layout_notification_message" msgid="4465907700449257063">"விசைப்பலகைத் தளவமைப்பைத் தேர்ந்தெடுக்க தொடவும்."</string>
<string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
@@ -1531,4 +1531,10 @@
<string name="user_creation_cannot_add_any_more" msgid="6244197709981359266"><b>"<xliff:g id="APP">%1$s</xliff:g>"</b>" பயன்பாடு புதிய பயனரைச் சேர்க்க முயல்கிறது, ஆனால் பயனருக்கான வரம்பு முடிந்துவிட்டது."</string>
<string name="user_creation_account_exists" msgid="4880171855014489789"><b>"<xliff:g id="APP">%1$s</xliff:g>"</b>" பயன்பாடு புதிய பயனரைச் சேர்க்க முயல்கிறது. ஆனால் "<b>"<xliff:g id="ACCOUNT">%2$s</xliff:g>"</b>" கணக்கு ஏற்கனவே இந்தச் சாதனத்தில் உள்ளது. தொடரவா?"</string>
<string name="user_creation_adding" msgid="3206420861363021392"><b>"<xliff:g id="APP">%1$s</xliff:g>"</b>" பயன்பாடு "<b>"<xliff:g id="ACCOUNT">%2$s</xliff:g>"</b>" கணக்கிற்குப் புதிய பயனரைச் சேர்க்க முயல்கிறது. தொடரவா?"</string>
+ <string name="language_selection_title" msgid="7181332986330337171">"மொழி விருப்பம்"</string>
+ <string name="country_selection_title" msgid="2954859441620215513">"மண்டல விருப்பம்"</string>
+ <string name="search_language_hint" msgid="7042102592055108574">"மொழி பெயரை உள்ளிடுக"</string>
+ <string name="language_picker_section_suggested" msgid="8414489646861640885">"பரிந்துரைகள்"</string>
+ <string name="language_picker_section_all" msgid="3097279199511617537">"எல்லா மொழிகளும்"</string>
+ <string name="locale_search_menu" msgid="2560710726687249178">"தேடு"</string>
</resources>
diff --git a/core/res/res/values-te-rIN/strings.xml b/core/res/res/values-te-rIN/strings.xml
index 14cc2c1..8535b9c 100644
--- a/core/res/res/values-te-rIN/strings.xml
+++ b/core/res/res/values-te-rIN/strings.xml
@@ -211,15 +211,15 @@
<string name="global_action_bug_report" msgid="7934010578922304799">"బగ్ నివేదిక"</string>
<string name="bugreport_title" msgid="2667494803742548533">"బగ్ నివేదికను సిద్ధం చేయి"</string>
<string name="bugreport_message" msgid="398447048750350456">"ఇది ఇ-మెయిల్ సందేశం రూపంలో పంపడానికి మీ ప్రస్తుత పరికర స్థితి గురించి సమాచారాన్ని సేకరిస్తుంది. బగ్ నివేదికను ప్రారంభించడం మొదలుకొని పంపడానికి సిద్ధం చేసే వరకు ఇందుకు కొంత సమయం పడుతుంది; దయచేసి ఓపిక పట్టండి."</string>
- <!-- no translation found for bugreport_option_interactive_title (8635056131768862479) -->
+ <string name="bugreport_option_interactive_title" msgid="8635056131768862479">"ప్రభావశీల నివేదిక"</string>
+ <string name="bugreport_option_interactive_summary" msgid="8180152634022797629">"చాలా సందర్భాల్లో ఇది ఉపయోగించబడుతుంది. ఇది మిమ్మల్ని నివేదిక ప్రోగ్రెస్ ట్రాక్ చేయడానికి మరియు సమస్య గురించి మరిన్ని వివరాలను నమోదు చేయడానికి అనుమతిస్తుంది. ఇది నివేదించడానికి అధిక సమయం పట్టే తక్కువగా వినియోగించే విభాగాలను విడిచిపెట్టవచ్చు."</string>
+ <string name="bugreport_option_full_title" msgid="6354382025840076439">"పూర్తి నివేదిక"</string>
+ <!-- no translation found for bugreport_option_full_summary (6687306111256813257) -->
<skip />
- <!-- no translation found for bugreport_option_interactive_summary (8180152634022797629) -->
- <skip />
- <!-- no translation found for bugreport_option_full_title (6354382025840076439) -->
- <skip />
- <!-- no translation found for bugreport_option_full_summary (6440582052207304578) -->
- <skip />
- <!-- no translation found for bugreport_countdown (6878900193900090368) -->
+ <plurals name="bugreport_countdown" formatted="false" msgid="6878900193900090368">
+ <item quantity="other">బగ్ నివేదిక కోసం <xliff:g id="NUMBER_1">%d</xliff:g> సెకన్లలో స్క్రీన్షాట్ తీయబోతోంది.</item>
+ <item quantity="one">బగ్ నివేదిక కోసం <xliff:g id="NUMBER_0">%d</xliff:g> సెకనులో స్క్రీన్షాట్ తీయబోతోంది.</item>
+ </plurals>
<string name="global_action_toggle_silent_mode" msgid="8219525344246810925">"నిశ్శబ్ద మోడ్"</string>
<string name="global_action_silent_mode_on_status" msgid="3289841937003758806">"ధ్వని ఆఫ్లో ఉంది"</string>
<string name="global_action_silent_mode_off_status" msgid="1506046579177066419">"ధ్వని ఆన్లో ఉంది"</string>
@@ -1049,8 +1049,8 @@
<string name="remote_bugreport_progress_notification_message_can_cancel" msgid="5743435483005099451">"రద్దు చేయడానికి తాకండి"</string>
<string name="select_input_method" msgid="8547250819326693584">"కీబోర్డ్ను మార్చు"</string>
<string name="configure_input_methods" msgid="4769971288371946846">"కీబోర్డ్లను ఎంచుకోండి"</string>
- <string name="show_ime" msgid="9157568568695230830">"ఇన్పుట్ పద్ధతిని చూపు"</string>
- <string name="hardware" msgid="7517821086888990278">"హార్డ్వేర్"</string>
+ <string name="show_ime" msgid="2506087537466597099">"దీన్ని భౌతిక కీబోర్డ్ సక్రియంగా ఉన్నప్పుడు స్క్రీన్పై ఉంచుతుంది"</string>
+ <string name="hardware" msgid="194658061510127999">"వర్చువల్ కీబోర్డ్ను చూపు"</string>
<string name="select_keyboard_layout_notification_title" msgid="1407367017263030773">"కీబోర్డ్ లేఅవుట్ను ఎంచుకోండి"</string>
<string name="select_keyboard_layout_notification_message" msgid="4465907700449257063">"కీబోర్డ్ లేఅవుట్ను ఎంచుకోవడానికి తాకండి."</string>
<string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
@@ -1531,4 +1531,10 @@
<string name="user_creation_cannot_add_any_more" msgid="6244197709981359266"><b>"<xliff:g id="APP">%1$s</xliff:g>"</b>" కొత్త వినియోగదారుని జోడించడానికి ప్రయత్నిస్తోంది, కానీ వినియోగదారు పరిమితి చేరుకుంది."</string>
<string name="user_creation_account_exists" msgid="4880171855014489789"><b>"<xliff:g id="APP">%1$s</xliff:g>"</b>" కొత్త వినియోగదారుని జోడించడానికి ప్రయత్నిస్తోంది, కానీ ఖాతా "<b>"<xliff:g id="ACCOUNT">%2$s</xliff:g>"</b>" ఇప్పటికే ఈ పరికరంలో ఉంది. ఏదేమైనా కొనసాగించాలా?"</string>
<string name="user_creation_adding" msgid="3206420861363021392"><b>"<xliff:g id="APP">%1$s</xliff:g>"</b>" ఖాతా "<b>"<xliff:g id="ACCOUNT">%2$s</xliff:g>"</b>" కోసం కొత్త వినియోగదారుని జోడించడానికి ప్రయత్నిస్తోంది. కొనసాగించాలా?"</string>
+ <string name="language_selection_title" msgid="7181332986330337171">"భాష ప్రాధాన్యత"</string>
+ <string name="country_selection_title" msgid="2954859441620215513">"ప్రాంతం ప్రాధాన్యత"</string>
+ <string name="search_language_hint" msgid="7042102592055108574">"భాష పేరును టైప్ చేయండి"</string>
+ <string name="language_picker_section_suggested" msgid="8414489646861640885">"సూచించినవి"</string>
+ <string name="language_picker_section_all" msgid="3097279199511617537">"అన్ని భాషలు"</string>
+ <string name="locale_search_menu" msgid="2560710726687249178">"శోధించు"</string>
</resources>
diff --git a/core/res/res/values-th/strings.xml b/core/res/res/values-th/strings.xml
index 59f6ffa..a759145 100644
--- a/core/res/res/values-th/strings.xml
+++ b/core/res/res/values-th/strings.xml
@@ -211,15 +211,15 @@
<string name="global_action_bug_report" msgid="7934010578922304799">"รายงานข้อบกพร่อง"</string>
<string name="bugreport_title" msgid="2667494803742548533">"ใช้รายงานข้อบกพร่อง"</string>
<string name="bugreport_message" msgid="398447048750350456">"การดำเนินการนี้จะรวบรวมข้อมูลเกี่ยวกับสถานะปัจจุบันของอุปกรณ์ของคุณ โดยจะส่งไปในรูปแบบข้อความอีเมล อาจใช้เวลาสักครู่ตั้งแต่เริ่มการสร้างรายงานข้อบกพร่องจนกระทั่งเสร็จสมบูรณ์ โปรดอดทนรอ"</string>
- <!-- no translation found for bugreport_option_interactive_title (8635056131768862479) -->
+ <string name="bugreport_option_interactive_title" msgid="8635056131768862479">"รายงานแบบอินเทอร์แอกทีฟ"</string>
+ <string name="bugreport_option_interactive_summary" msgid="8180152634022797629">"ใช้ตัวเลือกนี้ได้เกือบทุกสถานการณ์ โดยจะอนุญาตให้คุณติดตามความคืบหน้าของรายงานและป้อนรายละเอียดเพิ่มเติมของปัญหา หัวข้อที่ใช้งานน้อยแต่ใช้เวลานานในการรายงานอาจถูกข้ามไป"</string>
+ <string name="bugreport_option_full_title" msgid="6354382025840076439">"รายงานฉบับเต็ม"</string>
+ <!-- no translation found for bugreport_option_full_summary (6687306111256813257) -->
<skip />
- <!-- no translation found for bugreport_option_interactive_summary (8180152634022797629) -->
- <skip />
- <!-- no translation found for bugreport_option_full_title (6354382025840076439) -->
- <skip />
- <!-- no translation found for bugreport_option_full_summary (6440582052207304578) -->
- <skip />
- <!-- no translation found for bugreport_countdown (6878900193900090368) -->
+ <plurals name="bugreport_countdown" formatted="false" msgid="6878900193900090368">
+ <item quantity="other">จะจับภาพหน้าจอสำหรับรายงานข้อบกพร่องใน <xliff:g id="NUMBER_1">%d</xliff:g> วินาที</item>
+ <item quantity="one">จะจับภาพหน้าจอสำหรับรายงานข้อบกพร่องใน <xliff:g id="NUMBER_0">%d</xliff:g> วินาที</item>
+ </plurals>
<string name="global_action_toggle_silent_mode" msgid="8219525344246810925">"โหมดปิดเสียง"</string>
<string name="global_action_silent_mode_on_status" msgid="3289841937003758806">"ปิดเสียงไว้"</string>
<string name="global_action_silent_mode_off_status" msgid="1506046579177066419">"เปิดเสียงแล้ว"</string>
@@ -1049,8 +1049,8 @@
<string name="remote_bugreport_progress_notification_message_can_cancel" msgid="5743435483005099451">"แตะเพื่อยกเลิก"</string>
<string name="select_input_method" msgid="8547250819326693584">"เปลี่ยนแป้นพิมพ์"</string>
<string name="configure_input_methods" msgid="4769971288371946846">"เลือกแป้นพิมพ์"</string>
- <string name="show_ime" msgid="9157568568695230830">"แสดงวิธีการป้อนข้อมูล"</string>
- <string name="hardware" msgid="7517821086888990278">"ฮาร์ดแวร์"</string>
+ <string name="show_ime" msgid="2506087537466597099">"เปิดทิ้งไว้บนหน้าจอในระหว่างใช้งานแป้นพิมพ์จริง"</string>
+ <string name="hardware" msgid="194658061510127999">"แสดงแป้นพิมพ์เสมือน"</string>
<string name="select_keyboard_layout_notification_title" msgid="1407367017263030773">"เลือกรูปแบบแป้นพิมพ์"</string>
<string name="select_keyboard_layout_notification_message" msgid="4465907700449257063">"แตะเพื่อเลือกรูปแบบแป้นพิมพ์"</string>
<string name="fast_scroll_alphabet" msgid="5433275485499039199">" กขฃคฅฆงจฉชซฌญฎฏฐฑฒณดตถทธนบปผฝพฟภมยรลวศษสหฬอฮ"</string>
@@ -1531,4 +1531,10 @@
<string name="user_creation_cannot_add_any_more" msgid="6244197709981359266"><b>"<xliff:g id="APP">%1$s</xliff:g>"</b>" กำลังพยายามเพิ่มผู้ใช้ใหม่ แต่ถึงขีดจำกัดของผู้ใช้แล้ว"</string>
<string name="user_creation_account_exists" msgid="4880171855014489789"><b>"<xliff:g id="APP">%1$s</xliff:g>"</b>" กำลังพยายามเพิ่มผู้ใช้ใหม่ แต่มีบัญชี "<b>"<xliff:g id="ACCOUNT">%2$s</xliff:g>"</b>" อยู่แล้วบนอุปกรณ์เครื่องนี้ ดำเนินการต่อไหม"</string>
<string name="user_creation_adding" msgid="3206420861363021392"><b>"<xliff:g id="APP">%1$s</xliff:g>"</b>" กำลังพยายามเพิ่มผู้ใช้ใหม่สำหรับบัญชี "<b>"<xliff:g id="ACCOUNT">%2$s</xliff:g>"</b>" ดำเนินการต่อไหม"</string>
+ <string name="language_selection_title" msgid="7181332986330337171">"ค่ากำหนดภาษา"</string>
+ <string name="country_selection_title" msgid="2954859441620215513">"ค่ากำหนดภูมิภาค"</string>
+ <string name="search_language_hint" msgid="7042102592055108574">"พิมพ์ชื่อภาษา"</string>
+ <string name="language_picker_section_suggested" msgid="8414489646861640885">"แนะนำ"</string>
+ <string name="language_picker_section_all" msgid="3097279199511617537">"ทุกภาษา"</string>
+ <string name="locale_search_menu" msgid="2560710726687249178">"ค้นหา"</string>
</resources>
diff --git a/core/res/res/values-tl/strings.xml b/core/res/res/values-tl/strings.xml
index c6e643b..b5e1de8 100644
--- a/core/res/res/values-tl/strings.xml
+++ b/core/res/res/values-tl/strings.xml
@@ -211,15 +211,15 @@
<string name="global_action_bug_report" msgid="7934010578922304799">"Ulat sa bug"</string>
<string name="bugreport_title" msgid="2667494803742548533">"Kunin ang ulat sa bug"</string>
<string name="bugreport_message" msgid="398447048750350456">"Mangongolekta ito ng impormasyon tungkol sa kasalukuyang katayuan ng iyong device, na ipapadala bilang mensaheng e-mail. Gugugol ito ng kaunting oras mula sa pagsisimula ng ulat sa bug hanggang sa handa na itong maipadala; mangyaring magpasensya."</string>
- <!-- no translation found for bugreport_option_interactive_title (8635056131768862479) -->
+ <string name="bugreport_option_interactive_title" msgid="8635056131768862479">"Interactive na ulat"</string>
+ <string name="bugreport_option_interactive_summary" msgid="8180152634022797629">"Gamitin ito sa karamihan ng sitwasyon. Nagbibigay-daan ito sa iyo na subaybayan ang pag-usad ng ulat at magbigay ng higit pang mga detalye tungkol sa problema. Maaari itong mag-alis ng ilan sa mga hindi masyadong ginagamit na seksyon na nangangailangan ng mahabang panahon upang iulat."</string>
+ <string name="bugreport_option_full_title" msgid="6354382025840076439">"Buong ulat"</string>
+ <!-- no translation found for bugreport_option_full_summary (6687306111256813257) -->
<skip />
- <!-- no translation found for bugreport_option_interactive_summary (8180152634022797629) -->
- <skip />
- <!-- no translation found for bugreport_option_full_title (6354382025840076439) -->
- <skip />
- <!-- no translation found for bugreport_option_full_summary (6440582052207304578) -->
- <skip />
- <!-- no translation found for bugreport_countdown (6878900193900090368) -->
+ <plurals name="bugreport_countdown" formatted="false" msgid="6878900193900090368">
+ <item quantity="one">Kukuha ng screenshot para sa ulat ng bug sa loob ng <xliff:g id="NUMBER_1">%d</xliff:g> segundo.</item>
+ <item quantity="other">Kukuha ng screenshot para sa ulat ng bug sa loob ng <xliff:g id="NUMBER_1">%d</xliff:g> na segundo.</item>
+ </plurals>
<string name="global_action_toggle_silent_mode" msgid="8219525344246810925">"Silent mode"</string>
<string name="global_action_silent_mode_on_status" msgid="3289841937003758806">"Naka-OFF ang tunog"</string>
<string name="global_action_silent_mode_off_status" msgid="1506046579177066419">"Naka-ON ang sound"</string>
@@ -1049,8 +1049,8 @@
<string name="remote_bugreport_progress_notification_message_can_cancel" msgid="5743435483005099451">"Pindutin upang kanselahin"</string>
<string name="select_input_method" msgid="8547250819326693584">"Baguhin ang keyboard"</string>
<string name="configure_input_methods" msgid="4769971288371946846">"Pumili ng mga keyboard"</string>
- <string name="show_ime" msgid="9157568568695230830">"Ipakita ang pamamaraan ng pag-input"</string>
- <string name="hardware" msgid="7517821086888990278">"Hardware"</string>
+ <string name="show_ime" msgid="2506087537466597099">"Panatilihin ito sa screen habang aktibo ang pisikal na keyboard"</string>
+ <string name="hardware" msgid="194658061510127999">"Ipakita ang virtual keyboard"</string>
<string name="select_keyboard_layout_notification_title" msgid="1407367017263030773">"Pumili ng layout ng keyboard"</string>
<string name="select_keyboard_layout_notification_message" msgid="4465907700449257063">"Pindutin upang pumili ng layout ng keyboard."</string>
<string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
@@ -1531,4 +1531,10 @@
<string name="user_creation_cannot_add_any_more" msgid="6244197709981359266">"Sinusubukan ng "<b>"<xliff:g id="APP">%1$s</xliff:g>"</b>" na magdagdag ng bagong user, ngunit naabot na ang limitasyon sa user."</string>
<string name="user_creation_account_exists" msgid="4880171855014489789">"Sinusubukan ng "<b>"<xliff:g id="APP">%1$s</xliff:g>"</b>" na magdagdag ng bagong user, ngunit nasa device na ito na ang account na "<b>"<xliff:g id="ACCOUNT">%2$s</xliff:g>"</b>". Magpatuloy pa rin?"</string>
<string name="user_creation_adding" msgid="3206420861363021392">"Sinusubukan ng "<b>"<xliff:g id="APP">%1$s</xliff:g>"</b>" na magdagdag ng bagong user para sa account na "<b>"<xliff:g id="ACCOUNT">%2$s</xliff:g>"</b>". Magpatuloy?"</string>
+ <string name="language_selection_title" msgid="7181332986330337171">"Kagustuhan sa wika"</string>
+ <string name="country_selection_title" msgid="2954859441620215513">"Kagustuhan sa rehiyon"</string>
+ <string name="search_language_hint" msgid="7042102592055108574">"I-type ang wika"</string>
+ <string name="language_picker_section_suggested" msgid="8414489646861640885">"Iminumungkahi"</string>
+ <string name="language_picker_section_all" msgid="3097279199511617537">"Lahat ng wika"</string>
+ <string name="locale_search_menu" msgid="2560710726687249178">"Maghanap"</string>
</resources>
diff --git a/core/res/res/values-tr/strings.xml b/core/res/res/values-tr/strings.xml
index 3603952..79a5c54 100644
--- a/core/res/res/values-tr/strings.xml
+++ b/core/res/res/values-tr/strings.xml
@@ -211,15 +211,15 @@
<string name="global_action_bug_report" msgid="7934010578922304799">"Hata raporu"</string>
<string name="bugreport_title" msgid="2667494803742548533">"Hata raporu al"</string>
<string name="bugreport_message" msgid="398447048750350456">"Bu rapor, e-posta iletisi olarak göndermek üzere cihazınızın şu anki durumuyla ilgili bilgi toplar. Hata raporu başlatıldıktan sonra hazır olması biraz zaman alabilir, lütfen sabırlı olun."</string>
- <!-- no translation found for bugreport_option_interactive_title (8635056131768862479) -->
+ <string name="bugreport_option_interactive_title" msgid="8635056131768862479">"Etkileşimli rapor"</string>
+ <string name="bugreport_option_interactive_summary" msgid="8180152634022797629">"Çoğu durumda bunu kullanın. Bu seçenek, raporun ilerleme durumunu takip etmenize ve sorunla ilgili daha fazla ayrıntı girmenize olanak sağlar. Rapor edilmesi uzun süren ve az kullanılan bazı bölümleri yok sayabilir."</string>
+ <string name="bugreport_option_full_title" msgid="6354382025840076439">"Tam rapor"</string>
+ <!-- no translation found for bugreport_option_full_summary (6687306111256813257) -->
<skip />
- <!-- no translation found for bugreport_option_interactive_summary (8180152634022797629) -->
- <skip />
- <!-- no translation found for bugreport_option_full_title (6354382025840076439) -->
- <skip />
- <!-- no translation found for bugreport_option_full_summary (6440582052207304578) -->
- <skip />
- <!-- no translation found for bugreport_countdown (6878900193900090368) -->
+ <plurals name="bugreport_countdown" formatted="false" msgid="6878900193900090368">
+ <item quantity="other"><xliff:g id="NUMBER_1">%d</xliff:g> saniye içinde hata raporu ekran görüntüsü alınıyor.</item>
+ <item quantity="one">Hata raporu ekran görüntüsü <xliff:g id="NUMBER_0">%d</xliff:g> saniye içinde alınacak.</item>
+ </plurals>
<string name="global_action_toggle_silent_mode" msgid="8219525344246810925">"Sessiz mod"</string>
<string name="global_action_silent_mode_on_status" msgid="3289841937003758806">"Ses KAPALI"</string>
<string name="global_action_silent_mode_off_status" msgid="1506046579177066419">"Ses AÇIK"</string>
@@ -1049,8 +1049,8 @@
<string name="remote_bugreport_progress_notification_message_can_cancel" msgid="5743435483005099451">"İptal etmek için dokunun"</string>
<string name="select_input_method" msgid="8547250819326693584">"Klavyeyi değiştir"</string>
<string name="configure_input_methods" msgid="4769971288371946846">"Klavyeyi seç"</string>
- <string name="show_ime" msgid="9157568568695230830">"Giriş yöntemini göster"</string>
- <string name="hardware" msgid="7517821086888990278">"Donanım"</string>
+ <string name="show_ime" msgid="2506087537466597099">"Fiziksel klavye etkin durumdayken ekranda tut"</string>
+ <string name="hardware" msgid="194658061510127999">"Sanal klavyeyi göster"</string>
<string name="select_keyboard_layout_notification_title" msgid="1407367017263030773">"Klavye düzeni seçin"</string>
<string name="select_keyboard_layout_notification_message" msgid="4465907700449257063">"Bir klavye düzeni seçmek için dokunun."</string>
<string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
@@ -1531,4 +1531,10 @@
<string name="user_creation_cannot_add_any_more" msgid="6244197709981359266"><b>"<xliff:g id="APP">%1$s</xliff:g>"</b>", yeni bir kullanıcı eklemeye çalışıyor, ancak kullanıcı sınırına ulaşıldı."</string>
<string name="user_creation_account_exists" msgid="4880171855014489789"><b>"<xliff:g id="APP">%1$s</xliff:g>"</b>", yeni bir kullanıcı eklemeye çalışıyor, ancak "<b>"<xliff:g id="ACCOUNT">%2$s</xliff:g>"</b>" hesabı bu cihazda zaten var. Yine de devam edilsin mi?"</string>
<string name="user_creation_adding" msgid="3206420861363021392"><b>"<xliff:g id="APP">%1$s</xliff:g>"</b>", "<b>"<xliff:g id="ACCOUNT">%2$s</xliff:g>"</b>" hesabı için yeni bir kullanıcı eklemeye çalışıyor. Devam edilsin mi?"</string>
+ <string name="language_selection_title" msgid="7181332986330337171">"Dil tercihi"</string>
+ <string name="country_selection_title" msgid="2954859441620215513">"Bölge tercihi"</string>
+ <string name="search_language_hint" msgid="7042102592055108574">"Dil adını yazın"</string>
+ <string name="language_picker_section_suggested" msgid="8414489646861640885">"Önerilen"</string>
+ <string name="language_picker_section_all" msgid="3097279199511617537">"Tüm diller"</string>
+ <string name="locale_search_menu" msgid="2560710726687249178">"Ara"</string>
</resources>
diff --git a/core/res/res/values-uk/strings.xml b/core/res/res/values-uk/strings.xml
index fdc6323..f4ba226 100644
--- a/core/res/res/values-uk/strings.xml
+++ b/core/res/res/values-uk/strings.xml
@@ -213,15 +213,17 @@
<string name="global_action_bug_report" msgid="7934010578922304799">"Звіт про помилки"</string>
<string name="bugreport_title" msgid="2667494803742548533">"Звіт про помилку"</string>
<string name="bugreport_message" msgid="398447048750350456">"Інформація про поточний стан вашого пристрою буде зібрана й надіслана електронною поштою. Підготовка звіту триватиме певний час."</string>
- <!-- no translation found for bugreport_option_interactive_title (8635056131768862479) -->
+ <string name="bugreport_option_interactive_title" msgid="8635056131768862479">"Інтерактивний звіт"</string>
+ <string name="bugreport_option_interactive_summary" msgid="8180152634022797629">"Підходить для більшості випадків. Можна відстежувати, як створюється звіт, і вводити більше деталей про проблему. Можуть опускатися деякі розділи, які рідко використовуються, але довго створюються."</string>
+ <string name="bugreport_option_full_title" msgid="6354382025840076439">"Повний звіт"</string>
+ <!-- no translation found for bugreport_option_full_summary (6687306111256813257) -->
<skip />
- <!-- no translation found for bugreport_option_interactive_summary (8180152634022797629) -->
- <skip />
- <!-- no translation found for bugreport_option_full_title (6354382025840076439) -->
- <skip />
- <!-- no translation found for bugreport_option_full_summary (6440582052207304578) -->
- <skip />
- <!-- no translation found for bugreport_countdown (6878900193900090368) -->
+ <plurals name="bugreport_countdown" formatted="false" msgid="6878900193900090368">
+ <item quantity="one">Знімок екрана для звіту про помилки буде зроблено через <xliff:g id="NUMBER_1">%d</xliff:g> секунду.</item>
+ <item quantity="few">Знімок екрана для звіту про помилки буде зроблено через <xliff:g id="NUMBER_1">%d</xliff:g> секунди.</item>
+ <item quantity="many">Знімок екрана для звіту про помилки буде зроблено через <xliff:g id="NUMBER_1">%d</xliff:g> секунд.</item>
+ <item quantity="other">Знімок екрана для звіту про помилки буде зроблено через <xliff:g id="NUMBER_1">%d</xliff:g> секунди.</item>
+ </plurals>
<string name="global_action_toggle_silent_mode" msgid="8219525344246810925">"Беззвуч. режим"</string>
<string name="global_action_silent_mode_on_status" msgid="3289841937003758806">"Звук ВИМК."</string>
<string name="global_action_silent_mode_off_status" msgid="1506046579177066419">"Звук УВІМК."</string>
@@ -1063,8 +1065,8 @@
<string name="remote_bugreport_progress_notification_message_can_cancel" msgid="5743435483005099451">"Торкніться, щоб скасувати"</string>
<string name="select_input_method" msgid="8547250819326693584">"Змінити клавіатуру"</string>
<string name="configure_input_methods" msgid="4769971288371946846">"Вибрати клавіатури"</string>
- <string name="show_ime" msgid="9157568568695230830">"Показати метод введення"</string>
- <string name="hardware" msgid="7517821086888990278">"Обладнання"</string>
+ <string name="show_ime" msgid="2506087537466597099">"Утримуйте на екрані, коли активна фізична клавіатура"</string>
+ <string name="hardware" msgid="194658061510127999">"Показати віртуальну клавіатуру"</string>
<string name="select_keyboard_layout_notification_title" msgid="1407367017263030773">"Виберіть розкладку клавіатури"</string>
<string name="select_keyboard_layout_notification_message" msgid="4465907700449257063">"Торкніться, щоб вибрати розкладку клавіатури."</string>
<string name="fast_scroll_alphabet" msgid="5433275485499039199">" АБВГҐДЕЄЖЗИІЇЙКЛМНОПРСТУФХЦЧШЩЬЮЯ"</string>
@@ -1567,4 +1569,10 @@
<string name="user_creation_cannot_add_any_more" msgid="6244197709981359266"><b>"<xliff:g id="APP">%1$s</xliff:g>"</b>" хоче додати нового користувача, але вже додано максимальну кількість користувачів."</string>
<string name="user_creation_account_exists" msgid="4880171855014489789"><b>"<xliff:g id="APP">%1$s</xliff:g>"</b>" хоче додати нового користувача, але обліковий запис "<b>"<xliff:g id="ACCOUNT">%2$s</xliff:g>"</b>" уже існує на цьому пристрої. Продовжити?"</string>
<string name="user_creation_adding" msgid="3206420861363021392"><b>"<xliff:g id="APP">%1$s</xliff:g>"</b>" хоче додати нового користувача облікового запису "<b>"<xliff:g id="ACCOUNT">%2$s</xliff:g>"</b>". Продовжити?"</string>
+ <string name="language_selection_title" msgid="7181332986330337171">"Вибір мови"</string>
+ <string name="country_selection_title" msgid="2954859441620215513">"Вибір регіону"</string>
+ <string name="search_language_hint" msgid="7042102592055108574">"Введіть назву мови"</string>
+ <string name="language_picker_section_suggested" msgid="8414489646861640885">"Пропозиції"</string>
+ <string name="language_picker_section_all" msgid="3097279199511617537">"Усі мови"</string>
+ <string name="locale_search_menu" msgid="2560710726687249178">"Пошук"</string>
</resources>
diff --git a/core/res/res/values-ur-rPK/strings.xml b/core/res/res/values-ur-rPK/strings.xml
index 14167ac..bf2f989 100644
--- a/core/res/res/values-ur-rPK/strings.xml
+++ b/core/res/res/values-ur-rPK/strings.xml
@@ -211,15 +211,15 @@
<string name="global_action_bug_report" msgid="7934010578922304799">"بگ کی اطلاع"</string>
<string name="bugreport_title" msgid="2667494803742548533">"بگ کی اطلاع لیں"</string>
<string name="bugreport_message" msgid="398447048750350456">"ایک ای میل پیغام کے بطور بھیجنے کیلئے، یہ آپ کے موجودہ آلہ کی حالت کے بارے میں معلومات جمع کرے گا۔ بگ کی اطلاع شروع کرنے سے لے کر بھیجنے کیلئے تیار ہونے تک اس میں تھوڑا وقت لگے گا؛ براہ کرم تحمل سے کام لیں۔"</string>
- <!-- no translation found for bugreport_option_interactive_title (8635056131768862479) -->
+ <string name="bugreport_option_interactive_title" msgid="8635056131768862479">"متعامل رپورٹ"</string>
+ <string name="bugreport_option_interactive_summary" msgid="8180152634022797629">"زیادہ تر حالات میں اسے استعمال کریں۔ یہ آپ کو رپورٹ کی پیش رفت ٹریک کرنے اور مسئلہ سے متعلق زیادہ تفصیلات میں جانے کی اجازت دیتا ہے۔ شاید یہ کچھ ایسے کم استعمال ہونے والے سیکشنز کو خارج کر دے جو رپورٹ کرنے میں زیادہ وقت لگاتے ہیں۔"</string>
+ <string name="bugreport_option_full_title" msgid="6354382025840076439">"مکمل رپورٹ"</string>
+ <!-- no translation found for bugreport_option_full_summary (6687306111256813257) -->
<skip />
- <!-- no translation found for bugreport_option_interactive_summary (8180152634022797629) -->
- <skip />
- <!-- no translation found for bugreport_option_full_title (6354382025840076439) -->
- <skip />
- <!-- no translation found for bugreport_option_full_summary (6440582052207304578) -->
- <skip />
- <!-- no translation found for bugreport_countdown (6878900193900090368) -->
+ <plurals name="bugreport_countdown" formatted="false" msgid="6878900193900090368">
+ <item quantity="other">بگ رپورٹ کیلئے <xliff:g id="NUMBER_1">%d</xliff:g> سیکنڈز میں اسکرین شاٹ لیا جائے گا۔</item>
+ <item quantity="one">بگ رپورٹ کیلئے <xliff:g id="NUMBER_0">%d</xliff:g> سیکنڈ میں اسکرین شاٹ لیا جائے گا۔</item>
+ </plurals>
<string name="global_action_toggle_silent_mode" msgid="8219525344246810925">"خاموش وضع"</string>
<string name="global_action_silent_mode_on_status" msgid="3289841937003758806">"آواز آف ہے"</string>
<string name="global_action_silent_mode_off_status" msgid="1506046579177066419">"آواز آن ہے"</string>
@@ -1049,8 +1049,8 @@
<string name="remote_bugreport_progress_notification_message_can_cancel" msgid="5743435483005099451">"منسوخ کرنے کیلئے ٹچ کریں"</string>
<string name="select_input_method" msgid="8547250819326693584">"کی بورڈ تبدیل کریں"</string>
<string name="configure_input_methods" msgid="4769971288371946846">"کی بورڈز منتخب کریں"</string>
- <string name="show_ime" msgid="9157568568695230830">"ان پٹ طریقہ دکھائیں"</string>
- <string name="hardware" msgid="7517821086888990278">"ہارڈ ویئر"</string>
+ <string name="show_ime" msgid="2506087537466597099">"جب فزیکل کی بورڈ فعال ہو تو IME کو اسکرین پر رکھیں"</string>
+ <string name="hardware" msgid="194658061510127999">"ورچوئل کی بورڈ دکھائیں"</string>
<string name="select_keyboard_layout_notification_title" msgid="1407367017263030773">"کی بورڈ کا خاکہ منتخب کریں"</string>
<string name="select_keyboard_layout_notification_message" msgid="4465907700449257063">"ایک کی بورڈ کا خاکہ منتخب کرنے کیلئے چھوئیں۔"</string>
<string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
@@ -1531,4 +1531,10 @@
<string name="user_creation_cannot_add_any_more" msgid="6244197709981359266"><b>"<xliff:g id="APP">%1$s</xliff:g>"</b>" ایک نیا صارف شامل کرنے کی کوشش کر رہی ہے، لیکن صارف کی حد پوری ہوگئی ہے۔"</string>
<string name="user_creation_account_exists" msgid="4880171855014489789"><b>"<xliff:g id="APP">%1$s</xliff:g>"</b>" ایک نیا صارف شامل کرنے کی کوشش کر رہی ہے لیکن اکاؤنٹ "<b>"<xliff:g id="ACCOUNT">%2$s</xliff:g>"</b>" پہلے سے اس آلہ پر موجود ہے۔ بہر صورت آگے بڑھیں؟"</string>
<string name="user_creation_adding" msgid="3206420861363021392"><b>"<xliff:g id="APP">%1$s</xliff:g>"</b>" اکاؤنٹ "<b>"<xliff:g id="ACCOUNT">%2$s</xliff:g>"</b>" کیلئے ایک نیا صارف شامل کرنے کی کوشش کر رہی ہے۔ آگے بڑھیں؟"</string>
+ <string name="language_selection_title" msgid="7181332986330337171">"زبان کی ترجیح"</string>
+ <string name="country_selection_title" msgid="2954859441620215513">"علاقہ کی ترجیح"</string>
+ <string name="search_language_hint" msgid="7042102592055108574">"زبان کا نام ٹائپ کریں"</string>
+ <string name="language_picker_section_suggested" msgid="8414489646861640885">"تجویز کردہ"</string>
+ <string name="language_picker_section_all" msgid="3097279199511617537">"سبھی زبانیں"</string>
+ <string name="locale_search_menu" msgid="2560710726687249178">"تلاش"</string>
</resources>
diff --git a/core/res/res/values-uz-rUZ/strings.xml b/core/res/res/values-uz-rUZ/strings.xml
index e904573..a33a283 100644
--- a/core/res/res/values-uz-rUZ/strings.xml
+++ b/core/res/res/values-uz-rUZ/strings.xml
@@ -211,15 +211,15 @@
<string name="global_action_bug_report" msgid="7934010578922304799">"Nosozlik haqida ma’lumot berish"</string>
<string name="bugreport_title" msgid="2667494803742548533">"Xatoliklar hisoboti"</string>
<string name="bugreport_message" msgid="398447048750350456">"Qurilmangiz holati haqidagi ma’lumotlar to‘planib, e-pochta orqali yuboriladi. Hisobotni tayyorlash biroz vaqt olishi mumkin."</string>
- <!-- no translation found for bugreport_option_interactive_title (8635056131768862479) -->
+ <string name="bugreport_option_interactive_title" msgid="8635056131768862479">"Interaktiv hisobot"</string>
+ <string name="bugreport_option_interactive_summary" msgid="8180152634022797629">"Bundan maxsus vaziyatlarda foydalaning. Bu hisobot jarayonini kuzatish imkonini beradi va muammo haqida batafsil ma’lumotlarni ko‘rishingiz mumkin bo‘ladi. Hisobot uchun ko‘p vaqt oladigan kam ishlatiladigan bo‘limlar qoldirib ketilishi mumkin."</string>
+ <string name="bugreport_option_full_title" msgid="6354382025840076439">"To‘liq hisobot"</string>
+ <!-- no translation found for bugreport_option_full_summary (6687306111256813257) -->
<skip />
- <!-- no translation found for bugreport_option_interactive_summary (8180152634022797629) -->
- <skip />
- <!-- no translation found for bugreport_option_full_title (6354382025840076439) -->
- <skip />
- <!-- no translation found for bugreport_option_full_summary (6440582052207304578) -->
- <skip />
- <!-- no translation found for bugreport_countdown (6878900193900090368) -->
+ <plurals name="bugreport_countdown" formatted="false" msgid="6878900193900090368">
+ <item quantity="other">Xatoliklar hisoboti uchun skrinshot <xliff:g id="NUMBER_1">%d</xliff:g> soniyadan so‘ng olinadi.</item>
+ <item quantity="one">Xatoliklar hisoboti uchun skrinshot <xliff:g id="NUMBER_0">%d</xliff:g> soniyadan so‘ng olinadi.</item>
+ </plurals>
<string name="global_action_toggle_silent_mode" msgid="8219525344246810925">"Ovozsiz rejim"</string>
<string name="global_action_silent_mode_on_status" msgid="3289841937003758806">"Tovush o‘chirilgan"</string>
<string name="global_action_silent_mode_off_status" msgid="1506046579177066419">"YONIQ"</string>
@@ -1049,8 +1049,8 @@
<string name="remote_bugreport_progress_notification_message_can_cancel" msgid="5743435483005099451">"Bekor qilish uchun bosing"</string>
<string name="select_input_method" msgid="8547250819326693584">"Klaviaturani o‘zgartirish"</string>
<string name="configure_input_methods" msgid="4769971288371946846">"Klaviaturani tanlash"</string>
- <string name="show_ime" msgid="9157568568695230830">"Kiritish usulini ko‘rish"</string>
- <string name="hardware" msgid="7517821086888990278">"Qurilma"</string>
+ <string name="show_ime" msgid="2506087537466597099">"Tashqi klaviaturadan foydalanilayotganda buni ekranda saqlab turish"</string>
+ <string name="hardware" msgid="194658061510127999">"Virtual klaviatura ko‘rsatilsin"</string>
<string name="select_keyboard_layout_notification_title" msgid="1407367017263030773">"Tugmalar tartibini tanlash"</string>
<string name="select_keyboard_layout_notification_message" msgid="4465907700449257063">"Tugmalar tartibini tanlash uchun bosing."</string>
<string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
@@ -1531,4 +1531,10 @@
<string name="user_creation_cannot_add_any_more" msgid="6244197709981359266"><b>"<xliff:g id="APP">%1$s</xliff:g>"</b>" ilovasi yangi foydalanuvchi qo‘shishga urinmqoda, lekin ortiq foydalanuvchi qo‘shib bo‘lmaydi."</string>
<string name="user_creation_account_exists" msgid="4880171855014489789"><b>"<xliff:g id="APP">%1$s</xliff:g>"</b>" ilovasi yangi foydalanuvchi qo‘shishga urinmoqda, lekin "<b>"<xliff:g id="ACCOUNT">%2$s</xliff:g>"</b>" hisobi allaqachon qurilmada mavjud. Baribir davom etilsinmi?"</string>
<string name="user_creation_adding" msgid="3206420861363021392"><b>"<xliff:g id="APP">%1$s</xliff:g>"</b>" ilovasi "<b>"<xliff:g id="ACCOUNT">%2$s</xliff:g>"</b>" hisobi uchun yangi foydalanuvchi qo‘shishga urinmoqda. Davom etilsinmi?"</string>
+ <string name="language_selection_title" msgid="7181332986330337171">"Til sozlamalari"</string>
+ <string name="country_selection_title" msgid="2954859441620215513">"Hudud sozlamalari"</string>
+ <string name="search_language_hint" msgid="7042102592055108574">"Til nomini kiriting"</string>
+ <string name="language_picker_section_suggested" msgid="8414489646861640885">"Taklif etiladi"</string>
+ <string name="language_picker_section_all" msgid="3097279199511617537">"Barcha tillar"</string>
+ <string name="locale_search_menu" msgid="2560710726687249178">"Qidiruv"</string>
</resources>
diff --git a/core/res/res/values-vi/strings.xml b/core/res/res/values-vi/strings.xml
index c979b3c4..56af67d 100644
--- a/core/res/res/values-vi/strings.xml
+++ b/core/res/res/values-vi/strings.xml
@@ -211,15 +211,15 @@
<string name="global_action_bug_report" msgid="7934010578922304799">"Báo cáo lỗi"</string>
<string name="bugreport_title" msgid="2667494803742548533">"Nhận báo cáo lỗi"</string>
<string name="bugreport_message" msgid="398447048750350456">"Báo cáo này sẽ thu thập thông tin về tình trạng thiết bị hiện tại của bạn, để gửi dưới dạng thông báo qua email. Sẽ mất một chút thời gian kể từ khi bắt đầu báo cáo lỗi cho tới khi báo cáo sẵn sàng để gửi; xin vui lòng kiên nhẫn."</string>
- <!-- no translation found for bugreport_option_interactive_title (8635056131768862479) -->
+ <string name="bugreport_option_interactive_title" msgid="8635056131768862479">"Báo cáo tương tác"</string>
+ <string name="bugreport_option_interactive_summary" msgid="8180152634022797629">"Sử dụng tùy chọn này trong hầu hết các trường hợp. Tùy chọn này cho phép bạn theo dõi tiến trình của báo cáo và nhập thêm thông tin chi tiết về sự cố. Tùy chọn này có thể bỏ qua một số phần ít được sử dụng mà mất nhiều thời gian để báo cáo."</string>
+ <string name="bugreport_option_full_title" msgid="6354382025840076439">"Báo cáo đầy đủ"</string>
+ <!-- no translation found for bugreport_option_full_summary (6687306111256813257) -->
<skip />
- <!-- no translation found for bugreport_option_interactive_summary (8180152634022797629) -->
- <skip />
- <!-- no translation found for bugreport_option_full_title (6354382025840076439) -->
- <skip />
- <!-- no translation found for bugreport_option_full_summary (6440582052207304578) -->
- <skip />
- <!-- no translation found for bugreport_countdown (6878900193900090368) -->
+ <plurals name="bugreport_countdown" formatted="false" msgid="6878900193900090368">
+ <item quantity="other">Sẽ chụp ảnh màn hình để báo cáo lỗi sau <xliff:g id="NUMBER_1">%d</xliff:g> giây.</item>
+ <item quantity="one">Sẽ chụp ảnh màn hình để báo cáo lỗi sau <xliff:g id="NUMBER_0">%d</xliff:g> giây.</item>
+ </plurals>
<string name="global_action_toggle_silent_mode" msgid="8219525344246810925">"Chế độ im lặng"</string>
<string name="global_action_silent_mode_on_status" msgid="3289841937003758806">"Âm thanh TẮT"</string>
<string name="global_action_silent_mode_off_status" msgid="1506046579177066419">"Âm thanh BẬT"</string>
@@ -1049,8 +1049,8 @@
<string name="remote_bugreport_progress_notification_message_can_cancel" msgid="5743435483005099451">"Chạm để hủy"</string>
<string name="select_input_method" msgid="8547250819326693584">"Thay đổi bàn phím"</string>
<string name="configure_input_methods" msgid="4769971288371946846">"Chọn bàn phím"</string>
- <string name="show_ime" msgid="9157568568695230830">"Hiển thị phương thức nhập"</string>
- <string name="hardware" msgid="7517821086888990278">"Phần cứng"</string>
+ <string name="show_ime" msgid="2506087537466597099">"Tiếp tục sử dụng ứng dụng trên màn hình trong khi bàn phím thực đang hoạt động"</string>
+ <string name="hardware" msgid="194658061510127999">"Hiển thị bàn phím ảo"</string>
<string name="select_keyboard_layout_notification_title" msgid="1407367017263030773">"Chọn bố cục bàn phím"</string>
<string name="select_keyboard_layout_notification_message" msgid="4465907700449257063">"Chạm để chọn bố cục bàn phím."</string>
<string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
@@ -1531,4 +1531,10 @@
<string name="user_creation_cannot_add_any_more" msgid="6244197709981359266"><b>"<xliff:g id="APP">%1$s</xliff:g>"</b>" đang cố thêm người dùng mới nhưng đã đạt đến giới hạn người dùng."</string>
<string name="user_creation_account_exists" msgid="4880171855014489789"><b>"<xliff:g id="APP">%1$s</xliff:g>"</b>" đang cố thêm người dùng mới nhưng tài khoản "<b>"<xliff:g id="ACCOUNT">%2$s</xliff:g>"</b>" đã tồn tại trên thiết bị này. Vẫn tiếp tục?"</string>
<string name="user_creation_adding" msgid="3206420861363021392"><b>"<xliff:g id="APP">%1$s</xliff:g>"</b>" đang cố thêm người dùng mới cho tài khoản "<b>"<xliff:g id="ACCOUNT">%2$s</xliff:g>"</b>". Tiếp tục?"</string>
+ <string name="language_selection_title" msgid="7181332986330337171">"Tùy chọn ngôn ngữ"</string>
+ <string name="country_selection_title" msgid="2954859441620215513">"Tùy chọn khu vực"</string>
+ <string name="search_language_hint" msgid="7042102592055108574">"Nhập tên ngôn ngữ"</string>
+ <string name="language_picker_section_suggested" msgid="8414489646861640885">"Ðược đề xuất"</string>
+ <string name="language_picker_section_all" msgid="3097279199511617537">"Tất cả ngôn ngữ"</string>
+ <string name="locale_search_menu" msgid="2560710726687249178">"Tìm kiếm"</string>
</resources>
diff --git a/core/res/res/values-zh-rCN/strings.xml b/core/res/res/values-zh-rCN/strings.xml
index fd12d29..45d13e8 100644
--- a/core/res/res/values-zh-rCN/strings.xml
+++ b/core/res/res/values-zh-rCN/strings.xml
@@ -211,15 +211,15 @@
<string name="global_action_bug_report" msgid="7934010578922304799">"错误报告"</string>
<string name="bugreport_title" msgid="2667494803742548533">"提交错误报告"</string>
<string name="bugreport_message" msgid="398447048750350456">"这会收集有关当前设备状态的信息,并以电子邮件的形式进行发送。从开始生成错误报告到准备好发送需要一点时间,请耐心等待。"</string>
- <!-- no translation found for bugreport_option_interactive_title (8635056131768862479) -->
+ <string name="bugreport_option_interactive_title" msgid="8635056131768862479">"互动式报告"</string>
+ <string name="bugreport_option_interactive_summary" msgid="8180152634022797629">"在大多数情况下,建议您使用此选项,以便追踪报告的生成进度,以及输入与相应问题相关的更多详细信息。系统可能会省略掉一些不常用的区段,从而缩短生成报告的时间。"</string>
+ <string name="bugreport_option_full_title" msgid="6354382025840076439">"完整报告"</string>
+ <!-- no translation found for bugreport_option_full_summary (6687306111256813257) -->
<skip />
- <!-- no translation found for bugreport_option_interactive_summary (8180152634022797629) -->
- <skip />
- <!-- no translation found for bugreport_option_full_title (6354382025840076439) -->
- <skip />
- <!-- no translation found for bugreport_option_full_summary (6440582052207304578) -->
- <skip />
- <!-- no translation found for bugreport_countdown (6878900193900090368) -->
+ <plurals name="bugreport_countdown" formatted="false" msgid="6878900193900090368">
+ <item quantity="other">系统将在 <xliff:g id="NUMBER_1">%d</xliff:g> 秒后对错误报告进行截屏。</item>
+ <item quantity="one">系统将在 <xliff:g id="NUMBER_0">%d</xliff:g> 秒后对错误报告进行截屏。</item>
+ </plurals>
<string name="global_action_toggle_silent_mode" msgid="8219525344246810925">"静音模式"</string>
<string name="global_action_silent_mode_on_status" msgid="3289841937003758806">"声音已关闭"</string>
<string name="global_action_silent_mode_off_status" msgid="1506046579177066419">"声音已开启"</string>
@@ -238,9 +238,9 @@
<string name="user_owner_label" msgid="2804351898001038951">"个人"</string>
<string name="managed_profile_label" msgid="6260850669674791528">"工作"</string>
<string name="permgrouplab_contacts" msgid="3657758145679177612">"通讯录"</string>
- <string name="permgroupdesc_contacts" msgid="6951499528303668046">"使用您的通讯录"</string>
+ <string name="permgroupdesc_contacts" msgid="6951499528303668046">"访问您的通讯录"</string>
<string name="permgrouplab_location" msgid="7275582855722310164">"位置信息"</string>
- <string name="permgroupdesc_location" msgid="1346617465127855033">"使用此设备的位置信息"</string>
+ <string name="permgroupdesc_location" msgid="1346617465127855033">"获取此设备的位置信息"</string>
<string name="permgrouplab_calendar" msgid="5863508437783683902">"日历"</string>
<string name="permgroupdesc_calendar" msgid="3889615280211184106">"访问您的日历"</string>
<string name="permgrouplab_sms" msgid="228308803364967808">"短信"</string>
@@ -1049,8 +1049,8 @@
<string name="remote_bugreport_progress_notification_message_can_cancel" msgid="5743435483005099451">"触摸可取消"</string>
<string name="select_input_method" msgid="8547250819326693584">"更改键盘"</string>
<string name="configure_input_methods" msgid="4769971288371946846">"选择键盘"</string>
- <string name="show_ime" msgid="9157568568695230830">"显示输入法"</string>
- <string name="hardware" msgid="7517821086888990278">"硬件"</string>
+ <string name="show_ime" msgid="2506087537466597099">"连接到实体键盘时使其在屏幕上保持显示状态"</string>
+ <string name="hardware" msgid="194658061510127999">"显示虚拟键盘"</string>
<string name="select_keyboard_layout_notification_title" msgid="1407367017263030773">"选择键盘布局"</string>
<string name="select_keyboard_layout_notification_message" msgid="4465907700449257063">"触摸可选择键盘布局。"</string>
<string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
@@ -1531,4 +1531,10 @@
<string name="user_creation_cannot_add_any_more" msgid="6244197709981359266"><b>"<xliff:g id="APP">%1$s</xliff:g>"</b>"正尝试添加新用户,但已达到用户人数上限。"</string>
<string name="user_creation_account_exists" msgid="4880171855014489789"><b>"<xliff:g id="APP">%1$s</xliff:g>"</b>"正尝试添加新用户,但这个设备上已经存在"<b>"<xliff:g id="ACCOUNT">%2$s</xliff:g>"</b>"这个帐号。仍要继续吗?"</string>
<string name="user_creation_adding" msgid="3206420861363021392"><b>"<xliff:g id="APP">%1$s</xliff:g>"</b>"正尝试为"<b>"<xliff:g id="ACCOUNT">%2$s</xliff:g>"</b>"这个帐号添加新用户,要继续吗?"</string>
+ <string name="language_selection_title" msgid="7181332986330337171">"语言偏好设置"</string>
+ <string name="country_selection_title" msgid="2954859441620215513">"区域偏好设置"</string>
+ <string name="search_language_hint" msgid="7042102592055108574">"输入语言名称"</string>
+ <string name="language_picker_section_suggested" msgid="8414489646861640885">"建议语言"</string>
+ <string name="language_picker_section_all" msgid="3097279199511617537">"所有语言"</string>
+ <string name="locale_search_menu" msgid="2560710726687249178">"搜索"</string>
</resources>
diff --git a/core/res/res/values-zh-rHK/strings.xml b/core/res/res/values-zh-rHK/strings.xml
index bd6ec0a..2fe2228 100644
--- a/core/res/res/values-zh-rHK/strings.xml
+++ b/core/res/res/values-zh-rHK/strings.xml
@@ -211,15 +211,15 @@
<string name="global_action_bug_report" msgid="7934010578922304799">"錯誤報告"</string>
<string name="bugreport_title" msgid="2667494803742548533">"取得錯誤報告"</string>
<string name="bugreport_message" msgid="398447048750350456">"這會收集您目前裝置狀態的相關資訊,並以電郵傳送給您。從開始建立錯誤報告到準備傳送需要一段時間,請耐心等候。"</string>
- <!-- no translation found for bugreport_option_interactive_title (8635056131768862479) -->
+ <string name="bugreport_option_interactive_title" msgid="8635056131768862479">"互動報告"</string>
+ <string name="bugreport_option_interactive_summary" msgid="8180152634022797629">"在大部分情況下,建議您使用此選項,以便追蹤報告進度,以及輸入更多與問題相關的的資訊。系統可能會省略部分不常用的區段,藉此縮短產生報告的時間。"</string>
+ <string name="bugreport_option_full_title" msgid="6354382025840076439">"完整報告"</string>
+ <!-- no translation found for bugreport_option_full_summary (6687306111256813257) -->
<skip />
- <!-- no translation found for bugreport_option_interactive_summary (8180152634022797629) -->
- <skip />
- <!-- no translation found for bugreport_option_full_title (6354382025840076439) -->
- <skip />
- <!-- no translation found for bugreport_option_full_summary (6440582052207304578) -->
- <skip />
- <!-- no translation found for bugreport_countdown (6878900193900090368) -->
+ <plurals name="bugreport_countdown" formatted="false" msgid="6878900193900090368">
+ <item quantity="other">系統將在 <xliff:g id="NUMBER_1">%d</xliff:g> 秒後擷取錯誤報告的螢幕畫面。</item>
+ <item quantity="one">系統將在 <xliff:g id="NUMBER_0">%d</xliff:g> 秒後擷取錯誤報告的螢幕畫面。</item>
+ </plurals>
<string name="global_action_toggle_silent_mode" msgid="8219525344246810925">"靜音模式"</string>
<string name="global_action_silent_mode_on_status" msgid="3289841937003758806">"關閉音效"</string>
<string name="global_action_silent_mode_off_status" msgid="1506046579177066419">"音效已開啟"</string>
@@ -248,7 +248,7 @@
<string name="permgrouplab_storage" msgid="1971118770546336966">"儲存空間"</string>
<string name="permgroupdesc_storage" msgid="637758554581589203">"在您的裝置上存取相片、媒體和檔案"</string>
<string name="permgrouplab_microphone" msgid="171539900250043464">"麥克風"</string>
- <string name="permgroupdesc_microphone" msgid="4988812113943554584">"錄製語音訊息"</string>
+ <string name="permgroupdesc_microphone" msgid="4988812113943554584">"錄音"</string>
<string name="permgrouplab_camera" msgid="4820372495894586615">"相機"</string>
<string name="permgroupdesc_camera" msgid="3250611594678347720">"拍照和錄製影片"</string>
<string name="permgrouplab_phone" msgid="5229115638567440675">"電話"</string>
@@ -1049,8 +1049,8 @@
<string name="remote_bugreport_progress_notification_message_can_cancel" msgid="5743435483005099451">"輕觸即可取消"</string>
<string name="select_input_method" msgid="8547250819326693584">"變更鍵盤"</string>
<string name="configure_input_methods" msgid="4769971288371946846">"選擇鍵盤"</string>
- <string name="show_ime" msgid="9157568568695230830">"顯示輸入法"</string>
- <string name="hardware" msgid="7517821086888990278">"硬件"</string>
+ <string name="show_ime" msgid="2506087537466597099">"在實體鍵盤處於連接狀態時保持顯示"</string>
+ <string name="hardware" msgid="194658061510127999">"顯示虛擬鍵盤"</string>
<string name="select_keyboard_layout_notification_title" msgid="1407367017263030773">"選取鍵盤配置"</string>
<string name="select_keyboard_layout_notification_message" msgid="4465907700449257063">"輕觸即可選取鍵盤配置。"</string>
<string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
@@ -1531,4 +1531,10 @@
<string name="user_creation_cannot_add_any_more" msgid="6244197709981359266"><b>"<xliff:g id="APP">%1$s</xliff:g>"</b>" 正在嘗試新增使用者,但使用者人數已達上限。"</string>
<string name="user_creation_account_exists" msgid="4880171855014489789"><b>"<xliff:g id="APP">%1$s</xliff:g>"</b>" 正在嘗試新增使用者,但此裝置上已有 "<b>"<xliff:g id="ACCOUNT">%2$s</xliff:g>"</b>" 這個帳戶。仍要繼續嗎?"</string>
<string name="user_creation_adding" msgid="3206420861363021392"><b>"<xliff:g id="APP">%1$s</xliff:g>"</b>" 正在嘗試為 "<b>"<xliff:g id="ACCOUNT">%2$s</xliff:g>"</b>" 這個帳戶新增使用者。要繼續嗎?"</string>
+ <string name="language_selection_title" msgid="7181332986330337171">"語言偏好設定"</string>
+ <string name="country_selection_title" msgid="2954859441620215513">"地區偏好設定"</string>
+ <string name="search_language_hint" msgid="7042102592055108574">"輸入語言名稱"</string>
+ <string name="language_picker_section_suggested" msgid="8414489646861640885">"推薦"</string>
+ <string name="language_picker_section_all" msgid="3097279199511617537">"所有語言"</string>
+ <string name="locale_search_menu" msgid="2560710726687249178">"搜尋"</string>
</resources>
diff --git a/core/res/res/values-zh-rTW/strings.xml b/core/res/res/values-zh-rTW/strings.xml
index 4181697..6554153 100644
--- a/core/res/res/values-zh-rTW/strings.xml
+++ b/core/res/res/values-zh-rTW/strings.xml
@@ -211,15 +211,15 @@
<string name="global_action_bug_report" msgid="7934010578922304799">"錯誤報告"</string>
<string name="bugreport_title" msgid="2667494803742548533">"取得錯誤報告"</string>
<string name="bugreport_message" msgid="398447048750350456">"這會收集您目前裝置狀態的相關資訊,以便透過電子郵件傳送。從錯誤報告開始建立到準備傳送的這段過程可能需要一點時間,敬請耐心等候。"</string>
- <!-- no translation found for bugreport_option_interactive_title (8635056131768862479) -->
+ <string name="bugreport_option_interactive_title" msgid="8635056131768862479">"互動式報告"</string>
+ <string name="bugreport_option_interactive_summary" msgid="8180152634022797629">"在一般情況下,建議您使用這個選項,以便追蹤報告產生進度,以及輸入更多與問題相關的資訊。系統可能會省略部分較少使用的區段,藉此縮短報告產生時間。"</string>
+ <string name="bugreport_option_full_title" msgid="6354382025840076439">"完整報告"</string>
+ <!-- no translation found for bugreport_option_full_summary (6687306111256813257) -->
<skip />
- <!-- no translation found for bugreport_option_interactive_summary (8180152634022797629) -->
- <skip />
- <!-- no translation found for bugreport_option_full_title (6354382025840076439) -->
- <skip />
- <!-- no translation found for bugreport_option_full_summary (6440582052207304578) -->
- <skip />
- <!-- no translation found for bugreport_countdown (6878900193900090368) -->
+ <plurals name="bugreport_countdown" formatted="false" msgid="6878900193900090368">
+ <item quantity="other">系統將在 <xliff:g id="NUMBER_1">%d</xliff:g> 秒後擷取錯誤報告的螢幕畫面。</item>
+ <item quantity="one">系統將在 <xliff:g id="NUMBER_0">%d</xliff:g> 秒後擷取錯誤報告的螢幕畫面。</item>
+ </plurals>
<string name="global_action_toggle_silent_mode" msgid="8219525344246810925">"靜音模式"</string>
<string name="global_action_silent_mode_on_status" msgid="3289841937003758806">"音效已關閉"</string>
<string name="global_action_silent_mode_off_status" msgid="1506046579177066419">"音效已開啟"</string>
@@ -1042,15 +1042,15 @@
<string name="adb_active_notification_title" msgid="6729044778949189918">"已連接 USB 偵錯工具"</string>
<string name="adb_active_notification_message" msgid="1016654627626476142">"輕觸即可停用 USB 偵錯。"</string>
<string name="share_remote_bugreport_notification_title" msgid="3116061729914615290">"要與管理員分享錯誤報告嗎?"</string>
- <string name="share_remote_bugreport_notification_message" msgid="1310517845557771773">"您的 IT 管理員要求您提供錯誤報告,協助排解問題"</string>
+ <string name="share_remote_bugreport_notification_message" msgid="1310517845557771773">"您的 IT 管理員要求您提供錯誤報告以便排解問題"</string>
<string name="share_remote_bugreport_notification_accept" msgid="8203856129078669677">"接受"</string>
<string name="share_remote_bugreport_notification_decline" msgid="6337969352057443969">"拒絕"</string>
- <string name="remote_bugreport_progress_notification_title" msgid="2785600634417078622">"正在取得錯誤報告…"</string>
+ <string name="remote_bugreport_progress_notification_title" msgid="2785600634417078622">"正在接收錯誤報告…"</string>
<string name="remote_bugreport_progress_notification_message_can_cancel" msgid="5743435483005099451">"輕觸即可取消"</string>
<string name="select_input_method" msgid="8547250819326693584">"變更鍵盤"</string>
<string name="configure_input_methods" msgid="4769971288371946846">"選擇鍵盤"</string>
- <string name="show_ime" msgid="9157568568695230830">"顯示輸入法"</string>
- <string name="hardware" msgid="7517821086888990278">"硬體"</string>
+ <string name="show_ime" msgid="2506087537466597099">"有連接的實體鍵盤時保持顯示"</string>
+ <string name="hardware" msgid="194658061510127999">"顯示虛擬鍵盤"</string>
<string name="select_keyboard_layout_notification_title" msgid="1407367017263030773">"選取鍵盤配置"</string>
<string name="select_keyboard_layout_notification_message" msgid="4465907700449257063">"輕觸即可選取鍵盤配置。"</string>
<string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
@@ -1531,4 +1531,10 @@
<string name="user_creation_cannot_add_any_more" msgid="6244197709981359266"><b></b>"「<xliff:g id="APP">%1$s</xliff:g>」正在嘗試新增使用者,但已達到使用者人數上限。"</string>
<string name="user_creation_account_exists" msgid="4880171855014489789"><b></b>"「<xliff:g id="APP">%1$s</xliff:g>」正在嘗試新增使用者,但這個裝置上已經有 <xliff:g id="ACCOUNT">%2$s</xliff:g> "<b></b>"這個帳戶。仍要繼續嗎?"</string>
<string name="user_creation_adding" msgid="3206420861363021392"><b></b>"「<xliff:g id="APP">%1$s</xliff:g>」正在嘗試為 <xliff:g id="ACCOUNT">%2$s</xliff:g> "<b></b>"這個帳戶新增使用者。要繼續嗎?"</string>
+ <string name="language_selection_title" msgid="7181332986330337171">"語言偏好設定"</string>
+ <string name="country_selection_title" msgid="2954859441620215513">"地區偏好設定"</string>
+ <string name="search_language_hint" msgid="7042102592055108574">"請輸入語言名稱"</string>
+ <string name="language_picker_section_suggested" msgid="8414489646861640885">"建議語言"</string>
+ <string name="language_picker_section_all" msgid="3097279199511617537">"所有語言"</string>
+ <string name="locale_search_menu" msgid="2560710726687249178">"搜尋"</string>
</resources>
diff --git a/core/res/res/values-zu/strings.xml b/core/res/res/values-zu/strings.xml
index f257f6c..b6a8039e 100644
--- a/core/res/res/values-zu/strings.xml
+++ b/core/res/res/values-zu/strings.xml
@@ -211,15 +211,15 @@
<string name="global_action_bug_report" msgid="7934010578922304799">"Umbiko wephutha"</string>
<string name="bugreport_title" msgid="2667494803742548533">"Thatha umbiko wesiphazamiso"</string>
<string name="bugreport_message" msgid="398447048750350456">"Lokhu kuzoqoqa ulwazi mayelana nesimo samanje sedivayisi yakho, ukuthumela imilayezo ye-imeyili. Kuzothatha isikhathi esincane kusuka ekuqaleni umbiko wesiphazamiso uze ulungele ukuthunyelwa; sicela ubekezele."</string>
- <!-- no translation found for bugreport_option_interactive_title (8635056131768862479) -->
+ <string name="bugreport_option_interactive_title" msgid="8635056131768862479">"Umbiko obandakanyayo"</string>
+ <string name="bugreport_option_interactive_summary" msgid="8180152634022797629">"Sebenzisa lokhu ngaphansi kwezimo eziningi. Kukuvumela ukuthi ulandelele ukuqhubeka kombiko uphinde ufake imininingwane engaphezulu mayelana nenkinga. Kungakhipha ezinye izigaba ezisetshenziswe kancane ezithatha isikhathi eside ukuze zibikwe."</string>
+ <string name="bugreport_option_full_title" msgid="6354382025840076439">"Umbiko ogcwele"</string>
+ <!-- no translation found for bugreport_option_full_summary (6687306111256813257) -->
<skip />
- <!-- no translation found for bugreport_option_interactive_summary (8180152634022797629) -->
- <skip />
- <!-- no translation found for bugreport_option_full_title (6354382025840076439) -->
- <skip />
- <!-- no translation found for bugreport_option_full_summary (6440582052207304578) -->
- <skip />
- <!-- no translation found for bugreport_countdown (6878900193900090368) -->
+ <plurals name="bugreport_countdown" formatted="false" msgid="6878900193900090368">
+ <item quantity="one">Ithathela umbiko wesiphazamisi isithombe-skrini kumasekhondi angu-<xliff:g id="NUMBER_1">%d</xliff:g>.</item>
+ <item quantity="other">Ithathela umbiko wesiphazamisi isithombe-skrini kumasekhondi angu-<xliff:g id="NUMBER_1">%d</xliff:g>.</item>
+ </plurals>
<string name="global_action_toggle_silent_mode" msgid="8219525344246810925">"Imodi ethulile"</string>
<string name="global_action_silent_mode_on_status" msgid="3289841937003758806">"Umsindo UVALIWE"</string>
<string name="global_action_silent_mode_off_status" msgid="1506046579177066419">"Umsindo UVULIWE"</string>
@@ -1049,8 +1049,8 @@
<string name="remote_bugreport_progress_notification_message_can_cancel" msgid="5743435483005099451">"Thinta ukuze ukhansele"</string>
<string name="select_input_method" msgid="8547250819326693584">"Shintsha ikhibhodi"</string>
<string name="configure_input_methods" msgid="4769971288371946846">"Khetha amakhibhodi"</string>
- <string name="show_ime" msgid="9157568568695230830">"Bonisa indlela yokufaka"</string>
- <string name="hardware" msgid="7517821086888990278">"I-Hardware"</string>
+ <string name="show_ime" msgid="2506087537466597099">"Yigcine kusikrini ngenkathi kusebenza ikhibhodi ephathekayo"</string>
+ <string name="hardware" msgid="194658061510127999">"Bonisa ikhibhodi ebonakalayo"</string>
<string name="select_keyboard_layout_notification_title" msgid="1407367017263030773">"Khetha isendlalelo sekhibhodi"</string>
<string name="select_keyboard_layout_notification_message" msgid="4465907700449257063">"Thinta ukuze ukhethe isendlalelo sekhibhodi."</string>
<string name="fast_scroll_alphabet" msgid="5433275485499039199">" ABCDEFGHIJKLMNOPQRSTUVWXYZ"</string>
@@ -1531,4 +1531,10 @@
<string name="user_creation_cannot_add_any_more" msgid="6244197709981359266"><b>"<xliff:g id="APP">%1$s</xliff:g>"</b>" izama ukungeza umsebenzisi omusha, kodwa umkhawulo womsebenzisi ufinyelelwe."</string>
<string name="user_creation_account_exists" msgid="4880171855014489789"><b>"<xliff:g id="APP">%1$s</xliff:g>"</b>" izama ukungeza umsebenzisi omusha, kodwa i-akhawunti "<b>"<xliff:g id="ACCOUNT">%2$s</xliff:g>"</b>" isivele ikhona kule divayisi. Qhubeka noma kunjalo?"</string>
<string name="user_creation_adding" msgid="3206420861363021392"><b>"<xliff:g id="APP">%1$s</xliff:g>"</b>" izama ukungeza umsebenzisi omusha we-akhawunti "<b>"<xliff:g id="ACCOUNT">%2$s</xliff:g>"</b>". Qhubeka?"</string>
+ <string name="language_selection_title" msgid="7181332986330337171">"Okuncamelayo kolimi"</string>
+ <string name="country_selection_title" msgid="2954859441620215513">"Okuncamelayo kwesifunda"</string>
+ <string name="search_language_hint" msgid="7042102592055108574">"Thayipha igama lolimi"</string>
+ <string name="language_picker_section_suggested" msgid="8414489646861640885">"Okuphakanyisiwe"</string>
+ <string name="language_picker_section_all" msgid="3097279199511617537">"Zonke izilimi"</string>
+ <string name="locale_search_menu" msgid="2560710726687249178">"Sesha"</string>
</resources>
diff --git a/core/res/res/values/strings.xml b/core/res/res/values/strings.xml
index d7f7b10..28c76bb 100644
--- a/core/res/res/values/strings.xml
+++ b/core/res/res/values/strings.xml
@@ -4164,4 +4164,14 @@
<!-- Menu item in the locale menu [CHAR LIMIT=30] -->
<string name="locale_search_menu">Search</string>
+ <!-- Title for dialog displayed when work profile is turned off. [CHAR LIMIT=30] -->
+ <string name="work_mode_off_title">Work mode is OFF</string>
+ <!-- Message displayed in dialog when work profile is turned off. [CHAR LIMIT=NONE] -->
+ <string name="work_mode_off_message">Allow work profile to function, including apps, background sync, and related features.</string>
+ <!-- Title for button to turn on work profile. [CHAR LIMIT=NONE] -->
+ <string name="work_mode_turn_on">Turn on</string>
+ <!-- Title for dialog displayed when a packge is suspended by device admin. [CHAR LIMIT=30] -->
+ <string name="suspended_package_title">%1$s disabled</string>
+ <!-- Message for dialog displayed when a packge is suspended by device admin. [CHAR LIMIT=NONE] -->
+ <string name="suspended_package_message">Disabled by %1$s administrator. Contact them to learn more.</string>
</resources>
diff --git a/core/res/res/values/symbols.xml b/core/res/res/values/symbols.xml
index a5d0020..57ff243 100644
--- a/core/res/res/values/symbols.xml
+++ b/core/res/res/values/symbols.xml
@@ -2485,4 +2485,12 @@
<java-symbol type="string" name="language_selection_title" />
<java-symbol type="string" name="search_language_hint" />
+ <java-symbol type="layout" name="unlaunchable_app_activity" />
+ <java-symbol type="id" name="unlaunchable_app_title" />
+ <java-symbol type="id" name="unlaunchable_app_message" />
+ <java-symbol type="string" name="work_mode_off_title" />
+ <java-symbol type="string" name="work_mode_off_message" />
+ <java-symbol type="string" name="work_mode_turn_on" />
+ <java-symbol type="string" name="suspended_package_title" />
+ <java-symbol type="string" name="suspended_package_message" />
</resources>
diff --git a/core/res/res/xml/sms_short_codes.xml b/core/res/res/xml/sms_short_codes.xml
index 5a08887..cf7978c 100644
--- a/core/res/res/xml/sms_short_codes.xml
+++ b/core/res/res/xml/sms_short_codes.xml
@@ -214,7 +214,7 @@
<!-- USA: 5-6 digits (premium codes from https://www.premiumsmsrefunds.com/ShortCodes.htm),
visual voicemail code for T-Mobile: 122 -->
- <shortcode country="us" pattern="\\d{5,6}" premium="20433|21(?:344|472)|22715|23(?:333|847)|24(?:15|28)0|25209|27(?:449|606|663)|28498|305(?:00|83)|32(?:340|941)|33(?:166|786|849)|34746|35(?:182|564)|37975|38(?:135|146|254)|41(?:366|463)|42335|43(?:355|500)|44(?:578|711|811)|45814|46(?:157|173|327|654)|46666|47553|48(?:221|277|669)|50(?:844|920)|51(?:062|368)|52944|54(?:723|892)|55928|56483|57370|59(?:182|187|252|342)|60339|61(?:266|982)|62478|64(?:219|898)|65(?:108|500)|69(?:208|388)|70877|71851|72(?:078|087|465)|73(?:288|588|882|909|997)|74(?:034|332|815)|76426|79213|81946|83177|84(?:103|685)|85797|86(?:234|236|666)|89616|90(?:715|842|938)|91(?:362|958)|94719|95297|96(?:040|666|835|969)|97(?:142|294|688)|99(?:689|796|807)" free="122|87902" />
+ <shortcode country="us" pattern="\\d{5,6}" premium="20433|21(?:344|472)|22715|23(?:333|847)|24(?:15|28)0|25209|27(?:449|606|663)|28498|305(?:00|83)|32(?:340|941)|33(?:166|786|849)|34746|35(?:182|564)|37975|38(?:135|146|254)|41(?:366|463)|42335|43(?:355|500)|44(?:567|578|711|811)|45814|46(?:157|173|327)|46666|47553|48(?:221|277|669)|50(?:844|920)|51(?:062|368)|52944|54(?:723|892)|55928|56483|57370|59(?:182|187|252|342)|60339|61(?:266|982)|62478|64(?:219|898)|65(?:108|500)|69(?:208|388)|70877|71851|72(?:078|087|465)|73(?:288|588|882|909|997)|74(?:034|332|815)|76426|79213|81946|83177|84(?:103|685)|85797|86(?:234|236|666)|89616|90(?:715|842|938)|91(?:362|958)|94719|95297|96(?:040|666|835|969)|97(?:142|294|688)|99(?:689|796|807)" free="122|87902" />
<!-- Vietnam -->
<shortcode country="vn" free="5001" />
diff --git a/core/tests/coretests/AndroidManifest.xml b/core/tests/coretests/AndroidManifest.xml
index c0453f8..eb0075b 100644
--- a/core/tests/coretests/AndroidManifest.xml
+++ b/core/tests/coretests/AndroidManifest.xml
@@ -53,6 +53,7 @@
<uses-permission android:name="android.permission.DOWNLOAD_CACHE_NON_PURGEABLE" />
<uses-permission android:name="android.permission.GET_PACKAGE_SIZE" />
<uses-permission android:name="android.permission.INTERNET" />
+ <uses-permission android:name="android.permission.INJECT_EVENTS" />
<uses-permission android:name="android.permission.READ_CONTACTS" />
<uses-permission android:name="android.permission.READ_LOGS"/>
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
diff --git a/core/tests/coretests/src/android/widget/TextViewActivityMouseTest.java b/core/tests/coretests/src/android/widget/TextViewActivityMouseTest.java
index afd0bc4..00df87d 100644
--- a/core/tests/coretests/src/android/widget/TextViewActivityMouseTest.java
+++ b/core/tests/coretests/src/android/widget/TextViewActivityMouseTest.java
@@ -37,6 +37,7 @@
import static android.support.test.espresso.assertion.ViewAssertions.matches;
import static android.support.test.espresso.matcher.ViewMatchers.isDisplayed;
import static android.support.test.espresso.matcher.ViewMatchers.withId;
+import static android.support.test.espresso.matcher.ViewMatchers.withText;
import com.android.frameworks.coretests.R;
@@ -145,6 +146,40 @@
}
@SmallTest
+ public void testDragAndDrop() throws Exception {
+ final String text = "abc def ghi.";
+ onView(withId(R.id.textview)).perform(click());
+ onView(withId(R.id.textview)).perform(typeTextIntoFocusedView(text));
+ onView(withId(R.id.textview)).perform(
+ mouseDragOnText(text.indexOf("d"), text.indexOf("f") + 1));
+
+ onView(withId(R.id.textview)).perform(
+ mouseDragOnText(text.indexOf("e"), text.length()));
+
+ onView(withId(R.id.textview)).check(matches(withText("abc ghi.def")));
+ onView(withId(R.id.textview)).check(hasSelection(""));
+ assertNoSelectionHandles();
+ onView(withId(R.id.textview)).check(hasInsertionPointerAtIndex("abc ghi.def".length()));
+ }
+
+ @SmallTest
+ public void testDragAndDrop_longClick() throws Exception {
+ final String text = "abc def ghi.";
+ onView(withId(R.id.textview)).perform(click());
+ onView(withId(R.id.textview)).perform(typeTextIntoFocusedView(text));
+ onView(withId(R.id.textview)).perform(
+ mouseDragOnText(text.indexOf("d"), text.indexOf("f") + 1));
+
+ onView(withId(R.id.textview)).perform(
+ mouseLongClickAndDragOnText(text.indexOf("e"), text.length()));
+
+ onView(withId(R.id.textview)).check(matches(withText("abc ghi.def")));
+ onView(withId(R.id.textview)).check(hasSelection(""));
+ assertNoSelectionHandles();
+ onView(withId(R.id.textview)).check(hasInsertionPointerAtIndex("abc ghi.def".length()));
+ }
+
+ @SmallTest
public void testSelectTextByLongClick() throws Exception {
final String helloWorld = "Hello world!";
onView(withId(R.id.textview)).perform(click());
diff --git a/core/tests/coretests/src/android/widget/TextViewActivityTest.java b/core/tests/coretests/src/android/widget/TextViewActivityTest.java
index edbfef9..5dae4a8 100644
--- a/core/tests/coretests/src/android/widget/TextViewActivityTest.java
+++ b/core/tests/coretests/src/android/widget/TextViewActivityTest.java
@@ -159,6 +159,22 @@
}
@SmallTest
+ public void testDragAndDrop() throws Exception {
+ final String text = "abc def ghi.";
+ onView(withId(R.id.textview)).perform(click());
+ onView(withId(R.id.textview)).perform(typeTextIntoFocusedView(text));
+ onView(withId(R.id.textview)).perform(longPressOnTextAtIndex(text.indexOf("e")));
+
+ onView(withId(R.id.textview)).perform(
+ longPressAndDragOnText(text.indexOf("e"), text.length()));
+
+ onView(withId(R.id.textview)).check(matches(withText("abc ghi.def")));
+ onView(withId(R.id.textview)).check(hasSelection(""));
+ assertNoSelectionHandles();
+ onView(withId(R.id.textview)).check(hasInsertionPointerAtIndex("abc ghi.def".length()));
+ }
+
+ @SmallTest
public void testDoubleTapToSelect() throws Exception {
final String helloWorld = "Hello SuetYi!";
onView(withId(R.id.textview)).perform(click());
diff --git a/libs/hwui/Android.mk b/libs/hwui/Android.mk
index 8ba6318..483ccf7 100644
--- a/libs/hwui/Android.mk
+++ b/libs/hwui/Android.mk
@@ -235,7 +235,8 @@
tests/unit/LinearAllocatorTests.cpp \
tests/unit/VectorDrawableTests.cpp \
tests/unit/OffscreenBufferPoolTests.cpp \
- tests/unit/StringUtilsTests.cpp
+ tests/unit/StringUtilsTests.cpp \
+ tests/unit/BufferPoolTests.cpp
ifeq (true, $(HWUI_NEW_OPS))
LOCAL_SRC_FILES += \
diff --git a/libs/hwui/BakedOpRenderer.cpp b/libs/hwui/BakedOpRenderer.cpp
index e65746e..a808b88 100644
--- a/libs/hwui/BakedOpRenderer.cpp
+++ b/libs/hwui/BakedOpRenderer.cpp
@@ -331,9 +331,28 @@
mRenderState.invokeFunctor(op.functor, DrawGlInfo::kModeDraw, &info);
}
+#define VALIDATE_RECT_ARG(rect, arg) \
+ ((isnanf(rect.arg) || rect.arg < -10000 || rect.arg > 10000) ? (\
+ ALOGW("suspicious " #rect "." #arg "! %f", rect.arg),\
+ false) : true)
+
+#define VALIDATE_RECT(rect) \
+ VALIDATE_RECT_ARG(rect, bottom) & \
+ VALIDATE_RECT_ARG(rect, left) & \
+ VALIDATE_RECT_ARG(rect, top) & \
+ VALIDATE_RECT_ARG(rect, right)
+
void BakedOpRenderer::dirtyRenderTarget(const Rect& uiDirty) {
if (mRenderTarget.offscreenBuffer) {
- android::Rect dirty(uiDirty.left, uiDirty.top, uiDirty.right, uiDirty.bottom);
+ bool valid = VALIDATE_RECT(uiDirty);
+ android::Rect dirty;
+ if (valid) {
+ dirty = android::Rect(uiDirty.left, uiDirty.top, uiDirty.right, uiDirty.bottom);
+ } else {
+ dirty = android::Rect(0, 0,
+ mRenderTarget.offscreenBuffer->viewportWidth,
+ mRenderTarget.offscreenBuffer->viewportHeight);
+ }
mRenderTarget.offscreenBuffer->region.orSelf(dirty);
}
}
diff --git a/libs/hwui/BufferPool.h b/libs/hwui/BufferPool.h
new file mode 100644
index 0000000..9bda233
--- /dev/null
+++ b/libs/hwui/BufferPool.h
@@ -0,0 +1,176 @@
+/*
+ * Copyright (C) 2016 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#pragma once
+
+#include <utils/RefBase.h>
+#include <utils/Log.h>
+
+#include <atomic>
+#include <stdint.h>
+#include <memory>
+#include <mutex>
+
+namespace android {
+namespace uirenderer {
+
+/*
+ * Simple thread-safe pool of int64_t arrays of a provided size.
+ *
+ * Permits allocating a client-provided max number of buffers.
+ * If all buffers are in use, refuses to service any more
+ * acquire requests until buffers are re-released to the pool.
+ */
+class BufferPool : public VirtualLightRefBase {
+public:
+ class Buffer {
+ public:
+ int64_t* getBuffer() { return mBuffer.get(); }
+ size_t getSize() { return mSize; }
+
+ void release() {
+ LOG_ALWAYS_FATAL_IF(mPool.get() == nullptr, "attempt to release unacquired buffer");
+ mPool->release(this);
+ }
+
+ Buffer* incRef() {
+ mRefs++;
+ return this;
+ }
+
+ int decRef() {
+ int refs = mRefs.fetch_sub(1);
+ LOG_ALWAYS_FATAL_IF(refs == 0, "buffer reference decremented below 0");
+ return refs - 1;
+ }
+
+ private:
+ friend class BufferPool;
+
+ Buffer(BufferPool* pool, size_t size) {
+ mSize = size;
+ mBuffer.reset(new int64_t[size]);
+ mPool = pool;
+ mRefs++;
+ }
+
+ void setPool(BufferPool* pool) {
+ mPool = pool;
+ }
+
+ std::unique_ptr<Buffer> mNext;
+ std::unique_ptr<int64_t[]> mBuffer;
+ sp<BufferPool> mPool;
+ size_t mSize;
+
+ std::atomic_int mRefs;
+ };
+
+ BufferPool(size_t bufferSize, size_t count)
+ : mBufferSize(bufferSize), mCount(count) {}
+
+ /**
+ * Acquires a buffer from the buffer pool if available.
+ *
+ * Only `mCount` buffers are allowed to be in use at a single
+ * instance.
+ *
+ * If no buffer is available, i.e. `mCount` buffers are in use,
+ * returns nullptr.
+ *
+ * The pointer returned from this method *MUST NOT* be freed, instead
+ * BufferPool::release() must be called upon it when the client
+ * is done with it. Failing to release buffers will eventually make the
+ * BufferPool refuse to service any more BufferPool::acquire() requests.
+ */
+ BufferPool::Buffer* acquire() {
+ std::lock_guard<std::mutex> lock(mLock);
+
+ if (mHead.get() != nullptr) {
+ BufferPool::Buffer* res = mHead.release();
+ mHead = std::move(res->mNext);
+ res->mNext.reset(nullptr);
+ res->setPool(this);
+ res->incRef();
+ return res;
+ }
+
+ if (mAllocatedCount < mCount) {
+ ++mAllocatedCount;
+ return new BufferPool::Buffer(this, mBufferSize);
+ }
+
+ return nullptr;
+ }
+
+ /**
+ * Releases a buffer previously acquired by BufferPool::acquire().
+ *
+ * The released buffer is not valid after calling this method and
+ * attempting to use will result in undefined behavior.
+ */
+ void release(BufferPool::Buffer* buffer) {
+ std::lock_guard<std::mutex> lock(mLock);
+
+ if (buffer->decRef() != 0) {
+ return;
+ }
+
+ buffer->setPool(nullptr);
+
+ BufferPool::Buffer* list = mHead.get();
+ if (list == nullptr) {
+ mHead.reset(buffer);
+ mHead->mNext.reset(nullptr);
+ return;
+ }
+
+ while (list->mNext.get() != nullptr) {
+ list = list->mNext.get();
+ }
+
+ list->mNext.reset(buffer);
+ }
+
+ /*
+ * Used for testing.
+ */
+ size_t getAvailableBufferCount() {
+ size_t remainingToAllocateCount = mCount - mAllocatedCount;
+
+ BufferPool::Buffer* list = mHead.get();
+ if (list == nullptr) return remainingToAllocateCount;
+
+ int count = 1;
+ while (list->mNext.get() != nullptr) {
+ count++;
+ list = list->mNext.get();
+ }
+
+ return count + remainingToAllocateCount;
+ }
+
+private:
+ mutable std::mutex mLock;
+
+ size_t mBufferSize;
+ size_t mCount;
+ size_t mAllocatedCount = 0;
+ std::unique_ptr<BufferPool::Buffer> mHead;
+};
+
+}; // namespace uirenderer
+}; // namespace android
diff --git a/libs/hwui/FrameInfo.h b/libs/hwui/FrameInfo.h
index f8013ab..0baca39 100644
--- a/libs/hwui/FrameInfo.h
+++ b/libs/hwui/FrameInfo.h
@@ -118,6 +118,10 @@
set(FrameInfoIndex::Flags) |= static_cast<uint64_t>(frameInfoFlag);
}
+ const int64_t* data() const {
+ return mFrameInfo;
+ }
+
inline int64_t operator[](FrameInfoIndex index) const {
return get(index);
}
diff --git a/libs/hwui/FrameStatsObserver.h b/libs/hwui/FrameStatsObserver.h
new file mode 100644
index 0000000..7abc9f1
--- /dev/null
+++ b/libs/hwui/FrameStatsObserver.h
@@ -0,0 +1,32 @@
+/*
+ * Copyright (C) 2016 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#pragma once
+
+#include <utils/RefBase.h>
+
+#include "BufferPool.h"
+
+namespace android {
+namespace uirenderer {
+
+class FrameStatsObserver : public VirtualLightRefBase {
+public:
+ virtual void notify(BufferPool::Buffer* buffer);
+};
+
+}; // namespace uirenderer
+}; // namespace android
diff --git a/libs/hwui/FrameStatsReporter.h b/libs/hwui/FrameStatsReporter.h
new file mode 100644
index 0000000..b8a9432
--- /dev/null
+++ b/libs/hwui/FrameStatsReporter.h
@@ -0,0 +1,91 @@
+/*
+ * Copyright (C) 2016 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#pragma once
+
+#include <utils/RefBase.h>
+#include <utils/Log.h>
+
+#include "BufferPool.h"
+#include "FrameInfo.h"
+#include "FrameStatsObserver.h"
+
+#include <string.h>
+#include <vector>
+
+namespace android {
+namespace uirenderer {
+
+class FrameStatsReporter {
+public:
+ FrameStatsReporter() {
+ mBufferPool = new BufferPool(kBufferSize, kBufferCount);
+ LOG_ALWAYS_FATAL_IF(mBufferPool.get() == nullptr, "OOM: unable to allocate buffer pool");
+ }
+
+ void addObserver(FrameStatsObserver* observer) {
+ mObservers.push_back(observer);
+ }
+
+ bool removeObserver(FrameStatsObserver* observer) {
+ for (size_t i = 0; i < mObservers.size(); i++) {
+ if (mObservers[i].get() == observer) {
+ mObservers.erase(mObservers.begin() + i);
+ return true;
+ }
+ }
+ return false;
+ }
+
+ bool hasObservers() {
+ return mObservers.size() > 0;
+ }
+
+ void reportFrameStats(const int64_t* stats) {
+ BufferPool::Buffer* statsBuffer = mBufferPool->acquire();
+
+ if (statsBuffer != nullptr) {
+ // copy in frame stats
+ memcpy(statsBuffer->getBuffer(), stats, kBufferSize * sizeof(*stats));
+
+ // notify on requested threads
+ for (size_t i = 0; i < mObservers.size(); i++) {
+ mObservers[i]->notify(statsBuffer);
+ }
+
+ // drop our reference
+ statsBuffer->release();
+ } else {
+ mDroppedReports++;
+ }
+ }
+
+ int getDroppedReports() { return mDroppedReports; }
+
+private:
+ static const size_t kBufferCount = 3;
+ static const size_t kBufferSize = static_cast<size_t>(FrameInfoIndex::NumIndexes);
+
+ std::vector< sp<FrameStatsObserver> > mObservers;
+
+ sp<BufferPool> mBufferPool;
+
+ int mDroppedReports = 0;
+};
+
+}; // namespace uirenderer
+}; // namespace android
+
diff --git a/libs/hwui/renderthread/CanvasContext.cpp b/libs/hwui/renderthread/CanvasContext.cpp
index 6f8d627..cdd2da0 100644
--- a/libs/hwui/renderthread/CanvasContext.cpp
+++ b/libs/hwui/renderthread/CanvasContext.cpp
@@ -505,6 +505,9 @@
mJankTracker.addFrame(*mCurrentFrameInfo);
mRenderThread.jankTracker().addFrame(*mCurrentFrameInfo);
+ if (CC_UNLIKELY(mFrameStatsReporter.get() != nullptr)) {
+ mFrameStatsReporter->reportFrameStats(mCurrentFrameInfo->data());
+ }
GpuMemoryTracker::onFrameCompleted();
}
diff --git a/libs/hwui/renderthread/CanvasContext.h b/libs/hwui/renderthread/CanvasContext.h
index 8e64cbb..270fb1f 100644
--- a/libs/hwui/renderthread/CanvasContext.h
+++ b/libs/hwui/renderthread/CanvasContext.h
@@ -20,6 +20,7 @@
#include "DamageAccumulator.h"
#include "FrameInfo.h"
#include "FrameInfoVisualizer.h"
+#include "FrameStatsReporter.h"
#include "IContextFactory.h"
#include "LayerUpdateQueue.h"
#include "RenderNode.h"
@@ -139,6 +140,31 @@
return mRenderThread.renderState();
}
+ void addFrameStatsObserver(FrameStatsObserver* observer) {
+ if (mFrameStatsReporter.get() == nullptr) {
+ mFrameStatsReporter.reset(new FrameStatsReporter());
+ }
+
+ mFrameStatsReporter->addObserver(observer);
+ }
+
+ void removeFrameStatsObserver(FrameStatsObserver* observer) {
+ if (mFrameStatsReporter.get() != nullptr) {
+ mFrameStatsReporter->removeObserver(observer);
+ if (!mFrameStatsReporter->hasObservers()) {
+ mFrameStatsReporter.reset(nullptr);
+ }
+ }
+ }
+
+ long getDroppedFrameReportCount() {
+ if (mFrameStatsReporter.get() != nullptr) {
+ return mFrameStatsReporter->getDroppedReports();
+ }
+
+ return 0;
+ }
+
private:
friend class RegisterFrameCallbackTask;
// TODO: Replace with something better for layer & other GL object
@@ -187,6 +213,7 @@
std::string mName;
JankTracker mJankTracker;
FrameInfoVisualizer mProfiler;
+ std::unique_ptr<FrameStatsReporter> mFrameStatsReporter;
std::set<RenderNode*> mPrefetechedLayers;
diff --git a/libs/hwui/renderthread/RenderProxy.cpp b/libs/hwui/renderthread/RenderProxy.cpp
index db2a2c8..1d1b144 100644
--- a/libs/hwui/renderthread/RenderProxy.cpp
+++ b/libs/hwui/renderthread/RenderProxy.cpp
@@ -568,6 +568,54 @@
post(task);
}
+CREATE_BRIDGE2(addFrameStatsObserver, CanvasContext* context,
+ FrameStatsObserver* frameStatsObserver) {
+ args->context->addFrameStatsObserver(args->frameStatsObserver);
+ if (args->frameStatsObserver != nullptr) {
+ args->frameStatsObserver->decStrong(args->context);
+ }
+ return nullptr;
+}
+
+void RenderProxy::addFrameStatsObserver(FrameStatsObserver* observer) {
+ SETUP_TASK(addFrameStatsObserver);
+ args->context = mContext;
+ args->frameStatsObserver = observer;
+ if (observer != nullptr) {
+ observer->incStrong(mContext);
+ }
+ post(task);
+}
+
+CREATE_BRIDGE2(removeFrameStatsObserver, CanvasContext* context,
+ FrameStatsObserver* frameStatsObserver) {
+ args->context->removeFrameStatsObserver(args->frameStatsObserver);
+ if (args->frameStatsObserver != nullptr) {
+ args->frameStatsObserver->decStrong(args->context);
+ }
+ return nullptr;
+}
+
+void RenderProxy::removeFrameStatsObserver(FrameStatsObserver* observer) {
+ SETUP_TASK(removeFrameStatsObserver);
+ args->context = mContext;
+ args->frameStatsObserver = observer;
+ if (observer != nullptr) {
+ observer->incStrong(mContext);
+ }
+ post(task);
+}
+
+CREATE_BRIDGE1(getDroppedFrameReportCount, CanvasContext* context) {
+ return (void*) args->context->getDroppedFrameReportCount();
+}
+
+long RenderProxy::getDroppedFrameReportCount() {
+ SETUP_TASK(getDroppedFrameReportCount);
+ args->context = mContext;
+ return (long) postAndWait(task);
+}
+
void RenderProxy::post(RenderTask* task) {
mRenderThread.queue(task);
}
diff --git a/libs/hwui/renderthread/RenderProxy.h b/libs/hwui/renderthread/RenderProxy.h
index 0f91b2a..4180d802 100644
--- a/libs/hwui/renderthread/RenderProxy.h
+++ b/libs/hwui/renderthread/RenderProxy.h
@@ -29,6 +29,7 @@
#include <utils/StrongPointer.h>
#include "../Caches.h"
+#include "../FrameStatsObserver.h"
#include "../IContextFactory.h"
#include "CanvasContext.h"
#include "DrawFrameTask.h"
@@ -112,6 +113,10 @@
ANDROID_API void drawRenderNode(RenderNode* node);
ANDROID_API void setContentDrawBounds(int left, int top, int right, int bottom);
+ ANDROID_API void addFrameStatsObserver(FrameStatsObserver* observer);
+ ANDROID_API void removeFrameStatsObserver(FrameStatsObserver* observer);
+ ANDROID_API long getDroppedFrameReportCount();
+
private:
RenderThread& mRenderThread;
CanvasContext* mContext;
diff --git a/libs/hwui/tests/unit/BufferPoolTests.cpp b/libs/hwui/tests/unit/BufferPoolTests.cpp
new file mode 100644
index 0000000..09bd302
--- /dev/null
+++ b/libs/hwui/tests/unit/BufferPoolTests.cpp
@@ -0,0 +1,101 @@
+/*
+ * Copyright (C) 2016 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <gtest/gtest.h>
+
+#include <BufferPool.h>
+#include <utils/StrongPointer.h>
+
+namespace android {
+namespace uirenderer {
+
+TEST(BufferPool, acquireThenRelease) {
+ static const int numRuns = 5;
+
+ // 10 buffers of size 1
+ static const size_t bufferSize = 1;
+ static const size_t bufferCount = 10;
+ sp<BufferPool> pool = new BufferPool(bufferSize, bufferCount);
+
+ for (int run = 0; run < numRuns; run++) {
+ BufferPool::Buffer* acquiredBuffers[bufferCount];
+ for (size_t i = 0; i < bufferCount; i++) {
+ ASSERT_EQ(bufferCount - i, pool->getAvailableBufferCount());
+ acquiredBuffers[i] = pool->acquire();
+ ASSERT_NE(nullptr, acquiredBuffers[i]);
+ }
+
+ for (size_t i = 0; i < bufferCount; i++) {
+ ASSERT_EQ(i, pool->getAvailableBufferCount());
+ acquiredBuffers[i]->release();
+ acquiredBuffers[i] = nullptr;
+ }
+
+ ASSERT_EQ(bufferCount, pool->getAvailableBufferCount());
+ }
+}
+
+TEST(BufferPool, acquireReleaseInterleaved) {
+ static const int numRuns = 5;
+
+ // 10 buffers of size 1
+ static const size_t bufferSize = 1;
+ static const size_t bufferCount = 10;
+
+ sp<BufferPool> pool = new BufferPool(bufferSize, bufferCount);
+
+ for (int run = 0; run < numRuns; run++) {
+ BufferPool::Buffer* acquiredBuffers[bufferCount];
+
+ // acquire all
+ for (size_t i = 0; i < bufferCount; i++) {
+ ASSERT_EQ(bufferCount - i, pool->getAvailableBufferCount());
+ acquiredBuffers[i] = pool->acquire();
+ ASSERT_NE(nullptr, acquiredBuffers[i]);
+ }
+
+ // release half
+ for (size_t i = 0; i < bufferCount / 2; i++) {
+ ASSERT_EQ(i, pool->getAvailableBufferCount());
+ acquiredBuffers[i]->release();
+ acquiredBuffers[i] = nullptr;
+ }
+
+ const size_t expectedRemaining = bufferCount / 2;
+ ASSERT_EQ(expectedRemaining, pool->getAvailableBufferCount());
+
+ // acquire half
+ for (size_t i = 0; i < bufferCount / 2; i++) {
+ ASSERT_EQ(expectedRemaining - i, pool->getAvailableBufferCount());
+ acquiredBuffers[i] = pool->acquire();
+ }
+
+ // acquire one more, should fail
+ ASSERT_EQ(nullptr, pool->acquire());
+
+ // release all
+ for (size_t i = 0; i < bufferCount; i++) {
+ ASSERT_EQ(i, pool->getAvailableBufferCount());
+ acquiredBuffers[i]->release();
+ acquiredBuffers[i] = nullptr;
+ }
+
+ ASSERT_EQ(bufferCount, pool->getAvailableBufferCount());
+ }
+}
+
+};
+};
diff --git a/libs/hwui/utils/TestWindowContext.cpp b/libs/hwui/utils/TestWindowContext.cpp
index dcc4946..b0431ce 100644
--- a/libs/hwui/utils/TestWindowContext.cpp
+++ b/libs/hwui/utils/TestWindowContext.cpp
@@ -138,8 +138,8 @@
// Move the pixels into the destination SkBitmap
- SK_ALWAYSBREAK(nativeBuffer.format == android::PIXEL_FORMAT_RGBA_8888 &&
- "Native buffer not RGBA!");
+ LOG_ALWAYS_FATAL_IF(nativeBuffer.format != android::PIXEL_FORMAT_RGBA_8888,
+ "Native buffer not RGBA!");
SkImageInfo nativeConfig =
SkImageInfo::Make(nativeBuffer.width, nativeBuffer.height,
kRGBA_8888_SkColorType, kPremul_SkAlphaType);
@@ -153,8 +153,8 @@
return false;
}
- SK_ALWAYSBREAK(bmp->colorType() == kRGBA_8888_SkColorType &&
- "Destination buffer not RGBA!");
+ LOG_ALWAYS_FATAL_IF(bmp->colorType() != kRGBA_8888_SkColorType,
+ "Destination buffer not RGBA!");
success =
nativeWrapper.readPixels(destinationConfig, bmp->getPixels(), bmp->rowBytes(), 0, 0);
if (!success) {
diff --git a/media/java/android/media/tv/ITvInputClient.aidl b/media/java/android/media/tv/ITvInputClient.aidl
index 86c0e5d..8ef5ca0 100644
--- a/media/java/android/media/tv/ITvInputClient.aidl
+++ b/media/java/android/media/tv/ITvInputClient.aidl
@@ -43,4 +43,10 @@
void onTimeShiftStatusChanged(int status, int seq);
void onTimeShiftStartPositionChanged(long timeMs, int seq);
void onTimeShiftCurrentPositionChanged(long timeMs, int seq);
+
+ // For the recording session
+ void onConnected(int seq);
+ void onRecordingStarted(int seq);
+ void onRecordingStopped(in Uri recordedProgramUri, int seq);
+ void onError(int error, int seq);
}
diff --git a/media/java/android/media/tv/ITvInputManager.aidl b/media/java/android/media/tv/ITvInputManager.aidl
index f8057db..0febc16 100644
--- a/media/java/android/media/tv/ITvInputManager.aidl
+++ b/media/java/android/media/tv/ITvInputManager.aidl
@@ -55,7 +55,8 @@
void addBlockedRating(in String rating, int userId);
void removeBlockedRating(in String rating, int userId);
- void createSession(in ITvInputClient client, in String inputId, int seq, int userId);
+ void createSession(in ITvInputClient client, in String inputId, boolean isRecordingSession,
+ int seq, int userId);
void releaseSession(in IBinder sessionToken, int userId);
void setMainSession(in IBinder sessionToken, int userId);
@@ -77,12 +78,18 @@
void unblockContent(in IBinder sessionToken, in String unblockedRating, int userId);
+ void timeShiftPlay(in IBinder sessionToken, in Uri recordedProgramUri, int userId);
void timeShiftPause(in IBinder sessionToken, int userId);
void timeShiftResume(in IBinder sessionToken, int userId);
void timeShiftSeekTo(in IBinder sessionToken, long timeMs, int userId);
void timeShiftSetPlaybackParams(in IBinder sessionToken, in PlaybackParams params, int userId);
void timeShiftEnablePositionTracking(in IBinder sessionToken, boolean enable, int userId);
+ // For the recording session
+ void connect(in IBinder sessionToken, in Uri channelUri, in Bundle params, int userId);
+ void startRecording(in IBinder sessionToken, int userId);
+ void stopRecording(in IBinder sessionToken, int userId);
+
// For TV input hardware binding
List<TvInputHardwareInfo> getHardwareList();
ITvInputHardware acquireTvInputHardware(int deviceId, in ITvInputHardwareCallback callback,
diff --git a/media/java/android/media/tv/ITvInputManagerCallback.aidl b/media/java/android/media/tv/ITvInputManagerCallback.aidl
index 6792680..3bf415b 100644
--- a/media/java/android/media/tv/ITvInputManagerCallback.aidl
+++ b/media/java/android/media/tv/ITvInputManagerCallback.aidl
@@ -16,13 +16,18 @@
package android.media.tv;
+import android.media.tv.TvInputInfo;
+
/**
* Interface to receive callbacks from ITvInputManager regardless of sessions.
* @hide
*/
oneway interface ITvInputManagerCallback {
- void onInputStateChanged(in String inputId, int state);
void onInputAdded(in String inputId);
void onInputRemoved(in String inputId);
void onInputUpdated(in String inputId);
+
+ void onInputStateChanged(in String inputId, int state);
+
+ void onTvInputInfoChanged(in String inputId, in TvInputInfo TvInputInfo);
}
diff --git a/media/java/android/media/tv/ITvInputService.aidl b/media/java/android/media/tv/ITvInputService.aidl
index 7a853d1..bd05184 100644
--- a/media/java/android/media/tv/ITvInputService.aidl
+++ b/media/java/android/media/tv/ITvInputService.aidl
@@ -27,10 +27,11 @@
* @hide
*/
oneway interface ITvInputService {
- void registerCallback(ITvInputServiceCallback callback);
+ void registerCallback(in ITvInputServiceCallback callback);
void unregisterCallback(in ITvInputServiceCallback callback);
- void createSession(in InputChannel channel, ITvInputSessionCallback callback,
+ void createSession(in InputChannel channel, in ITvInputSessionCallback callback,
in String inputId);
+ void createRecordingSession(in ITvInputSessionCallback callback, in String inputId);
// For hardware TvInputService
void notifyHardwareAdded(in TvInputHardwareInfo hardwareInfo);
diff --git a/media/java/android/media/tv/ITvInputServiceCallback.aidl b/media/java/android/media/tv/ITvInputServiceCallback.aidl
index 74ab562..9f13882 100644
--- a/media/java/android/media/tv/ITvInputServiceCallback.aidl
+++ b/media/java/android/media/tv/ITvInputServiceCallback.aidl
@@ -27,4 +27,6 @@
void addHardwareTvInput(in int deviceId, in TvInputInfo inputInfo);
void addHdmiTvInput(in int id, in TvInputInfo inputInfo);
void removeTvInput(in String inputId);
+
+ void setTvInputInfo(in String inputId, in TvInputInfo inputInfo);
}
diff --git a/media/java/android/media/tv/ITvInputSession.aidl b/media/java/android/media/tv/ITvInputSession.aidl
index 6a06b8f..408a762 100644
--- a/media/java/android/media/tv/ITvInputSession.aidl
+++ b/media/java/android/media/tv/ITvInputSession.aidl
@@ -48,9 +48,16 @@
void unblockContent(in String unblockedRating);
+ void timeShiftPlay(in Uri recordedProgramUri);
void timeShiftPause();
void timeShiftResume();
void timeShiftSeekTo(long timeMs);
void timeShiftSetPlaybackParams(in PlaybackParams params);
void timeShiftEnablePositionTracking(boolean enable);
+
+ // For the recording session
+ void connect(in Uri channelUri, in Bundle params);
+ void disconnect();
+ void startRecording();
+ void stopRecording();
}
diff --git a/media/java/android/media/tv/ITvInputSessionCallback.aidl b/media/java/android/media/tv/ITvInputSessionCallback.aidl
index e936810..cb6a05e 100644
--- a/media/java/android/media/tv/ITvInputSessionCallback.aidl
+++ b/media/java/android/media/tv/ITvInputSessionCallback.aidl
@@ -40,4 +40,10 @@
void onTimeShiftStatusChanged(int status);
void onTimeShiftStartPositionChanged(long timeMs);
void onTimeShiftCurrentPositionChanged(long timeMs);
+
+ // For the recording session
+ void onConnected();
+ void onRecordingStarted();
+ void onRecordingStopped(in Uri recordedProgramUri);
+ void onError(int error);
}
diff --git a/media/java/android/media/tv/ITvInputSessionWrapper.java b/media/java/android/media/tv/ITvInputSessionWrapper.java
index f8c6f3f..4ac5876 100644
--- a/media/java/android/media/tv/ITvInputSessionWrapper.java
+++ b/media/java/android/media/tv/ITvInputSessionWrapper.java
@@ -59,20 +59,29 @@
private static final int DO_RELAYOUT_OVERLAY_VIEW = 11;
private static final int DO_REMOVE_OVERLAY_VIEW = 12;
private static final int DO_UNBLOCK_CONTENT = 13;
- private static final int DO_TIME_SHIFT_PAUSE = 14;
- private static final int DO_TIME_SHIFT_RESUME = 15;
- private static final int DO_TIME_SHIFT_SEEK_TO = 16;
- private static final int DO_TIME_SHIFT_SET_PLAYBACK_PARAMS = 17;
- private static final int DO_TIME_SHIFT_ENABLE_POSITION_TRACKING = 18;
+ private static final int DO_TIME_SHIFT_PLAY = 14;
+ private static final int DO_TIME_SHIFT_PAUSE = 15;
+ private static final int DO_TIME_SHIFT_RESUME = 16;
+ private static final int DO_TIME_SHIFT_SEEK_TO = 17;
+ private static final int DO_TIME_SHIFT_SET_PLAYBACK_PARAMS = 18;
+ private static final int DO_TIME_SHIFT_ENABLE_POSITION_TRACKING = 19;
+ private static final int DO_CONNECT = 20;
+ private static final int DO_DISCONNECT = 21;
+ private static final int DO_START_RECORDING = 22;
+ private static final int DO_STOP_RECORDING = 23;
+ private final boolean mIsRecordingSession;
private final HandlerCaller mCaller;
private TvInputService.Session mTvInputSessionImpl;
+ private TvInputService.RecordingSession mTvInputRecordingSessionImpl;
+
private InputChannel mChannel;
private TvInputEventReceiver mReceiver;
public ITvInputSessionWrapper(Context context, TvInputService.Session sessionImpl,
InputChannel channel) {
+ mIsRecordingSession = false;
mCaller = new HandlerCaller(context, null, this, true /* asyncHandler */);
mTvInputSessionImpl = sessionImpl;
mChannel = channel;
@@ -81,9 +90,19 @@
}
}
+ public ITvInputSessionWrapper(Context context,
+ TvInputService.RecordingSession recordingSessionImpl) {
+ mIsRecordingSession = true;
+ mCaller = new HandlerCaller(context, null, this, true /* asyncHandler */);
+ mTvInputRecordingSessionImpl = recordingSessionImpl;
+ }
+
@Override
public void executeMessage(Message msg) {
- if (mTvInputSessionImpl == null) {
+ if (!mIsRecordingSession && mTvInputSessionImpl == null) {
+ return;
+ }
+ if (mIsRecordingSession && mTvInputRecordingSessionImpl == null) {
return;
}
@@ -138,7 +157,12 @@
}
case DO_APP_PRIVATE_COMMAND: {
SomeArgs args = (SomeArgs) msg.obj;
- mTvInputSessionImpl.appPrivateCommand((String) args.arg1, (Bundle) args.arg2);
+ if (mIsRecordingSession) {
+ mTvInputRecordingSessionImpl.appPrivateCommand(
+ (String) args.arg1, (Bundle) args.arg2);
+ } else {
+ mTvInputSessionImpl.appPrivateCommand((String) args.arg1, (Bundle) args.arg2);
+ }
args.recycle();
break;
}
@@ -160,6 +184,10 @@
mTvInputSessionImpl.unblockContent((String) msg.obj);
break;
}
+ case DO_TIME_SHIFT_PLAY: {
+ mTvInputSessionImpl.timeShiftPlay((Uri) msg.obj);
+ break;
+ }
case DO_TIME_SHIFT_PAUSE: {
mTvInputSessionImpl.timeShiftPause();
break;
@@ -180,6 +208,25 @@
mTvInputSessionImpl.timeShiftEnablePositionTracking((Boolean) msg.obj);
break;
}
+ case DO_CONNECT: {
+ SomeArgs args = (SomeArgs) msg.obj;
+ mTvInputRecordingSessionImpl.connect((Uri) args.arg1, (Bundle) args.arg2);
+ args.recycle();
+ break;
+ }
+ case DO_DISCONNECT: {
+ mTvInputRecordingSessionImpl.disconnect();
+ mTvInputRecordingSessionImpl = null;
+ break;
+ }
+ case DO_START_RECORDING: {
+ mTvInputRecordingSessionImpl.startRecording();
+ break;
+ }
+ case DO_STOP_RECORDING: {
+ mTvInputRecordingSessionImpl.stopRecording();
+ break;
+ }
default: {
Log.w(TAG, "Unhandled message code: " + msg.what);
break;
@@ -274,6 +321,12 @@
}
@Override
+ public void timeShiftPlay(Uri recordedProgramUri) {
+ mCaller.executeOrSendMessage(mCaller.obtainMessageO(
+ DO_TIME_SHIFT_PLAY, recordedProgramUri));
+ }
+
+ @Override
public void timeShiftPause() {
mCaller.executeOrSendMessage(mCaller.obtainMessage(DO_TIME_SHIFT_PAUSE));
}
@@ -300,6 +353,28 @@
DO_TIME_SHIFT_ENABLE_POSITION_TRACKING, enable));
}
+ @Override
+ public void connect(Uri channelUri, Bundle params) {
+ // Clear the pending connect requests.
+ mCaller.removeMessages(DO_CONNECT);
+ mCaller.executeOrSendMessage(mCaller.obtainMessageOO(DO_CONNECT, channelUri, params));
+ }
+
+ @Override
+ public void disconnect() {
+ mCaller.executeOrSendMessage(mCaller.obtainMessage(DO_DISCONNECT));
+ }
+
+ @Override
+ public void startRecording() {
+ mCaller.executeOrSendMessage(mCaller.obtainMessage(DO_START_RECORDING));
+ }
+
+ @Override
+ public void stopRecording() {
+ mCaller.executeOrSendMessage(mCaller.obtainMessage(DO_STOP_RECORDING));
+ }
+
private final class TvInputEventReceiver extends InputEventReceiver {
public TvInputEventReceiver(InputChannel inputChannel, Looper looper) {
super(inputChannel, looper);
diff --git a/media/java/android/media/tv/TvContract.java b/media/java/android/media/tv/TvContract.java
index 7cd086e..62a01dc 100644
--- a/media/java/android/media/tv/TvContract.java
+++ b/media/java/android/media/tv/TvContract.java
@@ -54,6 +54,7 @@
private static final String PATH_CHANNEL = "channel";
private static final String PATH_PROGRAM = "program";
+ private static final String PATH_RECORDED_PROGRAM = "recorded_program";
private static final String PATH_PASSTHROUGH = "passthrough";
/**
@@ -273,6 +274,15 @@
}
/**
+ * Builds a URI that points to a specific recorded program.
+ *
+ * @param recordedProgramId The ID of the recorded program to point to.
+ */
+ public static final Uri buildRecordedProgramUri(long recordedProgramId) {
+ return ContentUris.withAppendedId(RecordedPrograms.CONTENT_URI, recordedProgramId);
+ }
+
+ /**
* Builds a URI that points to a specific program the user watched.
*
* @param watchedProgramId The ID of the watched program to point to.
@@ -941,6 +951,8 @@
*
* <p>This is a part of the channel URI and matches to {@link BaseColumns#_ID}.
*
+ * <p>This is a required field.
+ *
* <p>Type: INTEGER (long)
*/
public static final String COLUMN_CHANNEL_ID = "channel_id";
@@ -1336,6 +1348,382 @@
}
/**
+ * Column definitions for the recorded TV programs table.
+ *
+ * <p>By default, the query results will be sorted by {@link #COLUMN_START_TIME_UTC_MILLIS} in
+ * ascending order.
+ */
+ public static final class RecordedPrograms implements BaseTvColumns {
+
+ /** The content:// style URI for this table. */
+ public static final Uri CONTENT_URI = Uri.parse("content://" + AUTHORITY + "/"
+ + PATH_RECORDED_PROGRAM);
+
+ /** The MIME type of a directory of recorded TV programs. */
+ public static final String CONTENT_TYPE = "vnd.android.cursor.dir/recorded_program";
+
+ /** The MIME type of a single recorded TV program. */
+ public static final String CONTENT_ITEM_TYPE = "vnd.android.cursor.item/recorded_program";
+
+ /**
+ * The ID of the TV channel that provided this recorded TV program.
+ *
+ * <p>This is a part of the channel URI and matches to {@link BaseColumns#_ID}.
+ *
+ * <p>This is a required field.
+ *
+ * <p>Type: INTEGER (long)
+ * @see Programs#COLUMN_CHANNEL_ID
+ */
+ public static final String COLUMN_CHANNEL_ID = Programs.COLUMN_CHANNEL_ID;
+
+ /**
+ * The title of this recorded TV program.
+ *
+ * <p>If this recorded program is an episodic TV show, it is recommended that the title is
+ * the series title and its related fields ({@link #COLUMN_SEASON_NUMBER},
+ * {@link #COLUMN_EPISODE_NUMBER}, and {@link #COLUMN_EPISODE_TITLE}) are filled in.
+ *
+ * <p>Type: TEXT
+ * @see Programs#COLUMN_TITLE
+ */
+ public static final String COLUMN_TITLE = Programs.COLUMN_TITLE;
+
+ /**
+ * The season number of this recorded TV program for episodic TV shows.
+ *
+ * <p>Can be empty.
+ *
+ * <p>Type: INTEGER
+ * @see Programs#COLUMN_SEASON_NUMBER
+ */
+ public static final String COLUMN_SEASON_NUMBER = Programs.COLUMN_SEASON_NUMBER;
+
+ /**
+ * The episode number of this recorded TV program for episodic TV shows.
+ *
+ * <p>Can be empty.
+ *
+ * <p>Type: INTEGER
+ * @see Programs#COLUMN_EPISODE_NUMBER
+ */
+ public static final String COLUMN_EPISODE_NUMBER = Programs.COLUMN_EPISODE_NUMBER;
+
+ /**
+ * The episode title of this recorded TV program for episodic TV shows.
+ *
+ * <p>Can be empty.
+ *
+ * <p>Type: TEXT
+ * @see Programs#COLUMN_EPISODE_TITLE
+ */
+ public static final String COLUMN_EPISODE_TITLE = Programs.COLUMN_EPISODE_TITLE;
+
+ /**
+ * The start time of the original TV program, in milliseconds since the epoch.
+ *
+ * <p>Type: INTEGER (long)
+ * @see Programs#COLUMN_START_TIME_UTC_MILLIS
+ */
+ public static final String COLUMN_START_TIME_UTC_MILLIS =
+ Programs.COLUMN_START_TIME_UTC_MILLIS;
+
+ /**
+ * The end time of the original TV program, in milliseconds since the epoch.
+ *
+ * <p>Type: INTEGER (long)
+ * @see Programs#COLUMN_END_TIME_UTC_MILLIS
+ */
+ public static final String COLUMN_END_TIME_UTC_MILLIS = Programs.COLUMN_END_TIME_UTC_MILLIS;
+
+ /**
+ * The comma-separated genre string of this recorded TV program.
+ *
+ * <p>Use the same language appeared in the underlying broadcast standard, if applicable.
+ * (For example, one can refer to the genre strings used in Genre Descriptor of ATSC A/65 or
+ * Content Descriptor of ETSI EN 300 468, if appropriate.) Otherwise, leave empty.
+ *
+ * <p>Type: TEXT
+ * @see Programs#COLUMN_BROADCAST_GENRE
+ */
+ public static final String COLUMN_BROADCAST_GENRE = Programs.COLUMN_BROADCAST_GENRE;
+
+ /**
+ * The comma-separated canonical genre string of this recorded TV program.
+ *
+ * <p>Canonical genres are defined in {@link Programs.Genres}. Use
+ * {@link Programs.Genres#encode Genres.encode()} to create a text that can be stored in
+ * this column. Use {@link Programs.Genres#decode Genres.decode()} to get the canonical
+ * genre strings from the text stored in this column.
+ *
+ * <p>Type: TEXT
+ * @see Programs#COLUMN_CANONICAL_GENRE
+ * @see Programs.Genres
+ */
+ public static final String COLUMN_CANONICAL_GENRE = Programs.COLUMN_CANONICAL_GENRE;
+
+ /**
+ * The short description of this recorded TV program that is displayed to the user by
+ * default.
+ *
+ * <p>It is recommended to limit the length of the descriptions to 256 characters.
+ *
+ * <p>Type: TEXT
+ * @see Programs#COLUMN_SHORT_DESCRIPTION
+ */
+ public static final String COLUMN_SHORT_DESCRIPTION = Programs.COLUMN_SHORT_DESCRIPTION;
+
+ /**
+ * The detailed, lengthy description of this recorded TV program that is displayed only when
+ * the user wants to see more information.
+ *
+ * <p>TV input services should leave this field empty if they have no additional details
+ * beyond {@link #COLUMN_SHORT_DESCRIPTION}.
+ *
+ * <p>Type: TEXT
+ * @see Programs#COLUMN_LONG_DESCRIPTION
+ */
+ public static final String COLUMN_LONG_DESCRIPTION = Programs.COLUMN_LONG_DESCRIPTION;
+
+ /**
+ * The width of the video for this recorded TV program, in the unit of pixels.
+ *
+ * <p>Together with {@link #COLUMN_VIDEO_HEIGHT} this is used to determine the video
+ * resolution of the current recorded TV program. Can be empty if it is not known or the
+ * recorded program does not convey any video.
+ *
+ * <p>Type: INTEGER
+ * @see Programs#COLUMN_VIDEO_WIDTH
+ */
+ public static final String COLUMN_VIDEO_WIDTH = Programs.COLUMN_VIDEO_WIDTH;
+
+ /**
+ * The height of the video for this recorded TV program, in the unit of pixels.
+ *
+ * <p>Together with {@link #COLUMN_VIDEO_WIDTH} this is used to determine the video
+ * resolution of the current recorded TV program. Can be empty if it is not known or the
+ * recorded program does not convey any video.
+ *
+ * <p>Type: INTEGER
+ * @see Programs#COLUMN_VIDEO_HEIGHT
+ */
+ public static final String COLUMN_VIDEO_HEIGHT = Programs.COLUMN_VIDEO_HEIGHT;
+
+ /**
+ * The comma-separated audio languages of this recorded TV program.
+ *
+ * <p>This is used to describe available audio languages included in the recorded program.
+ * Use either ISO 639-1 or 639-2/T codes.
+ *
+ * <p>Type: TEXT
+ * @see Programs#COLUMN_AUDIO_LANGUAGE
+ */
+ public static final String COLUMN_AUDIO_LANGUAGE = Programs.COLUMN_AUDIO_LANGUAGE;
+
+ /**
+ * The comma-separated content ratings of this recorded TV program.
+ *
+ * <p>This is used to describe the content rating(s) of this recorded program. Each
+ * comma-separated content rating sub-string should be generated by calling
+ * {@link TvContentRating#flattenToString}. Note that in most cases the recorded program
+ * content is rated by a single rating system, thus resulting in a corresponding single
+ * sub-string that does not require comma separation and multiple sub-strings appear only
+ * when the recorded program content is rated by two or more content rating systems. If any
+ * of those ratings is specified as "blocked rating" in the user's parental control
+ * settings, the TV input service should block the current content and wait for the signal
+ * that it is okay to unblock.
+ *
+ * <p>Type: TEXT
+ * @see Programs#COLUMN_CONTENT_RATING
+ */
+ public static final String COLUMN_CONTENT_RATING = Programs.COLUMN_CONTENT_RATING;
+
+ /**
+ * The URI for the poster art of this recorded TV program.
+ *
+ * <p>The data in the column must be a URL, or a URI in one of the following formats:
+ *
+ * <ul>
+ * <li>content ({@link android.content.ContentResolver#SCHEME_CONTENT})</li>
+ * <li>android.resource ({@link android.content.ContentResolver#SCHEME_ANDROID_RESOURCE})
+ * </li>
+ * <li>file ({@link android.content.ContentResolver#SCHEME_FILE})</li>
+ * </ul>
+ *
+ * <p>Can be empty.
+ *
+ * <p>Type: TEXT
+ * @see Programs#COLUMN_POSTER_ART_URI
+ */
+ public static final String COLUMN_POSTER_ART_URI = Programs.COLUMN_POSTER_ART_URI;
+
+ /**
+ * The URI for the thumbnail of this recorded TV program.
+ *
+ * <p>The system can generate a thumbnail from the poster art if this column is not
+ * specified. Thus it is not necessary for TV input services to include a thumbnail if it is
+ * just a scaled image of the poster art.
+ *
+ * <p>The data in the column must be a URL, or a URI in one of the following formats:
+ *
+ * <ul>
+ * <li>content ({@link android.content.ContentResolver#SCHEME_CONTENT})</li>
+ * <li>android.resource ({@link android.content.ContentResolver#SCHEME_ANDROID_RESOURCE})
+ * </li>
+ * <li>file ({@link android.content.ContentResolver#SCHEME_FILE})</li>
+ * </ul>
+ *
+ * <p>Can be empty.
+ *
+ * <p>Type: TEXT
+ * @see Programs#COLUMN_THUMBNAIL_URI
+ */
+ public static final String COLUMN_THUMBNAIL_URI = Programs.COLUMN_THUMBNAIL_URI;
+
+ /**
+ * The flag indicating whether this recorded TV program is searchable or not.
+ *
+ * <p>The columns of searchable recorded programs can be read by other applications that
+ * have proper permission. Care must be taken not to open sensitive data.
+ *
+ * <p>A value of 1 indicates that the recorded program is searchable and its columns can be
+ * read by other applications, a value of 0 indicates that the recorded program is hidden
+ * and its columns can be read only by the package that owns the recorded program and the
+ * system. If not specified, this value is set to 1 (searchable) by default.
+ *
+ * <p>Type: INTEGER (boolean)
+ * @see Programs#COLUMN_SEARCHABLE
+ */
+ public static final String COLUMN_SEARCHABLE = Programs.COLUMN_SEARCHABLE;
+
+ /**
+ * The URI of the recording data for this recorded program.
+ *
+ * <p>Together with {@link #COLUMN_RECORDING_DATA_BYTES}, applications can use this
+ * information to manage recording storage. The URI should indicate a file or directory with
+ * the scheme {@link android.content.ContentResolver#SCHEME_FILE}.
+ *
+ * <p>Type: TEXT
+ * @see #COLUMN_RECORDING_DATA_BYTES
+ */
+ public static final String COLUMN_RECORDING_DATA_URI = "recording_data_uri";
+
+ /**
+ * The data size (in bytes) for this recorded program.
+ *
+ * <p>Together with {@link #COLUMN_RECORDING_DATA_URI}, applications can use this
+ * information to manage recording storage.
+ *
+ * <p>Type: INTEGER (long)
+ * @see #COLUMN_RECORDING_DATA_URI
+ */
+ public static final String COLUMN_RECORDING_DATA_BYTES = "recording_data_bytes";
+
+ /**
+ * The duration (in milliseconds) of this recorded program.
+ *
+ * <p>The actual duration of the recorded program can differ from the one calculated by
+ * {@link #COLUMN_END_TIME_UTC_MILLIS} - {@link #COLUMN_START_TIME_UTC_MILLIS} as program
+ * recording can be interrupted in the middle for some reason, resulting in a partially
+ * recorded program, which is still playable.
+ *
+ * <p>Type: INTEGER
+ */
+ public static final String COLUMN_RECORDING_DURATION_MILLIS = "recording_duration_millis";
+
+ /**
+ * The expiration time for this recorded program, in milliseconds since the epoch.
+ *
+ * <p>Recorded TV programs do not expire by default unless explicitly requested by the user
+ * or the user allows applications to delete them in order to free up disk space for future
+ * recording. However, some TV content can have expiration date set by the content provider
+ * when recorded. This field is used to indicate such a restriction.
+ *
+ * <p>Can be empty.
+ *
+ * <p>Type: INTEGER (long)
+ */
+ public static final String COLUMN_RECORDING_EXPIRE_TIME_UTC_MILLIS =
+ "recording_expire_time_utc_millis";
+
+
+ /**
+ * Internal data used by individual TV input services.
+ *
+ * <p>This is internal to the provider that inserted it, and should not be decoded by other
+ * apps.
+ *
+ * <p>Type: BLOB
+ * @see Programs#COLUMN_INTERNAL_PROVIDER_DATA
+ */
+ public static final String COLUMN_INTERNAL_PROVIDER_DATA =
+ Programs.COLUMN_INTERNAL_PROVIDER_DATA;
+
+ /**
+ * Internal integer flag used by individual TV input services.
+ *
+ * <p>This is internal to the provider that inserted it, and should not be decoded by other
+ * apps.
+ *
+ * <p>Type: INTEGER
+ * @see Programs#COLUMN_INTERNAL_PROVIDER_FLAG1
+ */
+ public static final String COLUMN_INTERNAL_PROVIDER_FLAG1 =
+ Programs.COLUMN_INTERNAL_PROVIDER_FLAG1;
+
+ /**
+ * Internal integer flag used by individual TV input services.
+ *
+ * <p>This is internal to the provider that inserted it, and should not be decoded by other
+ * apps.
+ *
+ * <p>Type: INTEGER
+ * @see Programs#COLUMN_INTERNAL_PROVIDER_FLAG2
+ */
+ public static final String COLUMN_INTERNAL_PROVIDER_FLAG2 =
+ Programs.COLUMN_INTERNAL_PROVIDER_FLAG2;
+
+ /**
+ * Internal integer flag used by individual TV input services.
+ *
+ * <p>This is internal to the provider that inserted it, and should not be decoded by other
+ * apps.
+ *
+ * <p>Type: INTEGER
+ * @see Programs#COLUMN_INTERNAL_PROVIDER_FLAG3
+ */
+ public static final String COLUMN_INTERNAL_PROVIDER_FLAG3 =
+ Programs.COLUMN_INTERNAL_PROVIDER_FLAG3;
+
+ /**
+ * Internal integer flag used by individual TV input services.
+ *
+ * <p>This is internal to the provider that inserted it, and should not be decoded by other
+ * apps.
+ *
+ * <p>Type: INTEGER
+ * @see Programs#COLUMN_INTERNAL_PROVIDER_FLAG4
+ */
+ public static final String COLUMN_INTERNAL_PROVIDER_FLAG4 =
+ Programs.COLUMN_INTERNAL_PROVIDER_FLAG4;
+
+ /**
+ * The version number of this row entry used by TV input services.
+ *
+ * <p>This is best used by sync adapters to identify the rows to update. The number can be
+ * defined by individual TV input services. One may assign the same value as
+ * {@code version_number} in ETSI EN 300 468 or ATSC A/65, if the data are coming from a TV
+ * broadcast.
+ *
+ * <p>Type: INTEGER
+ * @see Programs#COLUMN_VERSION_NUMBER
+ */
+ public static final String COLUMN_VERSION_NUMBER = Programs.COLUMN_VERSION_NUMBER;
+
+ private RecordedPrograms() {}
+ }
+
+ /**
* Column definitions for the TV programs that the user watched. Applications do not have access
* to this table.
*
@@ -1376,6 +1764,8 @@
/**
* The ID of the TV channel that provides this TV program.
*
+ * <p>This is a required field.
+ *
* <p>Type: INTEGER (long)
*/
public static final String COLUMN_CHANNEL_ID = "channel_id";
diff --git a/media/java/android/media/tv/TvInputInfo.java b/media/java/android/media/tv/TvInputInfo.java
index a3d748e..3960230 100644
--- a/media/java/android/media/tv/TvInputInfo.java
+++ b/media/java/android/media/tv/TvInputInfo.java
@@ -419,6 +419,27 @@
}
/**
+ * Returns the number of tuners this TV input has.
+ *
+ * <p>This method is valid only for the input of type {@link #TYPE_TUNER}.
+ *
+ * <p>Tuners correspond to physical/logical resources that allow reception of TV signal. Having
+ * <i>N</i> tuners means that the TV input is capable of receiving <i>N</i> different channels
+ * concurrently.
+ *
+ */
+ public int getTunerCount() {
+ return mType == TYPE_TUNER ? 1 : 0;
+ }
+
+ /**
+ * Returns {@code true} if this TV input can record TV programs, {@code false} otherwise.
+ */
+ public boolean canRecord() {
+ return false;
+ }
+
+ /**
* Returns the HDMI device information of this TV input.
* @hide
*/
diff --git a/media/java/android/media/tv/TvInputManager.java b/media/java/android/media/tv/TvInputManager.java
index 6a13f82..f1de8fd 100644
--- a/media/java/android/media/tv/TvInputManager.java
+++ b/media/java/android/media/tv/TvInputManager.java
@@ -16,6 +16,7 @@
package android.media.tv;
+import android.annotation.IntDef;
import android.annotation.NonNull;
import android.annotation.Nullable;
import android.annotation.SystemApi;
@@ -44,6 +45,8 @@
import com.android.internal.util.Preconditions;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.LinkedList;
@@ -126,6 +129,35 @@
public static final long TIME_SHIFT_INVALID_TIME = Long.MIN_VALUE;
/**
+ * RecordingError when a requested operation cannot be completed due to a problem that does not
+ * fit under any other error code.
+ */
+ public static final int RECORDING_ERROR_UNKNOWN = 0;
+
+ /**
+ * RecordingError when an attempt to connect to a recording session has failed or the
+ * established connection has been disconnected without a known reason.
+ */
+ public static final int RECORDING_ERROR_CONNECTION_FAILED = 1;
+
+ /**
+ * RecordingError when recording cannot proceed due to insufficient storage space.
+ */
+ public static final int RECORDING_ERROR_INSUFFICIENT_SPACE = 2;
+
+ /**
+ * RecordingError when recording cannot proceed because the required recording resource is not
+ * able to be allocated.
+ */
+ public static final int RECORDING_ERROR_RESOURCE_BUSY = 3;
+
+ /** @hide */
+ @Retention(RetentionPolicy.SOURCE)
+ @IntDef({RECORDING_ERROR_UNKNOWN, RECORDING_ERROR_CONNECTION_FAILED,
+ RECORDING_ERROR_INSUFFICIENT_SPACE, RECORDING_ERROR_RESOURCE_BUSY})
+ public @interface RecordingError {}
+
+ /**
* The TV input is connected.
*
* <p>This state indicates that a source device is connected to the input port and is in the
@@ -416,6 +448,39 @@
*/
public void onTimeShiftCurrentPositionChanged(Session session, long timeMs) {
}
+
+ /**
+ * This is called when a recording session initiated by a call to {@link
+ * TvRecordingClient#connect(String, Uri)} has been established.
+ */
+ void onConnected(Session session) {
+ }
+
+ /**
+ * This is called when TV program recording on the current channel has started.
+ *
+ * @param session A {@link TvInputManager.Session} associated with this callback.
+ */
+ void onRecordingStarted(Session session) {
+ }
+
+ /**
+ * This is called when TV program recording on the current channel has stopped. The passed
+ * URI contains information about the new recorded program.
+ *
+ * @param recordedProgramUri The URI for the new recorded program.
+ * @see android.media.tv.TvContract.RecordedPrograms
+ **/
+ void onRecordingStopped(Session session, Uri recordedProgramUri) {
+ }
+
+ /**
+ * This is called when an issue has occurred before or during recording.
+ *
+ * @param error The error code.
+ */
+ void onError(Session session, @TvInputManager.RecordingError int error) {
+ }
}
private static final class SessionCallbackRecord {
@@ -565,6 +630,46 @@
}
});
}
+
+ // For the recording session only
+ void postConnected() {
+ mHandler.post(new Runnable() {
+ @Override
+ public void run() {
+ mSessionCallback.onConnected(mSession);
+ }
+ });
+ }
+
+ // For the recording session only
+ void postRecordingStarted() {
+ mHandler.post(new Runnable() {
+ @Override
+ public void run() {
+ mSessionCallback.onRecordingStarted(mSession);
+ }
+ });
+ }
+
+ // For the recording session only
+ void postRecordingStopped(final Uri recordedProgramUri) {
+ mHandler.post(new Runnable() {
+ @Override
+ public void run() {
+ mSessionCallback.onRecordingStopped(mSession, recordedProgramUri);
+ }
+ });
+ }
+
+ // For the recording session only
+ void postError(final int error) {
+ mHandler.post(new Runnable() {
+ @Override
+ public void run() {
+ mSessionCallback.onError(mSession, error);
+ }
+ });
+ }
}
/**
@@ -574,7 +679,7 @@
/**
* This is called when the state of a given TV input is changed.
*
- * @param inputId The id of the TV input.
+ * @param inputId The ID of the TV input.
* @param state State of the TV input. The value is one of the following:
* <ul>
* <li>{@link TvInputManager#INPUT_STATE_CONNECTED}
@@ -591,7 +696,7 @@
* <p>Normally it happens when the user installs a new TV input package that implements
* {@link TvInputService} interface.
*
- * @param inputId The id of the TV input.
+ * @param inputId The ID of the TV input.
*/
public void onInputAdded(String inputId) {
}
@@ -602,7 +707,7 @@
* <p>Normally it happens when the user uninstalls the previously installed TV input
* package.
*
- * @param inputId The id of the TV input.
+ * @param inputId The ID of the TV input.
*/
public void onInputRemoved(String inputId) {
}
@@ -613,12 +718,21 @@
* <p>Normally it happens when a previously installed TV input package is re-installed or
* the media on which a newer version of the package exists becomes available/unavailable.
*
- * @param inputId The id of the TV input.
+ * @param inputId The ID of the TV input.
* @hide
*/
@SystemApi
public void onInputUpdated(String inputId) {
}
+
+ /**
+ * This is called when the information about a given TV input is changed.
+ *
+ * @param inputId The ID of the TV input.
+ * @param inputInfo TvInputInfo object that contains the information about the TV input.
+ */
+ public void onTvInputInfoChanged(String inputId, TvInputInfo inputInfo) {
+ }
}
private static final class TvInputCallbackRecord {
@@ -634,15 +748,6 @@
return mCallback;
}
- public void postInputStateChanged(final String inputId, final int state) {
- mHandler.post(new Runnable() {
- @Override
- public void run() {
- mCallback.onInputStateChanged(inputId, state);
- }
- });
- }
-
public void postInputAdded(final String inputId) {
mHandler.post(new Runnable() {
@Override
@@ -669,6 +774,24 @@
}
});
}
+
+ public void postInputStateChanged(final String inputId, final int state) {
+ mHandler.post(new Runnable() {
+ @Override
+ public void run() {
+ mCallback.onInputStateChanged(inputId, state);
+ }
+ });
+ }
+
+ public void postTvInputInfoChanged(final String inputId, final TvInputInfo inputInfo) {
+ mHandler.post(new Runnable() {
+ @Override
+ public void run() {
+ mCallback.onTvInputInfoChanged(inputId, inputInfo);
+ }
+ });
+ }
}
/**
@@ -876,19 +999,57 @@
record.postTimeShiftCurrentPositionChanged(timeMs);
}
}
- };
- ITvInputManagerCallback managerCallback = new ITvInputManagerCallback.Stub() {
+
@Override
- public void onInputStateChanged(String inputId, int state) {
- synchronized (mLock) {
- mStateMap.put(inputId, state);
- for (TvInputCallbackRecord record : mCallbackRecords) {
- record.postInputStateChanged(inputId, state);
+ public void onConnected(int seq) {
+ synchronized (mSessionCallbackRecordMap) {
+ SessionCallbackRecord record = mSessionCallbackRecordMap.get(seq);
+ if (record == null) {
+ Log.e(TAG, "Callback not found for seq " + seq);
+ return;
}
+ record.postConnected();
}
}
@Override
+ public void onRecordingStarted(int seq) {
+ synchronized (mSessionCallbackRecordMap) {
+ SessionCallbackRecord record = mSessionCallbackRecordMap.get(seq);
+ if (record == null) {
+ Log.e(TAG, "Callback not found for seq " + seq);
+ return;
+ }
+ record.postRecordingStarted();
+ }
+ }
+
+ @Override
+ public void onRecordingStopped(Uri recordedProgramUri, int seq) {
+ synchronized (mSessionCallbackRecordMap) {
+ SessionCallbackRecord record = mSessionCallbackRecordMap.get(seq);
+ if (record == null) {
+ Log.e(TAG, "Callback not found for seq " + seq);
+ return;
+ }
+ record.postRecordingStopped(recordedProgramUri);
+ }
+ }
+
+ @Override
+ public void onError(int error, int seq) {
+ synchronized (mSessionCallbackRecordMap) {
+ SessionCallbackRecord record = mSessionCallbackRecordMap.get(seq);
+ if (record == null) {
+ Log.e(TAG, "Callback not found for seq " + seq);
+ return;
+ }
+ record.postError(error);
+ }
+ }
+ };
+ ITvInputManagerCallback managerCallback = new ITvInputManagerCallback.Stub() {
+ @Override
public void onInputAdded(String inputId) {
synchronized (mLock) {
mStateMap.put(inputId, INPUT_STATE_CONNECTED);
@@ -916,6 +1077,25 @@
}
}
}
+
+ @Override
+ public void onInputStateChanged(String inputId, int state) {
+ synchronized (mLock) {
+ mStateMap.put(inputId, state);
+ for (TvInputCallbackRecord record : mCallbackRecords) {
+ record.postInputStateChanged(inputId, state);
+ }
+ }
+ }
+
+ @Override
+ public void onTvInputInfoChanged(String inputId, TvInputInfo inputInfo) {
+ synchronized (mLock) {
+ for (TvInputCallbackRecord record : mCallbackRecords) {
+ record.postTvInputInfoChanged(inputId, inputInfo);
+ }
+ }
+ }
};
try {
if (mService != null) {
@@ -972,7 +1152,7 @@
* <li>{@link #INPUT_STATE_DISCONNECTED}
* </ul>
*
- * @param inputId The id of the TV input.
+ * @param inputId The ID of the TV input.
* @throws IllegalArgumentException if the argument is {@code null}.
*/
public int getInputState(@NonNull String inputId) {
@@ -1139,7 +1319,7 @@
* <p>The number of sessions that can be created at the same time is limited by the capability
* of the given TV input.
*
- * @param inputId The id of the TV input.
+ * @param inputId The ID of the TV input.
* @param callback A callback used to receive the created session.
* @param handler A {@link Handler} that the session creation will be delivered to.
* @hide
@@ -1147,6 +1327,28 @@
@SystemApi
public void createSession(@NonNull String inputId, @NonNull final SessionCallback callback,
@NonNull Handler handler) {
+ createSessionInternal(inputId, false, callback, handler);
+ }
+
+ /**
+ * Creates a recording {@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 the given TV input.
+ *
+ * @param inputId The ID of the TV input.
+ * @param callback A callback used to receive the created session.
+ * @param handler A {@link Handler} that the session creation will be delivered to.
+ * @hide
+ */
+ @SystemApi
+ public void createRecordingSession(@NonNull String inputId,
+ @NonNull final SessionCallback callback, @NonNull Handler handler) {
+ createSessionInternal(inputId, true, callback, handler);
+ }
+
+ private void createSessionInternal(String inputId, boolean isRecordingSession,
+ SessionCallback callback, Handler handler) {
Preconditions.checkNotNull(inputId);
Preconditions.checkNotNull(callback);
Preconditions.checkNotNull(handler);
@@ -1155,7 +1357,7 @@
int seq = mNextSeq++;
mSessionCallbackRecordMap.put(seq, record);
try {
- mService.createSession(mClient, inputId, seq, mUserId);
+ mService.createSession(mClient, inputId, isRecordingSession, seq, mUserId);
} catch (RemoteException e) {
throw new RuntimeException(e);
}
@@ -1171,7 +1373,7 @@
* here. This method is designed to be used with {@link #captureFrame} in
* capture scenarios specifically and not suitable for any other use.
*
- * @param inputId the id of the TV input.
+ * @param inputId The ID of the TV input.
* @return List of {@link TvStreamConfig} which is available for capturing
* of the given TV input.
* @hide
@@ -1188,7 +1390,7 @@
/**
* Take a snapshot of the given TV input into the provided Surface.
*
- * @param inputId the id of the TV input.
+ * @param inputId The ID of the TV input.
* @param surface the {@link Surface} to which the snapshot is captured.
* @param config the {@link TvStreamConfig} which is used for capturing.
* @return true when the {@link Surface} is ready to be captured.
@@ -1607,7 +1809,7 @@
* Returns the selected track for a given type. Returns {@code null} if the information is
* not available or any of the tracks for the given type is not selected.
*
- * @return the ID of the selected track.
+ * @return The ID of the selected track.
* @see #selectTrack
*/
@Nullable
@@ -1697,6 +1899,21 @@
}
/**
+ * Plays a given recorded TV program.
+ */
+ void timeShiftPlay(Uri recordedProgramUri) {
+ if (mToken == null) {
+ Log.w(TAG, "The session has been already released");
+ return;
+ }
+ try {
+ mService.timeShiftPlay(mToken, recordedProgramUri, mUserId);
+ } catch (RemoteException e) {
+ throw new RuntimeException(e);
+ }
+ }
+
+ /**
* Pauses the playback. Call {@link #timeShiftResume()} to restart the playback.
*/
void timeShiftPause() {
@@ -1782,6 +1999,62 @@
}
/**
+ * Connects to a given channel for TV program recording.
+ */
+ void connect(Uri channelUri) {
+ connect(channelUri, null);
+ }
+
+ /**
+ * Tunes to a given channel.
+ *
+ * @param channelUri The URI of a channel.
+ * @param params Extra parameters.
+ */
+ void connect(@NonNull Uri channelUri, Bundle params) {
+ Preconditions.checkNotNull(channelUri);
+ if (mToken == null) {
+ Log.w(TAG, "The session has been already released");
+ return;
+ }
+ try {
+ mService.connect(mToken, channelUri, params, mUserId);
+ } catch (RemoteException e) {
+ throw new RuntimeException(e);
+ }
+ }
+
+ /**
+ * Starts TV program recording for the current recording session.
+ */
+ void startRecording() {
+ if (mToken == null) {
+ Log.w(TAG, "The session has been already released");
+ return;
+ }
+ try {
+ mService.startRecording(mToken, mUserId);
+ } catch (RemoteException e) {
+ throw new RuntimeException(e);
+ }
+ }
+
+ /**
+ * Stops TV program recording for the current recording session.
+ */
+ void stopRecording() {
+ if (mToken == null) {
+ Log.w(TAG, "The session has been already released");
+ return;
+ }
+ try {
+ mService.stopRecording(mToken, mUserId);
+ } catch (RemoteException e) {
+ throw new RuntimeException(e);
+ }
+ }
+
+ /**
* Calls {@link TvInputService.Session#appPrivateCommand(String, Bundle)
* TvInputService.Session.appPrivateCommand()} on the current TvView.
*
diff --git a/media/java/android/media/tv/TvInputService.java b/media/java/android/media/tv/TvInputService.java
index 053d43b6..6d9b1ad 100644
--- a/media/java/android/media/tv/TvInputService.java
+++ b/media/java/android/media/tv/TvInputService.java
@@ -16,6 +16,7 @@
package android.media.tv;
+import android.annotation.MainThread;
import android.annotation.NonNull;
import android.annotation.Nullable;
import android.annotation.SuppressLint;
@@ -136,6 +137,18 @@
}
@Override
+ public void createRecordingSession(ITvInputSessionCallback cb, String inputId) {
+ if (cb == null) {
+ return;
+ }
+ SomeArgs args = SomeArgs.obtain();
+ args.arg1 = cb;
+ args.arg2 = inputId;
+ mServiceHandler.obtainMessage(ServiceHandler.DO_CREATE_RECORDING_SESSION, args)
+ .sendToTarget();
+ }
+
+ @Override
public void notifyHardwareAdded(TvInputHardwareInfo hardwareInfo) {
mServiceHandler.obtainMessage(ServiceHandler.DO_ADD_HARDWARE_TV_INPUT,
hardwareInfo).sendToTarget();
@@ -174,6 +187,17 @@
public abstract Session onCreateSession(String inputId);
/**
+ * Returns a concrete implementation of {@link RecordingSession}.
+ *
+ * <p>May return {@code null} if this TV input service fails to create a recording session for
+ * some reason.
+ *
+ * @param inputId The ID of the TV input associated with the recording session.
+ */
+ @Nullable
+ public abstract RecordingSession onCreateRecordingSession(String inputId);
+
+ /**
* Returns a new {@link TvInputInfo} object if this service is responsible for
* {@code hardwareInfo}; otherwise, return {@code null}. Override to modify default behavior of
* ignoring all hardware input.
@@ -229,6 +253,25 @@
return null;
}
+
+ /**
+ * Sets the TvInputInfo for this TV input.
+ *
+ * <p>The system service automatically creates the TvInputInfo for each TV input based on
+ * information collected from the AndroidManifest.xml, thus it is not necessary to call this
+ * method unless the TV input has additional information to pass such as ability to record and
+ * tuner count.
+ *
+ * @param inputId The ID of the TV input.
+ * @param inputInfo The TvInputInfo object that contains that new information.
+ */
+ public final void setTvInputInfo(String inputId, TvInputInfo inputInfo) {
+ SomeArgs args = SomeArgs.obtain();
+ args.arg1 = inputId;
+ args.arg2 = inputInfo;
+ mServiceHandler.obtainMessage(ServiceHandler.DO_SET_TV_INPUT_INFO, args).sendToTarget();
+ }
+
private boolean isPassthroughInput(String inputId) {
if (mTvInputManager == null) {
mTvInputManager = (TvInputManager) getSystemService(Context.TV_INPUT_SERVICE);
@@ -322,7 +365,7 @@
@SystemApi
public void notifySessionEvent(@NonNull final String eventType, final Bundle eventArgs) {
Preconditions.checkNotNull(eventType);
- executeOrPostRunnable(new Runnable() {
+ executeOrPostRunnableOnMainThread(new Runnable() {
@Override
public void run() {
try {
@@ -347,7 +390,8 @@
* @param channelUri The URI of the new channel.
*/
public void notifyChannelRetuned(final Uri channelUri) {
- executeOrPostRunnable(new Runnable() {
+ executeOrPostRunnableOnMainThread(new Runnable() {
+ @MainThread
@Override
public void run() {
try {
@@ -387,7 +431,8 @@
// TODO: Validate the track list.
final List<TvTrackInfo> tracksCopy = new ArrayList<>(tracks);
- executeOrPostRunnable(new Runnable() {
+ executeOrPostRunnableOnMainThread(new Runnable() {
+ @MainThread
@Override
public void run() {
try {
@@ -417,7 +462,8 @@
* @see #onSelectTrack
*/
public void notifyTrackSelected(final int type, final String trackId) {
- executeOrPostRunnable(new Runnable() {
+ executeOrPostRunnableOnMainThread(new Runnable() {
+ @MainThread
@Override
public void run() {
try {
@@ -443,7 +489,8 @@
* @see #notifyVideoUnavailable
*/
public void notifyVideoAvailable() {
- executeOrPostRunnable(new Runnable() {
+ executeOrPostRunnableOnMainThread(new Runnable() {
+ @MainThread
@Override
public void run() {
try {
@@ -478,7 +525,8 @@
|| reason > TvInputManager.VIDEO_UNAVAILABLE_REASON_END) {
throw new IllegalArgumentException("Unknown reason: " + reason);
}
- executeOrPostRunnable(new Runnable() {
+ executeOrPostRunnableOnMainThread(new Runnable() {
+ @MainThread
@Override
public void run() {
try {
@@ -518,7 +566,8 @@
* @see TvInputManager
*/
public void notifyContentAllowed() {
- executeOrPostRunnable(new Runnable() {
+ executeOrPostRunnableOnMainThread(new Runnable() {
+ @MainThread
@Override
public void run() {
try {
@@ -562,7 +611,8 @@
*/
public void notifyContentBlocked(@NonNull final TvContentRating rating) {
Preconditions.checkNotNull(rating);
- executeOrPostRunnable(new Runnable() {
+ executeOrPostRunnableOnMainThread(new Runnable() {
+ @MainThread
@Override
public void run() {
try {
@@ -603,7 +653,8 @@
* </ul>
*/
public void notifyTimeShiftStatusChanged(final int status) {
- executeOrPostRunnable(new Runnable() {
+ executeOrPostRunnableOnMainThread(new Runnable() {
+ @MainThread
@Override
public void run() {
try {
@@ -619,7 +670,8 @@
}
private void notifyTimeShiftStartPositionChanged(final long timeMs) {
- executeOrPostRunnable(new Runnable() {
+ executeOrPostRunnableOnMainThread(new Runnable() {
+ @MainThread
@Override
public void run() {
try {
@@ -635,7 +687,8 @@
}
private void notifyTimeShiftCurrentPositionChanged(final long timeMs) {
- executeOrPostRunnable(new Runnable() {
+ executeOrPostRunnableOnMainThread(new Runnable() {
+ @MainThread
@Override
public void run() {
try {
@@ -665,7 +718,8 @@
if (left > right || top > bottom) {
throw new IllegalArgumentException("Invalid parameter");
}
- executeOrPostRunnable(new Runnable() {
+ executeOrPostRunnableOnMainThread(new Runnable() {
+ @MainThread
@Override
public void run() {
try {
@@ -858,13 +912,28 @@
}
/**
+ * Called when the application requests to play a given recorded TV program.
+ *
+ * @param recordedProgramUri The URI of a recorded TV program.
+ * @see #onTimeShiftResume()
+ * @see #onTimeShiftPause()
+ * @see #onTimeShiftSeekTo(long)
+ * @see #onTimeShiftSetPlaybackParams(PlaybackParams)
+ * @see #onTimeShiftGetStartPosition()
+ * @see #onTimeShiftGetCurrentPosition()
+ */
+ public void onTimeShiftPlay(Uri recordedProgramUri) {
+ }
+
+ /**
* Called when the application requests to pause playback.
*
- * @see #onTimeShiftResume
- * @see #onTimeShiftSeekTo
- * @see #onTimeShiftSetPlaybackParams
- * @see #onTimeShiftGetStartPosition
- * @see #onTimeShiftGetCurrentPosition
+ * @see #onTimeShiftPlay(Uri)
+ * @see #onTimeShiftResume()
+ * @see #onTimeShiftSeekTo(long)
+ * @see #onTimeShiftSetPlaybackParams(PlaybackParams)
+ * @see #onTimeShiftGetStartPosition()
+ * @see #onTimeShiftGetCurrentPosition()
*/
public void onTimeShiftPause() {
}
@@ -872,11 +941,12 @@
/**
* Called when the application requests to resume playback.
*
- * @see #onTimeShiftPause
- * @see #onTimeShiftSeekTo
- * @see #onTimeShiftSetPlaybackParams
- * @see #onTimeShiftGetStartPosition
- * @see #onTimeShiftGetCurrentPosition
+ * @see #onTimeShiftPlay(Uri)
+ * @see #onTimeShiftPause()
+ * @see #onTimeShiftSeekTo(long)
+ * @see #onTimeShiftSetPlaybackParams(PlaybackParams)
+ * @see #onTimeShiftGetStartPosition()
+ * @see #onTimeShiftGetCurrentPosition()
*/
public void onTimeShiftResume() {
}
@@ -888,11 +958,12 @@
* not in the range.
*
* @param timeMs The time position to seek to, in milliseconds since the epoch.
- * @see #onTimeShiftResume
- * @see #onTimeShiftPause
- * @see #onTimeShiftSetPlaybackParams
- * @see #onTimeShiftGetStartPosition
- * @see #onTimeShiftGetCurrentPosition
+ * @see #onTimeShiftPlay(Uri)
+ * @see #onTimeShiftResume()
+ * @see #onTimeShiftPause()
+ * @see #onTimeShiftSetPlaybackParams(PlaybackParams)
+ * @see #onTimeShiftGetStartPosition()
+ * @see #onTimeShiftGetCurrentPosition()
*/
public void onTimeShiftSeekTo(long timeMs) {
}
@@ -905,11 +976,12 @@
* parameters previously set.
*
* @param params The playback params.
- * @see #onTimeShiftResume
- * @see #onTimeShiftPause
- * @see #onTimeShiftSeekTo
- * @see #onTimeShiftGetStartPosition
- * @see #onTimeShiftGetCurrentPosition
+ * @see #onTimeShiftPlay(Uri)
+ * @see #onTimeShiftResume()
+ * @see #onTimeShiftPause()
+ * @see #onTimeShiftSeekTo(long)
+ * @see #onTimeShiftGetStartPosition()
+ * @see #onTimeShiftGetCurrentPosition()
*/
public void onTimeShiftSetPlaybackParams(PlaybackParams params) {
}
@@ -925,11 +997,12 @@
* seek to, thus failure to notifying its change immediately might result in bad experience
* where the application allows the user to seek to an invalid time position.
*
- * @see #onTimeShiftResume
- * @see #onTimeShiftPause
- * @see #onTimeShiftSeekTo
- * @see #onTimeShiftSetPlaybackParams
- * @see #onTimeShiftGetCurrentPosition
+ * @see #onTimeShiftPlay(Uri)
+ * @see #onTimeShiftResume()
+ * @see #onTimeShiftPause()
+ * @see #onTimeShiftSeekTo(long)
+ * @see #onTimeShiftSetPlaybackParams(PlaybackParams)
+ * @see #onTimeShiftGetCurrentPosition()
*/
public long onTimeShiftGetStartPosition() {
return TvInputManager.TIME_SHIFT_INVALID_TIME;
@@ -944,11 +1017,12 @@
* playback position reported by {@link #onTimeShiftGetStartPosition}. Failure to notifying
* the correct current position might lead to bad user experience.
*
- * @see #onTimeShiftResume
- * @see #onTimeShiftPause
- * @see #onTimeShiftSeekTo
- * @see #onTimeShiftSetPlaybackParams
- * @see #onTimeShiftGetStartPosition
+ * @see #onTimeShiftPlay(Uri)
+ * @see #onTimeShiftResume()
+ * @see #onTimeShiftPause()
+ * @see #onTimeShiftSeekTo(long)
+ * @see #onTimeShiftSetPlaybackParams(PlaybackParams)
+ * @see #onTimeShiftGetStartPosition()
*/
public long onTimeShiftGetCurrentPosition() {
return TvInputManager.TIME_SHIFT_INVALID_TIME;
@@ -1263,6 +1337,14 @@
}
/**
+ * Calls {@link #onTimeShiftPlay(Uri)}.
+ */
+ void timeShiftPlay(Uri recordedProgramUri) {
+ mCurrentPositionMs = 0;
+ onTimeShiftPlay(recordedProgramUri);
+ }
+
+ /**
* Calls {@link #onTimeShiftPause}.
*/
void timeShiftPause() {
@@ -1385,7 +1467,7 @@
}
}
- private void executeOrPostRunnable(Runnable action) {
+ private void executeOrPostRunnableOnMainThread(Runnable action) {
synchronized(mLock) {
if (mSessionCallback == null) {
// The session is not initialized yet.
@@ -1449,6 +1531,267 @@
}
/**
+ * Base class for derived classes to implement to provide a TV input recording session.
+ */
+ public abstract static class RecordingSession {
+ final Handler mHandler;
+
+ private final Object mLock = new Object();
+ // @GuardedBy("mLock")
+ private ITvInputSessionCallback mSessionCallback;
+ // @GuardedBy("mLock")
+ private final List<Runnable> mPendingActions = new ArrayList<>();
+
+ /**
+ * Creates a new Recording Session for TV program recording.
+ *
+ * @param context The context of the application
+ */
+ public RecordingSession(Context context) {
+ mHandler = new Handler(context.getMainLooper());
+ }
+
+ /**
+ * Informs the application that recording session has been connected.
+ */
+ public void notifyConnected() {
+ executeOrPostRunnableOnMainThread(new Runnable() {
+ @MainThread
+ @Override
+ public void run() {
+ try {
+ if (DEBUG) Log.d(TAG, "notifyConnected");
+ if (mSessionCallback != null) {
+ mSessionCallback.onConnected();
+ }
+ } catch (RemoteException e) {
+ Log.w(TAG, "error in notifyConnected", e);
+ }
+ }
+ });
+ }
+
+ /**
+ * Informs the application that recording has started.
+ */
+ public void notifyRecordingStarted() {
+ executeOrPostRunnableOnMainThread(new Runnable() {
+ @MainThread
+ @Override
+ public void run() {
+ try {
+ if (DEBUG) Log.d(TAG, "notifyRecordingStarted");
+ if (mSessionCallback != null) {
+ mSessionCallback.onRecordingStarted();
+ }
+ } catch (RemoteException e) {
+ Log.w(TAG, "error in notifyRecordingStarted", e);
+ }
+ }
+ });
+ }
+
+ /**
+ * Informs the application that recording has stopped successfully. Each TV input service
+ * should create a new data entry in the recorded programs table upon completion of the
+ * recording and send its URI.
+ *
+ * @param recordedProgramUri The URI of the new recorded program.
+ */
+ public void notifyRecordingStopped(final Uri recordedProgramUri) {
+ executeOrPostRunnableOnMainThread(new Runnable() {
+ @MainThread
+ @Override
+ public void run() {
+ try {
+ if (DEBUG) Log.d(TAG, "notifyRecordingStopped");
+ if (mSessionCallback != null) {
+ mSessionCallback.onRecordingStopped(recordedProgramUri);
+ }
+ } catch (RemoteException e) {
+ Log.w(TAG, "error in notifyRecordingStopped", e);
+ }
+ }
+ });
+ }
+
+ /**
+ * Sends an error to the application at any moment.
+ *
+ * @param error The error code. Should be one of the followings.
+ * <ul>
+ * <li>{@link TvInputManager#RECORDING_ERROR_UNKNOWN}
+ * <li>{@link TvInputManager#RECORDING_ERROR_CONNECTION_FAILED}
+ * <li>{@link TvInputManager#RECORDING_ERROR_INSUFFICIENT_SPACE}
+ * <li>{@link TvInputManager#RECORDING_ERROR_RESOURCE_BUSY}
+ * </ul>
+ */
+ public void notifyError(@TvInputManager.RecordingError final int error) {
+ executeOrPostRunnableOnMainThread(new Runnable() {
+ @MainThread
+ @Override
+ public void run() {
+ try {
+ if (DEBUG) Log.d(TAG, "notifyError");
+ if (mSessionCallback != null) {
+ mSessionCallback.onError(error);
+ }
+ } catch (RemoteException e) {
+ Log.w(TAG, "error in notifyError", e);
+ }
+ }
+ });
+ }
+
+ /**
+ * Dispatches an event to the application using this recording session.
+ *
+ * @param eventType The type of the event.
+ * @param eventArgs Optional arguments of the event.
+ * @hide
+ */
+ @SystemApi
+ public void notifySessionEvent(@NonNull final String eventType, final Bundle eventArgs) {
+ Preconditions.checkNotNull(eventType);
+ executeOrPostRunnableOnMainThread(new Runnable() {
+ @MainThread
+ @Override
+ public void run() {
+ try {
+ if (DEBUG) Log.d(TAG, "notifySessionEvent(" + eventType + ")");
+ if (mSessionCallback != null) {
+ mSessionCallback.onSessionEvent(eventType, eventArgs);
+ }
+ } catch (RemoteException e) {
+ Log.w(TAG, "error in sending event (event=" + eventType + ")", e);
+ }
+ }
+ });
+ }
+
+ /**
+ * Called when the recording session is connected.
+ *
+ * @param channelUri The URI of the channel.
+ */
+ public abstract void onConnect(Uri channelUri);
+
+ /**
+ * Called when the recording session is connected.
+ *
+ * @param channelUri The URI of the channel.
+ * @param params Extra parameters.
+ * @hide
+ */
+ @SystemApi
+ public void onConnect(Uri channelUri, Bundle params) {
+ onConnect(channelUri);
+ }
+
+ /**
+ * Called when the application requests to disconnect the current recording session.
+ */
+ public abstract void onDisconnect();
+
+ /**
+ * Called when the application requests to start recording. Recording must start
+ * immediately.
+ *
+ * <p>The session must call either {@link #notifyRecordingStarted()} or
+ * {@link #notifyError(int)}}.
+ */
+ public abstract void onStartRecording();
+
+ /**
+ * Called when the application requests to stop recording. Recording must stop immediately.
+ *
+ * <p>The session must call either {@link #notifyRecordingStopped(Uri)} or
+ * {@link #notifyError(int)}}.
+ */
+ public abstract void onStopRecording();
+
+ /**
+ * Processes a private command sent from the application to the TV input. This can be used
+ * to provide domain-specific features that are only known between certain TV inputs and
+ * their clients.
+ *
+ * @param action Name of the command to be performed. This <em>must</em> be a scoped name,
+ * i.e. prefixed with a package name you own, so that different developers will
+ * not create conflicting commands.
+ * @param data Any data to include with the command.
+ * @hide
+ */
+ @SystemApi
+ public void onAppPrivateCommand(@NonNull String action, Bundle data) {
+ }
+
+ /**
+ * Calls {@link #onConnect(Uri, Bundle)}.
+ *
+ */
+ void connect(Uri channelUri, Bundle params) {
+ onConnect(channelUri, params);
+ }
+
+ /**
+ * Calls {@link #onDisconnect()}.
+ *
+ */
+ void disconnect() {
+ onDisconnect();
+ }
+
+ /**
+ * Calls {@link #onStartRecording()}.
+ *
+ */
+ void startRecording() {
+ onStartRecording();
+ }
+
+ /**
+ * Calls {@link #onStopRecording()}.
+ *
+ */
+ void stopRecording() {
+ onStopRecording();
+ }
+
+ /**
+ * Calls {@link #onAppPrivateCommand(String, Bundle)}.
+ */
+ void appPrivateCommand(String action, Bundle data) {
+ onAppPrivateCommand(action, data);
+ }
+
+ private void initialize(ITvInputSessionCallback callback) {
+ synchronized(mLock) {
+ mSessionCallback = callback;
+ for (Runnable runnable : mPendingActions) {
+ runnable.run();
+ }
+ mPendingActions.clear();
+ }
+ }
+
+ private void executeOrPostRunnableOnMainThread(Runnable action) {
+ synchronized(mLock) {
+ if (mSessionCallback == null) {
+ // The session is not initialized yet.
+ mPendingActions.add(action);
+ } else {
+ if (mHandler.getLooper().isCurrentThread()) {
+ action.run();
+ } else {
+ // Posts the runnable if this is not called from the main thread
+ mHandler.post(action);
+ }
+ }
+ }
+ }
+ }
+
+ /**
* Base class for a TV input session which represents an external device connected to a
* hardware TV input.
*
@@ -1588,10 +1931,12 @@
private final class ServiceHandler extends Handler {
private static final int DO_CREATE_SESSION = 1;
private static final int DO_NOTIFY_SESSION_CREATED = 2;
- private static final int DO_ADD_HARDWARE_TV_INPUT = 3;
- private static final int DO_REMOVE_HARDWARE_TV_INPUT = 4;
- private static final int DO_ADD_HDMI_TV_INPUT = 5;
- private static final int DO_REMOVE_HDMI_TV_INPUT = 6;
+ private static final int DO_CREATE_RECORDING_SESSION = 3;
+ private static final int DO_ADD_HARDWARE_TV_INPUT = 4;
+ private static final int DO_REMOVE_HARDWARE_TV_INPUT = 5;
+ private static final int DO_ADD_HDMI_TV_INPUT = 6;
+ private static final int DO_REMOVE_HDMI_TV_INPUT = 7;
+ private static final int DO_SET_TV_INPUT_INFO = 8;
private void broadcastAddHardwareTvInput(int deviceId, TvInputInfo inputInfo) {
int n = mCallbacks.beginBroadcast();
@@ -1629,6 +1974,18 @@
mCallbacks.finishBroadcast();
}
+ private void broadcastSetTvInputInfo(String inputId, TvInputInfo inputInfo) {
+ int n = mCallbacks.beginBroadcast();
+ for (int i = 0; i < n; ++i) {
+ try {
+ mCallbacks.getBroadcastItem(i).setTvInputInfo(inputId, inputInfo);
+ } catch (RemoteException e) {
+ Log.e(TAG, "error in broadcastSetTvInputInfo", e);
+ }
+ }
+ mCallbacks.finishBroadcast();
+ }
+
@Override
public final void handleMessage(Message msg) {
switch (msg.what) {
@@ -1704,6 +2061,31 @@
args.recycle();
return;
}
+ case DO_CREATE_RECORDING_SESSION: {
+ SomeArgs args = (SomeArgs) msg.obj;
+ ITvInputSessionCallback cb = (ITvInputSessionCallback) args.arg1;
+ String inputId = (String) args.arg2;
+ args.recycle();
+ RecordingSession recordingSessionImpl = onCreateRecordingSession(inputId);
+ if (recordingSessionImpl == null) {
+ try {
+ // Failed to create a recording session.
+ cb.onSessionCreated(null, null);
+ } catch (RemoteException e) {
+ Log.e(TAG, "error in onSessionCreated", e);
+ }
+ return;
+ }
+ ITvInputSession stub = new ITvInputSessionWrapper(TvInputService.this,
+ recordingSessionImpl);
+ try {
+ cb.onSessionCreated(stub, null);
+ } catch (RemoteException e) {
+ Log.e(TAG, "error in onSessionCreated", e);
+ }
+ recordingSessionImpl.initialize(cb);
+ return;
+ }
case DO_ADD_HARDWARE_TV_INPUT: {
TvInputHardwareInfo hardwareInfo = (TvInputHardwareInfo) msg.obj;
TvInputInfo inputInfo = onHardwareAdded(hardwareInfo);
@@ -1736,6 +2118,16 @@
}
return;
}
+ case DO_SET_TV_INPUT_INFO: {
+ SomeArgs args = (SomeArgs) msg.obj;
+ String inputId = (String) args.arg1;
+ TvInputInfo inputInfo = (TvInputInfo) args.arg2;
+ if (inputInfo != null) {
+ broadcastSetTvInputInfo(inputId, inputInfo);
+ }
+ args.recycle();
+ return;
+ }
default: {
Log.w(TAG, "Unhandled message code: " + msg.what);
return;
diff --git a/media/java/android/media/tv/TvRecordingClient.java b/media/java/android/media/tv/TvRecordingClient.java
new file mode 100644
index 0000000..865e000
--- /dev/null
+++ b/media/java/android/media/tv/TvRecordingClient.java
@@ -0,0 +1,352 @@
+/*
+ * Copyright (C) 2016 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.media.tv;
+
+import android.annotation.NonNull;
+import android.annotation.SystemApi;
+import android.content.Context;
+import android.net.Uri;
+import android.os.Bundle;
+import android.os.Handler;
+import android.os.Looper;
+import android.text.TextUtils;
+import android.util.Log;
+import android.util.Pair;
+
+import java.util.ArrayDeque;
+import java.util.Queue;
+
+/**
+ * The public interface object used to interact with a specific TV input service for TV program
+ * recording.
+ */
+public class TvRecordingClient {
+ private static final String TAG = "TvRecordingClient";
+ private static final boolean DEBUG = false;
+
+ private final RecordingCallback mCallback;
+ private final Handler mHandler;
+
+ private final TvInputManager mTvInputManager;
+ private TvInputManager.Session mSession;
+ private MySessionCallback mSessionCallback;
+
+ private final Queue<Pair<String, Bundle>> mPendingAppPrivateCommands = new ArrayDeque<>();
+
+ /**
+ * Creates a new TvRecordingClient object.
+ *
+ * @param context The application context to create the TvRecordingClient with.
+ * @param tag A short name for debugging purposes.
+ * @param callback The callback to receive recording status changes.
+ * @param handler The handler to invoke the callback on.
+ */
+ public TvRecordingClient(Context context, String tag, @NonNull RecordingCallback callback,
+ Handler handler) {
+ mCallback = callback;
+ mHandler = handler == null ? new Handler(Looper.getMainLooper()) : handler;
+ mTvInputManager = (TvInputManager) context.getSystemService(Context.TV_INPUT_SERVICE);
+ }
+
+ /**
+ * Connects to a given input for TV program recording. This will create a new recording session
+ * from the TV input and establishes the connection between the application and the session.
+ *
+ * <p>The recording session will respond by calling
+ * {@link RecordingCallback#onConnected()} or {@link RecordingCallback#onError(int)}.
+ *
+ * @param inputId The ID of the TV input for the given channel.
+ * @param channelUri The URI of a channel.
+ */
+ public void connect(String inputId, Uri channelUri) {
+ connect(inputId, channelUri, null);
+ }
+
+ /**
+ * Connects to a given input for TV program recording. This will create a new recording session
+ * from the TV input and establishes the connection between the application and the session.
+ *
+ * <p>The recording session will respond by calling
+ * {@link RecordingCallback#onConnected()} or {@link RecordingCallback#onError(int)}.
+ *
+ * @param inputId The ID of the TV input for the given channel.
+ * @param channelUri The URI of a channel.
+ * @param params Extra parameters.
+ * @hide
+ */
+ @SystemApi
+ public void connect(String inputId, Uri channelUri, Bundle params) {
+ if (DEBUG) Log.d(TAG, "connect(" + channelUri + ")");
+ if (TextUtils.isEmpty(inputId)) {
+ throw new IllegalArgumentException("inputId cannot be null or an empty string");
+ }
+ if (mSessionCallback != null && TextUtils.equals(mSessionCallback.mInputId, inputId)) {
+ if (mSession != null) {
+ mSession.connect(channelUri, params);
+ } else {
+ mSessionCallback.mChannelUri = channelUri;
+ mSessionCallback.mConnectionParams = params;
+ }
+ } else {
+ resetInternal();
+ mSessionCallback = new MySessionCallback(inputId, channelUri, params);
+ if (mTvInputManager != null) {
+ mTvInputManager.createRecordingSession(inputId, mSessionCallback, mHandler);
+ }
+ }
+ }
+
+ /**
+ * Disconnects the established connection between the application and the recording session.
+ *
+ * <p>The recording session will respond by calling
+ * {@link RecordingCallback#onDisconnected()} or {@link RecordingCallback#onError(int)}.
+ */
+ public void disconnect() {
+ if (DEBUG) Log.d(TAG, "disconnect()");
+ resetInternal();
+ }
+
+ private void resetInternal() {
+ mSessionCallback = null;
+ mPendingAppPrivateCommands.clear();
+ if (mSession != null) {
+ mSession.release();
+ mSession = null;
+ }
+ }
+
+ /**
+ * Starts TV program recording for the current recording session. It is expected that recording
+ * starts immediately after calling this method.
+ *
+ * <p>The recording session will respond by calling
+ * {@link RecordingCallback#onRecordingStarted()} or {@link RecordingCallback#onError(int)}.
+ */
+ public void startRecording() {
+ if (mSession != null) {
+ mSession.startRecording();
+ }
+ }
+
+ /**
+ * Stops TV program recording for the current recording session. It is expected that recording
+ * stops immediately after calling this method.
+ *
+ * <p>The recording session will respond by calling
+ * {@link RecordingCallback#onRecordingStopped(Uri)} or {@link RecordingCallback#onError(int)}.
+ */
+ public void stopRecording() {
+ if (mSession != null) {
+ mSession.stopRecording();
+ }
+ }
+
+ /**
+ * Calls {@link TvInputService.RecordingSession#appPrivateCommand(String, Bundle)
+ * TvInputService.RecordingSession.appPrivateCommand()} on the current TvView.
+ *
+ * @param action The name of the private command to send. This <em>must</em> be a scoped name,
+ * i.e. prefixed with a package name you own, so that different developers will not
+ * create conflicting commands.
+ * @param data An optional bundle to send with the command.
+ * @hide
+ */
+ @SystemApi
+ public void sendAppPrivateCommand(@NonNull String action, Bundle data) {
+ if (TextUtils.isEmpty(action)) {
+ throw new IllegalArgumentException("action cannot be null or an empty string");
+ }
+ if (mSession != null) {
+ mSession.sendAppPrivateCommand(action, data);
+ } else {
+ Log.w(TAG, "sendAppPrivateCommand - session not yet created (action \"" + action
+ + "\" pending)");
+ mPendingAppPrivateCommands.add(Pair.create(action, data));
+ }
+ }
+
+ /**
+ * Callback used to receive various status updates on the
+ * {@link android.media.tv.TvInputService.RecordingSession}
+ */
+ public class RecordingCallback {
+ /**
+ * This is called when a recording session initiated by a call to
+ * {@link #connect(String, Uri)} has been established.
+ */
+ public void onConnected() {
+ }
+
+ /**
+ * This is called when the established connection between the application and the recording
+ * session has been disconnected. Disconnection can be initiated either by an explicit
+ * request (i.e. a call to {@link #disconnect()} or by an error on the TV input service
+ * side.
+ */
+ public void onDisconnected() {
+ }
+
+ /**
+ * This is called when TV program recording on the current channel has started.
+ */
+ public void onRecordingStarted() {
+ }
+
+ /**
+ * This is called when TV program recording on the current channel has stopped. The passed
+ * URI contains information about the new recorded program.
+ *
+ * @param recordedProgramUri The URI for the new recorded program.
+ * @see android.media.tv.TvContract.RecordedPrograms
+ */
+ public void onRecordingStopped(Uri recordedProgramUri) {
+ }
+
+ /**
+ * This is called when an issue has occurred before or during recording. If the TV input
+ * service cannot proceed recording due to this error, a call to {@link #onDisconnected()}
+ * is expected to follow.
+ *
+ * @param error The error code. Should be one of the followings.
+ * <ul>
+ * <li>{@link TvInputManager#RECORDING_ERROR_UNKNOWN}
+ * <li>{@link TvInputManager#RECORDING_ERROR_CONNECTION_FAILED}
+ * <li>{@link TvInputManager#RECORDING_ERROR_INSUFFICIENT_SPACE}
+ * <li>{@link TvInputManager#RECORDING_ERROR_RESOURCE_BUSY}
+ * </ul>
+ */
+ public void onError(@TvInputManager.RecordingError int error) {
+ }
+
+ /**
+ * This is invoked when a custom event from the bound TV input is sent to this client.
+ *
+ * @param inputId The ID of the TV input bound to this client.
+ * @param eventType The type of the event.
+ * @param eventArgs Optional arguments of the event.
+ * @hide
+ */
+ @SystemApi
+ public void onEvent(String inputId, String eventType, Bundle eventArgs) {
+ }
+ }
+
+ private class MySessionCallback extends TvInputManager.SessionCallback {
+ final String mInputId;
+ Uri mChannelUri;
+ Bundle mConnectionParams;
+
+ MySessionCallback(String inputId, Uri channelUri, Bundle connectionParams) {
+ mInputId = inputId;
+ mChannelUri = channelUri;
+ mConnectionParams = connectionParams;
+ }
+
+ @Override
+ public void onSessionCreated(TvInputManager.Session session) {
+ if (DEBUG) {
+ Log.d(TAG, "onSessionCreated()");
+ }
+ if (this != mSessionCallback) {
+ Log.w(TAG, "onSessionCreated - session already created");
+ // This callback is obsolete.
+ if (session != null) {
+ session.release();
+ }
+ return;
+ }
+ mSession = session;
+ if (session != null) {
+ // Sends the pending app private commands.
+ for (Pair<String, Bundle> command : mPendingAppPrivateCommands) {
+ mSession.sendAppPrivateCommand(command.first, command.second);
+ }
+ mPendingAppPrivateCommands.clear();
+ mSession.connect(mChannelUri, mConnectionParams);
+ } else {
+ mSessionCallback = null;
+ mCallback.onError(TvInputManager.RECORDING_ERROR_CONNECTION_FAILED);
+ }
+ }
+
+ @Override
+ public void onSessionReleased(TvInputManager.Session session) {
+ if (DEBUG) {
+ Log.d(TAG, "onSessionReleased()");
+ }
+ if (this != mSessionCallback) {
+ Log.w(TAG, "onSessionReleased - session not created");
+ return;
+ }
+ mSessionCallback = null;
+ mSession = null;
+ mCallback.onDisconnected();
+ }
+
+ @Override
+ public void onRecordingStarted(TvInputManager.Session session) {
+ if (DEBUG) {
+ Log.d(TAG, "onRecordingStarted()");
+ }
+ if (this != mSessionCallback) {
+ Log.w(TAG, "onRecordingStarted - session not created");
+ return;
+ }
+ mCallback.onRecordingStarted();
+ }
+
+ @Override
+ public void onRecordingStopped(TvInputManager.Session session, Uri recordedProgramUri) {
+ if (DEBUG) {
+ Log.d(TAG, "onRecordingStopped()");
+ }
+ if (this != mSessionCallback) {
+ Log.w(TAG, "onRecordingStopped - session not created");
+ return;
+ }
+ mCallback.onRecordingStopped(recordedProgramUri);
+ }
+
+ @Override
+ public void onError(TvInputManager.Session session, int error) {
+ if (DEBUG) {
+ Log.d(TAG, "onError()");
+ }
+ if (this != mSessionCallback) {
+ Log.w(TAG, "onError - session not created");
+ return;
+ }
+ mCallback.onError(error);
+ }
+
+ @Override
+ public void onSessionEvent(TvInputManager.Session session, String eventType,
+ Bundle eventArgs) {
+ if (DEBUG) {
+ Log.d(TAG, "onSessionEvent(" + eventType + ")");
+ }
+ if (this != mSessionCallback) {
+ Log.w(TAG, "onSessionEvent - session not created");
+ return;
+ }
+ if (mCallback != null) {
+ mCallback.onEvent(mInputId, eventType, eventArgs);
+ }
+ }
+ }
+}
diff --git a/media/java/android/media/tv/TvView.java b/media/java/android/media/tv/TvView.java
index 003a274..0132d24 100644
--- a/media/java/android/media/tv/TvView.java
+++ b/media/java/android/media/tv/TvView.java
@@ -448,6 +448,37 @@
}
/**
+ * Plays a given recorded TV program.
+ *
+ * @param inputId The ID of the TV input that created the given recorded program.
+ * @param recordedProgramUri The URI of a recorded program.
+ */
+ public void timeShiftPlay(String inputId, Uri recordedProgramUri) {
+ if (DEBUG) Log.d(TAG, "timeShiftPlay(" + recordedProgramUri + ")");
+ if (TextUtils.isEmpty(inputId)) {
+ throw new IllegalArgumentException("inputId cannot be null or an empty string");
+ }
+ synchronized (sMainTvViewLock) {
+ if (sMainTvView.get() == null) {
+ sMainTvView = new WeakReference<>(this);
+ }
+ }
+ if (mSessionCallback != null && TextUtils.equals(mSessionCallback.mInputId, inputId)) {
+ if (mSession != null) {
+ mSession.timeShiftPlay(recordedProgramUri);
+ } else {
+ mSessionCallback.mRecordedProgramUri = recordedProgramUri;
+ }
+ } else {
+ resetInternal();
+ mSessionCallback = new MySessionCallback(inputId, recordedProgramUri);
+ if (mTvInputManager != null) {
+ mTvInputManager.createSession(inputId, mSessionCallback, mHandler);
+ }
+ }
+ }
+
+ /**
* Pauses playback. No-op if it is already paused. Call {@link #timeShiftResume} to resume.
*/
public void timeShiftPause() {
@@ -994,6 +1025,7 @@
final String mInputId;
Uri mChannelUri;
Bundle mTuneParams;
+ Uri mRecordedProgramUri;
MySessionCallback(String inputId, Uri channelUri, Bundle tuneParams) {
mInputId = inputId;
@@ -1001,6 +1033,11 @@
mTuneParams = tuneParams;
}
+ MySessionCallback(String inputId, Uri recordedProgramUri) {
+ mInputId = inputId;
+ mRecordedProgramUri = recordedProgramUri;
+ }
+
@Override
public void onSessionCreated(Session session) {
if (DEBUG) {
@@ -1043,7 +1080,11 @@
if (mCaptionEnabled != null) {
mSession.setCaptionEnabled(mCaptionEnabled);
}
- mSession.tune(mChannelUri, mTuneParams);
+ if (mChannelUri != null) {
+ mSession.tune(mChannelUri, mTuneParams);
+ } else {
+ mSession.timeShiftPlay(mRecordedProgramUri);
+ }
ensurePositionTracking();
} else {
mSessionCallback = null;
diff --git a/packages/Keyguard/src/com/android/keyguard/KeyguardPasswordView.java b/packages/Keyguard/src/com/android/keyguard/KeyguardPasswordView.java
index 3a7e6d0..63dec8b 100644
--- a/packages/Keyguard/src/com/android/keyguard/KeyguardPasswordView.java
+++ b/packages/Keyguard/src/com/android/keyguard/KeyguardPasswordView.java
@@ -117,8 +117,10 @@
return R.string.kg_prompt_reason_restart_password;
case PROMPT_REASON_TIMEOUT:
return R.string.kg_prompt_reason_timeout_password;
- default:
+ case PROMPT_REASON_NONE:
return 0;
+ default:
+ return R.string.kg_prompt_reason_timeout_password;
}
}
diff --git a/packages/Keyguard/src/com/android/keyguard/KeyguardPatternView.java b/packages/Keyguard/src/com/android/keyguard/KeyguardPatternView.java
index 2a2f5a0..be2701d 100644
--- a/packages/Keyguard/src/com/android/keyguard/KeyguardPatternView.java
+++ b/packages/Keyguard/src/com/android/keyguard/KeyguardPatternView.java
@@ -339,7 +339,11 @@
mSecurityMessageDisplay.setMessage(R.string.kg_prompt_reason_timeout_pattern,
true /* important */);
break;
+ case PROMPT_REASON_NONE:
+ break;
default:
+ mSecurityMessageDisplay.setMessage(R.string.kg_prompt_reason_timeout_pattern,
+ true /* important */);
break;
}
}
diff --git a/packages/Keyguard/src/com/android/keyguard/KeyguardPinBasedInputView.java b/packages/Keyguard/src/com/android/keyguard/KeyguardPinBasedInputView.java
index f51e10f..cedd88d 100644
--- a/packages/Keyguard/src/com/android/keyguard/KeyguardPinBasedInputView.java
+++ b/packages/Keyguard/src/com/android/keyguard/KeyguardPinBasedInputView.java
@@ -103,8 +103,10 @@
return R.string.kg_prompt_reason_restart_pin;
case PROMPT_REASON_TIMEOUT:
return R.string.kg_prompt_reason_timeout_pin;
- default:
+ case PROMPT_REASON_NONE:
return 0;
+ default:
+ return R.string.kg_prompt_reason_timeout_pin;
}
}
diff --git a/packages/Keyguard/src/com/android/keyguard/KeyguardSecurityView.java b/packages/Keyguard/src/com/android/keyguard/KeyguardSecurityView.java
index 38302fb..aa74940 100644
--- a/packages/Keyguard/src/com/android/keyguard/KeyguardSecurityView.java
+++ b/packages/Keyguard/src/com/android/keyguard/KeyguardSecurityView.java
@@ -34,6 +34,26 @@
int PROMPT_REASON_TIMEOUT = 2;
/**
+ * Strong auth is required because a device admin requested it.
+ */
+ int PROMPT_REASON_DEVICE_ADMIN = 3;
+
+ /**
+ * Some auth is required because the user force locked.
+ */
+ int PROMPT_REASON_USER_REQUEST = 4;
+
+ /**
+ * Some auth is required because too many wrong credentials led to a lockout.
+ */
+ int PROMPT_REASON_AFTER_LOCKOUT = 5;
+
+ /**
+ * Some auth is required because a single wrong credential has been tried.
+ */
+ int PROMPT_REASON_WRONG_CREDENTIAL = 6;
+
+ /**
* Interface back to keyguard to tell it when security
* @param callback
*/
diff --git a/packages/SettingsLib/res/values/attrs.xml b/packages/SettingsLib/res/values/attrs.xml
index 46267a2..15b2a97 100644
--- a/packages/SettingsLib/res/values/attrs.xml
+++ b/packages/SettingsLib/res/values/attrs.xml
@@ -18,4 +18,9 @@
<declare-styleable name="RestrictedPreference">
<attr name="userRestriction" format="string"/>
</declare-styleable>
-</resources>
\ No newline at end of file
+ <declare-styleable name="WifiEncryptionState">
+ <attr name="state_encrypted" format="boolean" />
+ </declare-styleable>
+ <attr name="wifi_signal" format="reference" />
+
+</resources>
diff --git a/packages/SettingsLib/res/values/dimens.xml b/packages/SettingsLib/res/values/dimens.xml
index 9a1d6a4..811751c 100644
--- a/packages/SettingsLib/res/values/dimens.xml
+++ b/packages/SettingsLib/res/values/dimens.xml
@@ -35,4 +35,7 @@
<!-- Lock icon for preferences locked by admin -->
<dimen name="restricted_lock_icon_size">16dp</dimen>
<dimen name="restricted_lock_icon_padding">4dp</dimen>
+
+ <dimen name="wifi_preference_badge_padding">8dip</dimen>
+
</resources>
diff --git a/packages/SettingsLib/src/com/android/settingslib/wifi/AccessPointPreference.java b/packages/SettingsLib/src/com/android/settingslib/wifi/AccessPointPreference.java
new file mode 100644
index 0000000..284827b
--- /dev/null
+++ b/packages/SettingsLib/src/com/android/settingslib/wifi/AccessPointPreference.java
@@ -0,0 +1,224 @@
+/*
+ * Copyright (C) 2016 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License
+ */
+
+package com.android.settingslib.wifi;
+
+import android.content.Context;
+import android.content.pm.PackageManager;
+import android.graphics.drawable.Drawable;
+import android.graphics.drawable.StateListDrawable;
+import android.net.wifi.WifiConfiguration;
+import android.os.Looper;
+import android.os.UserHandle;
+import android.support.v7.preference.Preference;
+import android.support.v7.preference.PreferenceViewHolder;
+import android.text.TextUtils;
+import android.util.AttributeSet;
+import android.util.SparseArray;
+import android.widget.TextView;
+
+import com.android.settingslib.R;
+
+public class AccessPointPreference extends Preference {
+
+ private static final int[] STATE_SECURED = {
+ R.attr.state_encrypted
+ };
+ private static final int[] STATE_NONE = {};
+
+ private static int[] wifi_signal_attributes = { R.attr.wifi_signal };
+
+ private final StateListDrawable mWifiSld;
+ private final int mBadgePadding;
+ private final UserBadgeCache mBadgeCache;
+
+ private TextView mTitleView;
+ private boolean mForSavedNetworks = false;
+ private AccessPoint mAccessPoint;
+ private Drawable mBadge;
+ private int mLevel;
+ private CharSequence mContentDescription;
+
+ static final int[] WIFI_CONNECTION_STRENGTH = {
+ R.string.accessibility_wifi_one_bar,
+ R.string.accessibility_wifi_two_bars,
+ R.string.accessibility_wifi_three_bars,
+ R.string.accessibility_wifi_signal_full
+ };
+
+ // Used for dummy pref.
+ public AccessPointPreference(Context context, AttributeSet attrs) {
+ super(context, attrs);
+ mWifiSld = null;
+ mBadgePadding = 0;
+ mBadgeCache = null;
+ }
+
+ public AccessPointPreference(AccessPoint accessPoint, Context context, UserBadgeCache cache,
+ boolean forSavedNetworks) {
+ super(context);
+ mBadgeCache = cache;
+ mAccessPoint = accessPoint;
+ mForSavedNetworks = forSavedNetworks;
+ mAccessPoint.setTag(this);
+ mLevel = -1;
+
+ mWifiSld = (StateListDrawable) context.getTheme()
+ .obtainStyledAttributes(wifi_signal_attributes).getDrawable(0);
+
+ // Distance from the end of the title at which this AP's user badge should sit.
+ mBadgePadding = context.getResources()
+ .getDimensionPixelSize(R.dimen.wifi_preference_badge_padding);
+ refresh();
+ }
+
+ public AccessPoint getAccessPoint() {
+ return mAccessPoint;
+ }
+
+ @Override
+ public void onBindViewHolder(final PreferenceViewHolder view) {
+ super.onBindViewHolder(view);
+ if (mAccessPoint == null) {
+ // Used for dummy pref.
+ return;
+ }
+ Drawable drawable = getIcon();
+ if (drawable != null) {
+ drawable.setLevel(mLevel);
+ }
+
+ mTitleView = (TextView) view.findViewById(com.android.internal.R.id.title);
+ if (mTitleView != null) {
+ // Attach to the end of the title view
+ mTitleView.setCompoundDrawablesRelativeWithIntrinsicBounds(null, null, mBadge, null);
+ mTitleView.setCompoundDrawablePadding(mBadgePadding);
+ }
+ view.itemView.setContentDescription(mContentDescription);
+ }
+
+ protected void updateIcon(int level, Context context) {
+ if (level == -1) {
+ setIcon(null);
+ } else {
+ if (getIcon() == null) {
+ // To avoid a drawing race condition, we first set the state (SECURE/NONE) and then
+ // set the icon (drawable) to that state's drawable.
+ // If sld is null then we are indexing and therefore do not have access to
+ // (nor need to display) the drawable.
+ if (mWifiSld != null) {
+ mWifiSld.setState((mAccessPoint.getSecurity() != AccessPoint.SECURITY_NONE)
+ ? STATE_SECURED
+ : STATE_NONE);
+ Drawable drawable = mWifiSld.getCurrent();
+ if (!mForSavedNetworks) {
+ setIcon(drawable);
+ } else {
+ setIcon(null);
+ }
+ }
+ }
+ }
+ }
+
+ protected void updateBadge(Context context) {
+ WifiConfiguration config = mAccessPoint.getConfig();
+ if (config != null) {
+ // Fetch badge (may be null)
+ // Get the badge using a cache since the PM will ask the UserManager for the list
+ // of profiles every time otherwise.
+ mBadge = mBadgeCache.getUserBadge(config.creatorUid);
+ }
+ }
+
+ /**
+ * Updates the title and summary; may indirectly call notifyChanged().
+ */
+ public void refresh() {
+ if (mForSavedNetworks) {
+ setTitle(mAccessPoint.getConfigName());
+ } else {
+ setTitle(mAccessPoint.getSsid());
+ }
+
+ final Context context = getContext();
+ int level = mAccessPoint.getLevel();
+ if (level != mLevel) {
+ mLevel = level;
+ updateIcon(mLevel, context);
+ notifyChanged();
+ }
+ updateBadge(context);
+
+ setSummary(mForSavedNetworks ? mAccessPoint.getSavedNetworkSummary()
+ : mAccessPoint.getSettingsSummary());
+
+ mContentDescription = getTitle();
+ if (getSummary() != null) {
+ mContentDescription = TextUtils.concat(mContentDescription, ",", getSummary());
+ }
+ if (level >= 0 && level < WIFI_CONNECTION_STRENGTH.length) {
+ mContentDescription = TextUtils.concat(mContentDescription, ",",
+ getContext().getString(WIFI_CONNECTION_STRENGTH[level]));
+ }
+ }
+
+ @Override
+ protected void notifyChanged() {
+ if (Looper.getMainLooper() != Looper.myLooper()) {
+ // Let our BG thread callbacks call setTitle/setSummary.
+ postNotifyChanged();
+ } else {
+ super.notifyChanged();
+ }
+ }
+
+ public void onLevelChanged() {
+ postNotifyChanged();
+ }
+
+ private void postNotifyChanged() {
+ if (mTitleView != null) {
+ mTitleView.post(mNotifyChanged);
+ } // Otherwise we haven't been bound yet, and don't need to update.
+ }
+
+ private final Runnable mNotifyChanged = new Runnable() {
+ @Override
+ public void run() {
+ notifyChanged();
+ }
+ };
+
+ public static class UserBadgeCache {
+ private final SparseArray<Drawable> mBadges = new SparseArray<>();
+ private final PackageManager mPm;
+
+ public UserBadgeCache(PackageManager pm) {
+ mPm = pm;
+ }
+
+ private Drawable getUserBadge(int userId) {
+ int index = mBadges.indexOfKey(userId);
+ if (index < 0) {
+ Drawable badge = mPm.getUserBadgeForDensity(new UserHandle(userId), 0 /* dpi */);
+ mBadges.put(userId, badge);
+ return badge;
+ }
+ return mBadges.valueAt(index);
+ }
+ }
+}
diff --git a/packages/SystemUI/Android.mk b/packages/SystemUI/Android.mk
index 61cad2f..e4d0fec 100644
--- a/packages/SystemUI/Android.mk
+++ b/packages/SystemUI/Android.mk
@@ -11,7 +11,8 @@
android-support-v7-recyclerview \
android-support-v7-preference \
android-support-v7-appcompat \
- android-support-v14-preference
+ android-support-v14-preference \
+ framework-protos
LOCAL_JAVA_LIBRARIES := telephony-common
diff --git a/packages/SystemUI/AndroidManifest.xml b/packages/SystemUI/AndroidManifest.xml
index 4cdfcb4..21abb90 100644
--- a/packages/SystemUI/AndroidManifest.xml
+++ b/packages/SystemUI/AndroidManifest.xml
@@ -229,7 +229,7 @@
android:resumeWhilePausing="true"
android:screenOrientation="behind"
android:resizeableActivity="true"
- android:configChanges="orientation|screenSize|smallestScreenSize|screenLayout|layoutDirection"
+ android:configChanges="orientation|screenSize|smallestScreenSize|screenLayout"
android:theme="@style/RecentsTheme.Wallpaper">
<intent-filter>
<action android:name="com.android.systemui.recents.TOGGLE_RECENTS" />
@@ -321,7 +321,7 @@
android:exported="true"
android:theme="@style/PipTheme"
android:launchMode="singleTop"
- android:configChanges="screenSize|smallestScreenSize|screenLayout|orientation|layoutDirection"
+ android:configChanges="screenSize|smallestScreenSize|screenLayout|orientation"
android:resizeable="true"
android:supportsPictureInPicture="true"
androidprv:alwaysFocusable="true"
@@ -331,7 +331,7 @@
android:exported="true"
android:theme="@style/PipTheme"
android:launchMode="singleTop"
- android:configChanges="screenSize|smallestScreenSize|screenLayout|orientation|layoutDirection"
+ android:configChanges="screenSize|smallestScreenSize|screenLayout|orientation"
android:resizeable="true"
android:supportsPictureInPicture="true"
android:excludeFromRecents="true" />
diff --git a/packages/SystemUI/res/drawable/ic_data_saver.xml b/packages/SystemUI/res/drawable/ic_data_saver.xml
new file mode 100644
index 0000000..426238c
--- /dev/null
+++ b/packages/SystemUI/res/drawable/ic_data_saver.xml
@@ -0,0 +1,28 @@
+<!--
+ Copyright (C) 2016 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+ android:width="24.0dp"
+ android:height="24.0dp"
+ android:viewportWidth="24.0"
+ android:viewportHeight="24.0">
+ <path
+ android:fillColor="#FFFFFFFF"
+ android:pathData="
+ M9.0,16.0l2.0,0.0L11.0,8.0L9.0,8.0l0.0,8.0z
+ m3.0,-14.0C6.48,2.0 2.0,6.48 2.0,12.0s4.48,10.0 10.0,10.0 10.0,-4.48 10.0,-10.0S17.52,2.0 12.0,2.0z
+ m0.0,18.0c-4.41,0.0 -8.0,-3.59 -8.0,-8.0s3.59,-8.0 8.0,-8.0 8.0,3.59 8.0,8.0 -3.59,8.0 -8.0,8.0z
+ m1.0,-4.0l2.0,0.0l0.0,-8.0l-2.0,0.0l0.0,8.0z"/>
+</vector>
diff --git a/packages/SystemUI/res/drawable/ic_data_saver_off.xml b/packages/SystemUI/res/drawable/ic_data_saver_off.xml
new file mode 100644
index 0000000..0713548
--- /dev/null
+++ b/packages/SystemUI/res/drawable/ic_data_saver_off.xml
@@ -0,0 +1,28 @@
+<!--
+ Copyright (C) 2016 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+ android:width="24.0dp"
+ android:height="24.0dp"
+ android:viewportWidth="24.0"
+ android:viewportHeight="24.0">
+ <path
+ android:fillColor="#4DFFFFFF"
+ android:pathData="
+ M9.0,16.0l2.0,0.0L11.0,8.0L9.0,8.0l0.0,8.0z
+ m3.0,-14.0C6.48,2.0 2.0,6.48 2.0,12.0s4.48,10.0 10.0,10.0 10.0,-4.48 10.0,-10.0S17.52,2.0 12.0,2.0z
+ m0.0,18.0c-4.41,0.0 -8.0,-3.59 -8.0,-8.0s3.59,-8.0 8.0,-8.0 8.0,3.59 8.0,8.0 -3.59,8.0 -8.0,8.0z
+ m1.0,-4.0l2.0,0.0l0.0,-8.0l-2.0,0.0l0.0,8.0z"/>
+</vector>
diff --git a/packages/SystemUI/res/layout-sw600dp/navigation_layout_rot90.xml b/packages/SystemUI/res/layout-sw600dp/navigation_layout_rot90.xml
index dd559c5..38265f6 100644
--- a/packages/SystemUI/res/layout-sw600dp/navigation_layout_rot90.xml
+++ b/packages/SystemUI/res/layout-sw600dp/navigation_layout_rot90.xml
@@ -25,10 +25,9 @@
android:layout_height="match_parent">
<LinearLayout
- android:id="@+id/start_group"
+ android:id="@+id/ends_group"
android:layout_width="match_parent"
android:layout_height="match_parent"
- android:gravity="start"
android:orientation="horizontal" />
<LinearLayout
@@ -38,13 +37,6 @@
android:gravity="center"
android:orientation="horizontal" />
- <LinearLayout
- android:id="@+id/end_group"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:gravity="end"
- android:orientation="horizontal" />
-
</FrameLayout>
<FrameLayout
@@ -53,10 +45,9 @@
android:layout_height="match_parent">
<LinearLayout
- android:id="@+id/start_group_lightsout"
+ android:id="@+id/ends_group_lightsout"
android:layout_width="match_parent"
android:layout_height="match_parent"
- android:gravity="start"
android:orientation="horizontal" />
<LinearLayout
@@ -66,13 +57,6 @@
android:gravity="center"
android:orientation="horizontal" />
- <LinearLayout
- android:id="@+id/end_group_lightsout"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:gravity="end"
- android:orientation="horizontal" />
-
</FrameLayout>
<com.android.systemui.statusbar.policy.DeadZone
diff --git a/packages/SystemUI/res/layout/apps_bar.xml b/packages/SystemUI/res/layout/apps_bar.xml
new file mode 100644
index 0000000..e226805
--- /dev/null
+++ b/packages/SystemUI/res/layout/apps_bar.xml
@@ -0,0 +1,31 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+**
+** Copyright 2016, The Android Open Source Project
+**
+** Licensed under the Apache License, Version 2.0 (the "License");
+** you may not use this file except in compliance with the License.
+** You may obtain a copy of the License at
+**
+** http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+** See the License for the specific language governing permissions and
+** limitations under the License.
+-->
+
+<!-- Container for the app shelf. -->
+<LinearLayout
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ android:id="@+id/app_shelf"
+ android:orientation="horizontal"
+ android:layout_height="match_parent"
+ android:layout_width="0dp"
+ android:layout_weight="1">
+ <com.android.systemui.statusbar.phone.NavigationBarApps
+ android:id="@+id/navigation_bar_apps"
+ android:layout_width="wrap_content"
+ android:layout_height="match_parent" />
+</LinearLayout>
diff --git a/packages/SystemUI/res/layout/car_fullscreen_user_switcher.xml b/packages/SystemUI/res/layout/car_fullscreen_user_switcher.xml
index b953ff2..9ef743d 100644
--- a/packages/SystemUI/res/layout/car_fullscreen_user_switcher.xml
+++ b/packages/SystemUI/res/layout/car_fullscreen_user_switcher.xml
@@ -39,13 +39,13 @@
android:paddingStart="@dimen/car_lockscreen_disclaimer_text_padding_start"
android:paddingEnd="@dimen/car_lockscreen_disclaimer_text_padding_end"
android:paddingTop="@dimen/car_lockscreen_disclaimer_text_padding_top" />
- <com.android.systemui.statusbar.UserGridView
+ <com.android.systemui.statusbar.car.UserGridView
android:id="@+id/user_grid"
android:layout_gravity="center"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:paddingTop="@dimen/car_lockscreen_user_grid_view_padding_top"
android:stretchMode="columnWidth">
- </com.android.systemui.statusbar.UserGridView>
+ </com.android.systemui.statusbar.car.UserGridView>
</LinearLayout>
</FrameLayout>
diff --git a/packages/SystemUI/res/layout/navigation_bar_with_apps.xml b/packages/SystemUI/res/layout/navigation_bar_with_apps.xml
deleted file mode 100644
index ac95b5e..0000000
--- a/packages/SystemUI/res/layout/navigation_bar_with_apps.xml
+++ /dev/null
@@ -1,331 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-**
-** Copyright 2012, 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.
--->
-
-<!-- Navigation bar with app shortcuts. See also navigation_bar.xml. -->
-<com.android.systemui.statusbar.phone.NavigationBarView
- xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:systemui="http://schemas.android.com/apk/res-auto"
- android:layout_height="match_parent"
- android:layout_width="match_parent"
- android:background="@drawable/system_bar_background"
- >
-
- <!-- Portrait layout. -->
- <FrameLayout android:id="@+id/rot0"
- android:layout_height="match_parent"
- android:layout_width="match_parent"
- >
-
- <LinearLayout
- android:layout_height="match_parent"
- android:layout_width="match_parent"
- android:orientation="horizontal"
- android:clipChildren="false"
- android:clipToPadding="false"
- android:id="@+id/nav_buttons"
- android:animateLayoutChanges="true"
- >
-
- <!-- Back button is flush left. -->
- <com.android.systemui.statusbar.policy.KeyButtonView
- android:id="@+id/back"
- android:layout_width="64dp"
- android:paddingStart="4dp"
- android:paddingEnd="4dp"
- android:layout_height="match_parent"
- android:src="@drawable/ic_sysbar_back"
- android:scaleType="centerInside"
- systemui:keyCode="4"
- android:layout_weight="0"
- android:contentDescription="@string/accessibility_back"
- />
-
- <com.android.systemui.statusbar.policy.KeyButtonView
- android:id="@+id/home"
- android:layout_width="64dp"
- android:paddingStart="4dp"
- android:paddingEnd="4dp"
- android:layout_height="match_parent"
- android:src="@drawable/ic_sysbar_home"
- android:scaleType="centerInside"
- systemui:keyCode="3"
- systemui:keyRepeat="true"
- android:layout_weight="0"
- android:contentDescription="@string/accessibility_home"
- />
-
- <!-- Container for the app shelf. -->
- <LinearLayout
- android:id="@+id/app_shelf"
- android:orientation="horizontal"
- android:layout_height="match_parent"
- android:layout_width="0dp"
- android:layout_weight="1"
- >
- <com.android.systemui.statusbar.phone.NavigationBarApps
- android:id="@+id/navigation_bar_apps"
- android:layout_width="wrap_content"
- android:layout_height="match_parent"
- />
- </LinearLayout>
-
- <FrameLayout
- android:layout_width="@dimen/navigation_extra_key_width"
- android:layout_height="match_parent"
- android:layout_weight="0"
- android:layout_marginEnd="2dp" >
- <com.android.systemui.statusbar.policy.KeyButtonView android:id="@+id/menu"
- android:layout_width="@dimen/navigation_extra_key_width"
- android:layout_height="match_parent"
- android:src="@drawable/ic_sysbar_menu"
- android:scaleType="centerInside"
- android:layout_marginEnd="2dp"
- systemui:keyCode="82"
- android:visibility="invisible"
- android:contentDescription="@string/accessibility_menu"
- />
- <com.android.systemui.statusbar.policy.KeyButtonView
- android:id="@+id/ime_switcher"
- android:layout_width="@dimen/navigation_extra_key_width"
- android:layout_height="match_parent"
- android:layout_marginEnd="2dp"
- android:scaleType="centerInside"
- android:src="@drawable/ic_ime_switcher_default"
- android:visibility="invisible"
- android:contentDescription="@string/accessibility_ime_switch_button" />
- </FrameLayout>
-
- <!-- Recents always at the far right. -->
- <com.android.systemui.statusbar.policy.KeyButtonView
- android:id="@+id/recent_apps"
- android:layout_width="64dp"
- android:paddingStart="4dp"
- android:paddingEnd="4dp"
- android:layout_height="match_parent"
- android:src="@drawable/ic_sysbar_recent"
- android:scaleType="centerInside"
- android:layout_weight="0"
- android:contentDescription="@string/accessibility_recent"
- />
- </LinearLayout>
-
- <!-- lights out layout to match exactly -->
- <LinearLayout
- android:layout_height="match_parent"
- android:layout_width="match_parent"
- android:orientation="horizontal"
- android:id="@+id/lights_out"
- android:visibility="gone"
- >
- <ImageView
- android:layout_width="64dp"
- android:paddingStart="4dp"
- android:paddingEnd="4dp"
- android:layout_height="match_parent"
- android:src="@drawable/ic_sysbar_lights_out_dot_small"
- android:scaleType="center"
- android:layout_weight="0"
- />
- <ImageView
- android:layout_width="64dp"
- android:paddingStart="4dp"
- android:paddingEnd="4dp"
- android:layout_height="match_parent"
- android:src="@drawable/ic_sysbar_lights_out_dot_large"
- android:scaleType="center"
- android:layout_weight="0"
- />
- <Space
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:layout_weight="1"
- />
- <ImageView
- android:layout_width="64dp"
- android:paddingStart="4dp"
- android:paddingEnd="4dp"
- android:layout_height="match_parent"
- android:src="@drawable/ic_sysbar_lights_out_dot_small"
- android:scaleType="center"
- android:layout_weight="0"
- />
- </LinearLayout>
-
- <com.android.systemui.statusbar.policy.DeadZone
- android:id="@+id/deadzone"
- android:layout_height="match_parent"
- android:layout_width="match_parent"
- systemui:minSize="@dimen/navigation_bar_deadzone_size"
- systemui:maxSize="@dimen/navigation_bar_deadzone_size_max"
- systemui:holdTime="@integer/navigation_bar_deadzone_hold"
- systemui:decayTime="@integer/navigation_bar_deadzone_decay"
- systemui:orientation="horizontal"
- android:layout_gravity="top"
- />
- </FrameLayout>
-
- <!-- Landscape layout. -->
- <FrameLayout android:id="@+id/rot90"
- android:layout_height="match_parent"
- android:layout_width="match_parent"
- android:visibility="gone"
- android:paddingTop="0dp"
- >
-
- <LinearLayout
- android:layout_height="match_parent"
- android:layout_width="match_parent"
- android:orientation="horizontal"
- android:clipChildren="false"
- android:clipToPadding="false"
- android:id="@+id/nav_buttons"
- android:animateLayoutChanges="true"
- >
-
- <!-- Back button is flush left. -->
- <com.android.systemui.statusbar.policy.KeyButtonView android:id="@+id/back"
- android:layout_width="64dp"
- android:paddingStart="4dp"
- android:paddingEnd="4dp"
- android:layout_height="match_parent"
- android:src="@drawable/ic_sysbar_back"
- android:scaleType="centerInside"
- systemui:keyCode="4"
- android:layout_weight="0"
- android:contentDescription="@string/accessibility_back"
- />
- <com.android.systemui.statusbar.policy.KeyButtonView android:id="@+id/home"
- android:layout_width="64dp" android:paddingStart="4dp" android:paddingEnd="4dp"
- android:layout_height="match_parent"
- android:src="@drawable/ic_sysbar_home"
- android:scaleType="centerInside"
- systemui:keyCode="3"
- systemui:keyRepeat="true"
- android:layout_weight="0"
- android:contentDescription="@string/accessibility_home"
- />
-
- <!-- Container for the app shelf. -->
- <LinearLayout
- android:id="@+id/app_shelf"
- android:orientation="horizontal"
- android:layout_height="match_parent"
- android:layout_width="0dp"
- android:layout_weight="1"
- >
- <com.android.systemui.statusbar.phone.NavigationBarApps
- android:id="@+id/navigation_bar_apps"
- android:layout_width="wrap_content"
- android:layout_height="match_parent"
- />
- </LinearLayout>
-
- <FrameLayout
- android:layout_width="@dimen/navigation_extra_key_width"
- android:layout_height="match_parent"
- android:layout_marginEnd="2dp"
- android:layout_weight="0"
- android:visibility="gone" >
- <com.android.systemui.statusbar.policy.KeyButtonView android:id="@+id/menu"
- android:layout_width="@dimen/navigation_extra_key_width"
- android:layout_height="match_parent"
- android:layout_marginEnd="2dp"
- android:src="@drawable/ic_sysbar_menu"
- android:scaleType="centerInside"
- systemui:keyCode="82"
- android:visibility="invisible"
- android:contentDescription="@string/accessibility_menu" />
- <com.android.systemui.statusbar.policy.KeyButtonView
- android:id="@+id/ime_switcher"
- android:layout_width="@dimen/navigation_extra_key_width"
- android:layout_height="match_parent"
- android:layout_marginEnd="2dp"
- android:src="@drawable/ic_ime_switcher_default"
- android:visibility="invisible"
- android:contentDescription="@string/accessibility_ime_switch_button"
- android:scaleType="centerInside" />
- </FrameLayout>
-
- <!-- Recents always at the far right. -->
- <com.android.systemui.statusbar.policy.KeyButtonView android:id="@+id/recent_apps"
- android:layout_width="64dp"
- android:paddingStart="4dp"
- android:paddingEnd="4dp"
- android:layout_height="match_parent"
- android:src="@drawable/ic_sysbar_recent"
- android:scaleType="centerInside"
- android:layout_weight="0"
- android:contentDescription="@string/accessibility_recent"
- />
- </LinearLayout>
-
- <!-- lights out layout to match exactly -->
- <LinearLayout
- android:layout_height="match_parent"
- android:layout_width="match_parent"
- android:orientation="horizontal"
- android:id="@+id/lights_out"
- android:visibility="gone"
- >
- <ImageView
- android:layout_width="64dp"
- android:paddingStart="4dp"
- android:paddingEnd="4dp"
- android:layout_height="match_parent"
- android:src="@drawable/ic_sysbar_lights_out_dot_small"
- android:scaleType="center"
- android:layout_weight="0"
- />
- <ImageView
- android:layout_width="64dp"
- android:paddingStart="4dp"
- android:paddingEnd="4dp"
- android:layout_height="match_parent"
- android:src="@drawable/ic_sysbar_lights_out_dot_large"
- android:scaleType="center"
- android:layout_weight="0"
- />
- <Space
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:layout_weight="1"
- />
- <ImageView
- android:layout_width="64dp"
- android:paddingStart="4dp"
- android:paddingEnd="4dp"
- android:layout_height="match_parent"
- android:src="@drawable/ic_sysbar_lights_out_dot_small"
- android:scaleType="center"
- android:layout_weight="0"
- />
- </LinearLayout>
-
- <com.android.systemui.statusbar.policy.DeadZone
- android:id="@+id/deadzone"
- android:layout_height="match_parent"
- android:layout_width="match_parent"
- systemui:minSize="@dimen/navigation_bar_deadzone_size"
- systemui:maxSize="@dimen/navigation_bar_deadzone_size_max"
- systemui:holdTime="@integer/navigation_bar_deadzone_hold"
- systemui:decayTime="@integer/navigation_bar_deadzone_decay"
- systemui:orientation="horizontal"
- android:layout_gravity="top"
- />
- </FrameLayout>
-</com.android.systemui.statusbar.phone.NavigationBarView>
diff --git a/packages/SystemUI/res/layout/navigation_layout.xml b/packages/SystemUI/res/layout/navigation_layout.xml
index 7ebf4ed..f9a3653 100644
--- a/packages/SystemUI/res/layout/navigation_layout.xml
+++ b/packages/SystemUI/res/layout/navigation_layout.xml
@@ -26,10 +26,9 @@
android:layout_height="match_parent">
<LinearLayout
- android:id="@+id/start_group"
+ android:id="@+id/ends_group"
android:layout_width="match_parent"
android:layout_height="match_parent"
- android:gravity="start"
android:orientation="horizontal" />
<LinearLayout
@@ -39,13 +38,6 @@
android:gravity="center"
android:orientation="horizontal" />
- <LinearLayout
- android:id="@+id/end_group"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:gravity="end"
- android:orientation="horizontal" />
-
</FrameLayout>
<FrameLayout
@@ -54,10 +46,9 @@
android:layout_height="match_parent">
<LinearLayout
- android:id="@+id/start_group_lightsout"
+ android:id="@+id/ends_group_lightsout"
android:layout_width="match_parent"
android:layout_height="match_parent"
- android:gravity="start"
android:orientation="horizontal" />
<LinearLayout
@@ -67,13 +58,6 @@
android:gravity="center"
android:orientation="horizontal" />
- <LinearLayout
- android:id="@+id/end_group_lightsout"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:gravity="end"
- android:orientation="horizontal" />
-
</FrameLayout>
<com.android.systemui.statusbar.policy.DeadZone
diff --git a/packages/SystemUI/res/layout/navigation_layout_rot90.xml b/packages/SystemUI/res/layout/navigation_layout_rot90.xml
index 46df973..df32911 100644
--- a/packages/SystemUI/res/layout/navigation_layout_rot90.xml
+++ b/packages/SystemUI/res/layout/navigation_layout_rot90.xml
@@ -26,10 +26,9 @@
android:layout_height="match_parent">
<com.android.systemui.statusbar.phone.ReverseLinearLayout
- android:id="@+id/start_group"
+ android:id="@+id/ends_group"
android:layout_width="match_parent"
android:layout_height="match_parent"
- android:gravity="bottom"
android:orientation="vertical" />
<com.android.systemui.statusbar.phone.ReverseLinearLayout
@@ -39,13 +38,6 @@
android:gravity="center"
android:orientation="vertical" />
- <com.android.systemui.statusbar.phone.ReverseLinearLayout
- android:id="@+id/end_group"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:gravity="top"
- android:orientation="vertical" />
-
</FrameLayout>
<FrameLayout
@@ -54,10 +46,9 @@
android:layout_height="match_parent">
<com.android.systemui.statusbar.phone.ReverseLinearLayout
- android:id="@+id/start_group_lightsout"
+ android:id="@+id/ends_group_lightsout"
android:layout_width="match_parent"
android:layout_height="match_parent"
- android:gravity="bottom"
android:orientation="vertical" />
<com.android.systemui.statusbar.phone.ReverseLinearLayout
@@ -67,13 +58,6 @@
android:gravity="center"
android:orientation="vertical" />
- <com.android.systemui.statusbar.phone.ReverseLinearLayout
- android:id="@+id/end_group_lightsout"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:gravity="top"
- android:orientation="vertical" />
-
</FrameLayout>
<com.android.systemui.statusbar.policy.DeadZone
diff --git a/packages/SystemUI/res/values/strings.xml b/packages/SystemUI/res/values/strings.xml
index 814e7ea..faf36ec 100644
--- a/packages/SystemUI/res/values/strings.xml
+++ b/packages/SystemUI/res/values/strings.xml
@@ -1333,4 +1333,13 @@
<!-- Explanation of the status bar section of the tuner [CHAR LIMIT=NONE] -->
<string name="tuner_status_bar_explanation">Enable or disable icons from being shown in the status bar.</string>
+ <!-- Label for quick settings tile for data saver [CHAR LIMIT=30] -->
+ <string name="data_saver">Data Saver</string>
+
+ <!-- Accessibility description for data saver being on [CHAR LIMIT=NONE] -->
+ <string name="accessibility_data_saver_on">Data Saver is on</string>
+
+ <!-- Accessibility description for data saver being off [CHAR LIMIT=NONE] -->
+ <string name="accessibility_data_saver_off">Data Saver is off</string>
+
</resources>
diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java b/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java
index 704de97..0475c72 100644
--- a/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java
+++ b/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java
@@ -84,6 +84,10 @@
import java.util.List;
import static android.provider.Settings.System.SCREEN_OFF_TIMEOUT;
+import static com.android.internal.widget.LockPatternUtils.StrongAuthTracker.SOME_AUTH_REQUIRED_AFTER_USER_REQUEST;
+import static com.android.internal.widget.LockPatternUtils.StrongAuthTracker.SOME_AUTH_REQUIRED_AFTER_WRONG_CREDENTIAL;
+import static com.android.internal.widget.LockPatternUtils.StrongAuthTracker.STRONG_AUTH_REQUIRED_AFTER_DPM_LOCK_NOW;
+import static com.android.internal.widget.LockPatternUtils.StrongAuthTracker.STRONG_AUTH_REQUIRED_AFTER_LOCKOUT;
/**
* Mediates requests related to the keyguard. This includes queries about the
@@ -550,14 +554,28 @@
@Override
public int getBouncerPromptReason() {
int currentUser = ActivityManager.getCurrentUser();
- if ((mUpdateMonitor.getUserTrustIsManaged(currentUser)
- || mUpdateMonitor.isUnlockWithFingerprintPossible(currentUser))
- && !mUpdateMonitor.getStrongAuthTracker().hasUserAuthenticatedSinceBoot()) {
+ boolean trust = mTrustManager.isTrustUsuallyManaged(currentUser);
+ boolean fingerprint = mUpdateMonitor.isUnlockWithFingerprintPossible(currentUser);
+ boolean any = trust || fingerprint;
+ KeyguardUpdateMonitor.StrongAuthTracker strongAuthTracker =
+ mUpdateMonitor.getStrongAuthTracker();
+ int strongAuth = strongAuthTracker.getStrongAuthForUser(currentUser);
+
+ if (any && !strongAuthTracker.hasUserAuthenticatedSinceBoot()) {
return KeyguardSecurityView.PROMPT_REASON_RESTART;
- } else if (mUpdateMonitor.isUnlockWithFingerprintPossible(currentUser)
- && mUpdateMonitor.hasFingerprintUnlockTimedOut(currentUser)) {
+ } else if (fingerprint && mUpdateMonitor.hasFingerprintUnlockTimedOut(currentUser)) {
return KeyguardSecurityView.PROMPT_REASON_TIMEOUT;
+ } else if (any && (strongAuth & STRONG_AUTH_REQUIRED_AFTER_DPM_LOCK_NOW) != 0) {
+ return KeyguardSecurityView.PROMPT_REASON_DEVICE_ADMIN;
+ } else if (trust && (strongAuth & SOME_AUTH_REQUIRED_AFTER_USER_REQUEST) != 0) {
+ return KeyguardSecurityView.PROMPT_REASON_USER_REQUEST;
+ } else if (any && (strongAuth & STRONG_AUTH_REQUIRED_AFTER_LOCKOUT) != 0) {
+ return KeyguardSecurityView.PROMPT_REASON_AFTER_LOCKOUT;
+ } else if (trust && (strongAuth & SOME_AUTH_REQUIRED_AFTER_WRONG_CREDENTIAL) != 0) {
+ return KeyguardSecurityView.PROMPT_REASON_WRONG_CREDENTIAL;
}
+
+
return KeyguardSecurityView.PROMPT_REASON_NONE;
}
};
diff --git a/packages/SystemUI/src/com/android/systemui/qs/QSPanel.java b/packages/SystemUI/src/com/android/systemui/qs/QSPanel.java
index b5f146b..8979023 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/QSPanel.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/QSPanel.java
@@ -34,7 +34,9 @@
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;
+
import com.android.internal.logging.MetricsLogger;
+import com.android.internal.logging.MetricsProto.MetricsEvent;
import com.android.systemui.FontSizeUtils;
import com.android.systemui.R;
import com.android.systemui.qs.QSTile.DetailAdapter;
@@ -245,7 +247,7 @@
public void setExpanded(boolean expanded) {
if (mExpanded == expanded) return;
mExpanded = expanded;
- MetricsLogger.visibility(mContext, MetricsLogger.QS_PANEL, mExpanded);
+ MetricsLogger.visibility(mContext, MetricsEvent.QS_PANEL, mExpanded);
if (!mExpanded) {
closeDetail();
} else {
@@ -498,7 +500,7 @@
int newVis = visible ? VISIBLE : INVISIBLE;
mQsContainer.setVisibility(newVis);
if (mGridContentVisible != visible) {
- MetricsLogger.visibility(mContext, MetricsLogger.QS_PANEL, newVis);
+ MetricsLogger.visibility(mContext, MetricsEvent.QS_PANEL, newVis);
}
mGridContentVisible = visible;
}
diff --git a/packages/SystemUI/src/com/android/systemui/qs/customize/TileAdapter.java b/packages/SystemUI/src/com/android/systemui/qs/customize/TileAdapter.java
index 6e22dde..543a2f3 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/customize/TileAdapter.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/customize/TileAdapter.java
@@ -73,7 +73,7 @@
mCurrentTiles = tileSpecs;
final TileGroup group = new TileGroup("com.android.settings", mContext);
String possible = mContext.getString(R.string.quick_settings_tiles_default)
- + ",user,hotspot,inversion";
+ + ",user,hotspot,inversion,saver";
String[] possibleTiles = possible.split(",");
for (int i = 0; i < possibleTiles.length; i++) {
final String spec = possibleTiles[i];
diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/DataSaverTile.java b/packages/SystemUI/src/com/android/systemui/qs/tiles/DataSaverTile.java
new file mode 100644
index 0000000..1aeb0fe
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/DataSaverTile.java
@@ -0,0 +1,73 @@
+/*
+ * Copyright (C) 2016 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file
+ * except in compliance with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software distributed under the
+ * License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the specific language governing
+ * permissions and limitations under the License.
+ */
+
+package com.android.systemui.qs.tiles;
+
+import com.android.internal.logging.MetricsProto.MetricsEvent;
+import com.android.systemui.R;
+import com.android.systemui.qs.QSTile;
+import com.android.systemui.statusbar.policy.DataSaverController;
+
+public class DataSaverTile extends QSTile<QSTile.BooleanState> implements
+ DataSaverController.Listener{
+
+ private final DataSaverController mDataSaverController;
+
+ public DataSaverTile(Host host) {
+ super(host);
+ mDataSaverController = host.getNetworkController().getDataSaverController();
+ }
+
+ @Override
+ protected BooleanState newTileState() {
+ return new BooleanState();
+ }
+
+ @Override
+ public void setListening(boolean listening) {
+ if (listening) {
+ mDataSaverController.addListener(this);
+ } else {
+ mDataSaverController.remListener(this);
+ }
+ }
+
+ @Override
+ protected void handleClick() {
+ mState.value = !mDataSaverController.isDataSaverEnabled();
+ mDataSaverController.setDataSaverEnabled(mState.value);
+ refreshState(mState.value);
+ }
+
+ @Override
+ protected void handleUpdateState(BooleanState state, Object arg) {
+ state.value = arg instanceof Boolean ? (Boolean) arg
+ : mDataSaverController.isDataSaverEnabled();
+ state.label = mContext.getString(R.string.data_saver);
+ state.contentDescription = mContext.getString(state.value ?
+ R.string.accessibility_data_saver_on : R.string.accessibility_data_saver_off);
+ state.icon = ResourceIcon.get(state.value ? R.drawable.ic_data_saver
+ : R.drawable.ic_data_saver_off);
+ }
+
+ @Override
+ public int getMetricsCategory() {
+ return MetricsEvent.QS_DATA_SAVER;
+ }
+
+ @Override
+ public void onDataSaverChanged(boolean isDataSaving) {
+ refreshState(isDataSaving);
+ }
+}
\ No newline at end of file
diff --git a/packages/SystemUI/src/com/android/systemui/recents/RecentsDebugFlags.java b/packages/SystemUI/src/com/android/systemui/recents/RecentsDebugFlags.java
index 881aa6a..5cd540b 100644
--- a/packages/SystemUI/src/com/android/systemui/recents/RecentsDebugFlags.java
+++ b/packages/SystemUI/src/com/android/systemui/recents/RecentsDebugFlags.java
@@ -26,10 +26,6 @@
*/
public class RecentsDebugFlags implements TunerService.Tunable {
- private static final String KEY_FAST_TOGGLE = "overview_fast_toggle_via_button";
- private static final String KEY_FAST_TOGGLE_INDICATOR = "overview_fast_toggle_indicator";
- private static final String KEY_INITIAL_STATE_PAGING = "overview_initial_state_paging";
-
public static class Static {
// Enables debug drawing for the transition thumbnail
public static final boolean EnableTransitionThumbnailDebugMode = false;
@@ -39,18 +35,23 @@
public static final boolean DisableBackgroundCache = false;
// Enables the task affiliations
public static final boolean EnableAffiliatedTaskGroups = true;
- // 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;
+ public static final boolean EnableMockTasks = false;
// Defines the number of mock recents packages to create
- public static final int SystemServicesProxyMockPackageCount = 3;
+ public static final int MockTasksPackageCount = 3;
// Defines the number of mock recents tasks to create
- public static final int SystemServicesProxyMockTaskCount = 100;
+ public static final int MockTaskCount = 100;
+ // Enables the simulated task affiliations
+ public static final boolean EnableMockTaskGroups = false;
+ // Defines the number of mock task affiliations per group
+ public static final int MockTaskGroupsTaskCount = 12;
}
+ private static final String KEY_FAST_TOGGLE = "overview_fast_toggle_via_button";
+ private static final String KEY_FAST_TOGGLE_INDICATOR = "overview_fast_toggle_indicator";
+ private static final String KEY_INITIAL_STATE_PAGING = "overview_initial_state_paging";
+
private boolean mFastToggleRecents;
private boolean mFastToggleIndicator;
private boolean mInitialStatePaging;
diff --git a/packages/SystemUI/src/com/android/systemui/recents/RecentsImpl.java b/packages/SystemUI/src/com/android/systemui/recents/RecentsImpl.java
index f8cbf65..5f11bee 100644
--- a/packages/SystemUI/src/com/android/systemui/recents/RecentsImpl.java
+++ b/packages/SystemUI/src/com/android/systemui/recents/RecentsImpl.java
@@ -108,6 +108,10 @@
public void onActivityPinned() {
}
+ @Override
+ public void onPinnedActivityRestartAttempt() {
+ }
+
/** Preloads the next task */
public void run() {
RecentsConfiguration config = Recents.getConfiguration();
diff --git a/packages/SystemUI/src/com/android/systemui/recents/misc/SystemServicesProxy.java b/packages/SystemUI/src/com/android/systemui/recents/misc/SystemServicesProxy.java
index 3f52ae8..87cfcff 100644
--- a/packages/SystemUI/src/com/android/systemui/recents/misc/SystemServicesProxy.java
+++ b/packages/SystemUI/src/com/android/systemui/recents/misc/SystemServicesProxy.java
@@ -151,7 +151,7 @@
// Resolve the assist intent
mAssistComponent = mAssistUtils.getAssistComponentForUser(UserHandle.myUserId());
- if (RecentsDebugFlags.Static.EnableSystemServicesProxy) {
+ if (RecentsDebugFlags.Static.EnableMockTasks) {
// Create a dummy icon
mDummyIcon = Bitmap.createBitmap(1, 1, Bitmap.Config.ARGB_8888);
mDummyIcon.eraseColor(0xFF999999);
@@ -164,20 +164,20 @@
if (mAm == null) return null;
// If we are mocking, then create some recent tasks
- if (RecentsDebugFlags.Static.EnableSystemServicesProxy) {
+ if (RecentsDebugFlags.Static.EnableMockTasks) {
ArrayList<ActivityManager.RecentTaskInfo> tasks =
new ArrayList<ActivityManager.RecentTaskInfo>();
- int count = Math.min(numLatestTasks, RecentsDebugFlags.Static.SystemServicesProxyMockTaskCount);
+ int count = Math.min(numLatestTasks, RecentsDebugFlags.Static.MockTaskCount);
for (int i = 0; i < count; i++) {
// Create a dummy component name
- int packageIndex = i % RecentsDebugFlags.Static.SystemServicesProxyMockPackageCount;
+ int packageIndex = i % RecentsDebugFlags.Static.MockTasksPackageCount;
ComponentName cn = new ComponentName("com.android.test" + packageIndex,
"com.android.test" + i + ".Activity");
String description = "" + i + " - " +
Long.toString(Math.abs(new Random().nextLong()), 36);
// Create the recent task info
ActivityManager.RecentTaskInfo rti = new ActivityManager.RecentTaskInfo();
- rti.id = rti.persistentId = i;
+ rti.id = rti.persistentId = rti.affiliatedTaskId = i;
rti.baseIntent = new Intent();
rti.baseIntent.setComponent(cn);
rti.description = description;
@@ -418,7 +418,7 @@
if (mAm == null) return null;
// If we are mocking, then just return a dummy thumbnail
- if (RecentsDebugFlags.Static.EnableSystemServicesProxy) {
+ if (RecentsDebugFlags.Static.EnableMockTasks) {
Bitmap thumbnail = Bitmap.createBitmap(mDummyThumbnailWidth, mDummyThumbnailHeight,
Bitmap.Config.ARGB_8888);
thumbnail.eraseColor(0xff333333);
@@ -484,7 +484,7 @@
/** Moves a task to the front with the specified activity options. */
public void moveTaskToFront(int taskId, ActivityOptions opts) {
if (mAm == null) return;
- if (RecentsDebugFlags.Static.EnableSystemServicesProxy) return;
+ if (RecentsDebugFlags.Static.EnableMockTasks) return;
if (opts != null) {
mAm.moveTaskToFront(taskId, ActivityManager.MOVE_TASK_WITH_HOME,
@@ -497,7 +497,7 @@
/** Removes the task */
public void removeTask(final int taskId) {
if (mAm == null) return;
- if (RecentsDebugFlags.Static.EnableSystemServicesProxy) return;
+ if (RecentsDebugFlags.Static.EnableMockTasks) return;
// Remove the task.
BackgroundThread.getHandler().post(new Runnable() {
@@ -528,7 +528,7 @@
*/
public ActivityInfo getActivityInfo(ComponentName cn, int userId) {
if (mIpm == null) return null;
- if (RecentsDebugFlags.Static.EnableSystemServicesProxy) return new ActivityInfo();
+ if (RecentsDebugFlags.Static.EnableMockTasks) return new ActivityInfo();
try {
return mIpm.getActivityInfo(cn, PackageManager.GET_META_DATA, userId);
@@ -545,7 +545,7 @@
*/
public ActivityInfo getActivityInfo(ComponentName cn) {
if (mPm == null) return null;
- if (RecentsDebugFlags.Static.EnableSystemServicesProxy) return new ActivityInfo();
+ if (RecentsDebugFlags.Static.EnableMockTasks) return new ActivityInfo();
try {
return mPm.getActivityInfo(cn, PackageManager.GET_META_DATA);
@@ -562,7 +562,7 @@
if (mPm == null) return null;
// If we are mocking, then return a mock label
- if (RecentsDebugFlags.Static.EnableSystemServicesProxy) {
+ if (RecentsDebugFlags.Static.EnableMockTasks) {
return "Recent Task: " + userId;
}
@@ -576,7 +576,7 @@
if (mPm == null) return null;
// If we are mocking, then return a mock label
- if (RecentsDebugFlags.Static.EnableSystemServicesProxy) {
+ if (RecentsDebugFlags.Static.EnableMockTasks) {
return "Recent Task App: " + userId;
}
@@ -588,6 +588,11 @@
* description joins the app and activity labels.
*/
public String getBadgedContentDescription(ActivityInfo info, int userId, Resources res) {
+ // If we are mocking, then return a mock label
+ if (RecentsDebugFlags.Static.EnableMockTasks) {
+ return "Recent Task Content Description: " + userId;
+ }
+
String activityLabel = info.loadLabel(mPm).toString();
String applicationLabel = info.applicationInfo.loadLabel(mPm).toString();
String badgedApplicationLabel = getBadgedLabel(applicationLabel, userId);
@@ -604,7 +609,7 @@
if (mPm == null) return null;
// If we are mocking, then return a mock label
- if (RecentsDebugFlags.Static.EnableSystemServicesProxy) {
+ if (RecentsDebugFlags.Static.EnableMockTasks) {
return new ColorDrawable(0xFF666666);
}
@@ -620,7 +625,7 @@
if (mPm == null) return null;
// If we are mocking, then return a mock label
- if (RecentsDebugFlags.Static.EnableSystemServicesProxy) {
+ if (RecentsDebugFlags.Static.EnableMockTasks) {
return new ColorDrawable(0xFF666666);
}
@@ -635,7 +640,7 @@
int userId, Resources res) {
// If we are mocking, then return a mock label
- if (RecentsDebugFlags.Static.EnableSystemServicesProxy) {
+ if (RecentsDebugFlags.Static.EnableMockTasks) {
return new ColorDrawable(0xFF666666);
}
@@ -673,7 +678,7 @@
/** Returns the package name of the home activity. */
public String getHomeActivityPackageName() {
if (mPm == null) return null;
- if (RecentsDebugFlags.Static.EnableSystemServicesProxy) return null;
+ if (RecentsDebugFlags.Static.EnableMockTasks) return null;
ArrayList<ResolveInfo> homeActivities = new ArrayList<>();
ComponentName defaultHomeActivity = mPm.getHomeActivities(homeActivities);
diff --git a/packages/SystemUI/src/com/android/systemui/recents/model/RecentsTaskLoadPlan.java b/packages/SystemUI/src/com/android/systemui/recents/model/RecentsTaskLoadPlan.java
index 9cdd703..d15828a 100644
--- a/packages/SystemUI/src/com/android/systemui/recents/model/RecentsTaskLoadPlan.java
+++ b/packages/SystemUI/src/com/android/systemui/recents/model/RecentsTaskLoadPlan.java
@@ -22,6 +22,7 @@
import android.content.res.Resources;
import android.graphics.Bitmap;
import android.graphics.drawable.Drawable;
+import android.os.Debug;
import android.os.UserHandle;
import android.os.UserManager;
import android.util.ArraySet;
@@ -31,6 +32,7 @@
import com.android.systemui.R;
import com.android.systemui.recents.Recents;
import com.android.systemui.recents.RecentsConfiguration;
+import com.android.systemui.recents.RecentsDebugFlags;
import com.android.systemui.recents.misc.SystemServicesProxy;
import java.util.ArrayList;
@@ -130,6 +132,9 @@
R.string.accessibility_recents_item_will_be_dismissed);
long lastStackActiveTime = Prefs.getLong(mContext,
Prefs.Key.OVERVIEW_LAST_STACK_TASK_ACTIVE_TIME, 0);
+ if (RecentsDebugFlags.Static.EnableMockTasks) {
+ lastStackActiveTime = 0;
+ }
long newLastStackActiveTime = -1;
int taskCount = mRawTasks.size();
for (int i = 0; i < taskCount; i++) {
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 de1daa8..66eeac6 100644
--- a/packages/SystemUI/src/com/android/systemui/recents/model/TaskStack.java
+++ b/packages/SystemUI/src/com/android/systemui/recents/model/TaskStack.java
@@ -776,7 +776,7 @@
* Temporary: This method will simulate affiliation groups by
*/
public void createAffiliatedGroupings(Context context) {
- if (RecentsDebugFlags.Static.EnableSimulatedTaskGroups) {
+ if (RecentsDebugFlags.Static.EnableMockTaskGroups) {
ArrayMap<Task.TaskKey, Task> taskMap = new ArrayMap<>();
// Sort all tasks by increasing firstActiveTime of the task
ArrayList<Task> tasks = mStackTaskList.getTasks();
@@ -792,7 +792,7 @@
String prevPackage = "";
int prevAffiliation = -1;
Random r = new Random();
- int groupCountDown = RecentsDebugFlags.Static.TaskAffiliationsGroupCount;
+ int groupCountDown = RecentsDebugFlags.Static.MockTaskGroupsTaskCount;
for (int i = 0; i < taskCount; i++) {
Task t = tasks.get(i);
String packageName = t.key.getComponent().getPackageName();
@@ -807,7 +807,7 @@
addGroup(group);
prevAffiliation = affiliation;
prevPackage = packageName;
- groupCountDown = RecentsDebugFlags.Static.TaskAffiliationsGroupCount;
+ groupCountDown = RecentsDebugFlags.Static.MockTaskGroupsTaskCount;
}
group.addTask(t);
taskMap.put(t.key, t);
diff --git a/packages/SystemUI/src/com/android/systemui/recents/views/FixedSizeFrameLayout.java b/packages/SystemUI/src/com/android/systemui/recents/views/FixedSizeFrameLayout.java
new file mode 100644
index 0000000..9f2b00a
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/recents/views/FixedSizeFrameLayout.java
@@ -0,0 +1,93 @@
+/*
+ * Copyright (C) 2016 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.systemui.recents.views;
+
+import android.content.Context;
+import android.graphics.Rect;
+import android.util.AttributeSet;
+import android.widget.FrameLayout;
+
+/**
+ * This is an optimized FrameLayout whose layout is completely directed by its parent, and as a
+ * result, does not propagate <code>requestLayout()</code> up the view hierarchy. Instead, it will
+ * relayout its children with the last known layout bounds when a layout is requested from a child
+ * view.
+ */
+public class FixedSizeFrameLayout extends FrameLayout {
+
+ private final Rect mLayoutBounds = new Rect();
+
+ public FixedSizeFrameLayout(Context context) {
+ super(context);
+ }
+
+ public FixedSizeFrameLayout(Context context, AttributeSet attrs) {
+ super(context, attrs);
+ }
+
+ public FixedSizeFrameLayout(Context context, AttributeSet attrs, int defStyleAttr) {
+ super(context, attrs, defStyleAttr);
+ }
+
+ public FixedSizeFrameLayout(Context context, AttributeSet attrs, int defStyleAttr,
+ int defStyleRes) {
+ super(context, attrs, defStyleAttr, defStyleRes);
+ }
+
+ @Override
+ protected final void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
+ measureContents(MeasureSpec.getSize(widthMeasureSpec),
+ MeasureSpec.getSize(heightMeasureSpec));
+ }
+
+ @Override
+ protected final void onLayout(boolean changed, int left, int top, int right, int bottom) {
+ mLayoutBounds.set(left, top, right, bottom);
+ layoutContents(mLayoutBounds, changed);
+ }
+
+ @Override
+ public final void requestLayout() {
+ // The base ViewGroup constructor attempts to call requestLayout() before this class's
+ // members are initialized so we should just propagate in that case
+ if (mLayoutBounds == null || mLayoutBounds.isEmpty()) {
+ super.requestLayout();
+ } else {
+ // If we are already laid out, then just reuse the same bounds to layout the children
+ // (but not itself)
+ // TODO: Investigate whether we should coalesce these to the next frame if needed
+ measureContents(getMeasuredWidth(), getMeasuredHeight());
+ layoutContents(mLayoutBounds, false);
+ }
+ }
+
+ /**
+ * Measures the contents of this fixed layout.
+ */
+ protected void measureContents(int width, int height) {
+ super.onMeasure(MeasureSpec.makeMeasureSpec(width, MeasureSpec.AT_MOST),
+ MeasureSpec.makeMeasureSpec(height, MeasureSpec.AT_MOST));
+ }
+
+ /**
+ * Lays out the contents of this fixed layout.
+ */
+ protected void layoutContents(Rect bounds, boolean changed) {
+ super.onLayout(changed, bounds.left, bounds.top, bounds.right, bounds.bottom);
+ }
+
+}
diff --git a/packages/SystemUI/src/com/android/systemui/recents/views/FixedSizeImageView.java b/packages/SystemUI/src/com/android/systemui/recents/views/FixedSizeImageView.java
index 3f5d0a8..f5ab01f 100644
--- a/packages/SystemUI/src/com/android/systemui/recents/views/FixedSizeImageView.java
+++ b/packages/SystemUI/src/com/android/systemui/recents/views/FixedSizeImageView.java
@@ -23,13 +23,13 @@
import android.widget.ImageView;
/**
- * This is an optimized ImageView that does not trigger a requestLayout() or invalidate() when
- * setting the image to Null.
+ * This is an optimized ImageView that does not trigger a <code>requestLayout()</code> or
+ * <code>invalidate()</code> when setting the image to <code>null</code>.
*/
public class FixedSizeImageView extends ImageView {
- boolean mAllowRelayout = true;
- boolean mAllowInvalidate = true;
+ private boolean mAllowRelayout = true;
+ private boolean mAllowInvalidate = true;
public FixedSizeImageView(Context context) {
this(context, null);
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 fe9c68e..ccc8581 100644
--- a/packages/SystemUI/src/com/android/systemui/recents/views/TaskStackView.java
+++ b/packages/SystemUI/src/com/android/systemui/recents/views/TaskStackView.java
@@ -1375,11 +1375,6 @@
// Report that this tasks's data is no longer being used
Recents.getTaskLoader().unloadTaskData(task);
- // Detach the view from the hierarchy
- detachViewFromParent(tv);
- // Update the task views list after removing the task view
- updateTaskViewsList();
-
// Reset the view properties and view state
tv.resetViewProperties();
tv.setFocusedState(false, false /* requestViewFocus */);
@@ -1387,19 +1382,15 @@
if (mScreenPinningEnabled) {
tv.hideActionButton(false /* fadeOut */, 0 /* duration */, false /* scaleDown */, null);
}
+
+ // Detach the view from the hierarchy
+ detachViewFromParent(tv);
+ // Update the task views list after removing the task view
+ updateTaskViewsList();
}
@Override
public void prepareViewToLeavePool(TaskView tv, Task task, boolean isNewView) {
- // Rebind the task and request that this task's data be filled into the TaskView
- tv.onTaskBound(task);
-
- // Load the task data
- Recents.getTaskLoader().loadTaskData(task);
-
- // If the doze trigger has already fired, then update the state for this task view
- tv.setNoUserInteractionState();
-
// Find the index where this task should be placed in the stack
int taskIndex = mStack.indexOfStackTask(task);
int insertIndex = findTaskViewInsertIndex(task, taskIndex);
@@ -1413,6 +1404,15 @@
// Update the task views list after adding the new task view
updateTaskViewsList();
+ // Rebind the task and request that this task's data be filled into the TaskView
+ tv.onTaskBound(task);
+
+ // Load the task data
+ Recents.getTaskLoader().loadTaskData(task);
+
+ // If the doze trigger has already fired, then update the state for this task view
+ tv.setNoUserInteractionState();
+
// Set the new state for this view, including the callbacks and view clipping
tv.setCallbacks(this);
tv.setTouchEnabled(true);
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 32bebb3..5a4064a 100644
--- a/packages/SystemUI/src/com/android/systemui/recents/views/TaskView.java
+++ b/packages/SystemUI/src/com/android/systemui/recents/views/TaskView.java
@@ -17,7 +17,6 @@
package com.android.systemui.recents.views;
import android.animation.Animator;
-import android.animation.AnimatorListenerAdapter;
import android.animation.AnimatorSet;
import android.animation.ObjectAnimator;
import android.animation.ValueAnimator;
@@ -40,7 +39,6 @@
import android.view.animation.AccelerateInterpolator;
import android.view.animation.AnimationUtils;
import android.view.animation.Interpolator;
-import android.widget.FrameLayout;
import com.android.systemui.R;
import com.android.systemui.recents.Recents;
import com.android.systemui.recents.RecentsActivity;
@@ -62,8 +60,13 @@
import static android.app.ActivityManager.StackId.INVALID_STACK_ID;
-/* A task view */
-public class TaskView extends FrameLayout implements Task.TaskCallbacks,
+/**
+ * A {@link TaskView} represents a fixed view of a task. Because the TaskView's layout is directed
+ * solely by the {@link TaskStackView}, we make it a fixed size layout which allows relayouts down
+ * the view hierarchy, but not upwards from any of its children (the TaskView will relayout itself
+ * with the previous bounds if any child requests layout).
+ */
+public class TaskView extends FixedSizeFrameLayout implements Task.TaskCallbacks,
TaskStackAnimationHelper.Callbacks, View.OnClickListener, View.OnLongClickListener {
/** The TaskView callbacks */
@@ -219,33 +222,20 @@
return super.onInterceptTouchEvent(ev);
}
- @Override
- protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
- int width = MeasureSpec.getSize(widthMeasureSpec);
- int height = MeasureSpec.getSize(heightMeasureSpec);
+ @Override
+ protected void measureContents(int width, int height) {
int widthWithoutPadding = width - mPaddingLeft - mPaddingRight;
int heightWithoutPadding = height - mPaddingTop - mPaddingBottom;
- int taskBarHeight = getResources().getDimensionPixelSize(R.dimen.recents_task_bar_height);
// Measure the content
mContent.measure(MeasureSpec.makeMeasureSpec(widthWithoutPadding, MeasureSpec.EXACTLY),
MeasureSpec.makeMeasureSpec(heightWithoutPadding, MeasureSpec.EXACTLY));
- // Measure the bar view, and action button
- mHeaderView.measure(MeasureSpec.makeMeasureSpec(widthWithoutPadding, MeasureSpec.EXACTLY),
- MeasureSpec.makeMeasureSpec(taskBarHeight, MeasureSpec.EXACTLY));
- mActionButtonView.measure(
- MeasureSpec.makeMeasureSpec(widthWithoutPadding, MeasureSpec.AT_MOST),
- MeasureSpec.makeMeasureSpec(heightWithoutPadding, MeasureSpec.AT_MOST));
- // Measure the thumbnail to be square
- mThumbnailView.measure(
- MeasureSpec.makeMeasureSpec(widthWithoutPadding, MeasureSpec.EXACTLY),
- MeasureSpec.makeMeasureSpec(heightWithoutPadding, MeasureSpec.EXACTLY));
+ // Optimization: Prevent overdraw of the thumbnail under the header view
mThumbnailView.updateClipToTaskBar(mHeaderView);
setMeasuredDimension(width, height);
- invalidateOutline();
}
void updateViewPropertiesToTaskTransform(TaskViewTransform toTransform,
diff --git a/packages/SystemUI/src/com/android/systemui/recents/views/TaskViewHeader.java b/packages/SystemUI/src/com/android/systemui/recents/views/TaskViewHeader.java
index 827ee40..cb108da 100644
--- a/packages/SystemUI/src/com/android/systemui/recents/views/TaskViewHeader.java
+++ b/packages/SystemUI/src/com/android/systemui/recents/views/TaskViewHeader.java
@@ -245,11 +245,7 @@
* to match the frame changes.
*/
public void onTaskViewSizeChanged(int width, int height) {
- // Return early if the bounds have not changed
- if (mTaskViewRect.width() == width && mTaskViewRect.height() == height) {
- return;
- }
-
+ // TODO: Optimize this path
mTaskViewRect.set(0, 0, width, height);
boolean updateMoveTaskButton = mMoveTaskButton.getVisibility() != View.GONE;
boolean isFreeformTask = (mTask != null) && mTask.isFreeformTask();
diff --git a/packages/SystemUI/src/com/android/systemui/recents/views/TaskViewThumbnail.java b/packages/SystemUI/src/com/android/systemui/recents/views/TaskViewThumbnail.java
index 39d0604..de96d9d 100644
--- a/packages/SystemUI/src/com/android/systemui/recents/views/TaskViewThumbnail.java
+++ b/packages/SystemUI/src/com/android/systemui/recents/views/TaskViewThumbnail.java
@@ -190,7 +190,6 @@
if (!mInvisible) {
updateThumbnailPaintFilter();
}
- invalidate();
}
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/car/CarStatusBar.java b/packages/SystemUI/src/com/android/systemui/statusbar/car/CarStatusBar.java
index f6f1f94..e20936b 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/car/CarStatusBar.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/car/CarStatusBar.java
@@ -24,11 +24,13 @@
import android.os.Looper;
import android.view.View;
import android.view.ViewGroup.LayoutParams;
+import android.view.ViewStub;
import android.view.WindowManager;
import com.android.systemui.R;
import com.android.systemui.recents.Recents;
import com.android.systemui.recents.misc.SystemServicesProxy;
+import com.android.systemui.statusbar.StatusBarState;
import com.android.systemui.statusbar.phone.PhoneStatusBar;
/**
@@ -41,6 +43,7 @@
private CarNavigationBarView mCarNavigationBar;
private CarNavigationBarController mController;
+ private FullscreenUserSwitcher mFullscreenUserSwitcher;
@Override
public void start() {
@@ -102,6 +105,10 @@
}
@Override
+ public void onPinnedActivityRestartAttempt() {
+ }
+
+ @Override
public void onTaskStackChanged() {
mHandler.removeCallbacks(this);
mHandler.post(this);
@@ -121,4 +128,34 @@
}
}
}
+
+ @Override
+ protected void createUserSwitcher() {
+ if (mUserSwitcherController.useFullscreenUserSwitcher()) {
+ mFullscreenUserSwitcher = new FullscreenUserSwitcher(this, mUserSwitcherController,
+ (ViewStub) mStatusBarWindow.findViewById(R.id.fullscreen_user_switcher_stub));
+ } else {
+ super.createUserSwitcher();
+ }
+ }
+
+ @Override
+ public void userSwitched(int newUserId) {
+ super.userSwitched(newUserId);
+ if (mFullscreenUserSwitcher != null) {
+ mFullscreenUserSwitcher.onUserSwitched(newUserId);
+ }
+ }
+
+ @Override
+ public void updateKeyguardState(boolean goingToFullShade, boolean fromShadeLocked) {
+ super.updateKeyguardState(goingToFullShade, fromShadeLocked);
+ if (mFullscreenUserSwitcher != null) {
+ if (mState == StatusBarState.FULLSCREEN_USER_SWITCHER) {
+ mFullscreenUserSwitcher.show();
+ } else {
+ mFullscreenUserSwitcher.hide();
+ }
+ }
+ }
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/FullscreenUserSwitcher.java b/packages/SystemUI/src/com/android/systemui/statusbar/car/FullscreenUserSwitcher.java
similarity index 93%
rename from packages/SystemUI/src/com/android/systemui/statusbar/policy/FullscreenUserSwitcher.java
rename to packages/SystemUI/src/com/android/systemui/statusbar/car/FullscreenUserSwitcher.java
index fd8852e..3025092 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/FullscreenUserSwitcher.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/car/FullscreenUserSwitcher.java
@@ -14,7 +14,7 @@
* limitations under the License
*/
-package com.android.systemui.statusbar.policy;
+package com.android.systemui.statusbar.car;
import android.content.Context;
import android.provider.Settings;
@@ -22,8 +22,8 @@
import android.view.ViewStub;
import com.android.systemui.R;
-import com.android.systemui.statusbar.UserGridView;
import com.android.systemui.statusbar.phone.PhoneStatusBar;
+import com.android.systemui.statusbar.policy.UserSwitcherController;
/**
* Manages the fullscreen user switcher.
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/UserGridView.java b/packages/SystemUI/src/com/android/systemui/statusbar/car/UserGridView.java
similarity index 99%
rename from packages/SystemUI/src/com/android/systemui/statusbar/UserGridView.java
rename to packages/SystemUI/src/com/android/systemui/statusbar/car/UserGridView.java
index 2f8bc2d..28f4e05 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/UserGridView.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/car/UserGridView.java
@@ -14,7 +14,7 @@
* limitations under the License
*/
-package com.android.systemui.statusbar;
+package com.android.systemui.statusbar.car;
import android.content.Context;
import android.content.DialogInterface;
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/ButtonDispatcher.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/ButtonDispatcher.java
index 8e3886b..aea9e1e 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/ButtonDispatcher.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/ButtonDispatcher.java
@@ -76,11 +76,11 @@
}
public int getVisibility() {
- return mVisibility;
+ return mVisibility != null ? mVisibility : View.VISIBLE;
}
public float getAlpha() {
- return mAlpha;
+ return mAlpha != null ? mAlpha : 1;
}
public void setImageDrawable(Drawable drawable) {
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarApps.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarApps.java
index d0c14f1..ed6d940 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarApps.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarApps.java
@@ -1108,6 +1108,10 @@
@Override
public void onActivityPinned() {
}
+
+ @Override
+ public void onPinnedActivityRestartAttempt() {
+ }
}
@Override
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarInflaterView.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarInflaterView.java
index b8ae81f..beeee0b 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarInflaterView.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarInflaterView.java
@@ -24,6 +24,7 @@
import android.view.ViewGroup;
import android.widget.FrameLayout;
import android.widget.ImageView;
+import android.widget.LinearLayout;
import android.widget.Space;
import com.android.systemui.R;
import com.android.systemui.tuner.TunerService;
@@ -42,6 +43,8 @@
private static final String RECENT = "recent";
private static final String NAVSPACE = "space";
+ private static final String APP_SHELF = "app_shelf";
+
public static final String GRAVITY_SEPARATOR = ";";
public static final String BUTTON_SEPARATOR = ",";
@@ -108,12 +111,10 @@
}
private void initiallyFill(ButtonDispatcher buttonDispatcher) {
- addAll(buttonDispatcher, (ViewGroup) mRot0.findViewById(R.id.start_group));
+ addAll(buttonDispatcher, (ViewGroup) mRot0.findViewById(R.id.ends_group));
addAll(buttonDispatcher, (ViewGroup) mRot0.findViewById(R.id.center_group));
- addAll(buttonDispatcher, (ViewGroup) mRot0.findViewById(R.id.end_group));
- addAll(buttonDispatcher, (ViewGroup) mRot90.findViewById(R.id.start_group));
+ addAll(buttonDispatcher, (ViewGroup) mRot90.findViewById(R.id.ends_group));
addAll(buttonDispatcher, (ViewGroup) mRot90.findViewById(R.id.center_group));
- addAll(buttonDispatcher, (ViewGroup) mRot90.findViewById(R.id.end_group));
}
private void addAll(ButtonDispatcher buttonDispatcher, ViewGroup parent) {
@@ -135,18 +136,41 @@
String[] start = sets[0].split(BUTTON_SEPARATOR);
String[] center = sets[1].split(BUTTON_SEPARATOR);
String[] end = sets[2].split(BUTTON_SEPARATOR);
- inflateButtons(start, (ViewGroup) mRot0.findViewById(R.id.start_group),
- (ViewGroup) mRot0.findViewById(R.id.start_group_lightsout), false);
- inflateButtons(start, (ViewGroup) mRot90.findViewById(R.id.start_group),
- (ViewGroup) mRot90.findViewById(R.id.start_group_lightsout), true);
- inflateButtons(center, (ViewGroup) mRot0.findViewById(R.id.center_group),
- (ViewGroup) mRot0.findViewById(R.id.start_group_lightsout), false);
- inflateButtons(center, (ViewGroup) mRot90.findViewById(R.id.center_group),
- (ViewGroup) mRot90.findViewById(R.id.start_group_lightsout), true);
- inflateButtons(end, (ViewGroup) mRot0.findViewById(R.id.end_group),
- (ViewGroup) mRot0.findViewById(R.id.start_group_lightsout), false);
- inflateButtons(end, (ViewGroup) mRot90.findViewById(R.id.end_group),
- (ViewGroup) mRot90.findViewById(R.id.start_group_lightsout), true);
+ inflateButtons(start, (ViewGroup) mRot0.findViewById(R.id.ends_group),
+ (ViewGroup) mRot0.findViewById(R.id.ends_group_lightsout), false);
+ inflateButtons(start, (ViewGroup) mRot90.findViewById(R.id.ends_group),
+ (ViewGroup) mRot90.findViewById(R.id.ends_group_lightsout), true);
+
+ if (center.length == 1 && APP_SHELF.equals(center[0])) {
+ inflateShelf((LinearLayout) mRot0.findViewById(R.id.ends_group),
+ (LinearLayout) mRot0.findViewById(R.id.ends_group_lightsout), false);
+ inflateShelf((LinearLayout) mRot90.findViewById(R.id.ends_group),
+ (LinearLayout) mRot90.findViewById(R.id.ends_group_lightsout), true);
+ } else {
+ inflateButtons(center, (ViewGroup) mRot0.findViewById(R.id.center_group),
+ (ViewGroup) mRot0.findViewById(R.id.center_group_lightsout), false);
+ inflateButtons(center, (ViewGroup) mRot90.findViewById(R.id.center_group),
+ (ViewGroup) mRot90.findViewById(R.id.center_group_lightsout), true);
+ addGravitySpacer((LinearLayout) mRot0.findViewById(R.id.ends_group));
+ addGravitySpacer((LinearLayout) mRot90.findViewById(R.id.ends_group));
+ }
+
+ inflateButtons(end, (ViewGroup) mRot0.findViewById(R.id.ends_group),
+ (ViewGroup) mRot0.findViewById(R.id.ends_group_lightsout), false);
+ inflateButtons(end, (ViewGroup) mRot90.findViewById(R.id.ends_group),
+ (ViewGroup) mRot90.findViewById(R.id.ends_group_lightsout), true);
+ }
+
+ private void inflateShelf(LinearLayout layout, LinearLayout lightsOut, boolean landscape) {
+ View v = (landscape ? mLandscapeInflater : mLayoutInflater)
+ .inflate(R.layout.apps_bar, layout, false);
+ layout.addView(v);
+ addToDispatchers(v);
+ copyToLightsout(v, lightsOut);
+ }
+
+ private void addGravitySpacer(LinearLayout layout) {
+ layout.addView(new Space(mContext), new LinearLayout.LayoutParams(0, 0, 1));
}
private void inflateButtons(String[] buttons, ViewGroup parent, ViewGroup lightsOutParent,
@@ -187,6 +211,10 @@
}
private ViewGroup.LayoutParams copy(ViewGroup.LayoutParams layoutParams) {
+ if (layoutParams instanceof LinearLayout.LayoutParams) {
+ return new LinearLayout.LayoutParams(layoutParams.width, layoutParams.height,
+ ((LinearLayout.LayoutParams) layoutParams).weight);
+ }
return new LayoutParams(layoutParams.width, layoutParams.height);
}
@@ -220,13 +248,17 @@
throw new IllegalArgumentException("Unknown button " + button);
}
parent.addView(v);
+ addToDispatchers(v);
+ return v;
+ }
+
+ private void addToDispatchers(View v) {
if (mButtonDispatchers != null) {
final int indexOfKey = mButtonDispatchers.indexOfKey(v.getId());
if (indexOfKey >= 0) {
mButtonDispatchers.valueAt(indexOfKey).addView(v);
}
}
- return v;
}
private boolean isSw600Dp() {
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 ffc836c7..e2a6184 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java
@@ -141,7 +141,6 @@
import com.android.systemui.statusbar.policy.BrightnessMirrorController;
import com.android.systemui.statusbar.policy.CastControllerImpl;
import com.android.systemui.statusbar.policy.FlashlightController;
-import com.android.systemui.statusbar.policy.FullscreenUserSwitcher;
import com.android.systemui.statusbar.policy.HeadsUpManager;
import com.android.systemui.statusbar.policy.HotspotControllerImpl;
import com.android.systemui.statusbar.policy.KeyguardMonitor;
@@ -285,7 +284,6 @@
protected KeyguardMonitor mKeyguardMonitor;
BrightnessMirrorController mBrightnessMirrorController;
AccessibilityController mAccessibilityController;
- FullscreenUserSwitcher mFullscreenUserSwitcher;
FingerprintUnlockController mFingerprintUnlockController;
int mNaturalBarHeight = -1;
@@ -854,16 +852,7 @@
if (UserManager.get(mContext).isUserSwitcherEnabled()) {
mUserSwitcherController = new UserSwitcherController(mContext, mKeyguardMonitor,
mHandler, this);
- if (mUserSwitcherController.useFullscreenUserSwitcher()) {
- mFullscreenUserSwitcher = new FullscreenUserSwitcher(this, mUserSwitcherController,
- (ViewStub) mStatusBarWindow.findViewById(
- R.id.fullscreen_user_switcher_stub));
- } else {
- // Fullscreen user switcher does not show keyguard. Hence no KeyguardUserSwitcher.
- mKeyguardUserSwitcher = new KeyguardUserSwitcher(mContext,
- (ViewStub) mStatusBarWindow.findViewById(R.id.keyguard_user_switcher),
- mKeyguardStatusBar, mNotificationPanel, mUserSwitcherController);
- }
+ createUserSwitcher();
}
// Set up the quick settings tile panel
@@ -934,6 +923,12 @@
return mStatusBarView;
}
+ protected void createUserSwitcher() {
+ mKeyguardUserSwitcher = new KeyguardUserSwitcher(mContext,
+ (ViewStub) mStatusBarWindow.findViewById(R.id.keyguard_user_switcher),
+ mKeyguardStatusBar, mNotificationPanel, mUserSwitcherController);
+ }
+
protected void inflateStatusBarWindow(Context context) {
mStatusBarWindow = (StatusBarWindowView) View.inflate(context,
R.layout.super_status_bar, null);
@@ -962,14 +957,8 @@
}
protected void inflateNavigationBarView(Context context) {
- // Optionally show app shortcuts in the nav bar "shelf" area.
- if (shouldShowAppShelf()) {
- mNavigationBarView = (NavigationBarView) View.inflate(
- context, R.layout.navigation_bar_with_apps, null);
- } else {
- mNavigationBarView = (NavigationBarView) View.inflate(
- context, R.layout.navigation_bar, null);
- }
+ mNavigationBarView = (NavigationBarView) View.inflate(
+ context, R.layout.navigation_bar, null);
}
protected void initSignalCluster(View containerView) {
@@ -982,21 +971,6 @@
}
}
- /** Returns true if the app shelf should be shown in the nav bar. */
- private boolean shouldShowAppShelf() {
- // Allow adb to override the default shelf behavior:
- // adb shell settings put system demo_app_shelf 0 # Zero forces it off.
- // adb shell settings put system demo_app_shelf 1 # Non-zero forces it on.
- final int DEFAULT = -1;
- final int shelfOverride =
- Settings.System.getInt(mContext.getContentResolver(), "demo_app_shelf", DEFAULT);
- if (shelfOverride != DEFAULT) {
- return shelfOverride != 0;
- }
- // Otherwise default to the platform feature.
- return FREEFORM_WINDOW_MANAGEMENT;
- }
-
private void clearAllNotifications() {
// animate-swipe all dismissable notifications, then animate the shade closed
@@ -3114,9 +3088,6 @@
setControllerUsers();
clearCurrentMediaNotification();
updateMediaMetaData(true);
- if (mFullscreenUserSwitcher != null) {
- mFullscreenUserSwitcher.onUserSwitched(newUserId);
- }
}
private void setControllerUsers() {
@@ -3741,7 +3712,7 @@
.isSecure(mCurrentUserId));
}
- private void updateKeyguardState(boolean goingToFullShade, boolean fromShadeLocked) {
+ protected void updateKeyguardState(boolean goingToFullShade, boolean fromShadeLocked) {
if (mState == StatusBarState.KEYGUARD) {
mKeyguardIndicationController.setVisible(true);
mNotificationPanel.resetViews();
@@ -3765,13 +3736,7 @@
mScrimController.setKeyguardShowing(false);
mIconPolicy.setKeyguardShowing(false);
}
- if (mFullscreenUserSwitcher != null) {
- if (mState == StatusBarState.FULLSCREEN_USER_SWITCHER) {
- mFullscreenUserSwitcher.show();
- } else {
- mFullscreenUserSwitcher.hide();
- }
- }
+
mNotificationPanel.setBarState(mState, mKeyguardFadingAway, goingToFullShade);
updateDozingState();
updatePublicMode();
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 7e27856..9c2159be 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/QSTileHost.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/QSTileHost.java
@@ -38,6 +38,7 @@
import com.android.systemui.qs.tiles.CastTile;
import com.android.systemui.qs.tiles.CellularTile;
import com.android.systemui.qs.tiles.ColorInversionTile;
+import com.android.systemui.qs.tiles.DataSaverTile;
import com.android.systemui.qs.tiles.DndTile;
import com.android.systemui.qs.tiles.FlashlightTile;
import com.android.systemui.qs.tiles.HotspotTile;
@@ -346,6 +347,7 @@
else if (tileSpec.equals("hotspot")) return new HotspotTile(this);
else if (tileSpec.equals("user")) return new UserTile(this);
else if (tileSpec.equals("battery")) return new BatteryTile(this);
+ else if (tileSpec.equals("saver")) return new DataSaverTile(this);
else if (tileSpec.equals(ColorMatrixTile.COLOR_MATRIX_SPEC))
return new ColorMatrixTile(this);
// Intent tiles.
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/DataSaverController.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/DataSaverController.java
new file mode 100644
index 0000000..186e8b5
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/DataSaverController.java
@@ -0,0 +1,89 @@
+/*
+ * Copyright (C) 2016 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file
+ * except in compliance with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software distributed under the
+ * License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the specific language governing
+ * permissions and limitations under the License.
+ */
+
+package com.android.systemui.statusbar.policy;
+
+import android.content.Context;
+import android.net.INetworkPolicyListener;
+import android.net.NetworkPolicyManager;
+import android.os.Handler;
+import android.os.RemoteException;
+
+import java.util.ArrayList;
+
+public class DataSaverController {
+
+ private final Handler mHandler = new Handler();
+ private final ArrayList<Listener> mListeners = new ArrayList<>();
+ private final NetworkPolicyManager mPolicyManager;
+
+ public DataSaverController(Context context) {
+ mPolicyManager = NetworkPolicyManager.from(context);
+ }
+
+ private void handleRestrictBackgroundChanged(boolean isDataSaving) {
+ final int N = mListeners.size();
+ for (int i = 0; i < N; i++) {
+ mListeners.get(i).onDataSaverChanged(isDataSaving);
+ }
+ }
+
+ public void addListener(Listener listener) {
+ mListeners.add(listener);
+ if (mListeners.size() == 1) {
+ mPolicyManager.registerListener(mPolicyListener);
+ }
+ listener.onDataSaverChanged(isDataSaverEnabled());
+ }
+
+ public void remListener(Listener listener) {
+ mListeners.remove(listener);
+ if (mListeners.size() == 0) {
+ mPolicyManager.unregisterListener(mPolicyListener);
+ }
+ }
+
+ public boolean isDataSaverEnabled() {
+ return mPolicyManager.getRestrictBackground();
+ }
+
+ public void setDataSaverEnabled(boolean enabled) {
+ mPolicyManager.setRestrictBackground(enabled);
+ }
+
+ private final INetworkPolicyListener mPolicyListener = new INetworkPolicyListener.Stub() {
+ @Override
+ public void onUidRulesChanged(int i, int i1) throws RemoteException {
+ }
+
+ @Override
+ public void onMeteredIfacesChanged(String[] strings) throws RemoteException {
+ }
+
+ @Override
+ public void onRestrictBackgroundChanged(final boolean isDataSaving) throws RemoteException {
+ mHandler.post(new Runnable() {
+ @Override
+ public void run() {
+ handleRestrictBackgroundChanged(isDataSaving);
+ }
+ });
+ }
+ };
+
+ public interface Listener {
+ void onDataSaverChanged(boolean isDataSaving);
+ }
+
+}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/NetworkController.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/NetworkController.java
index b2bcde3..755a5b3 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/NetworkController.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/NetworkController.java
@@ -33,6 +33,7 @@
void onUserSwitched(int newUserId);
AccessPointController getAccessPointController();
DataUsageController getMobileDataController();
+ DataSaverController getDataSaverController();
public interface SignalCallback {
void setWifiIndicators(boolean enabled, IconState statusIcon, IconState qsIcon,
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 3385c82..dbb0295 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/NetworkControllerImpl.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/NetworkControllerImpl.java
@@ -78,6 +78,7 @@
private final SubscriptionManager mSubscriptionManager;
private final boolean mHasMobileDataFeature;
private final SubscriptionDefaults mSubDefaults;
+ private final DataSaverController mDataSaverController;
private Config mConfig;
// Subcontrollers.
@@ -156,6 +157,7 @@
mConfig = config;
mReceiverHandler = new Handler(bgLooper);
mCallbackHandler = callbackHandler;
+ mDataSaverController = new DataSaverController(context);
mSubscriptionManager = subManager;
mSubDefaults = defaultsHandler;
@@ -189,6 +191,10 @@
updateAirplaneMode(true /* force callback */);
}
+ public DataSaverController getDataSaverController() {
+ return mDataSaverController;
+ }
+
private void registerListeners() {
for (MobileSignalController mobileSignalController : mMobileSignalControllers.values()) {
mobileSignalController.registerListener();
diff --git a/packages/SystemUI/src/com/android/systemui/tv/pip/PipManager.java b/packages/SystemUI/src/com/android/systemui/tv/pip/PipManager.java
index bed1e9e..b237400 100644
--- a/packages/SystemUI/src/com/android/systemui/tv/pip/PipManager.java
+++ b/packages/SystemUI/src/com/android/systemui/tv/pip/PipManager.java
@@ -29,7 +29,6 @@
import android.graphics.Rect;
import android.os.Handler;
import android.os.RemoteException;
-import android.os.UserHandle;
import android.util.Log;
import java.util.ArrayList;
@@ -38,7 +37,6 @@
import static android.app.ActivityManager.StackId.FULLSCREEN_WORKSPACE_STACK_ID;
import static android.app.ActivityManager.StackId.PINNED_STACK_ID;
-import android.app.ActivityManager;
import android.app.ActivityManager.RunningTaskInfo;
/**
@@ -314,6 +312,10 @@
// Post the message back to the UI thread.
mHandler.post(mOnActivityPinnedRunnable);
}
+
+ @Override
+ public void onPinnedActivityRestartAttempt() {
+ }
}
/**
diff --git a/proto/Android.mk b/proto/Android.mk
new file mode 100644
index 0000000..a13a780
--- /dev/null
+++ b/proto/Android.mk
@@ -0,0 +1,16 @@
+LOCAL_PATH:= $(call my-dir)
+
+include $(CLEAR_VARS)
+
+LOCAL_MODULE := framework-protos
+
+LOCAL_PROTOC_OPTIMIZE_TYPE := nano
+LOCAL_SRC_FILES:= $(call all-proto-files-under, src)
+LOCAL_JARJAR_RULES := $(LOCAL_PATH)/jarjar-rules.txt
+
+LOCAL_NO_STANDARD_LIBRARIES := true
+LOCAL_JAVA_LIBRARIES := core-oj core-libart
+
+LOCAL_ADDITIONAL_DEPENDENCIES := $(LOCAL_PATH)/Android.mk $(LOCAL_PATH)/jarjar-rules.txt
+
+include $(BUILD_STATIC_JAVA_LIBRARY)
diff --git a/proto/jarjar-rules.txt b/proto/jarjar-rules.txt
new file mode 100644
index 0000000..0c77c2a
--- /dev/null
+++ b/proto/jarjar-rules.txt
@@ -0,0 +1 @@
+rule com.google.** com.android.@1
diff --git a/proto/src/metrics_constants.proto b/proto/src/metrics_constants.proto
new file mode 100644
index 0000000..697777c
--- /dev/null
+++ b/proto/src/metrics_constants.proto
@@ -0,0 +1,346 @@
+// Copyright (C) 2016 The Android Open Source Project
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+syntax = "proto2";
+
+option java_package = "com.android.internal.logging";
+option java_outer_classname = "MetricsProto";
+
+package com_android_internal_logging;
+
+// Wrapper for System UI log events
+message MetricsEvent {
+
+ // Known visual elements: views or controls.
+ enum View {
+ VIEW_UNKNOWN = 0;
+ MAIN_SETTINGS = 1;
+ ACCESSIBILITY = 2;
+ ACCESSIBILITY_CAPTION_PROPERTIES = 3;
+ ACCESSIBILITY_SERVICE = 4;
+ ACCESSIBILITY_TOGGLE_DALTONIZER = 5;
+ ACCESSIBILITY_TOGGLE_GLOBAL_GESTURE = 6;
+ ACCESSIBILITY_TOGGLE_SCREEN_MAGNIFICATION = 7;
+ ACCOUNT = 8;
+ ACCOUNTS_ACCOUNT_SYNC = 9;
+ ACCOUNTS_CHOOSE_ACCOUNT_ACTIVITY = 10;
+ ACCOUNTS_MANAGE_ACCOUNTS = 11;
+ APN = 12;
+ APN_EDITOR = 13;
+ APP_OPS_DETAILS = 14;
+ APP_OPS_SUMMARY = 15;
+ APPLICATION = 16;
+ APPLICATIONS_APP_LAUNCH = 17;
+ APPLICATIONS_APP_PERMISSION = 18;
+ APPLICATIONS_APP_STORAGE = 19;
+ APPLICATIONS_INSTALLED_APP_DETAILS = 20;
+ APPLICATIONS_PROCESS_STATS_DETAIL = 21;
+ APPLICATIONS_PROCESS_STATS_MEM_DETAIL = 22;
+ APPLICATIONS_PROCESS_STATS_UI = 23;
+ BLUETOOTH = 24;
+ BLUETOOTH_DEVICE_PICKER = 25;
+ BLUETOOTH_DEVICE_PROFILES = 26;
+ CHOOSE_LOCK_GENERIC = 27;
+ CHOOSE_LOCK_PASSWORD = 28;
+ CHOOSE_LOCK_PATTERN = 29;
+ CONFIRM_LOCK_PASSWORD = 30;
+ CONFIRM_LOCK_PATTERN = 31;
+ CRYPT_KEEPER = 32;
+ CRYPT_KEEPER_CONFIRM = 33;
+ DASHBOARD_SEARCH_RESULTS = 34;
+ DASHBOARD_SUMMARY = 35;
+ DATA_USAGE = 36;
+ DATA_USAGE_SUMMARY = 37;
+ DATE_TIME = 38;
+ DEVELOPMENT = 39;
+ DEVICEINFO = 40;
+ DEVICEINFO_IMEI_INFORMATION = 41;
+ DEVICEINFO_STORAGE = 42;
+ DEVICEINFO_SIM_STATUS = 43;
+ DEVICEINFO_STATUS = 44;
+ DEVICEINFO_USB = 45;
+ DISPLAY = 46;
+ DREAM = 47;
+ ENCRYPTION = 48;
+ FINGERPRINT = 49;
+ FINGERPRINT_ENROLL = 50;
+ FUELGAUGE_BATTERY_HISTORY_DETAIL = 51;
+ FUELGAUGE_BATTERY_SAVER = 52;
+ FUELGAUGE_POWER_USAGE_DETAIL = 53;
+ FUELGAUGE_POWER_USAGE_SUMMARY = 54;
+ HOME = 55;
+ ICC_LOCK = 56;
+ INPUTMETHOD_LANGUAGE = 57;
+ INPUTMETHOD_KEYBOARD = 58;
+ INPUTMETHOD_SPELL_CHECKERS = 59;
+ INPUTMETHOD_SUBTYPE_ENABLER = 60;
+ INPUTMETHOD_USER_DICTIONARY = 61;
+ INPUTMETHOD_USER_DICTIONARY_ADD_WORD = 62;
+ LOCATION = 63;
+ LOCATION_MODE = 64;
+ MANAGE_APPLICATIONS = 65;
+ MASTER_CLEAR = 66;
+ MASTER_CLEAR_CONFIRM = 67;
+ NET_DATA_USAGE_METERED = 68;
+ NFC_BEAM = 69;
+ NFC_PAYMENT = 70;
+ NOTIFICATION = 71;
+ NOTIFICATION_APP_NOTIFICATION = 72;
+ NOTIFICATION_OTHER_SOUND = 73;
+ NOTIFICATION_REDACTION = 74;
+ NOTIFICATION_STATION = 75;
+ NOTIFICATION_ZEN_MODE = 76;
+ OWNER_INFO = 77;
+ PRINT_JOB_SETTINGS = 78;
+ PRINT_SERVICE_SETTINGS = 79;
+ PRINT_SETTINGS = 80;
+ PRIVACY = 81;
+ PROXY_SELECTOR = 82;
+ RESET_NETWORK = 83;
+ RESET_NETWORK_CONFIRM = 84;
+ RUNNING_SERVICE_DETAILS = 85;
+ SCREEN_PINNING = 86;
+ SECURITY = 87;
+ SIM = 88;
+ TESTING = 89;
+ TETHER = 90;
+ TRUST_AGENT = 91;
+ TRUSTED_CREDENTIALS = 92;
+ TTS_ENGINE_SETTINGS = 93;
+ TTS_TEXT_TO_SPEECH = 94;
+ USAGE_ACCESS = 95;
+ USER = 96;
+ USERS_APP_RESTRICTIONS = 97;
+ USER_DETAILS = 98;
+ VOICE_INPUT = 99;
+ VPN = 100;
+ WALLPAPER_TYPE = 101;
+ WFD_WIFI_DISPLAY = 102;
+ WIFI = 103;
+ WIFI_ADVANCED = 104;
+ WIFI_CALLING = 105;
+ WIFI_SAVED_ACCESS_POINTS = 106;
+ WIFI_APITEST = 107;
+ WIFI_INFO = 108;
+ WIFI_P2P = 109;
+ WIRELESS = 110;
+ QS_PANEL = 111;
+ QS_AIRPLANEMODE = 112;
+ QS_BLUETOOTH = 113;
+ QS_CAST = 114;
+ QS_CELLULAR = 115;
+ QS_COLORINVERSION = 116;
+ QS_DATAUSAGEDETAIL = 117;
+ QS_DND = 118;
+ QS_FLASHLIGHT = 119;
+ QS_HOTSPOT = 120;
+ QS_INTENT = 121;
+ QS_LOCATION = 122;
+ QS_ROTATIONLOCK = 123;
+ QS_USERDETAILITE = 124;
+ QS_USERDETAIL = 125;
+ QS_WIFI = 126;
+ NOTIFICATION_PANEL = 127;
+ NOTIFICATION_ITEM = 128;
+ NOTIFICATION_ITEM_ACTION = 129;
+ APPLICATIONS_ADVANCED = 130;
+ LOCATION_SCANNING = 131;
+ MANAGE_APPLICATIONS_ALL = 132;
+ MANAGE_APPLICATIONS_NOTIFICATIONS = 133;
+ ACTION_WIFI_ADD_NETWORK = 134;
+ ACTION_WIFI_CONNECT = 135;
+ ACTION_WIFI_FORCE_SCAN = 136;
+ ACTION_WIFI_FORGET = 137;
+ ACTION_WIFI_OFF = 138;
+ ACTION_WIFI_ON = 139;
+ MANAGE_PERMISSIONS = 140;
+ NOTIFICATION_ZEN_MODE_PRIORITY = 141;
+ NOTIFICATION_ZEN_MODE_AUTOMATION = 142;
+ MANAGE_DOMAIN_URLS = 143;
+ NOTIFICATION_ZEN_MODE_SCHEDULE_RULE = 144;
+ NOTIFICATION_ZEN_MODE_EXTERNAL_RULE = 145;
+ NOTIFICATION_ZEN_MODE_EVENT_RULE = 146;
+ ACTION_BAN_APP_NOTES = 147;
+ ACTION_DISMISS_ALL_NOTES = 148;
+ QS_DND_DETAILS = 149;
+ QS_BLUETOOTH_DETAILS = 150;
+ QS_CAST_DETAILS = 151;
+ QS_WIFI_DETAILS = 152;
+ QS_WIFI_TOGGLE = 153;
+ QS_BLUETOOTH_TOGGLE = 154;
+ QS_CELLULAR_TOGGLE = 155;
+ QS_SWITCH_USER = 156;
+ QS_CAST_SELECT = 157;
+ QS_CAST_DISCONNECT = 158;
+ ACTION_BLUETOOTH_TOGGLE = 159;
+ ACTION_BLUETOOTH_SCAN = 160;
+ ACTION_BLUETOOTH_RENAME = 161;
+ ACTION_BLUETOOTH_FILES = 162;
+ QS_DND_TIME = 163;
+ QS_DND_CONDITION_SELECT = 164;
+ QS_DND_ZEN_SELECT = 165;
+ QS_DND_TOGGLE = 166;
+ ACTION_ZEN_ALLOW_REMINDERS = 167;
+ ACTION_ZEN_ALLOW_EVENTS = 168;
+ ACTION_ZEN_ALLOW_MESSAGES = 169;
+ ACTION_ZEN_ALLOW_CALLS = 170;
+ ACTION_ZEN_ALLOW_REPEAT_CALLS = 171;
+ ACTION_ZEN_ADD_RULE = 172;
+ ACTION_ZEN_ADD_RULE_OK = 173;
+ ACTION_ZEN_DELETE_RULE = 174;
+ ACTION_ZEN_DELETE_RULE_OK = 175;
+ ACTION_ZEN_ENABLE_RULE = 176;
+ ACTION_AIRPLANE_TOGGLE = 177;
+ ACTION_CELL_DATA_TOGGLE = 178;
+ NOTIFICATION_ACCESS = 179;
+ NOTIFICATION_ZEN_MODE_ACCESS = 180;
+ APPLICATIONS_DEFAULT_APPS = 181;
+ APPLICATIONS_STORAGE_APPS = 182;
+ APPLICATIONS_USAGE_ACCESS_DETAIL = 183;
+ APPLICATIONS_HIGH_POWER_APPS = 184;
+ FUELGAUGE_HIGH_POWER_DETAILS = 185;
+ ACTION_LS_UNLOCK = 186;
+ ACTION_LS_SHADE = 187;
+ ACTION_LS_HINT = 188;
+ ACTION_LS_CAMERA = 189;
+ ACTION_LS_DIALER = 190;
+ ACTION_LS_LOCK = 191;
+ ACTION_LS_NOTE = 192;
+ ACTION_LS_QS = 193;
+ ACTION_SHADE_QS_PULL = 194;
+ ACTION_SHADE_QS_TAP = 195;
+ LOCKSCREEN = 196;
+ BOUNCER = 197;
+ SCREEN = 198;
+ NOTIFICATION_ALERT = 199;
+ ACTION_EMERGENCY_CALL = 200;
+ APPLICATIONS_MANAGE_ASSIST = 201;
+ PROCESS_STATS_SUMMARY = 202;
+ ACTION_ROTATION_LOCK = 203;
+ ACTION_NOTE_CONTROLS = 204;
+ ACTION_NOTE_INFO = 205;
+ ACTION_APP_NOTE_SETTINGS = 206;
+ VOLUME_DIALOG = 207;
+ VOLUME_DIALOG_DETAILS = 208;
+ ACTION_VOLUME_SLIDER = 209;
+ ACTION_VOLUME_STREAM = 210;
+ ACTION_VOLUME_KEY = 211;
+ ACTION_VOLUME_ICON = 212;
+ ACTION_RINGER_MODE = 213;
+ ACTION_ACTIVITY_CHOOSER_SHOWN = 214;
+ ACTION_ACTIVITY_CHOOSER_PICKED_APP_TARGET = 215;
+ ACTION_ACTIVITY_CHOOSER_PICKED_SERVICE_TARGET = 216;
+ ACTION_ACTIVITY_CHOOSER_PICKED_STANDARD_TARGET = 217;
+ ACTION_BRIGHTNESS = 218;
+ ACTION_BRIGHTNESS_AUTO = 219;
+ BRIGHTNESS_DIALOG = 220;
+ SYSTEM_ALERT_WINDOW_APPS = 221;
+ DREAMING = 222;
+ DOZING = 223;
+ OVERVIEW_ACTIVITY = 224;
+ ABOUT_LEGAL_SETTINGS = 225;
+ ACTION_SEARCH_RESULTS = 226;
+ TUNER = 227;
+ TUNER_QS = 228;
+ TUNER_DEMO_MODE = 229;
+ TUNER_QS_REORDER = 230;
+ TUNER_QS_ADD = 231;
+ TUNER_QS_REMOVE = 232;
+ TUNER_STATUS_BAR_ENABLE = 233;
+ TUNER_STATUS_BAR_DISABLE = 234;
+ TUNER_DEMO_MODE_ENABLED = 235;
+ TUNER_DEMO_MODE_ON = 236;
+ TUNER_BATTERY_PERCENTAGE = 237;
+ FUELGAUGE_INACTIVE_APPS = 238;
+ ACTION_ASSIST_LONG_PRESS = 239;
+ FINGERPRINT_ENROLLING = 240;
+ FINGERPRINT_FIND_SENSOR = 241;
+ FINGERPRINT_ENROLL_FINISH = 242;
+ FINGERPRINT_ENROLL_INTRO = 243;
+ FINGERPRINT_ENROLL_ONBOARD = 244;
+ FINGERPRINT_ENROLL_SIDECAR = 245;
+ FINGERPRINT_ENROLLING_SETUP = 246;
+ FINGERPRINT_FIND_SENSOR_SETUP = 247;
+ FINGERPRINT_ENROLL_FINISH_SETUP = 248;
+ FINGERPRINT_ENROLL_INTRO_SETUP = 249;
+ FINGERPRINT_ENROLL_ONBOARD_SETUP = 250;
+ ACTION_FINGERPRINT_ENROLL = 251;
+ ACTION_FINGERPRINT_AUTH = 252;
+ ACTION_FINGERPRINT_DELETE = 253;
+ ACTION_FINGERPRINT_RENAME = 254;
+ ACTION_DOUBLE_TAP_POWER_CAMERA_GESTURE = 255;
+ ACTION_WIGGLE_CAMERA_GESTURE = 256;
+ QS_WORKMODE = 257;
+ BACKGROUND_CHECK_SUMMARY = 258;
+ QS_LOCK_TILE = 259;
+ QS_USER_TILE = 260;
+ QS_BATTERY_TILE = 261;
+ NOTIFICATION_ZEN_MODE_VISUAL_INTERRUPTIONS = 262;
+ ACTION_ZEN_ALLOW_PEEK = 263;
+ ACTION_ZEN_ALLOW_LIGHTS = 264;
+ NOTIFICATION_TOPIC_NOTIFICATION = 265;
+ ACTION_DEFAULT_SMS_APP_CHANGED = 266;
+ QS_COLOR_MATRIX = 267;
+ QS_CUSTOM = 268;
+ ACTION_ZEN_ALLOW_SCREEN_ON = 269;
+
+ // Logged when the user docks a window from recents by
+ // longpressing a task and dragging it to the dock area.
+ ACTION_WINDOW_DOCK_DRAG_DROP = 270;
+
+ // Logged when the user docks a fullscreen window by long pressing
+ // recents which also opens recents on the lower/right side.
+ ACTION_WINDOW_DOCK_LONGPRESS = 271;
+
+ // Logged when the user docks a window by dragging from the navbar
+ // which also opens recents on the lower/right side.
+ ACTION_WINDOW_DOCK_SWIPE = 272;
+
+ // Logged when the user launches a profile-specific app and we
+ // intercept it with the confirm credentials UI.
+ PROFILE_CHALLENGE = 273;
+
+ QS_BATTERY_DETAIL = 274;
+
+ // Logged when the user goes into the overview history.
+ OVERVIEW_HISTORY = 275;
+
+ // Logged when the user pages through overview.
+ ACTION_OVERVIEW_PAGE = 276;
+
+ // Logged when the user launches a task from overview.
+ ACTION_OVERVIEW_SELECT = 277;
+
+ // Logged when the user views the emergency info.
+ ACTION_VIEW_EMERGENCY_INFO = 278;
+
+ // Logged when the user views the edit emergency info activity.
+ ACTION_EDIT_EMERGENCY_INFO = 279;
+
+ // Logged when the user edits an emergency info field.
+ ACTION_EDIT_EMERGENCY_INFO_FIELD = 280;
+
+ // Logged when the user adds a new emergency contact.
+ ACTION_ADD_EMERGENCY_CONTACT = 281;
+
+ // Logged when the user deletes an emergency contact.
+ ACTION_DELETE_EMERGENCY_CONTACT = 282;
+
+ // Logged when the user calls an emergency contact.
+ ACTION_CALL_EMERGENCY_CONTACT = 283;
+
+ // QS Tile for Data Saver.
+ QS_DATA_SAVER = 284;
+ }
+}
diff --git a/rs/java/android/renderscript/Allocation.java b/rs/java/android/renderscript/Allocation.java
index a4876b9..a71ba636 100644
--- a/rs/java/android/renderscript/Allocation.java
+++ b/rs/java/android/renderscript/Allocation.java
@@ -16,14 +16,16 @@
package android.renderscript;
+import java.nio.ByteBuffer;
import java.util.HashMap;
+
import android.content.res.Resources;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
-import android.view.Surface;
-import android.util.Log;
import android.graphics.Canvas;
import android.os.Trace;
+import android.util.Log;
+import android.view.Surface;
/**
* <p> This class provides the primary method through which data is passed to
@@ -78,6 +80,8 @@
OnBufferAvailableListener mBufferNotifier;
private Surface mGetSurfaceSurface = null;
+ private ByteBuffer mByteBuffer = null;
+ private long mByteBufferStride = -1;
private Element.DataType validateObjectIsPrimitiveArray(Object d, boolean checkType) {
final Class c = d.getClass();
@@ -2050,6 +2054,59 @@
}
/**
+ * @hide
+ * Gets or creates a ByteBuffer that contains the raw data of the current Allocation.
+ * If the Allocation is created with USAGE_IO_INPUT, the returned ByteBuffer
+ * would contain the up-to-date data as READ ONLY.
+ * For a 2D or 3D Allocation, the raw data maybe padded so that each row of
+ * the Allocation has certain alignment. The size of each row including padding,
+ * called stride, can be queried using the {@link #getStride()} method.
+ *
+ * Note: Operating on the ByteBuffer of a destroyed Allocation will triger errors.
+ *
+ * @return ByteBuffer The ByteBuffer associated with raw data pointer of the Allocation.
+ */
+ public ByteBuffer getByteBuffer() {
+ // Create a new ByteBuffer if it is not initialized or using IO_INPUT.
+ if (mType.hasFaces()) {
+ throw new RSInvalidStateException("Cubemap is not supported for getByteBuffer().");
+ }
+ if (mType.getYuv() == android.graphics.ImageFormat.NV21 ||
+ mType.getYuv() == android.graphics.ImageFormat.YV12 ||
+ mType.getYuv() == android.graphics.ImageFormat.YUV_420_888 ) {
+ throw new RSInvalidStateException("YUV format is not supported for getByteBuffer().");
+ }
+ if (mByteBuffer == null || (mUsage & USAGE_IO_INPUT) != 0) {
+ int xBytesSize = mType.getX() * mType.getElement().getBytesSize();
+ long[] stride = new long[1];
+ mByteBuffer = mRS.nAllocationGetByteBuffer(getID(mRS), stride, xBytesSize, mType.getY(), mType.getZ());
+ mByteBufferStride = stride[0];
+ }
+ if ((mUsage & USAGE_IO_INPUT) != 0) {
+ return mByteBuffer.asReadOnlyBuffer();
+ }
+ return mByteBuffer;
+ }
+
+ /**
+ * @hide
+ * Gets the stride of the Allocation.
+ * For a 2D or 3D Allocation, the raw data maybe padded so that each row of
+ * the Allocation has certain alignment. The size of each row including such
+ * padding is called stride.
+ *
+ * @return the stride. For 1D Allocation, the stride will be the number of
+ * bytes of this Allocation. For 2D and 3D Allocations, the stride
+ * will be the stride in X dimension measuring in bytes.
+ */
+ public long getStride() {
+ if (mByteBufferStride == -1) {
+ getByteBuffer();
+ }
+ return mByteBufferStride;
+ }
+
+ /**
* Returns the handle to a raw buffer that is being managed by the screen
* compositor. This operation is only valid for Allocations with {@link
* #USAGE_IO_INPUT}.
diff --git a/rs/java/android/renderscript/RenderScript.java b/rs/java/android/renderscript/RenderScript.java
index 3668ddd..4788223 100644
--- a/rs/java/android/renderscript/RenderScript.java
+++ b/rs/java/android/renderscript/RenderScript.java
@@ -18,17 +18,18 @@
import java.io.File;
import java.lang.reflect.Method;
+import java.nio.ByteBuffer;
+import java.util.ArrayList;
import java.util.concurrent.locks.ReentrantReadWriteLock;
import android.content.Context;
import android.content.res.AssetManager;
import android.graphics.Bitmap;
import android.graphics.SurfaceTexture;
-import android.util.Log;
-import android.view.Surface;
import android.os.SystemProperties;
import android.os.Trace;
-import java.util.ArrayList;
+import android.util.Log;
+import android.view.Surface;
// TODO: Clean up the whitespace that separates methods in this class.
@@ -489,6 +490,13 @@
validate();
rsnAllocationSyncAll(mContext, alloc, src);
}
+
+ native ByteBuffer rsnAllocationGetByteBuffer(long con, long alloc, long[] stride, int xBytesSize, int dimY, int dimZ);
+ synchronized ByteBuffer nAllocationGetByteBuffer(long alloc, long[] stride, int xBytesSize, int dimY, int dimZ) {
+ validate();
+ return rsnAllocationGetByteBuffer(mContext, alloc, stride, xBytesSize, dimY, dimZ);
+ }
+
native Surface rsnAllocationGetSurface(long con, long alloc);
synchronized Surface nAllocationGetSurface(long alloc) {
validate();
diff --git a/rs/java/android/renderscript/Script.java b/rs/java/android/renderscript/Script.java
index 84f980d..2b06780 100644
--- a/rs/java/android/renderscript/Script.java
+++ b/rs/java/android/renderscript/Script.java
@@ -315,7 +315,6 @@
/**
* Only intended for use by generated reflected code. (General reduction)
*
- * @hide
*/
protected void reduce(int slot, Allocation[] ains, Allocation aout, LaunchOptions sc) {
mRS.validate();
diff --git a/rs/jni/android_renderscript_RenderScript.cpp b/rs/jni/android_renderscript_RenderScript.cpp
index 3954070..398d89b 100644
--- a/rs/jni/android_renderscript_RenderScript.cpp
+++ b/rs/jni/android_renderscript_RenderScript.cpp
@@ -2752,7 +2752,43 @@
return (jint)sizeof(void*);
}
+static jobject
+nAllocationGetByteBuffer(JNIEnv *_env, jobject _this, jlong con, jlong alloc,
+ jlongArray strideArr, jint xBytesSize,
+ jint dimY, jint dimZ) {
+ if (kLogApi) {
+ ALOGD("nAllocationGetByteBuffer, con(%p), alloc(%p)", (RsContext)con, (RsAllocation)alloc);
+ }
+ jlong *jStridePtr = _env->GetLongArrayElements(strideArr, nullptr);
+ if (jStridePtr == nullptr) {
+ ALOGE("Failed to get Java array elements: strideArr");
+ return 0;
+ }
+
+ size_t strideIn = xBytesSize;
+ void* ptr = nullptr;
+ if (alloc != 0) {
+ ptr = rsAllocationGetPointer((RsContext)con, (RsAllocation)alloc, 0,
+ RS_ALLOCATION_CUBEMAP_FACE_POSITIVE_X, 0, 0,
+ &strideIn, sizeof(size_t));
+ }
+
+ jobject byteBuffer = nullptr;
+ if (ptr != nullptr) {
+ size_t bufferSize = strideIn;
+ jStridePtr[0] = strideIn;
+ if (dimY > 0) {
+ bufferSize *= dimY;
+ }
+ if (dimZ > 0) {
+ bufferSize *= dimZ;
+ }
+ byteBuffer = _env->NewDirectByteBuffer(ptr, (jlong) bufferSize);
+ }
+ _env->ReleaseLongArrayElements(strideArr, jStridePtr, 0);
+ return byteBuffer;
+}
// ---------------------------------------------------------------------------
@@ -2909,6 +2945,7 @@
{"rsnMeshGetIndices", "(JJ[J[II)V", (void*)nMeshGetIndices },
{"rsnSystemGetPointerSize", "()I", (void*)nSystemGetPointerSize },
+{"rsnAllocationGetByteBuffer", "(JJ[JIII)Ljava/nio/ByteBuffer;", (void*)nAllocationGetByteBuffer },
};
static int registerFuncs(JNIEnv *_env)
diff --git a/services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java b/services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java
index dbbb189..03809c0 100644
--- a/services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java
+++ b/services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java
@@ -1204,8 +1204,13 @@
}
builder.append(componentName.flattenToShortString());
}
- Settings.Secure.putStringForUser(mContext.getContentResolver(),
- settingName, builder.toString(), userId);
+ final long identity = Binder.clearCallingIdentity();
+ try {
+ Settings.Secure.putStringForUser(mContext.getContentResolver(),
+ settingName, builder.toString(), userId);
+ } finally {
+ Binder.restoreCallingIdentity(identity);
+ }
}
private void manageServicesLocked(UserState userState) {
@@ -1250,8 +1255,13 @@
if (isEnabled && userState.mBoundServices.isEmpty()
&& userState.mBindingServices.isEmpty()) {
userState.mIsAccessibilityEnabled = false;
- Settings.Secure.putIntForUser(mContext.getContentResolver(),
- Settings.Secure.ACCESSIBILITY_ENABLED, 0, userState.mUserId);
+ final long identity = Binder.clearCallingIdentity();
+ try {
+ Settings.Secure.putIntForUser(mContext.getContentResolver(),
+ Settings.Secure.ACCESSIBILITY_ENABLED, 0, userState.mUserId);
+ } finally {
+ Binder.restoreCallingIdentity(identity);
+ }
}
}
@@ -1342,9 +1352,14 @@
// Enable touch exploration.
UserState userState = getUserStateLocked(service.mUserId);
userState.mIsTouchExplorationEnabled = true;
- Settings.Secure.putIntForUser(mContext.getContentResolver(),
- Settings.Secure.TOUCH_EXPLORATION_ENABLED, 1,
- service.mUserId);
+ final long identity = Binder.clearCallingIdentity();
+ try {
+ Settings.Secure.putIntForUser(mContext.getContentResolver(),
+ Settings.Secure.TOUCH_EXPLORATION_ENABLED, 1,
+ service.mUserId);
+ } finally {
+ Binder.restoreCallingIdentity(identity);
+ }
onUserStateChangedLocked(userState);
}
})
@@ -1613,9 +1628,14 @@
}
if (enabled != userState.mIsTouchExplorationEnabled) {
userState.mIsTouchExplorationEnabled = enabled;
- Settings.Secure.putIntForUser(mContext.getContentResolver(),
- Settings.Secure.TOUCH_EXPLORATION_ENABLED, enabled ? 1 : 0,
- userState.mUserId);
+ final long identity = Binder.clearCallingIdentity();
+ try {
+ Settings.Secure.putIntForUser(mContext.getContentResolver(),
+ Settings.Secure.TOUCH_EXPLORATION_ENABLED, enabled ? 1 : 0,
+ userState.mUserId);
+ } finally {
+ Binder.restoreCallingIdentity(identity);
+ }
}
}
@@ -1666,9 +1686,14 @@
}
if (enabled != userState.mIsEnhancedWebAccessibilityEnabled) {
userState.mIsEnhancedWebAccessibilityEnabled = enabled;
- Settings.Secure.putIntForUser(mContext.getContentResolver(),
- Settings.Secure.ACCESSIBILITY_SCRIPT_INJECTION, enabled ? 1 : 0,
- userState.mUserId);
+ final long identity = Binder.clearCallingIdentity();
+ try {
+ Settings.Secure.putIntForUser(mContext.getContentResolver(),
+ Settings.Secure.ACCESSIBILITY_SCRIPT_INJECTION, enabled ? 1 : 0,
+ userState.mUserId);
+ } finally {
+ Binder.restoreCallingIdentity(identity);
+ }
}
}
diff --git a/services/core/java/com/android/server/accounts/AccountManagerService.java b/services/core/java/com/android/server/accounts/AccountManagerService.java
index b86b3fd..2683be6 100644
--- a/services/core/java/com/android/server/accounts/AccountManagerService.java
+++ b/services/core/java/com/android/server/accounts/AccountManagerService.java
@@ -2486,16 +2486,20 @@
}
@Override
- public void finishSession(IAccountManagerResponse response,
+ public void finishSessionAsUser(IAccountManagerResponse response,
@NonNull Bundle sessionBundle,
boolean expectActivityLaunch,
- Bundle appInfo) {
+ Bundle appInfo,
+ int userId) {
+ int callingUid = Binder.getCallingUid();
if (Log.isLoggable(TAG, Log.VERBOSE)) {
Log.v(TAG,
- "finishSession: response " + response
+ "finishSession: response "+ response
+ ", expectActivityLaunch " + expectActivityLaunch
- + ", caller's uid " + Binder.getCallingUid()
- + ", pid " + Binder.getCallingPid());
+ + ", caller's uid " + callingUid
+ + ", caller's user id " + UserHandle.getCallingUserId()
+ + ", pid " + Binder.getCallingPid()
+ + ", for user id " + userId);
}
if (response == null) {
throw new IllegalArgumentException("response is null");
@@ -2507,17 +2511,24 @@
throw new IllegalArgumentException("sessionBundle is empty");
}
- final int uid = Binder.getCallingUid();
+ // Only allow the system process to finish session for other users
+ if (isCrossUser(callingUid, userId)) {
+ throw new SecurityException(
+ String.format(
+ "User %s trying to finish session for %s without cross user permission",
+ UserHandle.getCallingUserId(),
+ userId));
+ }
+
// Only allow system to finish session
- if (!isSystemUid(uid)) {
+ if (!isSystemUid(callingUid)) {
String msg = String.format(
- "uid %s cannot finish session.",
- uid);
+ "uid %s cannot finish session because it's not system uid.",
+ callingUid);
throw new SecurityException(msg);
}
- final int userId = UserHandle.getUserId(uid);
- if (!canUserModifyAccounts(userId, uid)) {
+ if (!canUserModifyAccounts(userId, callingUid)) {
sendErrorResponse(response,
AccountManager.ERROR_CODE_USER_RESTRICTED,
"User is not allowed to add an account!");
@@ -2559,7 +2570,7 @@
}
// Add info that may be used by add account or update credentials flow.
- decryptedBundle.putInt(AccountManager.KEY_CALLER_UID, uid);
+ decryptedBundle.putInt(AccountManager.KEY_CALLER_UID, callingUid);
decryptedBundle.putInt(AccountManager.KEY_CALLER_PID, pid);
} catch (GeneralSecurityException e) {
if (Log.isLoggable(TAG, Log.DEBUG)) {
@@ -2572,7 +2583,7 @@
return;
}
- if (!canUserModifyAccountsForType(userId, accountType, uid)) {
+ if (!canUserModifyAccountsForType(userId, accountType, callingUid)) {
sendErrorResponse(
response,
AccountManager.ERROR_CODE_MANAGEMENT_DISABLED_FOR_ACCOUNT_TYPE,
@@ -2589,7 +2600,7 @@
accounts,
DebugDbHelper.ACTION_CALLED_ACCOUNT_SESSION_FINISH,
TABLE_ACCOUNTS,
- uid);
+ callingUid);
new Session(
accounts,
response,
diff --git a/services/core/java/com/android/server/am/ActivityManagerService.java b/services/core/java/com/android/server/am/ActivityManagerService.java
index 9c24271..b8327c1 100644
--- a/services/core/java/com/android/server/am/ActivityManagerService.java
+++ b/services/core/java/com/android/server/am/ActivityManagerService.java
@@ -203,7 +203,6 @@
import android.util.PrintWriterPrinter;
import android.util.Slog;
import android.util.SparseArray;
-import android.util.SparseBooleanArray;
import android.util.TimeUtils;
import android.util.Xml;
import android.view.Display;
@@ -536,6 +535,7 @@
// default actuion automatically. Important for devices without direct input
// devices.
private boolean mShowDialogs = true;
+ private boolean mInVrMode = false;
BroadcastQueue mFgBroadcastQueue;
BroadcastQueue mBgBroadcastQueue;
@@ -1472,6 +1472,7 @@
static final int LOG_STACK_STATE = 62;
static final int VR_MODE_CHANGE_MSG = 63;
static final int NOTIFY_ACTIVITY_PINNED_LISTENERS_MSG = 64;
+ static final int NOTIFY_PINNED_ACTIVITY_RESTART_ATTEMPT_LISTENERS_MSG = 65;
static final int FIRST_ACTIVITY_STACK_MSG = 100;
static final int FIRST_BROADCAST_QUEUE_MSG = 200;
@@ -2055,6 +2056,20 @@
}
break;
}
+ case NOTIFY_PINNED_ACTIVITY_RESTART_ATTEMPT_LISTENERS_MSG: {
+ synchronized (ActivityManagerService.this) {
+ for (int i = mTaskStackListeners.beginBroadcast() - 1; i >= 0; i--) {
+ try {
+ // Make a one-way callback to the listener
+ mTaskStackListeners.getBroadcastItem(i).onPinnedActivityRestartAttempt();
+ } catch (RemoteException e){
+ // Handled by the RemoteCallbackList
+ }
+ }
+ mTaskStackListeners.finishBroadcast();
+ }
+ break;
+ }
case NOTIFY_CLEARTEXT_NETWORK_MSG: {
final int uid = msg.arg1;
final byte[] firstPacket = (byte[]) msg.obj;
@@ -2204,7 +2219,15 @@
} break;
case VR_MODE_CHANGE_MSG: {
VrManagerInternal vrService = LocalServices.getService(VrManagerInternal.class);
- vrService.setVrMode(msg.arg1 != 0);
+ final boolean vrMode = msg.arg1 != 0;
+ vrService.setVrMode(vrMode);
+
+ if (mInVrMode != vrMode) {
+ synchronized (ActivityManagerService.this) {
+ mInVrMode = vrMode;
+ mShowDialogs = shouldShowDialogs(mConfiguration, mInVrMode);
+ }
+ }
} break;
}
}
@@ -11275,6 +11298,16 @@
mHandler.obtainMessage(NOTIFY_ACTIVITY_PINNED_LISTENERS_MSG).sendToTarget();
}
+ /**
+ * Notifies all listeners when an attempt was made to start an an activity that is already
+ * running in the pinned stack and the activity was not actually started, but the task is
+ * either brought to the front or a new Intent is delivered to it.
+ */
+ void notifyPinnedActivityRestartAttemptLocked() {
+ mHandler.removeMessages(NOTIFY_PINNED_ACTIVITY_RESTART_ATTEMPT_LISTENERS_MSG);
+ mHandler.obtainMessage(NOTIFY_PINNED_ACTIVITY_RESTART_ATTEMPT_LISTENERS_MSG).sendToTarget();
+ }
+
@Override
public void notifyCleartextNetwork(int uid, byte[] firstPacket) {
mHandler.obtainMessage(NOTIFY_CLEARTEXT_NETWORK_MSG, uid, 0, firstPacket).sendToTarget();
@@ -18439,7 +18472,7 @@
// TODO: If our config changes, should we auto dismiss any currently
// showing dialogs?
- mShowDialogs = shouldShowDialogs(newConfig);
+ mShowDialogs = shouldShowDialogs(newConfig, mInVrMode);
AttributeCache ac = AttributeCache.instance();
if (ac != null) {
@@ -18528,13 +18561,13 @@
* A thought: SystemUI might also want to get told about this, the Power
* dialog / global actions also might want different behaviors.
*/
- private static final boolean shouldShowDialogs(Configuration config) {
+ private static final boolean shouldShowDialogs(Configuration config, boolean inVrMode) {
final boolean inputMethodExists = !(config.keyboard == Configuration.KEYBOARD_NOKEYS
&& config.touchscreen == Configuration.TOUCHSCREEN_NOTOUCH
&& config.navigation == Configuration.NAVIGATION_NONAV);
final boolean uiIsNotCarType = !((config.uiMode & Configuration.UI_MODE_TYPE_MASK)
== Configuration.UI_MODE_TYPE_CAR);
- return inputMethodExists && uiIsNotCarType;
+ return inputMethodExists && uiIsNotCarType && !inVrMode;
}
@Override
diff --git a/services/core/java/com/android/server/am/ActivityStartInterceptor.java b/services/core/java/com/android/server/am/ActivityStartInterceptor.java
new file mode 100644
index 0000000..1ed749f
--- /dev/null
+++ b/services/core/java/com/android/server/am/ActivityStartInterceptor.java
@@ -0,0 +1,180 @@
+package com.android.server.am;
+
+import static android.app.ActivityManager.INTENT_SENDER_ACTIVITY;
+import static android.app.PendingIntent.FLAG_CANCEL_CURRENT;
+import static android.app.PendingIntent.FLAG_IMMUTABLE;
+import static android.app.PendingIntent.FLAG_ONE_SHOT;
+import static android.content.Context.KEYGUARD_SERVICE;
+import static android.content.Intent.EXTRA_INTENT;
+import static android.content.Intent.EXTRA_PACKAGE_NAME;
+import static android.content.Intent.EXTRA_TASK_ID;
+import static android.content.Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS;
+import static android.content.Intent.FLAG_ACTIVITY_NEW_TASK;
+import static android.content.pm.ApplicationInfo.FLAG_SUSPENDED;
+
+import android.app.KeyguardManager;
+import android.content.IIntentSender;
+import android.content.Intent;
+import android.content.IntentSender;
+import android.content.pm.ActivityInfo;
+import android.content.pm.ResolveInfo;
+import android.content.pm.UserInfo;
+import android.os.Binder;
+import android.os.UserHandle;
+import android.os.UserManager;
+
+import com.android.internal.app.UnlaunchableAppActivity;
+
+/**
+ * A class that contains activity intercepting logic for {@link ActivityStarter#startActivityLocked}
+ * It's initialized
+ */
+class ActivityStartInterceptor {
+
+ private final ActivityManagerService mService;
+ private UserManager mUserManager;
+ private final ActivityStackSupervisor mSupervisor;
+
+ /*
+ * Per-intent states loaded from ActivityStarter than shouldn't be changed by any
+ * interception routines.
+ */
+ private int mRealCallingPid;
+ private int mRealCallingUid;
+ private int mUserId;
+ private int mStartFlags;
+ private String mCallingPackage;
+
+ /*
+ * Per-intent states that were load from ActivityStarter and are subject to modifications
+ * by the interception routines. After calling {@link #intercept} the caller should assign
+ * these values back to {@link ActivityStarter#startActivityLocked}'s local variables.
+ */
+ Intent mIntent;
+ int mCallingPid;
+ int mCallingUid;
+ ResolveInfo mRInfo;
+ ActivityInfo mAInfo;
+ String mResolvedType;
+ TaskRecord mInTask;
+
+ ActivityStartInterceptor(ActivityManagerService service, ActivityStackSupervisor supervisor) {
+ mService = service;
+ mSupervisor = supervisor;
+ }
+
+ void setStates(int userId, int realCallingPid, int realCallingUid, int startFlags,
+ String callingPackage) {
+ mRealCallingPid = realCallingPid;
+ mRealCallingUid = realCallingUid;
+ mUserId = userId;
+ mStartFlags = startFlags;
+ mCallingPackage = callingPackage;
+ }
+
+ void intercept(Intent intent, ResolveInfo rInfo, ActivityInfo aInfo, String resolvedType,
+ TaskRecord inTask, int callingPid, int callingUid) {
+ mUserManager = UserManager.get(mService.mContext);
+ mIntent = intent;
+ mCallingPid = callingPid;
+ mCallingUid = callingUid;
+ mRInfo = rInfo;
+ mAInfo = aInfo;
+ mResolvedType = resolvedType;
+ mInTask = inTask;
+ interceptQuietProfileIfNeeded();
+ interceptSuspendPackageIfNeed();
+ interceptWorkProfileChallengeIfNeeded();
+ }
+
+ private void interceptQuietProfileIfNeeded() {
+ // Do not intercept if the user has not turned off the profile
+ if (!mUserManager.isQuietModeEnabled(UserHandle.of(mUserId))) {
+ return;
+ }
+ mIntent = UnlaunchableAppActivity.createInQuietModeDialogIntent(mUserId);
+ mCallingPid = mRealCallingPid;
+ mCallingUid = mRealCallingUid;
+ mResolvedType = null;
+
+ final UserInfo parent = mUserManager.getProfileParent(mUserId);
+ mRInfo = mSupervisor.resolveIntent(mIntent, mResolvedType, parent.id);
+ mAInfo = mSupervisor.resolveActivity(mIntent, mRInfo, mStartFlags,
+ null /*profilerInfo*/);
+ }
+
+ private void interceptSuspendPackageIfNeed() {
+ // Do not intercept if the admin did not suspend the package
+ if (mAInfo == null || mAInfo.applicationInfo == null ||
+ (mAInfo.applicationInfo.flags & FLAG_SUSPENDED) == 0) {
+ return;
+ }
+ mIntent = UnlaunchableAppActivity.createPackageSuspendedDialogIntent(mAInfo.packageName,
+ mUserId);
+ mCallingPid = mRealCallingPid;
+ mCallingUid = mRealCallingUid;
+ mResolvedType = null;
+
+ final UserInfo parent = mUserManager.getProfileParent(mUserId);
+ if (parent != null) {
+ mRInfo = mSupervisor.resolveIntent(mIntent, mResolvedType, parent.id);
+ } else {
+ mRInfo = mSupervisor.resolveIntent(mIntent, mResolvedType, mUserId);
+ }
+ mAInfo = mSupervisor.resolveActivity(mIntent, mRInfo, mStartFlags,
+ null /*profilerInfo*/);
+ }
+
+ private void interceptWorkProfileChallengeIfNeeded() {
+ final Intent interceptingIntent = interceptWithConfirmCredentialsIfNeeded(mIntent,
+ mResolvedType, mAInfo, mCallingPackage, mUserId);
+ if (interceptingIntent == null) {
+ return;
+ }
+ mIntent = interceptingIntent;
+ mCallingPid = mRealCallingPid;
+ mCallingUid = mRealCallingUid;
+ mResolvedType = null;
+ // If we are intercepting and there was a task, convert it into an extra for the
+ // ConfirmCredentials intent and unassign it, as otherwise the task will move to
+ // front even if ConfirmCredentials is cancelled.
+ if (mInTask != null) {
+ mIntent.putExtra(EXTRA_TASK_ID, mInTask.taskId);
+ mInTask = null;
+ }
+
+ final UserInfo parent = mUserManager.getProfileParent(mUserId);
+ mRInfo = mSupervisor.resolveIntent(mIntent, mResolvedType, parent.id);
+ mAInfo = mSupervisor.resolveActivity(mIntent, mRInfo, mStartFlags,
+ null /*profilerInfo*/);
+ }
+
+ /**
+ * Creates an intent to intercept the current activity start with Confirm Credentials if needed.
+ *
+ * @return The intercepting intent if needed.
+ */
+ private Intent interceptWithConfirmCredentialsIfNeeded(Intent intent, String resolvedType,
+ ActivityInfo aInfo, String callingPackage, int userId) {
+ if (!mService.mUserController.shouldConfirmCredentials(userId)) {
+ return null;
+ }
+ final IIntentSender target = mService.getIntentSenderLocked(
+ INTENT_SENDER_ACTIVITY, callingPackage,
+ Binder.getCallingUid(), userId, null, null, 0, new Intent[]{ intent },
+ new String[]{ resolvedType },
+ FLAG_CANCEL_CURRENT | FLAG_ONE_SHOT | FLAG_IMMUTABLE, null);
+ final int flags = intent.getFlags();
+ final KeyguardManager km = (KeyguardManager) mService.mContext
+ .getSystemService(KEYGUARD_SERVICE);
+ final Intent newIntent = km.createConfirmDeviceCredentialIntent(null, null, userId);
+ if (newIntent == null) {
+ return null;
+ }
+ newIntent.setFlags(flags | FLAG_ACTIVITY_NEW_TASK | FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS);
+ newIntent.putExtra(EXTRA_PACKAGE_NAME, aInfo.packageName);
+ newIntent.putExtra(EXTRA_INTENT, new IntentSender(target));
+ return newIntent;
+ }
+
+}
diff --git a/services/core/java/com/android/server/am/ActivityStarter.java b/services/core/java/com/android/server/am/ActivityStarter.java
index d847824..7b7359f 100644
--- a/services/core/java/com/android/server/am/ActivityStarter.java
+++ b/services/core/java/com/android/server/am/ActivityStarter.java
@@ -1,11 +1,9 @@
package com.android.server.am;
import static android.app.Activity.RESULT_CANCELED;
-import static android.app.ActivityManager.INTENT_SENDER_ACTIVITY;
import static android.app.ActivityManager.START_CLASS_NOT_FOUND;
import static android.app.ActivityManager.START_DELIVERED_TO_TOP;
import static android.app.ActivityManager.START_FLAG_ONLY_IF_NEEDED;
-import static android.app.ActivityManager.START_PERMISSION_DENIED;
import static android.app.ActivityManager.START_RETURN_INTENT_TO_CALLER;
import static android.app.ActivityManager.START_RETURN_LOCK_TASK_MODE_VIOLATION;
import static android.app.ActivityManager.START_SUCCESS;
@@ -17,16 +15,8 @@
import static android.app.ActivityManager.StackId.HOME_STACK_ID;
import static android.app.ActivityManager.StackId.INVALID_STACK_ID;
import static android.app.ActivityManager.StackId.PINNED_STACK_ID;
-import static android.app.PendingIntent.FLAG_CANCEL_CURRENT;
-import static android.app.PendingIntent.FLAG_IMMUTABLE;
-import static android.app.PendingIntent.FLAG_ONE_SHOT;
-import static android.content.Context.KEYGUARD_SERVICE;
-import static android.content.Intent.EXTRA_INTENT;
-import static android.content.Intent.EXTRA_PACKAGE_NAME;
-import static android.content.Intent.EXTRA_TASK_ID;
import static android.content.Intent.FLAG_ACTIVITY_CLEAR_TASK;
import static android.content.Intent.FLAG_ACTIVITY_CLEAR_TOP;
-import static android.content.Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS;
import static android.content.Intent.FLAG_ACTIVITY_LAUNCH_TO_SIDE;
import static android.content.Intent.FLAG_ACTIVITY_MULTIPLE_TASK;
import static android.content.Intent.FLAG_ACTIVITY_NEW_DOCUMENT;
@@ -43,7 +33,6 @@
import static android.content.pm.ActivityInfo.LAUNCH_SINGLE_INSTANCE;
import static android.content.pm.ActivityInfo.LAUNCH_SINGLE_TASK;
import static android.content.pm.ActivityInfo.LAUNCH_SINGLE_TOP;
-import static android.content.pm.ApplicationInfo.FLAG_SUSPENDED;
import static com.android.server.am.ActivityManagerDebugConfig.DEBUG_CONFIGURATION;
import static com.android.server.am.ActivityManagerDebugConfig.DEBUG_FOCUS;
import static com.android.server.am.ActivityManagerDebugConfig.DEBUG_PERMISSIONS_REVIEW;
@@ -76,7 +65,6 @@
import android.app.IActivityContainer;
import android.app.IActivityManager;
import android.app.IApplicationThread;
-import android.app.KeyguardManager;
import android.app.PendingIntent;
import android.app.ProfilerInfo;
import android.content.ComponentName;
@@ -86,7 +74,6 @@
import android.content.pm.ActivityInfo;
import android.content.pm.ApplicationInfo;
import android.content.pm.ResolveInfo;
-import android.content.pm.UserInfo;
import android.content.res.Configuration;
import android.graphics.Rect;
import android.os.Binder;
@@ -96,7 +83,6 @@
import android.os.RemoteException;
import android.os.SystemClock;
import android.os.UserHandle;
-import android.os.UserManager;
import android.service.voice.IVoiceInteractionSession;
import android.util.EventLog;
import android.util.Slog;
@@ -124,6 +110,7 @@
private final ActivityManagerService mService;
private final ActivityStackSupervisor mSupervisor;
+ private ActivityStartInterceptor mInterceptor;
private WindowManagerService mWindowManager;
final ArrayList<PendingActivityLaunch> mPendingActivityLaunches = new ArrayList<>();
@@ -204,6 +191,7 @@
ActivityStarter(ActivityManagerService service, ActivityStackSupervisor supervisor) {
mService = service;
mSupervisor = supervisor;
+ mInterceptor = new ActivityStartInterceptor(mService, mSupervisor);
}
final int startActivityLocked(IApplicationThread caller, Intent intent, Intent ephemeralIntent,
@@ -230,17 +218,6 @@
}
}
- if (aInfo != null) {
- if ((aInfo.applicationInfo.flags & FLAG_SUSPENDED) != 0) {
- Slog.w(TAG, "Application \"" + aInfo.applicationInfo.packageName
- + "\" is suspended. Refusing to start: " + intent.toString());
- // TODO: show a dialog/activity informing the user that the application is suspended
- // and redirect the launch to it. Do not return START_PERMISSION_DENIED because
- // it is wrong.
- err = ActivityManager.START_PERMISSION_DENIED;
- }
- }
-
final int userId = aInfo != null ? UserHandle.getUserId(aInfo.applicationInfo.uid) : 0;
if (err == ActivityManager.START_SUCCESS) {
@@ -381,26 +358,15 @@
}
}
- final Intent interceptingIntent = interceptWithConfirmCredentialsIfNeeded(intent,
- resolvedType, aInfo, callingPackage, userId);
- if (interceptingIntent != null) {
- intent = interceptingIntent;
- callingPid = realCallingPid;
- callingUid = realCallingUid;
- resolvedType = null;
- // If we are intercepting and there was a task, convert it into an extra for the
- // ConfirmCredentials intent and unassign it, as otherwise the task will move to
- // front even if ConfirmCredentials is cancelled.
- if (inTask != null) {
- intent.putExtra(EXTRA_TASK_ID, inTask.taskId);
- inTask = null;
- }
-
- final UserInfo parent = UserManager.get(mService.mContext).getProfileParent(userId);
- rInfo = mSupervisor.resolveIntent(intent, resolvedType, parent.id);
- aInfo = mSupervisor.resolveActivity(intent, rInfo, startFlags,
- null /*profilerInfo*/);
- }
+ mInterceptor.setStates(userId, realCallingPid, realCallingUid, startFlags, callingPackage);
+ mInterceptor.intercept(intent, rInfo, aInfo, resolvedType, inTask, callingPid, callingUid);
+ intent = mInterceptor.mIntent;
+ rInfo = mInterceptor.mRInfo;
+ aInfo = mInterceptor.mAInfo;
+ resolvedType = mInterceptor.mResolvedType;
+ inTask = mInterceptor.mInTask;
+ callingPid = mInterceptor.mCallingPid;
+ callingUid = mInterceptor.mCallingUid;
if (abort) {
if (resultRecord != null) {
@@ -538,46 +504,45 @@
err = startActivityUnchecked(
r, sourceRecord, voiceSession, voiceInteractor, startFlags, true, options, inTask);
-
- if (err < 0) {
- // If someone asked to have the keyguard dismissed on the next
- // activity start, but we are not actually doing an activity
- // switch... just dismiss the keyguard now, because we
- // probably want to see whatever is behind it.
- mSupervisor.notifyActivityDrawnForKeyguard();
- } else {
- launchRecentsAppIfNeeded(stack);
- }
-
+ postStartActivityUncheckedProcessing(r, err, stack.mStackId);
return err;
}
- /**
- * Creates an intent to intercept the current activity start with Confirm Credentials if needed.
- *
- * @return The intercepting intent if needed.
- */
- private Intent interceptWithConfirmCredentialsIfNeeded(Intent intent, String resolvedType,
- ActivityInfo aInfo, String callingPackage, int userId) {
- if (!mService.mUserController.shouldConfirmCredentials(userId)) {
- return null;
+ void postStartActivityUncheckedProcessing(
+ ActivityRecord r, int result, int prevFocusedStackId) {
+
+ if (result < START_SUCCESS) {
+ // If someone asked to have the keyguard dismissed on the next activity start,
+ // but we are not actually doing an activity switch... just dismiss the keyguard now,
+ // because we probably want to see whatever is behind it.
+ mSupervisor.notifyActivityDrawnForKeyguard();
+ return;
}
- final IIntentSender target = mService.getIntentSenderLocked(
- INTENT_SENDER_ACTIVITY, callingPackage,
- Binder.getCallingUid(), userId, null, null, 0, new Intent[]{ intent },
- new String[]{ resolvedType },
- FLAG_CANCEL_CURRENT | FLAG_ONE_SHOT | FLAG_IMMUTABLE, null);
- final int flags = intent.getFlags();
- final KeyguardManager km = (KeyguardManager) mService.mContext
- .getSystemService(KEYGUARD_SERVICE);
- final Intent newIntent = km.createConfirmDeviceCredentialIntent(null, null, userId);
- if (newIntent == null) {
- return null;
+
+ int startedActivityStackId = INVALID_STACK_ID;
+ if (r.task != null && r.task.stack != null) {
+ startedActivityStackId = r.task.stack.mStackId;
+ } else if (mTargetStack != null) {
+ startedActivityStackId = mTargetStack.mStackId;
}
- newIntent.setFlags(flags | FLAG_ACTIVITY_NEW_TASK | FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS);
- newIntent.putExtra(EXTRA_PACKAGE_NAME, aInfo.packageName);
- newIntent.putExtra(EXTRA_INTENT, new IntentSender(target));
- return newIntent;
+
+ if (startedActivityStackId == DOCKED_STACK_ID && prevFocusedStackId == HOME_STACK_ID) {
+ // We launch an activity while being in home stack, which means either launcher or
+ // recents into docked stack. We don't want the launched activity to be alone in a
+ // docked stack, so we want to immediately launch recents too.
+ if (DEBUG_RECENTS) Slog.d(TAG, "Scheduling recents launch.");
+ mWindowManager.showRecentApps();
+ return;
+ }
+
+ if (startedActivityStackId == PINNED_STACK_ID
+ && (result == START_TASK_TO_FRONT || result == START_DELIVERED_TO_TOP)) {
+ // The activity was already running in the pinned stack so it wasn't started, but either
+ // brought to the front or the new intent was delivered to it since it was already in
+ // front. Notify anyone interested in this piece of information.
+ mService.notifyPinnedActivityRestartAttemptLocked();
+ return;
+ }
}
void startHomeActivityLocked(Intent intent, ActivityInfo aInfo, String reason) {
@@ -1047,17 +1012,6 @@
return START_SUCCESS;
}
- private void launchRecentsAppIfNeeded(ActivityStack topStack) {
- if (topStack.mStackId == HOME_STACK_ID && mTargetStack != null
- && mTargetStack.mStackId == DOCKED_STACK_ID) {
- // We launch an activity while being in home stack, which means either launcher or
- // recents into docked stack. We don't want the launched activity to be alone in a
- // docked stack, so we want to immediately launch recents too.
- if (DEBUG_RECENTS) Slog.d(TAG, "Scheduling recents launch.");
- mWindowManager.showRecentApps();
- }
- }
-
private void setInitialState(ActivityRecord r, ActivityOptions options, TaskRecord inTask,
boolean doResume, int startFlags, ActivityRecord sourceRecord,
IVoiceInteractionSession voiceSession, IVoiceInteractor voiceInteractor) {
@@ -1619,11 +1573,13 @@
final void doPendingActivityLaunchesLocked(boolean doResume) {
while (!mPendingActivityLaunches.isEmpty()) {
- PendingActivityLaunch pal = mPendingActivityLaunches.remove(0);
-
+ final PendingActivityLaunch pal = mPendingActivityLaunches.remove(0);
+ final boolean resume = doResume && mPendingActivityLaunches.isEmpty();
try {
- startActivityUnchecked(pal.r, pal.sourceRecord, null, null, pal.startFlags,
- doResume && mPendingActivityLaunches.isEmpty(), null, null);
+ final int result = startActivityUnchecked(
+ pal.r, pal.sourceRecord, null, null, pal.startFlags, resume, null, null);
+ postStartActivityUncheckedProcessing(
+ pal.r, result, mSupervisor.mFocusedStack.mStackId);
} catch (Exception e) {
Slog.e(TAG, "Exception during pending activity launch pal=" + pal, e);
pal.sendErrorResult(e.getMessage());
diff --git a/services/core/java/com/android/server/am/UserController.java b/services/core/java/com/android/server/am/UserController.java
index 8c16872..a21570ce 100644
--- a/services/core/java/com/android/server/am/UserController.java
+++ b/services/core/java/com/android/server/am/UserController.java
@@ -525,7 +525,7 @@
List<UserInfo> profilesToStart = new ArrayList<>(profiles.size());
for (UserInfo user : profiles) {
if ((user.flags & UserInfo.FLAG_INITIALIZED) == UserInfo.FLAG_INITIALIZED
- && user.id != mCurrentUserId) {
+ && user.id != mCurrentUserId && !user.isQuietModeEnabled()) {
profilesToStart.add(user);
}
}
diff --git a/services/core/java/com/android/server/job/JobSchedulerService.java b/services/core/java/com/android/server/job/JobSchedulerService.java
index c63ce73..43cd44f 100644
--- a/services/core/java/com/android/server/job/JobSchedulerService.java
+++ b/services/core/java/com/android/server/job/JobSchedulerService.java
@@ -60,6 +60,7 @@
import com.android.server.job.controllers.AppIdleController;
import com.android.server.job.controllers.BatteryController;
import com.android.server.job.controllers.ConnectivityController;
+import com.android.server.job.controllers.ContentObserverController;
import com.android.server.job.controllers.IdleController;
import com.android.server.job.controllers.JobStatus;
import com.android.server.job.controllers.StateController;
@@ -109,6 +110,11 @@
*/
static final int MIN_CONNECTIVITY_COUNT = 1; // Run connectivity jobs as soon as ready.
/**
+ * Minimum # of content trigger jobs that must be ready in order to force the JMS to schedule
+ * things early.
+ */
+ static final int MIN_CONTENT_COUNT = 1;
+ /**
* Minimum # of jobs (with no particular constraints) for which the JMS will be happy running
* some work early.
* This is correlated with the amount of batching we'll be able to do.
@@ -229,7 +235,6 @@
if (packageName != null) {
jobStatus.setSource(packageName, userId);
}
- cancelJob(uId, job.getId());
try {
if (ActivityManagerNative.getDefault().getAppStartMode(uId,
job.getService().getPackageName()) == ActivityManager.APP_START_MODE_DISABLED) {
@@ -239,7 +244,15 @@
}
} catch (RemoteException e) {
}
- startTrackingJob(jobStatus);
+ if (DEBUG) Slog.d(TAG, "SCHEDULE: " + jobStatus.toShortString());
+ JobStatus toCancel;
+ synchronized (mJobs) {
+ toCancel = mJobs.getJobByUidAndJobId(uId, job.getId());
+ }
+ startTrackingJob(jobStatus, toCancel);
+ if (toCancel != null) {
+ cancelJobImpl(toCancel);
+ }
mHandler.obtainMessage(MSG_CHECK_JOB).sendToTarget();
return JobScheduler.RESULT_SUCCESS;
}
@@ -316,9 +329,7 @@
}
private void cancelJobImpl(JobStatus cancelled) {
- if (DEBUG) {
- Slog.d(TAG, "Cancelling: " + cancelled);
- }
+ if (DEBUG) Slog.d(TAG, "CANCEL: " + cancelled.toShortString());
stopTrackingJob(cancelled);
synchronized (mJobs) {
// Remove from pending queue.
@@ -410,6 +421,7 @@
mControllers.add(IdleController.get(this));
mControllers.add(BatteryController.get(this));
mControllers.add(AppIdleController.get(this));
+ mControllers.add(ContentObserverController.get(this));
mHandler = new JobHandler(context.getMainLooper());
mJobSchedulerStub = new JobSchedulerStub();
@@ -461,7 +473,7 @@
JobStatus job = jobs.valueAt(i);
for (int controller=0; controller<mControllers.size(); controller++) {
mControllers.get(controller).deviceIdleModeChanged(mDeviceIdleMode);
- mControllers.get(controller).maybeStartTrackingJob(job);
+ mControllers.get(controller).maybeStartTrackingJob(job, null);
}
}
// GO GO GO!
@@ -475,7 +487,7 @@
* {@link com.android.server.job.JobStore}, and make sure all the relevant controllers know
* about.
*/
- private void startTrackingJob(JobStatus jobStatus) {
+ private void startTrackingJob(JobStatus jobStatus, JobStatus lastJob) {
boolean update;
boolean rocking;
synchronized (mJobs) {
@@ -486,9 +498,9 @@
for (int i=0; i<mControllers.size(); i++) {
StateController controller = mControllers.get(i);
if (update) {
- controller.maybeStopTrackingJob(jobStatus);
+ controller.maybeStopTrackingJob(jobStatus, true);
}
- controller.maybeStartTrackingJob(jobStatus);
+ controller.maybeStartTrackingJob(jobStatus, lastJob);
}
}
}
@@ -508,7 +520,7 @@
if (removed && rocking) {
for (int i=0; i<mControllers.size(); i++) {
StateController controller = mControllers.get(i);
- controller.maybeStopTrackingJob(jobStatus);
+ controller.maybeStopTrackingJob(jobStatus, false);
}
}
return removed;
@@ -577,8 +589,13 @@
}
delayMillis =
Math.min(delayMillis, JobInfo.MAX_BACKOFF_DELAY_MILLIS);
- return new JobStatus(failureToReschedule, elapsedNowMillis + delayMillis,
+ JobStatus newJob = new JobStatus(failureToReschedule, elapsedNowMillis + delayMillis,
JobStatus.NO_LATEST_RUNTIME, backoffAttempts);
+ for (int ic=0; ic<mControllers.size(); ic++) {
+ StateController controller = mControllers.get(ic);
+ controller.rescheduleForFailure(newJob, failureToReschedule);
+ }
+ return newJob;
}
/**
@@ -632,14 +649,21 @@
if (DEBUG) {
Slog.d(TAG, "Could not find job to remove. Was job removed while executing?");
}
+ // We still want to check for jobs to execute, because this job may have
+ // scheduled a new job under the same job id, and now we can run it.
+ mHandler.obtainMessage(MSG_CHECK_JOB_GREEDY).sendToTarget();
return;
}
+ // Note: there is a small window of time in here where, when rescheduling a job,
+ // we will stop monitoring its content providers. This should be fixed by stopping
+ // the old job after scheduling the new one, but since we have no lock held here
+ // that may cause ordering problems if the app removes jobStatus while in here.
if (needsReschedule) {
JobStatus rescheduled = getRescheduleJobForFailure(jobStatus);
- startTrackingJob(rescheduled);
+ startTrackingJob(rescheduled, jobStatus);
} else if (jobStatus.getJob().isPeriodic()) {
JobStatus rescheduledPeriodic = getRescheduleJobForPeriodic(jobStatus);
- startTrackingJob(rescheduledPeriodic);
+ startTrackingJob(rescheduledPeriodic, jobStatus);
}
reportActive();
mHandler.obtainMessage(MSG_CHECK_JOB_GREEDY).sendToTarget();
@@ -760,8 +784,10 @@
int idleCount = 0;
int backoffCount = 0;
int connectivityCount = 0;
+ int contentCount = 0;
List<JobStatus> runnableJobs = null;
ArraySet<JobStatus> jobs = mJobs.getJobs();
+ if (DEBUG) Slog.d(TAG, "Maybe queuing ready jobs...");
for (int i=0; i<jobs.size(); i++) {
JobStatus job = jobs.valueAt(i);
if (isReadyToBeExecutedLocked(job)) {
@@ -788,6 +814,9 @@
if (job.hasChargingConstraint()) {
chargingCount++;
}
+ if (job.hasContentTriggerConstraint()) {
+ contentCount++;
+ }
if (runnableJobs == null) {
runnableJobs = new ArrayList<>();
}
@@ -801,6 +830,7 @@
idleCount >= MIN_IDLE_COUNT ||
connectivityCount >= MIN_CONNECTIVITY_COUNT ||
chargingCount >= MIN_CHARGING_COUNT ||
+ contentCount >= MIN_CONTENT_COUNT ||
(runnableJobs != null && runnableJobs.size() >= MIN_READY_JOBS_COUNT)) {
if (DEBUG) {
Slog.d(TAG, "maybeQueueReadyJobsForExecutionLockedH: Running jobs.");
@@ -953,6 +983,10 @@
Slog.d(TAG, "About to run job on context "
+ String.valueOf(i) + ", job: " + contextIdToJobMap[i]);
}
+ for (int ic=0; ic<mControllers.size(); ic++) {
+ StateController controller = mControllers.get(ic);
+ controller.prepareForExecution(contextIdToJobMap[i]);
+ }
if (!mActiveServices.get(i).executeRunnableJob(contextIdToJobMap[i])) {
Slog.d(TAG, "Error executing " + contextIdToJobMap[i]);
}
@@ -1162,7 +1196,20 @@
ArraySet<JobStatus> jobs = mJobs.getJobs();
for (int i=0; i<jobs.size(); i++) {
JobStatus job = jobs.valueAt(i);
- job.dump(pw, " ");
+ pw.print(" Job #"); pw.print(i); pw.print(": ");
+ pw.println(job.toShortString());
+ job.dump(pw, " ");
+ pw.print(" Ready: ");
+ pw.print(mHandler.isReadyToBeExecutedLocked(job));
+ pw.print(" (job=");
+ pw.print(job.isReady());
+ pw.print(" pending=");
+ pw.print(mPendingJobs.contains(job));
+ pw.print(" active=");
+ pw.print(isCurrentlyActiveLocked(job));
+ pw.print(" user=");
+ pw.print(mStartedUsers.contains(job.getUserId()));
+ pw.println(")");
}
} else {
pw.println(" None.");
diff --git a/services/core/java/com/android/server/job/JobServiceContext.java b/services/core/java/com/android/server/job/JobServiceContext.java
index dd634fa..b249739 100644
--- a/services/core/java/com/android/server/job/JobServiceContext.java
+++ b/services/core/java/com/android/server/job/JobServiceContext.java
@@ -25,6 +25,7 @@
import android.content.Intent;
import android.content.ServiceConnection;
import android.content.pm.PackageManager;
+import android.net.Uri;
import android.os.Binder;
import android.os.Handler;
import android.os.IBinder;
@@ -170,7 +171,18 @@
final boolean isDeadlineExpired =
job.hasDeadlineConstraint() &&
(job.getLatestRunTimeElapsed() < SystemClock.elapsedRealtime());
- mParams = new JobParameters(this, job.getJobId(), job.getExtras(), isDeadlineExpired);
+ Uri[] triggeredUris = null;
+ if (job.changedUris != null) {
+ triggeredUris = new Uri[job.changedUris.size()];
+ job.changedUris.toArray(triggeredUris);
+ }
+ String[] triggeredAuthorities = null;
+ if (job.changedAuthorities != null) {
+ triggeredAuthorities = new String[job.changedAuthorities.size()];
+ job.changedAuthorities.toArray(triggeredAuthorities);
+ }
+ mParams = new JobParameters(this, job.getJobId(), job.getExtras(), isDeadlineExpired,
+ triggeredUris, triggeredAuthorities);
mExecutionStartTimeElapsed = SystemClock.elapsedRealtime();
mVerb = VERB_BINDING;
diff --git a/services/core/java/com/android/server/job/JobStore.java b/services/core/java/com/android/server/job/JobStore.java
index c88f5d7..f796164 100644
--- a/services/core/java/com/android/server/job/JobStore.java
+++ b/services/core/java/com/android/server/job/JobStore.java
@@ -187,9 +187,8 @@
*/
public List<JobStatus> getJobsByUser(int userHandle) {
List<JobStatus> matchingJobs = new ArrayList<JobStatus>();
- Iterator<JobStatus> it = mJobSet.iterator();
- while (it.hasNext()) {
- JobStatus ts = it.next();
+ for (int i=mJobSet.size()-1; i>=0; i--) {
+ JobStatus ts = mJobSet.valueAt(i);
if (UserHandle.getUserId(ts.getUid()) == userHandle) {
matchingJobs.add(ts);
}
@@ -203,9 +202,8 @@
*/
public List<JobStatus> getJobsByUid(int uid) {
List<JobStatus> matchingJobs = new ArrayList<JobStatus>();
- Iterator<JobStatus> it = mJobSet.iterator();
- while (it.hasNext()) {
- JobStatus ts = it.next();
+ for (int i=mJobSet.size()-1; i>=0; i--) {
+ JobStatus ts = mJobSet.valueAt(i);
if (ts.getUid() == uid) {
matchingJobs.add(ts);
}
@@ -219,9 +217,8 @@
* @return the JobStatus that matches the provided uId and jobId, or null if none found.
*/
public JobStatus getJobByUidAndJobId(int uid, int jobId) {
- Iterator<JobStatus> it = mJobSet.iterator();
- while (it.hasNext()) {
- JobStatus ts = it.next();
+ for (int i=mJobSet.size()-1; i>=0; i--) {
+ JobStatus ts = mJobSet.valueAt(i);
if (ts.getUid() == uid && ts.getJobId() == jobId) {
return ts;
}
diff --git a/services/core/java/com/android/server/job/controllers/AppIdleController.java b/services/core/java/com/android/server/job/controllers/AppIdleController.java
index c09e06c..5f3da75 100644
--- a/services/core/java/com/android/server/job/controllers/AppIdleController.java
+++ b/services/core/java/com/android/server/job/controllers/AppIdleController.java
@@ -62,7 +62,7 @@
}
@Override
- public void maybeStartTrackingJob(JobStatus jobStatus) {
+ public void maybeStartTrackingJob(JobStatus jobStatus, JobStatus lastJob) {
synchronized (mTrackedTasks) {
mTrackedTasks.add(jobStatus);
String packageName = jobStatus.getSourcePackageName();
@@ -77,7 +77,7 @@
}
@Override
- public void maybeStopTrackingJob(JobStatus jobStatus) {
+ public void maybeStopTrackingJob(JobStatus jobStatus, boolean forUpdate) {
synchronized (mTrackedTasks) {
mTrackedTasks.remove(jobStatus);
}
diff --git a/services/core/java/com/android/server/job/controllers/BatteryController.java b/services/core/java/com/android/server/job/controllers/BatteryController.java
index 7c2aead..b322a3e 100644
--- a/services/core/java/com/android/server/job/controllers/BatteryController.java
+++ b/services/core/java/com/android/server/job/controllers/BatteryController.java
@@ -16,8 +16,6 @@
package com.android.server.job.controllers;
-import android.app.AlarmManager;
-import android.app.PendingIntent;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
@@ -79,7 +77,7 @@
}
@Override
- public void maybeStartTrackingJob(JobStatus taskStatus) {
+ public void maybeStartTrackingJob(JobStatus taskStatus, JobStatus lastJob) {
final boolean isOnStablePower = mChargeTracker.isOnStablePower();
if (taskStatus.hasChargingConstraint()) {
synchronized (mTrackedTasks) {
@@ -90,7 +88,7 @@
}
@Override
- public void maybeStopTrackingJob(JobStatus taskStatus) {
+ public void maybeStopTrackingJob(JobStatus taskStatus, boolean forUpdate) {
if (taskStatus.hasChargingConstraint()) {
synchronized (mTrackedTasks) {
mTrackedTasks.remove(taskStatus);
diff --git a/services/core/java/com/android/server/job/controllers/ConnectivityController.java b/services/core/java/com/android/server/job/controllers/ConnectivityController.java
index daba0d9..b84658a 100644
--- a/services/core/java/com/android/server/job/controllers/ConnectivityController.java
+++ b/services/core/java/com/android/server/job/controllers/ConnectivityController.java
@@ -82,7 +82,7 @@
}
@Override
- public void maybeStartTrackingJob(JobStatus jobStatus) {
+ public void maybeStartTrackingJob(JobStatus jobStatus, JobStatus lastJob) {
if (jobStatus.hasConnectivityConstraint() || jobStatus.hasUnmeteredConstraint()) {
synchronized (mTrackedJobs) {
jobStatus.connectivityConstraintSatisfied.set(mNetworkConnected);
@@ -93,7 +93,7 @@
}
@Override
- public void maybeStopTrackingJob(JobStatus jobStatus) {
+ public void maybeStopTrackingJob(JobStatus jobStatus, boolean forUpdate) {
if (jobStatus.hasConnectivityConstraint() || jobStatus.hasUnmeteredConstraint()) {
synchronized (mTrackedJobs) {
mTrackedJobs.remove(jobStatus);
diff --git a/services/core/java/com/android/server/job/controllers/ContentObserverController.java b/services/core/java/com/android/server/job/controllers/ContentObserverController.java
new file mode 100644
index 0000000..212cc94
--- /dev/null
+++ b/services/core/java/com/android/server/job/controllers/ContentObserverController.java
@@ -0,0 +1,306 @@
+/*
+ * Copyright (C) 2016 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License
+ */
+
+package com.android.server.job.controllers;
+
+import android.app.job.JobInfo;
+import android.content.Context;
+import android.database.ContentObserver;
+import android.net.Uri;
+import android.os.Handler;
+import android.util.ArrayMap;
+import android.util.ArraySet;
+
+import com.android.internal.annotations.VisibleForTesting;
+import com.android.server.job.JobSchedulerService;
+import com.android.server.job.StateChangedListener;
+
+import java.io.PrintWriter;
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+
+/**
+ * Controller for monitoring changes to content URIs through a ContentObserver.
+ */
+public class ContentObserverController extends StateController {
+ private static final String TAG = "JobScheduler.Content";
+
+ /**
+ * Maximum number of changing URIs we will batch together to report.
+ * XXX Should be smarter about this, restricting it by the maximum number
+ * of characters we will retain.
+ */
+ private static final int MAX_URIS_REPORTED = 50;
+
+ private static final Object sCreationLock = new Object();
+ private static volatile ContentObserverController sController;
+
+ final private List<JobStatus> mTrackedTasks = new ArrayList<JobStatus>();
+ ArrayMap<Uri, ObserverInstance> mObservers = new ArrayMap<>();
+ final Handler mHandler = new Handler();
+
+ public static ContentObserverController get(JobSchedulerService taskManagerService) {
+ synchronized (sCreationLock) {
+ if (sController == null) {
+ sController = new ContentObserverController(taskManagerService,
+ taskManagerService.getContext());
+ }
+ }
+ return sController;
+ }
+
+ @VisibleForTesting
+ public static ContentObserverController getForTesting(StateChangedListener stateChangedListener,
+ Context context) {
+ return new ContentObserverController(stateChangedListener, context);
+ }
+
+ private ContentObserverController(StateChangedListener stateChangedListener, Context context) {
+ super(stateChangedListener, context);
+ }
+
+ @Override
+ public void maybeStartTrackingJob(JobStatus taskStatus, JobStatus lastJob) {
+ if (taskStatus.hasContentTriggerConstraint()) {
+ synchronized (mTrackedTasks) {
+ if (taskStatus.contentObserverJobInstance == null) {
+ taskStatus.contentObserverJobInstance = new JobInstance(taskStatus);
+ }
+ mTrackedTasks.add(taskStatus);
+ boolean havePendingUris = false;
+ // If there is a previous job associated with the new job, propagate over
+ // any pending content URI trigger reports.
+ if (lastJob != null && lastJob.contentObserverJobInstance != null
+ && lastJob.contentObserverJobInstance
+ != taskStatus.contentObserverJobInstance
+ && lastJob.contentObserverJobInstance.mChangedAuthorities != null) {
+ havePendingUris = true;
+ taskStatus.contentObserverJobInstance.mChangedAuthorities
+ = lastJob.contentObserverJobInstance.mChangedAuthorities;
+ taskStatus.contentObserverJobInstance.mChangedUris
+ = lastJob.contentObserverJobInstance.mChangedUris;
+ lastJob.contentObserverJobInstance.mChangedAuthorities = null;
+ lastJob.contentObserverJobInstance.mChangedUris = null;
+ }
+ // If we have previously reported changed authorities/uris, then we failed
+ // to complete the job with them so will re-record them to report again.
+ if (taskStatus.changedAuthorities != null) {
+ havePendingUris = true;
+ if (taskStatus.contentObserverJobInstance.mChangedAuthorities == null) {
+ taskStatus.contentObserverJobInstance.mChangedAuthorities
+ = new ArraySet<>();
+ }
+ for (String auth : taskStatus.changedAuthorities) {
+ taskStatus.contentObserverJobInstance.mChangedAuthorities.add(auth);
+ }
+ if (taskStatus.changedUris != null) {
+ if (taskStatus.contentObserverJobInstance.mChangedUris == null) {
+ taskStatus.contentObserverJobInstance.mChangedUris = new ArraySet<>();
+ }
+ for (Uri uri : taskStatus.changedUris) {
+ taskStatus.contentObserverJobInstance.mChangedUris.add(uri);
+ }
+ }
+ taskStatus.changedAuthorities = null;
+ taskStatus.changedUris = null;
+ }
+ taskStatus.changedAuthorities = null;
+ taskStatus.changedUris = null;
+ taskStatus.contentTriggerConstraintSatisfied.set(havePendingUris);
+ }
+ }
+ }
+
+ @Override
+ public void prepareForExecution(JobStatus taskStatus) {
+ if (taskStatus.hasContentTriggerConstraint()) {
+ synchronized (mTrackedTasks) {
+ if (taskStatus.contentObserverJobInstance != null) {
+ taskStatus.changedUris = taskStatus.contentObserverJobInstance.mChangedUris;
+ taskStatus.changedAuthorities
+ = taskStatus.contentObserverJobInstance.mChangedAuthorities;
+ taskStatus.contentObserverJobInstance.mChangedUris = null;
+ taskStatus.contentObserverJobInstance.mChangedAuthorities = null;
+ }
+ }
+ }
+ }
+
+ @Override
+ public void maybeStopTrackingJob(JobStatus taskStatus, boolean forUpdate) {
+ if (taskStatus.hasContentTriggerConstraint()) {
+ synchronized (mTrackedTasks) {
+ if (!forUpdate) {
+ // We won't do this reset if being called for an update, because
+ // we know it will be immediately followed by maybeStartTrackingJob...
+ // and we don't want to lose any content changes in-between.
+ if (taskStatus.contentObserverJobInstance != null) {
+ taskStatus.contentObserverJobInstance.detach();
+ taskStatus.contentObserverJobInstance = null;
+ }
+ }
+ mTrackedTasks.remove(taskStatus);
+ }
+ }
+ }
+
+ @Override
+ public void rescheduleForFailure(JobStatus newJob, JobStatus failureToReschedule) {
+ if (failureToReschedule.hasContentTriggerConstraint()
+ && newJob.hasContentTriggerConstraint()) {
+ synchronized (mTrackedTasks) {
+ // Our job has failed, and we are scheduling a new job for it.
+ // Copy the last reported content changes in to the new job, so when
+ // we schedule the new one we will pick them up and report them again.
+ newJob.changedAuthorities = failureToReschedule.changedAuthorities;
+ newJob.changedUris = failureToReschedule.changedUris;
+ }
+ }
+ }
+
+ class ObserverInstance extends ContentObserver {
+ final Uri mUri;
+ final ArrayList<JobInstance> mJobs = new ArrayList<>();
+
+ public ObserverInstance(Handler handler, Uri uri) {
+ super(handler);
+ mUri = uri;
+ }
+
+ @Override
+ public void onChange(boolean selfChange, Uri uri) {
+ boolean reportChange = false;
+ synchronized (mTrackedTasks) {
+ final int N = mJobs.size();
+ for (int i=0; i<N; i++) {
+ JobInstance inst = mJobs.get(i);
+ if (inst.mChangedUris == null) {
+ inst.mChangedUris = new ArraySet<>();
+ }
+ if (inst.mChangedUris.size() < MAX_URIS_REPORTED) {
+ inst.mChangedUris.add(uri);
+ }
+ if (inst.mChangedAuthorities == null) {
+ inst.mChangedAuthorities = new ArraySet<>();
+ }
+ inst.mChangedAuthorities.add(uri.getAuthority());
+ boolean previous
+ = inst.mJobStatus.contentTriggerConstraintSatisfied.getAndSet(true);
+ if (!previous) {
+ reportChange = true;
+ }
+ }
+ }
+ // Let the scheduler know that state has changed. This may or may not result in an
+ // execution.
+ if (reportChange) {
+ mStateChangedListener.onControllerStateChanged();
+ }
+ }
+ }
+
+ class JobInstance extends ArrayList<ObserverInstance> {
+ private final JobStatus mJobStatus;
+ private ArraySet<Uri> mChangedUris;
+ private ArraySet<String> mChangedAuthorities;
+
+ JobInstance(JobStatus jobStatus) {
+ mJobStatus = jobStatus;
+ final JobInfo.TriggerContentUri[] uris = jobStatus.getJob().getTriggerContentUris();
+ if (uris != null) {
+ for (JobInfo.TriggerContentUri uri : uris) {
+ ObserverInstance obs = mObservers.get(uri.getUri());
+ if (obs == null) {
+ obs = new ObserverInstance(mHandler, uri.getUri());
+ mObservers.put(uri.getUri(), obs);
+ mContext.getContentResolver().registerContentObserver(
+ uri.getUri(),
+ (uri.getFlags() &
+ JobInfo.TriggerContentUri.FLAG_NOTIFY_FOR_DESCENDANTS)
+ != 0,
+ obs);
+ }
+ obs.mJobs.add(this);
+ add(obs);
+ }
+ }
+ }
+
+ void detach() {
+ final int N = size();
+ for (int i=0; i<N; i++) {
+ final ObserverInstance obs = get(i);
+ obs.mJobs.remove(this);
+ if (obs.mJobs.size() == 0) {
+ mContext.getContentResolver().unregisterContentObserver(obs);
+ mObservers.remove(obs.mUri);
+ }
+ }
+ }
+ }
+
+ @Override
+ public void dumpControllerState(PrintWriter pw) {
+ pw.println("Content.");
+ synchronized (mTrackedTasks) {
+ Iterator<JobStatus> it = mTrackedTasks.iterator();
+ if (it.hasNext()) {
+ pw.print(String.valueOf(it.next().hashCode()));
+ }
+ while (it.hasNext()) {
+ pw.print("," + String.valueOf(it.next().hashCode()));
+ }
+ pw.println();
+ int N = mObservers.size();
+ if (N > 0) {
+ pw.println("URIs:");
+ for (int i = 0; i < N; i++) {
+ ObserverInstance obs = mObservers.valueAt(i);
+ pw.print(" ");
+ pw.print(mObservers.keyAt(i));
+ pw.println(":");
+ pw.print(" ");
+ pw.println(obs);
+ pw.println(" Jobs:");
+ int M = obs.mJobs.size();
+ for (int j=0; j<M; j++) {
+ JobInstance inst = obs.mJobs.get(j);
+ pw.print(" ");
+ pw.print(inst.hashCode());
+ if (inst.mChangedAuthorities != null) {
+ pw.println(":");
+ pw.println(" Changed Authorities:");
+ for (int k=0; k<inst.mChangedAuthorities.size(); k++) {
+ pw.print(" ");
+ pw.println(inst.mChangedAuthorities.valueAt(k));
+ }
+ if (inst.mChangedUris != null) {
+ pw.println(" Changed URIs:");
+ for (int k = 0; k<inst.mChangedUris.size(); k++) {
+ pw.print(" ");
+ pw.println(inst.mChangedUris.valueAt(k));
+ }
+ }
+ } else {
+ pw.println();
+ }
+ }
+ }
+ }
+ }
+ }
+}
diff --git a/services/core/java/com/android/server/job/controllers/IdleController.java b/services/core/java/com/android/server/job/controllers/IdleController.java
index fe5e8c9..9f4cdef 100644
--- a/services/core/java/com/android/server/job/controllers/IdleController.java
+++ b/services/core/java/com/android/server/job/controllers/IdleController.java
@@ -66,7 +66,7 @@
* StateController interface
*/
@Override
- public void maybeStartTrackingJob(JobStatus taskStatus) {
+ public void maybeStartTrackingJob(JobStatus taskStatus, JobStatus lastJob) {
if (taskStatus.hasIdleConstraint()) {
synchronized (mTrackedTasks) {
mTrackedTasks.add(taskStatus);
@@ -76,7 +76,7 @@
}
@Override
- public void maybeStopTrackingJob(JobStatus taskStatus) {
+ public void maybeStopTrackingJob(JobStatus taskStatus, boolean forUpdate) {
synchronized (mTrackedTasks) {
mTrackedTasks.remove(taskStatus);
}
diff --git a/services/core/java/com/android/server/job/controllers/JobStatus.java b/services/core/java/com/android/server/job/controllers/JobStatus.java
index e6e9e49..4113180 100644
--- a/services/core/java/com/android/server/job/controllers/JobStatus.java
+++ b/services/core/java/com/android/server/job/controllers/JobStatus.java
@@ -19,11 +19,14 @@
import android.app.AppGlobals;
import android.app.job.JobInfo;
import android.content.ComponentName;
+import android.net.Uri;
import android.os.PersistableBundle;
import android.os.RemoteException;
import android.os.SystemClock;
import android.os.UserHandle;
import android.text.format.DateUtils;
+import android.util.ArraySet;
+import android.util.TimeUtils;
import java.io.PrintWriter;
import java.util.concurrent.atomic.AtomicBoolean;
@@ -61,6 +64,17 @@
final AtomicBoolean unmeteredConstraintSatisfied = new AtomicBoolean();
final AtomicBoolean connectivityConstraintSatisfied = new AtomicBoolean();
final AtomicBoolean appNotIdleConstraintSatisfied = new AtomicBoolean();
+ final AtomicBoolean contentTriggerConstraintSatisfied = new AtomicBoolean();
+
+ // These are filled in by controllers when preparing for execution.
+ public ArraySet<Uri> changedUris;
+ public ArraySet<String> changedAuthorities;
+
+ /**
+ * For use only by ContentObserverController: state it is maintaining about content URIs
+ * being observed.
+ */
+ ContentObserverController.JobInstance contentObserverJobInstance;
/**
* Earliest point in the future at which this job will be eligible to run. A value of 0
@@ -220,6 +234,10 @@
return job.isRequireDeviceIdle();
}
+ public boolean hasContentTriggerConstraint() {
+ return job.getTriggerContentUris() != null;
+ }
+
public boolean isPersisted() {
return job.isPersisted();
}
@@ -252,7 +270,8 @@
&& (!hasTimingDelayConstraint() || timeDelayConstraintSatisfied.get())
&& (!hasConnectivityConstraint() || connectivityConstraintSatisfied.get())
&& (!hasUnmeteredConstraint() || unmeteredConstraintSatisfied.get())
- && (!hasIdleConstraint() || idleConstraintSatisfied.get());
+ && (!hasIdleConstraint() || idleConstraintSatisfied.get())
+ && (!hasContentTriggerConstraint() || contentTriggerConstraintSatisfied.get());
}
public boolean matches(int uid, int jobId) {
@@ -268,8 +287,9 @@
+ ",R=(" + formatRunTime(earliestRunTimeElapsedMillis, NO_EARLIEST_RUNTIME)
+ "," + formatRunTime(latestRunTimeElapsedMillis, NO_LATEST_RUNTIME) + ")"
+ ",N=" + job.getNetworkType() + ",C=" + job.isRequireCharging()
- + ",I=" + job.isRequireDeviceIdle() + ",F=" + numFailures
- + ",P=" + job.isPersisted()
+ + ",I=" + job.isRequireDeviceIdle()
+ + ",U=" + (job.getTriggerContentUris() != null)
+ + ",F=" + numFailures + ",P=" + job.isPersisted()
+ ",ANI=" + appNotIdleConstraintSatisfied.get()
+ (isReady() ? "(READY)" : "")
+ "]";
@@ -310,13 +330,132 @@
* {@link #toString()} returns.
*/
public String toShortString() {
- return job.getService().flattenToShortString() + " jId=" + job.getId() +
- ", u" + getUserId();
+ StringBuilder sb = new StringBuilder();
+ sb.append(Integer.toHexString(System.identityHashCode(this)));
+ sb.append(" jId=");
+ sb.append(job.getId());
+ sb.append(" uid=");
+ UserHandle.formatUid(sb, uId);
+ sb.append(' ');
+ sb.append(job.getService().flattenToShortString());
+ return sb.toString();
}
// Dumpsys infrastructure
public void dump(PrintWriter pw, String prefix) {
+ pw.print(prefix); UserHandle.formatUid(pw, uId);
+ pw.print(" tag="); pw.println(tag);
pw.print(prefix);
- pw.println(this.toString());
+ pw.print("Source: uid="); UserHandle.formatUid(pw, sourceUid);
+ pw.print(" user="); pw.print(sourceUserId);
+ pw.print(" pkg="); pw.println(sourcePackageName);
+ pw.print(prefix); pw.println("JobInfo:");
+ pw.print(prefix); pw.print(" Service: ");
+ pw.println(job.getService().flattenToShortString());
+ if (job.isPeriodic()) {
+ pw.print(prefix); pw.print(" PERIODIC: interval=");
+ TimeUtils.formatDuration(job.getIntervalMillis(), pw);
+ pw.print(" flex=");
+ TimeUtils.formatDuration(job.getFlexMillis(), pw);
+ pw.println();
+ }
+ if (job.isPersisted()) {
+ pw.print(prefix); pw.println(" PERSISTED");
+ }
+ if (job.getPriority() != 0) {
+ pw.print(prefix); pw.print(" Priority: ");
+ pw.println(job.getPriority());
+ }
+ pw.print(prefix); pw.print(" Requires: charging=");
+ pw.print(job.isRequireCharging());
+ pw.print(" deviceIdle=");
+ pw.println(job.isRequireDeviceIdle());
+ if (job.getTriggerContentUris() != null) {
+ pw.print(prefix); pw.println(" Trigger content URIs:");
+ for (int i=0; i<job.getTriggerContentUris().length; i++) {
+ JobInfo.TriggerContentUri trig = job.getTriggerContentUris()[i];
+ pw.print(prefix); pw.print(" ");
+ pw.print(Integer.toHexString(trig.getFlags()));
+ pw.print(' ' );
+ pw.println(trig.getUri());
+ }
+ }
+ if (job.getNetworkType() != JobInfo.NETWORK_TYPE_NONE) {
+ pw.print(prefix); pw.print(" Network type: ");
+ pw.println(job.getNetworkType());
+ }
+ if (job.getMinLatencyMillis() != 0) {
+ pw.print(prefix); pw.print(" Minimum latency: ");
+ TimeUtils.formatDuration(job.getMinLatencyMillis(), pw);
+ pw.println();
+ }
+ if (job.getMaxExecutionDelayMillis() != 0) {
+ pw.print(prefix); pw.print(" Max execution delay: ");
+ TimeUtils.formatDuration(job.getMaxExecutionDelayMillis(), pw);
+ pw.println();
+ }
+ pw.print(prefix); pw.print(" Backoff: policy=");
+ pw.print(job.getBackoffPolicy());
+ pw.print(" initial=");
+ TimeUtils.formatDuration(job.getInitialBackoffMillis(), pw);
+ pw.println();
+ if (job.hasEarlyConstraint()) {
+ pw.print(prefix); pw.println(" Has early constraint");
+ }
+ if (job.hasLateConstraint()) {
+ pw.print(prefix); pw.println(" Has late constraint");
+ }
+ pw.print(prefix); pw.println("Constraints:");
+ if (hasChargingConstraint()) {
+ pw.print(prefix); pw.print(" Charging: ");
+ pw.println(chargingConstraintSatisfied.get());
+ }
+ if (hasTimingDelayConstraint()) {
+ pw.print(prefix); pw.print(" Time delay: ");
+ pw.println(timeDelayConstraintSatisfied.get());
+ }
+ if (hasDeadlineConstraint()) {
+ pw.print(prefix); pw.print(" Deadline: ");
+ pw.println(deadlineConstraintSatisfied.get());
+ }
+ if (hasIdleConstraint()) {
+ pw.print(prefix); pw.print(" System idle: ");
+ pw.println(idleConstraintSatisfied.get());
+ }
+ if (hasUnmeteredConstraint()) {
+ pw.print(prefix); pw.print(" Unmetered: ");
+ pw.println(unmeteredConstraintSatisfied.get());
+ }
+ if (hasConnectivityConstraint()) {
+ pw.print(prefix); pw.print(" Connectivity: ");
+ pw.println(connectivityConstraintSatisfied.get());
+ }
+ if (hasIdleConstraint()) {
+ pw.print(prefix); pw.print(" App not idle: ");
+ pw.println(appNotIdleConstraintSatisfied.get());
+ }
+ if (hasContentTriggerConstraint()) {
+ pw.print(prefix); pw.print(" Content trigger: ");
+ pw.println(contentTriggerConstraintSatisfied.get());
+ }
+ if (changedAuthorities != null) {
+ pw.print(prefix); pw.println("Changed authorities:");
+ for (int i=0; i<changedAuthorities.size(); i++) {
+ pw.print(prefix); pw.print(" "); pw.println(changedAuthorities.valueAt(i));
+ }
+ if (changedUris != null) {
+ pw.print(prefix); pw.println("Changed URIs:");
+ for (int i=0; i<changedUris.size(); i++) {
+ pw.print(prefix); pw.print(" "); pw.println(changedUris.valueAt(i));
+ }
+ }
+ }
+ pw.print(prefix); pw.print("Earliest run time: ");
+ pw.println(formatRunTime(earliestRunTimeElapsedMillis, NO_EARLIEST_RUNTIME));
+ pw.print(prefix); pw.print("Latest run time: ");
+ pw.println(formatRunTime(latestRunTimeElapsedMillis, NO_LATEST_RUNTIME));
+ if (numFailures != 0) {
+ pw.print(prefix); pw.print("Num failures: "); pw.println(numFailures);
+ }
}
}
diff --git a/services/core/java/com/android/server/job/controllers/StateController.java b/services/core/java/com/android/server/job/controllers/StateController.java
index 21c30c7..b619ea8 100644
--- a/services/core/java/com/android/server/job/controllers/StateController.java
+++ b/services/core/java/com/android/server/job/controllers/StateController.java
@@ -49,11 +49,21 @@
* Also called when updating a task, so implementing controllers have to be aware of
* preexisting tasks.
*/
- public abstract void maybeStartTrackingJob(JobStatus jobStatus);
+ public abstract void maybeStartTrackingJob(JobStatus jobStatus, JobStatus lastJob);
+ /**
+ * Optionally implement logic here to prepare the job to be executed.
+ */
+ public void prepareForExecution(JobStatus jobStatus) {
+ }
/**
* Remove task - this will happen if the task is cancelled, completed, etc.
*/
- public abstract void maybeStopTrackingJob(JobStatus jobStatus);
+ public abstract void maybeStopTrackingJob(JobStatus jobStatus, boolean forUpdate);
+ /**
+ * Called when a new job is being created to reschedule an old failed job.
+ */
+ public void rescheduleForFailure(JobStatus newJob, JobStatus failureToReschedule) {
+ }
public abstract void dumpControllerState(PrintWriter pw);
}
diff --git a/services/core/java/com/android/server/job/controllers/TimeController.java b/services/core/java/com/android/server/job/controllers/TimeController.java
index 854ce31..a68c3ad 100644
--- a/services/core/java/com/android/server/job/controllers/TimeController.java
+++ b/services/core/java/com/android/server/job/controllers/TimeController.java
@@ -71,9 +71,9 @@
* list.
*/
@Override
- public synchronized void maybeStartTrackingJob(JobStatus job) {
+ public synchronized void maybeStartTrackingJob(JobStatus job, JobStatus lastJob) {
if (job.hasTimingDelayConstraint() || job.hasDeadlineConstraint()) {
- maybeStopTrackingJob(job);
+ maybeStopTrackingJob(job, false);
boolean isInsert = false;
ListIterator<JobStatus> it = mTrackedJobs.listIterator(mTrackedJobs.size());
while (it.hasPrevious()) {
@@ -101,7 +101,7 @@
* Really an == comparison should be enough, but why play with fate? We'll do <=.
*/
@Override
- public synchronized void maybeStopTrackingJob(JobStatus job) {
+ public synchronized void maybeStopTrackingJob(JobStatus job, boolean forUpdate) {
if (mTrackedJobs.remove(job)) {
checkExpiredDelaysAndResetAlarm();
checkExpiredDeadlinesAndResetAlarm();
diff --git a/services/core/java/com/android/server/pm/UserManagerService.java b/services/core/java/com/android/server/pm/UserManagerService.java
index 5b9f0b3..fc79849 100644
--- a/services/core/java/com/android/server/pm/UserManagerService.java
+++ b/services/core/java/com/android/server/pm/UserManagerService.java
@@ -552,22 +552,13 @@
}
private void broadcastProfileAvailabilityChanges(UserHandle profileHandle,
- UserHandle parentHandle, Bundle extras) {
- // Send intent to profile
- Intent intent = new Intent(Intent.ACTION_AVAILABILITY_CHANGED);
+ UserHandle parentHandle, boolean inQuietMode) {
+ Intent intent = new Intent(Intent.ACTION_MANAGED_PROFILE_AVAILABILITY_CHANGED);
+ intent.putExtra(Intent.EXTRA_QUIET_MODE, inQuietMode);
+ intent.putExtra(Intent.EXTRA_USER, profileHandle);
+ intent.putExtra(Intent.EXTRA_USER_HANDLE, profileHandle.getIdentifier());
intent.addFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY);
- intent.putExtras(extras);
- mContext.sendBroadcastAsUser(intent, profileHandle);
-
- // Send intent to parent
- if (parentHandle != null) {
- intent = new Intent(Intent.ACTION_MANAGED_PROFILE_AVAILABILITY_CHANGED);
- intent.putExtra(Intent.EXTRA_USER, profileHandle);
- intent.putExtra(Intent.EXTRA_USER_HANDLE, profileHandle.getIdentifier());
- intent.addFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY);
- intent.putExtras(extras);
- mContext.sendBroadcastAsUser(intent, parentHandle);
- }
+ mContext.sendBroadcastAsUser(intent, parentHandle);
}
@Override
@@ -591,10 +582,21 @@
}
}
if (changed) {
- Bundle extras = new Bundle();
- extras.putBoolean(Intent.EXTRA_QUIET_MODE, enableQuietMode);
- broadcastProfileAvailabilityChanges(profile.getUserHandle(),
- parent != null ? parent.getUserHandle() : null, extras);
+ long identity = Binder.clearCallingIdentity();
+ try {
+ if (enableQuietMode) {
+ ActivityManagerNative.getDefault().stopUser(userHandle, /* force */true, null);
+ } else {
+ ActivityManagerNative.getDefault().startUserInBackground(userHandle);
+ }
+ } catch (RemoteException e) {
+ Slog.e(LOG_TAG, "fail to start/stop user for quiet mode", e);
+ } finally {
+ Binder.restoreCallingIdentity(identity);
+ }
+
+ broadcastProfileAvailabilityChanges(profile.getUserHandle(), parent.getUserHandle(),
+ enableQuietMode);
}
}
@@ -606,7 +608,7 @@
info = getUserInfoLU(userHandle);
}
if (info == null || !info.isManagedProfile()) {
- throw new IllegalArgumentException("User " + userHandle + " is not a profile");
+ return false;
}
return info.isQuietModeEnabled();
}
diff --git a/services/core/java/com/android/server/trust/TrustManagerService.java b/services/core/java/com/android/server/trust/TrustManagerService.java
index 1d498e1..3452f41 100644
--- a/services/core/java/com/android/server/trust/TrustManagerService.java
+++ b/services/core/java/com/android/server/trust/TrustManagerService.java
@@ -60,7 +60,6 @@
import android.util.Log;
import android.util.Slog;
import android.util.SparseBooleanArray;
-import android.util.SparseIntArray;
import android.util.Xml;
import android.view.IWindowManager;
import android.view.WindowManagerGlobal;
@@ -103,6 +102,9 @@
private static final int MSG_CLEANUP_USER = 8;
private static final int MSG_SWITCH_USER = 9;
private static final int MSG_SET_DEVICE_LOCKED = 10;
+ private static final int MSG_FLUSH_TRUST_USUALLY_MANAGED = 11;
+
+ public static final int TRUST_USUALLY_MANAGED_FLUSH_DELAY = 2 * 60 * 1000;
private final ArraySet<AgentInfo> mActiveAgents = new ArraySet<>();
private final ArrayList<ITrustListener> mTrustListeners = new ArrayList<>();
@@ -120,6 +122,9 @@
@GuardedBy("mDeviceLockedForUser")
private final SparseBooleanArray mDeviceLockedForUser = new SparseBooleanArray();
+ @GuardedBy("mDeviceLockedForUser")
+ private final SparseBooleanArray mTrustUsuallyManagedForUser = new SparseBooleanArray();
+
private boolean mTrustAgentsCanRun = false;
private int mCurrentUser = UserHandle.USER_SYSTEM;
@@ -187,7 +192,12 @@
}
public void updateTrust(int userId, int flags) {
- dispatchOnTrustManagedChanged(aggregateIsTrustManaged(userId), userId);
+ boolean managed = aggregateIsTrustManaged(userId);
+ dispatchOnTrustManagedChanged(managed, userId);
+ if (mStrongAuthTracker.isTrustAllowedForUser(userId)
+ && isTrustUsuallyManagedInternal(userId) != managed) {
+ updateTrustUsuallyManaged(userId, managed);
+ }
boolean trusted = aggregateIsTrusted(userId);
boolean changed;
synchronized (mUserIsTrusted) {
@@ -200,6 +210,18 @@
}
}
+ private void updateTrustUsuallyManaged(int userId, boolean managed) {
+ synchronized (mTrustUsuallyManagedForUser) {
+ mTrustUsuallyManagedForUser.put(userId, managed);
+ }
+ // Wait a few minutes before committing to flash, in case the trust agent is transiently not
+ // managing trust (crashed, needs to acknowledge DPM restrictions, etc).
+ mHandler.removeMessages(MSG_FLUSH_TRUST_USUALLY_MANAGED);
+ mHandler.sendMessageDelayed(
+ mHandler.obtainMessage(MSG_FLUSH_TRUST_USUALLY_MANAGED),
+ TRUST_USUALLY_MANAGED_FLUSH_DELAY);
+ }
+
void refreshAgentList(int userId) {
if (DEBUG) Slog.d(TAG, "refreshAgentList()");
if (!mTrustAgentsCanRun) {
@@ -787,8 +809,37 @@
mHandler.obtainMessage(MSG_SET_DEVICE_LOCKED, value ? 1 : 0, userId)
.sendToTarget();
}
+
+ @Override
+ public boolean isTrustUsuallyManaged(int userId) {
+ mContext.enforceCallingPermission(Manifest.permission.TRUST_LISTENER,
+ "query trust state");
+ return isTrustUsuallyManagedInternal(userId);
+ }
};
+ private boolean isTrustUsuallyManagedInternal(int userId) {
+ synchronized (mTrustUsuallyManagedForUser) {
+ int i = mTrustUsuallyManagedForUser.indexOfKey(userId);
+ if (i >= 0) {
+ return mTrustUsuallyManagedForUser.valueAt(i);
+ }
+ }
+ // It's not in memory yet, get the value from persisted storage instead
+ boolean persistedValue = mLockPatternUtils.isTrustUsuallyManaged(userId);
+ synchronized (mTrustUsuallyManagedForUser) {
+ int i = mTrustUsuallyManagedForUser.indexOfKey(userId);
+ if (i >= 0) {
+ // Someone set the trust usually managed in the mean time. Better use that.
+ return mTrustUsuallyManagedForUser.valueAt(i);
+ } else {
+ // .. otherwise it's safe to cache the fetched value now.
+ mTrustUsuallyManagedForUser.put(userId, persistedValue);
+ return persistedValue;
+ }
+ }
+ }
+
private int resolveProfileParent(int userId) {
long identity = Binder.clearCallingIdentity();
try {
@@ -834,6 +885,19 @@
case MSG_SET_DEVICE_LOCKED:
setDeviceLockedForUser(msg.arg2, msg.arg1 != 0);
break;
+ case MSG_FLUSH_TRUST_USUALLY_MANAGED:
+ SparseBooleanArray usuallyManaged;
+ synchronized (mTrustUsuallyManagedForUser) {
+ usuallyManaged = mTrustUsuallyManagedForUser.clone();
+ }
+
+ for (int i = 0; i < usuallyManaged.size(); i++) {
+ int userId = usuallyManaged.keyAt(i);
+ boolean value = usuallyManaged.valueAt(i);
+ if (value != mLockPatternUtils.isTrustUsuallyManaged(userId)) {
+ mLockPatternUtils.setTrustUsuallyManaged(value, userId);
+ }
+ }
}
}
};
diff --git a/services/core/java/com/android/server/tv/TvInputManagerService.java b/services/core/java/com/android/server/tv/TvInputManagerService.java
index 3193ff8..3ca99d4 100644
--- a/services/core/java/com/android/server/tv/TvInputManagerService.java
+++ b/services/core/java/com/android/server/tv/TvInputManagerService.java
@@ -435,7 +435,11 @@
for (SessionState state : userState.sessionStateMap.values()) {
if (state.session != null) {
try {
- state.session.release();
+ if (state.isRecordingSession) {
+ state.session.disconnect();
+ } else {
+ state.session.release();
+ }
} catch (RemoteException e) {
Slog.e(TAG, "error in release", e);
}
@@ -604,7 +608,11 @@
// Create a session. When failed, send a null token immediately.
try {
- service.createSession(channels[1], callback, sessionState.info.getId());
+ if (sessionState.isRecordingSession) {
+ service.createRecordingSession(callback, sessionState.info.getId());
+ } else {
+ service.createSession(channels[1], callback, sessionState.info.getId());
+ }
} catch (RemoteException e) {
Slog.e(TAG, "error in createSession", e);
removeSessionStateLocked(sessionToken, userId);
@@ -632,7 +640,11 @@
if (sessionToken == userState.mainSessionToken) {
setMainLocked(sessionToken, false, callingUid, userId);
}
- sessionState.session.release();
+ if (sessionState.isRecordingSession) {
+ sessionState.session.disconnect();
+ } else {
+ sessionState.session.release();
+ }
}
} catch (RemoteException | SessionNotFoundException e) {
Slog.e(TAG, "error in releaseSession", e);
@@ -766,6 +778,21 @@
}
}
+ private void notifyTvInputInfoChanged(UserState userState, String inputId,
+ TvInputInfo inputInfo) {
+ if (DEBUG) {
+ Slog.d(TAG, "notifyTvInputInfoChanged(inputId=" + inputId + ", inputInfo=" + inputInfo
+ + ")");
+ }
+ for (ITvInputManagerCallback callback : userState.callbackSet) {
+ try {
+ callback.onTvInputInfoChanged(inputId, inputInfo);
+ } catch (RemoteException e) {
+ Slog.e(TAG, "failed to report changed input info to callback", e);
+ }
+ }
+ }
+
private void setStateLocked(String inputId, int state, int userId) {
UserState userState = getOrCreateUserStateLocked(userId);
TvInputState inputState = userState.inputMap.get(inputId);
@@ -1005,7 +1032,7 @@
@Override
public void createSession(final ITvInputClient client, final String inputId,
- int seq, int userId) {
+ boolean isRecordingSession, int seq, int userId) {
final int callingUid = Binder.getCallingUid();
final int resolvedUserId = resolveCallingUserId(Binder.getCallingPid(), callingUid,
userId, "createSession");
@@ -1033,8 +1060,8 @@
// Create a new session token and a session state.
IBinder sessionToken = new Binder();
- SessionState sessionState = new SessionState(sessionToken, info, client,
- seq, callingUid, resolvedUserId);
+ SessionState sessionState = new SessionState(sessionToken, info,
+ isRecordingSession, client, seq, callingUid, resolvedUserId);
// Add them to the global session state map of the current user.
userState.sessionStateMap.put(sessionToken, sessionState);
@@ -1375,6 +1402,26 @@
}
@Override
+ public void timeShiftPlay(IBinder sessionToken, final Uri recordedProgramUri, int userId) {
+ final int callingUid = Binder.getCallingUid();
+ final int resolvedUserId = resolveCallingUserId(Binder.getCallingPid(), callingUid,
+ userId, "timeShiftPlay");
+ final long identity = Binder.clearCallingIdentity();
+ try {
+ synchronized (mLock) {
+ try {
+ getSessionLocked(sessionToken, callingUid, resolvedUserId).timeShiftPlay(
+ recordedProgramUri);
+ } catch (RemoteException | SessionNotFoundException e) {
+ Slog.e(TAG, "error in timeShiftPlay", e);
+ }
+ }
+ } finally {
+ Binder.restoreCallingIdentity(identity);
+ }
+ }
+
+ @Override
public void timeShiftPause(IBinder sessionToken, int userId) {
final int callingUid = Binder.getCallingUid();
final int resolvedUserId = resolveCallingUserId(Binder.getCallingPid(), callingUid,
@@ -1383,8 +1430,7 @@
try {
synchronized (mLock) {
try {
- getSessionLocked(sessionToken, callingUid, resolvedUserId)
- .timeShiftPause();
+ getSessionLocked(sessionToken, callingUid, resolvedUserId).timeShiftPause();
} catch (RemoteException | SessionNotFoundException e) {
Slog.e(TAG, "error in timeShiftPause", e);
}
@@ -1477,6 +1523,64 @@
}
@Override
+ public void connect(IBinder sessionToken, final Uri channelUri, Bundle params, int userId) {
+ final int callingUid = Binder.getCallingUid();
+ final int resolvedUserId = resolveCallingUserId(Binder.getCallingPid(), callingUid,
+ userId, "connect");
+ final long identity = Binder.clearCallingIdentity();
+ try {
+ synchronized (mLock) {
+ try {
+ getSessionLocked(sessionToken, callingUid, resolvedUserId).connect(
+ channelUri, params);
+ } catch (RemoteException | SessionNotFoundException e) {
+ Slog.e(TAG, "error in connect", e);
+ }
+ }
+ } finally {
+ Binder.restoreCallingIdentity(identity);
+ }
+ }
+
+ @Override
+ public void startRecording(IBinder sessionToken, int userId) {
+ final int callingUid = Binder.getCallingUid();
+ final int resolvedUserId = resolveCallingUserId(Binder.getCallingPid(), callingUid,
+ userId, "startRecording");
+ final long identity = Binder.clearCallingIdentity();
+ try {
+ synchronized (mLock) {
+ try {
+ getSessionLocked(sessionToken, callingUid, resolvedUserId).startRecording();
+ } catch (RemoteException | SessionNotFoundException e) {
+ Slog.e(TAG, "error in startRecording", e);
+ }
+ }
+ } finally {
+ Binder.restoreCallingIdentity(identity);
+ }
+ }
+
+ @Override
+ public void stopRecording(IBinder sessionToken, int userId) {
+ final int callingUid = Binder.getCallingUid();
+ final int resolvedUserId = resolveCallingUserId(Binder.getCallingPid(), callingUid,
+ userId, "stopRecording");
+ final long identity = Binder.clearCallingIdentity();
+ try {
+ synchronized (mLock) {
+ try {
+ getSessionLocked(sessionToken, callingUid, resolvedUserId).stopRecording();
+ } catch (RemoteException | SessionNotFoundException e) {
+ Slog.e(TAG, "error in stopRecording", e);
+ }
+ }
+ } finally {
+ Binder.restoreCallingIdentity(identity);
+ }
+ }
+
+ @Override
public List<TvInputHardwareInfo> getHardwareList() throws RemoteException {
if (mContext.checkCallingPermission(android.Manifest.permission.TV_INPUT_HARDWARE)
!= PackageManager.PERMISSION_GRANTED) {
@@ -1912,6 +2016,7 @@
private final class SessionState implements IBinder.DeathRecipient {
private final TvInputInfo info;
+ private final boolean isRecordingSession;
private final ITvInputClient client;
private final int seq;
private final int callingUid;
@@ -1922,10 +2027,11 @@
// Not null if this session represents an external device connected to a hardware TV input.
private IBinder hardwareSessionToken;
- private SessionState(IBinder sessionToken, TvInputInfo info, ITvInputClient client,
- int seq, int callingUid, int userId) {
+ private SessionState(IBinder sessionToken, TvInputInfo info, boolean isRecordingSession,
+ ITvInputClient client, int seq, int callingUid, int userId) {
this.sessionToken = sessionToken;
this.info = info;
+ this.isRecordingSession = isRecordingSession;
this.client = client;
this.seq = seq;
this.callingUid = callingUid;
@@ -2126,6 +2232,18 @@
}
}
}
+
+ @Override
+ public void setTvInputInfo(String inputId, TvInputInfo inputInfo) {
+ ensureValidInput(inputInfo);
+ synchronized (mLock) {
+ if (DEBUG) {
+ Slog.d(TAG, "setTvInputInfo(" + inputInfo + ")");
+ }
+ UserState userState = getOrCreateUserStateLocked(mUserId);
+ notifyTvInputInfoChanged(userState, inputId, inputInfo);
+ }
+ }
}
private final class SessionCallback extends ITvInputSessionCallback.Stub {
@@ -2393,6 +2511,78 @@
}
}
}
+
+ // For the recording session only
+ @Override
+ public void onConnected() {
+ synchronized (mLock) {
+ if (DEBUG) {
+ Slog.d(TAG, "onConnected()");
+ }
+ if (mSessionState.session == null || mSessionState.client == null) {
+ return;
+ }
+ try {
+ mSessionState.client.onConnected(mSessionState.seq);
+ } catch (RemoteException e) {
+ Slog.e(TAG, "error in onConnected", e);
+ }
+ }
+ }
+
+ // For the recording session only
+ @Override
+ public void onRecordingStarted() {
+ synchronized (mLock) {
+ if (DEBUG) {
+ Slog.d(TAG, "onRecordingStarted()");
+ }
+ if (mSessionState.session == null || mSessionState.client == null) {
+ return;
+ }
+ try {
+ mSessionState.client.onRecordingStarted(mSessionState.seq);
+ } catch (RemoteException e) {
+ Slog.e(TAG, "error in onRecordingStarted", e);
+ }
+ }
+ }
+
+ // For the recording session only
+ @Override
+ public void onRecordingStopped(Uri recordedProgramUri) {
+ synchronized (mLock) {
+ if (DEBUG) {
+ Slog.d(TAG, "onRecordingStopped()");
+ }
+ if (mSessionState.session == null || mSessionState.client == null) {
+ return;
+ }
+ try {
+ mSessionState.client.onRecordingStopped(recordedProgramUri, mSessionState.seq);
+ } catch (RemoteException e) {
+ Slog.e(TAG, "error in onRecordingStopped", e);
+ }
+ }
+ }
+
+ // For the recording session only
+ @Override
+ public void onError(int error) {
+ synchronized (mLock) {
+ if (DEBUG) {
+ Slog.d(TAG, "onError()");
+ }
+ if (mSessionState.session == null || mSessionState.client == null) {
+ return;
+ }
+ try {
+ mSessionState.client.onError(error, mSessionState.seq);
+ } catch (RemoteException e) {
+ Slog.e(TAG, "error in onError", e);
+ }
+ }
+ }
}
private static final class WatchLogHandler extends Handler {
diff --git a/services/core/java/com/android/server/wm/DragState.java b/services/core/java/com/android/server/wm/DragState.java
index c4653cf..d1c0881 100644
--- a/services/core/java/com/android/server/wm/DragState.java
+++ b/services/core/java/com/android/server/wm/DragState.java
@@ -527,16 +527,28 @@
ClipDescription description, ClipData data,
IDropPermissions dropPermissions,
boolean result) {
- float winX = x - win.mFrame.left;
- float winY = y - win.mFrame.top;
- if (win.mEnforceSizeCompat) {
- winX *= win.mGlobalScale;
- winY *= win.mGlobalScale;
- }
+ final float winX = translateToWindowX(win, x);
+ final float winY = translateToWindowY(win, y);
return DragEvent.obtain(action, winX, winY, localState, description, data,
dropPermissions, result);
}
+ private static float translateToWindowX(WindowState win, float x) {
+ float winX = x - win.mFrame.left;
+ if (win.mEnforceSizeCompat) {
+ winX *= win.mGlobalScale;
+ }
+ return winX;
+ }
+
+ private static float translateToWindowY(WindowState win, float y) {
+ float winY = y - win.mFrame.top;
+ if (win.mEnforceSizeCompat) {
+ winY *= win.mGlobalScale;
+ }
+ return winY;
+ }
+
boolean stepAnimationLocked(long currentTimeMs) {
if (mAnimation == null) {
return false;
@@ -595,6 +607,17 @@
private void restorePointerIconLw() {
if (isFromSource(InputDevice.SOURCE_MOUSE)) {
+ WindowState touchWin = getTouchedWinAtPointLw(mCurrentX, mCurrentY);
+ if (touchWin != null) {
+ try {
+ touchWin.mClient.updatePointerIcon(
+ translateToWindowX(touchWin, mCurrentX),
+ translateToWindowY(touchWin, mCurrentY));
+ return;
+ } catch (RemoteException e) {
+ Slog.w(TAG_WM, "unable to restore pointer icon");
+ }
+ }
InputManager.getInstance().setPointerIconShape(PointerIcon.STYLE_DEFAULT);
}
}
diff --git a/services/core/java/com/android/server/wm/WindowManagerService.java b/services/core/java/com/android/server/wm/WindowManagerService.java
index 1021411..5adf627 100644
--- a/services/core/java/com/android/server/wm/WindowManagerService.java
+++ b/services/core/java/com/android/server/wm/WindowManagerService.java
@@ -2193,7 +2193,7 @@
// need to see about starting one.
wasVisible = win.isWinVisibleLw();
- if (wasVisible && appToken != null && appToken.appDied) {
+ if (win.shouldKeepVisibleDeadAppWindow()) {
if (DEBUG_ADD_REMOVE) Slog.v(TAG_WM,
"Not removing " + win + " because app died while it's visible");
diff --git a/services/core/java/com/android/server/wm/WindowState.java b/services/core/java/com/android/server/wm/WindowState.java
index dca7735..e8de90c 100644
--- a/services/core/java/com/android/server/wm/WindowState.java
+++ b/services/core/java/com/android/server/wm/WindowState.java
@@ -1615,6 +1615,27 @@
}
}
+ /**
+ * Returns true if this window is visible and belongs to a dead app and shouldn't be removed,
+ * because we want to preserve its location on screen to be re-activated later when the user
+ * interacts with it.
+ */
+ boolean shouldKeepVisibleDeadAppWindow() {
+ if (!isWinVisibleLw() || mAppToken == null || !mAppToken.appDied) {
+ // Not a visible app window or the app isn't dead.
+ return false;
+ }
+
+ if (mAttrs.type == TYPE_APPLICATION_STARTING) {
+ // We don't keep starting windows since they were added by the window manager before
+ // the app even launched.
+ return false;
+ }
+
+ final TaskStack stack = getStack();
+ return stack != null && StackId.keepVisibleDeadAppWindowOnScreen(stack.mStackId);
+ }
+
/** @return true if this window desires key events. */
boolean canReceiveKeys() {
return isVisibleOrAdding()
diff --git a/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java b/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java
index 74d4659..e3e90b66 100644
--- a/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java
+++ b/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java
@@ -175,13 +175,19 @@
private static final String TAG_STATUS_BAR = "statusbar";
- private static final String TAG_AFFILIATION_ID = "affiliation-id";
-
private static final String ATTR_DISABLED = "disabled";
private static final String DO_NOT_ASK_CREDENTIALS_ON_BOOT_XML =
"do-not-ask-credentials-on-boot";
+ private static final String TAG_AFFILIATION_ID = "affiliation-id";
+
+ private static final String TAG_ADMIN_BROADCAST_PENDING = "admin-broadcast-pending";
+
+ private static final String ATTR_VALUE = "value";
+
+ private static final String TAG_INITIALIZATION_BUNDLE = "initialization-bundle";
+
private static final int REQUEST_EXPIRE_PASSWORD = 5571;
private static final long MS_PER_DAY = 86400 * 1000;
@@ -379,6 +385,10 @@
Set<String> mAffiliationIds = new ArraySet<>();
+ // Used for initialization of users created by createAndManageUsers.
+ boolean mAdminBroadcastPending = false;
+ PersistableBundle mInitBundle = null;
+
public DevicePolicyData(int userHandle) {
mUserHandle = userHandle;
}
@@ -427,16 +437,15 @@
}
if (Intent.ACTION_USER_REMOVED.equals(action)) {
removeUserData(userHandle);
- } else if (Intent.ACTION_USER_STARTED.equals(action)
- || Intent.ACTION_EXTERNAL_APPLICATIONS_UNAVAILABLE.equals(action)) {
-
- if (Intent.ACTION_USER_STARTED.equals(action)) {
+ } else if (Intent.ACTION_USER_STARTED.equals(action)) {
+ synchronized (DevicePolicyManagerService.this) {
// Reset the policy data
- synchronized (DevicePolicyManagerService.this) {
- mUserData.remove(userHandle);
- }
+ mUserData.remove(userHandle);
+ sendAdminEnabledBroadcastLocked(userHandle);
}
handlePackagesChanged(null /* check all admins */, userHandle);
+ } else if (Intent.ACTION_EXTERNAL_APPLICATIONS_UNAVAILABLE.equals(action)) {
+ handlePackagesChanged(null /* check all admins */, userHandle);
} else if (Intent.ACTION_PACKAGE_CHANGED.equals(action)
|| (Intent.ACTION_PACKAGE_ADDED.equals(action)
&& intent.getBooleanExtra(Intent.EXTRA_REPLACING, false))) {
@@ -2085,6 +2094,19 @@
out.endTag(null, TAG_AFFILIATION_ID);
}
+ if (policy.mAdminBroadcastPending) {
+ out.startTag(null, TAG_ADMIN_BROADCAST_PENDING);
+ out.attribute(null, ATTR_VALUE,
+ Boolean.toString(policy.mAdminBroadcastPending));
+ out.endTag(null, TAG_ADMIN_BROADCAST_PENDING);
+ }
+
+ if (policy.mInitBundle != null) {
+ out.startTag(null, TAG_INITIALIZATION_BUNDLE);
+ policy.mInitBundle.saveToXml(out);
+ out.endTag(null, TAG_INITIALIZATION_BUNDLE);
+ }
+
out.endTag(null, "policies");
out.endDocument();
@@ -2093,7 +2115,7 @@
stream.close();
journal.commit();
sendChangedNotification(userHandle);
- } catch (IOException e) {
+ } catch (XmlPullParserException | IOException e) {
Slog.w(LOG_TAG, "failed writing file", e);
try {
if (stream != null) {
@@ -2219,6 +2241,11 @@
policy.doNotAskCredentialsOnBoot = true;
} else if (TAG_AFFILIATION_ID.equals(tag)) {
policy.mAffiliationIds.add(parser.getAttributeValue(null, "id"));
+ } else if (TAG_ADMIN_BROADCAST_PENDING.equals(tag)) {
+ String pending = parser.getAttributeValue(null, ATTR_VALUE);
+ policy.mAdminBroadcastPending = Boolean.toString(true).equals(pending);
+ } else if (TAG_INITIALIZATION_BUNDLE.equals(tag)) {
+ policy.mInitBundle = PersistableBundle.restoreFromXml(parser);
} else {
Slog.w(LOG_TAG, "Unknown tag: " + tag);
XmlUtils.skipCurrentTag(parser);
@@ -6344,6 +6371,90 @@
}
}
+ private void sendAdminEnabledBroadcastLocked(int userHandle) {
+ DevicePolicyData policyData = getUserData(userHandle);
+ if (policyData.mAdminBroadcastPending) {
+ // Send the initialization data to profile owner and delete the data
+ ActiveAdmin admin = getProfileOwnerAdminLocked(userHandle);
+ if (admin != null) {
+ PersistableBundle initBundle = policyData.mInitBundle;
+ sendAdminCommandLocked(admin, DeviceAdminReceiver.ACTION_DEVICE_ADMIN_ENABLED,
+ initBundle == null ? null : new Bundle(initBundle), null);
+ }
+ policyData.mInitBundle = null;
+ policyData.mAdminBroadcastPending = false;
+ saveSettingsLocked(userHandle);
+ }
+ }
+
+ @Override
+ public UserHandle createAndManageUser(ComponentName admin, String name,
+ ComponentName profileOwner, PersistableBundle adminExtras, int flags) {
+ Preconditions.checkNotNull(admin, "admin is null");
+ Preconditions.checkNotNull(profileOwner, "profileOwner is null");
+ if (!admin.getPackageName().equals(profileOwner.getPackageName())) {
+ throw new IllegalArgumentException("profileOwner " + profileOwner + " and admin "
+ + admin + " are not in the same package");
+ }
+ // Create user.
+ UserHandle user = null;
+ synchronized (this) {
+ getActiveAdminForCallerLocked(admin, DeviceAdminInfo.USES_POLICY_DEVICE_OWNER);
+
+ final long id = mInjector.binderClearCallingIdentity();
+ try {
+ UserInfo userInfo = mUserManager.createUser(name, 0 /* flags */);
+ if (userInfo != null) {
+ user = userInfo.getUserHandle();
+ }
+ } finally {
+ mInjector.binderRestoreCallingIdentity(id);
+ }
+ }
+ if (user == null) {
+ return null;
+ }
+ // Set admin.
+ final long id = mInjector.binderClearCallingIdentity();
+ try {
+ final String adminPkg = admin.getPackageName();
+
+ final int userHandle = user.getIdentifier();
+ try {
+ // Install the profile owner if not present.
+ if (!mIPackageManager.isPackageAvailable(adminPkg, userHandle)) {
+ mIPackageManager.installExistingPackageAsUser(adminPkg, userHandle);
+ }
+ } catch (RemoteException e) {
+ Slog.e(LOG_TAG, "Failed to make remote calls for createAndManageUser, "
+ + "removing created user", e);
+ mUserManager.removeUser(user.getIdentifier());
+ return null;
+ }
+
+ setActiveAdmin(profileOwner, true, userHandle);
+ // User is not started yet, the broadcast by setActiveAdmin will not be received.
+ // So we store adminExtras for broadcasting when the user starts for first time.
+ synchronized(this) {
+ DevicePolicyData policyData = getUserData(userHandle);
+ policyData.mInitBundle = adminExtras;
+ policyData.mAdminBroadcastPending = true;
+ saveSettingsLocked(userHandle);
+ }
+ final String ownerName = getProfileOwnerName(Process.myUserHandle().getIdentifier());
+ setProfileOwner(profileOwner, ownerName, userHandle);
+
+ if ((flags & DevicePolicyManager.SKIP_SETUP_WIZARD) != 0) {
+ Settings.Secure.putIntForUser(mContext.getContentResolver(),
+ Settings.Secure.USER_SETUP_COMPLETE, 1, userHandle);
+ }
+
+ return user;
+ } finally {
+ mInjector.binderRestoreCallingIdentity(id);
+ }
+ }
+
@Override
public boolean removeUser(ComponentName who, UserHandle userHandle) {
Preconditions.checkNotNull(who, "ComponentName is null");
@@ -7789,6 +7900,7 @@
if (!mHasFeature || !isManagedProfile(userHandle)) {
return ActiveAdmin.DEF_ORGANIZATION_COLOR;
}
+ Preconditions.checkNotNull(who, "ComponentName is null");
synchronized (this) {
ActiveAdmin admin = getActiveAdminForCallerLocked(who,
DeviceAdminInfo.USES_POLICY_PROFILE_OWNER);
diff --git a/telephony/java/android/telephony/CellIdentityGsm.java b/telephony/java/android/telephony/CellIdentityGsm.java
index 90d2aa0..74f1171 100644
--- a/telephony/java/android/telephony/CellIdentityGsm.java
+++ b/telephony/java/android/telephony/CellIdentityGsm.java
@@ -38,6 +38,10 @@
private final int mLac;
// 16-bit GSM Cell Identity described in TS 27.007, 0..65535
private final int mCid;
+ // 16-bit GSM Absolute RF Channel Number
+ private final int mArfcn;
+ // 6-bit Base Station Identity Code
+ private final int mBsic;
/**
* @hide
@@ -47,6 +51,8 @@
mMnc = Integer.MAX_VALUE;
mLac = Integer.MAX_VALUE;
mCid = Integer.MAX_VALUE;
+ mArfcn = Integer.MAX_VALUE;
+ mBsic = Integer.MAX_VALUE;
}
/**
* public constructor
@@ -58,10 +64,27 @@
* @hide
*/
public CellIdentityGsm (int mcc, int mnc, int lac, int cid) {
+ this(mcc, mnc, lac, cid, Integer.MAX_VALUE, Integer.MAX_VALUE);
+ }
+
+ /**
+ * public constructor
+ * @param mcc 3-digit Mobile Country Code, 0..999
+ * @param mnc 2 or 3-digit Mobile Network Code, 0..999
+ * @param lac 16-bit Location Area Code, 0..65535
+ * @param cid 16-bit GSM Cell Identity or 28-bit UMTS Cell Identity
+ * @param arfcn 16-bit GSM Absolute RF Channel Number
+ * @param bsic 6-bit Base Station Identity Code
+ *
+ * @hide
+ */
+ public CellIdentityGsm (int mcc, int mnc, int lac, int cid, int arfcn, int bsic) {
mMcc = mcc;
mMnc = mnc;
mLac = lac;
mCid = cid;
+ mArfcn = arfcn;
+ mBsic = bsic;
}
private CellIdentityGsm(CellIdentityGsm cid) {
@@ -69,6 +92,8 @@
mMnc = cid.mMnc;
mLac = cid.mLac;
mCid = cid.mCid;
+ mArfcn = cid.mArfcn;
+ mBsic = cid.mBsic;
}
CellIdentityGsm copy() {
@@ -106,6 +131,21 @@
}
/**
+ * @return 16-bit GSM Absolute RF Channel Number, Integer.MAX_VALUE if unknown
+ */
+ public int getArfcn() {
+ return mArfcn;
+ }
+
+ /**
+ * @return 6-bit Base Station Identity Code, Integer.MAX_VALUE if unknown
+ */
+ public int getBsic() {
+ return mBsic;
+ }
+
+
+ /**
* @return Integer.MAX_VALUE, undefined for GSM
*/
@Deprecated
@@ -132,7 +172,9 @@
return mMcc == o.mMcc &&
mMnc == o.mMnc &&
mLac == o.mLac &&
- mCid == o.mCid;
+ mCid == o.mCid &&
+ mArfcn == o.mArfcn &&
+ mBsic == o.mBsic;
}
@Override
@@ -142,6 +184,8 @@
sb.append(" mMnc=").append(mMnc);
sb.append(" mLac=").append(mLac);
sb.append(" mCid=").append(mCid);
+ sb.append(" mArfcn=").append(mArfcn);
+ sb.append(" mBsic=").append("0x").append(Integer.toHexString(mBsic));
sb.append("}");
return sb.toString();
@@ -161,6 +205,8 @@
dest.writeInt(mMnc);
dest.writeInt(mLac);
dest.writeInt(mCid);
+ dest.writeInt(mArfcn);
+ dest.writeInt(mBsic);
}
/** Construct from Parcel, type has already been processed */
@@ -169,6 +215,8 @@
mMnc = in.readInt();
mLac = in.readInt();
mCid = in.readInt();
+ mArfcn = in.readInt();
+ mBsic = in.readInt();
if (DBG) log("CellIdentityGsm(Parcel): " + toString());
}
diff --git a/telephony/java/android/telephony/CellIdentityLte.java b/telephony/java/android/telephony/CellIdentityLte.java
index 1e7ac08..ce74383 100644
--- a/telephony/java/android/telephony/CellIdentityLte.java
+++ b/telephony/java/android/telephony/CellIdentityLte.java
@@ -40,6 +40,8 @@
private final int mPci;
// 16-bit tracking area code
private final int mTac;
+ // 18-bit Absolute RF Channel Number
+ private final int mEarfcn;
/**
* @hide
@@ -50,6 +52,7 @@
mCi = Integer.MAX_VALUE;
mPci = Integer.MAX_VALUE;
mTac = Integer.MAX_VALUE;
+ mEarfcn = Integer.MAX_VALUE;
}
/**
@@ -63,11 +66,27 @@
* @hide
*/
public CellIdentityLte (int mcc, int mnc, int ci, int pci, int tac) {
+ this(mcc, mnc, ci, pci, tac, Integer.MAX_VALUE);
+ }
+
+ /**
+ *
+ * @param mcc 3-digit Mobile Country Code, 0..999
+ * @param mnc 2 or 3-digit Mobile Network Code, 0..999
+ * @param ci 28-bit Cell Identity
+ * @param pci Physical Cell Id 0..503
+ * @param tac 16-bit Tracking Area Code
+ * @param earfcn 18-bit LTE Absolute RF Channel Number
+ *
+ * @hide
+ */
+ public CellIdentityLte (int mcc, int mnc, int ci, int pci, int tac, int earfcn) {
mMcc = mcc;
mMnc = mnc;
mCi = ci;
mPci = pci;
mTac = tac;
+ mEarfcn = earfcn;
}
private CellIdentityLte(CellIdentityLte cid) {
@@ -76,6 +95,7 @@
mCi = cid.mCi;
mPci = cid.mPci;
mTac = cid.mTac;
+ mEarfcn = cid.mEarfcn;
}
CellIdentityLte copy() {
@@ -117,6 +137,13 @@
return mTac;
}
+ /**
+ * @return 18-bit Absolute RF Channel Number, Integer.MAX_VALUE if unknown
+ */
+ public int getEarfcn() {
+ return mEarfcn;
+ }
+
@Override
public int hashCode() {
return Objects.hash(mMcc, mMnc, mCi, mPci, mTac);
@@ -137,7 +164,8 @@
mMnc == o.mMnc &&
mCi == o.mCi &&
mPci == o.mPci &&
- mTac == o.mTac;
+ mTac == o.mTac &&
+ mEarfcn == o.mEarfcn;
}
@Override
@@ -148,6 +176,7 @@
sb.append(" mCi="); sb.append(mCi);
sb.append(" mPci="); sb.append(mPci);
sb.append(" mTac="); sb.append(mTac);
+ sb.append(" mEarfcn="); sb.append(mEarfcn);
sb.append("}");
return sb.toString();
@@ -168,6 +197,7 @@
dest.writeInt(mCi);
dest.writeInt(mPci);
dest.writeInt(mTac);
+ dest.writeInt(mEarfcn);
}
/** Construct from Parcel, type has already been processed */
@@ -177,6 +207,7 @@
mCi = in.readInt();
mPci = in.readInt();
mTac = in.readInt();
+ mEarfcn = in.readInt();
if (DBG) log("CellIdentityLte(Parcel): " + toString());
}
diff --git a/telephony/java/android/telephony/CellIdentityWcdma.java b/telephony/java/android/telephony/CellIdentityWcdma.java
index 56ee8c9..0d13efd 100644
--- a/telephony/java/android/telephony/CellIdentityWcdma.java
+++ b/telephony/java/android/telephony/CellIdentityWcdma.java
@@ -40,6 +40,8 @@
private final int mCid;
// 9-bit UMTS Primary Scrambling Code described in TS 25.331, 0..511
private final int mPsc;
+ // 16-bit UMTS Absolute RF Channel Number
+ private final int mUarfcn;
/**
* @hide
@@ -50,6 +52,7 @@
mLac = Integer.MAX_VALUE;
mCid = Integer.MAX_VALUE;
mPsc = Integer.MAX_VALUE;
+ mUarfcn = Integer.MAX_VALUE;
}
/**
* public constructor
@@ -62,11 +65,27 @@
* @hide
*/
public CellIdentityWcdma (int mcc, int mnc, int lac, int cid, int psc) {
+ this(mcc, mnc, lac, cid, psc, Integer.MAX_VALUE);
+ }
+
+ /**
+ * public constructor
+ * @param mcc 3-digit Mobile Country Code, 0..999
+ * @param mnc 2 or 3-digit Mobile Network Code, 0..999
+ * @param lac 16-bit Location Area Code, 0..65535
+ * @param cid 28-bit UMTS Cell Identity
+ * @param psc 9-bit UMTS Primary Scrambling Code
+ * @param uarfcn 16-bit UMTS Absolute RF Channel Number
+ *
+ * @hide
+ */
+ public CellIdentityWcdma (int mcc, int mnc, int lac, int cid, int psc, int uarfcn) {
mMcc = mcc;
mMnc = mnc;
mLac = lac;
mCid = cid;
mPsc = psc;
+ mUarfcn = uarfcn;
}
private CellIdentityWcdma(CellIdentityWcdma cid) {
@@ -75,6 +94,7 @@
mLac = cid.mLac;
mCid = cid.mCid;
mPsc = cid.mPsc;
+ mUarfcn = cid.mUarfcn;
}
CellIdentityWcdma copy() {
@@ -123,6 +143,13 @@
return Objects.hash(mMcc, mMnc, mLac, mCid, mPsc);
}
+ /**
+ * @return 16-bit UMTS Absolute RF Channel Number, Integer.MAX_VALUE if unknown
+ */
+ public int getUarfcn() {
+ return mUarfcn;
+ }
+
@Override
public boolean equals(Object other) {
if (this == other) {
@@ -138,7 +165,8 @@
mMnc == o.mMnc &&
mLac == o.mLac &&
mCid == o.mCid &&
- mPsc == o.mPsc;
+ mPsc == o.mPsc &&
+ mUarfcn == o.mUarfcn;
}
@Override
@@ -149,6 +177,7 @@
sb.append(" mLac=").append(mLac);
sb.append(" mCid=").append(mCid);
sb.append(" mPsc=").append(mPsc);
+ sb.append(" mUarfcn=").append(mUarfcn);
sb.append("}");
return sb.toString();
@@ -169,6 +198,7 @@
dest.writeInt(mLac);
dest.writeInt(mCid);
dest.writeInt(mPsc);
+ dest.writeInt(mUarfcn);
}
/** Construct from Parcel, type has already been processed */
@@ -178,6 +208,7 @@
mLac = in.readInt();
mCid = in.readInt();
mPsc = in.readInt();
+ mUarfcn = in.readInt();
if (DBG) log("CellIdentityWcdma(Parcel): " + toString());
}
diff --git a/telephony/java/android/telephony/CellSignalStrengthGsm.java b/telephony/java/android/telephony/CellSignalStrengthGsm.java
index d27fcec..addf7ef 100644
--- a/telephony/java/android/telephony/CellSignalStrengthGsm.java
+++ b/telephony/java/android/telephony/CellSignalStrengthGsm.java
@@ -34,6 +34,7 @@
private int mSignalStrength; // Valid values are (0-31, 99) as defined in TS 27.007 8.5
private int mBitErrorRate; // bit error rate (0-7, 99) as defined in TS 27.007 8.5
+ private int mTimingAdvance;
/**
* Empty constructor
@@ -75,6 +76,22 @@
public void initialize(int ss, int ber) {
mSignalStrength = ss;
mBitErrorRate = ber;
+ mTimingAdvance = Integer.MAX_VALUE;
+ }
+
+ /**
+ * Initialize all the values
+ *
+ * @param ss SignalStrength as ASU value
+ * @param ber is Bit Error Rate
+ * @param ta timing advance
+ *
+ * @hide
+ */
+ public void initialize(int ss, int ber, int ta) {
+ mSignalStrength = ss;
+ mBitErrorRate = ber;
+ mTimingAdvance = ta;
}
/**
@@ -83,6 +100,7 @@
protected void copyFrom(CellSignalStrengthGsm s) {
mSignalStrength = s.mSignalStrength;
mBitErrorRate = s.mBitErrorRate;
+ mTimingAdvance = s.mTimingAdvance;
}
/**
@@ -98,6 +116,7 @@
public void setDefaultValues() {
mSignalStrength = Integer.MAX_VALUE;
mBitErrorRate = Integer.MAX_VALUE;
+ mTimingAdvance = Integer.MAX_VALUE;
}
/**
@@ -174,7 +193,8 @@
return false;
}
- return mSignalStrength == s.mSignalStrength && mBitErrorRate == s.mBitErrorRate;
+ return mSignalStrength == s.mSignalStrength && mBitErrorRate == s.mBitErrorRate &&
+ s.mTimingAdvance == mTimingAdvance;
}
/**
@@ -184,7 +204,8 @@
public String toString() {
return "CellSignalStrengthGsm:"
+ " ss=" + mSignalStrength
- + " ber=" + mBitErrorRate;
+ + " ber=" + mBitErrorRate
+ + " mTa=" + mTimingAdvance;
}
/** Implement the Parcelable interface */
@@ -193,6 +214,7 @@
if (DBG) log("writeToParcel(Parcel, int): " + toString());
dest.writeInt(mSignalStrength);
dest.writeInt(mBitErrorRate);
+ dest.writeInt(mTimingAdvance);
}
/**
@@ -202,6 +224,7 @@
private CellSignalStrengthGsm(Parcel in) {
mSignalStrength = in.readInt();
mBitErrorRate = in.readInt();
+ mTimingAdvance = in.readInt();
if (DBG) log("CellSignalStrengthGsm(Parcel): " + toString());
}
diff --git a/wifi/java/android/net/wifi/WifiScanner.java b/wifi/java/android/net/wifi/WifiScanner.java
index 76c679c..44be671 100644
--- a/wifi/java/android/net/wifi/WifiScanner.java
+++ b/wifi/java/android/net/wifi/WifiScanner.java
@@ -136,17 +136,29 @@
}
}
- /** reports {@link ScanListener#onResults} when underlying buffers are full
+ /**
+ * reports {@link ScanListener#onResults} when underlying buffers are full
+ * this is simply the lack of the {@link #REPORT_EVENT_AFTER_EACH_SCAN} flag
* @deprecated
*/
@Deprecated
public static final int REPORT_EVENT_AFTER_BUFFER_FULL = 0;
- /** reports {@link ScanListener#onResults} after each scan */
- public static final int REPORT_EVENT_AFTER_EACH_SCAN = 1;
- /** reports {@link ScanListener#onFullResult} whenever each beacon is discovered */
- public static final int REPORT_EVENT_FULL_SCAN_RESULT = 2;
- /** do not batch */
- public static final int REPORT_EVENT_NO_BATCH = 4;
+ /**
+ * reports {@link ScanListener#onResults} after each scan
+ */
+ public static final int REPORT_EVENT_AFTER_EACH_SCAN = (1 << 0);
+ /**
+ * reports {@link ScanListener#onFullResult} whenever each beacon is discovered
+ */
+ public static final int REPORT_EVENT_FULL_SCAN_RESULT = (1 << 1);
+ /**
+ * Do not place scans in the chip's scan history buffer
+ */
+ public static final int REPORT_EVENT_NO_BATCH = (1 << 2);
+ /**
+ * report full scan results and completion event to the context hub
+ */
+ public static final int REPORT_EVENT_CONTEXT_HUB = (1 << 3);
/**
* scan configuration parameters to be sent to {@link #startBackgroundScan}