Merge "Start voice-based interactions from headsethook key" into jb-dev
diff --git a/api/16.txt b/api/16.txt
index 62654ae..18a4b7b 100644
--- a/api/16.txt
+++ b/api/16.txt
@@ -75,16 +75,20 @@
field public static final deprecated java.lang.String PERSISTENT_ACTIVITY = "android.permission.PERSISTENT_ACTIVITY";
field public static final java.lang.String PROCESS_OUTGOING_CALLS = "android.permission.PROCESS_OUTGOING_CALLS";
field public static final java.lang.String READ_CALENDAR = "android.permission.READ_CALENDAR";
+ field public static final java.lang.String READ_CALL_LOG = "android.permission.READ_CALL_LOG";
field public static final java.lang.String READ_CONTACTS = "android.permission.READ_CONTACTS";
+ field public static final java.lang.String READ_EXTERNAL_STORAGE = "android.permission.READ_EXTERNAL_STORAGE";
field public static final java.lang.String READ_FRAME_BUFFER = "android.permission.READ_FRAME_BUFFER";
field public static final java.lang.String READ_HISTORY_BOOKMARKS = "com.android.browser.permission.READ_HISTORY_BOOKMARKS";
- field public static final java.lang.String READ_INPUT_STATE = "android.permission.READ_INPUT_STATE";
+ field public static final deprecated java.lang.String READ_INPUT_STATE = "android.permission.READ_INPUT_STATE";
field public static final java.lang.String READ_LOGS = "android.permission.READ_LOGS";
field public static final java.lang.String READ_PHONE_STATE = "android.permission.READ_PHONE_STATE";
field public static final java.lang.String READ_PROFILE = "android.permission.READ_PROFILE";
field public static final java.lang.String READ_SMS = "android.permission.READ_SMS";
+ field public static final java.lang.String READ_SOCIAL_STREAM = "android.permission.READ_SOCIAL_STREAM";
field public static final java.lang.String READ_SYNC_SETTINGS = "android.permission.READ_SYNC_SETTINGS";
field public static final java.lang.String READ_SYNC_STATS = "android.permission.READ_SYNC_STATS";
+ field public static final java.lang.String READ_USER_DICTIONARY = "android.permission.READ_USER_DICTIONARY";
field public static final java.lang.String REBOOT = "android.permission.REBOOT";
field public static final java.lang.String RECEIVE_BOOT_COMPLETED = "android.permission.RECEIVE_BOOT_COMPLETED";
field public static final java.lang.String RECEIVE_MMS = "android.permission.RECEIVE_MMS";
@@ -119,6 +123,7 @@
field public static final java.lang.String WAKE_LOCK = "android.permission.WAKE_LOCK";
field public static final java.lang.String WRITE_APN_SETTINGS = "android.permission.WRITE_APN_SETTINGS";
field public static final java.lang.String WRITE_CALENDAR = "android.permission.WRITE_CALENDAR";
+ field public static final java.lang.String WRITE_CALL_LOG = "android.permission.WRITE_CALL_LOG";
field public static final java.lang.String WRITE_CONTACTS = "android.permission.WRITE_CONTACTS";
field public static final java.lang.String WRITE_EXTERNAL_STORAGE = "android.permission.WRITE_EXTERNAL_STORAGE";
field public static final java.lang.String WRITE_GSERVICES = "android.permission.WRITE_GSERVICES";
@@ -127,22 +132,44 @@
field public static final java.lang.String WRITE_SECURE_SETTINGS = "android.permission.WRITE_SECURE_SETTINGS";
field public static final java.lang.String WRITE_SETTINGS = "android.permission.WRITE_SETTINGS";
field public static final java.lang.String WRITE_SMS = "android.permission.WRITE_SMS";
+ field public static final java.lang.String WRITE_SOCIAL_STREAM = "android.permission.WRITE_SOCIAL_STREAM";
field public static final java.lang.String WRITE_SYNC_SETTINGS = "android.permission.WRITE_SYNC_SETTINGS";
+ field public static final java.lang.String WRITE_USER_DICTIONARY = "android.permission.WRITE_USER_DICTIONARY";
}
public static final class Manifest.permission_group {
ctor public Manifest.permission_group();
field public static final java.lang.String ACCOUNTS = "android.permission-group.ACCOUNTS";
+ field public static final java.lang.String AFFECTS_BATTERY = "android.permission-group.AFFECTS_BATTERY";
+ field public static final java.lang.String APP_INFO = "android.permission-group.APP_INFO";
+ field public static final java.lang.String AUDIO_SETTINGS = "android.permission-group.AUDIO_SETTINGS";
+ field public static final java.lang.String BLUETOOTH_NETWORK = "android.permission-group.BLUETOOTH_NETWORK";
+ field public static final java.lang.String BOOKMARKS = "android.permission-group.BOOKMARKS";
+ field public static final java.lang.String CALENDAR = "android.permission-group.CALENDAR";
+ field public static final java.lang.String CAMERA = "android.permission-group.CAMERA";
field public static final java.lang.String COST_MONEY = "android.permission-group.COST_MONEY";
field public static final java.lang.String DEVELOPMENT_TOOLS = "android.permission-group.DEVELOPMENT_TOOLS";
+ field public static final java.lang.String DEVICE_ALARMS = "android.permission-group.DEVICE_ALARMS";
+ field public static final java.lang.String DISPLAY = "android.permission-group.DISPLAY";
field public static final java.lang.String HARDWARE_CONTROLS = "android.permission-group.HARDWARE_CONTROLS";
field public static final java.lang.String LOCATION = "android.permission-group.LOCATION";
field public static final java.lang.String MESSAGES = "android.permission-group.MESSAGES";
+ field public static final java.lang.String MICROPHONE = "android.permission-group.MICROPHONE";
field public static final java.lang.String NETWORK = "android.permission-group.NETWORK";
field public static final java.lang.String PERSONAL_INFO = "android.permission-group.PERSONAL_INFO";
field public static final java.lang.String PHONE_CALLS = "android.permission-group.PHONE_CALLS";
+ field public static final java.lang.String SCREENLOCK = "android.permission-group.SCREENLOCK";
+ field public static final java.lang.String SHORTRANGE_NETWORK = "android.permission-group.SHORTRANGE_NETWORK";
+ field public static final java.lang.String SOCIAL_INFO = "android.permission-group.SOCIAL_INFO";
+ field public static final java.lang.String STATUS_BAR = "android.permission-group.STATUS_BAR";
field public static final java.lang.String STORAGE = "android.permission-group.STORAGE";
+ field public static final java.lang.String SYNC_SETTINGS = "android.permission-group.SYNC_SETTINGS";
+ field public static final java.lang.String SYSTEM_CLOCK = "android.permission-group.SYSTEM_CLOCK";
field public static final java.lang.String SYSTEM_TOOLS = "android.permission-group.SYSTEM_TOOLS";
+ field public static final java.lang.String USER_DICTIONARY = "android.permission-group.USER_DICTIONARY";
+ field public static final java.lang.String VOICEMAIL = "android.permission-group.VOICEMAIL";
+ field public static final java.lang.String WALLPAPER = "android.permission-group.WALLPAPER";
+ field public static final java.lang.String WRITE_USER_DICTIONARY = "android.permission-group.WRITE_USER_DICTIONARY";
}
public final class R {
@@ -245,7 +272,7 @@
field public static final int animationCache = 16842989; // 0x10100ed
field public static final int animationDuration = 16843026; // 0x1010112
field public static final int animationOrder = 16843214; // 0x10101ce
- field public static final int animationResolution = 16843546; // 0x101031a
+ field public static final deprecated int animationResolution = 16843546; // 0x101031a
field public static final int antialias = 16843034; // 0x101011a
field public static final int anyDensity = 16843372; // 0x101026c
field public static final int apiKey = 16843281; // 0x1010211
@@ -410,9 +437,9 @@
field public static final int editorExtras = 16843300; // 0x1010224
field public static final int ellipsize = 16842923; // 0x10100ab
field public static final int ems = 16843096; // 0x1010158
- field public static final deprecated int enabled = 16842766; // 0x101000e
+ field public static final int enabled = 16842766; // 0x101000e
field public static final int endColor = 16843166; // 0x101019e
- field public static final int endYear = 16843133; // 0x101017d
+ field public static final deprecated int endYear = 16843133; // 0x101017d
field public static final int enterFadeDuration = 16843532; // 0x101030c
field public static final int entries = 16842930; // 0x10100b2
field public static final int entryValues = 16843256; // 0x10101f8
@@ -434,7 +461,7 @@
field public static final int fadeEnabled = 16843390; // 0x101027e
field public static final int fadeOffset = 16843383; // 0x1010277
field public static final int fadeScrollbars = 16843434; // 0x10102aa
- field public static final deprecated int fadingEdge = 16842975; // 0x10100df
+ field public static final int fadingEdge = 16842975; // 0x10100df
field public static final int fadingEdgeLength = 16842976; // 0x10100e0
field public static final int fastScrollAlwaysVisible = 16843573; // 0x1010335
field public static final int fastScrollEnabled = 16843302; // 0x1010226
@@ -528,6 +555,7 @@
field public static final int imeSubtypeLocale = 16843500; // 0x10102ec
field public static final int imeSubtypeMode = 16843501; // 0x10102ed
field public static final int immersive = 16843456; // 0x10102c0
+ field public static final int importantForAccessibility = 16843690; // 0x10103aa
field public static final int inAnimation = 16843127; // 0x1010177
field public static final int includeFontPadding = 16843103; // 0x101015f
field public static final int includeInGlobalSearch = 16843374; // 0x101026e
@@ -560,6 +588,7 @@
field public static final int isRepeatable = 16843336; // 0x1010248
field public static final int isScrollContainer = 16843342; // 0x101024e
field public static final int isSticky = 16843335; // 0x1010247
+ field public static final int isolatedProcess = 16843689; // 0x10103a9
field public static final int itemBackground = 16843056; // 0x1010130
field public static final int itemIconDisabledAlpha = 16843057; // 0x1010131
field public static final int itemPadding = 16843565; // 0x101032d
@@ -578,6 +607,7 @@
field public static final int keyTextColor = 16843318; // 0x1010236
field public static final int keyTextSize = 16843316; // 0x1010234
field public static final int keyWidth = 16843325; // 0x101023d
+ field public static final int keyboardLayout = 16843691; // 0x10103ab
field public static final int keyboardMode = 16843341; // 0x101024d
field public static final int keycode = 16842949; // 0x10100c5
field public static final int killAfterRestore = 16843420; // 0x101029c
@@ -716,12 +746,14 @@
field public static final int panelColorForeground = 16842848; // 0x1010060
field public static final int panelFullBackground = 16842847; // 0x101005f
field public static final int panelTextAppearance = 16842850; // 0x1010062
+ field public static final int parentActivityName = 16843687; // 0x10103a7
field public static final deprecated int password = 16843100; // 0x101015c
field public static final int path = 16842794; // 0x101002a
field public static final int pathPattern = 16842796; // 0x101002c
field public static final int pathPrefix = 16842795; // 0x101002b
field public static final int permission = 16842758; // 0x1010006
field public static final int permissionGroup = 16842762; // 0x101000a
+ field public static final int permissionGroupFlags = 16843688; // 0x10103a8
field public static final int persistent = 16842765; // 0x101000d
field public static final int persistentDrawingCache = 16842990; // 0x10100ee
field public static final deprecated int phoneNumber = 16843111; // 0x1010167
@@ -880,7 +912,7 @@
field public static final int starStyle = 16842882; // 0x1010082
field public static final int startColor = 16843165; // 0x101019d
field public static final int startOffset = 16843198; // 0x10101be
- field public static final int startYear = 16843132; // 0x101017c
+ field public static final deprecated int startYear = 16843132; // 0x101017c
field public static final int stateNotNeeded = 16842774; // 0x1010016
field public static final int state_above_anchor = 16842922; // 0x10100aa
field public static final int state_accelerated = 16843547; // 0x101031b
@@ -1975,11 +2007,35 @@
public abstract class AccessibilityService extends android.app.Service {
ctor public AccessibilityService();
+ method public android.view.accessibility.AccessibilityNodeInfo getRootInActiveWindow();
+ method public final android.accessibilityservice.AccessibilityServiceInfo getServiceInfo();
method public abstract void onAccessibilityEvent(android.view.accessibility.AccessibilityEvent);
method public final android.os.IBinder onBind(android.content.Intent);
+ method protected boolean onGesture(int);
method public abstract void onInterrupt();
method protected void onServiceConnected();
+ method public final boolean performGlobalAction(int);
method public final void setServiceInfo(android.accessibilityservice.AccessibilityServiceInfo);
+ field public static final int GESTURE_SWIPE_DOWN = 2; // 0x2
+ field public static final int GESTURE_SWIPE_DOWN_AND_LEFT = 15; // 0xf
+ field public static final int GESTURE_SWIPE_DOWN_AND_RIGHT = 16; // 0x10
+ field public static final int GESTURE_SWIPE_DOWN_AND_UP = 8; // 0x8
+ field public static final int GESTURE_SWIPE_LEFT = 3; // 0x3
+ field public static final int GESTURE_SWIPE_LEFT_AND_DOWN = 10; // 0xa
+ field public static final int GESTURE_SWIPE_LEFT_AND_RIGHT = 5; // 0x5
+ field public static final int GESTURE_SWIPE_LEFT_AND_UP = 9; // 0x9
+ field public static final int GESTURE_SWIPE_RIGHT = 4; // 0x4
+ field public static final int GESTURE_SWIPE_RIGHT_AND_DOWN = 12; // 0xc
+ field public static final int GESTURE_SWIPE_RIGHT_AND_LEFT = 6; // 0x6
+ field public static final int GESTURE_SWIPE_RIGHT_AND_UP = 11; // 0xb
+ field public static final int GESTURE_SWIPE_UP = 1; // 0x1
+ field public static final int GESTURE_SWIPE_UP_AND_DOWN = 7; // 0x7
+ field public static final int GESTURE_SWIPE_UP_AND_LEFT = 13; // 0xd
+ field public static final int GESTURE_SWIPE_UP_AND_RIGHT = 14; // 0xe
+ field public static final int GLOBAL_ACTION_BACK = 1; // 0x1
+ field public static final int GLOBAL_ACTION_HOME = 2; // 0x2
+ field public static final int GLOBAL_ACTION_NOTIFICATIONS = 4; // 0x4
+ field public static final int GLOBAL_ACTION_RECENTS = 3; // 0x3
field public static final java.lang.String SERVICE_INTERFACE = "android.accessibilityservice.AccessibilityService";
field public static final java.lang.String SERVICE_META_DATA = "android.accessibilityservice";
}
@@ -1990,10 +2046,11 @@
method public static java.lang.String feedbackTypeToString(int);
method public static java.lang.String flagToString(int);
method public boolean getCanRetrieveWindowContent();
- method public java.lang.String getDescription();
+ method public deprecated java.lang.String getDescription();
method public java.lang.String getId();
method public android.content.pm.ResolveInfo getResolveInfo();
method public java.lang.String getSettingsActivityName();
+ method public java.lang.String loadDescription(android.content.pm.PackageManager);
method public void writeToParcel(android.os.Parcel, int);
field public static final android.os.Parcelable.Creator CREATOR;
field public static final int DEFAULT = 1; // 0x1
@@ -2003,6 +2060,8 @@
field public static final int FEEDBACK_HAPTIC = 2; // 0x2
field public static final int FEEDBACK_SPOKEN = 1; // 0x1
field public static final int FEEDBACK_VISUAL = 8; // 0x8
+ field public static final int FLAG_INCLUDE_NOT_IMPORTANT_VIEWS = 2; // 0x2
+ field public static final int FLAG_REQUEST_TOUCH_EXPLORATION_MODE = 4; // 0x4
field public int eventTypes;
field public int feedbackType;
field public int flags;
@@ -2279,15 +2338,19 @@
ctor public LayoutTransition();
method public void addChild(android.view.ViewGroup, android.view.View);
method public void addTransitionListener(android.animation.LayoutTransition.TransitionListener);
+ method public void disableTransitionType(int);
+ method public void enableTransitionType(int);
method public android.animation.Animator getAnimator(int);
method public long getDuration(int);
method public android.animation.TimeInterpolator getInterpolator(int);
method public long getStagger(int);
method public long getStartDelay(int);
method public java.util.List<android.animation.LayoutTransition.TransitionListener> getTransitionListeners();
- method public void hideChild(android.view.ViewGroup, android.view.View);
+ method public deprecated void hideChild(android.view.ViewGroup, android.view.View);
+ method public void hideChild(android.view.ViewGroup, android.view.View, int);
method public boolean isChangingLayout();
method public boolean isRunning();
+ method public boolean isTransitionTypeEnabled(int);
method public void removeChild(android.view.ViewGroup, android.view.View);
method public void removeTransitionListener(android.animation.LayoutTransition.TransitionListener);
method public void setAnimateParentHierarchy(boolean);
@@ -2297,10 +2360,12 @@
method public void setInterpolator(int, android.animation.TimeInterpolator);
method public void setStagger(int, long);
method public void setStartDelay(int, long);
- method public void showChild(android.view.ViewGroup, android.view.View);
+ method public deprecated void showChild(android.view.ViewGroup, android.view.View);
+ method public void showChild(android.view.ViewGroup, android.view.View, int);
field public static final int APPEARING = 2; // 0x2
field public static final int CHANGE_APPEARING = 0; // 0x0
field public static final int CHANGE_DISAPPEARING = 1; // 0x1
+ field public static final int CHANGING = 4; // 0x4
field public static final int DISAPPEARING = 3; // 0x3
}
@@ -2344,6 +2409,15 @@
method public void setPropertyName(java.lang.String);
}
+ public class TimeAnimator extends android.animation.ValueAnimator {
+ ctor public TimeAnimator();
+ method public void setTimeListener(android.animation.TimeAnimator.TimeListener);
+ }
+
+ public static abstract interface TimeAnimator.TimeListener {
+ method public abstract void onTimeUpdate(android.animation.TimeAnimator, long, long);
+ }
+
public abstract interface TimeInterpolator {
method public abstract float getInterpolation(float);
}
@@ -2397,6 +2471,16 @@
}
+package android.annotation {
+
+ public abstract class SuppressLint implements java.lang.annotation.Annotation {
+ }
+
+ public abstract class TargetApi implements java.lang.annotation.Annotation {
+ }
+
+}
+
package android.app {
public abstract class ActionBar {
@@ -2526,6 +2610,7 @@
method public void finish();
method public void finishActivity(int);
method public void finishActivityFromChild(android.app.Activity, int);
+ method public void finishAffinity();
method public void finishFromChild(android.app.Activity);
method public android.app.ActionBar getActionBar();
method public final android.app.Application getApplication();
@@ -2542,6 +2627,7 @@
method public java.lang.String getLocalClassName();
method public android.view.MenuInflater getMenuInflater();
method public final android.app.Activity getParent();
+ method public android.content.Intent getParentActivityIntent();
method public android.content.SharedPreferences getPreferences(int);
method public int getRequestedOrientation();
method public int getTaskId();
@@ -2558,6 +2644,8 @@
method public boolean isTaskRoot();
method public final deprecated android.database.Cursor managedQuery(android.net.Uri, java.lang.String[], java.lang.String, java.lang.String[], java.lang.String);
method public boolean moveTaskToBack(boolean);
+ method public boolean navigateUpTo(android.content.Intent);
+ method public boolean navigateUpToFromChild(android.app.Activity, android.content.Intent);
method public void onActionModeFinished(android.view.ActionMode);
method public void onActionModeStarted(android.view.ActionMode);
method protected void onActivityResult(int, int, android.content.Intent);
@@ -2574,6 +2662,7 @@
method public java.lang.CharSequence onCreateDescription();
method protected deprecated android.app.Dialog onCreateDialog(int);
method protected deprecated android.app.Dialog onCreateDialog(int, android.os.Bundle);
+ method public void onCreateNavigateUpTaskStack(android.app.TaskStackBuilder);
method public boolean onCreateOptionsMenu(android.view.Menu);
method public boolean onCreatePanelMenu(int, android.view.Menu);
method public android.view.View onCreatePanelView(int);
@@ -2591,6 +2680,8 @@
method public void onLowMemory();
method public boolean onMenuItemSelected(int, android.view.MenuItem);
method public boolean onMenuOpened(int, android.view.Menu);
+ method public boolean onNavigateUp();
+ method public boolean onNavigateUpFromChild(android.app.Activity);
method protected void onNewIntent(android.content.Intent);
method public boolean onOptionsItemSelected(android.view.MenuItem);
method public void onOptionsMenuClosed(android.view.Menu);
@@ -2600,6 +2691,7 @@
method protected void onPostResume();
method protected deprecated void onPrepareDialog(int, android.app.Dialog);
method protected deprecated void onPrepareDialog(int, android.app.Dialog, android.os.Bundle);
+ method public void onPrepareNavigateUpTaskStack(android.app.TaskStackBuilder);
method public boolean onPrepareOptionsMenu(android.view.Menu);
method public boolean onPreparePanel(int, android.view.View, android.view.Menu);
method protected void onRestart();
@@ -2650,17 +2742,25 @@
method public void setTitleColor(int);
method public void setVisible(boolean);
method public final void setVolumeControlStream(int);
+ method public boolean shouldUpRecreateTask(android.content.Intent);
method public final deprecated void showDialog(int);
method public final deprecated boolean showDialog(int, android.os.Bundle);
method public android.view.ActionMode startActionMode(android.view.ActionMode.Callback);
method public void startActivityForResult(android.content.Intent, int);
+ method public void startActivityForResult(android.content.Intent, int, android.os.Bundle);
method public void startActivityFromChild(android.app.Activity, android.content.Intent, int);
+ method public void startActivityFromChild(android.app.Activity, android.content.Intent, int, android.os.Bundle);
method public void startActivityFromFragment(android.app.Fragment, android.content.Intent, int);
+ method public void startActivityFromFragment(android.app.Fragment, android.content.Intent, int, android.os.Bundle);
method public boolean startActivityIfNeeded(android.content.Intent, int);
+ method public boolean startActivityIfNeeded(android.content.Intent, int, android.os.Bundle);
method public void startIntentSenderForResult(android.content.IntentSender, int, android.content.Intent, int, int, int) throws android.content.IntentSender.SendIntentException;
+ method public void startIntentSenderForResult(android.content.IntentSender, int, android.content.Intent, int, int, int, android.os.Bundle) throws android.content.IntentSender.SendIntentException;
method public void startIntentSenderFromChild(android.app.Activity, android.content.IntentSender, int, android.content.Intent, int, int, int) throws android.content.IntentSender.SendIntentException;
+ method public void startIntentSenderFromChild(android.app.Activity, android.content.IntentSender, int, android.content.Intent, int, int, int, android.os.Bundle) throws android.content.IntentSender.SendIntentException;
method public deprecated void startManagingCursor(android.database.Cursor);
method public boolean startNextMatchingActivity(android.content.Intent);
+ method public boolean startNextMatchingActivity(android.content.Intent, android.os.Bundle);
method public void startSearch(java.lang.String, boolean, android.os.Bundle, boolean);
method public deprecated void stopManagingCursor(android.database.Cursor);
method public void takeKeyEvents(boolean);
@@ -2691,6 +2791,7 @@
method public int getLauncherLargeIconSize();
method public int getMemoryClass();
method public void getMemoryInfo(android.app.ActivityManager.MemoryInfo);
+ method public static void getMyMemoryState(android.app.ActivityManager.RunningAppProcessInfo);
method public android.os.Debug.MemoryInfo[] getProcessMemoryInfo(int[]);
method public java.util.List<android.app.ActivityManager.ProcessErrorStateInfo> getProcessesInErrorState();
method public java.util.List<android.app.ActivityManager.RecentTaskInfo> getRecentTasks(int, int) throws java.lang.SecurityException;
@@ -2702,6 +2803,7 @@
method public static boolean isUserAMonkey();
method public void killBackgroundProcesses(java.lang.String);
method public void moveTaskToFront(int, int);
+ method public void moveTaskToFront(int, int, android.os.Bundle);
method public deprecated void restartPackage(java.lang.String);
field public static final int MOVE_TASK_NO_USER_ACTION = 2; // 0x2
field public static final int MOVE_TASK_WITH_HOME = 1; // 0x1
@@ -2718,6 +2820,7 @@
field public long availMem;
field public boolean lowMemory;
field public long threshold;
+ field public long totalMem;
}
public static class ActivityManager.ProcessErrorStateInfo implements android.os.Parcelable {
@@ -2773,6 +2876,7 @@
field public int importanceReasonCode;
field public android.content.ComponentName importanceReasonComponent;
field public int importanceReasonPid;
+ field public int lastTrimLevel;
field public int lru;
field public int pid;
field public java.lang.String[] pkgList;
@@ -2821,6 +2925,14 @@
field public android.content.ComponentName topActivity;
}
+ public class ActivityOptions {
+ method public static android.app.ActivityOptions makeCustomAnimation(android.content.Context, int, int);
+ method public static android.app.ActivityOptions makeScaleUpAnimation(android.view.View, int, int, int, int);
+ method public static android.app.ActivityOptions makeThumbnailScaleUpAnimation(android.view.View, android.graphics.Bitmap, int, int);
+ method public android.os.Bundle toBundle();
+ method public void update(android.app.ActivityOptions);
+ }
+
public class AlarmManager {
method public void cancel(android.app.PendingIntent);
method public void set(int, long, android.app.PendingIntent);
@@ -3186,6 +3298,7 @@
method public android.app.DownloadManager.Request addRequestHeader(java.lang.String, java.lang.String);
method public void allowScanningByMediaScanner();
method public android.app.DownloadManager.Request setAllowedNetworkTypes(int);
+ method public android.app.DownloadManager.Request setAllowedOverMetered(boolean);
method public android.app.DownloadManager.Request setAllowedOverRoaming(boolean);
method public android.app.DownloadManager.Request setDescription(java.lang.CharSequence);
method public android.app.DownloadManager.Request setDestinationInExternalFilesDir(android.content.Context, java.lang.String, java.lang.String);
@@ -3235,6 +3348,7 @@
method public final android.app.Fragment getTargetFragment();
method public final int getTargetRequestCode();
method public final java.lang.CharSequence getText(int);
+ method public boolean getUserVisibleHint();
method public android.view.View getView();
method public final int hashCode();
method public static android.app.Fragment instantiate(android.content.Context, java.lang.String);
@@ -3281,8 +3395,11 @@
method public void setMenuVisibility(boolean);
method public void setRetainInstance(boolean);
method public void setTargetFragment(android.app.Fragment, int);
+ method public void setUserVisibleHint(boolean);
method public void startActivity(android.content.Intent);
+ method public void startActivity(android.content.Intent, android.os.Bundle);
method public void startActivityForResult(android.content.Intent, int);
+ method public void startActivityForResult(android.content.Intent, int, android.os.Bundle);
method public void unregisterForContextMenu(android.view.View);
}
@@ -3599,14 +3716,21 @@
field public static final int DEFAULT_VIBRATE = 2; // 0x2
field public static final int FLAG_AUTO_CANCEL = 16; // 0x10
field public static final int FLAG_FOREGROUND_SERVICE = 64; // 0x40
- field public static final int FLAG_HIGH_PRIORITY = 128; // 0x80
+ field public static final deprecated int FLAG_HIGH_PRIORITY = 128; // 0x80
field public static final int FLAG_INSISTENT = 4; // 0x4
field public static final int FLAG_NO_CLEAR = 32; // 0x20
field public static final int FLAG_ONGOING_EVENT = 2; // 0x2
field public static final int FLAG_ONLY_ALERT_ONCE = 8; // 0x8
field public static final int FLAG_SHOW_LIGHTS = 1; // 0x1
+ field public static final java.lang.String KIND_PROMO = "android.promo";
+ field public static final int PRIORITY_DEFAULT = 0; // 0x0
+ field public static final int PRIORITY_HIGH = 1; // 0x1
+ field public static final int PRIORITY_LOW = -1; // 0xffffffff
+ field public static final int PRIORITY_MAX = 2; // 0x2
+ field public static final int PRIORITY_MIN = -2; // 0xfffffffe
field public static final int STREAM_DEFAULT = -1; // 0xffffffff
field public int audioStreamType;
+ field public android.widget.RemoteViews bigContentView;
field public android.app.PendingIntent contentIntent;
field public android.widget.RemoteViews contentView;
field public int defaults;
@@ -3620,6 +3744,7 @@
field public int ledOffMS;
field public int ledOnMS;
field public int number;
+ field public int priority;
field public android.net.Uri sound;
field public java.lang.CharSequence tickerText;
field public android.widget.RemoteViews tickerView;
@@ -3627,9 +3752,29 @@
field public long when;
}
+ public static class Notification.BigPictureStyle extends android.app.Notification.Style {
+ ctor public Notification.BigPictureStyle();
+ ctor public Notification.BigPictureStyle(android.app.Notification.Builder);
+ method public android.app.Notification.BigPictureStyle bigPicture(android.graphics.Bitmap);
+ method public android.app.Notification build();
+ method public android.app.Notification.BigPictureStyle setBigContentTitle(java.lang.CharSequence);
+ method public android.app.Notification.BigPictureStyle setSummaryText(java.lang.CharSequence);
+ }
+
+ public static class Notification.BigTextStyle extends android.app.Notification.Style {
+ ctor public Notification.BigTextStyle();
+ ctor public Notification.BigTextStyle(android.app.Notification.Builder);
+ method public android.app.Notification.BigTextStyle bigText(java.lang.CharSequence);
+ method public android.app.Notification build();
+ method public android.app.Notification.BigTextStyle setBigContentTitle(java.lang.CharSequence);
+ method public android.app.Notification.BigTextStyle setSummaryText(java.lang.CharSequence);
+ }
+
public static class Notification.Builder {
ctor public Notification.Builder(android.content.Context);
- method public android.app.Notification getNotification();
+ method public android.app.Notification.Builder addAction(int, java.lang.CharSequence, android.app.PendingIntent);
+ method public android.app.Notification build();
+ method public deprecated android.app.Notification getNotification();
method public android.app.Notification.Builder setAutoCancel(boolean);
method public android.app.Notification.Builder setContent(android.widget.RemoteViews);
method public android.app.Notification.Builder setContentInfo(java.lang.CharSequence);
@@ -3644,17 +3789,41 @@
method public android.app.Notification.Builder setNumber(int);
method public android.app.Notification.Builder setOngoing(boolean);
method public android.app.Notification.Builder setOnlyAlertOnce(boolean);
+ method public android.app.Notification.Builder setPriority(int);
method public android.app.Notification.Builder setProgress(int, int, boolean);
method public android.app.Notification.Builder setSmallIcon(int);
method public android.app.Notification.Builder setSmallIcon(int, int);
method public android.app.Notification.Builder setSound(android.net.Uri);
method public android.app.Notification.Builder setSound(android.net.Uri, int);
+ method public android.app.Notification.Builder setStyle(android.app.Notification.Style);
+ method public android.app.Notification.Builder setSubText(java.lang.CharSequence);
method public android.app.Notification.Builder setTicker(java.lang.CharSequence);
method public android.app.Notification.Builder setTicker(java.lang.CharSequence, android.widget.RemoteViews);
+ method public android.app.Notification.Builder setUsesChronometer(boolean);
method public android.app.Notification.Builder setVibrate(long[]);
method public android.app.Notification.Builder setWhen(long);
}
+ public static class Notification.InboxStyle extends android.app.Notification.Style {
+ ctor public Notification.InboxStyle();
+ ctor public Notification.InboxStyle(android.app.Notification.Builder);
+ method public android.app.Notification.InboxStyle addLine(java.lang.CharSequence);
+ method public android.app.Notification build();
+ method public android.app.Notification.InboxStyle setBigContentTitle(java.lang.CharSequence);
+ method public android.app.Notification.InboxStyle setSummaryText(java.lang.CharSequence);
+ }
+
+ public static abstract class Notification.Style {
+ ctor public Notification.Style();
+ method public abstract android.app.Notification build();
+ method protected void checkBuilder();
+ method protected android.widget.RemoteViews getStandardView(int);
+ method protected void internalSetBigContentTitle(java.lang.CharSequence);
+ method protected void internalSetSummaryText(java.lang.CharSequence);
+ method public void setBuilder(android.app.Notification.Builder);
+ field protected android.app.Notification.Builder mBuilder;
+ }
+
public class NotificationManager {
method public void cancel(int);
method public void cancel(java.lang.String, int);
@@ -3667,7 +3836,9 @@
method public void cancel();
method public int describeContents();
method public static android.app.PendingIntent getActivities(android.content.Context, int, android.content.Intent[], int);
+ method public static android.app.PendingIntent getActivities(android.content.Context, int, android.content.Intent[], int, android.os.Bundle);
method public static android.app.PendingIntent getActivity(android.content.Context, int, android.content.Intent, int);
+ method public static android.app.PendingIntent getActivity(android.content.Context, int, android.content.Intent, int, android.os.Bundle);
method public static android.app.PendingIntent getBroadcast(android.content.Context, int, android.content.Intent, int);
method public android.content.IntentSender getIntentSender();
method public static android.app.PendingIntent getService(android.content.Context, int, android.content.Intent, int);
@@ -3726,6 +3897,7 @@
}
public class SearchManager implements android.content.DialogInterface.OnCancelListener android.content.DialogInterface.OnDismissListener {
+ method public android.content.ComponentName getGlobalSearchActivity();
method public android.app.SearchableInfo getSearchableInfo(android.content.ComponentName);
method public java.util.List<android.app.SearchableInfo> getSearchablesInGlobalSearch();
method public deprecated void onCancel(android.content.DialogInterface);
@@ -3749,6 +3921,7 @@
field public static final java.lang.String INTENT_ACTION_SEARCH_SETTINGS = "android.search.action.SEARCH_SETTINGS";
field public static final java.lang.String INTENT_ACTION_SEARCH_SETTINGS_CHANGED = "android.search.action.SETTINGS_CHANGED";
field public static final java.lang.String INTENT_ACTION_WEB_SEARCH_SETTINGS = "android.search.action.WEB_SEARCH_SETTINGS";
+ field public static final java.lang.String INTENT_GLOBAL_SEARCH_ACTIVITY_CHANGED = "android.search.action.GLOBAL_SEARCH_ACTIVITY_CHANGED";
field public static final char MENU_KEY = 115; // 0x0073 's'
field public static final int MENU_KEYCODE = 47; // 0x2f
field public static final java.lang.String QUERY = "query";
@@ -3851,6 +4024,22 @@
method public void setDefaultTab(int);
}
+ public class TaskStackBuilder {
+ method public android.app.TaskStackBuilder addNextIntent(android.content.Intent);
+ method public android.app.TaskStackBuilder addNextIntentWithParentStack(android.content.Intent);
+ method public android.app.TaskStackBuilder addParentStack(android.app.Activity);
+ method public android.app.TaskStackBuilder addParentStack(java.lang.Class<?>);
+ method public android.app.TaskStackBuilder addParentStack(android.content.ComponentName);
+ method public static android.app.TaskStackBuilder create(android.content.Context);
+ method public android.content.Intent editIntentAt(int);
+ method public int getIntentCount();
+ method public android.content.Intent[] getIntents();
+ method public android.app.PendingIntent getPendingIntent(int, int);
+ method public android.app.PendingIntent getPendingIntent(int, int, android.os.Bundle);
+ method public void startActivities();
+ method public void startActivities(android.os.Bundle);
+ }
+
public class TimePickerDialog extends android.app.AlertDialog implements android.content.DialogInterface.OnClickListener android.widget.TimePicker.OnTimeChangedListener {
ctor public TimePickerDialog(android.content.Context, android.app.TimePickerDialog.OnTimeSetListener, int, int, boolean);
ctor public TimePickerDialog(android.content.Context, int, android.app.TimePickerDialog.OnTimeSetListener, int, int, boolean);
@@ -3917,10 +4106,12 @@
method public void setWallpaperOffsetSteps(float, float);
method public void setWallpaperOffsets(android.os.IBinder, float, float);
method public void suggestDesiredDimensions(int, int);
+ field public static final java.lang.String ACTION_CHANGE_LIVE_WALLPAPER = "android.service.wallpaper.CHANGE_LIVE_WALLPAPER";
field public static final java.lang.String ACTION_LIVE_WALLPAPER_CHOOSER = "android.service.wallpaper.LIVE_WALLPAPER_CHOOSER";
field public static final java.lang.String COMMAND_DROP = "android.home.drop";
field public static final java.lang.String COMMAND_SECONDARY_TAP = "android.wallpaper.secondaryTap";
field public static final java.lang.String COMMAND_TAP = "android.wallpaper.tap";
+ field public static final java.lang.String EXTRA_LIVE_WALLPAPER_COMPONENT = "android.service.wallpaper.extra.LIVE_WALLPAPER_COMPONENT";
field public static final java.lang.String WALLPAPER_PREVIEW_META_DATA = "android.wallpaper.preview";
}
@@ -4143,16 +4334,21 @@
ctor public AppWidgetHostView(android.content.Context, int, int);
method public int getAppWidgetId();
method public android.appwidget.AppWidgetProviderInfo getAppWidgetInfo();
+ method public static android.graphics.Rect getDefaultPaddingForWidget(android.content.Context, android.content.ComponentName, android.graphics.Rect);
method protected android.view.View getDefaultView();
method protected android.view.View getErrorView();
method protected void prepareView(android.view.View);
method public void setAppWidget(int, android.appwidget.AppWidgetProviderInfo);
method public void updateAppWidget(android.widget.RemoteViews);
+ method public void updateAppWidgetOptions(android.os.Bundle);
+ method public void updateAppWidgetSize(android.os.Bundle, int, int, int, int);
}
public class AppWidgetManager {
+ method public boolean bindAppWidgetIdIfAllowed(int, android.content.ComponentName);
method public int[] getAppWidgetIds(android.content.ComponentName);
method public android.appwidget.AppWidgetProviderInfo getAppWidgetInfo(int);
+ method public android.os.Bundle getAppWidgetOptions(int);
method public java.util.List<android.appwidget.AppWidgetProviderInfo> getInstalledProviders();
method public static android.appwidget.AppWidgetManager getInstance(android.content.Context);
method public void notifyAppWidgetViewDataChanged(int[], int);
@@ -4162,22 +4358,32 @@
method public void updateAppWidget(int[], android.widget.RemoteViews);
method public void updateAppWidget(int, android.widget.RemoteViews);
method public void updateAppWidget(android.content.ComponentName, android.widget.RemoteViews);
+ method public void updateAppWidgetOptions(int, android.os.Bundle);
+ field public static final java.lang.String ACTION_APPWIDGET_BIND = "android.appwidget.action.APPWIDGET_BIND";
field public static final java.lang.String ACTION_APPWIDGET_CONFIGURE = "android.appwidget.action.APPWIDGET_CONFIGURE";
field public static final java.lang.String ACTION_APPWIDGET_DELETED = "android.appwidget.action.APPWIDGET_DELETED";
field public static final java.lang.String ACTION_APPWIDGET_DISABLED = "android.appwidget.action.APPWIDGET_DISABLED";
field public static final java.lang.String ACTION_APPWIDGET_ENABLED = "android.appwidget.action.APPWIDGET_ENABLED";
+ field public static final java.lang.String ACTION_APPWIDGET_OPTIONS_CHANGED = "android.appwidget.action.APPWIDGET_UPDATE_OPTIONS";
field public static final java.lang.String ACTION_APPWIDGET_PICK = "android.appwidget.action.APPWIDGET_PICK";
field public static final java.lang.String ACTION_APPWIDGET_UPDATE = "android.appwidget.action.APPWIDGET_UPDATE";
field public static final java.lang.String EXTRA_APPWIDGET_ID = "appWidgetId";
field public static final java.lang.String EXTRA_APPWIDGET_IDS = "appWidgetIds";
+ field public static final java.lang.String EXTRA_APPWIDGET_OPTIONS = "appWidgetOptions";
+ field public static final java.lang.String EXTRA_APPWIDGET_PROVIDER = "appWidgetProvider";
field public static final java.lang.String EXTRA_CUSTOM_EXTRAS = "customExtras";
field public static final java.lang.String EXTRA_CUSTOM_INFO = "customInfo";
field public static final int INVALID_APPWIDGET_ID = 0; // 0x0
field public static final java.lang.String META_DATA_APPWIDGET_PROVIDER = "android.appwidget.provider";
+ field public static final java.lang.String OPTION_APPWIDGET_MAX_HEIGHT = "appWidgetMaxHeight";
+ field public static final java.lang.String OPTION_APPWIDGET_MAX_WIDTH = "appWidgetMaxWidth";
+ field public static final java.lang.String OPTION_APPWIDGET_MIN_HEIGHT = "appWidgetMinHeight";
+ field public static final java.lang.String OPTION_APPWIDGET_MIN_WIDTH = "appWidgetMinWidth";
}
public class AppWidgetProvider extends android.content.BroadcastReceiver {
ctor public AppWidgetProvider();
+ method public void onAppWidgetOptionsChanged(android.content.Context, android.appwidget.AppWidgetManager, int, android.os.Bundle);
method public void onDeleted(android.content.Context, int[]);
method public void onDisabled(android.content.Context);
method public void onEnabled(android.content.Context);
@@ -4238,6 +4444,7 @@
method public int getProfileConnectionState(int);
method public boolean getProfileProxy(android.content.Context, android.bluetooth.BluetoothProfile.ServiceListener, int);
method public android.bluetooth.BluetoothDevice getRemoteDevice(java.lang.String);
+ method public android.bluetooth.BluetoothDevice getRemoteDevice(byte[]);
method public int getScanMode();
method public int getState();
method public boolean isDiscovering();
@@ -4471,10 +4678,12 @@
method public android.bluetooth.BluetoothSocket createInsecureRfcommSocketToServiceRecord(java.util.UUID) throws java.io.IOException;
method public android.bluetooth.BluetoothSocket createRfcommSocketToServiceRecord(java.util.UUID) throws java.io.IOException;
method public int describeContents();
+ method public boolean fetchUuidsWithSdp();
method public java.lang.String getAddress();
method public android.bluetooth.BluetoothClass getBluetoothClass();
method public int getBondState();
method public java.lang.String getName();
+ method public android.os.ParcelUuid[] getUuids();
method public void writeToParcel(android.os.Parcel, int);
field public static final java.lang.String ACTION_ACL_CONNECTED = "android.bluetooth.device.action.ACL_CONNECTED";
field public static final java.lang.String ACTION_ACL_DISCONNECTED = "android.bluetooth.device.action.ACL_DISCONNECTED";
@@ -4483,6 +4692,7 @@
field public static final java.lang.String ACTION_CLASS_CHANGED = "android.bluetooth.device.action.CLASS_CHANGED";
field public static final java.lang.String ACTION_FOUND = "android.bluetooth.device.action.FOUND";
field public static final java.lang.String ACTION_NAME_CHANGED = "android.bluetooth.device.action.NAME_CHANGED";
+ field public static final java.lang.String ACTION_UUID = "android.bluetooth.device.action.UUID";
field public static final int BOND_BONDED = 12; // 0xc
field public static final int BOND_BONDING = 11; // 0xb
field public static final int BOND_NONE = 10; // 0xa
@@ -4494,6 +4704,7 @@
field public static final java.lang.String EXTRA_NAME = "android.bluetooth.device.extra.NAME";
field public static final java.lang.String EXTRA_PREVIOUS_BOND_STATE = "android.bluetooth.device.extra.PREVIOUS_BOND_STATE";
field public static final java.lang.String EXTRA_RSSI = "android.bluetooth.device.extra.RSSI";
+ field public static final java.lang.String EXTRA_UUID = "android.bluetooth.device.extra.UUID";
}
public final class BluetoothHeadset implements android.bluetooth.BluetoothProfile {
@@ -4646,7 +4857,8 @@
public abstract class AsyncTaskLoader extends android.content.Loader {
ctor public AsyncTaskLoader(android.content.Context);
- method public boolean cancelLoad();
+ method public void cancelLoadInBackground();
+ method public boolean isLoadInBackgroundCanceled();
method public abstract D loadInBackground();
method public void onCanceled(D);
method protected D onLoadInBackground();
@@ -4692,11 +4904,13 @@
public class ClipData implements android.os.Parcelable {
ctor public ClipData(java.lang.CharSequence, java.lang.String[], android.content.ClipData.Item);
ctor public ClipData(android.content.ClipDescription, android.content.ClipData.Item);
+ ctor public ClipData(android.content.ClipData);
method public void addItem(android.content.ClipData.Item);
method public int describeContents();
method public android.content.ClipDescription getDescription();
method public android.content.ClipData.Item getItemAt(int);
method public int getItemCount();
+ method public static android.content.ClipData newHtmlText(java.lang.CharSequence, java.lang.CharSequence, java.lang.String);
method public static android.content.ClipData newIntent(java.lang.CharSequence, android.content.Intent);
method public static android.content.ClipData newPlainText(java.lang.CharSequence, java.lang.CharSequence);
method public static android.content.ClipData newRawUri(java.lang.CharSequence, android.net.Uri);
@@ -4707,10 +4921,15 @@
public static class ClipData.Item {
ctor public ClipData.Item(java.lang.CharSequence);
+ ctor public ClipData.Item(java.lang.CharSequence, java.lang.String);
ctor public ClipData.Item(android.content.Intent);
ctor public ClipData.Item(android.net.Uri);
ctor public ClipData.Item(java.lang.CharSequence, android.content.Intent, android.net.Uri);
+ ctor public ClipData.Item(java.lang.CharSequence, java.lang.String, android.content.Intent, android.net.Uri);
+ method public java.lang.String coerceToHtmlText(android.content.Context);
+ method public java.lang.CharSequence coerceToStyledText(android.content.Context);
method public java.lang.CharSequence coerceToText(android.content.Context);
+ method public java.lang.String getHtmlText();
method public android.content.Intent getIntent();
method public java.lang.CharSequence getText();
method public android.net.Uri getUri();
@@ -4728,6 +4947,7 @@
method public boolean hasMimeType(java.lang.String);
method public void writeToParcel(android.os.Parcel, int);
field public static final android.os.Parcelable.Creator CREATOR;
+ field public static final java.lang.String MIMETYPE_TEXT_HTML = "text/html";
field public static final java.lang.String MIMETYPE_TEXT_INTENT = "text/vnd.android.intent";
field public static final java.lang.String MIMETYPE_TEXT_PLAIN = "text/plain";
field public static final java.lang.String MIMETYPE_TEXT_URILIST = "text/uri-list";
@@ -4759,6 +4979,9 @@
field public static final int TRIM_MEMORY_BACKGROUND = 40; // 0x28
field public static final int TRIM_MEMORY_COMPLETE = 80; // 0x50
field public static final int TRIM_MEMORY_MODERATE = 60; // 0x3c
+ field public static final int TRIM_MEMORY_RUNNING_CRITICAL = 15; // 0xf
+ field public static final int TRIM_MEMORY_RUNNING_LOW = 10; // 0xa
+ field public static final int TRIM_MEMORY_RUNNING_MODERATE = 5; // 0x5
field public static final int TRIM_MEMORY_UI_HIDDEN = 20; // 0x14
}
@@ -4808,6 +5031,7 @@
method public android.os.ParcelFileDescriptor openPipeHelper(android.net.Uri, java.lang.String, android.os.Bundle, T, android.content.ContentProvider.PipeDataWriter<T>) throws java.io.FileNotFoundException;
method public android.content.res.AssetFileDescriptor openTypedAssetFile(android.net.Uri, java.lang.String, android.os.Bundle) throws java.io.FileNotFoundException;
method public abstract android.database.Cursor query(android.net.Uri, java.lang.String[], java.lang.String, java.lang.String[], java.lang.String);
+ method public android.database.Cursor query(android.net.Uri, java.lang.String[], java.lang.String, java.lang.String[], java.lang.String, android.os.CancellationSignal);
method protected final void setPathPermissions(android.content.pm.PathPermission[]);
method protected final void setReadPermission(java.lang.String);
method protected final void setWritePermission(java.lang.String);
@@ -4831,6 +5055,7 @@
method public android.os.ParcelFileDescriptor openFile(android.net.Uri, java.lang.String) throws java.io.FileNotFoundException, android.os.RemoteException;
method public final android.content.res.AssetFileDescriptor openTypedAssetFileDescriptor(android.net.Uri, java.lang.String, android.os.Bundle) throws java.io.FileNotFoundException, android.os.RemoteException;
method public android.database.Cursor query(android.net.Uri, java.lang.String[], java.lang.String, java.lang.String[], java.lang.String) throws android.os.RemoteException;
+ method public android.database.Cursor query(android.net.Uri, java.lang.String[], java.lang.String, java.lang.String[], java.lang.String, android.os.CancellationSignal) throws android.os.RemoteException;
method public boolean release();
method public int update(android.net.Uri, android.content.ContentValues, java.lang.String, java.lang.String[]) throws android.os.RemoteException;
}
@@ -4888,6 +5113,8 @@
ctor public ContentResolver(android.content.Context);
method public final android.content.ContentProviderClient acquireContentProviderClient(android.net.Uri);
method public final android.content.ContentProviderClient acquireContentProviderClient(java.lang.String);
+ method public final android.content.ContentProviderClient acquireUnstableContentProviderClient(android.net.Uri);
+ method public final android.content.ContentProviderClient acquireUnstableContentProviderClient(java.lang.String);
method public static void addPeriodicSync(android.accounts.Account, java.lang.String, android.os.Bundle, long);
method public static java.lang.Object addStatusChangeListener(int, android.content.SyncStatusObserver);
method public android.content.ContentProviderResult[] applyBatch(java.lang.String, java.util.ArrayList<android.content.ContentProviderOperation>) throws android.content.OperationApplicationException, android.os.RemoteException;
@@ -4917,6 +5144,7 @@
method public final java.io.OutputStream openOutputStream(android.net.Uri, java.lang.String) throws java.io.FileNotFoundException;
method public final android.content.res.AssetFileDescriptor openTypedAssetFileDescriptor(android.net.Uri, java.lang.String, android.os.Bundle) throws java.io.FileNotFoundException;
method public final android.database.Cursor query(android.net.Uri, java.lang.String[], java.lang.String, java.lang.String[], java.lang.String);
+ method public final android.database.Cursor query(android.net.Uri, java.lang.String[], java.lang.String, java.lang.String[], java.lang.String, android.os.CancellationSignal);
method public final void registerContentObserver(android.net.Uri, boolean, android.database.ContentObserver);
method public static void removePeriodicSync(android.accounts.Account, java.lang.String, android.os.Bundle);
method public static void removeStatusChangeListener(java.lang.Object);
@@ -5070,9 +5298,12 @@
method public abstract deprecated void setWallpaper(android.graphics.Bitmap) throws java.io.IOException;
method public abstract deprecated void setWallpaper(java.io.InputStream) throws java.io.IOException;
method public abstract void startActivities(android.content.Intent[]);
+ method public abstract void startActivities(android.content.Intent[], android.os.Bundle);
method public abstract void startActivity(android.content.Intent);
+ method public abstract void startActivity(android.content.Intent, android.os.Bundle);
method public abstract boolean startInstrumentation(android.content.ComponentName, java.lang.String, android.os.Bundle);
method public abstract void startIntentSender(android.content.IntentSender, android.content.Intent, int, int, int) throws android.content.IntentSender.SendIntentException;
+ method public abstract void startIntentSender(android.content.IntentSender, android.content.Intent, int, int, int, android.os.Bundle) throws android.content.IntentSender.SendIntentException;
method public abstract android.content.ComponentName startService(android.content.Intent);
method public abstract boolean stopService(android.content.Intent);
method public abstract void unbindService(android.content.ServiceConnection);
@@ -5100,16 +5331,19 @@
field public static final java.lang.String DOWNLOAD_SERVICE = "download";
field public static final java.lang.String DROPBOX_SERVICE = "dropbox";
field public static final java.lang.String INPUT_METHOD_SERVICE = "input_method";
+ field public static final java.lang.String INPUT_SERVICE = "input";
field public static final java.lang.String KEYGUARD_SERVICE = "keyguard";
field public static final java.lang.String LAYOUT_INFLATER_SERVICE = "layout_inflater";
field public static final java.lang.String LOCATION_SERVICE = "location";
field public static final int MODE_APPEND = 32768; // 0x8000
+ field public static final int MODE_ENABLE_WRITE_AHEAD_LOGGING = 8; // 0x8
field public static final int MODE_MULTI_PROCESS = 4; // 0x4
field public static final int MODE_PRIVATE = 0; // 0x0
field public static final int MODE_WORLD_READABLE = 1; // 0x1
field public static final int MODE_WORLD_WRITEABLE = 2; // 0x2
field public static final java.lang.String NFC_SERVICE = "nfc";
field public static final java.lang.String NOTIFICATION_SERVICE = "notification";
+ field public static final java.lang.String NSD_SERVICE = "servicediscovery";
field public static final java.lang.String POWER_SERVICE = "power";
field public static final java.lang.String SEARCH_SERVICE = "search";
field public static final java.lang.String SENSOR_SERVICE = "sensor";
@@ -5195,9 +5429,12 @@
method public void setWallpaper(android.graphics.Bitmap) throws java.io.IOException;
method public void setWallpaper(java.io.InputStream) throws java.io.IOException;
method public void startActivities(android.content.Intent[]);
+ method public void startActivities(android.content.Intent[], android.os.Bundle);
method public void startActivity(android.content.Intent);
+ method public void startActivity(android.content.Intent, android.os.Bundle);
method public boolean startInstrumentation(android.content.ComponentName, java.lang.String, android.os.Bundle);
method public void startIntentSender(android.content.IntentSender, android.content.Intent, int, int, int) throws android.content.IntentSender.SendIntentException;
+ method public void startIntentSender(android.content.IntentSender, android.content.Intent, int, int, int, android.os.Bundle) throws android.content.IntentSender.SendIntentException;
method public android.content.ComponentName startService(android.content.Intent);
method public boolean stopService(android.content.Intent);
method public void unbindService(android.content.ServiceConnection);
@@ -5303,6 +5540,7 @@
method public java.lang.CharSequence[] getCharSequenceArrayExtra(java.lang.String);
method public java.util.ArrayList<java.lang.CharSequence> getCharSequenceArrayListExtra(java.lang.String);
method public java.lang.CharSequence getCharSequenceExtra(java.lang.String);
+ method public android.content.ClipData getClipData();
method public android.content.ComponentName getComponent();
method public android.net.Uri getData();
method public java.lang.String getDataString();
@@ -5324,6 +5562,7 @@
method public java.util.ArrayList<T> getParcelableArrayListExtra(java.lang.String);
method public T getParcelableExtra(java.lang.String);
method public java.lang.String getScheme();
+ method public android.content.Intent getSelector();
method public java.io.Serializable getSerializableExtra(java.lang.String);
method public short[] getShortArrayExtra(java.lang.String);
method public short getShortExtra(java.lang.String, short);
@@ -5336,7 +5575,9 @@
method public boolean hasExtra(java.lang.String);
method public boolean hasFileDescriptors();
method public static android.content.Intent makeMainActivity(android.content.ComponentName);
+ method public static android.content.Intent makeMainSelectorActivity(java.lang.String, java.lang.String);
method public static android.content.Intent makeRestartActivityTask(android.content.ComponentName);
+ method public static java.lang.String normalizeMimeType(java.lang.String);
method public static android.content.Intent parseIntent(android.content.res.Resources, org.xmlpull.v1.XmlPullParser, android.util.AttributeSet) throws java.io.IOException, org.xmlpull.v1.XmlPullParserException;
method public static android.content.Intent parseUri(java.lang.String, int) throws java.net.URISyntaxException;
method public android.content.Intent putCharSequenceArrayListExtra(java.lang.String, java.util.ArrayList<java.lang.CharSequence>);
@@ -5383,14 +5624,19 @@
method public android.content.Intent setClass(android.content.Context, java.lang.Class<?>);
method public android.content.Intent setClassName(android.content.Context, java.lang.String);
method public android.content.Intent setClassName(java.lang.String, java.lang.String);
+ method public void setClipData(android.content.ClipData);
method public android.content.Intent setComponent(android.content.ComponentName);
method public android.content.Intent setData(android.net.Uri);
+ method public android.content.Intent setDataAndNormalize(android.net.Uri);
method public android.content.Intent setDataAndType(android.net.Uri, java.lang.String);
+ method public android.content.Intent setDataAndTypeAndNormalize(android.net.Uri, java.lang.String);
method public void setExtrasClassLoader(java.lang.ClassLoader);
method public android.content.Intent setFlags(int);
method public android.content.Intent setPackage(java.lang.String);
+ method public void setSelector(android.content.Intent);
method public void setSourceBounds(android.graphics.Rect);
method public android.content.Intent setType(java.lang.String);
+ method public android.content.Intent setTypeAndNormalize(java.lang.String);
method public deprecated java.lang.String toURI();
method public java.lang.String toUri(int);
method public void writeToParcel(android.os.Parcel, int);
@@ -5398,6 +5644,7 @@
field public static final java.lang.String ACTION_ALL_APPS = "android.intent.action.ALL_APPS";
field public static final java.lang.String ACTION_ANSWER = "android.intent.action.ANSWER";
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_BATTERY_CHANGED = "android.intent.action.BATTERY_CHANGED";
field public static final java.lang.String ACTION_BATTERY_LOW = "android.intent.action.BATTERY_LOW";
@@ -5489,10 +5736,19 @@
field public static final java.lang.String ACTION_USER_PRESENT = "android.intent.action.USER_PRESENT";
field public static final java.lang.String ACTION_VIEW = "android.intent.action.VIEW";
field public static final java.lang.String ACTION_VOICE_COMMAND = "android.intent.action.VOICE_COMMAND";
- field public static final java.lang.String ACTION_WALLPAPER_CHANGED = "android.intent.action.WALLPAPER_CHANGED";
+ field public static final deprecated java.lang.String ACTION_WALLPAPER_CHANGED = "android.intent.action.WALLPAPER_CHANGED";
field public static final java.lang.String ACTION_WEB_SEARCH = "android.intent.action.WEB_SEARCH";
field public static final java.lang.String CATEGORY_ALTERNATIVE = "android.intent.category.ALTERNATIVE";
+ field public static final java.lang.String CATEGORY_APP_BROWSER = "android.intent.category.APP_BROWSER";
+ field public static final java.lang.String CATEGORY_APP_CALCULATOR = "android.intent.category.APP_CALCULATOR";
+ field public static final java.lang.String CATEGORY_APP_CALENDAR = "android.intent.category.APP_CALENDAR";
+ field public static final java.lang.String CATEGORY_APP_CONTACTS = "android.intent.category.APP_CONTACTS";
+ field public static final java.lang.String CATEGORY_APP_EMAIL = "android.intent.category.APP_EMAIL";
+ field public static final java.lang.String CATEGORY_APP_GALLERY = "android.intent.category.APP_GALLERY";
+ field public static final java.lang.String CATEGORY_APP_MAPS = "android.intent.category.APP_MAPS";
field public static final java.lang.String CATEGORY_APP_MARKET = "android.intent.category.APP_MARKET";
+ field public static final java.lang.String CATEGORY_APP_MESSAGING = "android.intent.category.APP_MESSAGING";
+ field public static final java.lang.String CATEGORY_APP_MUSIC = "android.intent.category.APP_MUSIC";
field public static final java.lang.String CATEGORY_BROWSABLE = "android.intent.category.BROWSABLE";
field public static final java.lang.String CATEGORY_CAR_DOCK = "android.intent.category.CAR_DOCK";
field public static final java.lang.String CATEGORY_CAR_MODE = "android.intent.category.CAR_MODE";
@@ -5516,7 +5772,7 @@
field public static final java.lang.String CATEGORY_UNIT_TEST = "android.intent.category.UNIT_TEST";
field public static final android.os.Parcelable.Creator CREATOR;
field public static final java.lang.String EXTRA_ALARM_COUNT = "android.intent.extra.ALARM_COUNT";
- field public static final java.lang.String EXTRA_ALLOW_REPLACE = "android.intent.extra.ALLOW_REPLACE";
+ field public static final deprecated java.lang.String EXTRA_ALLOW_REPLACE = "android.intent.extra.ALLOW_REPLACE";
field public static final java.lang.String EXTRA_BCC = "android.intent.extra.BCC";
field public static final java.lang.String EXTRA_BUG_REPORT = "android.intent.extra.BUG_REPORT";
field public static final java.lang.String EXTRA_CC = "android.intent.extra.CC";
@@ -5533,6 +5789,7 @@
field public static final int EXTRA_DOCK_STATE_UNDOCKED = 0; // 0x0
field public static final java.lang.String EXTRA_DONT_KILL_APP = "android.intent.extra.DONT_KILL_APP";
field public static final java.lang.String EXTRA_EMAIL = "android.intent.extra.EMAIL";
+ field public static final java.lang.String EXTRA_HTML_TEXT = "android.intent.extra.HTML_TEXT";
field public static final java.lang.String EXTRA_INITIAL_INTENTS = "android.intent.extra.INITIAL_INTENTS";
field public static final java.lang.String EXTRA_INSTALLER_PACKAGE_NAME = "android.intent.extra.INSTALLER_PACKAGE_NAME";
field public static final java.lang.String EXTRA_INTENT = "android.intent.extra.INTENT";
@@ -5555,9 +5812,11 @@
field public static final java.lang.String EXTRA_UID = "android.intent.extra.UID";
field public static final int FILL_IN_ACTION = 1; // 0x1
field public static final int FILL_IN_CATEGORIES = 4; // 0x4
+ field public static final int FILL_IN_CLIP_DATA = 128; // 0x80
field public static final int FILL_IN_COMPONENT = 8; // 0x8
field public static final int FILL_IN_DATA = 2; // 0x2
field public static final int FILL_IN_PACKAGE = 16; // 0x10
+ field public static final int FILL_IN_SELECTOR = 64; // 0x40
field public static final int FILL_IN_SOURCE_BOUNDS = 32; // 0x20
field public static final int FLAG_ACTIVITY_BROUGHT_TO_FRONT = 4194304; // 0x400000
field public static final int FLAG_ACTIVITY_CLEAR_TASK = 32768; // 0x8000
@@ -5582,6 +5841,7 @@
field public static final int FLAG_GRANT_READ_URI_PERMISSION = 1; // 0x1
field public static final int FLAG_GRANT_WRITE_URI_PERMISSION = 2; // 0x2
field public static final int FLAG_INCLUDE_STOPPED_PACKAGES = 32; // 0x20
+ field public static final int FLAG_RECEIVER_FOREGROUND = 268435456; // 0x10000000
field public static final int FLAG_RECEIVER_REGISTERED_ONLY = 1073741824; // 0x40000000
field public static final int FLAG_RECEIVER_REPLACE_PENDING = 536870912; // 0x20000000
field public static final java.lang.String METADATA_DOCK_HOME = "android.dock_home";
@@ -5706,7 +5966,9 @@
public class Loader {
ctor public Loader(android.content.Context);
method public void abandon();
+ method public boolean cancelLoad();
method public java.lang.String dataToString(D);
+ method public void deliverCancellation();
method public void deliverResult(D);
method public void dump(java.lang.String, java.io.FileDescriptor, java.io.PrintWriter, java.lang.String[]);
method public void forceLoad();
@@ -5716,23 +5978,30 @@
method public boolean isReset();
method public boolean isStarted();
method protected void onAbandon();
+ method protected boolean onCancelLoad();
method public void onContentChanged();
method protected void onForceLoad();
method protected void onReset();
method protected void onStartLoading();
method protected void onStopLoading();
method public void registerListener(int, android.content.Loader.OnLoadCompleteListener<D>);
+ method public void registerOnLoadCanceledListener(android.content.Loader.OnLoadCanceledListener<D>);
method public void reset();
method public final void startLoading();
method public void stopLoading();
method public boolean takeContentChanged();
method public void unregisterListener(android.content.Loader.OnLoadCompleteListener<D>);
+ method public void unregisterOnLoadCanceledListener(android.content.Loader.OnLoadCanceledListener<D>);
}
public final class Loader.ForceLoadContentObserver extends android.database.ContentObserver {
ctor public Loader.ForceLoadContentObserver();
}
+ public static abstract interface Loader.OnLoadCanceledListener {
+ method public abstract void onLoadCanceled(android.content.Loader<D>);
+ }
+
public static abstract interface Loader.OnLoadCompleteListener {
method public abstract void onLoadComplete(android.content.Loader<D>, D);
}
@@ -5952,6 +6221,7 @@
field public int configChanges;
field public int flags;
field public int launchMode;
+ field public java.lang.String parentActivityName;
field public java.lang.String permission;
field public int screenOrientation;
field public int softInputMode;
@@ -6094,6 +6364,8 @@
method public int describeContents();
method public void writeToParcel(android.os.Parcel, int);
field public static final android.os.Parcelable.Creator CREATOR;
+ field public static final int REQUESTED_PERMISSION_GRANTED = 2; // 0x2
+ field public static final int REQUESTED_PERMISSION_REQUIRED = 1; // 0x1
field public android.content.pm.ActivityInfo[] activities;
field public android.content.pm.ApplicationInfo applicationInfo;
field public android.content.pm.ConfigurationInfo[] configPreferences;
@@ -6107,6 +6379,7 @@
field public android.content.pm.ActivityInfo[] receivers;
field public android.content.pm.FeatureInfo[] reqFeatures;
field public java.lang.String[] requestedPermissions;
+ field public int[] requestedPermissionsFlags;
field public android.content.pm.ServiceInfo[] services;
field public java.lang.String sharedUserId;
field public int sharedUserLabel;
@@ -6318,8 +6591,11 @@
method public int describeContents();
method public java.lang.CharSequence loadDescription(android.content.pm.PackageManager);
field public static final android.os.Parcelable.Creator CREATOR;
+ field public static final int FLAG_PERSONAL_INFO = 1; // 0x1
field public int descriptionRes;
+ field public int flags;
field public java.lang.CharSequence nonLocalizedDescription;
+ field public int priority;
}
public class PermissionInfo extends android.content.pm.PackageItemInfo implements android.os.Parcelable {
@@ -6329,6 +6605,10 @@
method public java.lang.CharSequence loadDescription(android.content.pm.PackageManager);
field public static final android.os.Parcelable.Creator CREATOR;
field public static final int PROTECTION_DANGEROUS = 1; // 0x1
+ field public static final int PROTECTION_FLAG_DEVELOPMENT = 32; // 0x20
+ field public static final int PROTECTION_FLAG_SYSTEM = 16; // 0x10
+ field public static final int PROTECTION_MASK_BASE = 15; // 0xf
+ field public static final int PROTECTION_MASK_FLAGS = 240; // 0xf0
field public static final int PROTECTION_NORMAL = 0; // 0x0
field public static final int PROTECTION_SIGNATURE = 2; // 0x2
field public static final int PROTECTION_SIGNATURE_OR_SYSTEM = 3; // 0x3
@@ -6388,6 +6668,7 @@
method public int describeContents();
method public void dump(android.util.Printer, java.lang.String);
field public static final android.os.Parcelable.Creator CREATOR;
+ field public static final int FLAG_ISOLATED_PROCESS = 2; // 0x2
field public static final int FLAG_STOP_WITH_TASK = 1; // 0x1
field public int flags;
field public java.lang.String permission;
@@ -6534,6 +6815,7 @@
field public static final int UI_MODE_NIGHT_NO = 16; // 0x10
field public static final int UI_MODE_NIGHT_UNDEFINED = 0; // 0x0
field public static final int UI_MODE_NIGHT_YES = 32; // 0x20
+ field public static final int UI_MODE_TYPE_APPLIANCE = 5; // 0x5
field public static final int UI_MODE_TYPE_CAR = 3; // 0x3
field public static final int UI_MODE_TYPE_DESK = 2; // 0x2
field public static final int UI_MODE_TYPE_MASK = 15; // 0xf
@@ -6588,6 +6870,7 @@
method public int getDimensionPixelSize(int) throws android.content.res.Resources.NotFoundException;
method public android.util.DisplayMetrics getDisplayMetrics();
method public android.graphics.drawable.Drawable getDrawable(int) throws android.content.res.Resources.NotFoundException;
+ method public android.graphics.drawable.Drawable getDrawableForDensity(int, int) throws android.content.res.Resources.NotFoundException;
method public float getFraction(int, int, int);
method public int getIdentifier(java.lang.String, java.lang.String, java.lang.String);
method public int[] getIntArray(int) throws android.content.res.Resources.NotFoundException;
@@ -6610,6 +6893,7 @@
method public java.lang.CharSequence[] getTextArray(int) throws android.content.res.Resources.NotFoundException;
method public void getValue(int, android.util.TypedValue, boolean) throws android.content.res.Resources.NotFoundException;
method public void getValue(java.lang.String, android.util.TypedValue, boolean) throws android.content.res.Resources.NotFoundException;
+ method public void getValueForDensity(int, int, android.util.TypedValue, boolean) throws android.content.res.Resources.NotFoundException;
method public android.content.res.XmlResourceParser getXml(int) throws android.content.res.Resources.NotFoundException;
method public final android.content.res.Resources.Theme newTheme();
method public android.content.res.TypedArray obtainAttributes(android.util.AttributeSet, int[]);
@@ -6726,9 +7010,9 @@
method public void unregisterDataSetObserver(android.database.DataSetObserver);
field protected boolean mClosed;
field protected android.content.ContentResolver mContentResolver;
- field protected java.lang.Long mCurrentRowID;
+ field protected deprecated java.lang.Long mCurrentRowID;
field protected int mPos;
- field protected int mRowIdColumnIndex;
+ field protected deprecated int mRowIdColumnIndex;
field protected deprecated java.util.HashMap mUpdatedRows;
}
@@ -6763,16 +7047,19 @@
public class ContentObservable extends android.database.Observable {
ctor public ContentObservable();
- method public void dispatchChange(boolean);
- method public void notifyChange(boolean);
+ method public deprecated void dispatchChange(boolean);
+ method public void dispatchChange(boolean, android.net.Uri);
+ method public deprecated void notifyChange(boolean);
method public void registerObserver(android.database.ContentObserver);
}
public abstract class ContentObserver {
ctor public ContentObserver(android.os.Handler);
method public boolean deliverSelfNotifications();
- method public final void dispatchChange(boolean);
+ method public final deprecated void dispatchChange(boolean);
+ method public final void dispatchChange(boolean, android.net.Uri);
method public void onChange(boolean);
+ method public void onChange(boolean, android.net.Uri);
}
public abstract interface CrossProcessCursor implements android.database.Cursor {
@@ -6781,10 +7068,17 @@
method public abstract boolean onMove(int, int);
}
- public abstract interface Cursor {
+ public class CrossProcessCursorWrapper extends android.database.CursorWrapper implements android.database.CrossProcessCursor {
+ ctor public CrossProcessCursorWrapper(android.database.Cursor);
+ method public void fillWindow(int, android.database.CursorWindow);
+ method public android.database.CursorWindow getWindow();
+ method public boolean onMove(int, int);
+ }
+
+ public abstract interface Cursor implements java.io.Closeable {
method public abstract void close();
method public abstract void copyStringToBuffer(int, android.database.CharArrayBuffer);
- method public abstract void deactivate();
+ method public abstract deprecated void deactivate();
method public abstract byte[] getBlob(int);
method public abstract int getColumnCount();
method public abstract int getColumnIndex(java.lang.String);
@@ -6850,10 +7144,10 @@
}
public class CursorWindow extends android.database.sqlite.SQLiteClosable implements android.os.Parcelable {
- ctor public CursorWindow(boolean);
+ ctor public CursorWindow(java.lang.String);
+ ctor public deprecated CursorWindow(boolean);
method public boolean allocRow();
method public void clear();
- method public void close();
method public void copyStringToBuffer(int, int, android.database.CharArrayBuffer);
method public int describeContents();
method public void freeLastRow();
@@ -7076,6 +7370,7 @@
public class SQLException extends java.lang.RuntimeException {
ctor public SQLException();
ctor public SQLException(java.lang.String);
+ ctor public SQLException(java.lang.String, java.lang.Throwable);
}
public class StaleDataException extends java.lang.RuntimeException {
@@ -7112,13 +7407,14 @@
ctor public SQLiteCantOpenDatabaseException(java.lang.String);
}
- public abstract class SQLiteClosable {
+ public abstract class SQLiteClosable implements java.io.Closeable {
ctor public SQLiteClosable();
method public void acquireReference();
+ method public void close();
method protected abstract void onAllReferencesReleased();
- method protected void onAllReferencesReleasedFromContainer();
+ method protected deprecated void onAllReferencesReleasedFromContainer();
method public void releaseReference();
- method public void releaseReferenceFromContainer();
+ method public deprecated void releaseReferenceFromContainer();
}
public class SQLiteConstraintException extends android.database.sqlite.SQLiteException {
@@ -7148,10 +7444,11 @@
method public void beginTransactionNonExclusive();
method public void beginTransactionWithListener(android.database.sqlite.SQLiteTransactionListener);
method public void beginTransactionWithListenerNonExclusive(android.database.sqlite.SQLiteTransactionListener);
- method public void close();
method public android.database.sqlite.SQLiteStatement compileStatement(java.lang.String) throws android.database.SQLException;
method public static android.database.sqlite.SQLiteDatabase create(android.database.sqlite.SQLiteDatabase.CursorFactory);
method public int delete(java.lang.String, java.lang.String, java.lang.String[]);
+ method public static boolean deleteDatabase(java.io.File);
+ method public void disableWriteAheadLogging();
method public boolean enableWriteAheadLogging();
method public void endTransaction();
method public void execSQL(java.lang.String) throws android.database.SQLException;
@@ -7169,9 +7466,10 @@
method public long insertWithOnConflict(java.lang.String, java.lang.String, android.content.ContentValues, int);
method public boolean isDatabaseIntegrityOk();
method public boolean isDbLockedByCurrentThread();
- method public boolean isDbLockedByOtherThreads();
+ method public deprecated boolean isDbLockedByOtherThreads();
method public boolean isOpen();
method public boolean isReadOnly();
+ method public boolean isWriteAheadLoggingEnabled();
method public deprecated void markTableSyncable(java.lang.String, java.lang.String);
method public deprecated void markTableSyncable(java.lang.String, java.lang.String, java.lang.String);
method public boolean needUpgrade(int);
@@ -7182,16 +7480,21 @@
method public static android.database.sqlite.SQLiteDatabase openOrCreateDatabase(java.lang.String, android.database.sqlite.SQLiteDatabase.CursorFactory);
method public static android.database.sqlite.SQLiteDatabase openOrCreateDatabase(java.lang.String, android.database.sqlite.SQLiteDatabase.CursorFactory, android.database.DatabaseErrorHandler);
method public android.database.Cursor query(boolean, java.lang.String, java.lang.String[], java.lang.String, java.lang.String[], java.lang.String, java.lang.String, java.lang.String, java.lang.String);
+ method public android.database.Cursor query(boolean, java.lang.String, java.lang.String[], java.lang.String, java.lang.String[], java.lang.String, java.lang.String, java.lang.String, java.lang.String, android.os.CancellationSignal);
method public android.database.Cursor query(java.lang.String, java.lang.String[], java.lang.String, java.lang.String[], java.lang.String, java.lang.String, java.lang.String);
method public android.database.Cursor query(java.lang.String, java.lang.String[], java.lang.String, java.lang.String[], java.lang.String, java.lang.String, java.lang.String, java.lang.String);
method public android.database.Cursor queryWithFactory(android.database.sqlite.SQLiteDatabase.CursorFactory, boolean, java.lang.String, java.lang.String[], java.lang.String, java.lang.String[], java.lang.String, java.lang.String, java.lang.String, java.lang.String);
+ method public android.database.Cursor queryWithFactory(android.database.sqlite.SQLiteDatabase.CursorFactory, boolean, java.lang.String, java.lang.String[], java.lang.String, java.lang.String[], java.lang.String, java.lang.String, java.lang.String, java.lang.String, android.os.CancellationSignal);
method public android.database.Cursor rawQuery(java.lang.String, java.lang.String[]);
+ method public android.database.Cursor rawQuery(java.lang.String, java.lang.String[], android.os.CancellationSignal);
method public android.database.Cursor rawQueryWithFactory(android.database.sqlite.SQLiteDatabase.CursorFactory, java.lang.String, java.lang.String[], java.lang.String);
+ method public android.database.Cursor rawQueryWithFactory(android.database.sqlite.SQLiteDatabase.CursorFactory, java.lang.String, java.lang.String[], java.lang.String, android.os.CancellationSignal);
method public static int releaseMemory();
method public long replace(java.lang.String, java.lang.String, android.content.ContentValues);
method public long replaceOrThrow(java.lang.String, java.lang.String, android.content.ContentValues) throws android.database.SQLException;
+ method public void setForeignKeyConstraintsEnabled(boolean);
method public void setLocale(java.util.Locale);
- method public void setLockingEnabled(boolean);
+ method public deprecated void setLockingEnabled(boolean);
method public void setMaxSqlCacheSize(int);
method public long setMaximumSize(long);
method public void setPageSize(long);
@@ -7209,6 +7512,7 @@
field public static final int CONFLICT_REPLACE = 5; // 0x5
field public static final int CONFLICT_ROLLBACK = 1; // 0x1
field public static final int CREATE_IF_NECESSARY = 268435456; // 0x10000000
+ field public static final int ENABLE_WRITE_AHEAD_LOGGING = 536870912; // 0x20000000
field public static final int MAX_SQL_CACHE_SIZE = 100; // 0x64
field public static final int NO_LOCALIZED_COLLATORS = 16; // 0x10
field public static final int OPEN_READONLY = 1; // 0x1
@@ -7248,6 +7552,7 @@
public class SQLiteException extends android.database.SQLException {
ctor public SQLiteException();
ctor public SQLiteException(java.lang.String);
+ ctor public SQLiteException(java.lang.String, java.lang.Throwable);
}
public class SQLiteFullException extends android.database.sqlite.SQLiteException {
@@ -7265,12 +7570,14 @@
ctor public SQLiteOpenHelper(android.content.Context, java.lang.String, android.database.sqlite.SQLiteDatabase.CursorFactory, int, android.database.DatabaseErrorHandler);
method public synchronized void close();
method public java.lang.String getDatabaseName();
- method public synchronized android.database.sqlite.SQLiteDatabase getReadableDatabase();
- method public synchronized android.database.sqlite.SQLiteDatabase getWritableDatabase();
+ method public android.database.sqlite.SQLiteDatabase getReadableDatabase();
+ method public android.database.sqlite.SQLiteDatabase getWritableDatabase();
+ method public void onConfigure(android.database.sqlite.SQLiteDatabase);
method public abstract void onCreate(android.database.sqlite.SQLiteDatabase);
method public void onDowngrade(android.database.sqlite.SQLiteDatabase, int, int);
method public void onOpen(android.database.sqlite.SQLiteDatabase);
method public abstract void onUpgrade(android.database.sqlite.SQLiteDatabase, int, int);
+ method public void setWriteAheadLoggingEnabled(boolean);
}
public class SQLiteOutOfMemoryException extends android.database.sqlite.SQLiteException {
@@ -7286,7 +7593,6 @@
method public void bindNull(int);
method public void bindString(int, java.lang.String);
method public void clearBindings();
- method public void close();
method public final deprecated int getUniqueId();
method protected void onAllReferencesReleased();
}
@@ -7308,6 +7614,7 @@
method public java.lang.String getTables();
method public android.database.Cursor query(android.database.sqlite.SQLiteDatabase, java.lang.String[], java.lang.String, java.lang.String[], java.lang.String, java.lang.String, java.lang.String);
method public android.database.Cursor query(android.database.sqlite.SQLiteDatabase, java.lang.String[], java.lang.String, java.lang.String[], java.lang.String, java.lang.String, java.lang.String, java.lang.String);
+ method public android.database.Cursor query(android.database.sqlite.SQLiteDatabase, java.lang.String[], java.lang.String, java.lang.String[], java.lang.String, java.lang.String, java.lang.String, java.lang.String, android.os.CancellationSignal);
method public void setCursorFactory(android.database.sqlite.SQLiteDatabase.CursorFactory);
method public void setDistinct(boolean);
method public void setProjectionMap(java.util.Map<java.lang.String, java.lang.String>);
@@ -7452,6 +7759,7 @@
method public java.lang.String getOriginalMimeType(android.net.Uri);
method public int openConvertSession(java.lang.String);
method public int processDrmInfo(android.drm.DrmInfo);
+ method public void release();
method public int removeAllRights();
method public int removeRights(java.lang.String);
method public int removeRights(android.net.Uri);
@@ -7488,11 +7796,11 @@
}
public class DrmStore {
- ctor public DrmStore();
+ ctor public deprecated DrmStore();
}
public static class DrmStore.Action {
- ctor public DrmStore.Action();
+ ctor public deprecated DrmStore.Action();
field public static final int DEFAULT = 0; // 0x0
field public static final int DISPLAY = 7; // 0x7
field public static final int EXECUTE = 6; // 0x6
@@ -7513,7 +7821,7 @@
}
public static class DrmStore.DrmObjectType {
- ctor public DrmStore.DrmObjectType();
+ ctor public deprecated DrmStore.DrmObjectType();
field public static final int CONTENT = 1; // 0x1
field public static final int RIGHTS_OBJECT = 2; // 0x2
field public static final int TRIGGER_OBJECT = 3; // 0x3
@@ -7521,7 +7829,7 @@
}
public static class DrmStore.Playback {
- ctor public DrmStore.Playback();
+ ctor public deprecated DrmStore.Playback();
field public static final int PAUSE = 2; // 0x2
field public static final int RESUME = 3; // 0x3
field public static final int START = 0; // 0x0
@@ -7529,7 +7837,7 @@
}
public static class DrmStore.RightsStatus {
- ctor public DrmStore.RightsStatus();
+ ctor public deprecated DrmStore.RightsStatus();
field public static final int RIGHTS_EXPIRED = 2; // 0x2
field public static final int RIGHTS_INVALID = 1; // 0x1
field public static final int RIGHTS_NOT_ACQUIRED = 3; // 0x3
@@ -7540,7 +7848,8 @@
ctor public DrmSupportInfo();
method public void addFileSuffix(java.lang.String);
method public void addMimeType(java.lang.String);
- method public java.lang.String getDescriprition();
+ method public deprecated java.lang.String getDescriprition();
+ method public java.lang.String getDescription();
method public java.util.Iterator<java.lang.String> getFileSuffixIterator();
method public java.util.Iterator<java.lang.String> getMimeTypeIterator();
method public void setDescription(java.lang.String);
@@ -7749,7 +8058,7 @@
package android.graphics {
- public class AvoidXfermode extends android.graphics.Xfermode {
+ public deprecated class AvoidXfermode extends android.graphics.Xfermode {
ctor public AvoidXfermode(int, int, android.graphics.AvoidXfermode.Mode);
}
@@ -7895,6 +8204,9 @@
ctor public Camera();
method public void applyToCanvas(android.graphics.Canvas);
method public float dotWithNormal(float, float, float);
+ method public float getLocationX();
+ method public float getLocationY();
+ method public float getLocationZ();
method public void getMatrix(android.graphics.Matrix);
method public void restore();
method public void rotate(float, float, float);
@@ -7945,8 +8257,8 @@
method public void drawPoint(float, float, android.graphics.Paint);
method public void drawPoints(float[], int, int, android.graphics.Paint);
method public void drawPoints(float[], android.graphics.Paint);
- method public void drawPosText(char[], int, int, float[], android.graphics.Paint);
- method public void drawPosText(java.lang.String, float[], android.graphics.Paint);
+ method public deprecated void drawPosText(char[], int, int, float[], android.graphics.Paint);
+ method public deprecated void drawPosText(java.lang.String, float[], android.graphics.Paint);
method public void drawRGB(int, int, int);
method public void drawRect(android.graphics.RectF, android.graphics.Paint);
method public void drawRect(android.graphics.Rect, android.graphics.Paint);
@@ -7964,8 +8276,8 @@
method public int getDensity();
method public android.graphics.DrawFilter getDrawFilter();
method public int getHeight();
- method public void getMatrix(android.graphics.Matrix);
- method public final android.graphics.Matrix getMatrix();
+ method public deprecated void getMatrix(android.graphics.Matrix);
+ method public final deprecated android.graphics.Matrix getMatrix();
method public int getMaximumBitmapHeight();
method public int getMaximumBitmapWidth();
method public int getSaveCount();
@@ -8295,7 +8607,7 @@
method public final boolean isDither();
method public final boolean isFakeBoldText();
method public final boolean isFilterBitmap();
- method public final boolean isLinearText();
+ method public final deprecated boolean isLinearText();
method public final boolean isStrikeThruText();
method public final boolean isSubpixelText();
method public final boolean isUnderlineText();
@@ -8315,7 +8627,7 @@
method public void setFilterBitmap(boolean);
method public void setFlags(int);
method public void setHinting(int);
- method public void setLinearText(boolean);
+ method public deprecated void setLinearText(boolean);
method public android.graphics.MaskFilter setMaskFilter(android.graphics.MaskFilter);
method public android.graphics.PathEffect setPathEffect(android.graphics.PathEffect);
method public android.graphics.Rasterizer setRasterizer(android.graphics.Rasterizer);
@@ -8508,14 +8820,14 @@
method public static void getPixelFormatInfo(int, android.graphics.PixelFormat);
field public static final int A_8 = 8; // 0x8
field public static final deprecated int JPEG = 256; // 0x100
- field public static final int LA_88 = 10; // 0xa
+ field public static final deprecated int LA_88 = 10; // 0xa
field public static final int L_8 = 9; // 0x9
field public static final int OPAQUE = -1; // 0xffffffff
- field public static final int RGBA_4444 = 7; // 0x7
- field public static final int RGBA_5551 = 6; // 0x6
+ field public static final deprecated int RGBA_4444 = 7; // 0x7
+ field public static final deprecated int RGBA_5551 = 6; // 0x6
field public static final int RGBA_8888 = 1; // 0x1
field public static final int RGBX_8888 = 2; // 0x2
- field public static final int RGB_332 = 11; // 0xb
+ field public static final deprecated int RGB_332 = 11; // 0xb
field public static final int RGB_565 = 4; // 0x4
field public static final int RGB_888 = 3; // 0x3
field public static final int TRANSLUCENT = -3; // 0xfffffffd
@@ -8528,7 +8840,7 @@
field public int bytesPerPixel;
}
- public class PixelXorXfermode extends android.graphics.Xfermode {
+ public deprecated class PixelXorXfermode extends android.graphics.Xfermode {
ctor public PixelXorXfermode(int);
}
@@ -8767,9 +9079,12 @@
public class SurfaceTexture {
ctor public SurfaceTexture(int);
+ method public void attachToGLContext(int);
+ method public void detachFromGLContext();
method public long getTimestamp();
method public void getTransformMatrix(float[]);
method public void release();
+ method public void setDefaultBufferSize(int, int);
method public void setOnFrameAvailableListener(android.graphics.SurfaceTexture.OnFrameAvailableListener);
method public void updateTexImage();
}
@@ -8925,6 +9240,7 @@
method public int getMinimumWidth();
method public abstract int getOpacity();
method public boolean getPadding(android.graphics.Rect);
+ method public int getResolvedLayoutDirectionSelf();
method public int[] getState();
method public android.graphics.Region getTransparentRegion();
method public void inflate(android.content.res.Resources, org.xmlpull.v1.XmlPullParser, android.util.AttributeSet) throws java.io.IOException, org.xmlpull.v1.XmlPullParserException;
@@ -9010,14 +9326,17 @@
ctor public GradientDrawable(android.graphics.drawable.GradientDrawable.Orientation, int[]);
method public void draw(android.graphics.Canvas);
method public int getOpacity();
+ method public android.graphics.drawable.GradientDrawable.Orientation getOrientation();
method public void setAlpha(int);
method public void setColor(int);
method public void setColorFilter(android.graphics.ColorFilter);
+ method public void setColors(int[]);
method public void setCornerRadii(float[]);
method public void setCornerRadius(float);
method public void setGradientCenter(float, float);
method public void setGradientRadius(float);
method public void setGradientType(int);
+ method public void setOrientation(android.graphics.drawable.GradientDrawable.Orientation);
method public void setShape(int);
method public void setSize(int, int);
method public void setStroke(int, int);
@@ -9230,6 +9549,7 @@
method public static android.hardware.Camera open();
method public final void reconnect() throws java.io.IOException;
method public final void release();
+ method public void setAutoFocusMoveCallback(android.hardware.Camera.AutoFocusMoveCallback);
method public final void setDisplayOrientation(int);
method public final void setErrorCallback(android.hardware.Camera.ErrorCallback);
method public final void setFaceDetectionListener(android.hardware.Camera.FaceDetectionListener);
@@ -9265,6 +9585,10 @@
method public abstract void onAutoFocus(boolean, android.hardware.Camera);
}
+ public static abstract interface Camera.AutoFocusMoveCallback {
+ method public abstract void onAutoFocusMoving(boolean, android.hardware.Camera);
+ }
+
public static class Camera.CameraInfo {
ctor public Camera.CameraInfo();
field public static final int CAMERA_FACING_BACK = 0; // 0x0
@@ -9344,6 +9668,7 @@
method public java.util.List<android.hardware.Camera.Size> getSupportedVideoSizes();
method public java.util.List<java.lang.String> getSupportedWhiteBalance();
method public float getVerticalViewAngle();
+ method public boolean getVideoStabilization();
method public java.lang.String getWhiteBalance();
method public int getZoom();
method public java.util.List<java.lang.Integer> getZoomRatios();
@@ -9351,6 +9676,7 @@
method public boolean isAutoWhiteBalanceLockSupported();
method public boolean isSmoothZoomSupported();
method public boolean isVideoSnapshotSupported();
+ method public boolean isVideoStabilizationSupported();
method public boolean isZoomSupported();
method public void remove(java.lang.String);
method public void removeGpsData();
@@ -9382,6 +9708,7 @@
method public void setRecordingHint(boolean);
method public void setRotation(int);
method public void setSceneMode(java.lang.String);
+ method public void setVideoStabilization(boolean);
method public void setWhiteBalance(java.lang.String);
method public void setZoom(int);
method public void unflatten(java.lang.String);
@@ -9528,8 +9855,8 @@
method public boolean registerListener(android.hardware.SensorEventListener, android.hardware.Sensor, int);
method public boolean registerListener(android.hardware.SensorEventListener, android.hardware.Sensor, int, android.os.Handler);
method public static boolean remapCoordinateSystem(float[], int, int, float[]);
- method public deprecated void unregisterListener(android.hardware.SensorListener, int);
method public deprecated void unregisterListener(android.hardware.SensorListener);
+ method public deprecated void unregisterListener(android.hardware.SensorListener, int);
method public void unregisterListener(android.hardware.SensorEventListener, android.hardware.Sensor);
method public void unregisterListener(android.hardware.SensorEventListener);
field public static final int AXIS_MINUS_X = 129; // 0x81
@@ -9593,6 +9920,25 @@
}
+package android.hardware.input {
+
+ public final class InputManager {
+ method public android.view.InputDevice getInputDevice(int);
+ method public int[] getInputDeviceIds();
+ method public void registerInputDeviceListener(android.hardware.input.InputManager.InputDeviceListener, android.os.Handler);
+ method public void unregisterInputDeviceListener(android.hardware.input.InputManager.InputDeviceListener);
+ field public static final java.lang.String ACTION_QUERY_KEYBOARD_LAYOUTS = "android.hardware.input.action.QUERY_KEYBOARD_LAYOUTS";
+ field public static final java.lang.String META_DATA_KEYBOARD_LAYOUTS = "android.hardware.input.metadata.KEYBOARD_LAYOUTS";
+ }
+
+ public static abstract interface InputManager.InputDeviceListener {
+ method public abstract void onInputDeviceAdded(int);
+ method public abstract void onInputDeviceChanged(int);
+ method public abstract void onInputDeviceRemoved(int);
+ }
+
+}
+
package android.hardware.usb {
public class UsbAccessory implements android.os.Parcelable {
@@ -10302,7 +10648,7 @@
method public deprecated int getRouting(int);
method public int getStreamMaxVolume(int);
method public int getStreamVolume(int);
- method public int getVibrateSetting(int);
+ method public deprecated int getVibrateSetting(int);
method public boolean isBluetoothA2dpOn();
method public boolean isBluetoothScoAvailableOffCall();
method public boolean isBluetoothScoOn();
@@ -10327,9 +10673,9 @@
method public void setStreamMute(int, boolean);
method public void setStreamSolo(int, boolean);
method public void setStreamVolume(int, int, int);
- method public void setVibrateSetting(int, int);
+ method public deprecated void setVibrateSetting(int, int);
method public deprecated void setWiredHeadsetOn(boolean);
- method public boolean shouldVibrate(int);
+ method public deprecated boolean shouldVibrate(int);
method public void startBluetoothSco();
method public void stopBluetoothSco();
method public void unloadSoundEffects();
@@ -10352,8 +10698,8 @@
field public static final java.lang.String EXTRA_RINGER_MODE = "android.media.EXTRA_RINGER_MODE";
field public static final java.lang.String EXTRA_SCO_AUDIO_PREVIOUS_STATE = "android.media.extra.SCO_AUDIO_PREVIOUS_STATE";
field public static final java.lang.String EXTRA_SCO_AUDIO_STATE = "android.media.extra.SCO_AUDIO_STATE";
- field public static final java.lang.String EXTRA_VIBRATE_SETTING = "android.media.EXTRA_VIBRATE_SETTING";
- field public static final java.lang.String EXTRA_VIBRATE_TYPE = "android.media.EXTRA_VIBRATE_TYPE";
+ field public static final deprecated java.lang.String EXTRA_VIBRATE_SETTING = "android.media.EXTRA_VIBRATE_SETTING";
+ field public static final deprecated java.lang.String EXTRA_VIBRATE_TYPE = "android.media.EXTRA_VIBRATE_TYPE";
field public static final int FLAG_ALLOW_RINGER_MODES = 2; // 0x2
field public static final int FLAG_PLAY_SOUND = 4; // 0x4
field public static final int FLAG_REMOVE_SOUND_AND_VIBRATE = 8; // 0x8
@@ -10398,12 +10744,12 @@
field public static final int STREAM_SYSTEM = 1; // 0x1
field public static final int STREAM_VOICE_CALL = 0; // 0x0
field public static final int USE_DEFAULT_STREAM_TYPE = -2147483648; // 0x80000000
- field public static final java.lang.String VIBRATE_SETTING_CHANGED_ACTION = "android.media.VIBRATE_SETTING_CHANGED";
- field public static final int VIBRATE_SETTING_OFF = 0; // 0x0
- field public static final int VIBRATE_SETTING_ON = 1; // 0x1
- field public static final int VIBRATE_SETTING_ONLY_SILENT = 2; // 0x2
- field public static final int VIBRATE_TYPE_NOTIFICATION = 1; // 0x1
- field public static final int VIBRATE_TYPE_RINGER = 0; // 0x0
+ field public static final deprecated java.lang.String VIBRATE_SETTING_CHANGED_ACTION = "android.media.VIBRATE_SETTING_CHANGED";
+ field public static final deprecated int VIBRATE_SETTING_OFF = 0; // 0x0
+ field public static final deprecated int VIBRATE_SETTING_ON = 1; // 0x1
+ field public static final deprecated int VIBRATE_SETTING_ONLY_SILENT = 2; // 0x2
+ field public static final deprecated int VIBRATE_TYPE_NOTIFICATION = 1; // 0x1
+ field public static final deprecated int VIBRATE_TYPE_RINGER = 0; // 0x0
}
public static abstract interface AudioManager.OnAudioFocusChangeListener {
@@ -10413,6 +10759,7 @@
public class AudioRecord {
ctor public AudioRecord(int, int, int, int, int) throws java.lang.IllegalArgumentException;
method public int getAudioFormat();
+ method public int getAudioSessionId();
method public int getAudioSource();
method public int getChannelConfiguration();
method public int getChannelCount();
@@ -10431,6 +10778,7 @@
method public void setRecordPositionUpdateListener(android.media.AudioRecord.OnRecordPositionUpdateListener);
method public void setRecordPositionUpdateListener(android.media.AudioRecord.OnRecordPositionUpdateListener, android.os.Handler);
method public void startRecording() throws java.lang.IllegalStateException;
+ method public void startRecording(android.media.MediaSyncEvent) throws java.lang.IllegalStateException;
method public void stop() throws java.lang.IllegalStateException;
field public static final int ERROR = -1; // 0xffffffff
field public static final int ERROR_BAD_VALUE = -2; // 0xfffffffe
@@ -10517,6 +10865,7 @@
field public static final int QUALITY_HIGH = 1; // 0x1
field public static final int QUALITY_LOW = 0; // 0x0
field public static final int QUALITY_QCIF = 2; // 0x2
+ field public static final int QUALITY_QVGA = 7; // 0x7
field public static final int QUALITY_TIME_LAPSE_1080P = 1006; // 0x3ee
field public static final int QUALITY_TIME_LAPSE_480P = 1004; // 0x3ec
field public static final int QUALITY_TIME_LAPSE_720P = 1005; // 0x3ed
@@ -10524,6 +10873,7 @@
field public static final int QUALITY_TIME_LAPSE_HIGH = 1001; // 0x3e9
field public static final int QUALITY_TIME_LAPSE_LOW = 1000; // 0x3e8
field public static final int QUALITY_TIME_LAPSE_QCIF = 1002; // 0x3ea
+ field public static final int QUALITY_TIME_LAPSE_QVGA = 1007; // 0x3ef
field public int audioBitRate;
field public int audioChannels;
field public int audioCodec;
@@ -10636,6 +10986,287 @@
method public abstract void onJetUserIdUpdate(android.media.JetPlayer, int, int);
}
+ public class MediaActionSound {
+ ctor public MediaActionSound();
+ method public synchronized void load(int);
+ method public synchronized void play(int);
+ method public void release();
+ field public static final int FOCUS_COMPLETE = 1; // 0x1
+ field public static final int SHUTTER_CLICK = 0; // 0x0
+ field public static final int START_VIDEO_RECORDING = 2; // 0x2
+ field public static final int STOP_VIDEO_RECORDING = 3; // 0x3
+ }
+
+ public final class MediaCodec {
+ method public void configure(android.media.MediaFormat, android.view.Surface, android.media.MediaCrypto, int);
+ method public static android.media.MediaCodec createByCodecName(java.lang.String);
+ method public static android.media.MediaCodec createDecoderByType(java.lang.String);
+ method public static android.media.MediaCodec createEncoderByType(java.lang.String);
+ method public final int dequeueInputBuffer(long);
+ method public final int dequeueOutputBuffer(android.media.MediaCodec.BufferInfo, long);
+ method public final void flush();
+ method public java.nio.ByteBuffer[] getInputBuffers();
+ method public java.nio.ByteBuffer[] getOutputBuffers();
+ method public final android.media.MediaFormat getOutputFormat();
+ method public final void queueInputBuffer(int, int, int, long, int) throws android.media.MediaCodec.CryptoException;
+ method public final void queueSecureInputBuffer(int, int, android.media.MediaCodec.CryptoInfo, long, int) throws android.media.MediaCodec.CryptoException;
+ method public final void release();
+ method public final void releaseOutputBuffer(int, boolean);
+ method public final void setVideoScalingMode(int);
+ method public final void start();
+ method public final void stop();
+ field public static final int BUFFER_FLAG_CODEC_CONFIG = 2; // 0x2
+ field public static final int BUFFER_FLAG_END_OF_STREAM = 4; // 0x4
+ field public static final int BUFFER_FLAG_SYNC_FRAME = 1; // 0x1
+ field public static final int CONFIGURE_FLAG_ENCODE = 1; // 0x1
+ field public static final int CRYPTO_MODE_AES_CTR = 1; // 0x1
+ field public static final int CRYPTO_MODE_UNENCRYPTED = 0; // 0x0
+ field public static final int INFO_OUTPUT_BUFFERS_CHANGED = -3; // 0xfffffffd
+ field public static final int INFO_OUTPUT_FORMAT_CHANGED = -2; // 0xfffffffe
+ field public static final int INFO_TRY_AGAIN_LATER = -1; // 0xffffffff
+ field public static final int VIDEO_SCALING_MODE_SCALE_TO_FIT = 1; // 0x1
+ field public static final int VIDEO_SCALING_MODE_SCALE_TO_FIT_WITH_CROPPING = 2; // 0x2
+ }
+
+ public static final class MediaCodec.BufferInfo {
+ ctor public MediaCodec.BufferInfo();
+ method public void set(int, int, long, int);
+ field public int flags;
+ field public int offset;
+ field public long presentationTimeUs;
+ field public int size;
+ }
+
+ public static final class MediaCodec.CryptoException extends java.lang.RuntimeException {
+ ctor public MediaCodec.CryptoException(int, java.lang.String);
+ method public int getErrorCode();
+ }
+
+ public static final class MediaCodec.CryptoInfo {
+ ctor public MediaCodec.CryptoInfo();
+ method public void set(int, int[], int[], byte[], byte[], int);
+ field public byte[] iv;
+ field public byte[] key;
+ field public int mode;
+ field public int[] numBytesOfClearData;
+ field public int[] numBytesOfEncryptedData;
+ field public int numSubSamples;
+ }
+
+ public final class MediaCodecInfo {
+ method public final android.media.MediaCodecInfo.CodecCapabilities getCapabilitiesForType(java.lang.String);
+ method public final java.lang.String getName();
+ method public final java.lang.String[] getSupportedTypes();
+ method public final boolean isEncoder();
+ }
+
+ public static final class MediaCodecInfo.CodecCapabilities {
+ ctor public MediaCodecInfo.CodecCapabilities();
+ field public static final int COLOR_Format12bitRGB444 = 3; // 0x3
+ field public static final int COLOR_Format16bitARGB1555 = 5; // 0x5
+ field public static final int COLOR_Format16bitARGB4444 = 4; // 0x4
+ field public static final int COLOR_Format16bitBGR565 = 7; // 0x7
+ field public static final int COLOR_Format16bitRGB565 = 6; // 0x6
+ field public static final int COLOR_Format18BitBGR666 = 41; // 0x29
+ field public static final int COLOR_Format18bitARGB1665 = 9; // 0x9
+ field public static final int COLOR_Format18bitRGB666 = 8; // 0x8
+ field public static final int COLOR_Format19bitARGB1666 = 10; // 0xa
+ field public static final int COLOR_Format24BitABGR6666 = 43; // 0x2b
+ field public static final int COLOR_Format24BitARGB6666 = 42; // 0x2a
+ field public static final int COLOR_Format24bitARGB1887 = 13; // 0xd
+ field public static final int COLOR_Format24bitBGR888 = 12; // 0xc
+ field public static final int COLOR_Format24bitRGB888 = 11; // 0xb
+ field public static final int COLOR_Format25bitARGB1888 = 14; // 0xe
+ field public static final int COLOR_Format32bitARGB8888 = 16; // 0x10
+ field public static final int COLOR_Format32bitBGRA8888 = 15; // 0xf
+ field public static final int COLOR_Format8bitRGB332 = 2; // 0x2
+ field public static final int COLOR_FormatCbYCrY = 27; // 0x1b
+ field public static final int COLOR_FormatCrYCbY = 28; // 0x1c
+ field public static final int COLOR_FormatL16 = 36; // 0x24
+ field public static final int COLOR_FormatL2 = 33; // 0x21
+ field public static final int COLOR_FormatL24 = 37; // 0x25
+ field public static final int COLOR_FormatL32 = 38; // 0x26
+ field public static final int COLOR_FormatL4 = 34; // 0x22
+ field public static final int COLOR_FormatL8 = 35; // 0x23
+ field public static final int COLOR_FormatMonochrome = 1; // 0x1
+ field public static final int COLOR_FormatRawBayer10bit = 31; // 0x1f
+ field public static final int COLOR_FormatRawBayer8bit = 30; // 0x1e
+ field public static final int COLOR_FormatRawBayer8bitcompressed = 32; // 0x20
+ field public static final int COLOR_FormatYCbYCr = 25; // 0x19
+ field public static final int COLOR_FormatYCrYCb = 26; // 0x1a
+ field public static final int COLOR_FormatYUV411PackedPlanar = 18; // 0x12
+ field public static final int COLOR_FormatYUV411Planar = 17; // 0x11
+ field public static final int COLOR_FormatYUV420PackedPlanar = 20; // 0x14
+ field public static final int COLOR_FormatYUV420PackedSemiPlanar = 39; // 0x27
+ field public static final int COLOR_FormatYUV420Planar = 19; // 0x13
+ field public static final int COLOR_FormatYUV420SemiPlanar = 21; // 0x15
+ field public static final int COLOR_FormatYUV422PackedPlanar = 23; // 0x17
+ field public static final int COLOR_FormatYUV422PackedSemiPlanar = 40; // 0x28
+ field public static final int COLOR_FormatYUV422Planar = 22; // 0x16
+ field public static final int COLOR_FormatYUV422SemiPlanar = 24; // 0x18
+ field public static final int COLOR_FormatYUV444Interleaved = 29; // 0x1d
+ field public static final int COLOR_QCOM_FormatYUV420SemiPlanar = 2141391872; // 0x7fa30c00
+ field public static final int COLOR_TI_FormatYUV420PackedSemiPlanar = 2130706688; // 0x7f000100
+ field public int[] colorFormats;
+ field public android.media.MediaCodecInfo.CodecProfileLevel[] profileLevels;
+ }
+
+ public static final class MediaCodecInfo.CodecProfileLevel {
+ ctor public MediaCodecInfo.CodecProfileLevel();
+ field public static final int AACObjectELD = 39; // 0x27
+ field public static final int AACObjectERLC = 17; // 0x11
+ field public static final int AACObjectHE = 5; // 0x5
+ field public static final int AACObjectHE_PS = 29; // 0x1d
+ field public static final int AACObjectLC = 2; // 0x2
+ field public static final int AACObjectLD = 23; // 0x17
+ field public static final int AACObjectLTP = 4; // 0x4
+ field public static final int AACObjectMain = 1; // 0x1
+ field public static final int AACObjectSSR = 3; // 0x3
+ field public static final int AACObjectScalable = 6; // 0x6
+ field public static final int AVCLevel1 = 1; // 0x1
+ field public static final int AVCLevel11 = 4; // 0x4
+ field public static final int AVCLevel12 = 8; // 0x8
+ field public static final int AVCLevel13 = 16; // 0x10
+ field public static final int AVCLevel1b = 2; // 0x2
+ field public static final int AVCLevel2 = 32; // 0x20
+ field public static final int AVCLevel21 = 64; // 0x40
+ field public static final int AVCLevel22 = 128; // 0x80
+ field public static final int AVCLevel3 = 256; // 0x100
+ field public static final int AVCLevel31 = 512; // 0x200
+ field public static final int AVCLevel32 = 1024; // 0x400
+ field public static final int AVCLevel4 = 2048; // 0x800
+ field public static final int AVCLevel41 = 4096; // 0x1000
+ field public static final int AVCLevel42 = 8192; // 0x2000
+ field public static final int AVCLevel5 = 16384; // 0x4000
+ field public static final int AVCLevel51 = 32768; // 0x8000
+ field public static final int AVCProfileBaseline = 1; // 0x1
+ field public static final int AVCProfileExtended = 4; // 0x4
+ field public static final int AVCProfileHigh = 8; // 0x8
+ field public static final int AVCProfileHigh10 = 16; // 0x10
+ field public static final int AVCProfileHigh422 = 32; // 0x20
+ field public static final int AVCProfileHigh444 = 64; // 0x40
+ field public static final int AVCProfileMain = 2; // 0x2
+ field public static final int H263Level10 = 1; // 0x1
+ field public static final int H263Level20 = 2; // 0x2
+ field public static final int H263Level30 = 4; // 0x4
+ field public static final int H263Level40 = 8; // 0x8
+ field public static final int H263Level45 = 16; // 0x10
+ field public static final int H263Level50 = 32; // 0x20
+ field public static final int H263Level60 = 64; // 0x40
+ field public static final int H263Level70 = 128; // 0x80
+ field public static final int H263ProfileBackwardCompatible = 4; // 0x4
+ field public static final int H263ProfileBaseline = 1; // 0x1
+ field public static final int H263ProfileH320Coding = 2; // 0x2
+ field public static final int H263ProfileHighCompression = 32; // 0x20
+ field public static final int H263ProfileHighLatency = 256; // 0x100
+ field public static final int H263ProfileISWV2 = 8; // 0x8
+ field public static final int H263ProfileISWV3 = 16; // 0x10
+ field public static final int H263ProfileInterlace = 128; // 0x80
+ field public static final int H263ProfileInternet = 64; // 0x40
+ field public static final int MPEG4Level0 = 1; // 0x1
+ field public static final int MPEG4Level0b = 2; // 0x2
+ field public static final int MPEG4Level1 = 4; // 0x4
+ field public static final int MPEG4Level2 = 8; // 0x8
+ field public static final int MPEG4Level3 = 16; // 0x10
+ field public static final int MPEG4Level4 = 32; // 0x20
+ field public static final int MPEG4Level4a = 64; // 0x40
+ field public static final int MPEG4Level5 = 128; // 0x80
+ field public static final int MPEG4ProfileAdvancedCoding = 4096; // 0x1000
+ field public static final int MPEG4ProfileAdvancedCore = 8192; // 0x2000
+ field public static final int MPEG4ProfileAdvancedRealTime = 1024; // 0x400
+ field public static final int MPEG4ProfileAdvancedScalable = 16384; // 0x4000
+ field public static final int MPEG4ProfileAdvancedSimple = 32768; // 0x8000
+ field public static final int MPEG4ProfileBasicAnimated = 256; // 0x100
+ field public static final int MPEG4ProfileCore = 4; // 0x4
+ field public static final int MPEG4ProfileCoreScalable = 2048; // 0x800
+ field public static final int MPEG4ProfileHybrid = 512; // 0x200
+ field public static final int MPEG4ProfileMain = 8; // 0x8
+ field public static final int MPEG4ProfileNbit = 16; // 0x10
+ field public static final int MPEG4ProfileScalableTexture = 32; // 0x20
+ field public static final int MPEG4ProfileSimple = 1; // 0x1
+ field public static final int MPEG4ProfileSimpleFBA = 128; // 0x80
+ field public static final int MPEG4ProfileSimpleFace = 64; // 0x40
+ field public static final int MPEG4ProfileSimpleScalable = 2; // 0x2
+ field public int level;
+ field public int profile;
+ }
+
+ public final class MediaCodecList {
+ method public static final int getCodecCount();
+ method public static final android.media.MediaCodecInfo getCodecInfoAt(int);
+ }
+
+ public final class MediaCrypto {
+ ctor public MediaCrypto(java.util.UUID, byte[]) throws android.media.MediaCryptoException;
+ method public static final boolean isCryptoSchemeSupported(java.util.UUID);
+ method public final void release();
+ method public final boolean requiresSecureDecoderComponent(java.lang.String);
+ }
+
+ public final class MediaCryptoException extends java.lang.Exception {
+ ctor public MediaCryptoException(java.lang.String);
+ }
+
+ public final class MediaExtractor {
+ ctor public MediaExtractor();
+ method public boolean advance();
+ method public long getCachedDuration();
+ method public boolean getSampleCryptoInfo(android.media.MediaCodec.CryptoInfo);
+ method public int getSampleFlags();
+ method public long getSampleTime();
+ method public int getSampleTrackIndex();
+ method public final int getTrackCount();
+ method public android.media.MediaFormat getTrackFormat(int);
+ method public boolean hasCacheReachedEndOfStream();
+ method public int readSampleData(java.nio.ByteBuffer, int);
+ method public final void release();
+ method public void seekTo(long, int);
+ method public void selectTrack(int);
+ method public final void setDataSource(android.content.Context, android.net.Uri, java.util.Map<java.lang.String, java.lang.String>) throws java.io.IOException;
+ method public final void setDataSource(java.lang.String, java.util.Map<java.lang.String, java.lang.String>);
+ method public final void setDataSource(java.lang.String);
+ method public final void setDataSource(java.io.FileDescriptor);
+ method public final void setDataSource(java.io.FileDescriptor, long, long);
+ method public void unselectTrack(int);
+ field public static final int SAMPLE_FLAG_ENCRYPTED = 2; // 0x2
+ field public static final int SAMPLE_FLAG_SYNC = 1; // 0x1
+ field public static final int SEEK_TO_CLOSEST_SYNC = 2; // 0x2
+ field public static final int SEEK_TO_NEXT_SYNC = 1; // 0x1
+ field public static final int SEEK_TO_PREVIOUS_SYNC = 0; // 0x0
+ }
+
+ public final class MediaFormat {
+ ctor public MediaFormat();
+ method public final boolean containsKey(java.lang.String);
+ method public static final android.media.MediaFormat createAudioFormat(java.lang.String, int, int);
+ method public static final android.media.MediaFormat createVideoFormat(java.lang.String, int, int);
+ method public final java.nio.ByteBuffer getByteBuffer(java.lang.String);
+ method public final float getFloat(java.lang.String);
+ method public final int getInteger(java.lang.String);
+ method public final long getLong(java.lang.String);
+ method public final java.lang.String getString(java.lang.String);
+ method public final void setByteBuffer(java.lang.String, java.nio.ByteBuffer);
+ method public final void setFloat(java.lang.String, float);
+ method public final void setInteger(java.lang.String, int);
+ method public final void setLong(java.lang.String, long);
+ method public final void setString(java.lang.String, java.lang.String);
+ field public static final java.lang.String KEY_AAC_PROFILE = "aac-profile";
+ field public static final java.lang.String KEY_BIT_RATE = "bitrate";
+ field public static final java.lang.String KEY_CHANNEL_COUNT = "channel-count";
+ field public static final java.lang.String KEY_CHANNEL_MASK = "channel-mask";
+ field public static final java.lang.String KEY_COLOR_FORMAT = "color-format";
+ field public static final java.lang.String KEY_DURATION = "durationUs";
+ field public static final java.lang.String KEY_FLAC_COMPRESSION_LEVEL = "flac-compression-level";
+ field public static final java.lang.String KEY_FRAME_RATE = "frame-rate";
+ field public static final java.lang.String KEY_HEIGHT = "height";
+ field public static final java.lang.String KEY_IS_ADTS = "is-adts";
+ field public static final java.lang.String KEY_I_FRAME_INTERVAL = "i-frame-interval";
+ field public static final java.lang.String KEY_MAX_INPUT_SIZE = "max-input-size";
+ field public static final java.lang.String KEY_MIME = "mime";
+ field public static final java.lang.String KEY_SAMPLE_RATE = "sample-rate";
+ field public static final java.lang.String KEY_WIDTH = "width";
+ }
+
public class MediaMetadataRetriever {
ctor public MediaMetadataRetriever();
method public java.lang.String extractMetadata(int);
@@ -10663,6 +11294,7 @@
field public static final int METADATA_KEY_GENRE = 6; // 0x6
field public static final int METADATA_KEY_HAS_AUDIO = 16; // 0x10
field public static final int METADATA_KEY_HAS_VIDEO = 17; // 0x11
+ field public static final int METADATA_KEY_LOCATION = 23; // 0x17
field public static final int METADATA_KEY_MIMETYPE = 12; // 0xc
field public static final int METADATA_KEY_NUM_TRACKS = 10; // 0xa
field public static final int METADATA_KEY_TITLE = 7; // 0x7
@@ -10678,13 +11310,19 @@
public class MediaPlayer {
ctor public MediaPlayer();
+ method public void addTimedTextSource(java.lang.String, java.lang.String) throws java.io.IOException, java.lang.IllegalArgumentException, java.lang.IllegalStateException;
+ method public void addTimedTextSource(android.content.Context, android.net.Uri, java.lang.String) throws java.io.IOException, java.lang.IllegalArgumentException, java.lang.IllegalStateException;
+ method public void addTimedTextSource(java.io.FileDescriptor, java.lang.String) throws java.lang.IllegalArgumentException, java.lang.IllegalStateException;
+ method public void addTimedTextSource(java.io.FileDescriptor, long, long, java.lang.String) throws java.lang.IllegalArgumentException, java.lang.IllegalStateException;
method public void attachAuxEffect(int);
method public static android.media.MediaPlayer create(android.content.Context, android.net.Uri);
method public static android.media.MediaPlayer create(android.content.Context, android.net.Uri, android.view.SurfaceHolder);
method public static android.media.MediaPlayer create(android.content.Context, int);
+ method public void deselectTrack(int) throws java.lang.IllegalStateException;
method public int getAudioSessionId();
method public int getCurrentPosition();
method public int getDuration();
+ method public android.media.MediaPlayer.TrackInfo[] getTrackInfo() throws java.lang.IllegalStateException;
method public int getVideoHeight();
method public int getVideoWidth();
method public boolean isLooping();
@@ -10695,6 +11333,7 @@
method public void release();
method public void reset();
method public void seekTo(int) throws java.lang.IllegalStateException;
+ method public void selectTrack(int) throws java.lang.IllegalStateException;
method public void setAudioSessionId(int) throws java.lang.IllegalArgumentException, java.lang.IllegalStateException;
method public void setAudioStreamType(int);
method public void setAuxEffectSendLevel(float);
@@ -10705,15 +11344,18 @@
method public void setDataSource(java.io.FileDescriptor, long, long) throws java.io.IOException, java.lang.IllegalArgumentException, java.lang.IllegalStateException;
method public void setDisplay(android.view.SurfaceHolder);
method public void setLooping(boolean);
+ method public void setNextMediaPlayer(android.media.MediaPlayer);
method public void setOnBufferingUpdateListener(android.media.MediaPlayer.OnBufferingUpdateListener);
method public void setOnCompletionListener(android.media.MediaPlayer.OnCompletionListener);
method public void setOnErrorListener(android.media.MediaPlayer.OnErrorListener);
method public void setOnInfoListener(android.media.MediaPlayer.OnInfoListener);
method public void setOnPreparedListener(android.media.MediaPlayer.OnPreparedListener);
method public void setOnSeekCompleteListener(android.media.MediaPlayer.OnSeekCompleteListener);
+ method public void setOnTimedTextListener(android.media.MediaPlayer.OnTimedTextListener);
method public void setOnVideoSizeChangedListener(android.media.MediaPlayer.OnVideoSizeChangedListener);
method public void setScreenOnWhilePlaying(boolean);
method public void setSurface(android.view.Surface);
+ method public void setVideoScalingMode(int);
method public void setVolume(float, float);
method public void setWakeMode(android.content.Context, int);
method public void start() throws java.lang.IllegalStateException;
@@ -10728,6 +11370,9 @@
field public static final int MEDIA_INFO_NOT_SEEKABLE = 801; // 0x321
field public static final int MEDIA_INFO_UNKNOWN = 1; // 0x1
field public static final int MEDIA_INFO_VIDEO_TRACK_LAGGING = 700; // 0x2bc
+ field public static final java.lang.String MEDIA_MIMETYPE_TEXT_SUBRIP = "application/x-subrip";
+ field public static final int VIDEO_SCALING_MODE_SCALE_TO_FIT = 1; // 0x1
+ field public static final int VIDEO_SCALING_MODE_SCALE_TO_FIT_WITH_CROPPING = 2; // 0x2
}
public static abstract interface MediaPlayer.OnBufferingUpdateListener {
@@ -10754,10 +11399,25 @@
method public abstract void onSeekComplete(android.media.MediaPlayer);
}
+ public static abstract interface MediaPlayer.OnTimedTextListener {
+ method public abstract void onTimedText(android.media.MediaPlayer, android.media.TimedText);
+ }
+
public static abstract interface MediaPlayer.OnVideoSizeChangedListener {
method public abstract void onVideoSizeChanged(android.media.MediaPlayer, int, int);
}
+ public static class MediaPlayer.TrackInfo implements android.os.Parcelable {
+ method public int describeContents();
+ method public java.lang.String getLanguage();
+ method public int getTrackType();
+ method public void writeToParcel(android.os.Parcel, int);
+ field public static final int MEDIA_TRACK_TYPE_AUDIO = 2; // 0x2
+ field public static final int MEDIA_TRACK_TYPE_TIMEDTEXT = 3; // 0x3
+ field public static final int MEDIA_TRACK_TYPE_UNKNOWN = 0; // 0x0
+ field public static final int MEDIA_TRACK_TYPE_VIDEO = 1; // 0x1
+ }
+
public class MediaRecorder {
ctor public MediaRecorder();
method public static final int getAudioSourceMax();
@@ -10798,9 +11458,11 @@
public final class MediaRecorder.AudioEncoder {
field public static final int AAC = 3; // 0x3
+ field public static final int AAC_ELD = 5; // 0x5
field public static final int AMR_NB = 1; // 0x1
field public static final int AMR_WB = 2; // 0x2
field public static final int DEFAULT = 0; // 0x0
+ field public static final int HE_AAC = 4; // 0x4
}
public final class MediaRecorder.AudioSource {
@@ -10823,11 +11485,12 @@
}
public final class MediaRecorder.OutputFormat {
+ field public static final int AAC_ADTS = 6; // 0x6
field public static final int AMR_NB = 3; // 0x3
field public static final int AMR_WB = 4; // 0x4
field public static final int DEFAULT = 0; // 0x0
field public static final int MPEG_4 = 2; // 0x2
- field public static final int RAW_AMR = 3; // 0x3
+ field public static final deprecated int RAW_AMR = 3; // 0x3
field public static final int THREE_GPP = 1; // 0x1
}
@@ -10863,6 +11526,15 @@
method public abstract void onScanCompleted(java.lang.String, android.net.Uri);
}
+ public class MediaSyncEvent {
+ method public static android.media.MediaSyncEvent createEvent(int) throws java.lang.IllegalArgumentException;
+ method public int getAudioSessionId();
+ method public int getType();
+ method public android.media.MediaSyncEvent setAudioSessionId(int) throws java.lang.IllegalArgumentException;
+ field public static final int SYNC_EVENT_NONE = 0; // 0x0
+ field public static final int SYNC_EVENT_PRESENTATION_COMPLETE = 1; // 0x1
+ }
+
public class RemoteControlClient {
ctor public RemoteControlClient(android.app.PendingIntent);
ctor public RemoteControlClient(android.app.PendingIntent, android.os.Looper);
@@ -10978,8 +11650,14 @@
field public static final int OPTIONS_RECYCLE_INPUT = 2; // 0x2
}
+ public final class TimedText {
+ method public android.graphics.Rect getBounds();
+ method public java.lang.String getText();
+ }
+
public class ToneGenerator {
ctor public ToneGenerator(int, int);
+ method public final int getAudioSessionId();
method public void release();
method public boolean startTone(int);
method public boolean startTone(int, int);
@@ -11091,6 +11769,11 @@
package android.media.audiofx {
+ public class AcousticEchoCanceler extends android.media.audiofx.AudioEffect {
+ method public static android.media.audiofx.AcousticEchoCanceler create(int);
+ method public static boolean isAvailable();
+ }
+
public class AudioEffect {
method public android.media.audiofx.AudioEffect.Descriptor getDescriptor() throws java.lang.IllegalStateException;
method public boolean getEnabled() throws java.lang.IllegalStateException;
@@ -11141,6 +11824,11 @@
method public abstract void onEnableStatusChange(android.media.audiofx.AudioEffect, boolean);
}
+ public class AutomaticGainControl extends android.media.audiofx.AudioEffect {
+ method public static android.media.audiofx.AutomaticGainControl create(int);
+ method public static boolean isAvailable();
+ }
+
public class BassBoost extends android.media.audiofx.AudioEffect {
ctor public BassBoost(int, int) throws java.lang.IllegalArgumentException, java.lang.IllegalStateException, java.lang.RuntimeException, java.lang.UnsupportedOperationException;
method public android.media.audiofx.BassBoost.Settings getProperties() throws java.lang.IllegalArgumentException, java.lang.IllegalStateException, java.lang.UnsupportedOperationException;
@@ -11259,6 +11947,11 @@
field public short numBands;
}
+ public class NoiseSuppressor extends android.media.audiofx.AudioEffect {
+ method public static android.media.audiofx.NoiseSuppressor create(int);
+ method public static boolean isAvailable();
+ }
+
public class PresetReverb extends android.media.audiofx.AudioEffect {
ctor public PresetReverb(int, int) throws java.lang.IllegalArgumentException, java.lang.RuntimeException, java.lang.UnsupportedOperationException;
method public short getPreset() throws java.lang.IllegalArgumentException, java.lang.IllegalStateException, java.lang.UnsupportedOperationException;
@@ -11316,11 +12009,13 @@
method public int getFft(byte[]) throws java.lang.IllegalStateException;
method public static int getMaxCaptureRate();
method public int getSamplingRate() throws java.lang.IllegalStateException;
+ method public int getScalingMode() throws java.lang.IllegalStateException;
method public int getWaveForm(byte[]) throws java.lang.IllegalStateException;
method public void release();
method public int setCaptureSize(int) throws java.lang.IllegalStateException;
method public int setDataCaptureListener(android.media.audiofx.Visualizer.OnDataCaptureListener, int, boolean, boolean);
method public int setEnabled(boolean) throws java.lang.IllegalStateException;
+ method public int setScalingMode(int) throws java.lang.IllegalStateException;
field public static final int ALREADY_EXISTS = -2; // 0xfffffffe
field public static final int ERROR = -1; // 0xffffffff
field public static final int ERROR_BAD_VALUE = -4; // 0xfffffffc
@@ -11328,6 +12023,8 @@
field public static final int ERROR_INVALID_OPERATION = -5; // 0xfffffffb
field public static final int ERROR_NO_INIT = -3; // 0xfffffffd
field public static final int ERROR_NO_MEMORY = -6; // 0xfffffffa
+ field public static final int SCALING_MODE_AS_PLAYED = 1; // 0x1
+ field public static final int SCALING_MODE_NORMALIZED = 0; // 0x0
field public static final int STATE_ENABLED = 2; // 0x2
field public static final int STATE_INITIALIZED = 1; // 0x1
field public static final int STATE_UNINITIALIZED = 0; // 0x0
@@ -11531,12 +12228,13 @@
method public deprecated boolean getBackgroundDataSetting();
method public android.net.NetworkInfo getNetworkInfo(int);
method public int getNetworkPreference();
+ method public boolean isActiveNetworkMetered();
method public static boolean isNetworkTypeValid(int);
method public boolean requestRouteToHost(int, int);
method public void setNetworkPreference(int);
method public int startUsingNetworkFeature(int, java.lang.String);
method public int stopUsingNetworkFeature(int, java.lang.String);
- field public static final java.lang.String ACTION_BACKGROUND_DATA_SETTING_CHANGED = "android.net.conn.BACKGROUND_DATA_SETTING_CHANGED";
+ field public static final deprecated java.lang.String ACTION_BACKGROUND_DATA_SETTING_CHANGED = "android.net.conn.BACKGROUND_DATA_SETTING_CHANGED";
field public static final java.lang.String CONNECTIVITY_ACTION = "android.net.conn.CONNECTIVITY_CHANGE";
field public static final int DEFAULT_NETWORK_PREFERENCE = 1; // 0x1
field public static final java.lang.String EXTRA_EXTRA_INFO = "extraInfo";
@@ -11673,6 +12371,7 @@
enum_constant public static final android.net.NetworkInfo.DetailedState OBTAINING_IPADDR;
enum_constant public static final android.net.NetworkInfo.DetailedState SCANNING;
enum_constant public static final android.net.NetworkInfo.DetailedState SUSPENDED;
+ enum_constant public static final android.net.NetworkInfo.DetailedState VERIFYING_POOR_LINK;
}
public static final class NetworkInfo.State extends java.lang.Enum {
@@ -11711,8 +12410,10 @@
method public java.lang.String[] getDefaultCipherSuites();
method public static org.apache.http.conn.ssl.SSLSocketFactory getHttpSocketFactory(int, android.net.SSLSessionCache);
method public static javax.net.ssl.SSLSocketFactory getInsecure(int, android.net.SSLSessionCache);
+ method public byte[] getNpnSelectedProtocol(java.net.Socket);
method public java.lang.String[] getSupportedCipherSuites();
method public void setKeyManagers(javax.net.ssl.KeyManager[]);
+ method public void setNpnProtocols(byte[][]);
method public void setTrustManagers(javax.net.ssl.TrustManager[]);
}
@@ -11786,6 +12487,7 @@
method public abstract boolean isHierarchical();
method public boolean isOpaque();
method public abstract boolean isRelative();
+ method public android.net.Uri normalizeScheme();
method public static android.net.Uri parse(java.lang.String);
method public abstract java.lang.String toString();
method public static android.net.Uri withAppendedPath(android.net.Uri, java.lang.String);
@@ -11999,6 +12701,62 @@
}
+package android.net.nsd {
+
+ public final class NsdManager {
+ method public void discoverServices(java.lang.String, int, android.net.nsd.NsdManager.DiscoveryListener);
+ method public void registerService(android.net.nsd.NsdServiceInfo, int, android.net.nsd.NsdManager.RegistrationListener);
+ method public void resolveService(android.net.nsd.NsdServiceInfo, android.net.nsd.NsdManager.ResolveListener);
+ method public void stopServiceDiscovery(android.net.nsd.NsdManager.DiscoveryListener);
+ method public void unregisterService(android.net.nsd.NsdManager.RegistrationListener);
+ field public static final java.lang.String ACTION_NSD_STATE_CHANGED = "android.net.nsd.STATE_CHANGED";
+ field public static final java.lang.String EXTRA_NSD_STATE = "nsd_state";
+ field public static final int FAILURE_ALREADY_ACTIVE = 3; // 0x3
+ field public static final int FAILURE_INTERNAL_ERROR = 0; // 0x0
+ field public static final int FAILURE_MAX_LIMIT = 4; // 0x4
+ field public static final int NSD_STATE_DISABLED = 1; // 0x1
+ field public static final int NSD_STATE_ENABLED = 2; // 0x2
+ field public static final int PROTOCOL_DNS_SD = 1; // 0x1
+ }
+
+ public static abstract interface NsdManager.DiscoveryListener {
+ method public abstract void onDiscoveryStarted(java.lang.String);
+ method public abstract void onDiscoveryStopped(java.lang.String);
+ method public abstract void onServiceFound(android.net.nsd.NsdServiceInfo);
+ method public abstract void onServiceLost(android.net.nsd.NsdServiceInfo);
+ method public abstract void onStartDiscoveryFailed(java.lang.String, int);
+ method public abstract void onStopDiscoveryFailed(java.lang.String, int);
+ }
+
+ public static abstract interface NsdManager.RegistrationListener {
+ method public abstract void onRegistrationFailed(android.net.nsd.NsdServiceInfo, int);
+ method public abstract void onServiceRegistered(android.net.nsd.NsdServiceInfo);
+ method public abstract void onServiceUnregistered(android.net.nsd.NsdServiceInfo);
+ method public abstract void onUnregistrationFailed(android.net.nsd.NsdServiceInfo, int);
+ }
+
+ public static abstract interface NsdManager.ResolveListener {
+ method public abstract void onResolveFailed(android.net.nsd.NsdServiceInfo, int);
+ method public abstract void onServiceResolved(android.net.nsd.NsdServiceInfo);
+ }
+
+ public final class NsdServiceInfo implements android.os.Parcelable {
+ ctor public NsdServiceInfo();
+ method public int describeContents();
+ method public java.net.InetAddress getHost();
+ method public int getPort();
+ method public java.lang.String getServiceName();
+ method public java.lang.String getServiceType();
+ method public void setHost(java.net.InetAddress);
+ method public void setPort(int);
+ method public void setServiceName(java.lang.String);
+ method public void setServiceType(java.lang.String);
+ method public void writeToParcel(android.os.Parcel, int);
+ field public static final android.os.Parcelable.Creator CREATOR;
+ }
+
+}
+
package android.net.rtp {
public class AudioCodec {
@@ -12505,23 +13263,39 @@
}
public class WifiP2pManager {
+ method public void addLocalService(android.net.wifi.p2p.WifiP2pManager.Channel, android.net.wifi.p2p.nsd.WifiP2pServiceInfo, android.net.wifi.p2p.WifiP2pManager.ActionListener);
+ method public void addServiceRequest(android.net.wifi.p2p.WifiP2pManager.Channel, android.net.wifi.p2p.nsd.WifiP2pServiceRequest, android.net.wifi.p2p.WifiP2pManager.ActionListener);
method public void cancelConnect(android.net.wifi.p2p.WifiP2pManager.Channel, android.net.wifi.p2p.WifiP2pManager.ActionListener);
+ method public void clearLocalServices(android.net.wifi.p2p.WifiP2pManager.Channel, android.net.wifi.p2p.WifiP2pManager.ActionListener);
+ method public void clearServiceRequests(android.net.wifi.p2p.WifiP2pManager.Channel, android.net.wifi.p2p.WifiP2pManager.ActionListener);
method public void connect(android.net.wifi.p2p.WifiP2pManager.Channel, android.net.wifi.p2p.WifiP2pConfig, android.net.wifi.p2p.WifiP2pManager.ActionListener);
method public void createGroup(android.net.wifi.p2p.WifiP2pManager.Channel, android.net.wifi.p2p.WifiP2pManager.ActionListener);
method public void discoverPeers(android.net.wifi.p2p.WifiP2pManager.Channel, android.net.wifi.p2p.WifiP2pManager.ActionListener);
+ method public void discoverServices(android.net.wifi.p2p.WifiP2pManager.Channel, android.net.wifi.p2p.WifiP2pManager.ActionListener);
method public android.net.wifi.p2p.WifiP2pManager.Channel initialize(android.content.Context, android.os.Looper, android.net.wifi.p2p.WifiP2pManager.ChannelListener);
method public void removeGroup(android.net.wifi.p2p.WifiP2pManager.Channel, android.net.wifi.p2p.WifiP2pManager.ActionListener);
+ method public void removeLocalService(android.net.wifi.p2p.WifiP2pManager.Channel, android.net.wifi.p2p.nsd.WifiP2pServiceInfo, android.net.wifi.p2p.WifiP2pManager.ActionListener);
+ method public void removeServiceRequest(android.net.wifi.p2p.WifiP2pManager.Channel, android.net.wifi.p2p.nsd.WifiP2pServiceRequest, android.net.wifi.p2p.WifiP2pManager.ActionListener);
method public void requestConnectionInfo(android.net.wifi.p2p.WifiP2pManager.Channel, android.net.wifi.p2p.WifiP2pManager.ConnectionInfoListener);
method public void requestGroupInfo(android.net.wifi.p2p.WifiP2pManager.Channel, android.net.wifi.p2p.WifiP2pManager.GroupInfoListener);
method public void requestPeers(android.net.wifi.p2p.WifiP2pManager.Channel, android.net.wifi.p2p.WifiP2pManager.PeerListListener);
+ method public void setDnsSdResponseListeners(android.net.wifi.p2p.WifiP2pManager.Channel, android.net.wifi.p2p.WifiP2pManager.DnsSdServiceResponseListener, android.net.wifi.p2p.WifiP2pManager.DnsSdTxtRecordListener);
+ method public void setServiceResponseListener(android.net.wifi.p2p.WifiP2pManager.Channel, android.net.wifi.p2p.WifiP2pManager.ServiceResponseListener);
+ method public void setUpnpServiceResponseListener(android.net.wifi.p2p.WifiP2pManager.Channel, android.net.wifi.p2p.WifiP2pManager.UpnpServiceResponseListener);
+ method public void stopPeerDiscovery(android.net.wifi.p2p.WifiP2pManager.Channel, android.net.wifi.p2p.WifiP2pManager.ActionListener);
field public static final int BUSY = 2; // 0x2
field public static final int ERROR = 0; // 0x0
+ field public static final java.lang.String EXTRA_DISCOVERY_STATE = "discoveryState";
field public static final java.lang.String EXTRA_NETWORK_INFO = "networkInfo";
field public static final java.lang.String EXTRA_WIFI_P2P_DEVICE = "wifiP2pDevice";
field public static final java.lang.String EXTRA_WIFI_P2P_INFO = "wifiP2pInfo";
field public static final java.lang.String EXTRA_WIFI_STATE = "wifi_p2p_state";
+ field public static final int NO_SERVICE_REQUESTS = 3; // 0x3
field public static final int P2P_UNSUPPORTED = 1; // 0x1
field public static final java.lang.String WIFI_P2P_CONNECTION_CHANGED_ACTION = "android.net.wifi.p2p.CONNECTION_STATE_CHANGE";
+ field public static final java.lang.String WIFI_P2P_DISCOVERY_CHANGED_ACTION = "android.net.wifi.p2p.DISCOVERY_STATE_CHANGE";
+ field public static final int WIFI_P2P_DISCOVERY_STARTED = 2; // 0x2
+ field public static final int WIFI_P2P_DISCOVERY_STOPPED = 1; // 0x1
field public static final java.lang.String WIFI_P2P_PEERS_CHANGED_ACTION = "android.net.wifi.p2p.PEERS_CHANGED";
field public static final java.lang.String WIFI_P2P_STATE_CHANGED_ACTION = "android.net.wifi.p2p.STATE_CHANGED";
field public static final int WIFI_P2P_STATE_DISABLED = 1; // 0x1
@@ -12545,6 +13319,14 @@
method public abstract void onConnectionInfoAvailable(android.net.wifi.p2p.WifiP2pInfo);
}
+ public static abstract interface WifiP2pManager.DnsSdServiceResponseListener {
+ method public abstract void onDnsSdServiceAvailable(java.lang.String, java.lang.String, android.net.wifi.p2p.WifiP2pDevice);
+ }
+
+ public static abstract interface WifiP2pManager.DnsSdTxtRecordListener {
+ method public abstract void onDnsSdTxtRecordAvailable(java.lang.String, java.util.Map<java.lang.String, java.lang.String>, android.net.wifi.p2p.WifiP2pDevice);
+ }
+
public static abstract interface WifiP2pManager.GroupInfoListener {
method public abstract void onGroupInfoAvailable(android.net.wifi.p2p.WifiP2pGroup);
}
@@ -12553,6 +13335,53 @@
method public abstract void onPeersAvailable(android.net.wifi.p2p.WifiP2pDeviceList);
}
+ public static abstract interface WifiP2pManager.ServiceResponseListener {
+ method public abstract void onServiceAvailable(int, byte[], android.net.wifi.p2p.WifiP2pDevice);
+ }
+
+ public static abstract interface WifiP2pManager.UpnpServiceResponseListener {
+ method public abstract void onUpnpServiceAvailable(java.util.List<java.lang.String>, android.net.wifi.p2p.WifiP2pDevice);
+ }
+
+}
+
+package android.net.wifi.p2p.nsd {
+
+ public class WifiP2pDnsSdServiceInfo extends android.net.wifi.p2p.nsd.WifiP2pServiceInfo {
+ method public static android.net.wifi.p2p.nsd.WifiP2pDnsSdServiceInfo newInstance(java.lang.String, java.lang.String, java.util.Map<java.lang.String, java.lang.String>);
+ }
+
+ public class WifiP2pDnsSdServiceRequest extends android.net.wifi.p2p.nsd.WifiP2pServiceRequest {
+ method public static android.net.wifi.p2p.nsd.WifiP2pDnsSdServiceRequest newInstance();
+ method public static android.net.wifi.p2p.nsd.WifiP2pDnsSdServiceRequest newInstance(java.lang.String);
+ method public static android.net.wifi.p2p.nsd.WifiP2pDnsSdServiceRequest newInstance(java.lang.String, java.lang.String);
+ }
+
+ public class WifiP2pServiceInfo implements android.os.Parcelable {
+ method public int describeContents();
+ method public void writeToParcel(android.os.Parcel, int);
+ field public static final int SERVICE_TYPE_ALL = 0; // 0x0
+ field public static final int SERVICE_TYPE_BONJOUR = 1; // 0x1
+ field public static final int SERVICE_TYPE_UPNP = 2; // 0x2
+ field public static final int SERVICE_TYPE_VENDOR_SPECIFIC = 255; // 0xff
+ }
+
+ public class WifiP2pServiceRequest implements android.os.Parcelable {
+ method public int describeContents();
+ method public static android.net.wifi.p2p.nsd.WifiP2pServiceRequest newInstance(int, java.lang.String);
+ method public static android.net.wifi.p2p.nsd.WifiP2pServiceRequest newInstance(int);
+ method public void writeToParcel(android.os.Parcel, int);
+ }
+
+ public class WifiP2pUpnpServiceInfo extends android.net.wifi.p2p.nsd.WifiP2pServiceInfo {
+ method public static android.net.wifi.p2p.nsd.WifiP2pUpnpServiceInfo newInstance(java.lang.String, java.lang.String, java.util.List<java.lang.String>);
+ }
+
+ public class WifiP2pUpnpServiceRequest extends android.net.wifi.p2p.nsd.WifiP2pServiceRequest {
+ method public static android.net.wifi.p2p.nsd.WifiP2pUpnpServiceRequest newInstance();
+ method public static android.net.wifi.p2p.nsd.WifiP2pUpnpServiceRequest newInstance(java.lang.String);
+ }
+
}
package android.nfc {
@@ -12560,12 +13389,15 @@
public class FormatException extends java.lang.Exception {
ctor public FormatException();
ctor public FormatException(java.lang.String);
+ ctor public FormatException(java.lang.String, java.lang.Throwable);
}
public final class NdefMessage implements android.os.Parcelable {
ctor public NdefMessage(byte[]) throws android.nfc.FormatException;
+ ctor public NdefMessage(android.nfc.NdefRecord, android.nfc.NdefRecord...);
ctor public NdefMessage(android.nfc.NdefRecord[]);
method public int describeContents();
+ method public int getByteArrayLength();
method public android.nfc.NdefRecord[] getRecords();
method public byte[] toByteArray();
method public void writeToParcel(android.os.Parcel, int);
@@ -12574,8 +13406,10 @@
public final class NdefRecord implements android.os.Parcelable {
ctor public NdefRecord(short, byte[], byte[], byte[]);
- ctor public NdefRecord(byte[]) throws android.nfc.FormatException;
+ ctor public deprecated NdefRecord(byte[]) throws android.nfc.FormatException;
method public static android.nfc.NdefRecord createApplicationRecord(java.lang.String);
+ method public static android.nfc.NdefRecord createExternal(java.lang.String, java.lang.String, byte[]);
+ method public static android.nfc.NdefRecord createMime(java.lang.String, byte[]);
method public static android.nfc.NdefRecord createUri(android.net.Uri);
method public static android.nfc.NdefRecord createUri(java.lang.String);
method public int describeContents();
@@ -12583,7 +13417,9 @@
method public byte[] getPayload();
method public short getTnf();
method public byte[] getType();
- method public byte[] toByteArray();
+ method public deprecated byte[] toByteArray();
+ method public java.lang.String toMimeType();
+ method public android.net.Uri toUri();
method public void writeToParcel(android.os.Parcel, int);
field public static final android.os.Parcelable.Creator CREATOR;
field public static final byte[] RTD_ALTERNATIVE_CARRIER;
@@ -12609,6 +13445,9 @@
method public deprecated void enableForegroundNdefPush(android.app.Activity, android.nfc.NdefMessage);
method public static android.nfc.NfcAdapter getDefaultAdapter(android.content.Context);
method public boolean isEnabled();
+ method public boolean isNdefPushEnabled();
+ method public void setBeamPushUris(android.net.Uri[], android.app.Activity);
+ method public void setBeamPushUrisCallback(android.nfc.NfcAdapter.CreateBeamUrisCallback, android.app.Activity);
method public void setNdefPushMessage(android.nfc.NdefMessage, android.app.Activity, android.app.Activity...);
method public void setNdefPushMessageCallback(android.nfc.NfcAdapter.CreateNdefMessageCallback, android.app.Activity, android.app.Activity...);
method public void setOnNdefPushCompleteCallback(android.nfc.NfcAdapter.OnNdefPushCompleteCallback, android.app.Activity, android.app.Activity...);
@@ -12620,6 +13459,10 @@
field public static final java.lang.String EXTRA_TAG = "android.nfc.extra.TAG";
}
+ public static abstract interface NfcAdapter.CreateBeamUrisCallback {
+ method public abstract android.net.Uri[] createBeamUris(android.nfc.NfcEvent);
+ }
+
public static abstract interface NfcAdapter.CreateNdefMessageCallback {
method public abstract android.nfc.NdefMessage createNdefMessage(android.nfc.NfcEvent);
}
@@ -12666,6 +13509,7 @@
method public byte[] getHistoricalBytes();
method public int getMaxTransceiveLength();
method public int getTimeout();
+ method public boolean isExtendedLengthApduSupported();
method public void setTimeout(int);
method public byte[] transceive(byte[]) throws java.io.IOException;
}
@@ -13594,16 +14438,19 @@
field public static final int GL_RENDERBUFFER_RED_SIZE_OES = 36176; // 0x8d50
field public static final int GL_RENDERBUFFER_STENCIL_SIZE_OES = 36181; // 0x8d55
field public static final int GL_RENDERBUFFER_WIDTH_OES = 36162; // 0x8d42
+ field public static final int GL_REQUIRED_TEXTURE_IMAGE_UNITS_OES = 36200; // 0x8d68
field public static final int GL_RGB565_OES = 36194; // 0x8d62
field public static final int GL_RGB5_A1_OES = 32855; // 0x8057
field public static final int GL_RGB8_OES = 32849; // 0x8051
field public static final int GL_RGBA4_OES = 32854; // 0x8056
field public static final int GL_RGBA8_OES = 32856; // 0x8058
+ field public static final int GL_SAMPLER_EXTERNAL_OES = 36198; // 0x8d66
field public static final int GL_STENCIL_ATTACHMENT_OES = 36128; // 0x8d20
field public static final int GL_STENCIL_INDEX1_OES = 36166; // 0x8d46
field public static final int GL_STENCIL_INDEX4_OES = 36167; // 0x8d47
field public static final int GL_STENCIL_INDEX8_OES = 36168; // 0x8d48
field public static final int GL_TEXTURE_BINDING_CUBE_MAP_OES = 34068; // 0x8514
+ field public static final int GL_TEXTURE_BINDING_EXTERNAL_OES = 36199; // 0x8d67
field public static final int GL_TEXTURE_CROP_RECT_OES = 35741; // 0x8b9d
field public static final int GL_TEXTURE_CUBE_MAP_NEGATIVE_X_OES = 34070; // 0x8516
field public static final int GL_TEXTURE_CUBE_MAP_NEGATIVE_Y_OES = 34072; // 0x8518
@@ -13612,6 +14459,7 @@
field public static final int GL_TEXTURE_CUBE_MAP_POSITIVE_X_OES = 34069; // 0x8515
field public static final int GL_TEXTURE_CUBE_MAP_POSITIVE_Y_OES = 34071; // 0x8517
field public static final int GL_TEXTURE_CUBE_MAP_POSITIVE_Z_OES = 34073; // 0x8519
+ field public static final int GL_TEXTURE_EXTERNAL_OES = 36197; // 0x8d65
field public static final int GL_TEXTURE_GEN_MODE_OES = 9472; // 0x2500
field public static final int GL_TEXTURE_GEN_STR_OES = 36192; // 0x8d60
field public static final int GL_TEXTURE_MATRIX_FLOAT_AS_INT_BITS_OES = 35215; // 0x898f
@@ -14369,6 +15217,8 @@
field public static final int HONEYCOMB_MR1 = 12; // 0xc
field public static final int HONEYCOMB_MR2 = 13; // 0xd
field public static final int ICE_CREAM_SANDWICH = 14; // 0xe
+ field public static final int ICE_CREAM_SANDWICH_MR1 = 15; // 0xf
+ field public static final int JELLY_BEAN = 16; // 0x10
}
public final class Bundle implements java.lang.Cloneable android.os.Parcelable {
@@ -14463,6 +15313,18 @@
field public static final android.os.Bundle EMPTY;
}
+ public final class CancellationSignal {
+ ctor public CancellationSignal();
+ method public void cancel();
+ method public boolean isCanceled();
+ method public void setOnCancelListener(android.os.CancellationSignal.OnCancelListener);
+ method public void throwIfCanceled();
+ }
+
+ public static abstract interface CancellationSignal.OnCancelListener {
+ method public abstract void onCancel();
+ }
+
public class ConditionVariable {
ctor public ConditionVariable();
ctor public ConditionVariable(boolean);
@@ -14734,6 +15596,7 @@
field public static final int FLAG_ONEWAY = 1; // 0x1
field public static final int INTERFACE_TRANSACTION = 1598968902; // 0x5f4e5446
field public static final int LAST_CALL_TRANSACTION = 16777215; // 0xffffff
+ field public static final int LIKE_TRANSACTION = 1598835019; // 0x5f4c494b
field public static final int PING_TRANSACTION = 1599098439; // 0x5f504e47
field public static final int TWEET_TRANSACTION = 1599362900; // 0x5f545754
}
@@ -14748,7 +15611,7 @@
public class Looper {
method public void dump(android.util.Printer, java.lang.String);
- method public static synchronized android.os.Looper getMainLooper();
+ method public static android.os.Looper getMainLooper();
method public java.lang.Thread getThread();
method public static void loop();
method public static android.os.Looper myLooper();
@@ -14826,6 +15689,11 @@
ctor public NetworkOnMainThreadException();
}
+ public class OperationCanceledException extends java.lang.RuntimeException {
+ ctor public OperationCanceledException();
+ ctor public OperationCanceledException(java.lang.String);
+ }
+
public final class Parcel {
method public final void appendFrom(android.os.Parcel, int, int);
method public final android.os.IBinder[] createBinderArray();
@@ -14930,7 +15798,7 @@
field public static final android.os.Parcelable.Creator STRING_CREATOR;
}
- public class ParcelFileDescriptor implements android.os.Parcelable {
+ public class ParcelFileDescriptor implements java.io.Closeable android.os.Parcelable {
ctor public ParcelFileDescriptor(android.os.ParcelFileDescriptor);
method public static android.os.ParcelFileDescriptor adoptFd(int);
method public void close() throws java.io.IOException;
@@ -15049,7 +15917,7 @@
method public static final deprecated boolean supportsProcesses();
field public static final int BLUETOOTH_GID = 2000; // 0x7d0
field public static final int FIRST_APPLICATION_UID = 10000; // 0x2710
- field public static final int LAST_APPLICATION_UID = 19999; // 0x1869f
+ field public static final int LAST_APPLICATION_UID = 19999; // 0x4e1f
field public static final int PHONE_UID = 1001; // 0x3e9
field public static final int SIGNAL_KILL = 9; // 0x9
field public static final int SIGNAL_QUIT = 3; // 0x3
@@ -15095,6 +15963,7 @@
public class RemoteException extends android.util.AndroidException {
ctor public RemoteException();
+ ctor public RemoteException(java.lang.String);
}
public class ResultReceiver implements android.os.Parcelable {
@@ -15163,6 +16032,7 @@
method public android.os.StrictMode.VmPolicy.Builder detectActivityLeaks();
method public android.os.StrictMode.VmPolicy.Builder detectAll();
method public android.os.StrictMode.VmPolicy.Builder detectLeakedClosableObjects();
+ method public android.os.StrictMode.VmPolicy.Builder detectLeakedRegistrationObjects();
method public android.os.StrictMode.VmPolicy.Builder detectLeakedSqlLiteObjects();
method public android.os.StrictMode.VmPolicy.Builder penaltyDeath();
method public android.os.StrictMode.VmPolicy.Builder penaltyDropBox();
@@ -15184,11 +16054,16 @@
method public abstract void acquired();
method public void cleanup(android.os.IBinder, boolean);
method public void dump();
+ method public void dump(java.io.PrintWriter);
method public boolean isAcquired();
method public void release(android.os.IBinder);
method public abstract void released();
}
+ public class TransactionTooLargeException extends android.os.RemoteException {
+ ctor public TransactionTooLargeException();
+ }
+
public abstract class Vibrator {
method public abstract void cancel();
method public abstract boolean hasVibrator();
@@ -15672,9 +16547,11 @@
public final class CalendarContract {
field public static final java.lang.String ACCOUNT_TYPE_LOCAL = "LOCAL";
field public static final java.lang.String ACTION_EVENT_REMINDER = "android.intent.action.EVENT_REMINDER";
+ field public static final java.lang.String ACTION_HANDLE_CUSTOM_EVENT = "android.provider.calendar.action.HANDLE_CUSTOM_EVENT";
field public static final java.lang.String AUTHORITY = "com.android.calendar";
field public static final java.lang.String CALLER_IS_SYNCADAPTER = "caller_is_syncadapter";
field public static final android.net.Uri CONTENT_URI;
+ field public static final java.lang.String EXTRA_CUSTOM_APP_URI = "customAppUri";
field public static final java.lang.String EXTRA_EVENT_ALL_DAY = "allDay";
field public static final java.lang.String EXTRA_EVENT_BEGIN_TIME = "beginTime";
field public static final java.lang.String EXTRA_EVENT_END_TIME = "endTime";
@@ -15687,6 +16564,8 @@
protected static abstract interface CalendarContract.AttendeesColumns {
field public static final java.lang.String ATTENDEE_EMAIL = "attendeeEmail";
+ field public static final java.lang.String ATTENDEE_IDENTITY = "attendeeIdentity";
+ field public static final java.lang.String ATTENDEE_ID_NAMESPACE = "attendeeIdNamespace";
field public static final java.lang.String ATTENDEE_NAME = "attendeeName";
field public static final java.lang.String ATTENDEE_RELATIONSHIP = "attendeeRelationship";
field public static final java.lang.String ATTENDEE_STATUS = "attendeeStatus";
@@ -15705,6 +16584,7 @@
field public static final int TYPE_NONE = 0; // 0x0
field public static final int TYPE_OPTIONAL = 2; // 0x2
field public static final int TYPE_REQUIRED = 1; // 0x1
+ field public static final int TYPE_RESOURCE = 3; // 0x3
}
public static final class CalendarContract.CalendarAlerts implements android.provider.BaseColumns android.provider.CalendarContract.CalendarAlertsColumns android.provider.CalendarContract.CalendarColumns android.provider.CalendarContract.EventsColumns {
@@ -15743,9 +16623,12 @@
}
protected static abstract interface CalendarContract.CalendarColumns {
+ field public static final java.lang.String ALLOWED_ATTENDEE_TYPES = "allowedAttendeeTypes";
+ field public static final java.lang.String ALLOWED_AVAILABILITY = "allowedAvailability";
field public static final java.lang.String ALLOWED_REMINDERS = "allowedReminders";
field public static final java.lang.String CALENDAR_ACCESS_LEVEL = "calendar_access_level";
field public static final java.lang.String CALENDAR_COLOR = "calendar_color";
+ field public static final java.lang.String CALENDAR_COLOR_KEY = "calendar_color_index";
field public static final java.lang.String CALENDAR_DISPLAY_NAME = "calendar_displayName";
field public static final java.lang.String CALENDAR_TIME_ZONE = "calendar_timezone";
field public static final int CAL_ACCESS_CONTRIBUTOR = 500; // 0x1f4
@@ -15790,6 +16673,18 @@
field public static final java.lang.String NAME = "name";
}
+ public static final class CalendarContract.Colors implements android.provider.CalendarContract.ColorsColumns {
+ field public static final android.net.Uri CONTENT_URI;
+ }
+
+ protected static abstract interface CalendarContract.ColorsColumns implements android.provider.SyncStateContract.Columns {
+ field public static final java.lang.String COLOR = "color";
+ field public static final java.lang.String COLOR_KEY = "color_index";
+ field public static final java.lang.String COLOR_TYPE = "color_type";
+ field public static final int TYPE_CALENDAR = 0; // 0x0
+ field public static final int TYPE_EVENT = 1; // 0x1
+ }
+
public static final class CalendarContract.EventDays implements android.provider.CalendarContract.EventDaysColumns {
method public static final android.database.Cursor query(android.content.ContentResolver, int, int, java.lang.String[]);
field public static final android.net.Uri CONTENT_URI;
@@ -15815,13 +16710,18 @@
field public static final java.lang.String AVAILABILITY = "availability";
field public static final int AVAILABILITY_BUSY = 0; // 0x0
field public static final int AVAILABILITY_FREE = 1; // 0x1
+ field public static final int AVAILABILITY_TENTATIVE = 2; // 0x2
field public static final java.lang.String CALENDAR_ID = "calendar_id";
field public static final java.lang.String CAN_INVITE_OTHERS = "canInviteOthers";
+ field public static final java.lang.String CUSTOM_APP_PACKAGE = "customAppPackage";
+ field public static final java.lang.String CUSTOM_APP_URI = "customAppUri";
field public static final java.lang.String DESCRIPTION = "description";
+ field public static final java.lang.String DISPLAY_COLOR = "displayColor";
field public static final java.lang.String DTEND = "dtend";
field public static final java.lang.String DTSTART = "dtstart";
field public static final java.lang.String DURATION = "duration";
field public static final java.lang.String EVENT_COLOR = "eventColor";
+ field public static final java.lang.String EVENT_COLOR_KEY = "eventColor_index";
field public static final java.lang.String EVENT_END_TIMEZONE = "eventEndTimezone";
field public static final java.lang.String EVENT_LOCATION = "eventLocation";
field public static final java.lang.String EVENT_TIMEZONE = "eventTimezone";
@@ -15900,6 +16800,7 @@
protected static abstract interface CalendarContract.RemindersColumns {
field public static final java.lang.String EVENT_ID = "event_id";
field public static final java.lang.String METHOD = "method";
+ field public static final int METHOD_ALARM = 4; // 0x4
field public static final int METHOD_ALERT = 1; // 0x1
field public static final int METHOD_DEFAULT = 0; // 0x0
field public static final int METHOD_EMAIL = 2; // 0x2
@@ -16385,6 +17286,7 @@
field public static final java.lang.String CONTENT_ITEM_TYPE = "vnd.android.cursor.item/phone_v2";
field public static final java.lang.String CONTENT_TYPE = "vnd.android.cursor.dir/phone_v2";
field public static final android.net.Uri CONTENT_URI;
+ field public static final java.lang.String NORMALIZED_NUMBER = "data4";
field public static final java.lang.String NUMBER = "data1";
field public static final int TYPE_ASSISTANT = 19; // 0x13
field public static final int TYPE_CALLBACK = 8; // 0x8
@@ -16521,7 +17423,7 @@
method public static android.net.Uri getLookupUri(android.content.ContentResolver, android.net.Uri);
method public static android.net.Uri getLookupUri(long, java.lang.String);
method public static android.net.Uri lookupContact(android.content.ContentResolver, android.net.Uri);
- method public static void markAsContacted(android.content.ContentResolver, long);
+ method public static deprecated void markAsContacted(android.content.ContentResolver, long);
method public static java.io.InputStream openContactPhotoInputStream(android.content.ContentResolver, android.net.Uri, boolean);
method public static java.io.InputStream openContactPhotoInputStream(android.content.ContentResolver, android.net.Uri);
field public static final android.net.Uri CONTENT_FILTER_URI;
@@ -16557,6 +17459,10 @@
field public static final java.lang.String PHOTO_FILE_ID = "data14";
}
+ public static final class ContactsContract.Contacts.StreamItems implements android.provider.ContactsContract.StreamItemsColumns {
+ field public static final java.lang.String CONTENT_DIRECTORY = "stream_items";
+ }
+
protected static abstract interface ContactsContract.ContactsColumns {
field public static final java.lang.String DISPLAY_NAME = "display_name";
field public static final java.lang.String HAS_PHONE_NUMBER = "has_phone_number";
@@ -16608,6 +17514,7 @@
public static final class ContactsContract.DataUsageFeedback {
ctor public ContactsContract.DataUsageFeedback();
+ field public static final android.net.Uri DELETE_USAGE_URI;
field public static final android.net.Uri FEEDBACK_URI;
field public static final java.lang.String USAGE_TYPE = "type";
field public static final java.lang.String USAGE_TYPE_CALL = "call";
@@ -16741,6 +17648,7 @@
protected static abstract interface ContactsContract.PhoneLookupColumns {
field public static final java.lang.String LABEL = "label";
+ field public static final java.lang.String NORMALIZED_NUMBER = "normalized_number";
field public static final java.lang.String NUMBER = "number";
field public static final java.lang.String TYPE = "type";
}
@@ -16814,6 +17722,10 @@
field public static final java.lang.String DATA_ID = "data_id";
}
+ public static final class ContactsContract.RawContacts.StreamItems implements android.provider.BaseColumns android.provider.ContactsContract.StreamItemsColumns {
+ field public static final java.lang.String CONTENT_DIRECTORY = "stream_items";
+ }
+
protected static abstract interface ContactsContract.RawContactsColumns {
field public static final java.lang.String AGGREGATION_MODE = "aggregation_mode";
field public static final java.lang.String CONTACT_ID = "contact_id";
@@ -16877,6 +17789,56 @@
field public static final android.net.Uri PROFILE_CONTENT_URI;
}
+ public static final class ContactsContract.StreamItemPhotos implements android.provider.BaseColumns android.provider.ContactsContract.StreamItemPhotosColumns {
+ field public static final java.lang.String PHOTO = "photo";
+ }
+
+ protected static abstract interface ContactsContract.StreamItemPhotosColumns {
+ field public static final java.lang.String PHOTO_FILE_ID = "photo_file_id";
+ field public static final java.lang.String PHOTO_URI = "photo_uri";
+ field public static final java.lang.String SORT_INDEX = "sort_index";
+ field public static final java.lang.String STREAM_ITEM_ID = "stream_item_id";
+ field public static final java.lang.String SYNC1 = "stream_item_photo_sync1";
+ field public static final java.lang.String SYNC2 = "stream_item_photo_sync2";
+ field public static final java.lang.String SYNC3 = "stream_item_photo_sync3";
+ field public static final java.lang.String SYNC4 = "stream_item_photo_sync4";
+ }
+
+ public static final class ContactsContract.StreamItems implements android.provider.BaseColumns android.provider.ContactsContract.StreamItemsColumns {
+ field public static final java.lang.String CONTENT_ITEM_TYPE = "vnd.android.cursor.item/stream_item";
+ field public static final android.net.Uri CONTENT_LIMIT_URI;
+ field public static final android.net.Uri CONTENT_PHOTO_URI;
+ field public static final java.lang.String CONTENT_TYPE = "vnd.android.cursor.dir/stream_item";
+ field public static final android.net.Uri CONTENT_URI;
+ field public static final java.lang.String MAX_ITEMS = "max_items";
+ }
+
+ public static final class ContactsContract.StreamItems.StreamItemPhotos implements android.provider.BaseColumns android.provider.ContactsContract.StreamItemPhotosColumns {
+ field public static final java.lang.String CONTENT_DIRECTORY = "photo";
+ field public static final java.lang.String CONTENT_ITEM_TYPE = "vnd.android.cursor.item/stream_item_photo";
+ field public static final java.lang.String CONTENT_TYPE = "vnd.android.cursor.dir/stream_item_photo";
+ }
+
+ protected static abstract interface ContactsContract.StreamItemsColumns {
+ field public static final java.lang.String ACCOUNT_NAME = "account_name";
+ field public static final java.lang.String ACCOUNT_TYPE = "account_type";
+ field public static final java.lang.String COMMENTS = "comments";
+ field public static final java.lang.String CONTACT_ID = "contact_id";
+ field public static final java.lang.String CONTACT_LOOKUP_KEY = "contact_lookup";
+ field public static final java.lang.String DATA_SET = "data_set";
+ field public static final java.lang.String RAW_CONTACT_ID = "raw_contact_id";
+ field public static final java.lang.String RAW_CONTACT_SOURCE_ID = "raw_contact_source_id";
+ field public static final java.lang.String RES_ICON = "icon";
+ field public static final java.lang.String RES_LABEL = "label";
+ field public static final java.lang.String RES_PACKAGE = "res_package";
+ field public static final java.lang.String SYNC1 = "stream_item_sync1";
+ field public static final java.lang.String SYNC2 = "stream_item_sync2";
+ field public static final java.lang.String SYNC3 = "stream_item_sync3";
+ field public static final java.lang.String SYNC4 = "stream_item_sync4";
+ field public static final java.lang.String TEXT = "text";
+ field public static final java.lang.String TIMESTAMP = "timestamp";
+ }
+
protected static abstract interface ContactsContract.SyncColumns implements android.provider.ContactsContract.BaseSyncColumns {
field public static final java.lang.String ACCOUNT_NAME = "account_name";
field public static final java.lang.String ACCOUNT_TYPE = "account_type";
@@ -16931,7 +17893,7 @@
field public static final java.lang.String EXTRA_VIDEO_QUALITY = "android.intent.extra.videoQuality";
field public static final java.lang.String INTENT_ACTION_MEDIA_PLAY_FROM_SEARCH = "android.media.action.MEDIA_PLAY_FROM_SEARCH";
field public static final java.lang.String INTENT_ACTION_MEDIA_SEARCH = "android.intent.action.MEDIA_SEARCH";
- field public static final java.lang.String INTENT_ACTION_MUSIC_PLAYER = "android.intent.action.MUSIC_PLAYER";
+ field public static final deprecated java.lang.String INTENT_ACTION_MUSIC_PLAYER = "android.intent.action.MUSIC_PLAYER";
field public static final java.lang.String INTENT_ACTION_STILL_IMAGE_CAMERA = "android.media.action.STILL_IMAGE_CAMERA";
field public static final java.lang.String INTENT_ACTION_VIDEO_CAMERA = "android.media.action.VIDEO_CAMERA";
field public static final java.lang.String MEDIA_IGNORE_FILENAME = ".nomedia";
@@ -17152,9 +18114,11 @@
field public static final java.lang.String DATE_ADDED = "date_added";
field public static final java.lang.String DATE_MODIFIED = "date_modified";
field public static final java.lang.String DISPLAY_NAME = "_display_name";
+ field public static final java.lang.String HEIGHT = "height";
field public static final java.lang.String MIME_TYPE = "mime_type";
field public static final java.lang.String SIZE = "_size";
field public static final java.lang.String TITLE = "title";
+ field public static final java.lang.String WIDTH = "width";
}
public static final class MediaStore.Video {
@@ -17253,6 +18217,7 @@
field public static final java.lang.String ACTION_MEMORY_CARD_SETTINGS = "android.settings.MEMORY_CARD_SETTINGS";
field public static final java.lang.String ACTION_NETWORK_OPERATOR_SETTINGS = "android.settings.NETWORK_OPERATOR_SETTINGS";
field public static final java.lang.String ACTION_NFCSHARING_SETTINGS = "android.settings.NFCSHARING_SETTINGS";
+ field public static final java.lang.String ACTION_NFC_SETTINGS = "android.settings.NFC_SETTINGS";
field public static final java.lang.String ACTION_PRIVACY_SETTINGS = "android.settings.PRIVACY_SETTINGS";
field public static final java.lang.String ACTION_QUICK_LAUNCH_SETTINGS = "android.settings.QUICK_LAUNCH_SETTINGS";
field public static final java.lang.String ACTION_SEARCH_SETTINGS = "android.search.action.SEARCH_SETTINGS";
@@ -17294,6 +18259,7 @@
method public static boolean putString(android.content.ContentResolver, java.lang.String, java.lang.String);
method public static final void setLocationProviderEnabled(android.content.ContentResolver, java.lang.String, boolean);
field public static final java.lang.String ACCESSIBILITY_ENABLED = "accessibility_enabled";
+ field public static final java.lang.String ACCESSIBILITY_SPEAK_PASSWORD = "speak_password";
field public static final java.lang.String ADB_ENABLED = "adb_enabled";
field public static final java.lang.String ALLOWED_GEOLOCATION_ORIGINS = "allowed_geolocation_origins";
field public static final java.lang.String ALLOW_MOCK_LOCATION = "mock_location";
@@ -17303,6 +18269,7 @@
field public static final android.net.Uri CONTENT_URI;
field public static final java.lang.String DATA_ROAMING = "data_roaming";
field public static final java.lang.String DEFAULT_INPUT_METHOD = "default_input_method";
+ field public static final java.lang.String DEVELOPMENT_SETTINGS_ENABLED = "development_settings_enabled";
field public static final java.lang.String DEVICE_PROVISIONED = "device_provisioned";
field public static final java.lang.String ENABLED_ACCESSIBILITY_SERVICES = "enabled_accessibility_services";
field public static final java.lang.String ENABLED_INPUT_METHODS = "enabled_input_methods";
@@ -17381,6 +18348,7 @@
field public static final java.lang.String ALARM_ALERT = "alarm_alert";
field public static final java.lang.String ALWAYS_FINISH_ACTIVITIES = "always_finish_activities";
field public static final deprecated java.lang.String ANDROID_ID = "android_id";
+ field public static final java.lang.String ANIMATOR_DURATION_SCALE = "animator_duration_scale";
field public static final java.lang.String APPEND_FOR_LAST_AUDIBLE = "_last_audible";
field public static final java.lang.String AUTO_TIME = "auto_time";
field public static final java.lang.String AUTO_TIME_ZONE = "auto_time_zone";
@@ -17518,7 +18486,8 @@
public static class UserDictionary.Words implements android.provider.BaseColumns {
ctor public UserDictionary.Words();
- method public static void addWord(android.content.Context, java.lang.String, int, int);
+ method public static deprecated void addWord(android.content.Context, java.lang.String, int, int);
+ method public static void addWord(android.content.Context, java.lang.String, int, java.lang.String, java.util.Locale);
field public static final java.lang.String APP_ID = "appid";
field public static final java.lang.String CONTENT_ITEM_TYPE = "vnd.android.cursor.item/vnd.google.userword";
field public static final java.lang.String CONTENT_TYPE = "vnd.android.cursor.dir/vnd.google.userword";
@@ -17526,8 +18495,9 @@
field public static final java.lang.String DEFAULT_SORT_ORDER = "frequency DESC";
field public static final java.lang.String FREQUENCY = "frequency";
field public static final java.lang.String LOCALE = "locale";
- field public static final int LOCALE_TYPE_ALL = 0; // 0x0
- field public static final int LOCALE_TYPE_CURRENT = 1; // 0x1
+ field public static final deprecated int LOCALE_TYPE_ALL = 0; // 0x0
+ field public static final deprecated int LOCALE_TYPE_CURRENT = 1; // 0x1
+ field public static final java.lang.String SHORTCUT = "shortcut";
field public static final java.lang.String WORD = "word";
field public static final java.lang.String _ID = "_id";
}
@@ -17626,15 +18596,24 @@
method public static android.renderscript.Allocation createTyped(android.renderscript.RenderScript, android.renderscript.Type, int);
method public static android.renderscript.Allocation createTyped(android.renderscript.RenderScript, android.renderscript.Type);
method public void generateMipmaps();
+ method public int getBytesSize();
+ method public android.renderscript.Element getElement();
+ method public android.view.Surface getSurface();
method public android.renderscript.Type getType();
+ method public int getUsage();
+ method public void ioReceive();
+ method public void ioSend();
method public synchronized void resize(int);
method public void setFromFieldPacker(int, android.renderscript.FieldPacker);
method public void setFromFieldPacker(int, int, android.renderscript.FieldPacker);
+ method public void setSurface(android.view.Surface);
method public void syncAll(int);
field public static final int USAGE_GRAPHICS_CONSTANTS = 8; // 0x8
field public static final int USAGE_GRAPHICS_RENDER_TARGET = 16; // 0x10
field public static final int USAGE_GRAPHICS_TEXTURE = 2; // 0x2
field public static final int USAGE_GRAPHICS_VERTEX = 4; // 0x4
+ field public static final int USAGE_IO_INPUT = 32; // 0x20
+ field public static final int USAGE_IO_OUTPUT = 64; // 0x40
field public static final int USAGE_SCRIPT = 1; // 0x1
}
@@ -17722,6 +18701,7 @@
method public static android.renderscript.Element F64_2(android.renderscript.RenderScript);
method public static android.renderscript.Element F64_3(android.renderscript.RenderScript);
method public static android.renderscript.Element F64_4(android.renderscript.RenderScript);
+ method public static android.renderscript.Element FONT(android.renderscript.RenderScript);
method public static android.renderscript.Element I16(android.renderscript.RenderScript);
method public static android.renderscript.Element I16_2(android.renderscript.RenderScript);
method public static android.renderscript.Element I16_3(android.renderscript.RenderScript);
@@ -17738,7 +18718,7 @@
method public static android.renderscript.Element I8_2(android.renderscript.RenderScript);
method public static android.renderscript.Element I8_3(android.renderscript.RenderScript);
method public static android.renderscript.Element I8_4(android.renderscript.RenderScript);
- method public static android.renderscript.Element MATRIX4X4(android.renderscript.RenderScript);
+ method public static deprecated android.renderscript.Element MATRIX4X4(android.renderscript.RenderScript);
method public static android.renderscript.Element MATRIX_2X2(android.renderscript.RenderScript);
method public static android.renderscript.Element MATRIX_3X3(android.renderscript.RenderScript);
method public static android.renderscript.Element MATRIX_4X4(android.renderscript.RenderScript);
@@ -17773,6 +18753,15 @@
method public static android.renderscript.Element U8_4(android.renderscript.RenderScript);
method public static android.renderscript.Element createPixel(android.renderscript.RenderScript, android.renderscript.Element.DataType, android.renderscript.Element.DataKind);
method public static android.renderscript.Element createVector(android.renderscript.RenderScript, android.renderscript.Element.DataType, int);
+ method public int getBytesSize();
+ method public android.renderscript.Element.DataKind getDataKind();
+ method public android.renderscript.Element.DataType getDataType();
+ method public android.renderscript.Element getSubElement(int);
+ method public int getSubElementArraySize(int);
+ method public int getSubElementCount();
+ method public java.lang.String getSubElementName(int);
+ method public int getSubElementOffsetBytes(int);
+ method public int getVectorSize();
method public boolean isCompatible(android.renderscript.Element);
method public boolean isComplex();
}
@@ -17805,8 +18794,10 @@
enum_constant public static final android.renderscript.Element.DataType MATRIX_2X2;
enum_constant public static final android.renderscript.Element.DataType MATRIX_3X3;
enum_constant public static final android.renderscript.Element.DataType MATRIX_4X4;
+ enum_constant public static final android.renderscript.Element.DataType NONE;
enum_constant public static final android.renderscript.Element.DataType RS_ALLOCATION;
enum_constant public static final android.renderscript.Element.DataType RS_ELEMENT;
+ enum_constant public static final android.renderscript.Element.DataType RS_FONT;
enum_constant public static final android.renderscript.Element.DataType RS_MESH;
enum_constant public static final android.renderscript.Element.DataType RS_PROGRAM_FRAGMENT;
enum_constant public static final android.renderscript.Element.DataType RS_PROGRAM_RASTER;
@@ -17882,27 +18873,27 @@
method public void skip(int);
}
- public class FileA3D extends android.renderscript.BaseObj {
- method public static android.renderscript.FileA3D createFromAsset(android.renderscript.RenderScript, android.content.res.AssetManager, java.lang.String);
- method public static android.renderscript.FileA3D createFromFile(android.renderscript.RenderScript, java.lang.String);
- method public static android.renderscript.FileA3D createFromFile(android.renderscript.RenderScript, java.io.File);
- method public static android.renderscript.FileA3D createFromResource(android.renderscript.RenderScript, android.content.res.Resources, int);
- method public android.renderscript.FileA3D.IndexEntry getIndexEntry(int);
- method public int getIndexEntryCount();
+ public deprecated class FileA3D extends android.renderscript.BaseObj {
+ method public static deprecated android.renderscript.FileA3D createFromAsset(android.renderscript.RenderScript, android.content.res.AssetManager, java.lang.String);
+ method public static deprecated android.renderscript.FileA3D createFromFile(android.renderscript.RenderScript, java.lang.String);
+ method public static deprecated android.renderscript.FileA3D createFromFile(android.renderscript.RenderScript, java.io.File);
+ method public static deprecated android.renderscript.FileA3D createFromResource(android.renderscript.RenderScript, android.content.res.Resources, int);
+ method public deprecated android.renderscript.FileA3D.IndexEntry getIndexEntry(int);
+ method public deprecated int getIndexEntryCount();
}
- public static final class FileA3D.EntryType extends java.lang.Enum {
+ public static final deprecated class FileA3D.EntryType extends java.lang.Enum {
method public static android.renderscript.FileA3D.EntryType valueOf(java.lang.String);
method public static final android.renderscript.FileA3D.EntryType[] values();
- enum_constant public static final android.renderscript.FileA3D.EntryType MESH;
- enum_constant public static final android.renderscript.FileA3D.EntryType UNKNOWN;
+ enum_constant public static final deprecated android.renderscript.FileA3D.EntryType MESH;
+ enum_constant public static final deprecated android.renderscript.FileA3D.EntryType UNKNOWN;
}
- public static class FileA3D.IndexEntry {
- method public android.renderscript.FileA3D.EntryType getEntryType();
- method public android.renderscript.Mesh getMesh();
- method public java.lang.String getName();
- method public android.renderscript.BaseObj getObject();
+ public static deprecated class FileA3D.IndexEntry {
+ method public deprecated android.renderscript.FileA3D.EntryType getEntryType();
+ method public deprecated android.renderscript.Mesh getMesh();
+ method public deprecated java.lang.String getName();
+ method public deprecated android.renderscript.BaseObj getObject();
}
public class Float2 {
@@ -17929,21 +18920,21 @@
field public float z;
}
- public class Font extends android.renderscript.BaseObj {
- method public static android.renderscript.Font create(android.renderscript.RenderScript, android.content.res.Resources, java.lang.String, android.renderscript.Font.Style, float);
- method public static android.renderscript.Font createFromAsset(android.renderscript.RenderScript, android.content.res.Resources, java.lang.String, float);
- method public static android.renderscript.Font createFromFile(android.renderscript.RenderScript, android.content.res.Resources, java.lang.String, float);
- method public static android.renderscript.Font createFromFile(android.renderscript.RenderScript, android.content.res.Resources, java.io.File, float);
- method public static android.renderscript.Font createFromResource(android.renderscript.RenderScript, android.content.res.Resources, int, float);
+ public deprecated class Font extends android.renderscript.BaseObj {
+ method public static deprecated android.renderscript.Font create(android.renderscript.RenderScript, android.content.res.Resources, java.lang.String, android.renderscript.Font.Style, float);
+ method public static deprecated android.renderscript.Font createFromAsset(android.renderscript.RenderScript, android.content.res.Resources, java.lang.String, float);
+ method public static deprecated android.renderscript.Font createFromFile(android.renderscript.RenderScript, android.content.res.Resources, java.lang.String, float);
+ method public static deprecated android.renderscript.Font createFromFile(android.renderscript.RenderScript, android.content.res.Resources, java.io.File, float);
+ method public static deprecated android.renderscript.Font createFromResource(android.renderscript.RenderScript, android.content.res.Resources, int, float);
}
- public static final class Font.Style extends java.lang.Enum {
+ public static final deprecated class Font.Style extends java.lang.Enum {
method public static android.renderscript.Font.Style valueOf(java.lang.String);
method public static final android.renderscript.Font.Style[] values();
- enum_constant public static final android.renderscript.Font.Style BOLD;
- enum_constant public static final android.renderscript.Font.Style BOLD_ITALIC;
- enum_constant public static final android.renderscript.Font.Style ITALIC;
- enum_constant public static final android.renderscript.Font.Style NORMAL;
+ enum_constant public static final deprecated android.renderscript.Font.Style BOLD;
+ enum_constant public static final deprecated android.renderscript.Font.Style BOLD_ITALIC;
+ enum_constant public static final deprecated android.renderscript.Font.Style ITALIC;
+ enum_constant public static final deprecated android.renderscript.Font.Style NORMAL;
}
public class Int2 {
@@ -18060,71 +19051,77 @@
method public void transpose();
}
- public class Mesh extends android.renderscript.BaseObj {
- method public android.renderscript.Allocation getIndexSetAllocation(int);
- method public android.renderscript.Mesh.Primitive getPrimitive(int);
- method public int getPrimitiveCount();
- method public android.renderscript.Allocation getVertexAllocation(int);
- method public int getVertexAllocationCount();
+ public deprecated class Mesh extends android.renderscript.BaseObj {
+ method public deprecated android.renderscript.Allocation getIndexSetAllocation(int);
+ method public deprecated android.renderscript.Mesh.Primitive getPrimitive(int);
+ method public deprecated int getPrimitiveCount();
+ method public deprecated android.renderscript.Allocation getVertexAllocation(int);
+ method public deprecated int getVertexAllocationCount();
}
- public static class Mesh.AllocationBuilder {
- ctor public Mesh.AllocationBuilder(android.renderscript.RenderScript);
- method public android.renderscript.Mesh.AllocationBuilder addIndexSetAllocation(android.renderscript.Allocation, android.renderscript.Mesh.Primitive);
- method public android.renderscript.Mesh.AllocationBuilder addIndexSetType(android.renderscript.Mesh.Primitive);
- method public android.renderscript.Mesh.AllocationBuilder addVertexAllocation(android.renderscript.Allocation) throws java.lang.IllegalStateException;
- method public android.renderscript.Mesh create();
- method public int getCurrentIndexSetIndex();
- method public int getCurrentVertexTypeIndex();
+ public static deprecated class Mesh.AllocationBuilder {
+ ctor public deprecated Mesh.AllocationBuilder(android.renderscript.RenderScript);
+ method public deprecated android.renderscript.Mesh.AllocationBuilder addIndexSetAllocation(android.renderscript.Allocation, android.renderscript.Mesh.Primitive);
+ method public deprecated android.renderscript.Mesh.AllocationBuilder addIndexSetType(android.renderscript.Mesh.Primitive);
+ method public deprecated android.renderscript.Mesh.AllocationBuilder addVertexAllocation(android.renderscript.Allocation) throws java.lang.IllegalStateException;
+ method public deprecated android.renderscript.Mesh create();
+ method public deprecated int getCurrentIndexSetIndex();
+ method public deprecated int getCurrentVertexTypeIndex();
}
- public static class Mesh.Builder {
- ctor public Mesh.Builder(android.renderscript.RenderScript, int);
- method public android.renderscript.Mesh.Builder addIndexSetType(android.renderscript.Type, android.renderscript.Mesh.Primitive);
- method public android.renderscript.Mesh.Builder addIndexSetType(android.renderscript.Mesh.Primitive);
- method public android.renderscript.Mesh.Builder addIndexSetType(android.renderscript.Element, int, android.renderscript.Mesh.Primitive);
- method public android.renderscript.Mesh.Builder addVertexType(android.renderscript.Type) throws java.lang.IllegalStateException;
- method public android.renderscript.Mesh.Builder addVertexType(android.renderscript.Element, int) throws java.lang.IllegalStateException;
- method public android.renderscript.Mesh create();
- method public int getCurrentIndexSetIndex();
- method public int getCurrentVertexTypeIndex();
+ public static deprecated class Mesh.Builder {
+ ctor public deprecated Mesh.Builder(android.renderscript.RenderScript, int);
+ method public deprecated android.renderscript.Mesh.Builder addIndexSetType(android.renderscript.Type, android.renderscript.Mesh.Primitive);
+ method public deprecated android.renderscript.Mesh.Builder addIndexSetType(android.renderscript.Mesh.Primitive);
+ method public deprecated android.renderscript.Mesh.Builder addIndexSetType(android.renderscript.Element, int, android.renderscript.Mesh.Primitive);
+ method public deprecated android.renderscript.Mesh.Builder addVertexType(android.renderscript.Type) throws java.lang.IllegalStateException;
+ method public deprecated android.renderscript.Mesh.Builder addVertexType(android.renderscript.Element, int) throws java.lang.IllegalStateException;
+ method public deprecated android.renderscript.Mesh create();
+ method public deprecated int getCurrentIndexSetIndex();
+ method public deprecated int getCurrentVertexTypeIndex();
}
- public static final class Mesh.Primitive extends java.lang.Enum {
+ public static final deprecated class Mesh.Primitive extends java.lang.Enum {
method public static android.renderscript.Mesh.Primitive valueOf(java.lang.String);
method public static final android.renderscript.Mesh.Primitive[] values();
- enum_constant public static final android.renderscript.Mesh.Primitive LINE;
- enum_constant public static final android.renderscript.Mesh.Primitive LINE_STRIP;
- enum_constant public static final android.renderscript.Mesh.Primitive POINT;
- enum_constant public static final android.renderscript.Mesh.Primitive TRIANGLE;
- enum_constant public static final android.renderscript.Mesh.Primitive TRIANGLE_FAN;
- enum_constant public static final android.renderscript.Mesh.Primitive TRIANGLE_STRIP;
+ enum_constant public static final deprecated android.renderscript.Mesh.Primitive LINE;
+ enum_constant public static final deprecated android.renderscript.Mesh.Primitive LINE_STRIP;
+ enum_constant public static final deprecated android.renderscript.Mesh.Primitive POINT;
+ enum_constant public static final deprecated android.renderscript.Mesh.Primitive TRIANGLE;
+ enum_constant public static final deprecated android.renderscript.Mesh.Primitive TRIANGLE_FAN;
+ enum_constant public static final deprecated android.renderscript.Mesh.Primitive TRIANGLE_STRIP;
}
- public static class Mesh.TriangleMeshBuilder {
- ctor public Mesh.TriangleMeshBuilder(android.renderscript.RenderScript, int, int);
- method public android.renderscript.Mesh.TriangleMeshBuilder addTriangle(int, int, int);
- method public android.renderscript.Mesh.TriangleMeshBuilder addVertex(float, float);
- method public android.renderscript.Mesh.TriangleMeshBuilder addVertex(float, float, float);
- method public android.renderscript.Mesh create(boolean);
- method public android.renderscript.Mesh.TriangleMeshBuilder setColor(float, float, float, float);
- method public android.renderscript.Mesh.TriangleMeshBuilder setNormal(float, float, float);
- method public android.renderscript.Mesh.TriangleMeshBuilder setTexture(float, float);
- field public static final int COLOR = 1; // 0x1
- field public static final int NORMAL = 2; // 0x2
- field public static final int TEXTURE_0 = 256; // 0x100
+ public static deprecated class Mesh.TriangleMeshBuilder {
+ ctor public deprecated Mesh.TriangleMeshBuilder(android.renderscript.RenderScript, int, int);
+ method public deprecated android.renderscript.Mesh.TriangleMeshBuilder addTriangle(int, int, int);
+ method public deprecated android.renderscript.Mesh.TriangleMeshBuilder addVertex(float, float);
+ method public deprecated android.renderscript.Mesh.TriangleMeshBuilder addVertex(float, float, float);
+ method public deprecated android.renderscript.Mesh create(boolean);
+ method public deprecated android.renderscript.Mesh.TriangleMeshBuilder setColor(float, float, float, float);
+ method public deprecated android.renderscript.Mesh.TriangleMeshBuilder setNormal(float, float, float);
+ method public deprecated android.renderscript.Mesh.TriangleMeshBuilder setTexture(float, float);
+ field public static final deprecated int COLOR = 1; // 0x1
+ field public static final deprecated int NORMAL = 2; // 0x2
+ field public static final deprecated int TEXTURE_0 = 256; // 0x100
}
public class Program extends android.renderscript.BaseObj {
method public void bindConstants(android.renderscript.Allocation, int);
method public void bindSampler(android.renderscript.Sampler, int) throws java.lang.IllegalArgumentException;
method public void bindTexture(android.renderscript.Allocation, int) throws java.lang.IllegalArgumentException;
+ method public android.renderscript.Type getConstant(int);
+ method public int getConstantCount();
+ method public int getTextureCount();
+ method public java.lang.String getTextureName(int);
+ method public android.renderscript.Program.TextureType getTextureType(int);
}
public static class Program.BaseProgramBuilder {
ctor protected Program.BaseProgramBuilder(android.renderscript.RenderScript);
method public android.renderscript.Program.BaseProgramBuilder addConstant(android.renderscript.Type) throws java.lang.IllegalStateException;
method public android.renderscript.Program.BaseProgramBuilder addTexture(android.renderscript.Program.TextureType) throws java.lang.IllegalArgumentException;
+ method public android.renderscript.Program.BaseProgramBuilder addTexture(android.renderscript.Program.TextureType, java.lang.String) throws java.lang.IllegalArgumentException;
method public int getCurrentConstantIndex();
method public int getCurrentTextureIndex();
method protected void initProgram(android.renderscript.Program);
@@ -18139,62 +19136,64 @@
enum_constant public static final android.renderscript.Program.TextureType TEXTURE_CUBE;
}
- public class ProgramFragment extends android.renderscript.Program {
+ public deprecated class ProgramFragment extends android.renderscript.Program {
}
- public static class ProgramFragment.Builder extends android.renderscript.Program.BaseProgramBuilder {
- ctor public ProgramFragment.Builder(android.renderscript.RenderScript);
- method public android.renderscript.ProgramFragment create();
+ public static deprecated class ProgramFragment.Builder extends android.renderscript.Program.BaseProgramBuilder {
+ ctor public deprecated ProgramFragment.Builder(android.renderscript.RenderScript);
+ method public deprecated android.renderscript.ProgramFragment create();
}
- public class ProgramFragmentFixedFunction extends android.renderscript.ProgramFragment {
+ public deprecated class ProgramFragmentFixedFunction extends android.renderscript.ProgramFragment {
}
- public static class ProgramFragmentFixedFunction.Builder {
- ctor public ProgramFragmentFixedFunction.Builder(android.renderscript.RenderScript);
- method public android.renderscript.ProgramFragmentFixedFunction create();
- method public android.renderscript.ProgramFragmentFixedFunction.Builder setPointSpriteTexCoordinateReplacement(boolean);
- method public android.renderscript.ProgramFragmentFixedFunction.Builder setTexture(android.renderscript.ProgramFragmentFixedFunction.Builder.EnvMode, android.renderscript.ProgramFragmentFixedFunction.Builder.Format, int) throws java.lang.IllegalArgumentException;
- method public android.renderscript.ProgramFragmentFixedFunction.Builder setVaryingColor(boolean);
- field public static final int MAX_TEXTURE = 2; // 0x2
+ public static deprecated class ProgramFragmentFixedFunction.Builder {
+ ctor public deprecated ProgramFragmentFixedFunction.Builder(android.renderscript.RenderScript);
+ method public deprecated android.renderscript.ProgramFragmentFixedFunction create();
+ method public deprecated android.renderscript.ProgramFragmentFixedFunction.Builder setPointSpriteTexCoordinateReplacement(boolean);
+ method public deprecated android.renderscript.ProgramFragmentFixedFunction.Builder setTexture(android.renderscript.ProgramFragmentFixedFunction.Builder.EnvMode, android.renderscript.ProgramFragmentFixedFunction.Builder.Format, int) throws java.lang.IllegalArgumentException;
+ method public deprecated android.renderscript.ProgramFragmentFixedFunction.Builder setVaryingColor(boolean);
+ field public static final deprecated int MAX_TEXTURE = 2; // 0x2
}
- public static final class ProgramFragmentFixedFunction.Builder.EnvMode extends java.lang.Enum {
+ public static final deprecated class ProgramFragmentFixedFunction.Builder.EnvMode extends java.lang.Enum {
method public static android.renderscript.ProgramFragmentFixedFunction.Builder.EnvMode valueOf(java.lang.String);
method public static final android.renderscript.ProgramFragmentFixedFunction.Builder.EnvMode[] values();
- enum_constant public static final android.renderscript.ProgramFragmentFixedFunction.Builder.EnvMode DECAL;
- enum_constant public static final android.renderscript.ProgramFragmentFixedFunction.Builder.EnvMode MODULATE;
- enum_constant public static final android.renderscript.ProgramFragmentFixedFunction.Builder.EnvMode REPLACE;
+ enum_constant public static final deprecated android.renderscript.ProgramFragmentFixedFunction.Builder.EnvMode DECAL;
+ enum_constant public static final deprecated android.renderscript.ProgramFragmentFixedFunction.Builder.EnvMode MODULATE;
+ enum_constant public static final deprecated android.renderscript.ProgramFragmentFixedFunction.Builder.EnvMode REPLACE;
}
- public static final class ProgramFragmentFixedFunction.Builder.Format extends java.lang.Enum {
+ public static final deprecated class ProgramFragmentFixedFunction.Builder.Format extends java.lang.Enum {
method public static android.renderscript.ProgramFragmentFixedFunction.Builder.Format valueOf(java.lang.String);
method public static final android.renderscript.ProgramFragmentFixedFunction.Builder.Format[] values();
- enum_constant public static final android.renderscript.ProgramFragmentFixedFunction.Builder.Format ALPHA;
- enum_constant public static final android.renderscript.ProgramFragmentFixedFunction.Builder.Format LUMINANCE_ALPHA;
- enum_constant public static final android.renderscript.ProgramFragmentFixedFunction.Builder.Format RGB;
- enum_constant public static final android.renderscript.ProgramFragmentFixedFunction.Builder.Format RGBA;
+ enum_constant public static final deprecated android.renderscript.ProgramFragmentFixedFunction.Builder.Format ALPHA;
+ enum_constant public static final deprecated android.renderscript.ProgramFragmentFixedFunction.Builder.Format LUMINANCE_ALPHA;
+ enum_constant public static final deprecated android.renderscript.ProgramFragmentFixedFunction.Builder.Format RGB;
+ enum_constant public static final deprecated android.renderscript.ProgramFragmentFixedFunction.Builder.Format RGBA;
}
- public class ProgramRaster extends android.renderscript.BaseObj {
- method public static android.renderscript.ProgramRaster CULL_BACK(android.renderscript.RenderScript);
- method public static android.renderscript.ProgramRaster CULL_FRONT(android.renderscript.RenderScript);
- method public static android.renderscript.ProgramRaster CULL_NONE(android.renderscript.RenderScript);
+ public deprecated class ProgramRaster extends android.renderscript.BaseObj {
+ method public static deprecated android.renderscript.ProgramRaster CULL_BACK(android.renderscript.RenderScript);
+ method public static deprecated android.renderscript.ProgramRaster CULL_FRONT(android.renderscript.RenderScript);
+ method public static deprecated android.renderscript.ProgramRaster CULL_NONE(android.renderscript.RenderScript);
+ method public deprecated android.renderscript.ProgramRaster.CullMode getCullMode();
+ method public deprecated boolean isPointSpriteEnabled();
}
- public static class ProgramRaster.Builder {
- ctor public ProgramRaster.Builder(android.renderscript.RenderScript);
- method public android.renderscript.ProgramRaster create();
- method public android.renderscript.ProgramRaster.Builder setCullMode(android.renderscript.ProgramRaster.CullMode);
- method public android.renderscript.ProgramRaster.Builder setPointSpriteEnabled(boolean);
+ public static deprecated class ProgramRaster.Builder {
+ ctor public deprecated ProgramRaster.Builder(android.renderscript.RenderScript);
+ method public deprecated android.renderscript.ProgramRaster create();
+ method public deprecated android.renderscript.ProgramRaster.Builder setCullMode(android.renderscript.ProgramRaster.CullMode);
+ method public deprecated android.renderscript.ProgramRaster.Builder setPointSpriteEnabled(boolean);
}
- public static final class ProgramRaster.CullMode extends java.lang.Enum {
+ public static final deprecated class ProgramRaster.CullMode extends java.lang.Enum {
method public static android.renderscript.ProgramRaster.CullMode valueOf(java.lang.String);
method public static final android.renderscript.ProgramRaster.CullMode[] values();
- enum_constant public static final android.renderscript.ProgramRaster.CullMode BACK;
- enum_constant public static final android.renderscript.ProgramRaster.CullMode FRONT;
- enum_constant public static final android.renderscript.ProgramRaster.CullMode NONE;
+ enum_constant public static final deprecated android.renderscript.ProgramRaster.CullMode BACK;
+ enum_constant public static final deprecated android.renderscript.ProgramRaster.CullMode FRONT;
+ enum_constant public static final deprecated android.renderscript.ProgramRaster.CullMode NONE;
}
public class ProgramStore extends android.renderscript.BaseObj {
@@ -18202,6 +19201,15 @@
method public static android.renderscript.ProgramStore BLEND_ALPHA_DEPTH_TEST(android.renderscript.RenderScript);
method public static android.renderscript.ProgramStore BLEND_NONE_DEPTH_NONE(android.renderscript.RenderScript);
method public static android.renderscript.ProgramStore BLEND_NONE_DEPTH_TEST(android.renderscript.RenderScript);
+ method public android.renderscript.ProgramStore.BlendDstFunc getBlendDstFunc();
+ method public android.renderscript.ProgramStore.BlendSrcFunc getBlendSrcFunc();
+ method public android.renderscript.ProgramStore.DepthFunc getDepthFunc();
+ method public boolean isColorMaskAlphaEnabled();
+ method public boolean isColorMaskBlueEnabled();
+ method public boolean isColorMaskGreenEnabled();
+ method public boolean isColorMaskRedEnabled();
+ method public boolean isDepthMaskEnabled();
+ method public boolean isDitherEnabled();
}
public static final class ProgramStore.BlendDstFunc extends java.lang.Enum {
@@ -18253,31 +19261,33 @@
enum_constant public static final android.renderscript.ProgramStore.DepthFunc NOT_EQUAL;
}
- public class ProgramVertex extends android.renderscript.Program {
+ public deprecated class ProgramVertex extends android.renderscript.Program {
+ method public deprecated android.renderscript.Element getInput(int);
+ method public deprecated int getInputCount();
}
- public static class ProgramVertex.Builder extends android.renderscript.Program.BaseProgramBuilder {
- ctor public ProgramVertex.Builder(android.renderscript.RenderScript);
- method public android.renderscript.ProgramVertex.Builder addInput(android.renderscript.Element) throws java.lang.IllegalStateException;
- method public android.renderscript.ProgramVertex create();
+ public static deprecated class ProgramVertex.Builder extends android.renderscript.Program.BaseProgramBuilder {
+ ctor public deprecated ProgramVertex.Builder(android.renderscript.RenderScript);
+ method public deprecated android.renderscript.ProgramVertex.Builder addInput(android.renderscript.Element) throws java.lang.IllegalStateException;
+ method public deprecated android.renderscript.ProgramVertex create();
}
- public class ProgramVertexFixedFunction extends android.renderscript.ProgramVertex {
- method public void bindConstants(android.renderscript.ProgramVertexFixedFunction.Constants);
+ public deprecated class ProgramVertexFixedFunction extends android.renderscript.ProgramVertex {
+ method public deprecated void bindConstants(android.renderscript.ProgramVertexFixedFunction.Constants);
}
- public static class ProgramVertexFixedFunction.Builder {
- ctor public ProgramVertexFixedFunction.Builder(android.renderscript.RenderScript);
- method public android.renderscript.ProgramVertexFixedFunction create();
- method public android.renderscript.ProgramVertexFixedFunction.Builder setTextureMatrixEnable(boolean);
+ public static deprecated class ProgramVertexFixedFunction.Builder {
+ ctor public deprecated ProgramVertexFixedFunction.Builder(android.renderscript.RenderScript);
+ method public deprecated android.renderscript.ProgramVertexFixedFunction create();
+ method public deprecated android.renderscript.ProgramVertexFixedFunction.Builder setTextureMatrixEnable(boolean);
}
- public static class ProgramVertexFixedFunction.Constants {
- ctor public ProgramVertexFixedFunction.Constants(android.renderscript.RenderScript);
- method public void destroy();
- method public void setModelview(android.renderscript.Matrix4f);
- method public void setProjection(android.renderscript.Matrix4f);
- method public void setTexture(android.renderscript.Matrix4f);
+ public static deprecated class ProgramVertexFixedFunction.Constants {
+ ctor public deprecated ProgramVertexFixedFunction.Constants(android.renderscript.RenderScript);
+ method public deprecated void destroy();
+ method public deprecated void setModelview(android.renderscript.Matrix4f);
+ method public deprecated void setProjection(android.renderscript.Matrix4f);
+ method public deprecated void setTexture(android.renderscript.Matrix4f);
}
public class RSDriverException extends android.renderscript.RSRuntimeException {
@@ -18296,33 +19306,33 @@
ctor public RSRuntimeException(java.lang.String);
}
- public class RSSurfaceView extends android.view.SurfaceView implements android.view.SurfaceHolder.Callback {
- ctor public RSSurfaceView(android.content.Context);
- ctor public RSSurfaceView(android.content.Context, android.util.AttributeSet);
- method public android.renderscript.RenderScriptGL createRenderScriptGL(android.renderscript.RenderScriptGL.SurfaceConfig);
- method public void destroyRenderScriptGL();
- method public android.renderscript.RenderScriptGL getRenderScriptGL();
- method public void pause();
- method public void resume();
- method public void setRenderScriptGL(android.renderscript.RenderScriptGL);
- method public void surfaceChanged(android.view.SurfaceHolder, int, int, int);
- method public void surfaceCreated(android.view.SurfaceHolder);
- method public void surfaceDestroyed(android.view.SurfaceHolder);
+ public deprecated class RSSurfaceView extends android.view.SurfaceView implements android.view.SurfaceHolder.Callback {
+ ctor public deprecated RSSurfaceView(android.content.Context);
+ ctor public deprecated RSSurfaceView(android.content.Context, android.util.AttributeSet);
+ method public deprecated android.renderscript.RenderScriptGL createRenderScriptGL(android.renderscript.RenderScriptGL.SurfaceConfig);
+ method public deprecated void destroyRenderScriptGL();
+ method public deprecated android.renderscript.RenderScriptGL getRenderScriptGL();
+ method public deprecated void pause();
+ method public deprecated void resume();
+ method public deprecated void setRenderScriptGL(android.renderscript.RenderScriptGL);
+ method public deprecated void surfaceChanged(android.view.SurfaceHolder, int, int, int);
+ method public deprecated void surfaceCreated(android.view.SurfaceHolder);
+ method public deprecated void surfaceDestroyed(android.view.SurfaceHolder);
}
- public class RSTextureView extends android.view.TextureView implements android.view.TextureView.SurfaceTextureListener {
- ctor public RSTextureView(android.content.Context);
- ctor public RSTextureView(android.content.Context, android.util.AttributeSet);
- method public android.renderscript.RenderScriptGL createRenderScriptGL(android.renderscript.RenderScriptGL.SurfaceConfig);
- method public void destroyRenderScriptGL();
- method public android.renderscript.RenderScriptGL getRenderScriptGL();
- method public void onSurfaceTextureAvailable(android.graphics.SurfaceTexture, int, int);
- method public boolean onSurfaceTextureDestroyed(android.graphics.SurfaceTexture);
- method public void onSurfaceTextureSizeChanged(android.graphics.SurfaceTexture, int, int);
- method public void onSurfaceTextureUpdated(android.graphics.SurfaceTexture);
- method public void pause();
- method public void resume();
- method public void setRenderScriptGL(android.renderscript.RenderScriptGL);
+ public deprecated class RSTextureView extends android.view.TextureView implements android.view.TextureView.SurfaceTextureListener {
+ ctor public deprecated RSTextureView(android.content.Context);
+ ctor public deprecated RSTextureView(android.content.Context, android.util.AttributeSet);
+ method public deprecated android.renderscript.RenderScriptGL createRenderScriptGL(android.renderscript.RenderScriptGL.SurfaceConfig);
+ method public deprecated void destroyRenderScriptGL();
+ method public deprecated android.renderscript.RenderScriptGL getRenderScriptGL();
+ method public deprecated void onSurfaceTextureAvailable(android.graphics.SurfaceTexture, int, int);
+ method public deprecated boolean onSurfaceTextureDestroyed(android.graphics.SurfaceTexture);
+ method public deprecated void onSurfaceTextureSizeChanged(android.graphics.SurfaceTexture, int, int);
+ method public deprecated void onSurfaceTextureUpdated(android.graphics.SurfaceTexture);
+ method public deprecated void pause();
+ method public deprecated void resume();
+ method public deprecated void setRenderScriptGL(android.renderscript.RenderScriptGL);
}
public class RenderScript {
@@ -18360,28 +19370,28 @@
field protected int mLength;
}
- public class RenderScriptGL extends android.renderscript.RenderScript {
- ctor public RenderScriptGL(android.content.Context, android.renderscript.RenderScriptGL.SurfaceConfig);
- method public void bindProgramFragment(android.renderscript.ProgramFragment);
- method public void bindProgramRaster(android.renderscript.ProgramRaster);
- method public void bindProgramStore(android.renderscript.ProgramStore);
- method public void bindProgramVertex(android.renderscript.ProgramVertex);
- method public void bindRootScript(android.renderscript.Script);
- method public int getHeight();
- method public int getWidth();
- method public void pause();
- method public void resume();
- method public void setSurface(android.view.SurfaceHolder, int, int);
- method public void setSurfaceTexture(android.graphics.SurfaceTexture, int, int);
+ public deprecated class RenderScriptGL extends android.renderscript.RenderScript {
+ ctor public deprecated RenderScriptGL(android.content.Context, android.renderscript.RenderScriptGL.SurfaceConfig);
+ method public deprecated void bindProgramFragment(android.renderscript.ProgramFragment);
+ method public deprecated void bindProgramRaster(android.renderscript.ProgramRaster);
+ method public deprecated void bindProgramStore(android.renderscript.ProgramStore);
+ method public deprecated void bindProgramVertex(android.renderscript.ProgramVertex);
+ method public deprecated void bindRootScript(android.renderscript.Script);
+ method public deprecated int getHeight();
+ method public deprecated int getWidth();
+ method public deprecated void pause();
+ method public deprecated void resume();
+ method public deprecated void setSurface(android.view.SurfaceHolder, int, int);
+ method public deprecated void setSurfaceTexture(android.graphics.SurfaceTexture, int, int);
}
- public static class RenderScriptGL.SurfaceConfig {
- ctor public RenderScriptGL.SurfaceConfig();
- ctor public RenderScriptGL.SurfaceConfig(android.renderscript.RenderScriptGL.SurfaceConfig);
- method public void setAlpha(int, int);
- method public void setColor(int, int);
- method public void setDepth(int, int);
- method public void setSamples(int, int, float);
+ public static deprecated class RenderScriptGL.SurfaceConfig {
+ ctor public deprecated RenderScriptGL.SurfaceConfig();
+ ctor public deprecated RenderScriptGL.SurfaceConfig(android.renderscript.RenderScriptGL.SurfaceConfig);
+ method public deprecated void setAlpha(int, int);
+ method public deprecated void setColor(int, int);
+ method public deprecated void setDepth(int, int);
+ method public deprecated void setSamples(int, int, float);
}
public class Sampler extends android.renderscript.BaseObj {
@@ -18391,6 +19401,11 @@
method public static android.renderscript.Sampler WRAP_LINEAR(android.renderscript.RenderScript);
method public static android.renderscript.Sampler WRAP_LINEAR_MIP_LINEAR(android.renderscript.RenderScript);
method public static android.renderscript.Sampler WRAP_NEAREST(android.renderscript.RenderScript);
+ method public float getAnisotropy();
+ method public android.renderscript.Sampler.Value getMagnification();
+ method public android.renderscript.Sampler.Value getMinification();
+ method public android.renderscript.Sampler.Value getWrapS();
+ method public android.renderscript.Sampler.Value getWrapT();
}
public static class Sampler.Builder {
@@ -18427,6 +19442,7 @@
method public void setVar(int, boolean);
method public void setVar(int, android.renderscript.BaseObj);
method public void setVar(int, android.renderscript.FieldPacker);
+ method public void setVar(int, android.renderscript.FieldPacker, android.renderscript.Element, int[]);
}
public static class Script.Builder {
@@ -18556,6 +19572,7 @@
method public static android.content.Intent createInstallIntent();
method public static java.security.cert.X509Certificate[] getCertificateChain(android.content.Context, java.lang.String) throws java.lang.InterruptedException, android.security.KeyChainException;
method public static java.security.PrivateKey getPrivateKey(android.content.Context, java.lang.String) throws java.lang.InterruptedException, android.security.KeyChainException;
+ field public static final java.lang.String ACTION_STORAGE_CHANGED = "android.security.STORAGE_CHANGED";
field public static final java.lang.String EXTRA_CERTIFICATE = "CERT";
field public static final java.lang.String EXTRA_NAME = "name";
field public static final java.lang.String EXTRA_PKCS12 = "PKCS12";
@@ -18588,7 +19605,9 @@
method public android.os.Bundle getBundle();
method public java.lang.String getLocale();
method public void onCancel();
+ method public void onClose();
method public abstract void onCreate();
+ method public android.view.textservice.SentenceSuggestionsInfo[] onGetSentenceSuggestionsMultiple(android.view.textservice.TextInfo[], int);
method public abstract android.view.textservice.SuggestionsInfo onGetSuggestions(android.view.textservice.TextInfo, int);
method public android.view.textservice.SuggestionsInfo[] onGetSuggestionsMultiple(android.view.textservice.TextInfo[], int, boolean);
}
@@ -18624,6 +19643,7 @@
method public void onSurfaceRedrawNeeded(android.view.SurfaceHolder);
method public void onTouchEvent(android.view.MotionEvent);
method public void onVisibilityChanged(boolean);
+ method public void setOffsetNotificationsEnabled(boolean);
method public void setTouchEventsEnabled(boolean);
}
@@ -18762,6 +19782,7 @@
method public boolean areDefaultsEnforced();
method public java.lang.String getDefaultEngine();
method public java.util.List<android.speech.tts.TextToSpeech.EngineInfo> getEngines();
+ method public java.util.Set<java.lang.String> getFeatures(java.util.Locale);
method public java.util.Locale getLanguage();
method public int isLanguageAvailable(java.util.Locale);
method public boolean isSpeaking();
@@ -18769,7 +19790,8 @@
method public int playSilence(long, int, java.util.HashMap<java.lang.String, java.lang.String>);
method public deprecated int setEngineByPackageName(java.lang.String);
method public int setLanguage(java.util.Locale);
- method public int setOnUtteranceCompletedListener(android.speech.tts.TextToSpeech.OnUtteranceCompletedListener);
+ method public deprecated int setOnUtteranceCompletedListener(android.speech.tts.TextToSpeech.OnUtteranceCompletedListener);
+ method public int setOnUtteranceProgressListener(android.speech.tts.UtteranceProgressListener);
method public int setPitch(float);
method public int setSpeechRate(float);
method public void shutdown();
@@ -18807,6 +19829,8 @@
field public static final java.lang.String EXTRA_VOICE_DATA_FILES_INFO = "dataFilesInfo";
field public static final java.lang.String EXTRA_VOICE_DATA_ROOT_DIRECTORY = "dataRoot";
field public static final java.lang.String INTENT_ACTION_TTS_SERVICE = "android.intent.action.TTS_SERVICE";
+ field public static final java.lang.String KEY_FEATURE_EMBEDDED_SYNTHESIS = "embeddedTts";
+ field public static final java.lang.String KEY_FEATURE_NETWORK_SYNTHESIS = "networkTts";
field public static final java.lang.String KEY_PARAM_PAN = "pan";
field public static final java.lang.String KEY_PARAM_STREAM = "streamType";
field public static final java.lang.String KEY_PARAM_UTTERANCE_ID = "utteranceId";
@@ -18832,6 +19856,7 @@
public abstract class TextToSpeechService extends android.app.Service {
ctor public TextToSpeechService();
method public android.os.IBinder onBind(android.content.Intent);
+ method protected java.util.Set<java.lang.String> onGetFeaturesForLanguage(java.lang.String, java.lang.String, java.lang.String);
method protected abstract java.lang.String[] onGetLanguage();
method protected abstract int onIsLanguageAvailable(java.lang.String, java.lang.String, java.lang.String);
method protected abstract int onLoadLanguage(java.lang.String, java.lang.String, java.lang.String);
@@ -18839,6 +19864,13 @@
method protected abstract void onSynthesizeText(android.speech.tts.SynthesisRequest, android.speech.tts.SynthesisCallback);
}
+ public abstract class UtteranceProgressListener {
+ ctor public UtteranceProgressListener();
+ method public abstract void onDone(java.lang.String);
+ method public abstract void onError(java.lang.String);
+ method public abstract void onStart(java.lang.String);
+ }
+
}
package android.telephony {
@@ -19314,12 +20346,12 @@
method public final void testApplicationTestCaseSetUpProperly() throws java.lang.Exception;
}
- public class AssertionFailedError extends java.lang.Error {
+ public deprecated class AssertionFailedError extends java.lang.Error {
ctor public AssertionFailedError();
ctor public AssertionFailedError(java.lang.String);
}
- public class ComparisonFailure extends android.test.AssertionFailedError {
+ public deprecated class ComparisonFailure extends android.test.AssertionFailedError {
ctor public ComparisonFailure(java.lang.String, java.lang.String, java.lang.String);
}
@@ -19361,6 +20393,7 @@
ctor public InstrumentationTestSuite(android.app.Instrumentation);
ctor public InstrumentationTestSuite(java.lang.String, android.app.Instrumentation);
ctor public InstrumentationTestSuite(java.lang.Class, android.app.Instrumentation);
+ method public void addTestSuite(java.lang.Class);
}
public class IsolatedContext extends android.content.ContextWrapper {
@@ -19631,9 +20664,12 @@
method public void setWallpaper(android.graphics.Bitmap) throws java.io.IOException;
method public void setWallpaper(java.io.InputStream) throws java.io.IOException;
method public void startActivities(android.content.Intent[]);
+ method public void startActivities(android.content.Intent[], android.os.Bundle);
method public void startActivity(android.content.Intent);
+ method public void startActivity(android.content.Intent, android.os.Bundle);
method public boolean startInstrumentation(android.content.ComponentName, java.lang.String, android.os.Bundle);
method public void startIntentSender(android.content.IntentSender, android.content.Intent, int, int, int) throws android.content.IntentSender.SendIntentException;
+ method public void startIntentSender(android.content.IntentSender, android.content.Intent, int, int, int, android.os.Bundle) throws android.content.IntentSender.SendIntentException;
method public android.content.ComponentName startService(android.content.Intent);
method public boolean stopService(android.content.Intent);
method public void unbindService(android.content.ServiceConnection);
@@ -19936,6 +20972,7 @@
}
public class Html {
+ method public static java.lang.String escapeHtml(java.lang.CharSequence);
method public static android.text.Spanned fromHtml(java.lang.String);
method public static android.text.Spanned fromHtml(java.lang.String, android.text.Html.ImageGetter, android.text.Html.TagHandler);
method public static java.lang.String toHtml(android.text.Spanned);
@@ -21003,6 +22040,7 @@
method public void writeToParcel(android.os.Parcel, int);
field public static final java.lang.String ACTION_SUGGESTION_PICKED = "android.text.style.SUGGESTION_PICKED";
field public static final android.os.Parcelable.Creator CREATOR;
+ field public static final int FLAG_AUTO_CORRECTION = 4; // 0x4
field public static final int FLAG_EASY_CORRECT = 1; // 0x1
field public static final int FLAG_MISSPELLED = 2; // 0x2
field public static final int SUGGESTIONS_MAX_SIZE = 5; // 0x5
@@ -21231,6 +22269,7 @@
field public static final int DENSITY_MEDIUM = 160; // 0xa0
field public static final int DENSITY_TV = 213; // 0xd5
field public static final int DENSITY_XHIGH = 320; // 0x140
+ field public static final int DENSITY_XXHIGH = 480; // 0x1e0
field public float density;
field public int densityDpi;
field public int heightPixels;
@@ -21365,6 +22404,26 @@
method public void println(java.lang.String);
}
+ public class LongSparseArray implements java.lang.Cloneable {
+ ctor public LongSparseArray();
+ ctor public LongSparseArray(int);
+ method public void append(long, E);
+ method public void clear();
+ method public android.util.LongSparseArray<E> clone();
+ method public void delete(long);
+ method public E get(long);
+ method public E get(long, E);
+ method public int indexOfKey(long);
+ method public int indexOfValue(E);
+ method public long keyAt(int);
+ method public void put(long, E);
+ method public void remove(long);
+ method public void removeAt(int);
+ method public void setValueAt(int, E);
+ method public int size();
+ method public E valueAt(int);
+ }
+
public class LruCache {
ctor public LruCache(int);
method protected V create(K);
@@ -21647,13 +22706,16 @@
method public abstract java.lang.CharSequence getSubtitle();
method public java.lang.Object getTag();
method public abstract java.lang.CharSequence getTitle();
+ method public boolean getTitleOptionalHint();
method public abstract void invalidate();
+ method public boolean isTitleOptional();
method public abstract void setCustomView(android.view.View);
method public abstract void setSubtitle(java.lang.CharSequence);
method public abstract void setSubtitle(int);
method public void setTag(java.lang.Object);
method public abstract void setTitle(java.lang.CharSequence);
method public abstract void setTitle(int);
+ method public void setTitleOptionalHint(boolean);
}
public static abstract interface ActionMode.Callback {
@@ -21695,6 +22757,7 @@
}
public class Display {
+ method public void getCurrentSizeRange(android.graphics.Point, android.graphics.Point);
method public int getDisplayId();
method public deprecated int getHeight();
method public void getMetrics(android.util.DisplayMetrics);
@@ -21827,6 +22890,7 @@
public final class InputDevice implements android.os.Parcelable {
method public int describeContents();
+ method public java.lang.String getDescriptor();
method public static android.view.InputDevice getDevice(int);
method public static int[] getDeviceIds();
method public int getId();
@@ -21837,6 +22901,8 @@
method public java.util.List<android.view.InputDevice.MotionRange> getMotionRanges();
method public java.lang.String getName();
method public int getSources();
+ method public android.os.Vibrator getVibrator();
+ method public boolean isVirtual();
method public void writeToParcel(android.os.Parcel, int);
field public static final android.os.Parcelable.Creator CREATOR;
field public static final int KEYBOARD_TYPE_ALPHABETIC = 2; // 0x2
@@ -21884,6 +22950,7 @@
method public int describeContents();
method public final android.view.InputDevice getDevice();
method public abstract int getDeviceId();
+ method public abstract long getEventTime();
method public abstract int getSource();
field public static final android.os.Parcelable.Creator CREATOR;
}
@@ -21896,7 +22963,8 @@
method public abstract void onInputQueueDestroyed(android.view.InputQueue);
}
- public class KeyCharacterMap {
+ public class KeyCharacterMap implements android.os.Parcelable {
+ method public int describeContents();
method public static boolean deviceHasKey(int);
method public static boolean[] deviceHasKeys(int[]);
method public int get(int, int);
@@ -21911,10 +22979,12 @@
method public char getNumber(int);
method public boolean isPrintingKey(int);
method public static android.view.KeyCharacterMap load(int);
+ method public void writeToParcel(android.os.Parcel, int);
field public static final int ALPHA = 3; // 0x3
field public static final deprecated int BUILT_IN_KEYBOARD = 0; // 0x0
field public static final int COMBINING_ACCENT = -2147483648; // 0x80000000
field public static final int COMBINING_ACCENT_MASK = 2147483647; // 0x7fffffff
+ field public static final android.os.Parcelable.Creator CREATOR;
field public static final int FULL = 4; // 0x4
field public static final char HEX_INPUT = 61184; // 0xef00 '\uef00'
field public static final int MODIFIER_BEHAVIOR_CHORDED = 0; // 0x0
@@ -22074,6 +23144,8 @@
field public static final int KEYCODE_BUTTON_Y = 100; // 0x64
field public static final int KEYCODE_BUTTON_Z = 101; // 0x65
field public static final int KEYCODE_C = 31; // 0x1f
+ field public static final int KEYCODE_CALCULATOR = 210; // 0xd2
+ field public static final int KEYCODE_CALENDAR = 208; // 0xd0
field public static final int KEYCODE_CALL = 5; // 0x5
field public static final int KEYCODE_CAMERA = 27; // 0x1b
field public static final int KEYCODE_CAPS_LOCK = 115; // 0x73
@@ -22082,6 +23154,7 @@
field public static final int KEYCODE_CHANNEL_UP = 166; // 0xa6
field public static final int KEYCODE_CLEAR = 28; // 0x1c
field public static final int KEYCODE_COMMA = 55; // 0x37
+ field public static final int KEYCODE_CONTACTS = 207; // 0xcf
field public static final int KEYCODE_CTRL_LEFT = 113; // 0x71
field public static final int KEYCODE_CTRL_RIGHT = 114; // 0x72
field public static final int KEYCODE_D = 32; // 0x20
@@ -22093,6 +23166,7 @@
field public static final int KEYCODE_DPAD_UP = 19; // 0x13
field public static final int KEYCODE_DVR = 173; // 0xad
field public static final int KEYCODE_E = 33; // 0x21
+ field public static final int KEYCODE_EISU = 212; // 0xd4
field public static final int KEYCODE_ENDCALL = 6; // 0x6
field public static final int KEYCODE_ENTER = 66; // 0x42
field public static final int KEYCODE_ENVELOPE = 65; // 0x41
@@ -22121,12 +23195,15 @@
field public static final int KEYCODE_GUIDE = 172; // 0xac
field public static final int KEYCODE_H = 36; // 0x24
field public static final int KEYCODE_HEADSETHOOK = 79; // 0x4f
+ field public static final int KEYCODE_HENKAN = 214; // 0xd6
field public static final int KEYCODE_HOME = 3; // 0x3
field public static final int KEYCODE_I = 37; // 0x25
field public static final int KEYCODE_INFO = 165; // 0xa5
field public static final int KEYCODE_INSERT = 124; // 0x7c
field public static final int KEYCODE_J = 38; // 0x26
field public static final int KEYCODE_K = 39; // 0x27
+ field public static final int KEYCODE_KANA = 218; // 0xda
+ field public static final int KEYCODE_KATAKANA_HIRAGANA = 215; // 0xd7
field public static final int KEYCODE_L = 40; // 0x28
field public static final int KEYCODE_LANGUAGE_SWITCH = 204; // 0xcc
field public static final int KEYCODE_LEFT_BRACKET = 71; // 0x47
@@ -22149,6 +23226,8 @@
field public static final int KEYCODE_MINUS = 69; // 0x45
field public static final int KEYCODE_MOVE_END = 123; // 0x7b
field public static final int KEYCODE_MOVE_HOME = 122; // 0x7a
+ field public static final int KEYCODE_MUHENKAN = 213; // 0xd5
+ field public static final int KEYCODE_MUSIC = 209; // 0xd1
field public static final int KEYCODE_MUTE = 91; // 0x5b
field public static final int KEYCODE_N = 42; // 0x2a
field public static final int KEYCODE_NOTIFICATION = 83; // 0x53
@@ -22190,6 +23269,7 @@
field public static final int KEYCODE_Q = 45; // 0x2d
field public static final int KEYCODE_R = 46; // 0x2e
field public static final int KEYCODE_RIGHT_BRACKET = 72; // 0x48
+ field public static final int KEYCODE_RO = 217; // 0xd9
field public static final int KEYCODE_S = 47; // 0x2f
field public static final int KEYCODE_SCROLL_LOCK = 116; // 0x74
field public static final int KEYCODE_SEARCH = 84; // 0x54
@@ -22222,7 +23302,9 @@
field public static final int KEYCODE_WINDOW = 171; // 0xab
field public static final int KEYCODE_X = 52; // 0x34
field public static final int KEYCODE_Y = 53; // 0x35
+ field public static final int KEYCODE_YEN = 216; // 0xd8
field public static final int KEYCODE_Z = 54; // 0x36
+ field public static final int KEYCODE_ZENKAKU_HANKAKU = 211; // 0xd3
field public static final int KEYCODE_ZOOM_IN = 168; // 0xa8
field public static final int KEYCODE_ZOOM_OUT = 169; // 0xa9
field public static final deprecated int MAX_KEYCODE = 84; // 0x54
@@ -22747,6 +23829,7 @@
method public android.graphics.Canvas lockCanvas(android.graphics.Rect);
method protected final void onDraw(android.graphics.Canvas);
method public void setOpaque(boolean);
+ method public void setSurfaceTexture(android.graphics.SurfaceTexture);
method public void setSurfaceTextureListener(android.view.TextureView.SurfaceTextureListener);
method public void setTransform(android.graphics.Matrix);
method public void unlockCanvasAndPost(android.graphics.Canvas);
@@ -22785,12 +23868,14 @@
ctor public View(android.content.Context);
ctor public View(android.content.Context, android.util.AttributeSet);
ctor public View(android.content.Context, android.util.AttributeSet, int);
+ method public void addChildrenForAccessibility(java.util.ArrayList<android.view.View>);
method public void addFocusables(java.util.ArrayList<android.view.View>, int);
method public void addFocusables(java.util.ArrayList<android.view.View>, int, int);
method public void addOnAttachStateChangeListener(android.view.View.OnAttachStateChangeListener);
method public void addOnLayoutChangeListener(android.view.View.OnLayoutChangeListener);
method public void addTouchables(java.util.ArrayList<android.view.View>);
method public android.view.ViewPropertyAnimator animate();
+ method public void announceForAccessibility(java.lang.CharSequence);
method protected boolean awakenScrollBars();
method protected boolean awakenScrollBars(int);
method protected boolean awakenScrollBars(int, boolean);
@@ -22798,6 +23883,7 @@
method public void buildDrawingCache();
method public void buildDrawingCache(boolean);
method public void buildLayer();
+ method public boolean callOnClick();
method public boolean canScrollHorizontally(int);
method public boolean canScrollVertically(int);
method public void cancelLongPress();
@@ -22838,6 +23924,7 @@
method public boolean dispatchUnhandledMove(android.view.View, int);
method protected void dispatchVisibilityChanged(android.view.View, int);
method public void dispatchWindowFocusChanged(boolean);
+ method public void dispatchWindowSystemUiVisiblityChanged(int);
method public void dispatchWindowVisibilityChanged(int);
method public void draw(android.graphics.Canvas);
method protected void drawableStateChanged();
@@ -22846,9 +23933,9 @@
method public final android.view.View findViewWithTag(java.lang.Object);
method public void findViewsWithText(java.util.ArrayList<android.view.View>, java.lang.CharSequence, int);
method protected boolean fitSystemWindows(android.graphics.Rect);
- method public boolean fitsSystemWindows();
method public android.view.View focusSearch(int);
method public void forceLayout();
+ method public android.view.accessibility.AccessibilityNodeProvider getAccessibilityNodeProvider();
method public float getAlpha();
method public android.view.animation.Animation getAnimation();
method public android.os.IBinder getApplicationWindowToken();
@@ -22857,6 +23944,7 @@
method public final int getBottom();
method protected float getBottomFadingEdgeStrength();
method protected int getBottomPaddingOffset();
+ method public float getCameraDistance();
method public java.lang.CharSequence getContentDescription();
method public final android.content.Context getContext();
method protected android.view.ContextMenu.ContextMenuInfo getContextMenuInfo();
@@ -22869,6 +23957,7 @@
method public void getDrawingRect(android.graphics.Rect);
method public long getDrawingTime();
method public boolean getFilterTouchesWhenObscured();
+ method public boolean getFitsSystemWindows();
method public java.util.ArrayList<android.view.View> getFocusables(int);
method public void getFocusedRect(android.graphics.Rect);
method public boolean getGlobalVisibleRect(android.graphics.Rect, android.graphics.Point);
@@ -22879,6 +23968,7 @@
method public int getHorizontalFadingEdgeLength();
method protected int getHorizontalScrollbarHeight();
method public int getId();
+ method public int getImportantForAccessibility();
method public boolean getKeepScreenOn();
method public android.view.KeyEvent.DispatcherState getKeyDispatcherState();
method public int getLayerType();
@@ -22895,6 +23985,8 @@
method public final int getMeasuredState();
method public final int getMeasuredWidth();
method public final int getMeasuredWidthAndState();
+ method public int getMinimumHeight();
+ method public int getMinimumWidth();
method public int getNextFocusDownId();
method public int getNextFocusForwardId();
method public int getNextFocusLeftId();
@@ -22907,6 +23999,7 @@
method public int getPaddingRight();
method public int getPaddingTop();
method public final android.view.ViewParent getParent();
+ method public android.view.ViewParent getParentForAccessibility();
method public float getPivotX();
method public float getPivotY();
method public android.content.res.Resources getResources();
@@ -22919,6 +24012,9 @@
method public float getRotationY();
method public float getScaleX();
method public float getScaleY();
+ method public int getScrollBarDefaultDelayBeforeFade();
+ method public int getScrollBarFadeDuration();
+ method public int getScrollBarSize();
method public int getScrollBarStyle();
method public final int getScrollX();
method public final int getScrollY();
@@ -22942,6 +24038,7 @@
method public int getVisibility();
method public final int getWidth();
method protected int getWindowAttachCount();
+ method public int getWindowSystemUiVisibility();
method public android.os.IBinder getWindowToken();
method public int getWindowVisibility();
method public void getWindowVisibleDisplayFrame(android.graphics.Rect);
@@ -22949,6 +24046,9 @@
method public float getY();
method public boolean hasFocus();
method public boolean hasFocusable();
+ method public boolean hasOnClickListeners();
+ method public boolean hasOverlappingRendering();
+ method public boolean hasTransientState();
method public boolean hasWindowFocus();
method public static android.view.View inflate(android.content.Context, int, android.view.ViewGroup);
method protected void initializeFadingEdge(android.content.res.TypedArray);
@@ -22980,6 +24080,7 @@
method public boolean isPressed();
method public boolean isSaveEnabled();
method public boolean isSaveFromParentEnabled();
+ method public boolean isScrollContainer();
method public boolean isScrollbarFadingEnabled();
method public boolean isSelected();
method public boolean isShown();
@@ -23026,6 +24127,7 @@
method public void onPopulateAccessibilityEvent(android.view.accessibility.AccessibilityEvent);
method protected void onRestoreInstanceState(android.os.Parcelable);
method protected android.os.Parcelable onSaveInstanceState();
+ method public void onScreenStateChanged(int);
method protected void onScrollChanged(int, int, int, int);
method protected boolean onSetAlpha(int);
method protected void onSizeChanged(int, int, int, int);
@@ -23034,8 +24136,10 @@
method public boolean onTrackballEvent(android.view.MotionEvent);
method protected void onVisibilityChanged(android.view.View, int);
method public void onWindowFocusChanged(boolean);
+ method public void onWindowSystemUiVisibilityChanged(int);
method protected void onWindowVisibilityChanged(int);
method protected boolean overScrollBy(int, int, int, int, int, int, int, int, boolean);
+ method public boolean performAccessibilityAction(int, android.os.Bundle);
method public boolean performClick();
method public boolean performHapticFeedback(int);
method public boolean performHapticFeedback(int, int);
@@ -23047,10 +24151,15 @@
method public void postInvalidate(int, int, int, int);
method public void postInvalidateDelayed(long);
method public void postInvalidateDelayed(long, int, int, int, int);
+ method public void postInvalidateOnAnimation();
+ method public void postInvalidateOnAnimation(int, int, int, int);
+ method public void postOnAnimation(java.lang.Runnable);
+ method public void postOnAnimationDelayed(java.lang.Runnable, long);
method public void refreshDrawableState();
method public boolean removeCallbacks(java.lang.Runnable);
method public void removeOnAttachStateChangeListener(android.view.View.OnAttachStateChangeListener);
method public void removeOnLayoutChangeListener(android.view.View.OnLayoutChangeListener);
+ method public void requestFitSystemWindows();
method public final boolean requestFocus();
method public final boolean requestFocus(int);
method public boolean requestFocus(int, android.graphics.Rect);
@@ -23071,8 +24180,9 @@
method public void setActivated(boolean);
method public void setAlpha(float);
method public void setAnimation(android.view.animation.Animation);
+ method public void setBackground(android.graphics.drawable.Drawable);
method public void setBackgroundColor(int);
- method public void setBackgroundDrawable(android.graphics.drawable.Drawable);
+ method public deprecated void setBackgroundDrawable(android.graphics.drawable.Drawable);
method public void setBackgroundResource(int);
method public final void setBottom(int);
method public void setCameraDistance(float);
@@ -23089,10 +24199,12 @@
method public void setFocusable(boolean);
method public void setFocusableInTouchMode(boolean);
method public void setHapticFeedbackEnabled(boolean);
+ method public void setHasTransientState(boolean);
method public void setHorizontalFadingEdgeEnabled(boolean);
method public void setHorizontalScrollBarEnabled(boolean);
method public void setHovered(boolean);
method public void setId(int);
+ method public void setImportantForAccessibility(int);
method public void setKeepScreenOn(boolean);
method public void setLayerType(int, android.graphics.Paint);
method public void setLayoutParams(android.view.ViewGroup.LayoutParams);
@@ -23129,6 +24241,9 @@
method public void setSaveFromParentEnabled(boolean);
method public void setScaleX(float);
method public void setScaleY(float);
+ method public void setScrollBarDefaultDelayBeforeFade(int);
+ method public void setScrollBarFadeDuration(int);
+ method public void setScrollBarSize(int);
method public void setScrollBarStyle(int);
method public void setScrollContainer(boolean);
method public void setScrollX(int);
@@ -23160,6 +24275,12 @@
method protected boolean verifyDrawable(android.graphics.drawable.Drawable);
method public boolean willNotCacheDrawing();
method public boolean willNotDraw();
+ field public static final int ACCESSIBILITY_FOCUS_BACKWARD = 4097; // 0x1001
+ field public static final int ACCESSIBILITY_FOCUS_DOWN = 4226; // 0x1082
+ field public static final int ACCESSIBILITY_FOCUS_FORWARD = 4098; // 0x1002
+ field public static final int ACCESSIBILITY_FOCUS_LEFT = 4113; // 0x1011
+ field public static final int ACCESSIBILITY_FOCUS_RIGHT = 4162; // 0x1042
+ field public static final int ACCESSIBILITY_FOCUS_UP = 4129; // 0x1021
field public static final android.util.Property ALPHA;
field public static final int DRAWING_CACHE_QUALITY_AUTO = 0; // 0x0
field public static final int DRAWING_CACHE_QUALITY_HIGH = 1048576; // 0x100000
@@ -23181,6 +24302,7 @@
field protected static final int[] FOCUSED_SELECTED_WINDOW_FOCUSED_STATE_SET;
field protected static final int[] FOCUSED_STATE_SET;
field protected static final int[] FOCUSED_WINDOW_FOCUSED_STATE_SET;
+ field public static final int FOCUS_ACCESSIBILITY = 4096; // 0x1000
field public static final int FOCUS_BACKWARD = 1; // 0x1
field public static final int FOCUS_DOWN = 130; // 0x82
field public static final int FOCUS_FORWARD = 2; // 0x2
@@ -23189,6 +24311,9 @@
field public static final int FOCUS_UP = 33; // 0x21
field public static final int GONE = 8; // 0x8
field public static final int HAPTIC_FEEDBACK_ENABLED = 268435456; // 0x10000000
+ field public static final int IMPORTANT_FOR_ACCESSIBILITY_AUTO = 0; // 0x0
+ field public static final int IMPORTANT_FOR_ACCESSIBILITY_NO = 2; // 0x2
+ field public static final int IMPORTANT_FOR_ACCESSIBILITY_YES = 1; // 0x1
field public static final int INVISIBLE = 4; // 0x4
field public static final int KEEP_SCREEN_ON = 67108864; // 0x4000000
field public static final int LAYER_TYPE_HARDWARE = 2; // 0x2
@@ -23222,6 +24347,8 @@
field public static final android.util.Property ROTATION_Y;
field public static final android.util.Property SCALE_X;
field public static final android.util.Property SCALE_Y;
+ field public static final int SCREEN_STATE_OFF = 0; // 0x0
+ field public static final int SCREEN_STATE_ON = 1; // 0x1
field public static final int SCROLLBARS_INSIDE_INSET = 16777216; // 0x1000000
field public static final int SCROLLBARS_INSIDE_OVERLAY = 0; // 0x0
field public static final int SCROLLBARS_OUTSIDE_INSET = 50331648; // 0x3000000
@@ -23234,9 +24361,16 @@
field public static final int SOUND_EFFECTS_ENABLED = 134217728; // 0x8000000
field public static final deprecated int STATUS_BAR_HIDDEN = 1; // 0x1
field public static final deprecated int STATUS_BAR_VISIBLE = 0; // 0x0
+ field public static final int SYSTEM_UI_FLAG_FULLSCREEN = 4; // 0x4
field public static final int SYSTEM_UI_FLAG_HIDE_NAVIGATION = 2; // 0x2
+ field public static final int SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN = 1024; // 0x400
+ field public static final int SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION = 512; // 0x200
+ field public static final int SYSTEM_UI_FLAG_LAYOUT_STABLE = 256; // 0x100
field public static final int SYSTEM_UI_FLAG_LOW_PROFILE = 1; // 0x1
field public static final int SYSTEM_UI_FLAG_VISIBLE = 0; // 0x0
+ field public static final int SYSTEM_UI_LAYOUT_FLAGS = 1536; // 0x600
+ field public static final int TEXT_ALIGNMENT_INHERIT = 0; // 0x0
+ field public static final int TEXT_ALIGNMENT_RESOLVED_DEFAULT = 131072; // 0x20000
field public static final android.util.Property TRANSLATION_X;
field public static final android.util.Property TRANSLATION_Y;
field protected static final java.lang.String VIEW_LOG_TAG = "View";
@@ -23249,10 +24383,12 @@
public static class View.AccessibilityDelegate {
ctor public View.AccessibilityDelegate();
method public boolean dispatchPopulateAccessibilityEvent(android.view.View, android.view.accessibility.AccessibilityEvent);
+ method public android.view.accessibility.AccessibilityNodeProvider getAccessibilityNodeProvider(android.view.View);
method public void onInitializeAccessibilityEvent(android.view.View, android.view.accessibility.AccessibilityEvent);
method public void onInitializeAccessibilityNodeInfo(android.view.View, android.view.accessibility.AccessibilityNodeInfo);
method public void onPopulateAccessibilityEvent(android.view.View, android.view.accessibility.AccessibilityEvent);
method public boolean onRequestSendAccessibilityEvent(android.view.ViewGroup, android.view.View, android.view.accessibility.AccessibilityEvent);
+ method public boolean performAccessibilityAction(android.view.View, int, android.os.Bundle);
method public void sendAccessibilityEvent(android.view.View, int);
method public void sendAccessibilityEventUnchecked(android.view.View, android.view.accessibility.AccessibilityEvent);
}
@@ -23579,6 +24715,7 @@
method public abstract void focusableViewAvailable(android.view.View);
method public abstract boolean getChildVisibleRect(android.view.View, android.graphics.Rect, android.graphics.Point);
method public abstract android.view.ViewParent getParent();
+ method public abstract android.view.ViewParent getParentForAccessibility();
method public abstract void invalidateChild(android.view.View, android.graphics.Rect);
method public abstract android.view.ViewParent invalidateChildInParent(int[], android.graphics.Rect);
method public abstract boolean isLayoutRequested();
@@ -23586,6 +24723,7 @@
method public abstract void requestChildFocus(android.view.View, android.view.View);
method public abstract boolean requestChildRectangleOnScreen(android.view.View, android.graphics.Rect, boolean);
method public abstract void requestDisallowInterceptTouchEvent(boolean);
+ method public abstract void requestFitSystemWindows();
method public abstract void requestLayout();
method public abstract boolean requestSendAccessibilityEvent(android.view.View, android.view.accessibility.AccessibilityEvent);
method public abstract void requestTransparentRegion(android.view.View);
@@ -23618,6 +24756,9 @@
method public android.view.ViewPropertyAnimator translationXBy(float);
method public android.view.ViewPropertyAnimator translationY(float);
method public android.view.ViewPropertyAnimator translationYBy(float);
+ method public android.view.ViewPropertyAnimator withEndAction(java.lang.Runnable);
+ method public android.view.ViewPropertyAnimator withLayer();
+ method public android.view.ViewPropertyAnimator withStartAction(java.lang.Runnable);
method public android.view.ViewPropertyAnimator x(float);
method public android.view.ViewPropertyAnimator xBy(float);
method public android.view.ViewPropertyAnimator y(float);
@@ -23630,9 +24771,11 @@
ctor public ViewStub(android.content.Context, android.util.AttributeSet);
ctor public ViewStub(android.content.Context, android.util.AttributeSet, int);
method public int getInflatedId();
+ method public android.view.LayoutInflater getLayoutInflater();
method public int getLayoutResource();
method public android.view.View inflate();
method public void setInflatedId(int);
+ method public void setLayoutInflater(android.view.LayoutInflater);
method public void setLayoutResource(int);
method public void setOnInflateListener(android.view.ViewStub.OnInflateListener);
}
@@ -23642,21 +24785,29 @@
}
public final class ViewTreeObserver {
+ method public void addOnDrawListener(android.view.ViewTreeObserver.OnDrawListener);
method public void addOnGlobalFocusChangeListener(android.view.ViewTreeObserver.OnGlobalFocusChangeListener);
method public void addOnGlobalLayoutListener(android.view.ViewTreeObserver.OnGlobalLayoutListener);
method public void addOnPreDrawListener(android.view.ViewTreeObserver.OnPreDrawListener);
method public void addOnScrollChangedListener(android.view.ViewTreeObserver.OnScrollChangedListener);
method public void addOnTouchModeChangeListener(android.view.ViewTreeObserver.OnTouchModeChangeListener);
+ method public final void dispatchOnDraw();
method public final void dispatchOnGlobalLayout();
method public final boolean dispatchOnPreDraw();
method public boolean isAlive();
- method public void removeGlobalOnLayoutListener(android.view.ViewTreeObserver.OnGlobalLayoutListener);
+ method public deprecated void removeGlobalOnLayoutListener(android.view.ViewTreeObserver.OnGlobalLayoutListener);
+ method public void removeOnDrawListener(android.view.ViewTreeObserver.OnDrawListener);
method public void removeOnGlobalFocusChangeListener(android.view.ViewTreeObserver.OnGlobalFocusChangeListener);
+ method public void removeOnGlobalLayoutListener(android.view.ViewTreeObserver.OnGlobalLayoutListener);
method public void removeOnPreDrawListener(android.view.ViewTreeObserver.OnPreDrawListener);
method public void removeOnScrollChangedListener(android.view.ViewTreeObserver.OnScrollChangedListener);
method public void removeOnTouchModeChangeListener(android.view.ViewTreeObserver.OnTouchModeChangeListener);
}
+ public static abstract interface ViewTreeObserver.OnDrawListener {
+ method public abstract void onDraw();
+ }
+
public static abstract interface ViewTreeObserver.OnGlobalFocusChangeListener {
method public abstract void onGlobalFocusChanged(android.view.View, android.view.View);
}
@@ -23945,8 +25096,10 @@
method public void appendRecord(android.view.accessibility.AccessibilityRecord);
method public int describeContents();
method public static java.lang.String eventTypeToString(int);
+ method public int getAction();
method public long getEventTime();
method public int getEventType();
+ method public int getMovementGranularity();
method public java.lang.CharSequence getPackageName();
method public android.view.accessibility.AccessibilityRecord getRecord(int);
method public int getRecordCount();
@@ -23954,17 +25107,22 @@
method public static android.view.accessibility.AccessibilityEvent obtain(int);
method public static android.view.accessibility.AccessibilityEvent obtain(android.view.accessibility.AccessibilityEvent);
method public static android.view.accessibility.AccessibilityEvent obtain();
+ method public void setAction(int);
method public void setEventTime(long);
method public void setEventType(int);
+ method public void setMovementGranularity(int);
method public void setPackageName(java.lang.CharSequence);
method public void writeToParcel(android.os.Parcel, int);
field public static final android.os.Parcelable.Creator CREATOR;
field public static final int INVALID_POSITION = -1; // 0xffffffff
field public static final deprecated int MAX_TEXT_LENGTH = 500; // 0x1f4
field public static final int TYPES_ALL_MASK = -1; // 0xffffffff
+ field public static final int TYPE_ANNOUNCEMENT = 16384; // 0x4000
field public static final int TYPE_NOTIFICATION_STATE_CHANGED = 64; // 0x40
field public static final int TYPE_TOUCH_EXPLORATION_GESTURE_END = 1024; // 0x400
field public static final int TYPE_TOUCH_EXPLORATION_GESTURE_START = 512; // 0x200
+ field public static final int TYPE_VIEW_ACCESSIBILITY_FOCUSED = 32768; // 0x8000
+ field public static final int TYPE_VIEW_ACCESSIBILITY_FOCUS_CLEARED = 65536; // 0x10000
field public static final int TYPE_VIEW_CLICKED = 1; // 0x1
field public static final int TYPE_VIEW_FOCUSED = 8; // 0x8
field public static final int TYPE_VIEW_HOVER_ENTER = 128; // 0x80
@@ -23974,6 +25132,7 @@
field public static final int TYPE_VIEW_SELECTED = 4; // 0x4
field public static final int TYPE_VIEW_TEXT_CHANGED = 16; // 0x10
field public static final int TYPE_VIEW_TEXT_SELECTION_CHANGED = 8192; // 0x2000
+ field public static final int TYPE_VIEW_TEXT_TRAVERSED_AT_MOVEMENT_GRANULARITY = 131072; // 0x20000
field public static final int TYPE_WINDOW_CONTENT_CHANGED = 2048; // 0x800
field public static final int TYPE_WINDOW_STATE_CHANGED = 32; // 0x20
}
@@ -24002,8 +25161,11 @@
public class AccessibilityNodeInfo implements android.os.Parcelable {
method public void addAction(int);
method public void addChild(android.view.View);
+ method public void addChild(android.view.View, int);
method public int describeContents();
method public java.util.List<android.view.accessibility.AccessibilityNodeInfo> findAccessibilityNodeInfosByText(java.lang.String);
+ method public android.view.accessibility.AccessibilityNodeInfo findFocus(int);
+ method public android.view.accessibility.AccessibilityNodeInfo focusSearch(int);
method public int getActions();
method public void getBoundsInParent(android.graphics.Rect);
method public void getBoundsInScreen(android.graphics.Rect);
@@ -24011,10 +25173,12 @@
method public int getChildCount();
method public java.lang.CharSequence getClassName();
method public java.lang.CharSequence getContentDescription();
+ method public int getMovementGranularities();
method public java.lang.CharSequence getPackageName();
method public android.view.accessibility.AccessibilityNodeInfo getParent();
method public java.lang.CharSequence getText();
method public int getWindowId();
+ method public boolean isAccessibilityFocused();
method public boolean isCheckable();
method public boolean isChecked();
method public boolean isClickable();
@@ -24025,11 +25189,15 @@
method public boolean isPassword();
method public boolean isScrollable();
method public boolean isSelected();
+ method public boolean isVisibleToUser();
method public static android.view.accessibility.AccessibilityNodeInfo obtain(android.view.View);
+ method public static android.view.accessibility.AccessibilityNodeInfo obtain(android.view.View, int);
method public static android.view.accessibility.AccessibilityNodeInfo obtain();
method public static android.view.accessibility.AccessibilityNodeInfo obtain(android.view.accessibility.AccessibilityNodeInfo);
method public boolean performAction(int);
+ method public boolean performAction(int, android.os.Bundle);
method public void recycle();
+ method public void setAccessibilityFocused(boolean);
method public void setBoundsInParent(android.graphics.Rect);
method public void setBoundsInScreen(android.graphics.Rect);
method public void setCheckable(boolean);
@@ -24041,19 +25209,51 @@
method public void setFocusable(boolean);
method public void setFocused(boolean);
method public void setLongClickable(boolean);
+ method public void setMovementGranularities(int);
method public void setPackageName(java.lang.CharSequence);
method public void setParent(android.view.View);
+ method public void setParent(android.view.View, int);
method public void setPassword(boolean);
method public void setScrollable(boolean);
method public void setSelected(boolean);
method public void setSource(android.view.View);
+ method public void setSource(android.view.View, int);
method public void setText(java.lang.CharSequence);
+ method public void setVisibleToUser(boolean);
method public void writeToParcel(android.os.Parcel, int);
+ field public static final int ACTION_ACCESSIBILITY_FOCUS = 64; // 0x40
+ field public static final java.lang.String ACTION_ARGUMENT_HTML_ELEMENT_STRING = "ACTION_ARGUMENT_HTML_ELEMENT_STRING";
+ field public static final java.lang.String ACTION_ARGUMENT_MOVEMENT_GRANULARITY_INT = "ACTION_ARGUMENT_MOVEMENT_GRANULARITY_INT";
+ field public static final int ACTION_CLEAR_ACCESSIBILITY_FOCUS = 128; // 0x80
field public static final int ACTION_CLEAR_FOCUS = 2; // 0x2
field public static final int ACTION_CLEAR_SELECTION = 8; // 0x8
+ field public static final int ACTION_CLICK = 16; // 0x10
field public static final int ACTION_FOCUS = 1; // 0x1
+ field public static final int ACTION_LONG_CLICK = 32; // 0x20
+ field public static final int ACTION_NEXT_AT_MOVEMENT_GRANULARITY = 256; // 0x100
+ field public static final int ACTION_NEXT_HTML_ELEMENT = 1024; // 0x400
+ field public static final int ACTION_PREVIOUS_AT_MOVEMENT_GRANULARITY = 512; // 0x200
+ field public static final int ACTION_PREVIOUS_HTML_ELEMENT = 2048; // 0x800
+ field public static final int ACTION_SCROLL_BACKWARD = 8192; // 0x2000
+ field public static final int ACTION_SCROLL_FORWARD = 4096; // 0x1000
field public static final int ACTION_SELECT = 4; // 0x4
field public static final android.os.Parcelable.Creator CREATOR;
+ field public static final int FOCUS_ACCESSIBILITY = 2; // 0x2
+ field public static final int FOCUS_INPUT = 1; // 0x1
+ field public static final int MOVEMENT_GRANULARITY_CHARACTER = 1; // 0x1
+ field public static final int MOVEMENT_GRANULARITY_LINE = 4; // 0x4
+ field public static final int MOVEMENT_GRANULARITY_PAGE = 16; // 0x10
+ field public static final int MOVEMENT_GRANULARITY_PARAGRAPH = 8; // 0x8
+ field public static final int MOVEMENT_GRANULARITY_WORD = 2; // 0x2
+ }
+
+ public abstract class AccessibilityNodeProvider {
+ ctor public AccessibilityNodeProvider();
+ method public android.view.accessibility.AccessibilityNodeInfo accessibilityFocusSearch(int, int);
+ method public android.view.accessibility.AccessibilityNodeInfo createAccessibilityNodeInfo(int);
+ method public android.view.accessibility.AccessibilityNodeInfo findAccessibilityFocus(int);
+ method public java.util.List<android.view.accessibility.AccessibilityNodeInfo> findAccessibilityNodeInfosByText(java.lang.String, int);
+ method public boolean performAction(int, int, android.os.Bundle);
}
public class AccessibilityRecord {
@@ -24064,6 +25264,8 @@
method public int getCurrentItemIndex();
method public int getFromIndex();
method public int getItemCount();
+ method public int getMaxScrollX();
+ method public int getMaxScrollY();
method public android.os.Parcelable getParcelableData();
method public int getRemovedCount();
method public int getScrollX();
@@ -24090,6 +25292,8 @@
method public void setFromIndex(int);
method public void setFullScreen(boolean);
method public void setItemCount(int);
+ method public void setMaxScrollX(int);
+ method public void setMaxScrollY(int);
method public void setParcelableData(android.os.Parcelable);
method public void setPassword(boolean);
method public void setRemovedCount(int);
@@ -24097,6 +25301,7 @@
method public void setScrollY(int);
method public void setScrollable(boolean);
method public void setSource(android.view.View);
+ method public void setSource(android.view.View, int);
method public void setToIndex(int);
}
@@ -24438,6 +25643,7 @@
field public static final int IME_ACTION_SEARCH = 3; // 0x3
field public static final int IME_ACTION_SEND = 4; // 0x4
field public static final int IME_ACTION_UNSPECIFIED = 0; // 0x0
+ field public static final int IME_FLAG_FORCE_ASCII = -2147483648; // 0x80000000
field public static final int IME_FLAG_NAVIGATE_NEXT = 134217728; // 0x8000000
field public static final int IME_FLAG_NAVIGATE_PREVIOUS = 67108864; // 0x4000000
field public static final int IME_FLAG_NO_ACCESSORY_ACTION = 536870912; // 0x20000000
@@ -24625,6 +25831,7 @@
method public void showSoftInputFromInputMethod(android.os.IBinder, int);
method public void showStatusIcon(android.os.IBinder, java.lang.String, int);
method public boolean switchToLastInputMethod(android.os.IBinder);
+ method public boolean switchToNextInputMethod(android.os.IBinder, boolean);
method public void toggleSoftInput(int, int);
method public void toggleSoftInputFromWindow(android.os.IBinder, int, int);
method public void updateCursor(android.view.View, int, int, int, int);
@@ -24679,6 +25886,18 @@
package android.view.textservice {
+ public final class SentenceSuggestionsInfo implements android.os.Parcelable {
+ ctor public SentenceSuggestionsInfo(android.view.textservice.SuggestionsInfo[], int[], int[]);
+ ctor public SentenceSuggestionsInfo(android.os.Parcel);
+ method public int describeContents();
+ method public int getLengthAt(int);
+ method public int getOffsetAt(int);
+ method public int getSuggestionsCount();
+ method public android.view.textservice.SuggestionsInfo getSuggestionsInfoAt(int);
+ method public void writeToParcel(android.os.Parcel, int);
+ field public static final android.os.Parcelable.Creator CREATOR;
+ }
+
public final class SpellCheckerInfo implements android.os.Parcelable {
method public int describeContents();
method public android.content.ComponentName getComponent();
@@ -24695,23 +25914,28 @@
}
public class SpellCheckerSession {
+ method public void cancel();
method public void close();
+ method public void getSentenceSuggestions(android.view.textservice.TextInfo[], int);
method public android.view.textservice.SpellCheckerInfo getSpellChecker();
- method public void getSuggestions(android.view.textservice.TextInfo, int);
- method public void getSuggestions(android.view.textservice.TextInfo[], int, boolean);
+ method public deprecated void getSuggestions(android.view.textservice.TextInfo, int);
+ method public deprecated void getSuggestions(android.view.textservice.TextInfo[], int, boolean);
method public boolean isSessionDisconnected();
field public static final java.lang.String SERVICE_META_DATA = "android.view.textservice.scs";
}
public static abstract interface SpellCheckerSession.SpellCheckerSessionListener {
+ method public abstract void onGetSentenceSuggestions(android.view.textservice.SentenceSuggestionsInfo[]);
method public abstract void onGetSuggestions(android.view.textservice.SuggestionsInfo[]);
}
public final class SpellCheckerSubtype implements android.os.Parcelable {
ctor public SpellCheckerSubtype(int, java.lang.String, java.lang.String);
+ method public boolean containsExtraValueKey(java.lang.String);
method public int describeContents();
method public java.lang.CharSequence getDisplayName(android.content.Context, java.lang.String, android.content.pm.ApplicationInfo);
method public java.lang.String getExtraValue();
+ method public java.lang.String getExtraValueOf(java.lang.String);
method public java.lang.String getLocale();
method public int getNameResId();
method public void writeToParcel(android.os.Parcel, int);
@@ -24731,6 +25955,7 @@
method public void setCookieAndSequence(int, int);
method public void writeToParcel(android.os.Parcel, int);
field public static final android.os.Parcelable.Creator CREATOR;
+ field public static final int RESULT_ATTR_HAS_RECOMMENDED_SUGGESTIONS = 4; // 0x4
field public static final int RESULT_ATTR_IN_THE_DICTIONARY = 1; // 0x1
field public static final int RESULT_ATTR_LOOKS_LIKE_TYPO = 2; // 0x2
}
@@ -24980,6 +26205,8 @@
method public boolean enableSmoothTransition();
method public boolean getAllowContentAccess();
method public boolean getAllowFileAccess();
+ method public abstract boolean getAllowFileAccessFromFileURLs();
+ method public abstract boolean getAllowUniversalAccessFromFileURLs();
method public synchronized boolean getBlockNetworkImage();
method public synchronized boolean getBlockNetworkLoads();
method public boolean getBuiltInZoomControls();
@@ -24997,7 +26224,7 @@
method public synchronized java.lang.String getFixedFontFamily();
method public synchronized boolean getJavaScriptCanOpenWindowsAutomatically();
method public synchronized boolean getJavaScriptEnabled();
- method public deprecated synchronized android.webkit.WebSettings.LayoutAlgorithm getLayoutAlgorithm();
+ method public synchronized android.webkit.WebSettings.LayoutAlgorithm getLayoutAlgorithm();
method public boolean getLightTouchEnabled();
method public boolean getLoadWithOverviewMode();
method public synchronized boolean getLoadsImagesAutomatically();
@@ -25021,6 +26248,8 @@
method public synchronized java.lang.String getUserAgentString();
method public void setAllowContentAccess(boolean);
method public void setAllowFileAccess(boolean);
+ method public abstract void setAllowFileAccessFromFileURLs(boolean);
+ method public abstract void setAllowUniversalAccessFromFileURLs(boolean);
method public synchronized void setAppCacheEnabled(boolean);
method public synchronized void setAppCacheMaxSize(long);
method public synchronized void setAppCachePath(java.lang.String);
@@ -25044,7 +26273,7 @@
method public synchronized void setGeolocationEnabled(boolean);
method public synchronized void setJavaScriptCanOpenWindowsAutomatically(boolean);
method public synchronized void setJavaScriptEnabled(boolean);
- method public deprecated synchronized void setLayoutAlgorithm(android.webkit.WebSettings.LayoutAlgorithm);
+ method public synchronized void setLayoutAlgorithm(android.webkit.WebSettings.LayoutAlgorithm);
method public void setLightTouchEnabled(boolean);
method public void setLoadWithOverviewMode(boolean);
method public synchronized void setLoadsImagesAutomatically(boolean);
@@ -25079,12 +26308,12 @@
field public static final int LOAD_NO_CACHE = 2; // 0x2
}
- public static final deprecated class WebSettings.LayoutAlgorithm extends java.lang.Enum {
+ public static final class WebSettings.LayoutAlgorithm extends java.lang.Enum {
method public static android.webkit.WebSettings.LayoutAlgorithm valueOf(java.lang.String);
method public static final android.webkit.WebSettings.LayoutAlgorithm[] values();
enum_constant public static final android.webkit.WebSettings.LayoutAlgorithm NARROW_COLUMNS;
enum_constant public static final android.webkit.WebSettings.LayoutAlgorithm NORMAL;
- enum_constant public static final android.webkit.WebSettings.LayoutAlgorithm SINGLE_COLUMN;
+ enum_constant public static final deprecated android.webkit.WebSettings.LayoutAlgorithm SINGLE_COLUMN;
}
public static final class WebSettings.PluginState extends java.lang.Enum {
@@ -25180,7 +26409,8 @@
method public deprecated void emulateShiftHeld();
method public static deprecated void enablePlatformNotifications();
method public static java.lang.String findAddress(java.lang.String);
- method public int findAll(java.lang.String);
+ method public deprecated int findAll(java.lang.String);
+ method public void findAllAsync(java.lang.String);
method public void findNext(boolean);
method public void flingScroll(int, int);
method public void freeMemory();
@@ -25230,6 +26460,7 @@
method public void saveWebArchive(java.lang.String, boolean, android.webkit.ValueCallback<java.lang.String>);
method public void setCertificate(android.net.http.SslCertificate);
method public void setDownloadListener(android.webkit.DownloadListener);
+ method public void setFindListener(android.webkit.WebView.FindListener);
method public void setHorizontalScrollbarOverlay(boolean);
method public void setHttpAuthUsernamePassword(java.lang.String, java.lang.String, java.lang.String, java.lang.String);
method public void setInitialScale(int);
@@ -25248,6 +26479,10 @@
field public static final java.lang.String SCHEME_TEL = "tel:";
}
+ public static abstract interface WebView.FindListener {
+ method public abstract void onFindResultReceived(int, int, boolean);
+ }
+
public static class WebView.HitTestResult {
method public java.lang.String getExtra();
method public int getType();
@@ -25442,6 +26677,7 @@
ctor public AbsSeekBar(android.content.Context, android.util.AttributeSet);
ctor public AbsSeekBar(android.content.Context, android.util.AttributeSet, int);
method public int getKeyProgressIncrement();
+ method public android.graphics.drawable.Drawable getThumb();
method public int getThumbOffset();
method public void setKeyProgressIncrement(int);
method public void setThumb(android.graphics.drawable.Drawable);
@@ -25546,7 +26782,7 @@
method public abstract void onNothingSelected(android.widget.AdapterView<?>);
}
- public abstract class AdapterViewAnimator extends android.widget.AdapterView {
+ public abstract class AdapterViewAnimator extends android.widget.AdapterView implements android.widget.Advanceable {
ctor public AdapterViewAnimator(android.content.Context);
ctor public AdapterViewAnimator(android.content.Context, android.util.AttributeSet);
ctor public AdapterViewAnimator(android.content.Context, android.util.AttributeSet, int);
@@ -25579,6 +26815,7 @@
public class AdapterViewFlipper extends android.widget.AdapterViewAnimator {
ctor public AdapterViewFlipper(android.content.Context);
ctor public AdapterViewFlipper(android.content.Context, android.util.AttributeSet);
+ method public int getFlipInterval();
method public boolean isAutoStart();
method public boolean isFlipping();
method public void setAutoStart(boolean);
@@ -25587,6 +26824,11 @@
method public void stopFlipping();
}
+ public abstract interface Advanceable {
+ method public abstract void advance();
+ method public abstract void fyiWillBeAdvancedByHostKThx();
+ }
+
public class AlphabetIndexer extends android.database.DataSetObserver implements android.widget.SectionIndexer {
ctor public AlphabetIndexer(android.database.Cursor, int, java.lang.CharSequence);
method protected int compare(java.lang.String, java.lang.String);
@@ -25640,6 +26882,7 @@
method public void dismissDropDown();
method public boolean enoughToFilter();
method public android.widget.ListAdapter getAdapter();
+ method public java.lang.CharSequence getCompletionHint();
method public int getDropDownAnchor();
method public android.graphics.drawable.Drawable getDropDownBackground();
method public int getDropDownHeight();
@@ -25727,17 +26970,36 @@
ctor public CalendarView(android.content.Context, android.util.AttributeSet);
ctor public CalendarView(android.content.Context, android.util.AttributeSet, int);
method public long getDate();
+ method public int getDateTextAppearance();
method public int getFirstDayOfWeek();
+ method public int getFocusedMonthDateColor();
method public long getMaxDate();
method public long getMinDate();
+ method public android.graphics.drawable.Drawable getSelectedDateVerticalBar();
+ method public int getSelectedWeekBackgroundColor();
method public boolean getShowWeekNumber();
+ method public int getShownWeekCount();
+ method public int getUnfocusedMonthDateColor();
+ method public int getWeekDayTextAppearance();
+ method public int getWeekNumberColor();
+ method public int getWeekSeparatorLineColor();
method public void setDate(long);
method public void setDate(long, boolean, boolean);
+ method public void setDateTextAppearance(int);
method public void setFirstDayOfWeek(int);
+ method public void setFocusedMonthDateColor(int);
method public void setMaxDate(long);
method public void setMinDate(long);
method public void setOnDateChangeListener(android.widget.CalendarView.OnDateChangeListener);
+ method public void setSelectedDateVerticalBar(int);
+ method public void setSelectedDateVerticalBar(android.graphics.drawable.Drawable);
+ method public void setSelectedWeekBackgroundColor(int);
method public void setShowWeekNumber(boolean);
+ method public void setShownWeekCount(int);
+ method public void setUnfocusedMonthDateColor(int);
+ method public void setWeekDayTextAppearance(int);
+ method public void setWeekNumberColor(int);
+ method public void setWeekSeparatorLineColor(int);
}
public static abstract interface CalendarView.OnDateChangeListener {
@@ -25760,7 +27022,9 @@
ctor public CheckedTextView(android.content.Context);
ctor public CheckedTextView(android.content.Context, android.util.AttributeSet);
ctor public CheckedTextView(android.content.Context, android.util.AttributeSet, int);
+ method public android.graphics.drawable.Drawable getCheckMarkDrawable();
method public boolean isChecked();
+ method public void onPaddingChanged(int);
method public void setCheckMarkDrawable(int);
method public void setCheckMarkDrawable(android.graphics.drawable.Drawable);
method public void setChecked(boolean);
@@ -26043,6 +27307,7 @@
ctor public FrameLayout(android.content.Context, android.util.AttributeSet, int);
method public deprecated boolean getConsiderGoneChildrenWhenMeasuring();
method public android.graphics.drawable.Drawable getForeground();
+ method public int getForegroundGravity();
method public boolean getMeasureAllChildren();
method protected void onLayout(boolean, int, int, int, int);
method public void setForeground(android.graphics.drawable.Drawable);
@@ -26110,10 +27375,12 @@
field public static final android.widget.GridLayout.Alignment BASELINE;
field public static final android.widget.GridLayout.Alignment BOTTOM;
field public static final android.widget.GridLayout.Alignment CENTER;
+ field public static final android.widget.GridLayout.Alignment END;
field public static final android.widget.GridLayout.Alignment FILL;
field public static final int HORIZONTAL = 0; // 0x0
field public static final android.widget.GridLayout.Alignment LEFT;
field public static final android.widget.GridLayout.Alignment RIGHT;
+ field public static final android.widget.GridLayout.Alignment START;
field public static final android.widget.GridLayout.Alignment TOP;
field public static final int UNDEFINED = -2147483648; // 0x80000000
field public static final int VERTICAL = 1; // 0x1
@@ -26142,8 +27409,14 @@
ctor public GridView(android.content.Context, android.util.AttributeSet);
ctor public GridView(android.content.Context, android.util.AttributeSet, int);
method public android.widget.ListAdapter getAdapter();
+ method public int getColumnWidth();
+ method public int getGravity();
+ method public int getHorizontalSpacing();
method public int getNumColumns();
+ method public int getRequestedColumnWidth();
+ method public int getRequestedHorizontalSpacing();
method public int getStretchMode();
+ method public int getVerticalSpacing();
method public void setColumnWidth(int);
method public void setGravity(int);
method public void setHorizontalSpacing(int);
@@ -26226,19 +27499,27 @@
ctor public ImageView(android.content.Context, android.util.AttributeSet);
ctor public ImageView(android.content.Context, android.util.AttributeSet, int);
method public final void clearColorFilter();
+ method public boolean getAdjustViewBounds();
method public boolean getBaselineAlignBottom();
+ method public android.graphics.ColorFilter getColorFilter();
+ method public boolean getCropToPadding();
method public android.graphics.drawable.Drawable getDrawable();
+ method public int getImageAlpha();
method public android.graphics.Matrix getImageMatrix();
+ method public int getMaxHeight();
+ method public int getMaxWidth();
method public android.widget.ImageView.ScaleType getScaleType();
method public int[] onCreateDrawableState(int);
method public void setAdjustViewBounds(boolean);
- method public void setAlpha(int);
+ method public deprecated void setAlpha(int);
method public void setBaseline(int);
method public void setBaselineAlignBottom(boolean);
method public final void setColorFilter(int, android.graphics.PorterDuff.Mode);
method public final void setColorFilter(int);
method public void setColorFilter(android.graphics.ColorFilter);
+ method public void setCropToPadding(boolean);
method protected boolean setFrame(int, int, int, int);
+ method public void setImageAlpha(int);
method public void setImageBitmap(android.graphics.Bitmap);
method public void setImageDrawable(android.graphics.drawable.Drawable);
method public void setImageLevel(int);
@@ -26269,6 +27550,7 @@
ctor public LinearLayout(android.content.Context, android.util.AttributeSet);
ctor public LinearLayout(android.content.Context, android.util.AttributeSet, int);
method public int getBaselineAlignedChildIndex();
+ method public android.graphics.drawable.Drawable getDividerDrawable();
method public int getDividerPadding();
method public int getOrientation();
method public int getShowDividers();
@@ -26692,6 +27974,7 @@
ctor public RelativeLayout(android.content.Context);
ctor public RelativeLayout(android.content.Context, android.util.AttributeSet);
ctor public RelativeLayout(android.content.Context, android.util.AttributeSet, int);
+ method public int getGravity();
method protected void onLayout(boolean, int, int, int, int);
method public void setGravity(int);
method public void setHorizontalGravity(int);
@@ -26730,6 +28013,7 @@
public class RemoteViews implements android.view.LayoutInflater.Filter android.os.Parcelable {
ctor public RemoteViews(java.lang.String, int);
+ ctor public RemoteViews(android.widget.RemoteViews, android.widget.RemoteViews);
ctor public RemoteViews(android.os.Parcel);
method public void addView(int, android.widget.RemoteViews);
method public android.view.View apply(android.content.Context, android.view.ViewGroup);
@@ -26747,6 +28031,7 @@
method public void setChar(int, java.lang.String, char);
method public void setCharSequence(int, java.lang.String, java.lang.CharSequence);
method public void setChronometer(int, long, java.lang.String, boolean);
+ method public void setContentDescription(int, java.lang.CharSequence);
method public void setDisplayedChild(int, int);
method public void setDouble(int, java.lang.String, double);
method public void setEmptyView(int, int);
@@ -26768,6 +28053,7 @@
method public void setShort(int, java.lang.String, short);
method public void setString(int, java.lang.String, java.lang.String);
method public void setTextColor(int, int);
+ method public void setTextViewCompoundDrawables(int, int, int, int, int);
method public void setTextViewText(int, java.lang.CharSequence);
method public void setUri(int, java.lang.String, android.net.Uri);
method public void setViewVisibility(int, int);
@@ -26868,7 +28154,11 @@
public class SearchView extends android.widget.LinearLayout implements android.view.CollapsibleActionView {
ctor public SearchView(android.content.Context);
ctor public SearchView(android.content.Context, android.util.AttributeSet);
+ method public int getImeOptions();
+ method public int getInputType();
+ method public int getMaxWidth();
method public java.lang.CharSequence getQuery();
+ method public java.lang.CharSequence getQueryHint();
method public android.widget.CursorAdapter getSuggestionsAdapter();
method public boolean isIconfiedByDefault();
method public boolean isIconified();
@@ -27064,9 +28354,19 @@
ctor public Spinner(android.content.Context, android.util.AttributeSet);
ctor public Spinner(android.content.Context, android.util.AttributeSet, int);
ctor public Spinner(android.content.Context, android.util.AttributeSet, int, int);
+ method public int getDropDownHorizontalOffset();
+ method public int getDropDownVerticalOffset();
+ method public int getDropDownWidth();
+ method public int getGravity();
+ method public android.graphics.drawable.Drawable getPopupBackground();
method public java.lang.CharSequence getPrompt();
method public void onClick(android.content.DialogInterface, int);
+ method public void setDropDownHorizontalOffset(int);
+ method public void setDropDownVerticalOffset(int);
+ method public void setDropDownWidth(int);
method public void setGravity(int);
+ method public void setPopupBackgroundDrawable(android.graphics.drawable.Drawable);
+ method public void setPopupBackgroundResource(int);
method public void setPrompt(java.lang.CharSequence);
method public void setPromptId(int);
field public static final int MODE_DIALOG = 0; // 0x0
@@ -27087,14 +28387,26 @@
ctor public Switch(android.content.Context);
ctor public Switch(android.content.Context, android.util.AttributeSet);
ctor public Switch(android.content.Context, android.util.AttributeSet, int);
+ method public int getSwitchMinWidth();
+ method public int getSwitchPadding();
method public java.lang.CharSequence getTextOff();
method public java.lang.CharSequence getTextOn();
+ method public android.graphics.drawable.Drawable getThumbDrawable();
+ method public int getThumbTextPadding();
+ method public android.graphics.drawable.Drawable getTrackDrawable();
method public void onMeasure(int, int);
+ method public void setSwitchMinWidth(int);
+ method public void setSwitchPadding(int);
method public void setSwitchTextAppearance(android.content.Context, int);
method public void setSwitchTypeface(android.graphics.Typeface, int);
method public void setSwitchTypeface(android.graphics.Typeface);
method public void setTextOff(java.lang.CharSequence);
method public void setTextOn(java.lang.CharSequence);
+ method public void setThumbDrawable(android.graphics.drawable.Drawable);
+ method public void setThumbResource(int);
+ method public void setThumbTextPadding(int);
+ method public void setTrackDrawable(android.graphics.drawable.Drawable);
+ method public void setTrackResource(int);
}
public class TabHost extends android.widget.FrameLayout implements android.view.ViewTreeObserver.OnTouchModeChangeListener {
@@ -27238,11 +28550,13 @@
method public android.text.InputFilter[] getFilters();
method public boolean getFreezesText();
method public int getGravity();
+ method public int getHighlightColor();
method public java.lang.CharSequence getHint();
method public final android.content.res.ColorStateList getHintTextColors();
method public int getImeActionId();
method public java.lang.CharSequence getImeActionLabel();
method public int getImeOptions();
+ method public boolean getIncludeFontPadding();
method public android.os.Bundle getInputExtras(boolean);
method public int getInputType();
method public final android.text.method.KeyListener getKeyListener();
@@ -27250,8 +28564,19 @@
method public int getLineBounds(int, android.graphics.Rect);
method public int getLineCount();
method public int getLineHeight();
+ method public float getLineSpacingExtra();
+ method public float getLineSpacingMultiplier();
method public final android.content.res.ColorStateList getLinkTextColors();
method public final boolean getLinksClickable();
+ method public int getMarqueeRepeatLimit();
+ method public int getMaxEms();
+ method public int getMaxHeight();
+ method public int getMaxLines();
+ method public int getMaxWidth();
+ method public int getMinEms();
+ method public int getMinHeight();
+ method public int getMinLines();
+ method public int getMinWidth();
method public final android.text.method.MovementMethod getMovementMethod();
method public int getOffsetForPosition(float, float);
method public android.text.TextPaint getPaint();
@@ -27259,6 +28584,10 @@
method public java.lang.String getPrivateImeOptions();
method public int getSelectionEnd();
method public int getSelectionStart();
+ method public int getShadowColor();
+ method public float getShadowDx();
+ method public float getShadowDy();
+ method public float getShadowRadius();
method public java.lang.CharSequence getText();
method public static int getTextColor(android.content.Context, android.content.res.TypedArray, int);
method public final android.content.res.ColorStateList getTextColors();
@@ -27273,6 +28602,7 @@
method public android.graphics.Typeface getTypeface();
method public android.text.style.URLSpan[] getUrls();
method public boolean hasSelection();
+ method public boolean isCursorVisible();
method public boolean isInputMethodTarget();
method public boolean isSuggestionsEnabled();
method public boolean isTextSelectable();
@@ -27285,6 +28615,8 @@
method public void onEndBatchEdit();
method public boolean onPreDraw();
method public boolean onPrivateIMECommand(java.lang.String, android.os.Bundle);
+ method public void onResolvedLayoutDirectionReset();
+ method public void onResolvedTextDirectionChanged();
method public void onRestoreInstanceState(android.os.Parcelable);
method public android.os.Parcelable onSaveInstanceState();
method protected void onSelectionChanged(int, int);
@@ -27340,6 +28672,7 @@
method public void setMinWidth(int);
method public final void setMovementMethod(android.text.method.MovementMethod);
method public void setOnEditorActionListener(android.widget.TextView.OnEditorActionListener);
+ method public void setPaddingRelative(int, int, int, int);
method public void setPaintFlags(int);
method public void setPrivateImeOptions(java.lang.String);
method public void setRawInputType(int);
@@ -41820,6 +43153,10 @@
method public static void assertTrue(boolean);
method public static void fail(java.lang.String);
method public static void fail();
+ method public static void failNotEquals(java.lang.String, java.lang.Object, java.lang.Object);
+ method public static void failNotSame(java.lang.String, java.lang.Object, java.lang.Object);
+ method public static void failSame(java.lang.String);
+ method public static java.lang.String format(java.lang.String, java.lang.Object, java.lang.Object);
}
public class AssertionFailedError extends java.lang.AssertionError {
@@ -41829,6 +43166,8 @@
public class ComparisonFailure extends junit.framework.AssertionFailedError {
ctor public ComparisonFailure(java.lang.String, java.lang.String, java.lang.String);
+ method public java.lang.String getActual();
+ method public java.lang.String getExpected();
}
public abstract interface Protectable {
@@ -41902,18 +43241,21 @@
ctor public TestSuite(java.lang.Class<?>);
ctor public TestSuite(java.lang.Class<? extends junit.framework.TestCase>, java.lang.String);
ctor public TestSuite(java.lang.String);
+ ctor public TestSuite(java.lang.Class<?>...);
+ ctor public TestSuite(java.lang.Class<? extends junit.framework.TestCase>[], java.lang.String);
method public void addTest(junit.framework.Test);
method public void addTestSuite(java.lang.Class<? extends junit.framework.TestCase>);
method public int countTestCases();
method public static junit.framework.Test createTest(java.lang.Class<?>, java.lang.String);
method public java.lang.String getName();
- method public static java.lang.reflect.Constructor<?> getTestConstructor(java.lang.Class) throws java.lang.NoSuchMethodException;
+ method public static java.lang.reflect.Constructor<?> getTestConstructor(java.lang.Class<?>) throws java.lang.NoSuchMethodException;
method public void run(junit.framework.TestResult);
method public void runTest(junit.framework.Test, junit.framework.TestResult);
method public void setName(java.lang.String);
method public junit.framework.Test testAt(int);
method public int testCount();
method public java.util.Enumeration<junit.framework.Test> tests();
+ method public static junit.framework.Test warning(java.lang.String);
}
}
@@ -41930,12 +43272,12 @@
method public java.lang.String extractClassName(java.lang.String);
method public static java.lang.String getFilteredTrace(java.lang.Throwable);
method public static java.lang.String getFilteredTrace(java.lang.String);
- method public junit.runner.TestSuiteLoader getLoader();
+ method public deprecated junit.runner.TestSuiteLoader getLoader();
method public static java.lang.String getPreference(java.lang.String);
method public static int getPreference(java.lang.String, int);
method protected static java.util.Properties getPreferences();
method public junit.framework.Test getTest(java.lang.String);
- method public static boolean inVAJava();
+ method public static deprecated boolean inVAJava();
method protected java.lang.Class<?> loadSuiteClass(java.lang.String) throws java.lang.ClassNotFoundException;
method protected java.lang.String processArguments(java.lang.String[]);
method protected abstract void runFailed(java.lang.String);
diff --git a/api/current.txt b/api/current.txt
index b10c107..8402f31 100644
--- a/api/current.txt
+++ b/api/current.txt
@@ -485,6 +485,7 @@
field public static final int focusable = 16842970; // 0x10100da
field public static final int focusableInTouchMode = 16842971; // 0x10100db
field public static final int focusedMonthDateColor = 16843587; // 0x1010343
+ field public static final int fontFamily = 16843692; // 0x10103ac
field public static final int footerDividersEnabled = 16843311; // 0x101022f
field public static final int foreground = 16843017; // 0x1010109
field public static final int foregroundGravity = 16843264; // 0x1010200
@@ -588,12 +589,11 @@
field public static final int isRepeatable = 16843336; // 0x1010248
field public static final int isScrollContainer = 16843342; // 0x101024e
field public static final int isSticky = 16843335; // 0x1010247
- field public static final int isolatedProcess = 16843687; // 0x10103a7
+ field public static final int isolatedProcess = 16843689; // 0x10103a9
field public static final int itemBackground = 16843056; // 0x1010130
field public static final int itemIconDisabledAlpha = 16843057; // 0x1010131
field public static final int itemPadding = 16843565; // 0x101032d
field public static final int itemTextAppearance = 16843052; // 0x101012c
- field public static final int kcm = 16843688; // 0x10103a8
field public static final int keepScreenOn = 16843286; // 0x1010216
field public static final int key = 16843240; // 0x10101e8
field public static final int keyBackground = 16843315; // 0x1010233
@@ -608,6 +608,7 @@
field public static final int keyTextColor = 16843318; // 0x1010236
field public static final int keyTextSize = 16843316; // 0x1010234
field public static final int keyWidth = 16843325; // 0x101023d
+ field public static final int keyboardLayout = 16843691; // 0x10103ab
field public static final int keyboardMode = 16843341; // 0x101024d
field public static final int keycode = 16842949; // 0x10100c5
field public static final int killAfterRestore = 16843420; // 0x101029c
@@ -746,14 +747,14 @@
field public static final int panelColorForeground = 16842848; // 0x1010060
field public static final int panelFullBackground = 16842847; // 0x101005f
field public static final int panelTextAppearance = 16842850; // 0x1010062
- field public static final int parentActivityName = 16843689; // 0x10103a9
+ field public static final int parentActivityName = 16843687; // 0x10103a7
field public static final deprecated int password = 16843100; // 0x101015c
field public static final int path = 16842794; // 0x101002a
field public static final int pathPattern = 16842796; // 0x101002c
field public static final int pathPrefix = 16842795; // 0x101002b
field public static final int permission = 16842758; // 0x1010006
field public static final int permissionGroup = 16842762; // 0x101000a
- field public static final int permissionGroupFlags = 16843691; // 0x10103ab
+ field public static final int permissionGroupFlags = 16843688; // 0x10103a8
field public static final int persistent = 16842765; // 0x101000d
field public static final int persistentDrawingCache = 16842990; // 0x10100ee
field public static final deprecated int phoneNumber = 16843111; // 0x1010167
@@ -3722,10 +3723,6 @@
field public static final int FLAG_ONGOING_EVENT = 2; // 0x2
field public static final int FLAG_ONLY_ALERT_ONCE = 8; // 0x8
field public static final int FLAG_SHOW_LIGHTS = 1; // 0x1
- field public static final java.lang.String KIND_CALL = "android.call";
- field public static final java.lang.String KIND_EMAIL = "android.email";
- field public static final java.lang.String KIND_EVENT = "android.event";
- field public static final java.lang.String KIND_MESSAGE = "android.message";
field public static final java.lang.String KIND_PROMO = "android.promo";
field public static final int PRIORITY_DEFAULT = 0; // 0x0
field public static final int PRIORITY_HIGH = 1; // 0x1
@@ -3743,7 +3740,6 @@
field public android.app.PendingIntent fullScreenIntent;
field public int icon;
field public int iconLevel;
- field public java.lang.String[] kind;
field public android.graphics.Bitmap largeIcon;
field public int ledARGB;
field public int ledOffMS;
@@ -3778,7 +3774,6 @@
public static class Notification.Builder {
ctor public Notification.Builder(android.content.Context);
method public android.app.Notification.Builder addAction(int, java.lang.CharSequence, android.app.PendingIntent);
- method public android.app.Notification.Builder addKind(java.lang.String);
method public android.app.Notification build();
method public deprecated android.app.Notification getNotification();
method public android.app.Notification.Builder setAutoCancel(boolean);
@@ -12493,7 +12488,7 @@
method public abstract boolean isHierarchical();
method public boolean isOpaque();
method public abstract boolean isRelative();
- method public android.net.Uri normalize();
+ method public android.net.Uri normalizeScheme();
method public static android.net.Uri parse(java.lang.String);
method public abstract java.lang.String toString();
method public static android.net.Uri withAppendedPath(android.net.Uri, java.lang.String);
@@ -15224,7 +15219,7 @@
field public static final int HONEYCOMB_MR2 = 13; // 0xd
field public static final int ICE_CREAM_SANDWICH = 14; // 0xe
field public static final int ICE_CREAM_SANDWICH_MR1 = 15; // 0xf
- field public static final int JELLY_BEAN = 10000; // 0x2710
+ field public static final int JELLY_BEAN = 16; // 0x10
}
public final class Bundle implements java.lang.Cloneable android.os.Parcelable {
@@ -23939,7 +23934,6 @@
method public final android.view.View findViewWithTag(java.lang.Object);
method public void findViewsWithText(java.util.ArrayList<android.view.View>, java.lang.CharSequence, int);
method protected boolean fitSystemWindows(android.graphics.Rect);
- method public boolean fitsSystemWindows();
method public android.view.View focusSearch(int);
method public void forceLayout();
method public android.view.accessibility.AccessibilityNodeProvider getAccessibilityNodeProvider();
@@ -23964,6 +23958,7 @@
method public void getDrawingRect(android.graphics.Rect);
method public long getDrawingTime();
method public boolean getFilterTouchesWhenObscured();
+ method public boolean getFitsSystemWindows();
method public java.util.ArrayList<android.view.View> getFocusables(int);
method public void getFocusedRect(android.graphics.Rect);
method public boolean getGlobalVisibleRect(android.graphics.Rect, android.graphics.Point);
@@ -25240,6 +25235,8 @@
field public static final int ACTION_NEXT_HTML_ELEMENT = 1024; // 0x400
field public static final int ACTION_PREVIOUS_AT_MOVEMENT_GRANULARITY = 512; // 0x200
field public static final int ACTION_PREVIOUS_HTML_ELEMENT = 2048; // 0x800
+ field public static final int ACTION_SCROLL_BACKWARD = 8192; // 0x2000
+ field public static final int ACTION_SCROLL_FORWARD = 4096; // 0x1000
field public static final int ACTION_SELECT = 4; // 0x4
field public static final android.os.Parcelable.Creator CREATOR;
field public static final int FOCUS_ACCESSIBILITY = 2; // 0x2
diff --git a/core/java/android/app/ActivityOptions.java b/core/java/android/app/ActivityOptions.java
index 3d0b7d8..523a78d 100644
--- a/core/java/android/app/ActivityOptions.java
+++ b/core/java/android/app/ActivityOptions.java
@@ -98,6 +98,8 @@
public static final int ANIM_SCALE_UP = 2;
/** @hide */
public static final int ANIM_THUMBNAIL = 3;
+ /** @hide */
+ public static final int ANIM_THUMBNAIL_DELAYED = 4;
private String mPackageName;
private int mAnimationType = ANIM_NONE;
@@ -219,9 +221,38 @@
*/
public static ActivityOptions makeThumbnailScaleUpAnimation(View source,
Bitmap thumbnail, int startX, int startY, OnAnimationStartedListener listener) {
+ return makeThumbnailScaleUpAnimation(source, thumbnail, startX, startY, listener, false);
+ }
+
+ /**
+ * Create an ActivityOptions specifying an animation where a thumbnail
+ * is scaled from a given position to the new activity window that is
+ * being started. Before the animation, there is a short delay.
+ *
+ * @param source The View that this thumbnail is animating from. This
+ * defines the coordinate space for <var>startX</var> and <var>startY</var>.
+ * @param thumbnail The bitmap that will be shown as the initial thumbnail
+ * of the animation.
+ * @param startX The x starting location of the bitmap, relative to <var>source</var>.
+ * @param startY The y starting location of the bitmap, relative to <var>source</var>.
+ * @param listener Optional OnAnimationStartedListener to find out when the
+ * requested animation has started running. If for some reason the animation
+ * is not executed, the callback will happen immediately.
+ * @return Returns a new ActivityOptions object that you can use to
+ * supply these options as the options Bundle when starting an activity.
+ * @hide
+ */
+ public static ActivityOptions makeDelayedThumbnailScaleUpAnimation(View source,
+ Bitmap thumbnail, int startX, int startY, OnAnimationStartedListener listener) {
+ return makeThumbnailScaleUpAnimation(source, thumbnail, startX, startY, listener, true);
+ }
+
+ private static ActivityOptions makeThumbnailScaleUpAnimation(View source,
+ Bitmap thumbnail, int startX, int startY, OnAnimationStartedListener listener,
+ boolean delayed) {
ActivityOptions opts = new ActivityOptions();
opts.mPackageName = source.getContext().getPackageName();
- opts.mAnimationType = ANIM_THUMBNAIL;
+ opts.mAnimationType = delayed ? ANIM_THUMBNAIL_DELAYED : ANIM_THUMBNAIL;
opts.mThumbnail = thumbnail;
int[] pts = new int[2];
source.getLocationOnScreen(pts);
@@ -258,7 +289,8 @@
mStartY = opts.getInt(KEY_ANIM_START_Y, 0);
mStartWidth = opts.getInt(KEY_ANIM_START_WIDTH, 0);
mStartHeight = opts.getInt(KEY_ANIM_START_HEIGHT, 0);
- } else if (mAnimationType == ANIM_THUMBNAIL) {
+ } else if (mAnimationType == ANIM_THUMBNAIL ||
+ mAnimationType == ANIM_THUMBNAIL_DELAYED) {
mThumbnail = (Bitmap)opts.getParcelable(KEY_ANIM_THUMBNAIL);
mStartX = opts.getInt(KEY_ANIM_START_X, 0);
mStartY = opts.getInt(KEY_ANIM_START_Y, 0);
@@ -359,6 +391,7 @@
mStartHeight = otherOptions.mStartHeight;
break;
case ANIM_THUMBNAIL:
+ case ANIM_THUMBNAIL_DELAYED:
mAnimationType = otherOptions.mAnimationType;
mThumbnail = otherOptions.mThumbnail;
mStartX = otherOptions.mStartX;
@@ -401,6 +434,7 @@
b.putInt(KEY_ANIM_START_HEIGHT, mStartHeight);
break;
case ANIM_THUMBNAIL:
+ case ANIM_THUMBNAIL_DELAYED:
b.putInt(KEY_ANIM_TYPE, mAnimationType);
b.putParcelable(KEY_ANIM_THUMBNAIL, mThumbnail);
b.putInt(KEY_ANIM_START_X, mStartX);
diff --git a/core/java/android/app/Notification.java b/core/java/android/app/Notification.java
index edeeee2..0c47069 100644
--- a/core/java/android/app/Notification.java
+++ b/core/java/android/app/Notification.java
@@ -390,21 +390,25 @@
public int priority;
/**
+ * @hide
* Notification type: incoming call (voice or video) or similar synchronous communication request.
*/
public static final String KIND_CALL = "android.call";
/**
+ * @hide
* Notification type: incoming direct message (SMS, instant message, etc.).
*/
public static final String KIND_MESSAGE = "android.message";
/**
+ * @hide
* Notification type: asynchronous bulk message (email).
*/
public static final String KIND_EMAIL = "android.email";
/**
+ * @hide
* Notification type: calendar event.
*/
public static final String KIND_EVENT = "android.event";
@@ -415,6 +419,7 @@
public static final String KIND_PROMO = "android.promo";
/**
+ * @hide
* If this notification matches of one or more special types (see the <code>KIND_*</code>
* constants), add them here, best match first.
*/
@@ -977,8 +982,14 @@
}
/**
- * Show the {@link Notification#when} field as a countdown (or count-up) timer instead of a timestamp.
+ * Show the {@link Notification#when} field as a stopwatch.
+ *
+ * Instead of presenting <code>when</code> as a timestamp, the notification will show an
+ * automatically updating display of the minutes and seconds since <code>when</code>.
*
+ * Useful when showing an elapsed time (like an ongoing phone call).
+ *
+ * @see android.widget.Chronometer
* @see Notification#when
*/
public Builder setUsesChronometer(boolean b) {
@@ -1303,6 +1314,8 @@
}
/**
+ * @hide
+ *
* Add a kind (category) to this notification. Optional.
*
* @see Notification#kind
@@ -1490,7 +1503,16 @@
RemoteViews button = new RemoteViews(mContext.getPackageName(), R.layout.notification_action);
button.setTextViewCompoundDrawables(R.id.action0, action.icon, 0, 0, 0);
button.setTextViewText(R.id.action0, action.title);
- button.setOnClickPendingIntent(R.id.action0, action.actionIntent);
+ if (action.actionIntent != null) {
+ button.setOnClickPendingIntent(R.id.action0, action.actionIntent);
+ //button.setBoolean(R.id.action0, "setEnabled", true);
+ button.setFloat(R.id.button0, "setAlpha", 1.0f);
+ button.setBoolean(R.id.button0, "setClickable", true);
+ } else {
+ //button.setBoolean(R.id.action0, "setEnabled", false);
+ button.setFloat(R.id.button0, "setAlpha", 0.5f);
+ button.setBoolean(R.id.button0, "setClickable", false);
+ }
button.setContentDescription(R.id.action0, action.title);
return button;
}
diff --git a/core/java/android/content/Intent.java b/core/java/android/content/Intent.java
index 4ed6f25..c791e47 100644
--- a/core/java/android/content/Intent.java
+++ b/core/java/android/content/Intent.java
@@ -4573,7 +4573,7 @@
* <p><em>Note: scheme matching in the Android framework is
* case-sensitive, unlike the formal RFC. As a result,
* you should always write your Uri with a lower case scheme,
- * or use {@link Uri#normalize} or
+ * or use {@link Uri#normalizeScheme} or
* {@link #setDataAndNormalize}
* to ensure that the scheme is converted to lower case.</em>
*
@@ -4599,7 +4599,7 @@
* previously set (for example, by {@link #setType}).
*
* <p>The data Uri is normalized using
- * {@link android.net.Uri#normalize} before it is set,
+ * {@link android.net.Uri#normalizeScheme} before it is set,
* so really this is just a convenience method for
* <pre>
* setData(data.normalize())
@@ -4612,10 +4612,10 @@
*
* @see #getData
* @see #setType
- * @see android.net.Uri#normalize
+ * @see android.net.Uri#normalizeScheme
*/
public Intent setDataAndNormalize(Uri data) {
- return setData(data.normalize());
+ return setData(data.normalizeScheme());
}
/**
@@ -4687,7 +4687,7 @@
* <p><em>Note: MIME type and Uri scheme matching in the
* Android framework is case-sensitive, unlike the formal RFC definitions.
* As a result, you should always write these elements with lower case letters,
- * or use {@link #normalizeMimeType} or {@link android.net.Uri#normalize} or
+ * or use {@link #normalizeMimeType} or {@link android.net.Uri#normalizeScheme} or
* {@link #setDataAndTypeAndNormalize}
* to ensure that they are converted to lower case.</em>
*
@@ -4700,7 +4700,7 @@
* @see #setType
* @see #setData
* @see #normalizeMimeType
- * @see android.net.Uri#normalize
+ * @see android.net.Uri#normalizeScheme
* @see #setDataAndTypeAndNormalize
*/
public Intent setDataAndType(Uri data, String type) {
@@ -4716,7 +4716,7 @@
* data with your own type given here.
*
* <p>The data Uri and the MIME type are normalize using
- * {@link android.net.Uri#normalize} and {@link #normalizeMimeType}
+ * {@link android.net.Uri#normalizeScheme} and {@link #normalizeMimeType}
* before they are set, so really this is just a convenience method for
* <pre>
* setDataAndType(data.normalize(), Intent.normalizeMimeType(type))
@@ -4732,10 +4732,10 @@
* @see #setData
* @see #setDataAndType
* @see #normalizeMimeType
- * @see android.net.Uri#normalize
+ * @see android.net.Uri#normalizeScheme
*/
public Intent setDataAndTypeAndNormalize(Uri data, String type) {
- return setDataAndType(data.normalize(), normalizeMimeType(type));
+ return setDataAndType(data.normalizeScheme(), normalizeMimeType(type));
}
/**
diff --git a/core/java/android/content/pm/ContainerEncryptionParams.java b/core/java/android/content/pm/ContainerEncryptionParams.java
index 5b1440d..88112a7 100644
--- a/core/java/android/content/pm/ContainerEncryptionParams.java
+++ b/core/java/android/content/pm/ContainerEncryptionParams.java
@@ -70,16 +70,16 @@
private final byte[] mMacTag;
/** Offset into file where authenticated (e.g., MAC protected) data begins. */
- private final int mAuthenticatedDataStart;
+ private final long mAuthenticatedDataStart;
/** Offset into file where encrypted data begins. */
- private final int mEncryptedDataStart;
+ private final long mEncryptedDataStart;
/**
* Offset into file for the end of encrypted data (and, by extension,
* authenticated data) in file.
*/
- private final int mDataEnd;
+ private final long mDataEnd;
public ContainerEncryptionParams(String encryptionAlgorithm,
AlgorithmParameterSpec encryptionSpec, SecretKey encryptionKey)
@@ -99,6 +99,8 @@
* @param macAlgorithm MAC algorithm to use; format matches JCE
* @param macSpec algorithm parameters specification, may be {@code null}
* @param macKey key used for authentication (i.e., for the MAC tag)
+ * @param macTag message authentication code (MAC) tag for the authenticated
+ * data
* @param authenticatedDataStart offset of start of authenticated data in
* stream
* @param encryptedDataStart offset of start of encrypted data in stream
@@ -109,7 +111,7 @@
public ContainerEncryptionParams(String encryptionAlgorithm,
AlgorithmParameterSpec encryptionSpec, SecretKey encryptionKey, String macAlgorithm,
AlgorithmParameterSpec macSpec, SecretKey macKey, byte[] macTag,
- int authenticatedDataStart, int encryptedDataStart, int dataEnd)
+ long authenticatedDataStart, long encryptedDataStart, long dataEnd)
throws InvalidAlgorithmParameterException {
if (TextUtils.isEmpty(encryptionAlgorithm)) {
throw new NullPointerException("algorithm == null");
@@ -172,15 +174,15 @@
return mMacTag;
}
- public int getAuthenticatedDataStart() {
+ public long getAuthenticatedDataStart() {
return mAuthenticatedDataStart;
}
- public int getEncryptedDataStart() {
+ public long getEncryptedDataStart() {
return mEncryptedDataStart;
}
- public int getDataEnd() {
+ public long getDataEnd() {
return mDataEnd;
}
@@ -315,9 +317,9 @@
dest.writeByteArray(mMacTag);
- dest.writeInt(mAuthenticatedDataStart);
- dest.writeInt(mEncryptedDataStart);
- dest.writeInt(mDataEnd);
+ dest.writeLong(mAuthenticatedDataStart);
+ dest.writeLong(mEncryptedDataStart);
+ dest.writeLong(mDataEnd);
}
private ContainerEncryptionParams(Parcel source) throws InvalidAlgorithmParameterException {
@@ -333,9 +335,9 @@
mMacTag = source.createByteArray();
- mAuthenticatedDataStart = source.readInt();
- mEncryptedDataStart = source.readInt();
- mDataEnd = source.readInt();
+ mAuthenticatedDataStart = source.readLong();
+ mEncryptedDataStart = source.readLong();
+ mDataEnd = source.readLong();
switch (encParamType) {
case ENC_PARAMS_IV_PARAMETERS:
diff --git a/core/java/android/content/pm/LimitedLengthInputStream.java b/core/java/android/content/pm/LimitedLengthInputStream.java
index 25a490f..e787277 100644
--- a/core/java/android/content/pm/LimitedLengthInputStream.java
+++ b/core/java/android/content/pm/LimitedLengthInputStream.java
@@ -3,6 +3,7 @@
import java.io.FilterInputStream;
import java.io.IOException;
import java.io.InputStream;
+import java.util.Arrays;
/**
* A class that limits the amount of data that is read from an InputStream. When
@@ -15,20 +16,20 @@
/**
* The end of the stream where we don't want to allow more data to be read.
*/
- private final int mEnd;
+ private final long mEnd;
/**
* Current offset in the stream.
*/
- private int mOffset;
+ private long mOffset;
/**
* @param in underlying stream to wrap
* @param offset offset into stream where data starts
* @param length length of data at offset
- * @throws IOException if an error occured with the underlying stream
+ * @throws IOException if an error occurred with the underlying stream
*/
- public LimitedLengthInputStream(InputStream in, int offset, int length) throws IOException {
+ public LimitedLengthInputStream(InputStream in, long offset, long length) throws IOException {
super(in);
if (in == null) {
@@ -36,11 +37,15 @@
}
if (offset < 0) {
- throw new IOException("offset == " + offset);
+ throw new IOException("offset < 0");
}
if (length < 0) {
- throw new IOException("length must be non-negative; is " + length);
+ throw new IOException("length < 0");
+ }
+
+ if (length > Long.MAX_VALUE - offset) {
+ throw new IOException("offset + length > Long.MAX_VALUE");
}
mEnd = offset + length;
@@ -65,8 +70,15 @@
return -1;
}
+ final int arrayLength = buffer.length;
+ Arrays.checkOffsetAndCount(arrayLength, offset, byteCount);
+
+ if (mOffset > Long.MAX_VALUE - byteCount) {
+ throw new IOException("offset out of bounds: " + mOffset + " + " + byteCount);
+ }
+
if (mOffset + byteCount > mEnd) {
- byteCount = mEnd - mOffset;
+ byteCount = (int) (mEnd - mOffset);
}
final int numRead = super.read(buffer, offset, byteCount);
diff --git a/core/java/android/content/pm/PackageManager.java b/core/java/android/content/pm/PackageManager.java
index a48924e..2baad62 100644
--- a/core/java/android/content/pm/PackageManager.java
+++ b/core/java/android/content/pm/PackageManager.java
@@ -23,7 +23,6 @@
import android.content.Intent;
import android.content.IntentFilter;
import android.content.IntentSender;
-import android.content.pm.ManifestDigest;
import android.content.res.Resources;
import android.content.res.XmlResourceParser;
import android.graphics.drawable.Drawable;
@@ -1090,10 +1089,6 @@
public static final String EXTRA_VERIFICATION_INSTALL_FLAGS
= "android.content.pm.extra.VERIFICATION_INSTALL_FLAGS";
- /** {@hide} */
- // TODO: enable this for userdebug and eng builds; see 6389556
- public static final boolean DEFAULT_ENFORCE_READ_EXTERNAL_STORAGE = false;
-
/**
* Retrieve overall information about an application package that is
* installed on the system.
diff --git a/core/java/android/database/sqlite/SQLiteGlobal.java b/core/java/android/database/sqlite/SQLiteGlobal.java
index 5d8f80e..5ff199a 100644
--- a/core/java/android/database/sqlite/SQLiteGlobal.java
+++ b/core/java/android/database/sqlite/SQLiteGlobal.java
@@ -18,6 +18,7 @@
import android.content.res.Resources;
import android.os.StatFs;
+import android.os.SystemProperties;
/**
* Provides access to SQLite functions that affect all database connection,
@@ -62,7 +63,7 @@
if (sDefaultPageSize == 0) {
sDefaultPageSize = new StatFs("/data").getBlockSize();
}
- return sDefaultPageSize;
+ return SystemProperties.getInt("debug.sqlite.pagesize", sDefaultPageSize);
}
}
@@ -70,47 +71,55 @@
* Gets the default journal mode when WAL is not in use.
*/
public static String getDefaultJournalMode() {
- return Resources.getSystem().getString(
- com.android.internal.R.string.db_default_journal_mode);
+ return SystemProperties.get("debug.sqlite.journalmode",
+ Resources.getSystem().getString(
+ com.android.internal.R.string.db_default_journal_mode));
}
/**
* Gets the journal size limit in bytes.
*/
public static int getJournalSizeLimit() {
- return Resources.getSystem().getInteger(
- com.android.internal.R.integer.db_journal_size_limit);
+ return SystemProperties.getInt("debug.sqlite.journalsizelimit",
+ Resources.getSystem().getInteger(
+ com.android.internal.R.integer.db_journal_size_limit));
}
/**
* Gets the default database synchronization mode when WAL is not in use.
*/
public static String getDefaultSyncMode() {
- return Resources.getSystem().getString(
- com.android.internal.R.string.db_default_sync_mode);
+ return SystemProperties.get("debug.sqlite.syncmode",
+ Resources.getSystem().getString(
+ com.android.internal.R.string.db_default_sync_mode));
}
/**
* Gets the database synchronization mode when in WAL mode.
*/
public static String getWALSyncMode() {
- return Resources.getSystem().getString(
- com.android.internal.R.string.db_wal_sync_mode);
+ return SystemProperties.get("debug.sqlite.wal.syncmode",
+ Resources.getSystem().getString(
+ com.android.internal.R.string.db_wal_sync_mode));
}
/**
* Gets the WAL auto-checkpoint integer in database pages.
*/
public static int getWALAutoCheckpoint() {
- return Math.max(1, Resources.getSystem().getInteger(
+ int value = SystemProperties.getInt("debug.sqlite.wal.autocheckpoint",
+ Resources.getSystem().getInteger(
com.android.internal.R.integer.db_wal_autocheckpoint));
+ return Math.max(1, value);
}
/**
* Gets the connection pool size when in WAL mode.
*/
public static int getWALConnectionPoolSize() {
- return Math.max(2, Resources.getSystem().getInteger(
+ int value = SystemProperties.getInt("debug.sqlite.wal.poolsize",
+ Resources.getSystem().getInteger(
com.android.internal.R.integer.db_connection_pool_size));
+ return Math.max(2, value);
}
}
diff --git a/core/java/android/hardware/input/InputManager.java b/core/java/android/hardware/input/InputManager.java
index 5ba1850..6448b55 100755
--- a/core/java/android/hardware/input/InputManager.java
+++ b/core/java/android/hardware/input/InputManager.java
@@ -96,14 +96,14 @@
* <keyboard-layouts xmlns:android="http://schemas.android.com/apk/res/android">
* <keyboard-layout android:name="keyboard_layout_english_us"
* android:label="@string/keyboard_layout_english_us_label"
- * android:kcm="@raw/keyboard_layout_english_us" />
+ * android:keyboardLayout="@raw/keyboard_layout_english_us" />
* </keyboard-layouts>
* </p><p>
* The <code>android:name</code> attribute specifies an identifier by which
* the keyboard layout will be known in the package.
* The <code>android:label</code> attributes specifies a human-readable descriptive
* label to describe the keyboard layout in the user interface, such as "English (US)".
- * The <code>android:kcm</code> attribute refers to a
+ * The <code>android:keyboardLayout</code> attribute refers to a
* <a href="http://source.android.com/tech/input/key-character-map-files.html">
* key character map</a> resource that defines the keyboard layout.
* </p>
diff --git a/core/java/android/net/Uri.java b/core/java/android/net/Uri.java
index defe7aa..3b990e3 100644
--- a/core/java/android/net/Uri.java
+++ b/core/java/android/net/Uri.java
@@ -1718,9 +1718,7 @@
}
/**
- * Return a normalized representation of this Uri.
- *
- * <p>A normalized Uri has a lowercase scheme component.
+ * Return an equivalent URI with a lowercase scheme component.
* This aligns the Uri with Android best practices for
* intent filtering.
*
@@ -1740,7 +1738,7 @@
* @see {@link android.content.Intent#setData}
* @see {@link #setNormalizedData}
*/
- public Uri normalize() {
+ public Uri normalizeScheme() {
String scheme = getScheme();
if (scheme == null) return this; // give up
String lowerScheme = scheme.toLowerCase(Locale.US);
diff --git a/core/java/android/nfc/NdefRecord.java b/core/java/android/nfc/NdefRecord.java
index 0e9e8f4..8872335 100644
--- a/core/java/android/nfc/NdefRecord.java
+++ b/core/java/android/nfc/NdefRecord.java
@@ -321,7 +321,7 @@
* and {@link #RTD_URI}. This is the most efficient encoding
* of a URI into NDEF.<p>
* The uri parameter will be normalized with
- * {@link Uri#normalize} to set the scheme to lower case to
+ * {@link Uri#normalizeScheme} to set the scheme to lower case to
* follow Android best practices for intent filtering.
* However the unchecked exception
* {@link IllegalArgumentException} may be thrown if the uri
@@ -338,7 +338,7 @@
public static NdefRecord createUri(Uri uri) {
if (uri == null) throw new NullPointerException("uri is null");
- uri = uri.normalize();
+ uri = uri.normalizeScheme();
String uriString = uri.toString();
if (uriString.length() == 0) throw new IllegalArgumentException("uri is empty");
@@ -364,7 +364,7 @@
* and {@link #RTD_URI}. This is the most efficient encoding
* of a URI into NDEF.<p>
* The uriString parameter will be normalized with
- * {@link Uri#normalize} to set the scheme to lower case to
+ * {@link Uri#normalizeScheme} to set the scheme to lower case to
* follow Android best practices for intent filtering.
* However the unchecked exception
* {@link IllegalArgumentException} may be thrown if the uriString
@@ -665,7 +665,7 @@
* actually valid: it always attempts to create and return a URI if
* this record appears to be a URI record by the above rules.<p>
* The returned URI will be normalized to have a lower case scheme
- * using {@link Uri#normalize}.<p>
+ * using {@link Uri#normalizeScheme}.<p>
*
* @return URI, or null if this is not a URI record
*/
@@ -688,13 +688,13 @@
}
} catch (FormatException e) { }
} else if (Arrays.equals(mType, RTD_URI)) {
- return parseWktUri().normalize();
+ return parseWktUri().normalizeScheme();
}
break;
case TNF_ABSOLUTE_URI:
Uri uri = Uri.parse(new String(mType, Charsets.UTF_8));
- return uri.normalize();
+ return uri.normalizeScheme();
case TNF_EXTERNAL_TYPE:
if (inSmartPoster) {
diff --git a/core/java/android/os/Build.java b/core/java/android/os/Build.java
index 63275cf..2d5b625 100644
--- a/core/java/android/os/Build.java
+++ b/core/java/android/os/Build.java
@@ -370,7 +370,7 @@
public static final int ICE_CREAM_SANDWICH_MR1 = 15;
/**
- * Next up on Android!
+ * Android 4.1.
*
* <p>Applications targeting this or a later release will get these
* new changes in behavior:</p>
@@ -381,7 +381,7 @@
* exist in the application's manifest.
* </ul>
*/
- public static final int JELLY_BEAN = CUR_DEVELOPMENT;
+ public static final int JELLY_BEAN = 16;
}
/** The type of build, like "user" or "eng". */
diff --git a/core/java/android/os/Power.java b/core/java/android/os/Power.java
deleted file mode 100644
index 58df940..0000000
--- a/core/java/android/os/Power.java
+++ /dev/null
@@ -1,109 +0,0 @@
-/*
- * Copyright (C) 2007 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.os;
-
-import java.io.IOException;
-import android.os.ServiceManager;
-
-/**
- * Class that provides access to some of the power management functions.
- *
- * {@hide}
- */
-public class Power
-{
- // can't instantiate this class
- private Power()
- {
- }
-
- /**
- * Wake lock that ensures that the CPU is running. The screen might
- * not be on.
- */
- public static final int PARTIAL_WAKE_LOCK = 1;
-
- /**
- * Wake lock that ensures that the screen is on.
- */
- public static final int FULL_WAKE_LOCK = 2;
-
- public static native void acquireWakeLock(int lock, String id);
- public static native void releaseWakeLock(String id);
-
- /**
- * Brightness value for fully off
- */
- public static final int BRIGHTNESS_OFF = 0;
-
- /**
- * Brightness value for dim backlight
- */
- public static final int BRIGHTNESS_DIM = 20;
-
- /**
- * Brightness value for fully on
- */
- public static final int BRIGHTNESS_ON = 255;
-
- /**
- * Brightness value to use when battery is low
- */
- public static final int BRIGHTNESS_LOW_BATTERY = 10;
-
- /**
- * Threshold for BRIGHTNESS_LOW_BATTERY (percentage)
- * Screen will stay dim if battery level is <= LOW_BATTERY_THRESHOLD
- */
- public static final int LOW_BATTERY_THRESHOLD = 10;
-
- /**
- * Turn the screen on or off
- *
- * @param on Whether you want the screen on or off
- */
- public static native int setScreenState(boolean on);
-
- public static native int setLastUserActivityTimeout(long ms);
-
- /**
- * Low-level function turn the device off immediately, without trying
- * to be clean. Most people should use
- * {@link android.internal.app.ShutdownThread} for a clean shutdown.
- *
- * @deprecated
- * @hide
- */
- @Deprecated
- public static native void shutdown();
-
- /**
- * Reboot the device.
- * @param reason code to pass to the kernel (e.g. "recovery"), or null.
- *
- * @throws IOException if reboot fails for some reason (eg, lack of
- * permission)
- */
- public static void reboot(String reason) throws IOException
- {
- rebootNative(reason);
- }
-
- private static native void rebootNative(String reason) throws IOException ;
-
- public static native int powerInitNative();
-}
diff --git a/core/java/android/os/PowerManager.java b/core/java/android/os/PowerManager.java
index 21373ec..903c8b3 100644
--- a/core/java/android/os/PowerManager.java
+++ b/core/java/android/os/PowerManager.java
@@ -197,7 +197,31 @@
* Does not work with PARTIAL_WAKE_LOCKs.
*/
public static final int ON_AFTER_RELEASE = 0x20000000;
-
+
+ /**
+ * Brightness value to use when battery is low.
+ * @hide
+ */
+ public static final int BRIGHTNESS_LOW_BATTERY = 10;
+
+ /**
+ * Brightness value for fully on.
+ * @hide
+ */
+ public static final int BRIGHTNESS_ON = 255;
+
+ /**
+ * Brightness value for dim backlight.
+ * @hide
+ */
+ public static final int BRIGHTNESS_DIM = 20;
+
+ /**
+ * Brightness value for fully off.
+ * @hide
+ */
+ public static final int BRIGHTNESS_OFF = 0;
+
/**
* Class lets you say that you need to have the device on.
* <p>
diff --git a/core/java/android/os/Trace.java b/core/java/android/os/Trace.java
index 911183d..c0240fe 100644
--- a/core/java/android/os/Trace.java
+++ b/core/java/android/os/Trace.java
@@ -38,6 +38,7 @@
public static final long TRACE_TAG_ACTIVITY_MANAGER = 1L << 6;
public static final long TRACE_TAG_SYNC_MANAGER = 1L << 7;
public static final long TRACE_TAG_AUDIO = 1L << 8;
+ public static final long TRACE_TAG_VIDEO = 1L << 9;
public static final int TRACE_FLAGS_START_BIT = 1;
public static final String[] TRACE_TAGS = {
diff --git a/core/java/android/provider/Settings.java b/core/java/android/provider/Settings.java
index 497e66e8..ea3cab4 100644
--- a/core/java/android/provider/Settings.java
+++ b/core/java/android/provider/Settings.java
@@ -4253,6 +4253,10 @@
/** Timeout for package verification. {@hide} */
public static final String PACKAGE_VERIFIER_TIMEOUT = "verifier_timeout";
+ /** {@hide} */
+ public static final String
+ READ_EXTERNAL_STORAGE_ENFORCED_DEFAULT = "read_external_storage_enforced_default";
+
/**
* Duration in milliseconds before pre-authorized URIs for the contacts
* provider should expire.
diff --git a/core/java/android/text/DynamicLayout.java b/core/java/android/text/DynamicLayout.java
index dc58ef2..d909362 100644
--- a/core/java/android/text/DynamicLayout.java
+++ b/core/java/android/text/DynamicLayout.java
@@ -35,6 +35,7 @@
public class DynamicLayout extends Layout
{
private static final int PRIORITY = 128;
+ private static final int BLOCK_MINIMUM_CHARACTER_LENGTH = 400;
/**
* Make a layout for the specified text that will be updated as
@@ -117,10 +118,6 @@
mObjects = new PackedObjectVector<Directions>(1);
- mBlockEndLines = new int[] { 0 };
- mBlockIndices = new int[] { INVALID_BLOCK_INDEX };
- mNumberOfBlocks = 1;
-
mIncludePad = includepad;
/*
@@ -170,7 +167,6 @@
mObjects.insertAt(0, dirs);
// Update from 0 characters to whatever the real text is
-
reflow(base, 0, 0, base.length());
if (base instanceof Spannable) {
@@ -295,14 +291,12 @@
// the very end of the buffer, then we already have a line that
// starts there, so disregard the blank line.
- if (where + after != len &&
- reflowed.getLineStart(n - 1) == where + after)
+ if (where + after != len && reflowed.getLineStart(n - 1) == where + after)
n--;
// remove affected lines from old layout
mInts.deleteAt(startline, endline - startline);
mObjects.deleteAt(startline, endline - startline);
- updateBlocks(startline, endline - 1, n);
// adjust offsets in layout for new height and offsets
@@ -362,6 +356,8 @@
mObjects.insertAt(startline + i, objects);
}
+ updateBlocks(startline, endline - 1, n);
+
synchronized (sLock) {
sStaticLayout = reflowed;
reflowed.finish();
@@ -369,6 +365,62 @@
}
/**
+ * Create the initial block structure, cutting the text into blocks of at least
+ * BLOCK_MINIMUM_CHARACTER_SIZE characters, aligned on the ends of paragraphs.
+ */
+ private void createBlocks() {
+ int offset = BLOCK_MINIMUM_CHARACTER_LENGTH;
+ mNumberOfBlocks = 0;
+ final CharSequence text = mDisplay;
+
+ while (true) {
+ offset = TextUtils.indexOf(text, '\n', offset);
+ if (offset < 0) {
+ addBlockAtOffset(text.length());
+ break;
+ } else {
+ addBlockAtOffset(offset);
+ offset += BLOCK_MINIMUM_CHARACTER_LENGTH;
+ }
+ }
+
+ // mBlockIndices and mBlockEndLines should have the same length
+ mBlockIndices = new int[mBlockEndLines.length];
+ for (int i = 0; i < mBlockEndLines.length; i++) {
+ mBlockIndices[i] = INVALID_BLOCK_INDEX;
+ }
+ }
+
+ /**
+ * Create a new block, ending at the specified character offset.
+ * A block will actually be created only if has at least one line, i.e. this offset is
+ * not on the end line of the previous block.
+ */
+ private void addBlockAtOffset(int offset) {
+ final int line = getLineForOffset(offset);
+
+ if (mBlockEndLines == null) {
+ // Initial creation of the array, no test on previous block ending line
+ mBlockEndLines = new int[ArrayUtils.idealIntArraySize(1)];
+ mBlockEndLines[mNumberOfBlocks] = line;
+ mNumberOfBlocks++;
+ return;
+ }
+
+ final int previousBlockEndLine = mBlockEndLines[mNumberOfBlocks - 1];
+ if (line > previousBlockEndLine) {
+ if (mNumberOfBlocks == mBlockEndLines.length) {
+ // Grow the array if needed
+ int[] blockEndLines = new int[ArrayUtils.idealIntArraySize(mNumberOfBlocks + 1)];
+ System.arraycopy(mBlockEndLines, 0, blockEndLines, 0, mNumberOfBlocks);
+ mBlockEndLines = blockEndLines;
+ }
+ mBlockEndLines[mNumberOfBlocks] = line;
+ mNumberOfBlocks++;
+ }
+ }
+
+ /**
* This method is called every time the layout is reflowed after an edition.
* It updates the internal block data structure. The text is split in blocks
* of contiguous lines, with at least one block for the entire text.
@@ -388,6 +440,11 @@
* @hide
*/
void updateBlocks(int startLine, int endLine, int newLineCount) {
+ if (mBlockEndLines == null) {
+ createBlocks();
+ return;
+ }
+
int firstBlock = -1;
int lastBlock = -1;
for (int i = 0; i < mNumberOfBlocks; i++) {
diff --git a/core/java/android/text/style/TextAppearanceSpan.java b/core/java/android/text/style/TextAppearanceSpan.java
index 5fd7c57..ecbf4bc 100644
--- a/core/java/android/text/style/TextAppearanceSpan.java
+++ b/core/java/android/text/style/TextAppearanceSpan.java
@@ -68,24 +68,29 @@
TextAppearance_textSize, -1);
mStyle = a.getInt(com.android.internal.R.styleable.TextAppearance_textStyle, 0);
- int tf = a.getInt(com.android.internal.R.styleable.TextAppearance_typeface, 0);
+ String family = a.getString(com.android.internal.R.styleable.TextAppearance_fontFamily);
+ if (family != null) {
+ mTypeface = family;
+ } else {
+ int tf = a.getInt(com.android.internal.R.styleable.TextAppearance_typeface, 0);
- switch (tf) {
- case 1:
- mTypeface = "sans";
- break;
+ switch (tf) {
+ case 1:
+ mTypeface = "sans";
+ break;
- case 2:
- mTypeface = "serif";
- break;
+ case 2:
+ mTypeface = "serif";
+ break;
- case 3:
- mTypeface = "monospace";
- break;
-
- default:
- mTypeface = null;
- break;
+ case 3:
+ mTypeface = "monospace";
+ break;
+
+ default:
+ mTypeface = null;
+ break;
+ }
}
a.recycle();
diff --git a/core/java/android/util/TimeUtils.java b/core/java/android/util/TimeUtils.java
index 2883eca..c4ebec4 100644
--- a/core/java/android/util/TimeUtils.java
+++ b/core/java/android/util/TimeUtils.java
@@ -26,6 +26,7 @@
import java.io.IOException;
import java.io.PrintWriter;
import java.util.ArrayList;
+import java.util.Calendar;
import java.util.Collection;
import java.util.TimeZone;
import java.util.Date;
@@ -381,4 +382,22 @@
}
formatDuration(time-now, pw, 0);
}
+
+ /**
+ * Convert a System.currentTimeMillis() value to a time of day value like
+ * that printed in logs. MM-DD HH:MM:SS.MMM
+ *
+ * @param millis since the epoch (1/1/1970)
+ * @return String representation of the time.
+ * @hide
+ */
+ public static String logTimeOfDay(long millis) {
+ Calendar c = Calendar.getInstance();
+ if (millis >= 0) {
+ c.setTimeInMillis(millis);
+ return String.format("%tm-%td %tH:%tM:%tS.%tL", c, c, c, c, c, c);
+ } else {
+ return Long.toString(millis);
+ }
+ }
}
diff --git a/core/java/android/view/GLES20DisplayList.java b/core/java/android/view/GLES20DisplayList.java
index f3618eb..0154556d 100644
--- a/core/java/android/view/GLES20DisplayList.java
+++ b/core/java/android/view/GLES20DisplayList.java
@@ -131,7 +131,8 @@
@Override
public void setAnimationMatrix(Matrix matrix) {
try {
- nSetAnimationMatrix(getNativeDisplayList(), matrix.native_instance);
+ nSetAnimationMatrix(getNativeDisplayList(),
+ (matrix != null) ? matrix.native_instance : 0);
} catch (IllegalStateException e) {
// invalid DisplayList okay: we'll set current values the next time we render to it
}
diff --git a/core/java/android/view/IWindowManager.aidl b/core/java/android/view/IWindowManager.aidl
index e1f01db..c5a687a 100644
--- a/core/java/android/view/IWindowManager.aidl
+++ b/core/java/android/view/IWindowManager.aidl
@@ -84,7 +84,7 @@
void overridePendingAppTransitionScaleUp(int startX, int startY, int startWidth,
int startHeight);
void overridePendingAppTransitionThumb(in Bitmap srcThumb, int startX, int startY,
- IRemoteCallback startedCallback);
+ IRemoteCallback startedCallback, boolean delayed);
void executeAppTransition();
void setAppStartingWindow(IBinder token, String pkg, int theme,
in CompatibilityInfo compatInfo, CharSequence nonLocalizedLabel, int labelRes,
diff --git a/core/java/android/view/Surface.java b/core/java/android/view/Surface.java
index 1011d7a..a968768 100644
--- a/core/java/android/view/Surface.java
+++ b/core/java/android/view/Surface.java
@@ -511,7 +511,7 @@
/** @hide */
public native void setFlags(int flags, int mask);
/** @hide */
- public native void setActiveRect(Rect activeRect);
+ public native void setWindowCrop(Rect crop);
diff --git a/core/java/android/view/TextureView.java b/core/java/android/view/TextureView.java
index 651be2e..2048de2 100644
--- a/core/java/android/view/TextureView.java
+++ b/core/java/android/view/TextureView.java
@@ -561,7 +561,17 @@
applyUpdate();
applyTransformMatrix();
- mLayer.copyInto(bitmap);
+ // This case can happen if the app invokes setSurfaceTexture() before
+ // we are able to create the hardware layer. We can safely initialize
+ // the layer here thanks to the validate() call at the beginning of
+ // this method
+ if (mLayer == null && mUpdateSurface) {
+ getHardwareLayer();
+ }
+
+ if (mLayer != null) {
+ mLayer.copyInto(bitmap);
+ }
}
return bitmap;
}
diff --git a/core/java/android/view/VelocityTracker.java b/core/java/android/view/VelocityTracker.java
index 1c35e31..f703e34 100644
--- a/core/java/android/view/VelocityTracker.java
+++ b/core/java/android/view/VelocityTracker.java
@@ -298,6 +298,24 @@
return estimate(time, yCoeff);
}
+ /**
+ * Gets the X coefficient with the specified index.
+ * @param index The index of the coefficient to return.
+ * @return The X coefficient, or 0 if the index is greater than the degree.
+ */
+ public float getXCoeff(int index) {
+ return index <= degree ? xCoeff[index] : 0;
+ }
+
+ /**
+ * Gets the Y coefficient with the specified index.
+ * @param index The index of the coefficient to return.
+ * @return The Y coefficient, or 0 if the index is greater than the degree.
+ */
+ public float getYCoeff(int index) {
+ return index <= degree ? yCoeff[index] : 0;
+ }
+
private float estimate(float time, float[] c) {
float a = 0;
float scale = 1;
diff --git a/core/java/android/view/View.java b/core/java/android/view/View.java
index aad6756..4d13e8a 100644
--- a/core/java/android/view/View.java
+++ b/core/java/android/view/View.java
@@ -2128,6 +2128,20 @@
*/
static final int ACCESSIBILITY_STATE_CHANGED = 0x00000080 << IMPORTANT_FOR_ACCESSIBILITY_SHIFT;
+ /**
+ * Flag indicating that view has an animation set on it. This is used to track whether an
+ * animation is cleared between successive frames, in order to tell the associated
+ * DisplayList to clear its animation matrix.
+ */
+ static final int VIEW_IS_ANIMATING_TRANSFORM = 0x10000000;
+
+ /**
+ * Flag indicating whether a view failed the quickReject() check in draw(). This condition
+ * is used to check whether later changes to the view's transform should invalidate the
+ * view to force the quickReject test to run again.
+ */
+ static final int VIEW_QUICK_REJECTED = 0x20000000;
+
/* End of masks for mPrivateFlags2 */
static final int DRAG_MASK = DRAG_CAN_ACCEPT | DRAG_HOVERED;
@@ -5209,6 +5223,13 @@
* call to continue to your children, you must be sure to call the super
* implementation.
*
+ * <p>Here is a sample layout that makes use of fitting system windows
+ * to have controls for a video view placed inside of the window decorations
+ * that it hides and shows. This can be used with code like the second
+ * sample (video player) shown in {@link #setSystemUiVisibility(int)}.
+ *
+ * {@sample development/samples/ApiDemos/res/layout/video_player.xml complete}
+ *
* @param insets Current content insets of the window. Prior to
* {@link android.os.Build.VERSION_CODES#JELLY_BEAN} you must not modify
* the insets or else you and Android will be unhappy.
@@ -5251,7 +5272,8 @@
}
/**
- * Check for the FITS_SYSTEM_WINDOWS flag. If this method returns true, this view
+ * Check for state of {@link #setFitsSystemWindows(boolean). If this method
+ * returns true, this view
* will account for system screen decorations such as the status bar and inset its
* content. This allows the view to be positioned in absolute screen coordinates
* and remain visible to the user.
@@ -5260,10 +5282,15 @@
*
* @attr ref android.R.styleable#View_fitsSystemWindows
*/
- public boolean fitsSystemWindows() {
+ public boolean getFitsSystemWindows() {
return (mViewFlags & FITS_SYSTEM_WINDOWS) == FITS_SYSTEM_WINDOWS;
}
+ /** @hide */
+ public boolean fitsSystemWindows() {
+ return getFitsSystemWindows();
+ }
+
/**
* Ask that a new dispatch of {@link #fitSystemWindows(Rect)} be performed.
*/
@@ -5557,7 +5584,7 @@
"unmatched pair of setHasTransientState calls");
}
if ((hasTransientState && mTransientStateCount == 1) ||
- (hasTransientState && mTransientStateCount == 0)) {
+ (!hasTransientState && mTransientStateCount == 0)) {
// update flag if we've just incremented up from 0 or decremented down to 0
mPrivateFlags2 = (mPrivateFlags2 & ~HAS_TRANSIENT_STATE) |
(hasTransientState ? HAS_TRANSIENT_STATE : 0);
@@ -8547,6 +8574,10 @@
if (mDisplayList != null) {
mDisplayList.setCameraDistance(-Math.abs(distance) / dpi);
}
+ if ((mPrivateFlags2 & VIEW_QUICK_REJECTED) == VIEW_QUICK_REJECTED) {
+ // View was rejected last time it was drawn by its parent; this may have changed
+ invalidateParentIfNeeded();
+ }
}
/**
@@ -8589,6 +8620,10 @@
if (mDisplayList != null) {
mDisplayList.setRotation(rotation);
}
+ if ((mPrivateFlags2 & VIEW_QUICK_REJECTED) == VIEW_QUICK_REJECTED) {
+ // View was rejected last time it was drawn by its parent; this may have changed
+ invalidateParentIfNeeded();
+ }
}
}
@@ -8636,6 +8671,10 @@
if (mDisplayList != null) {
mDisplayList.setRotationY(rotationY);
}
+ if ((mPrivateFlags2 & VIEW_QUICK_REJECTED) == VIEW_QUICK_REJECTED) {
+ // View was rejected last time it was drawn by its parent; this may have changed
+ invalidateParentIfNeeded();
+ }
}
}
@@ -8683,6 +8722,10 @@
if (mDisplayList != null) {
mDisplayList.setRotationX(rotationX);
}
+ if ((mPrivateFlags2 & VIEW_QUICK_REJECTED) == VIEW_QUICK_REJECTED) {
+ // View was rejected last time it was drawn by its parent; this may have changed
+ invalidateParentIfNeeded();
+ }
}
}
@@ -8722,6 +8765,10 @@
if (mDisplayList != null) {
mDisplayList.setScaleX(scaleX);
}
+ if ((mPrivateFlags2 & VIEW_QUICK_REJECTED) == VIEW_QUICK_REJECTED) {
+ // View was rejected last time it was drawn by its parent; this may have changed
+ invalidateParentIfNeeded();
+ }
}
}
@@ -8761,6 +8808,10 @@
if (mDisplayList != null) {
mDisplayList.setScaleY(scaleY);
}
+ if ((mPrivateFlags2 & VIEW_QUICK_REJECTED) == VIEW_QUICK_REJECTED) {
+ // View was rejected last time it was drawn by its parent; this may have changed
+ invalidateParentIfNeeded();
+ }
}
}
@@ -8808,6 +8859,10 @@
if (mDisplayList != null) {
mDisplayList.setPivotX(pivotX);
}
+ if ((mPrivateFlags2 & VIEW_QUICK_REJECTED) == VIEW_QUICK_REJECTED) {
+ // View was rejected last time it was drawn by its parent; this may have changed
+ invalidateParentIfNeeded();
+ }
}
}
@@ -8854,6 +8909,10 @@
if (mDisplayList != null) {
mDisplayList.setPivotY(pivotY);
}
+ if ((mPrivateFlags2 & VIEW_QUICK_REJECTED) == VIEW_QUICK_REJECTED) {
+ // View was rejected last time it was drawn by its parent; this may have changed
+ invalidateParentIfNeeded();
+ }
}
}
@@ -9012,6 +9071,10 @@
}
mBackgroundSizeChanged = true;
invalidateParentIfNeeded();
+ if ((mPrivateFlags2 & VIEW_QUICK_REJECTED) == VIEW_QUICK_REJECTED) {
+ // View was rejected last time it was drawn by its parent; this may have changed
+ invalidateParentIfNeeded();
+ }
}
}
@@ -9081,6 +9144,10 @@
}
mBackgroundSizeChanged = true;
invalidateParentIfNeeded();
+ if ((mPrivateFlags2 & VIEW_QUICK_REJECTED) == VIEW_QUICK_REJECTED) {
+ // View was rejected last time it was drawn by its parent; this may have changed
+ invalidateParentIfNeeded();
+ }
}
}
@@ -9144,6 +9211,10 @@
}
mBackgroundSizeChanged = true;
invalidateParentIfNeeded();
+ if ((mPrivateFlags2 & VIEW_QUICK_REJECTED) == VIEW_QUICK_REJECTED) {
+ // View was rejected last time it was drawn by its parent; this may have changed
+ invalidateParentIfNeeded();
+ }
}
}
@@ -9204,6 +9275,10 @@
}
mBackgroundSizeChanged = true;
invalidateParentIfNeeded();
+ if ((mPrivateFlags2 & VIEW_QUICK_REJECTED) == VIEW_QUICK_REJECTED) {
+ // View was rejected last time it was drawn by its parent; this may have changed
+ invalidateParentIfNeeded();
+ }
}
}
@@ -9288,6 +9363,10 @@
if (mDisplayList != null) {
mDisplayList.setTranslationX(translationX);
}
+ if ((mPrivateFlags2 & VIEW_QUICK_REJECTED) == VIEW_QUICK_REJECTED) {
+ // View was rejected last time it was drawn by its parent; this may have changed
+ invalidateParentIfNeeded();
+ }
}
}
@@ -9325,6 +9404,10 @@
if (mDisplayList != null) {
mDisplayList.setTranslationY(translationY);
}
+ if ((mPrivateFlags2 & VIEW_QUICK_REJECTED) == VIEW_QUICK_REJECTED) {
+ // View was rejected last time it was drawn by its parent; this may have changed
+ invalidateParentIfNeeded();
+ }
}
}
@@ -12764,16 +12847,27 @@
if (a != null) {
more = drawAnimation(parent, drawingTime, a, scalingRequired);
concatMatrix = a.willChangeTransformationMatrix();
+ if (concatMatrix) {
+ mPrivateFlags2 |= VIEW_IS_ANIMATING_TRANSFORM;
+ }
transformToApply = parent.mChildTransformation;
- } else if (!useDisplayListProperties &&
- (flags & ViewGroup.FLAG_SUPPORT_STATIC_TRANSFORMATIONS) != 0) {
- final boolean hasTransform =
- parent.getChildStaticTransformation(this, parent.mChildTransformation);
- if (hasTransform) {
- final int transformType = parent.mChildTransformation.getTransformationType();
- transformToApply = transformType != Transformation.TYPE_IDENTITY ?
- parent.mChildTransformation : null;
- concatMatrix = (transformType & Transformation.TYPE_MATRIX) != 0;
+ } else {
+ if ((mPrivateFlags2 & VIEW_IS_ANIMATING_TRANSFORM) == VIEW_IS_ANIMATING_TRANSFORM &&
+ mDisplayList != null) {
+ // No longer animating: clear out old animation matrix
+ mDisplayList.setAnimationMatrix(null);
+ mPrivateFlags2 &= ~VIEW_IS_ANIMATING_TRANSFORM;
+ }
+ if (!useDisplayListProperties &&
+ (flags & ViewGroup.FLAG_SUPPORT_STATIC_TRANSFORMATIONS) != 0) {
+ final boolean hasTransform =
+ parent.getChildStaticTransformation(this, parent.mChildTransformation);
+ if (hasTransform) {
+ final int transformType = parent.mChildTransformation.getTransformationType();
+ transformToApply = transformType != Transformation.TYPE_IDENTITY ?
+ parent.mChildTransformation : null;
+ concatMatrix = (transformType & Transformation.TYPE_MATRIX) != 0;
+ }
}
}
@@ -12785,8 +12879,10 @@
if (!concatMatrix && canvas.quickReject(mLeft, mTop, mRight, mBottom, Canvas.EdgeType.BW) &&
(mPrivateFlags & DRAW_ANIMATION) == 0) {
+ mPrivateFlags2 |= VIEW_QUICK_REJECTED;
return more;
}
+ mPrivateFlags2 &= ~VIEW_QUICK_REJECTED;
if (hardwareAccelerated) {
// Clear INVALIDATED flag to allow invalidation to occur during rendering, but
@@ -15376,7 +15472,8 @@
* playing the application would like to go into a complete full-screen mode,
* to use as much of the display as possible for the video. When in this state
* the user can not interact with the application; the system intercepts
- * touching on the screen to pop the UI out of full screen mode.
+ * touching on the screen to pop the UI out of full screen mode. See
+ * {@link #fitSystemWindows(Rect)} for a sample layout that goes with this code.
*
* {@sample development/samples/ApiDemos/src/com/example/android/apis/view/VideoPlayerActivity.java
* content}
@@ -15458,11 +15555,13 @@
}
}
- void updateLocalSystemUiVisibility(int localValue, int localChanges) {
+ boolean updateLocalSystemUiVisibility(int localValue, int localChanges) {
int val = (mSystemUiVisibility&~localChanges) | (localValue&localChanges);
if (val != mSystemUiVisibility) {
setSystemUiVisibility(val);
+ return true;
}
+ return false;
}
/** @hide */
@@ -16861,7 +16960,7 @@
/**
* Interface definition for a callback to be invoked when the status bar changes
* visibility. This reports <strong>global</strong> changes to the system UI
- * state, not just what the application is requesting.
+ * state, not what the application is requesting.
*
* @see View#setOnSystemUiVisibilityChangeListener(android.view.View.OnSystemUiVisibilityChangeListener)
*/
@@ -16870,10 +16969,10 @@
* Called when the status bar changes visibility because of a call to
* {@link View#setSystemUiVisibility(int)}.
*
- * @param visibility Bitwise-or of flags {@link #SYSTEM_UI_FLAG_LOW_PROFILE} or
- * {@link #SYSTEM_UI_FLAG_HIDE_NAVIGATION}. This tells you the
- * <strong>global</strong> state of the UI visibility flags, not what your
- * app is currently applying.
+ * @param visibility Bitwise-or of flags {@link #SYSTEM_UI_FLAG_LOW_PROFILE},
+ * {@link #SYSTEM_UI_FLAG_HIDE_NAVIGATION}, and {@link #SYSTEM_UI_FLAG_FULLSCREEN}.
+ * This tells you the <strong>global</strong> state of these UI visibility
+ * flags, not what your app is currently applying.
*/
public void onSystemUiVisibilityChange(int visibility);
}
@@ -17159,6 +17258,11 @@
int mDisabledSystemUiVisibility;
/**
+ * Last global system UI visibility reported by the window manager.
+ */
+ int mGlobalSystemUiVisibility;
+
+ /**
* True if a view in this hierarchy has an OnSystemUiVisibilityChangeListener
* attached.
*/
diff --git a/core/java/android/view/ViewGroup.java b/core/java/android/view/ViewGroup.java
index acfca26..b3c8895 100644
--- a/core/java/android/view/ViewGroup.java
+++ b/core/java/android/view/ViewGroup.java
@@ -1317,15 +1317,16 @@
}
@Override
- void updateLocalSystemUiVisibility(int localValue, int localChanges) {
- super.updateLocalSystemUiVisibility(localValue, localChanges);
+ boolean updateLocalSystemUiVisibility(int localValue, int localChanges) {
+ boolean changed = super.updateLocalSystemUiVisibility(localValue, localChanges);
final int count = mChildrenCount;
final View[] children = mChildren;
for (int i=0; i <count; i++) {
final View child = children[i];
- child.updateLocalSystemUiVisibility(localValue, localChanges);
+ changed |= child.updateLocalSystemUiVisibility(localValue, localChanges);
}
+ return changed;
}
/**
diff --git a/core/java/android/view/ViewRootImpl.java b/core/java/android/view/ViewRootImpl.java
index b43db14..1310719 100644
--- a/core/java/android/view/ViewRootImpl.java
+++ b/core/java/android/view/ViewRootImpl.java
@@ -263,7 +263,6 @@
final Rect mPendingVisibleInsets = new Rect();
final Rect mPendingContentInsets = new Rect();
final Rect mPendingSystemInsets = new Rect();
- final Rect mActiveRect = new Rect();
final ViewTreeObserver.InternalInsetsInfo mLastGivenInsets
= new ViewTreeObserver.InternalInsetsInfo();
@@ -1698,14 +1697,6 @@
}
}
- if (activeRectChanged && mSurface.isValid()) {
- mActiveRect.set(attachInfo.mSystemInsets.left, attachInfo.mSystemInsets.top,
- mWidth - attachInfo.mSystemInsets.right,
- mHeight - attachInfo.mSystemInsets.bottom);
- //Log.i(TAG, "Active rect " + mWindowAttributes.getTitle() + ": " + mActiveRect);
- mSurface.setActiveRect(mActiveRect);
- }
-
final boolean didLayout = layoutRequested && !mStopped;
boolean triggerGlobalLayoutListener = didLayout
|| attachInfo.mRecomputeGlobalAttributes;
@@ -3795,13 +3786,15 @@
}
if (mView == null) return;
if (args.localChanges != 0) {
- if (mAttachInfo != null) {
- mAttachInfo.mRecomputeGlobalAttributes = true;
- }
mView.updateLocalSystemUiVisibility(args.localValue, args.localChanges);
- scheduleTraversals();
}
- mView.dispatchSystemUiVisibilityChanged(args.globalVisibility);
+ if (mAttachInfo != null) {
+ int visibility = args.globalVisibility&View.SYSTEM_UI_CLEARABLE_FLAGS;
+ if (visibility != mAttachInfo.mGlobalSystemUiVisibility) {
+ mAttachInfo.mGlobalSystemUiVisibility = visibility;
+ mView.dispatchSystemUiVisibilityChanged(visibility);
+ }
+ }
}
public void handleDispatchDoneAnimating() {
diff --git a/core/java/android/view/WindowManagerPolicy.java b/core/java/android/view/WindowManagerPolicy.java
index 388cfb3..bc38368 100644
--- a/core/java/android/view/WindowManagerPolicy.java
+++ b/core/java/android/view/WindowManagerPolicy.java
@@ -397,6 +397,9 @@
* Creates an input channel that will receive all input from the input dispatcher.
*/
public InputChannel monitorInput(String name);
+
+ public void shutdown();
+ public void rebootSafeMode();
}
/**
diff --git a/core/java/android/view/accessibility/AccessibilityNodeInfo.java b/core/java/android/view/accessibility/AccessibilityNodeInfo.java
index 6b14ba5..0517d4b 100644
--- a/core/java/android/view/accessibility/AccessibilityNodeInfo.java
+++ b/core/java/android/view/accessibility/AccessibilityNodeInfo.java
@@ -205,6 +205,16 @@
public static final int ACTION_PREVIOUS_HTML_ELEMENT = 0x00000800;
/**
+ * Action to scroll the node content forward.
+ */
+ public static final int ACTION_SCROLL_FORWARD = 0x00001000;
+
+ /**
+ * Action to scroll the node content backward.
+ */
+ public static final int ACTION_SCROLL_BACKWARD = 0x00002000;
+
+ /**
* Argument for which movement granularity to be used when traversing the node text.
* <p>
* <strong>Type:</strong> int<br>
@@ -569,6 +579,16 @@
* @see AccessibilityNodeInfo#ACTION_CLEAR_FOCUS
* @see AccessibilityNodeInfo#ACTION_SELECT
* @see AccessibilityNodeInfo#ACTION_CLEAR_SELECTION
+ * @see AccessibilityNodeInfo#ACTION_ACCESSIBILITY_FOCUS
+ * @see AccessibilityNodeInfo#ACTION_CLEAR_ACCESSIBILITY_FOCUS
+ * @see AccessibilityNodeInfo#ACTION_CLICK
+ * @see AccessibilityNodeInfo#ACTION_LONG_CLICK
+ * @see AccessibilityNodeInfo#ACTION_NEXT_AT_MOVEMENT_GRANULARITY
+ * @see AccessibilityNodeInfo#ACTION_PREVIOUS_AT_MOVEMENT_GRANULARITY
+ * @see AccessibilityNodeInfo#ACTION_NEXT_HTML_ELEMENT
+ * @see AccessibilityNodeInfo#ACTION_PREVIOUS_HTML_ELEMENT
+ * @see AccessibilityNodeInfo#ACTION_SCROLL_FORWARD
+ * @see AccessibilityNodeInfo#ACTION_SCROLL_BACKWARD
*/
public int getActions() {
return mActions;
@@ -1578,6 +1598,10 @@
return "ACTION_NEXT_HTML_ELEMENT";
case ACTION_PREVIOUS_HTML_ELEMENT:
return "ACTION_PREVIOUS_HTML_ELEMENT";
+ case ACTION_SCROLL_FORWARD:
+ return "ACTION_SCROLL_FORWARD";
+ case ACTION_SCROLL_BACKWARD:
+ return "ACTION_SCROLL_BACKWARD";
default:
throw new IllegalArgumentException("Unknown action: " + action);
}
diff --git a/core/java/android/webkit/HTML5VideoFullScreen.java b/core/java/android/webkit/HTML5VideoFullScreen.java
index 730ad08..62bc502 100644
--- a/core/java/android/webkit/HTML5VideoFullScreen.java
+++ b/core/java/android/webkit/HTML5VideoFullScreen.java
@@ -104,7 +104,9 @@
// After we return from this we can't use the surface any more.
// The current Video View will be destroy when we play a new video.
pauseAndDispatch(mProxy);
+ // TODO: handle full screen->inline mode transition without a reload.
mPlayer.release();
+ mPlayer = null;
mSurfaceHolder = null;
if (mMediaController != null) {
mMediaController.hide();
@@ -128,12 +130,12 @@
return mVideoSurfaceView;
}
- HTML5VideoFullScreen(Context context, int videoLayerId, int position) {
+ HTML5VideoFullScreen(Context context, int videoLayerId, int position, boolean skipPrepare) {
mVideoSurfaceView = new VideoSurfaceView(context);
mFullScreenMode = FULLSCREEN_OFF;
mVideoWidth = 0;
mVideoHeight = 0;
- init(videoLayerId, position);
+ init(videoLayerId, position, skipPrepare);
}
private void setMediaController(MediaController m) {
@@ -156,8 +158,6 @@
}
private void prepareForFullScreen() {
- // So in full screen, we reset the MediaPlayer
- mPlayer.reset();
MediaController mc = new FullScreenMediaController(mProxy.getContext(), mLayout);
mc.setSystemUiVisibility(mLayout.getSystemUiVisibility());
setMediaController(mc);
@@ -198,6 +198,7 @@
// after reading the MetaData
if (mMediaController != null) {
mMediaController.setEnabled(true);
+ mMediaController.show();
}
if (mProgressView != null) {
@@ -243,7 +244,7 @@
// Don't show the controller after exiting the full screen.
mMediaController = null;
- mCurrentState = STATE_RELEASED;
+ mCurrentState = STATE_RESETTED;
}
};
@@ -320,6 +321,13 @@
return 0;
}
+ @Override
+ public void showControllerInFullScreen() {
+ if (mMediaController != null) {
+ mMediaController.show(0);
+ }
+ }
+
// Other listeners functions:
private MediaPlayer.OnBufferingUpdateListener mBufferingUpdateListener =
new MediaPlayer.OnBufferingUpdateListener() {
diff --git a/core/java/android/webkit/HTML5VideoInline.java b/core/java/android/webkit/HTML5VideoInline.java
index 62e812e..2c7ea5d 100644
--- a/core/java/android/webkit/HTML5VideoInline.java
+++ b/core/java/android/webkit/HTML5VideoInline.java
@@ -21,7 +21,7 @@
// associated with the surface texture can be used for showing the screen
// shot when paused, so they are not singleton.
private static SurfaceTexture mSurfaceTexture = null;
- private int[] mTextureNames;
+ private static int[] mTextureNames = null;
// Every time when the VideoLayer Id change, we need to recreate the
// SurfaceTexture in order to delete the old video's decoder memory.
private static int mVideoLayerUsingSurfaceTexture = -1;
@@ -35,8 +35,7 @@
}
HTML5VideoInline(int videoLayerId, int position) {
- init(videoLayerId, position);
- mTextureNames = null;
+ init(videoLayerId, position, false);
}
@Override
@@ -69,15 +68,14 @@
// Inline Video specific FUNCTIONS:
- @Override
- public SurfaceTexture getSurfaceTexture(int videoLayerId) {
+ public static SurfaceTexture getSurfaceTexture(int videoLayerId) {
// Create the surface texture.
if (videoLayerId != mVideoLayerUsingSurfaceTexture
|| mSurfaceTexture == null
|| mTextureNames == null) {
- if (mTextureNames != null) {
- GLES20.glDeleteTextures(1, mTextureNames, 0);
- }
+ // The GL texture will store in the VideoLayerManager at native side.
+ // They will be clean up when requested.
+ // The reason we recreated GL texture name is for screen shot support.
mTextureNames = new int[1];
GLES20.glGenTextures(1, mTextureNames, 0);
mSurfaceTexture = new SurfaceTexture(mTextureNames[0]);
diff --git a/core/java/android/webkit/HTML5VideoView.java b/core/java/android/webkit/HTML5VideoView.java
index 0d3b755..371feea 100644
--- a/core/java/android/webkit/HTML5VideoView.java
+++ b/core/java/android/webkit/HTML5VideoView.java
@@ -31,11 +31,10 @@
// NOTE: these values are in sync with VideoLayerAndroid.h in webkit side.
// Please keep them in sync when changed.
static final int STATE_INITIALIZED = 0;
- static final int STATE_NOTPREPARED = 1;
+ static final int STATE_PREPARING = 1;
static final int STATE_PREPARED = 2;
static final int STATE_PLAYING = 3;
- static final int STATE_RELEASED = 4;
- protected int mCurrentState;
+ static final int STATE_RESETTED = 4;
protected HTML5VideoViewProxy mProxy;
@@ -46,11 +45,11 @@
// This is used to find the VideoLayer on the native side.
protected int mVideoLayerId;
- // Every video will have one MediaPlayer. Given the fact we only have one
- // SurfaceTexture, there is only one MediaPlayer in action. Every time we
- // switch videos, a new instance of MediaPlayer will be created in reset().
- // Switching between inline and full screen will also create a new instance.
- protected MediaPlayer mPlayer;
+ // Given the fact we only have one SurfaceTexture, we cannot support multiple
+ // player at the same time. We may recreate a new one and abandon the old
+ // one at transition time.
+ protected static MediaPlayer mPlayer = null;
+ protected static int mCurrentState = -1;
// We need to save such info.
protected Uri mUri;
@@ -60,10 +59,12 @@
// See http://www.whatwg.org/specs/web-apps/current-work/#event-media-timeupdate
protected static Timer mTimer;
+ protected boolean mPauseDuringPreparing;
+
// The spec says the timer should fire every 250 ms or less.
private static final int TIMEUPDATE_PERIOD = 250; // ms
+ private boolean mSkipPrepare = false;
- protected boolean mPauseDuringPreparing;
// common Video control FUNCTIONS:
public void start() {
if (mCurrentState == STATE_PREPARED) {
@@ -83,7 +84,7 @@
public void pause() {
if (isPlaying()) {
mPlayer.pause();
- } else if (mCurrentState == STATE_NOTPREPARED) {
+ } else if (mCurrentState == STATE_PREPARING) {
mPauseDuringPreparing = true;
}
// Delete the Timer to stop it since there is no stop call.
@@ -124,11 +125,11 @@
}
}
- public void release() {
- if (mCurrentState != STATE_RELEASED) {
- mPlayer.release();
+ public void reset() {
+ if (mCurrentState != STATE_RESETTED) {
+ mPlayer.reset();
}
- mCurrentState = STATE_RELEASED;
+ mCurrentState = STATE_RESETTED;
}
public void stopPlayback() {
@@ -142,9 +143,16 @@
}
// Every time we start a new Video, we create a VideoView and a MediaPlayer
- public void init(int videoLayerId, int position) {
- mPlayer = new MediaPlayer();
- mCurrentState = STATE_INITIALIZED;
+ public void init(int videoLayerId, int position, boolean skipPrepare) {
+ if (mPlayer == null) {
+ mPlayer = new MediaPlayer();
+ mCurrentState = STATE_INITIALIZED;
+ }
+ mSkipPrepare = skipPrepare;
+ // If we want to skip the prepare, then we keep the state.
+ if (!mSkipPrepare) {
+ mCurrentState = STATE_INITIALIZED;
+ }
mProxy = null;
mVideoLayerId = videoLayerId;
mSaveSeekTime = position;
@@ -195,17 +203,28 @@
}
public void prepareDataCommon(HTML5VideoViewProxy proxy) {
- try {
- mPlayer.setDataSource(proxy.getContext(), mUri, mHeaders);
- mPlayer.prepareAsync();
- } catch (IllegalArgumentException e) {
- e.printStackTrace();
- } catch (IllegalStateException e) {
- e.printStackTrace();
- } catch (IOException e) {
- e.printStackTrace();
+ if (!mSkipPrepare) {
+ try {
+ mPlayer.reset();
+ mPlayer.setDataSource(proxy.getContext(), mUri, mHeaders);
+ mPlayer.prepareAsync();
+ } catch (IllegalArgumentException e) {
+ e.printStackTrace();
+ } catch (IllegalStateException e) {
+ e.printStackTrace();
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ mCurrentState = STATE_PREPARING;
+ } else {
+ // If we skip prepare and the onPrepared happened in inline mode, we
+ // don't need to call prepare again, we just need to call onPrepared
+ // to refresh the state here.
+ if (mCurrentState >= STATE_PREPARED) {
+ onPrepared(mPlayer);
+ }
+ mSkipPrepare = false;
}
- mCurrentState = STATE_NOTPREPARED;
}
public void reprepareData(HTML5VideoViewProxy proxy) {
@@ -294,10 +313,6 @@
return false;
}
- public SurfaceTexture getSurfaceTexture(int videoLayerId) {
- return null;
- }
-
public void deleteSurfaceTexture() {
}
@@ -332,14 +347,17 @@
return false;
}
- private boolean m_startWhenPrepared = false;
+ private boolean mStartWhenPrepared = false;
public void setStartWhenPrepared(boolean willPlay) {
- m_startWhenPrepared = willPlay;
+ mStartWhenPrepared = willPlay;
}
public boolean getStartWhenPrepared() {
- return m_startWhenPrepared;
+ return mStartWhenPrepared;
+ }
+
+ public void showControllerInFullScreen() {
}
}
diff --git a/core/java/android/webkit/HTML5VideoViewProxy.java b/core/java/android/webkit/HTML5VideoViewProxy.java
index 5fa4bad..90db308 100644
--- a/core/java/android/webkit/HTML5VideoViewProxy.java
+++ b/core/java/android/webkit/HTML5VideoViewProxy.java
@@ -112,13 +112,14 @@
mBaseLayer = layer;
int currentVideoLayerId = mHTML5VideoView.getVideoLayerId();
- SurfaceTexture surfTexture = mHTML5VideoView.getSurfaceTexture(currentVideoLayerId);
+ SurfaceTexture surfTexture =
+ HTML5VideoInline.getSurfaceTexture(currentVideoLayerId);
int textureName = mHTML5VideoView.getTextureName();
if (layer != 0 && surfTexture != null && currentVideoLayerId != -1) {
int playerState = mHTML5VideoView.getCurrentState();
if (mHTML5VideoView.getPlayerBuffering())
- playerState = HTML5VideoView.STATE_NOTPREPARED;
+ playerState = HTML5VideoView.STATE_PREPARING;
boolean foundInTree = nativeSendSurfaceTexture(surfTexture,
layer, currentVideoLayerId, textureName,
playerState);
@@ -145,6 +146,7 @@
HTML5VideoViewProxy proxy, WebViewClassic webView) {
// Save the inline video info and inherit it in the full screen
int savePosition = 0;
+ boolean canSkipPrepare = false;
if (mHTML5VideoView != null) {
// We don't allow enter full screen mode while the previous
// full screen video hasn't finished yet.
@@ -156,15 +158,20 @@
// save the current position.
if (layerId == mHTML5VideoView.getVideoLayerId()) {
savePosition = mHTML5VideoView.getCurrentPosition();
+ int playerState = mHTML5VideoView.getCurrentState();
+ canSkipPrepare = (playerState == HTML5VideoView.STATE_PREPARING
+ || playerState == HTML5VideoView.STATE_PREPARED
+ || playerState == HTML5VideoView.STATE_PLAYING)
+ && !mHTML5VideoView.isFullScreenMode();
}
- mHTML5VideoView.release();
+ if (!canSkipPrepare) {
+ mHTML5VideoView.reset();
+ }
}
mHTML5VideoView = new HTML5VideoFullScreen(proxy.getContext(),
- layerId, savePosition);
+ layerId, savePosition, canSkipPrepare);
mCurrentProxy = proxy;
-
mHTML5VideoView.setVideoURI(url, mCurrentProxy);
-
mHTML5VideoView.enterFullScreenVideoState(layerId, proxy, webView);
}
@@ -217,8 +224,7 @@
if (!backFromFullScreenMode) {
mHTML5VideoView.pauseAndDispatch(mCurrentProxy);
}
- // release the media player to avoid finalize error
- mHTML5VideoView.release();
+ mHTML5VideoView.reset();
}
mCurrentProxy = proxy;
mHTML5VideoView = new HTML5VideoInline(videoLayerId, time);
@@ -273,6 +279,7 @@
}
public static void end() {
+ mHTML5VideoView.showControllerInFullScreen();
if (mCurrentProxy != null) {
if (isVideoSelfEnded)
mCurrentProxy.dispatchOnEnded();
diff --git a/core/java/android/webkit/WebViewInputDispatcher.java b/core/java/android/webkit/WebViewInputDispatcher.java
index 9541435..9328d8c 100644
--- a/core/java/android/webkit/WebViewInputDispatcher.java
+++ b/core/java/android/webkit/WebViewInputDispatcher.java
@@ -334,6 +334,7 @@
DispatchEvent d = obtainDispatchEventLocked(eventToEnqueue, eventType, 0,
webKitXOffset, webKitYOffset, webKitScale);
+ updateStateTrackersLocked(d, event);
enqueueEventLocked(d);
}
return true;
@@ -787,7 +788,6 @@
flags = d.mFlags;
- updateStateTrackersLocked(d, event);
if (event == d.mEvent) {
d.mEvent = null; // retain ownership of event, don't recycle it yet
}
diff --git a/core/java/android/widget/AbsListView.java b/core/java/android/widget/AbsListView.java
index 3aafba5..3b4ec7d 100644
--- a/core/java/android/widget/AbsListView.java
+++ b/core/java/android/widget/AbsListView.java
@@ -1355,6 +1355,33 @@
public void onInitializeAccessibilityNodeInfo(AccessibilityNodeInfo info) {
super.onInitializeAccessibilityNodeInfo(info);
info.setClassName(AbsListView.class.getName());
+ if (getFirstVisiblePosition() > 0) {
+ info.addAction(AccessibilityNodeInfo.ACTION_SCROLL_BACKWARD);
+ }
+ if (getLastVisiblePosition() < getCount() - 1) {
+ info.addAction(AccessibilityNodeInfo.ACTION_SCROLL_FORWARD);
+ }
+ }
+
+ @Override
+ public boolean performAccessibilityAction(int action, Bundle arguments) {
+ switch (action) {
+ case AccessibilityNodeInfo.ACTION_SCROLL_FORWARD: {
+ if (getLastVisiblePosition() < getCount() - 1) {
+ final int viewportHeight = getHeight() - mListPadding.top - mListPadding.bottom;
+ smoothScrollBy(viewportHeight, PositionScroller.SCROLL_DURATION);
+ return true;
+ }
+ } return false;
+ case AccessibilityNodeInfo.ACTION_SCROLL_BACKWARD: {
+ if (mFirstPosition > 0) {
+ final int viewportHeight = getHeight() - mListPadding.top - mListPadding.bottom;
+ smoothScrollBy(-viewportHeight, PositionScroller.SCROLL_DURATION);
+ return true;
+ }
+ } return false;
+ }
+ return super.performAccessibilityAction(action, arguments);
}
/**
@@ -6290,6 +6317,7 @@
if (mTransientStateViews == null) {
mTransientStateViews = new SparseArray<View>();
}
+ scrap.dispatchStartTemporaryDetach();
mTransientStateViews.put(position, scrap);
}
return;
diff --git a/core/java/android/widget/Editor.java b/core/java/android/widget/Editor.java
index 4b7ec9a..16490e8 100644
--- a/core/java/android/widget/Editor.java
+++ b/core/java/android/widget/Editor.java
@@ -16,6 +16,9 @@
package android.widget;
+import com.android.internal.util.ArrayUtils;
+import com.android.internal.widget.EditableInputConnection;
+
import android.R;
import android.content.ClipData;
import android.content.ClipData.Item;
@@ -70,10 +73,10 @@
import android.view.MenuItem;
import android.view.MotionEvent;
import android.view.View;
-import android.view.ViewConfiguration;
-import android.view.ViewGroup;
import android.view.View.DragShadowBuilder;
import android.view.View.OnClickListener;
+import android.view.ViewConfiguration;
+import android.view.ViewGroup;
import android.view.ViewGroup.LayoutParams;
import android.view.ViewParent;
import android.view.ViewTreeObserver;
@@ -85,12 +88,12 @@
import android.view.inputmethod.InputConnection;
import android.view.inputmethod.InputMethodManager;
import android.widget.AdapterView.OnItemClickListener;
+import android.widget.Editor.InputContentType;
+import android.widget.Editor.InputMethodState;
+import android.widget.Editor.SelectionModifierCursorController;
import android.widget.TextView.Drawables;
import android.widget.TextView.OnEditorActionListener;
-import com.android.internal.util.ArrayUtils;
-import com.android.internal.widget.EditableInputConnection;
-
import java.text.BreakIterator;
import java.util.Arrays;
import java.util.Comparator;
@@ -102,6 +105,8 @@
* @hide
*/
public class Editor {
+ private static final String TAG = "Editor";
+
static final int BLINK = 500;
private static final float[] TEMP_POSITION = new float[2];
private static int DRAG_SHADOW_MAX_TEXT_LENGTH = 20;
@@ -151,6 +156,8 @@
boolean mInBatchEditControllers;
boolean mShowSoftInputOnFocus = true;
+ boolean mPreserveDetachedSelection;
+ boolean mTemporaryDetach;
SuggestionsPopupWindow mSuggestionsPopupWindow;
SuggestionRangeSpan mSuggestionRangeSpan;
@@ -190,6 +197,7 @@
showError();
mShowErrorAfterAttach = false;
}
+ mTemporaryDetach = false;
final ViewTreeObserver observer = mTextView.getViewTreeObserver();
// No need to create the controller.
@@ -198,10 +206,22 @@
observer.addOnTouchModeChangeListener(mInsertionPointCursorController);
}
if (mSelectionModifierCursorController != null) {
+ mSelectionModifierCursorController.resetTouchOffsets();
observer.addOnTouchModeChangeListener(mSelectionModifierCursorController);
}
updateSpellCheckSpans(0, mTextView.getText().length(),
true /* create the spell checker if needed */);
+
+ if (mTextView.hasTransientState() &&
+ mTextView.getSelectionStart() != mTextView.getSelectionEnd()) {
+ // Since transient state is reference counted make sure it stays matched
+ // with our own calls to it for managing selection.
+ // The action mode callback will set this back again when/if the action mode starts.
+ mTextView.setHasTransientState(false);
+
+ // We had an active selection from before, start the selection mode.
+ startSelectionActionMode();
+ }
}
void onDetachedFromWindow() {
@@ -234,7 +254,10 @@
mSpellChecker = null;
}
+ mPreserveDetachedSelection = true;
hideControllers();
+ mPreserveDetachedSelection = false;
+ mTemporaryDetach = false;
}
private void showError() {
@@ -877,7 +900,9 @@
hideControllers();
Selection.setSelection((Spannable) mTextView.getText(), selStart, selEnd);
} else {
+ if (mTemporaryDetach) mPreserveDetachedSelection = true;
hideControllers();
+ if (mTemporaryDetach) mPreserveDetachedSelection = false;
downgradeEasyCorrectionSpans();
}
@@ -2679,6 +2704,7 @@
if (menu.hasVisibleItems() || mode.getCustomView() != null) {
getSelectionController().show();
+ mTextView.setHasTransientState(true);
return true;
} else {
return false;
@@ -2707,7 +2733,17 @@
if (mCustomSelectionActionModeCallback != null) {
mCustomSelectionActionModeCallback.onDestroyActionMode(mode);
}
- Selection.setSelection((Spannable) mTextView.getText(), mTextView.getSelectionEnd());
+
+ /*
+ * If we're ending this mode because we're detaching from a window,
+ * we still have selection state to preserve. Don't clear it, we'll
+ * bring back the selection mode when (if) we get reattached.
+ */
+ if (!mPreserveDetachedSelection) {
+ Selection.setSelection((Spannable) mTextView.getText(),
+ mTextView.getSelectionEnd());
+ mTextView.setHasTransientState(false);
+ }
if (mSelectionModifierCursorController != null) {
mSelectionModifierCursorController.hide();
diff --git a/core/java/android/widget/HorizontalScrollView.java b/core/java/android/widget/HorizontalScrollView.java
index 1986450..ffabd1d9 100644
--- a/core/java/android/widget/HorizontalScrollView.java
+++ b/core/java/android/widget/HorizontalScrollView.java
@@ -20,6 +20,7 @@
import android.content.res.TypedArray;
import android.graphics.Canvas;
import android.graphics.Rect;
+import android.os.Bundle;
import android.util.AttributeSet;
import android.view.FocusFinder;
import android.view.InputDevice;
@@ -737,10 +738,42 @@
}
@Override
+ public boolean performAccessibilityAction(int action, Bundle arguments) {
+ switch (action) {
+ case AccessibilityNodeInfo.ACTION_SCROLL_FORWARD: {
+ final int viewportWidth = getWidth() - mPaddingLeft - mPaddingRight;
+ final int targetScrollX = Math.min(mScrollX + viewportWidth, getScrollRange());
+ if (targetScrollX != mScrollX) {
+ smoothScrollTo(targetScrollX, 0);
+ return true;
+ }
+ } return false;
+ case AccessibilityNodeInfo.ACTION_SCROLL_BACKWARD: {
+ final int viewportWidth = getWidth() - mPaddingLeft - mPaddingRight;
+ final int targetScrollX = Math.max(0, mScrollX - viewportWidth);
+ if (targetScrollX != mScrollX) {
+ smoothScrollTo(targetScrollX, 0);
+ return true;
+ }
+ } return false;
+ }
+ return super.performAccessibilityAction(action, arguments);
+ }
+
+ @Override
public void onInitializeAccessibilityNodeInfo(AccessibilityNodeInfo info) {
super.onInitializeAccessibilityNodeInfo(info);
info.setClassName(HorizontalScrollView.class.getName());
- info.setScrollable(getScrollRange() > 0);
+ final int scrollRange = getScrollRange();
+ if (scrollRange > 0) {
+ info.setScrollable(true);
+ if (mScrollX > 0) {
+ info.addAction(AccessibilityNodeInfo.ACTION_SCROLL_BACKWARD);
+ }
+ if (mScrollX < scrollRange) {
+ info.addAction(AccessibilityNodeInfo.ACTION_SCROLL_FORWARD);
+ }
+ }
}
@Override
diff --git a/core/java/android/widget/NumberPicker.java b/core/java/android/widget/NumberPicker.java
index 11d1ed0..6ff924b 100644
--- a/core/java/android/widget/NumberPicker.java
+++ b/core/java/android/widget/NumberPicker.java
@@ -133,16 +133,6 @@
private static final int UNSCALED_DEFAULT_SELECTION_DIVIDERS_DISTANCE = 48;
/**
- * The default unscaled minimal distance for a swipe to be considered a fling.
- */
- private static final int UNSCALED_DEFAULT_MIN_FLING_DISTANCE = 150;
-
- /**
- * Coefficient for adjusting touch scroll distance.
- */
- private static final float TOUCH_SCROLL_DECELERATION_COEFFICIENT = 2.0f;
-
- /**
* The resource id for the default layout.
*/
private static final int DEFAULT_LAYOUT_RESOURCE_ID = R.layout.number_picker;
@@ -233,11 +223,6 @@
private final int mTextSize;
/**
- * The minimal distance for a swipe to be considered a fling.
- */
- private final int mMinFlingDistance;
-
- /**
* The height of the gap between text elements if the selector wheel.
*/
private int mSelectorTextGapHeight;
@@ -298,6 +283,11 @@
private final Paint mSelectorWheelPaint;
/**
+ * The {@link Drawable} for pressed virtual (increment/decrement) buttons.
+ */
+ private final Drawable mVirtualButtonPressedDrawable;
+
+ /**
* The height of a selector element (text + gap).
*/
private int mSelectorElementHeight;
@@ -435,11 +425,26 @@
private int mLastHoveredChildVirtualViewId;
/**
+ * Whether the increment virtual button is pressed.
+ */
+ private boolean mIncrementVirtualButtonPressed;
+
+ /**
+ * Whether the decrement virtual button is pressed.
+ */
+ private boolean mDecrementVirtualButtonPressed;
+
+ /**
* Provider to report to clients the semantic structure of this widget.
*/
private AccessibilityNodeProviderImpl mAccessibilityNodeProvider;
/**
+ * Helper class for managing pressed state of the virtual buttons.
+ */
+ private final PressedStateHelper mPressedStateHelper;
+
+ /**
* Interface to listen for changes of the current value.
*/
public interface OnValueChangeListener {
@@ -553,12 +558,6 @@
mSelectionDividersDistance = attributesArray.getDimensionPixelSize(
R.styleable.NumberPicker_selectionDividersDistance, defSelectionDividerDistance);
- final int defMinFlingDistance = (int) TypedValue.applyDimension(
- TypedValue.COMPLEX_UNIT_DIP, UNSCALED_DEFAULT_MIN_FLING_DISTANCE,
- getResources().getDisplayMetrics());
- mMinFlingDistance = attributesArray.getDimensionPixelSize(
- R.styleable.NumberPicker_minFlingDistance, defMinFlingDistance);
-
mMinHeight = attributesArray.getDimensionPixelSize(
R.styleable.NumberPicker_internalMinHeight, SIZE_UNSPECIFIED);
@@ -581,8 +580,13 @@
mComputeMaxWidth = (mMaxWidth == SIZE_UNSPECIFIED);
+ mVirtualButtonPressedDrawable = attributesArray.getDrawable(
+ R.styleable.NumberPicker_virtualButtonPressedDrawable);
+
attributesArray.recycle();
+ mPressedStateHelper = new PressedStateHelper();
+
// By default Linearlayout that we extend is not drawn. This is
// its draw() method is not called but dispatchDraw() is called
// directly (see ViewGroup.drawChild()). However, this class uses
@@ -776,7 +780,19 @@
mLastDownEventTime = event.getEventTime();
mIngonreMoveEvents = false;
mShowSoftInputOnTap = false;
- // Make sure we wupport flinging inside scrollables.
+ // Handle pressed state before any state change.
+ if (mLastDownEventY < mTopSelectionDividerTop) {
+ if (mScrollState == OnScrollListener.SCROLL_STATE_IDLE) {
+ mPressedStateHelper.buttonPressDelayed(
+ PressedStateHelper.BUTTON_DECREMENT);
+ }
+ } else if (mLastDownEventY > mBottomSelectionDividerBottom) {
+ if (mScrollState == OnScrollListener.SCROLL_STATE_IDLE) {
+ mPressedStateHelper.buttonPressDelayed(
+ PressedStateHelper.BUTTON_INCREMENT);
+ }
+ }
+ // Make sure we support flinging inside scrollables.
getParent().requestDisallowInterceptTouchEvent(true);
if (!mFlingScroller.isFinished()) {
mFlingScroller.forceFinished(true);
@@ -826,8 +842,7 @@
onScrollStateChange(OnScrollListener.SCROLL_STATE_TOUCH_SCROLL);
}
} else {
- int deltaMoveY = (int) ((currentMoveY - mLastDownOrMoveEventY)
- / TOUCH_SCROLL_DECELERATION_COEFFICIENT);
+ int deltaMoveY = (int) ((currentMoveY - mLastDownOrMoveEventY));
scrollBy(0, deltaMoveY);
invalidate();
}
@@ -836,23 +851,12 @@
case MotionEvent.ACTION_UP: {
removeBeginSoftInputCommand();
removeChangeCurrentByOneFromLongPress();
+ mPressedStateHelper.cancel();
VelocityTracker velocityTracker = mVelocityTracker;
velocityTracker.computeCurrentVelocity(1000, mMaximumFlingVelocity);
int initialVelocity = (int) velocityTracker.getYVelocity();
if (Math.abs(initialVelocity) > mMinimumFlingVelocity) {
- int deltaMove = (int) (event.getY() - mLastDownEventY);
- int absDeltaMoveY = Math.abs(deltaMove);
- if (absDeltaMoveY > mMinFlingDistance) {
- fling(initialVelocity);
- } else {
- final int normalizedDeltaMove =
- (int) (absDeltaMoveY / TOUCH_SCROLL_DECELERATION_COEFFICIENT);
- if (normalizedDeltaMove < mSelectorElementHeight) {
- snapToNextValue(deltaMove < 0);
- } else {
- snapToClosestValue();
- }
- }
+ fling(initialVelocity);
onScrollStateChange(OnScrollListener.SCROLL_STATE_FLING);
} else {
int eventY = (int) event.getY();
@@ -867,8 +871,12 @@
- SELECTOR_MIDDLE_ITEM_INDEX;
if (selectorIndexOffset > 0) {
changeValueByOne(true);
+ mPressedStateHelper.buttonTapped(
+ PressedStateHelper.BUTTON_INCREMENT);
} else if (selectorIndexOffset < 0) {
changeValueByOne(false);
+ mPressedStateHelper.buttonTapped(
+ PressedStateHelper.BUTTON_DECREMENT);
}
}
} else {
@@ -1356,6 +1364,22 @@
float x = (mRight - mLeft) / 2;
float y = mCurrentScrollOffset;
+ // draw the virtual buttons pressed state if needed
+ if (mVirtualButtonPressedDrawable != null
+ && mScrollState == OnScrollListener.SCROLL_STATE_IDLE) {
+ if (mDecrementVirtualButtonPressed) {
+ mVirtualButtonPressedDrawable.setState(PRESSED_STATE_SET);
+ mVirtualButtonPressedDrawable.setBounds(0, 0, mRight, mTopSelectionDividerTop);
+ mVirtualButtonPressedDrawable.draw(canvas);
+ }
+ if (mIncrementVirtualButtonPressed) {
+ mVirtualButtonPressedDrawable.setState(PRESSED_STATE_SET);
+ mVirtualButtonPressedDrawable.setBounds(0, mBottomSelectionDividerBottom, mRight,
+ mBottom);
+ mVirtualButtonPressedDrawable.draw(canvas);
+ }
+ }
+
// draw the selector wheel
int[] selectorIndices = mSelectorIndices;
for (int i = 0; i < selectorIndices.length; i++) {
@@ -1465,15 +1489,15 @@
*/
private void initializeSelectorWheelIndices() {
mSelectorIndexToStringCache.clear();
- int[] selectorIdices = mSelectorIndices;
+ int[] selectorIndices = mSelectorIndices;
int current = getValue();
for (int i = 0; i < mSelectorIndices.length; i++) {
int selectorIndex = current + (i - SELECTOR_MIDDLE_ITEM_INDEX);
if (mWrapSelectorWheel) {
selectorIndex = getWrappedSelectorIndex(selectorIndex);
}
- mSelectorIndices[i] = selectorIndex;
- ensureCachedScrollSelectorValue(mSelectorIndices[i]);
+ selectorIndices[i] = selectorIndex;
+ ensureCachedScrollSelectorValue(selectorIndices[i]);
}
}
@@ -1775,6 +1799,7 @@
if (mBeginSoftInputOnLongPressCommand != null) {
removeCallbacks(mBeginSoftInputOnLongPressCommand);
}
+ mPressedStateHelper.cancel();
}
/**
@@ -1910,39 +1935,80 @@
return false;
}
- private void snapToNextValue(boolean increment) {
- int deltaY = mCurrentScrollOffset - mInitialScrollOffset;
- int amountToScroll = 0;
- if (deltaY != 0) {
- mPreviousScrollerY = 0;
- if (deltaY > 0) {
- if (increment) {
- amountToScroll = - deltaY;
- } else {
- amountToScroll = mSelectorElementHeight - deltaY;
- }
- } else {
- if (increment) {
- amountToScroll = - mSelectorElementHeight - deltaY;
- } else {
- amountToScroll = - deltaY;
- }
- }
- mFlingScroller.startScroll(0, 0, 0, amountToScroll, SNAP_SCROLL_DURATION);
- invalidate();
- }
- }
+ class PressedStateHelper implements Runnable {
+ public static final int BUTTON_INCREMENT = 1;
+ public static final int BUTTON_DECREMENT = 2;
- private void snapToClosestValue() {
- // adjust to the closest value
- int deltaY = mInitialScrollOffset - mCurrentScrollOffset;
- if (deltaY != 0) {
- mPreviousScrollerY = 0;
- if (Math.abs(deltaY) > mSelectorElementHeight / 2) {
- deltaY += (deltaY > 0) ? -mSelectorElementHeight : mSelectorElementHeight;
+ private final int MODE_PRESS = 1;
+ private final int MODE_TAPPED = 2;
+
+ private int mManagedButton;
+ private int mMode;
+
+ public void cancel() {
+ mMode = 0;
+ mManagedButton = 0;
+ NumberPicker.this.removeCallbacks(this);
+ if (mIncrementVirtualButtonPressed) {
+ mIncrementVirtualButtonPressed = false;
+ invalidate(0, mBottomSelectionDividerBottom, mRight, mBottom);
}
- mFlingScroller.startScroll(0, 0, 0, deltaY, SNAP_SCROLL_DURATION);
- invalidate();
+ mDecrementVirtualButtonPressed = false;
+ if (mDecrementVirtualButtonPressed) {
+ invalidate(0, 0, mRight, mTopSelectionDividerTop);
+ }
+ }
+
+ public void buttonPressDelayed(int button) {
+ cancel();
+ mMode = MODE_PRESS;
+ mManagedButton = button;
+ NumberPicker.this.postDelayed(this, ViewConfiguration.getTapTimeout());
+ }
+
+ public void buttonTapped(int button) {
+ cancel();
+ mMode = MODE_TAPPED;
+ mManagedButton = button;
+ NumberPicker.this.post(this);
+ }
+
+ @Override
+ public void run() {
+ switch (mMode) {
+ case MODE_PRESS: {
+ switch (mManagedButton) {
+ case BUTTON_INCREMENT: {
+ mIncrementVirtualButtonPressed = true;
+ invalidate(0, mBottomSelectionDividerBottom, mRight, mBottom);
+ } break;
+ case BUTTON_DECREMENT: {
+ mDecrementVirtualButtonPressed = true;
+ invalidate(0, 0, mRight, mTopSelectionDividerTop);
+ }
+ }
+ } break;
+ case MODE_TAPPED: {
+ switch (mManagedButton) {
+ case BUTTON_INCREMENT: {
+ if (!mIncrementVirtualButtonPressed) {
+ NumberPicker.this.postDelayed(this,
+ ViewConfiguration.getPressedStateDuration());
+ }
+ mIncrementVirtualButtonPressed ^= true;
+ invalidate(0, mBottomSelectionDividerBottom, mRight, mBottom);
+ } break;
+ case BUTTON_DECREMENT: {
+ if (!mDecrementVirtualButtonPressed) {
+ NumberPicker.this.postDelayed(this,
+ ViewConfiguration.getPressedStateDuration());
+ }
+ mDecrementVirtualButtonPressed ^= true;
+ invalidate(0, 0, mRight, mTopSelectionDividerTop);
+ }
+ }
+ } break;
+ }
}
}
diff --git a/core/java/android/widget/ScrollView.java b/core/java/android/widget/ScrollView.java
index f912c66..b398ce4 100644
--- a/core/java/android/widget/ScrollView.java
+++ b/core/java/android/widget/ScrollView.java
@@ -22,6 +22,7 @@
import android.content.res.TypedArray;
import android.graphics.Canvas;
import android.graphics.Rect;
+import android.os.Bundle;
import android.os.StrictMode;
import android.util.AttributeSet;
import android.view.FocusFinder;
@@ -740,10 +741,42 @@
}
@Override
+ public boolean performAccessibilityAction(int action, Bundle arguments) {
+ switch (action) {
+ case AccessibilityNodeInfo.ACTION_SCROLL_FORWARD: {
+ final int viewportHeight = getHeight() - mPaddingBottom - mPaddingTop;
+ final int targetScrollY = Math.min(mScrollY + viewportHeight, getScrollRange());
+ if (targetScrollY != mScrollY) {
+ smoothScrollTo(0, targetScrollY);
+ return true;
+ }
+ } return false;
+ case AccessibilityNodeInfo.ACTION_SCROLL_BACKWARD: {
+ final int viewportHeight = getHeight() - mPaddingBottom - mPaddingTop;
+ final int targetScrollY = Math.max(mScrollY - viewportHeight, 0);
+ if (targetScrollY != mScrollY) {
+ smoothScrollTo(0, targetScrollY);
+ return true;
+ }
+ } return false;
+ }
+ return super.performAccessibilityAction(action, arguments);
+ }
+
+ @Override
public void onInitializeAccessibilityNodeInfo(AccessibilityNodeInfo info) {
super.onInitializeAccessibilityNodeInfo(info);
info.setClassName(ScrollView.class.getName());
- info.setScrollable(getScrollRange() > 0);
+ final int scrollRange = getScrollRange();
+ if (scrollRange > 0) {
+ info.setScrollable(true);
+ if (mScrollY > 0) {
+ info.addAction(AccessibilityNodeInfo.ACTION_SCROLL_BACKWARD);
+ }
+ if (mScrollY < scrollRange) {
+ info.addAction(AccessibilityNodeInfo.ACTION_SCROLL_FORWARD);
+ }
+ }
}
@Override
diff --git a/core/java/android/widget/SpellChecker.java b/core/java/android/widget/SpellChecker.java
index ebf8a4a..7ca02e1 100644
--- a/core/java/android/widget/SpellChecker.java
+++ b/core/java/android/widget/SpellChecker.java
@@ -343,6 +343,36 @@
if (!isInDictionary && looksLikeTypo) {
createMisspelledSuggestionSpan(
editable, suggestionsInfo, spellCheckSpan, offset, length);
+ } else {
+ // Valid word -- isInDictionary || !looksLikeTypo
+ if (mIsSentenceSpellCheckSupported) {
+ // Allow the spell checker to remove existing misspelled span by
+ // overwriting the span over the same place
+ final int spellCheckSpanStart = editable.getSpanStart(spellCheckSpan);
+ final int spellCheckSpanEnd = editable.getSpanEnd(spellCheckSpan);
+ final int start;
+ final int end;
+ if (offset != USE_SPAN_RANGE && length != USE_SPAN_RANGE) {
+ start = spellCheckSpanStart + offset;
+ end = start + length;
+ } else {
+ start = spellCheckSpanStart;
+ end = spellCheckSpanEnd;
+ }
+ if (spellCheckSpanStart >= 0 && spellCheckSpanEnd > spellCheckSpanStart
+ && end > start) {
+ final Long key = Long.valueOf(TextUtils.packRangeInLong(start, end));
+ final SuggestionSpan tempSuggestionSpan = mSuggestionSpanCache.get(key);
+ if (tempSuggestionSpan != null) {
+ if (DBG) {
+ Log.i(TAG, "Remove existing misspelled span. "
+ + editable.subSequence(start, end));
+ }
+ editable.removeSpan(tempSuggestionSpan);
+ mSuggestionSpanCache.remove(key);
+ }
+ }
+ }
}
return spellCheckSpan;
}
@@ -473,8 +503,16 @@
private Object mRange = new Object();
public void parse(int start, int end) {
- if (end > start) {
- setRangeSpan((Editable) mTextView.getText(), start, end);
+ final int max = mTextView.length();
+ final int parseEnd;
+ if (end > max) {
+ Log.w(TAG, "Parse invalid region, from " + start + " to " + end);
+ parseEnd = max;
+ } else {
+ parseEnd = end;
+ }
+ if (parseEnd > start) {
+ setRangeSpan((Editable) mTextView.getText(), start, parseEnd);
parse();
}
}
@@ -612,6 +650,8 @@
break;
}
if (spellCheckEnd <= spellCheckStart) {
+ Log.w(TAG, "Trying to spellcheck invalid region, from "
+ + start + " to " + end);
break;
}
if (createSpellCheckSpan) {
diff --git a/core/java/android/widget/TextView.java b/core/java/android/widget/TextView.java
index 555c974..56eca01 100644
--- a/core/java/android/widget/TextView.java
+++ b/core/java/android/widget/TextView.java
@@ -154,6 +154,7 @@
* @attr ref android.R.styleable#TextView_textColorLink
* @attr ref android.R.styleable#TextView_textSize
* @attr ref android.R.styleable#TextView_textScaleX
+ * @attr ref android.R.styleable#TextView_fontFamily
* @attr ref android.R.styleable#TextView_typeface
* @attr ref android.R.styleable#TextView_textStyle
* @attr ref android.R.styleable#TextView_cursorVisible
@@ -464,6 +465,7 @@
ColorStateList textColorHint = null;
ColorStateList textColorLink = null;
int textSize = 15;
+ String fontFamily = null;
int typefaceIndex = -1;
int styleIndex = -1;
boolean allCaps = false;
@@ -516,6 +518,10 @@
typefaceIndex = appearance.getInt(attr, -1);
break;
+ case com.android.internal.R.styleable.TextAppearance_fontFamily:
+ fontFamily = appearance.getString(attr);
+ break;
+
case com.android.internal.R.styleable.TextAppearance_textStyle:
styleIndex = appearance.getInt(attr, -1);
break;
@@ -781,6 +787,10 @@
styleIndex = a.getInt(attr, styleIndex);
break;
+ case com.android.internal.R.styleable.TextView_fontFamily:
+ fontFamily = a.getString(attr);
+ break;
+
case com.android.internal.R.styleable.TextView_password:
password = a.getBoolean(attr, password);
break;
@@ -1051,7 +1061,7 @@
typefaceIndex = MONOSPACE;
}
- setTypefaceByIndex(typefaceIndex, styleIndex);
+ setTypefaceFromAttrs(fontFamily, typefaceIndex, styleIndex);
if (shadowcolor != 0) {
setShadowLayer(r, dx, dy, shadowcolor);
@@ -1111,8 +1121,15 @@
}
}
- private void setTypefaceByIndex(int typefaceIndex, int styleIndex) {
+ private void setTypefaceFromAttrs(String familyName, int typefaceIndex, int styleIndex) {
Typeface tf = null;
+ if (familyName != null) {
+ tf = Typeface.create(familyName, styleIndex);
+ if (tf != null) {
+ setTypeface(tf);
+ return;
+ }
+ }
switch (typefaceIndex) {
case SANS:
tf = Typeface.SANS_SERIF;
@@ -2160,14 +2177,17 @@
setLinkTextColor(colors);
}
+ String familyName;
int typefaceIndex, styleIndex;
+ familyName = appearance.getString(com.android.internal.R.styleable.
+ TextAppearance_fontFamily);
typefaceIndex = appearance.getInt(com.android.internal.R.styleable.
TextAppearance_typeface, -1);
styleIndex = appearance.getInt(com.android.internal.R.styleable.
TextAppearance_textStyle, -1);
- setTypefaceByIndex(typefaceIndex, styleIndex);
+ setTypefaceFromAttrs(familyName, typefaceIndex, styleIndex);
if (appearance.getBoolean(com.android.internal.R.styleable.TextAppearance_textAllCaps,
false)) {
@@ -2269,6 +2289,7 @@
*
* @see #getTypeface()
*
+ * @attr ref android.R.styleable#TextView_fontFamily
* @attr ref android.R.styleable#TextView_typeface
* @attr ref android.R.styleable#TextView_textStyle
*/
@@ -2290,6 +2311,7 @@
*
* @see #setTypeface(Typeface)
*
+ * @attr ref android.R.styleable#TextView_fontFamily
* @attr ref android.R.styleable#TextView_typeface
* @attr ref android.R.styleable#TextView_textStyle
*/
@@ -3690,15 +3712,15 @@
boolean forceUpdate = false;
if (isPassword) {
setTransformationMethod(PasswordTransformationMethod.getInstance());
- setTypefaceByIndex(MONOSPACE, 0);
+ setTypefaceFromAttrs(null /* fontFamily */, MONOSPACE, 0);
} else if (isVisiblePassword) {
if (mTransformation == PasswordTransformationMethod.getInstance()) {
forceUpdate = true;
}
- setTypefaceByIndex(MONOSPACE, 0);
+ setTypefaceFromAttrs(null /* fontFamily */, MONOSPACE, 0);
} else if (wasPassword || wasVisiblePassword) {
// not in password mode, clean up typeface and transformation
- setTypefaceByIndex(-1, -1);
+ setTypefaceFromAttrs(null /* fontFamily */, -1, -1);
if (mTransformation == PasswordTransformationMethod.getInstance()) {
forceUpdate = true;
}
@@ -7235,10 +7257,9 @@
// usually because this instance is an editable field in a list
if (!mDispatchTemporaryDetach) mTemporaryDetach = true;
- // Because of View recycling in ListView, there is no easy way to know when a TextView with
- // selection becomes visible again. Until a better solution is found, stop text selection
- // mode (if any) as soon as this TextView is recycled.
- if (mEditor != null) mEditor.hideControllers();
+ // Tell the editor that we are temporarily detached. It can use this to preserve
+ // selection state as needed.
+ if (mEditor != null) mEditor.mTemporaryDetach = true;
}
@Override
@@ -7247,6 +7268,7 @@
// Only track when onStartTemporaryDetach() is called directly,
// usually because this instance is an editable field in a list
if (!mDispatchTemporaryDetach) mTemporaryDetach = false;
+ if (mEditor != null) mEditor.mTemporaryDetach = false;
}
@Override
diff --git a/core/java/com/android/internal/app/PlatLogoActivity.java b/core/java/com/android/internal/app/PlatLogoActivity.java
index 37567fd..89f2187 100644
--- a/core/java/com/android/internal/app/PlatLogoActivity.java
+++ b/core/java/com/android/internal/app/PlatLogoActivity.java
@@ -29,64 +29,43 @@
import android.widget.Toast;
public class PlatLogoActivity extends Activity {
- Vibrator mZzz;
Toast mToast;
ImageView mContent;
int mCount;
final Handler mHandler = new Handler();
- Runnable mSuperLongPress = new Runnable() {
- public void run() {
- mCount++;
- mZzz.vibrate(50 * mCount);
- final float scale = 1f + 0.25f * mCount * mCount;
- mContent.setScaleX(scale);
- mContent.setScaleY(scale);
-
- if (mCount <= 3) {
- mHandler.postDelayed(mSuperLongPress, ViewConfiguration.getLongPressTimeout());
- } else {
- try {
- startActivity(new Intent(Intent.ACTION_MAIN)
- .setFlags(Intent.FLAG_ACTIVITY_NEW_TASK
- | Intent.FLAG_ACTIVITY_CLEAR_TASK
- | Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS)
- .setClassName("com.android.systemui","com.android.systemui.Nyandroid"));
- } catch (ActivityNotFoundException ex) {
- android.util.Log.e("PlatLogoActivity", "Couldn't find platlogo screensaver.");
- }
- finish();
- }
- }
- };
-
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
- mZzz = (Vibrator)getSystemService(VIBRATOR_SERVICE);
- mToast = Toast.makeText(this, "Android 4.0: Ice Cream Sandwich", Toast.LENGTH_SHORT);
+ mToast = Toast.makeText(this, "Android X.X: Jelly Bean", Toast.LENGTH_SHORT);
mContent = new ImageView(this);
mContent.setImageResource(com.android.internal.R.drawable.platlogo);
mContent.setScaleType(ImageView.ScaleType.CENTER_INSIDE);
- mContent.setOnTouchListener(new View.OnTouchListener() {
+ mContent.setOnClickListener(new View.OnClickListener() {
@Override
- public boolean onTouch(View v, MotionEvent event) {
- final int action = event.getAction();
- if (action == MotionEvent.ACTION_DOWN) {
- mContent.setPressed(true);
- mHandler.removeCallbacks(mSuperLongPress);
- mCount = 0;
- mHandler.postDelayed(mSuperLongPress, 2*ViewConfiguration.getLongPressTimeout());
- } else if (action == MotionEvent.ACTION_UP) {
- if (mContent.isPressed()) {
- mContent.setPressed(false);
- mHandler.removeCallbacks(mSuperLongPress);
- mToast.show();
- }
+ public void onClick(View v) {
+ mToast.show();
+ mContent.setImageResource(com.android.internal.R.drawable.platlogo_alt);
+ }
+ });
+
+ mContent.setOnLongClickListener(new View.OnLongClickListener() {
+ @Override
+ public boolean onLongClick(View v) {
+ try {
+ startActivity(new Intent(Intent.ACTION_MAIN)
+ .setFlags(Intent.FLAG_ACTIVITY_NEW_TASK
+ | Intent.FLAG_ACTIVITY_CLEAR_TASK
+ | Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS)
+ .addCategory("com.android.internal.category.PLATLOGO"));
+ //.setClassName("com.android.systemui","com.android.systemui.BeanBag"));
+ } catch (ActivityNotFoundException ex) {
+ android.util.Log.e("PlatLogoActivity", "Couldn't find a bag of beans.");
}
+ finish();
return true;
}
});
diff --git a/core/java/com/android/internal/widget/multiwaveview/MultiWaveView.java b/core/java/com/android/internal/widget/multiwaveview/MultiWaveView.java
index a74ecd3..d6ffba2 100644
--- a/core/java/com/android/internal/widget/multiwaveview/MultiWaveView.java
+++ b/core/java/com/android/internal/widget/multiwaveview/MultiWaveView.java
@@ -69,16 +69,19 @@
public void onGrabbedStateChange(View v, int handle);
}
- // Tune-able parameters
+ // Tuneable parameters for animation
private static final int CHEVRON_INCREMENTAL_DELAY = 160;
private static final int CHEVRON_ANIMATION_DURATION = 850;
private static final int RETURN_TO_HOME_DELAY = 1200;
private static final int RETURN_TO_HOME_DURATION = 300;
private static final int HIDE_ANIMATION_DELAY = 200;
- private static final int HIDE_ANIMATION_DURATION = RETURN_TO_HOME_DELAY;
- private static final int SHOW_ANIMATION_DURATION = 0;
+ private static final int HIDE_ANIMATION_DURATION = 200;
+ private static final int SHOW_ANIMATION_DURATION = 200;
private static final int SHOW_ANIMATION_DELAY = 0;
private static final float TAP_RADIUS_SCALE_ACCESSIBILITY_ENABLED = 1.3f;
+ private static final long RING_EXPAND_DURATION = 200;
+ private static final float TARGET_INITIAL_POSITION_SCALE = 0.8f;
+
private TimeInterpolator mChevronAnimationInterpolator = Ease.Quad.easeOut;
private ArrayList<TargetDrawable> mTargetDrawables = new ArrayList<TargetDrawable>();
@@ -149,6 +152,7 @@
private int mHorizontalInset;
private int mVerticalInset;
private int mGravity = Gravity.TOP;
+ private boolean mInitialLayout = true;
public MultiWaveView(Context context) {
this(context, null);
@@ -177,23 +181,37 @@
mAlwaysTrackFinger = a.getBoolean(R.styleable.MultiWaveView_alwaysTrackFinger, false);
mGravity = a.getInt(R.styleable.MultiWaveView_gravity, Gravity.TOP);
- // Read chevron animation drawables
- final int chevrons[] = { R.styleable.MultiWaveView_leftChevronDrawable,
- R.styleable.MultiWaveView_rightChevronDrawable,
- R.styleable.MultiWaveView_topChevronDrawable,
- R.styleable.MultiWaveView_bottomChevronDrawable
- };
+ // Read array of chevron drawables
+ TypedValue outValue = new TypedValue();
+ if (a.getValue(R.styleable.MultiWaveView_chevronDrawables, outValue)) {
+ ArrayList<TargetDrawable> chevrons = loadDrawableArray(outValue.resourceId);
+ for (int i = 0; i < chevrons.size(); i++) {
+ final TargetDrawable chevron = chevrons.get(i);
+ for (int k = 0; k < mFeedbackCount; k++) {
+ mChevronDrawables.add(chevron == null ? null : new TargetDrawable(chevron));
+ }
+ }
+ }
- for (int chevron : chevrons) {
- TypedValue typedValue = a.peekValue(chevron);
- for (int i = 0; i < mFeedbackCount; i++) {
- mChevronDrawables.add(
- typedValue != null ? new TargetDrawable(res, typedValue.resourceId) : null);
+ // Support old-style chevron specification if new specification not found
+ if (mChevronDrawables.size() == 0) {
+ final int chevronResIds[] = {
+ R.styleable.MultiWaveView_rightChevronDrawable,
+ R.styleable.MultiWaveView_topChevronDrawable,
+ R.styleable.MultiWaveView_leftChevronDrawable,
+ R.styleable.MultiWaveView_bottomChevronDrawable
+ };
+
+ for (int i = 0; i < chevronResIds.length; i++) {
+ TypedValue typedValue = a.peekValue(chevronResIds[i]);
+ for (int k = 0; k < mFeedbackCount; k++) {
+ mChevronDrawables.add(
+ typedValue != null ? new TargetDrawable(res, typedValue.resourceId) : null);
+ }
}
}
// Read array of target drawables
- TypedValue outValue = new TypedValue();
if (a.getValue(R.styleable.MultiWaveView_targetDrawables, outValue)) {
internalSetTargetResources(outValue.resourceId);
}
@@ -274,7 +292,7 @@
final int minimumHeight = getSuggestedMinimumHeight();
int computedWidth = resolveMeasured(widthMeasureSpec, minimumWidth);
int computedHeight = resolveMeasured(heightMeasureSpec, minimumHeight);
- setupGravity((computedWidth - minimumWidth), (computedHeight - minimumHeight));
+ computeInsets((computedWidth - minimumWidth), (computedHeight - minimumHeight));
setMeasuredDimension(computedWidth, computedHeight);
}
@@ -314,23 +332,24 @@
* mFeedbackCount items in the order: left, right, top, bottom.
*/
private void startChevronAnimation() {
- final float r = mHandleDrawable.getWidth() * 0.4f;
- final float chevronAnimationDistance = mOuterRadius * 0.9f;
- final float from[][] = {
- {mWaveCenterX - r, mWaveCenterY}, // left
- {mWaveCenterX + r, mWaveCenterY}, // right
- {mWaveCenterX, mWaveCenterY - r}, // top
- {mWaveCenterX, mWaveCenterY + r} }; // bottom
- final float to[][] = {
- {mWaveCenterX - chevronAnimationDistance, mWaveCenterY}, // left
- {mWaveCenterX + chevronAnimationDistance, mWaveCenterY}, // right
- {mWaveCenterX, mWaveCenterY - chevronAnimationDistance}, // top
- {mWaveCenterX, mWaveCenterY + chevronAnimationDistance} }; // bottom
-
+ final float chevronStartDistance = mHandleDrawable.getWidth() * 0.8f;
+ final float chevronStopDistance = mOuterRadius * 0.9f / 2.0f;
mChevronAnimations.clear();
final float startScale = 0.5f;
final float endScale = 2.0f;
- for (int direction = 0; direction < 4; direction++) {
+
+ final int directionCount = mFeedbackCount > 0 ? mChevronDrawables.size()/mFeedbackCount : 0;
+
+ // Add an animation for all chevron drawables. There are mFeedbackCount drawables
+ // in each direction and directionCount directions.
+ for (int direction = 0; direction < directionCount; direction++) {
+ double angle = 2.0 * Math.PI * direction / directionCount;
+ final float sx = (float) Math.cos(angle);
+ final float sy = 0.0f - (float) Math.sin(angle);
+ final float[] xrange = new float[]
+ {sx * chevronStartDistance, sx * chevronStopDistance};
+ final float[] yrange = new float[]
+ {sy * chevronStartDistance, sy * chevronStopDistance};
for (int count = 0; count < mFeedbackCount; count++) {
int delay = count * CHEVRON_INCREMENTAL_DELAY;
final TargetDrawable icon = mChevronDrawables.get(direction*mFeedbackCount + count);
@@ -340,8 +359,8 @@
mChevronAnimations.add(Tweener.to(icon, CHEVRON_ANIMATION_DURATION,
"ease", mChevronAnimationInterpolator,
"delay", delay,
- "x", new float[] { from[direction][0], to[direction][0] },
- "y", new float[] { from[direction][1], to[direction][1] },
+ "x", xrange,
+ "y", yrange,
"alpha", new float[] {1.0f, 0.0f},
"scaleX", new float[] {startScale, endScale},
"scaleY", new float[] {startScale, endScale},
@@ -416,32 +435,25 @@
mHandleDrawable.setAlpha(targetHit ? 0.0f : 1.0f);
if (targetHit) {
mTargetDrawables.get(activeTarget).setState(TargetDrawable.STATE_ACTIVE);
-
hideUnselected(activeTarget);
// Inform listener of any active targets. Typically only one will be active.
if (DEBUG) Log.v(TAG, "Finish with target hit = " + targetHit);
dispatchTriggerEvent(mActiveTarget);
- mHandleAnimation = Tweener.to(mHandleDrawable, 0,
- "ease", Ease.Quart.easeOut,
- "delay", RETURN_TO_HOME_DELAY,
- "alpha", 1.0f,
- "x", mWaveCenterX,
- "y", mWaveCenterY,
- "onUpdate", mUpdateListener,
- "onComplete", mResetListener);
- } else {
- // Animate finger outline back to home position
- mHandleAnimation = Tweener.to(mHandleDrawable, RETURN_TO_HOME_DURATION,
- "ease", Ease.Quart.easeOut,
- "delay", 0,
- "alpha", 1.0f,
- "x", mWaveCenterX,
- "y", mWaveCenterY,
- "onUpdate", mUpdateListener,
- "onComplete", mDragging ? mResetListenerWithPing : mResetListener);
}
+ // Animate handle back to the center based on current state.
+ int delay = targetHit ? RETURN_TO_HOME_DELAY : 0;
+ int duration = targetHit ? 0 : RETURN_TO_HOME_DURATION;
+ mHandleAnimation = Tweener.to(mHandleDrawable, duration,
+ "ease", Ease.Quart.easeOut,
+ "delay", delay,
+ "alpha", 1.0f,
+ "x", 0,
+ "y", 0,
+ "onUpdate", mUpdateListener,
+ "onComplete", (mDragging && !targetHit) ? mResetListenerWithPing : mResetListener);
+
setGrabbedState(OnTriggerListener.NO_HANDLE);
}
@@ -461,27 +473,30 @@
// Note: these animations should complete at the same time so that we can swap out
// the target assets asynchronously from the setTargetResources() call.
mAnimatingTargets = animate;
- if (animate) {
- final int duration = animate ? HIDE_ANIMATION_DURATION : 0;
- for (TargetDrawable target : mTargetDrawables) {
- target.setState(TargetDrawable.STATE_INACTIVE);
- mTargetAnimations.add(Tweener.to(target, duration,
- "alpha", 0.0f,
- "delay", HIDE_ANIMATION_DELAY,
- "onUpdate", mUpdateListener));
- }
- mTargetAnimations.add(Tweener.to(mOuterRing, duration,
+ final int duration = animate ? HIDE_ANIMATION_DURATION : 0;
+ final int delay = animate ? HIDE_ANIMATION_DELAY : 0;
+ final int length = mTargetDrawables.size();
+ for (int i = 0; i < length; i++) {
+ TargetDrawable target = mTargetDrawables.get(i);
+ target.setState(TargetDrawable.STATE_INACTIVE);
+ mTargetAnimations.add(Tweener.to(target, duration,
+ "ease", Ease.Cubic.easeOut,
"alpha", 0.0f,
- "delay", HIDE_ANIMATION_DELAY,
- "onUpdate", mUpdateListener,
- "onComplete", mTargetUpdateListener));
- } else {
- for (TargetDrawable target : mTargetDrawables) {
- target.setState(TargetDrawable.STATE_INACTIVE);
- target.setAlpha(0.0f);
- }
- mOuterRing.setAlpha(0.0f);
+ "scaleX", TARGET_INITIAL_POSITION_SCALE,
+ "scaleY", TARGET_INITIAL_POSITION_SCALE,
+ "delay", delay,
+ "onUpdate", mUpdateListener));
}
+
+ float ringScaleTarget = mActiveTarget != -1 ? 1.5f : 0.5f;
+ mTargetAnimations.add(Tweener.to(mOuterRing, duration,
+ "ease", Ease.Cubic.easeOut,
+ "alpha", 0.0f,
+ "scaleX", ringScaleTarget,
+ "scaleY", ringScaleTarget,
+ "delay", delay,
+ "onUpdate", mUpdateListener,
+ "onComplete", mTargetUpdateListener));
}
private void showTargets(boolean animate) {
@@ -489,26 +504,31 @@
stopTargetAnimation();
}
mAnimatingTargets = animate;
- if (animate) {
- for (TargetDrawable target : mTargetDrawables) {
- target.setState(TargetDrawable.STATE_INACTIVE);
- mTargetAnimations.add(Tweener.to(target, SHOW_ANIMATION_DURATION,
- "alpha", 1.0f,
- "delay", SHOW_ANIMATION_DELAY,
- "onUpdate", mUpdateListener));
- }
- mTargetAnimations.add(Tweener.to(mOuterRing, SHOW_ANIMATION_DURATION,
+ final int delay = animate ? SHOW_ANIMATION_DELAY : 0;
+ final int length = mTargetDrawables.size();
+ for (int i = 0; i < length; i++) {
+ TargetDrawable target = mTargetDrawables.get(i);
+ target.setState(TargetDrawable.STATE_INACTIVE);
+ target.setScaleX(TARGET_INITIAL_POSITION_SCALE);
+ target.setScaleY(TARGET_INITIAL_POSITION_SCALE);
+ mTargetAnimations.add(Tweener.to(target, animate ? SHOW_ANIMATION_DURATION : 0,
+ "ease", Ease.Cubic.easeOut,
"alpha", 1.0f,
- "delay", SHOW_ANIMATION_DELAY,
- "onUpdate", mUpdateListener,
- "onComplete", mTargetUpdateListener));
- } else {
- for (TargetDrawable target : mTargetDrawables) {
- target.setState(TargetDrawable.STATE_INACTIVE);
- target.setAlpha(1.0f);
- }
- mOuterRing.setAlpha(1.0f);
+ "scaleX", 1.0f,
+ "scaleY", 1.0f,
+ "delay", delay,
+ "onUpdate", mUpdateListener));
}
+ mOuterRing.setScaleX(0.5f);
+ mOuterRing.setScaleY(0.5f);
+ mTargetAnimations.add(Tweener.to(mOuterRing, animate ? RING_EXPAND_DURATION : 0,
+ "ease", Ease.Cubic.easeOut,
+ "alpha", 1.0f,
+ "scaleX", 1.0f,
+ "scaleY", 1.0f,
+ "delay", delay,
+ "onUpdate", mUpdateListener,
+ "onComplete", mTargetUpdateListener));
}
private void stopTargetAnimation() {
@@ -524,30 +544,39 @@
}
}
- private void internalSetTargetResources(int resourceId) {
+ private ArrayList<TargetDrawable> loadDrawableArray(int resourceId) {
Resources res = getContext().getResources();
TypedArray array = res.obtainTypedArray(resourceId);
- int count = array.length();
- ArrayList<TargetDrawable> targetDrawables = new ArrayList<TargetDrawable>(count);
+ final int count = array.length();
+ ArrayList<TargetDrawable> drawables = new ArrayList<TargetDrawable>(count);
+ for (int i = 0; i < count; i++) {
+ TypedValue value = array.peekValue(i);
+ TargetDrawable target = new TargetDrawable(res, value != null ? value.resourceId : 0);
+ drawables.add(target);
+ }
+ array.recycle();
+ return drawables;
+ }
+
+ private void internalSetTargetResources(int resourceId) {
+ mTargetDrawables = loadDrawableArray(resourceId);
+ mTargetResourceId = resourceId;
+ final int count = mTargetDrawables.size();
int maxWidth = mHandleDrawable.getWidth();
int maxHeight = mHandleDrawable.getHeight();
for (int i = 0; i < count; i++) {
- TypedValue value = array.peekValue(i);
- TargetDrawable target= new TargetDrawable(res, value != null ? value.resourceId : 0);
- targetDrawables.add(target);
+ TargetDrawable target = mTargetDrawables.get(i);
maxWidth = Math.max(maxWidth, target.getWidth());
maxHeight = Math.max(maxHeight, target.getHeight());
}
- mTargetResourceId = resourceId;
- mTargetDrawables = targetDrawables;
if (mMaxTargetWidth != maxWidth || mMaxTargetHeight != maxHeight) {
mMaxTargetWidth = maxWidth;
mMaxTargetHeight = maxHeight;
requestLayout(); // required to resize layout and call updateTargetPositions()
} else {
- updateTargetPositions();
+ updateTargetPositions(mWaveCenterX, mWaveCenterY);
+ updateChevronPositions(mWaveCenterX, mWaveCenterY);
}
- array.recycle();
}
/**
@@ -645,8 +674,8 @@
stopTargetAnimation();
hideChevrons();
hideTargets(animate);
- mHandleDrawable.setX(mWaveCenterX);
- mHandleDrawable.setY(mWaveCenterY);
+ mHandleDrawable.setX(0);
+ mHandleDrawable.setY(0);
mHandleDrawable.setState(TargetDrawable.STATE_INACTIVE);
Tweener.reset();
}
@@ -677,7 +706,7 @@
case MotionEvent.ACTION_CANCEL:
if (DEBUG) Log.v(TAG, "*** CANCEL ***");
- // handleMove(event);
+ handleMove(event);
handleCancel(event);
handled = true;
break;
@@ -687,7 +716,6 @@
}
private void moveHandleTo(float x, float y, boolean animate) {
- // TODO: animate the handle based on the current state/position
mHandleDrawable.setX(x);
mHandleDrawable.setY(y);
}
@@ -707,7 +735,14 @@
private void handleCancel(MotionEvent event) {
if (DEBUG && mDragging) Log.v(TAG, "** Handle CANCEL");
- mActiveTarget = -1; // Drop the active target if canceled.
+
+ // We should drop the active target here but it interferes with
+ // moving off the screen in the direction of the navigation bar. At some point we may
+ // want to revisit how we handle this. For now we'll allow a canceled event to
+ // activate the current target.
+
+ // mActiveTarget = -1; // Drop the active target if canceled.
+
switchToState(STATE_FINISH, event.getX(), event.getY());
}
@@ -719,24 +754,25 @@
int activeTarget = -1;
final int historySize = event.getHistorySize();
+ final boolean singleTarget = mTargetDrawables.size() == 1;
+ float x = 0.0f;
+ float y = 0.0f;
for (int k = 0; k < historySize + 1; k++) {
- float x = k < historySize ? event.getHistoricalX(k) : event.getX();
- float y = k < historySize ? event.getHistoricalY(k) : event.getY();
- float tx = x - mWaveCenterX;
- float ty = y - mWaveCenterY;
+ float eventX = k < historySize ? event.getHistoricalX(k) : event.getX();
+ float eventY = k < historySize ? event.getHistoricalY(k) : event.getY();
+ // tx and ty are relative to wave center
+ float tx = eventX - mWaveCenterX;
+ float ty = eventY - mWaveCenterY;
float touchRadius = (float) Math.sqrt(dist2(tx, ty));
final float scale = touchRadius > mOuterRadius ? mOuterRadius / touchRadius : 1.0f;
- float limitX = mWaveCenterX + tx * scale;
- float limitY = mWaveCenterY + ty * scale;
+ float limitX = tx * scale;
+ float limitY = ty * scale;
- boolean singleTarget = mTargetDrawables.size() == 1;
if (singleTarget) {
// Snap to outer ring if there's only one target
float snapRadius = mOuterRadius - mSnapMargin;
if (touchRadius > snapRadius) {
activeTarget = 0;
- x = limitX;
- y = limitY;
}
} else {
// If there's more than one target, snap to the closest one less than hitRadius away.
@@ -753,34 +789,47 @@
best = dist2;
}
}
- x = limitX;
- y = limitY;
}
- if (activeTarget != -1) {
- switchToState(STATE_SNAP, x,y);
- float newX = singleTarget ? limitX : mTargetDrawables.get(activeTarget).getX();
- float newY = singleTarget ? limitY : mTargetDrawables.get(activeTarget).getY();
- moveHandleTo(newX, newY, false);
- TargetDrawable currentTarget = mTargetDrawables.get(activeTarget);
- if (currentTarget.hasState(TargetDrawable.STATE_FOCUSED)) {
- currentTarget.setState(TargetDrawable.STATE_FOCUSED);
- mHandleDrawable.setAlpha(0.0f);
- }
- } else {
- switchToState(STATE_TRACKING, x, y);
- moveHandleTo(x, y, false);
- mHandleDrawable.setAlpha(1.0f);
- }
+ x = limitX;
+ y = limitY;
+ }
+
+ if (activeTarget != -1) {
+ switchToState(STATE_SNAP, x,y);
+ TargetDrawable target = mTargetDrawables.get(activeTarget);
+ float newX = singleTarget ? x : target.getX();
+ float newY = singleTarget ? y : target.getY();
+ moveHandleTo(newX, newY, false);
+ } else {
+ switchToState(STATE_TRACKING, x, y);
+ moveHandleTo(x, y, false);
+ mHandleDrawable.setAlpha(1.0f);
}
// Draw handle outside parent's bounds
invalidateGlobalRegion(mHandleDrawable);
- if (mActiveTarget != activeTarget && activeTarget != -1) {
- dispatchGrabbedEvent(activeTarget);
- if (AccessibilityManager.getInstance(mContext).isEnabled()) {
- String targetContentDescription = getTargetDescription(activeTarget);
- announceText(targetContentDescription);
+ if (mActiveTarget != activeTarget) {
+ // Defocus the old target
+ if (mActiveTarget != -1) {
+ TargetDrawable target = mTargetDrawables.get(mActiveTarget);
+ if (target.hasState(TargetDrawable.STATE_FOCUSED)) {
+ target.setState(TargetDrawable.STATE_INACTIVE);
+ mHandleDrawable.setAlpha(1.0f);
+ }
+ }
+ // Focus the new target
+ if (activeTarget != -1) {
+ TargetDrawable target = mTargetDrawables.get(activeTarget);
+ if (target.hasState(TargetDrawable.STATE_FOCUSED)) {
+ target.setState(TargetDrawable.STATE_FOCUSED);
+ mHandleDrawable.setAlpha(0.0f);
+ }
+ dispatchGrabbedEvent(activeTarget);
+ if (AccessibilityManager.getInstance(mContext).isEnabled()) {
+ String targetContentDescription = getTargetDescription(activeTarget);
+ announceText(targetContentDescription);
+ }
}
}
mActiveTarget = activeTarget;
@@ -831,21 +880,21 @@
private boolean trySwitchToFirstTouchState(MotionEvent event) {
final float x = event.getX();
final float y = event.getY();
- final float dx = x - mWaveCenterX;
- final float dy = y - mWaveCenterY;
- if (mAlwaysTrackFinger || dist2(dx,dy) <= getScaledTapRadiusSquared()) {
+ final float tx = x - mWaveCenterX;
+ final float ty = y - mWaveCenterY;
+ if (mAlwaysTrackFinger || dist2(tx,ty) <= getScaledTapRadiusSquared()) {
if (DEBUG) Log.v(TAG, "** Handle HIT");
switchToState(STATE_FIRST_TOUCH, x, y);
- moveHandleTo(x, y, false);
+ moveHandleTo(tx, ty, false);
mDragging = true;
return true;
}
return false;
}
- private void performInitialLayout(float centerX, float centerY) {
+ private void assignDefaultsIfNeeded(float centerX, float centerY) {
if (mOuterRadius == 0.0f) {
- mOuterRadius = 0.5f*(float) Math.sqrt(dist2(centerX, centerY));
+ mOuterRadius = 0.5f*(float) Math.hypot(centerX, centerY);
}
if (mHitRadius == 0.0f) {
// Use the radius of inscribed circle of the first target.
@@ -855,12 +904,9 @@
mSnapMargin = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP,
SNAP_MARGIN_DEFAULT, getContext().getResources().getDisplayMetrics());
}
- hideChevrons();
- hideTargets(false);
- moveHandleTo(centerX, centerY, false);
}
- private void setupGravity(int dx, int dy) {
+ private void computeInsets(int dx, int dy) {
final int layoutDirection = getResolvedLayoutDirection();
final int absoluteGravity = Gravity.getAbsoluteGravity(mGravity, layoutDirection);
@@ -899,29 +945,49 @@
+ Math.max(width, mMaxTargetWidth + mOuterRing.getWidth()) / 2;
float newWaveCenterY = mVerticalOffset + mVerticalInset
+ Math.max(height, + mMaxTargetHeight + mOuterRing.getHeight()) / 2;
- if (newWaveCenterX != mWaveCenterX || newWaveCenterY != mWaveCenterY) {
- if (mWaveCenterX == 0 && mWaveCenterY == 0) {
- performInitialLayout(newWaveCenterX, newWaveCenterY);
- }
- mWaveCenterX = newWaveCenterX;
- mWaveCenterY = newWaveCenterY;
- mOuterRing.setX(mWaveCenterX);
- mOuterRing.setY(Math.max(mWaveCenterY, mWaveCenterY));
+ assignDefaultsIfNeeded(newWaveCenterX, newWaveCenterY);
+
+ if (mInitialLayout) {
+ hideChevrons();
+ hideTargets(false);
+ moveHandleTo(0, 0, false);
+ mInitialLayout = false;
}
- updateTargetPositions();
+
+ mOuterRing.setPositionX(newWaveCenterX);
+ mOuterRing.setPositionY(newWaveCenterY);
+
+ mHandleDrawable.setPositionX(newWaveCenterX);
+ mHandleDrawable.setPositionY(newWaveCenterY);
+
+ updateTargetPositions(newWaveCenterX, newWaveCenterY);
+ updateChevronPositions(newWaveCenterX, newWaveCenterY);
+
+ mWaveCenterX = newWaveCenterX;
+ mWaveCenterY = newWaveCenterY;
+
if (DEBUG) dump();
}
- private void updateTargetPositions() {
+ private void updateTargetPositions(float centerX, float centerY) {
// Reposition the target drawables if the view changed.
for (int i = 0; i < mTargetDrawables.size(); i++) {
final TargetDrawable targetIcon = mTargetDrawables.get(i);
double angle = -2.0f * Math.PI * i / mTargetDrawables.size();
- float xPosition = mWaveCenterX + mOuterRadius * (float) Math.cos(angle);
- float yPosition = mWaveCenterY + mOuterRadius * (float) Math.sin(angle);
- targetIcon.setX(xPosition);
- targetIcon.setY(yPosition);
+ targetIcon.setPositionX(centerX);
+ targetIcon.setPositionY(centerY);
+ targetIcon.setX(mOuterRadius * (float) Math.cos(angle));
+ targetIcon.setY(mOuterRadius * (float) Math.sin(angle));
+ }
+ }
+
+ private void updateChevronPositions(float centerX, float centerY) {
+ for (TargetDrawable target : mChevronDrawables) {
+ if (target != null) {
+ target.setPositionX(centerX);
+ target.setPositionY(centerY);
+ }
}
}
diff --git a/core/java/com/android/internal/widget/multiwaveview/TargetDrawable.java b/core/java/com/android/internal/widget/multiwaveview/TargetDrawable.java
index ec2c945..6392093 100644
--- a/core/java/com/android/internal/widget/multiwaveview/TargetDrawable.java
+++ b/core/java/com/android/internal/widget/multiwaveview/TargetDrawable.java
@@ -32,10 +32,13 @@
public static final int[] STATE_INACTIVE =
{ android.R.attr.state_enabled, -android.R.attr.state_active };
public static final int[] STATE_FOCUSED =
- { android.R.attr.state_enabled, android.R.attr.state_focused };
+ { android.R.attr.state_enabled, -android.R.attr.state_active,
+ android.R.attr.state_focused };
private float mTranslationX = 0.0f;
private float mTranslationY = 0.0f;
+ private float mPositionX = 0.0f;
+ private float mPositionY = 0.0f;
private float mScaleX = 1.0f;
private float mScaleY = 1.0f;
private float mAlpha = 1.0f;
@@ -82,6 +85,14 @@
setState(STATE_INACTIVE);
}
+ public TargetDrawable(TargetDrawable other) {
+ mResourceId = other.mResourceId;
+ // Mutate the drawable so we can animate shared drawable properties.
+ mDrawable = other.mDrawable != null ? other.mDrawable.mutate() : null;
+ resizeDrawables();
+ setState(STATE_INACTIVE);
+ }
+
public void setState(int [] state) {
if (mDrawable instanceof StateListDrawable) {
StateListDrawable d = (StateListDrawable) mDrawable;
@@ -196,6 +207,22 @@
return mAlpha;
}
+ public void setPositionX(float x) {
+ mPositionX = x;
+ }
+
+ public void setPositionY(float y) {
+ mPositionY = y;
+ }
+
+ public float getPositionX() {
+ return mPositionX;
+ }
+
+ public float getPositionY() {
+ return mPositionY;
+ }
+
public int getWidth() {
return mDrawable != null ? mDrawable.getIntrinsicWidth() : 0;
}
@@ -209,8 +236,8 @@
return;
}
canvas.save(Canvas.MATRIX_SAVE_FLAG);
- canvas.translate(mTranslationX, mTranslationY);
- canvas.scale(mScaleX, mScaleY);
+ canvas.scale(mScaleX, mScaleY, mPositionX, mPositionY);
+ canvas.translate(mTranslationX + mPositionX, mTranslationY + mPositionY);
canvas.translate(-0.5f * getWidth(), -0.5f * getHeight());
mDrawable.setAlpha((int) Math.round(mAlpha * 255f));
mDrawable.draw(canvas);
diff --git a/core/java/com/google/android/mms/pdu/PduPersister.java b/core/java/com/google/android/mms/pdu/PduPersister.java
index 1a8e80f..ee285aa 100644
--- a/core/java/com/google/android/mms/pdu/PduPersister.java
+++ b/core/java/com/google/android/mms/pdu/PduPersister.java
@@ -1058,9 +1058,10 @@
}
}
}
-
- long threadId = Threads.getOrCreateThreadId(mContext, recipients);
- values.put(Mms.THREAD_ID, threadId);
+ if (!recipients.isEmpty()) {
+ long threadId = Threads.getOrCreateThreadId(mContext, recipients);
+ values.put(Mms.THREAD_ID, threadId);
+ }
SqliteWrapper.update(mContext, mContentResolver, uri, values, null, null);
}
@@ -1299,7 +1300,6 @@
}
HashSet<String> recipients = new HashSet<String>();
- long threadId = DUMMY_THREAD_ID;
int msgType = pdu.getMessageType();
// Here we only allocate thread ID for M-Notification.ind,
// M-Retrieve.conf and M-Send.req.
@@ -1326,9 +1326,11 @@
}
}
}
- threadId = Threads.getOrCreateThreadId(mContext, recipients);
+ if (!recipients.isEmpty()) {
+ long threadId = Threads.getOrCreateThreadId(mContext, recipients);
+ values.put(Mms.THREAD_ID, threadId);
+ }
}
- values.put(Mms.THREAD_ID, threadId);
// Save parts first to avoid inconsistent message is loaded
// while saving the parts.
diff --git a/core/jni/Android.mk b/core/jni/Android.mk
index cd0959b..c24f6c6 100644
--- a/core/jni/Android.mk
+++ b/core/jni/Android.mk
@@ -66,7 +66,6 @@
android_os_MessageQueue.cpp \
android_os_ParcelFileDescriptor.cpp \
android_os_Parcel.cpp \
- android_os_Power.cpp \
android_os_StatFs.cpp \
android_os_SystemClock.cpp \
android_os_SystemProperties.cpp \
@@ -217,8 +216,7 @@
libjpeg \
libusbhost \
libharfbuzz \
- libz \
- libsuspend \
+ libz
ifeq ($(USE_OPENGL_RENDERER),true)
LOCAL_SHARED_LIBRARIES += libhwui
diff --git a/core/jni/AndroidRuntime.cpp b/core/jni/AndroidRuntime.cpp
index b877071..241a905 100644
--- a/core/jni/AndroidRuntime.cpp
+++ b/core/jni/AndroidRuntime.cpp
@@ -133,7 +133,6 @@
extern int register_android_os_MessageQueue(JNIEnv* env);
extern int register_android_os_Parcel(JNIEnv* env);
extern int register_android_os_ParcelFileDescriptor(JNIEnv *env);
-extern int register_android_os_Power(JNIEnv *env);
extern int register_android_os_StatFs(JNIEnv *env);
extern int register_android_os_SystemProperties(JNIEnv *env);
extern int register_android_os_SystemClock(JNIEnv* env);
@@ -1147,7 +1146,6 @@
REG_JNI(register_android_os_FileUtils),
REG_JNI(register_android_os_MessageQueue),
REG_JNI(register_android_os_ParcelFileDescriptor),
- REG_JNI(register_android_os_Power),
REG_JNI(register_android_os_StatFs),
REG_JNI(register_android_os_Trace),
REG_JNI(register_android_os_UEventObserver),
diff --git a/core/jni/android_os_Parcel.cpp b/core/jni/android_os_Parcel.cpp
index 3dfaac3..858ec79 100644
--- a/core/jni/android_os_Parcel.cpp
+++ b/core/jni/android_os_Parcel.cpp
@@ -61,7 +61,10 @@
static struct parcel_offsets_t
{
+ jclass clazz;
jfieldID mNativePtr;
+ jmethodID obtain;
+ jmethodID recycle;
} gParcelOffsets;
Parcel* parcelForJavaObject(JNIEnv* env, jobject obj)
@@ -76,6 +79,16 @@
return NULL;
}
+jobject createJavaParcelObject(JNIEnv* env)
+{
+ return env->CallStaticObjectMethod(gParcelOffsets.clazz, gParcelOffsets.obtain);
+}
+
+void recycleJavaParcelObject(JNIEnv* env, jobject parcelObj)
+{
+ env->CallVoidMethod(parcelObj, gParcelOffsets.recycle);
+}
+
static jint android_os_Parcel_dataSize(JNIEnv* env, jclass clazz, jint nativePtr)
{
Parcel* parcel = reinterpret_cast<Parcel*>(nativePtr);
@@ -665,8 +678,11 @@
clazz = env->FindClass(kParcelPathName);
LOG_FATAL_IF(clazz == NULL, "Unable to find class android.os.Parcel");
- gParcelOffsets.mNativePtr
- = env->GetFieldID(clazz, "mNativePtr", "I");
+ gParcelOffsets.clazz = (jclass) env->NewGlobalRef(clazz);
+ gParcelOffsets.mNativePtr = env->GetFieldID(clazz, "mNativePtr", "I");
+ gParcelOffsets.obtain = env->GetStaticMethodID(clazz, "obtain",
+ "()Landroid/os/Parcel;");
+ gParcelOffsets.recycle = env->GetMethodID(clazz, "recycle", "()V");
return AndroidRuntime::registerNativeMethods(
env, kParcelPathName,
diff --git a/core/jni/android_os_Parcel.h b/core/jni/android_os_Parcel.h
index 65f3819e..1db523a 100644
--- a/core/jni/android_os_Parcel.h
+++ b/core/jni/android_os_Parcel.h
@@ -23,5 +23,7 @@
// Conversion from Java Parcel Object to C++ Parcel instance.
// Note: does not type checking; must guarantee jobject is a Java Parcel
extern Parcel* parcelForJavaObject(JNIEnv* env, jobject obj);
+extern jobject createJavaParcelObject(JNIEnv* env);
+extern void recycleJavaParcelObject(JNIEnv* env, jobject object);
}
diff --git a/core/jni/android_os_Power.cpp b/core/jni/android_os_Power.cpp
deleted file mode 100644
index 373abd4..0000000
--- a/core/jni/android_os_Power.cpp
+++ /dev/null
@@ -1,136 +0,0 @@
-/* //device/libs/android_runtime/android_os_Power.cpp
-**
-** 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.
-*/
-
-#define LOG_TAG "Power-JNI"
-
-#include "JNIHelp.h"
-#include "jni.h"
-#include "android_runtime/AndroidRuntime.h"
-#include <utils/misc.h>
-#include <hardware/power.h>
-#include <hardware_legacy/power.h>
-#include <cutils/android_reboot.h>
-#include <suspend/autosuspend.h>
-
-static struct power_module *sPowerModule;
-
-namespace android
-{
-
-static void
-acquireWakeLock(JNIEnv *env, jobject clazz, jint lock, jstring idObj)
-{
- if (idObj == NULL) {
- jniThrowNullPointerException(env, "id is null");
- return ;
- }
-
- const char *id = env->GetStringUTFChars(idObj, NULL);
-
- acquire_wake_lock(lock, id);
-
- env->ReleaseStringUTFChars(idObj, id);
-}
-
-static void
-releaseWakeLock(JNIEnv *env, jobject clazz, jstring idObj)
-{
- if (idObj == NULL) {
- jniThrowNullPointerException(env, "id is null");
- return ;
- }
-
- const char *id = env->GetStringUTFChars(idObj, NULL);
-
- release_wake_lock(id);
-
- env->ReleaseStringUTFChars(idObj, id);
-
-}
-
-static int
-setLastUserActivityTimeout(JNIEnv *env, jobject clazz, jlong timeMS)
-{
- return set_last_user_activity_timeout(timeMS/1000);
-}
-
-static int
-setScreenState(JNIEnv *env, jobject clazz, jboolean on)
-{
- if (on) {
- autosuspend_disable();
- if (sPowerModule) {
- sPowerModule->setInteractive(sPowerModule, true);
- }
- } else {
- if (sPowerModule) {
- sPowerModule->setInteractive(sPowerModule, false);
- }
- autosuspend_enable();
- }
-
- return 0;
-}
-
-static void android_os_Power_shutdown(JNIEnv *env, jobject clazz)
-{
- android_reboot(ANDROID_RB_POWEROFF, 0, 0);
-}
-
-static void android_os_Power_reboot(JNIEnv *env, jobject clazz, jstring reason)
-{
- if (reason == NULL) {
- android_reboot(ANDROID_RB_RESTART, 0, 0);
- } else {
- const char *chars = env->GetStringUTFChars(reason, NULL);
- android_reboot(ANDROID_RB_RESTART2, 0, (char *) chars);
- env->ReleaseStringUTFChars(reason, chars); // In case it fails.
- }
- jniThrowIOException(env, errno);
-}
-
-static int android_os_Power_init(JNIEnv *env, jobject clazz)
-{
- status_t err = hw_get_module(POWER_HARDWARE_MODULE_ID,
- (hw_module_t const**)&sPowerModule);
- ALOGE_IF(err, "couldn't load %s module (%s)",
- POWER_HARDWARE_MODULE_ID, strerror(-err));
-
- if (!err)
- sPowerModule->init(sPowerModule);
-
- return err;
-}
-
-static JNINativeMethod method_table[] = {
- { "acquireWakeLock", "(ILjava/lang/String;)V", (void*)acquireWakeLock },
- { "releaseWakeLock", "(Ljava/lang/String;)V", (void*)releaseWakeLock },
- { "setLastUserActivityTimeout", "(J)I", (void*)setLastUserActivityTimeout },
- { "setScreenState", "(Z)I", (void*)setScreenState },
- { "shutdown", "()V", (void*)android_os_Power_shutdown },
- { "powerInitNative", "()I", (void*)android_os_Power_init },
- { "rebootNative", "(Ljava/lang/String;)V", (void*)android_os_Power_reboot },
-};
-
-int register_android_os_Power(JNIEnv *env)
-{
- return AndroidRuntime::registerNativeMethods(
- env, "android/os/Power",
- method_table, NELEM(method_table));
-}
-
-};
diff --git a/core/jni/android_view_Surface.cpp b/core/jni/android_view_Surface.cpp
index 8c4c42ab..5739cbe 100644
--- a/core/jni/android_view_Surface.cpp
+++ b/core/jni/android_view_Surface.cpp
@@ -345,32 +345,6 @@
}
}
-static void Surface_setActiveRect(JNIEnv* env, jobject thiz, jobject activeRect)
-{
- const sp<Surface>& surface(getSurface(env, thiz));
- if (!Surface::isValid(surface)) {
- doThrowIAE(env);
- return;
- }
-
- android_native_rect_t nativeRect;
- if (activeRect) {
- nativeRect.left = env->GetIntField(activeRect, ro.l);
- nativeRect.top = env->GetIntField(activeRect, ro.t);
- nativeRect.right = env->GetIntField(activeRect, ro.r);
- nativeRect.bottom= env->GetIntField(activeRect, ro.b);
- } else {
- doThrowIAE(env, "activeRect may not be null");
- return;
- }
-
- int err = native_window_set_active_rect(surface.get(), &nativeRect);
- if (err != NO_ERROR) {
- doThrowRE(env, String8::format(
- "Surface::setActiveRect returned an error: %d", err).string());
- }
-}
-
static jobject Surface_lockCanvas(JNIEnv* env, jobject clazz, jobject dirtyRect)
{
const sp<Surface>& surface(getSurface(env, clazz));
@@ -773,6 +747,28 @@
}
}
+static void Surface_setWindowCrop(JNIEnv* env, jobject thiz, jobject crop)
+{
+ const sp<SurfaceControl>& surface(getSurfaceControl(env, thiz));
+ if (surface == 0) return;
+
+ Rect nativeCrop;
+ if (crop) {
+ nativeCrop.left = env->GetIntField(crop, ro.l);
+ nativeCrop.top = env->GetIntField(crop, ro.t);
+ nativeCrop.right = env->GetIntField(crop, ro.r);
+ nativeCrop.bottom= env->GetIntField(crop, ro.b);
+ } else {
+ nativeCrop.left = nativeCrop.top = nativeCrop.right =
+ nativeCrop.bottom = 0;
+ }
+
+ status_t err = surface->setCrop(nativeCrop);
+ if (err<0 && err!=NO_INIT) {
+ doThrowIAE(env);
+ }
+}
+
// ----------------------------------------------------------------------------
static void Surface_copyFrom(
@@ -915,7 +911,7 @@
{"readFromParcel", "(Landroid/os/Parcel;)V", (void*)Surface_readFromParcel },
{"writeToParcel", "(Landroid/os/Parcel;I)V", (void*)Surface_writeToParcel },
{"isConsumerRunningBehind", "()Z", (void*)Surface_isConsumerRunningBehind },
- {"setActiveRect", "(Landroid/graphics/Rect;)V", (void*)Surface_setActiveRect },
+ {"setWindowCrop", "(Landroid/graphics/Rect;)V", (void*)Surface_setWindowCrop },
};
void nativeClassInit(JNIEnv* env, jclass clazz)
diff --git a/core/jni/android_view_VelocityTracker.cpp b/core/jni/android_view_VelocityTracker.cpp
index 668d3bb..04d1056 100644
--- a/core/jni/android_view_VelocityTracker.cpp
+++ b/core/jni/android_view_VelocityTracker.cpp
@@ -21,6 +21,7 @@
#include <android_runtime/AndroidRuntime.h>
#include <utils/Log.h>
#include <androidfw/Input.h>
+#include <androidfw/VelocityTracker.h>
#include "android_view_MotionEvent.h"
diff --git a/core/res/res/animator/fragment_close_enter.xml b/core/res/res/animator/fragment_close_enter.xml
index c0abbc5..0b2e2cf 100644
--- a/core/res/res/animator/fragment_close_enter.xml
+++ b/core/res/res/animator/fragment_close_enter.xml
@@ -16,24 +16,11 @@
** limitations under the License.
*/
-->
-<set xmlns:android="http://schemas.android.com/apk/res/android"
- android:zAdjustment="normal">
- <objectAnimator
- android:interpolator="@interpolator/decelerate_quint"
- android:valueFrom="0.975" android:valueTo="1.0"
- android:valueType="floatType"
- android:propertyName="scaleY"
- android:duration="@android:integer/config_activityDefaultDur"/>
- <objectAnimator
- android:interpolator="@interpolator/decelerate_quint"
- android:valueFrom="0.975" android:valueTo="1.0"
- android:valueType="floatType"
- android:propertyName="scaleX"
- android:duration="@android:integer/config_activityDefaultDur"/>
- <objectAnimator
- android:interpolator="@interpolator/decelerate_cubic"
+<set xmlns:android="http://schemas.android.com/apk/res/android" android:zAdjustment="normal">
+ <objectAnimator
+ android:interpolator="@interpolator/decelerate_quad"
android:valueFrom="0.0" android:valueTo="1.0"
android:valueType="floatType"
android:propertyName="alpha"
- android:duration="@android:integer/config_activityDefaultDur"/>
+ android:duration="300"/>
</set>
\ No newline at end of file
diff --git a/core/res/res/animator/fragment_close_exit.xml b/core/res/res/animator/fragment_close_exit.xml
index 9a5708c..e0ab607 100644
--- a/core/res/res/animator/fragment_close_exit.xml
+++ b/core/res/res/animator/fragment_close_exit.xml
@@ -16,24 +16,23 @@
** limitations under the License.
*/
-->
-<set xmlns:android="http://schemas.android.com/apk/res/android"
- android:zAdjustment="top">
- <objectAnimator
- android:interpolator="@interpolator/decelerate_quint"
- android:valueFrom="1.0" android:valueTo="1.075"
+<set xmlns:android="http://schemas.android.com/apk/res/android" android:zAdjustment="top">
+ <objectAnimator
+ android:interpolator="@interpolator/decelerate_quad"
+ android:valueFrom="1.0" android:valueTo="0.8"
android:valueType="floatType"
android:propertyName="scaleY"
- android:duration="@android:integer/config_activityDefaultDur"/>
+ android:duration="300"/>
<objectAnimator
- android:interpolator="@interpolator/decelerate_quint"
- android:valueFrom="1.0" android:valueTo="1.075"
+ android:interpolator="@interpolator/decelerate_quad"
+ android:valueFrom="1.0" android:valueTo="0.8"
android:valueType="floatType"
android:propertyName="scaleX"
- android:duration="@android:integer/config_activityDefaultDur"/>
+ android:duration="300"/>
<objectAnimator
- android:interpolator="@interpolator/decelerate_cubic"
+ android:interpolator="@interpolator/decelerate_quad"
android:valueFrom="1.0" android:valueTo="0.0"
android:valueType="floatType"
android:propertyName="alpha"
- android:duration="@android:integer/config_activityDefaultDur"/>
+ android:duration="300"/>
</set>
\ No newline at end of file
diff --git a/core/res/res/animator/fragment_open_enter.xml b/core/res/res/animator/fragment_open_enter.xml
index 6b16cb4..8cd0e4e 100644
--- a/core/res/res/animator/fragment_open_enter.xml
+++ b/core/res/res/animator/fragment_open_enter.xml
@@ -17,22 +17,22 @@
*/
-->
<set xmlns:android="http://schemas.android.com/apk/res/android">
- <objectAnimator
- android:interpolator="@interpolator/decelerate_quint"
- android:valueFrom="1.125" android:valueTo="1.0"
+ <objectAnimator
+ android:interpolator="@interpolator/decelerate_cubic"
+ android:valueFrom="0.8" android:valueTo="1.0"
android:valueType="floatType"
android:propertyName="scaleY"
- android:duration="@android:integer/config_activityDefaultDur"/>
+ android:duration="300"/>
<objectAnimator
- android:interpolator="@interpolator/decelerate_quint"
- android:valueFrom="1.125" android:valueTo="1.0"
+ android:interpolator="@interpolator/decelerate_cubic"
+ android:valueFrom="0.8" android:valueTo="1.0"
android:valueType="floatType"
android:propertyName="scaleX"
- android:duration="@android:integer/config_activityDefaultDur"/>
+ android:duration="300"/>
<objectAnimator
android:interpolator="@interpolator/decelerate_cubic"
android:valueFrom="0.0" android:valueTo="1.0"
android:valueType="floatType"
android:propertyName="alpha"
- android:duration="@android:integer/config_activityDefaultDur"/>
+ android:duration="300"/>
</set>
\ No newline at end of file
diff --git a/core/res/res/animator/fragment_open_exit.xml b/core/res/res/animator/fragment_open_exit.xml
index d77ee8e..1b505fe 100644
--- a/core/res/res/animator/fragment_open_exit.xml
+++ b/core/res/res/animator/fragment_open_exit.xml
@@ -17,22 +17,10 @@
*/
-->
<set xmlns:android="http://schemas.android.com/apk/res/android">
- <objectAnimator
- android:interpolator="@interpolator/linear"
- android:valueFrom="1.0" android:valueTo="0.975"
- android:valueType="floatType"
- android:propertyName="scaleY"
- android:duration="@android:integer/config_activityDefaultDur"/>
- <objectAnimator
- android:interpolator="@interpolator/linear"
- android:valueFrom="1.0" android:valueTo="0.975"
- android:valueType="floatType"
- android:propertyName="scaleX"
- android:duration="@android:integer/config_activityDefaultDur"/>
- <objectAnimator
+ <objectAnimator
android:interpolator="@interpolator/decelerate_cubic"
android:valueFrom="1.0" android:valueTo="0.0"
android:valueType="floatType"
android:propertyName="alpha"
- android:duration="@android:integer/config_activityDefaultDur"/>
+ android:duration="300"/>
</set>
\ No newline at end of file
diff --git a/core/res/res/drawable-hdpi/progress_bg_holo_dark.9.png b/core/res/res/drawable-hdpi/progress_bg_holo_dark.9.png
index 310c368..877fd2b 100644
--- a/core/res/res/drawable-hdpi/progress_bg_holo_dark.9.png
+++ b/core/res/res/drawable-hdpi/progress_bg_holo_dark.9.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/progress_bg_holo_light.9.png b/core/res/res/drawable-hdpi/progress_bg_holo_light.9.png
index 70cb7fc..3f12166 100644
--- a/core/res/res/drawable-hdpi/progress_bg_holo_light.9.png
+++ b/core/res/res/drawable-hdpi/progress_bg_holo_light.9.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/progress_primary_holo_dark.9.png b/core/res/res/drawable-hdpi/progress_primary_holo_dark.9.png
index 1c26920..b73abba 100644
--- a/core/res/res/drawable-hdpi/progress_primary_holo_dark.9.png
+++ b/core/res/res/drawable-hdpi/progress_primary_holo_dark.9.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/progress_primary_holo_light.9.png b/core/res/res/drawable-hdpi/progress_primary_holo_light.9.png
index 1c26920..2f76a22 100644
--- a/core/res/res/drawable-hdpi/progress_primary_holo_light.9.png
+++ b/core/res/res/drawable-hdpi/progress_primary_holo_light.9.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/progress_secondary_holo_dark.9.png b/core/res/res/drawable-hdpi/progress_secondary_holo_dark.9.png
index 40d0d16..a75d0dd 100644
--- a/core/res/res/drawable-hdpi/progress_secondary_holo_dark.9.png
+++ b/core/res/res/drawable-hdpi/progress_secondary_holo_dark.9.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/progress_secondary_holo_light.9.png b/core/res/res/drawable-hdpi/progress_secondary_holo_light.9.png
index 40d0d16..955b708 100644
--- a/core/res/res/drawable-hdpi/progress_secondary_holo_light.9.png
+++ b/core/res/res/drawable-hdpi/progress_secondary_holo_light.9.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/scrubber_control_disabled_holo.png b/core/res/res/drawable-hdpi/scrubber_control_disabled_holo.png
index 167d7d3..370242a 100644
--- a/core/res/res/drawable-hdpi/scrubber_control_disabled_holo.png
+++ b/core/res/res/drawable-hdpi/scrubber_control_disabled_holo.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/scrubber_control_focused_holo.png b/core/res/res/drawable-hdpi/scrubber_control_focused_holo.png
index 4048260..eea2c3e 100644
--- a/core/res/res/drawable-hdpi/scrubber_control_focused_holo.png
+++ b/core/res/res/drawable-hdpi/scrubber_control_focused_holo.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/scrubber_control_normal_holo.png b/core/res/res/drawable-hdpi/scrubber_control_normal_holo.png
index 90e9c9c..3c98ee9 100644
--- a/core/res/res/drawable-hdpi/scrubber_control_normal_holo.png
+++ b/core/res/res/drawable-hdpi/scrubber_control_normal_holo.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/scrubber_control_pressed_holo.png b/core/res/res/drawable-hdpi/scrubber_control_pressed_holo.png
index 4a3e57c..4dc8999 100644
--- a/core/res/res/drawable-hdpi/scrubber_control_pressed_holo.png
+++ b/core/res/res/drawable-hdpi/scrubber_control_pressed_holo.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/scrubber_primary_holo.9.png b/core/res/res/drawable-hdpi/scrubber_primary_holo.9.png
index 0d13f71..260a0a5 100644
--- a/core/res/res/drawable-hdpi/scrubber_primary_holo.9.png
+++ b/core/res/res/drawable-hdpi/scrubber_primary_holo.9.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/scrubber_secondary_holo.9.png b/core/res/res/drawable-hdpi/scrubber_secondary_holo.9.png
index b39d831..09f2d58 100644
--- a/core/res/res/drawable-hdpi/scrubber_secondary_holo.9.png
+++ b/core/res/res/drawable-hdpi/scrubber_secondary_holo.9.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/scrubber_track_holo_dark.9.png b/core/res/res/drawable-hdpi/scrubber_track_holo_dark.9.png
index c997bf0..0c0ccda 100644
--- a/core/res/res/drawable-hdpi/scrubber_track_holo_dark.9.png
+++ b/core/res/res/drawable-hdpi/scrubber_track_holo_dark.9.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/scrubber_track_holo_light.9.png b/core/res/res/drawable-hdpi/scrubber_track_holo_light.9.png
index b2a22dc..90528b1 100644
--- a/core/res/res/drawable-hdpi/scrubber_track_holo_light.9.png
+++ b/core/res/res/drawable-hdpi/scrubber_track_holo_light.9.png
Binary files differ
diff --git a/core/res/res/drawable-hdpi/stat_sys_adb.png b/core/res/res/drawable-hdpi/stat_sys_adb.png
index e7e1d8d..cfbbd8d 100644
--- a/core/res/res/drawable-hdpi/stat_sys_adb.png
+++ b/core/res/res/drawable-hdpi/stat_sys_adb.png
Binary files differ
diff --git a/core/res/res/drawable-ldpi/stat_sys_adb.png b/core/res/res/drawable-ldpi/stat_sys_adb.png
index 86b945b..0171adb 100644
--- a/core/res/res/drawable-ldpi/stat_sys_adb.png
+++ b/core/res/res/drawable-ldpi/stat_sys_adb.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/progress_bg_holo_dark.9.png b/core/res/res/drawable-mdpi/progress_bg_holo_dark.9.png
index 3d946e5..155e546 100644
--- a/core/res/res/drawable-mdpi/progress_bg_holo_dark.9.png
+++ b/core/res/res/drawable-mdpi/progress_bg_holo_dark.9.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/progress_bg_holo_light.9.png b/core/res/res/drawable-mdpi/progress_bg_holo_light.9.png
index 4bb22f0..780b4b2 100644
--- a/core/res/res/drawable-mdpi/progress_bg_holo_light.9.png
+++ b/core/res/res/drawable-mdpi/progress_bg_holo_light.9.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/progress_primary_holo_dark.9.png b/core/res/res/drawable-mdpi/progress_primary_holo_dark.9.png
index ab8ec69..b86f4b5 100644
--- a/core/res/res/drawable-mdpi/progress_primary_holo_dark.9.png
+++ b/core/res/res/drawable-mdpi/progress_primary_holo_dark.9.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/progress_primary_holo_light.9.png b/core/res/res/drawable-mdpi/progress_primary_holo_light.9.png
index ab8ec69..6fb9445 100644
--- a/core/res/res/drawable-mdpi/progress_primary_holo_light.9.png
+++ b/core/res/res/drawable-mdpi/progress_primary_holo_light.9.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/progress_secondary_holo_dark.9.png b/core/res/res/drawable-mdpi/progress_secondary_holo_dark.9.png
index 7274274..5651a7a 100644
--- a/core/res/res/drawable-mdpi/progress_secondary_holo_dark.9.png
+++ b/core/res/res/drawable-mdpi/progress_secondary_holo_dark.9.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/progress_secondary_holo_light.9.png b/core/res/res/drawable-mdpi/progress_secondary_holo_light.9.png
index 7274274..9104cf9 100644
--- a/core/res/res/drawable-mdpi/progress_secondary_holo_light.9.png
+++ b/core/res/res/drawable-mdpi/progress_secondary_holo_light.9.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/scrubber_control_disabled_holo.png b/core/res/res/drawable-mdpi/scrubber_control_disabled_holo.png
index 351d539..630a450 100644
--- a/core/res/res/drawable-mdpi/scrubber_control_disabled_holo.png
+++ b/core/res/res/drawable-mdpi/scrubber_control_disabled_holo.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/scrubber_control_focused_holo.png b/core/res/res/drawable-mdpi/scrubber_control_focused_holo.png
index e6072ee..c9e4796 100644
--- a/core/res/res/drawable-mdpi/scrubber_control_focused_holo.png
+++ b/core/res/res/drawable-mdpi/scrubber_control_focused_holo.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/scrubber_control_normal_holo.png b/core/res/res/drawable-mdpi/scrubber_control_normal_holo.png
index 79682c1..fb96f4b 100644
--- a/core/res/res/drawable-mdpi/scrubber_control_normal_holo.png
+++ b/core/res/res/drawable-mdpi/scrubber_control_normal_holo.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/scrubber_control_pressed_holo.png b/core/res/res/drawable-mdpi/scrubber_control_pressed_holo.png
index ba53c0b..30e18cd 100644
--- a/core/res/res/drawable-mdpi/scrubber_control_pressed_holo.png
+++ b/core/res/res/drawable-mdpi/scrubber_control_pressed_holo.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/scrubber_primary_holo.9.png b/core/res/res/drawable-mdpi/scrubber_primary_holo.9.png
index 7cbf2f2..a7910d6 100644
--- a/core/res/res/drawable-mdpi/scrubber_primary_holo.9.png
+++ b/core/res/res/drawable-mdpi/scrubber_primary_holo.9.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/scrubber_secondary_holo.9.png b/core/res/res/drawable-mdpi/scrubber_secondary_holo.9.png
index 81772a8..985b62e 100644
--- a/core/res/res/drawable-mdpi/scrubber_secondary_holo.9.png
+++ b/core/res/res/drawable-mdpi/scrubber_secondary_holo.9.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/scrubber_track_holo_dark.9.png b/core/res/res/drawable-mdpi/scrubber_track_holo_dark.9.png
index b8037a3..b91a4ee 100644
--- a/core/res/res/drawable-mdpi/scrubber_track_holo_dark.9.png
+++ b/core/res/res/drawable-mdpi/scrubber_track_holo_dark.9.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/scrubber_track_holo_light.9.png b/core/res/res/drawable-mdpi/scrubber_track_holo_light.9.png
index 76df16f..359ae4a 100644
--- a/core/res/res/drawable-mdpi/scrubber_track_holo_light.9.png
+++ b/core/res/res/drawable-mdpi/scrubber_track_holo_light.9.png
Binary files differ
diff --git a/core/res/res/drawable-mdpi/stat_sys_adb.png b/core/res/res/drawable-mdpi/stat_sys_adb.png
index 86d113f..4862919 100644
--- a/core/res/res/drawable-mdpi/stat_sys_adb.png
+++ b/core/res/res/drawable-mdpi/stat_sys_adb.png
Binary files differ
diff --git a/core/res/res/drawable-nodpi/platlogo.png b/core/res/res/drawable-nodpi/platlogo.png
index 8aa3b9e..f46c6c6 100644
--- a/core/res/res/drawable-nodpi/platlogo.png
+++ b/core/res/res/drawable-nodpi/platlogo.png
Binary files differ
diff --git a/core/res/res/drawable-nodpi/platlogo_alt.png b/core/res/res/drawable-nodpi/platlogo_alt.png
new file mode 100644
index 0000000..63b53b8
--- /dev/null
+++ b/core/res/res/drawable-nodpi/platlogo_alt.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/progress_bg_holo_dark.9.png b/core/res/res/drawable-xhdpi/progress_bg_holo_dark.9.png
index 345f5d3..c8b87d7 100644
--- a/core/res/res/drawable-xhdpi/progress_bg_holo_dark.9.png
+++ b/core/res/res/drawable-xhdpi/progress_bg_holo_dark.9.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/progress_bg_holo_light.9.png b/core/res/res/drawable-xhdpi/progress_bg_holo_light.9.png
index c843ef3..cbd19ac 100644
--- a/core/res/res/drawable-xhdpi/progress_bg_holo_light.9.png
+++ b/core/res/res/drawable-xhdpi/progress_bg_holo_light.9.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/progress_primary_holo_dark.9.png b/core/res/res/drawable-xhdpi/progress_primary_holo_dark.9.png
index c6c3f1e..f1069fd 100644
--- a/core/res/res/drawable-xhdpi/progress_primary_holo_dark.9.png
+++ b/core/res/res/drawable-xhdpi/progress_primary_holo_dark.9.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/progress_primary_holo_light.9.png b/core/res/res/drawable-xhdpi/progress_primary_holo_light.9.png
index c6c3f1e..e62123c 100644
--- a/core/res/res/drawable-xhdpi/progress_primary_holo_light.9.png
+++ b/core/res/res/drawable-xhdpi/progress_primary_holo_light.9.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/progress_secondary_holo_dark.9.png b/core/res/res/drawable-xhdpi/progress_secondary_holo_dark.9.png
index 205b66e..06ae19c 100644
--- a/core/res/res/drawable-xhdpi/progress_secondary_holo_dark.9.png
+++ b/core/res/res/drawable-xhdpi/progress_secondary_holo_dark.9.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/progress_secondary_holo_light.9.png b/core/res/res/drawable-xhdpi/progress_secondary_holo_light.9.png
index 205b66e..37c6d5f 100644
--- a/core/res/res/drawable-xhdpi/progress_secondary_holo_light.9.png
+++ b/core/res/res/drawable-xhdpi/progress_secondary_holo_light.9.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/scrubber_control_disabled_holo.png b/core/res/res/drawable-xhdpi/scrubber_control_disabled_holo.png
index 8cf3868..62be77c 100644
--- a/core/res/res/drawable-xhdpi/scrubber_control_disabled_holo.png
+++ b/core/res/res/drawable-xhdpi/scrubber_control_disabled_holo.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/scrubber_control_focused_holo.png b/core/res/res/drawable-xhdpi/scrubber_control_focused_holo.png
index 417b35a..754dd2f 100644
--- a/core/res/res/drawable-xhdpi/scrubber_control_focused_holo.png
+++ b/core/res/res/drawable-xhdpi/scrubber_control_focused_holo.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/scrubber_control_normal_holo.png b/core/res/res/drawable-xhdpi/scrubber_control_normal_holo.png
index 8053d88..d546a73 100644
--- a/core/res/res/drawable-xhdpi/scrubber_control_normal_holo.png
+++ b/core/res/res/drawable-xhdpi/scrubber_control_normal_holo.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/scrubber_control_pressed_holo.png b/core/res/res/drawable-xhdpi/scrubber_control_pressed_holo.png
index d17fa7d..0b62072 100644
--- a/core/res/res/drawable-xhdpi/scrubber_control_pressed_holo.png
+++ b/core/res/res/drawable-xhdpi/scrubber_control_pressed_holo.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/scrubber_primary_holo.9.png b/core/res/res/drawable-xhdpi/scrubber_primary_holo.9.png
index 073ff4c..3b0b241 100644
--- a/core/res/res/drawable-xhdpi/scrubber_primary_holo.9.png
+++ b/core/res/res/drawable-xhdpi/scrubber_primary_holo.9.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/scrubber_secondary_holo.9.png b/core/res/res/drawable-xhdpi/scrubber_secondary_holo.9.png
index 4c7b0aa..9099034 100644
--- a/core/res/res/drawable-xhdpi/scrubber_secondary_holo.9.png
+++ b/core/res/res/drawable-xhdpi/scrubber_secondary_holo.9.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/scrubber_track_holo_dark.9.png b/core/res/res/drawable-xhdpi/scrubber_track_holo_dark.9.png
index a217a90..bfb2048 100644
--- a/core/res/res/drawable-xhdpi/scrubber_track_holo_dark.9.png
+++ b/core/res/res/drawable-xhdpi/scrubber_track_holo_dark.9.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/scrubber_track_holo_light.9.png b/core/res/res/drawable-xhdpi/scrubber_track_holo_light.9.png
index 551fb0a..a7d396de2 100644
--- a/core/res/res/drawable-xhdpi/scrubber_track_holo_light.9.png
+++ b/core/res/res/drawable-xhdpi/scrubber_track_holo_light.9.png
Binary files differ
diff --git a/core/res/res/drawable-xhdpi/stat_sys_adb.png b/core/res/res/drawable-xhdpi/stat_sys_adb.png
index 684d57a..576ae24 100644
--- a/core/res/res/drawable-xhdpi/stat_sys_adb.png
+++ b/core/res/res/drawable-xhdpi/stat_sys_adb.png
Binary files differ
diff --git a/core/res/res/drawable/ic_lockscreen_answer.xml b/core/res/res/drawable/ic_lockscreen_answer.xml
index b42fc2a..dd50930 100644
--- a/core/res/res/drawable/ic_lockscreen_answer.xml
+++ b/core/res/res/drawable/ic_lockscreen_answer.xml
@@ -27,4 +27,10 @@
android:state_focused="false"
android:drawable="@drawable/ic_lockscreen_answer_active" />
+ <item
+ android:state_enabled="true"
+ android:state_active="false"
+ android:state_focused="true"
+ android:drawable="@drawable/ic_lockscreen_answer_active" />
+
</selector>
diff --git a/core/res/res/drawable/ic_lockscreen_camera.xml b/core/res/res/drawable/ic_lockscreen_camera.xml
index 0e3ef37..41277fe 100644
--- a/core/res/res/drawable/ic_lockscreen_camera.xml
+++ b/core/res/res/drawable/ic_lockscreen_camera.xml
@@ -27,4 +27,10 @@
android:state_focused="false"
android:drawable="@drawable/ic_lockscreen_camera_activated" />
+ <item
+ android:state_enabled="true"
+ android:state_active="false"
+ android:state_focused="true"
+ android:drawable="@drawable/ic_lockscreen_camera_activated" />
+
</selector>
diff --git a/core/res/res/drawable/ic_lockscreen_decline.xml b/core/res/res/drawable/ic_lockscreen_decline.xml
index 65128a1..58e9d38 100644
--- a/core/res/res/drawable/ic_lockscreen_decline.xml
+++ b/core/res/res/drawable/ic_lockscreen_decline.xml
@@ -27,4 +27,10 @@
android:state_focused="false"
android:drawable="@drawable/ic_lockscreen_decline_activated" />
+ <item
+ android:state_enabled="true"
+ android:state_active="false"
+ android:state_focused="true"
+ android:drawable="@drawable/ic_lockscreen_decline_activated" />
+
</selector>
diff --git a/core/res/res/drawable/ic_lockscreen_outerring.xml b/core/res/res/drawable/ic_lockscreen_outerring.xml
index 3bdd6f6..78984b3 100644
--- a/core/res/res/drawable/ic_lockscreen_outerring.xml
+++ b/core/res/res/drawable/ic_lockscreen_outerring.xml
@@ -17,7 +17,8 @@
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="oval"
>
- <size android:height="@dimen/keyguard_lockscreen_outerring_diameter" android:width="@dimen/keyguard_lockscreen_outerring_diameter" />
+ <size android:height="@dimen/keyguard_lockscreen_outerring_diameter"
+ android:width="@dimen/keyguard_lockscreen_outerring_diameter" />
<solid android:color="#00000000" />
<stroke android:color="#1affffff" android:width="2dp" />
</shape>
\ No newline at end of file
diff --git a/core/res/res/drawable/ic_lockscreen_search.xml b/core/res/res/drawable/ic_lockscreen_search.xml
index 2c0091a..4040153 100644
--- a/core/res/res/drawable/ic_lockscreen_search.xml
+++ b/core/res/res/drawable/ic_lockscreen_search.xml
@@ -27,4 +27,10 @@
android:state_focused="false"
android:drawable="@drawable/ic_lockscreen_google_activated" />
+ <item
+ android:state_enabled="true"
+ android:state_active="false"
+ android:state_focused="true"
+ android:drawable="@drawable/ic_lockscreen_google_activated" />
+
</selector>
diff --git a/core/res/res/drawable/ic_lockscreen_send_sms.xml b/core/res/res/drawable/ic_lockscreen_send_sms.xml
index 2503a5c..0d09297 100644
--- a/core/res/res/drawable/ic_lockscreen_send_sms.xml
+++ b/core/res/res/drawable/ic_lockscreen_send_sms.xml
@@ -27,4 +27,10 @@
android:state_focused="false"
android:drawable="@drawable/ic_lockscreen_text_activated" />
+ <item
+ android:state_enabled="true"
+ android:state_active="false"
+ android:state_focused="true"
+ android:drawable="@drawable/ic_lockscreen_text_activated" />
+
</selector>
diff --git a/core/res/res/drawable/ic_lockscreen_silent.xml b/core/res/res/drawable/ic_lockscreen_silent.xml
index 2521eb7..df23278 100644
--- a/core/res/res/drawable/ic_lockscreen_silent.xml
+++ b/core/res/res/drawable/ic_lockscreen_silent.xml
@@ -27,4 +27,10 @@
android:state_focused="false"
android:drawable="@drawable/ic_lockscreen_silent_activated" />
+ <item
+ android:state_enabled="true"
+ android:state_active="false"
+ android:state_focused="true"
+ android:drawable="@drawable/ic_lockscreen_silent_activated" />
+
</selector>
diff --git a/core/res/res/drawable/ic_lockscreen_soundon.xml b/core/res/res/drawable/ic_lockscreen_soundon.xml
index 2b306a5..b44c86c 100644
--- a/core/res/res/drawable/ic_lockscreen_soundon.xml
+++ b/core/res/res/drawable/ic_lockscreen_soundon.xml
@@ -27,4 +27,10 @@
android:state_focused="false"
android:drawable="@drawable/ic_lockscreen_soundon_activated" />
+ <item
+ android:state_enabled="true"
+ android:state_active="false"
+ android:state_focused="true"
+ android:drawable="@drawable/ic_lockscreen_soundon_activated" />
+
</selector>
diff --git a/core/res/res/drawable/ic_lockscreen_unlock.xml b/core/res/res/drawable/ic_lockscreen_unlock.xml
index 0a49c18..bb1d0ee 100644
--- a/core/res/res/drawable/ic_lockscreen_unlock.xml
+++ b/core/res/res/drawable/ic_lockscreen_unlock.xml
@@ -27,4 +27,10 @@
android:state_focused="false"
android:drawable="@drawable/ic_lockscreen_unlock_activated" />
+ <item
+ android:state_enabled="true"
+ android:state_active="false"
+ android:state_focused="true"
+ android:drawable="@drawable/ic_lockscreen_unlock_activated" />
+
</selector>
diff --git a/core/res/res/drawable/ic_lockscreen_unlock_phantom.xml b/core/res/res/drawable/ic_lockscreen_unlock_phantom.xml
new file mode 100644
index 0000000..83f0aed
--- /dev/null
+++ b/core/res/res/drawable/ic_lockscreen_unlock_phantom.xml
@@ -0,0 +1,36 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2011 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.
+-->
+<selector xmlns:android="http://schemas.android.com/apk/res/android">
+
+ <item
+ android:state_enabled="true"
+ android:state_active="false"
+ android:state_focused="false"
+ android:drawable="@color/transparent" />
+
+ <item
+ android:state_enabled="true"
+ android:state_active="true"
+ android:state_focused="false"
+ android:drawable="@drawable/ic_lockscreen_unlock_activated" />
+
+ <item
+ android:state_enabled="true"
+ android:state_active="false"
+ android:state_focused="true"
+ android:drawable="@drawable/ic_lockscreen_unlock_activated" />
+
+</selector>
diff --git a/core/res/res/layout-sw600dp/keyguard_screen_tab_unlock.xml b/core/res/res/layout-sw600dp/keyguard_screen_tab_unlock.xml
index 66cf98d..055955e 100644
--- a/core/res/res/layout-sw600dp/keyguard_screen_tab_unlock.xml
+++ b/core/res/res/layout-sw600dp/keyguard_screen_tab_unlock.xml
@@ -98,7 +98,7 @@
android:outerRadius="@dimen/multiwaveview_target_placement_radius"
android:snapMargin="@dimen/multiwaveview_snap_margin"
android:hitRadius="@dimen/multiwaveview_hit_radius"
- android:rightChevronDrawable="@drawable/ic_lockscreen_chevron_right"
+ android:chevronDrawables="@array/lockscreen_chevron_drawables"
android:feedbackCount="3"
android:vibrationDuration="20"
/>
diff --git a/core/res/res/layout-sw600dp/keyguard_screen_tab_unlock_land.xml b/core/res/res/layout-sw600dp/keyguard_screen_tab_unlock_land.xml
index 65b442b..e68a0c1 100644
--- a/core/res/res/layout-sw600dp/keyguard_screen_tab_unlock_land.xml
+++ b/core/res/res/layout-sw600dp/keyguard_screen_tab_unlock_land.xml
@@ -98,7 +98,7 @@
android:outerRadius="@dimen/multiwaveview_target_placement_radius"
android:snapMargin="@dimen/multiwaveview_snap_margin"
android:hitRadius="@dimen/multiwaveview_hit_radius"
- android:rightChevronDrawable="@drawable/ic_lockscreen_chevron_right"
+ android:chevronDrawables="@array/lockscreen_chevron_drawables"
android:feedbackCount="3"
android:vibrationDuration="20"
/>
diff --git a/core/res/res/layout/date_picker_holo.xml b/core/res/res/layout/date_picker_holo.xml
index 122a61a..8008682 100644
--- a/core/res/res/layout/date_picker_holo.xml
+++ b/core/res/res/layout/date_picker_holo.xml
@@ -41,10 +41,10 @@
android:id="@+id/month"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
- android:layout_marginTop="10dip"
- android:layout_marginBottom="10dip"
- android:layout_marginLeft="16dip"
- android:layout_marginRight="16dip"
+ android:layout_marginTop="16dip"
+ android:layout_marginBottom="16dip"
+ android:layout_marginLeft="8dip"
+ android:layout_marginRight="8dip"
android:focusable="true"
android:focusableInTouchMode="true"
/>
@@ -54,10 +54,10 @@
android:id="@+id/day"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
- android:layout_marginTop="10dip"
- android:layout_marginBottom="10dip"
- android:layout_marginLeft="16dip"
- android:layout_marginRight="16dip"
+ android:layout_marginTop="16dip"
+ android:layout_marginBottom="16dip"
+ android:layout_marginLeft="8dip"
+ android:layout_marginRight="8dip"
android:focusable="true"
android:focusableInTouchMode="true"
/>
@@ -67,9 +67,9 @@
android:id="@+id/year"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
- android:layout_marginTop="10dip"
- android:layout_marginBottom="10dip"
- android:layout_marginLeft="16dip"
+ android:layout_marginTop="16dip"
+ android:layout_marginBottom="16dip"
+ android:layout_marginLeft="8dip"
android:layout_marginRight="16dip"
android:focusable="true"
android:focusableInTouchMode="true"
diff --git a/core/res/res/layout/keyguard_screen_tab_unlock.xml b/core/res/res/layout/keyguard_screen_tab_unlock.xml
index 3fd3023..2dcb774 100644
--- a/core/res/res/layout/keyguard_screen_tab_unlock.xml
+++ b/core/res/res/layout/keyguard_screen_tab_unlock.xml
@@ -139,7 +139,7 @@
android:outerRadius="@dimen/multiwaveview_target_placement_radius"
android:snapMargin="@dimen/multiwaveview_snap_margin"
android:hitRadius="@dimen/multiwaveview_hit_radius"
- android:rightChevronDrawable="@drawable/ic_lockscreen_chevron_right"
+ android:chevronDrawables="@array/lockscreen_chevron_drawables"
android:feedbackCount="3"
android:vibrationDuration="20"
/>
diff --git a/core/res/res/layout/keyguard_screen_tab_unlock_land.xml b/core/res/res/layout/keyguard_screen_tab_unlock_land.xml
index cd03c10..10ddd1e 100644
--- a/core/res/res/layout/keyguard_screen_tab_unlock_land.xml
+++ b/core/res/res/layout/keyguard_screen_tab_unlock_land.xml
@@ -144,7 +144,7 @@
android:outerRadius="@dimen/multiwaveview_target_placement_radius"
android:snapMargin="@dimen/multiwaveview_snap_margin"
android:hitRadius="@dimen/multiwaveview_hit_radius"
- android:topChevronDrawable="@drawable/ic_lockscreen_chevron_up"
+ android:chevronDrawables="@array/lockscreen_chevron_drawables"
android:feedbackCount="3"
android:vibrationDuration="20"
/>
diff --git a/core/res/res/layout/notification_action.xml b/core/res/res/layout/notification_action.xml
index 36982ca..28812a9 100644
--- a/core/res/res/layout/notification_action.xml
+++ b/core/res/res/layout/notification_action.xml
@@ -15,6 +15,7 @@
-->
<Button xmlns:android="http://schemas.android.com/apk/res/android"
+ style="?android:attr/borderlessButtonStyle"
android:id="@+id/action0"
android:layout_width="match_parent"
android:layout_height="48dp"
diff --git a/core/res/res/layout/notification_template_big_text.xml b/core/res/res/layout/notification_template_big_text.xml
index d0549cf..77a5f11 100644
--- a/core/res/res/layout/notification_template_big_text.xml
+++ b/core/res/res/layout/notification_template_big_text.xml
@@ -43,14 +43,16 @@
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
- android:minHeight="@dimen/notification_large_icon_height"
android:orientation="vertical"
- >
+ android:layout_weight="1"
+ >
<LinearLayout
android:id="@+id/line1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
+ android:layout_gravity="top"
+ android:layout_weight="0"
>
<TextView android:id="@+id/title"
android:textAppearance="@style/TextAppearance.StatusBar.EventContent.Title"
@@ -87,24 +89,29 @@
android:singleLine="true"
android:fadingEdge="horizontal"
android:ellipsize="marquee"
+ android:layout_weight="0"
android:visibility="gone"
/>
<TextView android:id="@+id/big_text"
android:textAppearance="@style/TextAppearance.StatusBar.EventContent"
android:layout_width="match_parent"
- android:layout_height="wrap_content"
+ android:layout_height="0dp"
android:layout_marginTop="2dp"
android:layout_marginBottom="2dp"
android:singleLine="false"
android:visibility="gone"
+ android:maxLines="8"
+ android:ellipsize="end"
+ android:layout_weight="1"
/>
</LinearLayout>
<LinearLayout
android:id="@+id/actions"
android:layout_width="match_parent"
- android:layout_height="wrap_content"
+ android:layout_height="0dp"
android:orientation="vertical"
android:visibility="gone"
+ android:layout_weight="1"
>
<!-- actions will be added here -->
</LinearLayout>
@@ -116,13 +123,14 @@
android:ellipsize="marquee"
android:fadingEdge="horizontal"
android:visibility="gone"
- android:layout_weight="1"
+ android:layout_weight="0"
/>
<LinearLayout
android:id="@+id/line3"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
+ android:layout_weight="1"
>
<TextView android:id="@+id/text"
android:textAppearance="@style/TextAppearance.StatusBar.EventContent"
@@ -160,6 +168,7 @@
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:visibility="gone"
+ android:layout_weight="0"
style="?android:attr/progressBarStyleHorizontal"
/>
</LinearLayout>
diff --git a/core/res/res/layout/notification_template_inbox.xml b/core/res/res/layout/notification_template_inbox.xml
index 7b63ac5..05ec1d8 100644
--- a/core/res/res/layout/notification_template_inbox.xml
+++ b/core/res/res/layout/notification_template_inbox.xml
@@ -47,6 +47,7 @@
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
+ android:layout_weight="0"
>
<TextView android:id="@+id/title"
android:textAppearance="@style/TextAppearance.StatusBar.EventContent.Title"
@@ -84,62 +85,69 @@
android:fadingEdge="horizontal"
android:ellipsize="marquee"
android:visibility="gone"
+ android:layout_weight="0"
/>
<TextView android:id="@+id/inbox_text0"
android:textAppearance="@style/TextAppearance.StatusBar.EventContent"
android:layout_width="match_parent"
- android:layout_height="wrap_content"
+ android:layout_height="0dp"
android:singleLine="true"
android:ellipsize="end"
android:paddingTop="4dp"
android:paddingBottom="4dp"
android:visibility="gone"
+ android:layout_weight="1"
/>
<TextView android:id="@+id/inbox_text1"
android:textAppearance="@style/TextAppearance.StatusBar.EventContent"
android:layout_width="match_parent"
- android:layout_height="wrap_content"
+ android:layout_height="0dp"
android:singleLine="true"
android:ellipsize="end"
android:paddingTop="4dp"
android:paddingBottom="4dp"
android:visibility="gone"
+ android:layout_weight="1"
/>
<TextView android:id="@+id/inbox_text2"
android:textAppearance="@style/TextAppearance.StatusBar.EventContent"
android:layout_width="match_parent"
- android:layout_height="wrap_content"
+ android:layout_height="0dp"
android:singleLine="true"
android:ellipsize="end"
android:paddingTop="4dp"
android:paddingBottom="4dp"
android:visibility="gone"
+ android:layout_weight="1"
/>
<TextView android:id="@+id/inbox_text3"
android:textAppearance="@style/TextAppearance.StatusBar.EventContent"
android:layout_width="match_parent"
- android:layout_height="wrap_content"
+ android:layout_height="0dp"
android:singleLine="true"
android:ellipsize="end"
android:paddingTop="4dp"
android:paddingBottom="4dp"
android:visibility="gone"
+ android:layout_weight="1"
/>
<TextView android:id="@+id/inbox_text4"
android:textAppearance="@style/TextAppearance.StatusBar.EventContent"
android:layout_width="match_parent"
- android:layout_height="wrap_content"
+ android:layout_height="0dp"
android:singleLine="true"
android:ellipsize="end"
android:paddingTop="4dp"
android:paddingBottom="4dp"
android:visibility="gone"
+ android:layout_weight="1"
/>
<LinearLayout
android:id="@+id/actions"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
+ android:layout_weight="0"
android:visibility="gone"
>
<!-- actions will be added here -->
@@ -152,13 +160,14 @@
android:ellipsize="marquee"
android:fadingEdge="horizontal"
android:visibility="gone"
- android:layout_weight="1"
+ android:layout_weight="0"
/>
<LinearLayout
android:id="@+id/line3"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
+ android:layout_weight="0"
>
<TextView android:id="@+id/text"
android:textAppearance="@style/TextAppearance.StatusBar.EventContent"
@@ -196,6 +205,7 @@
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:visibility="gone"
+ android:layout_weight="0"
style="?android:attr/progressBarStyleHorizontal"
/>
</LinearLayout>
diff --git a/core/res/res/layout/time_picker_holo.xml b/core/res/res/layout/time_picker_holo.xml
index 24b6194..91e66bc 100644
--- a/core/res/res/layout/time_picker_holo.xml
+++ b/core/res/res/layout/time_picker_holo.xml
@@ -30,10 +30,10 @@
android:id="@+id/hour"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
- android:layout_marginTop="10dip"
- android:layout_marginBottom="10dip"
+ android:layout_marginTop="16dip"
+ android:layout_marginBottom="16dip"
android:layout_marginLeft="16dip"
- android:layout_marginRight="14dip"
+ android:layout_marginRight="6dip"
android:focusable="true"
android:focusableInTouchMode="true"
/>
@@ -51,10 +51,10 @@
android:id="@+id/minute"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
- android:layout_marginTop="10dip"
- android:layout_marginBottom="10dip"
- android:layout_marginLeft="14dip"
- android:layout_marginRight="16dip"
+ android:layout_marginTop="16dip"
+ android:layout_marginBottom="16dip"
+ android:layout_marginLeft="6dip"
+ android:layout_marginRight="8dip"
android:focusable="true"
android:focusableInTouchMode="true"
/>
@@ -64,9 +64,9 @@
android:id="@+id/amPm"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
- android:layout_marginTop="10dip"
- android:layout_marginBottom="10dip"
- android:layout_marginLeft="16dip"
+ android:layout_marginTop="16dip"
+ android:layout_marginBottom="16dip"
+ android:layout_marginLeft="8dip"
android:layout_marginRight="16dip"
android:focusable="true"
android:focusableInTouchMode="true"
diff --git a/core/res/res/values-af/strings.xml b/core/res/res/values-af/strings.xml
index ad7a228..b739835 100644
--- a/core/res/res/values-af/strings.xml
+++ b/core/res/res/values-af/strings.xml
@@ -175,28 +175,20 @@
<string name="permgroupdesc_location" msgid="5704679763124170100">"Monitor jou fisiese ligging."</string>
<string name="permgrouplab_network" msgid="5808983377727109831">"Netwerkkommunikasie"</string>
<string name="permgroupdesc_network" msgid="4478299413241861987">"Kry toegang tot verskeie netwerkfunksies."</string>
- <!-- no translation found for permgrouplab_bluetoothNetwork (1585403544162128109) -->
- <skip />
- <!-- no translation found for permgroupdesc_bluetoothNetwork (5625288577164282391) -->
- <skip />
- <!-- no translation found for permgrouplab_shortrangeNetwork (130808676377486118) -->
- <skip />
- <!-- no translation found for permgroupdesc_shortrangeNetwork (1884069062653436007) -->
- <skip />
+ <string name="permgrouplab_bluetoothNetwork" msgid="1585403544162128109">"Bluetooth"</string>
+ <string name="permgroupdesc_bluetoothNetwork" msgid="5625288577164282391">"Toegangstoestelle en netwerke deur Bluetooth."</string>
+ <string name="permgrouplab_shortrangeNetwork" msgid="130808676377486118">"Kortreeks-netwerke"</string>
+ <string name="permgroupdesc_shortrangeNetwork" msgid="1884069062653436007">"Toegangstoestelle met kortreeks-netwerke soos NFC."</string>
<string name="permgrouplab_audioSettings" msgid="8329261670151871235">"Oudio-instellings"</string>
<string name="permgroupdesc_audioSettings" msgid="2641515403347568130">"Verander oudio-instellings."</string>
<string name="permgrouplab_affectsBattery" msgid="6209246653424798033">"Affekteer battery"</string>
<string name="permgroupdesc_affectsBattery" msgid="6441275320638916947">"Gebruik kenmerke wat vinnig die battery opgebruik."</string>
<string name="permgrouplab_calendar" msgid="5863508437783683902">"Kalender"</string>
<string name="permgroupdesc_calendar" msgid="5777534316982184416">"Direkte toegang tot kalender en gebeurtenisse."</string>
- <!-- no translation found for permgrouplab_dictionary (4148597128843641379) -->
- <skip />
- <!-- no translation found for permgroupdesc_dictionary (7921166355964764490) -->
- <skip />
- <!-- no translation found for permgrouplab_writeDictionary (8090237702432576788) -->
- <skip />
- <!-- no translation found for permgroupdesc_writeDictionary (2711561994497361646) -->
- <skip />
+ <string name="permgrouplab_dictionary" msgid="4148597128843641379">"Lees gebruikerswoordeboek"</string>
+ <string name="permgroupdesc_dictionary" msgid="7921166355964764490">"Lees woorde in die gebruikerswoordeboek."</string>
+ <string name="permgrouplab_writeDictionary" msgid="8090237702432576788">"Skryf gebruikerswoordeboek"</string>
+ <string name="permgroupdesc_writeDictionary" msgid="2711561994497361646">"Voeg woorde by die gebruikerswoordeboek."</string>
<string name="permgrouplab_bookmarks" msgid="1949519673103968229">"Boekmerke en geskiedenis"</string>
<string name="permgroupdesc_bookmarks" msgid="4169771606257963028">"Direkte toegang tot boekmerke en blaaiergeskiedenis."</string>
<string name="permgrouplab_deviceAlarms" msgid="6117704629728824101">"Wekker"</string>
@@ -569,8 +561,7 @@
<string name="permdesc_sdcardRead" product="nosdcard" msgid="3530894470637667917">"Laat die program toe om die USB-berging se inhoud te lees, wat foto\'s en media kan insluit."</string>
<string name="permdesc_sdcardRead" product="default" msgid="2555811422562526606">"Laat die program toe om die SD-kaart se inhoud te lees, wat foto\'s en media kan insluit."</string>
<string name="permlab_sdcardWrite" product="nosdcard" msgid="8485979062254666748">"verander of vee die inhoud van jou USB-berging uit"</string>
- <!-- no translation found for permlab_sdcardWrite (8805693630050458763) -->
- <skip />
+ <string name="permlab_sdcardWrite" product="default" msgid="8805693630050458763">"Verander of skrap die inhoud van jou SD-kaart"</string>
<string name="permdesc_sdcardWrite" product="nosdcard" msgid="6175406299445710888">"Laat die program toe om die USB-geheue te skryf."</string>
<string name="permdesc_sdcardWrite" product="default" msgid="4337417790936632090">"Laat die program toe om na die SD-kaart te skryf."</string>
<string name="permlab_mediaStorageWrite" product="default" msgid="6859839199706879015">"verander/vee uit interne mediabergingsinhoud"</string>
@@ -1090,8 +1081,7 @@
<string name="date_time_set" msgid="5777075614321087758">"Stel"</string>
<string name="date_time_done" msgid="2507683751759308828">"Klaar"</string>
<string name="perms_new_perm_prefix" msgid="8257740710754301407"><font size="12" fgcolor="#ff900000">"NUUT: "</font></string>
- <!-- no translation found for perms_description_app (5139836143293299417) -->
- <skip />
+ <string name="perms_description_app" msgid="5139836143293299417">"Verskaf deur <xliff:g id="APP_NAME">%1$s</xliff:g>."</string>
<string name="no_permissions" msgid="7283357728219338112">"Geen toestemmings benodig nie"</string>
<string name="usb_storage_activity_title" msgid="4465055157209648641">"USB-geheue"</string>
<string name="usb_storage_title" msgid="5901459041398751495">"USB gekoppel"</string>
@@ -1321,8 +1311,6 @@
<string name="sending" msgid="3245653681008218030">"Stuur tans…"</string>
<string name="launchBrowserDefault" msgid="2057951947297614725">"Begin webblaaier?"</string>
<string name="SetupCallDefault" msgid="5834948469253758575">"Aanvaar oproep?"</string>
- <!-- no translation found for activity_resolver_use_always (8017770747801494933) -->
- <skip />
- <!-- no translation found for activity_resolver_use_once (405646673463328329) -->
- <skip />
+ <string name="activity_resolver_use_always" msgid="8017770747801494933">"Altyd"</string>
+ <string name="activity_resolver_use_once" msgid="405646673463328329">"Net een keer"</string>
</resources>
diff --git a/core/res/res/values-am/strings.xml b/core/res/res/values-am/strings.xml
index c0c0c9c..6f17bec 100644
--- a/core/res/res/values-am/strings.xml
+++ b/core/res/res/values-am/strings.xml
@@ -175,28 +175,20 @@
<string name="permgroupdesc_location" msgid="5704679763124170100">"ያለህበትን አካባቢ ተቆጣጠር።"</string>
<string name="permgrouplab_network" msgid="5808983377727109831">"የአውታረ መረብ ግኑኙነት"</string>
<string name="permgroupdesc_network" msgid="4478299413241861987">"የተለያዩ የአውታረ መረብ ባህሪያትን ድረስ።"</string>
- <!-- no translation found for permgrouplab_bluetoothNetwork (1585403544162128109) -->
- <skip />
- <!-- no translation found for permgroupdesc_bluetoothNetwork (5625288577164282391) -->
- <skip />
- <!-- no translation found for permgrouplab_shortrangeNetwork (130808676377486118) -->
- <skip />
- <!-- no translation found for permgroupdesc_shortrangeNetwork (1884069062653436007) -->
- <skip />
+ <string name="permgrouplab_bluetoothNetwork" msgid="1585403544162128109">"ብሉቱዝ"</string>
+ <string name="permgroupdesc_bluetoothNetwork" msgid="5625288577164282391">"መሳሪያዎችን እና አውታረ መረቦችን በብሉቱዝ በኩል አግኝ።"</string>
+ <string name="permgrouplab_shortrangeNetwork" msgid="130808676377486118">"የአጭር ክልል አውታረ መረቦች"</string>
+ <string name="permgroupdesc_shortrangeNetwork" msgid="1884069062653436007">"መሳሪያዎችን እንደ NFC ባሉ የአጭር ክልል አውታረ መረቦች በኩል አግኝ።"</string>
<string name="permgrouplab_audioSettings" msgid="8329261670151871235">"የድምጽ ቅንብሮች"</string>
<string name="permgroupdesc_audioSettings" msgid="2641515403347568130">"የድምጽ ቅንብሮችን ቀይር።"</string>
<string name="permgrouplab_affectsBattery" msgid="6209246653424798033">"ባትሪ ላይ ተፅዕኖ ያሳርፋል"</string>
<string name="permgroupdesc_affectsBattery" msgid="6441275320638916947">"ባትሪ ቶሎ ሊጨርሱ የሚችሉ ባህርያትን ተጠቀም።"</string>
<string name="permgrouplab_calendar" msgid="5863508437783683902">"ቀን መቁጠሪያ"</string>
<string name="permgroupdesc_calendar" msgid="5777534316982184416">"ወደ ቀን መቁጠሪያና ክስተቶች ቀጥተኛ መዳረሻ።"</string>
- <!-- no translation found for permgrouplab_dictionary (4148597128843641379) -->
- <skip />
- <!-- no translation found for permgroupdesc_dictionary (7921166355964764490) -->
- <skip />
- <!-- no translation found for permgrouplab_writeDictionary (8090237702432576788) -->
- <skip />
- <!-- no translation found for permgroupdesc_writeDictionary (2711561994497361646) -->
- <skip />
+ <string name="permgrouplab_dictionary" msgid="4148597128843641379">"የተጠቃሚ መዝገበ ቃላት አንብብ"</string>
+ <string name="permgroupdesc_dictionary" msgid="7921166355964764490">"ቃላትን በተጠቃሚ መዝገበ ቃላት አንብብ።"</string>
+ <string name="permgrouplab_writeDictionary" msgid="8090237702432576788">"የተጠቃሚ መዝገበ ቃላት ጻፍ"</string>
+ <string name="permgroupdesc_writeDictionary" msgid="2711561994497361646">"ቃላትን የተጠቃሚ መዝገበ ቃላትህ ላይ አክል።"</string>
<string name="permgrouplab_bookmarks" msgid="1949519673103968229">"ዕልባቶች እና ታሪክ"</string>
<string name="permgroupdesc_bookmarks" msgid="4169771606257963028">"ወደ ዕልባቶችና የአሳሽ ታሪክ ቀጥተኛ መዳረሻ።"</string>
<string name="permgrouplab_deviceAlarms" msgid="6117704629728824101">"ማንቂያ"</string>
@@ -569,8 +561,7 @@
<string name="permdesc_sdcardRead" product="nosdcard" msgid="3530894470637667917">"መተግበሪያው የUSB ማከማቻ ይዘቶችን እንዲያነብ ይፈቅዳል፣ ይህም ፎቶዎችና ሚዲያ ሊያካትት ይችላል።"</string>
<string name="permdesc_sdcardRead" product="default" msgid="2555811422562526606">"መተግበሪያው የSD ካርድ ይዘቶችን እንዲያነብ ይፈቅዳል፣ ይህም ፎቶዎችና ሚዲያ ሊያካትት ይችላል።"</string>
<string name="permlab_sdcardWrite" product="nosdcard" msgid="8485979062254666748">"የUSB ማከማቻህን ይዘቶች ቀይር ወይም ሰርዝ"</string>
- <!-- no translation found for permlab_sdcardWrite (8805693630050458763) -->
- <skip />
+ <string name="permlab_sdcardWrite" product="default" msgid="8805693630050458763">"የSD ካርድህን ይዘቶች ቀይር ወይም ሰርዝ"</string>
<string name="permdesc_sdcardWrite" product="nosdcard" msgid="6175406299445710888">"ወደ USB ማህደረ ትውስታው ለመፃፍ ለመተግበሪያው ይፈቅዳሉ፡፡"</string>
<string name="permdesc_sdcardWrite" product="default" msgid="4337417790936632090">"መተግበሪያውን ወደ SD ካርድ ለመፃፍ ይፈቅዳል።"</string>
<string name="permlab_mediaStorageWrite" product="default" msgid="6859839199706879015">"የውስጥ ማህደረ መረጃ ማከማቻ ይዘቶችን ቀይር/ሰርዝ"</string>
@@ -1090,8 +1081,7 @@
<string name="date_time_set" msgid="5777075614321087758">"አዘጋጅ"</string>
<string name="date_time_done" msgid="2507683751759308828">"ተጠናቋል"</string>
<string name="perms_new_perm_prefix" msgid="8257740710754301407"><font size="12" fgcolor="#ff900000">"አዲስ፦ "</font></string>
- <!-- no translation found for perms_description_app (5139836143293299417) -->
- <skip />
+ <string name="perms_description_app" msgid="5139836143293299417">"በ<xliff:g id="APP_NAME">%1$s</xliff:g> የቀረበ።"</string>
<string name="no_permissions" msgid="7283357728219338112">"ምንም ፍቃዶች አይጠየቁም"</string>
<string name="usb_storage_activity_title" msgid="4465055157209648641">"USB ብዙ ማከማቻ"</string>
<string name="usb_storage_title" msgid="5901459041398751495">"USB ተያይዟል"</string>
@@ -1321,8 +1311,6 @@
<string name="sending" msgid="3245653681008218030">"በመላክ ላይ…"</string>
<string name="launchBrowserDefault" msgid="2057951947297614725">"ማሰሺያን አስነሳ?"</string>
<string name="SetupCallDefault" msgid="5834948469253758575">"ጥሪ ተቀበል?"</string>
- <!-- no translation found for activity_resolver_use_always (8017770747801494933) -->
- <skip />
- <!-- no translation found for activity_resolver_use_once (405646673463328329) -->
- <skip />
+ <string name="activity_resolver_use_always" msgid="8017770747801494933">"ዘወትር"</string>
+ <string name="activity_resolver_use_once" msgid="405646673463328329">"አንዴ ብቻ"</string>
</resources>
diff --git a/core/res/res/values-ar/strings.xml b/core/res/res/values-ar/strings.xml
index 4196052..dca63c3 100644
--- a/core/res/res/values-ar/strings.xml
+++ b/core/res/res/values-ar/strings.xml
@@ -1311,7 +1311,6 @@
<string name="sending" msgid="3245653681008218030">"جارٍ الإرسال..."</string>
<string name="launchBrowserDefault" msgid="2057951947297614725">"تشغيل المتصفح؟"</string>
<string name="SetupCallDefault" msgid="5834948469253758575">"هل تريد قبول المكالمة؟"</string>
- <!-- no translation found for activity_resolver_use_always (8017770747801494933) -->
- <skip />
+ <string name="activity_resolver_use_always" msgid="8017770747801494933">"دومًا"</string>
<string name="activity_resolver_use_once" msgid="405646673463328329">"مرة واحدة فقط"</string>
</resources>
diff --git a/core/res/res/values-be/strings.xml b/core/res/res/values-be/strings.xml
index 446f113..a95541e 100644
--- a/core/res/res/values-be/strings.xml
+++ b/core/res/res/values-be/strings.xml
@@ -175,28 +175,20 @@
<string name="permgroupdesc_location" msgid="5704679763124170100">"Кантраляваць сваё фізічнае месцазнаходжанне."</string>
<string name="permgrouplab_network" msgid="5808983377727109831">"Сеткавая сувязь"</string>
<string name="permgroupdesc_network" msgid="4478299413241861987">"Доступ да розных функцый сеткі."</string>
- <!-- no translation found for permgrouplab_bluetoothNetwork (1585403544162128109) -->
- <skip />
- <!-- no translation found for permgroupdesc_bluetoothNetwork (5625288577164282391) -->
- <skip />
- <!-- no translation found for permgrouplab_shortrangeNetwork (130808676377486118) -->
- <skip />
- <!-- no translation found for permgroupdesc_shortrangeNetwork (1884069062653436007) -->
- <skip />
+ <string name="permgrouplab_bluetoothNetwork" msgid="1585403544162128109">"Bluetooth"</string>
+ <string name="permgroupdesc_bluetoothNetwork" msgid="5625288577164282391">"Доступ да прылад і сетак праз Bluetooth."</string>
+ <string name="permgrouplab_shortrangeNetwork" msgid="130808676377486118">"Блізкія сеткі"</string>
+ <string name="permgroupdesc_shortrangeNetwork" msgid="1884069062653436007">"Доступ да прылад праз блізкія сеткі, напрыклад, NFC."</string>
<string name="permgrouplab_audioSettings" msgid="8329261670151871235">"Налады гуку"</string>
<string name="permgroupdesc_audioSettings" msgid="2641515403347568130">"Змена налад гуку."</string>
<string name="permgrouplab_affectsBattery" msgid="6209246653424798033">"Уплывае на батарэю"</string>
<string name="permgroupdesc_affectsBattery" msgid="6441275320638916947">"Выкарыстоўвайць магчымасці, якія могуць хутка разрадзіць батарэю."</string>
<string name="permgrouplab_calendar" msgid="5863508437783683902">"Каляндар"</string>
<string name="permgroupdesc_calendar" msgid="5777534316982184416">"Прамы доступ да календара і мерапрыемстваў."</string>
- <!-- no translation found for permgrouplab_dictionary (4148597128843641379) -->
- <skip />
- <!-- no translation found for permgroupdesc_dictionary (7921166355964764490) -->
- <skip />
- <!-- no translation found for permgrouplab_writeDictionary (8090237702432576788) -->
- <skip />
- <!-- no translation found for permgroupdesc_writeDictionary (2711561994497361646) -->
- <skip />
+ <string name="permgrouplab_dictionary" msgid="4148597128843641379">"Чытаць карыстальніцкі слоўнік"</string>
+ <string name="permgroupdesc_dictionary" msgid="7921166355964764490">"Чытаць словы ў карыстальніцкім слоўніку."</string>
+ <string name="permgrouplab_writeDictionary" msgid="8090237702432576788">"Запісаць карыстальніцкі слоўнік"</string>
+ <string name="permgroupdesc_writeDictionary" msgid="2711561994497361646">"Дадаць словы ў карыстальніцкі слоўнік."</string>
<string name="permgrouplab_bookmarks" msgid="1949519673103968229">"Закладкі і гісторыя"</string>
<string name="permgroupdesc_bookmarks" msgid="4169771606257963028">"Прамы доступ да закладак і гісторыі браўзера."</string>
<string name="permgrouplab_deviceAlarms" msgid="6117704629728824101">"Будзільнік"</string>
@@ -569,8 +561,7 @@
<string name="permdesc_sdcardRead" product="nosdcard" msgid="3530894470637667917">"Дазваляе прыкладанням чытаць змесціва USB-назапашвальніка, які можа змяшчаць фатаграфіі і мультымедыйныя файлы."</string>
<string name="permdesc_sdcardRead" product="default" msgid="2555811422562526606">"Дазваляе прыкладанням чытаць змесціва карты памяці SD-карты, якая можа ўключаць фатаграфіі і мультымедыйныя файлы."</string>
<string name="permlab_sdcardWrite" product="nosdcard" msgid="8485979062254666748">"зм. або выд. змес. USB-назап."</string>
- <!-- no translation found for permlab_sdcardWrite (8805693630050458763) -->
- <skip />
+ <string name="permlab_sdcardWrite" product="default" msgid="8805693630050458763">"змяніць або выдаліць змесціва SD-карты"</string>
<string name="permdesc_sdcardWrite" product="nosdcard" msgid="6175406299445710888">"Дазваляе прыкладаням выконваць запіс ва USB-назапашвальнік."</string>
<string name="permdesc_sdcardWrite" product="default" msgid="4337417790936632090">"Дазваляе прыкладанням запісваць на SD-карту."</string>
<string name="permlab_mediaStorageWrite" product="default" msgid="6859839199706879015">"змяніць/выдаліць унутраныя носьбіты змесціва"</string>
@@ -1090,8 +1081,7 @@
<string name="date_time_set" msgid="5777075614321087758">"Задаць"</string>
<string name="date_time_done" msgid="2507683751759308828">"Гатова"</string>
<string name="perms_new_perm_prefix" msgid="8257740710754301407"><font size="12" fgcolor="#ff900000">"НОВАЕ: "</font></string>
- <!-- no translation found for perms_description_app (5139836143293299417) -->
- <skip />
+ <string name="perms_description_app" msgid="5139836143293299417">"Прадастаўленыя прыкладаннем <xliff:g id="APP_NAME">%1$s</xliff:g>."</string>
<string name="no_permissions" msgid="7283357728219338112">"Дазволу не патрабуецца"</string>
<string name="usb_storage_activity_title" msgid="4465055157209648641">"Унiверсальны USB-назапашвальнік"</string>
<string name="usb_storage_title" msgid="5901459041398751495">"USB падлучаны"</string>
@@ -1321,8 +1311,6 @@
<string name="sending" msgid="3245653681008218030">"Адпраўка..."</string>
<string name="launchBrowserDefault" msgid="2057951947297614725">"Запусцiць браўзер?"</string>
<string name="SetupCallDefault" msgid="5834948469253758575">"Прыняць выклік?"</string>
- <!-- no translation found for activity_resolver_use_always (8017770747801494933) -->
- <skip />
- <!-- no translation found for activity_resolver_use_once (405646673463328329) -->
- <skip />
+ <string name="activity_resolver_use_always" msgid="8017770747801494933">"Заўсёды"</string>
+ <string name="activity_resolver_use_once" msgid="405646673463328329">"Толькі адзін раз"</string>
</resources>
diff --git a/core/res/res/values-bg/strings.xml b/core/res/res/values-bg/strings.xml
index b35eae5..6ebe576 100644
--- a/core/res/res/values-bg/strings.xml
+++ b/core/res/res/values-bg/strings.xml
@@ -175,28 +175,20 @@
<string name="permgroupdesc_location" msgid="5704679763124170100">"Наблюдавайте физическото си местоположение."</string>
<string name="permgrouplab_network" msgid="5808983377727109831">"Мрежова комуникация"</string>
<string name="permgroupdesc_network" msgid="4478299413241861987">"Осъществявайте достъп до различни мрежови функции."</string>
- <!-- no translation found for permgrouplab_bluetoothNetwork (1585403544162128109) -->
- <skip />
- <!-- no translation found for permgroupdesc_bluetoothNetwork (5625288577164282391) -->
- <skip />
- <!-- no translation found for permgrouplab_shortrangeNetwork (130808676377486118) -->
- <skip />
- <!-- no translation found for permgroupdesc_shortrangeNetwork (1884069062653436007) -->
- <skip />
+ <string name="permgrouplab_bluetoothNetwork" msgid="1585403544162128109">"Bluetooth"</string>
+ <string name="permgroupdesc_bluetoothNetwork" msgid="5625288577164282391">"Осъществяване на достъп до устройства и мрежи през Bluetooth."</string>
+ <string name="permgrouplab_shortrangeNetwork" msgid="130808676377486118">"Мрежи с малък обхват"</string>
+ <string name="permgroupdesc_shortrangeNetwork" msgid="1884069062653436007">"Осъществяване на достъп до устройства през мрежи с малък обхват, например КБП."</string>
<string name="permgrouplab_audioSettings" msgid="8329261670151871235">"Настройки за звука"</string>
<string name="permgroupdesc_audioSettings" msgid="2641515403347568130">"Промяна на настройките за звукa."</string>
<string name="permgrouplab_affectsBattery" msgid="6209246653424798033">"Оказване на влияние върху батерията"</string>
<string name="permgroupdesc_affectsBattery" msgid="6441275320638916947">"Използване на функции, които могат бързо да изразходят батерията."</string>
<string name="permgrouplab_calendar" msgid="5863508437783683902">"Календар"</string>
<string name="permgroupdesc_calendar" msgid="5777534316982184416">"Осъществяване на директен достъп до календара и събитията."</string>
- <!-- no translation found for permgrouplab_dictionary (4148597128843641379) -->
- <skip />
- <!-- no translation found for permgroupdesc_dictionary (7921166355964764490) -->
- <skip />
- <!-- no translation found for permgrouplab_writeDictionary (8090237702432576788) -->
- <skip />
- <!-- no translation found for permgroupdesc_writeDictionary (2711561994497361646) -->
- <skip />
+ <string name="permgrouplab_dictionary" msgid="4148597128843641379">"Четене на потребителския речник"</string>
+ <string name="permgroupdesc_dictionary" msgid="7921166355964764490">"Четене на думи в потребителския речник."</string>
+ <string name="permgrouplab_writeDictionary" msgid="8090237702432576788">"Записване в потребителския речник"</string>
+ <string name="permgroupdesc_writeDictionary" msgid="2711561994497361646">"Добавяне на думи в потребителския речник."</string>
<string name="permgrouplab_bookmarks" msgid="1949519673103968229">"Отметки и история"</string>
<string name="permgroupdesc_bookmarks" msgid="4169771606257963028">"Осъществяване на директен достъп до отметките и историята на браузъра."</string>
<string name="permgrouplab_deviceAlarms" msgid="6117704629728824101">"Будилник"</string>
@@ -569,8 +561,7 @@
<string name="permdesc_sdcardRead" product="nosdcard" msgid="3530894470637667917">"Разр. на прилож. да чете съдърж. от USB хран., което може да вкл. снимки и мултимедия."</string>
<string name="permdesc_sdcardRead" product="default" msgid="2555811422562526606">"Разрешава на приложението да чете съдържание от SD картата, което може да включва снимки и мултимедия."</string>
<string name="permlab_sdcardWrite" product="nosdcard" msgid="8485979062254666748">"промяна или изтрив. на съдърж. от USB хран. ви"</string>
- <!-- no translation found for permlab_sdcardWrite (8805693630050458763) -->
- <skip />
+ <string name="permlab_sdcardWrite" product="default" msgid="8805693630050458763">"промяна или изтриване на съдържанието от SD картата ви"</string>
<string name="permdesc_sdcardWrite" product="nosdcard" msgid="6175406299445710888">"Разрешава на приложението да записва в USB."</string>
<string name="permdesc_sdcardWrite" product="default" msgid="4337417790936632090">"Разрешава на приложението да записва върху SD картата."</string>
<string name="permlab_mediaStorageWrite" product="default" msgid="6859839199706879015">"пром./изтр. на съдърж. на вътр. мултим. хранил."</string>
@@ -1090,8 +1081,7 @@
<string name="date_time_set" msgid="5777075614321087758">"Задаване"</string>
<string name="date_time_done" msgid="2507683751759308828">"Готово"</string>
<string name="perms_new_perm_prefix" msgid="8257740710754301407"><font size="12" fgcolor="#ff900000">"НОВО: "</font></string>
- <!-- no translation found for perms_description_app (5139836143293299417) -->
- <skip />
+ <string name="perms_description_app" msgid="5139836143293299417">"Предоставено от <xliff:g id="APP_NAME">%1$s</xliff:g>."</string>
<string name="no_permissions" msgid="7283357728219338112">"Не се изискват разрешения"</string>
<string name="usb_storage_activity_title" msgid="4465055157209648641">"Масово USB хранилище"</string>
<string name="usb_storage_title" msgid="5901459041398751495">"Връзка през USB"</string>
@@ -1321,8 +1311,6 @@
<string name="sending" msgid="3245653681008218030">"Изпраща се..."</string>
<string name="launchBrowserDefault" msgid="2057951947297614725">"Да се стартира ли браузърът?"</string>
<string name="SetupCallDefault" msgid="5834948469253758575">"Да се приеме ли обаждането?"</string>
- <!-- no translation found for activity_resolver_use_always (8017770747801494933) -->
- <skip />
- <!-- no translation found for activity_resolver_use_once (405646673463328329) -->
- <skip />
+ <string name="activity_resolver_use_always" msgid="8017770747801494933">"Винаги"</string>
+ <string name="activity_resolver_use_once" msgid="405646673463328329">"Само веднъж"</string>
</resources>
diff --git a/core/res/res/values-cs/strings.xml b/core/res/res/values-cs/strings.xml
index dd6d0b1..fb8f466 100644
--- a/core/res/res/values-cs/strings.xml
+++ b/core/res/res/values-cs/strings.xml
@@ -175,28 +175,20 @@
<string name="permgroupdesc_location" msgid="5704679763124170100">"Sledovat vaši fyzickou polohu."</string>
<string name="permgrouplab_network" msgid="5808983377727109831">"Síťová komunikace"</string>
<string name="permgroupdesc_network" msgid="4478299413241861987">"Přístup k různým funkcím sítě."</string>
- <!-- no translation found for permgrouplab_bluetoothNetwork (1585403544162128109) -->
- <skip />
- <!-- no translation found for permgroupdesc_bluetoothNetwork (5625288577164282391) -->
- <skip />
- <!-- no translation found for permgrouplab_shortrangeNetwork (130808676377486118) -->
- <skip />
- <!-- no translation found for permgroupdesc_shortrangeNetwork (1884069062653436007) -->
- <skip />
+ <string name="permgrouplab_bluetoothNetwork" msgid="1585403544162128109">"Bluetooth"</string>
+ <string name="permgroupdesc_bluetoothNetwork" msgid="5625288577164282391">"Přístup do zařízení a k sítím prostřednictvím rozhraní Bluetooth."</string>
+ <string name="permgrouplab_shortrangeNetwork" msgid="130808676377486118">"Sítě krátkého dosahu"</string>
+ <string name="permgroupdesc_shortrangeNetwork" msgid="1884069062653436007">"Přístup do zařízení prostřednictvím sítí krátkého dosahu, např. NFC."</string>
<string name="permgrouplab_audioSettings" msgid="8329261670151871235">"Nastavení zvuku"</string>
<string name="permgroupdesc_audioSettings" msgid="2641515403347568130">"Změna nastavení zvuku"</string>
<string name="permgrouplab_affectsBattery" msgid="6209246653424798033">"Vliv na baterii"</string>
<string name="permgroupdesc_affectsBattery" msgid="6441275320638916947">"Používání funkcí, které mohou rychle vyčerpat baterii"</string>
<string name="permgrouplab_calendar" msgid="5863508437783683902">"Kalendář"</string>
<string name="permgroupdesc_calendar" msgid="5777534316982184416">"Přímý přístup ke kalendáři a událostem"</string>
- <!-- no translation found for permgrouplab_dictionary (4148597128843641379) -->
- <skip />
- <!-- no translation found for permgroupdesc_dictionary (7921166355964764490) -->
- <skip />
- <!-- no translation found for permgrouplab_writeDictionary (8090237702432576788) -->
- <skip />
- <!-- no translation found for permgroupdesc_writeDictionary (2711561994497361646) -->
- <skip />
+ <string name="permgrouplab_dictionary" msgid="4148597128843641379">"Čtení uživatelského slovníku"</string>
+ <string name="permgroupdesc_dictionary" msgid="7921166355964764490">"Čtení slov v uživatelském slovníku."</string>
+ <string name="permgrouplab_writeDictionary" msgid="8090237702432576788">"Zápis do uživatelského slovníku"</string>
+ <string name="permgroupdesc_writeDictionary" msgid="2711561994497361646">"Přidávání slov do uživatelského slovníku."</string>
<string name="permgrouplab_bookmarks" msgid="1949519673103968229">"Záložky a historie"</string>
<string name="permgroupdesc_bookmarks" msgid="4169771606257963028">"Přímý přístup k záložkám a historii prohlížení"</string>
<string name="permgrouplab_deviceAlarms" msgid="6117704629728824101">"Budík"</string>
@@ -569,8 +561,7 @@
<string name="permdesc_sdcardRead" product="nosdcard" msgid="3530894470637667917">"Umožňuje aplikaci číst obsah úložiště USB, který může zahrnovat fotografie a média."</string>
<string name="permdesc_sdcardRead" product="default" msgid="2555811422562526606">"Umožňuje aplikaci číst obsah karty SD, který může zahrnovat fotografie a média."</string>
<string name="permlab_sdcardWrite" product="nosdcard" msgid="8485979062254666748">"úprava nebo smazání obsahu v úložišti USB"</string>
- <!-- no translation found for permlab_sdcardWrite (8805693630050458763) -->
- <skip />
+ <string name="permlab_sdcardWrite" product="default" msgid="8805693630050458763">"úprava nebo smazání obsahu na kartě SD"</string>
<string name="permdesc_sdcardWrite" product="nosdcard" msgid="6175406299445710888">"Umožňuje aplikaci zapisovat do úložiště USB."</string>
<string name="permdesc_sdcardWrite" product="default" msgid="4337417790936632090">"Umožňuje aplikaci zapisovat na kartu SD."</string>
<string name="permlab_mediaStorageWrite" product="default" msgid="6859839199706879015">"Upravit/smazat interní úlož."</string>
@@ -1090,8 +1081,7 @@
<string name="date_time_set" msgid="5777075614321087758">"Nastavit"</string>
<string name="date_time_done" msgid="2507683751759308828">"Hotovo"</string>
<string name="perms_new_perm_prefix" msgid="8257740710754301407"><font size="12" fgcolor="#ff900000">"NOVÉ: "</font></string>
- <!-- no translation found for perms_description_app (5139836143293299417) -->
- <skip />
+ <string name="perms_description_app" msgid="5139836143293299417">"Poskytuje: <xliff:g id="APP_NAME">%1$s</xliff:g>."</string>
<string name="no_permissions" msgid="7283357728219338112">"Nejsou vyžadována žádná oprávnění"</string>
<string name="usb_storage_activity_title" msgid="4465055157209648641">"Velkokapacitní paměťové zařízení USB"</string>
<string name="usb_storage_title" msgid="5901459041398751495">"USB připojeno"</string>
@@ -1321,8 +1311,6 @@
<string name="sending" msgid="3245653681008218030">"Odesílání..."</string>
<string name="launchBrowserDefault" msgid="2057951947297614725">"Spustit prohlížeč?"</string>
<string name="SetupCallDefault" msgid="5834948469253758575">"Přijmout hovor?"</string>
- <!-- no translation found for activity_resolver_use_always (8017770747801494933) -->
- <skip />
- <!-- no translation found for activity_resolver_use_once (405646673463328329) -->
- <skip />
+ <string name="activity_resolver_use_always" msgid="8017770747801494933">"Vždy"</string>
+ <string name="activity_resolver_use_once" msgid="405646673463328329">"Pouze jednou"</string>
</resources>
diff --git a/core/res/res/values-da/strings.xml b/core/res/res/values-da/strings.xml
index e46ff7c..d31afa1 100644
--- a/core/res/res/values-da/strings.xml
+++ b/core/res/res/values-da/strings.xml
@@ -175,28 +175,20 @@
<string name="permgroupdesc_location" msgid="5704679763124170100">"Overvåg din fysiske placering."</string>
<string name="permgrouplab_network" msgid="5808983377727109831">"Netværkskommunikation"</string>
<string name="permgroupdesc_network" msgid="4478299413241861987">"Få adgang til forskellige netværksfunktioner."</string>
- <!-- no translation found for permgrouplab_bluetoothNetwork (1585403544162128109) -->
- <skip />
- <!-- no translation found for permgroupdesc_bluetoothNetwork (5625288577164282391) -->
- <skip />
- <!-- no translation found for permgrouplab_shortrangeNetwork (130808676377486118) -->
- <skip />
- <!-- no translation found for permgroupdesc_shortrangeNetwork (1884069062653436007) -->
- <skip />
+ <string name="permgrouplab_bluetoothNetwork" msgid="1585403544162128109">"Bluetooth"</string>
+ <string name="permgroupdesc_bluetoothNetwork" msgid="5625288577164282391">"Få adgang til enheder og netværk via Bluetooth."</string>
+ <string name="permgrouplab_shortrangeNetwork" msgid="130808676377486118">"Kortrækkende netværk"</string>
+ <string name="permgroupdesc_shortrangeNetwork" msgid="1884069062653436007">"Få adgang til enheder via kortrækkende netværk, f.eks NFC."</string>
<string name="permgrouplab_audioSettings" msgid="8329261670151871235">"Lydindstillinger"</string>
<string name="permgroupdesc_audioSettings" msgid="2641515403347568130">"Skifte lydindstillinger."</string>
<string name="permgrouplab_affectsBattery" msgid="6209246653424798033">"Påvirker batteriet"</string>
<string name="permgroupdesc_affectsBattery" msgid="6441275320638916947">"Bruge funktioner, der hurtigt kan dræne batteriet."</string>
<string name="permgrouplab_calendar" msgid="5863508437783683902">"Kalender"</string>
<string name="permgroupdesc_calendar" msgid="5777534316982184416">"Direkte adgang til kalender og begivenheder."</string>
- <!-- no translation found for permgrouplab_dictionary (4148597128843641379) -->
- <skip />
- <!-- no translation found for permgroupdesc_dictionary (7921166355964764490) -->
- <skip />
- <!-- no translation found for permgrouplab_writeDictionary (8090237702432576788) -->
- <skip />
- <!-- no translation found for permgroupdesc_writeDictionary (2711561994497361646) -->
- <skip />
+ <string name="permgrouplab_dictionary" msgid="4148597128843641379">"Læs brugerordbog"</string>
+ <string name="permgroupdesc_dictionary" msgid="7921166355964764490">"Læs ord i brugerordbogen."</string>
+ <string name="permgrouplab_writeDictionary" msgid="8090237702432576788">"Skriv brugerordbog"</string>
+ <string name="permgroupdesc_writeDictionary" msgid="2711561994497361646">"Føj ord til brugerordbogen."</string>
<string name="permgrouplab_bookmarks" msgid="1949519673103968229">"Bogmærker og historik"</string>
<string name="permgroupdesc_bookmarks" msgid="4169771606257963028">"Direkte adgang til bogmærker og browserhistorik."</string>
<string name="permgrouplab_deviceAlarms" msgid="6117704629728824101">"Alarm"</string>
@@ -569,8 +561,7 @@
<string name="permdesc_sdcardRead" product="nosdcard" msgid="3530894470637667917">"Tillader, at appen læser USB-lagerets indhold, herunder billeder og mediefiler."</string>
<string name="permdesc_sdcardRead" product="default" msgid="2555811422562526606">"Tillader, at appen læser SD-kortets indhold, som kan omfatte billeder og mediefiler."</string>
<string name="permlab_sdcardWrite" product="nosdcard" msgid="8485979062254666748">"ændre eller slette indhold på USB-lager"</string>
- <!-- no translation found for permlab_sdcardWrite (8805693630050458763) -->
- <skip />
+ <string name="permlab_sdcardWrite" product="default" msgid="8805693630050458763">"skift eller slet indholdet på dit SD-kort"</string>
<string name="permdesc_sdcardWrite" product="nosdcard" msgid="6175406299445710888">"Lader appen skrive til USB."</string>
<string name="permdesc_sdcardWrite" product="default" msgid="4337417790936632090">"Tillader, at appen kan skrive til SD-kortet."</string>
<string name="permlab_mediaStorageWrite" product="default" msgid="6859839199706879015">"Rediger/slet internt medielagringsindhold"</string>
@@ -1090,8 +1081,7 @@
<string name="date_time_set" msgid="5777075614321087758">"Angiv"</string>
<string name="date_time_done" msgid="2507683751759308828">"Udført"</string>
<string name="perms_new_perm_prefix" msgid="8257740710754301407"><font size="12" fgcolor="#ff900000">"NYHED! "</font></string>
- <!-- no translation found for perms_description_app (5139836143293299417) -->
- <skip />
+ <string name="perms_description_app" msgid="5139836143293299417">"Leveret af <xliff:g id="APP_NAME">%1$s</xliff:g>."</string>
<string name="no_permissions" msgid="7283357728219338112">"Der kræves ingen tilladelser"</string>
<string name="usb_storage_activity_title" msgid="4465055157209648641">"USB-masselager"</string>
<string name="usb_storage_title" msgid="5901459041398751495">"USB er tilsluttet"</string>
@@ -1322,6 +1312,5 @@
<string name="launchBrowserDefault" msgid="2057951947297614725">"Vil du starte browseren?"</string>
<string name="SetupCallDefault" msgid="5834948469253758575">"Vil du besvare opkaldet?"</string>
<string name="activity_resolver_use_always" msgid="8017770747801494933">"Altid"</string>
- <!-- no translation found for activity_resolver_use_once (405646673463328329) -->
- <skip />
+ <string name="activity_resolver_use_once" msgid="405646673463328329">"Kun denne ene gang"</string>
</resources>
diff --git a/core/res/res/values-de/strings.xml b/core/res/res/values-de/strings.xml
index 9145263..225f8e6 100644
--- a/core/res/res/values-de/strings.xml
+++ b/core/res/res/values-de/strings.xml
@@ -175,28 +175,20 @@
<string name="permgroupdesc_location" msgid="5704679763124170100">"Ihren physischen Standort überwachen"</string>
<string name="permgrouplab_network" msgid="5808983377727109831">"Netzkommunikation"</string>
<string name="permgroupdesc_network" msgid="4478299413241861987">"Zugriff auf verschiedene Netzwerkfunktionen"</string>
- <!-- no translation found for permgrouplab_bluetoothNetwork (1585403544162128109) -->
- <skip />
- <!-- no translation found for permgroupdesc_bluetoothNetwork (5625288577164282391) -->
- <skip />
- <!-- no translation found for permgrouplab_shortrangeNetwork (130808676377486118) -->
- <skip />
- <!-- no translation found for permgroupdesc_shortrangeNetwork (1884069062653436007) -->
- <skip />
+ <string name="permgrouplab_bluetoothNetwork" msgid="1585403544162128109">"Bluetooth"</string>
+ <string name="permgroupdesc_bluetoothNetwork" msgid="5625288577164282391">"Auf Geräte und Netzwerke über Bluetooth zugreifen"</string>
+ <string name="permgrouplab_shortrangeNetwork" msgid="130808676377486118">"Netzwerke im Nahbereich"</string>
+ <string name="permgroupdesc_shortrangeNetwork" msgid="1884069062653436007">"Auf Geräte über Netzwerke im Nahbereich wie NFC zugreifen"</string>
<string name="permgrouplab_audioSettings" msgid="8329261670151871235">"Audioeinstellungen"</string>
<string name="permgroupdesc_audioSettings" msgid="2641515403347568130">"Audioeinstellungen ändern"</string>
<string name="permgrouplab_affectsBattery" msgid="6209246653424798033">"Wirkt sich auf den Akku aus"</string>
<string name="permgroupdesc_affectsBattery" msgid="6441275320638916947">"Funktionen nutzen, die den Akku schnell entladen"</string>
<string name="permgrouplab_calendar" msgid="5863508437783683902">"Kalender"</string>
<string name="permgroupdesc_calendar" msgid="5777534316982184416">"Direkter Zugriff auf Kalender und Termine"</string>
- <!-- no translation found for permgrouplab_dictionary (4148597128843641379) -->
- <skip />
- <!-- no translation found for permgroupdesc_dictionary (7921166355964764490) -->
- <skip />
- <!-- no translation found for permgrouplab_writeDictionary (8090237702432576788) -->
- <skip />
- <!-- no translation found for permgroupdesc_writeDictionary (2711561994497361646) -->
- <skip />
+ <string name="permgrouplab_dictionary" msgid="4148597128843641379">"Ihr Wörterbuch lesen"</string>
+ <string name="permgroupdesc_dictionary" msgid="7921166355964764490">"Wörter in Ihrem Wörterbuch lesen"</string>
+ <string name="permgrouplab_writeDictionary" msgid="8090237702432576788">"In Ihrem Wörterbuch schreiben"</string>
+ <string name="permgroupdesc_writeDictionary" msgid="2711561994497361646">"Wörter zu Ihrem Wörterbuch hinzufügen"</string>
<string name="permgrouplab_bookmarks" msgid="1949519673103968229">"Lesezeichen und Verlauf"</string>
<string name="permgroupdesc_bookmarks" msgid="4169771606257963028">"Direkter Zugriff auf Lesezeichen und Browserverlauf"</string>
<string name="permgrouplab_deviceAlarms" msgid="6117704629728824101">"Wecker"</string>
@@ -569,8 +561,7 @@
<string name="permdesc_sdcardRead" product="nosdcard" msgid="3530894470637667917">"Ermöglicht der App, die Inhalte des USB-Speichers einschließlich Fotos und Medien, zu lesen"</string>
<string name="permdesc_sdcardRead" product="default" msgid="2555811422562526606">"Ermöglicht der App, die Inhalte der SD-Karte einschließlich Fotos und Medien, zu lesen"</string>
<string name="permlab_sdcardWrite" product="nosdcard" msgid="8485979062254666748">"USB-Speicherinhalte ändern oder löschen"</string>
- <!-- no translation found for permlab_sdcardWrite (8805693630050458763) -->
- <skip />
+ <string name="permlab_sdcardWrite" product="default" msgid="8805693630050458763">"SD-Karteninhalte ändern oder löschen"</string>
<string name="permdesc_sdcardWrite" product="nosdcard" msgid="6175406299445710888">"Ermöglicht der App, in den USB-Speicher zu schreiben"</string>
<string name="permdesc_sdcardWrite" product="default" msgid="4337417790936632090">"Ermöglicht der App, auf die SD-Karte zu schreiben"</string>
<string name="permlab_mediaStorageWrite" product="default" msgid="6859839199706879015">"Intern. Mediensp. änd./löschen"</string>
@@ -1090,8 +1081,7 @@
<string name="date_time_set" msgid="5777075614321087758">"Speichern"</string>
<string name="date_time_done" msgid="2507683751759308828">"Fertig"</string>
<string name="perms_new_perm_prefix" msgid="8257740710754301407"><font size="12" fgcolor="#ff900000">"Neu: "</font></string>
- <!-- no translation found for perms_description_app (5139836143293299417) -->
- <skip />
+ <string name="perms_description_app" msgid="5139836143293299417">"Zur Verfügung gestellt von <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
<string name="no_permissions" msgid="7283357728219338112">"Keine Berechtigungen erforderlich"</string>
<string name="usb_storage_activity_title" msgid="4465055157209648641">"USB-Massenspeicher"</string>
<string name="usb_storage_title" msgid="5901459041398751495">"USB-Verbindung"</string>
@@ -1322,6 +1312,5 @@
<string name="launchBrowserDefault" msgid="2057951947297614725">"Browser starten?"</string>
<string name="SetupCallDefault" msgid="5834948469253758575">"Anruf annehmen?"</string>
<string name="activity_resolver_use_always" msgid="8017770747801494933">"Immer"</string>
- <!-- no translation found for activity_resolver_use_once (405646673463328329) -->
- <skip />
+ <string name="activity_resolver_use_once" msgid="405646673463328329">"Nur einmal"</string>
</resources>
diff --git a/core/res/res/values-es-rUS/strings.xml b/core/res/res/values-es-rUS/strings.xml
index 94d7a4b..0da38aa 100644
--- a/core/res/res/values-es-rUS/strings.xml
+++ b/core/res/res/values-es-rUS/strings.xml
@@ -175,28 +175,20 @@
<string name="permgroupdesc_location" msgid="5704679763124170100">"Controlar tu ubicación física"</string>
<string name="permgrouplab_network" msgid="5808983377727109831">"Comunicación de red"</string>
<string name="permgroupdesc_network" msgid="4478299413241861987">"Acceder a distintas funciones de red"</string>
- <!-- no translation found for permgrouplab_bluetoothNetwork (1585403544162128109) -->
- <skip />
- <!-- no translation found for permgroupdesc_bluetoothNetwork (5625288577164282391) -->
- <skip />
- <!-- no translation found for permgrouplab_shortrangeNetwork (130808676377486118) -->
- <skip />
- <!-- no translation found for permgroupdesc_shortrangeNetwork (1884069062653436007) -->
- <skip />
+ <string name="permgrouplab_bluetoothNetwork" msgid="1585403544162128109">"Bluetooth"</string>
+ <string name="permgroupdesc_bluetoothNetwork" msgid="5625288577164282391">"Acceder a dispositivos y redes a través de Bluetooth"</string>
+ <string name="permgrouplab_shortrangeNetwork" msgid="130808676377486118">"Redes de corto alcance"</string>
+ <string name="permgroupdesc_shortrangeNetwork" msgid="1884069062653436007">"Acceder a dispositivos a través de redes de corto alcance, como NFC"</string>
<string name="permgrouplab_audioSettings" msgid="8329261670151871235">"Configuración de audio"</string>
<string name="permgroupdesc_audioSettings" msgid="2641515403347568130">"Cambiar la configuración de audio"</string>
<string name="permgrouplab_affectsBattery" msgid="6209246653424798033">"Afecta la batería."</string>
<string name="permgroupdesc_affectsBattery" msgid="6441275320638916947">"Uso de las características que se pueden agotar rápidamente la batería"</string>
<string name="permgrouplab_calendar" msgid="5863508437783683902">"Calendario"</string>
<string name="permgroupdesc_calendar" msgid="5777534316982184416">"Acceso directo a calendario y eventos"</string>
- <!-- no translation found for permgrouplab_dictionary (4148597128843641379) -->
- <skip />
- <!-- no translation found for permgroupdesc_dictionary (7921166355964764490) -->
- <skip />
- <!-- no translation found for permgrouplab_writeDictionary (8090237702432576788) -->
- <skip />
- <!-- no translation found for permgroupdesc_writeDictionary (2711561994497361646) -->
- <skip />
+ <string name="permgrouplab_dictionary" msgid="4148597128843641379">"Leer el diccionario del usuario"</string>
+ <string name="permgroupdesc_dictionary" msgid="7921166355964764490">"Leer palabras del diccionario del usuario"</string>
+ <string name="permgrouplab_writeDictionary" msgid="8090237702432576788">"Escribir en el diccionario del usuario"</string>
+ <string name="permgroupdesc_writeDictionary" msgid="2711561994497361646">"Agregar palabras al diccionario del usuario"</string>
<string name="permgrouplab_bookmarks" msgid="1949519673103968229">"Marcadores e historial"</string>
<string name="permgroupdesc_bookmarks" msgid="4169771606257963028">"Acceso directo a marcadores e historial del navegador"</string>
<string name="permgrouplab_deviceAlarms" msgid="6117704629728824101">"Alarma"</string>
@@ -569,8 +561,7 @@
<string name="permdesc_sdcardRead" product="nosdcard" msgid="3530894470637667917">"Permite leer contenido USB."</string>
<string name="permdesc_sdcardRead" product="default" msgid="2555811422562526606">"Permite que la aplicación lea el contenido de la tarjeta SD que puede incluir fotos y archivos multimedia."</string>
<string name="permlab_sdcardWrite" product="nosdcard" msgid="8485979062254666748">"modificar/borrar contenido USB"</string>
- <!-- no translation found for permlab_sdcardWrite (8805693630050458763) -->
- <skip />
+ <string name="permlab_sdcardWrite" product="default" msgid="8805693630050458763">"modificar o eliminar el contenido de la tarjeta SD"</string>
<string name="permdesc_sdcardWrite" product="nosdcard" msgid="6175406299445710888">"Permite que la aplicación escriba en el almacenamiento USB."</string>
<string name="permdesc_sdcardWrite" product="default" msgid="4337417790936632090">"Admite que la aplicación escriba en la tarjeta SD."</string>
<string name="permlab_mediaStorageWrite" product="default" msgid="6859839199706879015">"modificar/eliminar los contenidos del almacenamientos de medios internos"</string>
@@ -1090,8 +1081,7 @@
<string name="date_time_set" msgid="5777075614321087758">"Establecer"</string>
<string name="date_time_done" msgid="2507683751759308828">"Listo"</string>
<string name="perms_new_perm_prefix" msgid="8257740710754301407"><font size="12" fgcolor="#ff900000">"NUEVO: "</font></string>
- <!-- no translation found for perms_description_app (5139836143293299417) -->
- <skip />
+ <string name="perms_description_app" msgid="5139836143293299417">"Proporcionado por <xliff:g id="APP_NAME">%1$s</xliff:g>."</string>
<string name="no_permissions" msgid="7283357728219338112">"No se requieren permisos"</string>
<string name="usb_storage_activity_title" msgid="4465055157209648641">"Almacenamiento USB masivo"</string>
<string name="usb_storage_title" msgid="5901459041398751495">"Conectado al USB"</string>
@@ -1323,6 +1313,5 @@
<string name="SetupCallDefault" msgid="5834948469253758575">"¿Aceptar la llamada?"</string>
<!-- no translation found for activity_resolver_use_always (8017770747801494933) -->
<skip />
- <!-- no translation found for activity_resolver_use_once (405646673463328329) -->
- <skip />
+ <string name="activity_resolver_use_once" msgid="405646673463328329">"Solo una vez"</string>
</resources>
diff --git a/core/res/res/values-et/strings.xml b/core/res/res/values-et/strings.xml
index c87b0cc..88f8fdb 100644
--- a/core/res/res/values-et/strings.xml
+++ b/core/res/res/values-et/strings.xml
@@ -175,28 +175,20 @@
<string name="permgroupdesc_location" msgid="5704679763124170100">"Jälgige oma füüsilist asukohta."</string>
<string name="permgrouplab_network" msgid="5808983377727109831">"Võrgusuhtlus"</string>
<string name="permgroupdesc_network" msgid="4478299413241861987">"Juurdepääs erinevatele võrgufunktsioonidele."</string>
- <!-- no translation found for permgrouplab_bluetoothNetwork (1585403544162128109) -->
- <skip />
- <!-- no translation found for permgroupdesc_bluetoothNetwork (5625288577164282391) -->
- <skip />
- <!-- no translation found for permgrouplab_shortrangeNetwork (130808676377486118) -->
- <skip />
- <!-- no translation found for permgroupdesc_shortrangeNetwork (1884069062653436007) -->
- <skip />
+ <string name="permgrouplab_bluetoothNetwork" msgid="1585403544162128109">"Bluetooth"</string>
+ <string name="permgroupdesc_bluetoothNetwork" msgid="5625288577164282391">"Juurdepääs seadmetele ja võrkudele Bluetoothi kaudu."</string>
+ <string name="permgrouplab_shortrangeNetwork" msgid="130808676377486118">"Lähisidevõrgud"</string>
+ <string name="permgroupdesc_shortrangeNetwork" msgid="1884069062653436007">"Juurdepääs seadmetele lähisidevõrgu (nt NFC) kaudu."</string>
<string name="permgrouplab_audioSettings" msgid="8329261670151871235">"Heliseaded"</string>
<string name="permgroupdesc_audioSettings" msgid="2641515403347568130">"Heliseadete muutmine."</string>
<string name="permgrouplab_affectsBattery" msgid="6209246653424798033">"Aku mõjutamine"</string>
<string name="permgroupdesc_affectsBattery" msgid="6441275320638916947">"Funktsioonide, mis võivad aku kiiresti tühjendada, kasutamine."</string>
<string name="permgrouplab_calendar" msgid="5863508437783683902">"Kalender"</string>
<string name="permgroupdesc_calendar" msgid="5777534316982184416">"Otsene juurdepääs kalendrile ja sündmustele."</string>
- <!-- no translation found for permgrouplab_dictionary (4148597128843641379) -->
- <skip />
- <!-- no translation found for permgroupdesc_dictionary (7921166355964764490) -->
- <skip />
- <!-- no translation found for permgrouplab_writeDictionary (8090237702432576788) -->
- <skip />
- <!-- no translation found for permgroupdesc_writeDictionary (2711561994497361646) -->
- <skip />
+ <string name="permgrouplab_dictionary" msgid="4148597128843641379">"Kasutaja sõnaraamatu lugemine"</string>
+ <string name="permgroupdesc_dictionary" msgid="7921166355964764490">"Kasutaja sõnaraamatu sõnade lugemine."</string>
+ <string name="permgrouplab_writeDictionary" msgid="8090237702432576788">"Kasutaja sõnaraamatusse kirjutamine"</string>
+ <string name="permgroupdesc_writeDictionary" msgid="2711561994497361646">"Kasutaja sõnaraamatusse sõnade lisamine."</string>
<string name="permgrouplab_bookmarks" msgid="1949519673103968229">"Järjehoidjad ja ajalugu"</string>
<string name="permgroupdesc_bookmarks" msgid="4169771606257963028">"Otsene juurdepääs järjehoidjatele ja brauseri ajaloole."</string>
<string name="permgrouplab_deviceAlarms" msgid="6117704629728824101">"Alarm"</string>
@@ -569,8 +561,7 @@
<string name="permdesc_sdcardRead" product="nosdcard" msgid="3530894470637667917">"Võim. lugeda USB-ruumi sisu."</string>
<string name="permdesc_sdcardRead" product="default" msgid="2555811422562526606">"Võimaldab rakendusel lugeda SD-kaardi sisu, mis võib sisaldada fotosid ja meediume."</string>
<string name="permlab_sdcardWrite" product="nosdcard" msgid="8485979062254666748">"muutke, kustut. USB-ruumi sisu"</string>
- <!-- no translation found for permlab_sdcardWrite (8805693630050458763) -->
- <skip />
+ <string name="permlab_sdcardWrite" product="default" msgid="8805693630050458763">"SD-kaardi sisu muutmine või kustutamine"</string>
<string name="permdesc_sdcardWrite" product="nosdcard" msgid="6175406299445710888">"Võimaldab rakendusel kirjutada USB-mäluseadmele."</string>
<string name="permdesc_sdcardWrite" product="default" msgid="4337417790936632090">"Võimaldab rakendusel kirjutada SD-kaardile."</string>
<string name="permlab_mediaStorageWrite" product="default" msgid="6859839199706879015">"sisemälu sisu muutm./kustut."</string>
@@ -1090,8 +1081,7 @@
<string name="date_time_set" msgid="5777075614321087758">"Määra"</string>
<string name="date_time_done" msgid="2507683751759308828">"Valmis"</string>
<string name="perms_new_perm_prefix" msgid="8257740710754301407"><font size="12" fgcolor="#ff900000">"UUS: "</font></string>
- <!-- no translation found for perms_description_app (5139836143293299417) -->
- <skip />
+ <string name="perms_description_app" msgid="5139836143293299417">"Teenusepakkuja: <xliff:g id="APP_NAME">%1$s</xliff:g>."</string>
<string name="no_permissions" msgid="7283357728219338112">"Lube pole vaja"</string>
<string name="usb_storage_activity_title" msgid="4465055157209648641">"USB-massmälu"</string>
<string name="usb_storage_title" msgid="5901459041398751495">"USB ühendatud"</string>
@@ -1321,8 +1311,6 @@
<string name="sending" msgid="3245653681008218030">"Saatmine ..."</string>
<string name="launchBrowserDefault" msgid="2057951947297614725">"Kas käivitada brauser?"</string>
<string name="SetupCallDefault" msgid="5834948469253758575">"Kas vastata kõnele?"</string>
- <!-- no translation found for activity_resolver_use_always (8017770747801494933) -->
- <skip />
- <!-- no translation found for activity_resolver_use_once (405646673463328329) -->
- <skip />
+ <string name="activity_resolver_use_always" msgid="8017770747801494933">"Alati"</string>
+ <string name="activity_resolver_use_once" msgid="405646673463328329">"Ainult üks kord"</string>
</resources>
diff --git a/core/res/res/values-fa/strings.xml b/core/res/res/values-fa/strings.xml
index 77bba4d..26b5e77 100644
--- a/core/res/res/values-fa/strings.xml
+++ b/core/res/res/values-fa/strings.xml
@@ -1311,7 +1311,6 @@
<string name="sending" msgid="3245653681008218030">"درحال ارسال..."</string>
<string name="launchBrowserDefault" msgid="2057951947297614725">"مرورگر راهاندازی شود؟"</string>
<string name="SetupCallDefault" msgid="5834948469253758575">"تماس را میپذیرید؟"</string>
- <!-- no translation found for activity_resolver_use_always (8017770747801494933) -->
- <skip />
+ <string name="activity_resolver_use_always" msgid="8017770747801494933">"همیشه"</string>
<string name="activity_resolver_use_once" msgid="405646673463328329">"فقط یکبار"</string>
</resources>
diff --git a/core/res/res/values-fi/strings.xml b/core/res/res/values-fi/strings.xml
index 8f244c0..3d6d5b0 100644
--- a/core/res/res/values-fi/strings.xml
+++ b/core/res/res/values-fi/strings.xml
@@ -175,28 +175,20 @@
<string name="permgroupdesc_location" msgid="5704679763124170100">"Tarkkaile fyysistä sijaintiasi."</string>
<string name="permgrouplab_network" msgid="5808983377727109831">"Verkkoviestintä"</string>
<string name="permgroupdesc_network" msgid="4478299413241861987">"Käyttää useita verkon ominaisuuksia."</string>
- <!-- no translation found for permgrouplab_bluetoothNetwork (1585403544162128109) -->
- <skip />
- <!-- no translation found for permgroupdesc_bluetoothNetwork (5625288577164282391) -->
- <skip />
- <!-- no translation found for permgrouplab_shortrangeNetwork (130808676377486118) -->
- <skip />
- <!-- no translation found for permgroupdesc_shortrangeNetwork (1884069062653436007) -->
- <skip />
+ <string name="permgrouplab_bluetoothNetwork" msgid="1585403544162128109">"Bluetooth"</string>
+ <string name="permgroupdesc_bluetoothNetwork" msgid="5625288577164282391">"Käytä laitteita ja verkkoja Bluetooth-yhteyden kautta."</string>
+ <string name="permgrouplab_shortrangeNetwork" msgid="130808676377486118">"Lyhyen kantaman verkot"</string>
+ <string name="permgroupdesc_shortrangeNetwork" msgid="1884069062653436007">"Käytä laitteita lyhyen kantaman verkkojen kuten NFC:n kautta."</string>
<string name="permgrouplab_audioSettings" msgid="8329261670151871235">"Ääniasetukset"</string>
<string name="permgroupdesc_audioSettings" msgid="2641515403347568130">"Muuta ääniasetuksia."</string>
<string name="permgrouplab_affectsBattery" msgid="6209246653424798033">"Vaikuttaa akun kestoon"</string>
<string name="permgroupdesc_affectsBattery" msgid="6441275320638916947">"Käytä ominaisuuksia, jotka voivat tyhjentää akun nopeasti."</string>
<string name="permgrouplab_calendar" msgid="5863508437783683902">"Kalenteri"</string>
<string name="permgroupdesc_calendar" msgid="5777534316982184416">"Kalenterin ja tapahtumien käyttöoikeus."</string>
- <!-- no translation found for permgrouplab_dictionary (4148597128843641379) -->
- <skip />
- <!-- no translation found for permgroupdesc_dictionary (7921166355964764490) -->
- <skip />
- <!-- no translation found for permgrouplab_writeDictionary (8090237702432576788) -->
- <skip />
- <!-- no translation found for permgroupdesc_writeDictionary (2711561994497361646) -->
- <skip />
+ <string name="permgrouplab_dictionary" msgid="4148597128843641379">"Lue käyttäjän sanakirjaa"</string>
+ <string name="permgroupdesc_dictionary" msgid="7921166355964764490">"Lue sanoja käyttäjän sanakirjasta."</string>
+ <string name="permgrouplab_writeDictionary" msgid="8090237702432576788">"Kirjoita käyttäjän sanakirjaan"</string>
+ <string name="permgroupdesc_writeDictionary" msgid="2711561994497361646">"Lisää sanoja käyttäjän sanakirjaan."</string>
<string name="permgrouplab_bookmarks" msgid="1949519673103968229">"Kirjanmerkit ja historia"</string>
<string name="permgroupdesc_bookmarks" msgid="4169771606257963028">"Kirjanmerkkien ja selaimen historian käyttöoikeus."</string>
<string name="permgrouplab_deviceAlarms" msgid="6117704629728824101">"Herätys"</string>
@@ -569,8 +561,7 @@
<string name="permdesc_sdcardRead" product="nosdcard" msgid="3530894470637667917">"Lue USB-muistin sisältöä (kuvia ja mediaa)."</string>
<string name="permdesc_sdcardRead" product="default" msgid="2555811422562526606">"Antaa sovelluksen lukea SD-kortin sisältöä. Kortti voi sisältää valokuvia ja muuta mediaa."</string>
<string name="permlab_sdcardWrite" product="nosdcard" msgid="8485979062254666748">"muokkaa tai poista USB:n sis."</string>
- <!-- no translation found for permlab_sdcardWrite (8805693630050458763) -->
- <skip />
+ <string name="permlab_sdcardWrite" product="default" msgid="8805693630050458763">"muokkaa tai poista SD-kortin sisältöä"</string>
<string name="permdesc_sdcardWrite" product="nosdcard" msgid="6175406299445710888">"Antaa sovelluksen kirjoittaa USB-tallennustilaan."</string>
<string name="permdesc_sdcardWrite" product="default" msgid="4337417790936632090">"Antaa sovelluksen kirjoittaa SD-kortille."</string>
<string name="permlab_mediaStorageWrite" product="default" msgid="6859839199706879015">"muokkaa/poista sisäisen säilytystilan sisältöä"</string>
@@ -1090,8 +1081,7 @@
<string name="date_time_set" msgid="5777075614321087758">"Aseta"</string>
<string name="date_time_done" msgid="2507683751759308828">"Valmis"</string>
<string name="perms_new_perm_prefix" msgid="8257740710754301407"><font size="12" fgcolor="#ff900000">"UUTTA: "</font></string>
- <!-- no translation found for perms_description_app (5139836143293299417) -->
- <skip />
+ <string name="perms_description_app" msgid="5139836143293299417">"Palvelun tarjoaa <xliff:g id="APP_NAME">%1$s</xliff:g>."</string>
<string name="no_permissions" msgid="7283357728219338112">"Lupia ei tarvita"</string>
<string name="usb_storage_activity_title" msgid="4465055157209648641">"USB-massamuisti"</string>
<string name="usb_storage_title" msgid="5901459041398751495">"USB yhdistetty"</string>
@@ -1321,8 +1311,6 @@
<string name="sending" msgid="3245653681008218030">"Lähetetään…"</string>
<string name="launchBrowserDefault" msgid="2057951947297614725">"Käynnistetäänkö selain?"</string>
<string name="SetupCallDefault" msgid="5834948469253758575">"Vastataanko puheluun?"</string>
- <!-- no translation found for activity_resolver_use_always (8017770747801494933) -->
- <skip />
- <!-- no translation found for activity_resolver_use_once (405646673463328329) -->
- <skip />
+ <string name="activity_resolver_use_always" msgid="8017770747801494933">"Aina"</string>
+ <string name="activity_resolver_use_once" msgid="405646673463328329">"Vain kerran"</string>
</resources>
diff --git a/core/res/res/values-fr/strings.xml b/core/res/res/values-fr/strings.xml
index c1c3e84..9a8778e 100644
--- a/core/res/res/values-fr/strings.xml
+++ b/core/res/res/values-fr/strings.xml
@@ -175,28 +175,20 @@
<string name="permgroupdesc_location" msgid="5704679763124170100">"Déterminer votre position géographique"</string>
<string name="permgrouplab_network" msgid="5808983377727109831">"Communications réseau"</string>
<string name="permgroupdesc_network" msgid="4478299413241861987">"Accéder à différentes fonctionnalités du réseau"</string>
- <!-- no translation found for permgrouplab_bluetoothNetwork (1585403544162128109) -->
- <skip />
- <!-- no translation found for permgroupdesc_bluetoothNetwork (5625288577164282391) -->
- <skip />
- <!-- no translation found for permgrouplab_shortrangeNetwork (130808676377486118) -->
- <skip />
- <!-- no translation found for permgroupdesc_shortrangeNetwork (1884069062653436007) -->
- <skip />
+ <string name="permgrouplab_bluetoothNetwork" msgid="1585403544162128109">"Bluetooth"</string>
+ <string name="permgroupdesc_bluetoothNetwork" msgid="5625288577164282391">"Accéder aux appareils et aux réseaux via le Bluetooth"</string>
+ <string name="permgrouplab_shortrangeNetwork" msgid="130808676377486118">"Réseaux de courte portée"</string>
+ <string name="permgroupdesc_shortrangeNetwork" msgid="1884069062653436007">"Accéder aux appareils via des réseaux de courte portée tels que la NFC"</string>
<string name="permgrouplab_audioSettings" msgid="8329261670151871235">"Paramètres audio"</string>
<string name="permgroupdesc_audioSettings" msgid="2641515403347568130">"Modification des paramètres audio"</string>
<string name="permgrouplab_affectsBattery" msgid="6209246653424798033">"Affecte la batterie"</string>
<string name="permgroupdesc_affectsBattery" msgid="6441275320638916947">"Utilisation de fonctionnalités qui peuvent épuiser rapidement la batterie"</string>
<string name="permgrouplab_calendar" msgid="5863508437783683902">"Agenda"</string>
<string name="permgroupdesc_calendar" msgid="5777534316982184416">"Accès direct à l\'agenda et aux événements"</string>
- <!-- no translation found for permgrouplab_dictionary (4148597128843641379) -->
- <skip />
- <!-- no translation found for permgroupdesc_dictionary (7921166355964764490) -->
- <skip />
- <!-- no translation found for permgrouplab_writeDictionary (8090237702432576788) -->
- <skip />
- <!-- no translation found for permgroupdesc_writeDictionary (2711561994497361646) -->
- <skip />
+ <string name="permgrouplab_dictionary" msgid="4148597128843641379">"Consulter le dictionnaire personnel"</string>
+ <string name="permgroupdesc_dictionary" msgid="7921166355964764490">"Consulter les mots ajoutés au dictionnaire personnel"</string>
+ <string name="permgrouplab_writeDictionary" msgid="8090237702432576788">"Modifier le dictionnaire personnel"</string>
+ <string name="permgroupdesc_writeDictionary" msgid="2711561994497361646">"Ajouter des mots au dictionnaire personnel"</string>
<string name="permgrouplab_bookmarks" msgid="1949519673103968229">"Favoris et historique"</string>
<string name="permgroupdesc_bookmarks" msgid="4169771606257963028">"Accès direct aux favoris et à l\'historique du navigateur"</string>
<string name="permgrouplab_deviceAlarms" msgid="6117704629728824101">"Alarme"</string>
@@ -569,8 +561,7 @@
<string name="permdesc_sdcardRead" product="nosdcard" msgid="3530894470637667917">"Permet à l\'appli de lire le contenu de la mémoire USB (photos, fichiers multimédias, etc.)."</string>
<string name="permdesc_sdcardRead" product="default" msgid="2555811422562526606">"Permet à l\'application de lire le contenu d\'une carte SD, qui peut inclure des photos et des fichiers multimédias."</string>
<string name="permlab_sdcardWrite" product="nosdcard" msgid="8485979062254666748">"modifier ou supprimer le contenu de la mémoire USB"</string>
- <!-- no translation found for permlab_sdcardWrite (8805693630050458763) -->
- <skip />
+ <string name="permlab_sdcardWrite" product="default" msgid="8805693630050458763">"modifier ou supprimer le contenu de la carte SD"</string>
<string name="permdesc_sdcardWrite" product="nosdcard" msgid="6175406299445710888">"Permet à l\'application de modifier le contenu de la mémoire de stockage USB."</string>
<string name="permdesc_sdcardWrite" product="default" msgid="4337417790936632090">"Permet à l\'application de modifier le contenu de la carte SD."</string>
<string name="permlab_mediaStorageWrite" product="default" msgid="6859839199706879015">"Modifier/Supprimer contenu mémoire interne"</string>
@@ -1090,8 +1081,7 @@
<string name="date_time_set" msgid="5777075614321087758">"Définir"</string>
<string name="date_time_done" msgid="2507683751759308828">"OK"</string>
<string name="perms_new_perm_prefix" msgid="8257740710754301407"><font size="12" fgcolor="#ff900000">"NOUVEAU"</font>" :"</string>
- <!-- no translation found for perms_description_app (5139836143293299417) -->
- <skip />
+ <string name="perms_description_app" msgid="5139836143293299417">"Fourni par <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
<string name="no_permissions" msgid="7283357728219338112">"Aucune autorisation requise"</string>
<string name="usb_storage_activity_title" msgid="4465055157209648641">"Mémoire de stockage de masse USB"</string>
<string name="usb_storage_title" msgid="5901459041398751495">"Connecté par USB"</string>
@@ -1322,6 +1312,5 @@
<string name="launchBrowserDefault" msgid="2057951947297614725">"Lancer le navigateur ?"</string>
<string name="SetupCallDefault" msgid="5834948469253758575">"Prendre l\'appel ?"</string>
<string name="activity_resolver_use_always" msgid="8017770747801494933">"Toujours"</string>
- <!-- no translation found for activity_resolver_use_once (405646673463328329) -->
- <skip />
+ <string name="activity_resolver_use_once" msgid="405646673463328329">"Une seule fois"</string>
</resources>
diff --git a/core/res/res/values-hi/strings.xml b/core/res/res/values-hi/strings.xml
index 3726b6c..008f93b 100644
--- a/core/res/res/values-hi/strings.xml
+++ b/core/res/res/values-hi/strings.xml
@@ -175,28 +175,20 @@
<string name="permgroupdesc_location" msgid="5704679763124170100">"अपने भौतिक स्थान पर नज़र रखें."</string>
<string name="permgrouplab_network" msgid="5808983377727109831">"नेटवर्क संचार"</string>
<string name="permgroupdesc_network" msgid="4478299413241861987">"विभिन्न नेटवर्क सुविधाओं पर पहुंचें."</string>
- <!-- no translation found for permgrouplab_bluetoothNetwork (1585403544162128109) -->
- <skip />
- <!-- no translation found for permgroupdesc_bluetoothNetwork (5625288577164282391) -->
- <skip />
- <!-- no translation found for permgrouplab_shortrangeNetwork (130808676377486118) -->
- <skip />
- <!-- no translation found for permgroupdesc_shortrangeNetwork (1884069062653436007) -->
- <skip />
+ <string name="permgrouplab_bluetoothNetwork" msgid="1585403544162128109">"Bluetooth"</string>
+ <string name="permgroupdesc_bluetoothNetwork" msgid="5625288577164282391">"Bluetooth के माध्यम से उपकरणों और नेटवर्क पर पहुंचें."</string>
+ <string name="permgrouplab_shortrangeNetwork" msgid="130808676377486118">"कम सीमा वाले नेटवर्क"</string>
+ <string name="permgroupdesc_shortrangeNetwork" msgid="1884069062653436007">"कम सीमा वाले नेटवर्क जैसे NFC के माध्यम से उपकरणों पर पहुंचें."</string>
<string name="permgrouplab_audioSettings" msgid="8329261670151871235">"ऑडियो सेटिंग"</string>
<string name="permgroupdesc_audioSettings" msgid="2641515403347568130">"ऑडियो सेटिंग बदलें."</string>
<string name="permgrouplab_affectsBattery" msgid="6209246653424798033">"बैटरी प्रभावित होती है"</string>
<string name="permgroupdesc_affectsBattery" msgid="6441275320638916947">"उन सुविधाओं का उपयोग करें जो बैटरी की खपत तेज़ी से कर सकती हैं."</string>
<string name="permgrouplab_calendar" msgid="5863508437783683902">"कैलेंडर"</string>
<string name="permgroupdesc_calendar" msgid="5777534316982184416">"कैलेंडर और ईवेंट पर सीधी पहुंच."</string>
- <!-- no translation found for permgrouplab_dictionary (4148597128843641379) -->
- <skip />
- <!-- no translation found for permgroupdesc_dictionary (7921166355964764490) -->
- <skip />
- <!-- no translation found for permgrouplab_writeDictionary (8090237702432576788) -->
- <skip />
- <!-- no translation found for permgroupdesc_writeDictionary (2711561994497361646) -->
- <skip />
+ <string name="permgrouplab_dictionary" msgid="4148597128843641379">"उपयोगकर्ता डिक्शनरी पढ़ें"</string>
+ <string name="permgroupdesc_dictionary" msgid="7921166355964764490">"उपयोगकर्ता डिक्शनरी में शब्द पढ़ें."</string>
+ <string name="permgrouplab_writeDictionary" msgid="8090237702432576788">"उपयोगकर्ता डिक्शनरी में लिखें"</string>
+ <string name="permgroupdesc_writeDictionary" msgid="2711561994497361646">"उपयोगकर्ता डिक्शनरी में शब्द जोड़ें."</string>
<string name="permgrouplab_bookmarks" msgid="1949519673103968229">"बुकमार्क और इतिहास"</string>
<string name="permgroupdesc_bookmarks" msgid="4169771606257963028">"बुकमार्क और ब्राउज़र इतिहास पर सीधी पहुंच."</string>
<string name="permgrouplab_deviceAlarms" msgid="6117704629728824101">"अलार्म"</string>
@@ -569,8 +561,7 @@
<string name="permdesc_sdcardRead" product="nosdcard" msgid="3530894470637667917">"एप्लि. को USB संग्रहण की सामग्री पढ़ने देता है, जिसमें फ़ोटो व मीडिया हो सकते हैं."</string>
<string name="permdesc_sdcardRead" product="default" msgid="2555811422562526606">"एप्लिकेशन को SD कार्ड की सामग्री पढ़ने देता है, जिसमें फ़ोटो और मीडिया हो सकते हैं."</string>
<string name="permlab_sdcardWrite" product="nosdcard" msgid="8485979062254666748">"अपने USB संग्रहण की सामग्री संशोधित करें या हटाएं"</string>
- <!-- no translation found for permlab_sdcardWrite (8805693630050458763) -->
- <skip />
+ <string name="permlab_sdcardWrite" product="default" msgid="8805693630050458763">"अपने SD कार्ड की सामग्री संशोधित करें या हटाएं"</string>
<string name="permdesc_sdcardWrite" product="nosdcard" msgid="6175406299445710888">"एप्लि. को USB संग्रहण में लिखने देता है."</string>
<string name="permdesc_sdcardWrite" product="default" msgid="4337417790936632090">"एप्लिकेशन को SD कार्ड पर लिखने देता है."</string>
<string name="permlab_mediaStorageWrite" product="default" msgid="6859839199706879015">"आंतरिक मीडिया संग्रहण सामग्रियों को संशोधित करें/हटाएं"</string>
@@ -1090,8 +1081,7 @@
<string name="date_time_set" msgid="5777075614321087758">"सेट करें"</string>
<string name="date_time_done" msgid="2507683751759308828">"पूर्ण"</string>
<string name="perms_new_perm_prefix" msgid="8257740710754301407"><font size="12" fgcolor="#ff900000">"नया: "</font></string>
- <!-- no translation found for perms_description_app (5139836143293299417) -->
- <skip />
+ <string name="perms_description_app" msgid="5139836143293299417">"<xliff:g id="APP_NAME">%1$s</xliff:g> द्वारा प्रदत्त."</string>
<string name="no_permissions" msgid="7283357728219338112">"किसी अनुमति की आवश्यकता नहीं है"</string>
<string name="usb_storage_activity_title" msgid="4465055157209648641">"USB विशाल संग्रहण"</string>
<string name="usb_storage_title" msgid="5901459041398751495">"USB कनेक्ट किया गया"</string>
@@ -1321,8 +1311,6 @@
<string name="sending" msgid="3245653681008218030">"भेजा जा रहा है…"</string>
<string name="launchBrowserDefault" msgid="2057951947297614725">"ब्राउज़र लॉन्च करें?"</string>
<string name="SetupCallDefault" msgid="5834948469253758575">"कॉल स्वीकार करें?"</string>
- <!-- no translation found for activity_resolver_use_always (8017770747801494933) -->
- <skip />
- <!-- no translation found for activity_resolver_use_once (405646673463328329) -->
- <skip />
+ <string name="activity_resolver_use_always" msgid="8017770747801494933">"हमेशा"</string>
+ <string name="activity_resolver_use_once" msgid="405646673463328329">"बस एक बार"</string>
</resources>
diff --git a/core/res/res/values-hr/strings.xml b/core/res/res/values-hr/strings.xml
index 8e03743..55f923f 100644
--- a/core/res/res/values-hr/strings.xml
+++ b/core/res/res/values-hr/strings.xml
@@ -175,28 +175,20 @@
<string name="permgroupdesc_location" msgid="5704679763124170100">"Pratite svoju fizičku lokaciju."</string>
<string name="permgrouplab_network" msgid="5808983377727109831">"Mrežna komunikacija"</string>
<string name="permgroupdesc_network" msgid="4478299413241861987">"Pristupajte raznim značajkama mreže."</string>
- <!-- no translation found for permgrouplab_bluetoothNetwork (1585403544162128109) -->
- <skip />
- <!-- no translation found for permgroupdesc_bluetoothNetwork (5625288577164282391) -->
- <skip />
- <!-- no translation found for permgrouplab_shortrangeNetwork (130808676377486118) -->
- <skip />
- <!-- no translation found for permgroupdesc_shortrangeNetwork (1884069062653436007) -->
- <skip />
+ <string name="permgrouplab_bluetoothNetwork" msgid="1585403544162128109">"Bluetooth"</string>
+ <string name="permgroupdesc_bluetoothNetwork" msgid="5625288577164282391">"Pristupajte uređajima i mrežama putem Bluetootha."</string>
+ <string name="permgrouplab_shortrangeNetwork" msgid="130808676377486118">"Mreže kratkog dometa"</string>
+ <string name="permgroupdesc_shortrangeNetwork" msgid="1884069062653436007">"Pristupajte uređajima putem mreža kratkog dometa kao što je NFC."</string>
<string name="permgrouplab_audioSettings" msgid="8329261670151871235">"Postavke zvuka"</string>
<string name="permgroupdesc_audioSettings" msgid="2641515403347568130">"Promjena postavki zvuka."</string>
<string name="permgrouplab_affectsBattery" msgid="6209246653424798033">"Utječe na bateriju"</string>
<string name="permgroupdesc_affectsBattery" msgid="6441275320638916947">"Upotreba značajki koje brzo prazne bateriju."</string>
<string name="permgrouplab_calendar" msgid="5863508437783683902">"Kalendar"</string>
<string name="permgroupdesc_calendar" msgid="5777534316982184416">"Izravan pristup kalendaru i događajima."</string>
- <!-- no translation found for permgrouplab_dictionary (4148597128843641379) -->
- <skip />
- <!-- no translation found for permgroupdesc_dictionary (7921166355964764490) -->
- <skip />
- <!-- no translation found for permgrouplab_writeDictionary (8090237702432576788) -->
- <skip />
- <!-- no translation found for permgroupdesc_writeDictionary (2711561994497361646) -->
- <skip />
+ <string name="permgrouplab_dictionary" msgid="4148597128843641379">"Čitaj korisnički rječnik"</string>
+ <string name="permgroupdesc_dictionary" msgid="7921166355964764490">"Pročitajte riječi u korisničkom rječniku."</string>
+ <string name="permgrouplab_writeDictionary" msgid="8090237702432576788">"Piši u korisnički rječnik"</string>
+ <string name="permgroupdesc_writeDictionary" msgid="2711561994497361646">"Dodavanje riječi u korisnički rječnik."</string>
<string name="permgrouplab_bookmarks" msgid="1949519673103968229">"Oznake i povijest"</string>
<string name="permgroupdesc_bookmarks" msgid="4169771606257963028">"Izravan pristup oznakama i povijest preglednika."</string>
<string name="permgrouplab_deviceAlarms" msgid="6117704629728824101">"Alarm"</string>
@@ -569,8 +561,7 @@
<string name="permdesc_sdcardRead" product="nosdcard" msgid="3530894470637667917">"Omogućuje aplikaciji čitanje sadržaja USB pohrane, koji mogu uključivati fotografije i medije."</string>
<string name="permdesc_sdcardRead" product="default" msgid="2555811422562526606">"Omogućuje aplikaciji čitanje sadržaja SD kartice, koji mogu uključivati fotografije i medije."</string>
<string name="permlab_sdcardWrite" product="nosdcard" msgid="8485979062254666748">"izmjena/brisanje sadrž. USB-a"</string>
- <!-- no translation found for permlab_sdcardWrite (8805693630050458763) -->
- <skip />
+ <string name="permlab_sdcardWrite" product="default" msgid="8805693630050458763">"izmjena ili brisanje sadržaja SD kartice"</string>
<string name="permdesc_sdcardWrite" product="nosdcard" msgid="6175406299445710888">"Dopušta pisanje u USB pohranu."</string>
<string name="permdesc_sdcardWrite" product="default" msgid="4337417790936632090">"Aplikaciji omogućuje pisanje na SD karticu."</string>
<string name="permlab_mediaStorageWrite" product="default" msgid="6859839199706879015">"izmijeni/izbriši sadržaj pohranjen na internim medijima"</string>
@@ -1090,8 +1081,7 @@
<string name="date_time_set" msgid="5777075614321087758">"Postavi"</string>
<string name="date_time_done" msgid="2507683751759308828">"Gotovo"</string>
<string name="perms_new_perm_prefix" msgid="8257740710754301407"><font size="12" fgcolor="#ff900000">"NOVO: "</font></string>
- <!-- no translation found for perms_description_app (5139836143293299417) -->
- <skip />
+ <string name="perms_description_app" msgid="5139836143293299417">"Omogućuje aplikacija <xliff:g id="APP_NAME">%1$s</xliff:g>."</string>
<string name="no_permissions" msgid="7283357728219338112">"Nije potrebno dopuštenje"</string>
<string name="usb_storage_activity_title" msgid="4465055157209648641">"USB masovna pohrana"</string>
<string name="usb_storage_title" msgid="5901459041398751495">"USB povezan"</string>
@@ -1321,8 +1311,6 @@
<string name="sending" msgid="3245653681008218030">"Slanje..."</string>
<string name="launchBrowserDefault" msgid="2057951947297614725">"Pokrenuti preglednik?"</string>
<string name="SetupCallDefault" msgid="5834948469253758575">"Prihvatiti poziv?"</string>
- <!-- no translation found for activity_resolver_use_always (8017770747801494933) -->
- <skip />
- <!-- no translation found for activity_resolver_use_once (405646673463328329) -->
- <skip />
+ <string name="activity_resolver_use_always" msgid="8017770747801494933">"Uvijek"</string>
+ <string name="activity_resolver_use_once" msgid="405646673463328329">"Samo jednom"</string>
</resources>
diff --git a/core/res/res/values-hu/strings.xml b/core/res/res/values-hu/strings.xml
index a00ae69..04ea787 100644
--- a/core/res/res/values-hu/strings.xml
+++ b/core/res/res/values-hu/strings.xml
@@ -175,28 +175,20 @@
<string name="permgroupdesc_location" msgid="5704679763124170100">"Tartózkodási hely figyelése."</string>
<string name="permgrouplab_network" msgid="5808983377727109831">"Hálózati kommunikáció"</string>
<string name="permgroupdesc_network" msgid="4478299413241861987">"Hozzáférés különböző hálózati funkciókhoz."</string>
- <!-- no translation found for permgrouplab_bluetoothNetwork (1585403544162128109) -->
- <skip />
- <!-- no translation found for permgroupdesc_bluetoothNetwork (5625288577164282391) -->
- <skip />
- <!-- no translation found for permgrouplab_shortrangeNetwork (130808676377486118) -->
- <skip />
- <!-- no translation found for permgroupdesc_shortrangeNetwork (1884069062653436007) -->
- <skip />
+ <string name="permgrouplab_bluetoothNetwork" msgid="1585403544162128109">"Bluetooth"</string>
+ <string name="permgroupdesc_bluetoothNetwork" msgid="5625288577164282391">"Eszközök és hálózatok elérése Bluetoothon keresztül."</string>
+ <string name="permgrouplab_shortrangeNetwork" msgid="130808676377486118">"Rövid hatótávolságú hálózatok"</string>
+ <string name="permgroupdesc_shortrangeNetwork" msgid="1884069062653436007">"Eszközökhöz való hozzáférés rövid hatótávolságú hálózaton, például NFC-n keresztül."</string>
<string name="permgrouplab_audioSettings" msgid="8329261670151871235">"Hangbeállítások"</string>
<string name="permgroupdesc_audioSettings" msgid="2641515403347568130">"Hangbeállítások módosítása"</string>
<string name="permgrouplab_affectsBattery" msgid="6209246653424798033">"Hozzáférés az akkumulátor teljesítményéhez"</string>
<string name="permgroupdesc_affectsBattery" msgid="6441275320638916947">"Olyan funkciók használata, amelyek gyorsan lemerítik az akkumulátort."</string>
<string name="permgrouplab_calendar" msgid="5863508437783683902">"Naptár"</string>
<string name="permgroupdesc_calendar" msgid="5777534316982184416">"Közvetlen hozzáférés a naptárhoz és az eseményekhez"</string>
- <!-- no translation found for permgrouplab_dictionary (4148597128843641379) -->
- <skip />
- <!-- no translation found for permgroupdesc_dictionary (7921166355964764490) -->
- <skip />
- <!-- no translation found for permgrouplab_writeDictionary (8090237702432576788) -->
- <skip />
- <!-- no translation found for permgroupdesc_writeDictionary (2711561994497361646) -->
- <skip />
+ <string name="permgrouplab_dictionary" msgid="4148597128843641379">"Felhasználói szótár olvasása"</string>
+ <string name="permgroupdesc_dictionary" msgid="7921166355964764490">"Szavak olvasása a felhasználói szótárban."</string>
+ <string name="permgrouplab_writeDictionary" msgid="8090237702432576788">"Írás a felhasználói szótárba"</string>
+ <string name="permgroupdesc_writeDictionary" msgid="2711561994497361646">"Szavak hozzáadása a felhasználói szótárhoz."</string>
<string name="permgrouplab_bookmarks" msgid="1949519673103968229">"Könyvjelzők és előzmények"</string>
<string name="permgroupdesc_bookmarks" msgid="4169771606257963028">"Közvetlen hozzáférés a könyvjelzőkhöz és a böngészési előzményekhez"</string>
<string name="permgrouplab_deviceAlarms" msgid="6117704629728824101">"Ébresztő"</string>
@@ -569,8 +561,7 @@
<string name="permdesc_sdcardRead" product="nosdcard" msgid="3530894470637667917">"Lehetővé teszi az alkalmazás számára az USB-háttértár tartalmának olvasását, beleértve a fényképeket és a médiafájlokat."</string>
<string name="permdesc_sdcardRead" product="default" msgid="2555811422562526606">"Lehetővé teszi az alkalmazás számára az SD-kártya tartalmának olvasását, beleértve a fényképeket és a médiafájlokat."</string>
<string name="permlab_sdcardWrite" product="nosdcard" msgid="8485979062254666748">"USB-tár törlése/módosítása"</string>
- <!-- no translation found for permlab_sdcardWrite (8805693630050458763) -->
- <skip />
+ <string name="permlab_sdcardWrite" product="default" msgid="8805693630050458763">"SD-kártya tartalmának módosítása vagy törlése"</string>
<string name="permdesc_sdcardWrite" product="nosdcard" msgid="6175406299445710888">"Az alkalmazás USB-tárra írhat."</string>
<string name="permdesc_sdcardWrite" product="default" msgid="4337417790936632090">"Lehetővé teszi az alkalmazás számára, hogy írjon az SD-kártyára."</string>
<string name="permlab_mediaStorageWrite" product="default" msgid="6859839199706879015">"belső tár tartalmának módosítása/törlése"</string>
@@ -1090,8 +1081,7 @@
<string name="date_time_set" msgid="5777075614321087758">"Beállítás"</string>
<string name="date_time_done" msgid="2507683751759308828">"Kész"</string>
<string name="perms_new_perm_prefix" msgid="8257740710754301407"><font size="12" fgcolor="#ff900000">"ÚJ: "</font></string>
- <!-- no translation found for perms_description_app (5139836143293299417) -->
- <skip />
+ <string name="perms_description_app" msgid="5139836143293299417">"Szolgáltató: <xliff:g id="APP_NAME">%1$s</xliff:g>."</string>
<string name="no_permissions" msgid="7283357728219338112">"Nincs szükség engedélyre"</string>
<string name="usb_storage_activity_title" msgid="4465055157209648641">"USB-háttértár"</string>
<string name="usb_storage_title" msgid="5901459041398751495">"USB-eszköz csatlakoztatva"</string>
@@ -1321,8 +1311,6 @@
<string name="sending" msgid="3245653681008218030">"Küldés…"</string>
<string name="launchBrowserDefault" msgid="2057951947297614725">"Böngésző indítása?"</string>
<string name="SetupCallDefault" msgid="5834948469253758575">"Fogadja a hívást?"</string>
- <!-- no translation found for activity_resolver_use_always (8017770747801494933) -->
- <skip />
- <!-- no translation found for activity_resolver_use_once (405646673463328329) -->
- <skip />
+ <string name="activity_resolver_use_always" msgid="8017770747801494933">"Mindig"</string>
+ <string name="activity_resolver_use_once" msgid="405646673463328329">"Csak egyszer"</string>
</resources>
diff --git a/core/res/res/values-in/strings.xml b/core/res/res/values-in/strings.xml
index 753e7fd..616b9be 100644
--- a/core/res/res/values-in/strings.xml
+++ b/core/res/res/values-in/strings.xml
@@ -175,14 +175,10 @@
<string name="permgroupdesc_location" msgid="5704679763124170100">"Memonitor lokasi fisik Anda."</string>
<string name="permgrouplab_network" msgid="5808983377727109831">"Komunikasi jaringan"</string>
<string name="permgroupdesc_network" msgid="4478299413241861987">"Mengakses berbagai fitur jaringan."</string>
- <!-- no translation found for permgrouplab_bluetoothNetwork (1585403544162128109) -->
- <skip />
- <!-- no translation found for permgroupdesc_bluetoothNetwork (5625288577164282391) -->
- <skip />
- <!-- no translation found for permgrouplab_shortrangeNetwork (130808676377486118) -->
- <skip />
- <!-- no translation found for permgroupdesc_shortrangeNetwork (1884069062653436007) -->
- <skip />
+ <string name="permgrouplab_bluetoothNetwork" msgid="1585403544162128109">"Bluetooth"</string>
+ <string name="permgroupdesc_bluetoothNetwork" msgid="5625288577164282391">"Mengakses perangkat dan jaringan melalui Bluetooth."</string>
+ <string name="permgrouplab_shortrangeNetwork" msgid="130808676377486118">"Jaringan jarak pendek"</string>
+ <string name="permgroupdesc_shortrangeNetwork" msgid="1884069062653436007">"Mengakses perangkat melalui jaringan jarak pendek seperti NFC."</string>
<string name="permgrouplab_audioSettings" msgid="8329261670151871235">"Setelan Audio"</string>
<string name="permgroupdesc_audioSettings" msgid="2641515403347568130">"Mengubah setelan audio."</string>
<string name="permgrouplab_affectsBattery" msgid="6209246653424798033">"Memengaruhi Baterai"</string>
@@ -195,8 +191,7 @@
<skip />
<!-- no translation found for permgrouplab_writeDictionary (8090237702432576788) -->
<skip />
- <!-- no translation found for permgroupdesc_writeDictionary (2711561994497361646) -->
- <skip />
+ <string name="permgroupdesc_writeDictionary" msgid="2711561994497361646">"Menambahkan kata ke kamus pengguna."</string>
<string name="permgrouplab_bookmarks" msgid="1949519673103968229">"Bookmark dan Riwayat"</string>
<string name="permgroupdesc_bookmarks" msgid="4169771606257963028">"Akses langsung ke bookmark dan riwayat browser."</string>
<string name="permgrouplab_deviceAlarms" msgid="6117704629728824101">"Alarm"</string>
@@ -1090,8 +1085,7 @@
<string name="date_time_set" msgid="5777075614321087758">"Setel"</string>
<string name="date_time_done" msgid="2507683751759308828">"Selesai"</string>
<string name="perms_new_perm_prefix" msgid="8257740710754301407"><font size="12" fgcolor="#ff900000">"BARU: "</font></string>
- <!-- no translation found for perms_description_app (5139836143293299417) -->
- <skip />
+ <string name="perms_description_app" msgid="5139836143293299417">"Disediakan oleh <xliff:g id="APP_NAME">%1$s</xliff:g>."</string>
<string name="no_permissions" msgid="7283357728219338112">"Tidak perlu izin"</string>
<string name="usb_storage_activity_title" msgid="4465055157209648641">"Penyimpanan massal USB"</string>
<string name="usb_storage_title" msgid="5901459041398751495">"USB terhubung"</string>
@@ -1321,8 +1315,6 @@
<string name="sending" msgid="3245653681008218030">"Mengirim..."</string>
<string name="launchBrowserDefault" msgid="2057951947297614725">"Luncurkan Browser?"</string>
<string name="SetupCallDefault" msgid="5834948469253758575">"Terima panggilan?"</string>
- <!-- no translation found for activity_resolver_use_always (8017770747801494933) -->
- <skip />
- <!-- no translation found for activity_resolver_use_once (405646673463328329) -->
- <skip />
+ <string name="activity_resolver_use_always" msgid="8017770747801494933">"Selalu"</string>
+ <string name="activity_resolver_use_once" msgid="405646673463328329">"Sekali Saja"</string>
</resources>
diff --git a/core/res/res/values-ja/strings.xml b/core/res/res/values-ja/strings.xml
index d05be0c..800f503 100644
--- a/core/res/res/values-ja/strings.xml
+++ b/core/res/res/values-ja/strings.xml
@@ -1321,8 +1321,7 @@
<string name="sending" msgid="3245653681008218030">"送信中..."</string>
<string name="launchBrowserDefault" msgid="2057951947297614725">"ブラウザを起動しますか?"</string>
<string name="SetupCallDefault" msgid="5834948469253758575">"通話を受けますか?"</string>
- <!-- no translation found for activity_resolver_use_always (8017770747801494933) -->
- <skip />
+ <string name="activity_resolver_use_always" msgid="8017770747801494933">"常時"</string>
<!-- no translation found for activity_resolver_use_once (405646673463328329) -->
<skip />
</resources>
diff --git a/core/res/res/values-ko/strings.xml b/core/res/res/values-ko/strings.xml
index 964816e..14730d95 100644
--- a/core/res/res/values-ko/strings.xml
+++ b/core/res/res/values-ko/strings.xml
@@ -175,28 +175,20 @@
<string name="permgroupdesc_location" msgid="5704679763124170100">"실제 위치 모니터링"</string>
<string name="permgrouplab_network" msgid="5808983377727109831">"네트워크 통신"</string>
<string name="permgroupdesc_network" msgid="4478299413241861987">"다양한 네트워크 기능에 액세스할 수 있도록 합니다."</string>
- <!-- no translation found for permgrouplab_bluetoothNetwork (1585403544162128109) -->
- <skip />
- <!-- no translation found for permgroupdesc_bluetoothNetwork (5625288577164282391) -->
- <skip />
- <!-- no translation found for permgrouplab_shortrangeNetwork (130808676377486118) -->
- <skip />
- <!-- no translation found for permgroupdesc_shortrangeNetwork (1884069062653436007) -->
- <skip />
+ <string name="permgrouplab_bluetoothNetwork" msgid="1585403544162128109">"블루투스"</string>
+ <string name="permgroupdesc_bluetoothNetwork" msgid="5625288577164282391">"블루투스를 통해 기기 및 네트워크에 액세스"</string>
+ <string name="permgrouplab_shortrangeNetwork" msgid="130808676377486118">"단거리 네트워크"</string>
+ <string name="permgroupdesc_shortrangeNetwork" msgid="1884069062653436007">"NFC와 같은 단거리 네트워크를 통해 기기에 액세스"</string>
<string name="permgrouplab_audioSettings" msgid="8329261670151871235">"오디오 설정"</string>
<string name="permgroupdesc_audioSettings" msgid="2641515403347568130">"오디오 설정을 변경합니다."</string>
- <string name="permgrouplab_affectsBattery" msgid="6209246653424798033">"배터리에 영향"</string>
+ <string name="permgrouplab_affectsBattery" msgid="6209246653424798033">"배터리 소모"</string>
<string name="permgroupdesc_affectsBattery" msgid="6441275320638916947">"배터리를 빨리 소모시킬 수 있는 기능을 사용합니다."</string>
<string name="permgrouplab_calendar" msgid="5863508437783683902">"캘린더"</string>
<string name="permgroupdesc_calendar" msgid="5777534316982184416">"캘린더 및 일정에 직접 액세스합니다."</string>
- <!-- no translation found for permgrouplab_dictionary (4148597128843641379) -->
- <skip />
- <!-- no translation found for permgroupdesc_dictionary (7921166355964764490) -->
- <skip />
- <!-- no translation found for permgrouplab_writeDictionary (8090237702432576788) -->
- <skip />
- <!-- no translation found for permgroupdesc_writeDictionary (2711561994497361646) -->
- <skip />
+ <string name="permgrouplab_dictionary" msgid="4148597128843641379">"사용자 사전 읽기"</string>
+ <string name="permgroupdesc_dictionary" msgid="7921166355964764490">"사용자 사전의 단어 읽기"</string>
+ <string name="permgrouplab_writeDictionary" msgid="8090237702432576788">"사용자 사전 쓰기"</string>
+ <string name="permgroupdesc_writeDictionary" msgid="2711561994497361646">"사용자 사전에 단어 추가"</string>
<string name="permgrouplab_bookmarks" msgid="1949519673103968229">"북마크 및 기록"</string>
<string name="permgroupdesc_bookmarks" msgid="4169771606257963028">"북마크 및 브라우저 기록에 직접 액세스합니다."</string>
<string name="permgrouplab_deviceAlarms" msgid="6117704629728824101">"알람"</string>
@@ -208,7 +200,7 @@
<string name="permgrouplab_camera" msgid="4820372495894586615">"카메라"</string>
<string name="permgroupdesc_camera" msgid="2933667372289567714">"이미지 및 동영상을 캡처하기 위해 카메라에 직접 액세스합니다."</string>
<string name="permgrouplab_appInfo" msgid="8028789762634147725">"애플리케이션 정보"</string>
- <string name="permgroupdesc_appInfo" msgid="3950378538049625907">"기기의 다른 애플리케이션의 작동에 영향을 줄 수 있습니다."</string>
+ <string name="permgroupdesc_appInfo" msgid="3950378538049625907">"기기의 다른 애플리케이션의 작동에 영향을 줍니다."</string>
<string name="permgrouplab_wallpaper" msgid="3850280158041175998">"배경화면"</string>
<string name="permgroupdesc_wallpaper" msgid="5630417854750540154">"기기 배경화면 설정을 변경합니다."</string>
<string name="permgrouplab_systemClock" msgid="406535759236612992">"시계"</string>
@@ -569,8 +561,7 @@
<string name="permdesc_sdcardRead" product="nosdcard" msgid="3530894470637667917">"앱이 사진과 미디어를 포함하고 있을 수 있는 USB 저장소의 콘텐츠를 읽도록 허용합니다."</string>
<string name="permdesc_sdcardRead" product="default" msgid="2555811422562526606">"앱이 사진과 미디어를 포함하고 있을 수 있는 SD 카드의 콘텐츠를 읽도록 허용합니다."</string>
<string name="permlab_sdcardWrite" product="nosdcard" msgid="8485979062254666748">"USB 저장소의 콘텐츠 수정 또는 삭제"</string>
- <!-- no translation found for permlab_sdcardWrite (8805693630050458763) -->
- <skip />
+ <string name="permlab_sdcardWrite" product="default" msgid="8805693630050458763">"SD 카드의 콘텐츠 수정 또는 삭제"</string>
<string name="permdesc_sdcardWrite" product="nosdcard" msgid="6175406299445710888">"앱이 USB 저장소에 쓸 수 있도록 허용합니다."</string>
<string name="permdesc_sdcardWrite" product="default" msgid="4337417790936632090">"앱이 SD 카드에 쓸 수 있도록 허용합니다."</string>
<string name="permlab_mediaStorageWrite" product="default" msgid="6859839199706879015">"내부 미디어 저장소 콘텐츠 수정/삭제"</string>
@@ -1090,8 +1081,7 @@
<string name="date_time_set" msgid="5777075614321087758">"설정"</string>
<string name="date_time_done" msgid="2507683751759308828">"완료"</string>
<string name="perms_new_perm_prefix" msgid="8257740710754301407"><font size="12" fgcolor="#ff900000">"신규: "</font></string>
- <!-- no translation found for perms_description_app (5139836143293299417) -->
- <skip />
+ <string name="perms_description_app" msgid="5139836143293299417">"<xliff:g id="APP_NAME">%1$s</xliff:g> 제공"</string>
<string name="no_permissions" msgid="7283357728219338112">"권한 필요 없음"</string>
<string name="usb_storage_activity_title" msgid="4465055157209648641">"USB 대용량 저장소"</string>
<string name="usb_storage_title" msgid="5901459041398751495">"USB 연결됨"</string>
@@ -1321,8 +1311,6 @@
<string name="sending" msgid="3245653681008218030">"전송 중..."</string>
<string name="launchBrowserDefault" msgid="2057951947297614725">"브라우저를 실행하시겠습니까?"</string>
<string name="SetupCallDefault" msgid="5834948469253758575">"통화를 수락하시겠습니까?"</string>
- <!-- no translation found for activity_resolver_use_always (8017770747801494933) -->
- <skip />
- <!-- no translation found for activity_resolver_use_once (405646673463328329) -->
- <skip />
+ <string name="activity_resolver_use_always" msgid="8017770747801494933">"항상"</string>
+ <string name="activity_resolver_use_once" msgid="405646673463328329">"한 번만"</string>
</resources>
diff --git a/core/res/res/values-land/arrays.xml b/core/res/res/values-land/arrays.xml
index 537d27c..7095c02 100644
--- a/core/res/res/values-land/arrays.xml
+++ b/core/res/res/values-land/arrays.xml
@@ -69,4 +69,11 @@
<item>@string/description_target_camera</item>
</array>
+ <array name="lockscreen_chevron_drawables">
+ <item>@null</item>
+ <item>@drawable/ic_lockscreen_chevron_up</item>
+ <item>@null</item>
+ <item>@null</item>
+ </array>
+
</resources>
diff --git a/core/res/res/values-lt/strings.xml b/core/res/res/values-lt/strings.xml
index f90907e..3c705ec 100644
--- a/core/res/res/values-lt/strings.xml
+++ b/core/res/res/values-lt/strings.xml
@@ -175,28 +175,20 @@
<string name="permgroupdesc_location" msgid="5704679763124170100">"Stebėti fizinę vietą."</string>
<string name="permgrouplab_network" msgid="5808983377727109831">"Tinklo ryšys"</string>
<string name="permgroupdesc_network" msgid="4478299413241861987">"Pasiekti įvairias tinklo funkcijas."</string>
- <!-- no translation found for permgrouplab_bluetoothNetwork (1585403544162128109) -->
- <skip />
- <!-- no translation found for permgroupdesc_bluetoothNetwork (5625288577164282391) -->
- <skip />
- <!-- no translation found for permgrouplab_shortrangeNetwork (130808676377486118) -->
- <skip />
- <!-- no translation found for permgroupdesc_shortrangeNetwork (1884069062653436007) -->
- <skip />
+ <string name="permgrouplab_bluetoothNetwork" msgid="1585403544162128109">"Bluetooth"</string>
+ <string name="permgroupdesc_bluetoothNetwork" msgid="5625288577164282391">"Pasiekti įrenginius ir tinklus naudojant „Bluetooth“."</string>
+ <string name="permgrouplab_shortrangeNetwork" msgid="130808676377486118">"Artimojo lauko tinklai"</string>
+ <string name="permgroupdesc_shortrangeNetwork" msgid="1884069062653436007">"Pasiekti įrenginius per artimojo lauko tinklus, pvz., ALR."</string>
<string name="permgrouplab_audioSettings" msgid="8329261670151871235">"Garso nustatymai"</string>
<string name="permgroupdesc_audioSettings" msgid="2641515403347568130">"Keisti garso nustatymus."</string>
<string name="permgrouplab_affectsBattery" msgid="6209246653424798033">"Paveikia akumuliatorių"</string>
<string name="permgroupdesc_affectsBattery" msgid="6441275320638916947">"Naudoti funkcijas, galinčias greitai iškrauti akumuliatorių."</string>
<string name="permgrouplab_calendar" msgid="5863508437783683902">"Kalendorius"</string>
<string name="permgroupdesc_calendar" msgid="5777534316982184416">"Tiesioginė prieiga prie kalendoriaus ir įvykių."</string>
- <!-- no translation found for permgrouplab_dictionary (4148597128843641379) -->
- <skip />
- <!-- no translation found for permgroupdesc_dictionary (7921166355964764490) -->
- <skip />
- <!-- no translation found for permgrouplab_writeDictionary (8090237702432576788) -->
- <skip />
- <!-- no translation found for permgroupdesc_writeDictionary (2711561994497361646) -->
- <skip />
+ <string name="permgrouplab_dictionary" msgid="4148597128843641379">"Skaityti naudotojo žodyną"</string>
+ <string name="permgroupdesc_dictionary" msgid="7921166355964764490">"Skaityti žodžius naudotojo žodyne."</string>
+ <string name="permgrouplab_writeDictionary" msgid="8090237702432576788">"Rašyti į naudotojo žodyną"</string>
+ <string name="permgroupdesc_writeDictionary" msgid="2711561994497361646">"Pridėti žodžius į naudotojo žodyną."</string>
<string name="permgrouplab_bookmarks" msgid="1949519673103968229">"Žymės ir istorija"</string>
<string name="permgroupdesc_bookmarks" msgid="4169771606257963028">"Tiesioginė prieiga prie žymių ir naršyklės istorijos."</string>
<string name="permgrouplab_deviceAlarms" msgid="6117704629728824101">"Signalas"</string>
@@ -569,8 +561,7 @@
<string name="permdesc_sdcardRead" product="nosdcard" msgid="3530894470637667917">"Programai leidžiama skaityti USB atminties turinį, kurį gali sudaryti nuotraukos ir medija."</string>
<string name="permdesc_sdcardRead" product="default" msgid="2555811422562526606">"Programai leidžiama skaityti SD kortelės turinį, kurį gali sudaryti nuotraukos ir medija."</string>
<string name="permlab_sdcardWrite" product="nosdcard" msgid="8485979062254666748">"keisti / trinti USB atm. turinį"</string>
- <!-- no translation found for permlab_sdcardWrite (8805693630050458763) -->
- <skip />
+ <string name="permlab_sdcardWrite" product="default" msgid="8805693630050458763">"keisti arba trinti SD kortelės turinį"</string>
<string name="permdesc_sdcardWrite" product="nosdcard" msgid="6175406299445710888">"Leidž. progr. raš. į USB atm."</string>
<string name="permdesc_sdcardWrite" product="default" msgid="4337417790936632090">"Leidžiama programai rašyti į SD kortelę."</string>
<string name="permlab_mediaStorageWrite" product="default" msgid="6859839199706879015">"keisti / ištr. vid. med. atm. tur."</string>
@@ -1090,8 +1081,7 @@
<string name="date_time_set" msgid="5777075614321087758">"Nustatyti"</string>
<string name="date_time_done" msgid="2507683751759308828">"Baigta"</string>
<string name="perms_new_perm_prefix" msgid="8257740710754301407"><font size="12" fgcolor="#ff900000">"NAUJAS: "</font></string>
- <!-- no translation found for perms_description_app (5139836143293299417) -->
- <skip />
+ <string name="perms_description_app" msgid="5139836143293299417">"Pateikė „<xliff:g id="APP_NAME">%1$s</xliff:g>“."</string>
<string name="no_permissions" msgid="7283357728219338112">"Nereikia leidimų"</string>
<string name="usb_storage_activity_title" msgid="4465055157209648641">"USB didelės talpos atmintis"</string>
<string name="usb_storage_title" msgid="5901459041398751495">"USB prijungtas"</string>
@@ -1323,6 +1313,5 @@
<string name="SetupCallDefault" msgid="5834948469253758575">"Priimti skambutį?"</string>
<!-- no translation found for activity_resolver_use_always (8017770747801494933) -->
<skip />
- <!-- no translation found for activity_resolver_use_once (405646673463328329) -->
- <skip />
+ <string name="activity_resolver_use_once" msgid="405646673463328329">"Tik kartą"</string>
</resources>
diff --git a/core/res/res/values-lv/strings.xml b/core/res/res/values-lv/strings.xml
index 8d0ed36..0b96365 100644
--- a/core/res/res/values-lv/strings.xml
+++ b/core/res/res/values-lv/strings.xml
@@ -175,28 +175,20 @@
<string name="permgroupdesc_location" msgid="5704679763124170100">"Pārrauga jūsu fizisko atrašanās vietu."</string>
<string name="permgrouplab_network" msgid="5808983377727109831">"Tīkla sakari"</string>
<string name="permgroupdesc_network" msgid="4478299413241861987">"Piekļūst dažādām tīkla funkcijām."</string>
- <!-- no translation found for permgrouplab_bluetoothNetwork (1585403544162128109) -->
- <skip />
- <!-- no translation found for permgroupdesc_bluetoothNetwork (5625288577164282391) -->
- <skip />
- <!-- no translation found for permgrouplab_shortrangeNetwork (130808676377486118) -->
- <skip />
- <!-- no translation found for permgroupdesc_shortrangeNetwork (1884069062653436007) -->
- <skip />
+ <string name="permgrouplab_bluetoothNetwork" msgid="1585403544162128109">"Bluetooth"</string>
+ <string name="permgroupdesc_bluetoothNetwork" msgid="5625288577164282391">"Piekļūt ierīcēm vai tīkliem, izmantojot tehnoloģiju Bluetooth."</string>
+ <string name="permgrouplab_shortrangeNetwork" msgid="130808676377486118">"Tuva darbības lauka tīkli"</string>
+ <string name="permgroupdesc_shortrangeNetwork" msgid="1884069062653436007">"Piekļūt ierīcēm, izmantojot tuva darbības lauka tīklus, piemēram, TDLS."</string>
<string name="permgrouplab_audioSettings" msgid="8329261670151871235">"Audio iestatījumi"</string>
<string name="permgroupdesc_audioSettings" msgid="2641515403347568130">"Audio iestatījumu maiņa."</string>
<string name="permgrouplab_affectsBattery" msgid="6209246653424798033">"Ietekme uz akumulatora darbību"</string>
<string name="permgroupdesc_affectsBattery" msgid="6441275320638916947">"Tādu funkciju izmantošana, kas patērē daudz akumulatora enerģijas."</string>
<string name="permgrouplab_calendar" msgid="5863508437783683902">"Kalendārs"</string>
<string name="permgroupdesc_calendar" msgid="5777534316982184416">"Tieša piekļuve kalendāram un pasākumiem."</string>
- <!-- no translation found for permgrouplab_dictionary (4148597128843641379) -->
- <skip />
- <!-- no translation found for permgroupdesc_dictionary (7921166355964764490) -->
- <skip />
- <!-- no translation found for permgrouplab_writeDictionary (8090237702432576788) -->
- <skip />
- <!-- no translation found for permgroupdesc_writeDictionary (2711561994497361646) -->
- <skip />
+ <string name="permgrouplab_dictionary" msgid="4148597128843641379">"Lietotāja vārdnīcas lasīšana"</string>
+ <string name="permgroupdesc_dictionary" msgid="7921166355964764490">"Lasīt vārdus lietotāja vārdnīcā."</string>
+ <string name="permgrouplab_writeDictionary" msgid="8090237702432576788">"Rakstīšana lietotāja vārdnīcā"</string>
+ <string name="permgroupdesc_writeDictionary" msgid="2711561994497361646">"Pievienot vārdus lietotāja vārdnīcai."</string>
<string name="permgrouplab_bookmarks" msgid="1949519673103968229">"Grāmatzīmes un vēsture"</string>
<string name="permgroupdesc_bookmarks" msgid="4169771606257963028">"Tieša piekļuve grāmatzīmēm un pārlūkprogrammas vēsturei."</string>
<string name="permgrouplab_deviceAlarms" msgid="6117704629728824101">"Signāls"</string>
@@ -569,8 +561,7 @@
<string name="permdesc_sdcardRead" product="nosdcard" msgid="3530894470637667917">"Ļauj lasīt USB: foto un multiv."</string>
<string name="permdesc_sdcardRead" product="default" msgid="2555811422562526606">"Ļauj lietotnei lasīt SD kartes saturu, kurā var būt fotoattēli un multivide."</string>
<string name="permlab_sdcardWrite" product="nosdcard" msgid="8485979062254666748">"mainīt vai dzēst USB atm. sat."</string>
- <!-- no translation found for permlab_sdcardWrite (8805693630050458763) -->
- <skip />
+ <string name="permlab_sdcardWrite" product="default" msgid="8805693630050458763">"SD kartes satura pārveidošana vai dzēšana"</string>
<string name="permdesc_sdcardWrite" product="nosdcard" msgid="6175406299445710888">"Ļauj lietotnei rakstīt USB atmiņā."</string>
<string name="permdesc_sdcardWrite" product="default" msgid="4337417790936632090">"Ļauj lietotnei rakstīt SD kartē."</string>
<string name="permlab_mediaStorageWrite" product="default" msgid="6859839199706879015">"pārv./dz.datu n.iekš.atm.sat."</string>
@@ -1090,8 +1081,7 @@
<string name="date_time_set" msgid="5777075614321087758">"Iestatīt"</string>
<string name="date_time_done" msgid="2507683751759308828">"Gatavs"</string>
<string name="perms_new_perm_prefix" msgid="8257740710754301407"><font size="12" fgcolor="#ff900000">"JAUNA: "</font></string>
- <!-- no translation found for perms_description_app (5139836143293299417) -->
- <skip />
+ <string name="perms_description_app" msgid="5139836143293299417">"Nodrošina <xliff:g id="APP_NAME">%1$s</xliff:g>."</string>
<string name="no_permissions" msgid="7283357728219338112">"Atļaujas nav nepieciešamas."</string>
<string name="usb_storage_activity_title" msgid="4465055157209648641">"USB lielapjoma atmiņa"</string>
<string name="usb_storage_title" msgid="5901459041398751495">"USB ir pievienots."</string>
@@ -1323,6 +1313,5 @@
<string name="SetupCallDefault" msgid="5834948469253758575">"Vai atbildēt uz zvanu?"</string>
<!-- no translation found for activity_resolver_use_always (8017770747801494933) -->
<skip />
- <!-- no translation found for activity_resolver_use_once (405646673463328329) -->
- <skip />
+ <string name="activity_resolver_use_once" msgid="405646673463328329">"Tikai vienreiz"</string>
</resources>
diff --git a/core/res/res/values-ms/strings.xml b/core/res/res/values-ms/strings.xml
index 1b479a4..47aa00a 100644
--- a/core/res/res/values-ms/strings.xml
+++ b/core/res/res/values-ms/strings.xml
@@ -175,28 +175,20 @@
<string name="permgroupdesc_location" msgid="5704679763124170100">"Pantau lokasi fizikal anda."</string>
<string name="permgrouplab_network" msgid="5808983377727109831">"Komunikasi rangkaian"</string>
<string name="permgroupdesc_network" msgid="4478299413241861987">"Akses pelbagai ciri rangkaian."</string>
- <!-- no translation found for permgrouplab_bluetoothNetwork (1585403544162128109) -->
- <skip />
- <!-- no translation found for permgroupdesc_bluetoothNetwork (5625288577164282391) -->
- <skip />
- <!-- no translation found for permgrouplab_shortrangeNetwork (130808676377486118) -->
- <skip />
- <!-- no translation found for permgroupdesc_shortrangeNetwork (1884069062653436007) -->
- <skip />
+ <string name="permgrouplab_bluetoothNetwork" msgid="1585403544162128109">"Bluetooth"</string>
+ <string name="permgroupdesc_bluetoothNetwork" msgid="5625288577164282391">"Akses peranti dan rangkaian melalui Bluetooth."</string>
+ <string name="permgrouplab_shortrangeNetwork" msgid="130808676377486118">"Rangkaian jarak-pendek"</string>
+ <string name="permgroupdesc_shortrangeNetwork" msgid="1884069062653436007">"Akses peranti melalui rangkaian jarak dekat seperti NFC."</string>
<string name="permgrouplab_audioSettings" msgid="8329261670151871235">"Tetapan Audio"</string>
<string name="permgroupdesc_audioSettings" msgid="2641515403347568130">"Tukar tetapan audio."</string>
<string name="permgrouplab_affectsBattery" msgid="6209246653424798033">"Menjejaskan Bateri"</string>
<string name="permgroupdesc_affectsBattery" msgid="6441275320638916947">"Gunakan ciri yang boleh menghabiskan bateri dengan cepat."</string>
<string name="permgrouplab_calendar" msgid="5863508437783683902">"Kalendar"</string>
<string name="permgroupdesc_calendar" msgid="5777534316982184416">"Akses langsung ke kalendar dan acara."</string>
- <!-- no translation found for permgrouplab_dictionary (4148597128843641379) -->
- <skip />
- <!-- no translation found for permgroupdesc_dictionary (7921166355964764490) -->
- <skip />
- <!-- no translation found for permgrouplab_writeDictionary (8090237702432576788) -->
- <skip />
- <!-- no translation found for permgroupdesc_writeDictionary (2711561994497361646) -->
- <skip />
+ <string name="permgrouplab_dictionary" msgid="4148597128843641379">"Baca Kamus Pengguna"</string>
+ <string name="permgroupdesc_dictionary" msgid="7921166355964764490">"Baca perkataan di dalam kamus pengguna."</string>
+ <string name="permgrouplab_writeDictionary" msgid="8090237702432576788">"Tulis Kamus Pengguna"</string>
+ <string name="permgroupdesc_writeDictionary" msgid="2711561994497361646">"Tambah perkataan ke kamus pengguna."</string>
<string name="permgrouplab_bookmarks" msgid="1949519673103968229">"Penanda halaman dan Sejarah"</string>
<string name="permgroupdesc_bookmarks" msgid="4169771606257963028">"Akses langsung ke penanda halaman dan sejarah penyemak imbas."</string>
<string name="permgrouplab_deviceAlarms" msgid="6117704629728824101">"Penggera"</string>
@@ -569,8 +561,7 @@
<string name="permdesc_sdcardRead" product="nosdcard" msgid="3530894470637667917">"Membolehkan apl membaca kandungan storan USB, yang mungkin termasuk foto dan media."</string>
<string name="permdesc_sdcardRead" product="default" msgid="2555811422562526606">"Membolehkan apl membaca kandungan kad SD, yang mungkin termasuk foto dan media."</string>
<string name="permlab_sdcardWrite" product="nosdcard" msgid="8485979062254666748">"ubah suai atau padam kandungan storan USB anda"</string>
- <!-- no translation found for permlab_sdcardWrite (8805693630050458763) -->
- <skip />
+ <string name="permlab_sdcardWrite" product="default" msgid="8805693630050458763">"ubah suai atau padam kandungan kad SD anda"</string>
<string name="permdesc_sdcardWrite" product="nosdcard" msgid="6175406299445710888">"Membenarkan apl menulis ke storan USB."</string>
<string name="permdesc_sdcardWrite" product="default" msgid="4337417790936632090">"Membenarkan apl menulis ke kad SD."</string>
<string name="permlab_mediaStorageWrite" product="default" msgid="6859839199706879015">"ubh suai/pdm kdg strn mdia dlm"</string>
@@ -1090,8 +1081,7 @@
<string name="date_time_set" msgid="5777075614321087758">"Tetapkan"</string>
<string name="date_time_done" msgid="2507683751759308828">"Selesai"</string>
<string name="perms_new_perm_prefix" msgid="8257740710754301407"><font size="12" fgcolor="#ff900000">"BAHARU: "</font></string>
- <!-- no translation found for perms_description_app (5139836143293299417) -->
- <skip />
+ <string name="perms_description_app" msgid="5139836143293299417">"Disediakan oleh <xliff:g id="APP_NAME">%1$s</xliff:g>."</string>
<string name="no_permissions" msgid="7283357728219338112">"Tiada kebenaran diperlukan"</string>
<string name="usb_storage_activity_title" msgid="4465055157209648641">"Storan massa USB"</string>
<string name="usb_storage_title" msgid="5901459041398751495">"sambungan USB"</string>
@@ -1321,8 +1311,6 @@
<string name="sending" msgid="3245653681008218030">"Menghantar…"</string>
<string name="launchBrowserDefault" msgid="2057951947297614725">"Lancarkan Penyemak Imbas?"</string>
<string name="SetupCallDefault" msgid="5834948469253758575">"Terima panggilan?"</string>
- <!-- no translation found for activity_resolver_use_always (8017770747801494933) -->
- <skip />
- <!-- no translation found for activity_resolver_use_once (405646673463328329) -->
- <skip />
+ <string name="activity_resolver_use_always" msgid="8017770747801494933">"Sentiasa"</string>
+ <string name="activity_resolver_use_once" msgid="405646673463328329">"Hanya Sekali"</string>
</resources>
diff --git a/core/res/res/values-nb/strings.xml b/core/res/res/values-nb/strings.xml
index 88db9f4..d39c75c 100644
--- a/core/res/res/values-nb/strings.xml
+++ b/core/res/res/values-nb/strings.xml
@@ -1321,8 +1321,7 @@
<string name="sending" msgid="3245653681008218030">"Sender …"</string>
<string name="launchBrowserDefault" msgid="2057951947297614725">"Vil du starte nettleseren?"</string>
<string name="SetupCallDefault" msgid="5834948469253758575">"Vil du besvare anropet?"</string>
- <!-- no translation found for activity_resolver_use_always (8017770747801494933) -->
- <skip />
+ <string name="activity_resolver_use_always" msgid="8017770747801494933">"Alltid"</string>
<!-- no translation found for activity_resolver_use_once (405646673463328329) -->
<skip />
</resources>
diff --git a/core/res/res/values-pl/strings.xml b/core/res/res/values-pl/strings.xml
index 62c839b..60ea8e8 100644
--- a/core/res/res/values-pl/strings.xml
+++ b/core/res/res/values-pl/strings.xml
@@ -1321,8 +1321,7 @@
<string name="sending" msgid="3245653681008218030">"Wysyłanie..."</string>
<string name="launchBrowserDefault" msgid="2057951947297614725">"Uruchomić przeglądarkę?"</string>
<string name="SetupCallDefault" msgid="5834948469253758575">"Odebrać połączenie?"</string>
- <!-- no translation found for activity_resolver_use_always (8017770747801494933) -->
- <skip />
+ <string name="activity_resolver_use_always" msgid="8017770747801494933">"Zawsze"</string>
<!-- no translation found for activity_resolver_use_once (405646673463328329) -->
<skip />
</resources>
diff --git a/core/res/res/values-pt-rPT/strings.xml b/core/res/res/values-pt-rPT/strings.xml
index 1825346..4bb3b2f 100644
--- a/core/res/res/values-pt-rPT/strings.xml
+++ b/core/res/res/values-pt-rPT/strings.xml
@@ -175,28 +175,20 @@
<string name="permgroupdesc_location" msgid="5704679763124170100">"Monitorizar a sua localização física."</string>
<string name="permgrouplab_network" msgid="5808983377727109831">"Comunicação de rede"</string>
<string name="permgroupdesc_network" msgid="4478299413241861987">"Aceder a várias funcionalidades de rede."</string>
- <!-- no translation found for permgrouplab_bluetoothNetwork (1585403544162128109) -->
- <skip />
- <!-- no translation found for permgroupdesc_bluetoothNetwork (5625288577164282391) -->
- <skip />
- <!-- no translation found for permgrouplab_shortrangeNetwork (130808676377486118) -->
- <skip />
- <!-- no translation found for permgroupdesc_shortrangeNetwork (1884069062653436007) -->
- <skip />
+ <string name="permgrouplab_bluetoothNetwork" msgid="1585403544162128109">"Bluetooth"</string>
+ <string name="permgroupdesc_bluetoothNetwork" msgid="5625288577164282391">"Aceder a dispositivos e redes através de Bluetooth."</string>
+ <string name="permgrouplab_shortrangeNetwork" msgid="130808676377486118">"Redes de Curto Alcance"</string>
+ <string name="permgroupdesc_shortrangeNetwork" msgid="1884069062653436007">"Aceder a dispositivos através de redes de curto alcance como NFC."</string>
<string name="permgrouplab_audioSettings" msgid="8329261670151871235">"Definições de Áudio"</string>
<string name="permgroupdesc_audioSettings" msgid="2641515403347568130">"Alterar as definições de áudio."</string>
<string name="permgrouplab_affectsBattery" msgid="6209246653424798033">"Afetar a Bateria"</string>
<string name="permgroupdesc_affectsBattery" msgid="6441275320638916947">"Utilizar funcionalidades que podem descarregar rapidamente a bateria."</string>
<string name="permgrouplab_calendar" msgid="5863508437783683902">"Calendário"</string>
<string name="permgroupdesc_calendar" msgid="5777534316982184416">"Acesso direto ao calendário e eventos."</string>
- <!-- no translation found for permgrouplab_dictionary (4148597128843641379) -->
- <skip />
- <!-- no translation found for permgroupdesc_dictionary (7921166355964764490) -->
- <skip />
- <!-- no translation found for permgrouplab_writeDictionary (8090237702432576788) -->
- <skip />
- <!-- no translation found for permgroupdesc_writeDictionary (2711561994497361646) -->
- <skip />
+ <string name="permgrouplab_dictionary" msgid="4148597128843641379">"Ler Dicionário do Utilizador"</string>
+ <string name="permgroupdesc_dictionary" msgid="7921166355964764490">"Ler palavras no dicionário do utilizador."</string>
+ <string name="permgrouplab_writeDictionary" msgid="8090237702432576788">"Escrever no Dicionário do Utilizador"</string>
+ <string name="permgroupdesc_writeDictionary" msgid="2711561994497361646">"Adicionar palavras ao dicionário do utilizador."</string>
<string name="permgrouplab_bookmarks" msgid="1949519673103968229">"Marcadores e Histórico"</string>
<string name="permgroupdesc_bookmarks" msgid="4169771606257963028">"Acesso direto aos marcadores e histórico do navegador."</string>
<string name="permgrouplab_deviceAlarms" msgid="6117704629728824101">"Alarme"</string>
@@ -569,8 +561,7 @@
<string name="permdesc_sdcardRead" product="nosdcard" msgid="3530894470637667917">"Permitir que aplic. leia cont. da mem. USB, que poderão incluir fotogr. e multimédia."</string>
<string name="permdesc_sdcardRead" product="default" msgid="2555811422562526606">"Permite que a aplicação leia os conteúdos do cartão SD que poderão incluir fotografias e elementos multimédia."</string>
<string name="permlab_sdcardWrite" product="nosdcard" msgid="8485979062254666748">"modificar ou eliminar os conteúdos da memória USB"</string>
- <!-- no translation found for permlab_sdcardWrite (8805693630050458763) -->
- <skip />
+ <string name="permlab_sdcardWrite" product="default" msgid="8805693630050458763">"modificar ou eliminar os conteúdos do cartão SD"</string>
<string name="permdesc_sdcardWrite" product="nosdcard" msgid="6175406299445710888">"Permite que a aplicação escreva na unidade de armazenamento USB."</string>
<string name="permdesc_sdcardWrite" product="default" msgid="4337417790936632090">"Permite que a aplicação escreva no cartão SD."</string>
<string name="permlab_mediaStorageWrite" product="default" msgid="6859839199706879015">"modif./elim. armaz. interno"</string>
@@ -1090,8 +1081,7 @@
<string name="date_time_set" msgid="5777075614321087758">"Definir"</string>
<string name="date_time_done" msgid="2507683751759308828">"Concluído"</string>
<string name="perms_new_perm_prefix" msgid="8257740710754301407"><font size="12" fgcolor="#ff900000">"NOVA: "</font></string>
- <!-- no translation found for perms_description_app (5139836143293299417) -->
- <skip />
+ <string name="perms_description_app" msgid="5139836143293299417">"Fornecido por <xliff:g id="APP_NAME">%1$s</xliff:g>."</string>
<string name="no_permissions" msgid="7283357728219338112">"Não são necessárias permissões"</string>
<string name="usb_storage_activity_title" msgid="4465055157209648641">"Armazenamento em massa USB"</string>
<string name="usb_storage_title" msgid="5901459041398751495">"Ligado através de USB"</string>
@@ -1323,6 +1313,5 @@
<string name="SetupCallDefault" msgid="5834948469253758575">"Aceitar chamada?"</string>
<!-- no translation found for activity_resolver_use_always (8017770747801494933) -->
<skip />
- <!-- no translation found for activity_resolver_use_once (405646673463328329) -->
- <skip />
+ <string name="activity_resolver_use_once" msgid="405646673463328329">"Só Uma Vez"</string>
</resources>
diff --git a/core/res/res/values-pt/strings.xml b/core/res/res/values-pt/strings.xml
index 2e00b29..ba10acd 100644
--- a/core/res/res/values-pt/strings.xml
+++ b/core/res/res/values-pt/strings.xml
@@ -175,28 +175,20 @@
<string name="permgroupdesc_location" msgid="5704679763124170100">"Monitore seu local físico."</string>
<string name="permgrouplab_network" msgid="5808983377727109831">"Comunicação da rede"</string>
<string name="permgroupdesc_network" msgid="4478299413241861987">"Acesse diversos recursos de rede."</string>
- <!-- no translation found for permgrouplab_bluetoothNetwork (1585403544162128109) -->
- <skip />
- <!-- no translation found for permgroupdesc_bluetoothNetwork (5625288577164282391) -->
- <skip />
- <!-- no translation found for permgrouplab_shortrangeNetwork (130808676377486118) -->
- <skip />
- <!-- no translation found for permgroupdesc_shortrangeNetwork (1884069062653436007) -->
- <skip />
+ <string name="permgrouplab_bluetoothNetwork" msgid="1585403544162128109">"Bluetooth"</string>
+ <string name="permgroupdesc_bluetoothNetwork" msgid="5625288577164282391">"Acessar dispositivos e redes através do Bluetooth."</string>
+ <string name="permgrouplab_shortrangeNetwork" msgid="130808676377486118">"Redes de curto alcance"</string>
+ <string name="permgroupdesc_shortrangeNetwork" msgid="1884069062653436007">"Acessar dispositivos através de redes de curto alcance de redes como a NFC."</string>
<string name="permgrouplab_audioSettings" msgid="8329261670151871235">"Configurações de áudio"</string>
<string name="permgroupdesc_audioSettings" msgid="2641515403347568130">"Alterar as configurações de áudio."</string>
<string name="permgrouplab_affectsBattery" msgid="6209246653424798033">"Afeta a bateria"</string>
<string name="permgroupdesc_affectsBattery" msgid="6441275320638916947">"Usar recursos que podem descarregar a bateria rapidamente."</string>
<string name="permgrouplab_calendar" msgid="5863508437783683902">"Agenda"</string>
<string name="permgroupdesc_calendar" msgid="5777534316982184416">"Acesso direto ao calendário e eventos."</string>
- <!-- no translation found for permgrouplab_dictionary (4148597128843641379) -->
- <skip />
- <!-- no translation found for permgroupdesc_dictionary (7921166355964764490) -->
- <skip />
- <!-- no translation found for permgrouplab_writeDictionary (8090237702432576788) -->
- <skip />
- <!-- no translation found for permgroupdesc_writeDictionary (2711561994497361646) -->
- <skip />
+ <string name="permgrouplab_dictionary" msgid="4148597128843641379">"Ler o dicionário do usuário"</string>
+ <string name="permgroupdesc_dictionary" msgid="7921166355964764490">"Ler as palavras do dicionário do usuário."</string>
+ <string name="permgrouplab_writeDictionary" msgid="8090237702432576788">"Escrever no dicionário do usuário"</string>
+ <string name="permgroupdesc_writeDictionary" msgid="2711561994497361646">"Adicionar palavras ao dicionário do usuário."</string>
<string name="permgrouplab_bookmarks" msgid="1949519673103968229">"Favoritos e histórico"</string>
<string name="permgroupdesc_bookmarks" msgid="4169771606257963028">"Acesso direto aos favoritos e histórico do navegador."</string>
<string name="permgrouplab_deviceAlarms" msgid="6117704629728824101">"Alarme"</string>
@@ -569,8 +561,7 @@
<string name="permdesc_sdcardRead" product="nosdcard" msgid="3530894470637667917">"Perm apl leia cont arm USB, incl fotos e mídia."</string>
<string name="permdesc_sdcardRead" product="default" msgid="2555811422562526606">"Permite que o aplicativo leia o conteúdo do cartão SD, o qual pode incluir fotos e mídia."</string>
<string name="permlab_sdcardWrite" product="nosdcard" msgid="8485979062254666748">"modif ou excl cont. armaz USB"</string>
- <!-- no translation found for permlab_sdcardWrite (8805693630050458763) -->
- <skip />
+ <string name="permlab_sdcardWrite" product="default" msgid="8805693630050458763">"modificar ou excluir o conteúdo do cartão SD"</string>
<string name="permdesc_sdcardWrite" product="nosdcard" msgid="6175406299445710888">"Permite gravar no armaz. USB."</string>
<string name="permdesc_sdcardWrite" product="default" msgid="4337417790936632090">"Permite que o aplicativo grave em seu cartão SD."</string>
<string name="permlab_mediaStorageWrite" product="default" msgid="6859839199706879015">"modificar/excluir conteúdos de armazenamento de mídia internos"</string>
@@ -1090,8 +1081,7 @@
<string name="date_time_set" msgid="5777075614321087758">"Definir"</string>
<string name="date_time_done" msgid="2507683751759308828">"Concluído"</string>
<string name="perms_new_perm_prefix" msgid="8257740710754301407"><font size="12" fgcolor="#ff900000">"NOVO: "</font></string>
- <!-- no translation found for perms_description_app (5139836143293299417) -->
- <skip />
+ <string name="perms_description_app" msgid="5139836143293299417">"Fornecido por <xliff:g id="APP_NAME">%1$s</xliff:g>."</string>
<string name="no_permissions" msgid="7283357728219338112">"Nenhuma permissão necessária"</string>
<string name="usb_storage_activity_title" msgid="4465055157209648641">"Armazenamento USB em massa"</string>
<string name="usb_storage_title" msgid="5901459041398751495">"Conectado por USB"</string>
@@ -1321,8 +1311,6 @@
<string name="sending" msgid="3245653681008218030">"Enviando..."</string>
<string name="launchBrowserDefault" msgid="2057951947297614725">"Abrir Navegador?"</string>
<string name="SetupCallDefault" msgid="5834948469253758575">"Aceitar chamada?"</string>
- <!-- no translation found for activity_resolver_use_always (8017770747801494933) -->
- <skip />
- <!-- no translation found for activity_resolver_use_once (405646673463328329) -->
- <skip />
+ <string name="activity_resolver_use_always" msgid="8017770747801494933">"Sempre"</string>
+ <string name="activity_resolver_use_once" msgid="405646673463328329">"Só uma vez"</string>
</resources>
diff --git a/core/res/res/values-ro/strings.xml b/core/res/res/values-ro/strings.xml
index 61428cd..45783d1 100644
--- a/core/res/res/values-ro/strings.xml
+++ b/core/res/res/values-ro/strings.xml
@@ -1321,8 +1321,7 @@
<string name="sending" msgid="3245653681008218030">"Se trimite..."</string>
<string name="launchBrowserDefault" msgid="2057951947297614725">"Lansaţi browserul?"</string>
<string name="SetupCallDefault" msgid="5834948469253758575">"Acceptaţi apelul?"</string>
- <!-- no translation found for activity_resolver_use_always (8017770747801494933) -->
- <skip />
+ <string name="activity_resolver_use_always" msgid="8017770747801494933">"Întotdeauna"</string>
<!-- no translation found for activity_resolver_use_once (405646673463328329) -->
<skip />
</resources>
diff --git a/core/res/res/values-ru/strings.xml b/core/res/res/values-ru/strings.xml
index 1fcd393..899f13a 100644
--- a/core/res/res/values-ru/strings.xml
+++ b/core/res/res/values-ru/strings.xml
@@ -175,28 +175,20 @@
<string name="permgroupdesc_location" msgid="5704679763124170100">"Приложение сможет отслеживать ваше местоположение."</string>
<string name="permgrouplab_network" msgid="5808983377727109831">"Сетевой обмен данными"</string>
<string name="permgroupdesc_network" msgid="4478299413241861987">"Приложение сможет получать доступ к различным сетевым функциям."</string>
- <!-- no translation found for permgrouplab_bluetoothNetwork (1585403544162128109) -->
- <skip />
- <!-- no translation found for permgroupdesc_bluetoothNetwork (5625288577164282391) -->
- <skip />
- <!-- no translation found for permgrouplab_shortrangeNetwork (130808676377486118) -->
- <skip />
- <!-- no translation found for permgroupdesc_shortrangeNetwork (1884069062653436007) -->
- <skip />
+ <string name="permgrouplab_bluetoothNetwork" msgid="1585403544162128109">"Bluetooth"</string>
+ <string name="permgroupdesc_bluetoothNetwork" msgid="5625288577164282391">"Доступ к устройствам и сетям через Bluetooth."</string>
+ <string name="permgrouplab_shortrangeNetwork" msgid="130808676377486118">"Сети малого радиуса действия"</string>
+ <string name="permgroupdesc_shortrangeNetwork" msgid="1884069062653436007">"Доступ к устройствам с помощью сетей малого радиуса действия, например NFC."</string>
<string name="permgrouplab_audioSettings" msgid="8329261670151871235">"Настройки звука"</string>
<string name="permgroupdesc_audioSettings" msgid="2641515403347568130">"Изменение настроек звука."</string>
<string name="permgrouplab_affectsBattery" msgid="6209246653424798033">"Воздействие на батарею"</string>
<string name="permgroupdesc_affectsBattery" msgid="6441275320638916947">"Использование функций, приводящих к быстрой разрядке батареи."</string>
<string name="permgrouplab_calendar" msgid="5863508437783683902">"Календарь"</string>
<string name="permgroupdesc_calendar" msgid="5777534316982184416">"Прямой доступ к календарю и мероприятиям."</string>
- <!-- no translation found for permgrouplab_dictionary (4148597128843641379) -->
- <skip />
- <!-- no translation found for permgroupdesc_dictionary (7921166355964764490) -->
- <skip />
- <!-- no translation found for permgrouplab_writeDictionary (8090237702432576788) -->
- <skip />
- <!-- no translation found for permgroupdesc_writeDictionary (2711561994497361646) -->
- <skip />
+ <string name="permgrouplab_dictionary" msgid="4148597128843641379">"Чтение данных из пользовательского словаря"</string>
+ <string name="permgroupdesc_dictionary" msgid="7921166355964764490">"Чтение слов в пользовательском словаре."</string>
+ <string name="permgrouplab_writeDictionary" msgid="8090237702432576788">"Запись данных в пользовательский словарь"</string>
+ <string name="permgroupdesc_writeDictionary" msgid="2711561994497361646">"Добавление слов в пользовательский словарь."</string>
<string name="permgrouplab_bookmarks" msgid="1949519673103968229">"Закладки и история"</string>
<string name="permgroupdesc_bookmarks" msgid="4169771606257963028">"Прямой доступ к закладкам и истории браузера."</string>
<string name="permgrouplab_deviceAlarms" msgid="6117704629728824101">"Будильник"</string>
@@ -374,7 +366,7 @@
<string name="permdesc_grantRevokePermissions" msgid="4088642654085850662">"Позволяет приложению предоставлять и отзывать разрешения самому себе и другим программам. Вредоносные приложения могут использовать эту функцию для получения прав, которых вы им не предоставляли."</string>
<string name="permlab_setPreferredApplications" msgid="8463181628695396391">"настройка предпочтительных приложений"</string>
<string name="permdesc_setPreferredApplications" msgid="4973986762241783712">"Приложение сможет изменять предпочтительные приложения. Вредоносные программы смогут незаметно изменять запускаемые вами программы и собирать ваши личные данные от имени существующих приложений."</string>
- <string name="permlab_writeSettings" msgid="2226195290955224730">"Bзменение настроек системы"</string>
+ <string name="permlab_writeSettings" msgid="2226195290955224730">"Изменение настроек системы"</string>
<string name="permdesc_writeSettings" msgid="7775723441558907181">"Приложение сможет изменять настройки системы. Вредоносные программы смогут повредить конфигурацию системы."</string>
<string name="permlab_writeSecureSettings" msgid="204676251876718288">"изменять настройки системы безопасности"</string>
<string name="permdesc_writeSecureSettings" msgid="8159535613020137391">"Приложение сможет изменять системные настройки безопасности. Это разрешение не используется обычными приложениями."</string>
@@ -569,8 +561,7 @@
<string name="permdesc_sdcardRead" product="nosdcard" msgid="3530894470637667917">"Приложение сможет считывать содержимое USB-накопителя, включая фото и файлы мультимедиа."</string>
<string name="permdesc_sdcardRead" product="default" msgid="2555811422562526606">"Приложение сможет считывать содержимое SD-карты, включая фото и файлы мультимедиа."</string>
<string name="permlab_sdcardWrite" product="nosdcard" msgid="8485979062254666748">"Изменение или удаление содержимого USB-накопителя"</string>
- <!-- no translation found for permlab_sdcardWrite (8805693630050458763) -->
- <skip />
+ <string name="permlab_sdcardWrite" product="default" msgid="8805693630050458763">"Изменение или удаление содержимого SD-карты"</string>
<string name="permdesc_sdcardWrite" product="nosdcard" msgid="6175406299445710888">"Приложение сможет записывать данные на USB-накопитель."</string>
<string name="permdesc_sdcardWrite" product="default" msgid="4337417790936632090">"Приложение сможет записывать данные на SD-карту."</string>
<string name="permlab_mediaStorageWrite" product="default" msgid="6859839199706879015">"изм./удал. данных мультимедиа"</string>
@@ -1090,8 +1081,7 @@
<string name="date_time_set" msgid="5777075614321087758">"Установить"</string>
<string name="date_time_done" msgid="2507683751759308828">"Готово"</string>
<string name="perms_new_perm_prefix" msgid="8257740710754301407"><font size="12" fgcolor="#ff900000">"НОВОЕ: "</font></string>
- <!-- no translation found for perms_description_app (5139836143293299417) -->
- <skip />
+ <string name="perms_description_app" msgid="5139836143293299417">"Источник: <xliff:g id="APP_NAME">%1$s</xliff:g>."</string>
<string name="no_permissions" msgid="7283357728219338112">"Не требуется разрешений"</string>
<string name="usb_storage_activity_title" msgid="4465055157209648641">"Запоминающее устройство USB"</string>
<string name="usb_storage_title" msgid="5901459041398751495">"USB-подключение установлено"</string>
@@ -1321,8 +1311,6 @@
<string name="sending" msgid="3245653681008218030">"Отправка..."</string>
<string name="launchBrowserDefault" msgid="2057951947297614725">"Запустить браузер?"</string>
<string name="SetupCallDefault" msgid="5834948469253758575">"Ответить?"</string>
- <!-- no translation found for activity_resolver_use_always (8017770747801494933) -->
- <skip />
- <!-- no translation found for activity_resolver_use_once (405646673463328329) -->
- <skip />
+ <string name="activity_resolver_use_always" msgid="8017770747801494933">"Всегда"</string>
+ <string name="activity_resolver_use_once" msgid="405646673463328329">"Только сейчас"</string>
</resources>
diff --git a/core/res/res/values-sk/strings.xml b/core/res/res/values-sk/strings.xml
index db562c7..79cb76a 100644
--- a/core/res/res/values-sk/strings.xml
+++ b/core/res/res/values-sk/strings.xml
@@ -175,28 +175,20 @@
<string name="permgroupdesc_location" msgid="5704679763124170100">"Sledovanie vašej fyzickej polohy."</string>
<string name="permgrouplab_network" msgid="5808983377727109831">"Sieťová komunikácia"</string>
<string name="permgroupdesc_network" msgid="4478299413241861987">"Prístup k rôznym funkciám siete."</string>
- <!-- no translation found for permgrouplab_bluetoothNetwork (1585403544162128109) -->
- <skip />
- <!-- no translation found for permgroupdesc_bluetoothNetwork (5625288577164282391) -->
- <skip />
- <!-- no translation found for permgrouplab_shortrangeNetwork (130808676377486118) -->
- <skip />
- <!-- no translation found for permgroupdesc_shortrangeNetwork (1884069062653436007) -->
- <skip />
+ <string name="permgrouplab_bluetoothNetwork" msgid="1585403544162128109">"Bluetooth"</string>
+ <string name="permgroupdesc_bluetoothNetwork" msgid="5625288577164282391">"Prístup k zariadeniam a sieťam prostredníctvom rozhrania Bluetooth."</string>
+ <string name="permgrouplab_shortrangeNetwork" msgid="130808676377486118">"Siete krátkeho dosahu"</string>
+ <string name="permgroupdesc_shortrangeNetwork" msgid="1884069062653436007">"Prístup k zariadeniam prostredníctvom sietí krátkeho dosahu (napr. NFC)."</string>
<string name="permgrouplab_audioSettings" msgid="8329261670151871235">"Nastavenia zvuku"</string>
<string name="permgroupdesc_audioSettings" msgid="2641515403347568130">"Zmena nastavení zvuku."</string>
<string name="permgrouplab_affectsBattery" msgid="6209246653424798033">"Má vplyv na batériu"</string>
<string name="permgroupdesc_affectsBattery" msgid="6441275320638916947">"Používanie funkcií, ktoré môžu rýchlo vyčerpať batériu."</string>
<string name="permgrouplab_calendar" msgid="5863508437783683902">"Kalendár"</string>
<string name="permgroupdesc_calendar" msgid="5777534316982184416">"Priamy prístup ku kalendáru a udalostiam."</string>
- <!-- no translation found for permgrouplab_dictionary (4148597128843641379) -->
- <skip />
- <!-- no translation found for permgroupdesc_dictionary (7921166355964764490) -->
- <skip />
- <!-- no translation found for permgrouplab_writeDictionary (8090237702432576788) -->
- <skip />
- <!-- no translation found for permgroupdesc_writeDictionary (2711561994497361646) -->
- <skip />
+ <string name="permgrouplab_dictionary" msgid="4148597128843641379">"Čítanie požívateľského slovníka"</string>
+ <string name="permgroupdesc_dictionary" msgid="7921166355964764490">"Čítanie slov v používateľskom slovníku."</string>
+ <string name="permgrouplab_writeDictionary" msgid="8090237702432576788">"Zápis do používateľského slovníka"</string>
+ <string name="permgroupdesc_writeDictionary" msgid="2711561994497361646">"Pridávanie slov do používateľského slovníka."</string>
<string name="permgrouplab_bookmarks" msgid="1949519673103968229">"Záložky a história"</string>
<string name="permgroupdesc_bookmarks" msgid="4169771606257963028">"Priamy prístup k záložkám a histórii prehliadača."</string>
<string name="permgrouplab_deviceAlarms" msgid="6117704629728824101">"Budík"</string>
@@ -569,8 +561,7 @@
<string name="permdesc_sdcardRead" product="nosdcard" msgid="3530894470637667917">"Umožňuje aplikácii čítať obsah úložiska USB, ktorý môže obsahovať fotografie a mediálne údaje."</string>
<string name="permdesc_sdcardRead" product="default" msgid="2555811422562526606">"Umožňuje aplikácii čítať obsah karty SD, ktorý môže zahrnovať fotografie a mediálne údaje."</string>
<string name="permlab_sdcardWrite" product="nosdcard" msgid="8485979062254666748">"upraviť alebo odstrániť obsah úložiska USB"</string>
- <!-- no translation found for permlab_sdcardWrite (8805693630050458763) -->
- <skip />
+ <string name="permlab_sdcardWrite" product="default" msgid="8805693630050458763">"úprava alebo odstránenie obsahu na karte SD"</string>
<string name="permdesc_sdcardWrite" product="nosdcard" msgid="6175406299445710888">"Umožňuje aplikácii zápis do ukladacieho priestoru USB."</string>
<string name="permdesc_sdcardWrite" product="default" msgid="4337417790936632090">"Umožňuje aplikácii zápis na kartu SD."</string>
<string name="permlab_mediaStorageWrite" product="default" msgid="6859839199706879015">"úprava alebo odstránenie obsahu interného ukladacieho priestoru média"</string>
@@ -1090,8 +1081,7 @@
<string name="date_time_set" msgid="5777075614321087758">"Nastaviť"</string>
<string name="date_time_done" msgid="2507683751759308828">"Hotovo"</string>
<string name="perms_new_perm_prefix" msgid="8257740710754301407"><font size="12" fgcolor="#ff900000">"NOVINKA: "</font></string>
- <!-- no translation found for perms_description_app (5139836143293299417) -->
- <skip />
+ <string name="perms_description_app" msgid="5139836143293299417">"Poskytuje aplikácia <xliff:g id="APP_NAME">%1$s</xliff:g>."</string>
<string name="no_permissions" msgid="7283357728219338112">"Nevyžadujú sa žiadne oprávnenia."</string>
<string name="usb_storage_activity_title" msgid="4465055157209648641">"Veľkokapacitné úložisko USB"</string>
<string name="usb_storage_title" msgid="5901459041398751495">"Zariadenie USB pripojené"</string>
@@ -1321,8 +1311,6 @@
<string name="sending" msgid="3245653681008218030">"Odosielanie..."</string>
<string name="launchBrowserDefault" msgid="2057951947297614725">"Spustiť prehliadač?"</string>
<string name="SetupCallDefault" msgid="5834948469253758575">"Prijať hovor?"</string>
- <!-- no translation found for activity_resolver_use_always (8017770747801494933) -->
- <skip />
- <!-- no translation found for activity_resolver_use_once (405646673463328329) -->
- <skip />
+ <string name="activity_resolver_use_always" msgid="8017770747801494933">"Vždy"</string>
+ <string name="activity_resolver_use_once" msgid="405646673463328329">"Len raz"</string>
</resources>
diff --git a/core/res/res/values-sl/strings.xml b/core/res/res/values-sl/strings.xml
index 570bb59..32a0a22 100644
--- a/core/res/res/values-sl/strings.xml
+++ b/core/res/res/values-sl/strings.xml
@@ -175,28 +175,20 @@
<string name="permgroupdesc_location" msgid="5704679763124170100">"Spremljanje fizične lokacije."</string>
<string name="permgrouplab_network" msgid="5808983377727109831">"Omrežna komunikacija"</string>
<string name="permgroupdesc_network" msgid="4478299413241861987">"Dostop do različnih funkcij omrežja."</string>
- <!-- no translation found for permgrouplab_bluetoothNetwork (1585403544162128109) -->
- <skip />
- <!-- no translation found for permgroupdesc_bluetoothNetwork (5625288577164282391) -->
- <skip />
- <!-- no translation found for permgrouplab_shortrangeNetwork (130808676377486118) -->
- <skip />
- <!-- no translation found for permgroupdesc_shortrangeNetwork (1884069062653436007) -->
- <skip />
+ <string name="permgrouplab_bluetoothNetwork" msgid="1585403544162128109">"Bluetooth"</string>
+ <string name="permgroupdesc_bluetoothNetwork" msgid="5625288577164282391">"Dostopanje do naprav in omrežij prek povezave Bluetooth."</string>
+ <string name="permgrouplab_shortrangeNetwork" msgid="130808676377486118">"Omrežja kratkega dosega"</string>
+ <string name="permgroupdesc_shortrangeNetwork" msgid="1884069062653436007">"Dostop do naprav z omrežji kratkega dosega, kot je NFC."</string>
<string name="permgrouplab_audioSettings" msgid="8329261670151871235">"Nastavitve zvoka"</string>
<string name="permgroupdesc_audioSettings" msgid="2641515403347568130">"Spreminjanje nastavitev zvoka."</string>
<string name="permgrouplab_affectsBattery" msgid="6209246653424798033">"Vpliv na baterijo"</string>
<string name="permgroupdesc_affectsBattery" msgid="6441275320638916947">"Uporaba funkcij, ki lahko hitro izpraznijo baterijo."</string>
<string name="permgrouplab_calendar" msgid="5863508437783683902">"Google Koledar"</string>
<string name="permgroupdesc_calendar" msgid="5777534316982184416">"Neposreden dostop do koledarja in dogodkov."</string>
- <!-- no translation found for permgrouplab_dictionary (4148597128843641379) -->
- <skip />
- <!-- no translation found for permgroupdesc_dictionary (7921166355964764490) -->
- <skip />
- <!-- no translation found for permgrouplab_writeDictionary (8090237702432576788) -->
- <skip />
- <!-- no translation found for permgroupdesc_writeDictionary (2711561994497361646) -->
- <skip />
+ <string name="permgrouplab_dictionary" msgid="4148597128843641379">"Branje uporabniškega slovarja"</string>
+ <string name="permgroupdesc_dictionary" msgid="7921166355964764490">"Branje besed v uporabniškem slovarju."</string>
+ <string name="permgrouplab_writeDictionary" msgid="8090237702432576788">"Pisanje v uporabniški slovar"</string>
+ <string name="permgroupdesc_writeDictionary" msgid="2711561994497361646">"Dodajanje besed v uporabniški slovar."</string>
<string name="permgrouplab_bookmarks" msgid="1949519673103968229">"Zaznamki in zgodovina"</string>
<string name="permgroupdesc_bookmarks" msgid="4169771606257963028">"Neposreden dostop do zaznamkov in zgodovine brskalnika."</string>
<string name="permgrouplab_deviceAlarms" msgid="6117704629728824101">"Alarm"</string>
@@ -569,8 +561,7 @@
<string name="permdesc_sdcardRead" product="nosdcard" msgid="3530894470637667917">"Apl. om. br. USB s fot. in pr."</string>
<string name="permdesc_sdcardRead" product="default" msgid="2555811422562526606">"Omogoča, da aplikacija bere vsebino kartice SD, ki lahko vključuje fotografije in predstavnost."</string>
<string name="permlab_sdcardWrite" product="nosdcard" msgid="8485979062254666748">"spr. ali bris. vseb. pomn. USB"</string>
- <!-- no translation found for permlab_sdcardWrite (8805693630050458763) -->
- <skip />
+ <string name="permlab_sdcardWrite" product="default" msgid="8805693630050458763">"spreminjanje ali brisanje vsebine kartice SD"</string>
<string name="permdesc_sdcardWrite" product="nosdcard" msgid="6175406299445710888">"Programu omogoča zapisovanje v pomnilnik USB."</string>
<string name="permdesc_sdcardWrite" product="default" msgid="4337417790936632090">"Programu omogoča pisanje na kartico SD."</string>
<string name="permlab_mediaStorageWrite" product="default" msgid="6859839199706879015">"spreminjanje/brisanje vsebine notranje shrambe nosilca podatkov"</string>
@@ -1090,8 +1081,7 @@
<string name="date_time_set" msgid="5777075614321087758">"Nastavi"</string>
<string name="date_time_done" msgid="2507683751759308828">"Končano"</string>
<string name="perms_new_perm_prefix" msgid="8257740710754301407"><font size="12" fgcolor="#ff900000">"NOVO: "</font></string>
- <!-- no translation found for perms_description_app (5139836143293299417) -->
- <skip />
+ <string name="perms_description_app" msgid="5139836143293299417">"Zagotavlja aplikacija <xliff:g id="APP_NAME">%1$s</xliff:g>."</string>
<string name="no_permissions" msgid="7283357728219338112">"Ni zahtevanih dovoljenj"</string>
<string name="usb_storage_activity_title" msgid="4465055157209648641">"Masovni pomnilnik USB"</string>
<string name="usb_storage_title" msgid="5901459041398751495">"Povezava USB je vzpostavljena"</string>
@@ -1321,8 +1311,6 @@
<string name="sending" msgid="3245653681008218030">"Pošiljanje ..."</string>
<string name="launchBrowserDefault" msgid="2057951947297614725">"Ali želite odpreti brskalnik?"</string>
<string name="SetupCallDefault" msgid="5834948469253758575">"Ali želite sprejeti klic?"</string>
- <!-- no translation found for activity_resolver_use_always (8017770747801494933) -->
- <skip />
- <!-- no translation found for activity_resolver_use_once (405646673463328329) -->
- <skip />
+ <string name="activity_resolver_use_always" msgid="8017770747801494933">"Vedno"</string>
+ <string name="activity_resolver_use_once" msgid="405646673463328329">"Samo tokrat"</string>
</resources>
diff --git a/core/res/res/values-sr/strings.xml b/core/res/res/values-sr/strings.xml
index 11a733d..e943dda 100644
--- a/core/res/res/values-sr/strings.xml
+++ b/core/res/res/values-sr/strings.xml
@@ -1321,8 +1321,7 @@
<string name="sending" msgid="3245653681008218030">"Слање..."</string>
<string name="launchBrowserDefault" msgid="2057951947297614725">"Желите ли да покренете прегледач?"</string>
<string name="SetupCallDefault" msgid="5834948469253758575">"Желите ли да прихватите позив?"</string>
- <!-- no translation found for activity_resolver_use_always (8017770747801494933) -->
- <skip />
+ <string name="activity_resolver_use_always" msgid="8017770747801494933">"Увек"</string>
<!-- no translation found for activity_resolver_use_once (405646673463328329) -->
<skip />
</resources>
diff --git a/core/res/res/values-tl/strings.xml b/core/res/res/values-tl/strings.xml
index 946c0e7..70f8143 100644
--- a/core/res/res/values-tl/strings.xml
+++ b/core/res/res/values-tl/strings.xml
@@ -175,28 +175,20 @@
<string name="permgroupdesc_location" msgid="5704679763124170100">"Subaybayan ang iyong pisikal na lokasyon."</string>
<string name="permgrouplab_network" msgid="5808983377727109831">"Pakikipag-ugnay sa network"</string>
<string name="permgroupdesc_network" msgid="4478299413241861987">"Mag-access ng iba\'t ibang mga tampok ng network."</string>
- <!-- no translation found for permgrouplab_bluetoothNetwork (1585403544162128109) -->
- <skip />
- <!-- no translation found for permgroupdesc_bluetoothNetwork (5625288577164282391) -->
- <skip />
- <!-- no translation found for permgrouplab_shortrangeNetwork (130808676377486118) -->
- <skip />
- <!-- no translation found for permgroupdesc_shortrangeNetwork (1884069062653436007) -->
- <skip />
+ <string name="permgrouplab_bluetoothNetwork" msgid="1585403544162128109">"Bluetooth"</string>
+ <string name="permgroupdesc_bluetoothNetwork" msgid="5625288577164282391">"I-access ang mga device at network sa pamamagitan ng Bluetooth."</string>
+ <string name="permgrouplab_shortrangeNetwork" msgid="130808676377486118">"Mga Network na May Maikling Saklaw"</string>
+ <string name="permgroupdesc_shortrangeNetwork" msgid="1884069062653436007">"I-access ang mga device sa pamamagitan ng mga network na may maikling saklaw gaya ng NFC."</string>
<string name="permgrouplab_audioSettings" msgid="8329261670151871235">"Mga Setting ng Audio"</string>
<string name="permgroupdesc_audioSettings" msgid="2641515403347568130">"Baguhin ang mga setting ng audio."</string>
<string name="permgrouplab_affectsBattery" msgid="6209246653424798033">"Naaapektuhan ang Baterya"</string>
<string name="permgroupdesc_affectsBattery" msgid="6441275320638916947">"Gumamit ng mga tampok na mabilisang uubos ng baterya."</string>
<string name="permgrouplab_calendar" msgid="5863508437783683902">"Kalendaryo"</string>
<string name="permgroupdesc_calendar" msgid="5777534316982184416">"Direktang access sa kalendaryo at mga kaganapan."</string>
- <!-- no translation found for permgrouplab_dictionary (4148597128843641379) -->
- <skip />
- <!-- no translation found for permgroupdesc_dictionary (7921166355964764490) -->
- <skip />
- <!-- no translation found for permgrouplab_writeDictionary (8090237702432576788) -->
- <skip />
- <!-- no translation found for permgroupdesc_writeDictionary (2711561994497361646) -->
- <skip />
+ <string name="permgrouplab_dictionary" msgid="4148597128843641379">"Basahin ang Disyunaryo ng User"</string>
+ <string name="permgroupdesc_dictionary" msgid="7921166355964764490">"Magbasa ng mga salita sa diksyunaryo ng user."</string>
+ <string name="permgrouplab_writeDictionary" msgid="8090237702432576788">"Magsulat sa Diksyunaryo ng User"</string>
+ <string name="permgroupdesc_writeDictionary" msgid="2711561994497361646">"Magdagdag ng mga salita sa diksyunaryo ng user."</string>
<string name="permgrouplab_bookmarks" msgid="1949519673103968229">"Mga Bookmark at Kasaysayan"</string>
<string name="permgroupdesc_bookmarks" msgid="4169771606257963028">"Direktang access sa mga bookmark at kasaysayan ng browser."</string>
<string name="permgrouplab_deviceAlarms" msgid="6117704629728824101">"Alarm"</string>
@@ -569,8 +561,7 @@
<string name="permdesc_sdcardRead" product="nosdcard" msgid="3530894470637667917">"Bigay-daan app basahin nilalaman ng USB storage, maaaring may mga larawan at media."</string>
<string name="permdesc_sdcardRead" product="default" msgid="2555811422562526606">"Binibigyang-daan aang app na basahin ang mga nilalaman ng SD card, na maaaring may mga larawan at media."</string>
<string name="permlab_sdcardWrite" product="nosdcard" msgid="8485979062254666748">"bago tanggal laman USB storage"</string>
- <!-- no translation found for permlab_sdcardWrite (8805693630050458763) -->
- <skip />
+ <string name="permlab_sdcardWrite" product="default" msgid="8805693630050458763">"baguhin o tanggalin ang mga nilalaman ng iyong SD card"</string>
<string name="permdesc_sdcardWrite" product="nosdcard" msgid="6175406299445710888">"Pinapayagan ang app na magsulat sa USB storage."</string>
<string name="permdesc_sdcardWrite" product="default" msgid="4337417790936632090">"Pinapayagan ang app na magsulat sa SD card."</string>
<string name="permlab_mediaStorageWrite" product="default" msgid="6859839199706879015">"baguhin/tanggalin ang mga nilalaman ng panloob na imbakan ng media"</string>
@@ -1090,8 +1081,7 @@
<string name="date_time_set" msgid="5777075614321087758">"Itakda"</string>
<string name="date_time_done" msgid="2507683751759308828">"Tapos na"</string>
<string name="perms_new_perm_prefix" msgid="8257740710754301407"><font size="12" fgcolor="#ff900000">"BAGO: "</font></string>
- <!-- no translation found for perms_description_app (5139836143293299417) -->
- <skip />
+ <string name="perms_description_app" msgid="5139836143293299417">"Ibinigay ng <xliff:g id="APP_NAME">%1$s</xliff:g>."</string>
<string name="no_permissions" msgid="7283357728219338112">"Walang mga kinakailangang pahintulot"</string>
<string name="usb_storage_activity_title" msgid="4465055157209648641">"USB mass storage"</string>
<string name="usb_storage_title" msgid="5901459041398751495">"Nakakonekta ang USB"</string>
@@ -1321,8 +1311,6 @@
<string name="sending" msgid="3245653681008218030">"Ipinapadala..."</string>
<string name="launchBrowserDefault" msgid="2057951947297614725">"Ilunsad ang Browser?"</string>
<string name="SetupCallDefault" msgid="5834948469253758575">"Tanggapin ang tawag?"</string>
- <!-- no translation found for activity_resolver_use_always (8017770747801494933) -->
- <skip />
- <!-- no translation found for activity_resolver_use_once (405646673463328329) -->
- <skip />
+ <string name="activity_resolver_use_always" msgid="8017770747801494933">"Palagi"</string>
+ <string name="activity_resolver_use_once" msgid="405646673463328329">"Isang Beses Lang"</string>
</resources>
diff --git a/core/res/res/values-uk/strings.xml b/core/res/res/values-uk/strings.xml
index 4a1a0bc..150f728 100644
--- a/core/res/res/values-uk/strings.xml
+++ b/core/res/res/values-uk/strings.xml
@@ -175,28 +175,20 @@
<string name="permgroupdesc_location" msgid="5704679763124170100">"Відстежувати ваше фізичне місцезнаходження."</string>
<string name="permgrouplab_network" msgid="5808983377727109831">"Підключення до мережі"</string>
<string name="permgroupdesc_network" msgid="4478299413241861987">"Отримувати доступ до різних функцій мережі."</string>
- <!-- no translation found for permgrouplab_bluetoothNetwork (1585403544162128109) -->
- <skip />
- <!-- no translation found for permgroupdesc_bluetoothNetwork (5625288577164282391) -->
- <skip />
- <!-- no translation found for permgrouplab_shortrangeNetwork (130808676377486118) -->
- <skip />
- <!-- no translation found for permgroupdesc_shortrangeNetwork (1884069062653436007) -->
- <skip />
+ <string name="permgrouplab_bluetoothNetwork" msgid="1585403544162128109">"Bluetooth"</string>
+ <string name="permgroupdesc_bluetoothNetwork" msgid="5625288577164282391">"Отримувати доступ до пристроїв і мереж через Bluetooth."</string>
+ <string name="permgrouplab_shortrangeNetwork" msgid="130808676377486118">"Мережі короткого діапазону"</string>
+ <string name="permgroupdesc_shortrangeNetwork" msgid="1884069062653436007">"Отримувати доступ до пристроїв через мережі короткого діапазону, як-от NFC."</string>
<string name="permgrouplab_audioSettings" msgid="8329261670151871235">"Налаштування звуку"</string>
<string name="permgroupdesc_audioSettings" msgid="2641515403347568130">"Зміна налаштувань звуку."</string>
<string name="permgrouplab_affectsBattery" msgid="6209246653424798033">"Заряд акумулятора"</string>
<string name="permgroupdesc_affectsBattery" msgid="6441275320638916947">"Використання функцій, які швидко зменшують заряд акумулятора."</string>
<string name="permgrouplab_calendar" msgid="5863508437783683902">"Календар"</string>
<string name="permgroupdesc_calendar" msgid="5777534316982184416">"Безпосередній доступ до календаря та подій."</string>
- <!-- no translation found for permgrouplab_dictionary (4148597128843641379) -->
- <skip />
- <!-- no translation found for permgroupdesc_dictionary (7921166355964764490) -->
- <skip />
- <!-- no translation found for permgrouplab_writeDictionary (8090237702432576788) -->
- <skip />
- <!-- no translation found for permgroupdesc_writeDictionary (2711561994497361646) -->
- <skip />
+ <string name="permgrouplab_dictionary" msgid="4148597128843641379">"Читати словник користувача"</string>
+ <string name="permgroupdesc_dictionary" msgid="7921166355964764490">"Читати слова в словнику користувача."</string>
+ <string name="permgrouplab_writeDictionary" msgid="8090237702432576788">"Писати в словник користувача"</string>
+ <string name="permgroupdesc_writeDictionary" msgid="2711561994497361646">"Додавати слова в словник користувача."</string>
<string name="permgrouplab_bookmarks" msgid="1949519673103968229">"Закладки й історія"</string>
<string name="permgroupdesc_bookmarks" msgid="4169771606257963028">"Безпосередній доступ до закладок та історії веб-переглядача."</string>
<string name="permgrouplab_deviceAlarms" msgid="6117704629728824101">"Сигнал"</string>
@@ -569,8 +561,7 @@
<string name="permdesc_sdcardRead" product="nosdcard" msgid="3530894470637667917">"Дозволяє програмі читати вміст носія USB, що може включати фотографії й медіа-файли."</string>
<string name="permdesc_sdcardRead" product="default" msgid="2555811422562526606">"Дозволяє програмі читати вміст карти SD, що може включати фотографії й медіа-файли."</string>
<string name="permlab_sdcardWrite" product="nosdcard" msgid="8485979062254666748">"змінювати чи видаляти вміст USB"</string>
- <!-- no translation found for permlab_sdcardWrite (8805693630050458763) -->
- <skip />
+ <string name="permlab_sdcardWrite" product="default" msgid="8805693630050458763">"змінювати чи видаляти вміст на карті SD"</string>
<string name="permdesc_sdcardWrite" product="nosdcard" msgid="6175406299445710888">"Дозволяє програмі писати на носій USB"</string>
<string name="permdesc_sdcardWrite" product="default" msgid="4337417790936632090">"Дозволяє програмі записувати на карту SD."</string>
<string name="permlab_mediaStorageWrite" product="default" msgid="6859839199706879015">"змінювати/видаляти вміст внутр. сховища даних"</string>
@@ -1090,8 +1081,7 @@
<string name="date_time_set" msgid="5777075614321087758">"Застосувати"</string>
<string name="date_time_done" msgid="2507683751759308828">"Готово"</string>
<string name="perms_new_perm_prefix" msgid="8257740710754301407"><font size="12" fgcolor="#ff900000">"НОВИЙ: "</font></string>
- <!-- no translation found for perms_description_app (5139836143293299417) -->
- <skip />
+ <string name="perms_description_app" msgid="5139836143293299417">"Надано <xliff:g id="APP_NAME">%1$s</xliff:g>."</string>
<string name="no_permissions" msgid="7283357728219338112">"Дозвіл не потрібний"</string>
<string name="usb_storage_activity_title" msgid="4465055157209648641">"USB великої ємності"</string>
<string name="usb_storage_title" msgid="5901459041398751495">"Підкл. через USB"</string>
@@ -1321,8 +1311,6 @@
<string name="sending" msgid="3245653681008218030">"Надсилання…"</string>
<string name="launchBrowserDefault" msgid="2057951947297614725">"Запустити веб-переглядач?"</string>
<string name="SetupCallDefault" msgid="5834948469253758575">"Прийняти виклик?"</string>
- <!-- no translation found for activity_resolver_use_always (8017770747801494933) -->
- <skip />
- <!-- no translation found for activity_resolver_use_once (405646673463328329) -->
- <skip />
+ <string name="activity_resolver_use_always" msgid="8017770747801494933">"Завжди"</string>
+ <string name="activity_resolver_use_once" msgid="405646673463328329">"Лише один раз"</string>
</resources>
diff --git a/core/res/res/values-zh-rCN/strings.xml b/core/res/res/values-zh-rCN/strings.xml
index 85f83f7..b2ba997 100644
--- a/core/res/res/values-zh-rCN/strings.xml
+++ b/core/res/res/values-zh-rCN/strings.xml
@@ -175,28 +175,20 @@
<string name="permgroupdesc_location" msgid="5704679763124170100">"监视您的实际位置。"</string>
<string name="permgrouplab_network" msgid="5808983377727109831">"网络通信"</string>
<string name="permgroupdesc_network" msgid="4478299413241861987">"使用各种网络功能。"</string>
- <!-- no translation found for permgrouplab_bluetoothNetwork (1585403544162128109) -->
- <skip />
- <!-- no translation found for permgroupdesc_bluetoothNetwork (5625288577164282391) -->
- <skip />
- <!-- no translation found for permgrouplab_shortrangeNetwork (130808676377486118) -->
- <skip />
- <!-- no translation found for permgroupdesc_shortrangeNetwork (1884069062653436007) -->
- <skip />
+ <string name="permgrouplab_bluetoothNetwork" msgid="1585403544162128109">"蓝牙"</string>
+ <string name="permgroupdesc_bluetoothNetwork" msgid="5625288577164282391">"通过蓝牙访问设备和网络。"</string>
+ <string name="permgrouplab_shortrangeNetwork" msgid="130808676377486118">"近距离网络"</string>
+ <string name="permgroupdesc_shortrangeNetwork" msgid="1884069062653436007">"通过 NFC 等近距离网络访问设备。"</string>
<string name="permgrouplab_audioSettings" msgid="8329261670151871235">"音频设置"</string>
<string name="permgroupdesc_audioSettings" msgid="2641515403347568130">"更改音频设置。"</string>
<string name="permgrouplab_affectsBattery" msgid="6209246653424798033">"影响电池的使用"</string>
<string name="permgroupdesc_affectsBattery" msgid="6441275320638916947">"使用耗电量较大的功能。"</string>
<string name="permgrouplab_calendar" msgid="5863508437783683902">"日历"</string>
<string name="permgroupdesc_calendar" msgid="5777534316982184416">"直接访问日历和活动。"</string>
- <!-- no translation found for permgrouplab_dictionary (4148597128843641379) -->
- <skip />
- <!-- no translation found for permgroupdesc_dictionary (7921166355964764490) -->
- <skip />
- <!-- no translation found for permgrouplab_writeDictionary (8090237702432576788) -->
- <skip />
- <!-- no translation found for permgroupdesc_writeDictionary (2711561994497361646) -->
- <skip />
+ <string name="permgrouplab_dictionary" msgid="4148597128843641379">"读取用户字典"</string>
+ <string name="permgroupdesc_dictionary" msgid="7921166355964764490">"读取用户字典中的字词。"</string>
+ <string name="permgrouplab_writeDictionary" msgid="8090237702432576788">"写入用户字典"</string>
+ <string name="permgroupdesc_writeDictionary" msgid="2711561994497361646">"将字词添加到用户字典。"</string>
<string name="permgrouplab_bookmarks" msgid="1949519673103968229">"书签和历史记录"</string>
<string name="permgroupdesc_bookmarks" msgid="4169771606257963028">"直接访问书签和浏览器历史记录。"</string>
<string name="permgrouplab_deviceAlarms" msgid="6117704629728824101">"闹钟"</string>
@@ -569,8 +561,7 @@
<string name="permdesc_sdcardRead" product="nosdcard" msgid="3530894470637667917">"允许该应用读取 USB 存储设备中的内容,其中可能包括照片和媒体。"</string>
<string name="permdesc_sdcardRead" product="default" msgid="2555811422562526606">"允许该应用读取 SD 卡中的内容,其中可能包括照片和媒体。"</string>
<string name="permlab_sdcardWrite" product="nosdcard" msgid="8485979062254666748">"修改或删除您的 USB 存储设备中的内容"</string>
- <!-- no translation found for permlab_sdcardWrite (8805693630050458763) -->
- <skip />
+ <string name="permlab_sdcardWrite" product="default" msgid="8805693630050458763">"修改或删除您的 SD 卡中的内容"</string>
<string name="permdesc_sdcardWrite" product="nosdcard" msgid="6175406299445710888">"允许应用写入 USB 存储设备。"</string>
<string name="permdesc_sdcardWrite" product="default" msgid="4337417790936632090">"允许应用写入 SD 卡。"</string>
<string name="permlab_mediaStorageWrite" product="default" msgid="6859839199706879015">"修改/删除内部媒体存储设备的内容"</string>
@@ -1090,8 +1081,7 @@
<string name="date_time_set" msgid="5777075614321087758">"设置"</string>
<string name="date_time_done" msgid="2507683751759308828">"完成"</string>
<string name="perms_new_perm_prefix" msgid="8257740710754301407"><font size="12" fgcolor="#ff900000">"新增:"</font></string>
- <!-- no translation found for perms_description_app (5139836143293299417) -->
- <skip />
+ <string name="perms_description_app" msgid="5139836143293299417">"由“<xliff:g id="APP_NAME">%1$s</xliff:g>”提供。"</string>
<string name="no_permissions" msgid="7283357728219338112">"不需要任何权限"</string>
<string name="usb_storage_activity_title" msgid="4465055157209648641">"USB 大容量存储设备"</string>
<string name="usb_storage_title" msgid="5901459041398751495">"USB 已连接"</string>
@@ -1321,8 +1311,6 @@
<string name="sending" msgid="3245653681008218030">"正在发送..."</string>
<string name="launchBrowserDefault" msgid="2057951947297614725">"要启动浏览器吗?"</string>
<string name="SetupCallDefault" msgid="5834948469253758575">"要接听电话吗?"</string>
- <!-- no translation found for activity_resolver_use_always (8017770747801494933) -->
- <skip />
- <!-- no translation found for activity_resolver_use_once (405646673463328329) -->
- <skip />
+ <string name="activity_resolver_use_always" msgid="8017770747801494933">"始终"</string>
+ <string name="activity_resolver_use_once" msgid="405646673463328329">"仅此一次"</string>
</resources>
diff --git a/core/res/res/values-zh-rTW/strings.xml b/core/res/res/values-zh-rTW/strings.xml
index 8d1a950..97fcbd6e 100644
--- a/core/res/res/values-zh-rTW/strings.xml
+++ b/core/res/res/values-zh-rTW/strings.xml
@@ -175,28 +175,20 @@
<string name="permgroupdesc_location" msgid="5704679763124170100">"監控您的實際位置。"</string>
<string name="permgrouplab_network" msgid="5808983377727109831">"網路通訊"</string>
<string name="permgroupdesc_network" msgid="4478299413241861987">"存取各種網路功能。"</string>
- <!-- no translation found for permgrouplab_bluetoothNetwork (1585403544162128109) -->
- <skip />
- <!-- no translation found for permgroupdesc_bluetoothNetwork (5625288577164282391) -->
- <skip />
- <!-- no translation found for permgrouplab_shortrangeNetwork (130808676377486118) -->
- <skip />
- <!-- no translation found for permgroupdesc_shortrangeNetwork (1884069062653436007) -->
- <skip />
+ <string name="permgrouplab_bluetoothNetwork" msgid="1585403544162128109">"藍牙"</string>
+ <string name="permgroupdesc_bluetoothNetwork" msgid="5625288577164282391">"透過藍牙存取裝置和網路。"</string>
+ <string name="permgrouplab_shortrangeNetwork" msgid="130808676377486118">"短距離網路"</string>
+ <string name="permgroupdesc_shortrangeNetwork" msgid="1884069062653436007">"透過短距離網路 (例如 NFC) 存取裝置。"</string>
<string name="permgrouplab_audioSettings" msgid="8329261670151871235">"音效設定"</string>
<string name="permgroupdesc_audioSettings" msgid="2641515403347568130">"變更音訊設定。"</string>
<string name="permgrouplab_affectsBattery" msgid="6209246653424798033">"影響電力"</string>
<string name="permgroupdesc_affectsBattery" msgid="6441275320638916947">"使用可能大量耗電的功能。"</string>
<string name="permgrouplab_calendar" msgid="5863508437783683902">"日曆"</string>
<string name="permgroupdesc_calendar" msgid="5777534316982184416">"直接存取日曆和活動。"</string>
- <!-- no translation found for permgrouplab_dictionary (4148597128843641379) -->
- <skip />
- <!-- no translation found for permgroupdesc_dictionary (7921166355964764490) -->
- <skip />
- <!-- no translation found for permgrouplab_writeDictionary (8090237702432576788) -->
- <skip />
- <!-- no translation found for permgroupdesc_writeDictionary (2711561994497361646) -->
- <skip />
+ <string name="permgrouplab_dictionary" msgid="4148597128843641379">"讀取使用者字典"</string>
+ <string name="permgroupdesc_dictionary" msgid="7921166355964764490">"讀取使用者字典中的字詞。"</string>
+ <string name="permgrouplab_writeDictionary" msgid="8090237702432576788">"寫入使用者字典"</string>
+ <string name="permgroupdesc_writeDictionary" msgid="2711561994497361646">"將字詞加入使用者字典。"</string>
<string name="permgrouplab_bookmarks" msgid="1949519673103968229">"書籤與紀錄"</string>
<string name="permgroupdesc_bookmarks" msgid="4169771606257963028">"直接存取書籤和瀏覽器紀錄。"</string>
<string name="permgrouplab_deviceAlarms" msgid="6117704629728824101">"鬧鐘"</string>
@@ -569,8 +561,7 @@
<string name="permdesc_sdcardRead" product="nosdcard" msgid="3530894470637667917">"允許應用程式讀取 USB 儲存裝置的內容 (可能含有相片和媒體)。"</string>
<string name="permdesc_sdcardRead" product="default" msgid="2555811422562526606">"允許應用程式讀取 SD 卡的內容 (可能含有相片和媒體)。"</string>
<string name="permlab_sdcardWrite" product="nosdcard" msgid="8485979062254666748">"修改或刪除 USB 儲存裝置的內容"</string>
- <!-- no translation found for permlab_sdcardWrite (8805693630050458763) -->
- <skip />
+ <string name="permlab_sdcardWrite" product="default" msgid="8805693630050458763">"修改或刪除 SD 卡的內容"</string>
<string name="permdesc_sdcardWrite" product="nosdcard" msgid="6175406299445710888">"允許應用程式寫入 USB 儲存裝置。"</string>
<string name="permdesc_sdcardWrite" product="default" msgid="4337417790936632090">"允許應用程式寫入 SD 卡。"</string>
<string name="permlab_mediaStorageWrite" product="default" msgid="6859839199706879015">"修改/刪除內部媒體儲存裝置內容"</string>
@@ -1090,8 +1081,7 @@
<string name="date_time_set" msgid="5777075614321087758">"設定"</string>
<string name="date_time_done" msgid="2507683751759308828">"完成"</string>
<string name="perms_new_perm_prefix" msgid="8257740710754301407"><font size="12" fgcolor="#ff900000">"新增:"</font></string>
- <!-- no translation found for perms_description_app (5139836143293299417) -->
- <skip />
+ <string name="perms_description_app" msgid="5139836143293299417">"由「<xliff:g id="APP_NAME">%1$s</xliff:g>」提供。"</string>
<string name="no_permissions" msgid="7283357728219338112">"無須許可"</string>
<string name="usb_storage_activity_title" msgid="4465055157209648641">"USB 大量儲存裝置"</string>
<string name="usb_storage_title" msgid="5901459041398751495">"USB 已連接"</string>
@@ -1321,8 +1311,6 @@
<string name="sending" msgid="3245653681008218030">"傳送中..."</string>
<string name="launchBrowserDefault" msgid="2057951947297614725">"啟動「瀏覽器」嗎?"</string>
<string name="SetupCallDefault" msgid="5834948469253758575">"接聽電話嗎?"</string>
- <!-- no translation found for activity_resolver_use_always (8017770747801494933) -->
- <skip />
- <!-- no translation found for activity_resolver_use_once (405646673463328329) -->
- <skip />
+ <string name="activity_resolver_use_always" msgid="8017770747801494933">"一律採用"</string>
+ <string name="activity_resolver_use_once" msgid="405646673463328329">"僅此一次"</string>
</resources>
diff --git a/core/res/res/values-zu/strings.xml b/core/res/res/values-zu/strings.xml
index 4edb7b2..dce0525 100644
--- a/core/res/res/values-zu/strings.xml
+++ b/core/res/res/values-zu/strings.xml
@@ -1311,7 +1311,6 @@
<string name="sending" msgid="3245653681008218030">"Iyathumela..."</string>
<string name="launchBrowserDefault" msgid="2057951947297614725">"Qala Isiphequluli?"</string>
<string name="SetupCallDefault" msgid="5834948469253758575">"Amukela ucingo?"</string>
- <!-- no translation found for activity_resolver_use_always (8017770747801494933) -->
- <skip />
+ <string name="activity_resolver_use_always" msgid="8017770747801494933">"Njalo"</string>
<string name="activity_resolver_use_once" msgid="405646673463328329">"Kanye nje"</string>
</resources>
diff --git a/core/res/res/values/arrays.xml b/core/res/res/values/arrays.xml
index d05a31c..1eeca59 100644
--- a/core/res/res/values/arrays.xml
+++ b/core/res/res/values/arrays.xml
@@ -400,4 +400,11 @@
<item>@null</item>
</array>
+ <array name="lockscreen_chevron_drawables">
+ <item>@drawable/ic_lockscreen_chevron_right</item>
+ <item>@null</item>
+ <item>@null</item>
+ <item>@null</item>
+ </array>
+
</resources>
diff --git a/core/res/res/values/attrs.xml b/core/res/res/values/attrs.xml
index ad1dff5..2f540a5 100755
--- a/core/res/res/values/attrs.xml
+++ b/core/res/res/values/attrs.xml
@@ -857,6 +857,9 @@
-->
<attr name="textSize" format="dimension" />
+ <!-- Default font family. -->
+ <attr name="fontFamily" format="string" />
+
<!-- Default text typeface. -->
<attr name="typeface">
<enum name="normal" value="0" />
@@ -2999,6 +3002,8 @@
<attr name="textStyle" />
<!-- Typeface (normal, sans, serif, monospace) for the text. -->
<attr name="typeface" />
+ <!-- Font family (named by string) for the text. -->
+ <attr name="fontFamily" />
<!-- Color of the text selection highlight. -->
<attr name="textColorHighlight" />
<!-- Color of the hint text. -->
@@ -3044,6 +3049,8 @@
<attr name="typeface" />
<!-- Style (bold, italic, bolditalic) for the text. -->
<attr name="textStyle" />
+ <!-- Font family (named by string) for the text. -->
+ <attr name="fontFamily" />
<!-- Text color for links. -->
<attr name="textColorLink" />
<!-- Makes the cursor visible (the default) or invisible. -->
@@ -3685,8 +3692,8 @@
<attr name="internalMaxWidth" format="dimension" />
<!-- @hide The layout of the number picker. -->
<attr name="internalLayout" />
- <!-- @hide The minimal move distance of a swipe to be considered a fling. -->
- <attr name="minFlingDistance" format="dimension" />
+ <!-- @hide The drawable for pressed virtual (increment/decrement) buttons. -->
+ <attr name="virtualButtonPressedDrawable" format="reference"/>
</declare-styleable>
<declare-styleable name="TimePicker">
@@ -5348,18 +5355,25 @@
<!-- Sets a drawable as the drag center. -->
<attr name="handleDrawable" format="reference" />
- <!-- Drawable to use for chevron animation on the left. May be null. -->
+ <!-- Drawable to use for chevron animation on the left. May be null.
+ @deprecated use chevronDrawables instead -->
<attr name="leftChevronDrawable" format="reference" />
- <!-- Drawable to use for chevron animation on the right. May be null. -->
+ <!-- Drawable to use for chevron animation on the right. May be null.
+ @deprecated use chevronDrawables instead -->
<attr name="rightChevronDrawable" format="reference" />
- <!-- Drawable to use for chevron animation on the top. May be null. -->
+ <!-- Drawable to use for chevron animation on the top. May be null.
+ @deprecated use chevronDrawables instead -->
<attr name="topChevronDrawable" format="reference" />
- <!-- Drawable to use for chevron animation on the bottom. May be null. -->
+ <!-- Drawable to use for chevron animation on the bottom. May be null.
+ @deprecated use chevronDrawables instead -->
<attr name="bottomChevronDrawable" format="reference" />
+ <!-- Drawables to use for chevron animations. May be null. -->
+ <attr name="chevronDrawables" format="reference"/>
+
<!-- Drawable to use for wave ripple animation. -->
<attr name="waveDrawable" format="reference" />
@@ -5620,6 +5634,6 @@
<!-- The display label of the keyboard layout. -->
<attr name="label" />
<!-- The key character map file resource. -->
- <attr name="kcm" format="reference" />
+ <attr name="keyboardLayout" format="reference" />
</declare-styleable>
</resources>
diff --git a/core/res/res/values/public.xml b/core/res/res/values/public.xml
index d899a1a..48038dd 100644
--- a/core/res/res/values/public.xml
+++ b/core/res/res/values/public.xml
@@ -980,6 +980,7 @@
<java-symbol type="drawable" name="jog_tab_target_gray" />
<java-symbol type="drawable" name="picture_emergency" />
<java-symbol type="drawable" name="platlogo" />
+ <java-symbol type="drawable" name="platlogo_alt" />
<java-symbol type="drawable" name="stat_notify_sync_error" />
<java-symbol type="drawable" name="stat_notify_wifi_in_range" />
<java-symbol type="drawable" name="stat_sys_gps_on" />
@@ -1008,6 +1009,7 @@
<java-symbol type="drawable" name="notification_bg_low" />
<java-symbol type="drawable" name="notification_template_icon_bg" />
<java-symbol type="drawable" name="notification_template_icon_low_bg" />
+ <java-symbol type="drawable" name="ic_lockscreen_unlock_phantom" />
<java-symbol type="layout" name="action_bar_home" />
<java-symbol type="layout" name="action_bar_title_item" />
@@ -3598,14 +3600,11 @@
<!-- ===============================================================
Resources added in version 16 of the platform (Jelly Bean)
=============================================================== -->
- <public type="attr" name="isolatedProcess" id="0x010103a7" />
-
- <public type="attr" name="kcm"/>
-
- <public type="attr" name="parentActivityName" />
-
- <public type="attr" name="importantForAccessibility"/>
-
- <public type="attr" name="permissionGroupFlags"/>
+ <public type="attr" name="parentActivityName" id="0x010103a7" />
+ <public type="attr" name="permissionGroupFlags" id="0x010103a8" />
+ <public type="attr" name="isolatedProcess" id="0x010103a9" />
+ <public type="attr" name="importantForAccessibility" id="0x010103aa" />
+ <public type="attr" name="keyboardLayout" id="0x010103ab" />
+ <public type="attr" name="fontFamily" id="0x010103ac" />
</resources>
diff --git a/core/res/res/values/styles.xml b/core/res/res/values/styles.xml
index 18ee2f8..2b34dab 100644
--- a/core/res/res/values/styles.xml
+++ b/core/res/res/values/styles.xml
@@ -1649,9 +1649,9 @@
<item name="android:selectionDivider">@android:drawable/numberpicker_selection_divider</item>
<item name="android:selectionDividerHeight">2dip</item>
<item name="android:selectionDividersDistance">48dip</item>
- <item name="android:internalMinWidth">48dip</item>
+ <item name="android:internalMinWidth">64dip</item>
<item name="android:internalMaxHeight">180dip</item>
- <item name="android:minFlingDistance">150dip</item>
+ <item name="virtualButtonPressedDrawable">?android:attr/selectableItemBackground</item>
</style>
<style name="Widget.Holo.TimePicker" parent="Widget.TimePicker">
diff --git a/core/tests/coretests/src/android/content/pm/LimitedLengthInputStreamTest.java b/core/tests/coretests/src/android/content/pm/LimitedLengthInputStreamTest.java
index 0a0152b..1f762fd 100644
--- a/core/tests/coretests/src/android/content/pm/LimitedLengthInputStreamTest.java
+++ b/core/tests/coretests/src/android/content/pm/LimitedLengthInputStreamTest.java
@@ -66,6 +66,17 @@
}
}
+ @MediumTest
+ public void testConstructor_OffsetLengthOverflow_Fail() throws Exception {
+ try {
+ InputStream is = new LimitedLengthInputStream(mTestStream1, Long.MAX_VALUE - 1,
+ Long.MAX_VALUE - 1);
+ fail("Should fail when offset + length is > Long.MAX_VALUE");
+ } catch (IOException e) {
+ // success
+ }
+ }
+
private void checkReadBytesWithOffsetAndLength_WithString1(int offset, int length)
throws Exception {
byte[] temp = new byte[TEST_STRING1.length];
@@ -182,5 +193,4 @@
public void testSingleByteRead_NonZeroOffset_FullLength_Success() throws Exception {
checkSingleByteRead_WithString1(3, TEST_STRING1.length - 3);
}
-
}
diff --git a/data/fonts/Android.mk b/data/fonts/Android.mk
index 16a98d3..ebd9a47 100644
--- a/data/fonts/Android.mk
+++ b/data/fonts/Android.mk
@@ -144,6 +144,10 @@
Roboto-BoldItalic.ttf \
Roboto-Light.ttf \
Roboto-LightItalic.ttf \
+ RobotoCondensed-Regular.ttf \
+ RobotoCondensed-Bold.ttf \
+ RobotoCondensed-Italic.ttf \
+ RobotoCondensed-BoldItalic.ttf \
DroidNaskh-Regular.ttf \
DroidNaskh-Regular-SystemUI.ttf \
DroidSansDevanagari-Regular.ttf \
diff --git a/data/fonts/DroidNaskh-Regular-SystemUI.ttf b/data/fonts/DroidNaskh-Regular-SystemUI.ttf
old mode 100755
new mode 100644
index 5818b49..2f495cf
--- a/data/fonts/DroidNaskh-Regular-SystemUI.ttf
+++ b/data/fonts/DroidNaskh-Regular-SystemUI.ttf
Binary files differ
diff --git a/data/fonts/Roboto-BoldCondensed.ttf b/data/fonts/Roboto-BoldCondensed.ttf
deleted file mode 100755
index 61da020..0000000
--- a/data/fonts/Roboto-BoldCondensed.ttf
+++ /dev/null
Binary files differ
diff --git a/data/fonts/Roboto-BoldCondensedItalic.ttf b/data/fonts/Roboto-BoldCondensedItalic.ttf
deleted file mode 100755
index b946dce..0000000
--- a/data/fonts/Roboto-BoldCondensedItalic.ttf
+++ /dev/null
Binary files differ
diff --git a/data/fonts/Roboto-Condensed.ttf b/data/fonts/Roboto-Condensed.ttf
deleted file mode 100755
index 73a868f..0000000
--- a/data/fonts/Roboto-Condensed.ttf
+++ /dev/null
Binary files differ
diff --git a/data/fonts/Roboto-CondensedItalic.ttf b/data/fonts/Roboto-CondensedItalic.ttf
deleted file mode 100755
index a0969bb..0000000
--- a/data/fonts/Roboto-CondensedItalic.ttf
+++ /dev/null
Binary files differ
diff --git a/data/fonts/Roboto-Light.ttf b/data/fonts/Roboto-Light.ttf
index b50399e..e296c60 100644
--- a/data/fonts/Roboto-Light.ttf
+++ b/data/fonts/Roboto-Light.ttf
Binary files differ
diff --git a/data/fonts/Roboto-LightItalic.ttf b/data/fonts/Roboto-LightItalic.ttf
index a1fdc8d..3e6901d 100644
--- a/data/fonts/Roboto-LightItalic.ttf
+++ b/data/fonts/Roboto-LightItalic.ttf
Binary files differ
diff --git a/data/fonts/RobotoCondensed-Bold.ttf b/data/fonts/RobotoCondensed-Bold.ttf
new file mode 100644
index 0000000..21c10f5
--- /dev/null
+++ b/data/fonts/RobotoCondensed-Bold.ttf
Binary files differ
diff --git a/data/fonts/RobotoCondensed-BoldItalic.ttf b/data/fonts/RobotoCondensed-BoldItalic.ttf
new file mode 100644
index 0000000..d8edd2d
--- /dev/null
+++ b/data/fonts/RobotoCondensed-BoldItalic.ttf
Binary files differ
diff --git a/data/fonts/RobotoCondensed-Italic.ttf b/data/fonts/RobotoCondensed-Italic.ttf
new file mode 100644
index 0000000..4dec2cf
--- /dev/null
+++ b/data/fonts/RobotoCondensed-Italic.ttf
Binary files differ
diff --git a/data/fonts/RobotoCondensed-Regular.ttf b/data/fonts/RobotoCondensed-Regular.ttf
new file mode 100644
index 0000000..875ea1a
--- /dev/null
+++ b/data/fonts/RobotoCondensed-Regular.ttf
Binary files differ
diff --git a/data/fonts/fallback_fonts-ja.xml b/data/fonts/fallback_fonts-ja.xml
index be53d1d..5f9b5ed 100644
--- a/data/fonts/fallback_fonts-ja.xml
+++ b/data/fonts/fallback_fonts-ja.xml
@@ -70,13 +70,28 @@
</family>
<family>
<fileset>
+ <file>DroidSansTamil-Regular.ttf</file>
+ <file>DroidSansTamil-Bold.ttf</file>
+ </fileset>
+ </family>
+ <family>
+ <fileset>
+ <file>AnjaliNewLipi-light.ttf</file>
+ </fileset>
+ </family>
+ <family>
+ <fileset>
<file>Lohit-Bengali.ttf</file>
</fileset>
</family>
<family>
<fileset>
- <file>DroidSansTamil-Regular.ttf</file>
- <file>DroidSansTamil-Bold.ttf</file>
+ <file>Lohit-Kannada.ttf</file>
+ </fileset>
+ </family>
+ <family>
+ <fileset>
+ <file>Lohit-Telugu.ttf</file>
</fileset>
</family>
<family>
diff --git a/data/fonts/fallback_fonts.xml b/data/fonts/fallback_fonts.xml
index 80fffa9..8517152 100644
--- a/data/fonts/fallback_fonts.xml
+++ b/data/fonts/fallback_fonts.xml
@@ -70,13 +70,27 @@
</family>
<family>
<fileset>
+ <file>DroidSansTamil-Regular.ttf</file>
+ <file>DroidSansTamil-Bold.ttf</file>
+ </family>
+ <family>
+ <fileset>
+ <file>AnjaliNewLipi-light.ttf</file>
+ </fileset>
+ </family>
+ <family>
+ <fileset>
<file>Lohit-Bengali.ttf</file>
</fileset>
</family>
<family>
<fileset>
- <file>DroidSansTamil-Regular.ttf</file>
- <file>DroidSansTamil-Bold.ttf</file>
+ <file>Lohit-Kannada.ttf</file>
+ </fileset>
+ </family>
+ <family>
+ <fileset>
+ <file>Lohit-Telugu.ttf</file>
</fileset>
</family>
<family>
diff --git a/data/fonts/fonts.mk b/data/fonts/fonts.mk
index 397ccda..97233d7 100644
--- a/data/fonts/fonts.mk
+++ b/data/fonts/fonts.mk
@@ -26,6 +26,10 @@
Roboto-BoldItalic.ttf \
Roboto-Light.ttf \
Roboto-LightItalic.ttf \
+ RobotoCondensed-Regular.ttf \
+ RobotoCondensed-Bold.ttf \
+ RobotoCondensed-Italic.ttf \
+ RobotoCondensed-BoldItalic.ttf \
DroidNaskh-Regular.ttf \
DroidNaskh-Regular-SystemUI.ttf \
DroidSansDevanagari-Regular.ttf \
diff --git a/data/fonts/system_fonts.xml b/data/fonts/system_fonts.xml
index 95c4f70..5a10523 100644
--- a/data/fonts/system_fonts.xml
+++ b/data/fonts/system_fonts.xml
@@ -46,6 +46,17 @@
<family>
<nameset>
+ <name>sans-serif-condensed</name>
+ </nameset>
+ <fileset>
+ <file>RobotoCondensed-Regular.ttf</file>
+ <file>RobotoCondensed-Bold.ttf</file>
+ <file>RobotoCondensed-Italic.ttf</file>
+ <file>RobotoCondensed-BoldItalic.ttf</file>
+ </fileset>
+ </family>
+ <family>
+ <nameset>
<name>serif</name>
<name>times</name>
<name>times new roman</name>
diff --git a/graphics/java/android/graphics/Rect.java b/graphics/java/android/graphics/Rect.java
index ec911b0..6c204ab 100644
--- a/graphics/java/android/graphics/Rect.java
+++ b/graphics/java/android/graphics/Rect.java
@@ -49,9 +49,9 @@
* checking is performed, so the caller must ensure that left <= right and
* top <= bottom.
*
- * @param left The X coordinate of the left side of the rectagle
+ * @param left The X coordinate of the left side of the rectangle
* @param top The Y coordinate of the top of the rectangle
- * @param right The X coordinate of the right side of the rectagle
+ * @param right The X coordinate of the right side of the rectangle
* @param bottom The Y coordinate of the bottom of the rectangle
*/
public Rect(int left, int top, int right, int bottom) {
@@ -235,9 +235,9 @@
* checking is performed, so it is up to the caller to ensure that
* left <= right and top <= bottom.
*
- * @param left The X coordinate of the left side of the rectagle
+ * @param left The X coordinate of the left side of the rectangle
* @param top The Y coordinate of the top of the rectangle
- * @param right The X coordinate of the right side of the rectagle
+ * @param right The X coordinate of the right side of the rectangle
* @param bottom The Y coordinate of the bottom of the rectangle
*/
public void set(int left, int top, int right, int bottom) {
diff --git a/graphics/java/android/graphics/RectF.java b/graphics/java/android/graphics/RectF.java
index c633d84..108b7f9 100644
--- a/graphics/java/android/graphics/RectF.java
+++ b/graphics/java/android/graphics/RectF.java
@@ -46,9 +46,9 @@
* checking is performed, so the caller must ensure that left <= right and
* top <= bottom.
*
- * @param left The X coordinate of the left side of the rectagle
+ * @param left The X coordinate of the left side of the rectangle
* @param top The Y coordinate of the top of the rectangle
- * @param right The X coordinate of the right side of the rectagle
+ * @param right The X coordinate of the right side of the rectangle
* @param bottom The Y coordinate of the bottom of the rectangle
*/
public RectF(float left, float top, float right, float bottom) {
@@ -182,9 +182,9 @@
* checking is performed, so it is up to the caller to ensure that
* left <= right and top <= bottom.
*
- * @param left The X coordinate of the left side of the rectagle
+ * @param left The X coordinate of the left side of the rectangle
* @param top The Y coordinate of the top of the rectangle
- * @param right The X coordinate of the right side of the rectagle
+ * @param right The X coordinate of the right side of the rectangle
* @param bottom The Y coordinate of the bottom of the rectangle
*/
public void set(float left, float top, float right, float bottom) {
diff --git a/include/androidfw/Input.h b/include/androidfw/Input.h
index 6d03fd6..aa8b824 100644
--- a/include/androidfw/Input.h
+++ b/include/androidfw/Input.h
@@ -27,7 +27,6 @@
#include <utils/Timers.h>
#include <utils/RefBase.h>
#include <utils/String8.h>
-#include <utils/BitSet.h>
#ifdef HAVE_ANDROID_OS
class SkMatrix;
@@ -607,182 +606,6 @@
Vector<MotionEvent*> mMotionEventPool;
};
-/*
- * Calculates the velocity of pointer movements over time.
- */
-class VelocityTracker {
-public:
- // Default polynomial degree. (used by getVelocity)
- static const uint32_t DEFAULT_DEGREE = 2;
-
- // Default sample horizon. (used by getVelocity)
- // We don't use too much history by default since we want to react to quick
- // changes in direction.
- static const nsecs_t DEFAULT_HORIZON = 100 * 1000000; // 100 ms
-
- struct Position {
- float x, y;
- };
-
- struct Estimator {
- static const size_t MAX_DEGREE = 2;
-
- // Polynomial coefficients describing motion in X and Y.
- float xCoeff[MAX_DEGREE + 1], yCoeff[MAX_DEGREE + 1];
-
- // Polynomial degree (number of coefficients), or zero if no information is
- // available.
- uint32_t degree;
-
- // Confidence (coefficient of determination), between 0 (no fit) and 1 (perfect fit).
- float confidence;
-
- inline void clear() {
- degree = 0;
- confidence = 0;
- for (size_t i = 0; i <= MAX_DEGREE; i++) {
- xCoeff[i] = 0;
- yCoeff[i] = 0;
- }
- }
- };
-
- VelocityTracker();
-
- // Resets the velocity tracker state.
- void clear();
-
- // Resets the velocity tracker state for specific pointers.
- // Call this method when some pointers have changed and may be reusing
- // an id that was assigned to a different pointer earlier.
- void clearPointers(BitSet32 idBits);
-
- // Adds movement information for a set of pointers.
- // The idBits bitfield specifies the pointer ids of the pointers whose positions
- // are included in the movement.
- // The positions array contains position information for each pointer in order by
- // increasing id. Its size should be equal to the number of one bits in idBits.
- void addMovement(nsecs_t eventTime, BitSet32 idBits, const Position* positions);
-
- // Adds movement information for all pointers in a MotionEvent, including historical samples.
- void addMovement(const MotionEvent* event);
-
- // Gets the velocity of the specified pointer id in position units per second.
- // Returns false and sets the velocity components to zero if there is
- // insufficient movement information for the pointer.
- bool getVelocity(uint32_t id, float* outVx, float* outVy) const;
-
- // Gets a quadratic estimator for the movements of the specified pointer id.
- // Returns false and clears the estimator if there is no information available
- // about the pointer.
- bool getEstimator(uint32_t id, uint32_t degree, nsecs_t horizon,
- Estimator* outEstimator) const;
-
- // Gets the active pointer id, or -1 if none.
- inline int32_t getActivePointerId() const { return mActivePointerId; }
-
- // Gets a bitset containing all pointer ids from the most recent movement.
- inline BitSet32 getCurrentPointerIdBits() const { return mMovements[mIndex].idBits; }
-
-private:
- // Number of samples to keep.
- static const uint32_t HISTORY_SIZE = 20;
-
- struct Movement {
- nsecs_t eventTime;
- BitSet32 idBits;
- Position positions[MAX_POINTERS];
-
- inline const Position& getPosition(uint32_t id) const {
- return positions[idBits.getIndexOfBit(id)];
- }
- };
-
- uint32_t mIndex;
- Movement mMovements[HISTORY_SIZE];
- int32_t mActivePointerId;
-};
-
-
-/*
- * Specifies parameters that govern pointer or wheel acceleration.
- */
-struct VelocityControlParameters {
- // A scale factor that is multiplied with the raw velocity deltas
- // prior to applying any other velocity control factors. The scale
- // factor should be used to adapt the input device resolution
- // (eg. counts per inch) to the output device resolution (eg. pixels per inch).
- //
- // Must be a positive value.
- // Default is 1.0 (no scaling).
- float scale;
-
- // The scaled speed at which acceleration begins to be applied.
- // This value establishes the upper bound of a low speed regime for
- // small precise motions that are performed without any acceleration.
- //
- // Must be a non-negative value.
- // Default is 0.0 (no low threshold).
- float lowThreshold;
-
- // The scaled speed at which maximum acceleration is applied.
- // The difference between highThreshold and lowThreshold controls
- // the range of speeds over which the acceleration factor is interpolated.
- // The wider the range, the smoother the acceleration.
- //
- // Must be a non-negative value greater than or equal to lowThreshold.
- // Default is 0.0 (no high threshold).
- float highThreshold;
-
- // The acceleration factor.
- // When the speed is above the low speed threshold, the velocity will scaled
- // by an interpolated value between 1.0 and this amount.
- //
- // Must be a positive greater than or equal to 1.0.
- // Default is 1.0 (no acceleration).
- float acceleration;
-
- VelocityControlParameters() :
- scale(1.0f), lowThreshold(0.0f), highThreshold(0.0f), acceleration(1.0f) {
- }
-
- VelocityControlParameters(float scale, float lowThreshold,
- float highThreshold, float acceleration) :
- scale(scale), lowThreshold(lowThreshold),
- highThreshold(highThreshold), acceleration(acceleration) {
- }
-};
-
-/*
- * Implements mouse pointer and wheel speed control and acceleration.
- */
-class VelocityControl {
-public:
- VelocityControl();
-
- /* Sets the various parameters. */
- void setParameters(const VelocityControlParameters& parameters);
-
- /* Resets the current movement counters to zero.
- * This has the effect of nullifying any acceleration. */
- void reset();
-
- /* Translates a raw movement delta into an appropriately
- * scaled / accelerated delta based on the current velocity. */
- void move(nsecs_t eventTime, float* deltaX, float* deltaY);
-
-private:
- // If no movements are received within this amount of time,
- // we assume the movement has stopped and reset the movement counters.
- static const nsecs_t STOP_TIME = 500 * 1000000; // 500 ms
-
- VelocityControlParameters mParameters;
-
- nsecs_t mLastMovementTime;
- VelocityTracker::Position mRawPosition;
- VelocityTracker mVelocityTracker;
-};
-
} // namespace android
#endif // _ANDROIDFW_INPUT_H
diff --git a/include/androidfw/VelocityControl.h b/include/androidfw/VelocityControl.h
new file mode 100644
index 0000000..84e0444
--- /dev/null
+++ b/include/androidfw/VelocityControl.h
@@ -0,0 +1,107 @@
+/*
+ * Copyright (C) 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.
+ */
+
+#ifndef _ANDROIDFW_VELOCITY_CONTROL_H
+#define _ANDROIDFW_VELOCITY_CONTROL_H
+
+#include <androidfw/Input.h>
+#include <androidfw/VelocityTracker.h>
+#include <utils/Timers.h>
+
+namespace android {
+
+/*
+ * Specifies parameters that govern pointer or wheel acceleration.
+ */
+struct VelocityControlParameters {
+ // A scale factor that is multiplied with the raw velocity deltas
+ // prior to applying any other velocity control factors. The scale
+ // factor should be used to adapt the input device resolution
+ // (eg. counts per inch) to the output device resolution (eg. pixels per inch).
+ //
+ // Must be a positive value.
+ // Default is 1.0 (no scaling).
+ float scale;
+
+ // The scaled speed at which acceleration begins to be applied.
+ // This value establishes the upper bound of a low speed regime for
+ // small precise motions that are performed without any acceleration.
+ //
+ // Must be a non-negative value.
+ // Default is 0.0 (no low threshold).
+ float lowThreshold;
+
+ // The scaled speed at which maximum acceleration is applied.
+ // The difference between highThreshold and lowThreshold controls
+ // the range of speeds over which the acceleration factor is interpolated.
+ // The wider the range, the smoother the acceleration.
+ //
+ // Must be a non-negative value greater than or equal to lowThreshold.
+ // Default is 0.0 (no high threshold).
+ float highThreshold;
+
+ // The acceleration factor.
+ // When the speed is above the low speed threshold, the velocity will scaled
+ // by an interpolated value between 1.0 and this amount.
+ //
+ // Must be a positive greater than or equal to 1.0.
+ // Default is 1.0 (no acceleration).
+ float acceleration;
+
+ VelocityControlParameters() :
+ scale(1.0f), lowThreshold(0.0f), highThreshold(0.0f), acceleration(1.0f) {
+ }
+
+ VelocityControlParameters(float scale, float lowThreshold,
+ float highThreshold, float acceleration) :
+ scale(scale), lowThreshold(lowThreshold),
+ highThreshold(highThreshold), acceleration(acceleration) {
+ }
+};
+
+/*
+ * Implements mouse pointer and wheel speed control and acceleration.
+ */
+class VelocityControl {
+public:
+ VelocityControl();
+
+ /* Sets the various parameters. */
+ void setParameters(const VelocityControlParameters& parameters);
+
+ /* Resets the current movement counters to zero.
+ * This has the effect of nullifying any acceleration. */
+ void reset();
+
+ /* Translates a raw movement delta into an appropriately
+ * scaled / accelerated delta based on the current velocity. */
+ void move(nsecs_t eventTime, float* deltaX, float* deltaY);
+
+private:
+ // If no movements are received within this amount of time,
+ // we assume the movement has stopped and reset the movement counters.
+ static const nsecs_t STOP_TIME = 500 * 1000000; // 500 ms
+
+ VelocityControlParameters mParameters;
+
+ nsecs_t mLastMovementTime;
+ VelocityTracker::Position mRawPosition;
+ VelocityTracker mVelocityTracker;
+};
+
+} // namespace android
+
+#endif // _ANDROIDFW_VELOCITY_CONTROL_H
diff --git a/include/androidfw/VelocityTracker.h b/include/androidfw/VelocityTracker.h
new file mode 100644
index 0000000..6d17e1f
--- /dev/null
+++ b/include/androidfw/VelocityTracker.h
@@ -0,0 +1,124 @@
+/*
+ * Copyright (C) 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.
+ */
+
+#ifndef _ANDROIDFW_VELOCITY_TRACKER_H
+#define _ANDROIDFW_VELOCITY_TRACKER_H
+
+#include <androidfw/Input.h>
+#include <utils/Timers.h>
+#include <utils/BitSet.h>
+
+namespace android {
+
+/*
+ * Calculates the velocity of pointer movements over time.
+ */
+class VelocityTracker {
+public:
+ // Default polynomial degree. (used by getVelocity)
+ static const uint32_t DEFAULT_DEGREE = 2;
+
+ // Default sample horizon. (used by getVelocity)
+ // We don't use too much history by default since we want to react to quick
+ // changes in direction.
+ static const nsecs_t DEFAULT_HORIZON = 100 * 1000000; // 100 ms
+
+ struct Position {
+ float x, y;
+ };
+
+ struct Estimator {
+ static const size_t MAX_DEGREE = 2;
+
+ // Polynomial coefficients describing motion in X and Y.
+ float xCoeff[MAX_DEGREE + 1], yCoeff[MAX_DEGREE + 1];
+
+ // Polynomial degree (number of coefficients), or zero if no information is
+ // available.
+ uint32_t degree;
+
+ // Confidence (coefficient of determination), between 0 (no fit) and 1 (perfect fit).
+ float confidence;
+
+ inline void clear() {
+ degree = 0;
+ confidence = 0;
+ for (size_t i = 0; i <= MAX_DEGREE; i++) {
+ xCoeff[i] = 0;
+ yCoeff[i] = 0;
+ }
+ }
+ };
+
+ VelocityTracker();
+
+ // Resets the velocity tracker state.
+ void clear();
+
+ // Resets the velocity tracker state for specific pointers.
+ // Call this method when some pointers have changed and may be reusing
+ // an id that was assigned to a different pointer earlier.
+ void clearPointers(BitSet32 idBits);
+
+ // Adds movement information for a set of pointers.
+ // The idBits bitfield specifies the pointer ids of the pointers whose positions
+ // are included in the movement.
+ // The positions array contains position information for each pointer in order by
+ // increasing id. Its size should be equal to the number of one bits in idBits.
+ void addMovement(nsecs_t eventTime, BitSet32 idBits, const Position* positions);
+
+ // Adds movement information for all pointers in a MotionEvent, including historical samples.
+ void addMovement(const MotionEvent* event);
+
+ // Gets the velocity of the specified pointer id in position units per second.
+ // Returns false and sets the velocity components to zero if there is
+ // insufficient movement information for the pointer.
+ bool getVelocity(uint32_t id, float* outVx, float* outVy) const;
+
+ // Gets a quadratic estimator for the movements of the specified pointer id.
+ // Returns false and clears the estimator if there is no information available
+ // about the pointer.
+ bool getEstimator(uint32_t id, uint32_t degree, nsecs_t horizon,
+ Estimator* outEstimator) const;
+
+ // Gets the active pointer id, or -1 if none.
+ inline int32_t getActivePointerId() const { return mActivePointerId; }
+
+ // Gets a bitset containing all pointer ids from the most recent movement.
+ inline BitSet32 getCurrentPointerIdBits() const { return mMovements[mIndex].idBits; }
+
+private:
+ // Number of samples to keep.
+ static const uint32_t HISTORY_SIZE = 20;
+
+ struct Movement {
+ nsecs_t eventTime;
+ BitSet32 idBits;
+ Position positions[MAX_POINTERS];
+
+ inline const Position& getPosition(uint32_t id) const {
+ return positions[idBits.getIndexOfBit(id)];
+ }
+ };
+
+ uint32_t mIndex;
+ Movement mMovements[HISTORY_SIZE];
+ int32_t mActivePointerId;
+};
+
+} // namespace android
+
+#endif // _ANDROIDFW_VELOCITY_TRACKER_H
diff --git a/libs/androidfw/Android.mk b/libs/androidfw/Android.mk
index 95c77d4..3ed75a2 100644
--- a/libs/androidfw/Android.mk
+++ b/libs/androidfw/Android.mk
@@ -33,6 +33,8 @@
Keyboard.cpp \
KeyCharacterMap.cpp \
KeyLayoutMap.cpp \
+ VelocityControl.cpp \
+ VelocityTracker.cpp \
VirtualKeyMap.cpp
commonSources:= \
diff --git a/libs/androidfw/Input.cpp b/libs/androidfw/Input.cpp
index fbe1926..40a6c47 100644
--- a/libs/androidfw/Input.cpp
+++ b/libs/androidfw/Input.cpp
@@ -15,31 +15,13 @@
*/
#define LOG_TAG "Input"
-
//#define LOG_NDEBUG 0
-// Log debug messages about keymap probing.
-#define DEBUG_PROBE 0
-
-// Log debug messages about velocity tracking.
-#define DEBUG_VELOCITY 0
-
-// Log debug messages about least squares fitting.
-#define DEBUG_LEAST_SQUARES 0
-
-// Log debug messages about acceleration.
-#define DEBUG_ACCELERATION 0
-
-
-#include <stdlib.h>
-#include <unistd.h>
-#include <ctype.h>
-
-#include <androidfw/Input.h>
-
#include <math.h>
#include <limits.h>
+#include <androidfw/Input.h>
+
#ifdef HAVE_ANDROID_OS
#include <binder/Parcel.h>
@@ -665,492 +647,4 @@
delete event;
}
-
-// --- VelocityTracker ---
-
-const uint32_t VelocityTracker::DEFAULT_DEGREE;
-const nsecs_t VelocityTracker::DEFAULT_HORIZON;
-const uint32_t VelocityTracker::HISTORY_SIZE;
-
-static inline float vectorDot(const float* a, const float* b, uint32_t m) {
- float r = 0;
- while (m--) {
- r += *(a++) * *(b++);
- }
- return r;
-}
-
-static inline float vectorNorm(const float* a, uint32_t m) {
- float r = 0;
- while (m--) {
- float t = *(a++);
- r += t * t;
- }
- return sqrtf(r);
-}
-
-#if DEBUG_LEAST_SQUARES || DEBUG_VELOCITY
-static String8 vectorToString(const float* a, uint32_t m) {
- String8 str;
- str.append("[");
- while (m--) {
- str.appendFormat(" %f", *(a++));
- if (m) {
- str.append(",");
- }
- }
- str.append(" ]");
- return str;
-}
-
-static String8 matrixToString(const float* a, uint32_t m, uint32_t n, bool rowMajor) {
- String8 str;
- str.append("[");
- for (size_t i = 0; i < m; i++) {
- if (i) {
- str.append(",");
- }
- str.append(" [");
- for (size_t j = 0; j < n; j++) {
- if (j) {
- str.append(",");
- }
- str.appendFormat(" %f", a[rowMajor ? i * n + j : j * m + i]);
- }
- str.append(" ]");
- }
- str.append(" ]");
- return str;
-}
-#endif
-
-VelocityTracker::VelocityTracker() {
- clear();
-}
-
-void VelocityTracker::clear() {
- mIndex = 0;
- mMovements[0].idBits.clear();
- mActivePointerId = -1;
-}
-
-void VelocityTracker::clearPointers(BitSet32 idBits) {
- BitSet32 remainingIdBits(mMovements[mIndex].idBits.value & ~idBits.value);
- mMovements[mIndex].idBits = remainingIdBits;
-
- if (mActivePointerId >= 0 && idBits.hasBit(mActivePointerId)) {
- mActivePointerId = !remainingIdBits.isEmpty() ? remainingIdBits.firstMarkedBit() : -1;
- }
-}
-
-void VelocityTracker::addMovement(nsecs_t eventTime, BitSet32 idBits, const Position* positions) {
- if (++mIndex == HISTORY_SIZE) {
- mIndex = 0;
- }
-
- while (idBits.count() > MAX_POINTERS) {
- idBits.clearLastMarkedBit();
- }
-
- Movement& movement = mMovements[mIndex];
- movement.eventTime = eventTime;
- movement.idBits = idBits;
- uint32_t count = idBits.count();
- for (uint32_t i = 0; i < count; i++) {
- movement.positions[i] = positions[i];
- }
-
- if (mActivePointerId < 0 || !idBits.hasBit(mActivePointerId)) {
- mActivePointerId = count != 0 ? idBits.firstMarkedBit() : -1;
- }
-
-#if DEBUG_VELOCITY
- ALOGD("VelocityTracker: addMovement eventTime=%lld, idBits=0x%08x, activePointerId=%d",
- eventTime, idBits.value, mActivePointerId);
- for (BitSet32 iterBits(idBits); !iterBits.isEmpty(); ) {
- uint32_t id = iterBits.firstMarkedBit();
- uint32_t index = idBits.getIndexOfBit(id);
- iterBits.clearBit(id);
- Estimator estimator;
- getEstimator(id, DEFAULT_DEGREE, DEFAULT_HORIZON, &estimator);
- ALOGD(" %d: position (%0.3f, %0.3f), "
- "estimator (degree=%d, xCoeff=%s, yCoeff=%s, confidence=%f)",
- id, positions[index].x, positions[index].y,
- int(estimator.degree),
- vectorToString(estimator.xCoeff, estimator.degree).string(),
- vectorToString(estimator.yCoeff, estimator.degree).string(),
- estimator.confidence);
- }
-#endif
-}
-
-void VelocityTracker::addMovement(const MotionEvent* event) {
- int32_t actionMasked = event->getActionMasked();
-
- switch (actionMasked) {
- case AMOTION_EVENT_ACTION_DOWN:
- case AMOTION_EVENT_ACTION_HOVER_ENTER:
- // Clear all pointers on down before adding the new movement.
- clear();
- break;
- case AMOTION_EVENT_ACTION_POINTER_DOWN: {
- // Start a new movement trace for a pointer that just went down.
- // We do this on down instead of on up because the client may want to query the
- // final velocity for a pointer that just went up.
- BitSet32 downIdBits;
- downIdBits.markBit(event->getPointerId(event->getActionIndex()));
- clearPointers(downIdBits);
- break;
- }
- case AMOTION_EVENT_ACTION_MOVE:
- case AMOTION_EVENT_ACTION_HOVER_MOVE:
- break;
- default:
- // Ignore all other actions because they do not convey any new information about
- // pointer movement. We also want to preserve the last known velocity of the pointers.
- // Note that ACTION_UP and ACTION_POINTER_UP always report the last known position
- // of the pointers that went up. ACTION_POINTER_UP does include the new position of
- // pointers that remained down but we will also receive an ACTION_MOVE with this
- // information if any of them actually moved. Since we don't know how many pointers
- // will be going up at once it makes sense to just wait for the following ACTION_MOVE
- // before adding the movement.
- return;
- }
-
- size_t pointerCount = event->getPointerCount();
- if (pointerCount > MAX_POINTERS) {
- pointerCount = MAX_POINTERS;
- }
-
- BitSet32 idBits;
- for (size_t i = 0; i < pointerCount; i++) {
- idBits.markBit(event->getPointerId(i));
- }
-
- nsecs_t eventTime;
- Position positions[pointerCount];
-
- size_t historySize = event->getHistorySize();
- for (size_t h = 0; h < historySize; h++) {
- eventTime = event->getHistoricalEventTime(h);
- for (size_t i = 0; i < pointerCount; i++) {
- positions[i].x = event->getHistoricalX(i, h);
- positions[i].y = event->getHistoricalY(i, h);
- }
- addMovement(eventTime, idBits, positions);
- }
-
- eventTime = event->getEventTime();
- for (size_t i = 0; i < pointerCount; i++) {
- positions[i].x = event->getX(i);
- positions[i].y = event->getY(i);
- }
- addMovement(eventTime, idBits, positions);
-}
-
-/**
- * Solves a linear least squares problem to obtain a N degree polynomial that fits
- * the specified input data as nearly as possible.
- *
- * Returns true if a solution is found, false otherwise.
- *
- * The input consists of two vectors of data points X and Y with indices 0..m-1.
- * The output is a vector B with indices 0..n-1 that describes a polynomial
- * that fits the data, such the sum of abs(Y[i] - (B[0] + B[1] X[i] + B[2] X[i]^2 ... B[n] X[i]^n))
- * for all i between 0 and m-1 is minimized.
- *
- * That is to say, the function that generated the input data can be approximated
- * by y(x) ~= B[0] + B[1] x + B[2] x^2 + ... + B[n] x^n.
- *
- * The coefficient of determination (R^2) is also returned to describe the goodness
- * of fit of the model for the given data. It is a value between 0 and 1, where 1
- * indicates perfect correspondence.
- *
- * This function first expands the X vector to a m by n matrix A such that
- * A[i][0] = 1, A[i][1] = X[i], A[i][2] = X[i]^2, ..., A[i][n] = X[i]^n.
- *
- * Then it calculates the QR decomposition of A yielding an m by m orthonormal matrix Q
- * and an m by n upper triangular matrix R. Because R is upper triangular (lower
- * part is all zeroes), we can simplify the decomposition into an m by n matrix
- * Q1 and a n by n matrix R1 such that A = Q1 R1.
- *
- * Finally we solve the system of linear equations given by R1 B = (Qtranspose Y)
- * to find B.
- *
- * For efficiency, we lay out A and Q column-wise in memory because we frequently
- * operate on the column vectors. Conversely, we lay out R row-wise.
- *
- * http://en.wikipedia.org/wiki/Numerical_methods_for_linear_least_squares
- * http://en.wikipedia.org/wiki/Gram-Schmidt
- */
-static bool solveLeastSquares(const float* x, const float* y, uint32_t m, uint32_t n,
- float* outB, float* outDet) {
-#if DEBUG_LEAST_SQUARES
- ALOGD("solveLeastSquares: m=%d, n=%d, x=%s, y=%s", int(m), int(n),
- vectorToString(x, m).string(), vectorToString(y, m).string());
-#endif
-
- // Expand the X vector to a matrix A.
- float a[n][m]; // column-major order
- for (uint32_t h = 0; h < m; h++) {
- a[0][h] = 1;
- for (uint32_t i = 1; i < n; i++) {
- a[i][h] = a[i - 1][h] * x[h];
- }
- }
-#if DEBUG_LEAST_SQUARES
- ALOGD(" - a=%s", matrixToString(&a[0][0], m, n, false /*rowMajor*/).string());
-#endif
-
- // Apply the Gram-Schmidt process to A to obtain its QR decomposition.
- float q[n][m]; // orthonormal basis, column-major order
- float r[n][n]; // upper triangular matrix, row-major order
- for (uint32_t j = 0; j < n; j++) {
- for (uint32_t h = 0; h < m; h++) {
- q[j][h] = a[j][h];
- }
- for (uint32_t i = 0; i < j; i++) {
- float dot = vectorDot(&q[j][0], &q[i][0], m);
- for (uint32_t h = 0; h < m; h++) {
- q[j][h] -= dot * q[i][h];
- }
- }
-
- float norm = vectorNorm(&q[j][0], m);
- if (norm < 0.000001f) {
- // vectors are linearly dependent or zero so no solution
-#if DEBUG_LEAST_SQUARES
- ALOGD(" - no solution, norm=%f", norm);
-#endif
- return false;
- }
-
- float invNorm = 1.0f / norm;
- for (uint32_t h = 0; h < m; h++) {
- q[j][h] *= invNorm;
- }
- for (uint32_t i = 0; i < n; i++) {
- r[j][i] = i < j ? 0 : vectorDot(&q[j][0], &a[i][0], m);
- }
- }
-#if DEBUG_LEAST_SQUARES
- ALOGD(" - q=%s", matrixToString(&q[0][0], m, n, false /*rowMajor*/).string());
- ALOGD(" - r=%s", matrixToString(&r[0][0], n, n, true /*rowMajor*/).string());
-
- // calculate QR, if we factored A correctly then QR should equal A
- float qr[n][m];
- for (uint32_t h = 0; h < m; h++) {
- for (uint32_t i = 0; i < n; i++) {
- qr[i][h] = 0;
- for (uint32_t j = 0; j < n; j++) {
- qr[i][h] += q[j][h] * r[j][i];
- }
- }
- }
- ALOGD(" - qr=%s", matrixToString(&qr[0][0], m, n, false /*rowMajor*/).string());
-#endif
-
- // Solve R B = Qt Y to find B. This is easy because R is upper triangular.
- // We just work from bottom-right to top-left calculating B's coefficients.
- for (uint32_t i = n; i-- != 0; ) {
- outB[i] = vectorDot(&q[i][0], y, m);
- for (uint32_t j = n - 1; j > i; j--) {
- outB[i] -= r[i][j] * outB[j];
- }
- outB[i] /= r[i][i];
- }
-#if DEBUG_LEAST_SQUARES
- ALOGD(" - b=%s", vectorToString(outB, n).string());
-#endif
-
- // Calculate the coefficient of determination as 1 - (SSerr / SStot) where
- // SSerr is the residual sum of squares (squared variance of the error),
- // and SStot is the total sum of squares (squared variance of the data).
- float ymean = 0;
- for (uint32_t h = 0; h < m; h++) {
- ymean += y[h];
- }
- ymean /= m;
-
- float sserr = 0;
- float sstot = 0;
- for (uint32_t h = 0; h < m; h++) {
- float err = y[h] - outB[0];
- float term = 1;
- for (uint32_t i = 1; i < n; i++) {
- term *= x[h];
- err -= term * outB[i];
- }
- sserr += err * err;
- float var = y[h] - ymean;
- sstot += var * var;
- }
- *outDet = sstot > 0.000001f ? 1.0f - (sserr / sstot) : 1;
-#if DEBUG_LEAST_SQUARES
- ALOGD(" - sserr=%f", sserr);
- ALOGD(" - sstot=%f", sstot);
- ALOGD(" - det=%f", *outDet);
-#endif
- return true;
-}
-
-bool VelocityTracker::getVelocity(uint32_t id, float* outVx, float* outVy) const {
- Estimator estimator;
- if (getEstimator(id, DEFAULT_DEGREE, DEFAULT_HORIZON, &estimator)) {
- if (estimator.degree >= 1) {
- *outVx = estimator.xCoeff[1];
- *outVy = estimator.yCoeff[1];
- return true;
- }
- }
- *outVx = 0;
- *outVy = 0;
- return false;
-}
-
-bool VelocityTracker::getEstimator(uint32_t id, uint32_t degree, nsecs_t horizon,
- Estimator* outEstimator) const {
- outEstimator->clear();
-
- // Iterate over movement samples in reverse time order and collect samples.
- float x[HISTORY_SIZE];
- float y[HISTORY_SIZE];
- float time[HISTORY_SIZE];
- uint32_t m = 0;
- uint32_t index = mIndex;
- const Movement& newestMovement = mMovements[mIndex];
- do {
- const Movement& movement = mMovements[index];
- if (!movement.idBits.hasBit(id)) {
- break;
- }
-
- nsecs_t age = newestMovement.eventTime - movement.eventTime;
- if (age > horizon) {
- break;
- }
-
- const Position& position = movement.getPosition(id);
- x[m] = position.x;
- y[m] = position.y;
- time[m] = -age * 0.000000001f;
- index = (index == 0 ? HISTORY_SIZE : index) - 1;
- } while (++m < HISTORY_SIZE);
-
- if (m == 0) {
- return false; // no data
- }
-
- // Calculate a least squares polynomial fit.
- if (degree > Estimator::MAX_DEGREE) {
- degree = Estimator::MAX_DEGREE;
- }
- if (degree > m - 1) {
- degree = m - 1;
- }
- if (degree >= 1) {
- float xdet, ydet;
- uint32_t n = degree + 1;
- if (solveLeastSquares(time, x, m, n, outEstimator->xCoeff, &xdet)
- && solveLeastSquares(time, y, m, n, outEstimator->yCoeff, &ydet)) {
- outEstimator->degree = degree;
- outEstimator->confidence = xdet * ydet;
-#if DEBUG_LEAST_SQUARES
- ALOGD("estimate: degree=%d, xCoeff=%s, yCoeff=%s, confidence=%f",
- int(outEstimator->degree),
- vectorToString(outEstimator->xCoeff, n).string(),
- vectorToString(outEstimator->yCoeff, n).string(),
- outEstimator->confidence);
-#endif
- return true;
- }
- }
-
- // No velocity data available for this pointer, but we do have its current position.
- outEstimator->xCoeff[0] = x[0];
- outEstimator->yCoeff[0] = y[0];
- outEstimator->degree = 0;
- outEstimator->confidence = 1;
- return true;
-}
-
-
-// --- VelocityControl ---
-
-const nsecs_t VelocityControl::STOP_TIME;
-
-VelocityControl::VelocityControl() {
- reset();
-}
-
-void VelocityControl::setParameters(const VelocityControlParameters& parameters) {
- mParameters = parameters;
- reset();
-}
-
-void VelocityControl::reset() {
- mLastMovementTime = LLONG_MIN;
- mRawPosition.x = 0;
- mRawPosition.y = 0;
- mVelocityTracker.clear();
-}
-
-void VelocityControl::move(nsecs_t eventTime, float* deltaX, float* deltaY) {
- if ((deltaX && *deltaX) || (deltaY && *deltaY)) {
- if (eventTime >= mLastMovementTime + STOP_TIME) {
-#if DEBUG_ACCELERATION
- ALOGD("VelocityControl: stopped, last movement was %0.3fms ago",
- (eventTime - mLastMovementTime) * 0.000001f);
-#endif
- reset();
- }
-
- mLastMovementTime = eventTime;
- if (deltaX) {
- mRawPosition.x += *deltaX;
- }
- if (deltaY) {
- mRawPosition.y += *deltaY;
- }
- mVelocityTracker.addMovement(eventTime, BitSet32(BitSet32::valueForBit(0)), &mRawPosition);
-
- float vx, vy;
- float scale = mParameters.scale;
- if (mVelocityTracker.getVelocity(0, &vx, &vy)) {
- float speed = hypotf(vx, vy) * scale;
- if (speed >= mParameters.highThreshold) {
- // Apply full acceleration above the high speed threshold.
- scale *= mParameters.acceleration;
- } else if (speed > mParameters.lowThreshold) {
- // Linearly interpolate the acceleration to apply between the low and high
- // speed thresholds.
- scale *= 1 + (speed - mParameters.lowThreshold)
- / (mParameters.highThreshold - mParameters.lowThreshold)
- * (mParameters.acceleration - 1);
- }
-
-#if DEBUG_ACCELERATION
- ALOGD("VelocityControl(%0.3f, %0.3f, %0.3f, %0.3f): "
- "vx=%0.3f, vy=%0.3f, speed=%0.3f, accel=%0.3f",
- mParameters.scale, mParameters.lowThreshold, mParameters.highThreshold,
- mParameters.acceleration,
- vx, vy, speed, scale / mParameters.scale);
-#endif
- } else {
-#if DEBUG_ACCELERATION
- ALOGD("VelocityControl(%0.3f, %0.3f, %0.3f, %0.3f): unknown velocity",
- mParameters.scale, mParameters.lowThreshold, mParameters.highThreshold,
- mParameters.acceleration);
-#endif
- }
-
- if (deltaX) {
- *deltaX *= scale;
- }
- if (deltaY) {
- *deltaY *= scale;
- }
- }
-}
-
} // namespace android
diff --git a/libs/androidfw/VelocityControl.cpp b/libs/androidfw/VelocityControl.cpp
new file mode 100644
index 0000000..cde2b76
--- /dev/null
+++ b/libs/androidfw/VelocityControl.cpp
@@ -0,0 +1,110 @@
+/*
+ * Copyright (C) 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.
+ */
+
+#define LOG_TAG "VelocityControl"
+//#define LOG_NDEBUG 0
+
+// Log debug messages about acceleration.
+#define DEBUG_ACCELERATION 0
+
+#include <math.h>
+#include <limits.h>
+
+#include <androidfw/VelocityControl.h>
+#include <utils/BitSet.h>
+#include <utils/Timers.h>
+
+namespace android {
+
+// --- VelocityControl ---
+
+const nsecs_t VelocityControl::STOP_TIME;
+
+VelocityControl::VelocityControl() {
+ reset();
+}
+
+void VelocityControl::setParameters(const VelocityControlParameters& parameters) {
+ mParameters = parameters;
+ reset();
+}
+
+void VelocityControl::reset() {
+ mLastMovementTime = LLONG_MIN;
+ mRawPosition.x = 0;
+ mRawPosition.y = 0;
+ mVelocityTracker.clear();
+}
+
+void VelocityControl::move(nsecs_t eventTime, float* deltaX, float* deltaY) {
+ if ((deltaX && *deltaX) || (deltaY && *deltaY)) {
+ if (eventTime >= mLastMovementTime + STOP_TIME) {
+#if DEBUG_ACCELERATION
+ ALOGD("VelocityControl: stopped, last movement was %0.3fms ago",
+ (eventTime - mLastMovementTime) * 0.000001f);
+#endif
+ reset();
+ }
+
+ mLastMovementTime = eventTime;
+ if (deltaX) {
+ mRawPosition.x += *deltaX;
+ }
+ if (deltaY) {
+ mRawPosition.y += *deltaY;
+ }
+ mVelocityTracker.addMovement(eventTime, BitSet32(BitSet32::valueForBit(0)), &mRawPosition);
+
+ float vx, vy;
+ float scale = mParameters.scale;
+ if (mVelocityTracker.getVelocity(0, &vx, &vy)) {
+ float speed = hypotf(vx, vy) * scale;
+ if (speed >= mParameters.highThreshold) {
+ // Apply full acceleration above the high speed threshold.
+ scale *= mParameters.acceleration;
+ } else if (speed > mParameters.lowThreshold) {
+ // Linearly interpolate the acceleration to apply between the low and high
+ // speed thresholds.
+ scale *= 1 + (speed - mParameters.lowThreshold)
+ / (mParameters.highThreshold - mParameters.lowThreshold)
+ * (mParameters.acceleration - 1);
+ }
+
+#if DEBUG_ACCELERATION
+ ALOGD("VelocityControl(%0.3f, %0.3f, %0.3f, %0.3f): "
+ "vx=%0.3f, vy=%0.3f, speed=%0.3f, accel=%0.3f",
+ mParameters.scale, mParameters.lowThreshold, mParameters.highThreshold,
+ mParameters.acceleration,
+ vx, vy, speed, scale / mParameters.scale);
+#endif
+ } else {
+#if DEBUG_ACCELERATION
+ ALOGD("VelocityControl(%0.3f, %0.3f, %0.3f, %0.3f): unknown velocity",
+ mParameters.scale, mParameters.lowThreshold, mParameters.highThreshold,
+ mParameters.acceleration);
+#endif
+ }
+
+ if (deltaX) {
+ *deltaX *= scale;
+ }
+ if (deltaY) {
+ *deltaY *= scale;
+ }
+ }
+}
+
+} // namespace android
diff --git a/libs/androidfw/VelocityTracker.cpp b/libs/androidfw/VelocityTracker.cpp
new file mode 100644
index 0000000..2fb094e
--- /dev/null
+++ b/libs/androidfw/VelocityTracker.cpp
@@ -0,0 +1,444 @@
+/*
+ * Copyright (C) 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.
+ */
+
+#define LOG_TAG "VelocityTracker"
+//#define LOG_NDEBUG 0
+
+// Log debug messages about velocity tracking.
+#define DEBUG_VELOCITY 0
+
+// Log debug messages about least squares fitting.
+#define DEBUG_LEAST_SQUARES 0
+
+#include <math.h>
+#include <limits.h>
+
+#include <androidfw/VelocityTracker.h>
+#include <utils/BitSet.h>
+#include <utils/String8.h>
+#include <utils/Timers.h>
+
+namespace android {
+
+// --- VelocityTracker ---
+
+const uint32_t VelocityTracker::DEFAULT_DEGREE;
+const nsecs_t VelocityTracker::DEFAULT_HORIZON;
+const uint32_t VelocityTracker::HISTORY_SIZE;
+
+static inline float vectorDot(const float* a, const float* b, uint32_t m) {
+ float r = 0;
+ while (m--) {
+ r += *(a++) * *(b++);
+ }
+ return r;
+}
+
+static inline float vectorNorm(const float* a, uint32_t m) {
+ float r = 0;
+ while (m--) {
+ float t = *(a++);
+ r += t * t;
+ }
+ return sqrtf(r);
+}
+
+#if DEBUG_LEAST_SQUARES || DEBUG_VELOCITY
+static String8 vectorToString(const float* a, uint32_t m) {
+ String8 str;
+ str.append("[");
+ while (m--) {
+ str.appendFormat(" %f", *(a++));
+ if (m) {
+ str.append(",");
+ }
+ }
+ str.append(" ]");
+ return str;
+}
+
+static String8 matrixToString(const float* a, uint32_t m, uint32_t n, bool rowMajor) {
+ String8 str;
+ str.append("[");
+ for (size_t i = 0; i < m; i++) {
+ if (i) {
+ str.append(",");
+ }
+ str.append(" [");
+ for (size_t j = 0; j < n; j++) {
+ if (j) {
+ str.append(",");
+ }
+ str.appendFormat(" %f", a[rowMajor ? i * n + j : j * m + i]);
+ }
+ str.append(" ]");
+ }
+ str.append(" ]");
+ return str;
+}
+#endif
+
+VelocityTracker::VelocityTracker() {
+ clear();
+}
+
+void VelocityTracker::clear() {
+ mIndex = 0;
+ mMovements[0].idBits.clear();
+ mActivePointerId = -1;
+}
+
+void VelocityTracker::clearPointers(BitSet32 idBits) {
+ BitSet32 remainingIdBits(mMovements[mIndex].idBits.value & ~idBits.value);
+ mMovements[mIndex].idBits = remainingIdBits;
+
+ if (mActivePointerId >= 0 && idBits.hasBit(mActivePointerId)) {
+ mActivePointerId = !remainingIdBits.isEmpty() ? remainingIdBits.firstMarkedBit() : -1;
+ }
+}
+
+void VelocityTracker::addMovement(nsecs_t eventTime, BitSet32 idBits, const Position* positions) {
+ if (++mIndex == HISTORY_SIZE) {
+ mIndex = 0;
+ }
+
+ while (idBits.count() > MAX_POINTERS) {
+ idBits.clearLastMarkedBit();
+ }
+
+ Movement& movement = mMovements[mIndex];
+ movement.eventTime = eventTime;
+ movement.idBits = idBits;
+ uint32_t count = idBits.count();
+ for (uint32_t i = 0; i < count; i++) {
+ movement.positions[i] = positions[i];
+ }
+
+ if (mActivePointerId < 0 || !idBits.hasBit(mActivePointerId)) {
+ mActivePointerId = count != 0 ? idBits.firstMarkedBit() : -1;
+ }
+
+#if DEBUG_VELOCITY
+ ALOGD("VelocityTracker: addMovement eventTime=%lld, idBits=0x%08x, activePointerId=%d",
+ eventTime, idBits.value, mActivePointerId);
+ for (BitSet32 iterBits(idBits); !iterBits.isEmpty(); ) {
+ uint32_t id = iterBits.firstMarkedBit();
+ uint32_t index = idBits.getIndexOfBit(id);
+ iterBits.clearBit(id);
+ Estimator estimator;
+ getEstimator(id, DEFAULT_DEGREE, DEFAULT_HORIZON, &estimator);
+ ALOGD(" %d: position (%0.3f, %0.3f), "
+ "estimator (degree=%d, xCoeff=%s, yCoeff=%s, confidence=%f)",
+ id, positions[index].x, positions[index].y,
+ int(estimator.degree),
+ vectorToString(estimator.xCoeff, estimator.degree).string(),
+ vectorToString(estimator.yCoeff, estimator.degree).string(),
+ estimator.confidence);
+ }
+#endif
+}
+
+void VelocityTracker::addMovement(const MotionEvent* event) {
+ int32_t actionMasked = event->getActionMasked();
+
+ switch (actionMasked) {
+ case AMOTION_EVENT_ACTION_DOWN:
+ case AMOTION_EVENT_ACTION_HOVER_ENTER:
+ // Clear all pointers on down before adding the new movement.
+ clear();
+ break;
+ case AMOTION_EVENT_ACTION_POINTER_DOWN: {
+ // Start a new movement trace for a pointer that just went down.
+ // We do this on down instead of on up because the client may want to query the
+ // final velocity for a pointer that just went up.
+ BitSet32 downIdBits;
+ downIdBits.markBit(event->getPointerId(event->getActionIndex()));
+ clearPointers(downIdBits);
+ break;
+ }
+ case AMOTION_EVENT_ACTION_MOVE:
+ case AMOTION_EVENT_ACTION_HOVER_MOVE:
+ break;
+ default:
+ // Ignore all other actions because they do not convey any new information about
+ // pointer movement. We also want to preserve the last known velocity of the pointers.
+ // Note that ACTION_UP and ACTION_POINTER_UP always report the last known position
+ // of the pointers that went up. ACTION_POINTER_UP does include the new position of
+ // pointers that remained down but we will also receive an ACTION_MOVE with this
+ // information if any of them actually moved. Since we don't know how many pointers
+ // will be going up at once it makes sense to just wait for the following ACTION_MOVE
+ // before adding the movement.
+ return;
+ }
+
+ size_t pointerCount = event->getPointerCount();
+ if (pointerCount > MAX_POINTERS) {
+ pointerCount = MAX_POINTERS;
+ }
+
+ BitSet32 idBits;
+ for (size_t i = 0; i < pointerCount; i++) {
+ idBits.markBit(event->getPointerId(i));
+ }
+
+ nsecs_t eventTime;
+ Position positions[pointerCount];
+
+ size_t historySize = event->getHistorySize();
+ for (size_t h = 0; h < historySize; h++) {
+ eventTime = event->getHistoricalEventTime(h);
+ for (size_t i = 0; i < pointerCount; i++) {
+ positions[i].x = event->getHistoricalX(i, h);
+ positions[i].y = event->getHistoricalY(i, h);
+ }
+ addMovement(eventTime, idBits, positions);
+ }
+
+ eventTime = event->getEventTime();
+ for (size_t i = 0; i < pointerCount; i++) {
+ positions[i].x = event->getX(i);
+ positions[i].y = event->getY(i);
+ }
+ addMovement(eventTime, idBits, positions);
+}
+
+/**
+ * Solves a linear least squares problem to obtain a N degree polynomial that fits
+ * the specified input data as nearly as possible.
+ *
+ * Returns true if a solution is found, false otherwise.
+ *
+ * The input consists of two vectors of data points X and Y with indices 0..m-1.
+ * The output is a vector B with indices 0..n-1 that describes a polynomial
+ * that fits the data, such the sum of abs(Y[i] - (B[0] + B[1] X[i] + B[2] X[i]^2 ... B[n] X[i]^n))
+ * for all i between 0 and m-1 is minimized.
+ *
+ * That is to say, the function that generated the input data can be approximated
+ * by y(x) ~= B[0] + B[1] x + B[2] x^2 + ... + B[n] x^n.
+ *
+ * The coefficient of determination (R^2) is also returned to describe the goodness
+ * of fit of the model for the given data. It is a value between 0 and 1, where 1
+ * indicates perfect correspondence.
+ *
+ * This function first expands the X vector to a m by n matrix A such that
+ * A[i][0] = 1, A[i][1] = X[i], A[i][2] = X[i]^2, ..., A[i][n] = X[i]^n.
+ *
+ * Then it calculates the QR decomposition of A yielding an m by m orthonormal matrix Q
+ * and an m by n upper triangular matrix R. Because R is upper triangular (lower
+ * part is all zeroes), we can simplify the decomposition into an m by n matrix
+ * Q1 and a n by n matrix R1 such that A = Q1 R1.
+ *
+ * Finally we solve the system of linear equations given by R1 B = (Qtranspose Y)
+ * to find B.
+ *
+ * For efficiency, we lay out A and Q column-wise in memory because we frequently
+ * operate on the column vectors. Conversely, we lay out R row-wise.
+ *
+ * http://en.wikipedia.org/wiki/Numerical_methods_for_linear_least_squares
+ * http://en.wikipedia.org/wiki/Gram-Schmidt
+ */
+static bool solveLeastSquares(const float* x, const float* y, uint32_t m, uint32_t n,
+ float* outB, float* outDet) {
+#if DEBUG_LEAST_SQUARES
+ ALOGD("solveLeastSquares: m=%d, n=%d, x=%s, y=%s", int(m), int(n),
+ vectorToString(x, m).string(), vectorToString(y, m).string());
+#endif
+
+ // Expand the X vector to a matrix A.
+ float a[n][m]; // column-major order
+ for (uint32_t h = 0; h < m; h++) {
+ a[0][h] = 1;
+ for (uint32_t i = 1; i < n; i++) {
+ a[i][h] = a[i - 1][h] * x[h];
+ }
+ }
+#if DEBUG_LEAST_SQUARES
+ ALOGD(" - a=%s", matrixToString(&a[0][0], m, n, false /*rowMajor*/).string());
+#endif
+
+ // Apply the Gram-Schmidt process to A to obtain its QR decomposition.
+ float q[n][m]; // orthonormal basis, column-major order
+ float r[n][n]; // upper triangular matrix, row-major order
+ for (uint32_t j = 0; j < n; j++) {
+ for (uint32_t h = 0; h < m; h++) {
+ q[j][h] = a[j][h];
+ }
+ for (uint32_t i = 0; i < j; i++) {
+ float dot = vectorDot(&q[j][0], &q[i][0], m);
+ for (uint32_t h = 0; h < m; h++) {
+ q[j][h] -= dot * q[i][h];
+ }
+ }
+
+ float norm = vectorNorm(&q[j][0], m);
+ if (norm < 0.000001f) {
+ // vectors are linearly dependent or zero so no solution
+#if DEBUG_LEAST_SQUARES
+ ALOGD(" - no solution, norm=%f", norm);
+#endif
+ return false;
+ }
+
+ float invNorm = 1.0f / norm;
+ for (uint32_t h = 0; h < m; h++) {
+ q[j][h] *= invNorm;
+ }
+ for (uint32_t i = 0; i < n; i++) {
+ r[j][i] = i < j ? 0 : vectorDot(&q[j][0], &a[i][0], m);
+ }
+ }
+#if DEBUG_LEAST_SQUARES
+ ALOGD(" - q=%s", matrixToString(&q[0][0], m, n, false /*rowMajor*/).string());
+ ALOGD(" - r=%s", matrixToString(&r[0][0], n, n, true /*rowMajor*/).string());
+
+ // calculate QR, if we factored A correctly then QR should equal A
+ float qr[n][m];
+ for (uint32_t h = 0; h < m; h++) {
+ for (uint32_t i = 0; i < n; i++) {
+ qr[i][h] = 0;
+ for (uint32_t j = 0; j < n; j++) {
+ qr[i][h] += q[j][h] * r[j][i];
+ }
+ }
+ }
+ ALOGD(" - qr=%s", matrixToString(&qr[0][0], m, n, false /*rowMajor*/).string());
+#endif
+
+ // Solve R B = Qt Y to find B. This is easy because R is upper triangular.
+ // We just work from bottom-right to top-left calculating B's coefficients.
+ for (uint32_t i = n; i-- != 0; ) {
+ outB[i] = vectorDot(&q[i][0], y, m);
+ for (uint32_t j = n - 1; j > i; j--) {
+ outB[i] -= r[i][j] * outB[j];
+ }
+ outB[i] /= r[i][i];
+ }
+#if DEBUG_LEAST_SQUARES
+ ALOGD(" - b=%s", vectorToString(outB, n).string());
+#endif
+
+ // Calculate the coefficient of determination as 1 - (SSerr / SStot) where
+ // SSerr is the residual sum of squares (squared variance of the error),
+ // and SStot is the total sum of squares (squared variance of the data).
+ float ymean = 0;
+ for (uint32_t h = 0; h < m; h++) {
+ ymean += y[h];
+ }
+ ymean /= m;
+
+ float sserr = 0;
+ float sstot = 0;
+ for (uint32_t h = 0; h < m; h++) {
+ float err = y[h] - outB[0];
+ float term = 1;
+ for (uint32_t i = 1; i < n; i++) {
+ term *= x[h];
+ err -= term * outB[i];
+ }
+ sserr += err * err;
+ float var = y[h] - ymean;
+ sstot += var * var;
+ }
+ *outDet = sstot > 0.000001f ? 1.0f - (sserr / sstot) : 1;
+#if DEBUG_LEAST_SQUARES
+ ALOGD(" - sserr=%f", sserr);
+ ALOGD(" - sstot=%f", sstot);
+ ALOGD(" - det=%f", *outDet);
+#endif
+ return true;
+}
+
+bool VelocityTracker::getVelocity(uint32_t id, float* outVx, float* outVy) const {
+ Estimator estimator;
+ if (getEstimator(id, DEFAULT_DEGREE, DEFAULT_HORIZON, &estimator)) {
+ if (estimator.degree >= 1) {
+ *outVx = estimator.xCoeff[1];
+ *outVy = estimator.yCoeff[1];
+ return true;
+ }
+ }
+ *outVx = 0;
+ *outVy = 0;
+ return false;
+}
+
+bool VelocityTracker::getEstimator(uint32_t id, uint32_t degree, nsecs_t horizon,
+ Estimator* outEstimator) const {
+ outEstimator->clear();
+
+ // Iterate over movement samples in reverse time order and collect samples.
+ float x[HISTORY_SIZE];
+ float y[HISTORY_SIZE];
+ float time[HISTORY_SIZE];
+ uint32_t m = 0;
+ uint32_t index = mIndex;
+ const Movement& newestMovement = mMovements[mIndex];
+ do {
+ const Movement& movement = mMovements[index];
+ if (!movement.idBits.hasBit(id)) {
+ break;
+ }
+
+ nsecs_t age = newestMovement.eventTime - movement.eventTime;
+ if (age > horizon) {
+ break;
+ }
+
+ const Position& position = movement.getPosition(id);
+ x[m] = position.x;
+ y[m] = position.y;
+ time[m] = -age * 0.000000001f;
+ index = (index == 0 ? HISTORY_SIZE : index) - 1;
+ } while (++m < HISTORY_SIZE);
+
+ if (m == 0) {
+ return false; // no data
+ }
+
+ // Calculate a least squares polynomial fit.
+ if (degree > Estimator::MAX_DEGREE) {
+ degree = Estimator::MAX_DEGREE;
+ }
+ if (degree > m - 1) {
+ degree = m - 1;
+ }
+ if (degree >= 1) {
+ float xdet, ydet;
+ uint32_t n = degree + 1;
+ if (solveLeastSquares(time, x, m, n, outEstimator->xCoeff, &xdet)
+ && solveLeastSquares(time, y, m, n, outEstimator->yCoeff, &ydet)) {
+ outEstimator->degree = degree;
+ outEstimator->confidence = xdet * ydet;
+#if DEBUG_LEAST_SQUARES
+ ALOGD("estimate: degree=%d, xCoeff=%s, yCoeff=%s, confidence=%f",
+ int(outEstimator->degree),
+ vectorToString(outEstimator->xCoeff, n).string(),
+ vectorToString(outEstimator->yCoeff, n).string(),
+ outEstimator->confidence);
+#endif
+ return true;
+ }
+ }
+
+ // No velocity data available for this pointer, but we do have its current position.
+ outEstimator->xCoeff[0] = x[0];
+ outEstimator->yCoeff[0] = y[0];
+ outEstimator->degree = 0;
+ outEstimator->confidence = 1;
+ return true;
+}
+
+} // namespace android
diff --git a/media/java/android/media/AudioService.java b/media/java/android/media/AudioService.java
index ab32d62..8015203 100644
--- a/media/java/android/media/AudioService.java
+++ b/media/java/android/media/AudioService.java
@@ -71,6 +71,7 @@
import java.io.IOException;
import java.io.PrintWriter;
import java.util.ArrayList;
+import java.util.concurrent.ConcurrentHashMap;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
@@ -501,6 +502,24 @@
}
}
+ private void checkAllAliasStreamVolumes() {
+ int numStreamTypes = AudioSystem.getNumStreamTypes();
+ for (int streamType = 0; streamType < numStreamTypes; streamType++) {
+ if (streamType != mStreamVolumeAlias[streamType]) {
+ mStreamStates[streamType].
+ setAllIndexes(mStreamStates[mStreamVolumeAlias[streamType]],
+ false /*lastAudible*/);
+ mStreamStates[streamType].
+ setAllIndexes(mStreamStates[mStreamVolumeAlias[streamType]],
+ true /*lastAudible*/);
+ }
+ // apply stream volume
+ if (mStreamStates[streamType].muteCount() == 0) {
+ mStreamStates[streamType].applyAllVolumes();
+ }
+ }
+ }
+
private void createStreamStates() {
int numStreamTypes = AudioSystem.getNumStreamTypes();
VolumeStreamState[] streams = mStreamStates = new VolumeStreamState[numStreamTypes];
@@ -509,21 +528,7 @@
streams[i] = new VolumeStreamState(System.VOLUME_SETTINGS[mStreamVolumeAlias[i]], i);
}
- // Correct stream index values for streams with aliases
- for (int i = 0; i < numStreamTypes; i++) {
- int device = getDeviceForStream(i);
- if (mStreamVolumeAlias[i] != i) {
- int index = rescaleIndex(streams[i].getIndex(device, false /* lastAudible */),
- mStreamVolumeAlias[i],
- i);
- streams[i].mIndex.put(device, streams[i].getValidIndex(index));
- streams[i].applyDeviceVolume(device);
- index = rescaleIndex(streams[i].getIndex(device, true /* lastAudible */),
- mStreamVolumeAlias[i],
- i);
- streams[i].mLastAudibleIndex.put(device, streams[i].getValidIndex(index));
- }
- }
+ checkAllAliasStreamVolumes();
}
private void dumpStreamStates(PrintWriter pw) {
@@ -677,10 +682,13 @@
final int device = getDeviceForStream(streamTypeAlias);
// get last audible index if stream is muted, current index otherwise
- final int oldIndex = streamState.getIndex(device,
+ final int aliasIndex = streamState.getIndex(device,
(streamState.muteCount() != 0) /* lastAudible */);
boolean adjustVolume = true;
+ // convert one UI step (+/-1) into a number of internal units on the stream alias
+ int step = rescaleIndex(10, streamType, streamTypeAlias);
+
// If either the client forces allowing ringer modes for this adjustment,
// or the stream type is one that is affected by ringer modes
if (((flags & AudioManager.FLAG_ALLOW_RINGER_MODES) != 0) ||
@@ -692,35 +700,30 @@
}
// Check if the ringer mode changes with this volume adjustment. If
// it does, it will handle adjusting the volume, so we won't below
- adjustVolume = checkForRingerModeChange(oldIndex, direction);
+ adjustVolume = checkForRingerModeChange(aliasIndex, direction, step);
}
// If stream is muted, adjust last audible index only
int index;
+ final int oldIndex = mStreamStates[streamType].getIndex(device,
+ (mStreamStates[streamType].muteCount() != 0) /* lastAudible */);
+
if (streamState.muteCount() != 0) {
if (adjustVolume) {
- // adjust volume on all stream types sharing the same alias otherwise a query
- // on last audible index for an alias would not give the correct value
- int numStreamTypes = AudioSystem.getNumStreamTypes();
- for (int i = numStreamTypes - 1; i >= 0; i--) {
- if (mStreamVolumeAlias[i] == streamTypeAlias) {
- VolumeStreamState s = mStreamStates[i];
-
- s.adjustLastAudibleIndex(direction, device);
- // Post a persist volume msg
- sendMsg(mAudioHandler,
- MSG_PERSIST_VOLUME,
- SENDMSG_QUEUE,
- PERSIST_LAST_AUDIBLE,
- device,
- s,
- PERSIST_DELAY);
- }
- }
+ // Post a persist volume msg
+ // no need to persist volume on all streams sharing the same alias
+ streamState.adjustLastAudibleIndex(direction * step, device);
+ sendMsg(mAudioHandler,
+ MSG_PERSIST_VOLUME,
+ SENDMSG_QUEUE,
+ PERSIST_LAST_AUDIBLE,
+ device,
+ streamState,
+ PERSIST_DELAY);
}
- index = streamState.getIndex(device, true /* lastAudible */);
+ index = mStreamStates[streamType].getIndex(device, true /* lastAudible */);
} else {
- if (adjustVolume && streamState.adjustIndex(direction, device)) {
+ if (adjustVolume && streamState.adjustIndex(direction * step, device)) {
// Post message to set system volume (it in turn will post a message
// to persist). Do not change volume if stream is muted.
sendMsg(mAudioHandler,
@@ -731,7 +734,7 @@
streamState,
0);
}
- index = streamState.getIndex(device, false /* lastAudible */);
+ index = mStreamStates[streamType].getIndex(device, false /* lastAudible */);
}
sendVolumeUpdate(streamType, oldIndex, index, flags);
@@ -763,6 +766,8 @@
final int oldIndex = streamState.getIndex(device,
(streamState.muteCount() != 0) /* lastAudible */);
+ index = rescaleIndex(index * 10, streamType, mStreamVolumeAlias[streamType]);
+
// setting volume on master stream type also controls silent mode
if (((flags & AudioManager.FLAG_ALLOW_RINGER_MODES) != 0) ||
(mStreamVolumeAlias[streamType] == getMasterStreamType())) {
@@ -781,11 +786,10 @@
setRingerMode(newRingerMode);
}
- index = rescaleIndex(index * 10, streamType, mStreamVolumeAlias[streamType]);
setStreamVolumeInt(mStreamVolumeAlias[streamType], index, device, false, true);
// get last audible index if stream is muted, current index otherwise
- index = streamState.getIndex(device,
- (streamState.muteCount() != 0) /* lastAudible */);
+ index = mStreamStates[streamType].getIndex(device,
+ (mStreamStates[streamType].muteCount() != 0) /* lastAudible */);
sendVolumeUpdate(streamType, oldIndex, index, flags);
}
@@ -1087,7 +1091,9 @@
/** @see AudioManager#setRingerMode(int) */
public void setRingerMode(int ringerMode) {
- ensureValidRingerMode(ringerMode);
+ if ((ringerMode == AudioManager.RINGER_MODE_VIBRATE) && !mHasVibrator) {
+ ringerMode = AudioManager.RINGER_MODE_SILENT;
+ }
if (ringerMode != getRingerMode()) {
setRingerModeInt(ringerMode, true);
// Send sticky broadcast
@@ -1113,12 +1119,14 @@
// on voice capable devices
if (mVoiceCapable &&
mStreamVolumeAlias[streamType] == AudioSystem.STREAM_RING) {
- Set set = mStreamStates[streamType].mLastAudibleIndex.entrySet();
- Iterator i = set.iterator();
- while (i.hasNext()) {
- Map.Entry entry = (Map.Entry)i.next();
- if ((Integer)entry.getValue() == 0) {
- entry.setValue(10);
+ synchronized (mStreamStates[streamType]) {
+ Set set = mStreamStates[streamType].mLastAudibleIndex.entrySet();
+ Iterator i = set.iterator();
+ while (i.hasNext()) {
+ Map.Entry entry = (Map.Entry)i.next();
+ if ((Integer)entry.getValue() == 0) {
+ entry.setValue(10);
+ }
}
}
}
@@ -1584,22 +1592,22 @@
for (int streamType = 0; streamType < numStreamTypes; streamType++) {
VolumeStreamState streamState = mStreamStates[streamType];
- streamState.readSettings();
+ synchronized (streamState) {
+ streamState.readSettings();
- // unmute stream that was muted but is not affect by mute anymore
- if (streamState.muteCount() != 0 && !isStreamAffectedByMute(streamType)) {
- int size = streamState.mDeathHandlers.size();
- for (int i = 0; i < size; i++) {
- streamState.mDeathHandlers.get(i).mMuteCount = 1;
- streamState.mDeathHandlers.get(i).mute(false);
+ // unmute stream that was muted but is not affect by mute anymore
+ if (streamState.muteCount() != 0 && !isStreamAffectedByMute(streamType)) {
+ int size = streamState.mDeathHandlers.size();
+ for (int i = 0; i < size; i++) {
+ streamState.mDeathHandlers.get(i).mMuteCount = 1;
+ streamState.mDeathHandlers.get(i).mute(false);
+ }
}
}
- // apply stream volume
- if (streamState.muteCount() == 0) {
- streamState.applyAllVolumes();
- }
}
+ checkAllAliasStreamVolumes();
+
// apply new ringer mode
setRingerModeInt(getRingerMode(), false);
}
@@ -2009,20 +2017,25 @@
* adjusting volume. If so, this will set the proper ringer mode and volume
* indices on the stream states.
*/
- private boolean checkForRingerModeChange(int oldIndex, int direction) {
+ private boolean checkForRingerModeChange(int oldIndex, int direction, int step) {
boolean adjustVolumeIndex = true;
int ringerMode = getRingerMode();
- int uiIndex = (oldIndex + 5) / 10;
switch (ringerMode) {
case RINGER_MODE_NORMAL:
if (direction == AudioManager.ADJUST_LOWER) {
if (mHasVibrator) {
- if (uiIndex == 1) {
+ // "step" is the delta in internal index units corresponding to a
+ // change of 1 in UI index units.
+ // Because of rounding when rescaling from one stream index range to its alias
+ // index range, we cannot simply test oldIndex == step:
+ // (step <= oldIndex < 2 * step) is equivalent to: (old UI index == 1)
+ if (step <= oldIndex && oldIndex < 2 * step) {
ringerMode = RINGER_MODE_VIBRATE;
}
} else {
- if (uiIndex == 0 && mPrevVolDirection != AudioManager.ADJUST_LOWER) {
+ // (oldIndex < step) is equivalent to (old UI index == 0)
+ if ((oldIndex < step) && mPrevVolDirection != AudioManager.ADJUST_LOWER) {
ringerMode = RINGER_MODE_SILENT;
}
}
@@ -2233,9 +2246,10 @@
private String mVolumeIndexSettingName;
private String mLastAudibleVolumeIndexSettingName;
private int mIndexMax;
- private final HashMap <Integer, Integer> mIndex = new HashMap <Integer, Integer>();
- private final HashMap <Integer, Integer> mLastAudibleIndex =
- new HashMap <Integer, Integer>();
+ private final ConcurrentHashMap<Integer, Integer> mIndex =
+ new ConcurrentHashMap<Integer, Integer>(8, 0.75f, 4);
+ private final ConcurrentHashMap<Integer, Integer> mLastAudibleIndex =
+ new ConcurrentHashMap<Integer, Integer>(8, 0.75f, 4);
private ArrayList<VolumeDeathHandler> mDeathHandlers; //handles mute/solo clients death
private VolumeStreamState(String settingName, int streamType) {
@@ -2250,8 +2264,6 @@
readSettings();
- applyAllVolumes();
-
mDeathHandlers = new ArrayList<VolumeDeathHandler>();
}
@@ -2266,7 +2278,7 @@
return name + "_" + suffix;
}
- public void readSettings() {
+ public synchronized void readSettings() {
int remainingDevices = AudioSystem.DEVICE_OUT_ALL;
for (int i = 0; remainingDevices != 0; i++) {
@@ -2340,7 +2352,7 @@
device);
}
- public void applyAllVolumes() {
+ public synchronized void applyAllVolumes() {
// apply default volume first: by convention this will reset all
// devices volumes in audio policy manager to the supplied value
AudioSystem.setStreamVolumeIndex(mStreamType,
@@ -2362,12 +2374,12 @@
public boolean adjustIndex(int deltaIndex, int device) {
return setIndex(getIndex(device,
- false /* lastAudible */) + deltaIndex * 10,
+ false /* lastAudible */) + deltaIndex,
device,
true /* lastAudible */);
}
- public boolean setIndex(int index, int device, boolean lastAudible) {
+ public synchronized boolean setIndex(int index, int device, boolean lastAudible) {
int oldIndex = getIndex(device, false /* lastAudible */);
index = getValidIndex(index);
mIndex.put(device, getValidIndex(index));
@@ -2401,8 +2413,8 @@
}
}
- public int getIndex(int device, boolean lastAudible) {
- HashMap <Integer, Integer> indexes;
+ public synchronized int getIndex(int device, boolean lastAudible) {
+ ConcurrentHashMap <Integer, Integer> indexes;
if (lastAudible) {
indexes = mLastAudibleIndex;
} else {
@@ -2416,13 +2428,29 @@
return index.intValue();
}
- public void setLastAudibleIndex(int index, int device) {
+ public synchronized void setLastAudibleIndex(int index, int device) {
+ // Apply change to all streams using this one as alias
+ // if changing volume of current device, also change volume of current
+ // device on aliased stream
+ boolean currentDevice = (device == getDeviceForStream(mStreamType));
+ int numStreamTypes = AudioSystem.getNumStreamTypes();
+ for (int streamType = numStreamTypes - 1; streamType >= 0; streamType--) {
+ if (streamType != mStreamType &&
+ mStreamVolumeAlias[streamType] == mStreamType) {
+ int scaledIndex = rescaleIndex(index, mStreamType, streamType);
+ mStreamStates[streamType].setLastAudibleIndex(scaledIndex, device);
+ if (currentDevice) {
+ mStreamStates[streamType].setLastAudibleIndex(scaledIndex,
+ getDeviceForStream(streamType));
+ }
+ }
+ }
mLastAudibleIndex.put(device, getValidIndex(index));
}
- public void adjustLastAudibleIndex(int deltaIndex, int device) {
+ public synchronized void adjustLastAudibleIndex(int deltaIndex, int device) {
setLastAudibleIndex(getIndex(device,
- true /* lastAudible */) + deltaIndex * 10,
+ true /* lastAudible */) + deltaIndex,
device);
}
@@ -2430,7 +2458,8 @@
return mIndexMax;
}
- public HashMap <Integer, Integer> getAllIndexes(boolean lastAudible) {
+ // only called by setAllIndexes() which is already synchronized
+ public ConcurrentHashMap <Integer, Integer> getAllIndexes(boolean lastAudible) {
if (lastAudible) {
return mLastAudibleIndex;
} else {
@@ -2438,8 +2467,8 @@
}
}
- public void setAllIndexes(VolumeStreamState srcStream, boolean lastAudible) {
- HashMap <Integer, Integer> indexes = srcStream.getAllIndexes(lastAudible);
+ public synchronized void setAllIndexes(VolumeStreamState srcStream, boolean lastAudible) {
+ ConcurrentHashMap <Integer, Integer> indexes = srcStream.getAllIndexes(lastAudible);
Set set = indexes.entrySet();
Iterator i = set.iterator();
while (i.hasNext()) {
@@ -2451,7 +2480,7 @@
}
}
- public void mute(IBinder cb, boolean state) {
+ public synchronized void mute(IBinder cb, boolean state) {
VolumeDeathHandler handler = getDeathHandler(cb, state);
if (handler == null) {
Log.e(TAG, "Could not get client death handler for stream: "+mStreamType);
@@ -2482,25 +2511,68 @@
mICallback = cb;
}
+ // must be called while synchronized on parent VolumeStreamState
public void mute(boolean state) {
- synchronized(mDeathHandlers) {
- if (state) {
- if (mMuteCount == 0) {
- // Register for client death notification
- try {
- // mICallback can be 0 if muted by AudioService
- if (mICallback != null) {
- mICallback.linkToDeath(this, 0);
+ if (state) {
+ if (mMuteCount == 0) {
+ // Register for client death notification
+ try {
+ // mICallback can be 0 if muted by AudioService
+ if (mICallback != null) {
+ mICallback.linkToDeath(this, 0);
+ }
+ mDeathHandlers.add(this);
+ // If the stream is not yet muted by any client, set level to 0
+ if (muteCount() == 0) {
+ Set set = mIndex.entrySet();
+ Iterator i = set.iterator();
+ while (i.hasNext()) {
+ Map.Entry entry = (Map.Entry)i.next();
+ int device = ((Integer)entry.getKey()).intValue();
+ setIndex(0, device, false /* lastAudible */);
}
- mDeathHandlers.add(this);
- // If the stream is not yet muted by any client, set level to 0
- if (muteCount() == 0) {
+ sendMsg(mAudioHandler,
+ MSG_SET_ALL_VOLUMES,
+ SENDMSG_QUEUE,
+ 0,
+ 0,
+ VolumeStreamState.this, 0);
+ }
+ } catch (RemoteException e) {
+ // Client has died!
+ binderDied();
+ return;
+ }
+ } else {
+ Log.w(TAG, "stream: "+mStreamType+" was already muted by this client");
+ }
+ mMuteCount++;
+ } else {
+ if (mMuteCount == 0) {
+ Log.e(TAG, "unexpected unmute for stream: "+mStreamType);
+ } else {
+ mMuteCount--;
+ if (mMuteCount == 0) {
+ // Unregister from client death notification
+ mDeathHandlers.remove(this);
+ // mICallback can be 0 if muted by AudioService
+ if (mICallback != null) {
+ mICallback.unlinkToDeath(this, 0);
+ }
+ if (muteCount() == 0) {
+ // If the stream is not muted any more, restore its volume if
+ // ringer mode allows it
+ if (!isStreamAffectedByRingerMode(mStreamType) ||
+ mRingerMode == AudioManager.RINGER_MODE_NORMAL) {
Set set = mIndex.entrySet();
Iterator i = set.iterator();
while (i.hasNext()) {
Map.Entry entry = (Map.Entry)i.next();
int device = ((Integer)entry.getKey()).intValue();
- setIndex(0, device, false /* lastAudible */);
+ setIndex(getIndex(device,
+ true /* lastAudible */),
+ device,
+ false /* lastAudible */);
}
sendMsg(mAudioHandler,
MSG_SET_ALL_VOLUMES,
@@ -2509,55 +2581,9 @@
0,
VolumeStreamState.this, 0);
}
- } catch (RemoteException e) {
- // Client has died!
- binderDied();
- mDeathHandlers.notify();
- return;
- }
- } else {
- Log.w(TAG, "stream: "+mStreamType+" was already muted by this client");
- }
- mMuteCount++;
- } else {
- if (mMuteCount == 0) {
- Log.e(TAG, "unexpected unmute for stream: "+mStreamType);
- } else {
- mMuteCount--;
- if (mMuteCount == 0) {
- // Unregistr from client death notification
- mDeathHandlers.remove(this);
- // mICallback can be 0 if muted by AudioService
- if (mICallback != null) {
- mICallback.unlinkToDeath(this, 0);
- }
- if (muteCount() == 0) {
- // If the stream is not muted any more, restore it's volume if
- // ringer mode allows it
- if (!isStreamAffectedByRingerMode(mStreamType) ||
- mRingerMode == AudioManager.RINGER_MODE_NORMAL) {
- Set set = mIndex.entrySet();
- Iterator i = set.iterator();
- while (i.hasNext()) {
- Map.Entry entry = (Map.Entry)i.next();
- int device = ((Integer)entry.getKey()).intValue();
- setIndex(getIndex(device,
- true /* lastAudible */),
- device,
- false /* lastAudible */);
- }
- sendMsg(mAudioHandler,
- MSG_SET_ALL_VOLUMES,
- SENDMSG_QUEUE,
- 0,
- 0,
- VolumeStreamState.this, 0);
- }
- }
}
}
}
- mDeathHandlers.notify();
}
}
@@ -2571,7 +2597,7 @@
}
}
- private int muteCount() {
+ private synchronized int muteCount() {
int count = 0;
int size = mDeathHandlers.size();
for (int i = 0; i < size; i++) {
@@ -2580,26 +2606,25 @@
return count;
}
+ // only called by mute() which is already synchronized
private VolumeDeathHandler getDeathHandler(IBinder cb, boolean state) {
- synchronized(mDeathHandlers) {
- VolumeDeathHandler handler;
- int size = mDeathHandlers.size();
- for (int i = 0; i < size; i++) {
- handler = mDeathHandlers.get(i);
- if (cb == handler.mICallback) {
- return handler;
- }
+ VolumeDeathHandler handler;
+ int size = mDeathHandlers.size();
+ for (int i = 0; i < size; i++) {
+ handler = mDeathHandlers.get(i);
+ if (cb == handler.mICallback) {
+ return handler;
}
- // If this is the first mute request for this client, create a new
- // client death handler. Otherwise, it is an out of sequence unmute request.
- if (state) {
- handler = new VolumeDeathHandler(cb);
- } else {
- Log.w(TAG, "stream was not muted by this client");
- handler = null;
- }
- return handler;
}
+ // If this is the first mute request for this client, create a new
+ // client death handler. Otherwise, it is an out of sequence unmute request.
+ if (state) {
+ handler = new VolumeDeathHandler(cb);
+ } else {
+ Log.w(TAG, "stream was not muted by this client");
+ handler = null;
+ }
+ return handler;
}
private void dump(PrintWriter pw) {
@@ -2955,10 +2980,13 @@
address);
}
+ private void sendBecomingNoisyIntent() {
+ mContext.sendBroadcast(new Intent(AudioManager.ACTION_AUDIO_BECOMING_NOISY));
+ }
+
// must be called synchronized on mConnectedDevices
private void makeA2dpDeviceUnavailableNow(String address) {
- Intent noisyIntent = new Intent(AudioManager.ACTION_AUDIO_BECOMING_NOISY);
- mContext.sendBroadcast(noisyIntent);
+ sendBecomingNoisyIntent();
AudioSystem.setDeviceConnectionState(AudioSystem.DEVICE_OUT_BLUETOOTH_A2DP,
AudioSystem.DEVICE_STATE_UNAVAILABLE,
address);
@@ -3035,12 +3063,12 @@
private boolean handleDeviceConnection(boolean connected, int device, String params) {
synchronized (mConnectedDevices) {
boolean isConnected = (mConnectedDevices.containsKey(device) &&
- mConnectedDevices.get(device).equals(params));
+ (params.isEmpty() || mConnectedDevices.get(device).equals(params)));
if (isConnected && !connected) {
AudioSystem.setDeviceConnectionState(device,
AudioSystem.DEVICE_STATE_UNAVAILABLE,
- params);
+ mConnectedDevices.get(device));
mConnectedDevices.remove(device);
return true;
} else if (!isConnected && connected) {
@@ -3161,9 +3189,13 @@
} else if (action.equals(Intent.ACTION_USB_AUDIO_ACCESSORY_PLUG) ||
action.equals(Intent.ACTION_USB_AUDIO_DEVICE_PLUG)) {
state = intent.getIntExtra("state", 0);
+ if (state == 0) {
+ sendBecomingNoisyIntent();
+ }
int alsaCard = intent.getIntExtra("card", -1);
int alsaDevice = intent.getIntExtra("device", -1);
- String params = "card=" + alsaCard + ";device=" + alsaDevice;
+ String params = (alsaCard == -1 && alsaDevice == -1 ? ""
+ : "card=" + alsaCard + ";device=" + alsaDevice);
device = action.equals(Intent.ACTION_USB_AUDIO_ACCESSORY_PLUG) ?
AudioSystem.DEVICE_OUT_USB_ACCESSORY : AudioSystem.DEVICE_OUT_USB_DEVICE;
Log.v(TAG, "Broadcast Receiver: Got "
diff --git a/media/java/android/media/MediaPlayer.java b/media/java/android/media/MediaPlayer.java
index 9f0fd48..aa4cdbe 100644
--- a/media/java/android/media/MediaPlayer.java
+++ b/media/java/android/media/MediaPlayer.java
@@ -2020,8 +2020,9 @@
if (msg.obj == null) {
mOnTimedTextListener.onTimedText(mMediaPlayer, null);
} else {
- if (msg.obj instanceof byte[]) {
- TimedText text = new TimedText((byte[])(msg.obj));
+ if (msg.obj instanceof Parcel) {
+ Parcel parcel = (Parcel)msg.obj;
+ TimedText text = new TimedText(parcel);
mOnTimedTextListener.onTimedText(mMediaPlayer, text);
}
}
diff --git a/media/java/android/media/TimedText.java b/media/java/android/media/TimedText.java
index 1d7c968..e6a7e13 100644
--- a/media/java/android/media/TimedText.java
+++ b/media/java/android/media/TimedText.java
@@ -28,7 +28,7 @@
* Class to hold the timed text's metadata, including:
* <ul>
* <li> The characters for rendering</li>
- * <li> The rendering postion for the timed text</li>
+ * <li> The rendering position for the timed text</li>
* </ul>
*
* <p> To render the timed text, applications need to do the following:
@@ -86,7 +86,6 @@
private static final String TAG = "TimedText";
- private Parcel mParcel = Parcel.obtain();
private final HashMap<Integer, Object> mKeyObjectMap =
new HashMap<Integer, Object>();
@@ -356,10 +355,8 @@
* @throws IllegalArgumentExcept if parseParcel() fails.
* {@hide}
*/
- public TimedText(byte[] obj) {
- mParcel.unmarshall(obj, 0, obj.length);
-
- if (!parseParcel()) {
+ public TimedText(Parcel parcel) {
+ if (!parseParcel(parcel)) {
mKeyObjectMap.clear();
throw new IllegalArgumentException("parseParcel() fails");
}
@@ -393,28 +390,28 @@
* Parcel. These are stored in mKeyObjectMap for application to retrieve.
* @return false if an error occurred during parsing. Otherwise, true.
*/
- private boolean parseParcel() {
- mParcel.setDataPosition(0);
- if (mParcel.dataAvail() == 0) {
+ private boolean parseParcel(Parcel parcel) {
+ parcel.setDataPosition(0);
+ if (parcel.dataAvail() == 0) {
return false;
}
- int type = mParcel.readInt();
+ int type = parcel.readInt();
if (type == KEY_LOCAL_SETTING) {
- type = mParcel.readInt();
+ type = parcel.readInt();
if (type != KEY_START_TIME) {
return false;
}
- int mStartTimeMs = mParcel.readInt();
+ int mStartTimeMs = parcel.readInt();
mKeyObjectMap.put(type, mStartTimeMs);
- type = mParcel.readInt();
+ type = parcel.readInt();
if (type != KEY_STRUCT_TEXT) {
return false;
}
- int textLen = mParcel.readInt();
- byte[] text = mParcel.createByteArray();
+ int textLen = parcel.readInt();
+ byte[] text = parcel.createByteArray();
if (text == null || text.length == 0) {
mTextChars = null;
} else {
@@ -426,8 +423,8 @@
return false;
}
- while (mParcel.dataAvail() > 0) {
- int key = mParcel.readInt();
+ while (parcel.dataAvail() > 0) {
+ int key = parcel.readInt();
if (!isValidKey(key)) {
Log.w(TAG, "Invalid timed text key found: " + key);
return false;
@@ -437,77 +434,77 @@
switch (key) {
case KEY_STRUCT_STYLE_LIST: {
- readStyle();
+ readStyle(parcel);
object = mStyleList;
break;
}
case KEY_STRUCT_FONT_LIST: {
- readFont();
+ readFont(parcel);
object = mFontList;
break;
}
case KEY_STRUCT_HIGHLIGHT_LIST: {
- readHighlight();
+ readHighlight(parcel);
object = mHighlightPosList;
break;
}
case KEY_STRUCT_KARAOKE_LIST: {
- readKaraoke();
+ readKaraoke(parcel);
object = mKaraokeList;
break;
}
case KEY_STRUCT_HYPER_TEXT_LIST: {
- readHyperText();
+ readHyperText(parcel);
object = mHyperTextList;
break;
}
case KEY_STRUCT_BLINKING_TEXT_LIST: {
- readBlinkingText();
+ readBlinkingText(parcel);
object = mBlinkingPosList;
break;
}
case KEY_WRAP_TEXT: {
- mWrapText = mParcel.readInt();
+ mWrapText = parcel.readInt();
object = mWrapText;
break;
}
case KEY_HIGHLIGHT_COLOR_RGBA: {
- mHighlightColorRGBA = mParcel.readInt();
+ mHighlightColorRGBA = parcel.readInt();
object = mHighlightColorRGBA;
break;
}
case KEY_DISPLAY_FLAGS: {
- mDisplayFlags = mParcel.readInt();
+ mDisplayFlags = parcel.readInt();
object = mDisplayFlags;
break;
}
case KEY_STRUCT_JUSTIFICATION: {
- int horizontal = mParcel.readInt();
- int vertical = mParcel.readInt();
+ int horizontal = parcel.readInt();
+ int vertical = parcel.readInt();
mJustification = new Justification(horizontal, vertical);
object = mJustification;
break;
}
case KEY_BACKGROUND_COLOR_RGBA: {
- mBackgroundColorRGBA = mParcel.readInt();
+ mBackgroundColorRGBA = parcel.readInt();
object = mBackgroundColorRGBA;
break;
}
case KEY_STRUCT_TEXT_POS: {
- int top = mParcel.readInt();
- int left = mParcel.readInt();
- int bottom = mParcel.readInt();
- int right = mParcel.readInt();
+ int top = parcel.readInt();
+ int left = parcel.readInt();
+ int bottom = parcel.readInt();
+ int right = parcel.readInt();
mTextBounds = new Rect(left, top, right, bottom);
break;
}
case KEY_SCROLL_DELAY: {
- mScrollDelay = mParcel.readInt();
+ mScrollDelay = parcel.readInt();
object = mScrollDelay;
break;
}
@@ -520,18 +517,18 @@
if (mKeyObjectMap.containsKey(key)) {
mKeyObjectMap.remove(key);
}
+ // Previous mapping will be replaced with the new object, if there was one.
mKeyObjectMap.put(key, object);
}
}
- mParcel.recycle();
return true;
}
/*
* To parse and store the Style list.
*/
- private void readStyle() {
+ private void readStyle(Parcel parcel) {
boolean endOfStyle = false;
int startChar = -1;
int endChar = -1;
@@ -541,23 +538,23 @@
boolean isUnderlined = false;
int fontSize = -1;
int colorRGBA = -1;
- while (!endOfStyle && (mParcel.dataAvail() > 0)) {
- int key = mParcel.readInt();
+ while (!endOfStyle && (parcel.dataAvail() > 0)) {
+ int key = parcel.readInt();
switch (key) {
case KEY_START_CHAR: {
- startChar = mParcel.readInt();
+ startChar = parcel.readInt();
break;
}
case KEY_END_CHAR: {
- endChar = mParcel.readInt();
+ endChar = parcel.readInt();
break;
}
case KEY_FONT_ID: {
- fontId = mParcel.readInt();
+ fontId = parcel.readInt();
break;
}
case KEY_STYLE_FLAGS: {
- int flags = mParcel.readInt();
+ int flags = parcel.readInt();
// In the absence of any bits set in flags, the text
// is plain. Otherwise, 1: bold, 2: italic, 4: underline
isBold = ((flags % 2) == 1);
@@ -566,17 +563,17 @@
break;
}
case KEY_FONT_SIZE: {
- fontSize = mParcel.readInt();
+ fontSize = parcel.readInt();
break;
}
case KEY_TEXT_COLOR_RGBA: {
- colorRGBA = mParcel.readInt();
+ colorRGBA = parcel.readInt();
break;
}
default: {
// End of the Style parsing. Reset the data position back
- // to the position before the last mParcel.readInt() call.
- mParcel.setDataPosition(mParcel.dataPosition() - 4);
+ // to the position before the last parcel.readInt() call.
+ parcel.setDataPosition(parcel.dataPosition() - 4);
endOfStyle = true;
break;
}
@@ -594,14 +591,14 @@
/*
* To parse and store the Font list
*/
- private void readFont() {
- int entryCount = mParcel.readInt();
+ private void readFont(Parcel parcel) {
+ int entryCount = parcel.readInt();
for (int i = 0; i < entryCount; i++) {
- int id = mParcel.readInt();
- int nameLen = mParcel.readInt();
+ int id = parcel.readInt();
+ int nameLen = parcel.readInt();
- byte[] text = mParcel.createByteArray();
+ byte[] text = parcel.createByteArray();
final String name = new String(text, 0, nameLen);
Font font = new Font(id, name);
@@ -616,9 +613,9 @@
/*
* To parse and store the Highlight list
*/
- private void readHighlight() {
- int startChar = mParcel.readInt();
- int endChar = mParcel.readInt();
+ private void readHighlight(Parcel parcel) {
+ int startChar = parcel.readInt();
+ int endChar = parcel.readInt();
CharPos pos = new CharPos(startChar, endChar);
if (mHighlightPosList == null) {
@@ -630,14 +627,14 @@
/*
* To parse and store the Karaoke list
*/
- private void readKaraoke() {
- int entryCount = mParcel.readInt();
+ private void readKaraoke(Parcel parcel) {
+ int entryCount = parcel.readInt();
for (int i = 0; i < entryCount; i++) {
- int startTimeMs = mParcel.readInt();
- int endTimeMs = mParcel.readInt();
- int startChar = mParcel.readInt();
- int endChar = mParcel.readInt();
+ int startTimeMs = parcel.readInt();
+ int endTimeMs = parcel.readInt();
+ int startChar = parcel.readInt();
+ int endChar = parcel.readInt();
Karaoke kara = new Karaoke(startTimeMs, endTimeMs,
startChar, endChar);
@@ -651,16 +648,16 @@
/*
* To parse and store HyperText list
*/
- private void readHyperText() {
- int startChar = mParcel.readInt();
- int endChar = mParcel.readInt();
+ private void readHyperText(Parcel parcel) {
+ int startChar = parcel.readInt();
+ int endChar = parcel.readInt();
- int len = mParcel.readInt();
- byte[] url = mParcel.createByteArray();
+ int len = parcel.readInt();
+ byte[] url = parcel.createByteArray();
final String urlString = new String(url, 0, len);
- len = mParcel.readInt();
- byte[] alt = mParcel.createByteArray();
+ len = parcel.readInt();
+ byte[] alt = parcel.createByteArray();
final String altString = new String(alt, 0, len);
HyperText hyperText = new HyperText(startChar, endChar, urlString, altString);
@@ -674,9 +671,9 @@
/*
* To parse and store blinking text list
*/
- private void readBlinkingText() {
- int startChar = mParcel.readInt();
- int endChar = mParcel.readInt();
+ private void readBlinkingText(Parcel parcel) {
+ int startChar = parcel.readInt();
+ int endChar = parcel.readInt();
CharPos blinkingPos = new CharPos(startChar, endChar);
if (mBlinkingPosList == null) {
diff --git a/media/jni/android_media_MediaPlayer.cpp b/media/jni/android_media_MediaPlayer.cpp
index 5eadb3a..de22e09 100644
--- a/media/jni/android_media_MediaPlayer.cpp
+++ b/media/jni/android_media_MediaPlayer.cpp
@@ -72,6 +72,7 @@
JNIMediaPlayerListener();
jclass mClass; // Reference to MediaPlayer class
jobject mObject; // Weak ref to MediaPlayer Java object to call on
+ jobject mParcel;
};
JNIMediaPlayerListener::JNIMediaPlayerListener(JNIEnv* env, jobject thiz, jobject weak_thiz)
@@ -90,6 +91,7 @@
// We use a weak reference so the MediaPlayer object can be garbage collected.
// The reference is only used as a proxy for callbacks.
mObject = env->NewGlobalRef(weak_thiz);
+ mParcel = env->NewGlobalRef(createJavaParcelObject(env));
}
JNIMediaPlayerListener::~JNIMediaPlayerListener()
@@ -98,25 +100,30 @@
JNIEnv *env = AndroidRuntime::getJNIEnv();
env->DeleteGlobalRef(mObject);
env->DeleteGlobalRef(mClass);
+
+ recycleJavaParcelObject(env, mParcel);
+ env->DeleteGlobalRef(mParcel);
}
void JNIMediaPlayerListener::notify(int msg, int ext1, int ext2, const Parcel *obj)
{
JNIEnv *env = AndroidRuntime::getJNIEnv();
if (obj && obj->dataSize() > 0) {
- jbyteArray jArray = env->NewByteArray(obj->dataSize());
- if (jArray != NULL) {
- jbyte *nArray = env->GetByteArrayElements(jArray, NULL);
- memcpy(nArray, obj->data(), obj->dataSize());
- env->ReleaseByteArrayElements(jArray, nArray, 0);
+ if (mParcel != NULL) {
+ Parcel* nativeParcel = parcelForJavaObject(env, mParcel);
+ nativeParcel->setData(obj->data(), obj->dataSize());
env->CallStaticVoidMethod(mClass, fields.post_event, mObject,
- msg, ext1, ext2, jArray);
- env->DeleteLocalRef(jArray);
+ msg, ext1, ext2, mParcel);
}
} else {
env->CallStaticVoidMethod(mClass, fields.post_event, mObject,
msg, ext1, ext2, NULL);
}
+ if (env->ExceptionCheck()) {
+ ALOGW("An exception occurred while notifying an event.");
+ LOGW_EX(env);
+ env->ExceptionClear();
+ }
}
// ----------------------------------------------------------------------------
@@ -533,7 +540,6 @@
return UNKNOWN_ERROR;
}
-
Parcel *request = parcelForJavaObject(env, java_request);
Parcel *reply = parcelForJavaObject(env, java_reply);
diff --git a/media/jni/android_media_Utils.cpp b/media/jni/android_media_Utils.cpp
index a4d88ff..e35ace3 100644
--- a/media/jni/android_media_Utils.cpp
+++ b/media/jni/android_media_Utils.cpp
@@ -125,6 +125,19 @@
return byteBufObj;
}
+static void SetMapInt32(
+ JNIEnv *env, jobject hashMapObj, jmethodID hashMapPutID,
+ const char *key, int32_t value) {
+ jstring keyObj = env->NewStringUTF(key);
+ jobject valueObj = makeIntegerObject(env, value);
+
+ jobject res = env->CallObjectMethod(
+ hashMapObj, hashMapPutID, keyObj, valueObj);
+
+ env->DeleteLocalRef(valueObj); valueObj = NULL;
+ env->DeleteLocalRef(keyObj); keyObj = NULL;
+}
+
status_t ConvertMessageToMap(
JNIEnv *env, const sp<AMessage> &msg, jobject *map) {
jclass hashMapClazz = env->FindClass("java/util/HashMap");
@@ -205,6 +218,41 @@
break;
}
+ case AMessage::kTypeRect:
+ {
+ int32_t left, top, right, bottom;
+ CHECK(msg->findRect(key, &left, &top, &right, &bottom));
+
+ SetMapInt32(
+ env,
+ hashMap,
+ hashMapPutID,
+ StringPrintf("%s-left", key).c_str(),
+ left);
+
+ SetMapInt32(
+ env,
+ hashMap,
+ hashMapPutID,
+ StringPrintf("%s-top", key).c_str(),
+ top);
+
+ SetMapInt32(
+ env,
+ hashMap,
+ hashMapPutID,
+ StringPrintf("%s-right", key).c_str(),
+ right);
+
+ SetMapInt32(
+ env,
+ hashMap,
+ hashMapPutID,
+ StringPrintf("%s-bottom", key).c_str(),
+ bottom);
+ break;
+ }
+
default:
break;
}
diff --git a/media/mca/filterpacks/java/android/filterpacks/videosrc/SurfaceTextureTarget.java b/media/mca/filterpacks/java/android/filterpacks/videosrc/SurfaceTextureTarget.java
index 20e4b32..b023e42 100644
--- a/media/mca/filterpacks/java/android/filterpacks/videosrc/SurfaceTextureTarget.java
+++ b/media/mca/filterpacks/java/android/filterpacks/videosrc/SurfaceTextureTarget.java
@@ -110,7 +110,7 @@
}
@Override
- public void setupPorts() {
+ public synchronized void setupPorts() {
// Make sure we have a SurfaceView
if (mSurfaceTexture == null) {
throw new RuntimeException("Null SurfaceTexture passed to SurfaceTextureTarget");
@@ -158,7 +158,7 @@
}
@Override
- public void open(FilterContext context) {
+ public synchronized void open(FilterContext context) {
// Set up SurfaceTexture internals
mSurfaceId = context.getGLEnvironment().registerSurfaceTexture(
mSurfaceTexture, mScreenWidth, mScreenHeight);
@@ -169,17 +169,42 @@
@Override
- public void close(FilterContext context) {
+ public synchronized void close(FilterContext context) {
if (mSurfaceId > 0) {
context.getGLEnvironment().unregisterSurfaceId(mSurfaceId);
+ mSurfaceId = -1;
+ // Once the surface is unregistered, remove the surfacetexture reference.
+ // The surfaceId could not have been valid without a valid surfacetexture.
+ mSurfaceTexture = null;
}
}
+ // This should be called from the client side when the surfacetexture is no longer
+ // valid. e.g. from onPause() in the application using the filter graph.
+ public synchronized void disconnect(FilterContext context) {
+ if (mLogVerbose) Log.v(TAG, "disconnect");
+ if (mSurfaceTexture == null) {
+ Log.d(TAG, "SurfaceTexture is already null. Nothing to disconnect.");
+ return;
+ }
+ mSurfaceTexture = null;
+ // Make sure we unregister the surface as well if a surface was registered.
+ // There can be a situation where the surface was not registered but the
+ // surfacetexture was valid. For example, the disconnect can be called before
+ // the filter was opened. Hence, the surfaceId may not be a valid one here,
+ // and need to check for its validity.
+ if (mSurfaceId > 0) {
+ context.getGLEnvironment().unregisterSurfaceId(mSurfaceId);
+ mSurfaceId = -1;
+ }
+ }
@Override
- public void process(FilterContext context) {
- if (mLogVerbose) Log.v(TAG, "Starting frame processing");
-
+ public synchronized void process(FilterContext context) {
+ // Surface is not registered. Nothing to render into.
+ if (mSurfaceId <= 0) {
+ return;
+ }
GLEnvironment glEnv = context.getGLEnvironment();
// Get input frame
@@ -197,8 +222,6 @@
// See if we need to copy to GPU
Frame gpuFrame = null;
- if (mLogVerbose) Log.v("SurfaceTextureTarget", "Got input format: " + input.getFormat());
-
int target = input.getFormat().getTarget();
if (target != FrameFormat.TARGET_GPU) {
gpuFrame = context.getFrameManager().duplicateFrameToTarget(input,
diff --git a/packages/DefaultContainerService/src/com/android/defcontainer/DefaultContainerService.java b/packages/DefaultContainerService/src/com/android/defcontainer/DefaultContainerService.java
index 17e5f4e..3b87b96 100644
--- a/packages/DefaultContainerService/src/com/android/defcontainer/DefaultContainerService.java
+++ b/packages/DefaultContainerService/src/com/android/defcontainer/DefaultContainerService.java
@@ -473,6 +473,8 @@
}
private static class ApkContainer {
+ private static final int MAX_AUTHENTICATED_DATA_SIZE = 16384;
+
private final InputStream mInStream;
private MacAuthenticatedInputStream mAuthenticatedStream;
@@ -540,26 +542,35 @@
throw new IOException(e);
}
- final int encStart = encryptionParams.getEncryptedDataStart();
- final int end = encryptionParams.getDataEnd();
+ final long encStart = encryptionParams.getEncryptedDataStart();
+ final long end = encryptionParams.getDataEnd();
if (end < encStart) {
throw new IOException("end <= encStart");
}
final Mac mac = getMacInstance(encryptionParams);
if (mac != null) {
- final int macStart = encryptionParams.getAuthenticatedDataStart();
+ final long macStart = encryptionParams.getAuthenticatedDataStart();
+ if (macStart >= Integer.MAX_VALUE) {
+ throw new IOException("macStart >= Integer.MAX_VALUE");
+ }
- final int furtherOffset;
+ final long furtherOffset;
if (macStart >= 0 && encStart >= 0 && macStart < encStart) {
/*
* If there is authenticated data at the beginning, read
* that into our MAC first.
*/
- final int authenticatedLength = encStart - macStart;
- final byte[] authenticatedData = new byte[authenticatedLength];
+ final long authenticatedLengthLong = encStart - macStart;
+ if (authenticatedLengthLong > MAX_AUTHENTICATED_DATA_SIZE) {
+ throw new IOException("authenticated data is too long");
+ }
+ final int authenticatedLength = (int) authenticatedLengthLong;
- Streams.readFully(inStream, authenticatedData, macStart, authenticatedLength);
+ final byte[] authenticatedData = new byte[(int) authenticatedLength];
+
+ Streams.readFully(inStream, authenticatedData, (int) macStart,
+ authenticatedLength);
mac.update(authenticatedData, 0, authenticatedLength);
furtherOffset = 0;
diff --git a/packages/InputDevices/res/xml/keyboard_layouts.xml b/packages/InputDevices/res/xml/keyboard_layouts.xml
index 23f6bcb..c2a2ecc 100644
--- a/packages/InputDevices/res/xml/keyboard_layouts.xml
+++ b/packages/InputDevices/res/xml/keyboard_layouts.xml
@@ -2,109 +2,109 @@
<keyboard-layouts xmlns:android="http://schemas.android.com/apk/res/android">
<keyboard-layout android:name="keyboard_layout_english_us"
android:label="@string/keyboard_layout_english_us_label"
- android:kcm="@raw/keyboard_layout_english_us" />
+ android:keyboardLayout="@raw/keyboard_layout_english_us" />
<keyboard-layout android:name="keyboard_layout_english_us_dvorak"
android:label="@string/keyboard_layout_english_us_dvorak_label"
- android:kcm="@raw/keyboard_layout_english_us_dvorak" />
+ android:keyboardLayout="@raw/keyboard_layout_english_us_dvorak" />
<keyboard-layout android:name="keyboard_layout_german"
android:label="@string/keyboard_layout_german_label"
- android:kcm="@raw/keyboard_layout_german" />
+ android:keyboardLayout="@raw/keyboard_layout_german" />
<keyboard-layout android:name="keyboard_layout_french"
android:label="@string/keyboard_layout_french_label"
- android:kcm="@raw/keyboard_layout_french" />
+ android:keyboardLayout="@raw/keyboard_layout_french" />
<keyboard-layout android:name="keyboard_layout_french_ca"
android:label="@string/keyboard_layout_french_ca_label"
- android:kcm="@raw/keyboard_layout_french_ca" />
+ android:keyboardLayout="@raw/keyboard_layout_french_ca" />
<keyboard-layout android:name="keyboard_layout_russian"
android:label="@string/keyboard_layout_russian_label"
- android:kcm="@raw/keyboard_layout_russian" />
+ android:keyboardLayout="@raw/keyboard_layout_russian" />
<keyboard-layout android:name="keyboard_layout_russian_mac"
android:label="@string/keyboard_layout_russian_mac_label"
- android:kcm="@raw/keyboard_layout_russian_mac" />
+ android:keyboardLayout="@raw/keyboard_layout_russian_mac" />
<keyboard-layout android:name="keyboard_layout_spanish"
android:label="@string/keyboard_layout_spanish_label"
- android:kcm="@raw/keyboard_layout_spanish" />
+ android:keyboardLayout="@raw/keyboard_layout_spanish" />
<keyboard-layout android:name="keyboard_layout_swiss_french"
android:label="@string/keyboard_layout_swiss_french_label"
- android:kcm="@raw/keyboard_layout_swiss_french" />
+ android:keyboardLayout="@raw/keyboard_layout_swiss_french" />
<keyboard-layout android:name="keyboard_layout_swiss_german"
android:label="@string/keyboard_layout_swiss_german_label"
- android:kcm="@raw/keyboard_layout_swiss_german" />
+ android:keyboardLayout="@raw/keyboard_layout_swiss_german" />
<keyboard-layout android:name="keyboard_layout_belgian"
android:label="@string/keyboard_layout_belgian"
- android:kcm="@raw/keyboard_layout_belgian" />
+ android:keyboardLayout="@raw/keyboard_layout_belgian" />
<keyboard-layout android:name="keyboard_layout_bulgarian"
android:label="@string/keyboard_layout_bulgarian"
- android:kcm="@raw/keyboard_layout_bulgarian" />
+ android:keyboardLayout="@raw/keyboard_layout_bulgarian" />
<keyboard-layout android:name="keyboard_layout_italian"
android:label="@string/keyboard_layout_italian"
- android:kcm="@raw/keyboard_layout_italian" />
+ android:keyboardLayout="@raw/keyboard_layout_italian" />
<keyboard-layout android:name="keyboard_layout_danish"
android:label="@string/keyboard_layout_danish"
- android:kcm="@raw/keyboard_layout_danish" />
+ android:keyboardLayout="@raw/keyboard_layout_danish" />
<keyboard-layout android:name="keyboard_layout_norwegian"
android:label="@string/keyboard_layout_norwegian"
- android:kcm="@raw/keyboard_layout_norwegian" />
+ android:keyboardLayout="@raw/keyboard_layout_norwegian" />
<keyboard-layout android:name="keyboard_layout_swedish"
android:label="@string/keyboard_layout_swedish"
- android:kcm="@raw/keyboard_layout_swedish" />
+ android:keyboardLayout="@raw/keyboard_layout_swedish" />
<keyboard-layout android:name="keyboard_layout_finnish"
android:label="@string/keyboard_layout_finnish"
- android:kcm="@raw/keyboard_layout_finnish" />
+ android:keyboardLayout="@raw/keyboard_layout_finnish" />
<keyboard-layout android:name="keyboard_layout_croatian"
android:label="@string/keyboard_layout_croatian"
- android:kcm="@raw/keyboard_layout_croatian_and_slovenian" />
+ android:keyboardLayout="@raw/keyboard_layout_croatian_and_slovenian" />
<keyboard-layout android:name="keyboard_layout_czech"
android:label="@string/keyboard_layout_czech"
- android:kcm="@raw/keyboard_layout_czech" />
+ android:keyboardLayout="@raw/keyboard_layout_czech" />
<keyboard-layout android:name="keyboard_layout_estonian"
android:label="@string/keyboard_layout_estonian"
- android:kcm="@raw/keyboard_layout_estonian" />
+ android:keyboardLayout="@raw/keyboard_layout_estonian" />
<keyboard-layout android:name="keyboard_layout_hungarian"
android:label="@string/keyboard_layout_hungarian"
- android:kcm="@raw/keyboard_layout_hungarian" />
+ android:keyboardLayout="@raw/keyboard_layout_hungarian" />
<keyboard-layout android:name="keyboard_layout_icelandic"
android:label="@string/keyboard_layout_icelandic"
- android:kcm="@raw/keyboard_layout_icelandic" />
+ android:keyboardLayout="@raw/keyboard_layout_icelandic" />
<keyboard-layout android:name="keyboard_layout_portuguese"
android:label="@string/keyboard_layout_portuguese"
- android:kcm="@raw/keyboard_layout_portuguese" />
+ android:keyboardLayout="@raw/keyboard_layout_portuguese" />
<keyboard-layout android:name="keyboard_layout_slovak"
android:label="@string/keyboard_layout_slovak"
- android:kcm="@raw/keyboard_layout_slovak" />
+ android:keyboardLayout="@raw/keyboard_layout_slovak" />
<keyboard-layout android:name="keyboard_layout_slovenian"
android:label="@string/keyboard_layout_slovenian"
- android:kcm="@raw/keyboard_layout_croatian_and_slovenian" />
+ android:keyboardLayout="@raw/keyboard_layout_croatian_and_slovenian" />
<keyboard-layout android:name="keyboard_layout_turkish"
android:label="@string/keyboard_layout_turkish"
- android:kcm="@raw/keyboard_layout_turkish" />
+ android:keyboardLayout="@raw/keyboard_layout_turkish" />
<keyboard-layout android:name="keyboard_layout_ukrainian"
android:label="@string/keyboard_layout_ukrainian"
- android:kcm="@raw/keyboard_layout_ukrainian" />
+ android:keyboardLayout="@raw/keyboard_layout_ukrainian" />
</keyboard-layouts>
diff --git a/packages/SystemUI/AndroidManifest.xml b/packages/SystemUI/AndroidManifest.xml
index 9d3a942..0038d13 100644
--- a/packages/SystemUI/AndroidManifest.xml
+++ b/packages/SystemUI/AndroidManifest.xml
@@ -161,18 +161,19 @@
<!-- started from ... somewhere -->
<activity
- android:name=".Nyandroid"
+ android:name=".BeanBag"
android:exported="true"
- android:label="Nyandroid"
- android:icon="@drawable/nyandroid04"
- android:theme="@android:style/Theme.Black.NoTitleBar.Fullscreen"
+ android:label="BeanBag"
+ android:icon="@drawable/redbeandroid"
+ android:theme="@android:style/Theme.Wallpaper.NoTitleBar.Fullscreen"
android:hardwareAccelerated="true"
android:launchMode="singleInstance"
android:excludeFromRecents="true">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.DEFAULT" />
-<!-- <category android:name="android.intent.category.DREAM" />-->
+ <category android:name="com.android.internal.category.PLATLOGO" />
+<!-- <category android:name="android.intent.category.LAUNCHER" />-->
</intent-filter>
</activity>
</application>
diff --git a/packages/SystemUI/res/drawable-nodpi/jandycane.png b/packages/SystemUI/res/drawable-nodpi/jandycane.png
new file mode 100644
index 0000000..278cfec
--- /dev/null
+++ b/packages/SystemUI/res/drawable-nodpi/jandycane.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-nodpi/nyandroid00.png b/packages/SystemUI/res/drawable-nodpi/nyandroid00.png
deleted file mode 100644
index 6cea873..0000000
--- a/packages/SystemUI/res/drawable-nodpi/nyandroid00.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-nodpi/nyandroid01.png b/packages/SystemUI/res/drawable-nodpi/nyandroid01.png
deleted file mode 100644
index 82b8a21..0000000
--- a/packages/SystemUI/res/drawable-nodpi/nyandroid01.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-nodpi/nyandroid02.png b/packages/SystemUI/res/drawable-nodpi/nyandroid02.png
deleted file mode 100644
index fde0033..0000000
--- a/packages/SystemUI/res/drawable-nodpi/nyandroid02.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-nodpi/nyandroid03.png b/packages/SystemUI/res/drawable-nodpi/nyandroid03.png
deleted file mode 100644
index 54c5f46..0000000
--- a/packages/SystemUI/res/drawable-nodpi/nyandroid03.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-nodpi/nyandroid04.png b/packages/SystemUI/res/drawable-nodpi/nyandroid04.png
deleted file mode 100644
index 35e5ab5..0000000
--- a/packages/SystemUI/res/drawable-nodpi/nyandroid04.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-nodpi/nyandroid05.png b/packages/SystemUI/res/drawable-nodpi/nyandroid05.png
deleted file mode 100644
index d3eaace..0000000
--- a/packages/SystemUI/res/drawable-nodpi/nyandroid05.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-nodpi/nyandroid06.png b/packages/SystemUI/res/drawable-nodpi/nyandroid06.png
deleted file mode 100644
index 0e0d3b1..0000000
--- a/packages/SystemUI/res/drawable-nodpi/nyandroid06.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-nodpi/nyandroid07.png b/packages/SystemUI/res/drawable-nodpi/nyandroid07.png
deleted file mode 100644
index edb0b17..0000000
--- a/packages/SystemUI/res/drawable-nodpi/nyandroid07.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-nodpi/nyandroid08.png b/packages/SystemUI/res/drawable-nodpi/nyandroid08.png
deleted file mode 100644
index 10fc4f6..0000000
--- a/packages/SystemUI/res/drawable-nodpi/nyandroid08.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-nodpi/nyandroid09.png b/packages/SystemUI/res/drawable-nodpi/nyandroid09.png
deleted file mode 100644
index 57ade54..0000000
--- a/packages/SystemUI/res/drawable-nodpi/nyandroid09.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-nodpi/nyandroid10.png b/packages/SystemUI/res/drawable-nodpi/nyandroid10.png
deleted file mode 100644
index 36feb2f..0000000
--- a/packages/SystemUI/res/drawable-nodpi/nyandroid10.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-nodpi/nyandroid11.png b/packages/SystemUI/res/drawable-nodpi/nyandroid11.png
deleted file mode 100644
index 125935b..0000000
--- a/packages/SystemUI/res/drawable-nodpi/nyandroid11.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-nodpi/redbean0.png b/packages/SystemUI/res/drawable-nodpi/redbean0.png
new file mode 100644
index 0000000..b088939
--- /dev/null
+++ b/packages/SystemUI/res/drawable-nodpi/redbean0.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-nodpi/redbean1.png b/packages/SystemUI/res/drawable-nodpi/redbean1.png
new file mode 100644
index 0000000..8fc8d9d
--- /dev/null
+++ b/packages/SystemUI/res/drawable-nodpi/redbean1.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-nodpi/redbean2.png b/packages/SystemUI/res/drawable-nodpi/redbean2.png
new file mode 100644
index 0000000..ef11ca8
--- /dev/null
+++ b/packages/SystemUI/res/drawable-nodpi/redbean2.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-nodpi/redbeandroid.png b/packages/SystemUI/res/drawable-nodpi/redbeandroid.png
new file mode 100644
index 0000000..9aa3f82
--- /dev/null
+++ b/packages/SystemUI/res/drawable-nodpi/redbeandroid.png
Binary files differ
diff --git a/packages/SystemUI/res/drawable-nodpi/star0.png b/packages/SystemUI/res/drawable-nodpi/star0.png
deleted file mode 100644
index f2ca960..0000000
--- a/packages/SystemUI/res/drawable-nodpi/star0.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-nodpi/star1.png b/packages/SystemUI/res/drawable-nodpi/star1.png
deleted file mode 100644
index 69ef4da..0000000
--- a/packages/SystemUI/res/drawable-nodpi/star1.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-nodpi/star2.png b/packages/SystemUI/res/drawable-nodpi/star2.png
deleted file mode 100644
index b95968a..0000000
--- a/packages/SystemUI/res/drawable-nodpi/star2.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-nodpi/star3.png b/packages/SystemUI/res/drawable-nodpi/star3.png
deleted file mode 100644
index ad0f589..0000000
--- a/packages/SystemUI/res/drawable-nodpi/star3.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-nodpi/star4.png b/packages/SystemUI/res/drawable-nodpi/star4.png
deleted file mode 100644
index 934c45b..0000000
--- a/packages/SystemUI/res/drawable-nodpi/star4.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable-nodpi/star5.png b/packages/SystemUI/res/drawable-nodpi/star5.png
deleted file mode 100644
index 46a4435..0000000
--- a/packages/SystemUI/res/drawable-nodpi/star5.png
+++ /dev/null
Binary files differ
diff --git a/packages/SystemUI/res/drawable/nyandroid_anim.xml b/packages/SystemUI/res/drawable/nyandroid_anim.xml
deleted file mode 100644
index 855a0c2..0000000
--- a/packages/SystemUI/res/drawable/nyandroid_anim.xml
+++ /dev/null
@@ -1,32 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2011 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.
--->
-<animation-list
- xmlns:android="http://schemas.android.com/apk/res/android"
- android:oneshot="false">
- <item android:drawable="@drawable/nyandroid00" android:duration="80" />
- <item android:drawable="@drawable/nyandroid01" android:duration="80" />
- <item android:drawable="@drawable/nyandroid02" android:duration="80" />
- <item android:drawable="@drawable/nyandroid03" android:duration="80" />
- <item android:drawable="@drawable/nyandroid04" android:duration="80" />
- <item android:drawable="@drawable/nyandroid05" android:duration="80" />
- <item android:drawable="@drawable/nyandroid06" android:duration="80" />
- <item android:drawable="@drawable/nyandroid07" android:duration="80" />
- <item android:drawable="@drawable/nyandroid08" android:duration="80" />
- <item android:drawable="@drawable/nyandroid09" android:duration="80" />
- <item android:drawable="@drawable/nyandroid10" android:duration="80" />
- <item android:drawable="@drawable/nyandroid11" android:duration="80" />
-</animation-list>
-
diff --git a/packages/SystemUI/res/drawable/star_anim.xml b/packages/SystemUI/res/drawable/star_anim.xml
deleted file mode 100644
index d7f2d8f..0000000
--- a/packages/SystemUI/res/drawable/star_anim.xml
+++ /dev/null
@@ -1,26 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2011 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.
--->
-<animation-list
- xmlns:android="http://schemas.android.com/apk/res/android"
- android:oneshot="false">
- <item android:drawable="@drawable/star0" android:duration="200" />
- <item android:drawable="@drawable/star1" android:duration="200" />
- <item android:drawable="@drawable/star2" android:duration="200" />
- <item android:drawable="@drawable/star3" android:duration="200" />
- <item android:drawable="@drawable/star4" android:duration="200" />
- <item android:drawable="@drawable/star5" android:duration="200" />
-</animation-list>
-
diff --git a/packages/SystemUI/res/layout-land/status_bar_recent_panel.xml b/packages/SystemUI/res/layout-land/status_bar_recent_panel.xml
index ec2abe0..869b164 100644
--- a/packages/SystemUI/res/layout-land/status_bar_recent_panel.xml
+++ b/packages/SystemUI/res/layout-land/status_bar_recent_panel.xml
@@ -27,6 +27,12 @@
systemui:recentItemLayout="@layout/status_bar_recent_item"
>
+ <ImageView
+ android:id="@+id/recents_transition_placeholder_icon"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:visibility="invisible" />
+
<FrameLayout
android:id="@+id/recents_bg_protect"
android:background="@drawable/status_bar_recents_background"
diff --git a/packages/SystemUI/res/layout-port/status_bar_recent_panel.xml b/packages/SystemUI/res/layout-port/status_bar_recent_panel.xml
index 216dcb0..fc9fcf4 100644
--- a/packages/SystemUI/res/layout-port/status_bar_recent_panel.xml
+++ b/packages/SystemUI/res/layout-port/status_bar_recent_panel.xml
@@ -27,6 +27,12 @@
systemui:recentItemLayout="@layout/status_bar_recent_item"
>
+ <ImageView
+ android:id="@+id/recents_transition_placeholder_icon"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:visibility="invisible" />
+
<FrameLayout
android:id="@+id/recents_bg_protect"
android:background="@drawable/status_bar_recents_background"
diff --git a/packages/SystemUI/res/layout-sw600dp/status_bar_expanded_header.xml b/packages/SystemUI/res/layout-sw600dp/status_bar_expanded_header.xml
new file mode 100644
index 0000000..9b834d2
--- /dev/null
+++ b/packages/SystemUI/res/layout-sw600dp/status_bar_expanded_header.xml
@@ -0,0 +1,75 @@
+<?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.
+-->
+
+<LinearLayout
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:systemui="http://schemas.android.com/apk/res/com.android.systemui"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:paddingTop="@dimen/notification_panel_header_padding_top"
+ android:background="@drawable/notification_header_bg"
+ android:orientation="horizontal"
+ android:gravity="center_vertical"
+ android:baselineAligned="false"
+ >
+ <com.android.systemui.statusbar.policy.Clock
+ android:id="@+id/clock"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_marginLeft="8dp"
+ android:singleLine="true"
+ android:textAppearance="@style/TextAppearance.StatusBar.Expanded.Clock"
+ />
+
+ <com.android.systemui.statusbar.policy.DateView android:id="@+id/date"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_marginLeft="8dp"
+ android:layout_marginRight="8dp"
+ android:textAppearance="@style/TextAppearance.StatusBar.Expanded.Date"
+ />
+
+ <com.android.systemui.statusbar.RotationToggle android:id="@+id/rotation_lock_button"
+ android:layout_width="32dp"
+ android:layout_height="32dp"
+ android:layout_margin="8dp"
+ android:button="@drawable/ic_notify_rotation"
+ android:contentDescription="@string/accessibility_rotation_lock_off"
+ />
+
+ <ImageView android:id="@+id/settings_button"
+ android:layout_width="48dp"
+ android:layout_height="48dp"
+ android:scaleType="center"
+ android:src="@drawable/ic_notify_quicksettings"
+ android:contentDescription="@string/accessibility_settings_button"
+ />
+
+ <Space
+ android:layout_width="0dp"
+ android:layout_height="0dp"
+ android:layout_weight="1"
+ />
+
+ <ImageView android:id="@+id/clear_all_button"
+ android:layout_width="48dp"
+ android:layout_height="48dp"
+ android:scaleType="center"
+ android:src="@drawable/ic_notify_clear"
+ android:contentDescription="@string/accessibility_clear_all"
+ />
+</LinearLayout>
\ No newline at end of file
diff --git a/packages/SystemUI/res/layout-sw720dp/status_bar_search_panel.xml b/packages/SystemUI/res/layout-sw720dp/status_bar_search_panel.xml
index b4872c7..ac2472c 100644
--- a/packages/SystemUI/res/layout-sw720dp/status_bar_search_panel.xml
+++ b/packages/SystemUI/res/layout-sw720dp/status_bar_search_panel.xml
@@ -36,7 +36,8 @@
android:layout_width="wrap_content"
android:layout_height="@dimen/navbar_search_panel_height"
android:layout_alignParentBottom="true"
- android:layout_alignParentLeft="true">
+ android:layout_alignParentLeft="true"
+ android:layout_marginLeft="-120dip">
<View
android:layout_width="0dip"
diff --git a/packages/SystemUI/res/layout/signal_cluster_view.xml b/packages/SystemUI/res/layout/signal_cluster_view.xml
index 9be9041..66c64c4 100644
--- a/packages/SystemUI/res/layout/signal_cluster_view.xml
+++ b/packages/SystemUI/res/layout/signal_cluster_view.xml
@@ -105,4 +105,9 @@
/>
</FrameLayout>
</FrameLayout>
+ <ImageView
+ android:id="@+id/airplane"
+ android:layout_height="wrap_content"
+ android:layout_width="wrap_content"
+ />
</com.android.systemui.statusbar.SignalClusterView>
diff --git a/packages/SystemUI/res/layout/status_bar_expanded.xml b/packages/SystemUI/res/layout/status_bar_expanded.xml
index f69aac8..bc144bb 100644
--- a/packages/SystemUI/res/layout/status_bar_expanded.xml
+++ b/packages/SystemUI/res/layout/status_bar_expanded.xml
@@ -30,63 +30,11 @@
android:layout_marginLeft="@dimen/notification_panel_margin_left"
>
- <LinearLayout
+ <include layout="@layout/status_bar_expanded_header"
android:layout_width="match_parent"
android:layout_height="wrap_content"
- android:paddingTop="@dimen/notification_panel_header_padding_top"
- android:background="@drawable/notification_header_bg"
- android:orientation="horizontal"
- android:gravity="center_vertical"
- android:baselineAligned="false"
- >
- <com.android.systemui.statusbar.policy.Clock
- android:id="@+id/clock"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_marginLeft="8dp"
- android:singleLine="true"
- android:textAppearance="@style/TextAppearance.StatusBar.Expanded.Clock"
- />
-
- <com.android.systemui.statusbar.policy.DateView android:id="@+id/date"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_marginLeft="8dp"
- android:layout_marginRight="8dp"
- android:textAppearance="@style/TextAppearance.StatusBar.Expanded.Date"
- />
-
- <com.android.systemui.statusbar.RotationToggle android:id="@+id/rotation_lock_button"
- android:layout_width="32dp"
- android:layout_height="32dp"
- android:layout_margin="8dp"
- android:button="@drawable/ic_notify_rotation"
- android:contentDescription="@string/accessibility_rotation_lock_off"
- />
-
- <ImageView android:id="@+id/settings_button"
- android:layout_width="48dp"
- android:layout_height="48dp"
- android:scaleType="center"
- android:src="@drawable/ic_notify_quicksettings"
- android:contentDescription="@string/accessibility_settings_button"
- />
-
- <Space
- android:layout_width="0dp"
- android:layout_height="0dp"
- android:layout_weight="1"
- />
-
- <ImageView android:id="@+id/clear_all_button"
- android:layout_width="48dp"
- android:layout_height="48dp"
- android:scaleType="center"
- android:src="@drawable/ic_notify_clear"
- android:contentDescription="@string/accessibility_clear_all"
- />
- </LinearLayout>
-
+ />
+
<ScrollView
android:id="@+id/scroll"
android:layout_width="match_parent"
diff --git a/packages/SystemUI/res/layout/status_bar_expanded_header.xml b/packages/SystemUI/res/layout/status_bar_expanded_header.xml
new file mode 100644
index 0000000..893d422
--- /dev/null
+++ b/packages/SystemUI/res/layout/status_bar_expanded_header.xml
@@ -0,0 +1,67 @@
+<?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.
+-->
+
+<LinearLayout
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:systemui="http://schemas.android.com/apk/res/com.android.systemui"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:paddingTop="@dimen/notification_panel_header_padding_top"
+ android:background="@drawable/notification_header_bg"
+ android:orientation="horizontal"
+ android:gravity="center_vertical"
+ android:baselineAligned="false"
+ >
+ <com.android.systemui.statusbar.policy.Clock
+ android:id="@+id/clock"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_marginLeft="8dp"
+ android:singleLine="true"
+ android:textAppearance="@style/TextAppearance.StatusBar.Expanded.Clock"
+ />
+
+ <com.android.systemui.statusbar.policy.DateView android:id="@+id/date"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_marginLeft="8dp"
+ android:layout_marginRight="8dp"
+ android:textAppearance="@style/TextAppearance.StatusBar.Expanded.Date"
+ />
+
+ <ImageView android:id="@+id/settings_button"
+ android:layout_width="48dp"
+ android:layout_height="48dp"
+ android:scaleType="center"
+ android:src="@drawable/ic_notify_quicksettings"
+ android:contentDescription="@string/accessibility_settings_button"
+ />
+
+ <Space
+ android:layout_width="0dp"
+ android:layout_height="0dp"
+ android:layout_weight="1"
+ />
+
+ <ImageView android:id="@+id/clear_all_button"
+ android:layout_width="48dp"
+ android:layout_height="48dp"
+ android:scaleType="center"
+ android:src="@drawable/ic_notify_clear"
+ android:contentDescription="@string/accessibility_clear_all"
+ />
+</LinearLayout>
\ No newline at end of file
diff --git a/packages/SystemUI/res/layout/system_bar_recent_panel.xml b/packages/SystemUI/res/layout/system_bar_recent_panel.xml
index c2b9e51..d5745c8 100644
--- a/packages/SystemUI/res/layout/system_bar_recent_panel.xml
+++ b/packages/SystemUI/res/layout/system_bar_recent_panel.xml
@@ -39,6 +39,12 @@
android:clipToPadding="false"
android:clipChildren="false">
+ <ImageView
+ android:id="@+id/recents_transition_placeholder_icon"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:visibility="invisible" />
+
<com.android.systemui.recent.RecentsVerticalScrollView android:id="@+id/recents_container"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
diff --git a/packages/SystemUI/res/values-af/strings.xml b/packages/SystemUI/res/values-af/strings.xml
index ae520f9..a24a4d7 100644
--- a/packages/SystemUI/res/values-af/strings.xml
+++ b/packages/SystemUI/res/values-af/strings.xml
@@ -140,14 +140,9 @@
<string name="accessibility_clear_all" msgid="5235938559247164925">"Verwyder alle kennisgewings."</string>
<string name="dreams_dock_launcher" msgid="3541196417659166245">"Aktiveer sluimerskerm"</string>
<string name="status_bar_notification_inspect_item_title" msgid="1163547729015390250">"Programinligting"</string>
- <!-- no translation found for notifications_off_title (8936620513608443224) -->
- <skip />
- <!-- no translation found for notifications_off_text (2529001315769385273) -->
- <skip />
- <!-- no translation found for accessibility_rotation_lock_off (4062780228931590069) -->
- <skip />
- <!-- no translation found for accessibility_rotation_lock_on_landscape (6731197337665366273) -->
- <skip />
- <!-- no translation found for accessibility_rotation_lock_on_portrait (5809367521644012115) -->
- <skip />
+ <string name="notifications_off_title" msgid="8936620513608443224">"Kennisgewings af"</string>
+ <string name="notifications_off_text" msgid="2529001315769385273">"Tik hier om kennisgewings weer aan te skakel."</string>
+ <string name="accessibility_rotation_lock_off" msgid="4062780228931590069">"Die skerm sal outomaties draai."</string>
+ <string name="accessibility_rotation_lock_on_landscape" msgid="6731197337665366273">"Skerm is in landskapsoriëntasie gesluit."</string>
+ <string name="accessibility_rotation_lock_on_portrait" msgid="5809367521644012115">"Skerm is in portretoriëntasie gesluit."</string>
</resources>
diff --git a/packages/SystemUI/res/values-am/strings.xml b/packages/SystemUI/res/values-am/strings.xml
index d7f4287..7c2956c 100644
--- a/packages/SystemUI/res/values-am/strings.xml
+++ b/packages/SystemUI/res/values-am/strings.xml
@@ -140,14 +140,9 @@
<string name="accessibility_clear_all" msgid="5235938559247164925">"ሁሉንም ማሳወቂያዎች አጽዳ"</string>
<string name="dreams_dock_launcher" msgid="3541196417659166245">" ገፁማያ ማቆያ አንቃ"</string>
<string name="status_bar_notification_inspect_item_title" msgid="1163547729015390250">"የመተግበሪያ መረጃ"</string>
- <!-- no translation found for notifications_off_title (8936620513608443224) -->
- <skip />
- <!-- no translation found for notifications_off_text (2529001315769385273) -->
- <skip />
- <!-- no translation found for accessibility_rotation_lock_off (4062780228931590069) -->
- <skip />
- <!-- no translation found for accessibility_rotation_lock_on_landscape (6731197337665366273) -->
- <skip />
- <!-- no translation found for accessibility_rotation_lock_on_portrait (5809367521644012115) -->
- <skip />
+ <string name="notifications_off_title" msgid="8936620513608443224">"ማሳወቂያዎች ጠፍተዋል"</string>
+ <string name="notifications_off_text" msgid="2529001315769385273">"ማስታወቅያዎችን መልሶ ለማብራት እዚህ ጋር መታ አድርግ።"</string>
+ <string name="accessibility_rotation_lock_off" msgid="4062780228931590069">"ማያ ገጽ በራስ ሰር ይዞራል።"</string>
+ <string name="accessibility_rotation_lock_on_landscape" msgid="6731197337665366273">"ማያ ገጽ በወርድ ገፅ አቀማመጥ ተቆልፏል።"</string>
+ <string name="accessibility_rotation_lock_on_portrait" msgid="5809367521644012115">"ማያ ገጽ በቁም ገፅ አቀማመጥ ተቆልፏል።"</string>
</resources>
diff --git a/packages/SystemUI/res/values-ar/strings.xml b/packages/SystemUI/res/values-ar/strings.xml
index b9144a2..b2c9ab0 100644
--- a/packages/SystemUI/res/values-ar/strings.xml
+++ b/packages/SystemUI/res/values-ar/strings.xml
@@ -142,10 +142,7 @@
<string name="status_bar_notification_inspect_item_title" msgid="1163547729015390250">"معلومات التطبيق"</string>
<string name="notifications_off_title" msgid="8936620513608443224">"التنبيهات معطّلة"</string>
<string name="notifications_off_text" msgid="2529001315769385273">"انقر هنا لإعادة تشغيل الإشعارات."</string>
- <!-- no translation found for accessibility_rotation_lock_off (4062780228931590069) -->
- <skip />
- <!-- no translation found for accessibility_rotation_lock_on_landscape (6731197337665366273) -->
- <skip />
- <!-- no translation found for accessibility_rotation_lock_on_portrait (5809367521644012115) -->
- <skip />
+ <string name="accessibility_rotation_lock_off" msgid="4062780228931590069">"سيتم تدوير الشاشة تلقائيًا."</string>
+ <string name="accessibility_rotation_lock_on_landscape" msgid="6731197337665366273">"تم تأمين الشاشة في الاتجاه الأفقي."</string>
+ <string name="accessibility_rotation_lock_on_portrait" msgid="5809367521644012115">"تم تأمين الشاشة في الاتجاه العمودي."</string>
</resources>
diff --git a/packages/SystemUI/res/values-be/strings.xml b/packages/SystemUI/res/values-be/strings.xml
index 525137f..c4af8d8 100644
--- a/packages/SystemUI/res/values-be/strings.xml
+++ b/packages/SystemUI/res/values-be/strings.xml
@@ -142,14 +142,9 @@
<string name="accessibility_clear_all" msgid="5235938559247164925">"Выдалiць усе апавяшчэннi."</string>
<string name="dreams_dock_launcher" msgid="3541196417659166245">"Актывацыя экраннай застаўкі"</string>
<string name="status_bar_notification_inspect_item_title" msgid="1163547729015390250">"Інфармацыя пра прыкладанне"</string>
- <!-- no translation found for notifications_off_title (8936620513608443224) -->
- <skip />
- <!-- no translation found for notifications_off_text (2529001315769385273) -->
- <skip />
- <!-- no translation found for accessibility_rotation_lock_off (4062780228931590069) -->
- <skip />
- <!-- no translation found for accessibility_rotation_lock_on_landscape (6731197337665366273) -->
- <skip />
- <!-- no translation found for accessibility_rotation_lock_on_portrait (5809367521644012115) -->
- <skip />
+ <string name="notifications_off_title" msgid="8936620513608443224">"Паведамленні адключаны"</string>
+ <string name="notifications_off_text" msgid="2529001315769385273">"Націсніце тут, каб зноў уключыць апавяшчэнні."</string>
+ <string name="accessibility_rotation_lock_off" msgid="4062780228931590069">"Экран паварочваецца аўтаматычна."</string>
+ <string name="accessibility_rotation_lock_on_landscape" msgid="6731197337665366273">"Экран заблакiраваны ў альбомнай арыентацыі."</string>
+ <string name="accessibility_rotation_lock_on_portrait" msgid="5809367521644012115">"Экран заблакiраваны ў партрэтнай арыентацыі."</string>
</resources>
diff --git a/packages/SystemUI/res/values-bg/strings.xml b/packages/SystemUI/res/values-bg/strings.xml
index 52ee9e1..a4a0e78 100644
--- a/packages/SystemUI/res/values-bg/strings.xml
+++ b/packages/SystemUI/res/values-bg/strings.xml
@@ -140,14 +140,9 @@
<string name="accessibility_clear_all" msgid="5235938559247164925">"Изчистване на всички известия."</string>
<string name="dreams_dock_launcher" msgid="3541196417659166245">"Активиране на скрийнсейвъра"</string>
<string name="status_bar_notification_inspect_item_title" msgid="1163547729015390250">"Информация за приложението"</string>
- <!-- no translation found for notifications_off_title (8936620513608443224) -->
- <skip />
- <!-- no translation found for notifications_off_text (2529001315769385273) -->
- <skip />
- <!-- no translation found for accessibility_rotation_lock_off (4062780228931590069) -->
- <skip />
- <!-- no translation found for accessibility_rotation_lock_on_landscape (6731197337665366273) -->
- <skip />
- <!-- no translation found for accessibility_rotation_lock_on_portrait (5809367521644012115) -->
- <skip />
+ <string name="notifications_off_title" msgid="8936620513608443224">"Известията са изключени"</string>
+ <string name="notifications_off_text" msgid="2529001315769385273">"Докоснете тук, за да включите отново известията."</string>
+ <string name="accessibility_rotation_lock_off" msgid="4062780228931590069">"Екранът ще се завърта автоматично."</string>
+ <string name="accessibility_rotation_lock_on_landscape" msgid="6731197337665366273">"Екранът е заключен в хоризонтална ориентация."</string>
+ <string name="accessibility_rotation_lock_on_portrait" msgid="5809367521644012115">"Екранът е заключен във вертикална ориентация."</string>
</resources>
diff --git a/packages/SystemUI/res/values-cs/strings.xml b/packages/SystemUI/res/values-cs/strings.xml
index 1647358..c41cf6f 100644
--- a/packages/SystemUI/res/values-cs/strings.xml
+++ b/packages/SystemUI/res/values-cs/strings.xml
@@ -142,14 +142,9 @@
<string name="accessibility_clear_all" msgid="5235938559247164925">"Vymazat všechna oznámení."</string>
<string name="dreams_dock_launcher" msgid="3541196417659166245">"Aktivovat spořič obrazovky"</string>
<string name="status_bar_notification_inspect_item_title" msgid="1163547729015390250">"Informace o aplikaci"</string>
- <!-- no translation found for notifications_off_title (8936620513608443224) -->
- <skip />
- <!-- no translation found for notifications_off_text (2529001315769385273) -->
- <skip />
- <!-- no translation found for accessibility_rotation_lock_off (4062780228931590069) -->
- <skip />
- <!-- no translation found for accessibility_rotation_lock_on_landscape (6731197337665366273) -->
- <skip />
- <!-- no translation found for accessibility_rotation_lock_on_portrait (5809367521644012115) -->
- <skip />
+ <string name="notifications_off_title" msgid="8936620513608443224">"Oznámení jsou vypnuta"</string>
+ <string name="notifications_off_text" msgid="2529001315769385273">"Chcete-li oznámení znovu zapnout, klepněte sem."</string>
+ <string name="accessibility_rotation_lock_off" msgid="4062780228931590069">"Obrazovka se automaticky otočí."</string>
+ <string name="accessibility_rotation_lock_on_landscape" msgid="6731197337665366273">"Obrazovka je uzamčena v orientaci na šířku."</string>
+ <string name="accessibility_rotation_lock_on_portrait" msgid="5809367521644012115">"Obrazovka je uzamčena v orientaci na výšku."</string>
</resources>
diff --git a/packages/SystemUI/res/values-da/strings.xml b/packages/SystemUI/res/values-da/strings.xml
index ab68e80..612ab6a 100644
--- a/packages/SystemUI/res/values-da/strings.xml
+++ b/packages/SystemUI/res/values-da/strings.xml
@@ -140,10 +140,8 @@
<string name="accessibility_clear_all" msgid="5235938559247164925">"Ryd alle meddelelser."</string>
<string name="dreams_dock_launcher" msgid="3541196417659166245">"Aktiver pauseskærm"</string>
<string name="status_bar_notification_inspect_item_title" msgid="1163547729015390250">"Oplysninger om appen"</string>
- <!-- no translation found for notifications_off_title (8936620513608443224) -->
- <skip />
- <!-- no translation found for notifications_off_text (2529001315769385273) -->
- <skip />
+ <string name="notifications_off_title" msgid="8936620513608443224">"Underretninger slået fra"</string>
+ <string name="notifications_off_text" msgid="2529001315769385273">"Tryk her for at slå underretninger til igen."</string>
<string name="accessibility_rotation_lock_off" msgid="4062780228931590069">"Skærmen roterer automatisk."</string>
<string name="accessibility_rotation_lock_on_landscape" msgid="6731197337665366273">"Skærmen er nu låst i liggende retning."</string>
<string name="accessibility_rotation_lock_on_portrait" msgid="5809367521644012115">"Skærmen er nu låst i stående retning."</string>
diff --git a/packages/SystemUI/res/values-de/strings.xml b/packages/SystemUI/res/values-de/strings.xml
index 2b62397..b7dcb14 100644
--- a/packages/SystemUI/res/values-de/strings.xml
+++ b/packages/SystemUI/res/values-de/strings.xml
@@ -66,7 +66,7 @@
<string name="screenshot_saving_title" msgid="8242282144535555697">"Screenshot wird gespeichert..."</string>
<string name="screenshot_saving_text" msgid="2419718443411738818">"Screenshot wird gespeichert..."</string>
<string name="screenshot_saved_title" msgid="6461865960961414961">"Screenshot aufgenommen"</string>
- <string name="screenshot_saved_text" msgid="1152839647677558815">"Zum Anzeigen Ihres Screenshots berühren"</string>
+ <string name="screenshot_saved_text" msgid="1152839647677558815">"Zum Anzeigen des Screenshots berühren"</string>
<string name="screenshot_failed_title" msgid="705781116746922771">"Screenshot konnte nicht aufgenommen werden."</string>
<string name="screenshot_failed_text" msgid="8134011269572415402">"Screenshot konnte nicht gespeichert werden. Eventuell wird der Speicher gerade verwendet."</string>
<string name="usb_preference_title" msgid="6551050377388882787">"USB-Dateiübertragungsoptionen"</string>
@@ -142,10 +142,8 @@
<string name="accessibility_clear_all" msgid="5235938559247164925">"Alle Benachrichtigungen löschen"</string>
<string name="dreams_dock_launcher" msgid="3541196417659166245">"Bildschirmschoner aktivieren"</string>
<string name="status_bar_notification_inspect_item_title" msgid="1163547729015390250">"App-Details"</string>
- <!-- no translation found for notifications_off_title (8936620513608443224) -->
- <skip />
- <!-- no translation found for notifications_off_text (2529001315769385273) -->
- <skip />
+ <string name="notifications_off_title" msgid="8936620513608443224">"Benachrichtigungen aus"</string>
+ <string name="notifications_off_text" msgid="2529001315769385273">"Tippen Sie hier, um die Benachrichtigungen wieder zu aktivieren."</string>
<string name="accessibility_rotation_lock_off" msgid="4062780228931590069">"Bildschirm wird automatisch gedreht."</string>
<string name="accessibility_rotation_lock_on_landscape" msgid="6731197337665366273">"Bildschirm bleibt im Querformat."</string>
<string name="accessibility_rotation_lock_on_portrait" msgid="5809367521644012115">"Bildschirm bleibt im Hochformat."</string>
diff --git a/packages/SystemUI/res/values-es-rUS/strings.xml b/packages/SystemUI/res/values-es-rUS/strings.xml
index b103d58..b4e0d8a 100644
--- a/packages/SystemUI/res/values-es-rUS/strings.xml
+++ b/packages/SystemUI/res/values-es-rUS/strings.xml
@@ -142,10 +142,8 @@
<string name="accessibility_clear_all" msgid="5235938559247164925">"Eliminar todas las notificaciones"</string>
<string name="dreams_dock_launcher" msgid="3541196417659166245">"Activar el protector de pantalla"</string>
<string name="status_bar_notification_inspect_item_title" msgid="1163547729015390250">"Información de la aplicación"</string>
- <!-- no translation found for notifications_off_title (8936620513608443224) -->
- <skip />
- <!-- no translation found for notifications_off_text (2529001315769385273) -->
- <skip />
+ <string name="notifications_off_title" msgid="8936620513608443224">"Notificaciones desactivadas"</string>
+ <string name="notifications_off_text" msgid="2529001315769385273">"Toca aquí para volver a activar las notificaciones."</string>
<!-- no translation found for accessibility_rotation_lock_off (4062780228931590069) -->
<skip />
<!-- no translation found for accessibility_rotation_lock_on_landscape (6731197337665366273) -->
diff --git a/packages/SystemUI/res/values-et/strings.xml b/packages/SystemUI/res/values-et/strings.xml
index 1ad5358..318ed04 100644
--- a/packages/SystemUI/res/values-et/strings.xml
+++ b/packages/SystemUI/res/values-et/strings.xml
@@ -140,14 +140,9 @@
<string name="accessibility_clear_all" msgid="5235938559247164925">"Kustuta kõik teatised."</string>
<string name="dreams_dock_launcher" msgid="3541196417659166245">"Aktiveeri ekraanisäästja"</string>
<string name="status_bar_notification_inspect_item_title" msgid="1163547729015390250">"Rakenduse teave"</string>
- <!-- no translation found for notifications_off_title (8936620513608443224) -->
- <skip />
- <!-- no translation found for notifications_off_text (2529001315769385273) -->
- <skip />
- <!-- no translation found for accessibility_rotation_lock_off (4062780228931590069) -->
- <skip />
- <!-- no translation found for accessibility_rotation_lock_on_landscape (6731197337665366273) -->
- <skip />
- <!-- no translation found for accessibility_rotation_lock_on_portrait (5809367521644012115) -->
- <skip />
+ <string name="notifications_off_title" msgid="8936620513608443224">"Teatised väljas"</string>
+ <string name="notifications_off_text" msgid="2529001315769385273">"Teatiste uuesti sisselülitamiseks puudutage siin."</string>
+ <string name="accessibility_rotation_lock_off" msgid="4062780228931590069">"Ekraani pööramine toimub automaatselt."</string>
+ <string name="accessibility_rotation_lock_on_landscape" msgid="6731197337665366273">"Ekraan on lukustatud horisontaalsuunas."</string>
+ <string name="accessibility_rotation_lock_on_portrait" msgid="5809367521644012115">"Ekraan on lukustatud vertikaalsuunas."</string>
</resources>
diff --git a/packages/SystemUI/res/values-fa/strings.xml b/packages/SystemUI/res/values-fa/strings.xml
index 8097367..0c1ba2d 100644
--- a/packages/SystemUI/res/values-fa/strings.xml
+++ b/packages/SystemUI/res/values-fa/strings.xml
@@ -142,10 +142,7 @@
<string name="status_bar_notification_inspect_item_title" msgid="1163547729015390250">"اطلاعات برنامه"</string>
<string name="notifications_off_title" msgid="8936620513608443224">"اعلانها خاموش"</string>
<string name="notifications_off_text" msgid="2529001315769385273">"برای روشن کردن مجدد اعلانها، اینجا را ضربه بزنید."</string>
- <!-- no translation found for accessibility_rotation_lock_off (4062780228931590069) -->
- <skip />
- <!-- no translation found for accessibility_rotation_lock_on_landscape (6731197337665366273) -->
- <skip />
- <!-- no translation found for accessibility_rotation_lock_on_portrait (5809367521644012115) -->
- <skip />
+ <string name="accessibility_rotation_lock_off" msgid="4062780228931590069">"صفحه به صورت خودکار میچرخد."</string>
+ <string name="accessibility_rotation_lock_on_landscape" msgid="6731197337665366273">"صفحه اکنون در جهت افقی قفل است."</string>
+ <string name="accessibility_rotation_lock_on_portrait" msgid="5809367521644012115">"صفحه اکنون در جهت عمودی قفل است."</string>
</resources>
diff --git a/packages/SystemUI/res/values-fi/strings.xml b/packages/SystemUI/res/values-fi/strings.xml
index 6345555..a4229b4 100644
--- a/packages/SystemUI/res/values-fi/strings.xml
+++ b/packages/SystemUI/res/values-fi/strings.xml
@@ -140,14 +140,9 @@
<string name="accessibility_clear_all" msgid="5235938559247164925">"Tyhjennä kaikki ilmoitukset."</string>
<string name="dreams_dock_launcher" msgid="3541196417659166245">"Ota näytönsäästäjä käyttöön"</string>
<string name="status_bar_notification_inspect_item_title" msgid="1163547729015390250">"Sovelluksen tiedot"</string>
- <!-- no translation found for notifications_off_title (8936620513608443224) -->
- <skip />
- <!-- no translation found for notifications_off_text (2529001315769385273) -->
- <skip />
- <!-- no translation found for accessibility_rotation_lock_off (4062780228931590069) -->
- <skip />
- <!-- no translation found for accessibility_rotation_lock_on_landscape (6731197337665366273) -->
- <skip />
- <!-- no translation found for accessibility_rotation_lock_on_portrait (5809367521644012115) -->
- <skip />
+ <string name="notifications_off_title" msgid="8936620513608443224">"Ilmoitukset pois käytöstä"</string>
+ <string name="notifications_off_text" msgid="2529001315769385273">"Ota ilmoitukset uudelleen käyttöön napauttamalla tätä."</string>
+ <string name="accessibility_rotation_lock_off" msgid="4062780228931590069">"Ruutu kääntyy automaattisesti."</string>
+ <string name="accessibility_rotation_lock_on_landscape" msgid="6731197337665366273">"Ruutu on lukittu vaakasuuntaan."</string>
+ <string name="accessibility_rotation_lock_on_portrait" msgid="5809367521644012115">"Ruutu on lukittu pystysuuntaan."</string>
</resources>
diff --git a/packages/SystemUI/res/values-fr/strings.xml b/packages/SystemUI/res/values-fr/strings.xml
index 4b3e1d4..30b3539 100644
--- a/packages/SystemUI/res/values-fr/strings.xml
+++ b/packages/SystemUI/res/values-fr/strings.xml
@@ -142,10 +142,8 @@
<string name="accessibility_clear_all" msgid="5235938559247164925">"Supprimer toutes les notifications"</string>
<string name="dreams_dock_launcher" msgid="3541196417659166245">"Activer l\'économiseur d\'écran"</string>
<string name="status_bar_notification_inspect_item_title" msgid="1163547729015390250">"Informations sur l\'application"</string>
- <!-- no translation found for notifications_off_title (8936620513608443224) -->
- <skip />
- <!-- no translation found for notifications_off_text (2529001315769385273) -->
- <skip />
+ <string name="notifications_off_title" msgid="8936620513608443224">"Notifications désactivées"</string>
+ <string name="notifications_off_text" msgid="2529001315769385273">"Appuyez ici pour réactiver les notifications."</string>
<string name="accessibility_rotation_lock_off" msgid="4062780228931590069">"L\'écran pivote automatiquement."</string>
<string name="accessibility_rotation_lock_on_landscape" msgid="6731197337665366273">"L\'écran est verrouillé en mode paysage."</string>
<string name="accessibility_rotation_lock_on_portrait" msgid="5809367521644012115">"L\'écran est verrouillé en mode portrait."</string>
diff --git a/packages/SystemUI/res/values-hi/strings.xml b/packages/SystemUI/res/values-hi/strings.xml
index 2e5ae61..46adfd7 100644
--- a/packages/SystemUI/res/values-hi/strings.xml
+++ b/packages/SystemUI/res/values-hi/strings.xml
@@ -140,14 +140,9 @@
<string name="accessibility_clear_all" msgid="5235938559247164925">"सभी सूचनाएं साफ़ करें."</string>
<string name="dreams_dock_launcher" msgid="3541196417659166245">"स्क्रीन सेवर सक्रिय करें"</string>
<string name="status_bar_notification_inspect_item_title" msgid="1163547729015390250">"एप्लिकेशन जानकारी"</string>
- <!-- no translation found for notifications_off_title (8936620513608443224) -->
- <skip />
- <!-- no translation found for notifications_off_text (2529001315769385273) -->
- <skip />
- <!-- no translation found for accessibility_rotation_lock_off (4062780228931590069) -->
- <skip />
- <!-- no translation found for accessibility_rotation_lock_on_landscape (6731197337665366273) -->
- <skip />
- <!-- no translation found for accessibility_rotation_lock_on_portrait (5809367521644012115) -->
- <skip />
+ <string name="notifications_off_title" msgid="8936620513608443224">"सूचनाएं बंद"</string>
+ <string name="notifications_off_text" msgid="2529001315769385273">"सूचनाओं को पुन: चालू करने के लिए यहां टैप करें."</string>
+ <string name="accessibility_rotation_lock_off" msgid="4062780228931590069">"स्क्रीन स्वचालित रूप से घूमेगी."</string>
+ <string name="accessibility_rotation_lock_on_landscape" msgid="6731197337665366273">"स्क्रीन लैंडस्केप अभिविन्यास में लॉक है."</string>
+ <string name="accessibility_rotation_lock_on_portrait" msgid="5809367521644012115">"स्क्रीन पोर्ट्रेट अभिविन्यास में लॉक है."</string>
</resources>
diff --git a/packages/SystemUI/res/values-hr/strings.xml b/packages/SystemUI/res/values-hr/strings.xml
index df155dd..4a1f35a 100644
--- a/packages/SystemUI/res/values-hr/strings.xml
+++ b/packages/SystemUI/res/values-hr/strings.xml
@@ -140,14 +140,9 @@
<string name="accessibility_clear_all" msgid="5235938559247164925">"Brisanje svih obavijesti."</string>
<string name="dreams_dock_launcher" msgid="3541196417659166245">"Aktivirajte čuvar zaslona"</string>
<string name="status_bar_notification_inspect_item_title" msgid="1163547729015390250">"Informacije o aplikaciji"</string>
- <!-- no translation found for notifications_off_title (8936620513608443224) -->
- <skip />
- <!-- no translation found for notifications_off_text (2529001315769385273) -->
- <skip />
- <!-- no translation found for accessibility_rotation_lock_off (4062780228931590069) -->
- <skip />
- <!-- no translation found for accessibility_rotation_lock_on_landscape (6731197337665366273) -->
- <skip />
- <!-- no translation found for accessibility_rotation_lock_on_portrait (5809367521644012115) -->
- <skip />
+ <string name="notifications_off_title" msgid="8936620513608443224">"Obavijesti isključene"</string>
+ <string name="notifications_off_text" msgid="2529001315769385273">"Dotaknite ovdje da biste ponovo uključili obavijesti."</string>
+ <string name="accessibility_rotation_lock_off" msgid="4062780228931590069">"Zaslon će se automatski zakrenuti."</string>
+ <string name="accessibility_rotation_lock_on_landscape" msgid="6731197337665366273">"Zaslon je zaključan u pejzažnoj orijentaciji."</string>
+ <string name="accessibility_rotation_lock_on_portrait" msgid="5809367521644012115">"Zaslon je zaključan u portretnoj orijentaciji."</string>
</resources>
diff --git a/packages/SystemUI/res/values-hu/strings.xml b/packages/SystemUI/res/values-hu/strings.xml
index 6526c63..2ea0f76 100644
--- a/packages/SystemUI/res/values-hu/strings.xml
+++ b/packages/SystemUI/res/values-hu/strings.xml
@@ -140,14 +140,9 @@
<string name="accessibility_clear_all" msgid="5235938559247164925">"Minden értesítés törlése"</string>
<string name="dreams_dock_launcher" msgid="3541196417659166245">"Képernyővédő aktiválása"</string>
<string name="status_bar_notification_inspect_item_title" msgid="1163547729015390250">"Alkalmazásinformáció"</string>
- <!-- no translation found for notifications_off_title (8936620513608443224) -->
- <skip />
- <!-- no translation found for notifications_off_text (2529001315769385273) -->
- <skip />
- <!-- no translation found for accessibility_rotation_lock_off (4062780228931590069) -->
- <skip />
- <!-- no translation found for accessibility_rotation_lock_on_landscape (6731197337665366273) -->
- <skip />
- <!-- no translation found for accessibility_rotation_lock_on_portrait (5809367521644012115) -->
- <skip />
+ <string name="notifications_off_title" msgid="8936620513608443224">"Értesítések kikapcsolva"</string>
+ <string name="notifications_off_text" msgid="2529001315769385273">"Itt érintse meg az értesítések bekapcsolásához."</string>
+ <string name="accessibility_rotation_lock_off" msgid="4062780228931590069">"A képernyő automatikusan forogni fog."</string>
+ <string name="accessibility_rotation_lock_on_landscape" msgid="6731197337665366273">"A képernyő zárolva van fekvő tájolásban."</string>
+ <string name="accessibility_rotation_lock_on_portrait" msgid="5809367521644012115">"A képernyő zárolva van álló tájolásban."</string>
</resources>
diff --git a/packages/SystemUI/res/values-in/strings.xml b/packages/SystemUI/res/values-in/strings.xml
index 4571066..a117252 100644
--- a/packages/SystemUI/res/values-in/strings.xml
+++ b/packages/SystemUI/res/values-in/strings.xml
@@ -140,14 +140,10 @@
<string name="accessibility_clear_all" msgid="5235938559247164925">"Menghapus semua pemberitahuan."</string>
<string name="dreams_dock_launcher" msgid="3541196417659166245">"Aktifkan tirai layar"</string>
<string name="status_bar_notification_inspect_item_title" msgid="1163547729015390250">"Info aplikasi"</string>
- <!-- no translation found for notifications_off_title (8936620513608443224) -->
- <skip />
+ <string name="notifications_off_title" msgid="8936620513608443224">"Pemberitahuan mati"</string>
<!-- no translation found for notifications_off_text (2529001315769385273) -->
<skip />
- <!-- no translation found for accessibility_rotation_lock_off (4062780228931590069) -->
- <skip />
- <!-- no translation found for accessibility_rotation_lock_on_landscape (6731197337665366273) -->
- <skip />
- <!-- no translation found for accessibility_rotation_lock_on_portrait (5809367521644012115) -->
- <skip />
+ <string name="accessibility_rotation_lock_off" msgid="4062780228931590069">"Layar akan diputar secara otomatis."</string>
+ <string name="accessibility_rotation_lock_on_landscape" msgid="6731197337665366273">"Layar dikunci dalam orientasi lanskap."</string>
+ <string name="accessibility_rotation_lock_on_portrait" msgid="5809367521644012115">"Layar dikunci dalam orientasi potret."</string>
</resources>
diff --git a/packages/SystemUI/res/values-ja/strings.xml b/packages/SystemUI/res/values-ja/strings.xml
index 3912b539..eb493b2 100644
--- a/packages/SystemUI/res/values-ja/strings.xml
+++ b/packages/SystemUI/res/values-ja/strings.xml
@@ -146,10 +146,7 @@
<skip />
<!-- no translation found for notifications_off_text (2529001315769385273) -->
<skip />
- <!-- no translation found for accessibility_rotation_lock_off (4062780228931590069) -->
- <skip />
- <!-- no translation found for accessibility_rotation_lock_on_landscape (6731197337665366273) -->
- <skip />
- <!-- no translation found for accessibility_rotation_lock_on_portrait (5809367521644012115) -->
- <skip />
+ <string name="accessibility_rotation_lock_off" msgid="4062780228931590069">"画面は自動的に回転します。"</string>
+ <string name="accessibility_rotation_lock_on_landscape" msgid="6731197337665366273">"画面は横向きにロックされています。"</string>
+ <string name="accessibility_rotation_lock_on_portrait" msgid="5809367521644012115">"画面は縦向きにロックされています。"</string>
</resources>
diff --git a/packages/SystemUI/res/values-ko/strings.xml b/packages/SystemUI/res/values-ko/strings.xml
index 438cc0d..e54b06c 100644
--- a/packages/SystemUI/res/values-ko/strings.xml
+++ b/packages/SystemUI/res/values-ko/strings.xml
@@ -140,14 +140,9 @@
<string name="accessibility_clear_all" msgid="5235938559247164925">"모든 알림 지우기"</string>
<string name="dreams_dock_launcher" msgid="3541196417659166245">"스크린 세이버 활성화"</string>
<string name="status_bar_notification_inspect_item_title" msgid="1163547729015390250">"앱 정보"</string>
- <!-- no translation found for notifications_off_title (8936620513608443224) -->
- <skip />
- <!-- no translation found for notifications_off_text (2529001315769385273) -->
- <skip />
- <!-- no translation found for accessibility_rotation_lock_off (4062780228931590069) -->
- <skip />
- <!-- no translation found for accessibility_rotation_lock_on_landscape (6731197337665366273) -->
- <skip />
- <!-- no translation found for accessibility_rotation_lock_on_portrait (5809367521644012115) -->
- <skip />
+ <string name="notifications_off_title" msgid="8936620513608443224">"알림 사용 안함"</string>
+ <string name="notifications_off_text" msgid="2529001315769385273">"알림을 다시 사용하려면 여기를 터치하세요."</string>
+ <string name="accessibility_rotation_lock_off" msgid="4062780228931590069">"화면이 자동으로 회전됩니다."</string>
+ <string name="accessibility_rotation_lock_on_landscape" msgid="6731197337665366273">"화면이 가로 방향으로 잠겨 있습니다."</string>
+ <string name="accessibility_rotation_lock_on_portrait" msgid="5809367521644012115">"화면이 세로 방향으로 잠겨 있습니다."</string>
</resources>
diff --git a/packages/SystemUI/res/values-lt/strings.xml b/packages/SystemUI/res/values-lt/strings.xml
index 6810d7f..a242640 100644
--- a/packages/SystemUI/res/values-lt/strings.xml
+++ b/packages/SystemUI/res/values-lt/strings.xml
@@ -140,10 +140,8 @@
<string name="accessibility_clear_all" msgid="5235938559247164925">"Išvalyti visus pranešimus."</string>
<string name="dreams_dock_launcher" msgid="3541196417659166245">"Aktyvinti ekrano užsklandą"</string>
<string name="status_bar_notification_inspect_item_title" msgid="1163547729015390250">"Programos informacija"</string>
- <!-- no translation found for notifications_off_title (8936620513608443224) -->
- <skip />
- <!-- no translation found for notifications_off_text (2529001315769385273) -->
- <skip />
+ <string name="notifications_off_title" msgid="8936620513608443224">"Pranešimai išjungti"</string>
+ <string name="notifications_off_text" msgid="2529001315769385273">"Jei norite vėl įjungti pranešimus, palieskite čia."</string>
<!-- no translation found for accessibility_rotation_lock_off (4062780228931590069) -->
<skip />
<!-- no translation found for accessibility_rotation_lock_on_landscape (6731197337665366273) -->
diff --git a/packages/SystemUI/res/values-lv/strings.xml b/packages/SystemUI/res/values-lv/strings.xml
index bf59477..3c2e193 100644
--- a/packages/SystemUI/res/values-lv/strings.xml
+++ b/packages/SystemUI/res/values-lv/strings.xml
@@ -140,10 +140,8 @@
<string name="accessibility_clear_all" msgid="5235938559247164925">"Notīrīt visus paziņojumus"</string>
<string name="dreams_dock_launcher" msgid="3541196417659166245">"Aktivizēt ekrānsaudzētāju"</string>
<string name="status_bar_notification_inspect_item_title" msgid="1163547729015390250">"Informācija par lietotni"</string>
- <!-- no translation found for notifications_off_title (8936620513608443224) -->
- <skip />
- <!-- no translation found for notifications_off_text (2529001315769385273) -->
- <skip />
+ <string name="notifications_off_title" msgid="8936620513608443224">"Paziņojumi ir izslēgti"</string>
+ <string name="notifications_off_text" msgid="2529001315769385273">"Pieskarieties šeit, lai atkal ieslēgtu paziņojumus."</string>
<!-- no translation found for accessibility_rotation_lock_off (4062780228931590069) -->
<skip />
<!-- no translation found for accessibility_rotation_lock_on_landscape (6731197337665366273) -->
diff --git a/packages/SystemUI/res/values-ms/strings.xml b/packages/SystemUI/res/values-ms/strings.xml
index b77df60..3265cd5 100644
--- a/packages/SystemUI/res/values-ms/strings.xml
+++ b/packages/SystemUI/res/values-ms/strings.xml
@@ -140,14 +140,9 @@
<string name="accessibility_clear_all" msgid="5235938559247164925">"Padamkan semua pemberitahuan."</string>
<string name="dreams_dock_launcher" msgid="3541196417659166245">"Aktifkan gambar skrin"</string>
<string name="status_bar_notification_inspect_item_title" msgid="1163547729015390250">"Maklumat apl"</string>
- <!-- no translation found for notifications_off_title (8936620513608443224) -->
- <skip />
- <!-- no translation found for notifications_off_text (2529001315769385273) -->
- <skip />
- <!-- no translation found for accessibility_rotation_lock_off (4062780228931590069) -->
- <skip />
- <!-- no translation found for accessibility_rotation_lock_on_landscape (6731197337665366273) -->
- <skip />
- <!-- no translation found for accessibility_rotation_lock_on_portrait (5809367521644012115) -->
- <skip />
+ <string name="notifications_off_title" msgid="8936620513608443224">"Pemberitahuan dimatikan"</string>
+ <string name="notifications_off_text" msgid="2529001315769385273">"Ketik di sini untuk menghidupkan kembali pemberitahuan."</string>
+ <string name="accessibility_rotation_lock_off" msgid="4062780228931590069">"Skrin akan berputar secara automatik."</string>
+ <string name="accessibility_rotation_lock_on_landscape" msgid="6731197337665366273">"Skrin dikunci dalam orientasi landskap."</string>
+ <string name="accessibility_rotation_lock_on_portrait" msgid="5809367521644012115">"Skrin dikunci dalam orientasi potret."</string>
</resources>
diff --git a/packages/SystemUI/res/values-nb/strings.xml b/packages/SystemUI/res/values-nb/strings.xml
index b416095..2a9c1c8 100644
--- a/packages/SystemUI/res/values-nb/strings.xml
+++ b/packages/SystemUI/res/values-nb/strings.xml
@@ -144,10 +144,7 @@
<skip />
<!-- no translation found for notifications_off_text (2529001315769385273) -->
<skip />
- <!-- no translation found for accessibility_rotation_lock_off (4062780228931590069) -->
- <skip />
- <!-- no translation found for accessibility_rotation_lock_on_landscape (6731197337665366273) -->
- <skip />
- <!-- no translation found for accessibility_rotation_lock_on_portrait (5809367521644012115) -->
- <skip />
+ <string name="accessibility_rotation_lock_off" msgid="4062780228931590069">"Skjermen roterer automatisk."</string>
+ <string name="accessibility_rotation_lock_on_landscape" msgid="6731197337665366273">"Skjermen er låst i liggende retning."</string>
+ <string name="accessibility_rotation_lock_on_portrait" msgid="5809367521644012115">"Skjermen er låst i stående retning."</string>
</resources>
diff --git a/packages/SystemUI/res/values-pl/strings.xml b/packages/SystemUI/res/values-pl/strings.xml
index 3dab389..b01345e 100644
--- a/packages/SystemUI/res/values-pl/strings.xml
+++ b/packages/SystemUI/res/values-pl/strings.xml
@@ -144,10 +144,7 @@
<skip />
<!-- no translation found for notifications_off_text (2529001315769385273) -->
<skip />
- <!-- no translation found for accessibility_rotation_lock_off (4062780228931590069) -->
- <skip />
- <!-- no translation found for accessibility_rotation_lock_on_landscape (6731197337665366273) -->
- <skip />
- <!-- no translation found for accessibility_rotation_lock_on_portrait (5809367521644012115) -->
- <skip />
+ <string name="accessibility_rotation_lock_off" msgid="4062780228931590069">"Ekran zostanie obrócony automatycznie."</string>
+ <string name="accessibility_rotation_lock_on_landscape" msgid="6731197337665366273">"Ekran jest zablokowany w orientacji poziomej."</string>
+ <string name="accessibility_rotation_lock_on_portrait" msgid="5809367521644012115">"Ekran jest zablokowany w orientacji pionowej."</string>
</resources>
diff --git a/packages/SystemUI/res/values-pt-rPT/strings.xml b/packages/SystemUI/res/values-pt-rPT/strings.xml
index 30950ba..77ed068 100644
--- a/packages/SystemUI/res/values-pt-rPT/strings.xml
+++ b/packages/SystemUI/res/values-pt-rPT/strings.xml
@@ -140,10 +140,8 @@
<string name="accessibility_clear_all" msgid="5235938559247164925">"Limpar todas as notificações."</string>
<string name="dreams_dock_launcher" msgid="3541196417659166245">"Ativar proteção de ecrã"</string>
<string name="status_bar_notification_inspect_item_title" msgid="1163547729015390250">"Informações da aplicação"</string>
- <!-- no translation found for notifications_off_title (8936620513608443224) -->
- <skip />
- <!-- no translation found for notifications_off_text (2529001315769385273) -->
- <skip />
+ <string name="notifications_off_title" msgid="8936620513608443224">"Notificações desativadas"</string>
+ <string name="notifications_off_text" msgid="2529001315769385273">"Toque aqui para voltar a ativar as notificações."</string>
<!-- no translation found for accessibility_rotation_lock_off (4062780228931590069) -->
<skip />
<!-- no translation found for accessibility_rotation_lock_on_landscape (6731197337665366273) -->
diff --git a/packages/SystemUI/res/values-pt/strings.xml b/packages/SystemUI/res/values-pt/strings.xml
index a66a649..f074d22 100644
--- a/packages/SystemUI/res/values-pt/strings.xml
+++ b/packages/SystemUI/res/values-pt/strings.xml
@@ -142,14 +142,9 @@
<string name="accessibility_clear_all" msgid="5235938559247164925">"Limpar todas as notificações."</string>
<string name="dreams_dock_launcher" msgid="3541196417659166245">"Ativar proteção de tela"</string>
<string name="status_bar_notification_inspect_item_title" msgid="1163547729015390250">"Informações do aplicativo"</string>
- <!-- no translation found for notifications_off_title (8936620513608443224) -->
- <skip />
- <!-- no translation found for notifications_off_text (2529001315769385273) -->
- <skip />
- <!-- no translation found for accessibility_rotation_lock_off (4062780228931590069) -->
- <skip />
- <!-- no translation found for accessibility_rotation_lock_on_landscape (6731197337665366273) -->
- <skip />
- <!-- no translation found for accessibility_rotation_lock_on_portrait (5809367521644012115) -->
- <skip />
+ <string name="notifications_off_title" msgid="8936620513608443224">"Notificações desativadas"</string>
+ <string name="notifications_off_text" msgid="2529001315769385273">"Toque aqui para ativar as notificações novamente."</string>
+ <string name="accessibility_rotation_lock_off" msgid="4062780228931590069">"A tela girará automaticamente."</string>
+ <string name="accessibility_rotation_lock_on_landscape" msgid="6731197337665366273">"A tela está bloqueada na orientação paisagem."</string>
+ <string name="accessibility_rotation_lock_on_portrait" msgid="5809367521644012115">"A tela está bloqueada na orientação retrato."</string>
</resources>
diff --git a/packages/SystemUI/res/values-ro/strings.xml b/packages/SystemUI/res/values-ro/strings.xml
index 2896eae..4750ac5 100644
--- a/packages/SystemUI/res/values-ro/strings.xml
+++ b/packages/SystemUI/res/values-ro/strings.xml
@@ -144,10 +144,7 @@
<skip />
<!-- no translation found for notifications_off_text (2529001315769385273) -->
<skip />
- <!-- no translation found for accessibility_rotation_lock_off (4062780228931590069) -->
- <skip />
- <!-- no translation found for accessibility_rotation_lock_on_landscape (6731197337665366273) -->
- <skip />
- <!-- no translation found for accessibility_rotation_lock_on_portrait (5809367521644012115) -->
- <skip />
+ <string name="accessibility_rotation_lock_off" msgid="4062780228931590069">"Ecranul se va roti în mod automat."</string>
+ <string name="accessibility_rotation_lock_on_landscape" msgid="6731197337665366273">"Ecranul este blocat în orientarea de tip peisaj."</string>
+ <string name="accessibility_rotation_lock_on_portrait" msgid="5809367521644012115">"Ecranul este blocat în orientarea de tip portret."</string>
</resources>
diff --git a/packages/SystemUI/res/values-ru/strings.xml b/packages/SystemUI/res/values-ru/strings.xml
index f2d056d..7ca04e6 100644
--- a/packages/SystemUI/res/values-ru/strings.xml
+++ b/packages/SystemUI/res/values-ru/strings.xml
@@ -142,14 +142,9 @@
<string name="accessibility_clear_all" msgid="5235938559247164925">"Удалить все уведомления"</string>
<string name="dreams_dock_launcher" msgid="3541196417659166245">"Активация заставки экрана"</string>
<string name="status_bar_notification_inspect_item_title" msgid="1163547729015390250">"О приложении"</string>
- <!-- no translation found for notifications_off_title (8936620513608443224) -->
- <skip />
- <!-- no translation found for notifications_off_text (2529001315769385273) -->
- <skip />
- <!-- no translation found for accessibility_rotation_lock_off (4062780228931590069) -->
- <skip />
- <!-- no translation found for accessibility_rotation_lock_on_landscape (6731197337665366273) -->
- <skip />
- <!-- no translation found for accessibility_rotation_lock_on_portrait (5809367521644012115) -->
- <skip />
+ <string name="notifications_off_title" msgid="8936620513608443224">"Уведомления отключены"</string>
+ <string name="notifications_off_text" msgid="2529001315769385273">"Нажмите здесь, чтобы снова включить уведомления."</string>
+ <string name="accessibility_rotation_lock_off" msgid="4062780228931590069">"Экран будет поворачиваться автоматически."</string>
+ <string name="accessibility_rotation_lock_on_landscape" msgid="6731197337665366273">"Выбрана только альбомная ориентация экрана."</string>
+ <string name="accessibility_rotation_lock_on_portrait" msgid="5809367521644012115">"Выбрана только книжная ориентация экрана."</string>
</resources>
diff --git a/packages/SystemUI/res/values-sk/strings.xml b/packages/SystemUI/res/values-sk/strings.xml
index 64494b8..8e64487 100644
--- a/packages/SystemUI/res/values-sk/strings.xml
+++ b/packages/SystemUI/res/values-sk/strings.xml
@@ -142,14 +142,9 @@
<string name="accessibility_clear_all" msgid="5235938559247164925">"Vymazať všetky upozornenia."</string>
<string name="dreams_dock_launcher" msgid="3541196417659166245">"Aktivovať šetrič obrazovky"</string>
<string name="status_bar_notification_inspect_item_title" msgid="1163547729015390250">"Informácie o aplikácii"</string>
- <!-- no translation found for notifications_off_title (8936620513608443224) -->
- <skip />
- <!-- no translation found for notifications_off_text (2529001315769385273) -->
- <skip />
- <!-- no translation found for accessibility_rotation_lock_off (4062780228931590069) -->
- <skip />
- <!-- no translation found for accessibility_rotation_lock_on_landscape (6731197337665366273) -->
- <skip />
- <!-- no translation found for accessibility_rotation_lock_on_portrait (5809367521644012115) -->
- <skip />
+ <string name="notifications_off_title" msgid="8936620513608443224">"Upozornenia sú vypnuté"</string>
+ <string name="notifications_off_text" msgid="2529001315769385273">"Klepnutím sem upozornenia znova povolíte."</string>
+ <string name="accessibility_rotation_lock_off" msgid="4062780228931590069">"Obrazovka sa automaticky otočí."</string>
+ <string name="accessibility_rotation_lock_on_landscape" msgid="6731197337665366273">"Obrazovka je uzamknutá v orientácii na šírku."</string>
+ <string name="accessibility_rotation_lock_on_portrait" msgid="5809367521644012115">"Obrazovka je uzamknutá v orientácii na výšku."</string>
</resources>
diff --git a/packages/SystemUI/res/values-sl/strings.xml b/packages/SystemUI/res/values-sl/strings.xml
index 73befa6..5026d6d 100644
--- a/packages/SystemUI/res/values-sl/strings.xml
+++ b/packages/SystemUI/res/values-sl/strings.xml
@@ -140,14 +140,9 @@
<string name="accessibility_clear_all" msgid="5235938559247164925">"Izbriši vsa obvestila."</string>
<string name="dreams_dock_launcher" msgid="3541196417659166245">"Vklop ohranjevalnika zaslona"</string>
<string name="status_bar_notification_inspect_item_title" msgid="1163547729015390250">"Podatki o aplikaciji"</string>
- <!-- no translation found for notifications_off_title (8936620513608443224) -->
- <skip />
- <!-- no translation found for notifications_off_text (2529001315769385273) -->
- <skip />
- <!-- no translation found for accessibility_rotation_lock_off (4062780228931590069) -->
- <skip />
- <!-- no translation found for accessibility_rotation_lock_on_landscape (6731197337665366273) -->
- <skip />
- <!-- no translation found for accessibility_rotation_lock_on_portrait (5809367521644012115) -->
- <skip />
+ <string name="notifications_off_title" msgid="8936620513608443224">"Obvestila so izklopljena"</string>
+ <string name="notifications_off_text" msgid="2529001315769385273">"Dotaknite se tukaj, da spet vklopite obvestila."</string>
+ <string name="accessibility_rotation_lock_off" msgid="4062780228931590069">"Zaslon se bo samodejno zasukal."</string>
+ <string name="accessibility_rotation_lock_on_landscape" msgid="6731197337665366273">"Zaslon je zaklenjen v ležeči usmerjenosti."</string>
+ <string name="accessibility_rotation_lock_on_portrait" msgid="5809367521644012115">"Zaslon je zaklenjen v pokončni usmerjenosti."</string>
</resources>
diff --git a/packages/SystemUI/res/values-sr/strings.xml b/packages/SystemUI/res/values-sr/strings.xml
index 6b475d3..5f523a2 100644
--- a/packages/SystemUI/res/values-sr/strings.xml
+++ b/packages/SystemUI/res/values-sr/strings.xml
@@ -144,10 +144,7 @@
<skip />
<!-- no translation found for notifications_off_text (2529001315769385273) -->
<skip />
- <!-- no translation found for accessibility_rotation_lock_off (4062780228931590069) -->
- <skip />
- <!-- no translation found for accessibility_rotation_lock_on_landscape (6731197337665366273) -->
- <skip />
- <!-- no translation found for accessibility_rotation_lock_on_portrait (5809367521644012115) -->
- <skip />
+ <string name="accessibility_rotation_lock_off" msgid="4062780228931590069">"Екран ће се аутоматски ротирати."</string>
+ <string name="accessibility_rotation_lock_on_landscape" msgid="6731197337665366273">"Екран је закључан у хоризонталном положају."</string>
+ <string name="accessibility_rotation_lock_on_portrait" msgid="5809367521644012115">"Екран је закључан у вертикалном положају."</string>
</resources>
diff --git a/packages/SystemUI/res/values-tl/strings.xml b/packages/SystemUI/res/values-tl/strings.xml
index f20f6af..e1c4185 100644
--- a/packages/SystemUI/res/values-tl/strings.xml
+++ b/packages/SystemUI/res/values-tl/strings.xml
@@ -140,14 +140,9 @@
<string name="accessibility_clear_all" msgid="5235938559247164925">"I-clear ang lahat ng notification."</string>
<string name="dreams_dock_launcher" msgid="3541196417659166245">"I-activate ang screen saver"</string>
<string name="status_bar_notification_inspect_item_title" msgid="1163547729015390250">"Impormasyon ng app"</string>
- <!-- no translation found for notifications_off_title (8936620513608443224) -->
- <skip />
- <!-- no translation found for notifications_off_text (2529001315769385273) -->
- <skip />
- <!-- no translation found for accessibility_rotation_lock_off (4062780228931590069) -->
- <skip />
- <!-- no translation found for accessibility_rotation_lock_on_landscape (6731197337665366273) -->
- <skip />
- <!-- no translation found for accessibility_rotation_lock_on_portrait (5809367521644012115) -->
- <skip />
+ <string name="notifications_off_title" msgid="8936620513608443224">"Naka-off ang mga notification"</string>
+ <string name="notifications_off_text" msgid="2529001315769385273">"Tumapik dito upang muling i-on ang mga notification."</string>
+ <string name="accessibility_rotation_lock_off" msgid="4062780228931590069">"Awtomatikong iikot ang screen."</string>
+ <string name="accessibility_rotation_lock_on_landscape" msgid="6731197337665366273">"Naka-lock ang screen sa pahigang oryentasyon."</string>
+ <string name="accessibility_rotation_lock_on_portrait" msgid="5809367521644012115">"Naka-lock ang screen sa patayong oryentasyon."</string>
</resources>
diff --git a/packages/SystemUI/res/values-uk/strings.xml b/packages/SystemUI/res/values-uk/strings.xml
index 6494fc8..165baae 100644
--- a/packages/SystemUI/res/values-uk/strings.xml
+++ b/packages/SystemUI/res/values-uk/strings.xml
@@ -140,14 +140,9 @@
<string name="accessibility_clear_all" msgid="5235938559247164925">"Очистити всі сповіщення."</string>
<string name="dreams_dock_launcher" msgid="3541196417659166245">"Активувати заставку"</string>
<string name="status_bar_notification_inspect_item_title" msgid="1163547729015390250">"Інформація про програму"</string>
- <!-- no translation found for notifications_off_title (8936620513608443224) -->
- <skip />
- <!-- no translation found for notifications_off_text (2529001315769385273) -->
- <skip />
- <!-- no translation found for accessibility_rotation_lock_off (4062780228931590069) -->
- <skip />
- <!-- no translation found for accessibility_rotation_lock_on_landscape (6731197337665366273) -->
- <skip />
- <!-- no translation found for accessibility_rotation_lock_on_portrait (5809367521644012115) -->
- <skip />
+ <string name="notifications_off_title" msgid="8936620513608443224">"Сповіщення вимкнено"</string>
+ <string name="notifications_off_text" msgid="2529001315769385273">"Торкніться тут, щоб знову ввімкнути сповіщення."</string>
+ <string name="accessibility_rotation_lock_off" msgid="4062780228931590069">"Екран обертатиметься автоматично."</string>
+ <string name="accessibility_rotation_lock_on_landscape" msgid="6731197337665366273">"Екран заблоковано в альбомній орієнтації."</string>
+ <string name="accessibility_rotation_lock_on_portrait" msgid="5809367521644012115">"Екран заблоковано в книжковій орієнтації."</string>
</resources>
diff --git a/packages/SystemUI/res/values-zh-rCN/strings.xml b/packages/SystemUI/res/values-zh-rCN/strings.xml
index b45251f..007ee96 100644
--- a/packages/SystemUI/res/values-zh-rCN/strings.xml
+++ b/packages/SystemUI/res/values-zh-rCN/strings.xml
@@ -142,14 +142,9 @@
<string name="accessibility_clear_all" msgid="5235938559247164925">"清除所有通知。"</string>
<string name="dreams_dock_launcher" msgid="3541196417659166245">"激活屏幕保护程序"</string>
<string name="status_bar_notification_inspect_item_title" msgid="1163547729015390250">"应用信息"</string>
- <!-- no translation found for notifications_off_title (8936620513608443224) -->
- <skip />
- <!-- no translation found for notifications_off_text (2529001315769385273) -->
- <skip />
- <!-- no translation found for accessibility_rotation_lock_off (4062780228931590069) -->
- <skip />
- <!-- no translation found for accessibility_rotation_lock_on_landscape (6731197337665366273) -->
- <skip />
- <!-- no translation found for accessibility_rotation_lock_on_portrait (5809367521644012115) -->
- <skip />
+ <string name="notifications_off_title" msgid="8936620513608443224">"通知功能已停用"</string>
+ <string name="notifications_off_text" msgid="2529001315769385273">"点按此处可重新启用通知功能。"</string>
+ <string name="accessibility_rotation_lock_off" msgid="4062780228931590069">"屏幕会自动旋转。"</string>
+ <string name="accessibility_rotation_lock_on_landscape" msgid="6731197337665366273">"屏幕锁定为横向浏览模式。"</string>
+ <string name="accessibility_rotation_lock_on_portrait" msgid="5809367521644012115">"屏幕已锁定为纵向浏览模式。"</string>
</resources>
diff --git a/packages/SystemUI/res/values-zh-rTW/strings.xml b/packages/SystemUI/res/values-zh-rTW/strings.xml
index 66c834f..8fa4af9 100644
--- a/packages/SystemUI/res/values-zh-rTW/strings.xml
+++ b/packages/SystemUI/res/values-zh-rTW/strings.xml
@@ -142,14 +142,9 @@
<string name="accessibility_clear_all" msgid="5235938559247164925">"清除所有通知。"</string>
<string name="dreams_dock_launcher" msgid="3541196417659166245">"啟用螢幕保護程式"</string>
<string name="status_bar_notification_inspect_item_title" msgid="1163547729015390250">"應用程式資訊"</string>
- <!-- no translation found for notifications_off_title (8936620513608443224) -->
- <skip />
- <!-- no translation found for notifications_off_text (2529001315769385273) -->
- <skip />
- <!-- no translation found for accessibility_rotation_lock_off (4062780228931590069) -->
- <skip />
- <!-- no translation found for accessibility_rotation_lock_on_landscape (6731197337665366273) -->
- <skip />
- <!-- no translation found for accessibility_rotation_lock_on_portrait (5809367521644012115) -->
- <skip />
+ <string name="notifications_off_title" msgid="8936620513608443224">"關閉通知"</string>
+ <string name="notifications_off_text" msgid="2529001315769385273">"輕按這裡即可重新開啟通知。"</string>
+ <string name="accessibility_rotation_lock_off" msgid="4062780228931590069">"螢幕會自動旋轉。"</string>
+ <string name="accessibility_rotation_lock_on_landscape" msgid="6731197337665366273">"螢幕已鎖定為橫向模式。"</string>
+ <string name="accessibility_rotation_lock_on_portrait" msgid="5809367521644012115">"螢幕已鎖定為垂直模式。"</string>
</resources>
diff --git a/packages/SystemUI/res/values-zu/strings.xml b/packages/SystemUI/res/values-zu/strings.xml
index 78b2779..8293d99 100644
--- a/packages/SystemUI/res/values-zu/strings.xml
+++ b/packages/SystemUI/res/values-zu/strings.xml
@@ -142,10 +142,7 @@
<string name="status_bar_notification_inspect_item_title" msgid="1163547729015390250">"Ulwazi lohlelo lokusebenza"</string>
<string name="notifications_off_title" msgid="8936620513608443224">"Izaziso zivaliwe"</string>
<string name="notifications_off_text" msgid="2529001315769385273">"Thepha lapha ukuvula futhi izaziso."</string>
- <!-- no translation found for accessibility_rotation_lock_off (4062780228931590069) -->
- <skip />
- <!-- no translation found for accessibility_rotation_lock_on_landscape (6731197337665366273) -->
- <skip />
- <!-- no translation found for accessibility_rotation_lock_on_portrait (5809367521644012115) -->
- <skip />
+ <string name="accessibility_rotation_lock_off" msgid="4062780228931590069">"Isikrini sizophenduka ngokuzanzakalela."</string>
+ <string name="accessibility_rotation_lock_on_landscape" msgid="6731197337665366273">"Isikrini sikhiyelwe ngomumo we-landscape."</string>
+ <string name="accessibility_rotation_lock_on_portrait" msgid="5809367521644012115">"Isikrini sikhiyelwe ngomumo we-portrait."</string>
</resources>
diff --git a/packages/SystemUI/res/values/dimens.xml b/packages/SystemUI/res/values/dimens.xml
index 2ff0e00..21e5fd7 100644
--- a/packages/SystemUI/res/values/dimens.xml
+++ b/packages/SystemUI/res/values/dimens.xml
@@ -58,9 +58,8 @@
<!-- Height of a small notification in the status bar plus glow, padding, etc -->
<dimen name="notification_min_height">72dp</dimen>
- <!-- Height of a small notification in the status bar -->
- <!-- TODO: change this back to 256dp once we deal with actions. -->
- <dimen name="notification_max_height">320dp</dimen>
+ <!-- Height of a large notification in the status bar -->
+ <dimen name="notification_max_height">256dp</dimen>
<!-- size at which Notification icons will be drawn in the status bar -->
<dimen name="status_bar_icon_drawing_size">18dip</dimen>
diff --git a/packages/SystemUI/res/values/ids.xml b/packages/SystemUI/res/values/ids.xml
index 2a4c5fd..8ebbc52 100644
--- a/packages/SystemUI/res/values/ids.xml
+++ b/packages/SystemUI/res/values/ids.xml
@@ -17,4 +17,5 @@
<resources>
<item type="id" name="expandable_tag" />
+ <item type="id" name="user_expanded_tag" />
</resources>
diff --git a/packages/SystemUI/src/com/android/systemui/BeanBag.java b/packages/SystemUI/src/com/android/systemui/BeanBag.java
new file mode 100644
index 0000000..e4f00d6
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/BeanBag.java
@@ -0,0 +1,439 @@
+/*);
+ * Copyright (C) 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.
+ */
+
+package com.android.systemui;
+
+import android.animation.AnimatorSet;
+import android.animation.PropertyValuesHolder;
+import android.animation.ObjectAnimator;
+import android.animation.TimeAnimator;
+import android.app.Activity;
+import android.content.ComponentName;
+import android.content.Context;
+import android.content.Intent;
+import android.graphics.drawable.AnimationDrawable;
+import android.graphics.drawable.BitmapDrawable;
+import android.graphics.Bitmap;
+import android.graphics.Canvas;
+import android.graphics.Color;
+import android.graphics.ColorMatrix;
+import android.graphics.ColorMatrixColorFilter;
+import android.graphics.Matrix;
+import android.graphics.Paint;
+import android.graphics.Point;
+import android.graphics.PorterDuffColorFilter;
+import android.graphics.PorterDuffXfermode;
+import android.graphics.Rect;
+import android.graphics.RectF;
+import android.os.Handler;
+import android.os.SystemClock;
+import android.util.AttributeSet;
+import android.util.DisplayMetrics;
+import android.util.Pair;
+import android.view.Gravity;
+import android.view.MotionEvent;
+import android.view.View;
+import android.view.ViewGroup;
+import android.view.WindowManager;
+import android.view.animation.AnimationUtils;
+import android.widget.FrameLayout;
+import android.widget.ImageView;
+import java.util.HashMap;
+import java.util.Random;
+
+public class BeanBag extends Activity {
+ final static boolean DEBUG = false;
+
+ public static class Board extends FrameLayout
+ {
+ static Random sRNG = new Random();
+
+ static float lerp(float a, float b, float f) {
+ return (b-a)*f + a;
+ }
+
+ static float randfrange(float a, float b) {
+ return lerp(a, b, sRNG.nextFloat());
+ }
+
+ static int randsign() {
+ return sRNG.nextBoolean() ? 1 : -1;
+ }
+
+ static boolean flip() {
+ return sRNG.nextBoolean();
+ }
+
+ static float mag(float x, float y) {
+ return (float) Math.sqrt(x*x+y*y);
+ }
+
+ static float dot(float x1, float y1, float x2, float y2) {
+ return x1*x2+y1+y2;
+ }
+
+ static <E> E pick(E[] array) {
+ if (array.length == 0) return null;
+ return array[sRNG.nextInt(array.length)];
+ }
+
+ static int pickInt(int[] array) {
+ if (array.length == 0) return 0;
+ return array[sRNG.nextInt(array.length)];
+ }
+
+ static int NUM_BEANS = 40;
+ static float MIN_SCALE = 0.2f;
+ static float MAX_SCALE = 1f;
+
+ static float LUCKY = 0.001f;
+
+ static int MAX_RADIUS = (int)(576 * MAX_SCALE);
+
+ static int BEANS[] = {
+ R.drawable.redbean0,
+ R.drawable.redbean0,
+ R.drawable.redbean0,
+ R.drawable.redbean0,
+ R.drawable.redbean1,
+ R.drawable.redbean1,
+ R.drawable.redbean2,
+ R.drawable.redbean2,
+ R.drawable.redbeandroid,
+ };
+
+ static int COLORS[] = {
+ 0xFF00CC00,
+ 0xFFCC0000,
+ 0xFF0000CC,
+ 0xFFFFFF00,
+ 0xFFFF8000,
+ 0xFF00CCFF,
+ 0xFFFF0080,
+ 0xFF8000FF,
+ 0xFFFF8080,
+ 0xFF8080FF,
+ 0xFFB0C0D0,
+ 0xFFDDDDDD,
+ 0xFF333333,
+ };
+
+ public class Bean extends ImageView {
+ public static final float VMAX = 1000.0f;
+ public static final float VMIN = 100.0f;
+
+ public float x, y, a;
+
+ public float va;
+ public float vx, vy;
+
+ public float r;
+
+ public float z;
+
+ public int h,w;
+
+ public boolean grabbed;
+ public float grabx, graby;
+ public long grabtime;
+
+ public Bean(Context context, AttributeSet as) {
+ super(context, as);
+ }
+
+ public String toString() {
+ return String.format("<bean (%.1f, %.1f) (%d x %d)>",
+ getX(), getY(), getWidth(), getHeight());
+ }
+
+ private void pickBean() {
+ int beanId = pickInt(BEANS);
+ if (randfrange(0,1) <= LUCKY) {
+ beanId = R.drawable.jandycane;
+ }
+ BitmapDrawable bean = (BitmapDrawable) getContext().getResources().getDrawable(beanId);
+ Bitmap beanBits = bean.getBitmap();
+ h=beanBits.getHeight();
+ w=beanBits.getWidth();
+
+ if (DEBUG) {
+ bean.setAlpha(0x80);
+ }
+ this.setImageDrawable(bean);
+
+ Paint pt = new Paint();
+ final int color = pickInt(COLORS);
+ ColorMatrix CM = new ColorMatrix();
+ float[] M = CM.getArray();
+ // we assume the color information is in the red channel
+ /* R */ M[0] = (float)((color & 0x00FF0000) >> 16) / 0xFF;
+ /* G */ M[5] = (float)((color & 0x0000FF00) >> 8) / 0xFF;
+ /* B */ M[10] = (float)((color & 0x000000FF)) / 0xFF;
+ pt.setColorFilter(new ColorMatrixColorFilter(M));
+ setLayerType(View.LAYER_TYPE_HARDWARE, (beanId == R.drawable.jandycane) ? null : pt);
+ }
+
+ public void reset() {
+ pickBean();
+
+ final float scale = lerp(MIN_SCALE,MAX_SCALE,z);
+ setScaleX(scale); setScaleY(scale);
+
+ r = 0.3f*Math.max(h,w)*scale;
+
+ a=(randfrange(0,360));
+ va = randfrange(-30,30);
+
+ vx = randfrange(-40,40) * z;
+ vy = randfrange(-40,40) * z;
+ final float boardh = boardHeight;
+ final float boardw = boardWidth;
+ //android.util.Log.d("BeanBag", "reset: w="+w+" h="+h);
+ if (flip()) {
+ x=(vx < 0 ? boardw+2*r : -r*4f);
+ y=(randfrange(0, boardh-3*r)*0.5f + ((vy < 0)?boardh*0.5f:0));
+ } else {
+ y=(vy < 0 ? boardh+2*r : -r*4f);
+ x=(randfrange(0, boardw-3*r)*0.5f + ((vx < 0)?boardw*0.5f:0));
+ }
+ }
+
+ public void update(float dt) {
+ if (grabbed) {
+// final float interval = (SystemClock.uptimeMillis() - grabtime) / 1000f;
+ vx = (vx * 0.75f) + ((grabx - x) / dt) * 0.25f;
+ x = grabx;
+ vy = (vy * 0.75f) + ((graby - y) / dt) * 0.25f;;
+ y = graby;
+ } else {
+ x = (x + vx * dt);
+ y = (y + vy * dt);
+ a = (a + va * dt);
+ }
+ }
+
+ public float overlap(Bean other) {
+ final float dx = (x - other.x);
+ final float dy = (y - other.y);
+ return mag(dx, dy) - r - other.r;
+ }
+
+ @Override
+ public boolean onTouchEvent(MotionEvent e) {
+ switch (e.getAction()) {
+ case MotionEvent.ACTION_DOWN:
+ grabbed = true;
+ va = 0;
+ // fall
+ case MotionEvent.ACTION_MOVE:
+ grabx = e.getRawX();
+ graby = e.getRawY();
+ grabtime = e.getEventTime();
+ break;
+ case MotionEvent.ACTION_CANCEL:
+ case MotionEvent.ACTION_UP:
+ grabbed = false;
+ va = randfrange(-5,5);
+ break;
+ }
+ return true;
+ }
+ }
+
+ TimeAnimator mAnim;
+ private int boardWidth;
+ private int boardHeight;
+
+ public Board(Context context, AttributeSet as) {
+ super(context, as);
+
+ setSystemUiVisibility(View.SYSTEM_UI_FLAG_LOW_PROFILE);
+
+ setWillNotDraw(!DEBUG);
+ }
+
+ private void reset() {
+// android.util.Log.d("Nyandroid", "board reset");
+ removeAllViews();
+
+ final ViewGroup.LayoutParams wrap = new ViewGroup.LayoutParams(
+ ViewGroup.LayoutParams.WRAP_CONTENT,
+ ViewGroup.LayoutParams.WRAP_CONTENT);
+
+ for(int i=0; i<NUM_BEANS; i++) {
+ Bean nv = new Bean(getContext(), null);
+ addView(nv, wrap);
+ nv.z = ((float)i/NUM_BEANS);
+ nv.z *= nv.z;
+ nv.reset();
+ nv.x = (randfrange(0, boardWidth));
+ nv.y = (randfrange(0, boardHeight));
+ }
+
+ if (mAnim != null) {
+ mAnim.cancel();
+ }
+ mAnim = new TimeAnimator();
+ mAnim.setTimeListener(new TimeAnimator.TimeListener() {
+ private long lastPrint = 0;
+ public void onTimeUpdate(TimeAnimator animation, long totalTime, long deltaTime) {
+ if (DEBUG && totalTime - lastPrint > 5000) {
+ lastPrint = totalTime;
+ for (int i=0; i<getChildCount(); i++) {
+ android.util.Log.d("BeanBag", "bean " + i + ": " + getChildAt(i));
+ }
+ }
+
+ for (int i=0; i<getChildCount(); i++) {
+ View v = getChildAt(i);
+ if (!(v instanceof Bean)) continue;
+ Bean nv = (Bean) v;
+ nv.update(deltaTime / 1000f);
+
+ for (int j=i+1; j<getChildCount(); j++) {
+ View v2 = getChildAt(j);
+ if (!(v2 instanceof Bean)) continue;
+ Bean nv2 = (Bean) v2;
+ final float overlap = nv.overlap(nv2);
+ if (false && overlap < 0) {
+ // angle pointing from nv2 to nv
+ final float dx = nv.x - nv2.x;
+ final float dy = nv.y - nv2.y;
+ final float ang = (float) Math.atan2(dx, dy);
+
+ if (false) {
+ nv.vx -= Math.cos(ang) * overlap * 0.5f;
+ nv.vy -= Math.sin(ang) * overlap * 0.5f;
+ nv2.vx += Math.cos(ang) * overlap * 0.5f;
+ nv2.vy += Math.sin(ang) * overlap * 0.5f;
+ }
+
+
+ // first, move them apart
+ nv.x -= Math.cos(ang) * overlap/2;
+ nv.y -= Math.sin(ang) * overlap/2;
+ nv2.x += Math.cos(ang) * overlap/2;
+ nv2.y += Math.sin(ang) * overlap/2;
+
+ // next, figure out velocities
+ final float sap = 0f; // randfrange(0,0.25f);
+
+ final float mag1 = mag(nv.vx, nv.vy) * (1f-sap);
+ final float mag2 = mag(nv2.vx, nv2.vy) * (1f-sap);
+
+
+ // hacky way to transfer "momentum"
+ nv.vx = mag2 * (float)Math.cos(ang);
+ nv.vy = mag2 * (float)Math.sin(ang);
+ nv2.vx = -mag1 * (float)Math.cos(ang);
+ nv2.vy = -mag1 * (float)Math.sin(ang);
+
+ final float totalva = nv.va + nv2.va;
+ final float frac = randfrange(0.25f,0.75f);
+ nv.va = totalva * frac;
+ nv2.va = totalva * (1f-frac);
+// nv.va += randfrange(-20,20);
+// nv2.va += randfrange(-20,20);
+
+ }
+ }
+
+ nv.setRotation(nv.a);
+ nv.setX(nv.x-nv.getPivotX());
+ nv.setY(nv.y-nv.getPivotY());
+
+ if ( nv.x < - MAX_RADIUS
+ || nv.x > boardWidth + MAX_RADIUS
+ || nv.y < -MAX_RADIUS
+ || nv.y > boardHeight + MAX_RADIUS)
+ {
+ nv.reset();
+ }
+ }
+
+ if (DEBUG) invalidate();
+ }
+ });
+ }
+
+ @Override
+ protected void onSizeChanged (int w, int h, int oldw, int oldh) {
+ super.onSizeChanged(w,h,oldw,oldh);
+ boardWidth = w;
+ boardHeight = h;
+// android.util.Log.d("Nyandroid", "resized: " + w + "x" + h);
+ post(new Runnable() { public void run() {
+ reset();
+ mAnim.start();
+ } });
+ }
+
+
+ @Override
+ protected void onDetachedFromWindow() {
+ super.onDetachedFromWindow();
+ mAnim.cancel();
+ }
+
+ @Override
+ public boolean isOpaque() {
+ return false;
+ }
+
+ @Override
+ public void onDraw(Canvas c) {
+ if (DEBUG) {
+ //android.util.Log.d("BeanBag", "onDraw");
+ Paint pt = new Paint();
+ pt.setAntiAlias(true);
+ pt.setStyle(Paint.Style.STROKE);
+ pt.setColor(0xFFFF0000);
+ pt.setStrokeWidth(4.0f);
+ c.drawRect(0, 0, getWidth(), getHeight(), pt);
+ pt.setColor(0xFFFFCC00);
+ pt.setStrokeWidth(1.0f);
+ for (int i=0; i<getChildCount(); i++) {
+ Bean b = (Bean) getChildAt(i);
+ final float a = (360-b.a)/180f*3.14159f;
+ final float tx = b.getTranslationX();
+ final float ty = b.getTranslationY();
+ c.drawCircle(b.x, b.y, b.r, pt);
+ c.drawCircle(tx, ty, 4, pt);
+ c.drawLine(b.x, b.y, (float)(b.x+b.r*Math.sin(a)), (float)(b.y+b.r*Math.cos(a)), pt);
+ }
+ }
+ }
+ }
+
+ private Board mBoard;
+
+ @Override
+ public void onStart() {
+ super.onStart();
+
+ getWindow().addFlags(
+ WindowManager.LayoutParams.FLAG_ALLOW_LOCK_WHILE_SCREEN_ON
+ | WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED
+ );
+ }
+
+ @Override
+ public void onResume() {
+ super.onResume();
+ mBoard = new Board(this, null);
+ setContentView(mBoard);
+ }
+}
diff --git a/packages/SystemUI/src/com/android/systemui/ExpandHelper.java b/packages/SystemUI/src/com/android/systemui/ExpandHelper.java
index c5928f1..7a7afa7 100644
--- a/packages/SystemUI/src/com/android/systemui/ExpandHelper.java
+++ b/packages/SystemUI/src/com/android/systemui/ExpandHelper.java
@@ -34,6 +34,7 @@
View getChildAtPosition(MotionEvent ev);
View getChildAtPosition(float x, float y);
boolean canChildBeExpanded(View v);
+ boolean setUserExpandedChild(View v, boolean userxpanded);
}
private static final String TAG = "ExpandHelper";
@@ -272,6 +273,7 @@
mScaleAnimation.start();
mStretching = false;
setGlow(0f);
+ mCallback.setUserExpandedChild(mCurrView, h == mNaturalHeight);
if (DEBUG) Log.d(TAG, "scale was finished on view: " + mCurrView);
clearView();
}
diff --git a/packages/SystemUI/src/com/android/systemui/Nyandroid.java b/packages/SystemUI/src/com/android/systemui/Nyandroid.java
deleted file mode 100644
index 6f168ba..0000000
--- a/packages/SystemUI/src/com/android/systemui/Nyandroid.java
+++ /dev/null
@@ -1,253 +0,0 @@
-/*);
- * Copyright (C) 2011 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;
-
-import android.animation.AnimatorSet;
-import android.animation.PropertyValuesHolder;
-import android.animation.ObjectAnimator;
-import android.animation.TimeAnimator;
-import android.app.Activity;
-import android.content.ComponentName;
-import android.content.Context;
-import android.content.Intent;
-import android.graphics.drawable.AnimationDrawable;
-import android.graphics.Bitmap;
-import android.graphics.Canvas;
-import android.graphics.Color;
-import android.graphics.Matrix;
-import android.graphics.Paint;
-import android.graphics.Point;
-import android.graphics.Rect;
-import android.graphics.RectF;
-import android.os.Handler;
-import android.util.AttributeSet;
-import android.util.DisplayMetrics;
-import android.util.Pair;
-import android.view.Gravity;
-import android.view.MotionEvent;
-import android.view.View;
-import android.view.ViewGroup;
-import android.view.WindowManager;
-import android.widget.FrameLayout;
-import android.widget.ImageView;
-import java.util.HashMap;
-import java.util.Random;
-
-public class Nyandroid extends Activity {
- final static boolean DEBUG = false;
-
- public static class Board extends FrameLayout
- {
- public static final boolean FIXED_STARS = true;
- public static final int NUM_CATS = 20;
-
- static Random sRNG = new Random();
-
- static float lerp(float a, float b, float f) {
- return (b-a)*f + a;
- }
-
- static float randfrange(float a, float b) {
- return lerp(a, b, sRNG.nextFloat());
- }
-
- static int randsign() {
- return sRNG.nextBoolean() ? 1 : -1;
- }
-
- static <E> E pick(E[] array) {
- if (array.length == 0) return null;
- return array[sRNG.nextInt(array.length)];
- }
-
- public class FlyingCat extends ImageView {
- public static final float VMAX = 1000.0f;
- public static final float VMIN = 100.0f;
-
- public float v, vr;
-
- public float dist;
- public float z;
-
- public ComponentName component;
-
- public FlyingCat(Context context, AttributeSet as) {
- super(context, as);
- setImageResource(R.drawable.nyandroid_anim); // @@@
-
- if (DEBUG) setBackgroundColor(0x80FF0000);
- }
-
- public String toString() {
- return String.format("<cat (%.1f, %.1f) (%d x %d)>",
- getX(), getY(), getWidth(), getHeight());
- }
-
- public void reset() {
- final float scale = lerp(0.1f,2f,z);
- setScaleX(scale); setScaleY(scale);
-
- setX(-scale*getWidth()+1);
- setY(randfrange(0, Board.this.getHeight()-scale*getHeight()));
- v = lerp(VMIN, VMAX, z);
-
- dist = 0;
-
-// android.util.Log.d("Nyandroid", "reset cat: " + this);
- }
-
- public void update(float dt) {
- dist += v * dt;
- setX(getX() + v * dt);
- }
- }
-
- TimeAnimator mAnim;
-
- public Board(Context context, AttributeSet as) {
- super(context, as);
-
- setLayerType(View.LAYER_TYPE_HARDWARE, null);
- setSystemUiVisibility(View.SYSTEM_UI_FLAG_LOW_PROFILE | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION);
- setBackgroundColor(0xFF003366);
- }
-
- private void reset() {
-// android.util.Log.d("Nyandroid", "board reset");
- removeAllViews();
-
- final ViewGroup.LayoutParams wrap = new ViewGroup.LayoutParams(
- ViewGroup.LayoutParams.WRAP_CONTENT,
- ViewGroup.LayoutParams.WRAP_CONTENT);
-
- if (FIXED_STARS) {
- for(int i=0; i<20; i++) {
- ImageView fixedStar = new ImageView(getContext(), null);
- if (DEBUG) fixedStar.setBackgroundColor(0x8000FF80);
- fixedStar.setImageResource(R.drawable.star_anim); // @@@
- addView(fixedStar, wrap);
- final float scale = randfrange(0.1f, 1f);
- fixedStar.setScaleX(scale); fixedStar.setScaleY(scale);
- fixedStar.setX(randfrange(0, getWidth()));
- fixedStar.setY(randfrange(0, getHeight()));
- final AnimationDrawable anim = (AnimationDrawable) fixedStar.getDrawable();
- postDelayed(new Runnable() {
- public void run() {
- anim.start();
- }}, (int) randfrange(0, 1000));
- }
- }
-
- for(int i=0; i<NUM_CATS; i++) {
- FlyingCat nv = new FlyingCat(getContext(), null);
- addView(nv, wrap);
- nv.z = ((float)i/NUM_CATS);
- nv.z *= nv.z;
- nv.reset();
- nv.setX(randfrange(0,Board.this.getWidth()));
- final AnimationDrawable anim = (AnimationDrawable) nv.getDrawable();
- postDelayed(new Runnable() {
- public void run() {
- anim.start();
- }}, (int) randfrange(0, 1000));
- }
-
- if (mAnim != null) {
- mAnim.cancel();
- }
- mAnim = new TimeAnimator();
- mAnim.setTimeListener(new TimeAnimator.TimeListener() {
- public void onTimeUpdate(TimeAnimator animation, long totalTime, long deltaTime) {
- // setRotation(totalTime * 0.01f); // not as cool as you would think
-// android.util.Log.d("Nyandroid", "t=" + totalTime);
-
- for (int i=0; i<getChildCount(); i++) {
- View v = getChildAt(i);
- if (!(v instanceof FlyingCat)) continue;
- FlyingCat nv = (FlyingCat) v;
- nv.update(deltaTime / 1000f);
- final float catWidth = nv.getWidth() * nv.getScaleX();
- final float catHeight = nv.getHeight() * nv.getScaleY();
- if ( nv.getX() + catWidth < -2
- || nv.getX() > getWidth() + 2
- || nv.getY() + catHeight < -2
- || nv.getY() > getHeight() + 2)
- {
- nv.reset();
- }
- }
- }
- });
- }
-
- @Override
- protected void onSizeChanged (int w, int h, int oldw, int oldh) {
- super.onSizeChanged(w,h,oldw,oldh);
-// android.util.Log.d("Nyandroid", "resized: " + w + "x" + h);
- post(new Runnable() { public void run() {
- reset();
- mAnim.start();
- } });
- }
-
-
- @Override
- protected void onDetachedFromWindow() {
- super.onDetachedFromWindow();
- mAnim.cancel();
- }
-
- @Override
- public boolean isOpaque() {
- return true;
- }
- }
-
- private Board mBoard;
-
- @Override
- public void onStart() {
- super.onStart();
-
- getWindow().addFlags(
- WindowManager.LayoutParams.FLAG_ALLOW_LOCK_WHILE_SCREEN_ON
- | WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED
- );
- }
-
- @Override
- public void onResume() {
- super.onResume();
- mBoard = new Board(this, null);
- setContentView(mBoard);
-
- mBoard.setOnSystemUiVisibilityChangeListener(new View.OnSystemUiVisibilityChangeListener() {
- @Override
- public void onSystemUiVisibilityChange(int vis) {
- if (0 == (vis & View.SYSTEM_UI_FLAG_HIDE_NAVIGATION)) {
- Nyandroid.this.finish();
- }
- }
- });
- }
-
- @Override
- public void onUserInteraction() {
-// android.util.Log.d("Nyandroid", "finishing on user interaction");
- finish();
- }
-}
diff --git a/packages/SystemUI/src/com/android/systemui/recent/Choreographer.java b/packages/SystemUI/src/com/android/systemui/recent/Choreographer.java
index dc2f0be..a8c2020 100644
--- a/packages/SystemUI/src/com/android/systemui/recent/Choreographer.java
+++ b/packages/SystemUI/src/com/android/systemui/recent/Choreographer.java
@@ -21,21 +21,21 @@
import android.animation.AnimatorSet.Builder;
import android.animation.ObjectAnimator;
import android.graphics.drawable.Drawable;
-import android.util.Log;
import android.util.Slog;
import android.view.View;
+import android.view.ViewRootImpl;
/* package */ class Choreographer implements Animator.AnimatorListener {
// should group this into a multi-property animation
private static final int OPEN_DURATION = 136;
- private static final int CLOSE_DURATION = 250;
+ private static final int CLOSE_DURATION = 130;
private static final int SCRIM_DURATION = 400;
private static final String TAG = RecentsPanelView.TAG;
private static final boolean DEBUG = RecentsPanelView.DEBUG;
boolean mVisible;
int mPanelHeight;
- View mRootView;
+ RecentsPanelView mRootView;
View mScrimView;
View mContentView;
View mNoRecentAppsView;
@@ -45,7 +45,7 @@
// the panel will start to appear this many px from the end
final int HYPERSPACE_OFFRAMP = 200;
- public Choreographer(View root, View scrim, View content,
+ public Choreographer(RecentsPanelView root, View scrim, View content,
View noRecentApps, Animator.AnimatorListener listener) {
mRootView = root;
mScrimView = scrim;
@@ -67,7 +67,7 @@
end = 0;
} else {
start = y;
- end = y + HYPERSPACE_OFFRAMP;
+ end = y;
}
Animator posAnim = ObjectAnimator.ofFloat(mContentView, "translationY",
@@ -77,12 +77,12 @@
: new android.view.animation.AccelerateInterpolator(2.5f));
posAnim.setDuration(appearing ? OPEN_DURATION : CLOSE_DURATION);
- Animator glowAnim = ObjectAnimator.ofFloat(mContentView, "alpha",
+ Animator fadeAnim = ObjectAnimator.ofFloat(mContentView, "alpha",
mContentView.getAlpha(), appearing ? 1.0f : 0.0f);
- glowAnim.setInterpolator(appearing
+ fadeAnim.setInterpolator(appearing
? new android.view.animation.AccelerateInterpolator(1.0f)
: new android.view.animation.DecelerateInterpolator(1.0f));
- glowAnim.setDuration(appearing ? OPEN_DURATION : CLOSE_DURATION);
+ fadeAnim.setDuration(appearing ? OPEN_DURATION : CLOSE_DURATION);
Animator noRecentAppsFadeAnim = null;
if (mNoRecentAppsView != null && // doesn't exist on large devices
@@ -96,7 +96,7 @@
}
mContentAnim = new AnimatorSet();
- final Builder builder = mContentAnim.play(glowAnim).with(posAnim);
+ final Builder builder = mContentAnim.play(fadeAnim).with(posAnim);
if (noRecentAppsFadeAnim != null) {
builder.with(noRecentAppsFadeAnim);
@@ -153,9 +153,10 @@
public void onAnimationEnd(Animator animation) {
if (DEBUG) Slog.d(TAG, "onAnimationEnd");
if (!mVisible) {
- mRootView.setVisibility(View.GONE);
+ mRootView.hideWindow();
}
mContentView.setLayerType(View.LAYER_TYPE_NONE, null);
+ mContentView.setAlpha(1f);
mContentAnim = null;
}
diff --git a/packages/SystemUI/src/com/android/systemui/recent/RecentsPanelView.java b/packages/SystemUI/src/com/android/systemui/recent/RecentsPanelView.java
index 995ee43..feb1ac8 100644
--- a/packages/SystemUI/src/com/android/systemui/recent/RecentsPanelView.java
+++ b/packages/SystemUI/src/com/android/systemui/recent/RecentsPanelView.java
@@ -26,7 +26,9 @@
import android.content.res.Resources;
import android.content.res.TypedArray;
import android.graphics.Bitmap;
+import android.graphics.Canvas;
import android.graphics.Matrix;
+import android.graphics.Rect;
import android.graphics.Shader.TileMode;
import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.Drawable;
@@ -48,11 +50,9 @@
import android.widget.AdapterView.OnItemClickListener;
import android.widget.BaseAdapter;
import android.widget.FrameLayout;
-import android.widget.HorizontalScrollView;
import android.widget.ImageView;
import android.widget.ImageView.ScaleType;
import android.widget.PopupMenu;
-import android.widget.ScrollView;
import android.widget.TextView;
import com.android.systemui.R;
@@ -83,6 +83,9 @@
private Choreographer mChoreo;
OnRecentsPanelVisibilityChangedListener mVisibilityChangedListener;
+ ImageView mPlaceholderThumbnail;
+ boolean mHideWindowAfterPlaceholderThumbnailIsHidden;
+
private RecentTasksLoader mRecentTasksLoader;
private ArrayList<TaskDescription> mRecentTaskDescriptions;
private Runnable mPreloadTasksRunnable;
@@ -283,7 +286,9 @@
public void show(boolean show, boolean animate,
ArrayList<TaskDescription> recentTaskDescriptions, boolean firstScreenful) {
// For now, disable animations. We may want to re-enable in the future
- animate = false;
+ if (show) {
+ animate = false;
+ }
if (show) {
// Need to update list of recent apps before we set visibility so this view's
// content description is updated before it gets focus for TalkBack mode
@@ -687,11 +692,31 @@
context.getSystemService(Context.ACTIVITY_SERVICE);
holder.thumbnailViewImage.setDrawingCacheEnabled(true);
Bitmap bm = holder.thumbnailViewImage.getDrawingCache();
- ActivityOptions opts = ActivityOptions.makeThumbnailScaleUpAnimation(
+ mPlaceholderThumbnail = (ImageView) findViewById(R.id.recents_transition_placeholder_icon);
+
+ final ImageView placeholderThumbnail = mPlaceholderThumbnail;
+ mHideWindowAfterPlaceholderThumbnailIsHidden = false;
+ placeholderThumbnail.setVisibility(VISIBLE);
+ Bitmap b2 = bm.copy(bm.getConfig(), true);
+ placeholderThumbnail.setImageBitmap(b2);
+
+ Rect r = new Rect();
+ holder.thumbnailViewImage.getGlobalVisibleRect(r);
+
+ placeholderThumbnail.setTranslationX(r.left);
+ placeholderThumbnail.setTranslationY(r.top);
+
+ show(false, true);
+
+ ActivityOptions opts = ActivityOptions.makeDelayedThumbnailScaleUpAnimation(
holder.thumbnailViewImage, bm, 0, 0,
new ActivityOptions.OnAnimationStartedListener() {
@Override public void onAnimationStarted() {
- hide(true);
+ mPlaceholderThumbnail = null;
+ placeholderThumbnail.setVisibility(INVISIBLE);
+ if (mHideWindowAfterPlaceholderThumbnailIsHidden) {
+ hideWindow();
+ }
}
});
if (ad.taskId >= 0) {
@@ -709,6 +734,15 @@
holder.thumbnailViewImage.setDrawingCacheEnabled(false);
}
+ public void hideWindow() {
+ if (mPlaceholderThumbnail != null) {
+ mHideWindowAfterPlaceholderThumbnailIsHidden = true;
+ } else {
+ setVisibility(GONE);
+ mHideWindowAfterPlaceholderThumbnailIsHidden = false;
+ }
+ }
+
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
handleOnClick(view);
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/BaseStatusBar.java b/packages/SystemUI/src/com/android/systemui/statusbar/BaseStatusBar.java
index 37fb53d..a310b1d 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/BaseStatusBar.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/BaseStatusBar.java
@@ -35,6 +35,7 @@
import android.os.RemoteException;
import android.os.ServiceManager;
import android.provider.Settings;
+import android.text.TextUtils;
import android.util.Log;
import android.util.Slog;
import android.view.Display;
@@ -47,6 +48,7 @@
import android.view.ViewGroup.LayoutParams;
import android.view.WindowManager;
import android.view.WindowManagerImpl;
+import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.RemoteViews;
import android.widget.PopupMenu;
@@ -62,6 +64,7 @@
import com.android.systemui.recent.RecentTasksLoader;
import com.android.systemui.recent.TaskDescription;
import com.android.systemui.statusbar.CommandQueue;
+import com.android.systemui.statusbar.policy.NotificationRowLayout;
import com.android.systemui.statusbar.tablet.StatusBarPanel;
import com.android.systemui.R;
@@ -77,11 +80,24 @@
protected static final int MSG_CANCEL_PRELOAD_RECENT_APPS = 1023;
protected static final int MSG_OPEN_SEARCH_PANEL = 1024;
protected static final int MSG_CLOSE_SEARCH_PANEL = 1025;
+ protected static final int MSG_SHOW_INTRUDER = 1026;
+ protected static final int MSG_HIDE_INTRUDER = 1027;
+
+ protected static final boolean ENABLE_INTRUDERS = false;
+
+ public static final int EXPANDED_LEAVE_ALONE = -10000;
+ public static final int EXPANDED_FULL_OPEN = -10001;
protected CommandQueue mCommandQueue;
protected IStatusBarService mBarService;
protected H mHandler = createHandler();
+ // all notifications
+ protected NotificationData mNotificationData = new NotificationData();
+ protected NotificationRowLayout mPile;
+
+ protected StatusBarNotification mCurrentlyIntrudingNotification;
+
// used to notify status bar for suppressing notification LED
protected boolean mPanelSlightlyVisible;
@@ -470,17 +486,7 @@
// for blaming (see SwipeHelper.setLongPressListener)
row.setTag(sbn.pkg);
- // XXX: temporary: while testing big notifications, auto-expand all of them
ViewGroup.LayoutParams lp = row.getLayoutParams();
- Boolean expandable = Boolean.FALSE;
- if (large != null) {
- lp.height = ViewGroup.LayoutParams.WRAP_CONTENT;
- expandable = Boolean.TRUE;
- } else {
- lp.height = rowHeight;
- }
- row.setLayoutParams(lp);
- row.setTag(R.id.expandable_tag, expandable);
workAroundBadLayerDrawableOpacity(row);
View vetoButton = updateNotificationVetoButton(row, sbn);
vetoButton.setContentDescription(mContext.getString(
@@ -546,10 +552,11 @@
applyLegacyRowBackground(sbn, content);
+ row.setTag(R.id.expandable_tag, Boolean.valueOf(large != null));
entry.row = row;
entry.content = content;
entry.expanded = expandedOneU;
- entry.expandedLarge = expandedOneU;
+ entry.setLargeView(expandedLarge);
return true;
}
@@ -634,4 +641,232 @@
}
}
+ /**
+ * Cancel this notification and tell the StatusBarManagerService / NotificationManagerService
+ * about the failure.
+ *
+ * WARNING: this will call back into us. Don't hold any locks.
+ */
+ void handleNotificationError(IBinder key, StatusBarNotification n, String message) {
+ removeNotification(key);
+ try {
+ mBarService.onNotificationError(n.pkg, n.tag, n.id, n.uid, n.initialPid, message);
+ } catch (RemoteException ex) {
+ // The end is nigh.
+ }
+ }
+
+ protected StatusBarNotification removeNotificationViews(IBinder key) {
+ NotificationData.Entry entry = mNotificationData.remove(key);
+ if (entry == null) {
+ Slog.w(TAG, "removeNotification for unknown key: " + key);
+ return null;
+ }
+ // Remove the expanded view.
+ ViewGroup rowParent = (ViewGroup)entry.row.getParent();
+ if (rowParent != null) rowParent.removeView(entry.row);
+ updateExpansionStates();
+ updateNotificationIcons();
+
+ return entry.notification;
+ }
+
+ protected StatusBarIconView addNotificationViews(IBinder key,
+ StatusBarNotification notification) {
+ if (DEBUG) {
+ Slog.d(TAG, "addNotificationViews(key=" + key + ", notification=" + notification);
+ }
+ // Construct the icon.
+ final StatusBarIconView iconView = new StatusBarIconView(mContext,
+ notification.pkg + "/0x" + Integer.toHexString(notification.id),
+ notification.notification);
+ iconView.setScaleType(ImageView.ScaleType.CENTER_INSIDE);
+
+ final StatusBarIcon ic = new StatusBarIcon(notification.pkg,
+ notification.notification.icon,
+ notification.notification.iconLevel,
+ notification.notification.number,
+ notification.notification.tickerText);
+ if (!iconView.set(ic)) {
+ handleNotificationError(key, notification, "Couldn't create icon: " + ic);
+ return null;
+ }
+ // Construct the expanded view.
+ NotificationData.Entry entry = new NotificationData.Entry(key, notification, iconView);
+ if (!inflateViews(entry, mPile)) {
+ handleNotificationError(key, notification, "Couldn't expand RemoteViews for: "
+ + notification);
+ return null;
+ }
+
+ // Add the expanded view and icon.
+ int pos = mNotificationData.add(entry);
+ if (DEBUG) {
+ Slog.d(TAG, "addNotificationViews: added at " + pos);
+ }
+ updateExpansionStates();
+ updateNotificationIcons();
+
+ return iconView;
+ }
+
+ protected boolean expandView(NotificationData.Entry entry, boolean expand) {
+ if (entry.expandable()) {
+ int rowHeight =
+ mContext.getResources().getDimensionPixelSize(R.dimen.notification_height);
+ ViewGroup.LayoutParams lp = entry.row.getLayoutParams();
+ if (expand) {
+ lp.height = ViewGroup.LayoutParams.WRAP_CONTENT;
+ } else {
+ lp.height = rowHeight;
+ }
+ entry.row.setLayoutParams(lp);
+ return expand;
+ } else {
+ return false;
+ }
+ }
+
+ protected void updateExpansionStates() {
+ int N = mNotificationData.size();
+ for (int i = 0; i < N; i++) {
+ NotificationData.Entry entry = mNotificationData.get(i);
+ if (i == (N-1)) {
+ if (DEBUG) Slog.d(TAG, "expanding top notification at " + i);
+ expandView(entry, true);
+ } else {
+ if (!entry.userExpanded()) {
+ if (DEBUG) Slog.d(TAG, "collapsing notification at " + i);
+ expandView(entry, false);
+ } else {
+ if (DEBUG) Slog.d(TAG, "ignoring user-modified notification at " + i);
+ }
+ }
+ }
+ }
+
+ protected abstract void haltTicker();
+ protected abstract void setAreThereNotifications();
+ protected abstract void updateNotificationIcons();
+ protected abstract void tick(IBinder key, StatusBarNotification n, boolean firstTime);
+ protected abstract void updateExpandedViewPos(int expandedPosition);
+ protected abstract int getExpandedViewMaxHeight();
+
+ protected boolean isTopNotification(ViewGroup parent, NotificationData.Entry entry) {
+ return parent.indexOfChild(entry.row) == 0;
+ }
+
+ public void updateNotification(IBinder key, StatusBarNotification notification) {
+ if (DEBUG) Slog.d(TAG, "updateNotification(" + key + " -> " + notification + ")");
+
+ final NotificationData.Entry oldEntry = mNotificationData.findByKey(key);
+ if (oldEntry == null) {
+ Slog.w(TAG, "updateNotification for unknown key: " + key);
+ return;
+ }
+
+ final StatusBarNotification oldNotification = oldEntry.notification;
+
+ // XXX: modify when we do something more intelligent with the two content views
+ final RemoteViews oldContentView = (oldNotification.notification.bigContentView != null)
+ ? oldNotification.notification.bigContentView
+ : oldNotification.notification.contentView;
+ final RemoteViews contentView = (notification.notification.bigContentView != null)
+ ? notification.notification.bigContentView
+ : notification.notification.contentView;
+
+ if (DEBUG) {
+ Slog.d(TAG, "old notification: when=" + oldNotification.notification.when
+ + " ongoing=" + oldNotification.isOngoing()
+ + " expanded=" + oldEntry.expanded
+ + " contentView=" + oldContentView
+ + " rowParent=" + oldEntry.row.getParent());
+ Slog.d(TAG, "new notification: when=" + notification.notification.when
+ + " ongoing=" + oldNotification.isOngoing()
+ + " contentView=" + contentView);
+ }
+
+ // Can we just reapply the RemoteViews in place? If when didn't change, the order
+ // didn't change.
+ boolean contentsUnchanged = oldEntry.expanded != null
+ && contentView != null && oldContentView != null
+ && contentView.getPackage() != null
+ && oldContentView.getPackage() != null
+ && oldContentView.getPackage().equals(contentView.getPackage())
+ && oldContentView.getLayoutId() == contentView.getLayoutId();
+ ViewGroup rowParent = (ViewGroup) oldEntry.row.getParent();
+ boolean orderUnchanged = notification.notification.when==oldNotification.notification.when
+ && notification.score == oldNotification.score;
+ // score now encompasses/supersedes isOngoing()
+
+ boolean updateTicker = notification.notification.tickerText != null
+ && !TextUtils.equals(notification.notification.tickerText,
+ oldEntry.notification.notification.tickerText);
+ boolean isTopAnyway = isTopNotification(rowParent, oldEntry);
+ if (contentsUnchanged && (orderUnchanged || isTopAnyway)) {
+ if (DEBUG) Slog.d(TAG, "reusing notification for key: " + key);
+ oldEntry.notification = notification;
+ try {
+ // Reapply the RemoteViews
+ contentView.reapply(mContext, oldEntry.content);
+ // update the contentIntent
+ final PendingIntent contentIntent = notification.notification.contentIntent;
+ if (contentIntent != null) {
+ final View.OnClickListener listener = makeClicker(contentIntent,
+ notification.pkg, notification.tag, notification.id);
+ oldEntry.content.setOnClickListener(listener);
+ } else {
+ oldEntry.content.setOnClickListener(null);
+ }
+ // Update the icon.
+ final StatusBarIcon ic = new StatusBarIcon(notification.pkg,
+ notification.notification.icon, notification.notification.iconLevel,
+ notification.notification.number,
+ notification.notification.tickerText);
+ if (!oldEntry.icon.set(ic)) {
+ handleNotificationError(key, notification, "Couldn't update icon: " + ic);
+ return;
+ }
+ updateExpansionStates();
+ }
+ catch (RuntimeException e) {
+ // It failed to add cleanly. Log, and remove the view from the panel.
+ Slog.w(TAG, "Couldn't reapply views for package " + contentView.getPackage(), e);
+ removeNotificationViews(key);
+ addNotificationViews(key, notification);
+ }
+ } else {
+ if (DEBUG) Slog.d(TAG, "not reusing notification for key: " + key);
+ if (DEBUG) Slog.d(TAG, "contents was " + (contentsUnchanged ? "unchanged" : "changed"));
+ if (DEBUG) Slog.d(TAG, "order was " + (orderUnchanged ? "unchanged" : "changed"));
+ if (DEBUG) Slog.d(TAG, "notification is " + (isTopAnyway ? "top" : "not top"));
+ removeNotificationViews(key);
+ addNotificationViews(key, notification);
+ }
+
+ // Update the veto button accordingly (and as a result, whether this row is
+ // swipe-dismissable)
+ updateNotificationVetoButton(oldEntry.row, notification);
+
+ // Restart the ticker if it's still running
+ if (updateTicker) {
+ haltTicker();
+ tick(key, notification, false);
+ }
+
+ // Recalculate the position of the sliding windows and the titles.
+ setAreThereNotifications();
+ updateExpandedViewPos(EXPANDED_LEAVE_ALONE);
+
+ // See if we need to update the intruder.
+ if (ENABLE_INTRUDERS && oldNotification == mCurrentlyIntrudingNotification) {
+ if (DEBUG) Slog.d(TAG, "updating the current intruder:" + notification);
+ // XXX: this is a hack for Alarms. The real implementation will need to *update*
+ // the intruder.
+ if (notification.notification.fullScreenIntent == null) { // TODO(dsandler): consistent logic with add()
+ if (DEBUG) Slog.d(TAG, "no longer intrudes!");
+ mHandler.sendEmptyMessage(MSG_HIDE_INTRUDER);
+ }
+ }
+ }
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationData.java b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationData.java
index 3ff85d9..1a07ed3 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationData.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationData.java
@@ -22,6 +22,7 @@
import android.widget.ImageView;
import com.android.internal.statusbar.StatusBarNotification;
+import com.android.systemui.R;
import java.util.Comparator;
import java.util.ArrayList;
@@ -38,13 +39,32 @@
public View content; // takes the click events and sends the PendingIntent
public View expanded; // the inflated RemoteViews
public ImageView largeIcon;
- public View expandedLarge;
+ protected View expandedLarge;
public Entry() {}
public Entry(IBinder key, StatusBarNotification n, StatusBarIconView ic) {
this.key = key;
this.notification = n;
this.icon = ic;
}
+ public void setLargeView(View expandedLarge) {
+ this.expandedLarge = expandedLarge;
+ writeBooleanTag(row, R.id.expandable_tag, expandedLarge != null);
+ }
+ public View getLargeView() {
+ return expandedLarge;
+ }
+ /**
+ * Return whether the entry can be expanded.
+ */
+ public boolean expandable() {
+ return NotificationData.getIsExpandable(row);
+ }
+ /**
+ * Return whether the entry has been manually expanded by the user.
+ */
+ public boolean userExpanded() {
+ return NotificationData.getUserExpanded(row);
+ }
}
private final ArrayList<Entry> mEntries = new ArrayList<Entry>();
private final Comparator<Entry> mEntryCmp = new Comparator<Entry>() {
@@ -134,4 +154,41 @@
}
return false;
}
+
+ protected static boolean readBooleanTag(View view, int id) {
+ if (view != null) {
+ Object value = view.getTag(id);
+ return value != null && value instanceof Boolean && ((Boolean) value).booleanValue();
+ }
+ return false;
+ }
+
+ protected static boolean writeBooleanTag(View view, int id, boolean value) {
+ if (view != null) {
+ view.setTag(id, Boolean.valueOf(value));
+ return value;
+ }
+ return false;
+ }
+
+ /**
+ * Return whether the entry can be expanded.
+ */
+ public static boolean getIsExpandable(View row) {
+ return readBooleanTag(row, R.id.expandable_tag);
+ }
+
+ /**
+ * Return whether the entry has been manually expanded by the user.
+ */
+ public static boolean getUserExpanded(View row) {
+ return readBooleanTag(row, R.id.user_expanded_tag);
+ }
+
+ /**
+ * Set whether the entry has been manually expanded by the user.
+ */
+ public static boolean setUserExpanded(View row, boolean userExpanded) {
+ return writeBooleanTag(row, R.id.user_expanded_tag, userExpanded);
+ }
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/SignalClusterView.java b/packages/SystemUI/src/com/android/systemui/statusbar/SignalClusterView.java
index 744a46b..2f02d23 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/SignalClusterView.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/SignalClusterView.java
@@ -44,10 +44,11 @@
private boolean mMobileVisible = false;
private int mMobileStrengthId = 0, mMobileActivityId = 0, mMobileTypeId = 0;
private boolean mIsAirplaneMode = false;
+ private int mAirplaneIconId = 0;
private String mWifiDescription, mMobileDescription, mMobileTypeDescription;
ViewGroup mWifiGroup, mMobileGroup;
- ImageView mWifi, mMobile, mWifiActivity, mMobileActivity, mMobileType;
+ ImageView mWifi, mMobile, mWifiActivity, mMobileActivity, mMobileType, mAirplane;
View mSpacer;
public SignalClusterView(Context context) {
@@ -79,6 +80,7 @@
mMobileActivity = (ImageView) findViewById(R.id.mobile_inout);
mMobileType = (ImageView) findViewById(R.id.mobile_type);
mSpacer = findViewById(R.id.spacer);
+ mAirplane = (ImageView) findViewById(R.id.airplane);
apply();
}
@@ -92,10 +94,13 @@
mMobile = null;
mMobileActivity = null;
mMobileType = null;
+ mSpacer = null;
+ mAirplane = null;
super.onDetachedFromWindow();
}
+ @Override
public void setWifiIndicators(boolean visible, int strengthIcon, int activityIcon,
String contentDescription) {
mWifiVisible = visible;
@@ -106,6 +111,7 @@
apply();
}
+ @Override
public void setMobileDataIndicators(boolean visible, int strengthIcon, int activityIcon,
int typeIcon, String contentDescription, String typeContentDescription) {
mMobileVisible = visible;
@@ -118,8 +124,12 @@
apply();
}
- public void setIsAirplaneMode(boolean is) {
+ @Override
+ public void setIsAirplaneMode(boolean is, int airplaneIconId) {
mIsAirplaneMode = is;
+ mAirplaneIconId = airplaneIconId;
+
+ apply();
}
// Run after each indicator change.
@@ -140,7 +150,7 @@
(mWifiVisible ? "VISIBLE" : "GONE"),
mWifiStrengthId, mWifiActivityId));
- if (mMobileVisible) {
+ if (mMobileVisible && !mIsAirplaneMode) {
mMobileGroup.setVisibility(View.VISIBLE);
mMobile.setImageResource(mMobileStrengthId);
mMobileActivity.setImageResource(mMobileActivityId);
@@ -150,6 +160,13 @@
mMobileGroup.setVisibility(View.GONE);
}
+ if (mIsAirplaneMode) {
+ mAirplane.setVisibility(View.VISIBLE);
+ mAirplane.setImageResource(mAirplaneIconId);
+ } else {
+ mAirplane.setVisibility(View.GONE);
+ }
+
if (mMobileVisible && mWifiVisible && mIsAirplaneMode) {
mSpacer.setVisibility(View.INVISIBLE);
} else {
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 f5f2e28..d3fbdab 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java
@@ -42,7 +42,6 @@
import android.os.ServiceManager;
import android.os.SystemClock;
import android.provider.Settings;
-import android.text.TextUtils;
import android.util.DisplayMetrics;
import android.util.Log;
import android.util.Slog;
@@ -105,16 +104,10 @@
public static final String ACTION_STATUSBAR_START
= "com.android.internal.policy.statusbar.START";
- private static final boolean ENABLE_INTRUDERS = false;
private static final boolean DIM_BEHIND_EXPANDED_PANEL = false;
- static final int EXPANDED_LEAVE_ALONE = -10000;
- static final int EXPANDED_FULL_OPEN = -10001;
-
private static final int MSG_OPEN_NOTIFICATION_PANEL = 1000;
private static final int MSG_CLOSE_NOTIFICATION_PANEL = 1001;
- private static final int MSG_SHOW_INTRUDER = 1002;
- private static final int MSG_HIDE_INTRUDER = 1003;
// 1020-1030 reserved for BaseStatusBar
// will likely move to a resource or other tunable param at some point
@@ -179,10 +172,6 @@
CloseDragHandle mCloseView;
private int mCloseViewHeight;
- // all notifications
- NotificationData mNotificationData = new NotificationData();
- NotificationRowLayout mPile;
-
// position
int[] mPositionTmp = new int[2];
boolean mExpanded;
@@ -519,7 +508,7 @@
toggleRecentApps();
}
};
- private StatusBarNotification mCurrentlyIntrudingNotification;
+
View.OnTouchListener mHomeSearchActionListener = new View.OnTouchListener() {
public boolean onTouch(View v, MotionEvent event) {
switch(event.getAction()) {
@@ -693,7 +682,7 @@
// show the ticker if there isn't an intruder too
if (mCurrentlyIntrudingNotification == null) {
- tick(notification);
+ tick(null, notification, true);
}
}
@@ -702,117 +691,6 @@
updateExpandedViewPos(EXPANDED_LEAVE_ALONE);
}
- public void updateNotification(IBinder key, StatusBarNotification notification) {
- if (DEBUG) Slog.d(TAG, "updateNotification(" + key + " -> " + notification + ")");
-
- final NotificationData.Entry oldEntry = mNotificationData.findByKey(key);
- if (oldEntry == null) {
- Slog.w(TAG, "updateNotification for unknown key: " + key);
- return;
- }
-
- final StatusBarNotification oldNotification = oldEntry.notification;
-
- // XXX: modify when we do something more intelligent with the two content views
- final RemoteViews oldContentView = (oldNotification.notification.bigContentView != null)
- ? oldNotification.notification.bigContentView
- : oldNotification.notification.contentView;
- final RemoteViews contentView = (notification.notification.bigContentView != null)
- ? notification.notification.bigContentView
- : notification.notification.contentView;
-
- if (DEBUG) {
- Slog.d(TAG, "old notification: when=" + oldNotification.notification.when
- + " ongoing=" + oldNotification.isOngoing()
- + " expanded=" + oldEntry.expanded
- + " contentView=" + oldContentView
- + " rowParent=" + oldEntry.row.getParent());
- Slog.d(TAG, "new notification: when=" + notification.notification.when
- + " ongoing=" + oldNotification.isOngoing()
- + " contentView=" + contentView);
- }
-
-
- // Can we just reapply the RemoteViews in place? If when didn't change, the order
- // didn't change.
- boolean contentsUnchanged = oldEntry.expanded != null
- && contentView != null && oldContentView != null
- && contentView.getPackage() != null
- && oldContentView.getPackage() != null
- && oldContentView.getPackage().equals(contentView.getPackage())
- && oldContentView.getLayoutId() == contentView.getLayoutId();
- ViewGroup rowParent = (ViewGroup) oldEntry.row.getParent();
- boolean orderUnchanged = notification.notification.when==oldNotification.notification.when
- && notification.score == oldNotification.score;
- // score now encompasses/supersedes isOngoing()
-
- boolean updateTicker = notification.notification.tickerText != null
- && !TextUtils.equals(notification.notification.tickerText,
- oldEntry.notification.notification.tickerText);
- boolean isFirstAnyway = rowParent.indexOfChild(oldEntry.row) == 0;
- if (contentsUnchanged && (orderUnchanged || isFirstAnyway)) {
- if (DEBUG) Slog.d(TAG, "reusing notification for key: " + key);
- oldEntry.notification = notification;
- try {
- // Reapply the RemoteViews
- contentView.reapply(mContext, oldEntry.content);
- // update the contentIntent
- final PendingIntent contentIntent = notification.notification.contentIntent;
- if (contentIntent != null) {
- final View.OnClickListener listener = new NotificationClicker(contentIntent,
- notification.pkg, notification.tag, notification.id);
- oldEntry.content.setOnClickListener(listener);
- } else {
- oldEntry.content.setOnClickListener(null);
- }
- // Update the icon.
- final StatusBarIcon ic = new StatusBarIcon(notification.pkg,
- notification.notification.icon, notification.notification.iconLevel,
- notification.notification.number,
- notification.notification.tickerText);
- if (!oldEntry.icon.set(ic)) {
- handleNotificationError(key, notification, "Couldn't update icon: " + ic);
- return;
- }
- }
- catch (RuntimeException e) {
- // It failed to add cleanly. Log, and remove the view from the panel.
- Slog.w(TAG, "Couldn't reapply views for package " + contentView.getPackage(), e);
- removeNotificationViews(key);
- addNotificationViews(key, notification);
- }
- } else {
- if (SPEW) Slog.d(TAG, "not reusing notification");
- removeNotificationViews(key);
- addNotificationViews(key, notification);
- }
-
- // Update the veto button accordingly (and as a result, whether this row is
- // swipe-dismissable)
- updateNotificationVetoButton(oldEntry.row, notification);
-
- // Restart the ticker if it's still running
- if (updateTicker) {
- mTicker.halt();
- tick(notification);
- }
-
- // Recalculate the position of the sliding windows and the titles.
- setAreThereNotifications();
- updateExpandedViewPos(EXPANDED_LEAVE_ALONE);
-
- // See if we need to update the intruder.
- if (ENABLE_INTRUDERS && oldNotification == mCurrentlyIntrudingNotification) {
- if (DEBUG) Slog.d(TAG, "updating the current intruder:" + notification);
- // XXX: this is a hack for Alarms. The real implementation will need to *update*
- // the intruder.
- if (notification.notification.fullScreenIntent == null) { // TODO(dsandler): consistent logic with add()
- if (DEBUG) Slog.d(TAG, "no longer intrudes!");
- mHandler.sendEmptyMessage(MSG_HIDE_INTRUDER);
- }
- }
- }
-
public void removeNotification(IBinder key) {
StatusBarNotification old = removeNotificationViews(key);
if (SPEW) Slog.d(TAG, "removeNotification key=" + key + " old=" + old);
@@ -841,44 +719,6 @@
updateRecentsPanel();
}
-
- StatusBarIconView addNotificationViews(IBinder key, StatusBarNotification notification) {
- if (DEBUG) {
- Slog.d(TAG, "addNotificationViews(key=" + key + ", notification=" + notification);
- }
- // Construct the icon.
- final StatusBarIconView iconView = new StatusBarIconView(mContext,
- notification.pkg + "/0x" + Integer.toHexString(notification.id),
- notification.notification);
- iconView.setScaleType(ImageView.ScaleType.CENTER_INSIDE);
-
- final StatusBarIcon ic = new StatusBarIcon(notification.pkg,
- notification.notification.icon,
- notification.notification.iconLevel,
- notification.notification.number,
- notification.notification.tickerText);
- if (!iconView.set(ic)) {
- handleNotificationError(key, notification, "Couldn't create icon: " + ic);
- return null;
- }
- // Construct the expanded view.
- NotificationData.Entry entry = new NotificationData.Entry(key, notification, iconView);
- if (!inflateViews(entry, mPile)) {
- handleNotificationError(key, notification, "Couldn't expand RemoteViews for: "
- + notification);
- return null;
- }
-
- // Add the expanded view and icon.
- int pos = mNotificationData.add(entry);
- if (DEBUG) {
- Slog.d(TAG, "addNotificationViews: added at " + pos);
- }
- updateNotificationIcons();
-
- return iconView;
- }
-
private void loadNotificationShade() {
int N = mNotificationData.size();
@@ -915,7 +755,8 @@
updateNotificationIcons();
}
- private void updateNotificationIcons() {
+ @Override
+ protected void updateNotificationIcons() {
loadNotificationShade();
final LinearLayout.LayoutParams params
@@ -956,21 +797,8 @@
}
}
- StatusBarNotification removeNotificationViews(IBinder key) {
- NotificationData.Entry entry = mNotificationData.remove(key);
- if (entry == null) {
- Slog.w(TAG, "removeNotification for unknown key: " + key);
- return null;
- }
- // Remove the expanded view.
- ViewGroup rowParent = (ViewGroup)entry.row.getParent();
- if (rowParent != null) rowParent.removeView(entry.row);
- updateNotificationIcons();
-
- return entry.notification;
- }
-
- private void setAreThereNotifications() {
+ @Override
+ protected void setAreThereNotifications() {
final boolean any = mNotificationData.size() > 0;
final boolean clearable = any && mNotificationData.hasClearableItems();
@@ -1754,7 +1582,8 @@
}
}
- private void tick(StatusBarNotification n) {
+ @Override
+ protected void tick(IBinder key, StatusBarNotification n, boolean firstTime) {
// no ticking in lights-out mode
if (!areLightsOn()) return;
@@ -1770,21 +1599,6 @@
}
}
- /**
- * Cancel this notification and tell the StatusBarManagerService / NotificationManagerService
- * about the failure.
- *
- * WARNING: this will call back into us. Don't hold any locks.
- */
- void handleNotificationError(IBinder key, StatusBarNotification n, String message) {
- removeNotification(key);
- try {
- mBarService.onNotificationError(n.pkg, n.tag, n.id, n.uid, n.initialPid, message);
- } catch (RemoteException ex) {
- // The end is nigh.
- }
- }
-
private class MyTicker extends Ticker {
MyTicker(Context context, View sb) {
super(context, sb);
@@ -1957,11 +1771,13 @@
return a < 0f ? 0f : (a > 1f ? 1f : a);
}
- int getExpandedViewMaxHeight() {
+ @Override
+ protected int getExpandedViewMaxHeight() {
return mDisplayMetrics.heightPixels - mNotificationPanelMarginBottomPx;
}
- void updateExpandedViewPos(int expandedPosition) {
+ @Override
+ protected void updateExpandedViewPos(int expandedPosition) {
if (SPEW) {
Slog.d(TAG, "updateExpandedViewPos before expandedPosition=" + expandedPosition
//+ " mTrackingParams.y=" + ((mTrackingParams == null) ? "?" : mTrackingParams.y)
@@ -2288,5 +2104,10 @@
vibrate();
}
};
+
+ @Override
+ protected void haltTicker() {
+ mTicker.halt();
+ }
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBarView.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBarView.java
index a8f5c64..a9cc62a4d6 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBarView.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBarView.java
@@ -31,6 +31,7 @@
import android.widget.FrameLayout;
import com.android.systemui.R;
+import com.android.systemui.statusbar.BaseStatusBar;
import com.android.systemui.statusbar.policy.FixedSizeDrawable;
public class PhoneStatusBarView extends FrameLayout {
@@ -95,7 +96,7 @@
@Override
protected void onSizeChanged(int w, int h, int oldw, int oldh) {
super.onSizeChanged(w, h, oldw, oldh);
- mService.updateExpandedViewPos(PhoneStatusBar.EXPANDED_LEAVE_ALONE);
+ mService.updateExpandedViewPos(BaseStatusBar.EXPANDED_LEAVE_ALONE);
}
@Override
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/BrightnessController.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/BrightnessController.java
index 72fdfad..3ba36af 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/BrightnessController.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/BrightnessController.java
@@ -31,8 +31,8 @@
public class BrightnessController implements ToggleSlider.Listener {
private static final String TAG = "StatusBar.BrightnessController";
- private static final int MINIMUM_BACKLIGHT = android.os.Power.BRIGHTNESS_DIM;
- private static final int MAXIMUM_BACKLIGHT = android.os.Power.BRIGHTNESS_ON;
+ private static final int MINIMUM_BACKLIGHT = android.os.PowerManager.BRIGHTNESS_DIM;
+ private static final int MAXIMUM_BACKLIGHT = android.os.PowerManager.BRIGHTNESS_ON;
private Context mContext;
private ToggleSlider mControl;
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 95704f6..a05fcc1 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/NetworkController.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/NetworkController.java
@@ -83,6 +83,7 @@
int mDataDirectionIconId; // data + data direction on phones
int mDataSignalIconId;
int mDataTypeIconId;
+ int mAirplaneIconId;
boolean mDataActive;
int mMobileActivityIconId; // overlay arrows for data direction
int mLastSignalLevel;
@@ -161,7 +162,7 @@
String contentDescription);
void setMobileDataIndicators(boolean visible, int strengthIcon, int activityIcon,
int typeIcon, String contentDescription, String typeContentDescription);
- void setIsAirplaneMode(boolean is);
+ void setIsAirplaneMode(boolean is, int airplaneIcon);
}
/**
@@ -305,7 +306,7 @@
mContentDescriptionPhoneSignal,
mContentDescriptionDataType);
}
- cluster.setIsAirplaneMode(mAirplaneMode);
+ cluster.setIsAirplaneMode(mAirplaneMode, mAirplaneIconId);
}
public void setStackedMode(boolean stacked) {
@@ -997,7 +998,7 @@
// look again; your radios are now airplanes
mContentDescriptionPhoneSignal = mContext.getString(
R.string.accessibility_airplane_mode);
- mPhoneSignalIconId = mDataSignalIconId = R.drawable.stat_sys_signal_flightmode;
+ mAirplaneIconId = R.drawable.stat_sys_signal_flightmode;
mDataTypeIconId = 0;
// combined values from connected wifi take precedence over airplane mode
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/NotificationRowLayout.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/NotificationRowLayout.java
index 03dfd1c..0fe7a0a 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/NotificationRowLayout.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/NotificationRowLayout.java
@@ -39,6 +39,7 @@
import com.android.systemui.Gefingerpoken;
import com.android.systemui.R;
import com.android.systemui.SwipeHelper;
+import com.android.systemui.statusbar.NotificationData;
import java.util.HashMap;
@@ -175,9 +176,11 @@
}
public boolean canChildBeExpanded(View v) {
- Object isExpandable = v.getTag(R.id.expandable_tag);
- return isExpandable != null && isExpandable instanceof Boolean &&
- ((Boolean)isExpandable).booleanValue();
+ return NotificationData.getIsExpandable(v);
+ }
+
+ public boolean setUserExpandedChild(View v, boolean userExpanded) {
+ return NotificationData.setUserExpanded(v, userExpanded);
}
public void onChildDismissed(View v) {
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/tablet/TabletStatusBar.java b/packages/SystemUI/src/com/android/systemui/statusbar/tablet/TabletStatusBar.java
index b0830ee..906d1aa 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/tablet/TabletStatusBar.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/tablet/TabletStatusBar.java
@@ -109,7 +109,6 @@
private static final boolean FAKE_SPACE_BAR = true;
// Notification "peeking" (flyover preview of individual notifications)
- final static boolean NOTIFICATION_PEEK_ENABLED = false;
final static int NOTIFICATION_PEEK_HOLD_THRESH = 200; // ms
final static int NOTIFICATION_PEEK_FADE_DELAY = 3000; // ms
@@ -127,9 +126,6 @@
IWindowManager mWindowManager;
- // tracking all current notifications
- private NotificationData mNotificationData = new NotificationData();
-
TabletStatusBarView mStatusBarView;
View mNotificationArea;
View mNotificationTrigger;
@@ -160,8 +156,6 @@
int mNotificationPeekTapDuration;
int mNotificationFlingVelocity;
- NotificationRowLayout mPile;
-
BatteryController mBatteryController;
BluetoothController mBluetoothController;
LocationController mLocationController;
@@ -290,47 +284,6 @@
WindowManagerImpl.getDefault().addView(mNotificationPanel, lp);
- // Notification preview window
- if (NOTIFICATION_PEEK_ENABLED) {
- mNotificationPeekWindow = (NotificationPeekPanel) View.inflate(context,
- R.layout.system_bar_notification_peek, null);
- mNotificationPeekWindow.setBar(this);
-
- mNotificationPeekRow = (ViewGroup) mNotificationPeekWindow.findViewById(R.id.content);
- mNotificationPeekWindow.setVisibility(View.GONE);
- mNotificationPeekWindow.setOnTouchListener(
- new TouchOutsideListener(MSG_CLOSE_NOTIFICATION_PEEK, mNotificationPeekWindow));
- mNotificationPeekScrubRight = new LayoutTransition();
- mNotificationPeekScrubRight.setAnimator(LayoutTransition.APPEARING,
- ObjectAnimator.ofInt(null, "left", -512, 0));
- mNotificationPeekScrubRight.setAnimator(LayoutTransition.DISAPPEARING,
- ObjectAnimator.ofInt(null, "left", -512, 0));
- mNotificationPeekScrubRight.setDuration(500);
-
- mNotificationPeekScrubLeft = new LayoutTransition();
- mNotificationPeekScrubLeft.setAnimator(LayoutTransition.APPEARING,
- ObjectAnimator.ofInt(null, "left", 512, 0));
- mNotificationPeekScrubLeft.setAnimator(LayoutTransition.DISAPPEARING,
- ObjectAnimator.ofInt(null, "left", 512, 0));
- mNotificationPeekScrubLeft.setDuration(500);
-
- // XXX: setIgnoreChildren?
- lp = new WindowManager.LayoutParams(
- 512, // ViewGroup.LayoutParams.WRAP_CONTENT,
- ViewGroup.LayoutParams.WRAP_CONTENT,
- WindowManager.LayoutParams.TYPE_STATUS_BAR_PANEL,
- WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS
- | WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM
- | WindowManager.LayoutParams.FLAG_SPLIT_TOUCH,
- PixelFormat.TRANSLUCENT);
- lp.gravity = Gravity.BOTTOM | Gravity.RIGHT;
- lp.y = res.getDimensionPixelOffset(R.dimen.peek_window_y_offset);
- lp.setTitle("NotificationPeekWindow");
- lp.windowAnimations = com.android.internal.R.style.Animation_Toast;
-
- WindowManagerImpl.getDefault().addView(mNotificationPeekWindow, lp);
- }
-
// Recents Panel
mRecentTasksLoader = new RecentTasksLoader(context);
updateRecentsPanel();
@@ -395,6 +348,11 @@
scroller.setFillViewport(true);
}
+ @Override
+ protected int getExpandedViewMaxHeight() {
+ return getNotificationPanelHeight();
+ }
+
private int getNotificationPanelHeight() {
final Resources res = mContext.getResources();
final Display d = WindowManagerImpl.getDefault().getDefaultDisplay();
@@ -494,24 +452,16 @@
// the whole right-hand side of the bar
mNotificationArea = sb.findViewById(R.id.notificationArea);
- if (!NOTIFICATION_PEEK_ENABLED) {
- mNotificationArea.setOnTouchListener(new NotificationTriggerTouchListener());
- }
+ mNotificationArea.setOnTouchListener(new NotificationTriggerTouchListener());
// the button to open the notification area
mNotificationTrigger = sb.findViewById(R.id.notificationTrigger);
- if (NOTIFICATION_PEEK_ENABLED) {
- mNotificationTrigger.setOnTouchListener(new NotificationTriggerTouchListener());
- }
// the more notifications icon
mNotificationIconArea = (NotificationIconArea)sb.findViewById(R.id.notificationIcons);
// where the icons go
mIconLayout = (NotificationIconArea.IconLayout) sb.findViewById(R.id.icons);
- if (NOTIFICATION_PEEK_ENABLED) {
- mIconLayout.setOnTouchListener(new NotificationIconTouchListener());
- }
ViewConfiguration vc = ViewConfiguration.get(context);
mNotificationPeekTapDuration = vc.getTapTimeout();
@@ -827,9 +777,6 @@
case MSG_OPEN_NOTIFICATION_PANEL:
if (DEBUG) Slog.d(TAG, "opening notifications panel");
if (!mNotificationPanel.isShowing()) {
- if (NOTIFICATION_PEEK_ENABLED) {
- mNotificationPeekWindow.setVisibility(View.GONE);
- }
mNotificationPanel.show(true, true);
mNotificationArea.setVisibility(View.INVISIBLE);
mTicker.halt();
@@ -916,106 +863,6 @@
setAreThereNotifications();
}
- public void updateNotification(IBinder key, StatusBarNotification notification) {
- if (DEBUG) Slog.d(TAG, "updateNotification(" + key + " -> " + notification + ")");
-
- final NotificationData.Entry oldEntry = mNotificationData.findByKey(key);
- if (oldEntry == null) {
- Slog.w(TAG, "updateNotification for unknown key: " + key);
- return;
- }
-
- final StatusBarNotification oldNotification = oldEntry.notification;
-
- // XXX: modify when we do something more intelligent with the two content views
- final RemoteViews oldContentView = (oldNotification.notification.bigContentView != null)
- ? oldNotification.notification.bigContentView
- : oldNotification.notification.contentView;
- final RemoteViews contentView = (notification.notification.bigContentView != null)
- ? notification.notification.bigContentView
- : notification.notification.contentView;
-
- if (DEBUG) {
- Slog.d(TAG, "old notification: when=" + oldNotification.notification.when
- + " ongoing=" + oldNotification.isOngoing()
- + " expanded=" + oldEntry.expanded
- + " contentView=" + oldContentView
- + " rowParent=" + oldEntry.row.getParent());
- Slog.d(TAG, "new notification: when=" + notification.notification.when
- + " ongoing=" + oldNotification.isOngoing()
- + " contentView=" + contentView);
- }
-
- // Can we just reapply the RemoteViews in place? If when didn't change, the order
- // didn't change.
- boolean contentsUnchanged = oldEntry.expanded != null
- && contentView != null && oldContentView != null
- && contentView.getPackage() != null
- && oldContentView.getPackage() != null
- && oldContentView.getPackage().equals(contentView.getPackage())
- && oldContentView.getLayoutId() == contentView.getLayoutId();
- ViewGroup rowParent = (ViewGroup) oldEntry.row.getParent();
- boolean orderUnchanged = notification.notification.when==oldNotification.notification.when
- && notification.score == oldNotification.score;
- // score now encompasses/supersedes isOngoing()
- boolean updateTicker = notification.notification.tickerText != null
- && !TextUtils.equals(notification.notification.tickerText,
- oldEntry.notification.notification.tickerText);
- boolean isLastAnyway = rowParent.indexOfChild(oldEntry.row) == rowParent.getChildCount()-1;
- if (contentsUnchanged && (orderUnchanged || isLastAnyway)) {
- if (DEBUG) Slog.d(TAG, "reusing notification for key: " + key);
- oldEntry.notification = notification;
- try {
- // Reapply the RemoteViews
- contentView.reapply(mContext, oldEntry.content);
- // update the contentIntent
- final PendingIntent contentIntent = notification.notification.contentIntent;
- if (contentIntent != null) {
- final View.OnClickListener listener = makeClicker(contentIntent,
- notification.pkg, notification.tag, notification.id);
- oldEntry.content.setOnClickListener(listener);
- } else {
- oldEntry.content.setOnClickListener(null);
- }
- // Update the icon.
- final StatusBarIcon ic = new StatusBarIcon(notification.pkg,
- notification.notification.icon, notification.notification.iconLevel,
- notification.notification.number,
- notification.notification.tickerText);
- if (!oldEntry.icon.set(ic)) {
- handleNotificationError(key, notification, "Couldn't update icon: " + ic);
- return;
- }
-
- if (NOTIFICATION_PEEK_ENABLED && key == mNotificationPeekKey) {
- // must update the peek window
- Message peekMsg = mHandler.obtainMessage(MSG_OPEN_NOTIFICATION_PEEK);
- peekMsg.arg1 = mNotificationPeekIndex;
- mHandler.removeMessages(MSG_OPEN_NOTIFICATION_PEEK);
- mHandler.sendMessage(peekMsg);
- }
- }
- catch (RuntimeException e) {
- // It failed to add cleanly. Log, and remove the view from the panel.
- Slog.w(TAG, "Couldn't reapply views for package " + contentView.getPackage(), e);
- removeNotificationViews(key);
- addNotificationViews(key, notification);
- }
- } else {
- if (DEBUG) Slog.d(TAG, "not reusing notification for key: " + key);
- removeNotificationViews(key);
- addNotificationViews(key, notification);
- }
-
- // Restart the ticker if it's still running
- if (updateTicker) {
- mTicker.halt();
- tick(key, notification, false);
- }
-
- setAreThereNotifications();
- }
-
public void removeNotification(IBinder key) {
if (DEBUG) Slog.d(TAG, "removeNotification(" + key + ")");
removeNotificationViews(key);
@@ -1105,7 +952,8 @@
return n.tickerView != null || !TextUtils.isEmpty(n.tickerText);
}
- private void tick(IBinder key, StatusBarNotification n, boolean firstTime) {
+ @Override
+ protected void tick(IBinder key, StatusBarNotification n, boolean firstTime) {
// Don't show the ticker when the windowshade is open.
if (mNotificationPanel.isShowing()) {
return;
@@ -1134,11 +982,6 @@
}
public void animateExpand() {
- if (NOTIFICATION_PEEK_ENABLED) {
- mHandler.removeMessages(MSG_CLOSE_NOTIFICATION_PEEK);
- mHandler.removeMessages(MSG_OPEN_NOTIFICATION_PEEK);
- mHandler.sendEmptyMessage(MSG_CLOSE_NOTIFICATION_PEEK);
- }
mHandler.removeMessages(MSG_OPEN_NOTIFICATION_PANEL);
mHandler.sendEmptyMessage(MSG_OPEN_NOTIFICATION_PANEL);
}
@@ -1158,10 +1001,6 @@
mHandler.sendEmptyMessage(MSG_CLOSE_INPUT_METHODS_PANEL);
mHandler.removeMessages(MSG_CLOSE_COMPAT_MODE_PANEL);
mHandler.sendEmptyMessage(MSG_CLOSE_COMPAT_MODE_PANEL);
- if (NOTIFICATION_PEEK_ENABLED) {
- mHandler.removeMessages(MSG_CLOSE_NOTIFICATION_PEEK);
- mHandler.sendEmptyMessage(MSG_CLOSE_NOTIFICATION_PEEK);
- }
}
@Override // CommandQueue
@@ -1350,24 +1189,13 @@
}
}
- private void setAreThereNotifications() {
+ @Override
+ protected void setAreThereNotifications() {
if (mNotificationPanel != null) {
mNotificationPanel.setClearable(mNotificationData.hasClearableItems());
}
}
- /**
- * Cancel this notification and tell the status bar service about the failure. Hold no locks.
- */
- void handleNotificationError(IBinder key, StatusBarNotification n, String message) {
- removeNotification(key);
- try {
- mBarService.onNotificationError(n.pkg, n.tag, n.id, n.uid, n.initialPid, message);
- } catch (RemoteException ex) {
- // The end is nigh.
- }
- }
-
private View.OnClickListener mOnClickListener = new View.OnClickListener() {
public void onClick(View v) {
if (v == mRecentButton) {
@@ -1405,28 +1233,6 @@
mHandler.sendEmptyMessage(msg);
}
- StatusBarNotification removeNotificationViews(IBinder key) {
- NotificationData.Entry entry = mNotificationData.remove(key);
- if (entry == null) {
- Slog.w(TAG, "removeNotification for unknown key: " + key);
- return null;
- }
- // Remove the expanded view.
- ViewGroup rowParent = (ViewGroup)entry.row.getParent();
- if (rowParent != null) rowParent.removeView(entry.row);
-
- if (NOTIFICATION_PEEK_ENABLED && key == mNotificationPeekKey) {
- // must close the peek as well, since it's gone
- mHandler.sendEmptyMessage(MSG_CLOSE_NOTIFICATION_PEEK);
- }
- // Remove the icon.
-// ViewGroup iconParent = (ViewGroup)entry.icon.getParent();
-// if (iconParent != null) iconParent.removeView(entry.icon);
- updateNotificationIcons();
-
- return entry.notification;
- }
-
private class NotificationTriggerTouchListener implements View.OnTouchListener {
VelocityTracker mVT;
float mInitialTouchX, mInitialTouchY;
@@ -1619,50 +1425,14 @@
}
}
- StatusBarIconView addNotificationViews(IBinder key, StatusBarNotification notification) {
- if (DEBUG) {
- Slog.d(TAG, "addNotificationViews(key=" + key + ", notification=" + notification);
- }
- // Construct the icon.
- final StatusBarIconView iconView = new StatusBarIconView(mContext,
- notification.pkg + "/0x" + Integer.toHexString(notification.id),
- notification.notification);
- iconView.setScaleType(ImageView.ScaleType.CENTER_INSIDE);
-
- final StatusBarIcon ic = new StatusBarIcon(notification.pkg,
- notification.notification.icon,
- notification.notification.iconLevel,
- notification.notification.number,
- notification.notification.tickerText);
- if (!iconView.set(ic)) {
- handleNotificationError(key, notification, "Couldn't attach StatusBarIcon: " + ic);
- return null;
- }
- // Construct the expanded view.
- NotificationData.Entry entry = new NotificationData.Entry(key, notification, iconView);
- if (!inflateViews(entry, mPile)) {
- handleNotificationError(key, notification, "Couldn't expand RemoteViews for: "
- + notification);
- return null;
- }
-
- // Add the icon.
- int pos = mNotificationData.add(entry);
- if (DEBUG) {
- Slog.d(TAG, "addNotificationViews: added at " + pos);
- }
- updateNotificationIcons();
-
- return iconView;
- }
-
private void reloadAllNotificationIcons() {
if (mIconLayout == null) return;
mIconLayout.removeAllViews();
updateNotificationIcons();
}
- private void updateNotificationIcons() {
+ @Override
+ protected void updateNotificationIcons() {
// XXX: need to implement a new limited linear layout class
// to avoid removing & readding everything
@@ -1835,6 +1605,19 @@
mNetworkController.dump(fd, pw, args);
}
+ @Override
+ protected boolean isTopNotification(ViewGroup parent, NotificationData.Entry entry) {
+ return parent.indexOfChild(entry.row) == parent.getChildCount()-1;
+ }
+
+ @Override
+ protected void haltTicker() {
+ mTicker.halt();
+ }
+
+ @Override
+ protected void updateExpandedViewPos(int expandedPosition) {
+ }
}
diff --git a/policy/src/com/android/internal/policy/impl/GlobalActions.java b/policy/src/com/android/internal/policy/impl/GlobalActions.java
index 3fa79b6..aa73de4 100644
--- a/policy/src/com/android/internal/policy/impl/GlobalActions.java
+++ b/policy/src/com/android/internal/policy/impl/GlobalActions.java
@@ -16,14 +16,12 @@
package com.android.internal.policy.impl;
-import com.android.internal.app.ShutdownThread;
import com.android.internal.telephony.TelephonyIntents;
import com.android.internal.telephony.TelephonyProperties;
import com.android.internal.R;
import android.app.ActivityManagerNative;
import android.app.AlertDialog;
-import android.app.admin.DevicePolicyManager;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.DialogInterface;
@@ -48,6 +46,7 @@
import android.view.View;
import android.view.ViewGroup;
import android.view.WindowManager;
+import android.view.WindowManagerPolicy.WindowManagerFuncs;
import android.widget.AdapterView;
import android.widget.BaseAdapter;
import android.widget.ImageView;
@@ -68,6 +67,7 @@
private static final boolean SHOW_SILENT_TOGGLE = true;
private final Context mContext;
+ private final WindowManagerFuncs mWindowManagerFuncs;
private final AudioManager mAudioManager;
private ArrayList<Action> mItems;
@@ -88,8 +88,9 @@
/**
* @param context everything needs a context :(
*/
- public GlobalActions(Context context) {
+ public GlobalActions(Context context, WindowManagerFuncs windowManagerFuncs) {
mContext = context;
+ mWindowManagerFuncs = windowManagerFuncs;
mAudioManager = (AudioManager) mContext.getSystemService(Context.AUDIO_SERVICE);
// receive broadcasts
@@ -186,11 +187,11 @@
public void onPress() {
// shutdown by making sure radio and power are handled accordingly.
- ShutdownThread.shutdown(mContext, true);
+ mWindowManagerFuncs.shutdown();
}
public boolean onLongPress() {
- ShutdownThread.rebootSafeMode(mContext, true);
+ mWindowManagerFuncs.rebootSafeMode();
return true;
}
diff --git a/policy/src/com/android/internal/policy/impl/LockScreen.java b/policy/src/com/android/internal/policy/impl/LockScreen.java
index c7a30e2..f34f9a9 100644
--- a/policy/src/com/android/internal/policy/impl/LockScreen.java
+++ b/policy/src/com/android/internal/policy/impl/LockScreen.java
@@ -322,6 +322,7 @@
mCallback.pokeWakelock();
break;
+ case com.android.internal.R.drawable.ic_lockscreen_unlock_phantom:
case com.android.internal.R.drawable.ic_lockscreen_unlock:
mCallback.goToUnlockScreen();
break;
@@ -341,7 +342,7 @@
try {
mContext.startActivity(intent);
} catch (ActivityNotFoundException e) {
- Log.w(TAG, "Camera application not found");
+ Log.w(TAG, "Activity not found for intent + " + intent.getAction());
}
}
diff --git a/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java b/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java
index 794ed15..8e187cd 100755
--- a/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java
+++ b/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java
@@ -60,7 +60,6 @@
import android.provider.Settings;
import com.android.internal.R;
-import com.android.internal.app.ShutdownThread;
import com.android.internal.policy.PolicyManager;
import com.android.internal.statusbar.IStatusBarService;
import com.android.internal.telephony.ITelephony;
@@ -727,7 +726,7 @@
mPowerKeyHandled = true;
performHapticFeedbackLw(null, HapticFeedbackConstants.LONG_PRESS, false);
sendCloseSystemWindows(SYSTEM_DIALOG_REASON_GLOBAL_ACTIONS);
- ShutdownThread.shutdown(mContext, true);
+ mWindowManagerFuncs.shutdown();
break;
}
}
@@ -741,7 +740,7 @@
void showGlobalActionsDialog() {
if (mGlobalActions == null) {
- mGlobalActions = new GlobalActions(mContext);
+ mGlobalActions = new GlobalActions(mContext, mWindowManagerFuncs);
}
final boolean keyguardShowing = keyguardIsShowingTq();
mGlobalActions.showDialog(keyguardShowing, isDeviceProvisioned());
diff --git a/services/input/InputReader.h b/services/input/InputReader.h
index 03198a6..122a2ab 100644
--- a/services/input/InputReader.h
+++ b/services/input/InputReader.h
@@ -22,6 +22,8 @@
#include "InputListener.h"
#include <androidfw/Input.h>
+#include <androidfw/VelocityControl.h>
+#include <androidfw/VelocityTracker.h>
#include <ui/DisplayInfo.h>
#include <utils/KeyedVector.h>
#include <utils/threads.h>
diff --git a/services/input/PointerController.h b/services/input/PointerController.h
index 39dbf6b..4c307c4 100644
--- a/services/input/PointerController.h
+++ b/services/input/PointerController.h
@@ -21,6 +21,7 @@
#include <ui/DisplayInfo.h>
#include <androidfw/Input.h>
+#include <utils/BitSet.h>
#include <utils/RefBase.h>
#include <utils/Looper.h>
#include <utils/String8.h>
diff --git a/services/java/com/android/server/PowerManagerService.java b/services/java/com/android/server/PowerManagerService.java
index 289ab2a..2cc2704 100644
--- a/services/java/com/android/server/PowerManagerService.java
+++ b/services/java/com/android/server/PowerManagerService.java
@@ -17,8 +17,8 @@
package com.android.server;
import com.android.internal.app.IBatteryStats;
-import com.android.internal.app.ShutdownThread;
import com.android.server.am.BatteryStatsService;
+import com.android.server.pm.ShutdownThread;
import android.app.ActivityManagerNative;
import android.app.IActivityManager;
@@ -47,7 +47,6 @@
import android.os.IPowerManager;
import android.os.LocalPowerManager;
import android.os.Message;
-import android.os.Power;
import android.os.PowerManager;
import android.os.Process;
import android.os.RemoteException;
@@ -71,6 +70,7 @@
import static android.provider.Settings.System.TRANSITION_ANIMATION_SCALE;
import java.io.FileDescriptor;
+import java.io.IOException;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.HashMap;
@@ -84,6 +84,12 @@
private static final String TAG = "PowerManagerService";
static final String PARTIAL_NAME = "PowerManagerService";
+ // Wake lock that ensures that the CPU is running. The screen might not be on.
+ private static final int PARTIAL_WAKE_LOCK_ID = 1;
+
+ // Wake lock that ensures that the screen is on.
+ private static final int FULL_WAKE_LOCK_ID = 2;
+
static final boolean DEBUG_SCREEN_ON = false;
private static final boolean LOG_PARTIAL_WL = false;
@@ -134,6 +140,10 @@
// Screen brightness should always have a value, but just in case...
private static final int DEFAULT_SCREEN_BRIGHTNESS = 192;
+ // Threshold for BRIGHTNESS_LOW_BATTERY (percentage)
+ // Screen will stay dim if battery level is <= LOW_BATTERY_THRESHOLD
+ private static final int LOW_BATTERY_THRESHOLD = 10;
+
// flags for setPowerState
private static final int ALL_LIGHTS_OFF = 0x00000000;
private static final int SCREEN_ON_BIT = 0x00000001;
@@ -175,8 +185,8 @@
// we should read them from the driver, but our current hardware returns 0
// for the initial value. Oops!
static final int INITIAL_SCREEN_BRIGHTNESS = 255;
- static final int INITIAL_BUTTON_BRIGHTNESS = Power.BRIGHTNESS_OFF;
- static final int INITIAL_KEYBOARD_BRIGHTNESS = Power.BRIGHTNESS_OFF;
+ static final int INITIAL_BUTTON_BRIGHTNESS = PowerManager.BRIGHTNESS_OFF;
+ static final int INITIAL_KEYBOARD_BRIGHTNESS = PowerManager.BRIGHTNESS_OFF;
private final int MY_UID;
private final int MY_PID;
@@ -296,6 +306,11 @@
private native void nativeInit();
private native void nativeSetPowerState(boolean screenOn, boolean screenBright);
private native void nativeStartSurfaceFlingerAnimation(int mode);
+ private static native void nativeAcquireWakeLock(int lock, String id);
+ private static native void nativeReleaseWakeLock(String id);
+ private static native int nativeSetScreenState(boolean on);
+ private static native void nativeShutdown();
+ private static native void nativeReboot(String reason) throws IOException;
/*
static PrintStream mLog;
@@ -515,14 +530,13 @@
MY_PID = Process.myPid();
Binder.restoreCallingIdentity(token);
- // XXX remove this when the kernel doesn't timeout wake locks
- Power.setLastUserActivityTimeout(7*24*3600*1000); // one week
-
// assume nothing is on yet
mUserState = mPowerState = 0;
// Add ourself to the Watchdog monitors.
Watchdog.getInstance().addMonitor(this);
+
+ nativeInit();
}
private ContentQueryMap mSettings;
@@ -541,11 +555,6 @@
mAttentionLight = lights.getLight(LightsService.LIGHT_ID_ATTENTION);
mHeadless = "1".equals(SystemProperties.get("ro.config.headless", "0"));
- nativeInit();
- synchronized (mLocks) {
- updateNativePowerStateLocked();
- }
-
mInitComplete = false;
mScreenBrightnessAnimator = new ScreenBrightnessAnimator("mScreenBrightnessUpdaterThread",
Process.THREAD_PRIORITY_DISPLAY);
@@ -581,8 +590,6 @@
}
}
- nativeInit();
- Power.powerInitNative();
synchronized (mLocks) {
updateNativePowerStateLocked();
// We make sure to start out with the screen on due to user activity.
@@ -686,6 +693,26 @@
}
}
+ /**
+ * Low-level function turn the device off immediately, without trying
+ * to be clean. Most people should use
+ * {@link com.android.server.pm.internal.app.ShutdownThread} for a clean shutdown.
+ */
+ public static void lowLevelShutdown() {
+ nativeShutdown();
+ }
+
+ /**
+ * Low-level function to reboot the device.
+ *
+ * @param reason code to pass to the kernel (e.g. "recovery"), or null.
+ * @throws IOException if reboot fails for some reason (eg, lack of
+ * permission)
+ */
+ public static void lowLevelReboot(String reason) throws IOException {
+ nativeReboot(reason);
+ }
+
private class WakeLock implements IBinder.DeathRecipient
{
WakeLock(int f, IBinder b, String t, int u, int p) {
@@ -926,7 +953,7 @@
if (LOG_PARTIAL_WL) EventLog.writeEvent(EventLogTags.POWER_PARTIAL_WAKE_STATE, 1, tag);
}
}
- Power.acquireWakeLock(Power.PARTIAL_WAKE_LOCK,PARTIAL_NAME);
+ nativeAcquireWakeLock(PARTIAL_WAKE_LOCK_ID, PARTIAL_NAME);
}
if (diffsource) {
@@ -1010,7 +1037,7 @@
mPartialCount--;
if (mPartialCount == 0) {
if (LOG_PARTIAL_WL) EventLog.writeEvent(EventLogTags.POWER_PARTIAL_WAKE_STATE, 0, wl.tag);
- Power.releaseWakeLock(PARTIAL_NAME);
+ nativeReleaseWakeLock(PARTIAL_NAME);
}
}
// Unlink the lock from the binder.
@@ -1719,10 +1746,10 @@
+ " mSkippedScreenOn=" + mSkippedScreenOn);
}
mScreenBrightnessHandler.removeMessages(ScreenBrightnessAnimator.ANIMATE_LIGHTS);
- mScreenBrightnessAnimator.animateTo(Power.BRIGHTNESS_OFF, SCREEN_BRIGHT_BIT, 0);
+ mScreenBrightnessAnimator.animateTo(PowerManager.BRIGHTNESS_OFF, SCREEN_BRIGHT_BIT, 0);
}
}
- int err = Power.setScreenState(on);
+ int err = nativeSetScreenState(on);
if (err == 0) {
mLastScreenOnTime = (on ? SystemClock.elapsedRealtime() : 0);
if (mUseSoftwareAutoBrightness) {
@@ -1934,7 +1961,7 @@
private boolean batteryIsLow() {
return (!mIsPowered &&
- mBatteryService.getBatteryLevel() <= Power.LOW_BATTERY_THRESHOLD);
+ mBatteryService.getBatteryLevel() <= LOW_BATTERY_THRESHOLD);
}
private boolean shouldDeferScreenOnLocked() {
@@ -2024,7 +2051,7 @@
nominalCurrentValue = mScreenBrightnessDim;
break;
case 0:
- nominalCurrentValue = Power.BRIGHTNESS_OFF;
+ nominalCurrentValue = PowerManager.BRIGHTNESS_OFF;
break;
case SCREEN_BRIGHT_BIT:
default:
@@ -2050,7 +2077,7 @@
// was dim
steps = (int)(ANIM_STEPS*ratio*scale);
}
- brightness = Power.BRIGHTNESS_OFF;
+ brightness = PowerManager.BRIGHTNESS_OFF;
} else {
if ((oldState & SCREEN_ON_BIT) != 0) {
// was bright
@@ -2101,13 +2128,13 @@
if (offMask != 0) {
if (mSpew) Slog.i(TAG, "Setting brightess off: " + offMask);
- setLightBrightness(offMask, Power.BRIGHTNESS_OFF);
+ setLightBrightness(offMask, PowerManager.BRIGHTNESS_OFF);
}
if (dimMask != 0) {
int brightness = mScreenBrightnessDim;
if ((newState & BATTERY_LOW_BIT) != 0 &&
- brightness > Power.BRIGHTNESS_LOW_BATTERY) {
- brightness = Power.BRIGHTNESS_LOW_BATTERY;
+ brightness > PowerManager.BRIGHTNESS_LOW_BATTERY) {
+ brightness = PowerManager.BRIGHTNESS_LOW_BATTERY;
}
if (mSpew) Slog.i(TAG, "Setting brightess dim " + brightness + ": " + dimMask);
setLightBrightness(dimMask, brightness);
@@ -2115,8 +2142,8 @@
if (onMask != 0) {
int brightness = getPreferredBrightness();
if ((newState & BATTERY_LOW_BIT) != 0 &&
- brightness > Power.BRIGHTNESS_LOW_BATTERY) {
- brightness = Power.BRIGHTNESS_LOW_BATTERY;
+ brightness > PowerManager.BRIGHTNESS_LOW_BATTERY) {
+ brightness = PowerManager.BRIGHTNESS_LOW_BATTERY;
}
if (mSpew) Slog.i(TAG, "Setting brightess on " + brightness + ": " + onMask);
setLightBrightness(onMask, brightness);
@@ -2198,8 +2225,8 @@
if (elapsed < duration) {
int delta = endValue - startValue;
newValue = startValue + delta * elapsed / duration;
- newValue = Math.max(Power.BRIGHTNESS_OFF, newValue);
- newValue = Math.min(Power.BRIGHTNESS_ON, newValue);
+ newValue = Math.max(PowerManager.BRIGHTNESS_OFF, newValue);
+ newValue = Math.min(PowerManager.BRIGHTNESS_ON, newValue);
} else {
newValue = endValue;
mInitialAnimation = false;
@@ -2249,7 +2276,7 @@
if (target != currentValue) {
final boolean doScreenAnim = (mask & (SCREEN_BRIGHT_BIT | SCREEN_ON_BIT)) != 0;
- final boolean turningOff = endValue == Power.BRIGHTNESS_OFF;
+ final boolean turningOff = endValue == PowerManager.BRIGHTNESS_OFF;
if (turningOff && doScreenAnim) {
// Cancel all pending animations since we're turning off
mScreenBrightnessHandler.removeCallbacksAndMessages(null);
@@ -2353,7 +2380,7 @@
private boolean isScreenTurningOffLocked() {
return (mScreenBrightnessAnimator.isAnimating()
- && mScreenBrightnessAnimator.endValue == Power.BRIGHTNESS_OFF);
+ && mScreenBrightnessAnimator.endValue == PowerManager.BRIGHTNESS_OFF);
}
private boolean shouldLog(long time) {
diff --git a/services/java/com/android/server/ShutdownActivity.java b/services/java/com/android/server/ShutdownActivity.java
index c9d4d01..d85abe6 100644
--- a/services/java/com/android/server/ShutdownActivity.java
+++ b/services/java/com/android/server/ShutdownActivity.java
@@ -22,7 +22,8 @@
import android.os.Bundle;
import android.os.Handler;
import android.util.Slog;
-import com.android.internal.app.ShutdownThread;
+
+import com.android.server.pm.ShutdownThread;
public class ShutdownActivity extends Activity {
diff --git a/services/java/com/android/server/SystemServer.java b/services/java/com/android/server/SystemServer.java
index 849281d..d9833ab 100644
--- a/services/java/com/android/server/SystemServer.java
+++ b/services/java/com/android/server/SystemServer.java
@@ -46,7 +46,6 @@
import android.util.Slog;
import android.view.WindowManager;
-import com.android.internal.app.ShutdownThread;
import com.android.internal.os.BinderInternal;
import com.android.internal.os.SamplingProfilerIntegration;
import com.android.internal.widget.LockSettingsService;
@@ -56,6 +55,7 @@
import com.android.server.net.NetworkPolicyManagerService;
import com.android.server.net.NetworkStatsService;
import com.android.server.pm.PackageManagerService;
+import com.android.server.pm.ShutdownThread;
import com.android.server.usb.UsbService;
import com.android.server.wm.WindowManagerService;
diff --git a/services/java/com/android/server/accessibility/AccessibilityManagerService.java b/services/java/com/android/server/accessibility/AccessibilityManagerService.java
index df7bbf2..0c6d85d 100644
--- a/services/java/com/android/server/accessibility/AccessibilityManagerService.java
+++ b/services/java/com/android/server/accessibility/AccessibilityManagerService.java
@@ -1701,14 +1701,9 @@
| AccessibilityNodeInfo.ACTION_NEXT_AT_MOVEMENT_GRANULARITY
| AccessibilityNodeInfo.ACTION_PREVIOUS_AT_MOVEMENT_GRANULARITY
| AccessibilityNodeInfo.ACTION_NEXT_HTML_ELEMENT
- | AccessibilityNodeInfo.ACTION_PREVIOUS_HTML_ELEMENT;
-
- private static final int VALID_GRANULARITIES =
- AccessibilityNodeInfo.MOVEMENT_GRANULARITY_CHARACTER
- | AccessibilityNodeInfo.MOVEMENT_GRANULARITY_WORD
- | AccessibilityNodeInfo.MOVEMENT_GRANULARITY_LINE
- | AccessibilityNodeInfo.MOVEMENT_GRANULARITY_PARAGRAPH
- | AccessibilityNodeInfo.MOVEMENT_GRANULARITY_PAGE;
+ | AccessibilityNodeInfo.ACTION_PREVIOUS_HTML_ELEMENT
+ | AccessibilityNodeInfo.ACTION_SCROLL_FORWARD
+ | AccessibilityNodeInfo.ACTION_SCROLL_BACKWARD;
private static final int RETRIEVAL_ALLOWING_EVENT_TYPES =
AccessibilityEvent.TYPE_VIEW_CLICKED
diff --git a/services/java/com/android/server/am/ActivityRecord.java b/services/java/com/android/server/am/ActivityRecord.java
index 97bfd6f..ad80273 100644
--- a/services/java/com/android/server/am/ActivityRecord.java
+++ b/services/java/com/android/server/am/ActivityRecord.java
@@ -552,7 +552,8 @@
void applyOptionsLocked() {
if (pendingOptions != null) {
- switch (pendingOptions.getAnimationType()) {
+ final int animationType = pendingOptions.getAnimationType();
+ switch (animationType) {
case ActivityOptions.ANIM_CUSTOM:
service.mWindowManager.overridePendingAppTransition(
pendingOptions.getPackageName(),
@@ -571,10 +572,13 @@
}
break;
case ActivityOptions.ANIM_THUMBNAIL:
+ case ActivityOptions.ANIM_THUMBNAIL_DELAYED:
+ boolean delayed = (animationType == ActivityOptions.ANIM_THUMBNAIL_DELAYED);
service.mWindowManager.overridePendingAppTransitionThumb(
pendingOptions.getThumbnail(),
pendingOptions.getStartX(), pendingOptions.getStartY(),
- pendingOptions.getOnAnimationStartListener());
+ pendingOptions.getOnAnimationStartListener(),
+ delayed);
if (intent.getSourceBounds() == null) {
intent.setSourceBounds(new Rect(pendingOptions.getStartX(),
pendingOptions.getStartY(),
diff --git a/services/java/com/android/server/input/InputManagerService.java b/services/java/com/android/server/input/InputManagerService.java
index 299649d..9e94b52 100644
--- a/services/java/com/android/server/input/InputManagerService.java
+++ b/services/java/com/android/server/input/InputManagerService.java
@@ -597,7 +597,7 @@
visitAllKeyboardLayouts(new KeyboardLayoutVisitor() {
@Override
public void visitKeyboardLayout(Resources resources,
- String descriptor, String label, int kcmResId) {
+ String descriptor, String label, int keyboardLayoutResId) {
list.add(new KeyboardLayout(descriptor, label));
}
});
@@ -614,7 +614,7 @@
visitKeyboardLayout(keyboardLayoutDescriptor, new KeyboardLayoutVisitor() {
@Override
public void visitKeyboardLayout(Resources resources,
- String descriptor, String label, int kcmResId) {
+ String descriptor, String label, int keyboardLayoutResId) {
result[0] = new KeyboardLayout(descriptor, label);
}
});
@@ -683,10 +683,11 @@
com.android.internal.R.styleable.KeyboardLayout_name);
String label = a.getString(
com.android.internal.R.styleable.KeyboardLayout_label);
- int kcmResId = a.getResourceId(
- com.android.internal.R.styleable.KeyboardLayout_kcm, 0);
- if (name == null || label == null || kcmResId == 0) {
- Log.w(TAG, "Missing required 'name', 'label' or 'kcm' "
+ int keyboardLayoutResId = a.getResourceId(
+ com.android.internal.R.styleable.KeyboardLayout_keyboardLayout,
+ 0);
+ if (name == null || label == null || keyboardLayoutResId == 0) {
+ Log.w(TAG, "Missing required 'name', 'label' or 'keyboardLayout' "
+ "attributes in keyboard layout "
+ "resource from receiver "
+ receiver.packageName + "/" + receiver.name);
@@ -695,7 +696,7 @@
receiver.packageName, receiver.name, name);
if (keyboardName == null || name.equals(keyboardName)) {
visitor.visitKeyboardLayout(resources, descriptor,
- label, kcmResId);
+ label, keyboardLayoutResId);
}
}
} finally {
@@ -1138,11 +1139,11 @@
visitKeyboardLayout(keyboardLayoutDescriptor, new KeyboardLayoutVisitor() {
@Override
public void visitKeyboardLayout(Resources resources,
- String descriptor, String label, int kcmResId) {
+ String descriptor, String label, int keyboardLayoutResId) {
try {
result[0] = descriptor;
result[1] = Streams.readFully(new InputStreamReader(
- resources.openRawResource(kcmResId)));
+ resources.openRawResource(keyboardLayoutResId)));
} catch (IOException ex) {
} catch (NotFoundException ex) {
}
@@ -1261,7 +1262,7 @@
private interface KeyboardLayoutVisitor {
void visitKeyboardLayout(Resources resources,
- String descriptor, String label, int kcmResId);
+ String descriptor, String label, int keyboardLayoutResId);
}
private final class InputDevicesChangedListenerRecord implements DeathRecipient {
diff --git a/services/java/com/android/server/net/NetworkStatsService.java b/services/java/com/android/server/net/NetworkStatsService.java
index e710b33..0e93b0a 100644
--- a/services/java/com/android/server/net/NetworkStatsService.java
+++ b/services/java/com/android/server/net/NetworkStatsService.java
@@ -608,17 +608,19 @@
// clamp threshold into safe range
mPersistThreshold = MathUtils.constrain(thresholdBytes, 128 * KB_IN_BYTES, 2 * MB_IN_BYTES);
- updatePersistThresholds();
-
if (LOGV) {
Slog.v(TAG, "advisePersistThreshold() given " + thresholdBytes + ", clamped to "
+ mPersistThreshold);
}
- // persist if beyond new thresholds
+ // update and persist if beyond new thresholds
final long currentTime = mTime.hasCache() ? mTime.currentTimeMillis()
: System.currentTimeMillis();
synchronized (mStatsLock) {
+ if (!mSystemReady) return;
+
+ updatePersistThresholds();
+
mDevRecorder.maybePersistLocked(currentTime);
mXtRecorder.maybePersistLocked(currentTime);
mUidRecorder.maybePersistLocked(currentTime);
diff --git a/services/java/com/android/server/pm/PackageManagerService.java b/services/java/com/android/server/pm/PackageManagerService.java
index d41cd5a..d7c5eea 100644
--- a/services/java/com/android/server/pm/PackageManagerService.java
+++ b/services/java/com/android/server/pm/PackageManagerService.java
@@ -98,6 +98,7 @@
import android.os.SystemClock;
import android.os.SystemProperties;
import android.os.UserId;
+import android.provider.Settings.Secure;
import android.security.SystemKeyStore;
import android.util.DisplayMetrics;
import android.util.EventLog;
@@ -9259,7 +9260,8 @@
mContext.enforceCallingOrSelfPermission(GRANT_REVOKE_PERMISSIONS, null);
if (READ_EXTERNAL_STORAGE.equals(permission)) {
synchronized (mPackages) {
- if (mSettings.mReadExternalStorageEnforced != enforced) {
+ if (mSettings.mReadExternalStorageEnforced == null
+ || mSettings.mReadExternalStorageEnforced != enforced) {
mSettings.mReadExternalStorageEnforced = enforced;
mSettings.writeLPr();
@@ -9284,7 +9286,6 @@
@Override
public boolean isPermissionEnforced(String permission) {
- mContext.enforceCallingOrSelfPermission(GRANT_REVOKE_PERMISSIONS, null);
synchronized (mPackages) {
return isPermissionEnforcedLocked(permission);
}
@@ -9292,7 +9293,13 @@
private boolean isPermissionEnforcedLocked(String permission) {
if (READ_EXTERNAL_STORAGE.equals(permission)) {
- return mSettings.mReadExternalStorageEnforced;
+ if (mSettings.mReadExternalStorageEnforced != null) {
+ return mSettings.mReadExternalStorageEnforced;
+ } else {
+ // if user hasn't defined, fall back to secure default
+ return Secure.getInt(mContext.getContentResolver(),
+ Secure.READ_EXTERNAL_STORAGE_ENFORCED_DEFAULT, 0) != 0;
+ }
} else {
return true;
}
diff --git a/services/java/com/android/server/pm/Settings.java b/services/java/com/android/server/pm/Settings.java
index d0eda2d..ffb69fa 100644
--- a/services/java/com/android/server/pm/Settings.java
+++ b/services/java/com/android/server/pm/Settings.java
@@ -111,7 +111,7 @@
int mInternalSdkPlatform;
int mExternalSdkPlatform;
- boolean mReadExternalStorageEnforced = PackageManager.DEFAULT_ENFORCE_READ_EXTERNAL_STORAGE;
+ Boolean mReadExternalStorageEnforced;
/** Device identity for the purpose of package verification. */
private VerifierDeviceIdentity mVerifierDeviceIdentity;
@@ -1147,8 +1147,7 @@
serializer.endTag(null, "verifier");
}
- if (mReadExternalStorageEnforced
- != PackageManager.DEFAULT_ENFORCE_READ_EXTERNAL_STORAGE) {
+ if (mReadExternalStorageEnforced != null) {
serializer.startTag(null, TAG_READ_EXTERNAL_STORAGE);
serializer.attribute(
null, ATTR_ENFORCEMENT, mReadExternalStorageEnforced ? "1" : "0");
diff --git a/core/java/com/android/internal/app/ShutdownThread.java b/services/java/com/android/server/pm/ShutdownThread.java
similarity index 98%
rename from core/java/com/android/internal/app/ShutdownThread.java
rename to services/java/com/android/server/pm/ShutdownThread.java
index d867ff9..1d6e068 100644
--- a/core/java/com/android/internal/app/ShutdownThread.java
+++ b/services/java/com/android/server/pm/ShutdownThread.java
@@ -15,7 +15,7 @@
*/
-package com.android.internal.app;
+package com.android.server.pm;
import android.app.ActivityManagerNative;
import android.app.AlertDialog;
@@ -32,7 +32,6 @@
import android.content.Intent;
import android.content.IntentFilter;
import android.os.Handler;
-import android.os.Power;
import android.os.PowerManager;
import android.os.RemoteException;
import android.os.ServiceManager;
@@ -44,6 +43,8 @@
import android.os.storage.IMountShutdownObserver;
import com.android.internal.telephony.ITelephony;
+import com.android.server.PowerManagerService;
+
import android.util.Log;
import android.view.WindowManager;
@@ -456,7 +457,7 @@
if (reboot) {
Log.i(TAG, "Rebooting, reason: " + reason);
try {
- Power.reboot(reason);
+ PowerManagerService.lowLevelReboot(reason);
} catch (Exception e) {
Log.e(TAG, "Reboot failed, will attempt shutdown instead", e);
}
@@ -479,6 +480,6 @@
// Shutdown power
Log.i(TAG, "Performing low-level shutdown...");
- Power.shutdown();
+ PowerManagerService.lowLevelShutdown();
}
}
diff --git a/services/java/com/android/server/usb/UsbDeviceManager.java b/services/java/com/android/server/usb/UsbDeviceManager.java
index 526c204..a115345 100644
--- a/services/java/com/android/server/usb/UsbDeviceManager.java
+++ b/services/java/com/android/server/usb/UsbDeviceManager.java
@@ -322,8 +322,6 @@
String state = FileUtils.readTextFile(new File(STATE_PATH), 0, null).trim();
updateState(state);
mAdbEnabled = containsFunction(mCurrentFunctions, UsbManager.USB_FUNCTION_ADB);
- mAudioSourceEnabled = containsFunction(mCurrentFunctions,
- UsbManager.USB_FUNCTION_AUDIO_SOURCE);
// Upgrade step for previous versions that used persist.service.adb.enable
String value = SystemProperties.get("persist.service.adb.enable", "");
@@ -537,26 +535,29 @@
mContext.sendStickyBroadcast(intent);
}
- private void updateAudioSourceFunction(boolean enabled) {
- // send a sticky broadcast containing current USB state
- Intent intent = new Intent(Intent.ACTION_USB_AUDIO_ACCESSORY_PLUG);
- intent.addFlags(Intent.FLAG_RECEIVER_REPLACE_PENDING);
- intent.addFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY);
- intent.putExtra("state", (enabled ? 1 : 0));
- if (enabled) {
- try {
- Scanner scanner = new Scanner(new File(AUDIO_SOURCE_PCM_PATH));
- int card = scanner.nextInt();
- int device = scanner.nextInt();
- intent.putExtra("card", card);
- intent.putExtra("device", device);
- } catch (FileNotFoundException e) {
- Slog.e(TAG, "could not open audio source PCM file", e);
+ private void updateAudioSourceFunction() {
+ boolean enabled = containsFunction(mCurrentFunctions,
+ UsbManager.USB_FUNCTION_AUDIO_SOURCE);
+ if (enabled != mAudioSourceEnabled) {
+ // send a sticky broadcast containing current USB state
+ Intent intent = new Intent(Intent.ACTION_USB_AUDIO_ACCESSORY_PLUG);
+ intent.addFlags(Intent.FLAG_RECEIVER_REPLACE_PENDING);
+ intent.addFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY);
+ intent.putExtra("state", (enabled ? 1 : 0));
+ if (enabled) {
+ try {
+ Scanner scanner = new Scanner(new File(AUDIO_SOURCE_PCM_PATH));
+ int card = scanner.nextInt();
+ int device = scanner.nextInt();
+ intent.putExtra("card", card);
+ intent.putExtra("device", device);
+ } catch (FileNotFoundException e) {
+ Slog.e(TAG, "could not open audio source PCM file", e);
+ }
}
+ mContext.sendStickyBroadcast(intent);
+ mAudioSourceEnabled = enabled;
}
-
- mContext.sendStickyBroadcast(intent);
- mAudioSourceEnabled = enabled;
}
@Override
@@ -578,11 +579,7 @@
}
if (mBootCompleted) {
updateUsbState();
- boolean audioSourceEnabled = containsFunction(mCurrentFunctions,
- UsbManager.USB_FUNCTION_AUDIO_SOURCE);
- if (audioSourceEnabled != mAudioSourceEnabled) {
- updateAudioSourceFunction(audioSourceEnabled);
- }
+ updateAudioSourceFunction();
}
break;
case MSG_ENABLE_ADB:
@@ -597,13 +594,13 @@
updateUsbNotification();
updateAdbNotification();
updateUsbState();
+ updateAudioSourceFunction();
break;
case MSG_BOOT_COMPLETED:
mBootCompleted = true;
if (mCurrentAccessory != null) {
mSettingsManager.accessoryAttached(mCurrentAccessory);
}
- updateAudioSourceFunction(mAudioSourceEnabled);
break;
}
}
diff --git a/services/java/com/android/server/wm/WindowAnimator.java b/services/java/com/android/server/wm/WindowAnimator.java
index 5536559..480992b 100644
--- a/services/java/com/android/server/wm/WindowAnimator.java
+++ b/services/java/com/android/server/wm/WindowAnimator.java
@@ -269,7 +269,7 @@
mPendingLayoutChanges);
}
mService.mFocusMayChange = true;
- } else if (win.isReadyForDisplay() && winAnimator.mAnimation == null) {
+ } else if (win.isReadyForDisplay()) {
mForceHiding = true;
}
} else if (mPolicy.canBeForceHidden(win, win.mAttrs)) {
@@ -454,6 +454,7 @@
mPendingLayoutChanges = 0;
mCurrentTime = SystemClock.uptimeMillis();
mBulkUpdateParams = 0;
+ boolean wasAnimating = mAnimating;
mAnimating = false;
if (WindowManagerService.DEBUG_WINDOW_TRACE) {
Slog.i(TAG, "!!! animate: entry time=" + mCurrentTime);
@@ -509,6 +510,8 @@
if (mAnimating) {
mService.scheduleAnimationLocked();
+ } else if (wasAnimating) {
+ mService.requestTraversalLocked();
}
if (WindowManagerService.DEBUG_WINDOW_TRACE) {
Slog.i(TAG, "!!! animate: exit mAnimating=" + mAnimating
@@ -548,6 +551,10 @@
return mDimParams != null;
}
+ boolean isDimming(final WindowStateAnimator winAnimator) {
+ return mDimParams != null && mDimParams.mDimWinAnimator == winAnimator;
+ }
+
public void dump(PrintWriter pw, String prefix, boolean dumpAll) {
if (mWindowDetachedWallpaper != null) {
pw.print(" mWindowDetachedWallpaper="); pw.println(mWindowDetachedWallpaper);
diff --git a/services/java/com/android/server/wm/WindowManagerService.java b/services/java/com/android/server/wm/WindowManagerService.java
index 8957edf..c90c0c7 100755
--- a/services/java/com/android/server/wm/WindowManagerService.java
+++ b/services/java/com/android/server/wm/WindowManagerService.java
@@ -34,7 +34,6 @@
import static android.view.WindowManager.LayoutParams.TYPE_WALLPAPER;
import com.android.internal.app.IBatteryStats;
-import com.android.internal.app.ShutdownThread;
import com.android.internal.policy.PolicyManager;
import com.android.internal.policy.impl.PhoneWindowManager;
import com.android.internal.view.IInputContext;
@@ -48,6 +47,7 @@
import com.android.server.am.BatteryStatsService;
import com.android.server.input.InputFilter;
import com.android.server.input.InputManagerService;
+import com.android.server.pm.ShutdownThread;
import android.Manifest;
import android.app.ActivityManagerNative;
@@ -82,7 +82,6 @@
import android.os.Message;
import android.os.Parcel;
import android.os.ParcelFileDescriptor;
-import android.os.Power;
import android.os.PowerManager;
import android.os.Process;
import android.os.RemoteException;
@@ -512,6 +511,7 @@
int mNextAppTransitionType = ActivityOptions.ANIM_NONE;
String mNextAppTransitionPackage;
Bitmap mNextAppTransitionThumbnail;
+ boolean mNextAppTransitionDelayed;
IRemoteCallback mNextAppTransitionCallback;
int mNextAppTransitionEnter;
int mNextAppTransitionExit;
@@ -3176,7 +3176,7 @@
}
private Animation createThumbnailAnimationLocked(int transit,
- boolean enter, boolean thumb) {
+ boolean enter, boolean thumb, boolean delayed) {
Animation a;
final int thumbWidthI = mNextAppTransitionThumbnail.getWidth();
final float thumbWidth = thumbWidthI > 0 ? thumbWidthI : 1;
@@ -3186,6 +3186,7 @@
// it is the standard duration for that. Otherwise we use the longer
// task transition duration.
int duration;
+ int delayDuration = delayed ? 200 : 0;
switch (transit) {
case WindowManagerPolicy.TRANSIT_ACTIVITY_OPEN:
case WindowManagerPolicy.TRANSIT_ACTIVITY_CLOSE:
@@ -3193,7 +3194,7 @@
com.android.internal.R.integer.config_shortAnimTime);
break;
default:
- duration = 300;
+ duration = delayed ? 200 : 300;
break;
}
if (thumb) {
@@ -3201,6 +3202,7 @@
// filling the screen.
float scaleW = mAppDisplayWidth/thumbWidth;
float scaleH = mAppDisplayHeight/thumbHeight;
+
Animation scale = new ScaleAnimation(1, scaleW, 1, scaleH,
computePivot(mNextAppTransitionStartX, 1/scaleW),
computePivot(mNextAppTransitionStartY, 1/scaleH));
@@ -3210,17 +3212,38 @@
set.addAnimation(scale);
alpha.setDuration(duration);
set.addAnimation(alpha);
+ set.setFillBefore(true);
+ if (delayDuration > 0) {
+ set.setStartOffset(delayDuration);
+ }
a = set;
} else if (enter) {
// Entering app zooms out from the center of the thumbnail.
- float scaleW = thumbWidth/mAppDisplayWidth;
- float scaleH = thumbHeight/mAppDisplayHeight;
- a = new ScaleAnimation(scaleW, 1, scaleH, 1,
+ float scaleW = thumbWidth / mAppDisplayWidth;
+ float scaleH = thumbHeight / mAppDisplayHeight;
+ AnimationSet set = new AnimationSet(true);
+ Animation scale = new ScaleAnimation(scaleW, 1, scaleH, 1,
computePivot(mNextAppTransitionStartX, scaleW),
computePivot(mNextAppTransitionStartY, scaleH));
- a.setDuration(duration);
+ scale.setDuration(duration);
+ scale.setFillBefore(true);
+ set.addAnimation(scale);
+ // Need to set an alpha animation on the entering app window
+ // in case it appears one frame before the thumbnail window
+ // (this solves flicker)
+ Animation alpha = new AlphaAnimation(0, 1);
+ alpha.setDuration(1);
+ alpha.setFillAfter(true);
+ set.addAnimation(alpha);
+ a = set;
+ if (delayDuration > 0) {
+ a.setStartOffset(delayDuration);
+ }
} else {
a = createExitAnimationLocked(transit, duration);
+ if (delayDuration > 0) {
+ a.setStartOffset(delayDuration);
+ }
}
a.setFillAfter(true);
final Interpolator interpolator = AnimationUtils.loadInterpolator(mContext,
@@ -3252,12 +3275,18 @@
if (DEBUG_ANIM) Slog.v(TAG, "applyAnimation: wtoken=" + wtoken
+ " anim=" + a + " nextAppTransition=ANIM_SCALE_UP"
+ " transit=" + transit + " Callers " + Debug.getCallers(3));
- } else if (mNextAppTransitionType == ActivityOptions.ANIM_THUMBNAIL) {
- a = createThumbnailAnimationLocked(transit, enter, false);
+ } else if (mNextAppTransitionType == ActivityOptions.ANIM_THUMBNAIL ||
+ mNextAppTransitionType == ActivityOptions.ANIM_THUMBNAIL_DELAYED) {
+ boolean delayed = (mNextAppTransitionType == ActivityOptions.ANIM_THUMBNAIL_DELAYED);
+ a = createThumbnailAnimationLocked(transit, enter, false, delayed);
initialized = true;
- if (DEBUG_ANIM) Slog.v(TAG, "applyAnimation: wtoken=" + wtoken
- + " anim=" + a + " nextAppTransition=ANIM_THUMBNAIL"
- + " transit=" + transit + " Callers " + Debug.getCallers(3));
+
+ if (DEBUG_ANIM) {
+ String animName = delayed ? "ANIM_THUMBNAIL_DELAYED" : "ANIM_THUMBNAIL";
+ Slog.v(TAG, "applyAnimation: wtoken=" + wtoken
+ + " anim=" + a + " nextAppTransition=" + animName
+ + " transit=" + transit + " Callers " + Debug.getCallers(3));
+ }
} else {
int animAttr = 0;
switch (transit) {
@@ -3879,11 +3908,13 @@
}
public void overridePendingAppTransitionThumb(Bitmap srcThumb, int startX,
- int startY, IRemoteCallback startedCallback) {
+ int startY, IRemoteCallback startedCallback, boolean delayed) {
if (mNextAppTransition != WindowManagerPolicy.TRANSIT_UNSET) {
- mNextAppTransitionType = ActivityOptions.ANIM_THUMBNAIL;
+ mNextAppTransitionType =
+ delayed ? ActivityOptions.ANIM_THUMBNAIL_DELAYED : ActivityOptions.ANIM_THUMBNAIL;
mNextAppTransitionPackage = null;
mNextAppTransitionThumbnail = srcThumb;
+ mNextAppTransitionDelayed = delayed;
mNextAppTransitionStartX = startX;
mNextAppTransitionStartY = startY;
mNextAppTransitionCallback = startedCallback;
@@ -4993,6 +5024,18 @@
return mInputManager.monitorInput(inputChannelName);
}
+ // Called by window manager policy. Not exposed externally.
+ @Override
+ public void shutdown() {
+ ShutdownThread.shutdown(mContext, true);
+ }
+
+ // Called by window manager policy. Not exposed externally.
+ @Override
+ public void rebootSafeMode() {
+ ShutdownThread.rebootSafeMode(mContext, true);
+ }
+
public void setInputFilter(InputFilter filter) {
mInputManager.setInputFilter(filter);
}
@@ -7510,7 +7553,10 @@
}
for (i=0; i<N; i++) {
- WindowState w = mWindows.get(i);
+ final WindowState w = mWindows.get(i);
+ final WindowStateAnimator winAnimator = w.mWinAnimator;
+ boolean layerChanged = false;
+ int oldLayer = w.mLayer;
if (w.mBaseLayer == curBaseLayer || w.mIsImWindow
|| (i > 0 && w.mIsWallpaper)) {
curLayer += WINDOW_LAYER_MULTIPLIER;
@@ -7519,22 +7565,33 @@
curBaseLayer = curLayer = w.mBaseLayer;
w.mLayer = curLayer;
}
+ if (w.mLayer != oldLayer) {
+ layerChanged = true;
+ }
+ oldLayer = winAnimator.mAnimLayer;
if (w.mTargetAppToken != null) {
- w.mWinAnimator.mAnimLayer =
+ winAnimator.mAnimLayer =
w.mLayer + w.mTargetAppToken.mAppAnimator.animLayerAdjustment;
} else if (w.mAppToken != null) {
- w.mWinAnimator.mAnimLayer =
+ winAnimator.mAnimLayer =
w.mLayer + w.mAppToken.mAppAnimator.animLayerAdjustment;
} else {
- w.mWinAnimator.mAnimLayer = w.mLayer;
+ winAnimator.mAnimLayer = w.mLayer;
}
if (w.mIsImWindow) {
- w.mWinAnimator.mAnimLayer += mInputMethodAnimLayerAdjustment;
+ winAnimator.mAnimLayer += mInputMethodAnimLayerAdjustment;
} else if (w.mIsWallpaper) {
- w.mWinAnimator.mAnimLayer += mWallpaperAnimLayerAdjustment;
+ winAnimator.mAnimLayer += mWallpaperAnimLayerAdjustment;
+ }
+ if (winAnimator.mAnimLayer != oldLayer) {
+ layerChanged = true;
+ }
+ if (layerChanged && mAnimator.isDimming(winAnimator)) {
+ // Force an animation pass just to update the mDimAnimator layer.
+ scheduleAnimationLocked();
}
if (DEBUG_LAYERS) Slog.v(TAG, "Assign layer " + w + ": "
- + w.mWinAnimator.mAnimLayer);
+ + winAnimator.mAnimLayer);
//System.out.println(
// "Assigned layer " + curLayer + " to " + w.mClient.asBinder());
}
@@ -8024,7 +8081,8 @@
drawSurface.unlockCanvasAndPost(c);
drawSurface.release();
topOpeningApp.mAppAnimator.thumbnailLayer = topOpeningLayer;
- Animation anim = createThumbnailAnimationLocked(transit, true, true);
+ Animation anim = createThumbnailAnimationLocked(
+ transit, true, true, mNextAppTransitionDelayed);
topOpeningApp.mAppAnimator.thumbnailAnimation = anim;
anim.restrictDuration(MAX_ANIMATION_DURATION);
anim.scaleCurrentDuration(mTransitionAnimationScale);
@@ -8237,7 +8295,8 @@
if (!mInnerFields.mDimming) {
//Slog.i(TAG, "DIM BEHIND: " + w);
mInnerFields.mDimming = true;
- if (!mAnimator.isDimming()) {
+ final WindowStateAnimator winAnimator = w.mWinAnimator;
+ if (!mAnimator.isDimming(winAnimator)) {
final int width, height;
if (attrs.type == WindowManager.LayoutParams.TYPE_BOOT_PROGRESS) {
width = mCurDisplayWidth;
@@ -8246,7 +8305,7 @@
width = innerDw;
height = innerDh;
}
- mAnimator.startDimming(w.mWinAnimator, w.mExiting ? 0 : w.mAttrs.dimAmount,
+ mAnimator.startDimming(winAnimator, w.mExiting ? 0 : w.mAttrs.dimAmount,
width, height);
}
}
@@ -8652,13 +8711,13 @@
mPowerManager.setScreenBrightnessOverride(-1);
} else {
mPowerManager.setScreenBrightnessOverride((int)
- (mInnerFields.mScreenBrightness * Power.BRIGHTNESS_ON));
+ (mInnerFields.mScreenBrightness * PowerManager.BRIGHTNESS_ON));
}
if (mInnerFields.mButtonBrightness < 0 || mInnerFields.mButtonBrightness > 1.0f) {
mPowerManager.setButtonBrightnessOverride(-1);
} else {
mPowerManager.setButtonBrightnessOverride((int)
- (mInnerFields.mButtonBrightness * Power.BRIGHTNESS_ON));
+ (mInnerFields.mButtonBrightness * PowerManager.BRIGHTNESS_ON));
}
}
if (mInnerFields.mHoldScreen != mHoldingScreenOn) {
@@ -9602,10 +9661,12 @@
pw.println(mNextAppTransitionStartHeight);
break;
case ActivityOptions.ANIM_THUMBNAIL:
+ case ActivityOptions.ANIM_THUMBNAIL_DELAYED:
pw.print(" mNextAppTransitionThumbnail=");
pw.print(mNextAppTransitionThumbnail);
pw.print(" mNextAppTransitionStartX="); pw.print(mNextAppTransitionStartX);
pw.print(" mNextAppTransitionStartY="); pw.println(mNextAppTransitionStartY);
+ pw.print(" mNextAppTransitionDelayed="); pw.println(mNextAppTransitionDelayed);
break;
}
pw.print(" mStartingIconInTransition="); pw.print(mStartingIconInTransition);
diff --git a/services/jni/Android.mk b/services/jni/Android.mk
index e2bd622..e0a14af 100644
--- a/services/jni/Android.mk
+++ b/services/jni/Android.mk
@@ -23,7 +23,10 @@
frameworks/base/services \
frameworks/base/core/jni \
external/skia/include/core \
- libcore/include
+ libcore/include \
+ libcore/include/libsuspend \
+ $(call include-path-for, libhardware)/hardware \
+ $(call include-path-for, libhardware_legacy)/hardware_legacy \
LOCAL_SHARED_LIBRARIES := \
libandroid_runtime \
@@ -38,7 +41,8 @@
libinput \
libskia \
libgui \
- libusbhost
+ libusbhost \
+ libsuspend
ifeq ($(WITH_MALLOC_LEAK_CHECK),true)
LOCAL_CFLAGS += -DMALLOC_LEAK_CHECK
diff --git a/services/jni/com_android_server_PowerManagerService.cpp b/services/jni/com_android_server_PowerManagerService.cpp
index ce80c1f..a47f8fd 100644
--- a/services/jni/com_android_server_PowerManagerService.cpp
+++ b/services/jni/com_android_server_PowerManagerService.cpp
@@ -24,8 +24,14 @@
#include <limits.h>
#include <android_runtime/AndroidRuntime.h>
-#include <utils/Timers.h>
#include <gui/ISurfaceComposer.h>
+#include <utils/Timers.h>
+#include <utils/misc.h>
+#include <utils/String8.h>
+#include <hardware/power.h>
+#include <hardware_legacy/power.h>
+#include <cutils/android_reboot.h>
+#include <suspend/autosuspend.h>
#include <private/gui/ComposerService.h>
@@ -43,6 +49,7 @@
// ----------------------------------------------------------------------------
static jobject gPowerManagerServiceObj;
+static struct power_module* gPowerModule;
static Mutex gPowerManagerLock;
static bool gScreenOn;
@@ -76,6 +83,13 @@
}
void android_server_PowerManagerService_userActivity(nsecs_t eventTime, int32_t eventType) {
+ if (gPowerModule) {
+ // Tell the power HAL when user activity occurs.
+ if (gPowerModule->powerHint) {
+ gPowerModule->powerHint(gPowerModule, POWER_HINT_INTERACTION, NULL);
+ }
+ }
+
if (gPowerManagerServiceObj) {
// Throttle calls into user activity by event type.
// We're a little conservative about argument checking here in case the caller
@@ -112,33 +126,115 @@
// ----------------------------------------------------------------------------
-static void android_server_PowerManagerService_nativeInit(JNIEnv* env, jobject obj) {
+static void nativeInit(JNIEnv* env, jobject obj) {
gPowerManagerServiceObj = env->NewGlobalRef(obj);
+
+ status_t err = hw_get_module(POWER_HARDWARE_MODULE_ID,
+ (hw_module_t const**)&gPowerModule);
+ if (err) {
+ String8 msg;
+ msg.appendFormat("Couldn't load %s module (%s)",
+ POWER_HARDWARE_MODULE_ID, strerror(-err));
+ ALOGE("%s", msg.string());
+ jniThrowRuntimeException(env, msg.string());
+ return;
+ }
+
+ gPowerModule->init(gPowerModule);
}
-static void android_server_PowerManagerService_nativeSetPowerState(JNIEnv* env,
+static void nativeSetPowerState(JNIEnv* env,
jobject serviceObj, jboolean screenOn, jboolean screenBright) {
AutoMutex _l(gPowerManagerLock);
gScreenOn = screenOn;
gScreenBright = screenBright;
}
-static void android_server_PowerManagerService_nativeStartSurfaceFlingerAnimation(JNIEnv* env,
+static void nativeStartSurfaceFlingerAnimation(JNIEnv* env,
jobject obj, jint mode) {
sp<ISurfaceComposer> s(ComposerService::getComposerService());
s->turnElectronBeamOff(mode);
}
+static void nativeAcquireWakeLock(JNIEnv *env, jobject clazz, jint lock, jstring idObj) {
+ if (idObj == NULL) {
+ jniThrowNullPointerException(env, "id is null");
+ return;
+ }
+
+ const char *id = env->GetStringUTFChars(idObj, NULL);
+
+ acquire_wake_lock(lock, id);
+
+ env->ReleaseStringUTFChars(idObj, id);
+}
+
+static void nativeReleaseWakeLock(JNIEnv *env, jobject clazz, jstring idObj) {
+ if (idObj == NULL) {
+ jniThrowNullPointerException(env, "id is null");
+ return ;
+ }
+
+ const char *id = env->GetStringUTFChars(idObj, NULL);
+
+ release_wake_lock(id);
+
+ env->ReleaseStringUTFChars(idObj, id);
+
+}
+
+static int nativeSetScreenState(JNIEnv *env, jobject clazz, jboolean on) {
+ if (on) {
+ autosuspend_disable();
+ if (gPowerModule) {
+ gPowerModule->setInteractive(gPowerModule, true);
+ }
+ } else {
+ if (gPowerModule) {
+ gPowerModule->setInteractive(gPowerModule, false);
+ }
+ autosuspend_enable();
+ }
+
+ return 0;
+}
+
+static void nativeShutdown(JNIEnv *env, jobject clazz) {
+ android_reboot(ANDROID_RB_POWEROFF, 0, 0);
+}
+
+static void nativeReboot(JNIEnv *env, jobject clazz, jstring reason) {
+ if (reason == NULL) {
+ android_reboot(ANDROID_RB_RESTART, 0, 0);
+ } else {
+ const char *chars = env->GetStringUTFChars(reason, NULL);
+ android_reboot(ANDROID_RB_RESTART2, 0, (char *) chars);
+ env->ReleaseStringUTFChars(reason, chars); // In case it fails.
+ }
+ jniThrowIOException(env, errno);
+}
+
+
// ----------------------------------------------------------------------------
static JNINativeMethod gPowerManagerServiceMethods[] = {
/* name, signature, funcPtr */
{ "nativeInit", "()V",
- (void*) android_server_PowerManagerService_nativeInit },
+ (void*) nativeInit },
{ "nativeSetPowerState", "(ZZ)V",
- (void*) android_server_PowerManagerService_nativeSetPowerState },
+ (void*) nativeSetPowerState },
{ "nativeStartSurfaceFlingerAnimation", "(I)V",
- (void*) android_server_PowerManagerService_nativeStartSurfaceFlingerAnimation },
+ (void*) nativeStartSurfaceFlingerAnimation },
+ { "nativeAcquireWakeLock", "(ILjava/lang/String;)V",
+ (void*) nativeAcquireWakeLock },
+ { "nativeReleaseWakeLock", "(Ljava/lang/String;)V",
+ (void*) nativeReleaseWakeLock },
+ { "nativeSetScreenState", "(Z)I",
+ (void*) nativeSetScreenState },
+ { "nativeShutdown", "()V",
+ (void*) nativeShutdown },
+ { "nativeReboot", "(Ljava/lang/String;)V",
+ (void*) nativeReboot },
};
#define FIND_CLASS(var, className) \
@@ -175,6 +271,8 @@
}
gScreenOn = true;
gScreenBright = true;
+ gPowerManagerServiceObj = NULL;
+ gPowerModule = NULL;
return 0;
}
diff --git a/telephony/java/com/android/internal/telephony/ApnContext.java b/telephony/java/com/android/internal/telephony/ApnContext.java
index 80d5044..e984a87 100644
--- a/telephony/java/com/android/internal/telephony/ApnContext.java
+++ b/telephony/java/com/android/internal/telephony/ApnContext.java
@@ -129,9 +129,9 @@
return apn;
}
- public synchronized void removeNextWaitingApn() {
- if ((mWaitingApns != null) && (!mWaitingApns.isEmpty())) {
- mWaitingApns.remove(0);
+ public synchronized void removeWaitingApn(ApnSetting apn) {
+ if (mWaitingApns != null) {
+ mWaitingApns.remove(apn);
}
}
diff --git a/telephony/java/com/android/internal/telephony/DataConnection.java b/telephony/java/com/android/internal/telephony/DataConnection.java
index da03f76..7c70a7e 100644
--- a/telephony/java/com/android/internal/telephony/DataConnection.java
+++ b/telephony/java/com/android/internal/telephony/DataConnection.java
@@ -31,6 +31,7 @@
import android.os.Message;
import android.os.SystemProperties;
import android.text.TextUtils;
+import android.util.TimeUtils;
import java.io.FileDescriptor;
import java.io.PrintWriter;
@@ -1225,21 +1226,6 @@
}
/**
- * Convert a System.currentTimeMillis() value to a time of day value.
- *
- * @param millis since the epoch (1/1/1970)
- * @return String representation of the time.
- */
- private String timeMillisToTimeOfDay(long millis) {
- Calendar c = Calendar.getInstance();
- if (millis >= 0) {
- c.setTimeInMillis(millis);
- return String.format("%tm-%td %tH:%tM:%tS.%tL", c, c, c, c, c, c);
- } else {
- return Long.toString(millis);
- }
- }
- /**
* Dump the current state.
*
* @param fd
@@ -1263,8 +1249,8 @@
pw.println(" mLinkProperties=" + mLinkProperties);
pw.flush();
pw.println(" mCapabilities=" + mCapabilities);
- pw.println(" createTime=" + timeMillisToTimeOfDay(createTime));
- pw.println(" lastFailTime=" + timeMillisToTimeOfDay(lastFailTime));
+ pw.println(" createTime=" + TimeUtils.logTimeOfDay(createTime));
+ pw.println(" lastFailTime=" + TimeUtils.logTimeOfDay(lastFailTime));
pw.println(" lastFailCause=" + lastFailCause);
pw.flush();
pw.println(" mRetryOverride=" + mRetryOverride);
diff --git a/telephony/java/com/android/internal/telephony/IccCard.java b/telephony/java/com/android/internal/telephony/IccCard.java
index 92024cd..d738d7b 100644
--- a/telephony/java/com/android/internal/telephony/IccCard.java
+++ b/telephony/java/com/android/internal/telephony/IccCard.java
@@ -26,7 +26,6 @@
import android.os.AsyncResult;
import android.os.Handler;
import android.os.Message;
-import android.os.Power;
import android.os.PowerManager;
import android.os.Registrant;
import android.os.RegistrantList;
diff --git a/telephony/java/com/android/internal/telephony/ServiceStateTracker.java b/telephony/java/com/android/internal/telephony/ServiceStateTracker.java
index bd78065..69dd666 100644
--- a/telephony/java/com/android/internal/telephony/ServiceStateTracker.java
+++ b/telephony/java/com/android/internal/telephony/ServiceStateTracker.java
@@ -23,6 +23,7 @@
import android.os.RegistrantList;
import android.telephony.ServiceState;
import android.telephony.SignalStrength;
+import android.util.TimeUtils;
import java.io.FileDescriptor;
import java.io.PrintWriter;
@@ -507,13 +508,15 @@
// Determine retVal
boolean retVal = ((iccCardExist && (mcc != prevMcc)) || needToFixTimeZone);
if (DBG) {
+ long ctm = System.currentTimeMillis();
log("shouldFixTimeZoneNow: retVal=" + retVal +
" iccCard=" + iccCard +
" iccCard.state=" + (iccCard == null ? "null" : iccCard.getState().toString()) +
" iccCardExist=" + iccCardExist +
" operatorNumeric=" + operatorNumeric + " mcc=" + mcc +
" prevOperatorNumeric=" + prevOperatorNumeric + " prevMcc=" + prevMcc +
- " needToFixTimeZone=" + needToFixTimeZone);
+ " needToFixTimeZone=" + needToFixTimeZone +
+ " ltod=" + TimeUtils.logTimeOfDay(ctm));
}
return retVal;
}
diff --git a/telephony/java/com/android/internal/telephony/cdma/CdmaServiceStateTracker.java b/telephony/java/com/android/internal/telephony/cdma/CdmaServiceStateTracker.java
index ba2e51a..e4287c0 100755
--- a/telephony/java/com/android/internal/telephony/cdma/CdmaServiceStateTracker.java
+++ b/telephony/java/com/android/internal/telephony/cdma/CdmaServiceStateTracker.java
@@ -878,13 +878,19 @@
// For NITZ string without time zone,
// need adjust time to reflect default time zone setting
zone = TimeZone.getDefault();
- long tzOffset;
- tzOffset = zone.getOffset(System.currentTimeMillis());
+ long ctm = System.currentTimeMillis();
+ long tzOffset = zone.getOffset(ctm);
+ if (DBG) {
+ log("fixTimeZone: tzOffset=" + tzOffset + " ltod=" + TimeUtils.logTimeOfDay(ctm));
+ }
if (getAutoTime()) {
- setAndBroadcastNetworkSetTime(System.currentTimeMillis() - tzOffset);
+ long adj = ctm - tzOffset;
+ if (DBG) log("fixTimeZone: adj ltod=" + TimeUtils.logTimeOfDay(adj));
+ setAndBroadcastNetworkSetTime(adj);
} else {
// Adjust the saved NITZ time to account for tzOffset.
mSavedTime = mSavedTime - tzOffset;
+ if (DBG) log("fixTimeZone: adj mSavedTime=" + mSavedTime);
}
if (DBG) log("fixTimeZone: using default TimeZone");
} else if (isoCountryCode.equals("")) {
diff --git a/telephony/java/com/android/internal/telephony/gsm/GsmDataConnectionTracker.java b/telephony/java/com/android/internal/telephony/gsm/GsmDataConnectionTracker.java
index bfdb706..e2579e3 100644
--- a/telephony/java/com/android/internal/telephony/gsm/GsmDataConnectionTracker.java
+++ b/telephony/java/com/android/internal/telephony/gsm/GsmDataConnectionTracker.java
@@ -1970,19 +1970,11 @@
handleError = true;
} else {
DataConnection dc = apnContext.getDataConnection();
-
- if (DBG) {
- // TODO We may use apnContext.getApnSetting() directly
- // instead of getWaitingApns().get(0)
- String apnStr = "<unknown>";
- if (apnContext.getWaitingApns() != null
- && !apnContext.getWaitingApns().isEmpty()){
- apnStr = apnContext.getWaitingApns().get(0).apn;
- }
- log("onDataSetupComplete: success apn=" + apnStr);
- }
ApnSetting apn = apnContext.getApnSetting();
- if (apn.proxy != null && apn.proxy.length() != 0) {
+ if (DBG) {
+ log("onDataSetupComplete: success apn=" + (apn == null ? "unknown" : apn.apn));
+ }
+ if (apn != null && apn.proxy != null && apn.proxy.length() != 0) {
try {
String port = apn.port;
if (TextUtils.isEmpty(port)) port = "8080";
@@ -2000,7 +1992,7 @@
SystemProperties.set("gsm.defaultpdpcontext.active", "true");
if (canSetPreferApn && mPreferredApn == null) {
if (DBG) log("onDataSetupComplete: PREFERED APN is null");
- mPreferredApn = apnContext.getApnSetting();
+ mPreferredApn = apn;
if (mPreferredApn != null) {
setPreferredApn(mPreferredApn.id);
}
@@ -2011,16 +2003,11 @@
notifyDefaultData(apnContext);
}
} else {
- String apnString;
-
cause = (DataConnection.FailCause) (ar.result);
if (DBG) {
- try {
- apnString = apnContext.getWaitingApns().get(0).apn;
- } catch (Exception e) {
- apnString = "<unknown>";
- }
- log(String.format("onDataSetupComplete: error apn=%s cause=%s", apnString, cause));
+ ApnSetting apn = apnContext.getApnSetting();
+ log(String.format("onDataSetupComplete: error apn=%s cause=%s",
+ (apn == null ? "unknown" : apn.apn), cause));
}
if (cause.isEventLoggable()) {
// Log this failure to the Event Logs.
@@ -2032,7 +2019,7 @@
// Count permanent failures and remove the APN we just tried
if (cause.isPermanentFail()) apnContext.decWaitingApnsPermFailCount();
- apnContext.removeNextWaitingApn();
+ apnContext.removeWaitingApn(apnContext.getApnSetting());
if (DBG) {
log(String.format("onDataSetupComplete: WaitingApns.size=%d" +
" WaitingApnsPermFailureCountDown=%d",
diff --git a/telephony/java/com/android/internal/telephony/gsm/GsmServiceStateTracker.java b/telephony/java/com/android/internal/telephony/gsm/GsmServiceStateTracker.java
index 4235577..1aa17c7 100644
--- a/telephony/java/com/android/internal/telephony/gsm/GsmServiceStateTracker.java
+++ b/telephony/java/com/android/internal/telephony/gsm/GsmServiceStateTracker.java
@@ -923,10 +923,16 @@
zone = TimeZone.getDefault();
// For NITZ string without timezone,
// need adjust time to reflect default timezone setting
- long tzOffset;
- tzOffset = zone.getOffset(System.currentTimeMillis());
+ long ctm = System.currentTimeMillis();
+ long tzOffset = zone.getOffset(ctm);
+ if (DBG) {
+ log("pollStateDone: tzOffset=" + tzOffset + " ltod=" +
+ TimeUtils.logTimeOfDay(ctm));
+ }
if (getAutoTime()) {
- setAndBroadcastNetworkSetTime(System.currentTimeMillis() - tzOffset);
+ long adj = ctm - tzOffset;
+ if (DBG) log("pollStateDone: adj ltod=" + TimeUtils.logTimeOfDay(adj));
+ setAndBroadcastNetworkSetTime(adj);
} else {
// Adjust the saved NITZ time to account for tzOffset.
mSavedTime = mSavedTime - tzOffset;
diff --git a/tests/RenderScriptTests/tests/src/com/android/rs/test/RSTestCore.java b/tests/RenderScriptTests/tests/src/com/android/rs/test/RSTestCore.java
index d2e1527..9321cb3 100644
--- a/tests/RenderScriptTests/tests/src/com/android/rs/test/RSTestCore.java
+++ b/tests/RenderScriptTests/tests/src/com/android/rs/test/RSTestCore.java
@@ -69,6 +69,8 @@
unitTests.add(new UT_vector(this, mRes, mCtx));
unitTests.add(new UT_array_init(this, mRes, mCtx));
unitTests.add(new UT_array_alloc(this, mRes, mCtx));
+ unitTests.add(new UT_clamp(this, mRes, mCtx));
+ unitTests.add(new UT_clamp_relaxed(this, mRes, mCtx));
unitTests.add(new UT_convert(this, mRes, mCtx));
unitTests.add(new UT_rsdebug(this, mRes, mCtx));
unitTests.add(new UT_rstime(this, mRes, mCtx));
diff --git a/tests/RenderScriptTests/tests/src/com/android/rs/test/UT_clamp.java b/tests/RenderScriptTests/tests/src/com/android/rs/test/UT_clamp.java
new file mode 100644
index 0000000..08c96bb
--- /dev/null
+++ b/tests/RenderScriptTests/tests/src/com/android/rs/test/UT_clamp.java
@@ -0,0 +1,40 @@
+/*
+ * Copyright (C) 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.
+ */
+
+package com.android.rs.test;
+
+import android.content.Context;
+import android.content.res.Resources;
+import android.renderscript.*;
+
+public class UT_clamp extends UnitTest {
+ private Resources mRes;
+
+ protected UT_clamp(RSTestCore rstc, Resources res, Context ctx) {
+ super(rstc, "Clamp (Full)", ctx);
+ mRes = res;
+ }
+
+ public void run() {
+ RenderScript pRS = RenderScript.create(mCtx);
+ ScriptC_clamp s = new ScriptC_clamp(pRS, mRes, R.raw.clamp);
+ pRS.setMessageHandler(mRsMessage);
+ s.invoke_clamp_test();
+ pRS.finish();
+ waitForMessage();
+ pRS.destroy();
+ }
+}
diff --git a/tests/RenderScriptTests/tests/src/com/android/rs/test/UT_clamp_relaxed.java b/tests/RenderScriptTests/tests/src/com/android/rs/test/UT_clamp_relaxed.java
new file mode 100644
index 0000000..a6fd868
--- /dev/null
+++ b/tests/RenderScriptTests/tests/src/com/android/rs/test/UT_clamp_relaxed.java
@@ -0,0 +1,41 @@
+/*
+ * Copyright (C) 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.
+ */
+
+package com.android.rs.test;
+
+import android.content.Context;
+import android.content.res.Resources;
+import android.renderscript.*;
+
+public class UT_clamp_relaxed extends UnitTest {
+ private Resources mRes;
+
+ protected UT_clamp_relaxed(RSTestCore rstc, Resources res, Context ctx) {
+ super(rstc, "Clamp (Relaxed)", ctx);
+ mRes = res;
+ }
+
+ public void run() {
+ RenderScript pRS = RenderScript.create(mCtx);
+ ScriptC_clamp_relaxed s =
+ new ScriptC_clamp_relaxed(pRS, mRes, R.raw.clamp_relaxed);
+ pRS.setMessageHandler(mRsMessage);
+ s.invoke_clamp_test();
+ pRS.finish();
+ waitForMessage();
+ pRS.destroy();
+ }
+}
diff --git a/tests/RenderScriptTests/tests/src/com/android/rs/test/clamp.rs b/tests/RenderScriptTests/tests/src/com/android/rs/test/clamp.rs
new file mode 100644
index 0000000..28b00bd
--- /dev/null
+++ b/tests/RenderScriptTests/tests/src/com/android/rs/test/clamp.rs
@@ -0,0 +1,56 @@
+#include "shared.rsh"
+
+static bool test_clamp_vector() {
+ bool failed = false;
+
+ float2 src2 = { 2.0f, 2.0f};
+ float2 min2 = { 0.5f, -3.0f};
+ float2 max2 = { 1.0f, 9.0f};
+
+ float2 res2 = clamp(src2, min2, max2);
+ _RS_ASSERT(res2.x == 1.0f);
+ _RS_ASSERT(res2.y == 2.0f);
+
+
+ float3 src3 = { 2.0f, 2.0f, 1.0f};
+ float3 min3 = { 0.5f, -3.0f, 3.0f};
+ float3 max3 = { 1.0f, 9.0f, 4.0f};
+
+ float3 res3 = clamp(src3, min3, max3);
+ _RS_ASSERT(res3.x == 1.0f);
+ _RS_ASSERT(res3.y == 2.0f);
+ _RS_ASSERT(res3.z == 3.0f);
+
+
+ float4 src4 = { 2.0f, 2.0f, 1.0f, 4.0f };
+ float4 min4 = { 0.5f, -3.0f, 3.0f, 4.0f };
+ float4 max4 = { 1.0f, 9.0f, 4.0f, 4.0f };
+
+ float4 res4 = clamp(src4, min4, max4);
+ _RS_ASSERT(res4.x == 1.0f);
+ _RS_ASSERT(res4.y == 2.0f);
+ _RS_ASSERT(res4.z == 3.0f);
+ _RS_ASSERT(res4.w == 4.0f);
+
+ if (failed) {
+ rsDebug("test_clamp_vector FAILED", 0);
+ }
+ else {
+ rsDebug("test_clamp_vector PASSED", 0);
+ }
+
+ return failed;
+}
+
+void clamp_test() {
+ bool failed = false;
+ failed |= test_clamp_vector();
+
+ if (failed) {
+ rsSendToClientBlocking(RS_MSG_TEST_FAILED);
+ }
+ else {
+ rsSendToClientBlocking(RS_MSG_TEST_PASSED);
+ }
+}
+
diff --git a/tests/RenderScriptTests/tests/src/com/android/rs/test/clamp_relaxed.rs b/tests/RenderScriptTests/tests/src/com/android/rs/test/clamp_relaxed.rs
new file mode 100644
index 0000000..71c65ae
--- /dev/null
+++ b/tests/RenderScriptTests/tests/src/com/android/rs/test/clamp_relaxed.rs
@@ -0,0 +1,2 @@
+#include "clamp.rs"
+#pragma rs_fp_relaxed
diff --git a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/android/BridgeWindowManager.java b/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/android/BridgeWindowManager.java
index 85b67d5..a4b2125 100644
--- a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/android/BridgeWindowManager.java
+++ b/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/android/BridgeWindowManager.java
@@ -240,7 +240,7 @@
@Override
public void overridePendingAppTransitionThumb(Bitmap srcThumb, int startX, int startY,
- IRemoteCallback startedCallback) throws RemoteException {
+ IRemoteCallback startedCallback, boolean delayed) throws RemoteException {
// TODO Auto-generated method stub
}
diff --git a/wifi/java/android/net/wifi/WifiConfiguration.java b/wifi/java/android/net/wifi/WifiConfiguration.java
index dfc1b18..0a846fd 100644
--- a/wifi/java/android/net/wifi/WifiConfiguration.java
+++ b/wifi/java/android/net/wifi/WifiConfiguration.java
@@ -56,6 +56,12 @@
*/
public static final String ENGINE_ENABLE = "1";
+ /**
+ * String to set the engine value to when it should be disabled.
+ * @hide
+ */
+ public static final String ENGINE_DISABLE = "0";
+
/** {@hide} */
public static final String ssidVarName = "ssid";
/** {@hide} */
diff --git a/wifi/java/android/net/wifi/WifiNative.java b/wifi/java/android/net/wifi/WifiNative.java
index 73618f6..0a87a538 100644
--- a/wifi/java/android/net/wifi/WifiNative.java
+++ b/wifi/java/android/net/wifi/WifiNative.java
@@ -442,8 +442,8 @@
return doBooleanCommand("SET p2p_ssid_postfix " + postfix);
}
- public boolean setP2pGroupIdle(int time) {
- return doBooleanCommand("SET p2p_group_idle " + time);
+ public boolean setP2pGroupIdle(String iface, int time) {
+ return doBooleanCommand("SET interface=" + iface + " p2p_group_idle " + time);
}
public void setPowerSave(boolean enabled) {
@@ -624,13 +624,6 @@
return "";
}
- public boolean isGroupOwner(String deviceAddress) {
- /* BSS returns details only for a GO */
- String bssInfo = doStringCommand("BSS p2p_dev_addr=" + deviceAddress);
- if (TextUtils.isEmpty(bssInfo)) return false;
- return true;
- }
-
public String p2pPeer(String deviceAddress) {
return doStringCommand("P2P_PEER " + deviceAddress);
}
diff --git a/wifi/java/android/net/wifi/p2p/WifiP2pDeviceList.java b/wifi/java/android/net/wifi/p2p/WifiP2pDeviceList.java
index 8942ff1..b2347c8 100644
--- a/wifi/java/android/net/wifi/p2p/WifiP2pDeviceList.java
+++ b/wifi/java/android/net/wifi/p2p/WifiP2pDeviceList.java
@@ -108,6 +108,15 @@
return Collections.unmodifiableCollection(mDevices.values());
}
+ /** @hide */
+ public boolean isGroupOwner(String deviceAddress) {
+ if (deviceAddress != null) {
+ WifiP2pDevice device = mDevices.get(deviceAddress);
+ if (device != null) return device.isGroupOwner();
+ }
+ return false;
+ }
+
public String toString() {
StringBuffer sbuf = new StringBuffer();
for (WifiP2pDevice device : mDevices.values()) {
diff --git a/wifi/java/android/net/wifi/p2p/WifiP2pService.java b/wifi/java/android/net/wifi/p2p/WifiP2pService.java
index b4a879a..cc49cae 100644
--- a/wifi/java/android/net/wifi/p2p/WifiP2pService.java
+++ b/wifi/java/android/net/wifi/p2p/WifiP2pService.java
@@ -159,6 +159,9 @@
* is invoked */
private boolean mAutonomousGroup;
+ /* Invitation to join an existing p2p group */
+ private boolean mJoinExistingGroup;
+
/* Track whether we are in p2p discovery. This is used to avoid sending duplicate
* broadcasts
*/
@@ -761,7 +764,7 @@
//Stop discovery before issuing connect
mWifiNative.p2pStopFind();
- if (mWifiNative.isGroupOwner(mSavedPeerConfig.deviceAddress)) {
+ if (mPeers.isGroupOwner(mSavedPeerConfig.deviceAddress)) {
p2pConnectWithPinDisplay(mSavedPeerConfig, JOIN_GROUP);
} else {
p2pConnectWithPinDisplay(mSavedPeerConfig, FORM_GROUP);
@@ -778,7 +781,7 @@
mWifiNative.p2pStopFind();
//If peer is a GO, we do not need to send provisional discovery,
//the supplicant takes care of it.
- if (mWifiNative.isGroupOwner(mSavedPeerConfig.deviceAddress)) {
+ if (mPeers.isGroupOwner(mSavedPeerConfig.deviceAddress)) {
if (DBG) logd("Sending join to GO");
p2pConnectWithPinDisplay(mSavedPeerConfig, JOIN_GROUP);
transitionTo(mGroupNegotiationState);
@@ -795,6 +798,8 @@
case WifiMonitor.P2P_GO_NEGOTIATION_REQUEST_EVENT:
mSavedPeerConfig = (WifiP2pConfig) message.obj;
+ mAutonomousGroup = false;
+ mJoinExistingGroup = false;
if (!sendConnectNoticeToApp(mPeers.get(mSavedPeerConfig.deviceAddress),
mSavedPeerConfig)) {
transitionTo(mUserAuthorizingInvitationState);
@@ -824,6 +829,8 @@
}
}
+ mAutonomousGroup = false;
+ mJoinExistingGroup = true;
//TODO In the p2p client case, we should set source address correctly.
if (!sendConnectNoticeToApp(mPeers.get(mSavedPeerConfig.deviceAddress),
mSavedPeerConfig)) {
@@ -840,8 +847,6 @@
break;
case WifiP2pManager.CREATE_GROUP:
mAutonomousGroup = true;
- // An autonomous GO requires group idle settings to be reset
- mWifiNative.setP2pGroupIdle(0);
if (mWifiNative.p2pGroupAdd()) {
replyToMessage(message, WifiP2pManager.CREATE_GROUP_SUCCEEDED);
} else {
@@ -863,11 +868,6 @@
if (DBG) logd(getName());
sendMessageDelayed(obtainMessage(GROUP_CREATING_TIMED_OUT,
++mGroupCreatingTimeoutIndex, 0), GROUP_CREATING_WAIT_TIME_MS);
-
- // Set default group idle settings
- if (!mAutonomousGroup) {
- mWifiNative.setP2pGroupIdle(GROUP_IDLE_TIME_S);
- }
}
@Override
@@ -921,7 +921,7 @@
switch (message.what) {
case PEER_CONNECTION_USER_ACCEPT:
//TODO: handle persistence
- if (mWifiNative.isGroupOwner(mSavedPeerConfig.deviceAddress)) {
+ if (mJoinExistingGroup) {
p2pConnectWithPinDisplay(mSavedPeerConfig, JOIN_GROUP);
} else {
p2pConnectWithPinDisplay(mSavedPeerConfig, FORM_GROUP);
@@ -983,6 +983,7 @@
mWifiNative.p2pConnect(mSavedPeerConfig, FORM_GROUP);
transitionTo(mGroupNegotiationState);
} else {
+ mJoinExistingGroup = false;
transitionTo(mUserAuthorizingInvitationState);
}
}
@@ -1031,6 +1032,10 @@
if (mGroup.isGroupOwner()) {
startDhcpServer(mGroup.getInterface());
} else {
+ // Set group idle only for a client on the group interface to speed up
+ // disconnect when GO is gone. Setting group idle time for a group owner
+ // causes connectivity issues for new clients
+ mWifiNative.setP2pGroupIdle(mGroup.getInterface(), GROUP_IDLE_TIME_S);
mDhcpStateMachine = DhcpStateMachine.makeDhcpStateMachine(mContext,
P2pStateMachine.this, mGroup.getInterface());
mDhcpStateMachine.sendMessage(DhcpStateMachine.CMD_START_DHCP);
@@ -1455,6 +1460,13 @@
sendMessage(PEER_CONNECTION_USER_REJECT);
}
})
+ .setOnCancelListener(new DialogInterface.OnCancelListener() {
+ @Override
+ public void onCancel(DialogInterface arg0) {
+ if (DBG) logd(getName() + " ignore connect");
+ sendMessage(PEER_CONNECTION_USER_REJECT);
+ }
+ })
.create();
//make the enter pin area or the display pin area visible