diff options
Diffstat (limited to 'core')
76 files changed, 914 insertions, 603 deletions
diff --git a/core/java/android/accessibilityservice/AccessibilityService.java b/core/java/android/accessibilityservice/AccessibilityService.java index 044c0c2..ce82a98 100644 --- a/core/java/android/accessibilityservice/AccessibilityService.java +++ b/core/java/android/accessibilityservice/AccessibilityService.java @@ -59,9 +59,14 @@ import com.android.internal.os.HandlerCaller; * An accessibility is declared as any other service in an AndroidManifest.xml but it * must also specify that it handles the "android.accessibilityservice.AccessibilityService" * {@link android.content.Intent}. Failure to declare this intent will cause the system to - * ignore the accessibility service. Following is an example declaration: + * ignore the accessibility service. Additionally an accessibility service must request + * {@link android.Manifest.permission#BIND_ACCESSIBILITY_SERVICE + * android.permission.BIND_ACCESSIBILITY_SERVICE} permission to ensure that only the system + * can bind to it. Failure to declare this intent will cause the system to ignore the + * accessibility service. Following is an example declaration: * </p> - * <pre> <service android:name=".MyAccessibilityService"> + * <pre> <service android:name=".MyAccessibilityService" + * android:permission="android.permission.BIND_ACCESSIBILITY_SERVICE> * <intent-filter> * <action android:name="android.accessibilityservice.AccessibilityService" /> * </intent-filter> diff --git a/core/java/android/accounts/ChooseTypeAndAccountActivity.java b/core/java/android/accounts/ChooseTypeAndAccountActivity.java index 136c68c..291e75e 100644 --- a/core/java/android/accounts/ChooseTypeAndAccountActivity.java +++ b/core/java/android/accounts/ChooseTypeAndAccountActivity.java @@ -119,8 +119,6 @@ public class ChooseTypeAndAccountActivity extends Activity + savedInstanceState + ")"); } - setContentView(R.layout.choose_type_and_account); - if (savedInstanceState != null) { mPendingRequest = savedInstanceState.getInt(KEY_INSTANCE_STATE_PENDING_REQUEST); mExistingAccounts = @@ -164,14 +162,29 @@ public class ChooseTypeAndAccountActivity extends Activity } } - // Read the validAccountTypes, if present, and add them to the setOfAllowableAccountTypes - Set<String> setOfAllowableAccountTypes = null; - final String[] validAccountTypes = + // An account type is relevant iff it is allowed by the caller and supported by the account + // manager. + Set<String> setOfRelevantAccountTypes = null; + final String[] allowedAccountTypes = intent.getStringArrayExtra(EXTRA_ALLOWABLE_ACCOUNT_TYPES_STRING_ARRAY); - if (validAccountTypes != null) { - setOfAllowableAccountTypes = new HashSet<String>(validAccountTypes.length); - for (String type : validAccountTypes) { - setOfAllowableAccountTypes.add(type); + if (allowedAccountTypes != null) { + + setOfRelevantAccountTypes = new HashSet<String>(allowedAccountTypes.length); + Set<String> setOfAllowedAccountTypes = new HashSet<String>(allowedAccountTypes.length); + for (String type : allowedAccountTypes) { + setOfAllowedAccountTypes.add(type); + } + + AuthenticatorDescription[] descs = AccountManager.get(this).getAuthenticatorTypes(); + Set<String> supportedAccountTypes = new HashSet<String>(descs.length); + for (AuthenticatorDescription desc : descs) { + supportedAccountTypes.add(desc.type); + } + + for (String acctType : setOfAllowedAccountTypes) { + if (supportedAccountTypes.contains(acctType)) { + setOfRelevantAccountTypes.add(acctType); + } } } @@ -185,8 +198,8 @@ public class ChooseTypeAndAccountActivity extends Activity && !setOfAllowableAccounts.contains(account)) { continue; } - if (setOfAllowableAccountTypes != null - && !setOfAllowableAccountTypes.contains(account.type)) { + if (setOfRelevantAccountTypes != null + && !setOfRelevantAccountTypes.contains(account.type)) { continue; } mAccountInfos.add(new AccountInfo(account, @@ -194,6 +207,29 @@ public class ChooseTypeAndAccountActivity extends Activity account.equals(selectedAccount))); } + if (mPendingRequest == REQUEST_NULL) { + // If there are no relevant accounts and only one relevant account typoe go directly to + // add account. Otherwise let the user choose. + if (mAccountInfos.isEmpty()) { + if (setOfRelevantAccountTypes.size() == 1) { + runAddAccountForAuthenticator(setOfRelevantAccountTypes.iterator().next()); + } else { + startChooseAccountTypeActivity(); + } + return; + } + + // if there is only one allowable account return it + if (!intent.getBooleanExtra(EXTRA_ALWAYS_PROMPT_FOR_ACCOUNT, false) + && mAccountInfos.size() == 1) { + Account account = mAccountInfos.get(0).account; + setResultAndFinish(account.name, account.type); + return; + } + } + + setContentView(R.layout.choose_type_and_account); + // there is more than one allowable account. initialize the list adapter to allow // the user to select an account. ListView list = (ListView) findViewById(android.R.id.list); @@ -201,6 +237,7 @@ public class ChooseTypeAndAccountActivity extends Activity android.R.layout.simple_list_item_1, mAccountInfos)); list.setChoiceMode(ListView.CHOICE_MODE_SINGLE); list.setOnItemClickListener(new AdapterView.OnItemClickListener() { + @Override public void onItemClick(AdapterView<?> parent, View v, int position, long id) { onListItemClick((ListView)parent, v, position, id); } @@ -209,26 +246,11 @@ public class ChooseTypeAndAccountActivity extends Activity // set the listener for the addAccount button Button addAccountButton = (Button) findViewById(R.id.addAccount); addAccountButton.setOnClickListener(new View.OnClickListener() { + @Override public void onClick(final View v) { startChooseAccountTypeActivity(); } }); - - if (mPendingRequest == REQUEST_NULL) { - // If there are no allowable accounts go directly to add account - if (shouldSkipToChooseAccountTypeFlow()) { - startChooseAccountTypeActivity(); - return; - } - - // if there is only one allowable account return it - if (!intent.getBooleanExtra(EXTRA_ALWAYS_PROMPT_FOR_ACCOUNT, false) - && mAccountInfos.size() == 1) { - Account account = mAccountInfos.get(0).account; - setResultAndFinish(account.name, account.type); - return; - } - } } @Override @@ -267,7 +289,7 @@ public class ChooseTypeAndAccountActivity extends Activity if (resultCode == RESULT_CANCELED) { // if cancelling out of addAccount and the original state caused us to skip this, // finish this activity - if (shouldSkipToChooseAccountTypeFlow()) { + if (mAccountInfos.isEmpty()) { setResult(Activity.RESULT_CANCELED); finish(); } @@ -324,14 +346,6 @@ public class ChooseTypeAndAccountActivity extends Activity finish(); } - /** - * convenience method to check if we should skip the accounts list display and immediately - * jump to the flow that asks the user to select from the account type list - */ - private boolean shouldSkipToChooseAccountTypeFlow() { - return mAccountInfos.isEmpty(); - } - protected void runAddAccountForAuthenticator(String type) { if (Log.isLoggable(TAG, Log.VERBOSE)) { Log.v(TAG, "runAddAccountForAuthenticator: " + type); diff --git a/core/java/android/app/Activity.java b/core/java/android/app/Activity.java index ac55abe..69ee434 100644 --- a/core/java/android/app/Activity.java +++ b/core/java/android/app/Activity.java @@ -2713,7 +2713,16 @@ public class Activity extends ContextThemeWrapper onCreateNavigateUpTaskStack(b); onPrepareNavigateUpTaskStack(b); b.startActivities(); - finishAffinity(); + + // We can't finishAffinity if we have a result. + // Fall back and simply finish the current activity instead. + if (mResultCode != RESULT_CANCELED || mResultData != null) { + // Tell the developer what's going on to avoid hair-pulling. + Log.i(TAG, "onNavigateUp only finishing topmost activity to return a result"); + finish(); + } else { + finishAffinity(); + } } else { navigateUpTo(upIntent); } diff --git a/core/java/android/app/Notification.java b/core/java/android/app/Notification.java index 0c47069..9a8d802 100644 --- a/core/java/android/app/Notification.java +++ b/core/java/android/app/Notification.java @@ -907,6 +907,8 @@ public class Notification implements Parcelable * </pre> */ public static class Builder { + private static final int MAX_ACTION_BUTTONS = 2; + private Context mContext; private long mWhen; @@ -938,7 +940,7 @@ public class Notification implements Parcelable private ArrayList<String> mKindList = new ArrayList<String>(1); private Bundle mExtras; private int mPriority; - private ArrayList<Action> mActions = new ArrayList<Action>(3); + private ArrayList<Action> mActions = new ArrayList<Action>(MAX_ACTION_BUTTONS); private boolean mUseChronometer; private Style mStyle; @@ -1460,7 +1462,7 @@ public class Notification implements Parcelable if (N > 0) { // Log.d("Notification", "has actions: " + mContentText); big.setViewVisibility(R.id.actions, View.VISIBLE); - if (N>3) N=3; + if (N>MAX_ACTION_BUTTONS) N=MAX_ACTION_BUTTONS; big.removeAllViews(R.id.actions); for (int i=0; i<N; i++) { final RemoteViews button = generateActionButton(mActions.get(i)); @@ -1500,18 +1502,14 @@ public class Notification implements Parcelable } private RemoteViews generateActionButton(Action action) { - RemoteViews button = new RemoteViews(mContext.getPackageName(), R.layout.notification_action); + final boolean tombstone = (action.actionIntent == null); + RemoteViews button = new RemoteViews(mContext.getPackageName(), + tombstone ? R.layout.notification_action_tombstone + : R.layout.notification_action); button.setTextViewCompoundDrawables(R.id.action0, action.icon, 0, 0, 0); button.setTextViewText(R.id.action0, action.title); - if (action.actionIntent != null) { + if (!tombstone) { 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; @@ -1639,15 +1637,21 @@ public class Notification implements Parcelable if (mBuilder.mSubText == null) { contentView.setViewVisibility(R.id.line3, View.GONE); + } else { + contentView.setViewVisibility(R.id.line3, View.VISIBLE); } if (mBigContentTitle != null && mBigContentTitle.equals("")) { contentView.setViewVisibility(R.id.line1, View.GONE); + } else { + contentView.setViewVisibility(R.id.line1, View.VISIBLE); } if (mSummaryText != null && !mSummaryText.equals("")) { contentView.setViewVisibility(R.id.overflow_title, View.VISIBLE); contentView.setTextViewText(R.id.overflow_title, mSummaryText); + } else { + contentView.setViewVisibility(R.id.overflow_title, View.GONE); } return contentView; @@ -1854,6 +1858,8 @@ public class Notification implements Parcelable if (str != null && !str.equals("")) { contentView.setViewVisibility(rowIds[i], View.VISIBLE); contentView.setTextViewText(rowIds[i], str); + } else { + contentView.setViewVisibility(rowIds[i], View.GONE); } i++; } diff --git a/core/java/android/app/TaskStackBuilder.java b/core/java/android/app/TaskStackBuilder.java index 14c5736..f21b3fd 100644 --- a/core/java/android/app/TaskStackBuilder.java +++ b/core/java/android/app/TaskStackBuilder.java @@ -161,18 +161,12 @@ public class TaskStackBuilder { ActivityInfo info = pm.getActivityInfo( new ComponentName(mSourceContext, sourceActivityClass), 0); String parentActivity = info.parentActivityName; - Intent parent = new Intent().setComponent( - new ComponentName(mSourceContext, parentActivity)); - while (parent != null) { + while (parentActivity != null) { + Intent parent = new Intent().setComponent( + new ComponentName(mSourceContext, parentActivity)); mIntents.add(insertAt, parent); info = pm.getActivityInfo(parent.getComponent(), 0); parentActivity = info.parentActivityName; - if (parentActivity != null) { - parent = new Intent().setComponent( - new ComponentName(mSourceContext, parentActivity)); - } else { - parent = null; - } } } catch (NameNotFoundException e) { Log.e(TAG, "Bad ComponentName while traversing activity parent metadata"); diff --git a/core/java/android/appwidget/AppWidgetHostView.java b/core/java/android/appwidget/AppWidgetHostView.java index 01b68d4..ed95ae5 100644 --- a/core/java/android/appwidget/AppWidgetHostView.java +++ b/core/java/android/appwidget/AppWidgetHostView.java @@ -38,6 +38,7 @@ import android.util.SparseArray; import android.view.Gravity; import android.view.LayoutInflater; import android.view.View; +import android.view.accessibility.AccessibilityNodeInfo; import android.widget.Adapter; import android.widget.AdapterView; import android.widget.BaseAdapter; @@ -523,6 +524,12 @@ public class AppWidgetHostView extends FrameLayout { return tv; } + @Override + public void onInitializeAccessibilityNodeInfo(AccessibilityNodeInfo info) { + super.onInitializeAccessibilityNodeInfo(info); + info.setClassName(AppWidgetHostView.class.getName()); + } + private static class ParcelableSparseArray extends SparseArray<Parcelable> implements Parcelable { public int describeContents() { return 0; diff --git a/core/java/android/appwidget/AppWidgetManager.java b/core/java/android/appwidget/AppWidgetManager.java index 7a8c1fb..3aa5181 100644 --- a/core/java/android/appwidget/AppWidgetManager.java +++ b/core/java/android/appwidget/AppWidgetManager.java @@ -320,6 +320,10 @@ public class AppWidgetManager { * It is okay to call this method both inside an {@link #ACTION_APPWIDGET_UPDATE} broadcast, * and outside of the handler. * This method will only work when called from the uid that owns the AppWidget provider. + * + * <p> + * The total Bitmap memory used by the RemoteViews object cannot exceed that required to + * fill the screen once, ie. (screen width x screen height x 4) bytes. * * @param appWidgetIds The AppWidget instances for which to set the RemoteViews. * @param views The RemoteViews object to show. @@ -385,6 +389,10 @@ public class AppWidgetManager { * and outside of the handler. * This method will only work when called from the uid that owns the AppWidget provider. * + * <p> + * The total Bitmap memory used by the RemoteViews object cannot exceed that required to + * fill the screen once, ie. (screen width x screen height x 4) bytes. + * * @param appWidgetId The AppWidget instance for which to set the RemoteViews. * @param views The RemoteViews object to show. */ diff --git a/core/java/android/content/Intent.java b/core/java/android/content/Intent.java index da09a18..718a917 100644 --- a/core/java/android/content/Intent.java +++ b/core/java/android/content/Intent.java @@ -808,13 +808,16 @@ public class Intent implements Parcelable, Cloneable { * always present to the user a list of the things they can do, with a * nice title given by the caller such as "Send this photo with:". * <p> + * If you need to grant URI permissions through a chooser, you must specify + * the permissions to be granted on the ACTION_CHOOSER Intent + * <em>in addition</em> to the EXTRA_INTENT inside. This means using + * {@link #setClipData} to specify the URIs to be granted as well as + * {@link #FLAG_GRANT_READ_URI_PERMISSION} and/or + * {@link #FLAG_GRANT_WRITE_URI_PERMISSION} as appropriate. + * <p> * As a convenience, an Intent of this form can be created with the * {@link #createChooser} function. * <p> - * If the target {@link #EXTRA_INTENT} contains {@link ClipData}, you should - * also copy it to this intent along with relevant flags, such as - * {@link #FLAG_GRANT_READ_URI_PERMISSION}. - * <p> * Input: No data should be specified. get*Extra must have * a {@link #EXTRA_INTENT} field containing the Intent being executed, * and can optionally have a {@link #EXTRA_TITLE} field containing the @@ -828,6 +831,14 @@ public class Intent implements Parcelable, Cloneable { /** * Convenience function for creating a {@link #ACTION_CHOOSER} Intent. * + * <p>Builds a new {@link #ACTION_CHOOSER} Intent that wraps the given + * target intent, also optionally supplying a title. If the target + * intent has specified {@link #FLAG_GRANT_READ_URI_PERMISSION} or + * {@link #FLAG_GRANT_WRITE_URI_PERMISSION}, then these flags will also be + * set in the returned chooser intent, with its ClipData set appropriately: + * either a direct reflection of {@link #getClipData()} if that is non-null, + * or a new ClipData build from {@link #getData()}. + * * @param target The Intent that the user will be selecting an activity * to perform. * @param title Optional title that will be displayed in the chooser. @@ -843,12 +854,26 @@ public class Intent implements Parcelable, Cloneable { } // Migrate any clip data and flags from target. - final ClipData targetClipData = target.getClipData(); - if (targetClipData != null) { - intent.setClipData(targetClipData); - intent.addFlags(target.getFlags() - & (FLAG_GRANT_READ_URI_PERMISSION | FLAG_GRANT_WRITE_URI_PERMISSION)); + int permFlags = target.getFlags() + & (FLAG_GRANT_READ_URI_PERMISSION | FLAG_GRANT_WRITE_URI_PERMISSION); + if (permFlags != 0) { + ClipData targetClipData = target.getClipData(); + if (targetClipData == null && target.getData() != null) { + ClipData.Item item = new ClipData.Item(target.getData()); + String[] mimeTypes; + if (target.getType() != null) { + mimeTypes = new String[] { target.getType() }; + } else { + mimeTypes = new String[] { }; + } + targetClipData = new ClipData(null, mimeTypes, item); + } + if (targetClipData != null) { + intent.setClipData(targetClipData); + intent.addFlags(permFlags); + } } + return intent; } @@ -3078,6 +3103,17 @@ public class Intent implements Parcelable, Cloneable { */ public static final int FLAG_ACTIVITY_TASK_ON_HOME = 0X00004000; /** + * If set in an Intent passed to {@link Context#startActivity Context.startActivity()}, + * upon starting the activity the system will also clear any system dialogs that + * are currently shown. This is intended primarily for any actions that are + * associated with buttons in a notification: tapping on the button to launch + * the activity needs to also dismiss the notification window (which is one + * of the system dialogs); setting this flag on the Intent associated with that + * action will ensure that and other system dialogs are dismissed so that the + * user arrives in the new activity. + */ + public static final int FLAG_ACTIVITY_CLOSE_SYSTEM_DIALOGS = 0X00002000; + /** * If set, when sending a broadcast only registered receivers will be * called -- no BroadcastReceiver components will be launched. */ diff --git a/core/java/android/hardware/SensorManager.java b/core/java/android/hardware/SensorManager.java index aeb46cf..b8ad818 100644 --- a/core/java/android/hardware/SensorManager.java +++ b/core/java/android/hardware/SensorManager.java @@ -1122,9 +1122,9 @@ public abstract class SensorManager { /** Helper function to compute the angle change between two rotation matrices. * Given a current rotation matrix (R) and a previous rotation matrix - * (prevR) computes the rotation around the x,y, and z axes which + * (prevR) computes the rotation around the z,x, and y axes which * transforms prevR to R. - * outputs a 3 element vector containing the x,y, and z angle + * outputs a 3 element vector containing the z,x, and y angle * change at indexes 0, 1, and 2 respectively. * <p> Each input matrix is either as a 3x3 or 4x4 row-major matrix * depending on the length of the passed array: @@ -1143,14 +1143,13 @@ public abstract class SensorManager { *</pre> * @param R current rotation matrix * @param prevR previous rotation matrix - * @param angleChange an array of floats in which the angle change is stored + * @param angleChange an an array of floats (z, x, and y) in which the angle change is stored */ public static void getAngleChange( float[] angleChange, float[] R, float[] prevR) { float rd1=0,rd4=0, rd6=0,rd7=0, rd8=0; float ri0=0,ri1=0,ri2=0,ri3=0,ri4=0,ri5=0,ri6=0,ri7=0,ri8=0; float pri0=0, pri1=0, pri2=0, pri3=0, pri4=0, pri5=0, pri6=0, pri7=0, pri8=0; - int i, j, k; if(R.length == 9) { ri0 = R[0]; diff --git a/core/java/android/os/Trace.java b/core/java/android/os/Trace.java index c0240fe..d2050b7 100644 --- a/core/java/android/os/Trace.java +++ b/core/java/android/os/Trace.java @@ -43,7 +43,7 @@ public final class Trace { public static final int TRACE_FLAGS_START_BIT = 1; public static final String[] TRACE_TAGS = { "Graphics", "Input", "View", "WebView", "Window Manager", - "Activity Manager", "Sync Manager", "Audio" + "Activity Manager", "Sync Manager", "Audio", "Video", }; public static final String PROPERTY_TRACE_TAG_ENABLEFLAGS = "debug.atrace.tags.enableflags"; diff --git a/core/java/android/preference/MultiSelectListPreference.java b/core/java/android/preference/MultiSelectListPreference.java index 2e8d551..553ce80 100644 --- a/core/java/android/preference/MultiSelectListPreference.java +++ b/core/java/android/preference/MultiSelectListPreference.java @@ -125,8 +125,9 @@ public class MultiSelectListPreference extends DialogPreference { * @param values The values to set for the key. */ public void setValues(Set<String> values) { - mValues = values; - + mValues.clear(); + mValues.addAll(values); + persistStringSet(values); } diff --git a/core/java/android/provider/CalendarContract.java b/core/java/android/provider/CalendarContract.java index 09bf42b..1ef0916 100644 --- a/core/java/android/provider/CalendarContract.java +++ b/core/java/android/provider/CalendarContract.java @@ -105,6 +105,17 @@ public final class CalendarContract { * and it should call {@link Activity#setResult(int)} with * {@link Activity#RESULT_OK} or {@link Activity#RESULT_CANCELED} to * acknowledge whether the action was handled or not. + * + * The custom app should have an intent-filter like the following + * <pre> + * {@code + * <intent-filter> + * <action android:name="android.provider.calendar.action.HANDLE_CUSTOM_EVENT" /> + * <category android:name="android.intent.category.DEFAULT" /> + * <data android:mimeType="vnd.android.cursor.item/event" /> + * </intent-filter> + * } + * </pre> * <p> * Input: {@link Intent#getData} has the event URI. The extra * {@link #EXTRA_EVENT_BEGIN_TIME} has the start time of the instance. The diff --git a/core/java/android/view/AccessibilityInteractionController.java b/core/java/android/view/AccessibilityInteractionController.java index 16f9a18..6dc31dd 100644 --- a/core/java/android/view/AccessibilityInteractionController.java +++ b/core/java/android/view/AccessibilityInteractionController.java @@ -29,7 +29,6 @@ import android.util.Poolable; import android.util.PoolableManager; import android.util.Pools; import android.util.SparseLongArray; -import android.view.ViewGroup.ChildListForAccessibility; import android.view.accessibility.AccessibilityInteractionClient; import android.view.accessibility.AccessibilityNodeInfo; import android.view.accessibility.AccessibilityNodeProvider; @@ -623,6 +622,8 @@ final class AccessibilityInteractionController { private static final int MAX_ACCESSIBILITY_NODE_INFO_BATCH_SIZE = 50; + private final ArrayList<View> mTempViewList = new ArrayList<View>(); + public void prefetchAccessibilityNodeInfos(View view, int virtualViewId, int prefetchFlags, List<AccessibilityNodeInfo> outInfos) { AccessibilityNodeProvider provider = view.getAccessibilityNodeProvider(); @@ -663,8 +664,6 @@ final class AccessibilityInteractionController { while (parent instanceof View && outInfos.size() < MAX_ACCESSIBILITY_NODE_INFO_BATCH_SIZE) { View parentView = (View) parent; - final long parentNodeId = AccessibilityNodeInfo.makeNodeId( - parentView.getAccessibilityViewId(), AccessibilityNodeInfo.UNDEFINED); AccessibilityNodeInfo info = parentView.createAccessibilityNodeInfo(); if (info != null) { outInfos.add(info); @@ -678,19 +677,21 @@ final class AccessibilityInteractionController { ViewParent parent = current.getParentForAccessibility(); if (parent instanceof ViewGroup) { ViewGroup parentGroup = (ViewGroup) parent; - ChildListForAccessibility children = ChildListForAccessibility.obtain(parentGroup, - false); + ArrayList<View> children = mTempViewList; + children.clear(); try { - final int childCount = children.getChildCount(); + parentGroup.addChildrenForAccessibility(children); + final int childCount = children.size(); for (int i = 0; i < childCount; i++) { if (outInfos.size() >= MAX_ACCESSIBILITY_NODE_INFO_BATCH_SIZE) { return; } - View child = children.getChildAt(i); + View child = children.get(i); if (child.getAccessibilityViewId() != current.getAccessibilityViewId() && isShown(child)) { AccessibilityNodeInfo info = null; - AccessibilityNodeProvider provider = child.getAccessibilityNodeProvider(); + AccessibilityNodeProvider provider = + child.getAccessibilityNodeProvider(); if (provider == null) { info = child.createAccessibilityNodeInfo(); } else { @@ -703,7 +704,7 @@ final class AccessibilityInteractionController { } } } finally { - children.recycle(); + children.clear(); } } } @@ -716,14 +717,16 @@ final class AccessibilityInteractionController { ViewGroup rootGroup = (ViewGroup) root; HashMap<View, AccessibilityNodeInfo> addedChildren = new HashMap<View, AccessibilityNodeInfo>(); - ChildListForAccessibility children = ChildListForAccessibility.obtain(rootGroup, false); + ArrayList<View> children = mTempViewList; + children.clear(); try { - final int childCount = children.getChildCount(); + root.addChildrenForAccessibility(children); + final int childCount = children.size(); for (int i = 0; i < childCount; i++) { if (outInfos.size() >= MAX_ACCESSIBILITY_NODE_INFO_BATCH_SIZE) { return; } - View child = children.getChildAt(i); + View child = children.get(i); if (isShown(child)) { AccessibilityNodeProvider provider = child.getAccessibilityNodeProvider(); if (provider == null) { @@ -743,7 +746,7 @@ final class AccessibilityInteractionController { } } } finally { - children.recycle(); + children.clear(); } if (outInfos.size() < MAX_ACCESSIBILITY_NODE_INFO_BATCH_SIZE) { for (Map.Entry<View, AccessibilityNodeInfo> entry : addedChildren.entrySet()) { diff --git a/core/java/android/view/Choreographer.java b/core/java/android/view/Choreographer.java index 825f351..183cb88 100644 --- a/core/java/android/view/Choreographer.java +++ b/core/java/android/view/Choreographer.java @@ -491,14 +491,32 @@ public final class Choreographer { } } - private final class FrameDisplayEventReceiver extends DisplayEventReceiver { + private final class FrameDisplayEventReceiver extends DisplayEventReceiver + implements Runnable { + private long mTimestampNanos; + private int mFrame; + public FrameDisplayEventReceiver(Looper looper) { super(looper); } @Override public void onVsync(long timestampNanos, int frame) { - doFrame(timestampNanos, frame); + // Post the vsync event to the Handler. + // The idea is to prevent incoming vsync events from completely starving + // the message queue. If there are no messages in the queue with timestamps + // earlier than the frame time, then the vsync event will be processed immediately. + // Otherwise, messages that predate the vsync event will be handled first. + mTimestampNanos = timestampNanos; + mFrame = frame; + Message msg = Message.obtain(mHandler, this); + msg.setAsynchronous(true); + mHandler.sendMessageAtTime(msg, timestampNanos / NANOS_PER_MS); + } + + @Override + public void run() { + doFrame(mTimestampNanos, mFrame); } } diff --git a/core/java/android/view/View.java b/core/java/android/view/View.java index f698e57..62c267f 100644 --- a/core/java/android/view/View.java +++ b/core/java/android/view/View.java @@ -6159,7 +6159,8 @@ public class View implements Drawable.Callback, Drawable.Callback2, KeyEvent.Cal ViewRootImpl viewRootImpl = getViewRootImpl(); if (viewRootImpl != null) { View focusHost = viewRootImpl.getAccessibilityFocusedHost(); - if (focusHost != null && ViewRootImpl.isViewDescendantOf(focusHost, this)) { + if (focusHost != null && focusHost != this + && ViewRootImpl.isViewDescendantOf(focusHost, this)) { viewRootImpl.setAccessibilityFocusedHost(null); } } @@ -6637,7 +6638,7 @@ public class View implements Drawable.Callback, Drawable.Callback2, KeyEvent.Cal private boolean nextAtGranularity(int granularity) { CharSequence text = getIterableTextForAccessibility(); - if (text != null && text.length() > 0) { + if (text == null || text.length() == 0) { return false; } TextSegmentIterator iterator = getIteratorForGranularity(granularity); @@ -6661,7 +6662,7 @@ public class View implements Drawable.Callback, Drawable.Callback2, KeyEvent.Cal private boolean previousAtGranularity(int granularity) { CharSequence text = getIterableTextForAccessibility(); - if (text != null && text.length() > 0) { + if (text == null || text.length() == 0) { return false; } TextSegmentIterator iterator = getIteratorForGranularity(granularity); diff --git a/core/java/android/view/ViewRootImpl.java b/core/java/android/view/ViewRootImpl.java index 41cd887..d9e3545 100644 --- a/core/java/android/view/ViewRootImpl.java +++ b/core/java/android/view/ViewRootImpl.java @@ -1076,7 +1076,7 @@ public final class ViewRootImpl implements ViewParent, if (baseSize != 0 && desiredWindowWidth > baseSize) { childWidthMeasureSpec = getRootMeasureSpec(baseSize, lp.width); childHeightMeasureSpec = getRootMeasureSpec(desiredWindowHeight, lp.height); - host.measure(childWidthMeasureSpec, childHeightMeasureSpec); + performMeasure(childWidthMeasureSpec, childHeightMeasureSpec); if (DEBUG_DIALOG) Log.v(TAG, "Window " + mView + ": measured (" + host.getMeasuredWidth() + "," + host.getMeasuredHeight() + ")"); if ((host.getMeasuredWidthAndState()&View.MEASURED_STATE_TOO_SMALL) == 0) { @@ -1087,7 +1087,7 @@ public final class ViewRootImpl implements ViewParent, if (DEBUG_DIALOG) Log.v(TAG, "Window " + mView + ": next baseSize=" + baseSize); childWidthMeasureSpec = getRootMeasureSpec(baseSize, lp.width); - host.measure(childWidthMeasureSpec, childHeightMeasureSpec); + performMeasure(childWidthMeasureSpec, childHeightMeasureSpec); if (DEBUG_DIALOG) Log.v(TAG, "Window " + mView + ": measured (" + host.getMeasuredWidth() + "," + host.getMeasuredHeight() + ")"); if ((host.getMeasuredWidthAndState()&View.MEASURED_STATE_TOO_SMALL) == 0) { @@ -1101,7 +1101,7 @@ public final class ViewRootImpl implements ViewParent, if (!goodMeasure) { childWidthMeasureSpec = getRootMeasureSpec(desiredWindowWidth, lp.width); childHeightMeasureSpec = getRootMeasureSpec(desiredWindowHeight, lp.height); - host.measure(childWidthMeasureSpec, childHeightMeasureSpec); + performMeasure(childWidthMeasureSpec, childHeightMeasureSpec); if (mWidth != host.getMeasuredWidth() || mHeight != host.getMeasuredHeight()) { windowSizeMayChange = true; } @@ -1650,7 +1650,7 @@ public final class ViewRootImpl implements ViewParent, + " coveredInsetsChanged=" + contentInsetsChanged); // Ask host how big it wants to be - host.measure(childWidthMeasureSpec, childHeightMeasureSpec); + performMeasure(childWidthMeasureSpec, childHeightMeasureSpec); // Implementation of weights from WindowManager.LayoutParams // We just grow the dimensions as needed and re-measure if @@ -1676,7 +1676,7 @@ public final class ViewRootImpl implements ViewParent, if (DEBUG_LAYOUT) Log.v(TAG, "And hey let's measure once more: width=" + width + " height=" + height); - host.measure(childWidthMeasureSpec, childHeightMeasureSpec); + performMeasure(childWidthMeasureSpec, childHeightMeasureSpec); } layoutRequested = true; @@ -1688,28 +1688,7 @@ public final class ViewRootImpl implements ViewParent, boolean triggerGlobalLayoutListener = didLayout || attachInfo.mRecomputeGlobalAttributes; if (didLayout) { - mLayoutRequested = false; - mScrollMayChange = true; - if (DEBUG_ORIENTATION || DEBUG_LAYOUT) Log.v( - TAG, "Laying out " + host + " to (" + - host.getMeasuredWidth() + ", " + host.getMeasuredHeight() + ")"); - long startTime = 0L; - if (ViewDebug.DEBUG_PROFILE_LAYOUT) { - startTime = SystemClock.elapsedRealtime(); - } - host.layout(0, 0, host.getMeasuredWidth(), host.getMeasuredHeight()); - - if (false && ViewDebug.consistencyCheckEnabled) { - if (!host.dispatchConsistencyCheck(ViewDebug.CONSISTENCY_LAYOUT)) { - throw new IllegalStateException("The view hierarchy is an inconsistent state," - + "please refer to the logs with the tag " - + ViewDebug.CONSISTENCY_LOG_TAG + " for more infomation."); - } - } - - if (ViewDebug.DEBUG_PROFILE_LAYOUT) { - EventLog.writeEvent(60001, SystemClock.elapsedRealtime() - startTime); - } + performLayout(); // By this point all views have been sized and positionned // We can compute the transparent area @@ -1867,6 +1846,49 @@ public final class ViewRootImpl implements ViewParent, } } + private void performMeasure(int childWidthMeasureSpec, int childHeightMeasureSpec) { + Trace.traceBegin(Trace.TRACE_TAG_VIEW, "measure"); + try { + mView.measure(childWidthMeasureSpec, childHeightMeasureSpec); + } finally { + Trace.traceEnd(Trace.TRACE_TAG_VIEW); + } + } + + private void performLayout() { + mLayoutRequested = false; + mScrollMayChange = true; + + final View host = mView; + if (DEBUG_ORIENTATION || DEBUG_LAYOUT) { + Log.v(TAG, "Laying out " + host + " to (" + + host.getMeasuredWidth() + ", " + host.getMeasuredHeight() + ")"); + } + + final long startTime; + if (ViewDebug.DEBUG_PROFILE_LAYOUT) { + startTime = SystemClock.elapsedRealtime(); + } + Trace.traceBegin(Trace.TRACE_TAG_VIEW, "layout"); + try { + host.layout(0, 0, host.getMeasuredWidth(), host.getMeasuredHeight()); + } finally { + Trace.traceEnd(Trace.TRACE_TAG_VIEW); + } + + if (ViewDebug.DEBUG_PROFILE_LAYOUT) { + EventLog.writeEvent(60001, SystemClock.elapsedRealtime() - startTime); + } + + if (false && ViewDebug.consistencyCheckEnabled) { + if (!host.dispatchConsistencyCheck(ViewDebug.CONSISTENCY_LAYOUT)) { + throw new IllegalStateException("The view hierarchy is an inconsistent state," + + "please refer to the logs with the tag " + + ViewDebug.CONSISTENCY_LOG_TAG + " for more infomation."); + } + } + } + public void requestTransparentRegion(View child) { // the test below should not fail unless someone is messing with us checkThread(); @@ -2183,6 +2205,18 @@ public final class ViewRootImpl implements ViewParent, private boolean drawSoftware(Surface surface, AttachInfo attachInfo, int yoff, boolean scalingRequired, Rect dirty) { + // If we get here with a disabled & requested hardware renderer, something went + // wrong (an invalidate posted right before we destroyed the hardware surface + // for instance) so we should just bail out. Locking the surface with software + // rendering at this point would lock it forever and prevent hardware renderer + // from doing its job when it comes back. + if (attachInfo.mHardwareRenderer != null && !attachInfo.mHardwareRenderer.isEnabled() && + attachInfo.mHardwareRenderer.isRequested()) { + mFullRedrawNeeded = true; + scheduleTraversals(); + return false; + } + // Draw with software renderer. Canvas canvas; try { @@ -4435,6 +4469,7 @@ public final class ViewRootImpl implements ViewParent, for (int i = 0; i < viewCount; i++) { mTempViews[i].invalidate(); + mTempViews[i] = null; } for (int i = 0; i < viewRectCount; i++) { diff --git a/core/java/android/view/accessibility/AccessibilityInteractionClient.java b/core/java/android/view/accessibility/AccessibilityInteractionClient.java index bd341d0..20b5f17 100644 --- a/core/java/android/view/accessibility/AccessibilityInteractionClient.java +++ b/core/java/android/view/accessibility/AccessibilityInteractionClient.java @@ -19,6 +19,7 @@ package android.view.accessibility; import android.accessibilityservice.IAccessibilityServiceConnection; import android.graphics.Rect; import android.os.Binder; +import android.os.Build; import android.os.Bundle; import android.os.Message; import android.os.Process; @@ -27,10 +28,14 @@ import android.os.SystemClock; import android.util.Log; import android.util.LongSparseArray; import android.util.SparseArray; +import android.util.SparseLongArray; import java.util.ArrayList; import java.util.Collections; +import java.util.HashSet; +import java.util.LinkedList; import java.util.List; +import java.util.Queue; import java.util.concurrent.atomic.AtomicInteger; /** @@ -74,6 +79,8 @@ public final class AccessibilityInteractionClient private static final boolean DEBUG = false; + private static final boolean CHECK_INTEGRITY = true; + private static final long TIMEOUT_INTERACTION_MILLIS = 5000; private static final Object sStaticLock = new Object(); @@ -491,6 +498,9 @@ public final class AccessibilityInteractionClient result = Collections.emptyList(); } clearResultLocked(); + if (Build.IS_DEBUGGABLE && CHECK_INTEGRITY) { + checkFindAccessibilityNodeInfoResultIntegrity(result); + } return result; } } @@ -696,4 +706,56 @@ public final class AccessibilityInteractionClient sConnectionCache.remove(connectionId); } } + + /** + * Checks whether the infos are a fully connected tree with no duplicates. + * + * @param infos The result list to check. + */ + private void checkFindAccessibilityNodeInfoResultIntegrity(List<AccessibilityNodeInfo> infos) { + if (infos.size() == 0) { + return; + } + // Find the root node. + AccessibilityNodeInfo root = infos.get(0); + final int infoCount = infos.size(); + for (int i = 1; i < infoCount; i++) { + for (int j = i; j < infoCount; j++) { + AccessibilityNodeInfo candidate = infos.get(j); + if (root.getParentNodeId() == candidate.getSourceNodeId()) { + root = candidate; + break; + } + } + } + if (root == null) { + Log.e(LOG_TAG, "No root."); + } + // Check for duplicates. + HashSet<AccessibilityNodeInfo> seen = new HashSet<AccessibilityNodeInfo>(); + Queue<AccessibilityNodeInfo> fringe = new LinkedList<AccessibilityNodeInfo>(); + fringe.add(root); + while (!fringe.isEmpty()) { + AccessibilityNodeInfo current = fringe.poll(); + if (!seen.add(current)) { + Log.e(LOG_TAG, "Duplicate node."); + return; + } + SparseLongArray childIds = current.getChildNodeIds(); + final int childCount = childIds.size(); + for (int i = 0; i < childCount; i++) { + final long childId = childIds.valueAt(i); + for (int j = 0; j < infoCount; j++) { + AccessibilityNodeInfo child = infos.get(j); + if (child.getSourceNodeId() == childId) { + fringe.add(child); + } + } + } + } + final int disconnectedCount = infos.size() - seen.size(); + if (disconnectedCount > 0) { + Log.e(LOG_TAG, disconnectedCount + " Disconnected nodes."); + } + } } diff --git a/core/java/android/view/accessibility/AccessibilityNodeInfoCache.java b/core/java/android/view/accessibility/AccessibilityNodeInfoCache.java index 52b7772..14954be 100644 --- a/core/java/android/view/accessibility/AccessibilityNodeInfoCache.java +++ b/core/java/android/view/accessibility/AccessibilityNodeInfoCache.java @@ -244,7 +244,7 @@ public class AccessibilityNodeInfoCache { /** * We are enforcing the invariant for a single accessibility focus. * - * @param currentInputFocusId The current input focused node. + * @param currentAccessibilityFocusId The current input focused node. */ private void clearSubtreeWithOldAccessibilityFocusLocked(long currentAccessibilityFocusId) { final int cacheSize = mCacheImpl.size(); diff --git a/core/java/android/webkit/WebViewClassic.java b/core/java/android/webkit/WebViewClassic.java index 5d42da1..7786564 100644 --- a/core/java/android/webkit/WebViewClassic.java +++ b/core/java/android/webkit/WebViewClassic.java @@ -934,7 +934,6 @@ public final class WebViewClassic implements WebViewProvider, WebViewProvider.Sc private static final int RELEASE_SINGLE_TAP = 5; private static final int REQUEST_FORM_DATA = 6; private static final int DRAG_HELD_MOTIONLESS = 8; - private static final int AWAKEN_SCROLL_BARS = 9; private static final int PREVENT_DEFAULT_TIMEOUT = 10; private static final int SCROLL_SELECT_TEXT = 11; @@ -1002,7 +1001,7 @@ public final class WebViewClassic implements WebViewProvider, WebViewProvider.Sc "REQUEST_FORM_DATA", // = 6; "RESUME_WEBCORE_PRIORITY", // = 7; "DRAG_HELD_MOTIONLESS", // = 8; - "AWAKEN_SCROLL_BARS", // = 9; + "", // = 9; "PREVENT_DEFAULT_TIMEOUT", // = 10; "SCROLL_SELECT_TEXT" // = 11; }; @@ -1598,8 +1597,6 @@ public final class WebViewClassic implements WebViewProvider, WebViewProvider.Sc private void init() { OnTrimMemoryListener.init(mContext); mWebView.setWillNotDraw(false); - mWebView.setFocusable(true); - mWebView.setFocusableInTouchMode(true); mWebView.setClickable(true); mWebView.setLongClickable(true); @@ -1716,6 +1713,10 @@ public final class WebViewClassic implements WebViewProvider, WebViewProvider.Sc mZoomManager.updateDefaultZoomDensity(density); } + /* package */ int getScaledNavSlop() { + return viewToContentDimension(mNavSlop); + } + /* package */ boolean onSavePassword(String schemePlusHost, String username, String password, final Message resumeMsg) { boolean rVal = false; @@ -2939,6 +2940,7 @@ public final class WebViewClassic implements WebViewProvider, WebViewProvider.Sc // premature data from webkit, ignore if ((w | h) == 0) { + invalidate(); return; } @@ -2951,10 +2953,7 @@ public final class WebViewClassic implements WebViewProvider, WebViewProvider.Sc // updated when we get out of that mode. if (!mDrawHistory) { // repin our scroll, taking into account the new content size - if (updateScrollCoordinates(pinLocX(getScrollX()), - pinLocY(getScrollY()))) { - invalidate(); - } + updateScrollCoordinates(pinLocX(getScrollX()), pinLocY(getScrollY())); if (!mScroller.isFinished()) { // We are in the middle of a scroll. Repin the final scroll // position. @@ -2962,6 +2961,7 @@ public final class WebViewClassic implements WebViewProvider, WebViewProvider.Sc mScroller.setFinalY(pinLocY(mScroller.getFinalY())); } } + invalidate(); } contentSizeChanged(updateLayout); } @@ -3772,7 +3772,6 @@ public final class WebViewClassic implements WebViewProvider, WebViewProvider.Sc // Log.d(LOGTAG, "startScroll: " + dx + " " + dy); mScroller.startScroll(getScrollX(), getScrollY(), dx, dy, animationDuration > 0 ? animationDuration : computeDuration(dx, dy)); - mWebViewPrivate.awakenScrollBars(mScroller.getDuration()); invalidate(); } else { mWebView.scrollTo(x, y); @@ -4155,15 +4154,11 @@ public final class WebViewClassic implements WebViewProvider, WebViewProvider.Sc if (mTouchMode == TOUCH_DRAG_MODE) { if (mHeldMotionless == MOTIONLESS_PENDING) { mPrivateHandler.removeMessages(DRAG_HELD_MOTIONLESS); - mPrivateHandler.removeMessages(AWAKEN_SCROLL_BARS); mHeldMotionless = MOTIONLESS_FALSE; } if (mHeldMotionless == MOTIONLESS_FALSE) { mPrivateHandler.sendMessageDelayed(mPrivateHandler .obtainMessage(DRAG_HELD_MOTIONLESS), MOTIONLESS_TIME); - mPrivateHandler.sendMessageDelayed(mPrivateHandler - .obtainMessage(AWAKEN_SCROLL_BARS), - ViewConfiguration.getScrollDefaultDelay()); mHeldMotionless = MOTIONLESS_PENDING; } } @@ -4339,10 +4334,6 @@ public final class WebViewClassic implements WebViewProvider, WebViewProvider.Sc } private void removeTouchHighlight() { - if (mWebViewCore != null) { - mWebViewCore.removeMessages(EventHub.HIT_TEST); - } - mPrivateHandler.removeMessages(HIT_TEST_RESULT); setTouchHighlightRects(null); } @@ -5768,14 +5759,15 @@ public final class WebViewClassic implements WebViewProvider, WebViewProvider.Sc return false; } - if (!mWebView.isFocused()) { - mWebView.requestFocus(); - } - if (mInputDispatcher == null) { return false; } + if (mWebView.isFocusable() && mWebView.isFocusableInTouchMode() + && !mWebView.isFocused()) { + mWebView.requestFocus(); + } + if (mInputDispatcher.postPointerEvent(ev, getScrollX(), getScrollY() - getTitleHeight(), mZoomManager.getInvScale())) { mInputDispatcher.dispatchUiEvents(); @@ -5817,7 +5809,6 @@ public final class WebViewClassic implements WebViewProvider, WebViewProvider.Sc switch (action) { case MotionEvent.ACTION_DOWN: { mConfirmMove = false; - mInitialHitTestResult = null; if (!mEditTextScroller.isFinished()) { mEditTextScroller.abortAnimation(); } @@ -5839,23 +5830,6 @@ public final class WebViewClassic implements WebViewProvider, WebViewProvider.Sc } } else { // the normal case mTouchMode = TOUCH_INIT_MODE; - // TODO: Have WebViewInputDispatch handle this - TouchHighlightData data = new TouchHighlightData(); - data.mX = contentX; - data.mY = contentY; - data.mNativeLayerRect = new Rect(); - if (mNativeClass != 0) { - data.mNativeLayer = nativeScrollableLayer(mNativeClass, - contentX, contentY, data.mNativeLayerRect, null); - } else { - data.mNativeLayer = 0; - } - data.mSlop = viewToContentDimension(mNavSlop); - removeTouchHighlight(); - if (!mBlockWebkitViewMessages && mWebViewCore != null) { - mWebViewCore.sendMessageAtFrontOfQueue( - EventHub.HIT_TEST, data); - } if (mLogEvent && eventTime - mLastTouchUpTime < 1000) { EventLog.writeEvent(EventLogTags.BROWSER_DOUBLE_TAP_DURATION, (eventTime - mLastTouchUpTime), eventTime); @@ -6067,27 +6041,6 @@ public final class WebViewClassic implements WebViewProvider, WebViewProvider.Sc } } - // Turn off scrollbars when dragging a layer. - if (keepScrollBarsVisible && - mTouchMode != TOUCH_DRAG_LAYER_MODE && - mTouchMode != TOUCH_DRAG_TEXT_MODE) { - if (mHeldMotionless != MOTIONLESS_TRUE) { - mHeldMotionless = MOTIONLESS_TRUE; - invalidate(); - } - // keep the scrollbar on the screen even there is no scroll - mWebViewPrivate.awakenScrollBars(ViewConfiguration.getScrollDefaultDelay(), - false); - // Post a message so that we'll keep them alive while we're not scrolling. - mPrivateHandler.sendMessageDelayed(mPrivateHandler - .obtainMessage(AWAKEN_SCROLL_BARS), - ViewConfiguration.getScrollDefaultDelay()); - // return false to indicate that we can't pan out of the - // view space - return; - } else { - mPrivateHandler.removeMessages(AWAKEN_SCROLL_BARS); - } break; } case MotionEvent.ACTION_UP: { @@ -6135,7 +6088,6 @@ public final class WebViewClassic implements WebViewProvider, WebViewProvider.Sc case TOUCH_DRAG_LAYER_MODE: case TOUCH_DRAG_TEXT_MODE: mPrivateHandler.removeMessages(DRAG_HELD_MOTIONLESS); - mPrivateHandler.removeMessages(AWAKEN_SCROLL_BARS); // if the user waits a while w/o moving before the // up, we don't want to do a fling if (eventTime - mLastTouchTime <= MIN_FLING_TIME) { @@ -6401,7 +6353,6 @@ public final class WebViewClassic implements WebViewProvider, WebViewProvider.Sc mPrivateHandler.removeMessages(SWITCH_TO_SHORTPRESS); mPrivateHandler.removeMessages(SWITCH_TO_LONGPRESS); mPrivateHandler.removeMessages(DRAG_HELD_MOTIONLESS); - mPrivateHandler.removeMessages(AWAKEN_SCROLL_BARS); removeTouchHighlight(); mHeldMotionless = MOTIONLESS_TRUE; mTouchMode = TOUCH_DONE_MODE; @@ -6833,17 +6784,6 @@ public final class WebViewClassic implements WebViewProvider, WebViewProvider.Sc // no horizontal overscroll if the content just fits mScroller.fling(scrollX, scrollY, -vx, -vy, 0, maxX, 0, maxY, maxX == 0 ? 0 : overflingDistance, overflingDistance); - // Duration is calculated based on velocity. With range boundaries and overscroll - // we may not know how long the final animation will take. (Hence the deprecation - // warning on the call below.) It's not a big deal for scroll bars but if webcore - // resumes during this effect we will take a performance hit. See computeScroll; - // we resume webcore there when the animation is finished. - final int time = mScroller.getDuration(); - - // Suppress scrollbars for layer scrolling. - if (mTouchMode != TOUCH_DRAG_LAYER_MODE && mTouchMode != TOUCH_DRAG_TEXT_MODE) { - mWebViewPrivate.awakenScrollBars(time); - } invalidate(); } @@ -7381,17 +7321,6 @@ public final class WebViewClassic implements WebViewProvider, WebViewProvider.Sc case DRAG_HELD_MOTIONLESS: mHeldMotionless = MOTIONLESS_TRUE; invalidate(); - // fall through to keep scrollbars awake - - case AWAKEN_SCROLL_BARS: - if (mTouchMode == TOUCH_DRAG_MODE - && mHeldMotionless == MOTIONLESS_TRUE) { - mWebViewPrivate.awakenScrollBars(ViewConfiguration - .getScrollDefaultDelay(), false); - mPrivateHandler.sendMessageDelayed(mPrivateHandler - .obtainMessage(AWAKEN_SCROLL_BARS), - ViewConfiguration.getScrollDefaultDelay()); - } break; case SCREEN_ON: @@ -7956,7 +7885,8 @@ public final class WebViewClassic implements WebViewProvider, WebViewProvider.Sc } // update the zoom information based on the new picture - mZoomManager.onNewPicture(draw); + if (mZoomManager.onNewPicture(draw)) + invalidate(); if (isPictureAfterFirstLayout) { mViewManager.postReadyToDrawAll(); diff --git a/core/java/android/webkit/WebViewCore.java b/core/java/android/webkit/WebViewCore.java index 7aa9a0b..76cd1c9 100644 --- a/core/java/android/webkit/WebViewCore.java +++ b/core/java/android/webkit/WebViewCore.java @@ -1143,8 +1143,6 @@ public final class WebViewCore { static final int ADD_PACKAGE_NAME = 185; static final int REMOVE_PACKAGE_NAME = 186; - static final int HIT_TEST = 187; - // accessibility support static final int MODIFY_SELECTION = 190; @@ -1648,18 +1646,6 @@ public final class WebViewCore { (Set<String>) msg.obj); break; - case HIT_TEST: - TouchHighlightData d = (TouchHighlightData) msg.obj; - if (d.mNativeLayer != 0) { - nativeScrollLayer(mNativeClass, - d.mNativeLayer, d.mNativeLayerRect); - } - WebKitHitTest hit = performHitTest(d.mX, d.mY, d.mSlop, true); - mWebViewClassic.mPrivateHandler.obtainMessage( - WebViewClassic.HIT_TEST_RESULT, hit) - .sendToTarget(); - break; - case SET_USE_MOCK_DEVICE_ORIENTATION: setUseMockDeviceOrientation(); break; @@ -1792,6 +1778,15 @@ public final class WebViewCore { return false; } switch (eventType) { + case WebViewInputDispatcher.EVENT_TYPE_HIT_TEST: + int x = Math.round(event.getX()); + int y = Math.round(event.getY()); + WebKitHitTest hit = performHitTest(x, y, + mWebViewClassic.getScaledNavSlop(), true); + mWebViewClassic.mPrivateHandler.obtainMessage( + WebViewClassic.HIT_TEST_RESULT, hit).sendToTarget(); + return false; + case WebViewInputDispatcher.EVENT_TYPE_CLICK: return nativeMouseClick(mNativeClass); diff --git a/core/java/android/webkit/WebViewInputDispatcher.java b/core/java/android/webkit/WebViewInputDispatcher.java index 9328d8c..9eeb311 100644 --- a/core/java/android/webkit/WebViewInputDispatcher.java +++ b/core/java/android/webkit/WebViewInputDispatcher.java @@ -204,6 +204,11 @@ final class WebViewInputDispatcher { public static final int EVENT_TYPE_DOUBLE_TAP = 5; /** + * Event type: Indicates that a hit test should be performed + */ + public static final int EVENT_TYPE_HIT_TEST = 6; + + /** * Flag: This event is private to this queue. Do not forward it. */ public static final int FLAG_PRIVATE = 1 << 0; @@ -499,13 +504,17 @@ final class WebViewInputDispatcher { } private void enqueueDoubleTapLocked(MotionEvent event) { - unscheduleClickLocked(); - hideTapCandidateLocked(); MotionEvent eventToEnqueue = MotionEvent.obtainNoHistory(event); DispatchEvent d = obtainDispatchEventLocked(eventToEnqueue, EVENT_TYPE_DOUBLE_TAP, 0, mPostLastWebKitXOffset, mPostLastWebKitYOffset, mPostLastWebKitScale); enqueueEventLocked(d); - mIsDoubleTapCandidate = false; + } + + private void enqueueHitTestLocked(MotionEvent event) { + MotionEvent eventToEnqueue = MotionEvent.obtainNoHistory(event); + DispatchEvent d = obtainDispatchEventLocked(eventToEnqueue, EVENT_TYPE_HIT_TEST, 0, + mPostLastWebKitXOffset, mPostLastWebKitYOffset, mPostLastWebKitScale); + enqueueEventLocked(d); } private void checkForSlopLocked(MotionEvent event) { @@ -545,6 +554,7 @@ final class WebViewInputDispatcher { mInitialDownX = event.getX(); mInitialDownY = event.getY(); scheduleShowTapHighlightLocked(); + enqueueHitTestLocked(event); } else if (action == MotionEvent.ACTION_UP) { unscheduleLongPressLocked(); if (isClickCandidateLocked(event)) { @@ -824,6 +834,7 @@ final class WebViewInputDispatcher { case EVENT_TYPE_CLICK: case EVENT_TYPE_HOVER: case EVENT_TYPE_SCROLL: + case EVENT_TYPE_HIT_TEST: return false; case EVENT_TYPE_TOUCH: return !mPostSendTouchEventsToWebKit diff --git a/core/java/android/webkit/ZoomManager.java b/core/java/android/webkit/ZoomManager.java index 2247678..1da59e4 100644 --- a/core/java/android/webkit/ZoomManager.java +++ b/core/java/android/webkit/ZoomManager.java @@ -1008,8 +1008,10 @@ class ZoomManager { /** * Updates zoom values when Webkit produces a new picture. This method * should only be called from the UI thread's message handler. + * + * @return True if zoom value has changed */ - public void onNewPicture(WebViewCore.DrawData drawData) { + public boolean onNewPicture(WebViewCore.DrawData drawData) { final int viewWidth = mWebView.getViewWidth(); final boolean zoomOverviewWidthChanged = setupZoomOverviewWidth(drawData, viewWidth); final float newZoomOverviewScale = getZoomOverviewScale(); @@ -1056,6 +1058,8 @@ class ZoomManager { // so next new picture could be forced into overview mode if it's true. mInitialZoomOverview = mInZoomOverview; } + + return scaleHasDiff; } /** diff --git a/core/java/android/widget/AbsSeekBar.java b/core/java/android/widget/AbsSeekBar.java index ae68794..e217e4f 100644 --- a/core/java/android/widget/AbsSeekBar.java +++ b/core/java/android/widget/AbsSeekBar.java @@ -21,6 +21,7 @@ import android.content.res.TypedArray; import android.graphics.Canvas; import android.graphics.Rect; import android.graphics.drawable.Drawable; +import android.os.Bundle; import android.util.AttributeSet; import android.view.KeyEvent; import android.view.MotionEvent; @@ -486,5 +487,46 @@ public abstract class AbsSeekBar extends ProgressBar { public void onInitializeAccessibilityNodeInfo(AccessibilityNodeInfo info) { super.onInitializeAccessibilityNodeInfo(info); info.setClassName(AbsSeekBar.class.getName()); + + if (isEnabled()) { + final int progress = getProgress(); + if (progress > 0) { + info.addAction(AccessibilityNodeInfo.ACTION_SCROLL_BACKWARD); + } + if (progress < getMax()) { + info.addAction(AccessibilityNodeInfo.ACTION_SCROLL_FORWARD); + } + } + } + + @Override + public boolean performAccessibilityAction(int action, Bundle arguments) { + if (super.performAccessibilityAction(action, arguments)) { + return true; + } + if (!isEnabled()) { + return false; + } + final int progress = getProgress(); + final int increment = Math.max(1, Math.round((float) getMax() / 5)); + switch (action) { + case AccessibilityNodeInfo.ACTION_SCROLL_BACKWARD: { + if (progress <= 0) { + return false; + } + setProgress(progress - increment, true); + onKeyChange(); + return true; + } + case AccessibilityNodeInfo.ACTION_SCROLL_FORWARD: { + if (progress >= getMax()) { + return false; + } + setProgress(progress + increment, true); + onKeyChange(); + return true; + } + } + return false; } } diff --git a/core/java/android/widget/NumberPicker.java b/core/java/android/widget/NumberPicker.java index 16b8afa..b60ffc5 100644 --- a/core/java/android/widget/NumberPicker.java +++ b/core/java/android/widget/NumberPicker.java @@ -2503,7 +2503,7 @@ public class NumberPicker extends LinearLayout { info.addChild(NumberPicker.this, VIRTUAL_VIEW_ID_INCREMENT); } - info.setParent((View) getParent()); + info.setParent((View) getParentForAccessibility()); info.setEnabled(NumberPicker.this.isEnabled()); info.setScrollable(true); Rect boundsInParent = mTempRect; diff --git a/core/java/android/widget/RemoteViews.java b/core/java/android/widget/RemoteViews.java index 56c4bd8..51c957a 100644 --- a/core/java/android/widget/RemoteViews.java +++ b/core/java/android/widget/RemoteViews.java @@ -1445,7 +1445,8 @@ public class RemoteViews implements Parcelable, Filter { /** * Returns an estimate of the bitmap heap memory usage for this RemoteViews. */ - int estimateMemoryUsage() { + /** @hide */ + public int estimateMemoryUsage() { return mMemoryUsageCounter.getMemoryUsage(); } diff --git a/core/java/com/android/internal/widget/multiwaveview/MultiWaveView.java b/core/java/com/android/internal/widget/multiwaveview/MultiWaveView.java index 60cd895..6136206 100644 --- a/core/java/com/android/internal/widget/multiwaveview/MultiWaveView.java +++ b/core/java/com/android/internal/widget/multiwaveview/MultiWaveView.java @@ -79,18 +79,17 @@ public class MultiWaveView extends View { 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>(); private ArrayList<TargetDrawable> mChevronDrawables = new ArrayList<TargetDrawable>(); - private ArrayList<Tweener> mChevronAnimations = new ArrayList<Tweener>(); - private ArrayList<Tweener> mTargetAnimations = new ArrayList<Tweener>(); + private AnimationBundle mChevronAnimations = new AnimationBundle(); + private AnimationBundle mTargetAnimations = new AnimationBundle(); + private AnimationBundle mHandleAnimations = new AnimationBundle(); private ArrayList<String> mTargetDescriptions; private ArrayList<String> mDirectionDescriptions; - private Tweener mHandleAnimation; private OnTriggerListener mOnTriggerListener; private TargetDrawable mHandleDrawable; private TargetDrawable mOuterRing; @@ -114,6 +113,33 @@ public class MultiWaveView extends View { private boolean mDragging; private int mNewTargetResources; + private class AnimationBundle extends ArrayList<Tweener> { + private static final long serialVersionUID = 0xA84D78726F127468L; + private boolean mSuspended; + + public void start() { + if (mSuspended) return; // ignore attempts to start animations + final int count = size(); + for (int i = 0; i < count; i++) { + Tweener anim = get(i); + anim.animator.start(); + } + } + + public void stop() { + final int count = size(); + for (int i = 0; i < count; i++) { + Tweener anim = get(i); + anim.animator.end(); + } + clear(); + } + + public void setSuspended(boolean suspend) { + mSuspended = suspend; + } + }; + private AnimatorListener mResetListener = new AnimatorListenerAdapter() { public void onAnimationEnd(Animator animator) { switchToState(STATE_IDLE, mWaveCenterX, mWaveCenterY); @@ -239,6 +265,7 @@ public class MultiWaveView extends View { a.recycle(); setVibrateEnabled(mVibrationDuration > 0); + assignDefaultsIfNeeded(); } private void dump() { @@ -254,6 +281,21 @@ public class MultiWaveView extends View { Log.v(TAG, "VerticalOffset = " + mVerticalOffset); } + public void suspendAnimations() { + mChevronAnimations.setSuspended(true); + mTargetAnimations.setSuspended(true); + mHandleAnimations.setSuspended(true); + } + + public void resumeAnimations() { + mChevronAnimations.setSuspended(false); + mTargetAnimations.setSuspended(false); + mHandleAnimations.setSuspended(false); + mChevronAnimations.start(); + mTargetAnimations.start(); + mHandleAnimations.start(); + } + @Override protected int getSuggestedMinimumWidth() { // View should be large enough to contain the background + handle and @@ -334,12 +376,12 @@ public class MultiWaveView extends View { private void startChevronAnimation() { 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; - final int directionCount = mFeedbackCount > 0 ? mChevronDrawables.size()/mFeedbackCount : 0; + mChevronAnimations.stop(); + // Add an animation for all chevron drawables. There are mFeedbackCount drawables // in each direction and directionCount directions. for (int direction = 0; direction < directionCount; direction++) { @@ -367,24 +409,21 @@ public class MultiWaveView extends View { "onUpdate", mUpdateListener)); } } + mChevronAnimations.start(); } private void stopChevronAnimation() { - for (Tweener anim : mChevronAnimations) { - anim.animator.end(); - } - mChevronAnimations.clear(); + mChevronAnimations.stop(); } private void stopHandleAnimation() { - if (mHandleAnimation != null) { - mHandleAnimation.animator.end(); - mHandleAnimation = null; - } + mHandleAnimations.stop(); } private void deactivateTargets() { - for (TargetDrawable target : mTargetDrawables) { + final int count = mTargetDrawables.size(); + for (int i = 0; i < count; i++) { + TargetDrawable target = mTargetDrawables.get(i); target.setState(TargetDrawable.STATE_INACTIVE); } mActiveTarget = -1; @@ -445,14 +484,16 @@ public class MultiWaveView extends View { // 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, + mHandleAnimations.stop(); + mHandleAnimations.add(Tweener.to(mHandleDrawable, duration, "ease", Ease.Quart.easeOut, "delay", delay, "alpha", 1.0f, "x", 0, "y", 0, "onUpdate", mUpdateListener, - "onComplete", (mDragging && !targetHit) ? mResetListenerWithPing : mResetListener); + "onComplete", (mDragging && !targetHit) ? mResetListenerWithPing : mResetListener)); + mHandleAnimations.start(); setGrabbedState(OnTriggerListener.NO_HANDLE); } @@ -467,9 +508,7 @@ public class MultiWaveView extends View { } private void hideTargets(boolean animate) { - if (mTargetAnimations.size() > 0) { - stopTargetAnimation(); - } + mTargetAnimations.stop(); // 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; @@ -497,12 +536,12 @@ public class MultiWaveView extends View { "delay", delay, "onUpdate", mUpdateListener, "onComplete", mTargetUpdateListener)); + + mTargetAnimations.start(); } private void showTargets(boolean animate) { - if (mTargetAnimations.size() > 0) { - stopTargetAnimation(); - } + mTargetAnimations.stop(); mAnimatingTargets = animate; final int delay = animate ? SHOW_ANIMATION_DELAY : 0; final int length = mTargetDrawables.size(); @@ -521,7 +560,7 @@ public class MultiWaveView extends View { } mOuterRing.setScaleX(0.5f); mOuterRing.setScaleY(0.5f); - mTargetAnimations.add(Tweener.to(mOuterRing, animate ? RING_EXPAND_DURATION : 0, + mTargetAnimations.add(Tweener.to(mOuterRing, animate ? SHOW_ANIMATION_DURATION : 0, "ease", Ease.Cubic.easeOut, "alpha", 1.0f, "scaleX", 1.0f, @@ -529,13 +568,12 @@ public class MultiWaveView extends View { "delay", delay, "onUpdate", mUpdateListener, "onComplete", mTargetUpdateListener)); + + mTargetAnimations.start(); } private void stopTargetAnimation() { - for (Tweener anim : mTargetAnimations) { - anim.animator.end(); - } - mTargetAnimations.clear(); + mTargetAnimations.stop(); } private void vibrate() { @@ -658,7 +696,6 @@ public class MultiWaveView extends View { * */ public void ping() { - stopChevronAnimation(); startChevronAnimation(); } @@ -721,7 +758,7 @@ public class MultiWaveView extends View { } private void handleDown(MotionEvent event) { - if (!trySwitchToFirstTouchState(event)) { + if (!trySwitchToFirstTouchState(event.getX(), event.getY())) { mDragging = false; stopTargetAnimation(); ping(); @@ -747,14 +784,11 @@ public class MultiWaveView extends View { } private void handleMove(MotionEvent event) { - if (!mDragging) { - trySwitchToFirstTouchState(event); - return; - } - int activeTarget = -1; final int historySize = event.getHistorySize(); - final boolean singleTarget = mTargetDrawables.size() == 1; + ArrayList<TargetDrawable> targets = mTargetDrawables; + int ntargets = targets.size(); + final boolean singleTarget = ntargets == 1; float x = 0.0f; float y = 0.0f; for (int k = 0; k < historySize + 1; k++) { @@ -768,25 +802,29 @@ public class MultiWaveView extends View { float limitX = tx * scale; float limitY = ty * scale; - if (singleTarget) { - // Snap to outer ring if there's only one target - float snapRadius = mOuterRadius - mSnapMargin; - if (touchRadius > snapRadius) { - activeTarget = 0; - } + if (!mDragging) { + trySwitchToFirstTouchState(eventX, eventY); } else { - // If there's more than one target, snap to the closest one less than hitRadius away. - float best = Float.MAX_VALUE; - final float hitRadius2 = mHitRadius * mHitRadius; - for (int i = 0; i < mTargetDrawables.size(); i++) { - // Snap to the first target in range - TargetDrawable target = mTargetDrawables.get(i); - float dx = limitX - target.getX(); - float dy = limitY - target.getY(); - float dist2 = dx*dx + dy*dy; - if (target.isEnabled() && dist2 < hitRadius2 && dist2 < best) { - activeTarget = i; - best = dist2; + if (singleTarget) { + // Snap to outer ring if there's only one target + float snapRadius = mOuterRadius - mSnapMargin; + if (touchRadius > snapRadius) { + activeTarget = 0; + } + } else { + // For more than one target, snap to the closest one less than hitRadius away. + float best = Float.MAX_VALUE; + final float hitRadius2 = mHitRadius * mHitRadius; + for (int i = 0; i < ntargets; i++) { + // Snap to the first target in range + TargetDrawable target = targets.get(i); + float dx = limitX - target.getX(); + float dy = limitY - target.getY(); + float dist2 = dx*dx + dy*dy; + if (target.isEnabled() && dist2 < hitRadius2 && dist2 < best) { + activeTarget = i; + best = dist2; + } } } } @@ -794,9 +832,13 @@ public class MultiWaveView extends View { y = limitY; } + if (!mDragging) { + return; + } + if (activeTarget != -1) { switchToState(STATE_SNAP, x,y); - TargetDrawable target = mTargetDrawables.get(activeTarget); + TargetDrawable target = targets.get(activeTarget); float newX = singleTarget ? x : target.getX(); float newY = singleTarget ? y : target.getY(); moveHandleTo(newX, newY, false); @@ -812,7 +854,7 @@ public class MultiWaveView extends View { if (mActiveTarget != activeTarget) { // Defocus the old target if (mActiveTarget != -1) { - TargetDrawable target = mTargetDrawables.get(mActiveTarget); + TargetDrawable target = targets.get(mActiveTarget); if (target.hasState(TargetDrawable.STATE_FOCUSED)) { target.setState(TargetDrawable.STATE_INACTIVE); mHandleDrawable.setAlpha(1.0f); @@ -820,7 +862,7 @@ public class MultiWaveView extends View { } // Focus the new target if (activeTarget != -1) { - TargetDrawable target = mTargetDrawables.get(activeTarget); + TargetDrawable target = targets.get(activeTarget); if (target.hasState(TargetDrawable.STATE_FOCUSED)) { target.setState(TargetDrawable.STATE_FOCUSED); mHandleDrawable.setAlpha(0.0f); @@ -877,9 +919,7 @@ public class MultiWaveView extends View { } } - private boolean trySwitchToFirstTouchState(MotionEvent event) { - final float x = event.getX(); - final float y = event.getY(); + private boolean trySwitchToFirstTouchState(float x, float y) { final float tx = x - mWaveCenterX; final float ty = y - mWaveCenterY; if (mAlwaysTrackFinger || dist2(tx,ty) <= getScaledTapRadiusSquared()) { @@ -892,9 +932,9 @@ public class MultiWaveView extends View { return false; } - private void assignDefaultsIfNeeded(float centerX, float centerY) { + private void assignDefaultsIfNeeded() { if (mOuterRadius == 0.0f) { - mOuterRadius = 0.5f*(float) Math.hypot(centerX, centerY); + mOuterRadius = Math.max(mOuterRing.getWidth(), mOuterRing.getHeight())/2.0f; } if (mHitRadius == 0.0f) { // Use the radius of inscribed circle of the first target. @@ -941,6 +981,7 @@ public class MultiWaveView extends View { super.onLayout(changed, left, top, right, bottom); final int width = right - left; final int height = bottom - top; + // Target placement width/height. This puts the targets on the greater of the ring // width or the specified outer radius. final float placementWidth = Math.max(mOuterRing.getWidth(), 2 * mOuterRadius); @@ -950,8 +991,6 @@ public class MultiWaveView extends View { float newWaveCenterY = mVerticalOffset + mVerticalInset + Math.max(height, + mMaxTargetHeight + placementHeight) / 2; - assignDefaultsIfNeeded(newWaveCenterX, newWaveCenterY); - if (mInitialLayout) { hideChevrons(); hideTargets(false); @@ -976,9 +1015,12 @@ public class MultiWaveView extends View { 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(); + ArrayList<TargetDrawable> targets = mTargetDrawables; + final int size = targets.size(); + final float alpha = (float) (-2.0f * Math.PI / size); + for (int i = 0; i < size; i++) { + final TargetDrawable targetIcon = targets.get(i); + final float angle = alpha * i; targetIcon.setPositionX(centerX); targetIcon.setPositionY(centerY); targetIcon.setX(mOuterRadius * (float) Math.cos(angle)); @@ -987,7 +1029,10 @@ public class MultiWaveView extends View { } private void updateChevronPositions(float centerX, float centerY) { - for (TargetDrawable target : mChevronDrawables) { + ArrayList<TargetDrawable> chevrons = mChevronDrawables; + final int size = chevrons.size(); + for (int i = 0; i < size; i++) { + TargetDrawable target = chevrons.get(i); if (target != null) { target.setPositionX(centerX); target.setPositionY(centerY); @@ -996,7 +1041,10 @@ public class MultiWaveView extends View { } private void hideChevrons() { - for (TargetDrawable chevron : mChevronDrawables) { + ArrayList<TargetDrawable> chevrons = mChevronDrawables; + final int size = chevrons.size(); + for (int i = 0; i < size; i++) { + TargetDrawable chevron = chevrons.get(i); if (chevron != null) { chevron.setAlpha(0.0f); } @@ -1006,14 +1054,18 @@ public class MultiWaveView extends View { @Override protected void onDraw(Canvas canvas) { mOuterRing.draw(canvas); - for (TargetDrawable target : mTargetDrawables) { + final int ntargets = mTargetDrawables.size(); + for (int i = 0; i < ntargets; i++) { + TargetDrawable target = mTargetDrawables.get(i); if (target != null) { target.draw(canvas); } } - for (TargetDrawable target : mChevronDrawables) { - if (target != null) { - target.draw(canvas); + final int nchevrons = mChevronDrawables.size(); + for (int i = 0; i < nchevrons; i++) { + TargetDrawable chevron = mChevronDrawables.get(i); + if (chevron != null) { + chevron.draw(canvas); } } mHandleDrawable.draw(canvas); diff --git a/core/java/com/android/internal/widget/multiwaveview/Tweener.java b/core/java/com/android/internal/widget/multiwaveview/Tweener.java index bc8a62f..1d502ba 100644 --- a/core/java/com/android/internal/widget/multiwaveview/Tweener.java +++ b/core/java/com/android/internal/widget/multiwaveview/Tweener.java @@ -122,7 +122,6 @@ class Tweener { anim.addListener(listener); } anim.addListener(mCleanupListener); - anim.start(); return tween; } diff --git a/core/jni/android/graphics/TextLayoutCache.cpp b/core/jni/android/graphics/TextLayoutCache.cpp index 673c38d..c85b09c 100644 --- a/core/jni/android/graphics/TextLayoutCache.cpp +++ b/core/jni/android/graphics/TextLayoutCache.cpp @@ -332,15 +332,7 @@ uint32_t TextLayoutValue::getElapsedTime() { } TextLayoutShaper::TextLayoutShaper() : mShaperItemGlyphArraySize(0) { - mDefaultTypeface = SkFontHost::CreateTypeface(NULL, NULL, NULL, 0, SkTypeface::kNormal); - mArabicTypeface = NULL; - mHebrewRegularTypeface = NULL; - mHebrewBoldTypeface = NULL; - mBengaliTypeface = NULL; - mThaiTypeface = NULL; - mDevanagariRegularTypeface = NULL; - mTamilRegularTypeface = NULL; - mTamilBoldTypeface = NULL; + init(); mFontRec.klass = &harfbuzzSkiaClass; mFontRec.userData = 0; @@ -359,7 +351,19 @@ TextLayoutShaper::TextLayoutShaper() : mShaperItemGlyphArraySize(0) { mShaperItem.font->userData = &mShapingPaint; } -TextLayoutShaper::~TextLayoutShaper() { +void TextLayoutShaper::init() { + mDefaultTypeface = SkFontHost::CreateTypeface(NULL, NULL, NULL, 0, SkTypeface::kNormal); + mArabicTypeface = NULL; + mHebrewRegularTypeface = NULL; + mHebrewBoldTypeface = NULL; + mBengaliTypeface = NULL; + mThaiTypeface = NULL; + mDevanagariRegularTypeface = NULL; + mTamilRegularTypeface = NULL; + mTamilBoldTypeface = NULL; +} + +void TextLayoutShaper::unrefTypefaces() { SkSafeUnref(mDefaultTypeface); SkSafeUnref(mArabicTypeface); SkSafeUnref(mHebrewRegularTypeface); @@ -369,6 +373,10 @@ TextLayoutShaper::~TextLayoutShaper() { SkSafeUnref(mDevanagariRegularTypeface); SkSafeUnref(mTamilRegularTypeface); SkSafeUnref(mTamilBoldTypeface); +} + +TextLayoutShaper::~TextLayoutShaper() { + unrefTypefaces(); deleteShaperItemGlyphArrays(); } @@ -983,6 +991,12 @@ HB_Face TextLayoutShaper::getCachedHBFace(SkTypeface* typeface) { return face; } +void TextLayoutShaper::purgeCaches() { + mCachedHBFaces.clear(); + unrefTypefaces(); + init(); +} + TextLayoutEngine::TextLayoutEngine() { mShaper = new TextLayoutShaper(); #if USE_TEXT_LAYOUT_CACHE @@ -1018,6 +1032,10 @@ sp<TextLayoutValue> TextLayoutEngine::getValue(const SkPaint* paint, const jchar void TextLayoutEngine::purgeCaches() { #if USE_TEXT_LAYOUT_CACHE mTextLayoutCache->clear(); + mShaper->purgeCaches(); +#if DEBUG_GLYPHS + ALOGD("Purged TextLayoutEngine caches"); +#endif #endif } diff --git a/core/jni/android/graphics/TextLayoutCache.h b/core/jni/android/graphics/TextLayoutCache.h index 027e888..cb15a2a 100644 --- a/core/jni/android/graphics/TextLayoutCache.h +++ b/core/jni/android/graphics/TextLayoutCache.h @@ -169,6 +169,8 @@ public: void computeValues(TextLayoutValue* value, const SkPaint* paint, const UChar* chars, size_t start, size_t count, size_t contextCount, int dirFlags); + void purgeCaches(); + private: /** * Harfbuzz shaper item @@ -218,6 +220,9 @@ private: */ UnicodeString mBuffer; + void init(); + void unrefTypefaces(); + SkTypeface* typefaceForUnichar(const SkPaint* paint, SkTypeface* typeface, SkUnichar unichar, HB_Script script); diff --git a/core/res/AndroidManifest.xml b/core/res/AndroidManifest.xml index dbc60f9..04a29e7 100644 --- a/core/res/AndroidManifest.xml +++ b/core/res/AndroidManifest.xml @@ -1551,6 +1551,13 @@ android:description="@string/permdesc_bindInputMethod" android:protectionLevel="signature" /> + <!-- Must be required by an {@link android.accessibilityservice.AccessibilityService}, + to ensure that only the system can bind to it. --> + <permission android:name="android.permission.BIND_ACCESSIBILITY_SERVICE" + android:label="@string/permlab_bindAccessibilityService" + android:description="@string/permdesc_bindAccessibilityService" + android:protectionLevel="signature" /> + <!-- Must be required by a TextService (e.g. SpellCheckerService) to ensure that only the system can bind to it. --> <permission android:name="android.permission.BIND_TEXT_SERVICE" diff --git a/core/res/res/anim-land/task_close_enter.xml b/core/res/res/anim-land/task_close_enter.xml index 805ff6c..facc42b 100644 --- a/core/res/res/anim-land/task_close_enter.xml +++ b/core/res/res/anim-land/task_close_enter.xml @@ -23,21 +23,20 @@ <alpha android:fromAlpha="0" android:toAlpha="1.0" android:fillEnabled="true" android:fillBefore="true" android:fillAfter="true" android:interpolator="@interpolator/decelerate_quad" - android:startOffset="150" - android:duration="350"/> + android:startOffset="300" + android:duration="400"/> - <translate android:fromXDelta="-140%" android:toXDelta="0" + <translate android:fromXDelta="-120%" android:toXDelta="0" android:fillEnabled="true" android:fillBefore="true" android:fillAfter="true" - android:interpolator="@interpolator/decelerate_cubic" - android:startOffset="150" - android:duration="350"/> + android:interpolator="@interpolator/decelerate_quint" + android:startOffset="300" + android:duration="400" /> - <scale android:fromXScale=".6" android:toXScale="1.0" - android:fromYScale=".6" android:toYScale="1.0" - android:pivotX="50%p" android:pivotY="50%p" + <scale android:fromXScale=".5" android:toXScale="1.0" + android:fromYScale=".5" android:toYScale="1.0" + android:pivotY="50%p" android:pivotX="0%p" android:fillEnabled="true" android:fillBefore="true" android:fillAfter="true" android:interpolator="@interpolator/decelerate_quad" - android:startOffset="150" - android:duration="350" /> - + android:startOffset="300" + android:duration="400" /> </set>
\ No newline at end of file diff --git a/core/res/res/anim-land/task_close_exit.xml b/core/res/res/anim-land/task_close_exit.xml index 3e97149..e104c33 100644 --- a/core/res/res/anim-land/task_close_exit.xml +++ b/core/res/res/anim-land/task_close_exit.xml @@ -19,25 +19,25 @@ <set xmlns:android="http://schemas.android.com/apk/res/android" android:background="#ff000000" android:shareInterpolator="false" android:zAdjustment="normal"> + <alpha android:fromAlpha="1.0" android:toAlpha="0" android:fillEnabled="true" android:fillBefore="true" android:fillAfter="true" android:interpolator="@interpolator/accelerate_quad" - android:duration="350"/> + android:duration="300"/> - <translate android:fromXDelta="0" android:toXDelta="140%" + <translate android:fromXDelta="0" android:toXDelta="120%" android:fillEnabled="true" android:fillBefore="true" android:fillAfter="true" - android:interpolator="@interpolator/decelerate_quad" - android:duration="350"/> + android:interpolator="@interpolator/accelerate_cubic" + android:duration="300"/> - <scale android:fromXScale="1.0" android:toXScale="0.6" - android:fromYScale="1.0" android:toYScale="0.6" + <scale android:fromXScale="1.0" android:toXScale="0.5" + android:fromYScale="1.0" android:toYScale="0.5" android:fillEnabled="true" android:fillBefore="true" android:fillAfter="true" - android:pivotX="50%p" android:pivotY="50%p" - android:interpolator="@interpolator/decelerate_cubic" - android:duration="350" /> + android:pivotY="50%p" android:pivotX="100%p" + android:interpolator="@interpolator/accelerate_quad" + android:duration="300" /> <!-- This is needed to keep the animation running while task_open_enter completes --> <alpha android:fromAlpha="1.0" android:toAlpha="1.0" - android:interpolator="@interpolator/accelerate_quad" - android:duration="500" /> + android:duration="700" /> </set>
\ No newline at end of file diff --git a/core/res/res/anim-land/task_open_enter.xml b/core/res/res/anim-land/task_open_enter.xml index fb1c5d6..dc7c7a9 100644 --- a/core/res/res/anim-land/task_open_enter.xml +++ b/core/res/res/anim-land/task_open_enter.xml @@ -23,21 +23,20 @@ <alpha android:fromAlpha="0" android:toAlpha="1.0" android:fillEnabled="true" android:fillBefore="true" android:fillAfter="true" android:interpolator="@interpolator/decelerate_quad" - android:startOffset="150" - android:duration="350"/> + android:startOffset="300" + android:duration="400"/> - <translate android:fromXDelta="140%" android:toXDelta="0" + <translate android:fromXDelta="120%" android:toXDelta="0" android:fillEnabled="true" android:fillBefore="true" android:fillAfter="true" - android:interpolator="@interpolator/decelerate_cubic" - android:startOffset="150" - android:duration="350"/> + android:interpolator="@interpolator/decelerate_quint" + android:startOffset="300" + android:duration="400" /> - <scale android:fromXScale=".6" android:toXScale="1.0" - android:fromYScale=".6" android:toYScale="1.0" - android:pivotX="50%p" android:pivotY="50%p" + <scale android:fromXScale=".5" android:toXScale="1.0" + android:fromYScale=".5" android:toYScale="1.0" + android:pivotY="50%p" android:pivotX="100%p" android:fillEnabled="true" android:fillBefore="true" android:fillAfter="true" android:interpolator="@interpolator/decelerate_quad" - android:startOffset="150" - android:duration="350" /> - + android:startOffset="300" + android:duration="400" /> </set>
\ No newline at end of file diff --git a/core/res/res/anim-land/task_open_exit.xml b/core/res/res/anim-land/task_open_exit.xml index 8d15324..701afa6 100644 --- a/core/res/res/anim-land/task_open_exit.xml +++ b/core/res/res/anim-land/task_open_exit.xml @@ -19,25 +19,25 @@ <set xmlns:android="http://schemas.android.com/apk/res/android" android:background="#ff000000" android:shareInterpolator="false" android:zAdjustment="normal"> + <alpha android:fromAlpha="1.0" android:toAlpha="0" android:fillEnabled="true" android:fillBefore="true" android:fillAfter="true" android:interpolator="@interpolator/accelerate_quad" - android:duration="350"/> + android:duration="300"/> - <translate android:fromXDelta="0" android:toXDelta="-140%" + <translate android:fromXDelta="0" android:toXDelta="-120%" android:fillEnabled="true" android:fillBefore="true" android:fillAfter="true" - android:interpolator="@interpolator/decelerate_quad" - android:duration="350"/> + android:interpolator="@interpolator/accelerate_cubic" + android:duration="300"/> - <scale android:fromXScale="1.0" android:toXScale="0.6" - android:fromYScale="1.0" android:toYScale="0.6" + <scale android:fromXScale="1.0" android:toXScale="0.5" + android:fromYScale="1.0" android:toYScale="0.5" android:fillEnabled="true" android:fillBefore="true" android:fillAfter="true" - android:pivotX="50%p" android:pivotY="50%p" - android:interpolator="@interpolator/decelerate_cubic" - android:duration="350" /> + android:pivotY="50%p" android:pivotX="0%p" + android:interpolator="@interpolator/accelerate_quad" + android:duration="300" /> <!-- This is needed to keep the animation running while task_open_enter completes --> <alpha android:fromAlpha="1.0" android:toAlpha="1.0" - android:interpolator="@interpolator/accelerate_quad" - android:duration="500" /> + android:duration="700" /> </set>
\ No newline at end of file diff --git a/core/res/res/anim-port/task_close_enter.xml b/core/res/res/anim-port/task_close_enter.xml index 1806eed..9a747a1 100644 --- a/core/res/res/anim-port/task_close_enter.xml +++ b/core/res/res/anim-port/task_close_enter.xml @@ -23,21 +23,20 @@ <alpha android:fromAlpha="0" android:toAlpha="1.0" android:fillEnabled="true" android:fillBefore="true" android:fillAfter="true" android:interpolator="@interpolator/decelerate_quad" - android:startOffset="150" - android:duration="350"/> + android:startOffset="300" + android:duration="400"/> - <translate android:fromYDelta="-140%" android:toYDelta="0" + <translate android:fromYDelta="-120%" android:toYDelta="0" android:fillEnabled="true" android:fillBefore="true" android:fillAfter="true" - android:interpolator="@interpolator/decelerate_cubic" - android:startOffset="150" - android:duration="350"/> + android:interpolator="@interpolator/decelerate_quint" + android:startOffset="300" + android:duration="400" /> - <scale android:fromXScale=".6" android:toXScale="1.0" - android:fromYScale=".6" android:toYScale="1.0" - android:pivotX="50%p" android:pivotY="50%p" + <scale android:fromXScale=".5" android:toXScale="1.0" + android:fromYScale=".5" android:toYScale="1.0" + android:pivotX="50%p" android:pivotY="0%p" android:fillEnabled="true" android:fillBefore="true" android:fillAfter="true" android:interpolator="@interpolator/decelerate_quad" - android:startOffset="150" - android:duration="350" /> - + android:startOffset="300" + android:duration="400" /> </set>
\ No newline at end of file diff --git a/core/res/res/anim-port/task_close_exit.xml b/core/res/res/anim-port/task_close_exit.xml index 958a7a2..35b1aa3 100644 --- a/core/res/res/anim-port/task_close_exit.xml +++ b/core/res/res/anim-port/task_close_exit.xml @@ -19,25 +19,25 @@ <set xmlns:android="http://schemas.android.com/apk/res/android" android:background="#ff000000" android:shareInterpolator="false" android:zAdjustment="normal"> + <alpha android:fromAlpha="1.0" android:toAlpha="0" android:fillEnabled="true" android:fillBefore="true" android:fillAfter="true" android:interpolator="@interpolator/accelerate_quad" - android:duration="350"/> + android:duration="300"/> - <translate android:fromYDelta="0" android:toYDelta="140%" + <translate android:fromYDelta="0" android:toYDelta="120%" android:fillEnabled="true" android:fillBefore="true" android:fillAfter="true" - android:interpolator="@interpolator/decelerate_quad" - android:duration="350"/> + android:interpolator="@interpolator/accelerate_cubic" + android:duration="300"/> - <scale android:fromXScale="1.0" android:toXScale="0.6" - android:fromYScale="1.0" android:toYScale="0.6" + <scale android:fromXScale="1.0" android:toXScale="0.5" + android:fromYScale="1.0" android:toYScale="0.5" android:fillEnabled="true" android:fillBefore="true" android:fillAfter="true" - android:pivotX="50%p" android:pivotY="50%p" - android:interpolator="@interpolator/decelerate_cubic" - android:duration="350" /> + android:pivotX="50%p" android:pivotY="100%p" + android:interpolator="@interpolator/accelerate_quad" + android:duration="300" /> <!-- This is needed to keep the animation running while task_open_enter completes --> <alpha android:fromAlpha="1.0" android:toAlpha="1.0" - android:interpolator="@interpolator/accelerate_quad" - android:duration="500" /> + android:duration="700" /> </set>
\ No newline at end of file diff --git a/core/res/res/anim-port/task_open_enter.xml b/core/res/res/anim-port/task_open_enter.xml index 54a2d93..5e4ae18 100644 --- a/core/res/res/anim-port/task_open_enter.xml +++ b/core/res/res/anim-port/task_open_enter.xml @@ -23,21 +23,20 @@ <alpha android:fromAlpha="0" android:toAlpha="1.0" android:fillEnabled="true" android:fillBefore="true" android:fillAfter="true" android:interpolator="@interpolator/decelerate_quad" - android:startOffset="150" - android:duration="350"/> + android:startOffset="300" + android:duration="400"/> - <translate android:fromYDelta="140%" android:toYDelta="0" + <translate android:fromYDelta="120%" android:toYDelta="0" android:fillEnabled="true" android:fillBefore="true" android:fillAfter="true" - android:interpolator="@interpolator/decelerate_cubic" - android:startOffset="150" - android:duration="350"/> + android:interpolator="@interpolator/decelerate_quint" + android:startOffset="300" + android:duration="400" /> - <scale android:fromXScale=".6" android:toXScale="1.0" - android:fromYScale=".6" android:toYScale="1.0" - android:pivotX="50%p" android:pivotY="50%p" + <scale android:fromXScale=".5" android:toXScale="1.0" + android:fromYScale=".5" android:toYScale="1.0" + android:pivotX="50%p" android:pivotY="100%p" android:fillEnabled="true" android:fillBefore="true" android:fillAfter="true" android:interpolator="@interpolator/decelerate_quad" - android:startOffset="150" - android:duration="350" /> - + android:startOffset="300" + android:duration="400" /> </set>
\ No newline at end of file diff --git a/core/res/res/anim-port/task_open_exit.xml b/core/res/res/anim-port/task_open_exit.xml index 18e6550..0ba35d7 100644 --- a/core/res/res/anim-port/task_open_exit.xml +++ b/core/res/res/anim-port/task_open_exit.xml @@ -19,25 +19,25 @@ <set xmlns:android="http://schemas.android.com/apk/res/android" android:background="#ff000000" android:shareInterpolator="false" android:zAdjustment="normal"> + <alpha android:fromAlpha="1.0" android:toAlpha="0" android:fillEnabled="true" android:fillBefore="true" android:fillAfter="true" android:interpolator="@interpolator/accelerate_quad" - android:duration="350"/> + android:duration="300"/> - <translate android:fromYDelta="0" android:toYDelta="-140%" + <translate android:fromYDelta="0" android:toYDelta="-120%" android:fillEnabled="true" android:fillBefore="true" android:fillAfter="true" - android:interpolator="@interpolator/decelerate_quad" - android:duration="350"/> + android:interpolator="@interpolator/accelerate_cubic" + android:duration="300"/> - <scale android:fromXScale="1.0" android:toXScale="0.6" - android:fromYScale="1.0" android:toYScale="0.6" + <scale android:fromXScale="1.0" android:toXScale="0.5" + android:fromYScale="1.0" android:toYScale="0.5" android:fillEnabled="true" android:fillBefore="true" android:fillAfter="true" - android:pivotX="50%p" android:pivotY="50%p" - android:interpolator="@interpolator/decelerate_cubic" - android:duration="350" /> + android:pivotX="50%p" android:pivotY="0%p" + android:interpolator="@interpolator/accelerate_quad" + android:duration="300" /> <!-- This is needed to keep the animation running while task_open_enter completes --> <alpha android:fromAlpha="1.0" android:toAlpha="1.0" - android:interpolator="@interpolator/accelerate_quad" - android:duration="500" /> + android:duration="700" /> </set>
\ No newline at end of file diff --git a/core/res/res/anim-sw720dp/task_close_enter.xml b/core/res/res/anim-sw720dp/task_close_enter.xml index 1806eed..9a747a1 100644 --- a/core/res/res/anim-sw720dp/task_close_enter.xml +++ b/core/res/res/anim-sw720dp/task_close_enter.xml @@ -23,21 +23,20 @@ <alpha android:fromAlpha="0" android:toAlpha="1.0" android:fillEnabled="true" android:fillBefore="true" android:fillAfter="true" android:interpolator="@interpolator/decelerate_quad" - android:startOffset="150" - android:duration="350"/> + android:startOffset="300" + android:duration="400"/> - <translate android:fromYDelta="-140%" android:toYDelta="0" + <translate android:fromYDelta="-120%" android:toYDelta="0" android:fillEnabled="true" android:fillBefore="true" android:fillAfter="true" - android:interpolator="@interpolator/decelerate_cubic" - android:startOffset="150" - android:duration="350"/> + android:interpolator="@interpolator/decelerate_quint" + android:startOffset="300" + android:duration="400" /> - <scale android:fromXScale=".6" android:toXScale="1.0" - android:fromYScale=".6" android:toYScale="1.0" - android:pivotX="50%p" android:pivotY="50%p" + <scale android:fromXScale=".5" android:toXScale="1.0" + android:fromYScale=".5" android:toYScale="1.0" + android:pivotX="50%p" android:pivotY="0%p" android:fillEnabled="true" android:fillBefore="true" android:fillAfter="true" android:interpolator="@interpolator/decelerate_quad" - android:startOffset="150" - android:duration="350" /> - + android:startOffset="300" + android:duration="400" /> </set>
\ No newline at end of file diff --git a/core/res/res/anim-sw720dp/task_close_exit.xml b/core/res/res/anim-sw720dp/task_close_exit.xml index 958a7a2..35b1aa3 100644 --- a/core/res/res/anim-sw720dp/task_close_exit.xml +++ b/core/res/res/anim-sw720dp/task_close_exit.xml @@ -19,25 +19,25 @@ <set xmlns:android="http://schemas.android.com/apk/res/android" android:background="#ff000000" android:shareInterpolator="false" android:zAdjustment="normal"> + <alpha android:fromAlpha="1.0" android:toAlpha="0" android:fillEnabled="true" android:fillBefore="true" android:fillAfter="true" android:interpolator="@interpolator/accelerate_quad" - android:duration="350"/> + android:duration="300"/> - <translate android:fromYDelta="0" android:toYDelta="140%" + <translate android:fromYDelta="0" android:toYDelta="120%" android:fillEnabled="true" android:fillBefore="true" android:fillAfter="true" - android:interpolator="@interpolator/decelerate_quad" - android:duration="350"/> + android:interpolator="@interpolator/accelerate_cubic" + android:duration="300"/> - <scale android:fromXScale="1.0" android:toXScale="0.6" - android:fromYScale="1.0" android:toYScale="0.6" + <scale android:fromXScale="1.0" android:toXScale="0.5" + android:fromYScale="1.0" android:toYScale="0.5" android:fillEnabled="true" android:fillBefore="true" android:fillAfter="true" - android:pivotX="50%p" android:pivotY="50%p" - android:interpolator="@interpolator/decelerate_cubic" - android:duration="350" /> + android:pivotX="50%p" android:pivotY="100%p" + android:interpolator="@interpolator/accelerate_quad" + android:duration="300" /> <!-- This is needed to keep the animation running while task_open_enter completes --> <alpha android:fromAlpha="1.0" android:toAlpha="1.0" - android:interpolator="@interpolator/accelerate_quad" - android:duration="500" /> + android:duration="700" /> </set>
\ No newline at end of file diff --git a/core/res/res/anim-sw720dp/task_open_enter.xml b/core/res/res/anim-sw720dp/task_open_enter.xml index 54a2d93..5e4ae18 100644 --- a/core/res/res/anim-sw720dp/task_open_enter.xml +++ b/core/res/res/anim-sw720dp/task_open_enter.xml @@ -23,21 +23,20 @@ <alpha android:fromAlpha="0" android:toAlpha="1.0" android:fillEnabled="true" android:fillBefore="true" android:fillAfter="true" android:interpolator="@interpolator/decelerate_quad" - android:startOffset="150" - android:duration="350"/> + android:startOffset="300" + android:duration="400"/> - <translate android:fromYDelta="140%" android:toYDelta="0" + <translate android:fromYDelta="120%" android:toYDelta="0" android:fillEnabled="true" android:fillBefore="true" android:fillAfter="true" - android:interpolator="@interpolator/decelerate_cubic" - android:startOffset="150" - android:duration="350"/> + android:interpolator="@interpolator/decelerate_quint" + android:startOffset="300" + android:duration="400" /> - <scale android:fromXScale=".6" android:toXScale="1.0" - android:fromYScale=".6" android:toYScale="1.0" - android:pivotX="50%p" android:pivotY="50%p" + <scale android:fromXScale=".5" android:toXScale="1.0" + android:fromYScale=".5" android:toYScale="1.0" + android:pivotX="50%p" android:pivotY="100%p" android:fillEnabled="true" android:fillBefore="true" android:fillAfter="true" android:interpolator="@interpolator/decelerate_quad" - android:startOffset="150" - android:duration="350" /> - + android:startOffset="300" + android:duration="400" /> </set>
\ No newline at end of file diff --git a/core/res/res/anim-sw720dp/task_open_exit.xml b/core/res/res/anim-sw720dp/task_open_exit.xml index 18e6550..0ba35d7 100644 --- a/core/res/res/anim-sw720dp/task_open_exit.xml +++ b/core/res/res/anim-sw720dp/task_open_exit.xml @@ -19,25 +19,25 @@ <set xmlns:android="http://schemas.android.com/apk/res/android" android:background="#ff000000" android:shareInterpolator="false" android:zAdjustment="normal"> + <alpha android:fromAlpha="1.0" android:toAlpha="0" android:fillEnabled="true" android:fillBefore="true" android:fillAfter="true" android:interpolator="@interpolator/accelerate_quad" - android:duration="350"/> + android:duration="300"/> - <translate android:fromYDelta="0" android:toYDelta="-140%" + <translate android:fromYDelta="0" android:toYDelta="-120%" android:fillEnabled="true" android:fillBefore="true" android:fillAfter="true" - android:interpolator="@interpolator/decelerate_quad" - android:duration="350"/> + android:interpolator="@interpolator/accelerate_cubic" + android:duration="300"/> - <scale android:fromXScale="1.0" android:toXScale="0.6" - android:fromYScale="1.0" android:toYScale="0.6" + <scale android:fromXScale="1.0" android:toXScale="0.5" + android:fromYScale="1.0" android:toYScale="0.5" android:fillEnabled="true" android:fillBefore="true" android:fillAfter="true" - android:pivotX="50%p" android:pivotY="50%p" - android:interpolator="@interpolator/decelerate_cubic" - android:duration="350" /> + android:pivotX="50%p" android:pivotY="0%p" + android:interpolator="@interpolator/accelerate_quad" + android:duration="300" /> <!-- This is needed to keep the animation running while task_open_enter completes --> <alpha android:fromAlpha="1.0" android:toAlpha="1.0" - android:interpolator="@interpolator/accelerate_quad" - android:duration="500" /> + android:duration="700" /> </set>
\ No newline at end of file diff --git a/core/res/res/anim/wallpaper_open_enter.xml b/core/res/res/anim/wallpaper_open_enter.xml index ee7ab60..12a1bdf 100644 --- a/core/res/res/anim/wallpaper_open_enter.xml +++ b/core/res/res/anim/wallpaper_open_enter.xml @@ -21,5 +21,5 @@ android:detachWallpaper="true" android:shareInterpolator="false" android:zAdjustment="normal"> <alpha android:fromAlpha="1.0" android:toAlpha="1.0" android:fillEnabled="true" android:fillBefore="true" android:fillAfter="true" - android:duration="300"/> + android:duration="375"/> </set>
\ No newline at end of file diff --git a/core/res/res/anim/wallpaper_open_exit.xml b/core/res/res/anim/wallpaper_open_exit.xml index 905743e..b0f97d1 100644 --- a/core/res/res/anim/wallpaper_open_exit.xml +++ b/core/res/res/anim/wallpaper_open_exit.xml @@ -20,13 +20,13 @@ <set xmlns:android="http://schemas.android.com/apk/res/android" android:shareInterpolator="false" android:zAdjustment="top"> <alpha android:fromAlpha="1.0" android:toAlpha="0.0" - android:interpolator="@interpolator/linear" + android:interpolator="@interpolator/accelerate_decelerate" android:fillEnabled="true" android:fillBefore="true" android:fillAfter="true" android:duration="200" /> - <scale android:fromXScale="1.0" android:toXScale="0.4" - android:fromYScale="1.0" android:toYScale="0.4" + <scale android:fromXScale="1.0" android:toXScale="0.5" + android:fromYScale="1.0" android:toYScale="0.5" android:pivotX="50%p" android:pivotY="50%p" android:interpolator="@interpolator/decelerate_quad" android:fillEnabled="true" android:fillBefore="true" android:fillAfter="true" - android:duration="250" /> + android:duration="375" /> </set>
\ No newline at end of file diff --git a/core/res/res/layout/notification_action.xml b/core/res/res/layout/notification_action.xml index 28812a9..33cbab9 100644 --- a/core/res/res/layout/notification_action.xml +++ b/core/res/res/layout/notification_action.xml @@ -17,11 +17,14 @@ <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_width="0dp" android:layout_height="48dp" + android:layout_weight="1" android:gravity="left|center_vertical" android:drawablePadding="8dp" android:paddingLeft="8dp" android:textColor="#ccc" android:textSize="14dp" + android:singleLine="true" + android:ellipsize="end" /> diff --git a/core/res/res/layout/notification_action_list.xml b/core/res/res/layout/notification_action_list.xml new file mode 100644 index 0000000..fa0a8c8 --- /dev/null +++ b/core/res/res/layout/notification_action_list.xml @@ -0,0 +1,28 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- 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. +--> + +<LinearLayout + xmlns:android="http://schemas.android.com/apk/res/android" + android:id="@+id/actions" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:orientation="horizontal" + android:visibility="gone" + android:showDividers="middle" + android:divider="?android:attr/listDivider" + > + <!-- actions will be added here --> +</LinearLayout> diff --git a/core/res/res/layout/notification_action_tombstone.xml b/core/res/res/layout/notification_action_tombstone.xml index e61e15f..992b37c 100644 --- a/core/res/res/layout/notification_action_tombstone.xml +++ b/core/res/res/layout/notification_action_tombstone.xml @@ -15,12 +15,18 @@ --> <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_width="0dp" android:layout_height="48dp" + android:layout_weight="1" android:gravity="left|center_vertical" android:drawablePadding="8dp" android:paddingLeft="8dp" - android:textColor="#666" + android:textColor="#ccc" android:textSize="14dp" + android:singleLine="true" + android:ellipsize="end" + android:alpha="0.5" + android:enabled="false" /> diff --git a/core/res/res/layout/notification_template_big_base.xml b/core/res/res/layout/notification_template_big_base.xml index 378161c..d50b792 100644 --- a/core/res/res/layout/notification_template_big_base.xml +++ b/core/res/res/layout/notification_template_big_base.xml @@ -143,14 +143,11 @@ style="?android:attr/progressBarStyleHorizontal" /> </LinearLayout> - <LinearLayout + <include + layout="@layout/notification_action_list" android:id="@+id/actions" android:layout_width="match_parent" android:layout_height="wrap_content" - android:orientation="vertical" - android:visibility="gone" - > - <!-- actions will be added here --> - </LinearLayout> + /> </LinearLayout> </FrameLayout> diff --git a/core/res/res/layout/notification_template_big_picture.xml b/core/res/res/layout/notification_template_big_picture.xml index 51e46b2..f98970a 100644 --- a/core/res/res/layout/notification_template_big_picture.xml +++ b/core/res/res/layout/notification_template_big_picture.xml @@ -27,11 +27,12 @@ android:id="@+id/big_picture" android:layout_width="match_parent" android:layout_height="192dp" + android:layout_marginTop="64dp" + android:layout_gravity="bottom" android:scaleType="centerCrop" /> <include layout="@layout/notification_template_base" android:layout_width="match_parent" android:layout_height="wrap_content" - android:layout_marginTop="192dp" /> </FrameLayout> diff --git a/core/res/res/layout/notification_template_big_text.xml b/core/res/res/layout/notification_template_big_text.xml index 77a5f11..210bc13 100644 --- a/core/res/res/layout/notification_template_big_text.xml +++ b/core/res/res/layout/notification_template_big_text.xml @@ -105,16 +105,13 @@ android:layout_weight="1" /> </LinearLayout> - <LinearLayout - android:id="@+id/actions" + <include + layout="@layout/notification_action_list" android:layout_width="match_parent" android:layout_height="0dp" - android:orientation="vertical" android:visibility="gone" android:layout_weight="1" - > - <!-- actions will be added here --> - </LinearLayout> + /> <TextView android:id="@+id/overflow_title" android:textAppearance="@style/TextAppearance.StatusBar.EventContent.Title" android:layout_width="match_parent" diff --git a/core/res/res/layout/notification_template_inbox.xml b/core/res/res/layout/notification_template_inbox.xml index 05ec1d8..eb5e759 100644 --- a/core/res/res/layout/notification_template_inbox.xml +++ b/core/res/res/layout/notification_template_inbox.xml @@ -93,8 +93,6 @@ android:layout_height="0dp" android:singleLine="true" android:ellipsize="end" - android:paddingTop="4dp" - android:paddingBottom="4dp" android:visibility="gone" android:layout_weight="1" /> @@ -104,8 +102,6 @@ android:layout_height="0dp" android:singleLine="true" android:ellipsize="end" - android:paddingTop="4dp" - android:paddingBottom="4dp" android:visibility="gone" android:layout_weight="1" /> @@ -115,8 +111,6 @@ android:layout_height="0dp" android:singleLine="true" android:ellipsize="end" - android:paddingTop="4dp" - android:paddingBottom="4dp" android:visibility="gone" android:layout_weight="1" /> @@ -126,8 +120,6 @@ android:layout_height="0dp" android:singleLine="true" android:ellipsize="end" - android:paddingTop="4dp" - android:paddingBottom="4dp" android:visibility="gone" android:layout_weight="1" /> @@ -137,21 +129,16 @@ android:layout_height="0dp" android:singleLine="true" android:ellipsize="end" - android:paddingTop="4dp" - android:paddingBottom="4dp" android:visibility="gone" android:layout_weight="1" /> - <LinearLayout + <include + layout="@layout/notification_action_list" 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 --> - </LinearLayout> + /> <TextView android:id="@+id/overflow_title" android:textAppearance="@style/TextAppearance.StatusBar.EventContent.Title" android:layout_width="match_parent" diff --git a/core/res/res/raw/accessibility_gestures.bin b/core/res/res/raw/accessibility_gestures.bin Binary files differindex f7e6615..96fa1ec 100644 --- a/core/res/res/raw/accessibility_gestures.bin +++ b/core/res/res/raw/accessibility_gestures.bin diff --git a/core/res/res/values-af/strings.xml b/core/res/res/values-af/strings.xml index b739835..732b0ab 100644 --- a/core/res/res/values-af/strings.xml +++ b/core/res/res/values-af/strings.xml @@ -176,9 +176,9 @@ <string name="permgrouplab_network" msgid="5808983377727109831">"Netwerkkommunikasie"</string> <string name="permgroupdesc_network" msgid="4478299413241861987">"Kry toegang tot verskeie netwerkfunksies."</string> <string name="permgrouplab_bluetoothNetwork" msgid="1585403544162128109">"Bluetooth"</string> - <string name="permgroupdesc_bluetoothNetwork" msgid="5625288577164282391">"Toegangstoestelle en netwerke deur Bluetooth."</string> + <string name="permgroupdesc_bluetoothNetwork" msgid="5625288577164282391">"Kry toegang tot toestelle 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="permgroupdesc_shortrangeNetwork" msgid="1884069062653436007">"Kry toegang tot toestelle 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> @@ -561,7 +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> - <string name="permlab_sdcardWrite" product="default" msgid="8805693630050458763">"Verander of skrap die inhoud van jou SD-kaart"</string> + <string name="permlab_sdcardWrite" product="default" msgid="8805693630050458763">"Verander of vee die inhoud van jou SD-kaart uit"</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> diff --git a/core/res/res/values-da/strings.xml b/core/res/res/values-da/strings.xml index 25cfb7f..4ec0197 100644 --- a/core/res/res/values-da/strings.xml +++ b/core/res/res/values-da/strings.xml @@ -185,10 +185,10 @@ <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> - <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_dictionary" msgid="4148597128843641379">"Læse brugerordbog"</string> + <string name="permgroupdesc_dictionary" msgid="7921166355964764490">"Læse ord i brugerordbogen."</string> + <string name="permgrouplab_writeDictionary" msgid="8090237702432576788">"Skrive brugerordbog"</string> + <string name="permgroupdesc_writeDictionary" msgid="2711561994497361646">"Føje 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> @@ -561,7 +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> - <string name="permlab_sdcardWrite" product="default" msgid="8805693630050458763">"skift eller slet indholdet på dit SD-kort"</string> + <string name="permlab_sdcardWrite" product="default" msgid="8805693630050458763">"ændre eller slette 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> diff --git a/core/res/res/values-de/strings.xml b/core/res/res/values-de/strings.xml index 3d51570..4ca2b86 100644 --- a/core/res/res/values-de/strings.xml +++ b/core/res/res/values-de/strings.xml @@ -1091,7 +1091,7 @@ <string name="usb_storage_error_message" product="nosdcard" msgid="3017045217365540658">"Bei der Verwendung Ihres USB-Speichers als USB-Massenspeicher ist ein Problem aufgetreten."</string> <string name="usb_storage_error_message" product="default" msgid="2876018512716970313">"Bei der Verwendung Ihrer SD-Karte als USB-Massenspeicher ist ein Problem aufgetreten."</string> <string name="usb_storage_notification_title" msgid="8175892554757216525">"USB-Verbindung"</string> - <string name="usb_storage_notification_message" msgid="939822783828183763">"Zum Kopieren von Dateien auf den/von dem Computer berühren"</string> + <string name="usb_storage_notification_message" msgid="939822783828183763">"Zum Kopieren von Dateien berühren"</string> <string name="usb_storage_stop_notification_title" msgid="2336058396663516017">"USB-Speicher deaktivieren"</string> <string name="usb_storage_stop_notification_message" msgid="1656852098555623822">"Zum Deaktivieren des USB-Speichers berühren"</string> <string name="usb_storage_stop_title" msgid="660129851708775853">"USB-Speicher in Verwendung"</string> @@ -1114,7 +1114,7 @@ <string name="extmedia_format_message" product="default" msgid="14131895027543830">"Alle Daten auf Ihrer Karte gehen verloren."</string> <string name="extmedia_format_button_format" msgid="4131064560127478695">"Format"</string> <string name="adb_active_notification_title" msgid="6729044778949189918">"USB-Debugging"</string> - <string name="adb_active_notification_message" msgid="1016654627626476142">"Zum Deaktivieren von USB-Debugging tippen"</string> + <string name="adb_active_notification_message" msgid="1016654627626476142">"Zum Deaktivieren von USB-Debugging berühren"</string> <string name="select_input_method" msgid="4653387336791222978">"Eingabemethode wählen"</string> <string name="configure_input_methods" msgid="9091652157722495116">"Eingabemethoden einrichten"</string> <string name="use_physical_keyboard" msgid="6203112478095117625">"Physische Tastatur"</string> diff --git a/core/res/res/values-es-rUS/strings.xml b/core/res/res/values-es-rUS/strings.xml index 0da38aa..72132dd 100644 --- a/core/res/res/values-es-rUS/strings.xml +++ b/core/res/res/values-es-rUS/strings.xml @@ -1311,7 +1311,6 @@ <string name="sending" msgid="3245653681008218030">"Enviando..."</string> <string name="launchBrowserDefault" msgid="2057951947297614725">"¿Deseas iniciar el navegador?"</string> <string name="SetupCallDefault" msgid="5834948469253758575">"¿Aceptar la llamada?"</string> - <!-- no translation found for activity_resolver_use_always (8017770747801494933) --> - <skip /> + <string name="activity_resolver_use_always" msgid="8017770747801494933">"Siempre"</string> <string name="activity_resolver_use_once" msgid="405646673463328329">"Solo una vez"</string> </resources> diff --git a/core/res/res/values-in/strings.xml b/core/res/res/values-in/strings.xml index 616b9be..5bca912 100644 --- a/core/res/res/values-in/strings.xml +++ b/core/res/res/values-in/strings.xml @@ -185,12 +185,9 @@ <string name="permgroupdesc_affectsBattery" msgid="6441275320638916947">"Menggunakan fitur yang dapat menguras baterai dengan cepat."</string> <string name="permgrouplab_calendar" msgid="5863508437783683902">"Kalender"</string> <string name="permgroupdesc_calendar" msgid="5777534316982184416">"Akses langsung ke kalender 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 /> + <string name="permgrouplab_dictionary" msgid="4148597128843641379">"Membaca Kamus Pengguna"</string> + <string name="permgroupdesc_dictionary" msgid="7921166355964764490">"Membaca kata dalam kamus pengguna."</string> + <string name="permgrouplab_writeDictionary" msgid="8090237702432576788">"Menulis Kamus Pengguna"</string> <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> @@ -564,8 +561,7 @@ <string name="permdesc_sdcardRead" product="nosdcard" msgid="3530894470637667917">"Izinkan aplikasi membaca konten penyimpanan USB, yang mungkin mencakup foto dan media."</string> <string name="permdesc_sdcardRead" product="default" msgid="2555811422562526606">"Izinkan aplikasi membaca konten kartu SD, yang mungkin mencakup foto dan media."</string> <string name="permlab_sdcardWrite" product="nosdcard" msgid="8485979062254666748">"ubah/hapus konten pympanan USB"</string> - <!-- no translation found for permlab_sdcardWrite (8805693630050458763) --> - <skip /> + <string name="permlab_sdcardWrite" product="default" msgid="8805693630050458763">"mengubah atau menghapus konten kartu SD Anda"</string> <string name="permdesc_sdcardWrite" product="nosdcard" msgid="6175406299445710888">"Mengizinkan apl menulis ke penyimpanan USB."</string> <string name="permdesc_sdcardWrite" product="default" msgid="4337417790936632090">"Memungkinkan apl menulis ke kartu SD."</string> <string name="permlab_mediaStorageWrite" product="default" msgid="6859839199706879015">"ubah/hapus konten penyimpanan media internal"</string> diff --git a/core/res/res/values-lt/strings.xml b/core/res/res/values-lt/strings.xml index 3c705ec..f5132c1 100644 --- a/core/res/res/values-lt/strings.xml +++ b/core/res/res/values-lt/strings.xml @@ -1311,7 +1311,6 @@ <string name="sending" msgid="3245653681008218030">"Siunčiama…"</string> <string name="launchBrowserDefault" msgid="2057951947297614725">"Paleisti naršyklę?"</string> <string name="SetupCallDefault" msgid="5834948469253758575">"Priimti skambutį?"</string> - <!-- no translation found for activity_resolver_use_always (8017770747801494933) --> - <skip /> + <string name="activity_resolver_use_always" msgid="8017770747801494933">"Visada"</string> <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 0b96365..e6c8d99 100644 --- a/core/res/res/values-lv/strings.xml +++ b/core/res/res/values-lv/strings.xml @@ -1311,7 +1311,6 @@ <string name="sending" msgid="3245653681008218030">"Notiek sūtīšana…"</string> <string name="launchBrowserDefault" msgid="2057951947297614725">"Vai palaist pārlūkprogrammu?"</string> <string name="SetupCallDefault" msgid="5834948469253758575">"Vai atbildēt uz zvanu?"</string> - <!-- no translation found for activity_resolver_use_always (8017770747801494933) --> - <skip /> + <string name="activity_resolver_use_always" msgid="8017770747801494933">"Vienmēr"</string> <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 47aa00a..1ab7002 100644 --- a/core/res/res/values-ms/strings.xml +++ b/core/res/res/values-ms/strings.xml @@ -177,7 +177,7 @@ <string name="permgroupdesc_network" msgid="4478299413241861987">"Akses pelbagai ciri rangkaian."</string> <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="permgrouplab_shortrangeNetwork" msgid="130808676377486118">"Rangkaian jarak-dekat"</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> diff --git a/core/res/res/values-pt-rPT/strings.xml b/core/res/res/values-pt-rPT/strings.xml index 4bb3b2f..e7a809c 100644 --- a/core/res/res/values-pt-rPT/strings.xml +++ b/core/res/res/values-pt-rPT/strings.xml @@ -178,7 +178,7 @@ <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="permgroupdesc_shortrangeNetwork" msgid="1884069062653436007">"Aceder a dispositivos através de redes de curto alcance tal como a 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> @@ -1311,7 +1311,6 @@ <string name="sending" msgid="3245653681008218030">"A enviar..."</string> <string name="launchBrowserDefault" msgid="2057951947297614725">"Iniciar Navegador?"</string> <string name="SetupCallDefault" msgid="5834948469253758575">"Aceitar chamada?"</string> - <!-- no translation found for activity_resolver_use_always (8017770747801494933) --> - <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-pt/strings.xml b/core/res/res/values-pt/strings.xml index 4236d50..84ce4bb 100644 --- a/core/res/res/values-pt/strings.xml +++ b/core/res/res/values-pt/strings.xml @@ -1104,7 +1104,7 @@ <string name="dlg_error_title" msgid="7323658469626514207">"Falha na operação do USB"</string> <string name="dlg_ok" msgid="7376953167039865701">"OK"</string> <string name="usb_mtp_notification_title" msgid="3699913097391550394">"Conectado como um dispositivo de mídia"</string> - <string name="usb_ptp_notification_title" msgid="1960817192216064833">"Conectadas como uma câmera"</string> + <string name="usb_ptp_notification_title" msgid="1960817192216064833">"Conectado como câmera"</string> <string name="usb_cd_installer_notification_title" msgid="6774712827892090754">"Conectados como um instalador"</string> <string name="usb_accessory_notification_title" msgid="7848236974087653666">"Conectado a um acessório USB"</string> <string name="usb_notification_message" msgid="2290859399983720271">"Toque para obter outras opções USB."</string> diff --git a/core/res/res/values-sr/strings.xml b/core/res/res/values-sr/strings.xml index e943dda..3b416fe 100644 --- a/core/res/res/values-sr/strings.xml +++ b/core/res/res/values-sr/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> @@ -1322,6 +1312,5 @@ <string name="launchBrowserDefault" msgid="2057951947297614725">"Желите ли да покренете прегледач?"</string> <string name="SetupCallDefault" msgid="5834948469253758575">"Желите ли да прихватите позив?"</string> <string name="activity_resolver_use_always" msgid="8017770747801494933">"Увек"</string> - <!-- no translation found for activity_resolver_use_once (405646673463328329) --> - <skip /> + <string name="activity_resolver_use_once" msgid="405646673463328329">"Само једном"</string> </resources> diff --git a/core/res/res/values-sw720dp-land/arrays.xml b/core/res/res/values-sw720dp-land/arrays.xml new file mode 100644 index 0000000..d845875 --- /dev/null +++ b/core/res/res/values-sw720dp-land/arrays.xml @@ -0,0 +1,29 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- +/* //device/apps/common/assets/res/any/colors.xml +** +** 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. +*/ +--> +<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + + <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-sw720dp-port/arrays.xml b/core/res/res/values-sw720dp-port/arrays.xml new file mode 100644 index 0000000..d845875 --- /dev/null +++ b/core/res/res/values-sw720dp-port/arrays.xml @@ -0,0 +1,29 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- +/* //device/apps/common/assets/res/any/colors.xml +** +** 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. +*/ +--> +<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> + + <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-th/strings.xml b/core/res/res/values-th/strings.xml index 46c58e3..17dcf64 100644 --- a/core/res/res/values-th/strings.xml +++ b/core/res/res/values-th/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-tr/strings.xml b/core/res/res/values-tr/strings.xml index 9aa2df3..9222823 100644 --- a/core/res/res/values-tr/strings.xml +++ b/core/res/res/values-tr/strings.xml @@ -175,28 +175,20 @@ <string name="permgroupdesc_location" msgid="5704679763124170100">"Fiziksel konumunuzu izleme."</string> <string name="permgrouplab_network" msgid="5808983377727109831">"Ağ iletişimi"</string> <string name="permgroupdesc_network" msgid="4478299413241861987">"Çeşitli ağ özelliklerine erişme."</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">"Cihazlara ve ağlara Bluetooth ile eriş."</string> + <string name="permgrouplab_shortrangeNetwork" msgid="130808676377486118">"Kısa Mesafeli Ağlar"</string> + <string name="permgroupdesc_shortrangeNetwork" msgid="1884069062653436007">"Cihazlara NFC gibi kısa mesafeli ağları kullanarak eriş."</string> <string name="permgrouplab_audioSettings" msgid="8329261670151871235">"Ses Ayarları"</string> <string name="permgroupdesc_audioSettings" msgid="2641515403347568130">"Ses ayarlarını değiştirme."</string> <string name="permgrouplab_affectsBattery" msgid="6209246653424798033">"Pili Etkileyenler"</string> <string name="permgroupdesc_affectsBattery" msgid="6441275320638916947">"Pili çok çabuk tüketebilen özellikleri kullanma."</string> <string name="permgrouplab_calendar" msgid="5863508437783683902">"Takvim"</string> <string name="permgroupdesc_calendar" msgid="5777534316982184416">"Takvime ve etkinliklere doğrudan erişim."</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">"Kullanıcı Sözlüğünü Oku"</string> + <string name="permgroupdesc_dictionary" msgid="7921166355964764490">"Kelimeleri kullanıcı sözlüğünde oku."</string> + <string name="permgrouplab_writeDictionary" msgid="8090237702432576788">"Kullanıcı Sözlüğüne Yaz"</string> + <string name="permgroupdesc_writeDictionary" msgid="2711561994497361646">"Kelimeleri kullanıcı sözlüğüne ekle."</string> <string name="permgrouplab_bookmarks" msgid="1949519673103968229">"Yer İşaretleri ve Geçmiş"</string> <string name="permgroupdesc_bookmarks" msgid="4169771606257963028">"Yer işaretlerine ve tarayıcı geçmişine doğrudan erişim."</string> <string name="permgrouplab_deviceAlarms" msgid="6117704629728824101">"Alarm"</string> @@ -569,8 +561,7 @@ <string name="permdesc_sdcardRead" product="nosdcard" msgid="3530894470637667917">"Uygulamaya USB depolamanın içeriğini okuma izni verir. Bu izin fotoğrafları ve medyayı da içerebilir."</string> <string name="permdesc_sdcardRead" product="default" msgid="2555811422562526606">"Uygulamaya SD kartın içeriğini okuma izni verir. Bu izin fotoğrafları ve medyayı da içerebilir."</string> <string name="permlab_sdcardWrite" product="nosdcard" msgid="8485979062254666748">"USB depolamamın içeriğini değiştir veya sil"</string> - <!-- no translation found for permlab_sdcardWrite (8805693630050458763) --> - <skip /> + <string name="permlab_sdcardWrite" product="default" msgid="8805693630050458763">"SD kartın içeriğini değiştir veya sil"</string> <string name="permdesc_sdcardWrite" product="nosdcard" msgid="6175406299445710888">"Uygulamaya USB depolama birimine yazma izni verir."</string> <string name="permdesc_sdcardWrite" product="default" msgid="4337417790936632090">"Uygulamaya, SD karta yazma izni verir."</string> <string name="permlab_mediaStorageWrite" product="default" msgid="6859839199706879015">"dahili medya depolama birimi içeriğini değiştir/sil"</string> @@ -1090,8 +1081,7 @@ <string name="date_time_set" msgid="5777075614321087758">"Ayarla"</string> <string name="date_time_done" msgid="2507683751759308828">"Tamamlandı"</string> <string name="perms_new_perm_prefix" msgid="8257740710754301407"><font size="12" fgcolor="#ff900000">"YENİ: "</font></string> - <!-- no translation found for perms_description_app (5139836143293299417) --> - <skip /> + <string name="perms_description_app" msgid="5139836143293299417">"Sağlayan: <xliff:g id="APP_NAME">%1$s</xliff:g>."</string> <string name="no_permissions" msgid="7283357728219338112">"İzin gerektirmez"</string> <string name="usb_storage_activity_title" msgid="4465055157209648641">"USB yığın depolama"</string> <string name="usb_storage_title" msgid="5901459041398751495">"USB bağlandı"</string> @@ -1321,8 +1311,6 @@ <string name="sending" msgid="3245653681008218030">"Gönderiliyor…"</string> <string name="launchBrowserDefault" msgid="2057951947297614725">"Tarayıcı Başlatılsın mı?"</string> <string name="SetupCallDefault" msgid="5834948469253758575">"Çağrı kabul edilsin mi?"</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">"Her zaman"</string> + <string name="activity_resolver_use_once" msgid="405646673463328329">"Sadece Bir Defa"</string> </resources> diff --git a/core/res/res/values-vi/strings.xml b/core/res/res/values-vi/strings.xml index 1487132..542f048 100644 --- a/core/res/res/values-vi/strings.xml +++ b/core/res/res/values-vi/strings.xml @@ -1311,7 +1311,6 @@ <string name="sending" msgid="3245653681008218030">"Đang gửi…"</string> <string name="launchBrowserDefault" msgid="2057951947297614725">"Khởi chạy trình duyệt?"</string> <string name="SetupCallDefault" msgid="5834948469253758575">"Chấp nhận cuộc gọi?"</string> - <!-- no translation found for activity_resolver_use_always (8017770747801494933) --> - <skip /> + <string name="activity_resolver_use_always" msgid="8017770747801494933">"Luôn bật"</string> <string name="activity_resolver_use_once" msgid="405646673463328329">"Chỉ một lần"</string> </resources> diff --git a/core/res/res/values-zu/strings.xml b/core/res/res/values-zu/strings.xml index dce0525..0c9717f 100644 --- a/core/res/res/values-zu/strings.xml +++ b/core/res/res/values-zu/strings.xml @@ -185,7 +185,7 @@ <string name="permgroupdesc_affectsBattery" msgid="6441275320638916947">"Sebenzisa izici ezingakhipha ngokushesha ibhethri."</string> <string name="permgrouplab_calendar" msgid="5863508437783683902">"Ikhalenda"</string> <string name="permgroupdesc_calendar" msgid="5777534316982184416">"Ukufinyelela okuqondile kukhalenda nezehlakalo."</string> - <string name="permgrouplab_dictionary" msgid="4148597128843641379">"Funda isichzamazwi somsebenzisi"</string> + <string name="permgrouplab_dictionary" msgid="4148597128843641379">"Funda isichazamazwi somsebenzisi"</string> <string name="permgroupdesc_dictionary" msgid="7921166355964764490">"Funda amagama kusichazamazwi somsebenzisi."</string> <string name="permgrouplab_writeDictionary" msgid="8090237702432576788">"Bhala isichazamazwi somsebenzisi"</string> <string name="permgroupdesc_writeDictionary" msgid="2711561994497361646">"Engeza amagama kusichazamazwi somsebenzisi."</string> diff --git a/core/res/res/values/config.xml b/core/res/res/values/config.xml index 5fa7b7e..98e7769 100755 --- a/core/res/res/values/config.xml +++ b/core/res/res/values/config.xml @@ -512,7 +512,6 @@ 0 - Nothing 1 - Recent apps dialog 2 - Recent apps view in SystemUI - 3 - Voice search This needs to match the constants in policy/src/com/android/internal/policy/impl/PhoneWindowManager.java --> diff --git a/core/res/res/values/strings.xml b/core/res/res/values/strings.xml index 687a00b..4511201 100755 --- a/core/res/res/values/strings.xml +++ b/core/res/res/values/strings.xml @@ -846,6 +846,12 @@ interface of an input method. Should never be needed for normal apps.</string> <!-- Title of an application permission, listed so the user can choose whether they want to allow the application to do this. --> + <string name="permlab_bindAccessibilityService">bind to an accessibility service</string> + <!-- Description of an application permission, listed so the user can choose whether they want to allow the application to do this. --> + <string name="permdesc_bindAccessibilityService">Allows the holder to bind to the top-level + interface of an accessibility service. Should never be needed for normal apps.</string> + + <!-- Title of an application permission, listed so the user can choose whether they want to allow the application to do this. --> <string name="permlab_bindTextService">bind to a text service</string> <!-- Description of an application permission, listed so the user can choose whether they want to allow the application to do this. --> <string name="permdesc_bindTextService">Allows the holder to bind to the top-level diff --git a/core/res/res/values/styles.xml b/core/res/res/values/styles.xml index 2b34dab..a90dab8 100644 --- a/core/res/res/values/styles.xml +++ b/core/res/res/values/styles.xml @@ -239,22 +239,25 @@ please see styles_device_defaults.xml. </style> <!-- Notification content styles --> <style name="TextAppearance.StatusBar.EventContent"> - <item name="android:textColor">?android:attr/textColorSecondary</item> - <item name="android:textSize">12sp</item> + <item name="android:textColor">#808080</item> + <item name="android:textSize">14dp</item> </style> <style name="TextAppearance.StatusBar.EventContent.Title"> - <item name="android:textColor">?android:attr/textColorPrimary</item> - <item name="android:textSize">16sp</item> + <item name="android:textColor">#ffffff</item> + <item name="android:fontFamily">sans-serif-light</item> + <item name="android:textSize">18dp</item> <item name="android:textStyle">bold</item> </style> <style name="TextAppearance.StatusBar.EventContent.Line2"> - <item name="android:textSize">13sp</item> + <!-- inherit all --> </style> <style name="TextAppearance.StatusBar.EventContent.Info"> - <!-- inherit all --> + <item name="android:textSize">12sp</item> + <item name="android:textColor">#666666</item> </style> <style name="TextAppearance.StatusBar.EventContent.Time"> - <!-- inherit all --> + <item name="android:textSize">12sp</item> + <item name="android:textColor">#666666</item> </style> <style name="TextAppearance.Small.CalendarViewWeekDayView"> @@ -631,6 +634,7 @@ please see styles_device_defaults.xml. <style name="Widget.WebView"> <item name="android:focusable">true</item> + <item name="android:focusableInTouchMode">true</item> <item name="android:scrollbars">horizontal|vertical</item> </style> diff --git a/core/tests/ConnectivityManagerTest/src/com/android/connectivitymanagertest/ConnectivityManagerTestActivity.java b/core/tests/ConnectivityManagerTest/src/com/android/connectivitymanagertest/ConnectivityManagerTestActivity.java index f7b0cd0..f01562c 100644 --- a/core/tests/ConnectivityManagerTest/src/com/android/connectivitymanagertest/ConnectivityManagerTestActivity.java +++ b/core/tests/ConnectivityManagerTest/src/com/android/connectivitymanagertest/ConnectivityManagerTestActivity.java @@ -244,8 +244,13 @@ public class ConnectivityManagerTestActivity extends Activity { mContext = this; mChannel = mWifiManager.initialize(mContext, mContext.getMainLooper(), null); - initializeNetworkStates(); + if (mWifiManager.isWifiApEnabled()) { + // if soft AP is enabled, disable it + mWifiManager.setWifiApEnabled(null, false); + log("Disable soft ap"); + } + initializeNetworkStates(); log("Clear Wifi before we start the test."); removeConfiguredNetworksAndDisableWifi(); mWifiRegexs = mCM.getTetherableWifiRegexs(); diff --git a/core/tests/ConnectivityManagerTest/src/com/android/connectivitymanagertest/stress/WifiApStress.java b/core/tests/ConnectivityManagerTest/src/com/android/connectivitymanagertest/stress/WifiApStress.java index 7e136be..60595fb 100644 --- a/core/tests/ConnectivityManagerTest/src/com/android/connectivitymanagertest/stress/WifiApStress.java +++ b/core/tests/ConnectivityManagerTest/src/com/android/connectivitymanagertest/stress/WifiApStress.java @@ -103,7 +103,7 @@ public class WifiApStress assertTrue(mAct.mWifiManager.setWifiApEnabled(config, true)); // Wait for wifi ap state to be ENABLED assertTrue(mAct.waitForWifiAPState(WifiManager.WIFI_AP_STATE_ENABLED, - ConnectivityManagerTestActivity.LONG_TIMEOUT)); + 2 * ConnectivityManagerTestActivity.LONG_TIMEOUT)); // Wait for wifi tethering result assertEquals(ConnectivityManagerTestActivity.SUCCESS, mAct.waitForTetherStateChange(2*ConnectivityManagerTestActivity.SHORT_TIMEOUT)); diff --git a/core/tests/ConnectivityManagerTest/src/com/android/connectivitymanagertest/stress/WifiStressTest.java b/core/tests/ConnectivityManagerTest/src/com/android/connectivitymanagertest/stress/WifiStressTest.java index 649ec3e..39e2cf2 100644 --- a/core/tests/ConnectivityManagerTest/src/com/android/connectivitymanagertest/stress/WifiStressTest.java +++ b/core/tests/ConnectivityManagerTest/src/com/android/connectivitymanagertest/stress/WifiStressTest.java @@ -83,6 +83,7 @@ public class WifiStressTest @Override public void setUp() throws Exception { super.setUp(); + mAct = getActivity(); mRunner = (ConnectivityManagerStressTestRunner) getInstrumentation(); mReconnectIterations = mRunner.mReconnectIterations; @@ -97,11 +98,6 @@ public class WifiStressTest mOutputWriter = new BufferedWriter(new FileWriter(new File( Environment.getExternalStorageDirectory(), OUTPUT_FILE), true)); mAct.turnScreenOn(); - if (mAct.mWifiManager.isWifiApEnabled()) { - // if soft AP is enabled, disable it - assertTrue(mAct.mWifiManager.setWifiApEnabled(null, false)); - Log.v(TAG, "disable soft ap"); - } if (!mAct.mWifiManager.isWifiEnabled()) { log("Enable wi-fi before stress tests."); if (!mAct.enableWifi()) { diff --git a/core/tests/coretests/AndroidManifest.xml b/core/tests/coretests/AndroidManifest.xml index cadc895..dcd1bab 100644 --- a/core/tests/coretests/AndroidManifest.xml +++ b/core/tests/coretests/AndroidManifest.xml @@ -1039,7 +1039,8 @@ </intent-filter> </activity> - <service android:name="android.webkit.AccessibilityInjectorTest$MockAccessibilityService"> + <service android:name="android.webkit.AccessibilityInjectorTest$MockAccessibilityService" + android:permission="android.permission.BIND_ACCESSIBILITY_SERVICE"> <intent-filter> <action android:name="android.accessibilityservice.AccessibilityService" /> </intent-filter> |