diff options
235 files changed, 2820 insertions, 2612 deletions
diff --git a/api/current.txt b/api/current.txt index 505ee68..665b054 100644 --- a/api/current.txt +++ b/api/current.txt @@ -23600,10 +23600,10 @@ package android.view { field public static final int LAYER_TYPE_HARDWARE = 2; // 0x2 field public static final int LAYER_TYPE_NONE = 0; // 0x0 field public static final int LAYER_TYPE_SOFTWARE = 1; // 0x1 - field public static final int LAYOUT_DIRECTION_INHERIT = -2147483648; // 0x80000000 - field public static final int LAYOUT_DIRECTION_LOCALE = -1073741824; // 0xc0000000 - field public static final int LAYOUT_DIRECTION_LTR = 0; // 0x0 - field public static final int LAYOUT_DIRECTION_RTL = 1073741824; // 0x40000000 + field public static final int LAYOUT_DIRECTION_INHERIT = 4; // 0x4 + field public static final int LAYOUT_DIRECTION_LOCALE = 8; // 0x8 + field public static final int LAYOUT_DIRECTION_LTR = 1; // 0x1 + field public static final int LAYOUT_DIRECTION_RTL = 2; // 0x2 field public static final int MEASURED_HEIGHT_STATE_SHIFT = 16; // 0x10 field public static final int MEASURED_SIZE_MASK = 16777215; // 0xffffff field public static final int MEASURED_STATE_MASK = -16777216; // 0xff000000 @@ -26958,7 +26958,6 @@ package android.widget { method public void setOnValueChangedListener(android.widget.NumberPicker.OnValueChangeListener); method public void setValue(int); method public void setWrapSelectorWheel(boolean); - field public static final int SELECTOR_WHEEL_ITEM_COUNT = 5; // 0x5 } public static abstract interface NumberPicker.Formatter { diff --git a/core/java/android/accounts/AccountManagerService.java b/core/java/android/accounts/AccountManagerService.java index cf1e8f3..27c9c8b 100644 --- a/core/java/android/accounts/AccountManagerService.java +++ b/core/java/android/accounts/AccountManagerService.java @@ -217,10 +217,10 @@ public class AccountManagerService mAuthenticatorCache = authenticatorCache; mAuthenticatorCache.setListener(this, null /* Handler */); - UserAccounts accounts = initUser(0); - sThis.set(this); + UserAccounts accounts = initUser(0); + IntentFilter intentFilter = new IntentFilter(); intentFilter.addAction(Intent.ACTION_PACKAGE_REMOVED); intentFilter.addDataScheme("package"); diff --git a/core/java/android/net/Downloads.java b/core/java/android/net/Downloads.java deleted file mode 100644 index ed6d103..0000000 --- a/core/java/android/net/Downloads.java +++ /dev/null @@ -1,644 +0,0 @@ -/* - * Copyright (C) 2008 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package android.net; - -import android.content.ContentResolver; -import android.content.ContentUris; -import android.content.ContentValues; -import android.content.Context; -import android.database.Cursor; -import android.net.Uri; -import android.os.ParcelFileDescriptor; -import android.os.SystemClock; -import android.provider.BaseColumns; -import android.util.Log; - -import java.io.File; -import java.io.FileNotFoundException; -import java.io.IOException; -import java.io.File; -import java.io.InputStream; - -/** - * The Download Manager - * - * @hide - */ -public final class Downloads { - - - /** - * Download status codes - */ - - /** - * This download hasn't started yet - */ - public static final int STATUS_PENDING = 190; - - /** - * This download has started - */ - public static final int STATUS_RUNNING = 192; - - /** - * This download has successfully completed. - * Warning: there might be other status values that indicate success - * in the future. - * Use isSucccess() to capture the entire category. - */ - public static final int STATUS_SUCCESS = 200; - - /** - * This download can't be performed because the content type cannot be - * handled. - */ - public static final int STATUS_NOT_ACCEPTABLE = 406; - - /** - * This download has completed with an error. - * Warning: there will be other status values that indicate errors in - * the future. Use isStatusError() to capture the entire category. - */ - public static final int STATUS_UNKNOWN_ERROR = 491; - - /** - * This download couldn't be completed because of an HTTP - * redirect response that the download manager couldn't - * handle. - */ - public static final int STATUS_UNHANDLED_REDIRECT = 493; - - /** - * This download couldn't be completed due to insufficient storage - * space. Typically, this is because the SD card is full. - */ - public static final int STATUS_INSUFFICIENT_SPACE_ERROR = 498; - - /** - * This download couldn't be completed because no external storage - * device was found. Typically, this is because the SD card is not - * mounted. - */ - public static final int STATUS_DEVICE_NOT_FOUND_ERROR = 499; - - /** - * Returns whether the status is a success (i.e. 2xx). - */ - public static boolean isStatusSuccess(int status) { - return (status >= 200 && status < 300); - } - - /** - * Returns whether the status is an error (i.e. 4xx or 5xx). - */ - public static boolean isStatusError(int status) { - return (status >= 400 && status < 600); - } - - /** - * Download destinations - */ - - /** - * This download will be saved to the external storage. This is the - * default behavior, and should be used for any file that the user - * can freely access, copy, delete. Even with that destination, - * unencrypted DRM files are saved in secure internal storage. - * Downloads to the external destination only write files for which - * there is a registered handler. The resulting files are accessible - * by filename to all applications. - */ - public static final int DOWNLOAD_DESTINATION_EXTERNAL = 1; - - /** - * This download will be saved to the download manager's private - * partition. This is the behavior used by applications that want to - * download private files that are used and deleted soon after they - * get downloaded. All file types are allowed, and only the initiating - * application can access the file (indirectly through a content - * provider). This requires the - * android.permission.ACCESS_DOWNLOAD_MANAGER_ADVANCED permission. - */ - public static final int DOWNLOAD_DESTINATION_CACHE = 2; - - /** - * This download will be saved to the download manager's private - * partition and will be purged as necessary to make space. This is - * for private files (similar to CACHE_PARTITION) that aren't deleted - * immediately after they are used, and are kept around by the download - * manager as long as space is available. - */ - public static final int DOWNLOAD_DESTINATION_CACHE_PURGEABLE = 3; - - - /** - * An invalid download id - */ - public static final long DOWNLOAD_ID_INVALID = -1; - - - /** - * Broadcast Action: this is sent by the download manager to the app - * that had initiated a download when that download completes. The - * download's content: uri is specified in the intent's data. - */ - public static final String ACTION_DOWNLOAD_COMPLETED = - "android.intent.action.DOWNLOAD_COMPLETED"; - - /** - * If extras are specified when requesting a download they will be provided in the intent that - * is sent to the specified class and package when a download has finished. - * <P>Type: TEXT</P> - * <P>Owner can Init</P> - */ - public static final String COLUMN_NOTIFICATION_EXTRAS = "notificationextras"; - - - /** - * Status class for a download - */ - public static final class StatusInfo { - public boolean completed = false; - /** The filename of the active download. */ - public String filename = null; - /** An opaque id for the download */ - public long id = DOWNLOAD_ID_INVALID; - /** An opaque status code for the download */ - public int statusCode = -1; - /** Approximate number of bytes downloaded so far, for debugging purposes. */ - public long bytesSoFar = -1; - - /** - * Returns whether the download is completed - * @return a boolean whether the download is complete. - */ - public boolean isComplete() { - return android.provider.Downloads.Impl.isStatusCompleted(statusCode); - } - - /** - * Returns whether the download is successful - * @return a boolean whether the download is successful. - */ - public boolean isSuccessful() { - return android.provider.Downloads.Impl.isStatusSuccess(statusCode); - } - } - - /** - * Class to access initiate and query download by server uri - */ - public static final class ByUri extends DownloadBase { - /** @hide */ - private ByUri() {} - - /** - * Query where clause by app data. - * @hide - */ - private static final String QUERY_WHERE_APP_DATA_CLAUSE = - android.provider.Downloads.Impl.COLUMN_APP_DATA + "=?"; - - /** - * Gets a Cursor pointing to the download(s) of the current system update. - * @hide - */ - private static final Cursor getCurrentOtaDownloads(Context context, String url) { - return context.getContentResolver().query( - android.provider.Downloads.Impl.CONTENT_URI, - DOWNLOADS_PROJECTION, - QUERY_WHERE_APP_DATA_CLAUSE, - new String[] {url}, - null); - } - - /** - * Returns a StatusInfo with the result of trying to download the - * given URL. Returns null if no attempts have been made. - */ - public static final StatusInfo getStatus( - Context context, - String url, - long redownload_threshold) { - StatusInfo result = null; - boolean hasFailedDownload = false; - long failedDownloadModificationTime = 0; - Cursor c = getCurrentOtaDownloads(context, url); - try { - while (c != null && c.moveToNext()) { - if (result == null) { - result = new StatusInfo(); - } - int status = getStatusOfDownload(c, redownload_threshold); - if (status == STATUS_DOWNLOADING_UPDATE || - status == STATUS_DOWNLOADED_UPDATE) { - result.completed = (status == STATUS_DOWNLOADED_UPDATE); - result.filename = c.getString(DOWNLOADS_COLUMN_FILENAME); - result.id = c.getLong(DOWNLOADS_COLUMN_ID); - result.statusCode = c.getInt(DOWNLOADS_COLUMN_STATUS); - result.bytesSoFar = c.getLong(DOWNLOADS_COLUMN_CURRENT_BYTES); - return result; - } - - long modTime = c.getLong(DOWNLOADS_COLUMN_LAST_MODIFICATION); - if (hasFailedDownload && - modTime < failedDownloadModificationTime) { - // older than the one already in result; skip it. - continue; - } - - hasFailedDownload = true; - failedDownloadModificationTime = modTime; - result.statusCode = c.getInt(DOWNLOADS_COLUMN_STATUS); - result.bytesSoFar = c.getLong(DOWNLOADS_COLUMN_CURRENT_BYTES); - } - } finally { - if (c != null) { - c.close(); - } - } - return result; - } - - /** - * Query where clause for general querying. - */ - private static final String QUERY_WHERE_CLAUSE = - android.provider.Downloads.Impl.COLUMN_NOTIFICATION_PACKAGE + "=? AND " + - android.provider.Downloads.Impl.COLUMN_NOTIFICATION_CLASS + "=?"; - - /** - * Delete all the downloads for a package/class pair. - */ - public static final void removeAllDownloadsByPackage( - Context context, - String notification_package, - String notification_class) { - context.getContentResolver().delete( - android.provider.Downloads.Impl.CONTENT_URI, - QUERY_WHERE_CLAUSE, - new String[] { notification_package, notification_class }); - } - - /** - * The column for the id in the Cursor returned by - * getProgressCursor() - */ - public static final int getProgressColumnId() { - return 0; - } - - /** - * The column for the current byte count in the Cursor returned by - * getProgressCursor() - */ - public static final int getProgressColumnCurrentBytes() { - return 1; - } - - /** - * The column for the total byte count in the Cursor returned by - * getProgressCursor() - */ - public static final int getProgressColumnTotalBytes() { - return 2; - } - - /** @hide */ - private static final String[] PROJECTION = { - BaseColumns._ID, - android.provider.Downloads.Impl.COLUMN_CURRENT_BYTES, - android.provider.Downloads.Impl.COLUMN_TOTAL_BYTES - }; - - /** - * Returns a Cursor representing the progress of the download identified by the ID. - */ - public static final Cursor getProgressCursor(Context context, long id) { - Uri downloadUri = Uri.withAppendedPath(android.provider.Downloads.Impl.CONTENT_URI, - String.valueOf(id)); - return context.getContentResolver().query(downloadUri, PROJECTION, null, null, null); - } - } - - /** - * Class to access downloads by opaque download id - */ - public static final class ById extends DownloadBase { - /** @hide */ - private ById() {} - - /** - * Get the mime tupe of the download specified by the download id - */ - public static String getMimeTypeForId(Context context, long downloadId) { - ContentResolver cr = context.getContentResolver(); - - String mimeType = null; - Cursor downloadCursor = null; - - try { - Uri downloadUri = getDownloadUri(downloadId); - - downloadCursor = cr.query( - downloadUri, new String[]{android.provider.Downloads.Impl.COLUMN_MIME_TYPE}, - null, null, null); - if (downloadCursor.moveToNext()) { - mimeType = downloadCursor.getString(0); - } - } finally { - if (downloadCursor != null) downloadCursor.close(); - } - return mimeType; - } - - /** - * Delete a download by Id - */ - public static void deleteDownload(Context context, long downloadId) { - ContentResolver cr = context.getContentResolver(); - - String mimeType = null; - - Uri downloadUri = getDownloadUri(downloadId); - - cr.delete(downloadUri, null, null); - } - - /** - * Open a filedescriptor to a particular download - */ - public static ParcelFileDescriptor openDownload( - Context context, long downloadId, String mode) - throws FileNotFoundException - { - ContentResolver cr = context.getContentResolver(); - - String mimeType = null; - - Uri downloadUri = getDownloadUri(downloadId); - - return cr.openFileDescriptor(downloadUri, mode); - } - - /** - * Open a stream to a particular download - */ - public static InputStream openDownloadStream(Context context, long downloadId) - throws FileNotFoundException, IOException - { - ContentResolver cr = context.getContentResolver(); - - String mimeType = null; - - Uri downloadUri = getDownloadUri(downloadId); - - return cr.openInputStream(downloadUri); - } - - private static Uri getDownloadUri(long downloadId) { - return Uri.parse(android.provider.Downloads.Impl.CONTENT_URI + "/" + downloadId); - } - - /** - * Returns a StatusInfo with the result of trying to download the - * given URL. Returns null if no attempts have been made. - */ - public static final StatusInfo getStatus( - Context context, - long downloadId) { - StatusInfo result = null; - boolean hasFailedDownload = false; - long failedDownloadModificationTime = 0; - - Uri downloadUri = getDownloadUri(downloadId); - - ContentResolver cr = context.getContentResolver(); - - Cursor c = cr.query(downloadUri, DOWNLOADS_PROJECTION, null /* selection */, - null /* selection args */, null /* sort order */); - try { - if (c == null || !c.moveToNext()) { - return result; - } - - if (result == null) { - result = new StatusInfo(); - } - int status = getStatusOfDownload(c,0); - if (status == STATUS_DOWNLOADING_UPDATE || - status == STATUS_DOWNLOADED_UPDATE) { - result.completed = (status == STATUS_DOWNLOADED_UPDATE); - result.filename = c.getString(DOWNLOADS_COLUMN_FILENAME); - result.id = c.getLong(DOWNLOADS_COLUMN_ID); - result.statusCode = c.getInt(DOWNLOADS_COLUMN_STATUS); - result.bytesSoFar = c.getLong(DOWNLOADS_COLUMN_CURRENT_BYTES); - return result; - } - - long modTime = c.getLong(DOWNLOADS_COLUMN_LAST_MODIFICATION); - - result.statusCode = c.getInt(DOWNLOADS_COLUMN_STATUS); - result.bytesSoFar = c.getLong(DOWNLOADS_COLUMN_CURRENT_BYTES); - } finally { - if (c != null) { - c.close(); - } - } - return result; - } - } - - - /** - * Base class with common functionality for the various download classes - */ - public static class DownloadBase { - /** @hide */ - DownloadBase() {} - - /** - * Initiate a download where the download will be tracked by its URI. - */ - public static long startDownloadByUri( - Context context, - String url, - String cookieData, - boolean showDownload, - int downloadDestination, - boolean allowRoaming, - boolean skipIntegrityCheck, - String title, - String notification_package, - String notification_class, - String notification_extras) { - ContentResolver cr = context.getContentResolver(); - - // Tell download manager to start downloading update. - ContentValues values = new ContentValues(); - values.put(android.provider.Downloads.Impl.COLUMN_URI, url); - values.put(android.provider.Downloads.Impl.COLUMN_COOKIE_DATA, cookieData); - values.put(android.provider.Downloads.Impl.COLUMN_VISIBILITY, - showDownload ? android.provider.Downloads.Impl.VISIBILITY_VISIBLE - : android.provider.Downloads.Impl.VISIBILITY_HIDDEN); - if (title != null) { - values.put(android.provider.Downloads.Impl.COLUMN_TITLE, title); - } - values.put(android.provider.Downloads.Impl.COLUMN_APP_DATA, url); - - - // NOTE: destination should be seperated from whether the download - // can happen when roaming - int destination = android.provider.Downloads.Impl.DESTINATION_EXTERNAL; - switch (downloadDestination) { - case DOWNLOAD_DESTINATION_EXTERNAL: - destination = android.provider.Downloads.Impl.DESTINATION_EXTERNAL; - break; - case DOWNLOAD_DESTINATION_CACHE: - if (allowRoaming) { - destination = android.provider.Downloads.Impl.DESTINATION_CACHE_PARTITION; - } else { - destination = - android.provider.Downloads.Impl.DESTINATION_CACHE_PARTITION_NOROAMING; - } - break; - case DOWNLOAD_DESTINATION_CACHE_PURGEABLE: - destination = - android.provider.Downloads.Impl.DESTINATION_CACHE_PARTITION_PURGEABLE; - break; - } - values.put(android.provider.Downloads.Impl.COLUMN_DESTINATION, destination); - values.put(android.provider.Downloads.Impl.COLUMN_NO_INTEGRITY, - skipIntegrityCheck); // Don't check ETag - if (notification_package != null && notification_class != null) { - values.put(android.provider.Downloads.Impl.COLUMN_NOTIFICATION_PACKAGE, - notification_package); - values.put(android.provider.Downloads.Impl.COLUMN_NOTIFICATION_CLASS, - notification_class); - - if (notification_extras != null) { - values.put(android.provider.Downloads.Impl.COLUMN_NOTIFICATION_EXTRAS, - notification_extras); - } - } - - Uri downloadUri = cr.insert(android.provider.Downloads.Impl.CONTENT_URI, values); - - long downloadId = DOWNLOAD_ID_INVALID; - if (downloadUri != null) { - downloadId = Long.parseLong(downloadUri.getLastPathSegment()); - } - return downloadId; - } - } - - /** @hide */ - private static final int STATUS_INVALID = 0; - /** @hide */ - private static final int STATUS_DOWNLOADING_UPDATE = 3; - /** @hide */ - private static final int STATUS_DOWNLOADED_UPDATE = 4; - - /** - * Column projection for the query to the download manager. This must match - * with the constants DOWNLOADS_COLUMN_*. - * @hide - */ - private static final String[] DOWNLOADS_PROJECTION = { - BaseColumns._ID, - android.provider.Downloads.Impl.COLUMN_APP_DATA, - android.provider.Downloads.Impl.COLUMN_STATUS, - android.provider.Downloads.Impl._DATA, - android.provider.Downloads.Impl.COLUMN_LAST_MODIFICATION, - android.provider.Downloads.Impl.COLUMN_CURRENT_BYTES, - }; - - /** - * The column index for the ID. - * @hide - */ - private static final int DOWNLOADS_COLUMN_ID = 0; - /** - * The column index for the URI. - * @hide - */ - private static final int DOWNLOADS_COLUMN_URI = 1; - /** - * The column index for the status code. - * @hide - */ - private static final int DOWNLOADS_COLUMN_STATUS = 2; - /** - * The column index for the filename. - * @hide - */ - private static final int DOWNLOADS_COLUMN_FILENAME = 3; - /** - * The column index for the last modification time. - * @hide - */ - private static final int DOWNLOADS_COLUMN_LAST_MODIFICATION = 4; - /** - * The column index for the number of bytes downloaded so far. - * @hide - */ - private static final int DOWNLOADS_COLUMN_CURRENT_BYTES = 5; - - /** - * Gets the status of a download. - * - * @param c A Cursor pointing to a download. The URL column is assumed to be valid. - * @return The status of the download. - * @hide - */ - private static final int getStatusOfDownload( Cursor c, long redownload_threshold) { - int status = c.getInt(DOWNLOADS_COLUMN_STATUS); - long realtime = SystemClock.elapsedRealtime(); - - // TODO(dougz): special handling of 503, 404? (eg, special - // explanatory messages to user) - - if (!android.provider.Downloads.Impl.isStatusCompleted(status)) { - // Check if it's stuck - long modified = c.getLong(DOWNLOADS_COLUMN_LAST_MODIFICATION); - long now = System.currentTimeMillis(); - if (now < modified || now - modified > redownload_threshold) { - return STATUS_INVALID; - } - - return STATUS_DOWNLOADING_UPDATE; - } - - if (android.provider.Downloads.Impl.isStatusError(status)) { - return STATUS_INVALID; - } - - String filename = c.getString(DOWNLOADS_COLUMN_FILENAME); - if (filename == null) { - return STATUS_INVALID; - } - - return STATUS_DOWNLOADED_UPDATE; - } - - - /** - * @hide - */ - private Downloads() {} -} diff --git a/core/java/android/net/NetworkPolicy.java b/core/java/android/net/NetworkPolicy.java index 5b94784..c1f58a3 100644 --- a/core/java/android/net/NetworkPolicy.java +++ b/core/java/android/net/NetworkPolicy.java @@ -42,18 +42,20 @@ public class NetworkPolicy implements Parcelable, Comparable<NetworkPolicy> { public long lastWarningSnooze; public long lastLimitSnooze; public boolean metered; + public boolean inferred; private static final long DEFAULT_MTU = 1500; + @Deprecated public NetworkPolicy(NetworkTemplate template, int cycleDay, String cycleTimezone, long warningBytes, long limitBytes, boolean metered) { this(template, cycleDay, cycleTimezone, warningBytes, limitBytes, SNOOZE_NEVER, - SNOOZE_NEVER, metered); + SNOOZE_NEVER, metered, false); } public NetworkPolicy(NetworkTemplate template, int cycleDay, String cycleTimezone, long warningBytes, long limitBytes, long lastWarningSnooze, long lastLimitSnooze, - boolean metered) { + boolean metered, boolean inferred) { this.template = checkNotNull(template, "missing NetworkTemplate"); this.cycleDay = cycleDay; this.cycleTimezone = checkNotNull(cycleTimezone, "missing cycleTimezone"); @@ -62,6 +64,7 @@ public class NetworkPolicy implements Parcelable, Comparable<NetworkPolicy> { this.lastWarningSnooze = lastWarningSnooze; this.lastLimitSnooze = lastLimitSnooze; this.metered = metered; + this.inferred = inferred; } public NetworkPolicy(Parcel in) { @@ -73,6 +76,7 @@ public class NetworkPolicy implements Parcelable, Comparable<NetworkPolicy> { lastWarningSnooze = in.readLong(); lastLimitSnooze = in.readLong(); metered = in.readInt() != 0; + inferred = in.readInt() != 0; } @Override @@ -85,6 +89,7 @@ public class NetworkPolicy implements Parcelable, Comparable<NetworkPolicy> { dest.writeLong(lastWarningSnooze); dest.writeLong(lastLimitSnooze); dest.writeInt(metered ? 1 : 0); + dest.writeInt(inferred ? 1 : 0); } @Override @@ -134,7 +139,7 @@ public class NetworkPolicy implements Parcelable, Comparable<NetworkPolicy> { @Override public int hashCode() { return Objects.hashCode(template, cycleDay, cycleTimezone, warningBytes, limitBytes, - lastWarningSnooze, lastLimitSnooze, metered); + lastWarningSnooze, lastLimitSnooze, metered, inferred); } @Override @@ -145,6 +150,7 @@ public class NetworkPolicy implements Parcelable, Comparable<NetworkPolicy> { && limitBytes == other.limitBytes && lastWarningSnooze == other.lastWarningSnooze && lastLimitSnooze == other.lastLimitSnooze && metered == other.metered + && inferred == other.inferred && Objects.equal(cycleTimezone, other.cycleTimezone) && Objects.equal(template, other.template); } @@ -156,7 +162,7 @@ public class NetworkPolicy implements Parcelable, Comparable<NetworkPolicy> { return "NetworkPolicy[" + template + "]: cycleDay=" + cycleDay + ", cycleTimezone=" + cycleTimezone + ", warningBytes=" + warningBytes + ", limitBytes=" + limitBytes + ", lastWarningSnooze=" + lastWarningSnooze + ", lastLimitSnooze=" - + lastLimitSnooze + ", metered=" + metered; + + lastLimitSnooze + ", metered=" + metered + ", inferred=" + inferred; } public static final Creator<NetworkPolicy> CREATOR = new Creator<NetworkPolicy>() { diff --git a/core/java/android/provider/Downloads.java b/core/java/android/provider/Downloads.java index ba4804d..bd6170b 100644 --- a/core/java/android/provider/Downloads.java +++ b/core/java/android/provider/Downloads.java @@ -17,6 +17,7 @@ package android.provider; import android.app.DownloadManager; +import android.content.Context; import android.net.NetworkPolicyManager; import android.net.Uri; @@ -742,4 +743,19 @@ public final class Downloads { public static final String INSERT_KEY_PREFIX = "http_header_"; } } + + /** + * Query where clause for general querying. + */ + private static final String QUERY_WHERE_CLAUSE = Impl.COLUMN_NOTIFICATION_PACKAGE + "=? AND " + + Impl.COLUMN_NOTIFICATION_CLASS + "=?"; + + /** + * Delete all the downloads for a package/class pair. + */ + public static final void removeAllDownloadsByPackage( + Context context, String notification_package, String notification_class) { + context.getContentResolver().delete(Impl.CONTENT_URI, QUERY_WHERE_CLAUSE, + new String[] { notification_package, notification_class }); + } } diff --git a/core/java/android/view/HardwareRenderer.java b/core/java/android/view/HardwareRenderer.java index d08a61f..b98257c 100644 --- a/core/java/android/view/HardwareRenderer.java +++ b/core/java/android/view/HardwareRenderer.java @@ -704,7 +704,7 @@ public abstract class HardwareRenderer { return null; } - private void printConfig(EGLConfig config) { + private static void printConfig(EGLConfig config) { int[] value = new int[1]; Log.d(LOG_TAG, "EGL configuration " + config + ":"); @@ -990,10 +990,11 @@ public abstract class HardwareRenderer { } if (invalidateNeeded) { - if (mRedrawClip.isEmpty() || view.getParent() == null) { - view.invalidate(); + if (mRedrawClip.isEmpty()) { + attachInfo.mViewRootImpl.invalidate(); } else { - view.getParent().invalidateChild(view, mRedrawClip); + attachInfo.mViewRootImpl.invalidateChildInParent( + null, mRedrawClip); } mRedrawClip.setEmpty(); } diff --git a/core/java/android/view/View.java b/core/java/android/view/View.java index fdf3a814..d403cb9 100644 --- a/core/java/android/view/View.java +++ b/core/java/android/view/View.java @@ -698,14 +698,14 @@ public class View implements Drawable.Callback, Drawable.Callback2, KeyEvent.Cal private static final int[] VISIBILITY_FLAGS = {VISIBLE, INVISIBLE, GONE}; /** - * This view is enabled. Intrepretation varies by subclass. + * This view is enabled. Interpretation varies by subclass. * Use with ENABLED_MASK when calling setFlags. * {@hide} */ static final int ENABLED = 0x00000000; /** - * This view is disabled. Intrepretation varies by subclass. + * This view is disabled. Interpretation varies by subclass. * Use with ENABLED_MASK when calling setFlags. * {@hide} */ @@ -955,50 +955,6 @@ public class View implements Drawable.Callback, Drawable.Callback2, KeyEvent.Cal static final int PARENT_SAVE_DISABLED_MASK = 0x20000000; /** - * Horizontal direction of this view is from Left to Right. - * Use with {@link #setLayoutDirection}. - */ - public static final int LAYOUT_DIRECTION_LTR = 0x00000000; - - /** - * Horizontal direction of this view is from Right to Left. - * Use with {@link #setLayoutDirection}. - */ - public static final int LAYOUT_DIRECTION_RTL = 0x40000000; - - /** - * Horizontal direction of this view is inherited from its parent. - * Use with {@link #setLayoutDirection}. - */ - public static final int LAYOUT_DIRECTION_INHERIT = 0x80000000; - - /** - * Horizontal direction of this view is from deduced from the default language - * script for the locale. Use with {@link #setLayoutDirection}. - */ - public static final int LAYOUT_DIRECTION_LOCALE = 0xC0000000; - - /** - * Mask for use with setFlags indicating bits used for horizontalDirection. - * {@hide} - */ - static final int LAYOUT_DIRECTION_MASK = 0xC0000000; - - /* - * Array of horizontal direction flags for mapping attribute "horizontalDirection" to correct - * flag value. - * {@hide} - */ - private static final int[] LAYOUT_DIRECTION_FLAGS = {LAYOUT_DIRECTION_LTR, - LAYOUT_DIRECTION_RTL, LAYOUT_DIRECTION_INHERIT, LAYOUT_DIRECTION_LOCALE}; - - /** - * Default horizontalDirection. - * {@hide} - */ - private static final int LAYOUT_DIRECTION_DEFAULT = LAYOUT_DIRECTION_INHERIT; - - /** * View flag indicating whether {@link #addFocusables(ArrayList, int, int)} * should add all focusable Views regardless if they are focusable in touch mode. */ @@ -1748,19 +1704,73 @@ public class View implements Drawable.Callback, Drawable.Callback2, KeyEvent.Cal static final int DRAG_HOVERED = 0x00000002; /** - * Indicates whether the view layout direction has been resolved and drawn to the + * Horizontal layout direction of this view is from Left to Right. + * Use with {@link #setLayoutDirection}. + */ + public static final int LAYOUT_DIRECTION_LTR = 0x00000001; + + /** + * Horizontal layout direction of this view is from Right to Left. + * Use with {@link #setLayoutDirection}. + */ + public static final int LAYOUT_DIRECTION_RTL = 0x00000002; + + /** + * Horizontal layout direction of this view is inherited from its parent. + * Use with {@link #setLayoutDirection}. + */ + public static final int LAYOUT_DIRECTION_INHERIT = 0x00000004; + + /** + * Horizontal layout direction of this view is from deduced from the default language + * script for the locale. Use with {@link #setLayoutDirection}. + */ + public static final int LAYOUT_DIRECTION_LOCALE = 0x00000008; + + /** + * Bit shift to get the horizontal layout direction. (bits after DRAG_HOVERED) + * @hide + */ + static final int LAYOUT_DIRECTION_MASK_SHIFT = 2; + + /** + * Mask for use with private flags indicating bits used for horizontal layout direction. + * @hide + */ + static final int LAYOUT_DIRECTION_MASK = 0x0000000F << LAYOUT_DIRECTION_MASK_SHIFT; + + /** + * Indicates whether the view horizontal layout direction has been resolved and drawn to the * right-to-left direction. - * * @hide */ - static final int LAYOUT_DIRECTION_RESOLVED_RTL = 0x00000004; + static final int LAYOUT_DIRECTION_RESOLVED_RTL = 0x00000010 << LAYOUT_DIRECTION_MASK_SHIFT; /** - * Indicates whether the view layout direction has been resolved. - * + * Indicates whether the view horizontal layout direction has been resolved. + * @hide + */ + static final int LAYOUT_DIRECTION_RESOLVED = 0x00000020 << LAYOUT_DIRECTION_MASK_SHIFT; + + /** + * Mask for use with private flags indicating bits used for resolved horizontal layout direction. + * @hide + */ + static final int LAYOUT_DIRECTION_RESOLVED_MASK = 0x00000030 << LAYOUT_DIRECTION_MASK_SHIFT; + + /* + * Array of horizontal layout direction flags for mapping attribute "layoutDirection" to correct + * flag value. + * @hide + */ + private static final int[] LAYOUT_DIRECTION_FLAGS = {LAYOUT_DIRECTION_LTR, + LAYOUT_DIRECTION_RTL, LAYOUT_DIRECTION_INHERIT, LAYOUT_DIRECTION_LOCALE}; + + /** + * Default horizontal layout direction. * @hide */ - static final int LAYOUT_DIRECTION_RESOLVED = 0x00000008; + private static final int LAYOUT_DIRECTION_DEFAULT = LAYOUT_DIRECTION_INHERIT; /** @@ -1770,7 +1780,7 @@ public class View implements Drawable.Callback, Drawable.Callback2, KeyEvent.Cal * * @hide */ - static final int HAS_TRANSIENT_STATE = 0x00000010; + static final int HAS_TRANSIENT_STATE = 0x00000100; /* End of masks for mPrivateFlags2 */ @@ -2739,7 +2749,8 @@ public class View implements Drawable.Callback, Drawable.Callback2, KeyEvent.Cal public View(Context context) { mContext = context; mResources = context != null ? context.getResources() : null; - mViewFlags = SOUND_EFFECTS_ENABLED | HAPTIC_FEEDBACK_ENABLED | LAYOUT_DIRECTION_INHERIT; + mViewFlags = SOUND_EFFECTS_ENABLED | HAPTIC_FEEDBACK_ENABLED; + mPrivateFlags2 |= (LAYOUT_DIRECTION_DEFAULT << LAYOUT_DIRECTION_MASK_SHIFT); mTouchSlop = ViewConfiguration.get(context).getScaledTouchSlop(); setOverScrollMode(OVER_SCROLL_IF_CONTENT_SCROLLS); mUserPaddingStart = -1; @@ -2949,17 +2960,13 @@ public class View implements Drawable.Callback, Drawable.Callback2, KeyEvent.Cal } break; case com.android.internal.R.styleable.View_layoutDirection: - // Clear any HORIZONTAL_DIRECTION flag already set - viewFlagValues &= ~LAYOUT_DIRECTION_MASK; - // Set the HORIZONTAL_DIRECTION flags depending on the value of the attribute + // Clear any layout direction flags (included resolved bits) already set + mPrivateFlags2 &= ~(LAYOUT_DIRECTION_MASK | LAYOUT_DIRECTION_RESOLVED_MASK); + // Set the layout direction flags depending on the value of the attribute final int layoutDirection = a.getInt(attr, -1); - if (layoutDirection != -1) { - viewFlagValues |= LAYOUT_DIRECTION_FLAGS[layoutDirection]; - } else { - // Set to default (LAYOUT_DIRECTION_INHERIT) - viewFlagValues |= LAYOUT_DIRECTION_DEFAULT; - } - viewFlagMasks |= LAYOUT_DIRECTION_MASK; + final int value = (layoutDirection != -1) ? + LAYOUT_DIRECTION_FLAGS[layoutDirection] : LAYOUT_DIRECTION_DEFAULT; + mPrivateFlags2 |= (value << LAYOUT_DIRECTION_MASK_SHIFT); break; case com.android.internal.R.styleable.View_drawingCacheQuality: final int cacheQuality = a.getInt(attr, 0); @@ -4882,7 +4889,7 @@ public class View implements Drawable.Callback, Drawable.Callback2, KeyEvent.Cal @ViewDebug.IntToString(from = LAYOUT_DIRECTION_LOCALE, to = "LOCALE") }) public int getLayoutDirection() { - return mViewFlags & LAYOUT_DIRECTION_MASK; + return (mPrivateFlags2 & LAYOUT_DIRECTION_MASK) >> LAYOUT_DIRECTION_MASK_SHIFT; } /** @@ -4899,9 +4906,14 @@ public class View implements Drawable.Callback, Drawable.Callback2, KeyEvent.Cal @RemotableViewMethod public void setLayoutDirection(int layoutDirection) { if (getLayoutDirection() != layoutDirection) { + // Reset the current layout direction + mPrivateFlags2 &= ~LAYOUT_DIRECTION_MASK; + // Reset the current resolved layout direction resetResolvedLayoutDirection(); - // Setting the flag will also request a layout. - setFlags(layoutDirection, LAYOUT_DIRECTION_MASK); + // Set the new layout direction (filtered) and ask for a layout pass + mPrivateFlags2 |= + ((layoutDirection << LAYOUT_DIRECTION_MASK_SHIFT) & LAYOUT_DIRECTION_MASK); + requestLayout(); } } @@ -4909,11 +4921,11 @@ public class View implements Drawable.Callback, Drawable.Callback2, KeyEvent.Cal * Returns the resolved layout direction for this view. * * @return {@link #LAYOUT_DIRECTION_RTL} if the layout direction is RTL or returns - * {@link #LAYOUT_DIRECTION_LTR} id the layout direction is not RTL. + * {@link #LAYOUT_DIRECTION_LTR} if the layout direction is not RTL. */ @ViewDebug.ExportedProperty(category = "layout", mapping = { - @ViewDebug.IntToString(from = LAYOUT_DIRECTION_LTR, to = "RESOLVED_DIRECTION_LTR"), - @ViewDebug.IntToString(from = LAYOUT_DIRECTION_RTL, to = "RESOLVED_DIRECTION_RTL") + @ViewDebug.IntToString(from = LAYOUT_DIRECTION_LTR, to = "RESOLVED_DIRECTION_LTR"), + @ViewDebug.IntToString(from = LAYOUT_DIRECTION_RTL, to = "RESOLVED_DIRECTION_RTL") }) public int getResolvedLayoutDirection() { resolveLayoutDirectionIfNeeded(); @@ -4922,8 +4934,8 @@ public class View implements Drawable.Callback, Drawable.Callback2, KeyEvent.Cal } /** - * <p>Indicates whether or not this view's layout is right-to-left. This is resolved from - * layout attribute and/or the inherited value from the parent.</p> + * Indicates whether or not this view's layout is right-to-left. This is resolved from + * layout attribute and/or the inherited value from the parent * * @return true if the layout is right-to-left. */ @@ -6940,10 +6952,6 @@ public class View implements Drawable.Callback, Drawable.Callback2, KeyEvent.Cal mParent.recomputeViewAttributes(this); } } - - if ((changed & LAYOUT_DIRECTION_MASK) != 0) { - requestLayout(); - } } /** @@ -9834,7 +9842,7 @@ public class View implements Drawable.Callback, Drawable.Callback2, KeyEvent.Cal if ((mPrivateFlags2 & LAYOUT_DIRECTION_RESOLVED) == LAYOUT_DIRECTION_RESOLVED) return; // Clear any previous layout direction resolution - mPrivateFlags2 &= ~LAYOUT_DIRECTION_RESOLVED_RTL; + mPrivateFlags2 &= ~LAYOUT_DIRECTION_RESOLVED_MASK; // Set resolved depending on layout direction switch (getLayoutDirection()) { @@ -9966,8 +9974,8 @@ public class View implements Drawable.Callback, Drawable.Callback2, KeyEvent.Cal * when reset is done. */ public void resetResolvedLayoutDirection() { - // Reset the current View resolution - mPrivateFlags2 &= ~LAYOUT_DIRECTION_RESOLVED; + // Reset the current resolved bits + mPrivateFlags2 &= ~LAYOUT_DIRECTION_RESOLVED_MASK; onResolvedLayoutDirectionReset(); // Reset also the text direction resetResolvedTextDirection(); @@ -11481,7 +11489,7 @@ public class View implements Drawable.Callback, Drawable.Callback2, KeyEvent.Cal layerType != LAYER_TYPE_HARDWARE; int restoreTo = -1; - if (!useDisplayListProperties) { + if (!useDisplayListProperties || transformToApply != null) { restoreTo = canvas.save(); } if (offsetForScroll) { @@ -11515,11 +11523,9 @@ public class View implements Drawable.Callback, Drawable.Callback2, KeyEvent.Cal if (concatMatrix) { // Undo the scroll translation, apply the transformation matrix, // then redo the scroll translate to get the correct result. - if (!useDisplayListProperties) { - canvas.translate(-transX, -transY); - canvas.concat(transformToApply.getMatrix()); - canvas.translate(transX, transY); - } + canvas.translate(-transX, -transY); + canvas.concat(transformToApply.getMatrix()); + canvas.translate(transX, transY); parent.mGroupFlags |= ViewGroup.FLAG_CLEAR_TRANSFORMATION; } @@ -11548,12 +11554,10 @@ public class View implements Drawable.Callback, Drawable.Callback2, KeyEvent.Cal layerFlags |= Canvas.CLIP_TO_LAYER_SAVE_FLAG; } if (layerType == LAYER_TYPE_NONE) { - if (!useDisplayListProperties) { - final int scrollX = hasDisplayList ? 0 : sx; - final int scrollY = hasDisplayList ? 0 : sy; - canvas.saveLayerAlpha(scrollX, scrollY, scrollX + mRight - mLeft, - scrollY + mBottom - mTop, multipliedAlpha, layerFlags); - } + final int scrollX = hasDisplayList ? 0 : sx; + final int scrollY = hasDisplayList ? 0 : sy; + canvas.saveLayerAlpha(scrollX, scrollY, scrollX + mRight - mLeft, + scrollY + mBottom - mTop, multipliedAlpha, layerFlags); } } else { // Alpha is handled by the child directly, clobber the layer's alpha diff --git a/core/java/android/view/ViewGroup.java b/core/java/android/view/ViewGroup.java index 42426b9..b8fbf17 100644 --- a/core/java/android/view/ViewGroup.java +++ b/core/java/android/view/ViewGroup.java @@ -2679,15 +2679,6 @@ public abstract class ViewGroup extends View implements ViewParent, ViewManager return child.draw(canvas, this, drawingTime); } - @Override - public void requestLayout() { - if (mChildrenCount > 0 && getAccessibilityNodeProvider() != null) { - throw new IllegalStateException("Views with AccessibilityNodeProvider" - + " can't have children."); - } - super.requestLayout(); - } - /** * * @param enabled True if children should be drawn with layers, false otherwise. @@ -3109,11 +3100,6 @@ public abstract class ViewGroup extends View implements ViewParent, ViewManager private void addViewInner(View child, int index, LayoutParams params, boolean preventRequestLayout) { - if (getAccessibilityNodeProvider() != null) { - throw new IllegalStateException("Views with AccessibilityNodeProvider" - + " can't have children."); - } - if (mTransition != null) { // Don't prevent other add transitions from completing, but cancel remove // transitions to let them complete the process before we add to the container diff --git a/core/java/android/view/ViewRootImpl.java b/core/java/android/view/ViewRootImpl.java index 4eb70ab..14b8084 100644 --- a/core/java/android/view/ViewRootImpl.java +++ b/core/java/android/view/ViewRootImpl.java @@ -1919,7 +1919,9 @@ public final class ViewRootImpl implements ViewParent, } private void performDraw() { - if (!mAttachInfo.mScreenOn) return; + if (!mAttachInfo.mScreenOn && !mReportNextDraw) { + return; + } final long drawStartTime; if (ViewDebug.DEBUG_LATENCY) { diff --git a/core/java/android/webkit/BrowserFrame.java b/core/java/android/webkit/BrowserFrame.java index dbcea71..72af251 100644 --- a/core/java/android/webkit/BrowserFrame.java +++ b/core/java/android/webkit/BrowserFrame.java @@ -448,7 +448,7 @@ class BrowserFrame extends Handler { // loadType is not used yet if (isMainFrame) { mCommitted = true; - mWebViewCore.getWebView().mViewManager.postResetStateAll(); + mWebViewCore.getWebViewClassic().mViewManager.postResetStateAll(); } } @@ -910,7 +910,7 @@ class BrowserFrame extends Handler { * Close this frame and window. */ private void closeWindow(WebViewCore w) { - mCallbackProxy.onCloseWindow(w.getWebView()); + mCallbackProxy.onCloseWindow(w.getWebViewClassic()); } // XXX: Must match PolicyAction in FrameLoaderTypes.h in webcore diff --git a/core/java/android/webkit/HTML5Audio.java b/core/java/android/webkit/HTML5Audio.java index 8e1f573..689884f 100644 --- a/core/java/android/webkit/HTML5Audio.java +++ b/core/java/android/webkit/HTML5Audio.java @@ -183,7 +183,7 @@ class HTML5Audio extends Handler resetMediaPlayer(); mContext = webViewCore.getContext(); mIsPrivateBrowsingEnabledGetter = new IsPrivateBrowsingEnabledGetter( - webViewCore.getContext().getMainLooper(), webViewCore.getWebView()); + webViewCore.getContext().getMainLooper(), webViewCore.getWebViewClassic()); } private void resetMediaPlayer() { diff --git a/core/java/android/webkit/HTML5VideoViewProxy.java b/core/java/android/webkit/HTML5VideoViewProxy.java index 40c3778..5fa4bad 100644 --- a/core/java/android/webkit/HTML5VideoViewProxy.java +++ b/core/java/android/webkit/HTML5VideoViewProxy.java @@ -724,7 +724,7 @@ class HTML5VideoViewProxy extends Handler * @return a new HTML5VideoViewProxy object. */ public static HTML5VideoViewProxy getInstance(WebViewCore webViewCore, int nativePtr) { - return new HTML5VideoViewProxy(webViewCore.getWebView(), nativePtr); + return new HTML5VideoViewProxy(webViewCore.getWebViewClassic(), nativePtr); } /* package */ WebViewClassic getWebView() { diff --git a/core/java/android/webkit/WebSettingsClassic.java b/core/java/android/webkit/WebSettingsClassic.java index 6850eea..7e38570 100644 --- a/core/java/android/webkit/WebSettingsClassic.java +++ b/core/java/android/webkit/WebSettingsClassic.java @@ -1638,7 +1638,7 @@ public class WebSettingsClassic extends WebSettings { */ public void setProperty(String key, String value) { if (mWebView.nativeSetProperty(key, value)) { - mWebView.contentInvalidateAll(); + mWebView.invalidate(); } } diff --git a/core/java/android/webkit/WebViewClassic.java b/core/java/android/webkit/WebViewClassic.java index d835947..e553a2e 100644 --- a/core/java/android/webkit/WebViewClassic.java +++ b/core/java/android/webkit/WebViewClassic.java @@ -1255,6 +1255,7 @@ public final class WebViewClassic implements WebViewProvider, WebViewProvider.Sc static final int AUTOFILL_FORM = 148; static final int ANIMATE_TEXT_SCROLL = 149; static final int EDIT_TEXT_SIZE_CHANGED = 150; + static final int SHOW_CARET_HANDLE = 151; private static final int FIRST_PACKAGE_MSG_ID = SCROLL_TO_MSG_ID; private static final int LAST_PACKAGE_MSG_ID = HIT_TEST_RESULT; @@ -4923,7 +4924,7 @@ public final class WebViewClassic implements WebViewProvider, WebViewProvider.Sc * startX, startY, endX, endY */ private void getSelectionHandles(int[] handles) { - handles[0] = mSelectCursorBase.right; + handles[0] = mSelectCursorBase.left; handles[1] = mSelectCursorBase.bottom; handles[2] = mSelectCursorExtent.left; handles[3] = mSelectCursorExtent.bottom; @@ -5468,9 +5469,7 @@ public final class WebViewClassic implements WebViewProvider, WebViewProvider.Sc private boolean setupWebkitSelect() { syncSelectionCursors(); - if (mIsCaretSelection) { - showPasteWindow(); - } else if (!startSelectActionMode()) { + if (!mIsCaretSelection && !startSelectActionMode()) { selectionDone(); return false; } @@ -5539,7 +5538,6 @@ public final class WebViewClassic implements WebViewProvider, WebViewProvider.Sc if (!mIsCaretSelection) { updateWebkitSelection(); } - mIsCaretSelection = false; invalidate(); // redraw without selection mAutoScrollX = 0; mAutoScrollY = 0; @@ -6378,8 +6376,15 @@ public final class WebViewClassic implements WebViewProvider, WebViewProvider.Sc case MotionEvent.ACTION_UP: { mGestureDetector.onTouchEvent(ev); if (mTouchInEditText && mConfirmMove) { + stopTouch(); break; // We've been scrolling the edit text. } + if (!mConfirmMove && mIsEditingText && mSelectionStarted && + mIsCaretSelection) { + showPasteWindow(); + stopTouch(); + break; + } // pass the touch events from UI thread to WebCore thread if (shouldForwardTouchEvent()) { TouchEventData ted = new TouchEventData(); @@ -6765,7 +6770,6 @@ public final class WebViewClassic implements WebViewProvider, WebViewProvider.Sc syncSelectionCursors(); if (mIsCaretSelection) { resetCaretTimer(); - showPasteWindow(); } invalidate(); } @@ -7299,10 +7303,6 @@ public final class WebViewClassic implements WebViewProvider, WebViewProvider.Sc } } - void sendPluginDrawMsg() { - mWebViewCore.sendMessage(EventHub.PLUGIN_SURFACE_READY); - } - /* * Return true if the rect (e.g. plugin) is fully visible and maximized * inside the WebView. @@ -8528,6 +8528,14 @@ public final class WebViewClassic implements WebViewProvider, WebViewProvider.Sc } break; + case SHOW_CARET_HANDLE: + if (!mSelectingText && mIsEditingText && mIsCaretSelection) { + setupWebkitSelect(); + resetCaretTimer(); + showPasteWindow(); + } + break; + default: super.handleMessage(msg); break; @@ -8827,13 +8835,20 @@ public final class WebViewClassic implements WebViewProvider, WebViewProvider.Sc (data.mStart != data.mEnd || (mFieldPointer == nodePointer && mFieldPointer != 0))) { mIsCaretSelection = (data.mStart == data.mEnd); - if (!mSelectingText) { - setupWebkitSelect(); - } else if (!mSelectionStarted) { - syncSelectionCursors(); - } - if (mIsCaretSelection) { - resetCaretTimer(); + if (mIsCaretSelection && + (mInputConnection == null || + mInputConnection.getEditable().length() == 0)) { + // There's no text, don't show caret handle. + selectionDone(); + } else { + if (!mSelectingText) { + setupWebkitSelect(); + } else if (!mSelectionStarted) { + syncSelectionCursors(); + } + if (mIsCaretSelection) { + resetCaretTimer(); + } } } else { selectionDone(); diff --git a/core/java/android/webkit/WebViewCore.java b/core/java/android/webkit/WebViewCore.java index d784b08..b47f71d 100644 --- a/core/java/android/webkit/WebViewCore.java +++ b/core/java/android/webkit/WebViewCore.java @@ -71,9 +71,8 @@ public final class WebViewCore { * WebViewCore always executes in the same thread as the native webkit. */ - // The WebView that corresponds to this WebViewCore. - // TODO: rename this field (and its getter) to mWebViewClassic or mWebViewImpl. - private WebViewClassic mWebView; + // The WebViewClassic that corresponds to this WebViewCore. + private WebViewClassic mWebViewClassic; // Proxy for handling callbacks from native code private final CallbackProxy mCallbackProxy; // Settings object for maintaining all settings @@ -149,7 +148,7 @@ public final class WebViewCore { Map<String, Object> javascriptInterfaces) { // No need to assign this in the WebCore thread. mCallbackProxy = proxy; - mWebView = w; + mWebViewClassic = w; mJavascriptInterfaces = javascriptInterfaces; // This context object is used to initialize the WebViewCore during // subwindow creation. @@ -182,7 +181,7 @@ public final class WebViewCore { // ready. mEventHub = new EventHub(); // Create a WebSettings object for maintaining all settings - mSettings = new WebSettingsClassic(mContext, mWebView); + mSettings = new WebSettingsClassic(mContext, mWebViewClassic); // The WebIconDatabase needs to be initialized within the UI thread so // just request the instance here. WebIconDatabase.getInstance(); @@ -235,8 +234,8 @@ public final class WebViewCore { // Send a message back to WebView to tell it that we have set up the // WebCore thread. - if (mWebView != null) { - Message.obtain(mWebView.mPrivateHandler, + if (mWebViewClassic != null) { + Message.obtain(mWebViewClassic.mPrivateHandler, WebViewClassic.WEBCORE_INITIALIZED_MSG_ID, mNativeClass, 0).sendToTarget(); } @@ -331,8 +330,8 @@ public final class WebViewCore { * @param nodePointer The node which just blurred. */ private void formDidBlur(int nodePointer) { - if (mWebView == null) return; - Message.obtain(mWebView.mPrivateHandler, WebViewClassic.FORM_DID_BLUR, + if (mWebViewClassic == null) return; + Message.obtain(mWebViewClassic.mPrivateHandler, WebViewClassic.FORM_DID_BLUR, nodePointer, 0).sendToTarget(); } @@ -340,8 +339,8 @@ public final class WebViewCore { * Called by JNI when the focus node changed. */ private void focusNodeChanged(int nodePointer, WebKitHitTest hitTest) { - if (mWebView == null) return; - mWebView.mPrivateHandler.obtainMessage(WebViewClassic.FOCUS_NODE_CHANGED, + if (mWebViewClassic == null) return; + mWebViewClassic.mPrivateHandler.obtainMessage(WebViewClassic.FOCUS_NODE_CHANGED, nodePointer, 0, hitTest).sendToTarget(); } @@ -349,8 +348,8 @@ public final class WebViewCore { * Called by JNI to advance focus to the next view. */ private void chromeTakeFocus(int webkitDirection) { - if (mWebView == null) return; - Message m = mWebView.mPrivateHandler.obtainMessage( + if (mWebViewClassic == null) return; + Message m = mWebViewClassic.mPrivateHandler.obtainMessage( WebViewClassic.TAKE_FOCUS); m.arg1 = mapDirection(webkitDirection); m.sendToTarget(); @@ -561,8 +560,8 @@ public final class WebViewCore { * Notify the webview that we want to display the video layer fullscreen. */ protected void enterFullscreenForVideoLayer(int layerId, String url) { - if (mWebView == null) return; - Message message = Message.obtain(mWebView.mPrivateHandler, + if (mWebViewClassic == null) return; + Message message = Message.obtain(mWebViewClassic.mPrivateHandler, WebViewClassic.ENTER_FULLSCREEN_VIDEO, layerId, 0); message.obj = url; message.sendToTarget(); @@ -573,8 +572,8 @@ public final class WebViewCore { * This is called through JNI by webcore. */ protected void exitFullscreenVideo() { - if (mWebView == null) return; - Message message = Message.obtain(mWebView.mPrivateHandler, + if (mWebViewClassic == null) return; + Message message = Message.obtain(mWebViewClassic.mPrivateHandler, WebViewClassic.EXIT_FULLSCREEN_VIDEO); message.sendToTarget(); } @@ -1256,7 +1255,7 @@ public final class WebViewCore { return; } - if (mWebView == null || mNativeClass == 0) { + if (mWebViewClassic == null || mNativeClass == 0) { if (DebugFlags.WEB_VIEW_CORE) { Log.w(LOGTAG, "Rejecting message " + msg.what + " because we are destroyed"); @@ -1294,7 +1293,7 @@ public final class WebViewCore { mBrowserFrame = null; mSettings.onDestroyed(); mNativeClass = 0; - mWebView = null; + mWebViewClassic = null; } break; @@ -1537,7 +1536,7 @@ public final class WebViewCore { yArray, count, ted.mActionIndex, ted.mMetaState); Message.obtain( - mWebView.mPrivateHandler, + mWebViewClassic.mPrivateHandler, WebViewClassic.PREVENT_TOUCH_ID, ted.mAction, ted.mNativeResult ? 1 : 0, @@ -1607,7 +1606,7 @@ public final class WebViewCore { String modifiedSelectionString = nativeModifySelection(mNativeClass, msg.arg1, msg.arg2); - mWebView.mPrivateHandler.obtainMessage( + mWebViewClassic.mPrivateHandler.obtainMessage( WebViewClassic.SELECTION_STRING_CHANGED, modifiedSelectionString).sendToTarget(); break; @@ -1653,7 +1652,7 @@ public final class WebViewCore { (WebViewClassic.SaveWebArchiveMessage)msg.obj; saveMessage.mResultFile = saveWebArchive(saveMessage.mBasename, saveMessage.mAutoname); - mWebView.mPrivateHandler.obtainMessage( + mWebViewClassic.mPrivateHandler.obtainMessage( WebViewClassic.SAVE_WEBARCHIVE_FINISHED, saveMessage).sendToTarget(); break; @@ -1666,7 +1665,7 @@ public final class WebViewCore { case SPLIT_PICTURE_SET: nativeSplitContent(mNativeClass, msg.arg1); - mWebView.mPrivateHandler.obtainMessage( + mWebViewClassic.mPrivateHandler.obtainMessage( WebViewClassic.REPLACE_BASE_CONTENT, msg.arg1, 0); mSplitPictureIsScheduled = false; break; @@ -1714,7 +1713,7 @@ public final class WebViewCore { d.mNativeLayer, d.mNativeLayerRect); } WebKitHitTest hit = performHitTest(d.mX, d.mY, d.mSlop, true); - mWebView.mPrivateHandler.obtainMessage( + mWebViewClassic.mPrivateHandler.obtainMessage( WebViewClassic.HIT_TEST_RESULT, hit) .sendToTarget(); break; @@ -1725,8 +1724,8 @@ public final class WebViewCore { case AUTOFILL_FORM: nativeAutoFillForm(mNativeClass, msg.arg1); - mWebView.mPrivateHandler.obtainMessage(WebViewClassic.AUTOFILL_COMPLETE, null) - .sendToTarget(); + mWebViewClassic.mPrivateHandler.obtainMessage( + WebViewClassic.AUTOFILL_COMPLETE, null).sendToTarget(); break; case EXECUTE_JS: @@ -1734,7 +1733,8 @@ public final class WebViewCore { if (DebugFlags.WEB_VIEW_CORE) { Log.d(LOGTAG, "Executing JS : " + msg.obj); } - mBrowserFrame.stringByEvaluatingJavaScriptFromString((String) msg.obj); + mBrowserFrame.stringByEvaluatingJavaScriptFromString( + (String) msg.obj); } break; case SCROLL_LAYER: @@ -1756,7 +1756,8 @@ public final class WebViewCore { handles[0], handles[1], handles[2], handles[3]); if (copiedText != null) { - mWebView.mPrivateHandler.obtainMessage(WebViewClassic.COPY_TO_CLIPBOARD, copiedText) + mWebViewClassic.mPrivateHandler.obtainMessage( + WebViewClassic.COPY_TO_CLIPBOARD, copiedText) .sendToTarget(); } break; @@ -1777,7 +1778,10 @@ public final class WebViewCore { case SELECT_WORD_AT: { int x = msg.arg1; int y = msg.arg2; - nativeSelectWordAt(mNativeClass, x, y); + if (!nativeSelectWordAt(mNativeClass, x, y)) { + mWebViewClassic.mPrivateHandler.obtainMessage(WebViewClassic.SHOW_CARET_HANDLE) + .sendToTarget(); + } break; } case SELECT_ALL: @@ -2028,7 +2032,7 @@ public final class WebViewCore { if (keyCode >= KeyEvent.KEYCODE_DPAD_UP && keyCode <= KeyEvent.KEYCODE_DPAD_RIGHT) { if (canTakeFocusDirection != 0 && isDown) { - Message m = mWebView.mPrivateHandler.obtainMessage( + Message m = mWebViewClassic.mPrivateHandler.obtainMessage( WebViewClassic.TAKE_FOCUS); m.arg1 = canTakeFocusDirection; m.sendToTarget(); @@ -2101,7 +2105,8 @@ public final class WebViewCore { width = mViewportWidth; } else { // For mobile web site. - width = Math.round(mWebView.getViewWidth() / mWebView.getDefaultZoomScale()); + width = Math.round(mWebViewClassic.getViewWidth() / + mWebViewClassic.getDefaultZoomScale()); } } return width; @@ -2193,8 +2198,8 @@ public final class WebViewCore { // If anything more complex than position has been touched, let's do a full draw webkitDraw(); } - mWebView.mPrivateHandler.removeMessages(WebViewClassic.INVAL_RECT_MSG_ID); - mWebView.mPrivateHandler.sendMessageAtFrontOfQueue(mWebView.mPrivateHandler + mWebViewClassic.mPrivateHandler.removeMessages(WebViewClassic.INVAL_RECT_MSG_ID); + mWebViewClassic.mPrivateHandler.sendMessageAtFrontOfQueue(mWebViewClassic.mPrivateHandler .obtainMessage(WebViewClassic.INVAL_RECT_MSG_ID)); } @@ -2234,7 +2239,7 @@ public final class WebViewCore { draw.mBaseLayer = nativeRecordContent(mNativeClass, draw.mInvalRegion, draw.mContentSize); if (draw.mBaseLayer == 0) { - if (mWebView != null && !mWebView.isPaused()) { + if (mWebViewClassic != null && !mWebViewClassic.isPaused()) { if (DebugFlags.WEB_VIEW_CORE) Log.v(LOGTAG, "webkitDraw abort, resending draw message"); mEventHub.sendMessageDelayed(Message.obtain(null, EventHub.WEBKIT_DRAW), 10); } else { @@ -2247,7 +2252,7 @@ public final class WebViewCore { } private void webkitDraw(DrawData draw) { - if (mWebView != null) { + if (mWebViewClassic != null) { draw.mFocusSizeChanged = nativeFocusBoundsChanged(mNativeClass); draw.mViewSize = new Point(mCurrentViewWidth, mCurrentViewHeight); if (mSettings.getUseWideViewPort()) { @@ -2266,7 +2271,7 @@ public final class WebViewCore { mFirstLayoutForNonStandardLoad = false; } if (DebugFlags.WEB_VIEW_CORE) Log.v(LOGTAG, "webkitDraw NEW_PICTURE_MSG_ID"); - Message.obtain(mWebView.mPrivateHandler, + Message.obtain(mWebViewClassic.mPrivateHandler, WebViewClassic.NEW_PICTURE_MSG_ID, draw).sendToTarget(); } } @@ -2356,7 +2361,7 @@ public final class WebViewCore { // called from JNI or WebView thread /* package */ void contentDraw() { synchronized (this) { - if (mWebView == null || mBrowserFrame == null) { + if (mWebViewClassic == null || mBrowserFrame == null) { // We were destroyed return; } @@ -2394,8 +2399,8 @@ public final class WebViewCore { mRestoredY = y; return; } - if (mWebView != null) { - Message msg = Message.obtain(mWebView.mPrivateHandler, + if (mWebViewClassic != null) { + Message msg = Message.obtain(mWebViewClassic.mPrivateHandler, WebViewClassic.SCROLL_TO_MSG_ID, animate ? 1 : 0, onlyIfImeIsShowing ? 1 : 0, new Point(x, y)); if (mDrawIsScheduled) { @@ -2417,8 +2422,8 @@ public final class WebViewCore { in WebView since it (and its thread) know the current scale factor. */ private void sendViewInvalidate(int left, int top, int right, int bottom) { - if (mWebView != null) { - Message.obtain(mWebView.mPrivateHandler, + if (mWebViewClassic != null) { + Message.obtain(mWebViewClassic.mPrivateHandler, WebViewClassic.INVAL_RECT_MSG_ID, new Rect(left, top, right, bottom)).sendToTarget(); } @@ -2433,10 +2438,20 @@ public final class WebViewCore { mRepaintScheduled = false; } - // Gets the WebView corresponding to this WebViewCore. Note that the - // WebView object must only be used on the UI thread. - /* package */ WebViewClassic getWebView() { - return mWebView; + // Gets the WebViewClassic corresponding to this WebViewCore. Note that the + // WebViewClassic object must only be used on the UI thread. + /* package */ WebViewClassic getWebViewClassic() { + return mWebViewClassic; + } + + // Called by JNI + private WebView getWebView() { + return mWebViewClassic.getWebView(); + } + + // Called by JNI + private void sendPluginDrawMsg() { + sendMessage(EventHub.PLUGIN_SURFACE_READY); } private native void setViewportSettingsFromNative(int nativeClass); @@ -2449,7 +2464,7 @@ public final class WebViewCore { mBrowserFrame.didFirstLayout(); - if (mWebView == null) return; + if (mWebViewClassic == null) return; boolean updateViewState = standardLoad || mIsRestored; setupViewport(updateViewState); @@ -2457,11 +2472,11 @@ public final class WebViewCore { // be called after the WebView updates its state. If updateRestoreState // is false, start to draw now as it is ready. if (!updateViewState) { - mWebView.mViewManager.postReadyToDrawAll(); + mWebViewClassic.mViewManager.postReadyToDrawAll(); } // remove the touch highlight when moving to a new page - mWebView.mPrivateHandler.sendEmptyMessage( + mWebViewClassic.mPrivateHandler.sendEmptyMessage( WebViewClassic.HIT_TEST_RESULT); // reset the scroll position, the restored offset and scales @@ -2477,7 +2492,7 @@ public final class WebViewCore { } private void setupViewport(boolean updateViewState) { - if (mWebView == null || mSettings == null) { + if (mWebViewClassic == null || mSettings == null) { // We've been destroyed or are being destroyed, return early return; } @@ -2525,8 +2540,8 @@ public final class WebViewCore { adjust = (float) mContext.getResources().getDisplayMetrics().densityDpi / mViewportDensityDpi; } - if (adjust != mWebView.getDefaultZoomScale()) { - Message.obtain(mWebView.mPrivateHandler, + if (adjust != mWebViewClassic.getDefaultZoomScale()) { + Message.obtain(mWebViewClassic.mPrivateHandler, WebViewClassic.UPDATE_ZOOM_DENSITY, adjust).sendToTarget(); } int defaultScale = (int) (adjust * 100); @@ -2577,7 +2592,7 @@ public final class WebViewCore { // for non-mobile site, we don't need minPrefWidth, set it as 0 viewState.mScrollX = 0; viewState.mShouldStartScrolledRight = false; - Message.obtain(mWebView.mPrivateHandler, + Message.obtain(mWebViewClassic.mPrivateHandler, WebViewClassic.UPDATE_ZOOM_RANGE, viewState).sendToTarget(); return; } @@ -2591,7 +2606,7 @@ public final class WebViewCore { // this may happen when WebView just starts. This is not perfect as // we call WebView method from WebCore thread. But not perfect // reference is better than no reference. - webViewWidth = mWebView.getViewWidth(); + webViewWidth = mWebViewClassic.getViewWidth(); viewportWidth = (int) (webViewWidth / adjust); if (viewportWidth == 0) { if (DebugFlags.WEB_VIEW_CORE) { @@ -2640,17 +2655,17 @@ public final class WebViewCore { } } - if (mWebView.mHeightCanMeasure) { + if (mWebViewClassic.mHeightCanMeasure) { // Trick to ensure that the Picture has the exact height for the // content by forcing to layout with 0 height after the page is // ready, which is indicated by didFirstLayout. This is essential to // get rid of the white space in the GMail which uses WebView for // message view. - mWebView.mLastHeightSent = 0; + mWebViewClassic.mLastHeightSent = 0; // Send a negative scale to indicate that WebCore should reuse // the current scale WebViewClassic.ViewSizeData data = new WebViewClassic.ViewSizeData(); - data.mWidth = mWebView.mLastWidthSent; + data.mWidth = mWebViewClassic.mLastWidthSent; data.mHeight = 0; // if mHeightCanMeasure is true, getUseWideViewPort() can't be // true. It is safe to use mWidth for mTextWrapWidth. @@ -2671,7 +2686,7 @@ public final class WebViewCore { if (viewportWidth == 0) { // Trick to ensure VIEW_SIZE_CHANGED will be sent from WebView // to WebViewCore - mWebView.mLastWidthSent = 0; + mWebViewClassic.mLastWidthSent = 0; } else { WebViewClassic.ViewSizeData data = new WebViewClassic.ViewSizeData(); // mViewScale as 0 means it is in zoom overview mode. So we don't @@ -2699,7 +2714,7 @@ public final class WebViewCore { if (mSettings.isNarrowColumnLayout()) { // In case of automatic text reflow in fixed view port mode. mInitialViewState.mTextWrapScale = - mWebView.computeReadingLevelScale(data.mScale); + mWebViewClassic.computeReadingLevelScale(data.mScale); } } else { // Scale is given such as when page is restored, use it. @@ -2720,7 +2735,7 @@ public final class WebViewCore { // are calling a WebView method from the WebCore thread. But this is preferable // to syncing an incorrect height. data.mHeight = mCurrentViewHeight == 0 ? - Math.round(mWebView.getViewHeight() / data.mScale) + Math.round(mWebViewClassic.getViewHeight() / data.mScale) : Math.round((float) mCurrentViewHeight * data.mWidth / viewportWidth); data.mTextWrapWidth = Math.round(webViewWidth / mInitialViewState.mTextWrapScale); @@ -2749,8 +2764,8 @@ public final class WebViewCore { // called by JNI private void needTouchEvents(boolean need) { - if (mWebView != null) { - Message.obtain(mWebView.mPrivateHandler, + if (mWebViewClassic != null) { + Message.obtain(mWebViewClassic.mPrivateHandler, WebViewClassic.WEBCORE_NEED_TOUCH_EVENTS, need ? 1 : 0, 0) .sendToTarget(); } @@ -2759,8 +2774,8 @@ public final class WebViewCore { // called by JNI private void updateTextfield(int ptr, boolean changeToPassword, String text, int textGeneration) { - if (mWebView != null) { - Message msg = Message.obtain(mWebView.mPrivateHandler, + if (mWebViewClassic != null) { + Message msg = Message.obtain(mWebViewClassic.mPrivateHandler, WebViewClassic.UPDATE_TEXTFIELD_TEXT_MSG_ID, ptr, textGeneration, text); msg.getData().putBoolean("password", changeToPassword); @@ -2771,8 +2786,8 @@ public final class WebViewCore { // called by JNI private void updateTextSelection(int pointer, int start, int end, int textGeneration, int selectionPtr) { - if (mWebView != null) { - Message.obtain(mWebView.mPrivateHandler, + if (mWebViewClassic != null) { + Message.obtain(mWebViewClassic.mPrivateHandler, WebViewClassic.UPDATE_TEXT_SELECTION_MSG_ID, pointer, textGeneration, new TextSelectionData(start, end, selectionPtr)).sendToTarget(); } @@ -2781,10 +2796,10 @@ public final class WebViewCore { // called by JNI private void updateTextSizeAndScroll(int pointer, int width, int height, int scrollX, int scrollY) { - if (mWebView != null) { + if (mWebViewClassic != null) { Rect rect = new Rect(-scrollX, -scrollY, width - scrollX, height - scrollY); - Message.obtain(mWebView.mPrivateHandler, + Message.obtain(mWebViewClassic.mPrivateHandler, WebViewClassic.EDIT_TEXT_SIZE_CHANGED, pointer, 0, rect) .sendToTarget(); } @@ -2792,20 +2807,20 @@ public final class WebViewCore { // called by JNI private void clearTextEntry() { - if (mWebView == null) return; - Message.obtain(mWebView.mPrivateHandler, + if (mWebViewClassic == null) return; + Message.obtain(mWebViewClassic.mPrivateHandler, WebViewClassic.CLEAR_TEXT_ENTRY).sendToTarget(); } // called by JNI private void initEditField(int start, int end, int selectionPtr, TextFieldInitData initData) { - if (mWebView == null) { + if (mWebViewClassic == null) { return; } - Message.obtain(mWebView.mPrivateHandler, + Message.obtain(mWebViewClassic.mPrivateHandler, WebViewClassic.INIT_EDIT_FIELD, initData).sendToTarget(); - Message.obtain(mWebView.mPrivateHandler, + Message.obtain(mWebViewClassic.mPrivateHandler, WebViewClassic.REQUEST_KEYBOARD_WITH_SELECTION_MSG_ID, initData.mFieldPointer, 0, new TextSelectionData(start, end, selectionPtr)) @@ -2815,10 +2830,10 @@ public final class WebViewCore { // called by JNI private void updateMatchCount(int matchIndex, int matchCount, String findText) { - if (mWebView == null) { + if (mWebViewClassic == null) { return; } - Message.obtain(mWebView.mPrivateHandler, + Message.obtain(mWebViewClassic.mPrivateHandler, WebViewClassic.UPDATE_MATCH_COUNT, matchIndex, matchCount, findText).sendToTarget(); } @@ -2842,32 +2857,32 @@ public final class WebViewCore { // called by JNI private void requestListBox(String[] array, int[] enabledArray, int[] selectedArray) { - if (mWebView != null) { - mWebView.requestListBox(array, enabledArray, selectedArray); + if (mWebViewClassic != null) { + mWebViewClassic.requestListBox(array, enabledArray, selectedArray); } } // called by JNI private void requestListBox(String[] array, int[] enabledArray, int selection) { - if (mWebView != null) { - mWebView.requestListBox(array, enabledArray, selection); + if (mWebViewClassic != null) { + mWebViewClassic.requestListBox(array, enabledArray, selection); } } // called by JNI private void requestKeyboard(boolean showKeyboard) { - if (mWebView != null) { - Message.obtain(mWebView.mPrivateHandler, + if (mWebViewClassic != null) { + Message.obtain(mWebViewClassic.mPrivateHandler, WebViewClassic.REQUEST_KEYBOARD, showKeyboard ? 1 : 0, 0) .sendToTarget(); } } private void setWebTextViewAutoFillable(int queryId, String preview) { - if (mWebView != null) { - Message.obtain(mWebView.mPrivateHandler, WebViewClassic.SET_AUTOFILLABLE, + if (mWebViewClassic != null) { + Message.obtain(mWebViewClassic.mPrivateHandler, WebViewClassic.SET_AUTOFILLABLE, new AutoFillData(queryId, preview)) .sendToTarget(); } @@ -2879,8 +2894,9 @@ public final class WebViewCore { // called by JNI private void keepScreenOn(boolean screenOn) { - if (mWebView != null) { - Message message = mWebView.mPrivateHandler.obtainMessage(WebViewClassic.SCREEN_ON); + if (mWebViewClassic != null) { + Message message = mWebViewClassic.mPrivateHandler.obtainMessage( + WebViewClassic.SCREEN_ON); message.arg1 = screenOn ? 1 : 0; message.sendToTarget(); } @@ -2889,7 +2905,7 @@ public final class WebViewCore { // called by JNI private Class<?> getPluginClass(String libName, String clsName) { - if (mWebView == null) { + if (mWebViewClassic == null) { return null; } @@ -2916,11 +2932,12 @@ public final class WebViewCore { // called by JNI. PluginWidget function to launch a full-screen view using a // View object provided by the plugin class. private void showFullScreenPlugin(ViewManager.ChildView childView, int orientation, int npp) { - if (mWebView == null) { + if (mWebViewClassic == null) { return; } - Message message = mWebView.mPrivateHandler.obtainMessage(WebViewClassic.SHOW_FULLSCREEN); + Message message = mWebViewClassic.mPrivateHandler.obtainMessage( + WebViewClassic.SHOW_FULLSCREEN); message.obj = childView.mView; message.arg1 = orientation; message.arg2 = npp; @@ -2929,15 +2946,15 @@ public final class WebViewCore { // called by JNI private void hideFullScreenPlugin() { - if (mWebView == null) { + if (mWebViewClassic == null) { return; } - mWebView.mPrivateHandler.obtainMessage(WebViewClassic.HIDE_FULLSCREEN) + mWebViewClassic.mPrivateHandler.obtainMessage(WebViewClassic.HIDE_FULLSCREEN) .sendToTarget(); } private ViewManager.ChildView createSurface(View pluginView) { - if (mWebView == null) { + if (mWebViewClassic == null) { return null; } @@ -2952,7 +2969,7 @@ public final class WebViewCore { if(pluginView instanceof SurfaceView) ((SurfaceView)pluginView).setZOrderOnTop(true); - ViewManager.ChildView view = mWebView.mViewManager.createView(); + ViewManager.ChildView view = mWebViewClassic.mViewManager.createView(); view.mView = pluginView; return view; } @@ -2992,7 +3009,7 @@ public final class WebViewCore { private void showRect(int left, int top, int width, int height, int contentWidth, int contentHeight, float xPercentInDoc, float xPercentInView, float yPercentInDoc, float yPercentInView) { - if (mWebView != null) { + if (mWebViewClassic != null) { ShowRectData data = new ShowRectData(); data.mLeft = left; data.mTop = top; @@ -3004,26 +3021,26 @@ public final class WebViewCore { data.mXPercentInView = xPercentInView; data.mYPercentInDoc = yPercentInDoc; data.mYPercentInView = yPercentInView; - Message.obtain(mWebView.mPrivateHandler, WebViewClassic.SHOW_RECT_MSG_ID, + Message.obtain(mWebViewClassic.mPrivateHandler, WebViewClassic.SHOW_RECT_MSG_ID, data).sendToTarget(); } } // called by JNI private void centerFitRect(int x, int y, int width, int height) { - if (mWebView == null) { + if (mWebViewClassic == null) { return; } - mWebView.mPrivateHandler.obtainMessage(WebViewClassic.CENTER_FIT_RECT, + mWebViewClassic.mPrivateHandler.obtainMessage(WebViewClassic.CENTER_FIT_RECT, new Rect(x, y, x + width, y + height)).sendToTarget(); } // called by JNI private void setScrollbarModes(int hMode, int vMode) { - if (mWebView == null) { + if (mWebViewClassic == null) { return; } - mWebView.mPrivateHandler.obtainMessage(WebViewClassic.SET_SCROLLBAR_MODES, + mWebViewClassic.mPrivateHandler.obtainMessage(WebViewClassic.SET_SCROLLBAR_MODES, hMode, vMode).sendToTarget(); } @@ -3106,7 +3123,7 @@ public final class WebViewCore { private native void nativeSelectText(int nativeClass, int startX, int startY, int endX, int endY); private native void nativeClearTextSelection(int nativeClass); - private native void nativeSelectWordAt(int nativeClass, int x, int y); + private native boolean nativeSelectWordAt(int nativeClass, int x, int y); private native void nativeSelectAll(int nativeClass); private static native void nativeCertTrustChanged(); diff --git a/core/java/android/widget/DatePicker.java b/core/java/android/widget/DatePicker.java index fd93980..c5066b6 100644 --- a/core/java/android/widget/DatePicker.java +++ b/core/java/android/widget/DatePicker.java @@ -29,8 +29,8 @@ import android.util.AttributeSet; import android.util.Log; import android.util.SparseArray; import android.view.LayoutInflater; +import android.view.View; import android.view.accessibility.AccessibilityEvent; -import android.view.accessibility.AccessibilityManager; import android.view.accessibility.AccessibilityNodeInfo; import android.view.inputmethod.EditorInfo; import android.view.inputmethod.InputMethodManager; @@ -280,9 +280,7 @@ public class DatePicker extends FrameLayout { reorderSpinners(); // set content descriptions - if (AccessibilityManager.getInstance(mContext).isEnabled()) { - setContentDescriptions(); - } + setContentDescriptions(); } /** @@ -717,20 +715,27 @@ public class DatePicker extends FrameLayout { private void setContentDescriptions() { // Day - String text = mContext.getString(R.string.date_picker_increment_day_button); - mDaySpinner.findViewById(R.id.increment).setContentDescription(text); - text = mContext.getString(R.string.date_picker_decrement_day_button); - mDaySpinner.findViewById(R.id.decrement).setContentDescription(text); + trySetContentDescription(mDaySpinner, R.id.increment, + R.string.date_picker_increment_day_button); + trySetContentDescription(mDaySpinner, R.id.decrement, + R.string.date_picker_decrement_day_button); // Month - text = mContext.getString(R.string.date_picker_increment_month_button); - mMonthSpinner.findViewById(R.id.increment).setContentDescription(text); - text = mContext.getString(R.string.date_picker_decrement_month_button); - mMonthSpinner.findViewById(R.id.decrement).setContentDescription(text); + trySetContentDescription(mMonthSpinner, R.id.increment, + R.string.date_picker_increment_month_button); + trySetContentDescription(mMonthSpinner, R.id.decrement, + R.string.date_picker_decrement_month_button); // Year - text = mContext.getString(R.string.date_picker_increment_year_button); - mYearSpinner.findViewById(R.id.increment).setContentDescription(text); - text = mContext.getString(R.string.date_picker_decrement_year_button); - mYearSpinner.findViewById(R.id.decrement).setContentDescription(text); + trySetContentDescription(mYearSpinner, R.id.increment, + R.string.date_picker_increment_year_button); + trySetContentDescription(mYearSpinner, R.id.decrement, + R.string.date_picker_decrement_year_button); + } + + private void trySetContentDescription(View root, int viewId, int contDescResId) { + View target = root.findViewById(viewId); + if (target != null) { + target.setContentDescription(mContext.getString(contDescResId)); + } } private void updateInputState() { diff --git a/core/java/android/widget/HorizontalScrollView.java b/core/java/android/widget/HorizontalScrollView.java index 0db6ef2..4e13ea1 100644 --- a/core/java/android/widget/HorizontalScrollView.java +++ b/core/java/android/widget/HorizontalScrollView.java @@ -715,6 +715,7 @@ public class HorizontalScrollView extends FrameLayout { } else { super.scrollTo(scrollX, scrollY); } + awakenScrollBars(); } @@ -1204,10 +1205,9 @@ public class HorizontalScrollView extends FrameLayout { } } - awakenScrollBars(); - - // Keep on drawing until the animation has finished. - postInvalidate(); + if (!awakenScrollBars()) { + invalidate(); + } } } @@ -1414,7 +1414,7 @@ public class HorizontalScrollView extends FrameLayout { /** * Return true if child is a descendant of parent, (or equal to the parent). */ - private boolean isViewDescendantOf(View child, View parent) { + private static boolean isViewDescendantOf(View child, View parent) { if (child == parent) { return true; } @@ -1524,7 +1524,7 @@ public class HorizontalScrollView extends FrameLayout { } } - private int clamp(int n, int my, int child) { + private static int clamp(int n, int my, int child) { if (my >= child || n < 0) { return 0; } diff --git a/core/java/android/widget/NumberPicker.java b/core/java/android/widget/NumberPicker.java index 3335da0..4e56cd6 100644 --- a/core/java/android/widget/NumberPicker.java +++ b/core/java/android/widget/NumberPicker.java @@ -16,10 +16,6 @@ package android.widget; -import android.animation.Animator; -import android.animation.AnimatorListenerAdapter; -import android.animation.AnimatorSet; -import android.animation.ObjectAnimator; import android.annotation.Widget; import android.content.Context; import android.content.res.ColorStateList; @@ -48,22 +44,41 @@ import android.view.ViewConfiguration; import android.view.accessibility.AccessibilityEvent; import android.view.accessibility.AccessibilityManager; import android.view.accessibility.AccessibilityNodeInfo; +import android.view.accessibility.AccessibilityNodeProvider; import android.view.animation.DecelerateInterpolator; import android.view.inputmethod.EditorInfo; import android.view.inputmethod.InputMethodManager; import com.android.internal.R; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + /** * A widget that enables the user to select a number form a predefined range. - * The widget presents an input field and up and down buttons for selecting the - * current value. Pressing/long-pressing the up and down buttons increments and - * decrements the current value respectively. Touching the input field shows a - * scroll wheel, which when touched allows direct edit - * of the current value. Sliding gestures up or down hide the buttons and the - * input filed, show and rotate the scroll wheel. Flinging is - * also supported. The widget enables mapping from positions to strings such - * that, instead of the position index, the corresponding string is displayed. + * There are two flavors of this widget and which one is presented to the user + * depends on the current theme. + * <ul> + * <li> + * If the current theme is derived from {@link android.R.style#Theme} the widget + * presents the current value as an editable input field with an increment button + * above and a decrement button below. Long pressing the buttons allows for a quick + * change of the current value. Tapping on the input field allows to type in + * a desired value. + * </li> + * <li> + * If the current theme is derived from {@link android.R.style#Theme_Holo} or + * {@link android.R.style#Theme_Holo_Light} the widget presents the current + * value as an editable input field with a lesser value above and a greater + * value below. Tapping on the lesser or greater value selects it by animating + * the number axis up or down to make the chosen value current. Flinging up + * or down allows for multiple increments or decrements of the current value. + * Long pressing on the lesser and greater values also allows for a quick change + * of the current value. Tapping on the current value allows to type in a + * desired value. + * </li> + * </ul> * <p> * For an example of using this widget, see {@link android.widget.TimePicker}. * </p> @@ -74,7 +89,7 @@ public class NumberPicker extends LinearLayout { /** * The number of items show in the selector wheel. */ - public static final int SELECTOR_WHEEL_ITEM_COUNT = 5; + private static final int SELECTOR_WHEEL_ITEM_COUNT = 3; /** * The default update interval during long press. @@ -84,7 +99,7 @@ public class NumberPicker extends LinearLayout { /** * The index of the middle selector item. */ - private static final int SELECTOR_MIDDLE_ITEM_INDEX = 2; + private static final int SELECTOR_MIDDLE_ITEM_INDEX = SELECTOR_WHEEL_ITEM_COUNT / 2; /** * The coefficient by which to adjust (divide) the max fling velocity. @@ -97,19 +112,12 @@ public class NumberPicker extends LinearLayout { private static final int SELECTOR_ADJUSTMENT_DURATION_MILLIS = 800; /** - * The duration of scrolling to the next/previous value while changing - * the current value by one, i.e. increment or decrement. + * The duration of scrolling to the next/previous value while changing the + * current value by one, i.e. increment or decrement. */ private static final int CHANGE_CURRENT_BY_ONE_SCROLL_DURATION = 300; /** - * The the delay for showing the input controls after a single tap on the - * input text. - */ - private static final int SHOW_INPUT_CONTROLS_DELAY_MILLIS = ViewConfiguration - .getDoubleTapTimeout(); - - /** * The strength of fading in the top and bottom while drawing the selector. */ private static final float TOP_AND_BOTTOM_FADING_EDGE_STRENGTH = 0.9f; @@ -120,56 +128,31 @@ public class NumberPicker extends LinearLayout { private static final int UNSCALED_DEFAULT_SELECTION_DIVIDER_HEIGHT = 2; /** - * In this state the selector wheel is not shown. - */ - private static final int SELECTOR_WHEEL_STATE_NONE = 0; - - /** - * In this state the selector wheel is small. - */ - private static final int SELECTOR_WHEEL_STATE_SMALL = 1; - - /** - * In this state the selector wheel is large. - */ - private static final int SELECTOR_WHEEL_STATE_LARGE = 2; - - /** - * The alpha of the selector wheel when it is bright. - */ - private static final int SELECTOR_WHEEL_BRIGHT_ALPHA = 255; - - /** - * The alpha of the selector wheel when it is dimmed. + * The default unscaled distance between the selection dividers. */ - private static final int SELECTOR_WHEEL_DIM_ALPHA = 60; + private static final int UNSCALED_DEFAULT_SELECTION_DIVIDERS_DISTANCE = 48; /** - * The alpha for the increment/decrement button when it is transparent. + * The default unscaled minimal distance for a swipe to be considered a fling. */ - private static final int BUTTON_ALPHA_TRANSPARENT = 0; + private static final int UNSCALED_DEFAULT_MIN_FLING_DISTANCE = 150; /** - * The alpha for the increment/decrement button when it is opaque. + * Coefficient for adjusting touch scroll distance. */ - private static final int BUTTON_ALPHA_OPAQUE = 1; + private static final float TOUCH_SCROLL_DECELERATION_COEFFICIENT = 2.5f; /** - * The property for setting the selector paint. + * The resource id for the default layout. */ - private static final String PROPERTY_SELECTOR_PAINT_ALPHA = "selectorPaintAlpha"; - - /** - * The property for setting the increment/decrement button alpha. - */ - private static final String PROPERTY_BUTTON_ALPHA = "alpha"; + private static final int DEFAULT_LAYOUT_RESOURCE_ID = R.layout.number_picker; /** * The numbers accepted by the input text's {@link Filter} */ private static final char[] DIGIT_CHARACTERS = new char[] { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9' - }; + }; /** * Constant for unspecified size. @@ -215,6 +198,11 @@ public class NumberPicker extends LinearLayout { private final EditText mInputText; /** + * The distance between the two selection dividers. + */ + private final int mSelectionDividersDistance; + + /** * The min height of this widget. */ private final int mMinHeight; @@ -245,6 +233,11 @@ public class NumberPicker extends LinearLayout { private final int mTextSize; /** + * The minimal distance for a swipe to be considered a fling. + */ + private final int mMinFlingDistance; + + /** * The height of the gap between text elements if the selector wheel. */ private int mSelectorTextGapHeight; @@ -297,10 +290,7 @@ public class NumberPicker extends LinearLayout { /** * The selector indices whose value are show by the selector. */ - private final int[] mSelectorIndices = new int[] { - Integer.MIN_VALUE, Integer.MIN_VALUE, Integer.MIN_VALUE, Integer.MIN_VALUE, - Integer.MIN_VALUE - }; + private final int[] mSelectorIndices = new int[SELECTOR_WHEEL_ITEM_COUNT]; /** * The {@link Paint} for drawing the selector. @@ -343,25 +333,15 @@ public class NumberPicker extends LinearLayout { private SetSelectionCommand mSetSelectionCommand; /** - * Handle to the reusable command for adjusting the scroller. - */ - private AdjustScrollerCommand mAdjustScrollerCommand; - - /** * Handle to the reusable command for changing the current value from long * press by one. */ private ChangeCurrentByOneFromLongPressCommand mChangeCurrentByOneFromLongPressCommand; /** - * {@link Animator} for showing the up/down arrows. - */ - private final AnimatorSet mShowInputControlsAnimator; - - /** - * {@link Animator} for dimming the selector wheel. + * Command for beginning an edit of the current value via IME on long press. */ - private final Animator mDimSelectorWheelAnimator; + private BeginSoftInputOnLongPressCommand mBeginSoftInputOnLongPressCommand; /** * The Y position of the last down event. @@ -369,24 +349,14 @@ public class NumberPicker extends LinearLayout { private float mLastDownEventY; /** - * The Y position of the last motion event. + * The time of the last down event. */ - private float mLastMotionEventY; + private long mLastDownEventTime; /** - * Flag if to check for double tap and potentially start edit. + * The Y position of the last down or move event. */ - private boolean mCheckBeginEditOnUpEvent; - - /** - * Flag if to adjust the selector wheel on next up event. - */ - private boolean mAdjustScrollerOnUpEvent; - - /** - * The state of the selector wheel. - */ - private int mSelectorWheelState; + private float mLastDownOrMoveEventY; /** * Determines speed during touch scrolling. @@ -419,9 +389,9 @@ public class NumberPicker extends LinearLayout { private final int mSolidColor; /** - * Flag indicating if this widget supports flinging. + * Flag whether this widget has a selector wheel. */ - private final boolean mFlingable; + private final boolean mHasSelectorWheel; /** * Divider for showing item to be selected while scrolling @@ -434,29 +404,40 @@ public class NumberPicker extends LinearLayout { private final int mSelectionDividerHeight; /** - * Reusable {@link Rect} instance. + * The current scroll state of the number picker. */ - private final Rect mTempRect = new Rect(); + private int mScrollState = OnScrollListener.SCROLL_STATE_IDLE; /** - * The current scroll state of the number picker. + * Flag whether to ignore move events - we ignore such when we show in IME + * to prevent the content from scrolling. */ - private int mScrollState = OnScrollListener.SCROLL_STATE_IDLE; + private boolean mIngonreMoveEvents; /** - * The duration of the animation for showing the input controls. + * Flag whether to show soft input on tap. */ - private final long mShowInputControlsAnimimationDuration; + private boolean mShowSoftInputOnTap; /** - * Flag whether the scoll wheel and the fading edges have been initialized. + * The top of the top selection divider. */ - private boolean mScrollWheelAndFadingEdgesInitialized; + private int mTopSelectionDividerTop; /** - * The time of the last up event. + * The bottom of the bottom selection divider. */ - private long mLastUpEventTimeMillis; + private int mBottomSelectionDividerBottom; + + /** + * The virtual id of the last hovered child. + */ + private int mLastHoveredChildVirtualViewId; + + /** + * Provider to report to clients the semantic structure of this widget. + */ + private AccessibilityNodeProviderImpl mAccessibilityNodeProvider; /** * Interface to listen for changes of the current value. @@ -484,7 +465,7 @@ public class NumberPicker extends LinearLayout { public static int SCROLL_STATE_IDLE = 0; /** - * The user is scrolling using touch, and their finger is still on the screen. + * The user is scrolling using touch, and his finger is still on the screen. */ public static int SCROLL_STATE_TOUCH_SCROLL = 1; @@ -549,58 +530,78 @@ public class NumberPicker extends LinearLayout { super(context, attrs, defStyle); // process style attributes - TypedArray attributesArray = context.obtainStyledAttributes(attrs, - R.styleable.NumberPicker, defStyle, 0); + TypedArray attributesArray = context.obtainStyledAttributes( + attrs, R.styleable.NumberPicker, defStyle, 0); + final int layoutResId = attributesArray.getResourceId( + R.styleable.NumberPicker_internalLayout, DEFAULT_LAYOUT_RESOURCE_ID); + + mHasSelectorWheel = (layoutResId != DEFAULT_LAYOUT_RESOURCE_ID); + mSolidColor = attributesArray.getColor(R.styleable.NumberPicker_solidColor, 0); - mFlingable = attributesArray.getBoolean(R.styleable.NumberPicker_flingable, true); + mSelectionDivider = attributesArray.getDrawable(R.styleable.NumberPicker_selectionDivider); - int defSelectionDividerHeight = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, - UNSCALED_DEFAULT_SELECTION_DIVIDER_HEIGHT, + + final int defSelectionDividerHeight = (int) TypedValue.applyDimension( + TypedValue.COMPLEX_UNIT_DIP, UNSCALED_DEFAULT_SELECTION_DIVIDER_HEIGHT, getResources().getDisplayMetrics()); mSelectionDividerHeight = attributesArray.getDimensionPixelSize( R.styleable.NumberPicker_selectionDividerHeight, defSelectionDividerHeight); + + final int defSelectionDividerDistance = (int) TypedValue.applyDimension( + TypedValue.COMPLEX_UNIT_DIP, UNSCALED_DEFAULT_SELECTION_DIVIDERS_DISTANCE, + getResources().getDisplayMetrics()); + mSelectionDividersDistance = attributesArray.getDimensionPixelSize( + R.styleable.NumberPicker_selectionDividersDistance, defSelectionDividerDistance); + + final int defMinFlingDistance = (int) TypedValue.applyDimension( + TypedValue.COMPLEX_UNIT_DIP, UNSCALED_DEFAULT_MIN_FLING_DISTANCE, + getResources().getDisplayMetrics()); + mMinFlingDistance = attributesArray.getDimensionPixelSize( + R.styleable.NumberPicker_minFlingDistance, defMinFlingDistance); + mMinHeight = attributesArray.getDimensionPixelSize( R.styleable.NumberPicker_internalMinHeight, SIZE_UNSPECIFIED); + mMaxHeight = attributesArray.getDimensionPixelSize( R.styleable.NumberPicker_internalMaxHeight, SIZE_UNSPECIFIED); if (mMinHeight != SIZE_UNSPECIFIED && mMaxHeight != SIZE_UNSPECIFIED && mMinHeight > mMaxHeight) { throw new IllegalArgumentException("minHeight > maxHeight"); } - mMinWidth = attributesArray.getDimensionPixelSize(R.styleable.NumberPicker_internalMinWidth, - SIZE_UNSPECIFIED); - mMaxWidth = attributesArray.getDimensionPixelSize(R.styleable.NumberPicker_internalMaxWidth, - SIZE_UNSPECIFIED); + + mMinWidth = attributesArray.getDimensionPixelSize( + R.styleable.NumberPicker_internalMinWidth, SIZE_UNSPECIFIED); + + mMaxWidth = attributesArray.getDimensionPixelSize( + R.styleable.NumberPicker_internalMaxWidth, SIZE_UNSPECIFIED); if (mMinWidth != SIZE_UNSPECIFIED && mMaxWidth != SIZE_UNSPECIFIED && mMinWidth > mMaxWidth) { throw new IllegalArgumentException("minWidth > maxWidth"); } + mComputeMaxWidth = (mMaxWidth == Integer.MAX_VALUE); - attributesArray.recycle(); - mShowInputControlsAnimimationDuration = getResources().getInteger( - R.integer.config_longAnimTime); + attributesArray.recycle(); // By default Linearlayout that we extend is not drawn. This is // its draw() method is not called but dispatchDraw() is called // directly (see ViewGroup.drawChild()). However, this class uses // the fading edge effect implemented by View and we need our // draw() method to be called. Therefore, we declare we will draw. - setWillNotDraw(false); - setSelectorWheelState(SELECTOR_WHEEL_STATE_NONE); + setWillNotDraw(!mHasSelectorWheel); LayoutInflater inflater = (LayoutInflater) getContext().getSystemService( Context.LAYOUT_INFLATER_SERVICE); - inflater.inflate(R.layout.number_picker, this, true); + inflater.inflate(layoutResId, this, true); OnClickListener onClickListener = new OnClickListener() { public void onClick(View v) { hideSoftInput(); mInputText.clearFocus(); if (v.getId() == R.id.increment) { - changeCurrentByOne(true); + changeValueByOne(true); } else { - changeCurrentByOne(false); + changeValueByOne(false); } } }; @@ -610,23 +611,31 @@ public class NumberPicker extends LinearLayout { hideSoftInput(); mInputText.clearFocus(); if (v.getId() == R.id.increment) { - postChangeCurrentByOneFromLongPress(true); + postChangeCurrentByOneFromLongPress(true, 0); } else { - postChangeCurrentByOneFromLongPress(false); + postChangeCurrentByOneFromLongPress(false, 0); } return true; } }; // increment button - mIncrementButton = (ImageButton) findViewById(R.id.increment); - mIncrementButton.setOnClickListener(onClickListener); - mIncrementButton.setOnLongClickListener(onLongClickListener); + if (!mHasSelectorWheel) { + mIncrementButton = (ImageButton) findViewById(R.id.increment); + mIncrementButton.setOnClickListener(onClickListener); + mIncrementButton.setOnLongClickListener(onLongClickListener); + } else { + mIncrementButton = null; + } // decrement button - mDecrementButton = (ImageButton) findViewById(R.id.decrement); - mDecrementButton.setOnClickListener(onClickListener); - mDecrementButton.setOnLongClickListener(onLongClickListener); + if (!mHasSelectorWheel) { + mDecrementButton = (ImageButton) findViewById(R.id.decrement); + mDecrementButton.setOnClickListener(onClickListener); + mDecrementButton.setOnLongClickListener(onLongClickListener); + } else { + mDecrementButton = null; + } // input text mInputText = (EditText) findViewById(R.id.numberpicker_input); @@ -648,7 +657,6 @@ public class NumberPicker extends LinearLayout { mInputText.setImeOptions(EditorInfo.IME_ACTION_DONE); // initialize constants - mTouchSlop = ViewConfiguration.getTapTimeout(); ViewConfiguration configuration = ViewConfiguration.get(context); mTouchSlop = configuration.getScaledTouchSlop(); mMinimumFlingVelocity = configuration.getScaledMinimumFlingVelocity(); @@ -667,69 +675,22 @@ public class NumberPicker extends LinearLayout { paint.setColor(color); mSelectorWheelPaint = paint; - // create the animator for showing the input controls - mDimSelectorWheelAnimator = ObjectAnimator.ofInt(this, PROPERTY_SELECTOR_PAINT_ALPHA, - SELECTOR_WHEEL_BRIGHT_ALPHA, SELECTOR_WHEEL_DIM_ALPHA); - final ObjectAnimator showIncrementButton = ObjectAnimator.ofFloat(mIncrementButton, - PROPERTY_BUTTON_ALPHA, BUTTON_ALPHA_TRANSPARENT, BUTTON_ALPHA_OPAQUE); - final ObjectAnimator showDecrementButton = ObjectAnimator.ofFloat(mDecrementButton, - PROPERTY_BUTTON_ALPHA, BUTTON_ALPHA_TRANSPARENT, BUTTON_ALPHA_OPAQUE); - mShowInputControlsAnimator = new AnimatorSet(); - mShowInputControlsAnimator.playTogether(mDimSelectorWheelAnimator, showIncrementButton, - showDecrementButton); - mShowInputControlsAnimator.addListener(new AnimatorListenerAdapter() { - private boolean mCanceled = false; - - @Override - public void onAnimationEnd(Animator animation) { - if (!mCanceled) { - // if canceled => we still want the wheel drawn - setSelectorWheelState(SELECTOR_WHEEL_STATE_SMALL); - } - mCanceled = false; - } - - @Override - public void onAnimationCancel(Animator animation) { - if (mShowInputControlsAnimator.isRunning()) { - mCanceled = true; - } - } - }); - // create the fling and adjust scrollers mFlingScroller = new Scroller(getContext(), null, true); mAdjustScroller = new Scroller(getContext(), new DecelerateInterpolator(2.5f)); updateInputTextView(); - updateIncrementAndDecrementButtonsVisibilityState(); - - if (mFlingable) { - if (isInEditMode()) { - setSelectorWheelState(SELECTOR_WHEEL_STATE_SMALL); - } else { - // Start with shown selector wheel and hidden controls. When made - // visible hide the selector and fade-in the controls to suggest - // fling interaction. - setSelectorWheelState(SELECTOR_WHEEL_STATE_LARGE); - hideInputControls(); - } - } } @Override protected void onLayout(boolean changed, int left, int top, int right, int bottom) { + if (!mHasSelectorWheel) { + super.onLayout(changed, left, top, right, bottom); + return; + } final int msrdWdth = getMeasuredWidth(); final int msrdHght = getMeasuredHeight(); - // Increment button at the top. - final int inctBtnMsrdWdth = mIncrementButton.getMeasuredWidth(); - final int incrBtnLeft = (msrdWdth - inctBtnMsrdWdth) / 2; - final int incrBtnTop = 0; - final int incrBtnRight = incrBtnLeft + inctBtnMsrdWdth; - final int incrBtnBottom = incrBtnTop + mIncrementButton.getMeasuredHeight(); - mIncrementButton.layout(incrBtnLeft, incrBtnTop, incrBtnRight, incrBtnBottom); - // Input text centered horizontally. final int inptTxtMsrdWdth = mInputText.getMeasuredWidth(); final int inptTxtMsrdHght = mInputText.getMeasuredHeight(); @@ -739,24 +700,23 @@ public class NumberPicker extends LinearLayout { final int inptTxtBottom = inptTxtTop + inptTxtMsrdHght; mInputText.layout(inptTxtLeft, inptTxtTop, inptTxtRight, inptTxtBottom); - // Decrement button at the top. - final int decrBtnMsrdWdth = mIncrementButton.getMeasuredWidth(); - final int decrBtnLeft = (msrdWdth - decrBtnMsrdWdth) / 2; - final int decrBtnTop = msrdHght - mDecrementButton.getMeasuredHeight(); - final int decrBtnRight = decrBtnLeft + decrBtnMsrdWdth; - final int decrBtnBottom = msrdHght; - mDecrementButton.layout(decrBtnLeft, decrBtnTop, decrBtnRight, decrBtnBottom); - - if (!mScrollWheelAndFadingEdgesInitialized) { - mScrollWheelAndFadingEdgesInitialized = true; + if (changed) { // need to do all this when we know our size initializeSelectorWheel(); initializeFadingEdges(); + mTopSelectionDividerTop = (getHeight() - mSelectionDividersDistance) / 2 + - mSelectionDividerHeight; + mBottomSelectionDividerBottom = mTopSelectionDividerTop + 2 * mSelectionDividerHeight + + mSelectionDividersDistance; } } @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { + if (!mHasSelectorWheel) { + super.onMeasure(widthMeasureSpec, heightMeasureSpec); + return; + } // Try greedily to fit the max width and height. final int newWidthMeasureSpec = makeMeasureSpec(widthMeasureSpec, mMaxWidth); final int newHeightMeasureSpec = makeMeasureSpec(heightMeasureSpec, mMaxHeight); @@ -769,120 +729,143 @@ public class NumberPicker extends LinearLayout { setMeasuredDimension(widthSize, heightSize); } + /** + * Move to the final position of a scroller. Ensures to force finish the scroller + * and if it is not at its final position a scroll of the selector wheel is + * performed to fast forward to the final position. + * + * @param scroller The scroller to whose final position to get. + * @return True of the a move was performed, i.e. the scroller was not in final position. + */ + private boolean moveToFinalScrollerPosition(Scroller scroller) { + scroller.forceFinished(true); + int amountToScroll = scroller.getFinalY() - scroller.getCurrY(); + int futureScrollOffset = (mCurrentScrollOffset + amountToScroll) % mSelectorElementHeight; + int overshootAdjustment = mInitialScrollOffset - futureScrollOffset; + if (overshootAdjustment != 0) { + if (Math.abs(overshootAdjustment) > mSelectorElementHeight / 2) { + if (overshootAdjustment > 0) { + overshootAdjustment -= mSelectorElementHeight; + } else { + overshootAdjustment += mSelectorElementHeight; + } + } + amountToScroll += overshootAdjustment; + scrollBy(0, amountToScroll); + return true; + } + return false; + } + @Override public boolean onInterceptTouchEvent(MotionEvent event) { - if (!isEnabled() || !mFlingable) { + if (!mHasSelectorWheel || !isEnabled()) { return false; } - switch (event.getActionMasked()) { - case MotionEvent.ACTION_DOWN: - mLastMotionEventY = mLastDownEventY = event.getY(); + final int action = event.getActionMasked(); + switch (action) { + case MotionEvent.ACTION_DOWN: { removeAllCallbacks(); - mShowInputControlsAnimator.cancel(); - mDimSelectorWheelAnimator.cancel(); - mCheckBeginEditOnUpEvent = false; - mAdjustScrollerOnUpEvent = true; - if (mSelectorWheelState == SELECTOR_WHEEL_STATE_LARGE) { - mSelectorWheelPaint.setAlpha(SELECTOR_WHEEL_BRIGHT_ALPHA); - boolean scrollersFinished = mFlingScroller.isFinished() - && mAdjustScroller.isFinished(); - if (!scrollersFinished) { - mFlingScroller.forceFinished(true); - mAdjustScroller.forceFinished(true); - onScrollStateChange(OnScrollListener.SCROLL_STATE_IDLE); - } - mCheckBeginEditOnUpEvent = scrollersFinished; - mAdjustScrollerOnUpEvent = true; + mInputText.setVisibility(View.INVISIBLE); + mLastDownOrMoveEventY = mLastDownEventY = event.getY(); + mLastDownEventTime = event.getEventTime(); + mIngonreMoveEvents = false; + mShowSoftInputOnTap = false; + if (!mFlingScroller.isFinished()) { + mFlingScroller.forceFinished(true); + mAdjustScroller.forceFinished(true); + onScrollStateChange(OnScrollListener.SCROLL_STATE_IDLE); + } else if (!mAdjustScroller.isFinished()) { + mFlingScroller.forceFinished(true); + mAdjustScroller.forceFinished(true); + } else if (mLastDownEventY < mTopSelectionDividerTop) { hideSoftInput(); - hideInputControls(); - return true; - } - if (isEventInVisibleViewHitRect(event, mIncrementButton) - || isEventInVisibleViewHitRect(event, mDecrementButton)) { - return false; - } - mAdjustScrollerOnUpEvent = false; - setSelectorWheelState(SELECTOR_WHEEL_STATE_LARGE); - hideSoftInput(); - hideInputControls(); - return true; - case MotionEvent.ACTION_MOVE: - float currentMoveY = event.getY(); - int deltaDownY = (int) Math.abs(currentMoveY - mLastDownEventY); - if (deltaDownY > mTouchSlop) { - mCheckBeginEditOnUpEvent = false; - onScrollStateChange(OnScrollListener.SCROLL_STATE_TOUCH_SCROLL); - setSelectorWheelState(SELECTOR_WHEEL_STATE_LARGE); + postChangeCurrentByOneFromLongPress( + false, ViewConfiguration.getLongPressTimeout()); + } else if (mLastDownEventY > mBottomSelectionDividerBottom) { hideSoftInput(); - hideInputControls(); - return true; + postChangeCurrentByOneFromLongPress( + true, ViewConfiguration.getLongPressTimeout()); + } else { + mShowSoftInputOnTap = true; + postBeginSoftInputOnLongPressCommand(); } - break; + return true; + } } return false; } @Override - public boolean onTouchEvent(MotionEvent ev) { - if (!isEnabled()) { + public boolean onTouchEvent(MotionEvent event) { + if (!isEnabled() || !mHasSelectorWheel) { return false; } if (mVelocityTracker == null) { mVelocityTracker = VelocityTracker.obtain(); } - mVelocityTracker.addMovement(ev); - int action = ev.getActionMasked(); + mVelocityTracker.addMovement(event); + int action = event.getActionMasked(); switch (action) { - case MotionEvent.ACTION_MOVE: - float currentMoveY = ev.getY(); - if (mCheckBeginEditOnUpEvent - || mScrollState != OnScrollListener.SCROLL_STATE_TOUCH_SCROLL) { + case MotionEvent.ACTION_MOVE: { + if (mIngonreMoveEvents) { + break; + } + float currentMoveY = event.getY(); + if (mScrollState != OnScrollListener.SCROLL_STATE_TOUCH_SCROLL) { int deltaDownY = (int) Math.abs(currentMoveY - mLastDownEventY); if (deltaDownY > mTouchSlop) { - mCheckBeginEditOnUpEvent = false; + removeAllCallbacks(); onScrollStateChange(OnScrollListener.SCROLL_STATE_TOUCH_SCROLL); } + } else { + int deltaMoveY = (int) ((currentMoveY - mLastDownOrMoveEventY) + / TOUCH_SCROLL_DECELERATION_COEFFICIENT); + scrollBy(0, deltaMoveY); + invalidate(); } - int deltaMoveY = (int) (currentMoveY - mLastMotionEventY); - scrollBy(0, deltaMoveY); - invalidate(); - mLastMotionEventY = currentMoveY; - break; - case MotionEvent.ACTION_UP: - if (mCheckBeginEditOnUpEvent) { - mCheckBeginEditOnUpEvent = false; - final long deltaTapTimeMillis = ev.getEventTime() - mLastUpEventTimeMillis; - if (deltaTapTimeMillis < ViewConfiguration.getDoubleTapTimeout()) { - setSelectorWheelState(SELECTOR_WHEEL_STATE_SMALL); - showInputControls(mShowInputControlsAnimimationDuration); - mInputText.requestFocus(); - InputMethodManager inputMethodManager = InputMethodManager.peekInstance(); - if (inputMethodManager != null) { - inputMethodManager.showSoftInput(mInputText, 0); - } - mLastUpEventTimeMillis = ev.getEventTime(); - return true; - } - } + mLastDownOrMoveEventY = currentMoveY; + } break; + case MotionEvent.ACTION_UP: { + removeBeginSoftInputCommand(); + removeChangeCurrentByOneFromLongPress(); VelocityTracker velocityTracker = mVelocityTracker; velocityTracker.computeCurrentVelocity(1000, mMaximumFlingVelocity); int initialVelocity = (int) velocityTracker.getYVelocity(); if (Math.abs(initialVelocity) > mMinimumFlingVelocity) { - fling(initialVelocity); + int deltaMove = (int) (event.getY() - mLastDownEventY); + int absDeltaMoveY = Math.abs(deltaMove); + if (absDeltaMoveY > mMinFlingDistance) { + fling(initialVelocity); + } else { + changeValueByOne(deltaMove < 0); + } onScrollStateChange(OnScrollListener.SCROLL_STATE_FLING); } else { - if (mAdjustScrollerOnUpEvent) { - if (mFlingScroller.isFinished() && mAdjustScroller.isFinished()) { - postAdjustScrollerCommand(0); + int eventY = (int) event.getY(); + int deltaMoveY = (int) Math.abs(eventY - mLastDownEventY); + long deltaTime = event.getEventTime() - mLastDownEventTime; + if (deltaMoveY <= mTouchSlop && deltaTime < ViewConfiguration.getTapTimeout()) { + if (mShowSoftInputOnTap) { + mShowSoftInputOnTap = false; + showSoftInput(); + } else { + int selectorIndexOffset = (eventY / mSelectorElementHeight) + - SELECTOR_MIDDLE_ITEM_INDEX; + if (selectorIndexOffset > 0) { + changeValueByOne(true); + } else if (selectorIndexOffset < 0) { + changeValueByOne(false); + } } } else { - postAdjustScrollerCommand(SHOW_INPUT_CONTROLS_DELAY_MILLIS); + ensureScrollWheelAdjusted(); } + onScrollStateChange(OnScrollListener.SCROLL_STATE_IDLE); } mVelocityTracker.recycle(); mVelocityTracker = null; - mLastUpEventTimeMillis = ev.getEventTime(); - break; + } break; } return true; } @@ -891,12 +874,6 @@ public class NumberPicker extends LinearLayout { public boolean dispatchTouchEvent(MotionEvent event) { final int action = event.getActionMasked(); switch (action) { - case MotionEvent.ACTION_MOVE: - if (mSelectorWheelState == SELECTOR_WHEEL_STATE_LARGE) { - removeAllCallbacks(); - forceCompleteChangeCurrentByOneViaScroll(); - } - break; case MotionEvent.ACTION_CANCEL: case MotionEvent.ACTION_UP: removeAllCallbacks(); @@ -907,27 +884,75 @@ public class NumberPicker extends LinearLayout { @Override public boolean dispatchKeyEvent(KeyEvent event) { - int keyCode = event.getKeyCode(); - if (keyCode == KeyEvent.KEYCODE_DPAD_CENTER || keyCode == KeyEvent.KEYCODE_ENTER) { - removeAllCallbacks(); + final int keyCode = event.getKeyCode(); + switch (keyCode) { + case KeyEvent.KEYCODE_DPAD_CENTER: + case KeyEvent.KEYCODE_ENTER: + removeAllCallbacks(); + break; } return super.dispatchKeyEvent(event); } @Override public boolean dispatchTrackballEvent(MotionEvent event) { - int action = event.getActionMasked(); - if (action == MotionEvent.ACTION_CANCEL || action == MotionEvent.ACTION_UP) { - removeAllCallbacks(); + final int action = event.getActionMasked(); + switch (action) { + case MotionEvent.ACTION_CANCEL: + case MotionEvent.ACTION_UP: + removeAllCallbacks(); + break; } return super.dispatchTrackballEvent(event); } @Override - public void computeScroll() { - if (mSelectorWheelState == SELECTOR_WHEEL_STATE_NONE) { - return; + protected boolean dispatchHoverEvent(MotionEvent event) { + if (!mHasSelectorWheel) { + return super.dispatchHoverEvent(event); + } + if (AccessibilityManager.getInstance(mContext).isEnabled()) { + final int eventY = (int) event.getY(); + final int hoveredVirtualViewId; + if (eventY < mTopSelectionDividerTop) { + hoveredVirtualViewId = AccessibilityNodeProviderImpl.VIRTUAL_VIEW_ID_DECREMENT; + } else if (eventY > mBottomSelectionDividerBottom) { + hoveredVirtualViewId = AccessibilityNodeProviderImpl.VIRTUAL_VIEW_ID_INCREMENT; + } else { + hoveredVirtualViewId = AccessibilityNodeProviderImpl.VIRTUAL_VIEW_ID_INPUT; + } + final int action = event.getActionMasked(); + AccessibilityNodeProviderImpl provider = + (AccessibilityNodeProviderImpl) getAccessibilityNodeProvider(); + switch (action) { + case MotionEvent.ACTION_HOVER_ENTER: { + provider.sendAccessibilityEventForVirtualView(hoveredVirtualViewId, + AccessibilityEvent.TYPE_VIEW_HOVER_ENTER); + mLastHoveredChildVirtualViewId = hoveredVirtualViewId; + } break; + case MotionEvent.ACTION_HOVER_MOVE: { + if (mLastHoveredChildVirtualViewId != hoveredVirtualViewId + && mLastHoveredChildVirtualViewId != View.NO_ID) { + provider.sendAccessibilityEventForVirtualView( + mLastHoveredChildVirtualViewId, + AccessibilityEvent.TYPE_VIEW_HOVER_EXIT); + provider.sendAccessibilityEventForVirtualView(hoveredVirtualViewId, + AccessibilityEvent.TYPE_VIEW_HOVER_ENTER); + mLastHoveredChildVirtualViewId = hoveredVirtualViewId; + } + } break; + case MotionEvent.ACTION_HOVER_EXIT: { + provider.sendAccessibilityEventForVirtualView(hoveredVirtualViewId, + AccessibilityEvent.TYPE_VIEW_HOVER_EXIT); + mLastHoveredChildVirtualViewId = View.NO_ID; + } break; + } } + return false; + } + + @Override + public void computeScroll() { Scroller scroller = mFlingScroller; if (scroller.isFinished()) { scroller = mAdjustScroller; @@ -952,16 +977,17 @@ public class NumberPicker extends LinearLayout { @Override public void setEnabled(boolean enabled) { super.setEnabled(enabled); - mIncrementButton.setEnabled(enabled); - mDecrementButton.setEnabled(enabled); + if (!mHasSelectorWheel) { + mIncrementButton.setEnabled(enabled); + } + if (!mHasSelectorWheel) { + mDecrementButton.setEnabled(enabled); + } mInputText.setEnabled(enabled); } @Override public void scrollBy(int x, int y) { - if (mSelectorWheelState == SELECTOR_WHEEL_STATE_NONE) { - return; - } int[] selectorIndices = mSelectorIndices; if (!mWrapSelectorWheel && y > 0 && selectorIndices[SELECTOR_MIDDLE_ITEM_INDEX] <= mMinValue) { @@ -977,7 +1003,7 @@ public class NumberPicker extends LinearLayout { while (mCurrentScrollOffset - mInitialScrollOffset > mSelectorTextGapHeight) { mCurrentScrollOffset -= mSelectorElementHeight; decrementSelectorIndices(selectorIndices); - changeCurrent(selectorIndices[SELECTOR_MIDDLE_ITEM_INDEX]); + setValueInternal(selectorIndices[SELECTOR_MIDDLE_ITEM_INDEX], true); if (!mWrapSelectorWheel && selectorIndices[SELECTOR_MIDDLE_ITEM_INDEX] <= mMinValue) { mCurrentScrollOffset = mInitialScrollOffset; } @@ -985,7 +1011,7 @@ public class NumberPicker extends LinearLayout { while (mCurrentScrollOffset - mInitialScrollOffset < -mSelectorTextGapHeight) { mCurrentScrollOffset += mSelectorElementHeight; incrementSelectorIndices(selectorIndices); - changeCurrent(selectorIndices[SELECTOR_MIDDLE_ITEM_INDEX]); + setValueInternal(selectorIndices[SELECTOR_MIDDLE_ITEM_INDEX], true); if (!mWrapSelectorWheel && selectorIndices[SELECTOR_MIDDLE_ITEM_INDEX] >= mMaxValue) { mCurrentScrollOffset = mInitialScrollOffset; } @@ -1024,8 +1050,7 @@ public class NumberPicker extends LinearLayout { * * @param formatter The formatter object. If formatter is <code>null</code>, * {@link String#valueOf(int)} will be used. - * - * @see #setDisplayedValues(String[]) + *@see #setDisplayedValues(String[]) */ public void setFormatter(Formatter formatter) { if (formatter == mFormatter) { @@ -1068,26 +1093,35 @@ public class NumberPicker extends LinearLayout { if (mValue == value) { return; } - if (value < mMinValue) { - value = mWrapSelectorWheel ? mMaxValue : mMinValue; - } - if (value > mMaxValue) { - value = mWrapSelectorWheel ? mMinValue : mMaxValue; - } - mValue = value; + setValueInternal(value, false); initializeSelectorWheelIndices(); - updateInputTextView(); - updateIncrementAndDecrementButtonsVisibilityState(); invalidate(); } /** - * Hides the soft input of it is active for the input text. + * Shows the soft input for its input text. + */ + private void showSoftInput() { + InputMethodManager inputMethodManager = InputMethodManager.peekInstance(); + if (inputMethodManager != null) { + if (mHasSelectorWheel) { + mInputText.setVisibility(View.VISIBLE); + } + mInputText.requestFocus(); + inputMethodManager.showSoftInput(mInputText, 0); + } + } + + /** + * Hides the soft input if it is active for the input text. */ private void hideSoftInput() { InputMethodManager inputMethodManager = InputMethodManager.peekInstance(); if (inputMethodManager != null && inputMethodManager.isActive(mInputText)) { inputMethodManager.hideSoftInputFromWindow(getWindowToken(), 0); + if (mHasSelectorWheel) { + mInputText.setVisibility(View.INVISIBLE); + } } } @@ -1151,23 +1185,22 @@ public class NumberPicker extends LinearLayout { * wrap around the {@link NumberPicker#getMinValue()} and * {@link NumberPicker#getMaxValue()} values. * <p> - * By default if the range (max - min) is more than five (the number of - * items shown on the selector wheel) the selector wheel wrapping is - * enabled. + * By default if the range (max - min) is more than the number of items shown + * on the selector wheel the selector wheel wrapping is enabled. * </p> * <p> - * <strong>Note:</strong> If the number of items, i.e. the range - * ({@link #getMaxValue()} - {@link #getMinValue()}) is less than - * {@link #SELECTOR_WHEEL_ITEM_COUNT}, the selector wheel will not - * wrap. Hence, in such a case calling this method is a NOP. + * <strong>Note:</strong> If the number of items, i.e. the range ( + * {@link #getMaxValue()} - {@link #getMinValue()}) is less than + * the number of items shown on the selector wheel, the selector wheel will + * not wrap. Hence, in such a case calling this method is a NOP. * </p> + * * @param wrapSelectorWheel Whether to wrap. */ public void setWrapSelectorWheel(boolean wrapSelectorWheel) { final boolean wrappingAllowed = (mMaxValue - mMinValue) >= mSelectorIndices.length; if ((!wrapSelectorWheel || wrappingAllowed) && wrapSelectorWheel != mWrapSelectorWheel) { mWrapSelectorWheel = wrapSelectorWheel; - updateIncrementAndDecrementButtonsVisibilityState(); } } @@ -1224,6 +1257,7 @@ public class NumberPicker extends LinearLayout { initializeSelectorWheelIndices(); updateInputTextView(); tryComputeMaxWidth(); + invalidate(); } /** @@ -1256,6 +1290,7 @@ public class NumberPicker extends LinearLayout { initializeSelectorWheelIndices(); updateInputTextView(); tryComputeMaxWidth(); + invalidate(); } /** @@ -1300,102 +1335,49 @@ public class NumberPicker extends LinearLayout { } @Override - protected void onAttachedToWindow() { - super.onAttachedToWindow(); - // make sure we show the controls only the very - // first time the user sees this widget - if (mFlingable && !isInEditMode()) { - // animate a bit slower the very first time - showInputControls(mShowInputControlsAnimimationDuration * 2); - } - } - - @Override protected void onDetachedFromWindow() { removeAllCallbacks(); } @Override - protected void dispatchDraw(Canvas canvas) { - // There is a good reason for doing this. See comments in draw(). - } - - @Override - public void draw(Canvas canvas) { - // Dispatch draw to our children only if we are not currently running - // the animation for simultaneously dimming the scroll wheel and - // showing in the buttons. This class takes advantage of the View - // implementation of fading edges effect to draw the selector wheel. - // However, in View.draw(), the fading is applied after all the children - // have been drawn and we do not want this fading to be applied to the - // buttons. Therefore, we draw our children after we have completed - // drawing ourselves. - super.draw(canvas); - - // Draw our children if we are not showing the selector wheel of fading - // it out - if (mShowInputControlsAnimator.isRunning() - || mSelectorWheelState != SELECTOR_WHEEL_STATE_LARGE) { - long drawTime = getDrawingTime(); - for (int i = 0, count = getChildCount(); i < count; i++) { - View child = getChildAt(i); - if (!child.isShown()) { - continue; - } - drawChild(canvas, getChildAt(i), drawTime); - } - } - } - - @Override protected void onDraw(Canvas canvas) { - if (mSelectorWheelState == SELECTOR_WHEEL_STATE_NONE) { + if (!mHasSelectorWheel) { + super.onDraw(canvas); return; } - float x = (mRight - mLeft) / 2; float y = mCurrentScrollOffset; - final int restoreCount = canvas.save(); - - if (mSelectorWheelState == SELECTOR_WHEEL_STATE_SMALL) { - Rect clipBounds = canvas.getClipBounds(); - clipBounds.inset(0, mSelectorElementHeight); - canvas.clipRect(clipBounds); - } - // draw the selector wheel int[] selectorIndices = mSelectorIndices; for (int i = 0; i < selectorIndices.length; i++) { int selectorIndex = selectorIndices[i]; String scrollSelectorValue = mSelectorIndexToStringCache.get(selectorIndex); - // Do not draw the middle item if input is visible since the input is shown only - // if the wheel is static and it covers the middle item. Otherwise, if the user - // starts editing the text via the IME he may see a dimmed version of the old - // value intermixed with the new one. + // Do not draw the middle item if input is visible since the input + // is shown only if the wheel is static and it covers the middle + // item. Otherwise, if the user starts editing the text via the + // IME he may see a dimmed version of the old value intermixed + // with the new one. if (i != SELECTOR_MIDDLE_ITEM_INDEX || mInputText.getVisibility() != VISIBLE) { canvas.drawText(scrollSelectorValue, x, y, mSelectorWheelPaint); } y += mSelectorElementHeight; } - // draw the selection dividers (only if scrolling and drawable specified) + // draw the selection dividers if (mSelectionDivider != null) { // draw the top divider - int topOfTopDivider = - (getHeight() - mSelectorElementHeight - mSelectionDividerHeight) / 2; + int topOfTopDivider = mTopSelectionDividerTop; int bottomOfTopDivider = topOfTopDivider + mSelectionDividerHeight; mSelectionDivider.setBounds(0, topOfTopDivider, mRight, bottomOfTopDivider); mSelectionDivider.draw(canvas); // draw the bottom divider - int topOfBottomDivider = topOfTopDivider + mSelectorElementHeight; - int bottomOfBottomDivider = bottomOfTopDivider + mSelectorElementHeight; + int bottomOfBottomDivider = mBottomSelectionDividerBottom; + int topOfBottomDivider = bottomOfBottomDivider - mSelectionDividerHeight; mSelectionDivider.setBounds(0, topOfBottomDivider, mRight, bottomOfBottomDivider); mSelectionDivider.draw(canvas); } - - canvas.restoreToCount(restoreCount); } @Override @@ -1408,12 +1390,20 @@ public class NumberPicker extends LinearLayout { public void onInitializeAccessibilityEvent(AccessibilityEvent event) { super.onInitializeAccessibilityEvent(event); event.setClassName(NumberPicker.class.getName()); + event.setScrollable(true); + event.setScrollY((mMinValue + mValue) * mSelectorElementHeight); + event.setMaxScrollY((mMaxValue - mMinValue) * mSelectorElementHeight); } @Override - public void onInitializeAccessibilityNodeInfo(AccessibilityNodeInfo info) { - super.onInitializeAccessibilityNodeInfo(info); - info.setClassName(NumberPicker.class.getName()); + public AccessibilityNodeProvider getAccessibilityNodeProvider() { + if (!mHasSelectorWheel) { + return super.getAccessibilityNodeProvider(); + } + if (mAccessibilityNodeProvider == null) { + mAccessibilityNodeProvider = new AccessibilityNodeProviderImpl(); + } + return mAccessibilityNodeProvider; } /** @@ -1442,17 +1432,17 @@ public class NumberPicker extends LinearLayout { } /** - * Utility to reconcile a desired size and state, with constraints imposed by - * a MeasureSpec. Tries to respect the min size, unless a different size is - * imposed by the constraints. + * Utility to reconcile a desired size and state, with constraints imposed + * by a MeasureSpec. Tries to respect the min size, unless a different size + * is imposed by the constraints. * * @param minSize The minimal desired size. * @param measuredSize The currently measured size. * @param measureSpec The current measure spec. * @return The resolved size and state. */ - private int resolveSizeAndStateRespectingMinSize(int minSize, int measuredSize, - int measureSpec) { + private int resolveSizeAndStateRespectingMinSize( + int minSize, int measuredSize, int measureSpec) { if (minSize != SIZE_UNSPECIFIED) { final int desiredWidth = Math.max(minSize, measuredSize); return resolveSizeAndState(desiredWidth, measureSpec, 0); @@ -1462,8 +1452,8 @@ public class NumberPicker extends LinearLayout { } /** - * Resets the selector indices and clear the cached - * string representation of these indices. + * Resets the selector indices and clear the cached string representation of + * these indices. */ private void initializeSelectorWheelIndices() { mSelectorIndexToStringCache.clear(); @@ -1480,39 +1470,44 @@ public class NumberPicker extends LinearLayout { } /** - * Sets the current value of this NumberPicker, and sets mPrevious to the - * previous value. If current is greater than mEnd less than mStart, the - * value of mCurrent is wrapped around. Subclasses can override this to - * change the wrapping behavior + * Sets the current value of this NumberPicker. * - * @param current the new value of the NumberPicker + * @param current The new value of the NumberPicker. + * @param notifyChange Whether to notify if the current value changed. */ - private void changeCurrent(int current) { + private void setValueInternal(int current, boolean notifyChange) { if (mValue == current) { return; } // Wrap around the values if we go past the start or end if (mWrapSelectorWheel) { current = getWrappedSelectorIndex(current); + } else { + current = Math.max(current, mMinValue); + current = Math.min(current, mMaxValue); } int previous = mValue; - setValue(current); - notifyChange(previous, current); + mValue = current; + updateInputTextView(); + if (notifyChange) { + notifyChange(previous, current); + } } /** * Changes the current value by one which is increment or * decrement based on the passes argument. + * decrement the current value. * * @param increment True to increment, false to decrement. */ - private void changeCurrentByOne(boolean increment) { - if (mFlingable) { - mDimSelectorWheelAnimator.cancel(); + private void changeValueByOne(boolean increment) { + if (mHasSelectorWheel) { mInputText.setVisibility(View.INVISIBLE); - mSelectorWheelPaint.setAlpha(SELECTOR_WHEEL_BRIGHT_ALPHA); + if (!moveToFinalScrollerPosition(mFlingScroller)) { + moveToFinalScrollerPosition(mAdjustScroller); + } mPreviousScrollerY = 0; - forceCompleteChangeCurrentByOneViaScroll(); if (increment) { mFlingScroller.startScroll(0, 0, 0, -mSelectorElementHeight, CHANGE_CURRENT_BY_ONE_SCROLL_DURATION); @@ -1523,81 +1518,26 @@ public class NumberPicker extends LinearLayout { invalidate(); } else { if (increment) { - changeCurrent(mValue + 1); + setValueInternal(mValue + 1, true); } else { - changeCurrent(mValue - 1); + setValueInternal(mValue - 1, true); } } } - /** - * Ensures that if we are in the process of changing the current value - * by one via scrolling the scroller gets to its final state and the - * value is updated. - */ - private void forceCompleteChangeCurrentByOneViaScroll() { - Scroller scroller = mFlingScroller; - if (!scroller.isFinished()) { - final int yBeforeAbort = scroller.getCurrY(); - scroller.abortAnimation(); - final int yDelta = scroller.getCurrY() - yBeforeAbort; - scrollBy(0, yDelta); - } - } - - /** - * Sets the <code>alpha</code> of the {@link Paint} for drawing the selector - * wheel. - */ - @SuppressWarnings("unused") - // Called via reflection - private void setSelectorPaintAlpha(int alpha) { - mSelectorWheelPaint.setAlpha(alpha); - invalidate(); - } - - /** - * @return If the <code>event</code> is in the visible <code>view</code>. - */ - private boolean isEventInVisibleViewHitRect(MotionEvent event, View view) { - if (view.getVisibility() == VISIBLE) { - view.getHitRect(mTempRect); - return mTempRect.contains((int) event.getX(), (int) event.getY()); - } - return false; - } - - /** - * Sets the <code>selectorWheelState</code>. - */ - private void setSelectorWheelState(int selectorWheelState) { - mSelectorWheelState = selectorWheelState; - if (selectorWheelState == SELECTOR_WHEEL_STATE_LARGE) { - mSelectorWheelPaint.setAlpha(SELECTOR_WHEEL_BRIGHT_ALPHA); - } - - if (mFlingable && selectorWheelState == SELECTOR_WHEEL_STATE_LARGE - && AccessibilityManager.getInstance(mContext).isEnabled()) { - AccessibilityManager.getInstance(mContext).interrupt(); - String text = mContext.getString(R.string.number_picker_increment_scroll_action); - mInputText.setContentDescription(text); - mInputText.sendAccessibilityEvent(AccessibilityEvent.TYPE_VIEW_SELECTED); - mInputText.setContentDescription(null); - } - } - private void initializeSelectorWheel() { initializeSelectorWheelIndices(); int[] selectorIndices = mSelectorIndices; int totalTextHeight = selectorIndices.length * mTextSize; float totalTextGapHeight = (mBottom - mTop) - totalTextHeight; - float textGapCount = selectorIndices.length - 1; + float textGapCount = selectorIndices.length; mSelectorTextGapHeight = (int) (totalTextGapHeight / textGapCount + 0.5f); mSelectorElementHeight = mTextSize + mSelectorTextGapHeight; - // Ensure that the middle item is positioned the same as the text in mInputText + // Ensure that the middle item is positioned the same as the text in + // mInputText int editTextTextPosition = mInputText.getBaseline() + mInputText.getTop(); - mInitialScrollOffset = editTextTextPosition - - (mSelectorElementHeight * SELECTOR_MIDDLE_ITEM_INDEX); + mInitialScrollOffset = editTextTextPosition + - (mSelectorElementHeight * SELECTOR_MIDDLE_ITEM_INDEX); mCurrentScrollOffset = mInitialScrollOffset; updateInputTextView(); } @@ -1612,16 +1552,14 @@ public class NumberPicker extends LinearLayout { */ private void onScrollerFinished(Scroller scroller) { if (scroller == mFlingScroller) { - if (mSelectorWheelState == SELECTOR_WHEEL_STATE_LARGE) { - postAdjustScrollerCommand(0); - onScrollStateChange(OnScrollListener.SCROLL_STATE_IDLE); - } else { + if (!ensureScrollWheelAdjusted()) { updateInputTextView(); - fadeSelectorWheel(mShowInputControlsAnimimationDuration); } + onScrollStateChange(OnScrollListener.SCROLL_STATE_IDLE); } else { - updateInputTextView(); - showInputControls(mShowInputControlsAnimimationDuration); + if (mScrollState != OnScrollListener.SCROLL_STATE_TOUCH_SCROLL) { + updateInputTextView(); + } } } @@ -1654,56 +1592,6 @@ public class NumberPicker extends LinearLayout { } /** - * Hides the input controls which is the up/down arrows and the text field. - */ - private void hideInputControls() { - mShowInputControlsAnimator.cancel(); - mIncrementButton.setVisibility(INVISIBLE); - mDecrementButton.setVisibility(INVISIBLE); - mInputText.setVisibility(INVISIBLE); - } - - /** - * Show the input controls by making them visible and animating the alpha - * property up/down arrows. - * - * @param animationDuration The duration of the animation. - */ - private void showInputControls(long animationDuration) { - updateIncrementAndDecrementButtonsVisibilityState(); - mInputText.setVisibility(VISIBLE); - mShowInputControlsAnimator.setDuration(animationDuration); - mShowInputControlsAnimator.start(); - } - - /** - * Fade the selector wheel via an animation. - * - * @param animationDuration The duration of the animation. - */ - private void fadeSelectorWheel(long animationDuration) { - mInputText.setVisibility(VISIBLE); - mDimSelectorWheelAnimator.setDuration(animationDuration); - mDimSelectorWheelAnimator.start(); - } - - /** - * Updates the visibility state of the increment and decrement buttons. - */ - private void updateIncrementAndDecrementButtonsVisibilityState() { - if (mWrapSelectorWheel || mValue < mMaxValue) { - mIncrementButton.setVisibility(VISIBLE); - } else { - mIncrementButton.setVisibility(INVISIBLE); - } - if (mWrapSelectorWheel || mValue > mMinValue) { - mDecrementButton.setVisibility(VISIBLE); - } else { - mDecrementButton.setVisibility(INVISIBLE); - } - } - - /** * @return The wrapped index <code>selectorIndex</code> value. */ private int getWrappedSelectorIndex(int selectorIndex) { @@ -1749,8 +1637,7 @@ public class NumberPicker extends LinearLayout { /** * Ensures we have a cached string representation of the given <code> - * selectorIndex</code> - * to avoid multiple instantiations of the same string. + * selectorIndex</code> to avoid multiple instantiations of the same string. */ private void ensureCachedScrollSelectorValue(int selectorIndex) { SparseArray<String> cache = mSelectorIndexToStringCache; @@ -1783,7 +1670,7 @@ public class NumberPicker extends LinearLayout { } else { // Check the new value and ensure it's in range int current = getSelectedPos(str.toString()); - changeCurrent(current); + setValueInternal(current, true); } } @@ -1792,25 +1679,23 @@ public class NumberPicker extends LinearLayout { * the string corresponding to the index specified by the current value will * be returned. Otherwise, the formatter specified in {@link #setFormatter} * will be used to format the number. + * + * @return Whether the text was updated. */ - private void updateInputTextView() { + private boolean updateInputTextView() { /* * If we don't have displayed values then use the current number else * find the correct value in the displayed values for the current * number. */ - if (mDisplayedValues == null) { - mInputText.setText(formatNumber(mValue)); - } else { - mInputText.setText(mDisplayedValues[mValue - mMinValue]); + String text = (mDisplayedValues == null) ? formatNumber(mValue) + : mDisplayedValues[mValue - mMinValue]; + if (!TextUtils.isEmpty(text) && !text.equals(mInputText.getText().toString())) { + mInputText.setText(text); + return true; } - mInputText.setSelection(mInputText.getText().length()); - if (mFlingable && AccessibilityManager.getInstance(mContext).isEnabled()) { - String text = mContext.getString(R.string.number_picker_increment_scroll_mode, - mInputText.getText()); - mInputText.setContentDescription(text); - } + return false; } /** @@ -1828,14 +1713,45 @@ public class NumberPicker extends LinearLayout { * * @param increment Whether to increment or decrement the value. */ - private void postChangeCurrentByOneFromLongPress(boolean increment) { - mInputText.clearFocus(); - removeAllCallbacks(); + private void postChangeCurrentByOneFromLongPress(boolean increment, long delayMillis) { if (mChangeCurrentByOneFromLongPressCommand == null) { mChangeCurrentByOneFromLongPressCommand = new ChangeCurrentByOneFromLongPressCommand(); + } else { + removeCallbacks(mChangeCurrentByOneFromLongPressCommand); + } + mChangeCurrentByOneFromLongPressCommand.setStep(increment); + postDelayed(mChangeCurrentByOneFromLongPressCommand, delayMillis); + } + + /** + * Removes the command for changing the current value by one. + */ + private void removeChangeCurrentByOneFromLongPress() { + if (mChangeCurrentByOneFromLongPressCommand != null) { + removeCallbacks(mChangeCurrentByOneFromLongPressCommand); + } + } + + /** + * Posts a command for beginning an edit of the current value via IME on + * long press. + */ + private void postBeginSoftInputOnLongPressCommand() { + if (mBeginSoftInputOnLongPressCommand == null) { + mBeginSoftInputOnLongPressCommand = new BeginSoftInputOnLongPressCommand(); + } else { + removeCallbacks(mBeginSoftInputOnLongPressCommand); + } + postDelayed(mBeginSoftInputOnLongPressCommand, ViewConfiguration.getLongPressTimeout()); + } + + /** + * Removes the command for beginning an edit of the current value via IME. + */ + private void removeBeginSoftInputCommand() { + if (mBeginSoftInputOnLongPressCommand != null) { + removeCallbacks(mBeginSoftInputOnLongPressCommand); } - mChangeCurrentByOneFromLongPressCommand.setIncrement(increment); - post(mChangeCurrentByOneFromLongPressCommand); } /** @@ -1845,12 +1761,12 @@ public class NumberPicker extends LinearLayout { if (mChangeCurrentByOneFromLongPressCommand != null) { removeCallbacks(mChangeCurrentByOneFromLongPressCommand); } - if (mAdjustScrollerCommand != null) { - removeCallbacks(mAdjustScrollerCommand); - } if (mSetSelectionCommand != null) { removeCallbacks(mSetSelectionCommand); } + if (mBeginSoftInputOnLongPressCommand != null) { + removeCallbacks(mBeginSoftInputOnLongPressCommand); + } } /** @@ -1888,8 +1804,7 @@ public class NumberPicker extends LinearLayout { /** * Posts an {@link SetSelectionCommand} from the given <code>selectionStart - * </code> to - * <code>selectionEnd</code>. + * </code> to <code>selectionEnd</code>. */ private void postSetSelectionCommand(int selectionStart, int selectionEnd) { if (mSetSelectionCommand == null) { @@ -1903,20 +1818,6 @@ public class NumberPicker extends LinearLayout { } /** - * Posts an {@link AdjustScrollerCommand} within the given <code> - * delayMillis</code> - * . - */ - private void postAdjustScrollerCommand(int delayMillis) { - if (mAdjustScrollerCommand == null) { - mAdjustScrollerCommand = new AdjustScrollerCommand(); - } else { - removeCallbacks(mAdjustScrollerCommand); - } - postDelayed(mAdjustScrollerCommand, delayMillis); - } - - /** * Filter for accepting only valid indices or prefixes of the string * representation of valid indices. */ @@ -1934,8 +1835,8 @@ public class NumberPicker extends LinearLayout { } @Override - public CharSequence filter(CharSequence source, int start, int end, Spanned dest, - int dstart, int dend) { + public CharSequence filter( + CharSequence source, int start, int end, Spanned dest, int dstart, int dend) { if (mDisplayedValues == null) { CharSequence filtered = super.filter(source, start, end, dest, dstart, dend); if (filtered == null) { @@ -1981,6 +1882,27 @@ public class NumberPicker extends LinearLayout { } /** + * Ensures that the scroll wheel is adjusted i.e. there is no offset and the + * middle element is in the middle of the widget. + * + * @return Whether an adjustment has been made. + */ + private boolean ensureScrollWheelAdjusted() { + // adjust to the closest value + int deltaY = mInitialScrollOffset - mCurrentScrollOffset; + if (deltaY != 0) { + mPreviousScrollerY = 0; + if (Math.abs(deltaY) > mSelectorElementHeight / 2) { + deltaY += (deltaY > 0) ? -mSelectorElementHeight : mSelectorElementHeight; + } + mAdjustScroller.startScroll(0, 0, 0, deltaY, SELECTOR_ADJUSTMENT_DURATION_MILLIS); + invalidate(); + return true; + } + return false; + } + + /** * Command for setting the input text selection. */ class SetSelectionCommand implements Runnable { @@ -1994,39 +1916,18 @@ public class NumberPicker extends LinearLayout { } /** - * Command for adjusting the scroller to show in its center the closest of - * the displayed items. - */ - class AdjustScrollerCommand implements Runnable { - public void run() { - mPreviousScrollerY = 0; - if (mInitialScrollOffset == mCurrentScrollOffset) { - updateInputTextView(); - showInputControls(mShowInputControlsAnimimationDuration); - return; - } - // adjust to the closest value - int deltaY = mInitialScrollOffset - mCurrentScrollOffset; - if (Math.abs(deltaY) > mSelectorElementHeight / 2) { - deltaY += (deltaY > 0) ? -mSelectorElementHeight : mSelectorElementHeight; - } - mAdjustScroller.startScroll(0, 0, 0, deltaY, SELECTOR_ADJUSTMENT_DURATION_MILLIS); - invalidate(); - } - } - - /** * Command for changing the current value from a long press by one. */ class ChangeCurrentByOneFromLongPressCommand implements Runnable { private boolean mIncrement; - private void setIncrement(boolean increment) { + private void setStep(boolean increment) { mIncrement = increment; } + @Override public void run() { - changeCurrentByOne(mIncrement); + changeValueByOne(mIncrement); postDelayed(this, mLongPressUpdateInterval); } } @@ -2048,4 +1949,248 @@ public class NumberPicker extends LinearLayout { } } } + + /** + * Command for beginning soft input on long press. + */ + class BeginSoftInputOnLongPressCommand implements Runnable { + + @Override + public void run() { + showSoftInput(); + mIngonreMoveEvents = true; + } + } + + class AccessibilityNodeProviderImpl extends AccessibilityNodeProvider { + private static final int VIRTUAL_VIEW_ID_INCREMENT = 1; + + private static final int VIRTUAL_VIEW_ID_INPUT = 2; + + private static final int VIRTUAL_VIEW_ID_DECREMENT = 3; + + private final Rect mTempRect = new Rect(); + + private final int[] mTempArray = new int[2]; + + @Override + public AccessibilityNodeInfo createAccessibilityNodeInfo(int virtualViewId) { + switch (virtualViewId) { + case View.NO_ID: + return createAccessibilityNodeInfoForNumberPicker( mScrollX, mScrollY, + mScrollX + (mRight - mLeft), mScrollY + (mBottom - mTop)); + case VIRTUAL_VIEW_ID_DECREMENT: + return createAccessibilityNodeInfoForVirtualButton(VIRTUAL_VIEW_ID_DECREMENT, + getVirtualDecrementButtonText(), mScrollX, mScrollY, + mScrollX + (mRight - mLeft), + mTopSelectionDividerTop + mSelectionDividerHeight); + case VIRTUAL_VIEW_ID_INPUT: + return createAccessibiltyNodeInfoForInputText(); + case VIRTUAL_VIEW_ID_INCREMENT: + return createAccessibilityNodeInfoForVirtualButton(VIRTUAL_VIEW_ID_INCREMENT, + getVirtualIncrementButtonText(), mScrollX, + mBottomSelectionDividerBottom - mSelectionDividerHeight, + mScrollX + (mRight - mLeft), mScrollY + (mBottom - mTop)); + } + return super.createAccessibilityNodeInfo(virtualViewId); + } + + @Override + public List<AccessibilityNodeInfo> findAccessibilityNodeInfosByText(String searched, + int virtualViewId) { + if (TextUtils.isEmpty(searched)) { + return Collections.emptyList(); + } + String searchedLowerCase = searched.toLowerCase(); + List<AccessibilityNodeInfo> result = new ArrayList<AccessibilityNodeInfo>(); + switch (virtualViewId) { + case View.NO_ID: { + findAccessibilityNodeInfosByTextInChild(searchedLowerCase, + VIRTUAL_VIEW_ID_DECREMENT, result); + findAccessibilityNodeInfosByTextInChild(searchedLowerCase, + VIRTUAL_VIEW_ID_INPUT, result); + findAccessibilityNodeInfosByTextInChild(searchedLowerCase, + VIRTUAL_VIEW_ID_INCREMENT, result); + return result; + } + case VIRTUAL_VIEW_ID_DECREMENT: + case VIRTUAL_VIEW_ID_INCREMENT: + case VIRTUAL_VIEW_ID_INPUT: { + findAccessibilityNodeInfosByTextInChild(searchedLowerCase, virtualViewId, + result); + return result; + } + } + return super.findAccessibilityNodeInfosByText(searched, virtualViewId); + } + + @Override + public boolean performAccessibilityAction(int action, int virtualViewId) { + switch (virtualViewId) { + case VIRTUAL_VIEW_ID_INPUT: { + switch (action) { + case AccessibilityNodeInfo.ACTION_FOCUS: { + if (!mInputText.isFocused()) { + return mInputText.requestFocus(); + } + } break; + case AccessibilityNodeInfo.ACTION_CLEAR_FOCUS: { + if (mInputText.isFocused()) { + mInputText.clearFocus(); + return true; + } + } break; + } + } break; + } + return super.performAccessibilityAction(action, virtualViewId); + } + + public void sendAccessibilityEventForVirtualView(int virtualViewId, int eventType) { + switch (virtualViewId) { + case VIRTUAL_VIEW_ID_DECREMENT: { + sendAccessibilityEventForVirtualButton(virtualViewId, eventType, + getVirtualDecrementButtonText()); + } break; + case VIRTUAL_VIEW_ID_INPUT: { + sendAccessibilityEventForVirtualText(eventType); + } break; + case VIRTUAL_VIEW_ID_INCREMENT: { + sendAccessibilityEventForVirtualButton(virtualViewId, eventType, + getVirtualIncrementButtonText()); + } break; + } + } + + private void sendAccessibilityEventForVirtualText(int eventType) { + AccessibilityEvent event = AccessibilityEvent.obtain(eventType); + mInputText.onInitializeAccessibilityEvent(event); + mInputText.onPopulateAccessibilityEvent(event); + event.setSource(NumberPicker.this, VIRTUAL_VIEW_ID_INPUT); + requestSendAccessibilityEvent(NumberPicker.this, event); + } + + private void sendAccessibilityEventForVirtualButton(int virtualViewId, int eventType, + String text) { + AccessibilityEvent event = AccessibilityEvent.obtain(eventType); + event.setClassName(Button.class.getName()); + event.setPackageName(mContext.getPackageName()); + event.getText().add(text); + event.setEnabled(NumberPicker.this.isEnabled()); + event.setSource(NumberPicker.this, virtualViewId); + requestSendAccessibilityEvent(NumberPicker.this, event); + } + + private void findAccessibilityNodeInfosByTextInChild(String searchedLowerCase, + int virtualViewId, List<AccessibilityNodeInfo> outResult) { + switch (virtualViewId) { + case VIRTUAL_VIEW_ID_DECREMENT: { + String text = getVirtualDecrementButtonText(); + if (!TextUtils.isEmpty(text) + && text.toString().toLowerCase().contains(searchedLowerCase)) { + outResult.add(createAccessibilityNodeInfo(VIRTUAL_VIEW_ID_DECREMENT)); + } + } return; + case VIRTUAL_VIEW_ID_INPUT: { + CharSequence text = mInputText.getText(); + if (!TextUtils.isEmpty(text) && + text.toString().toLowerCase().contains(searchedLowerCase)) { + outResult.add(createAccessibilityNodeInfo(VIRTUAL_VIEW_ID_INPUT)); + return; + } + CharSequence contentDesc = mInputText.getText(); + if (!TextUtils.isEmpty(contentDesc) && + contentDesc.toString().toLowerCase().contains(searchedLowerCase)) { + outResult.add(createAccessibilityNodeInfo(VIRTUAL_VIEW_ID_INPUT)); + return; + } + } break; + case VIRTUAL_VIEW_ID_INCREMENT: { + String text = getVirtualIncrementButtonText(); + if (!TextUtils.isEmpty(text) + && text.toString().toLowerCase().contains(searchedLowerCase)) { + outResult.add(createAccessibilityNodeInfo(VIRTUAL_VIEW_ID_INCREMENT)); + } + } return; + } + } + + private AccessibilityNodeInfo createAccessibiltyNodeInfoForInputText() { + AccessibilityNodeInfo info = mInputText.createAccessibilityNodeInfo(); + info.setLongClickable(true); + info.setSource(NumberPicker.this, VIRTUAL_VIEW_ID_INPUT); + return info; + } + + private AccessibilityNodeInfo createAccessibilityNodeInfoForVirtualButton(int virtualViewId, + String text, int left, int top, int right, int bottom) { + AccessibilityNodeInfo info = AccessibilityNodeInfo.obtain(); + info.setClassName(Button.class.getName()); + info.setPackageName(mContext.getPackageName()); + info.setSource(NumberPicker.this, virtualViewId); + info.setParent(NumberPicker.this); + info.addChild(NumberPicker.this, VIRTUAL_VIEW_ID_DECREMENT); + info.addChild(NumberPicker.this, VIRTUAL_VIEW_ID_INPUT); + info.addChild(NumberPicker.this, VIRTUAL_VIEW_ID_INCREMENT); + info.setText(text); + info.setClickable(true); + info.setLongClickable(true); + info.setEnabled(NumberPicker.this.isEnabled()); + Rect boundsInParent = mTempRect; + boundsInParent.set(left, top, right, bottom); + info.setBoundsInParent(boundsInParent); + Rect boundsInScreen = boundsInParent; + int[] locationOnScreen = mTempArray; + getLocationOnScreen(locationOnScreen); + boundsInScreen.offsetTo(0, 0); + boundsInScreen.offset(locationOnScreen[0], locationOnScreen[1]); + info.setBoundsInScreen(boundsInScreen); + return info; + } + + private AccessibilityNodeInfo createAccessibilityNodeInfoForNumberPicker(int left, int top, + int right, int bottom) { + AccessibilityNodeInfo info = AccessibilityNodeInfo.obtain(); + info.setClassName(Button.class.getName()); + info.setPackageName(mContext.getPackageName()); + info.setSource(NumberPicker.this); + info.setParent((View) getParent()); + info.setEnabled(NumberPicker.this.isEnabled()); + info.setScrollable(true); + Rect boundsInParent = mTempRect; + boundsInParent.set(left, top, right, bottom); + info.setBoundsInParent(boundsInParent); + Rect boundsInScreen = boundsInParent; + int[] locationOnScreen = mTempArray; + getLocationOnScreen(locationOnScreen); + boundsInScreen.offsetTo(0, 0); + boundsInScreen.offset(locationOnScreen[0], locationOnScreen[1]); + info.setBoundsInScreen(boundsInScreen); + return info; + } + + private String getVirtualDecrementButtonText() { + int value = mValue - 1; + if (mWrapSelectorWheel) { + value = getWrappedSelectorIndex(value); + } + if (value >= mMinValue) { + return (mDisplayedValues == null) ? formatNumber(value) + : mDisplayedValues[value - mMinValue]; + } + return null; + } + + private String getVirtualIncrementButtonText() { + int value = mValue + 1; + if (mWrapSelectorWheel) { + value = getWrappedSelectorIndex(value); + } + if (value <= mMaxValue) { + return (mDisplayedValues == null) ? formatNumber(value) + : mDisplayedValues[value - mMinValue]; + } + return null; + } + } } diff --git a/core/java/android/widget/ScrollView.java b/core/java/android/widget/ScrollView.java index 25dd438..e0e3e93 100644 --- a/core/java/android/widget/ScrollView.java +++ b/core/java/android/widget/ScrollView.java @@ -642,8 +642,7 @@ public class ScrollView extends FrameLayout { break; case MotionEvent.ACTION_POINTER_DOWN: { final int index = ev.getActionIndex(); - final float y = ev.getY(index); - mLastMotionY = y; + mLastMotionY = ev.getY(index); mActivePointerId = ev.getPointerId(index); break; } @@ -715,6 +714,7 @@ public class ScrollView extends FrameLayout { } else { super.scrollTo(scrollX, scrollY); } + awakenScrollBars(); } @@ -749,42 +749,6 @@ public class ScrollView extends FrameLayout { /** * <p> - * Finds the next focusable component that fits in this View's bounds - * (excluding fading edges) pretending that this View's top is located at - * the parameter top. - * </p> - * - * @param topFocus look for a candidate at the top of the bounds if topFocus is true, - * or at the bottom of the bounds if topFocus is false - * @param top the top offset of the bounds in which a focusable must be - * found (the fading edge is assumed to start at this position) - * @param preferredFocusable the View that has highest priority and will be - * returned if it is within my bounds (null is valid) - * @return the next focusable component in the bounds or null if none can be found - */ - private View findFocusableViewInMyBounds(final boolean topFocus, - final int top, View preferredFocusable) { - /* - * The fading edge's transparent side should be considered for focus - * since it's mostly visible, so we divide the actual fading edge length - * by 2. - */ - final int fadingEdgeLength = getVerticalFadingEdgeLength() / 2; - final int topWithoutFadingEdge = top + fadingEdgeLength; - final int bottomWithoutFadingEdge = top + getHeight() - fadingEdgeLength; - - if ((preferredFocusable != null) - && (preferredFocusable.getTop() < bottomWithoutFadingEdge) - && (preferredFocusable.getBottom() > topWithoutFadingEdge)) { - return preferredFocusable; - } - - return findFocusableViewInBounds(topFocus, topWithoutFadingEdge, - bottomWithoutFadingEdge); - } - - /** - * <p> * Finds the next focusable component that fits in the specified bounds. * </p> * @@ -1208,10 +1172,10 @@ public class ScrollView extends FrameLayout { } } - awakenScrollBars(); - - // Keep on drawing until the animation has finished. - postInvalidate(); + if (!awakenScrollBars()) { + // Keep on drawing until the animation has finished. + invalidate(); + } } else { if (mFlingStrictSpan != null) { mFlingStrictSpan.finish(); @@ -1438,7 +1402,7 @@ public class ScrollView extends FrameLayout { /** * Return true if child is a descendant of parent, (or equal to the parent). */ - private boolean isViewDescendantOf(View child, View parent) { + private static boolean isViewDescendantOf(View child, View parent) { if (child == parent) { return true; } @@ -1462,8 +1426,6 @@ public class ScrollView extends FrameLayout { mScroller.fling(mScrollX, mScrollY, 0, velocityY, 0, 0, 0, Math.max(0, bottom - height), 0, height/2); - final boolean movingDown = velocityY > 0; - if (mFlingStrictSpan == null) { mFlingStrictSpan = StrictMode.enterCriticalSpan("ScrollView-fling"); } @@ -1554,7 +1516,7 @@ public class ScrollView extends FrameLayout { } } - private int clamp(int n, int my, int child) { + private static int clamp(int n, int my, int child) { if (my >= child || n < 0) { /* my >= child is this case: * |--------------- me ---------------| diff --git a/core/java/android/widget/TextView.java b/core/java/android/widget/TextView.java index 9941c95..3c63b17 100644 --- a/core/java/android/widget/TextView.java +++ b/core/java/android/widget/TextView.java @@ -11680,7 +11680,7 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener highlight = null; } - if (canHaveDisplayList() && canvas.isHardwareAccelerated()) { + if (false /* TEMP patch for bugs 6198276 & 6193544 */ && canHaveDisplayList() && canvas.isHardwareAccelerated()) { drawHardwareAccelerated(canvas, layout, highlight, cursorOffsetVertical); } else { layout.draw(canvas, highlight, mHighlightPaint, cursorOffsetVertical); diff --git a/core/java/android/widget/TimePicker.java b/core/java/android/widget/TimePicker.java index 7eff1aa..bc88b62 100644 --- a/core/java/android/widget/TimePicker.java +++ b/core/java/android/widget/TimePicker.java @@ -532,21 +532,28 @@ public class TimePicker extends FrameLayout { private void setContentDescriptions() { // Minute - String text = mContext.getString(R.string.time_picker_increment_minute_button); - mMinuteSpinner.findViewById(R.id.increment).setContentDescription(text); - text = mContext.getString(R.string.time_picker_decrement_minute_button); - mMinuteSpinner.findViewById(R.id.decrement).setContentDescription(text); + trySetContentDescription(mMinuteSpinner, R.id.increment, + R.string.time_picker_increment_minute_button); + trySetContentDescription(mMinuteSpinner, R.id.decrement, + R.string.time_picker_decrement_minute_button); // Hour - text = mContext.getString(R.string.time_picker_increment_hour_button); - mHourSpinner.findViewById(R.id.increment).setContentDescription(text); - text = mContext.getString(R.string.time_picker_decrement_hour_button); - mHourSpinner.findViewById(R.id.decrement).setContentDescription(text); + trySetContentDescription(mHourSpinner, R.id.increment, + R.string.time_picker_increment_hour_button); + trySetContentDescription(mHourSpinner, R.id.decrement, + R.string.time_picker_decrement_hour_button); // AM/PM if (mAmPmSpinner != null) { - text = mContext.getString(R.string.time_picker_increment_set_pm_button); - mAmPmSpinner.findViewById(R.id.increment).setContentDescription(text); - text = mContext.getString(R.string.time_picker_decrement_set_am_button); - mAmPmSpinner.findViewById(R.id.decrement).setContentDescription(text); + trySetContentDescription(mAmPmSpinner, R.id.increment, + R.string.time_picker_increment_set_pm_button); + trySetContentDescription(mAmPmSpinner, R.id.decrement, + R.string.time_picker_decrement_set_am_button); + } + } + + private void trySetContentDescription(View root, int viewId, int contDescResId) { + View target = root.findViewById(viewId); + if (target != null) { + target.setContentDescription(mContext.getString(contDescResId)); } } diff --git a/core/res/res/drawable-hdpi/ic_facial_backup.png b/core/res/res/drawable-hdpi/ic_facial_backup.png Binary files differnew file mode 100644 index 0000000..2956109 --- /dev/null +++ b/core/res/res/drawable-hdpi/ic_facial_backup.png diff --git a/core/res/res/drawable-hdpi/intro_bg.png b/core/res/res/drawable-hdpi/intro_bg.png Binary files differnew file mode 100644 index 0000000..a758e7d --- /dev/null +++ b/core/res/res/drawable-hdpi/intro_bg.png diff --git a/core/res/res/drawable-hdpi/numberpicker_down_disabled_focused_holo_dark.png b/core/res/res/drawable-hdpi/numberpicker_down_disabled_focused_holo_dark.png Binary files differdeleted file mode 100644 index 9584649..0000000 --- a/core/res/res/drawable-hdpi/numberpicker_down_disabled_focused_holo_dark.png +++ /dev/null diff --git a/core/res/res/drawable-hdpi/numberpicker_down_disabled_focused_holo_light.png b/core/res/res/drawable-hdpi/numberpicker_down_disabled_focused_holo_light.png Binary files differdeleted file mode 100644 index 5c37873..0000000 --- a/core/res/res/drawable-hdpi/numberpicker_down_disabled_focused_holo_light.png +++ /dev/null diff --git a/core/res/res/drawable-hdpi/numberpicker_down_disabled_holo_dark.png b/core/res/res/drawable-hdpi/numberpicker_down_disabled_holo_dark.png Binary files differdeleted file mode 100644 index b5faf6f..0000000 --- a/core/res/res/drawable-hdpi/numberpicker_down_disabled_holo_dark.png +++ /dev/null diff --git a/core/res/res/drawable-hdpi/numberpicker_down_disabled_holo_light.png b/core/res/res/drawable-hdpi/numberpicker_down_disabled_holo_light.png Binary files differdeleted file mode 100644 index 041412b..0000000 --- a/core/res/res/drawable-hdpi/numberpicker_down_disabled_holo_light.png +++ /dev/null diff --git a/core/res/res/drawable-hdpi/numberpicker_down_focused_holo_dark.png b/core/res/res/drawable-hdpi/numberpicker_down_focused_holo_dark.png Binary files differdeleted file mode 100644 index 5717bee..0000000 --- a/core/res/res/drawable-hdpi/numberpicker_down_focused_holo_dark.png +++ /dev/null diff --git a/core/res/res/drawable-hdpi/numberpicker_down_focused_holo_light.png b/core/res/res/drawable-hdpi/numberpicker_down_focused_holo_light.png Binary files differdeleted file mode 100644 index e874330..0000000 --- a/core/res/res/drawable-hdpi/numberpicker_down_focused_holo_light.png +++ /dev/null diff --git a/core/res/res/drawable-hdpi/numberpicker_down_longpressed_holo_dark.png b/core/res/res/drawable-hdpi/numberpicker_down_longpressed_holo_dark.png Binary files differdeleted file mode 100644 index 96a6c8a..0000000 --- a/core/res/res/drawable-hdpi/numberpicker_down_longpressed_holo_dark.png +++ /dev/null diff --git a/core/res/res/drawable-hdpi/numberpicker_down_longpressed_holo_light.png b/core/res/res/drawable-hdpi/numberpicker_down_longpressed_holo_light.png Binary files differdeleted file mode 100644 index 96a6c8a..0000000 --- a/core/res/res/drawable-hdpi/numberpicker_down_longpressed_holo_light.png +++ /dev/null diff --git a/core/res/res/drawable-hdpi/numberpicker_down_normal_holo_dark.png b/core/res/res/drawable-hdpi/numberpicker_down_normal_holo_dark.png Binary files differdeleted file mode 100644 index 4631d85..0000000 --- a/core/res/res/drawable-hdpi/numberpicker_down_normal_holo_dark.png +++ /dev/null diff --git a/core/res/res/drawable-hdpi/numberpicker_down_normal_holo_light.png b/core/res/res/drawable-hdpi/numberpicker_down_normal_holo_light.png Binary files differdeleted file mode 100644 index 39c7af4..0000000 --- a/core/res/res/drawable-hdpi/numberpicker_down_normal_holo_light.png +++ /dev/null diff --git a/core/res/res/drawable-hdpi/numberpicker_down_pressed_holo_dark.png b/core/res/res/drawable-hdpi/numberpicker_down_pressed_holo_dark.png Binary files differdeleted file mode 100644 index 9c23a18..0000000 --- a/core/res/res/drawable-hdpi/numberpicker_down_pressed_holo_dark.png +++ /dev/null diff --git a/core/res/res/drawable-hdpi/numberpicker_down_pressed_holo_light.png b/core/res/res/drawable-hdpi/numberpicker_down_pressed_holo_light.png Binary files differdeleted file mode 100644 index 9c23a18..0000000 --- a/core/res/res/drawable-hdpi/numberpicker_down_pressed_holo_light.png +++ /dev/null diff --git a/core/res/res/drawable-hdpi/numberpicker_up_disabled_focused_holo_dark.png b/core/res/res/drawable-hdpi/numberpicker_up_disabled_focused_holo_dark.png Binary files differdeleted file mode 100644 index 159913c..0000000 --- a/core/res/res/drawable-hdpi/numberpicker_up_disabled_focused_holo_dark.png +++ /dev/null diff --git a/core/res/res/drawable-hdpi/numberpicker_up_disabled_focused_holo_light.png b/core/res/res/drawable-hdpi/numberpicker_up_disabled_focused_holo_light.png Binary files differdeleted file mode 100644 index cfee4b7..0000000 --- a/core/res/res/drawable-hdpi/numberpicker_up_disabled_focused_holo_light.png +++ /dev/null diff --git a/core/res/res/drawable-hdpi/numberpicker_up_disabled_holo_dark.png b/core/res/res/drawable-hdpi/numberpicker_up_disabled_holo_dark.png Binary files differdeleted file mode 100644 index e5f0430..0000000 --- a/core/res/res/drawable-hdpi/numberpicker_up_disabled_holo_dark.png +++ /dev/null diff --git a/core/res/res/drawable-hdpi/numberpicker_up_disabled_holo_light.png b/core/res/res/drawable-hdpi/numberpicker_up_disabled_holo_light.png Binary files differdeleted file mode 100644 index 7e4ec4a..0000000 --- a/core/res/res/drawable-hdpi/numberpicker_up_disabled_holo_light.png +++ /dev/null diff --git a/core/res/res/drawable-hdpi/numberpicker_up_focused_holo_dark.png b/core/res/res/drawable-hdpi/numberpicker_up_focused_holo_dark.png Binary files differdeleted file mode 100644 index b06017e..0000000 --- a/core/res/res/drawable-hdpi/numberpicker_up_focused_holo_dark.png +++ /dev/null diff --git a/core/res/res/drawable-hdpi/numberpicker_up_focused_holo_light.png b/core/res/res/drawable-hdpi/numberpicker_up_focused_holo_light.png Binary files differdeleted file mode 100644 index a1000f8..0000000 --- a/core/res/res/drawable-hdpi/numberpicker_up_focused_holo_light.png +++ /dev/null diff --git a/core/res/res/drawable-hdpi/numberpicker_up_longpressed_holo_dark.png b/core/res/res/drawable-hdpi/numberpicker_up_longpressed_holo_dark.png Binary files differdeleted file mode 100644 index b3d6706..0000000 --- a/core/res/res/drawable-hdpi/numberpicker_up_longpressed_holo_dark.png +++ /dev/null diff --git a/core/res/res/drawable-hdpi/numberpicker_up_longpressed_holo_light.png b/core/res/res/drawable-hdpi/numberpicker_up_longpressed_holo_light.png Binary files differdeleted file mode 100644 index b3d6706..0000000 --- a/core/res/res/drawable-hdpi/numberpicker_up_longpressed_holo_light.png +++ /dev/null diff --git a/core/res/res/drawable-hdpi/numberpicker_up_normal_holo_dark.png b/core/res/res/drawable-hdpi/numberpicker_up_normal_holo_dark.png Binary files differdeleted file mode 100644 index 9ee35c7..0000000 --- a/core/res/res/drawable-hdpi/numberpicker_up_normal_holo_dark.png +++ /dev/null diff --git a/core/res/res/drawable-hdpi/numberpicker_up_normal_holo_light.png b/core/res/res/drawable-hdpi/numberpicker_up_normal_holo_light.png Binary files differdeleted file mode 100644 index 4da4fa7..0000000 --- a/core/res/res/drawable-hdpi/numberpicker_up_normal_holo_light.png +++ /dev/null diff --git a/core/res/res/drawable-hdpi/numberpicker_up_pressed_holo_dark.png b/core/res/res/drawable-hdpi/numberpicker_up_pressed_holo_dark.png Binary files differdeleted file mode 100644 index 358a13f..0000000 --- a/core/res/res/drawable-hdpi/numberpicker_up_pressed_holo_dark.png +++ /dev/null diff --git a/core/res/res/drawable-hdpi/numberpicker_up_pressed_holo_light.png b/core/res/res/drawable-hdpi/numberpicker_up_pressed_holo_light.png Binary files differdeleted file mode 100644 index 358a13f..0000000 --- a/core/res/res/drawable-hdpi/numberpicker_up_pressed_holo_light.png +++ /dev/null diff --git a/core/res/res/drawable-mdpi/ic_facial_backup.png b/core/res/res/drawable-mdpi/ic_facial_backup.png Binary files differnew file mode 100644 index 0000000..6ed1327 --- /dev/null +++ b/core/res/res/drawable-mdpi/ic_facial_backup.png diff --git a/core/res/res/drawable-mdpi/intro_bg.png b/core/res/res/drawable-mdpi/intro_bg.png Binary files differnew file mode 100644 index 0000000..540da31 --- /dev/null +++ b/core/res/res/drawable-mdpi/intro_bg.png diff --git a/core/res/res/drawable-mdpi/numberpicker_down_disabled_focused_holo_dark.png b/core/res/res/drawable-mdpi/numberpicker_down_disabled_focused_holo_dark.png Binary files differdeleted file mode 100644 index 50f6e98..0000000 --- a/core/res/res/drawable-mdpi/numberpicker_down_disabled_focused_holo_dark.png +++ /dev/null diff --git a/core/res/res/drawable-mdpi/numberpicker_down_disabled_focused_holo_light.png b/core/res/res/drawable-mdpi/numberpicker_down_disabled_focused_holo_light.png Binary files differdeleted file mode 100644 index 67434f6..0000000 --- a/core/res/res/drawable-mdpi/numberpicker_down_disabled_focused_holo_light.png +++ /dev/null diff --git a/core/res/res/drawable-mdpi/numberpicker_down_disabled_holo_dark.png b/core/res/res/drawable-mdpi/numberpicker_down_disabled_holo_dark.png Binary files differdeleted file mode 100644 index 9c2b833..0000000 --- a/core/res/res/drawable-mdpi/numberpicker_down_disabled_holo_dark.png +++ /dev/null diff --git a/core/res/res/drawable-mdpi/numberpicker_down_disabled_holo_light.png b/core/res/res/drawable-mdpi/numberpicker_down_disabled_holo_light.png Binary files differdeleted file mode 100644 index dcf2fb7..0000000 --- a/core/res/res/drawable-mdpi/numberpicker_down_disabled_holo_light.png +++ /dev/null diff --git a/core/res/res/drawable-mdpi/numberpicker_down_focused_holo_dark.png b/core/res/res/drawable-mdpi/numberpicker_down_focused_holo_dark.png Binary files differdeleted file mode 100644 index b63c510d..0000000 --- a/core/res/res/drawable-mdpi/numberpicker_down_focused_holo_dark.png +++ /dev/null diff --git a/core/res/res/drawable-mdpi/numberpicker_down_focused_holo_light.png b/core/res/res/drawable-mdpi/numberpicker_down_focused_holo_light.png Binary files differdeleted file mode 100644 index 55312a1..0000000 --- a/core/res/res/drawable-mdpi/numberpicker_down_focused_holo_light.png +++ /dev/null diff --git a/core/res/res/drawable-mdpi/numberpicker_down_longpressed_holo_dark.png b/core/res/res/drawable-mdpi/numberpicker_down_longpressed_holo_dark.png Binary files differdeleted file mode 100644 index 48e300c..0000000 --- a/core/res/res/drawable-mdpi/numberpicker_down_longpressed_holo_dark.png +++ /dev/null diff --git a/core/res/res/drawable-mdpi/numberpicker_down_longpressed_holo_light.png b/core/res/res/drawable-mdpi/numberpicker_down_longpressed_holo_light.png Binary files differdeleted file mode 100644 index 48e300c..0000000 --- a/core/res/res/drawable-mdpi/numberpicker_down_longpressed_holo_light.png +++ /dev/null diff --git a/core/res/res/drawable-mdpi/numberpicker_down_normal_holo_dark.png b/core/res/res/drawable-mdpi/numberpicker_down_normal_holo_dark.png Binary files differdeleted file mode 100644 index 1558d3d..0000000 --- a/core/res/res/drawable-mdpi/numberpicker_down_normal_holo_dark.png +++ /dev/null diff --git a/core/res/res/drawable-mdpi/numberpicker_down_normal_holo_light.png b/core/res/res/drawable-mdpi/numberpicker_down_normal_holo_light.png Binary files differdeleted file mode 100644 index 6b6e7e1..0000000 --- a/core/res/res/drawable-mdpi/numberpicker_down_normal_holo_light.png +++ /dev/null diff --git a/core/res/res/drawable-mdpi/numberpicker_down_pressed_holo_dark.png b/core/res/res/drawable-mdpi/numberpicker_down_pressed_holo_dark.png Binary files differdeleted file mode 100644 index eb16f8d..0000000 --- a/core/res/res/drawable-mdpi/numberpicker_down_pressed_holo_dark.png +++ /dev/null diff --git a/core/res/res/drawable-mdpi/numberpicker_down_pressed_holo_light.png b/core/res/res/drawable-mdpi/numberpicker_down_pressed_holo_light.png Binary files differdeleted file mode 100644 index eb16f8d..0000000 --- a/core/res/res/drawable-mdpi/numberpicker_down_pressed_holo_light.png +++ /dev/null diff --git a/core/res/res/drawable-mdpi/numberpicker_up_disabled_focused_holo_dark.png b/core/res/res/drawable-mdpi/numberpicker_up_disabled_focused_holo_dark.png Binary files differdeleted file mode 100644 index 58a3b64..0000000 --- a/core/res/res/drawable-mdpi/numberpicker_up_disabled_focused_holo_dark.png +++ /dev/null diff --git a/core/res/res/drawable-mdpi/numberpicker_up_disabled_focused_holo_light.png b/core/res/res/drawable-mdpi/numberpicker_up_disabled_focused_holo_light.png Binary files differdeleted file mode 100644 index 382943b..0000000 --- a/core/res/res/drawable-mdpi/numberpicker_up_disabled_focused_holo_light.png +++ /dev/null diff --git a/core/res/res/drawable-mdpi/numberpicker_up_disabled_holo_dark.png b/core/res/res/drawable-mdpi/numberpicker_up_disabled_holo_dark.png Binary files differdeleted file mode 100644 index cf856a1..0000000 --- a/core/res/res/drawable-mdpi/numberpicker_up_disabled_holo_dark.png +++ /dev/null diff --git a/core/res/res/drawable-mdpi/numberpicker_up_disabled_holo_light.png b/core/res/res/drawable-mdpi/numberpicker_up_disabled_holo_light.png Binary files differdeleted file mode 100644 index 6665953..0000000 --- a/core/res/res/drawable-mdpi/numberpicker_up_disabled_holo_light.png +++ /dev/null diff --git a/core/res/res/drawable-mdpi/numberpicker_up_focused_holo_dark.png b/core/res/res/drawable-mdpi/numberpicker_up_focused_holo_dark.png Binary files differdeleted file mode 100644 index d63d797..0000000 --- a/core/res/res/drawable-mdpi/numberpicker_up_focused_holo_dark.png +++ /dev/null diff --git a/core/res/res/drawable-mdpi/numberpicker_up_focused_holo_light.png b/core/res/res/drawable-mdpi/numberpicker_up_focused_holo_light.png Binary files differdeleted file mode 100644 index 22b6dbd..0000000 --- a/core/res/res/drawable-mdpi/numberpicker_up_focused_holo_light.png +++ /dev/null diff --git a/core/res/res/drawable-mdpi/numberpicker_up_longpressed_holo_dark.png b/core/res/res/drawable-mdpi/numberpicker_up_longpressed_holo_dark.png Binary files differdeleted file mode 100644 index 4bcce98..0000000 --- a/core/res/res/drawable-mdpi/numberpicker_up_longpressed_holo_dark.png +++ /dev/null diff --git a/core/res/res/drawable-mdpi/numberpicker_up_longpressed_holo_light.png b/core/res/res/drawable-mdpi/numberpicker_up_longpressed_holo_light.png Binary files differdeleted file mode 100644 index 4bcce98..0000000 --- a/core/res/res/drawable-mdpi/numberpicker_up_longpressed_holo_light.png +++ /dev/null diff --git a/core/res/res/drawable-mdpi/numberpicker_up_normal_holo_dark.png b/core/res/res/drawable-mdpi/numberpicker_up_normal_holo_dark.png Binary files differdeleted file mode 100644 index 12ba823..0000000 --- a/core/res/res/drawable-mdpi/numberpicker_up_normal_holo_dark.png +++ /dev/null diff --git a/core/res/res/drawable-mdpi/numberpicker_up_normal_holo_light.png b/core/res/res/drawable-mdpi/numberpicker_up_normal_holo_light.png Binary files differdeleted file mode 100644 index d841f5a..0000000 --- a/core/res/res/drawable-mdpi/numberpicker_up_normal_holo_light.png +++ /dev/null diff --git a/core/res/res/drawable-mdpi/numberpicker_up_pressed_holo_dark.png b/core/res/res/drawable-mdpi/numberpicker_up_pressed_holo_dark.png Binary files differdeleted file mode 100644 index bc5e3fa..0000000 --- a/core/res/res/drawable-mdpi/numberpicker_up_pressed_holo_dark.png +++ /dev/null diff --git a/core/res/res/drawable-mdpi/numberpicker_up_pressed_holo_light.png b/core/res/res/drawable-mdpi/numberpicker_up_pressed_holo_light.png Binary files differdeleted file mode 100644 index bc5e3fa..0000000 --- a/core/res/res/drawable-mdpi/numberpicker_up_pressed_holo_light.png +++ /dev/null diff --git a/core/res/res/drawable-xhdpi/ic_facial_backup.png b/core/res/res/drawable-xhdpi/ic_facial_backup.png Binary files differnew file mode 100644 index 0000000..942cf23 --- /dev/null +++ b/core/res/res/drawable-xhdpi/ic_facial_backup.png diff --git a/core/res/res/drawable-xhdpi/intro_bg.png b/core/res/res/drawable-xhdpi/intro_bg.png Binary files differnew file mode 100644 index 0000000..00466c5 --- /dev/null +++ b/core/res/res/drawable-xhdpi/intro_bg.png diff --git a/core/res/res/drawable-xhdpi/numberpicker_down_disabled_focused_holo_dark.png b/core/res/res/drawable-xhdpi/numberpicker_down_disabled_focused_holo_dark.png Binary files differdeleted file mode 100644 index 111f57e..0000000 --- a/core/res/res/drawable-xhdpi/numberpicker_down_disabled_focused_holo_dark.png +++ /dev/null diff --git a/core/res/res/drawable-xhdpi/numberpicker_down_disabled_focused_holo_light.png b/core/res/res/drawable-xhdpi/numberpicker_down_disabled_focused_holo_light.png Binary files differdeleted file mode 100644 index d0ef05b..0000000 --- a/core/res/res/drawable-xhdpi/numberpicker_down_disabled_focused_holo_light.png +++ /dev/null diff --git a/core/res/res/drawable-xhdpi/numberpicker_down_disabled_holo_dark.png b/core/res/res/drawable-xhdpi/numberpicker_down_disabled_holo_dark.png Binary files differdeleted file mode 100644 index ff21941..0000000 --- a/core/res/res/drawable-xhdpi/numberpicker_down_disabled_holo_dark.png +++ /dev/null diff --git a/core/res/res/drawable-xhdpi/numberpicker_down_disabled_holo_light.png b/core/res/res/drawable-xhdpi/numberpicker_down_disabled_holo_light.png Binary files differdeleted file mode 100644 index 3e9bdda..0000000 --- a/core/res/res/drawable-xhdpi/numberpicker_down_disabled_holo_light.png +++ /dev/null diff --git a/core/res/res/drawable-xhdpi/numberpicker_down_focused_holo_dark.png b/core/res/res/drawable-xhdpi/numberpicker_down_focused_holo_dark.png Binary files differdeleted file mode 100644 index 0462fca..0000000 --- a/core/res/res/drawable-xhdpi/numberpicker_down_focused_holo_dark.png +++ /dev/null diff --git a/core/res/res/drawable-xhdpi/numberpicker_down_focused_holo_light.png b/core/res/res/drawable-xhdpi/numberpicker_down_focused_holo_light.png Binary files differdeleted file mode 100644 index a488e8e..0000000 --- a/core/res/res/drawable-xhdpi/numberpicker_down_focused_holo_light.png +++ /dev/null diff --git a/core/res/res/drawable-xhdpi/numberpicker_down_longpressed_holo_dark.png b/core/res/res/drawable-xhdpi/numberpicker_down_longpressed_holo_dark.png Binary files differdeleted file mode 100644 index f61b076..0000000 --- a/core/res/res/drawable-xhdpi/numberpicker_down_longpressed_holo_dark.png +++ /dev/null diff --git a/core/res/res/drawable-xhdpi/numberpicker_down_longpressed_holo_light.png b/core/res/res/drawable-xhdpi/numberpicker_down_longpressed_holo_light.png Binary files differdeleted file mode 100644 index f61b076..0000000 --- a/core/res/res/drawable-xhdpi/numberpicker_down_longpressed_holo_light.png +++ /dev/null diff --git a/core/res/res/drawable-xhdpi/numberpicker_down_normal_holo_dark.png b/core/res/res/drawable-xhdpi/numberpicker_down_normal_holo_dark.png Binary files differdeleted file mode 100644 index 211944e..0000000 --- a/core/res/res/drawable-xhdpi/numberpicker_down_normal_holo_dark.png +++ /dev/null diff --git a/core/res/res/drawable-xhdpi/numberpicker_down_normal_holo_light.png b/core/res/res/drawable-xhdpi/numberpicker_down_normal_holo_light.png Binary files differdeleted file mode 100644 index 12bc11a..0000000 --- a/core/res/res/drawable-xhdpi/numberpicker_down_normal_holo_light.png +++ /dev/null diff --git a/core/res/res/drawable-xhdpi/numberpicker_down_pressed_holo_dark.png b/core/res/res/drawable-xhdpi/numberpicker_down_pressed_holo_dark.png Binary files differdeleted file mode 100644 index 635184c..0000000 --- a/core/res/res/drawable-xhdpi/numberpicker_down_pressed_holo_dark.png +++ /dev/null diff --git a/core/res/res/drawable-xhdpi/numberpicker_down_pressed_holo_light.png b/core/res/res/drawable-xhdpi/numberpicker_down_pressed_holo_light.png Binary files differdeleted file mode 100644 index 635184c..0000000 --- a/core/res/res/drawable-xhdpi/numberpicker_down_pressed_holo_light.png +++ /dev/null diff --git a/core/res/res/drawable-xhdpi/numberpicker_up_disabled_focused_holo_dark.png b/core/res/res/drawable-xhdpi/numberpicker_up_disabled_focused_holo_dark.png Binary files differdeleted file mode 100644 index 470e569..0000000 --- a/core/res/res/drawable-xhdpi/numberpicker_up_disabled_focused_holo_dark.png +++ /dev/null diff --git a/core/res/res/drawable-xhdpi/numberpicker_up_disabled_focused_holo_light.png b/core/res/res/drawable-xhdpi/numberpicker_up_disabled_focused_holo_light.png Binary files differdeleted file mode 100644 index 16df74d..0000000 --- a/core/res/res/drawable-xhdpi/numberpicker_up_disabled_focused_holo_light.png +++ /dev/null diff --git a/core/res/res/drawable-xhdpi/numberpicker_up_disabled_holo_dark.png b/core/res/res/drawable-xhdpi/numberpicker_up_disabled_holo_dark.png Binary files differdeleted file mode 100644 index edd4c04..0000000 --- a/core/res/res/drawable-xhdpi/numberpicker_up_disabled_holo_dark.png +++ /dev/null diff --git a/core/res/res/drawable-xhdpi/numberpicker_up_disabled_holo_light.png b/core/res/res/drawable-xhdpi/numberpicker_up_disabled_holo_light.png Binary files differdeleted file mode 100644 index d8f459a..0000000 --- a/core/res/res/drawable-xhdpi/numberpicker_up_disabled_holo_light.png +++ /dev/null diff --git a/core/res/res/drawable-xhdpi/numberpicker_up_focused_holo_dark.png b/core/res/res/drawable-xhdpi/numberpicker_up_focused_holo_dark.png Binary files differdeleted file mode 100644 index 08bf241..0000000 --- a/core/res/res/drawable-xhdpi/numberpicker_up_focused_holo_dark.png +++ /dev/null diff --git a/core/res/res/drawable-xhdpi/numberpicker_up_focused_holo_light.png b/core/res/res/drawable-xhdpi/numberpicker_up_focused_holo_light.png Binary files differdeleted file mode 100644 index b2c40f1..0000000 --- a/core/res/res/drawable-xhdpi/numberpicker_up_focused_holo_light.png +++ /dev/null diff --git a/core/res/res/drawable-xhdpi/numberpicker_up_longpressed_holo_dark.png b/core/res/res/drawable-xhdpi/numberpicker_up_longpressed_holo_dark.png Binary files differdeleted file mode 100644 index f4f7331..0000000 --- a/core/res/res/drawable-xhdpi/numberpicker_up_longpressed_holo_dark.png +++ /dev/null diff --git a/core/res/res/drawable-xhdpi/numberpicker_up_longpressed_holo_light.png b/core/res/res/drawable-xhdpi/numberpicker_up_longpressed_holo_light.png Binary files differdeleted file mode 100644 index f4f7331..0000000 --- a/core/res/res/drawable-xhdpi/numberpicker_up_longpressed_holo_light.png +++ /dev/null diff --git a/core/res/res/drawable-xhdpi/numberpicker_up_normal_holo_dark.png b/core/res/res/drawable-xhdpi/numberpicker_up_normal_holo_dark.png Binary files differdeleted file mode 100644 index 83650b1..0000000 --- a/core/res/res/drawable-xhdpi/numberpicker_up_normal_holo_dark.png +++ /dev/null diff --git a/core/res/res/drawable-xhdpi/numberpicker_up_normal_holo_light.png b/core/res/res/drawable-xhdpi/numberpicker_up_normal_holo_light.png Binary files differdeleted file mode 100644 index 78085d3..0000000 --- a/core/res/res/drawable-xhdpi/numberpicker_up_normal_holo_light.png +++ /dev/null diff --git a/core/res/res/drawable-xhdpi/numberpicker_up_pressed_holo_dark.png b/core/res/res/drawable-xhdpi/numberpicker_up_pressed_holo_dark.png Binary files differdeleted file mode 100644 index b8f6849..0000000 --- a/core/res/res/drawable-xhdpi/numberpicker_up_pressed_holo_dark.png +++ /dev/null diff --git a/core/res/res/drawable-xhdpi/numberpicker_up_pressed_holo_light.png b/core/res/res/drawable-xhdpi/numberpicker_up_pressed_holo_light.png Binary files differdeleted file mode 100644 index b8f6849..0000000 --- a/core/res/res/drawable-xhdpi/numberpicker_up_pressed_holo_light.png +++ /dev/null diff --git a/core/res/res/drawable/numberpicker_down_btn_holo_dark.xml b/core/res/res/drawable/numberpicker_down_btn_holo_dark.xml deleted file mode 100644 index dd6332d..0000000 --- a/core/res/res/drawable/numberpicker_down_btn_holo_dark.xml +++ /dev/null @@ -1,43 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<!-- Copyright (C) 2010 The Android Open Source Project - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. ---> - -<selector xmlns:android="http://schemas.android.com/apk/res/android"> - - <item android:state_pressed="false" - android:state_enabled="true" - android:state_focused="false" - android:drawable="@drawable/numberpicker_down_normal_holo_dark" /> - - <item android:state_pressed="true" - android:state_enabled="true" - android:drawable="@drawable/numberpicker_down_pressed_holo_dark" /> - - <item android:state_pressed="false" - android:state_enabled="true" - android:state_focused="true" - android:drawable="@drawable/numberpicker_down_focused_holo_dark" /> - - <item android:state_pressed="false" - android:state_enabled="false" - android:state_focused="false" - android:drawable="@drawable/numberpicker_down_disabled_holo_dark" /> - - <item android:state_pressed="false" - android:state_enabled="false" - android:state_focused="true" - android:drawable="@drawable/numberpicker_down_disabled_focused_holo_dark" /> - -</selector> diff --git a/core/res/res/drawable/numberpicker_down_btn_holo_light.xml b/core/res/res/drawable/numberpicker_down_btn_holo_light.xml deleted file mode 100644 index 565fd86..0000000 --- a/core/res/res/drawable/numberpicker_down_btn_holo_light.xml +++ /dev/null @@ -1,43 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<!-- Copyright (C) 2010 The Android Open Source Project - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. ---> - -<selector xmlns:android="http://schemas.android.com/apk/res/android"> - - <item android:state_pressed="false" - android:state_enabled="true" - android:state_focused="false" - android:drawable="@drawable/numberpicker_down_normal_holo_light" /> - - <item android:state_pressed="true" - android:state_enabled="true" - android:drawable="@drawable/numberpicker_down_pressed_holo_light" /> - - <item android:state_pressed="false" - android:state_enabled="true" - android:state_focused="true" - android:drawable="@drawable/numberpicker_down_focused_holo_light" /> - - <item android:state_pressed="false" - android:state_enabled="false" - android:state_focused="false" - android:drawable="@drawable/numberpicker_down_disabled_holo_light" /> - - <item android:state_pressed="false" - android:state_enabled="false" - android:state_focused="true" - android:drawable="@drawable/numberpicker_down_disabled_focused_holo_light" /> - -</selector> diff --git a/core/res/res/drawable/numberpicker_up_btn_holo_dark.xml b/core/res/res/drawable/numberpicker_up_btn_holo_dark.xml deleted file mode 100644 index 7af3ee4..0000000 --- a/core/res/res/drawable/numberpicker_up_btn_holo_dark.xml +++ /dev/null @@ -1,43 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<!-- Copyright (C) 2010 The Android Open Source Project - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. ---> - -<selector xmlns:android="http://schemas.android.com/apk/res/android"> - - <item android:state_pressed="false" - android:state_enabled="true" - android:state_focused="false" - android:drawable="@drawable/numberpicker_up_normal_holo_dark" /> - - <item android:state_pressed="true" - android:state_enabled="true" - android:drawable="@drawable/numberpicker_up_pressed_holo_dark" /> - - <item android:state_pressed="false" - android:state_enabled="true" - android:state_focused="true" - android:drawable="@drawable/numberpicker_up_focused_holo_dark" /> - - <item android:state_pressed="false" - android:state_enabled="false" - android:state_focused="false" - android:drawable="@drawable/numberpicker_up_disabled_holo_dark" /> - - <item android:state_pressed="false" - android:state_enabled="false" - android:state_focused="true" - android:drawable="@drawable/numberpicker_up_disabled_focused_holo_dark" /> - -</selector> diff --git a/core/res/res/drawable/numberpicker_up_btn_holo_light.xml b/core/res/res/drawable/numberpicker_up_btn_holo_light.xml deleted file mode 100644 index cbcbb07..0000000 --- a/core/res/res/drawable/numberpicker_up_btn_holo_light.xml +++ /dev/null @@ -1,43 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<!-- Copyright (C) 2010 The Android Open Source Project - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. ---> - -<selector xmlns:android="http://schemas.android.com/apk/res/android"> - - <item android:state_pressed="false" - android:state_enabled="true" - android:state_focused="false" - android:drawable="@drawable/numberpicker_up_normal_holo_light" /> - - <item android:state_pressed="true" - android:state_enabled="true" - android:drawable="@drawable/numberpicker_up_pressed_holo_light" /> - - <item android:state_pressed="false" - android:state_enabled="true" - android:state_focused="true" - android:drawable="@drawable/numberpicker_up_focused_holo_light" /> - - <item android:state_pressed="false" - android:state_enabled="false" - android:state_focused="false" - android:drawable="@drawable/numberpicker_up_focused_holo_light" /> - - <item android:state_pressed="false" - android:state_enabled="false" - android:state_focused="true" - android:drawable="@drawable/numberpicker_up_disabled_focused_holo_light" /> - -</selector> diff --git a/core/res/res/layout-sw600dp/keyguard_screen_password_landscape.xml b/core/res/res/layout-sw600dp/keyguard_screen_password_landscape.xml index 43d0a2c..2495b67 100644 --- a/core/res/res/layout-sw600dp/keyguard_screen_password_landscape.xml +++ b/core/res/res/layout-sw600dp/keyguard_screen_password_landscape.xml @@ -153,13 +153,32 @@ </LinearLayout> <!-- Area to overlay FaceLock --> - <View android:id="@+id/faceLockAreaView" + <RelativeLayout + android:id="@+id/faceLockAreaView" android:visibility="invisible" android:layout_width="512dip" android:layout_height="512dip" android:layout_centerInParent="true" - android:background="@color/facelock_color_background" - /> + android:background="@drawable/intro_bg"> + + <View + android:id="@+id/spotlightMask" + android:layout_width="match_parent" + android:layout_height="match_parent" + android:background="@color/facelock_spotlight_mask" + /> + + <ImageView + android:id="@+id/cancel_button" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:padding="5dip" + android:layout_alignParentTop="true" + android:layout_alignParentRight="true" + android:src="@drawable/ic_facial_backup" + /> + + </RelativeLayout> </RelativeLayout> diff --git a/core/res/res/layout-sw600dp/keyguard_screen_password_portrait.xml b/core/res/res/layout-sw600dp/keyguard_screen_password_portrait.xml index 8c02888..fb62eb6 100644 --- a/core/res/res/layout-sw600dp/keyguard_screen_password_portrait.xml +++ b/core/res/res/layout-sw600dp/keyguard_screen_password_portrait.xml @@ -156,13 +156,32 @@ </LinearLayout> <!-- Area to overlay FaceLock --> - <View android:id="@+id/faceLockAreaView" + <RelativeLayout + android:id="@+id/faceLockAreaView" android:visibility="invisible" android:layout_width="512dip" android:layout_height="512dip" android:layout_centerInParent="true" - android:background="@color/facelock_color_background" - /> + android:background="@drawable/intro_bg"> + + <View + android:id="@+id/spotlightMask" + android:layout_width="match_parent" + android:layout_height="match_parent" + android:background="@color/facelock_spotlight_mask" + /> + + <ImageView + android:id="@+id/cancel_button" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:padding="5dip" + android:layout_alignParentTop="true" + android:layout_alignParentRight="true" + android:src="@drawable/ic_facial_backup" + /> + + </RelativeLayout> </RelativeLayout> diff --git a/core/res/res/layout-sw600dp/keyguard_screen_unlock_landscape.xml b/core/res/res/layout-sw600dp/keyguard_screen_unlock_landscape.xml index 802ef82..53ecbac 100644 --- a/core/res/res/layout-sw600dp/keyguard_screen_unlock_landscape.xml +++ b/core/res/res/layout-sw600dp/keyguard_screen_unlock_landscape.xml @@ -124,13 +124,32 @@ </RelativeLayout> <!-- Area to overlay FaceLock --> - <View android:id="@+id/faceLockAreaView" + <RelativeLayout + android:id="@+id/faceLockAreaView" android:visibility="invisible" android:layout_width="512dip" android:layout_height="512dip" android:layout_centerInParent="true" - android:background="@color/facelock_color_background" - /> + android:background="@drawable/intro_bg"> + + <View + android:id="@+id/spotlightMask" + android:layout_width="match_parent" + android:layout_height="match_parent" + android:background="@color/facelock_spotlight_mask" + /> + + <ImageView + android:id="@+id/cancel_button" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:padding="5dip" + android:layout_alignParentTop="true" + android:layout_alignParentRight="true" + android:src="@drawable/ic_facial_backup" + /> + + </RelativeLayout> </RelativeLayout> diff --git a/core/res/res/layout-sw600dp/keyguard_screen_unlock_portrait.xml b/core/res/res/layout-sw600dp/keyguard_screen_unlock_portrait.xml index 40f2492..577668f 100644 --- a/core/res/res/layout-sw600dp/keyguard_screen_unlock_portrait.xml +++ b/core/res/res/layout-sw600dp/keyguard_screen_unlock_portrait.xml @@ -119,13 +119,32 @@ </RelativeLayout> <!-- Area to overlay FaceLock --> - <View android:id="@+id/faceLockAreaView" + <RelativeLayout + android:id="@+id/faceLockAreaView" android:visibility="invisible" android:layout_width="512dip" android:layout_height="512dip" android:layout_centerInParent="true" - android:background="@color/facelock_color_background" - /> + android:background="@drawable/intro_bg"> + + <View + android:id="@+id/spotlightMask" + android:layout_width="match_parent" + android:layout_height="match_parent" + android:background="@color/facelock_spotlight_mask" + /> + + <ImageView + android:id="@+id/cancel_button" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:padding="5dip" + android:layout_alignParentTop="true" + android:layout_alignParentRight="true" + android:src="@drawable/ic_facial_backup" + /> + + </RelativeLayout> </RelativeLayout> diff --git a/core/res/res/layout/keyguard_screen_password_landscape.xml b/core/res/res/layout/keyguard_screen_password_landscape.xml index 66d7fd7..3bea16c 100644 --- a/core/res/res/layout/keyguard_screen_password_landscape.xml +++ b/core/res/res/layout/keyguard_screen_password_landscape.xml @@ -208,7 +208,8 @@ /> <!-- Area to overlay FaceLock --> - <TextView android:id="@+id/faceLockAreaView" + <RelativeLayout + android:id="@+id/faceLockAreaView" android:visibility="invisible" android:layout_row="0" android:layout_column="2" @@ -217,7 +218,25 @@ android:layout_gravity="fill" android:layout_width="0dip" android:layout_height="0dip" - android:background="@color/facelock_color_background" - /> + android:background="@drawable/intro_bg"> + + <View + android:id="@+id/spotlightMask" + android:layout_width="match_parent" + android:layout_height="match_parent" + android:background="@color/facelock_spotlight_mask" + /> + + <ImageView + android:id="@+id/cancel_button" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:padding="5dip" + android:layout_alignParentTop="true" + android:layout_alignParentRight="true" + android:src="@drawable/ic_facial_backup" + /> + + </RelativeLayout> </GridLayout> diff --git a/core/res/res/layout/keyguard_screen_password_portrait.xml b/core/res/res/layout/keyguard_screen_password_portrait.xml index 426b2f7..6b409aa 100644 --- a/core/res/res/layout/keyguard_screen_password_portrait.xml +++ b/core/res/res/layout/keyguard_screen_password_portrait.xml @@ -199,7 +199,8 @@ /> <!-- Area to overlay FaceLock --> - <TextView android:id="@+id/faceLockAreaView" + <RelativeLayout + android:id="@+id/faceLockAreaView" android:visibility="invisible" android:layout_row="3" android:layout_column="0" @@ -208,7 +209,25 @@ android:layout_gravity="fill" android:layout_width="0dip" android:layout_height="0dip" - android:background="@color/facelock_color_background" - /> + android:background="@drawable/intro_bg"> + + <View + android:id="@+id/spotlightMask" + android:layout_width="match_parent" + android:layout_height="match_parent" + android:background="@color/facelock_spotlight_mask" + /> + + <ImageView + android:id="@+id/cancel_button" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:padding="5dip" + android:layout_alignParentTop="true" + android:layout_alignParentRight="true" + android:src="@drawable/ic_facial_backup" + /> + + </RelativeLayout> </GridLayout> diff --git a/core/res/res/layout/keyguard_screen_unlock_landscape.xml b/core/res/res/layout/keyguard_screen_unlock_landscape.xml index 1038657..7f9aaa0 100644 --- a/core/res/res/layout/keyguard_screen_unlock_landscape.xml +++ b/core/res/res/layout/keyguard_screen_unlock_landscape.xml @@ -161,7 +161,8 @@ /> <!-- Area to overlay FaceLock --> - <TextView android:id="@+id/faceLockAreaView" + <RelativeLayout + android:id="@+id/faceLockAreaView" android:visibility="invisible" android:layout_row="0" android:layout_column="1" @@ -171,7 +172,25 @@ android:layout_marginLeft="8dip" android:layout_width="0dip" android:layout_height="0dip" - android:background="@color/facelock_color_background" - /> + android:background="@drawable/intro_bg"> + + <View + android:id="@+id/spotlightMask" + android:layout_width="match_parent" + android:layout_height="match_parent" + android:background="@color/facelock_spotlight_mask" + /> + + <ImageView + android:id="@+id/cancel_button" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:padding="5dip" + android:layout_alignParentTop="true" + android:layout_alignParentRight="true" + android:src="@drawable/ic_facial_backup" + /> + + </RelativeLayout> </GridLayout> diff --git a/core/res/res/layout/keyguard_screen_unlock_portrait.xml b/core/res/res/layout/keyguard_screen_unlock_portrait.xml index 336faa1..9a2e024 100644 --- a/core/res/res/layout/keyguard_screen_unlock_portrait.xml +++ b/core/res/res/layout/keyguard_screen_unlock_portrait.xml @@ -170,7 +170,8 @@ /> <!-- Area to overlay FaceLock --> - <TextView android:id="@+id/faceLockAreaView" + <RelativeLayout + android:id="@+id/faceLockAreaView" android:visibility="invisible" android:layout_row="4" android:layout_column="0" @@ -181,7 +182,25 @@ android:layout_marginBottom="8dip" android:layout_width="0dip" android:layout_height="0dip" - android:background="@color/facelock_color_background" - /> + android:background="@drawable/intro_bg"> + + <View + android:id="@+id/spotlightMask" + android:layout_width="match_parent" + android:layout_height="match_parent" + android:background="@color/facelock_spotlight_mask" + /> + + <ImageView + android:id="@+id/cancel_button" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:padding="5dip" + android:layout_alignParentTop="true" + android:layout_alignParentRight="true" + android:src="@drawable/ic_facial_backup" + /> + + </RelativeLayout> </GridLayout> diff --git a/core/res/res/layout/number_picker.xml b/core/res/res/layout/number_picker.xml index 2967696..b7e7ae1 100644 --- a/core/res/res/layout/number_picker.xml +++ b/core/res/res/layout/number_picker.xml @@ -22,19 +22,26 @@ <ImageButton android:id="@+id/increment" android:layout_width="fill_parent" android:layout_height="wrap_content" - style="?android:attr/numberPickerUpButtonStyle" + android:background="@android:drawable/numberpicker_up_btn" + android:paddingTop="22dip" + android:paddingBottom="22dip" android:contentDescription="@string/number_picker_increment_button" /> - <view class="android.widget.NumberPicker$CustomEditText" + <EditText android:id="@+id/numberpicker_input" android:layout_width="fill_parent" android:layout_height="wrap_content" - style="?android:attr/numberPickerInputTextStyle" /> + android:textAppearance="@style/TextAppearance.Large.Inverse.NumberPickerInputText" + android:gravity="center" + android:singleLine="true" + android:background="@drawable/numberpicker_input" /> <ImageButton android:id="@+id/decrement" android:layout_width="fill_parent" android:layout_height="wrap_content" - style="?android:attr/numberPickerDownButtonStyle" + android:background="@android:drawable/numberpicker_down_btn" + android:paddingTop="22dip" + android:paddingBottom="22dip" android:contentDescription="@string/number_picker_decrement_button" /> </merge> diff --git a/core/res/res/layout/number_picker_with_selector_wheel.xml b/core/res/res/layout/number_picker_with_selector_wheel.xml new file mode 100644 index 0000000..c8fa0f7 --- /dev/null +++ b/core/res/res/layout/number_picker_with_selector_wheel.xml @@ -0,0 +1,31 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- +** +** Copyright 2012, The Android Open Source Project +** +** Licensed under the Apache License, Version 2.0 (the "License"); +** you may not use this file except in compliance with the License. +** You may obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ +--> + +<merge xmlns:android="http://schemas.android.com/apk/res/android"> + + <view class="android.widget.NumberPicker$CustomEditText" + android:textAppearance="?android:attr/textAppearanceMedium" + android:id="@+id/numberpicker_input" + android:layout_width="fill_parent" + android:layout_height="wrap_content" + android:gravity="center" + android:singleLine="true" + android:background="@null" /> + +</merge> diff --git a/core/res/res/layout/preference_child_holo.xml b/core/res/res/layout/preference_child_holo.xml index 3c6a12e..4167862 100644 --- a/core/res/res/layout/preference_child_holo.xml +++ b/core/res/res/layout/preference_child_holo.xml @@ -60,7 +60,7 @@ android:layout_alignLeft="@android:id/title" android:textAppearance="?android:attr/textAppearanceSmall" android:textColor="?android:attr/textColorSecondary" - android:maxLines="4" /> + android:maxLines="10" /> </RelativeLayout> diff --git a/core/res/res/layout/preference_holo.xml b/core/res/res/layout/preference_holo.xml index 48f483d..e574219 100644 --- a/core/res/res/layout/preference_holo.xml +++ b/core/res/res/layout/preference_holo.xml @@ -63,7 +63,7 @@ android:layout_alignLeft="@android:id/title" android:textAppearance="?android:attr/textAppearanceSmall" android:textColor="?android:attr/textColorSecondary" - android:maxLines="4" /> + android:maxLines="10" /> </RelativeLayout> diff --git a/core/res/res/layout/preference_information_holo.xml b/core/res/res/layout/preference_information_holo.xml index e29ed03..5e03cfb 100644 --- a/core/res/res/layout/preference_information_holo.xml +++ b/core/res/res/layout/preference_information_holo.xml @@ -61,7 +61,7 @@ android:layout_alignLeft="@android:id/title" android:textAppearance="?android:attr/textAppearanceSmall" android:textColor="?android:attr/textColorSecondary" - android:maxLines="2" /> + android:maxLines="10" /> </RelativeLayout> diff --git a/core/res/res/values-af/strings.xml b/core/res/res/values-af/strings.xml index fd9eff3..fd32c8e 100644 --- a/core/res/res/values-af/strings.xml +++ b/core/res/res/values-af/strings.xml @@ -335,7 +335,7 @@ <string name="permlab_writeContacts" msgid="644616215860933284">"skryf kontakdata"</string> <string name="permdesc_writeContacts" product="tablet" msgid="988969759110632978">"Laat die program toe om die kontakdata (adresse) wat op jou tablet gestoor is, te verander. Kwaadwillige programme kan dit dalk gebruik om jou kontakdata uit te vee of te verander."</string> <string name="permdesc_writeContacts" product="default" msgid="5075164818647934067">"Laat die program toe om die kontakdata (adresse) wat op jou foon gestoor is, te verander. Kwaadwillige programme kan dit dalk gebruik om jou kontakdata uit te vee of te verander."</string> - <string name="permlab_readCallLog" msgid="3478133184624102739">"Lees oproeprekord"</string> + <string name="permlab_readCallLog" msgid="3478133184624102739">"lees oproeprekord"</string> <string name="permdesc_readCallLog" product="tablet" msgid="3995157599976515002">"Laat die program toe om jou tablet se oproeprekord, insluitende data oor inkomende en uitgaande oproepe, te lees. Kwaadwillige programme kan dit gebruik om jou data na ander mense te stuur."</string> <string name="permdesc_readCallLog" product="default" msgid="3452017559804750758">"Laat die program toe om jou foon se oproeprekord, insluitende data oor inkomende en uitgaande oproepe, te lees. Kwaadwillige programme kan dit gebruik om jou data na ander mense te stuur."</string> <string name="permlab_writeCallLog" msgid="8552045664743499354">"skryf oproeprekord"</string> @@ -1168,7 +1168,6 @@ <string name="add_account_button_label" msgid="3611982894853435874">"Voeg rekening by"</string> <string name="number_picker_increment_button" msgid="4830170763103463443">"Verhoging"</string> <string name="number_picker_decrement_button" msgid="2576606679160067262">"Verminder"</string> - <string name="number_picker_increment_scroll_mode" msgid="3073101067441638428">"<xliff:g id="VALUE">%s</xliff:g> raak en hou."</string> <string name="number_picker_increment_scroll_action" msgid="4628981789985093179">"Skuif op om by te tel en af om af te trek."</string> <string name="time_picker_increment_minute_button" msgid="2843066823236250329">"Tel \'n minuut by"</string> <string name="time_picker_decrement_minute_button" msgid="4357907223628449595">"Trek \'n minuut af"</string> diff --git a/core/res/res/values-am/strings.xml b/core/res/res/values-am/strings.xml index f1379f7..50b6c67 100644 --- a/core/res/res/values-am/strings.xml +++ b/core/res/res/values-am/strings.xml @@ -1168,7 +1168,6 @@ <string name="add_account_button_label" msgid="3611982894853435874">"መለያ አክል"</string> <string name="number_picker_increment_button" msgid="4830170763103463443">"ጨምር"</string> <string name="number_picker_decrement_button" msgid="2576606679160067262">"ቀንስ"</string> - <string name="number_picker_increment_scroll_mode" msgid="3073101067441638428">"<xliff:g id="VALUE">%s</xliff:g> ንካ እና ያዝ።"</string> <string name="number_picker_increment_scroll_action" msgid="4628981789985093179">"ለመጨመር ወደላይ ለመቀነስ ወደታች አንሸራት"</string> <string name="time_picker_increment_minute_button" msgid="2843066823236250329">"ደቂቃዎች ጨምር"</string> <string name="time_picker_decrement_minute_button" msgid="4357907223628449595">"ደቂቃ ቀንስ"</string> diff --git a/core/res/res/values-ar/strings.xml b/core/res/res/values-ar/strings.xml index a156e64..9bd3ab2 100644 --- a/core/res/res/values-ar/strings.xml +++ b/core/res/res/values-ar/strings.xml @@ -1168,7 +1168,6 @@ <string name="add_account_button_label" msgid="3611982894853435874">"إضافة حساب"</string> <string name="number_picker_increment_button" msgid="4830170763103463443">"زيادة"</string> <string name="number_picker_decrement_button" msgid="2576606679160067262">"تناقص"</string> - <string name="number_picker_increment_scroll_mode" msgid="3073101067441638428">"<xliff:g id="VALUE">%s</xliff:g> المس مع الاستمرار."</string> <string name="number_picker_increment_scroll_action" msgid="4628981789985093179">"مرر لأعلى للزيادة ولأسفل للإنقاص."</string> <string name="time_picker_increment_minute_button" msgid="2843066823236250329">"زيادة دقيقة"</string> <string name="time_picker_decrement_minute_button" msgid="4357907223628449595">"إنقاص دقيقة"</string> diff --git a/core/res/res/values-be/strings.xml b/core/res/res/values-be/strings.xml index 0178764..2526bcd 100644 --- a/core/res/res/values-be/strings.xml +++ b/core/res/res/values-be/strings.xml @@ -1168,7 +1168,6 @@ <string name="add_account_button_label" msgid="3611982894853435874">"Дадаць уліковы запіс"</string> <string name="number_picker_increment_button" msgid="4830170763103463443">"Інкрэмент"</string> <string name="number_picker_decrement_button" msgid="2576606679160067262">"Дэкрэмент"</string> - <string name="number_picker_increment_scroll_mode" msgid="3073101067441638428">"Націсніце і ўтрымлівайце <xliff:g id="VALUE">%s</xliff:g>."</string> <string name="number_picker_increment_scroll_action" msgid="4628981789985093179">"Перасуньце палец уверх, каб павялiчыць адрэзак, або ўніз, каб паменшыць."</string> <string name="time_picker_increment_minute_button" msgid="2843066823236250329">"На хвiлiну больш"</string> <string name="time_picker_decrement_minute_button" msgid="4357907223628449595">"На хвiлiну менш"</string> diff --git a/core/res/res/values-bg/strings.xml b/core/res/res/values-bg/strings.xml index 479e118..b34de19 100644 --- a/core/res/res/values-bg/strings.xml +++ b/core/res/res/values-bg/strings.xml @@ -1168,7 +1168,6 @@ <string name="add_account_button_label" msgid="3611982894853435874">"Добавяне на профил"</string> <string name="number_picker_increment_button" msgid="4830170763103463443">"Увеличаване"</string> <string name="number_picker_decrement_button" msgid="2576606679160067262">"Намаляване"</string> - <string name="number_picker_increment_scroll_mode" msgid="3073101067441638428">"Докоснете <xliff:g id="VALUE">%s</xliff:g> път/и и задръжте."</string> <string name="number_picker_increment_scroll_action" msgid="4628981789985093179">"Плъзнете нагоре за увеличаване и надолу за намаляване."</string> <string name="time_picker_increment_minute_button" msgid="2843066823236250329">"Увеличаване на минутите"</string> <string name="time_picker_decrement_minute_button" msgid="4357907223628449595">"Намаляване на минутите"</string> diff --git a/core/res/res/values-ca/strings.xml b/core/res/res/values-ca/strings.xml index 64d0f87..675a4ba 100644 --- a/core/res/res/values-ca/strings.xml +++ b/core/res/res/values-ca/strings.xml @@ -1168,7 +1168,6 @@ <string name="add_account_button_label" msgid="3611982894853435874">"Afegeix un compte"</string> <string name="number_picker_increment_button" msgid="4830170763103463443">"Incrementa"</string> <string name="number_picker_decrement_button" msgid="2576606679160067262">"Disminueix"</string> - <string name="number_picker_increment_scroll_mode" msgid="3073101067441638428">"Mantén premut <xliff:g id="VALUE">%s</xliff:g>."</string> <string name="number_picker_increment_scroll_action" msgid="4628981789985093179">"Fes lliscar el dit cap amunt per incrementar i cap avall per disminuir."</string> <string name="time_picker_increment_minute_button" msgid="2843066823236250329">"Incrementa els minuts"</string> <string name="time_picker_decrement_minute_button" msgid="4357907223628449595">"Disminueix els minuts"</string> diff --git a/core/res/res/values-cs/strings.xml b/core/res/res/values-cs/strings.xml index 8125ee3..b11f852 100644 --- a/core/res/res/values-cs/strings.xml +++ b/core/res/res/values-cs/strings.xml @@ -1168,7 +1168,6 @@ <string name="add_account_button_label" msgid="3611982894853435874">"Přidat účet"</string> <string name="number_picker_increment_button" msgid="4830170763103463443">"Zvýšení"</string> <string name="number_picker_decrement_button" msgid="2576606679160067262">"Snížení"</string> - <string name="number_picker_increment_scroll_mode" msgid="3073101067441638428">"<xliff:g id="VALUE">%s</xliff:g> dotkněte se a podržte."</string> <string name="number_picker_increment_scroll_action" msgid="4628981789985093179">"Chcete-li přičítat, přejeďte prstem nahoru, chcete-li odečítat, přejeďte prstem dolů."</string> <string name="time_picker_increment_minute_button" msgid="2843066823236250329">"Přičíst minutu"</string> <string name="time_picker_decrement_minute_button" msgid="4357907223628449595">"Odečíst minutu"</string> diff --git a/core/res/res/values-da/strings.xml b/core/res/res/values-da/strings.xml index 0b14edb..89f3451 100644 --- a/core/res/res/values-da/strings.xml +++ b/core/res/res/values-da/strings.xml @@ -507,8 +507,8 @@ <string name="permdesc_writeDictionary" msgid="8185385716255065291">"Tillader, at appen kan skrive nye ord i brugerordbogen."</string> <string name="permlab_sdcardRead" product="nosdcard" msgid="4086221374639183281">"læse USB-lagerets indhold"</string> <string name="permlab_sdcardRead" product="default" msgid="8537875151845139539">"læse indholdet af SD-kortet"</string> - <string name="permdesc_sdcardRead" product="nosdcard" msgid="1055302898999352339">"Tillader, at app\'en læser indhold på USB-lager."</string> - <string name="permdesc_sdcardRead" product="default" msgid="7947792373570683542">"Tillader, at app\'en læser indholdet af SD-kortet."</string> + <string name="permdesc_sdcardRead" product="nosdcard" msgid="1055302898999352339">"Tillader, at appen læser indhold på USB-lageret."</string> + <string name="permdesc_sdcardRead" product="default" msgid="7947792373570683542">"Tillader, at appen læser indholdet af SD-kortet."</string> <string name="permlab_sdcardWrite" product="nosdcard" msgid="85430876310764752">"rette/slette i USB-lager"</string> <string name="permlab_sdcardWrite" product="default" msgid="8079403759001777291">"ret/slet indholdet på SD-kortet"</string> <string name="permdesc_sdcardWrite" product="nosdcard" msgid="6175406299445710888">"Lader appen skrive til USB."</string> @@ -1168,7 +1168,6 @@ <string name="add_account_button_label" msgid="3611982894853435874">"Tilføj konto"</string> <string name="number_picker_increment_button" msgid="4830170763103463443">"Optælling"</string> <string name="number_picker_decrement_button" msgid="2576606679160067262">"Nedtælling"</string> - <string name="number_picker_increment_scroll_mode" msgid="3073101067441638428">"Tryk <xliff:g id="VALUE">%s</xliff:g> gange, og hold inde."</string> <string name="number_picker_increment_scroll_action" msgid="4628981789985093179">"Glid op for at tilføje, og glid ned for at fjerne."</string> <string name="time_picker_increment_minute_button" msgid="2843066823236250329">"Tilføj minut"</string> <string name="time_picker_decrement_minute_button" msgid="4357907223628449595">"Fjern minut"</string> diff --git a/core/res/res/values-de/strings.xml b/core/res/res/values-de/strings.xml index baf3e40..2de5212 100644 --- a/core/res/res/values-de/strings.xml +++ b/core/res/res/values-de/strings.xml @@ -1168,7 +1168,6 @@ <string name="add_account_button_label" msgid="3611982894853435874">"Konto hinzufügen"</string> <string name="number_picker_increment_button" msgid="4830170763103463443">"Erhöhen"</string> <string name="number_picker_decrement_button" msgid="2576606679160067262">"Verringern"</string> - <string name="number_picker_increment_scroll_mode" msgid="3073101067441638428">"<xliff:g id="VALUE">%s</xliff:g> berühren und gedrückt halten"</string> <string name="number_picker_increment_scroll_action" msgid="4628981789985093179">"Zum Vorstellen nach oben und zum Zurückstellen nach unten ziehen"</string> <string name="time_picker_increment_minute_button" msgid="2843066823236250329">"Minute vorstellen"</string> <string name="time_picker_decrement_minute_button" msgid="4357907223628449595">"Minute zurückstellen"</string> diff --git a/core/res/res/values-el/strings.xml b/core/res/res/values-el/strings.xml index ad840e3..4906812 100644 --- a/core/res/res/values-el/strings.xml +++ b/core/res/res/values-el/strings.xml @@ -1168,7 +1168,6 @@ <string name="add_account_button_label" msgid="3611982894853435874">"Προσθήκη λογαριασμού"</string> <string name="number_picker_increment_button" msgid="4830170763103463443">"Αύξηση"</string> <string name="number_picker_decrement_button" msgid="2576606679160067262">"Μείωση"</string> - <string name="number_picker_increment_scroll_mode" msgid="3073101067441638428">"Πατήστε παρατεταμένα το <xliff:g id="VALUE">%s</xliff:g>."</string> <string name="number_picker_increment_scroll_action" msgid="4628981789985093179">"Πραγματοποιήστε κύλιση προς τα πάνω για αύξηση και προς τα κάτω για μείωση."</string> <string name="time_picker_increment_minute_button" msgid="2843066823236250329">"Αύξηση λεπτού"</string> <string name="time_picker_decrement_minute_button" msgid="4357907223628449595">"Μείωση λεπτού"</string> diff --git a/core/res/res/values-en-rGB/strings.xml b/core/res/res/values-en-rGB/strings.xml index de92665..d8dac7c 100644 --- a/core/res/res/values-en-rGB/strings.xml +++ b/core/res/res/values-en-rGB/strings.xml @@ -1168,7 +1168,6 @@ <string name="add_account_button_label" msgid="3611982894853435874">"Add account"</string> <string name="number_picker_increment_button" msgid="4830170763103463443">"Increment"</string> <string name="number_picker_decrement_button" msgid="2576606679160067262">"Decrement"</string> - <string name="number_picker_increment_scroll_mode" msgid="3073101067441638428">"<xliff:g id="VALUE">%s</xliff:g> touch and hold."</string> <string name="number_picker_increment_scroll_action" msgid="4628981789985093179">"Slide up to increment and down to decrease."</string> <string name="time_picker_increment_minute_button" msgid="2843066823236250329">"Increment minute"</string> <string name="time_picker_decrement_minute_button" msgid="4357907223628449595">"Decrement minute"</string> diff --git a/core/res/res/values-es-rUS/strings.xml b/core/res/res/values-es-rUS/strings.xml index 5ef9483..0071e0a 100644 --- a/core/res/res/values-es-rUS/strings.xml +++ b/core/res/res/values-es-rUS/strings.xml @@ -336,11 +336,11 @@ <string name="permdesc_writeContacts" product="tablet" msgid="988969759110632978">"Permite que la aplicación modifique la información de contacto (dirección) almacenada en tu tableta. Las aplicaciones maliciosas pueden utilizar este permiso para borrar o modificar tu información de contacto."</string> <string name="permdesc_writeContacts" product="default" msgid="5075164818647934067">"Permite que la aplicación modifique la información de contacto (dirección) almacenada en tu dispositivo. Las aplicaciones maliciosas pueden utilizar este permiso para borrar o modificar tu información de contacto."</string> <string name="permlab_readCallLog" msgid="3478133184624102739">"leer el registro de llamadas"</string> - <string name="permdesc_readCallLog" product="tablet" msgid="3995157599976515002">"Permite que la aplicación lea el registro de llamadas del tablet, incluidos datos sobre llamadas entrantes y salientes. Las aplicaciones malintencionadas pueden usar este permiso para enviar tus datos a otros usuarios."</string> - <string name="permdesc_readCallLog" product="default" msgid="3452017559804750758">"Permite que la aplicación lea el registro de llamadas del teléfono, incluidos datos sobre llamadas entrantes y salientes. Las aplicaciones malintencionadas pueden usar este permiso para enviar tus datos a otros usuarios."</string> + <string name="permdesc_readCallLog" product="tablet" msgid="3995157599976515002">"Permite que la aplicación lea el registro de llamadas de la tableta, incluidos los datos sobre llamadas entrantes y salientes. Las aplicaciones malintencionadas pueden usar este permiso para enviar tus datos a otros usuarios."</string> + <string name="permdesc_readCallLog" product="default" msgid="3452017559804750758">"Permite que la aplicación lea el registro de llamadas del dispositivo, incluidos los datos sobre llamadas entrantes y salientes. Las aplicaciones malintencionadas pueden usar este permiso para enviar tus datos a otros usuarios."</string> <string name="permlab_writeCallLog" msgid="8552045664743499354">"escribir en el registro de llamadas"</string> - <string name="permdesc_writeCallLog" product="tablet" msgid="6661806062274119245">"Permite que la aplicación modifique el registro de llamadas del tablet, incluidos datos sobre llamadas entrantes y salientes. Las aplicaciones malintencionadas pueden usar este permiso para borrar o modificar el registro de llamadas."</string> - <string name="permdesc_writeCallLog" product="default" msgid="683941736352787842">"Permite que la aplicación modifique el registro de llamadas del teléfono, incluidos datos sobre llamadas entrantes y salientes. Las aplicaciones malintencionadas pueden usar este permiso para borrar o modificar el registro de llamadas."</string> + <string name="permdesc_writeCallLog" product="tablet" msgid="6661806062274119245">"Permite que la aplicación modifique el registro de llamadas de la tableta, incluidos los datos sobre llamadas entrantes y salientes. Las aplicaciones malintencionadas pueden usar este permiso para borrar o modificar el registro de llamadas."</string> + <string name="permdesc_writeCallLog" product="default" msgid="683941736352787842">"Permite que la aplicación modifique el registro de llamadas del dispositivo, incluidos los datos sobre llamadas entrantes y salientes. Las aplicaciones malintencionadas pueden usar este permiso para borrar o modificar el registro de llamadas."</string> <string name="permlab_readProfile" msgid="6824681438529842282">"Leer tus datos de perfil"</string> <string name="permdesc_readProfile" product="default" msgid="94520753797630679">"Permite que la aplicación lea la información de perfil almacenada en tu dispositivo, como tu nombre e información de contacto. Esto significa que la aplicación puede identificarte y enviar tu información de perfil a otros."</string> <string name="permlab_writeProfile" msgid="4679878325177177400">"Escrib. en datos de tu perfil"</string> @@ -1168,7 +1168,6 @@ <string name="add_account_button_label" msgid="3611982894853435874">"Agregar una cuenta"</string> <string name="number_picker_increment_button" msgid="4830170763103463443">"Incremento"</string> <string name="number_picker_decrement_button" msgid="2576606679160067262">"Decremento"</string> - <string name="number_picker_increment_scroll_mode" msgid="3073101067441638428">"Mantén presionado <xliff:g id="VALUE">%s</xliff:g>."</string> <string name="number_picker_increment_scroll_action" msgid="4628981789985093179">"Deslízate hacia arriba para aumentar y hacia abajo para disminuir."</string> <string name="time_picker_increment_minute_button" msgid="2843066823236250329">"Aumentar minutos"</string> <string name="time_picker_decrement_minute_button" msgid="4357907223628449595">"Disminuir minutos"</string> diff --git a/core/res/res/values-es/strings.xml b/core/res/res/values-es/strings.xml index 9ede6a0..05b837d 100644 --- a/core/res/res/values-es/strings.xml +++ b/core/res/res/values-es/strings.xml @@ -1168,7 +1168,6 @@ <string name="add_account_button_label" msgid="3611982894853435874">"Añadir cuenta"</string> <string name="number_picker_increment_button" msgid="4830170763103463443">"Aumentar"</string> <string name="number_picker_decrement_button" msgid="2576606679160067262">"Disminuir"</string> - <string name="number_picker_increment_scroll_mode" msgid="3073101067441638428">"Mantén pulsado <xliff:g id="VALUE">%s</xliff:g>."</string> <string name="number_picker_increment_scroll_action" msgid="4628981789985093179">"Desliza el dedo hacia arriba para aumentar y hacia abajo para disminuir."</string> <string name="time_picker_increment_minute_button" msgid="2843066823236250329">"Aumentar minuto"</string> <string name="time_picker_decrement_minute_button" msgid="4357907223628449595">"Disminuir minuto"</string> diff --git a/core/res/res/values-et/strings.xml b/core/res/res/values-et/strings.xml index b68944e..22de35d 100644 --- a/core/res/res/values-et/strings.xml +++ b/core/res/res/values-et/strings.xml @@ -1168,7 +1168,6 @@ <string name="add_account_button_label" msgid="3611982894853435874">"Lisa konto"</string> <string name="number_picker_increment_button" msgid="4830170763103463443">"Suurenda"</string> <string name="number_picker_decrement_button" msgid="2576606679160067262">"Vähenda"</string> - <string name="number_picker_increment_scroll_mode" msgid="3073101067441638428">"<xliff:g id="VALUE">%s</xliff:g> puudutage ja hoidke."</string> <string name="number_picker_increment_scroll_action" msgid="4628981789985093179">"Suurendamiseks lohistage üles, vähendamiseks alla."</string> <string name="time_picker_increment_minute_button" msgid="2843066823236250329">"Minutite arvu suurendamine"</string> <string name="time_picker_decrement_minute_button" msgid="4357907223628449595">"Minutite arvu vähendamine"</string> diff --git a/core/res/res/values-fa/strings.xml b/core/res/res/values-fa/strings.xml index 5a536e6..dd6a016 100644 --- a/core/res/res/values-fa/strings.xml +++ b/core/res/res/values-fa/strings.xml @@ -338,7 +338,7 @@ <string name="permlab_readCallLog" msgid="3478133184624102739">"خواندن گزارش تماس"</string> <string name="permdesc_readCallLog" product="tablet" msgid="3995157599976515002">"به برنامه اجازه میدهد گزارشات تماس رایانه لوحی شما، از جمله دادههایی درمورد تماسهای ورودی و خروجی را بخواند. برنامههای مخرب ممکن است از این ویژگی برای ارسال دادههای شما به دیگران استفاده کنند."</string> <string name="permdesc_readCallLog" product="default" msgid="3452017559804750758">"به برنامه اجازه میدهد گزارشات تماس تلفنی شما، از جمله دادههایی درمورد تماسهای ورودی و خروجی را بخواند. برنامههای مخرب ممکن است از این ویژگی برای ارسال دادههای شما به دیگران استفاده کنند."</string> - <string name="permlab_writeCallLog" msgid="8552045664743499354">"نوشتن در گزارش تماس"</string> + <string name="permlab_writeCallLog" msgid="8552045664743499354">"نوشتن گزارش تماس"</string> <string name="permdesc_writeCallLog" product="tablet" msgid="6661806062274119245">"به برنامه اجازه میدهد گزارشات تماس رایانه لوحی شما، از جمله دادههایی درمورد تماسهای ورودی و خروجی را تغییر دهد. برنامههای مخرب ممکن است از این ویژگی برای پاک کردن یا تغییر گزارش تماس شما استفاده کنند."</string> <string name="permdesc_writeCallLog" product="default" msgid="683941736352787842">"به برنامه اجازه میدهد گزارشات تماس تلفنی شما، از جمله دادههایی درمورد تماسهای ورودی و خروجی را تغییر دهد. برنامههای مخرب ممکن است از این ویژگی برای پاک کردن یا تغییر گزارش تماس شما استفاده کنند."</string> <string name="permlab_readProfile" msgid="6824681438529842282">"خواندن دادههای نمایه شما"</string> @@ -1168,7 +1168,6 @@ <string name="add_account_button_label" msgid="3611982894853435874">"افزودن حساب"</string> <string name="number_picker_increment_button" msgid="4830170763103463443">"افزایش"</string> <string name="number_picker_decrement_button" msgid="2576606679160067262">"کاهش"</string> - <string name="number_picker_increment_scroll_mode" msgid="3073101067441638428">"<xliff:g id="VALUE">%s</xliff:g> لمس کرده و نگه دارید."</string> <string name="number_picker_increment_scroll_action" msgid="4628981789985093179">"برای افزایش به بالا و برای کاهش به پایین بلغزانید."</string> <string name="time_picker_increment_minute_button" msgid="2843066823236250329">" افزایش دقیقه"</string> <string name="time_picker_decrement_minute_button" msgid="4357907223628449595">"کاهش دقیقه"</string> diff --git a/core/res/res/values-fi/strings.xml b/core/res/res/values-fi/strings.xml index b1009a5..c744479 100644 --- a/core/res/res/values-fi/strings.xml +++ b/core/res/res/values-fi/strings.xml @@ -1168,7 +1168,6 @@ <string name="add_account_button_label" msgid="3611982894853435874">"Lisää tili"</string> <string name="number_picker_increment_button" msgid="4830170763103463443">"Lisää"</string> <string name="number_picker_decrement_button" msgid="2576606679160067262">"Vähennä"</string> - <string name="number_picker_increment_scroll_mode" msgid="3073101067441638428">"<xliff:g id="VALUE">%s</xliff:g> kosketa pitkään."</string> <string name="number_picker_increment_scroll_action" msgid="4628981789985093179">"Kasvata tai pienennä arvoa liu\'uttamalla ylös tai alas."</string> <string name="time_picker_increment_minute_button" msgid="2843066823236250329">"Kasvata minuuttia"</string> <string name="time_picker_decrement_minute_button" msgid="4357907223628449595">"Pienennä minuuttia"</string> diff --git a/core/res/res/values-fr/strings.xml b/core/res/res/values-fr/strings.xml index 88fe721..62fe768 100644 --- a/core/res/res/values-fr/strings.xml +++ b/core/res/res/values-fr/strings.xml @@ -507,7 +507,7 @@ <string name="permdesc_writeDictionary" msgid="8185385716255065291">"Permet à l\'application d\'enregistrer de nouveaux mots dans le dictionnaire personnel de l\'utilisateur."</string> <string name="permlab_sdcardRead" product="nosdcard" msgid="4086221374639183281">"lire contenu de la mémoire USB"</string> <string name="permlab_sdcardRead" product="default" msgid="8537875151845139539">"lire le contenu de la carte SD"</string> - <string name="permdesc_sdcardRead" product="nosdcard" msgid="1055302898999352339">"Permet à l\'appli de lire contenu mémoire USB."</string> + <string name="permdesc_sdcardRead" product="nosdcard" msgid="1055302898999352339">"Permet à l\'appli de lire contenu de mémoire USB."</string> <string name="permdesc_sdcardRead" product="default" msgid="7947792373570683542">"Permet à l\'application de lire le contenu de la carte SD."</string> <string name="permlab_sdcardWrite" product="nosdcard" msgid="85430876310764752">"Modifier/Supprimer contenu mémoire USB"</string> <string name="permlab_sdcardWrite" product="default" msgid="8079403759001777291">"modifier/supprimer le contenu de la carte SD"</string> @@ -1168,7 +1168,6 @@ <string name="add_account_button_label" msgid="3611982894853435874">"Ajouter un compte"</string> <string name="number_picker_increment_button" msgid="4830170763103463443">"Augmenter"</string> <string name="number_picker_decrement_button" msgid="2576606679160067262">"Diminuer"</string> - <string name="number_picker_increment_scroll_mode" msgid="3073101067441638428">"<xliff:g id="VALUE">%s</xliff:g> appuyez de manière prolongée."</string> <string name="number_picker_increment_scroll_action" msgid="4628981789985093179">"Faire glisser vers le haut pour augmenter et vers le bas pour diminuer"</string> <string name="time_picker_increment_minute_button" msgid="2843066823236250329">"Minute suivante"</string> <string name="time_picker_decrement_minute_button" msgid="4357907223628449595">"Minute précédente"</string> diff --git a/core/res/res/values-hi/strings.xml b/core/res/res/values-hi/strings.xml index bd8863f..bfc2f71 100644 --- a/core/res/res/values-hi/strings.xml +++ b/core/res/res/values-hi/strings.xml @@ -1168,7 +1168,6 @@ <string name="add_account_button_label" msgid="3611982894853435874">"खाता जोड़ें"</string> <string name="number_picker_increment_button" msgid="4830170763103463443">"वृद्धि"</string> <string name="number_picker_decrement_button" msgid="2576606679160067262">"कमी"</string> - <string name="number_picker_increment_scroll_mode" msgid="3073101067441638428">"<xliff:g id="VALUE">%s</xliff:g> को स्पर्श करके रखें."</string> <string name="number_picker_increment_scroll_action" msgid="4628981789985093179">"बढ़ते क्रम के लिए ऊपर और घटते क्रम के लिए नीचे की ओर स्लाइड करें."</string> <string name="time_picker_increment_minute_button" msgid="2843066823236250329">"बढ़ते क्रम में मिनट"</string> <string name="time_picker_decrement_minute_button" msgid="4357907223628449595">"घटते क्रम में मिनट"</string> diff --git a/core/res/res/values-hr/strings.xml b/core/res/res/values-hr/strings.xml index 749012b..77c5a10 100644 --- a/core/res/res/values-hr/strings.xml +++ b/core/res/res/values-hr/strings.xml @@ -1168,7 +1168,6 @@ <string name="add_account_button_label" msgid="3611982894853435874">"Dodaj račun"</string> <string name="number_picker_increment_button" msgid="4830170763103463443">"Povećaj"</string> <string name="number_picker_decrement_button" msgid="2576606679160067262">"Smanji"</string> - <string name="number_picker_increment_scroll_mode" msgid="3073101067441638428">"<xliff:g id="VALUE">%s</xliff:g> pritisnite i držite."</string> <string name="number_picker_increment_scroll_action" msgid="4628981789985093179">"Klizite prema gore za pomak unaprijed, a prema dolje za pomak unatrag."</string> <string name="time_picker_increment_minute_button" msgid="2843066823236250329">"Pomak unaprijed za jednu minutu"</string> <string name="time_picker_decrement_minute_button" msgid="4357907223628449595">"Pomak unatrag za jednu minutu"</string> diff --git a/core/res/res/values-hu/strings.xml b/core/res/res/values-hu/strings.xml index 24a70d7..466cb3a 100644 --- a/core/res/res/values-hu/strings.xml +++ b/core/res/res/values-hu/strings.xml @@ -1168,7 +1168,6 @@ <string name="add_account_button_label" msgid="3611982894853435874">"Fiók hozzáadása"</string> <string name="number_picker_increment_button" msgid="4830170763103463443">"Növelés"</string> <string name="number_picker_decrement_button" msgid="2576606679160067262">"Csökkentés"</string> - <string name="number_picker_increment_scroll_mode" msgid="3073101067441638428">"<xliff:g id="VALUE">%s</xliff:g> érintse meg és tartsa lenyomva."</string> <string name="number_picker_increment_scroll_action" msgid="4628981789985093179">"Csúsztassa fel a növeléshez és le a csökkentéshez."</string> <string name="time_picker_increment_minute_button" msgid="2843066823236250329">"Percek növelése"</string> <string name="time_picker_decrement_minute_button" msgid="4357907223628449595">"Percek csökkentése"</string> diff --git a/core/res/res/values-in/strings.xml b/core/res/res/values-in/strings.xml index d2b4f04..2ad73a4 100644 --- a/core/res/res/values-in/strings.xml +++ b/core/res/res/values-in/strings.xml @@ -396,7 +396,7 @@ <string name="permdesc_asec_destroy" msgid="7218749286145526537">"Mengizinkan apl merusak penyimpanan internal."</string> <string name="permlab_asec_mount_unmount" msgid="8877998101944999386">"memasang/melepas penyimpanan internal"</string> <string name="permdesc_asec_mount_unmount" msgid="3451360114902490929">"Mengizinkan apl memasang/melepas penyimpanan internal."</string> - <string name="permlab_asec_rename" msgid="7496633954080472417">"ubah nama penyimpanan internal"</string> + <string name="permlab_asec_rename" msgid="7496633954080472417">"ganti nama penyimpanan internal"</string> <string name="permdesc_asec_rename" msgid="1794757588472127675">"Mengizinkan apl mengganti nama penyimpanan internal."</string> <string name="permlab_vibrate" msgid="7768356019980849603">"mengontrol penggetar"</string> <string name="permdesc_vibrate" msgid="6284989245902300945">"Mengizinkan aplikasi untuk mengendalikan vibrator."</string> @@ -1168,7 +1168,6 @@ <string name="add_account_button_label" msgid="3611982894853435874">"Tambahkan akun"</string> <string name="number_picker_increment_button" msgid="4830170763103463443">"Penambahan"</string> <string name="number_picker_decrement_button" msgid="2576606679160067262">"Pengurangan"</string> - <string name="number_picker_increment_scroll_mode" msgid="3073101067441638428">"<xliff:g id="VALUE">%s</xliff:g> sentuh dan tahan."</string> <string name="number_picker_increment_scroll_action" msgid="4628981789985093179">"Geser ke atas untuk menambah dan ke bawah untuk mengurangi."</string> <string name="time_picker_increment_minute_button" msgid="2843066823236250329">"Menit penambahan"</string> <string name="time_picker_decrement_minute_button" msgid="4357907223628449595">"Menit pengurangan"</string> diff --git a/core/res/res/values-it/strings.xml b/core/res/res/values-it/strings.xml index 75ed4e8..1eb3be4 100644 --- a/core/res/res/values-it/strings.xml +++ b/core/res/res/values-it/strings.xml @@ -1168,7 +1168,6 @@ <string name="add_account_button_label" msgid="3611982894853435874">"Aggiungi account"</string> <string name="number_picker_increment_button" msgid="4830170763103463443">"Aumenta"</string> <string name="number_picker_decrement_button" msgid="2576606679160067262">"Diminuisci"</string> - <string name="number_picker_increment_scroll_mode" msgid="3073101067441638428">"Tocca e tieni premuto il numero <xliff:g id="VALUE">%s</xliff:g>."</string> <string name="number_picker_increment_scroll_action" msgid="4628981789985093179">"Scorri verso l\'alto per aumentare il valore e verso il basso per diminuirlo."</string> <string name="time_picker_increment_minute_button" msgid="2843066823236250329">"Aumenta minuto"</string> <string name="time_picker_decrement_minute_button" msgid="4357907223628449595">"Diminuisci minuto"</string> diff --git a/core/res/res/values-iw/strings.xml b/core/res/res/values-iw/strings.xml index 40a4d01..8edf115 100644 --- a/core/res/res/values-iw/strings.xml +++ b/core/res/res/values-iw/strings.xml @@ -130,7 +130,7 @@ <string name="low_memory" product="tablet" msgid="6494019234102154896">"שטח האחסון של הטבלט מלא. מחק קבצים כדי לפנות מקום."</string> <string name="low_memory" product="default" msgid="3475999286680000541">"שטח האחסון של הטלפון מלא. מחק חלק מהקבצים כדי לפנות שטח."</string> <string name="me" msgid="6545696007631404292">"אני"</string> - <string name="power_dialog" product="tablet" msgid="8545351420865202853">"אפשרויות טבלט"</string> + <string name="power_dialog" product="tablet" msgid="8545351420865202853">"אפשרויות טאבלט"</string> <string name="power_dialog" product="default" msgid="1319919075463988638">"אפשרויות טלפון"</string> <string name="silent_mode" msgid="7167703389802618663">"מצב שקט"</string> <string name="turn_on_radio" msgid="3912793092339962371">"הפעל חיבור אלחוטי"</string> @@ -146,7 +146,7 @@ <string name="shutdown_confirm_question" msgid="2906544768881136183">"האם ברצונך לבצע כיבוי?"</string> <string name="recent_tasks_title" msgid="3691764623638127888">"נוצרו לאחרונה"</string> <string name="no_recent_tasks" msgid="8794906658732193473">"אין יישומים אחרונים"</string> - <string name="global_actions" product="tablet" msgid="408477140088053665">"אפשרויות טבלט"</string> + <string name="global_actions" product="tablet" msgid="408477140088053665">"אפשרויות טאבלט"</string> <string name="global_actions" product="default" msgid="2406416831541615258">"אפשרויות טלפון"</string> <string name="global_action_lock" msgid="2844945191792119712">"נעילת מסך"</string> <string name="global_action_power_off" msgid="4471879440839879722">"כיבוי"</string> @@ -376,7 +376,7 @@ <string name="permdesc_recordAudio" msgid="2387462233976248635">"מאפשר ליישום לגשת לנתיב להקלטת אודיו."</string> <string name="permlab_camera" msgid="3616391919559751192">"צלם תמונות וסרטונים"</string> <string name="permdesc_camera" msgid="1507407407002492176">"מאפשר ליישום לצלם תמונות וסרטוני וידאו עם המצלמה. הגדרה זו מאפשרת ליישום לאסוף תמונות שהמצלמה קולטת בכל עת."</string> - <string name="permlab_brick" product="tablet" msgid="2961292205764488304">"השבת טבלט לצמיתות"</string> + <string name="permlab_brick" product="tablet" msgid="2961292205764488304">"השבת טאבלט לצמיתות"</string> <string name="permlab_brick" product="default" msgid="8337817093326370537">"השבת טלפון לצמיתות"</string> <string name="permdesc_brick" product="tablet" msgid="4334818808001699530">"מאפשר ליישום להשבית את הטבלט כולו לצמיתות. זו הרשאה מסוכנת מאוד."</string> <string name="permdesc_brick" product="default" msgid="5788903297627283099">"מאפשר ליישום להשבית את הטלפון כולו לצמיתות. זו הרשאה מסוכנת מאוד."</string> @@ -412,7 +412,7 @@ <string name="permdesc_callPhone" msgid="6396463004110544744">"מאפשר ליישום להתקשר למספרי טלפון ללא התערבותך. יישומים זדוניים עלולים לגרום לחיובי שיחות בלתי צפויים בחשבון הטלפון שלך. לתשומת לבך, הרשאה זו לא מאפשרת ליישום להתקשר למספרי חירום."</string> <string name="permlab_callPrivileged" msgid="4198349211108497879">"התקשר ישירות לכל מספר טלפון"</string> <string name="permdesc_callPrivileged" msgid="1689024901509996810">"מאפשר ליישום להתקשר לכל מספר טלפון שהוא, כולל מספרי חירום, ללא התערבותך. יישומים זדוניים עלולים לבצע שיחות מיותרות ולא חוקיות לשירותי חירום."</string> - <string name="permlab_performCdmaProvisioning" product="tablet" msgid="4842576994144604821">"הפעל ישירות התקנת טבלט מסוג CDMA"</string> + <string name="permlab_performCdmaProvisioning" product="tablet" msgid="4842576994144604821">"הפעל ישירות התקנת טאבלט מסוג CDMA"</string> <string name="permlab_performCdmaProvisioning" product="default" msgid="5604848095315421425">"הפעל ישירות הגדרה של טלפון CDMA"</string> <string name="permdesc_performCdmaProvisioning" msgid="1994193538802314186">"מאפשר ליישום להפעיל הקצאת CDMA. יישומים זדוניים עלולים להפעיל הקצאת CDMA ללא צורך."</string> <string name="permlab_locationUpdates" msgid="7785408253364335740">"שלוט בהתראות על עדכון מיקום"</string> @@ -429,7 +429,7 @@ <string name="permlab_wakeLock" product="default" msgid="573480187941496130">"מניעת מעבר הטלפון למצב שינה"</string> <string name="permdesc_wakeLock" product="tablet" msgid="7311319824400447868">"מאפשר ליישום למנוע מהטבלט לעבור למצב שינה."</string> <string name="permdesc_wakeLock" product="default" msgid="8559100677372928754">"מאפשר ליישום למנוע מהטלפון לעבור למצב שינה."</string> - <string name="permlab_devicePower" product="tablet" msgid="2787034722616350417">"הפעלה או כיבוי של טבלט"</string> + <string name="permlab_devicePower" product="tablet" msgid="2787034722616350417">"הפעלה או כיבוי של טאבלט"</string> <string name="permlab_devicePower" product="default" msgid="4928622470980943206">"הפעל או כבה את הטלפון"</string> <string name="permdesc_devicePower" product="tablet" msgid="6689862878984631831">"מאפשר ליישום להפעיל או לכבות את הטבלט."</string> <string name="permdesc_devicePower" product="default" msgid="6037057348463131032">"מאפשר ליישום להפעיל או לכבות את הטלפון."</string> @@ -1168,7 +1168,6 @@ <string name="add_account_button_label" msgid="3611982894853435874">"הוסף חשבון"</string> <string name="number_picker_increment_button" msgid="4830170763103463443">"הגדל"</string> <string name="number_picker_decrement_button" msgid="2576606679160067262">"הפחת"</string> - <string name="number_picker_increment_scroll_mode" msgid="3073101067441638428">"<xliff:g id="VALUE">%s</xliff:g> גע והחזק."</string> <string name="number_picker_increment_scroll_action" msgid="4628981789985093179">"הסט מעלה כדי להוסיף ומטה כדי להפחית."</string> <string name="time_picker_increment_minute_button" msgid="2843066823236250329">"הוסף דקה"</string> <string name="time_picker_decrement_minute_button" msgid="4357907223628449595">"הפחת דקה"</string> diff --git a/core/res/res/values-ja/strings.xml b/core/res/res/values-ja/strings.xml index 549c1e2..fba0304 100644 --- a/core/res/res/values-ja/strings.xml +++ b/core/res/res/values-ja/strings.xml @@ -1168,7 +1168,6 @@ <string name="add_account_button_label" msgid="3611982894853435874">"アカウントを追加"</string> <string name="number_picker_increment_button" msgid="4830170763103463443">"増やす"</string> <string name="number_picker_decrement_button" msgid="2576606679160067262">"減らす"</string> - <string name="number_picker_increment_scroll_mode" msgid="3073101067441638428">"<xliff:g id="VALUE">%s</xliff:g>回タップして押し続けます。"</string> <string name="number_picker_increment_scroll_action" msgid="4628981789985093179">"上にスライドで大きく、下にスライドで小さくなります。"</string> <string name="time_picker_increment_minute_button" msgid="2843066823236250329">"1分進める"</string> <string name="time_picker_decrement_minute_button" msgid="4357907223628449595">"1分戻す"</string> diff --git a/core/res/res/values-ko/strings.xml b/core/res/res/values-ko/strings.xml index fc8e7b1..211c79c 100644 --- a/core/res/res/values-ko/strings.xml +++ b/core/res/res/values-ko/strings.xml @@ -1168,7 +1168,6 @@ <string name="add_account_button_label" msgid="3611982894853435874">"계정 추가"</string> <string name="number_picker_increment_button" msgid="4830170763103463443">"올리기"</string> <string name="number_picker_decrement_button" msgid="2576606679160067262">"줄이기"</string> - <string name="number_picker_increment_scroll_mode" msgid="3073101067441638428">"<xliff:g id="VALUE">%s</xliff:g> 길게 터치하세요."</string> <string name="number_picker_increment_scroll_action" msgid="4628981789985093179">"올리려면 위로 슬라이드하고 줄이려면 아래로 슬라이드합니다."</string> <string name="time_picker_increment_minute_button" msgid="2843066823236250329">"\'분\'을 올립니다."</string> <string name="time_picker_decrement_minute_button" msgid="4357907223628449595">"\'분\'을 줄입니다."</string> diff --git a/core/res/res/values-lt/strings.xml b/core/res/res/values-lt/strings.xml index 5e9d3f4..9ceaa1d 100644 --- a/core/res/res/values-lt/strings.xml +++ b/core/res/res/values-lt/strings.xml @@ -1168,7 +1168,6 @@ <string name="add_account_button_label" msgid="3611982894853435874">"Pridėti paskyrą"</string> <string name="number_picker_increment_button" msgid="4830170763103463443">"Padidinti"</string> <string name="number_picker_decrement_button" msgid="2576606679160067262">"Sumažinti"</string> - <string name="number_picker_increment_scroll_mode" msgid="3073101067441638428">"Palieskite <xliff:g id="VALUE">%s</xliff:g> ir laikykite."</string> <string name="number_picker_increment_scroll_action" msgid="4628981789985093179">"Slinkite aukštyn, kad būtų parodytas padidėjimas, ir žemyn, kad būtų parodytas sumažėjimas."</string> <string name="time_picker_increment_minute_button" msgid="2843066823236250329">"Padidėjimo minutė"</string> <string name="time_picker_decrement_minute_button" msgid="4357907223628449595">"Sumažėjimo minutė"</string> diff --git a/core/res/res/values-lv/strings.xml b/core/res/res/values-lv/strings.xml index a568c3b..6ebc733 100644 --- a/core/res/res/values-lv/strings.xml +++ b/core/res/res/values-lv/strings.xml @@ -1168,7 +1168,6 @@ <string name="add_account_button_label" msgid="3611982894853435874">"Pievienot kontu"</string> <string name="number_picker_increment_button" msgid="4830170763103463443">"Palielināt"</string> <string name="number_picker_decrement_button" msgid="2576606679160067262">"Samazināt"</string> - <string name="number_picker_increment_scroll_mode" msgid="3073101067441638428">"<xliff:g id="VALUE">%s</xliff:g>: pieskarieties un turiet nospiestu."</string> <string name="number_picker_increment_scroll_action" msgid="4628981789985093179">"Bīdiet uz augšu, lai palielinātu vērtību, un uz leju, lai to samazinātu."</string> <string name="time_picker_increment_minute_button" msgid="2843066823236250329">"Palielināt minūtes vērtību"</string> <string name="time_picker_decrement_minute_button" msgid="4357907223628449595">"Samazināt minūtes vērtību"</string> diff --git a/core/res/res/values-ms/strings.xml b/core/res/res/values-ms/strings.xml index 87f8f8d..2b7fc36 100644 --- a/core/res/res/values-ms/strings.xml +++ b/core/res/res/values-ms/strings.xml @@ -336,11 +336,11 @@ <string name="permdesc_writeContacts" product="tablet" msgid="988969759110632978">"Membenarkan apl untuk mengubah suai data kenalan (alamat) yang disimpan pada tablet anda. Apl hasad boleh menggunakannya untuk memadam atau mengubah suai data kenalan anda."</string> <string name="permdesc_writeContacts" product="default" msgid="5075164818647934067">"Membenarkan apl untuk mengubah suai data kenalan (alamat) yang disimpan pada telefon anda. Apl hasad boleh menggunakannya untuk memadam atau mengubah suai data kenalan anda."</string> <string name="permlab_readCallLog" msgid="3478133184624102739">"baca log panggilan"</string> - <string name="permdesc_readCallLog" product="tablet" msgid="3995157599976515002">"Membenarkan apl membaca log panggilan tablet anda, termasuk data tentang panggilan masuk dan keluar. Apl hasad boleh menggunakan ini untuk menghantar data anda kepada orang lain."</string> - <string name="permdesc_readCallLog" product="default" msgid="3452017559804750758">"Membenarkan apl membaca log panggilan telefon anda, termasuk data tentang panggilan masuk dan keluar. Apl hasad boleh menggunakan ini untuk menghantar data anda kepada orang lain."</string> + <string name="permdesc_readCallLog" product="tablet" msgid="3995157599976515002">"Membenarkan apl membaca log panggilan tablet anda, termasuk data tentang panggilan masuk dan keluar. Apl hasad boleh menggunakannya untuk menghantar data anda kepada orang lain."</string> + <string name="permdesc_readCallLog" product="default" msgid="3452017559804750758">"Membenarkan apl membaca log panggilan telefon anda, termasuk data tentang panggilan masuk dan keluar. Apl hasad boleh menggunakannya untuk menghantar data anda kepada orang lain."</string> <string name="permlab_writeCallLog" msgid="8552045664743499354">"tulis log panggilan"</string> - <string name="permdesc_writeCallLog" product="tablet" msgid="6661806062274119245">"Membenarkan apl untuk mengubah suai panggilan tablet anda, termasuk data tentang panggilan masuk dan keluar. Apl hasad boleh menggunakan ini untuk memadam atau mengubah suai log panggilan anda."</string> - <string name="permdesc_writeCallLog" product="default" msgid="683941736352787842">"Membenarkan apl untuk mengubah suai panggilan telefon anda, termasuk data tentang panggilan masuk dan keluar. Apl hasad boleh menggunakan ini untuk memadam atau mengubah suai log panggilan anda."</string> + <string name="permdesc_writeCallLog" product="tablet" msgid="6661806062274119245">"Membenarkan apl untuk mengubah suai panggilan tablet anda, termasuk data tentang panggilan masuk dan keluar. Apl hasad boleh menggunakannya untuk memadam atau mengubah suai log panggilan anda."</string> + <string name="permdesc_writeCallLog" product="default" msgid="683941736352787842">"Membenarkan apl untuk mengubah suai panggilan telefon anda, termasuk data tentang panggilan masuk dan keluar. Apl hasad boleh menggunakannya untuk memadam atau mengubah suai log panggilan anda."</string> <string name="permlab_readProfile" msgid="6824681438529842282">"baca data profil anda"</string> <string name="permdesc_readProfile" product="default" msgid="94520753797630679">"Membenarkan apl untuk membaca maklumat profil peribadi yang disimpan dalam peranti anda, seperti nama dan maklumat kenalan anda. Ini bermakna apl lain boleh mengenal pasti anda dan menghantar maklumat profil anda kepada orang lain."</string> <string name="permlab_writeProfile" msgid="4679878325177177400">"tulis ke data profil anda"</string> @@ -1168,7 +1168,6 @@ <string name="add_account_button_label" msgid="3611982894853435874">"Tambah akaun"</string> <string name="number_picker_increment_button" msgid="4830170763103463443">"Kenaikan"</string> <string name="number_picker_decrement_button" msgid="2576606679160067262">"Penyusutan"</string> - <string name="number_picker_increment_scroll_mode" msgid="3073101067441638428">"<xliff:g id="VALUE">%s</xliff:g> sentuh terus."</string> <string name="number_picker_increment_scroll_action" msgid="4628981789985093179">"Luncurkan ke atas untuk kenaikan dan ke bawah untuk penyusutan."</string> <string name="time_picker_increment_minute_button" msgid="2843066823236250329">"Minit kenaikan"</string> <string name="time_picker_decrement_minute_button" msgid="4357907223628449595">"Minit penyusutan"</string> diff --git a/core/res/res/values-nb/strings.xml b/core/res/res/values-nb/strings.xml index fec439d..580d30c 100644 --- a/core/res/res/values-nb/strings.xml +++ b/core/res/res/values-nb/strings.xml @@ -507,7 +507,7 @@ <string name="permdesc_writeDictionary" msgid="8185385716255065291">"Lar appen skrive nye ord i brukerordlisten."</string> <string name="permlab_sdcardRead" product="nosdcard" msgid="4086221374639183281">"lese innhold på USB-lagr."</string> <string name="permlab_sdcardRead" product="default" msgid="8537875151845139539">"lese innhold på SD-kortet"</string> - <string name="permdesc_sdcardRead" product="nosdcard" msgid="1055302898999352339">"Lar appen lese innhold på USB-lagringsenheten."</string> + <string name="permdesc_sdcardRead" product="nosdcard" msgid="1055302898999352339">"Lar appen lese innhold på USB-lager."</string> <string name="permdesc_sdcardRead" product="default" msgid="7947792373570683542">"Lar appen lese innhold på SD-kortet."</string> <string name="permlab_sdcardWrite" product="nosdcard" msgid="85430876310764752">"endre/slette innh. i USB-lagr."</string> <string name="permlab_sdcardWrite" product="default" msgid="8079403759001777291">"redigere/slette innhold på minnekort"</string> @@ -1168,7 +1168,6 @@ <string name="add_account_button_label" msgid="3611982894853435874">"Legg til konto"</string> <string name="number_picker_increment_button" msgid="4830170763103463443">"Øke"</string> <string name="number_picker_decrement_button" msgid="2576606679160067262">"Senke"</string> - <string name="number_picker_increment_scroll_mode" msgid="3073101067441638428">"<xliff:g id="VALUE">%s</xliff:g> – trykk og hold inne."</string> <string name="number_picker_increment_scroll_action" msgid="4628981789985093179">"Skyv opp for å øke og ned for å redusere."</string> <string name="time_picker_increment_minute_button" msgid="2843066823236250329">"Endre minutter (fremover)"</string> <string name="time_picker_decrement_minute_button" msgid="4357907223628449595">"Endre minutter (bakover)"</string> diff --git a/core/res/res/values-nl/strings.xml b/core/res/res/values-nl/strings.xml index 030222d..010a4d8 100644 --- a/core/res/res/values-nl/strings.xml +++ b/core/res/res/values-nl/strings.xml @@ -1168,7 +1168,6 @@ <string name="add_account_button_label" msgid="3611982894853435874">"Account toevoegen"</string> <string name="number_picker_increment_button" msgid="4830170763103463443">"Hoger"</string> <string name="number_picker_decrement_button" msgid="2576606679160067262">"Lager"</string> - <string name="number_picker_increment_scroll_mode" msgid="3073101067441638428">"<xliff:g id="VALUE">%s</xliff:g> blijven aanraken."</string> <string name="number_picker_increment_scroll_action" msgid="4628981789985093179">"Schuif omhoog om te verhogen en omlaag om te verlagen."</string> <string name="time_picker_increment_minute_button" msgid="2843066823236250329">"Minuten verhogen"</string> <string name="time_picker_decrement_minute_button" msgid="4357907223628449595">"Minuten verlagen"</string> diff --git a/core/res/res/values-pl/strings.xml b/core/res/res/values-pl/strings.xml index 9e4cbf3..3d58076 100644 --- a/core/res/res/values-pl/strings.xml +++ b/core/res/res/values-pl/strings.xml @@ -1168,7 +1168,6 @@ <string name="add_account_button_label" msgid="3611982894853435874">"Dodaj konto"</string> <string name="number_picker_increment_button" msgid="4830170763103463443">"Zwiększ"</string> <string name="number_picker_decrement_button" msgid="2576606679160067262">"Zmniejsz"</string> - <string name="number_picker_increment_scroll_mode" msgid="3073101067441638428">"<xliff:g id="VALUE">%s</xliff:g> dotknij i przytrzymaj."</string> <string name="number_picker_increment_scroll_action" msgid="4628981789985093179">"Przesuń w górę, aby zwiększyć wartość, lub w dół, aby ją zmniejszyć."</string> <string name="time_picker_increment_minute_button" msgid="2843066823236250329">"Następna minuta"</string> <string name="time_picker_decrement_minute_button" msgid="4357907223628449595">"Poprzednia minuta"</string> diff --git a/core/res/res/values-pt-rPT/strings.xml b/core/res/res/values-pt-rPT/strings.xml index abe1454..3e4c31b 100644 --- a/core/res/res/values-pt-rPT/strings.xml +++ b/core/res/res/values-pt-rPT/strings.xml @@ -1168,7 +1168,6 @@ <string name="add_account_button_label" msgid="3611982894853435874">"Adicionar conta"</string> <string name="number_picker_increment_button" msgid="4830170763103463443">"Aumentar"</string> <string name="number_picker_decrement_button" msgid="2576606679160067262">"Diminuir"</string> - <string name="number_picker_increment_scroll_mode" msgid="3073101067441638428">"Toque sem soltar em <xliff:g id="VALUE">%s</xliff:g>."</string> <string name="number_picker_increment_scroll_action" msgid="4628981789985093179">"Deslize lentamente para cima para aumentar e para baixo para diminuir."</string> <string name="time_picker_increment_minute_button" msgid="2843066823236250329">"Aumentar minuto"</string> <string name="time_picker_decrement_minute_button" msgid="4357907223628449595">"Diminuir minuto"</string> diff --git a/core/res/res/values-pt/strings.xml b/core/res/res/values-pt/strings.xml index 3ae566c..0af0052 100644 --- a/core/res/res/values-pt/strings.xml +++ b/core/res/res/values-pt/strings.xml @@ -1168,7 +1168,6 @@ <string name="add_account_button_label" msgid="3611982894853435874">"Adicionar conta"</string> <string name="number_picker_increment_button" msgid="4830170763103463443">"Incremento"</string> <string name="number_picker_decrement_button" msgid="2576606679160067262">"Redução"</string> - <string name="number_picker_increment_scroll_mode" msgid="3073101067441638428">"<xliff:g id="VALUE">%s</xliff:g> toque e mantenha pressionado."</string> <string name="number_picker_increment_scroll_action" msgid="4628981789985093179">"Deslize para cima para aumentar e para baixo para diminuir."</string> <string name="time_picker_increment_minute_button" msgid="2843066823236250329">"Aumentar minuto"</string> <string name="time_picker_decrement_minute_button" msgid="4357907223628449595">"Diminuir minuto"</string> diff --git a/core/res/res/values-rm/strings.xml b/core/res/res/values-rm/strings.xml index fc6a510..f14b247 100644 --- a/core/res/res/values-rm/strings.xml +++ b/core/res/res/values-rm/strings.xml @@ -1746,8 +1746,6 @@ <skip /> <!-- no translation found for number_picker_decrement_button (2576606679160067262) --> <skip /> - <!-- no translation found for number_picker_increment_scroll_mode (3073101067441638428) --> - <skip /> <!-- no translation found for number_picker_increment_scroll_action (4628981789985093179) --> <skip /> <!-- no translation found for time_picker_increment_minute_button (2843066823236250329) --> diff --git a/core/res/res/values-ro/strings.xml b/core/res/res/values-ro/strings.xml index d443d1d..32d25c1 100644 --- a/core/res/res/values-ro/strings.xml +++ b/core/res/res/values-ro/strings.xml @@ -1168,7 +1168,6 @@ <string name="add_account_button_label" msgid="3611982894853435874">"Adăugaţi un cont"</string> <string name="number_picker_increment_button" msgid="4830170763103463443">"Incrementaţi"</string> <string name="number_picker_decrement_button" msgid="2576606679160067262">"Decrementaţi"</string> - <string name="number_picker_increment_scroll_mode" msgid="3073101067441638428">"Atingeţi şi ţineţi apăsat <xliff:g id="VALUE">%s</xliff:g>."</string> <string name="number_picker_increment_scroll_action" msgid="4628981789985093179">"Glisaţi în sus pentru incrementare şi în jos pentru decrementare."</string> <string name="time_picker_increment_minute_button" msgid="2843066823236250329">"Incrementaţi valoarea pentru minut"</string> <string name="time_picker_decrement_minute_button" msgid="4357907223628449595">"Decrementaţi valoarea pentru minut"</string> diff --git a/core/res/res/values-ru/strings.xml b/core/res/res/values-ru/strings.xml index 5ed4c2e..989be4a 100644 --- a/core/res/res/values-ru/strings.xml +++ b/core/res/res/values-ru/strings.xml @@ -1168,7 +1168,6 @@ <string name="add_account_button_label" msgid="3611982894853435874">"Добавить аккаунт"</string> <string name="number_picker_increment_button" msgid="4830170763103463443">"Увеличить"</string> <string name="number_picker_decrement_button" msgid="2576606679160067262">"Уменьшить"</string> - <string name="number_picker_increment_scroll_mode" msgid="3073101067441638428">"Нажмите и удерживайте <xliff:g id="VALUE">%s</xliff:g>."</string> <string name="number_picker_increment_scroll_action" msgid="4628981789985093179">"Проведите вверх, чтобы увеличить значение, и вниз, чтобы уменьшить его."</string> <string name="time_picker_increment_minute_button" msgid="2843066823236250329">"На минуту вперед"</string> <string name="time_picker_decrement_minute_button" msgid="4357907223628449595">"На минуту назад"</string> diff --git a/core/res/res/values-sk/strings.xml b/core/res/res/values-sk/strings.xml index 2e97b82..4a1fe20 100644 --- a/core/res/res/values-sk/strings.xml +++ b/core/res/res/values-sk/strings.xml @@ -1168,7 +1168,6 @@ <string name="add_account_button_label" msgid="3611982894853435874">"Pridať účet"</string> <string name="number_picker_increment_button" msgid="4830170763103463443">"Zvýšenie"</string> <string name="number_picker_decrement_button" msgid="2576606679160067262">"Zníženie"</string> - <string name="number_picker_increment_scroll_mode" msgid="3073101067441638428">"Dotknite sa a podržte <xliff:g id="VALUE">%s</xliff:g>."</string> <string name="number_picker_increment_scroll_action" msgid="4628981789985093179">"Ak chcete pripočítať, potiahnite prst nahor. Ak chcete odpočítať, potiahnite prst nadol."</string> <string name="time_picker_increment_minute_button" msgid="2843066823236250329">"Pripočítať minútu"</string> <string name="time_picker_decrement_minute_button" msgid="4357907223628449595">"Odpočítať minútu"</string> diff --git a/core/res/res/values-sl/strings.xml b/core/res/res/values-sl/strings.xml index f66cabb..e079147 100644 --- a/core/res/res/values-sl/strings.xml +++ b/core/res/res/values-sl/strings.xml @@ -1168,7 +1168,6 @@ <string name="add_account_button_label" msgid="3611982894853435874">"Dodaj račun"</string> <string name="number_picker_increment_button" msgid="4830170763103463443">"Povečaj"</string> <string name="number_picker_decrement_button" msgid="2576606679160067262">"Zmanjšaj"</string> - <string name="number_picker_increment_scroll_mode" msgid="3073101067441638428">"Dotaknite se vrednosti <xliff:g id="VALUE">%s</xliff:g> in jo pridržite."</string> <string name="number_picker_increment_scroll_action" msgid="4628981789985093179">"Povlecite gor za povečanje in dol za zmanjšanje."</string> <string name="time_picker_increment_minute_button" msgid="2843066823236250329">"Povečaj minute"</string> <string name="time_picker_decrement_minute_button" msgid="4357907223628449595">"Zmanjšaj minute"</string> diff --git a/core/res/res/values-sr/strings.xml b/core/res/res/values-sr/strings.xml index 66c0561..273a3ac 100644 --- a/core/res/res/values-sr/strings.xml +++ b/core/res/res/values-sr/strings.xml @@ -1168,7 +1168,6 @@ <string name="add_account_button_label" msgid="3611982894853435874">"Додај налог"</string> <string name="number_picker_increment_button" msgid="4830170763103463443">"Повећање"</string> <string name="number_picker_decrement_button" msgid="2576606679160067262">"Смањење"</string> - <string name="number_picker_increment_scroll_mode" msgid="3073101067441638428">"<xliff:g id="VALUE">%s</xliff:g> додирните и задржите."</string> <string name="number_picker_increment_scroll_action" msgid="4628981789985093179">"Превуците нагоре за повећање, а надоле за смањење."</string> <string name="time_picker_increment_minute_button" msgid="2843066823236250329">"Повећај минуте"</string> <string name="time_picker_decrement_minute_button" msgid="4357907223628449595">"Смањи минуте"</string> diff --git a/core/res/res/values-sv/strings.xml b/core/res/res/values-sv/strings.xml index eee0d80..291f36b 100644 --- a/core/res/res/values-sv/strings.xml +++ b/core/res/res/values-sv/strings.xml @@ -1169,7 +1169,6 @@ <string name="add_account_button_label" msgid="3611982894853435874">"Lägg till konto"</string> <string name="number_picker_increment_button" msgid="4830170763103463443">"Öka"</string> <string name="number_picker_decrement_button" msgid="2576606679160067262">"Minska"</string> - <string name="number_picker_increment_scroll_mode" msgid="3073101067441638428">"<xliff:g id="VALUE">%s</xliff:g> tryck länge."</string> <string name="number_picker_increment_scroll_action" msgid="4628981789985093179">"Skjut uppåt för att öka och nedåt för att minska."</string> <string name="time_picker_increment_minute_button" msgid="2843066823236250329">"Öka minuter"</string> <string name="time_picker_decrement_minute_button" msgid="4357907223628449595">"Minska minuter"</string> diff --git a/core/res/res/values-sw/strings.xml b/core/res/res/values-sw/strings.xml index 3b870cf..dfdeb2f 100644 --- a/core/res/res/values-sw/strings.xml +++ b/core/res/res/values-sw/strings.xml @@ -335,12 +335,12 @@ <string name="permlab_writeContacts" msgid="644616215860933284">"andika data ya anwani"</string> <string name="permdesc_writeContacts" product="tablet" msgid="988969759110632978">"Inaruhusu programu kurekebisha data ya mwasiliani(anwani) iliyohifadhiwa kwenye kompyuta yako ki. programu hasidi zinaweza tumia hii kufuta au kurekebisha data yako ya mwasiliani."</string> <string name="permdesc_writeContacts" product="default" msgid="5075164818647934067">"Inaruhusu programu kurekebisha data ya mwasiliani(anwani) iliyohifadhiwa kwenye simu yako. Programu hasidi zinaweza kutumia hii kufuta au kurekebisha data yako ya mwasiliani."</string> - <string name="permlab_readCallLog" msgid="3478133184624102739">"soma kumbukumbu ya simu"</string> - <string name="permdesc_readCallLog" product="tablet" msgid="3995157599976515002">"Huruhusu programu kusoma kumbukumbu ya kompyuta kibao yako, ikiwa ni pamoja na simu zinazoingia na kutoka. Huenda programu hasidi zikatumia hii ili kutuma data yako kwa watu wengine."</string> - <string name="permdesc_readCallLog" product="default" msgid="3452017559804750758">"Huruhusu programu kusoma kumbukumbu ya simu yako, ikiwa ni pamoja na simu zinazoingia na kutoka. Huenda programu hasidi zikatumia hii ili kutuma data yako kwa watu wengine."</string> - <string name="permlab_writeCallLog" msgid="8552045664743499354">"andika kumbukumbu ya simu"</string> - <string name="permdesc_writeCallLog" product="tablet" msgid="6661806062274119245">"Huruhusu programu kusoma kumbukumbu ya kompyuta kibao yako, ikiwa ni pamoja na simu zinazoingia na kutoka. Huenda programu hasidi zikatumia hii ili kufuta au kurekebisha kumbukumbu ya simu yako."</string> - <string name="permdesc_writeCallLog" product="default" msgid="683941736352787842">"Huruhusu programu kusoma kumbukumbu ya simu yako, ikiwa ni pamoja na simu zinazoingia na kutoka. Huenda programu hasidi zikatumia hii ili kufuta au kurekebisha kumbukumbu ya simu yako."</string> + <string name="permlab_readCallLog" msgid="3478133184624102739">"soma rajisi ya simu"</string> + <string name="permdesc_readCallLog" product="tablet" msgid="3995157599976515002">"Huruhusu programu kusoma rajisi ya simu ya kompyuta kibao yako, ikiwa ni pamoja na simu zinazoingia na kutoka. Huenda programu hasidi zikatumia hii ili kutuma data yako kwa watu wengine."</string> + <string name="permdesc_readCallLog" product="default" msgid="3452017559804750758">"Huruhusu programu kusoma rajisi ya simu yako, ikiwa ni pamoja na data kuhusu simu zinazoingia na kutoka. Huenda programu hasidi zikatumia hii ili kutuma data yako kwa watu wengine."</string> + <string name="permlab_writeCallLog" msgid="8552045664743499354">"andika rajisi ya simu"</string> + <string name="permdesc_writeCallLog" product="tablet" msgid="6661806062274119245">"Huruhusu programu kurekebisha rajisi ya kompyuta kibao yako, ikiwa ni pamoja na simu zinazoingia na kutoka. Huenda programu hasidi zikatumia hii ili kufuta au kurekebisha rajisi ya simu yako."</string> + <string name="permdesc_writeCallLog" product="default" msgid="683941736352787842">"Huruhusu programu kurekebisha rajisi ya simu yako, ikiwa ni pamoja na simu zinazoingia na kutoka. Huenda programu hasidi zikatumia hii ili kufuta au kurekebisha rajisi ya simu yako."</string> <string name="permlab_readProfile" msgid="6824681438529842282">"soma data ya maelezo yako mafupi"</string> <string name="permdesc_readProfile" product="default" msgid="94520753797630679">"Inaruhusu programu kusoma maelezo mafupi ya kibinafsi yaliyohifadhiwa kwenye kifaa chako, kama vile jina lako na taarifa ya kuwasiliana. Hii ina maanisha programu inaweza kukutambua na kutuma taarifa yako fupi ya kibinafsi kwa wengine."</string> <string name="permlab_writeProfile" msgid="4679878325177177400">"andika kwenye data ya maelezo yako mafupi"</string> @@ -1168,7 +1168,6 @@ <string name="add_account_button_label" msgid="3611982894853435874">"Ongeza akaunti"</string> <string name="number_picker_increment_button" msgid="4830170763103463443">"Ongezeko"</string> <string name="number_picker_decrement_button" msgid="2576606679160067262">"Punguza"</string> - <string name="number_picker_increment_scroll_mode" msgid="3073101067441638428">"<xliff:g id="VALUE">%s</xliff:g> gusa na ushikilie."</string> <string name="number_picker_increment_scroll_action" msgid="4628981789985093179">"Nyiririsha juu kuongeza na chini kupunguza."</string> <string name="time_picker_increment_minute_button" msgid="2843066823236250329">"Dakika ya nyongeza"</string> <string name="time_picker_decrement_minute_button" msgid="4357907223628449595">"Dakika pungufu"</string> diff --git a/core/res/res/values-th/strings.xml b/core/res/res/values-th/strings.xml index 0542f8e..ebd2a31 100644 --- a/core/res/res/values-th/strings.xml +++ b/core/res/res/values-th/strings.xml @@ -336,11 +336,11 @@ <string name="permdesc_writeContacts" product="tablet" msgid="988969759110632978">"อนุญาตให้แอปพลิเคชันแก้ไขข้อมูลการติดต่อ (ที่อยู่) ที่เก็บไว้ในแท็บเล็ตของคุณ แอปพลิเคชันที่เป็นอันตรายอาจใช้การอนุญาตนี้ลบหรือแก้ไขข้อมูลการติดต่อของคุณ"</string> <string name="permdesc_writeContacts" product="default" msgid="5075164818647934067">"อนุญาตให้แอปพลิเคชันแก้ไขข้อมูลการติดต่อ (ที่อยู่) ที่เก็บไว้ในโทรศัพท์ของคุณ แอปพลิเคชันที่เป็นอันตรายอาจใช้การอนุญาตนี้ลบหรือแก้ไขข้อมูลการติดต่อของคุณ"</string> <string name="permlab_readCallLog" msgid="3478133184624102739">"อ่านประวัติการโทร"</string> - <string name="permdesc_readCallLog" product="tablet" msgid="3995157599976515002">"อนุญาตให้แอปพลิเคชันอ่านประวัติการโทรของแท็บเล็ตของคุณ รวมถึงข้อมูลเกี่ยวกับสายเรียกเข้าและการโทรออก แอปพลิเคชันที่เป็นอันตรายอาจใช้สิ่งนี้เพื่อส่งข้อมูลของคุณให้กับบุคคลอื่น"</string> - <string name="permdesc_readCallLog" product="default" msgid="3452017559804750758">"อนุญาตให้แอปพลิเคชันอ่านประวัติการโทรของโทรศัพท์ของคุณ รวมถึงข้อมูลเกี่ยวกับสายเรียกเข้าและการโทรออก แอปพลิเคชันที่เป็นอันตรายอาจใช้สิ่งนี้เพื่อส่งข้อมูลของคุณให้กับบุคคลอื่น"</string> + <string name="permdesc_readCallLog" product="tablet" msgid="3995157599976515002">"อนุญาตให้แอปอ่านประวัติการโทรจากแท็บเล็ตของคุณ รวมถึงข้อมูลเกี่ยวกับสายเรียกเข้าและการโทรออก แอปที่เป็นอันตรายอาจใช้สิ่งนี้เพื่อส่งข้อมูลของคุณให้กับบุคคลอื่น"</string> + <string name="permdesc_readCallLog" product="default" msgid="3452017559804750758">"อนุญาตให้แอปอ่านประวัติการโทรจากโทรศัพท์ของคุณ รวมถึงข้อมูลเกี่ยวกับสายเรียกเข้าและการโทรออก แอปที่เป็นอันตรายอาจใช้สิ่งนี้เพื่อส่งข้อมูลของคุณให้กับบุคคลอื่น"</string> <string name="permlab_writeCallLog" msgid="8552045664743499354">"เขียนประวัติการโทร"</string> - <string name="permdesc_writeCallLog" product="tablet" msgid="6661806062274119245">"อนุญาตให้แอปพลิเคชันแก้ไขประวัติการโทรของแท็บเล็ตของคุณ รวมถึงข้อมูลเกี่ยวกับสายเรียกเข้าและการโทรออก แอปพลิเคชันที่เป็นอันตรายอาจใช้สิ่งนี้เพื่อลบหรือแก้ไขประวัติการโทรของคุณ"</string> - <string name="permdesc_writeCallLog" product="default" msgid="683941736352787842">"อนุญาตให้แอปพลิเคชันแก้ไขประวัติการโทรของโทรศัพท์ของคุณ รวมถึงข้อมูลเกี่ยวกับสายเรียกเข้าและการโทรออก แอปพลิเคชันที่เป็นอันตรายอาจใช้สิ่งนี้เพื่อลบหรือแก้ไขประวัติการโทรของคุณ"</string> + <string name="permdesc_writeCallLog" product="tablet" msgid="6661806062274119245">"อนุญาตให้แอปแก้ไขประวัติการโทรจากแท็บเล็ตของคุณ รวมถึงข้อมูลเกี่ยวกับสายเรียกเข้าและการโทรออก แอปที่เป็นอันตรายอาจใช้สิ่งนี้เพื่อลบหรือแก้ไขประวัติการโทรของคุณ"</string> + <string name="permdesc_writeCallLog" product="default" msgid="683941736352787842">"อนุญาตให้แอปแก้ไขประวัติการโทรจากโทรศัพท์ของคุณ รวมถึงข้อมูลเกี่ยวกับสายเรียกเข้าและการโทรออก แอปที่เป็นอันตรายอาจใช้สิ่งนี้เพื่อลบหรือแก้ไขประวัติการโทรของคุณ"</string> <string name="permlab_readProfile" msgid="6824681438529842282">"อ่านข้อมูลโปรไฟล์ของคุณ"</string> <string name="permdesc_readProfile" product="default" msgid="94520753797630679">"อนุญาตให้แอปพลิเคชันอ่านข้อมูลโปรไฟล์ส่วนบุคคลที่เก็บไว้บนอุปกรณ์ของคุณ เช่น ชื่อและข้อมูลติดต่อ ซึ่งหมายความว่าแอปพลิเคชันจะสามารถระบุตัวตนของคุณและส่งข้อมูลโปรไฟล์ของคุณแก่ผู้อื่นได้"</string> <string name="permlab_writeProfile" msgid="4679878325177177400">"เขียนลงในข้อมูลโปรไฟล์ของคุณ"</string> @@ -1168,7 +1168,6 @@ <string name="add_account_button_label" msgid="3611982894853435874">"เพิ่มบัญชี"</string> <string name="number_picker_increment_button" msgid="4830170763103463443">"การเพิ่ม"</string> <string name="number_picker_decrement_button" msgid="2576606679160067262">"การลด"</string> - <string name="number_picker_increment_scroll_mode" msgid="3073101067441638428">"แตะ <xliff:g id="VALUE">%s</xliff:g> ค้างไว้"</string> <string name="number_picker_increment_scroll_action" msgid="4628981789985093179">"เลื่อนขึ้นเพื่อเพิ่มและเลื่อนลงเพื่อลด"</string> <string name="time_picker_increment_minute_button" msgid="2843066823236250329">"เพิ่มนาที"</string> <string name="time_picker_decrement_minute_button" msgid="4357907223628449595">"ลดนาที"</string> diff --git a/core/res/res/values-tl/strings.xml b/core/res/res/values-tl/strings.xml index dc22a08..0cc2b1f 100644 --- a/core/res/res/values-tl/strings.xml +++ b/core/res/res/values-tl/strings.xml @@ -1168,7 +1168,6 @@ <string name="add_account_button_label" msgid="3611982894853435874">"Magdagdag ng account"</string> <string name="number_picker_increment_button" msgid="4830170763103463443">"Taasan"</string> <string name="number_picker_decrement_button" msgid="2576606679160067262">"Babaan"</string> - <string name="number_picker_increment_scroll_mode" msgid="3073101067441638428">"<xliff:g id="VALUE">%s</xliff:g> pindutin nang matagal."</string> <string name="number_picker_increment_scroll_action" msgid="4628981789985093179">"I-slide pataas upang magdagdag at pababa upang magbawas."</string> <string name="time_picker_increment_minute_button" msgid="2843066823236250329">"Minuto ng pagdaragdag"</string> <string name="time_picker_decrement_minute_button" msgid="4357907223628449595">"Minuto ng pagbawas"</string> diff --git a/core/res/res/values-tr/strings.xml b/core/res/res/values-tr/strings.xml index 419ae96..c4a5e83 100644 --- a/core/res/res/values-tr/strings.xml +++ b/core/res/res/values-tr/strings.xml @@ -1168,7 +1168,6 @@ <string name="add_account_button_label" msgid="3611982894853435874">"Hesap ekle"</string> <string name="number_picker_increment_button" msgid="4830170763103463443">"Artır"</string> <string name="number_picker_decrement_button" msgid="2576606679160067262">"Azalt"</string> - <string name="number_picker_increment_scroll_mode" msgid="3073101067441638428">"<xliff:g id="VALUE">%s</xliff:g> rakamına dokunun ve basılı tutun."</string> <string name="number_picker_increment_scroll_action" msgid="4628981789985093179">"Artırmak için yukarı, azaltmak için aşağı kaydırın."</string> <string name="time_picker_increment_minute_button" msgid="2843066823236250329">"Dakika değerini artır"</string> <string name="time_picker_decrement_minute_button" msgid="4357907223628449595">"Dakika değerini azalt"</string> diff --git a/core/res/res/values-uk/strings.xml b/core/res/res/values-uk/strings.xml index 13311f1..ac04bc2 100644 --- a/core/res/res/values-uk/strings.xml +++ b/core/res/res/values-uk/strings.xml @@ -1168,7 +1168,6 @@ <string name="add_account_button_label" msgid="3611982894853435874">"Додати облік. запис"</string> <string name="number_picker_increment_button" msgid="4830170763103463443">"Додати"</string> <string name="number_picker_decrement_button" msgid="2576606679160067262">"Відняти"</string> - <string name="number_picker_increment_scroll_mode" msgid="3073101067441638428">"<xliff:g id="VALUE">%s</xliff:g> – торкніться й утримуйте."</string> <string name="number_picker_increment_scroll_action" msgid="4628981789985093179">"Перемістіть угору, щоб додати, і вниз, щоб відняти."</string> <string name="time_picker_increment_minute_button" msgid="2843066823236250329">"Додати хвилину"</string> <string name="time_picker_decrement_minute_button" msgid="4357907223628449595">"Відняти хвилину"</string> diff --git a/core/res/res/values-vi/strings.xml b/core/res/res/values-vi/strings.xml index b94f104..7fa924b 100644 --- a/core/res/res/values-vi/strings.xml +++ b/core/res/res/values-vi/strings.xml @@ -1168,7 +1168,6 @@ <string name="add_account_button_label" msgid="3611982894853435874">"Thêm tài khoản"</string> <string name="number_picker_increment_button" msgid="4830170763103463443">"Tăng dần"</string> <string name="number_picker_decrement_button" msgid="2576606679160067262">"Giảm dần"</string> - <string name="number_picker_increment_scroll_mode" msgid="3073101067441638428">"Chạm và giữ <xliff:g id="VALUE">%s</xliff:g>."</string> <string name="number_picker_increment_scroll_action" msgid="4628981789985093179">"Trượt lên để tăng và trượt xuống để giảm."</string> <string name="time_picker_increment_minute_button" msgid="2843066823236250329">"Phút tăng dần"</string> <string name="time_picker_decrement_minute_button" msgid="4357907223628449595">"Phút giảm dần"</string> diff --git a/core/res/res/values-zh-rCN/strings.xml b/core/res/res/values-zh-rCN/strings.xml index 81d0ec6..53baaef 100644 --- a/core/res/res/values-zh-rCN/strings.xml +++ b/core/res/res/values-zh-rCN/strings.xml @@ -1168,7 +1168,6 @@ <string name="add_account_button_label" msgid="3611982894853435874">"添加帐户"</string> <string name="number_picker_increment_button" msgid="4830170763103463443">"增加"</string> <string name="number_picker_decrement_button" msgid="2576606679160067262">"减少"</string> - <string name="number_picker_increment_scroll_mode" msgid="3073101067441638428">"触摸 <xliff:g id="VALUE">%s</xliff:g> 次并按住。"</string> <string name="number_picker_increment_scroll_action" msgid="4628981789985093179">"向上滑动可增加值,向下滑动可减少值。"</string> <string name="time_picker_increment_minute_button" msgid="2843066823236250329">"增加分钟数"</string> <string name="time_picker_decrement_minute_button" msgid="4357907223628449595">"减少分钟数"</string> diff --git a/core/res/res/values-zh-rTW/strings.xml b/core/res/res/values-zh-rTW/strings.xml index e81e393..e5a15de 100644 --- a/core/res/res/values-zh-rTW/strings.xml +++ b/core/res/res/values-zh-rTW/strings.xml @@ -336,11 +336,11 @@ <string name="permdesc_writeContacts" product="tablet" msgid="988969759110632978">"允許應用程式修改平板電腦上儲存的聯絡人 (地址) 資料。請注意,惡意應用程式可能利用此功能清除或修改您的聯絡人資料。"</string> <string name="permdesc_writeContacts" product="default" msgid="5075164818647934067">"允許應用程式修改手機上儲存的聯絡人 (地址) 資料。請注意,惡意應用程式可能利用此功能清除或修改您的聯絡人資料。"</string> <string name="permlab_readCallLog" msgid="3478133184624102739">"讀取通話紀錄"</string> - <string name="permdesc_readCallLog" product="tablet" msgid="3995157599976515002">"允許應用程式讀取平板電腦的通話紀錄,包括來電和已撥電話相關資料。請注意,惡意應用程式可能利用此功能將您的資料傳送給他人。"</string> - <string name="permdesc_readCallLog" product="default" msgid="3452017559804750758">"允許應用程式讀取手機的通話紀錄,包括來電和已撥電話相關資料。請注意,惡意應用程式可能利用此功能將您的資料傳送給他人。"</string> + <string name="permdesc_readCallLog" product="tablet" msgid="3995157599976515002">"允許應用程式讀取平板電腦的通話紀錄,包括來電和已撥電話相關資料。請注意,惡意應用程式可能濫用此功能將您的資料傳送給他人。"</string> + <string name="permdesc_readCallLog" product="default" msgid="3452017559804750758">"允許應用程式讀取手機的通話紀錄,包括來電和已撥電話相關資料。請注意,惡意應用程式可能濫用此功能將您的資料傳送給他人。"</string> <string name="permlab_writeCallLog" msgid="8552045664743499354">"寫入通話紀錄"</string> - <string name="permdesc_writeCallLog" product="tablet" msgid="6661806062274119245">"允許應用程式修改平板電腦的通話紀錄,包括來電和已撥電話相關資料。請注意,惡意應用程式可能利用此功能刪除或修改您的通話記錄。"</string> - <string name="permdesc_writeCallLog" product="default" msgid="683941736352787842">"允許應用程式修改手機的通話紀錄,包括來電和已撥電話相關資料。請注意,惡意應用程式可能利用此功能刪除或修改您的通話記錄。"</string> + <string name="permdesc_writeCallLog" product="tablet" msgid="6661806062274119245">"允許應用程式修改平板電腦的通話紀錄,包括來電和已撥電話相關資料。請注意,惡意應用程式可能濫用此功能刪除或修改您的通話紀錄。"</string> + <string name="permdesc_writeCallLog" product="default" msgid="683941736352787842">"允許應用程式修改手機的通話紀錄,包括來電和已撥電話相關資料。請注意,惡意應用程式可能濫用此功能刪除或修改您的通話紀錄。"</string> <string name="permlab_readProfile" msgid="6824681438529842282">"讀取您的個人資料"</string> <string name="permdesc_readProfile" product="default" msgid="94520753797630679">"允許應用程式讀取裝置上儲存的個人資料,例如您的姓名和聯絡資訊。這表示應用程式可以識別您的身分,並將您的個人資料傳送給他人。"</string> <string name="permlab_writeProfile" msgid="4679878325177177400">"寫入您的個人資料"</string> @@ -1169,7 +1169,6 @@ <string name="add_account_button_label" msgid="3611982894853435874">"新增帳戶"</string> <string name="number_picker_increment_button" msgid="4830170763103463443">"增加"</string> <string name="number_picker_decrement_button" msgid="2576606679160067262">"減少"</string> - <string name="number_picker_increment_scroll_mode" msgid="3073101067441638428">"<xliff:g id="VALUE">%s</xliff:g> 輕觸並按住。"</string> <string name="number_picker_increment_scroll_action" msgid="4628981789985093179">"向上滑動即可增加,向下滑動即可減少。"</string> <string name="time_picker_increment_minute_button" msgid="2843066823236250329">"增加分鐘數"</string> <string name="time_picker_decrement_minute_button" msgid="4357907223628449595">"減少分鐘數"</string> diff --git a/core/res/res/values-zu/strings.xml b/core/res/res/values-zu/strings.xml index f43835f..c50a1a8 100644 --- a/core/res/res/values-zu/strings.xml +++ b/core/res/res/values-zu/strings.xml @@ -1168,7 +1168,6 @@ <string name="add_account_button_label" msgid="3611982894853435874">"Engeza i-akhawunti"</string> <string name="number_picker_increment_button" msgid="4830170763103463443">"Nciphisa"</string> <string name="number_picker_decrement_button" msgid="2576606679160067262">"Decrement"</string> - <string name="number_picker_increment_scroll_mode" msgid="3073101067441638428">"<xliff:g id="VALUE">%s</xliff:g> thinta bese ucindezela."</string> <string name="number_picker_increment_scroll_action" msgid="4628981789985093179">"Shishilizisa kwenyuke kuye ekwenyusweni kwehle kuye ekwehlisweni."</string> <string name="time_picker_increment_minute_button" msgid="2843066823236250329">"Iminithi wokwenyusa"</string> <string name="time_picker_decrement_minute_button" msgid="4357907223628449595">"Iminithi yokwehlisa"</string> diff --git a/core/res/res/values/attrs.xml b/core/res/res/values/attrs.xml index db908ca..428790f 100755 --- a/core/res/res/values/attrs.xml +++ b/core/res/res/values/attrs.xml @@ -589,12 +589,6 @@ <!-- NumberPicker style. --> <attr name="numberPickerStyle" format="reference" /> - <!-- NumberPicker up button style. --> - <attr name="numberPickerUpButtonStyle" format="reference" /> - <!-- NumberPicker down button style. --> - <attr name="numberPickerDownButtonStyle" format="reference" /> - <!-- NumberPicker input text style. --> - <attr name="numberPickerInputTextStyle" format="reference" /> <!-- The CalendarView style. --> <attr name="calendarViewStyle" format="reference" /> @@ -3617,12 +3611,12 @@ <declare-styleable name="NumberPicker"> <!-- @hide Color for the solid color background if such for optimized rendering. --> <attr name="solidColor" format="color|reference" /> - <!-- @hide Whether the number picker supports fligning. --> - <attr name="flingable" format="boolean" /> <!-- @hide The divider for making the selection area. --> <attr name="selectionDivider" format="reference" /> <!-- @hide The height of the selection divider. --> <attr name="selectionDividerHeight" format="dimension" /> + <!-- @hide The distance between the two selection dividers. --> + <attr name="selectionDividersDistance" format="dimension" /> <!-- @hide The min height of the NumberPicker. --> <attr name="internalMinHeight" format="dimension" /> <!-- @hide The max height of the NumberPicker. --> @@ -3631,6 +3625,10 @@ <attr name="internalMinWidth" format="dimension" /> <!-- @hide The max width of the NumberPicker. --> <attr name="internalMaxWidth" format="dimension" /> + <!-- @hide The layout of the number picker. --> + <attr name="internalLayout" /> + <!-- @hide The minimal move distance of a swipe to be considered a fling. --> + <attr name="minFlingDistance" format="dimension" /> </declare-styleable> <declare-styleable name="TimePicker"> diff --git a/core/res/res/values/colors.xml b/core/res/res/values/colors.xml index b1a4b42..5ff2c01 100644 --- a/core/res/res/values/colors.xml +++ b/core/res/res/values/colors.xml @@ -113,7 +113,7 @@ <color name="lockscreen_owner_info">#ff9a9a9a</color> <!-- FaceLock --> - <color name="facelock_color_background">#000000</color> + <color name="facelock_spotlight_mask">#CC000000</color> <!-- For holo theme --> <drawable name="screen_background_holo_light">#fff3f3f3</drawable> diff --git a/core/res/res/values/styles.xml b/core/res/res/values/styles.xml index a51f3f9..288b8b2 100644 --- a/core/res/res/values/styles.xml +++ b/core/res/res/values/styles.xml @@ -521,10 +521,10 @@ please see styles_device_defaults.xml. </style> <style name="Widget.NumberPicker"> + <item name="android:internalLayout">@android:layout/number_picker</item> <item name="android:orientation">vertical</item> <item name="android:fadingEdge">vertical</item> <item name="android:fadingEdgeLength">50dip</item> - <item name="android:flingable">false</item> </style> <style name="Widget.TimePicker"> @@ -536,25 +536,6 @@ please see styles_device_defaults.xml. <item name="android:calendarViewShown">false</item> </style> - <style name="Widget.ImageButton.NumberPickerUpButton"> - <item name="android:background">@android:drawable/numberpicker_up_btn</item> - <item name="android:paddingTop">22dip</item> - <item name="android:paddingBottom">22dip</item> - </style> - - <style name="Widget.ImageButton.NumberPickerDownButton"> - <item name="android:background">@android:drawable/numberpicker_down_btn</item> - <item name="android:paddingTop">22dip</item> - <item name="android:paddingBottom">22dip</item> - </style> - - <style name="Widget.EditText.NumberPickerInputText"> - <item name="android:textAppearance">@style/TextAppearance.Large.Inverse.NumberPickerInputText</item> - <item name="android:gravity">center</item> - <item name="android:singleLine">true</item> - <item name="android:background">@drawable/numberpicker_input</item> - </style> - <style name="Widget.AutoCompleteTextView" parent="Widget.EditText"> <item name="android:completionHintView">@android:layout/simple_dropdown_hint</item> <item name="android:completionThreshold">2</item> @@ -1656,12 +1637,14 @@ please see styles_device_defaults.xml. </style> <style name="Widget.Holo.NumberPicker" parent="Widget.NumberPicker"> + <item name="android:internalLayout">@android:layout/number_picker_with_selector_wheel</item> <item name="android:solidColor">@android:color/transparent</item> - <item name="android:flingable">true</item> <item name="android:selectionDivider">@android:drawable/numberpicker_selection_divider</item> <item name="android:selectionDividerHeight">2dip</item> + <item name="android:selectionDividersDistance">48dip</item> <item name="android:internalMinWidth">48dip</item> <item name="android:internalMaxHeight">200dip</item> + <item name="android:minFlingDistance">150dip</item> </style> <style name="Widget.Holo.TimePicker" parent="Widget.TimePicker"> @@ -1673,31 +1656,6 @@ please see styles_device_defaults.xml. <item name="android:calendarViewShown">true</item> </style> - <style name="Widget.Holo.ImageButton.NumberPickerUpButton"> - <item name="android:background">@null</item> - <item name="android:src">@android:drawable/numberpicker_up_btn_holo_dark</item> - <item name="android:paddingTop">16dip</item> - <item name="android:paddingBottom">22dip</item> - </style> - - <style name="Widget.Holo.ImageButton.NumberPickerDownButton"> - <item name="android:background">@null</item> - <item name="android:src">@android:drawable/numberpicker_down_btn_holo_dark</item> - <item name="android:paddingTop">22dip</item> - <item name="android:paddingBottom">16dip</item> - </style> - - <style name="Widget.Holo.EditText.NumberPickerInputText"> - <item name="android:paddingTop">13sp</item> - <item name="android:paddingBottom">13sp</item> - <item name="android:paddingLeft">2sp</item> - <item name="android:paddingRight">2sp</item> - <item name="android:gravity">center</item> - <item name="android:singleLine">true</item> - <item name="android:textSize">18sp</item> - <item name="android:background">@null</item> - </style> - <style name="Widget.Holo.ActivityChooserView" parent="Widget.ActivityChooserView"> </style> @@ -2109,17 +2067,6 @@ please see styles_device_defaults.xml. <style name="Widget.Holo.Light.DatePicker" parent="Widget.Holo.DatePicker"> </style> - <style name="Widget.Holo.Light.ImageButton.NumberPickerUpButton" parent="Widget.Holo.ImageButton.NumberPickerUpButton"> - <item name="android:src">@android:drawable/numberpicker_up_btn_holo_light</item> - </style> - - <style name="Widget.Holo.Light.ImageButton.NumberPickerDownButton" parent="Widget.Holo.ImageButton.NumberPickerDownButton"> - <item name="android:src">@android:drawable/numberpicker_down_btn_holo_light</item> - </style> - - <style name="Widget.Holo.Light.EditText.NumberPickerInputText" parent="Widget.Holo.EditText.NumberPickerInputText"> - </style> - <style name="Widget.Holo.Light.ActivityChooserView" parent="Widget.Holo.ActivityChooserView"> <item name="android:background">@android:drawable/ab_share_pack_holo_light</item> </style> diff --git a/core/res/res/values/styles_device_defaults.xml b/core/res/res/values/styles_device_defaults.xml index 6419872..330e68c 100644 --- a/core/res/res/values/styles_device_defaults.xml +++ b/core/res/res/values/styles_device_defaults.xml @@ -200,9 +200,6 @@ easier. <style name="Widget.DeviceDefault.CompoundButton.Switch" parent="Widget.Holo.CompoundButton.Switch"> </style> - <style name="Widget.DeviceDefault.EditText.NumberPickerInputText" parent="Widget.Holo.EditText.NumberPickerInputText"> - - </style> <style name="Widget.DeviceDefault.ExpandableListView.White" parent="Widget.Holo.ExpandableListView.White"> </style> @@ -212,12 +209,6 @@ easier. <style name="Widget.DeviceDefault.GestureOverlayView" parent="Widget.Holo.GestureOverlayView"> </style> - <style name="Widget.DeviceDefault.ImageButton.NumberPickerDownButton" parent="Widget.Holo.ImageButton.NumberPickerDownButton"> - - </style> - <style name="Widget.DeviceDefault.ImageButton.NumberPickerUpButton" parent="Widget.Holo.ImageButton.NumberPickerUpButton"> - - </style> <style name="Widget.DeviceDefault.ImageWell" parent="Widget.Holo.ImageWell"> </style> @@ -465,9 +456,6 @@ easier. <style name="Widget.DeviceDefault.Light.DatePicker" parent="Widget.Holo.Light.DatePicker"> </style> - <style name="Widget.DeviceDefault.Light.EditText.NumberPickerInputText" parent="Widget.Holo.Light.EditText.NumberPickerInputText"> - - </style> <style name="Widget.DeviceDefault.Light.ExpandableListView.White" parent="Widget.Holo.Light.ExpandableListView.White"> </style> @@ -477,12 +465,6 @@ easier. <style name="Widget.DeviceDefault.Light.GestureOverlayView" parent="Widget.Holo.Light.GestureOverlayView"> </style> - <style name="Widget.DeviceDefault.Light.ImageButton.NumberPickerDownButton" parent="Widget.Holo.Light.ImageButton.NumberPickerDownButton"> - - </style> - <style name="Widget.DeviceDefault.Light.ImageButton.NumberPickerUpButton" parent="Widget.Holo.Light.ImageButton.NumberPickerUpButton"> - - </style> <style name="Widget.DeviceDefault.Light.ImageWell" parent="Widget.Holo.Light.ImageWell"> </style> diff --git a/core/res/res/values/themes.xml b/core/res/res/values/themes.xml index 55438b2..7e06e24 100644 --- a/core/res/res/values/themes.xml +++ b/core/res/res/values/themes.xml @@ -345,10 +345,7 @@ please see themes_device_defaults.xml. <!-- PreferenceFrameLayout attributes --> <item name="preferenceFrameLayoutStyle">@android:style/Widget.PreferenceFrameLayout</item> - <!-- NumberPicker styles--> - <item name="numberPickerUpButtonStyle">@style/Widget.ImageButton.NumberPickerUpButton</item> - <item name="numberPickerDownButtonStyle">@style/Widget.ImageButton.NumberPickerDownButton</item> - <item name="numberPickerInputTextStyle">@style/Widget.EditText.NumberPickerInputText</item> + <!-- NumberPicker style--> <item name="numberPickerStyle">@style/Widget.NumberPicker</item> <!-- CalendarView style--> @@ -1141,10 +1138,7 @@ please see themes_device_defaults.xml. <!-- PreferenceFrameLayout attributes --> <item name="preferenceFrameLayoutStyle">@android:style/Widget.Holo.PreferenceFrameLayout</item> - <!-- NumberPicker styles--> - <item name="numberPickerUpButtonStyle">@style/Widget.Holo.ImageButton.NumberPickerUpButton</item> - <item name="numberPickerDownButtonStyle">@style/Widget.Holo.ImageButton.NumberPickerDownButton</item> - <item name="numberPickerInputTextStyle">@style/Widget.Holo.EditText.NumberPickerInputText</item> + <!-- NumberPicker style--> <item name="numberPickerStyle">@style/Widget.Holo.NumberPicker</item> <!-- CalendarView style--> @@ -1443,10 +1437,7 @@ please see themes_device_defaults.xml. <item name="searchDialogTheme">@style/Theme.Holo.Light.SearchBar</item> - <!-- NumberPicker attributes and styles--> - <item name="numberPickerUpButtonStyle">@style/Widget.Holo.Light.ImageButton.NumberPickerUpButton</item> - <item name="numberPickerDownButtonStyle">@style/Widget.Holo.Light.ImageButton.NumberPickerDownButton</item> - <item name="numberPickerInputTextStyle">@style/Widget.Holo.Light.EditText.NumberPickerInputText</item> + <!-- NumberPicker style--> <item name="numberPickerStyle">@style/Widget.Holo.Light.NumberPicker</item> <!-- CalendarView style--> diff --git a/core/res/res/values/themes_device_defaults.xml b/core/res/res/values/themes_device_defaults.xml index 7fd981c..ae9255a 100644 --- a/core/res/res/values/themes_device_defaults.xml +++ b/core/res/res/values/themes_device_defaults.xml @@ -179,10 +179,7 @@ easier. <!-- PreferenceFrameLayout attributes --> <item name="preferenceFrameLayoutStyle">@android:style/Widget.DeviceDefault.PreferenceFrameLayout</item> - <!-- NumberPicker styles--> - <item name="numberPickerUpButtonStyle">@style/Widget.DeviceDefault.ImageButton.NumberPickerUpButton</item> - <item name="numberPickerDownButtonStyle">@style/Widget.DeviceDefault.ImageButton.NumberPickerDownButton</item> - <item name="numberPickerInputTextStyle">@style/Widget.DeviceDefault.EditText.NumberPickerInputText</item> + <!-- NumberPicker style--> <item name="numberPickerStyle">@style/Widget.DeviceDefault.NumberPicker</item> <!-- CalendarView style--> @@ -329,10 +326,7 @@ easier. <item name="searchDialogTheme">@style/Theme.DeviceDefault.Light.SearchBar</item> - <!-- NumberPicker attributes and styles--> - <item name="numberPickerUpButtonStyle">@style/Widget.DeviceDefault.Light.ImageButton.NumberPickerUpButton</item> - <item name="numberPickerDownButtonStyle">@style/Widget.DeviceDefault.Light.ImageButton.NumberPickerDownButton</item> - <item name="numberPickerInputTextStyle">@style/Widget.DeviceDefault.Light.EditText.NumberPickerInputText</item> + <!-- NumberPicker style --> <item name="numberPickerStyle">@style/Widget.DeviceDefault.Light.NumberPicker</item> <!-- CalendarView style--> diff --git a/docs/html/sdk/android-4.0.3.jd b/docs/html/sdk/android-4.0.3.jd index 809c83c..c8563ac 100644 --- a/docs/html/sdk/android-4.0.3.jd +++ b/docs/html/sdk/android-4.0.3.jd @@ -68,15 +68,16 @@ the Android 4.0.x system components will not be available for download.</p> <p><a href="#" onclick="return toggleContent(this)"> <img src="{@docRoot}assets/images/triangle-opened.png" class="toggle-content-img" alt="" /> - Android {@sdkPlatformVersion}, Revision 2</a> <em>(January 2012)</em> + Revision 2</a> <em>(January 2012)</em> </a></p> <div class="toggle-content-toggleme" style="padding-left:2em;"> -<dl> -<dt>Maintenance release. SDK Tools r14 or higher is required. -</dt> -</dl> + <p>Maintenance update. The system version is 4.0.3.</p> + <dl> + <dt>Dependencies:</dt> + <dd>SDK Tools r14 or higher is required.</dd> + </dl> </div> </div> @@ -86,15 +87,16 @@ class="toggle-content-img" alt="" /> <p><a href="#" onclick="return toggleContent(this)"> <img src="{@docRoot}assets/images/triangle-closed.png" class="toggle-content-img" alt="" /> - Android {@sdkPlatformVersion}, Revision 1</a> <em>(December 2011)</em> + Revision 1</a> <em>(December 2011)</em> </a></p> <div class="toggle-content-toggleme" style="padding-left:2em;"> -<dl> -<dt>Initial release. SDK Tools r14 or higher is required. -</dt> -</dl> + <p>Initial release. The system version is 4.0.3.</p> + <dl> + <dt>Dependencies:</dt> + <dd>SDK Tools r14 or higher is required.</dd> + </dl> </div> </div> diff --git a/docs/html/sdk/compatibility-library.jd b/docs/html/sdk/compatibility-library.jd index df71552..30d807f 100644 --- a/docs/html/sdk/compatibility-library.jd +++ b/docs/html/sdk/compatibility-library.jd @@ -46,11 +46,40 @@ by the directory name, such as {@code v4/} and {@code v13/}.</p> <p>The sections below provide notes about successive releases of the Support Package, as denoted by revision number.</p> - <div class="toggle-content open"> <p><a href="#" onclick="return toggleContent(this)"> <img src="{@docRoot}assets/images/triangle-opened.png" class="toggle-content-img" /> + Support Package, revision 7 (March 2012) + </a></p> + + <div class="toggle-content-toggleme" style="padding-left:2em"> + <dl> + <dt>Changes for v4 support library:</dt> + <dd> + <ul> + <li>Added {@link android.support.v4.app.ShareCompat}, which provides helper classes +for sending and receiving content for social sharing applications, including new metadata for +attributing shared data to the source app. This class also provides compatible integration with the +new {@link android.widget.ShareActionProvider} in Android 4.0.</li> + <li>Added {@link android.support.v4.app.NavUtils} and {@link +android.support.v4.app.TaskStackBuilder} to provide support for implementing the +<a href="{@docRoot}design/index.html">Android Design</a> guidelines for navigation. These +additions include a way to implement the action bar's <em>Up</em> button across versions. +For an example implementation of this pattern, see the AppNavigation sample in +({@code <em><sdk></em>/samples/<em><platform></em>/AppNavigation}).</li> + <li>Added {@link android.support.v4.app.NotificationCompat.Builder} to provide a +compatibility implementation of Android 3.0's {@link android.app.Notification.Builder} helper class +for creating standardized system notifications.</li> + </ul> + </dd> + </dl> + </div> + +<div class="toggle-content closed"> + + <p><a href="#" onclick="return toggleContent(this)"> + <img src="{@docRoot}assets/images/triangle-closed.png" class="toggle-content-img" /> Support Package, revision 6 (December 2011) </a></p> diff --git a/docs/html/sdk/eclipse-adt.jd b/docs/html/sdk/eclipse-adt.jd index 30825ee..c8bf12d 100644 --- a/docs/html/sdk/eclipse-adt.jd +++ b/docs/html/sdk/eclipse-adt.jd @@ -1,8 +1,8 @@ page.title=ADT Plugin for Eclipse -adt.zip.version=16.0.1 -adt.zip.download=ADT-16.0.1.zip -adt.zip.bytes=7000078 -adt.zip.checksum=03a2a23650ddac128c8b9e8aaf0aa433 +adt.zip.version=17.0.0 +adt.zip.download=ADT-17.0.0.zip +adt.zip.bytes=12836115 +adt.zip.checksum=ecb12c07e534997cd32c66d57f21b770 @jd:body @@ -108,11 +108,109 @@ padding: .25em 1em; } </style> - <div class="toggleable opened"> <a href="#" onclick="return toggleDiv(this)"> <img src="{@docRoot}assets/images/triangle-opened.png" class="toggle-img" height="9px" width="9px" /> +ADT 17.0.0</a> <em>(March 2012)</em> + <div class="toggleme"> +<dl> + <dt>Dependencies:</dt> + + <dd> + <ul> + <li>Java 1.6 or higher is required for ADT 17.0.0.</li> + <li>Eclipse Helios (Version 3.6.2) or higher is required for ADT 17.0.0.</li> + <li>ADT 17.0.0 is designed for use with <a href="{@docRoot}sdk/tools-notes.html">SDK Tools + r17</a>. If you haven't already installed SDK Tools r17 into your SDK, use the Android SDK + Manager to do so.</li> + </ul> + </dd> + + <dt>General improvements:</dt> + <dd> + <ul> + <li>New build features + <ul> + <li>Added feature to automatically setup JAR dependencies. Any {@code .jar} files in the + {@code /libs} folder are added to the build configuration (similar to how the Ant build + system works). Also, {@code .jar} files needed by library projects are also automatically + added to projects that depend on those library projects.</li> + <li>Added a feature that allows you to run some code only in debug mode. Builds now +generate a class called {@code BuildConfig} containing a {@code DEBUG} constant that is +automatically set according to your build type. You can check the ({@code BuildConfig.DEBUG}) +constant in your code to run debug-only functions.</li> + <li>Added support for custom views with custom attributes in libraries. Layouts using +custom attributes must use the namespace URI {@code http://schemas.android.com/apk/res-auto} instead +of the URI that includes the app package name. This URI is replaced with the app specific one at +build time.</li> + </ul> + </li> + <li>Improved Lint features. See the <a href="{@docRoot}sdk/tools-notes.html">SDK Tools r17</a> +release notes.</li> + <li>Improved the Lint user interface + <ul> + <li>Added <strong>Run Lint</strong> toolbar action with a dropdown menu for selecting +specific (or all) projects, clearing results and other actions.</li> + <li>Updated the results window to be organized as a tree rather than a flat list. Each +issue type has a single top level item, which makes it easier to quickly scan through the reported +issues and narrow down to the issues you are most interested in.</li> + <li>Added many new toolbar actions to the results window, including expand/collapse, +ignore in file, ignore in project, ignore everywhere, show options, and configure columns.</li> + <li>Added new column options for the <strong>Lint Warnings</strong> tab, such as +category, priority, project, file and line. The column selection (as well as the column sizes) are +persisted. You can also click on columns to sort by those values.</li> + <li>Added Enable All and Disable All buttons to the Lint Options dialog, and a search +filter textbox to filter by issue id, summary and severity.</li> + </ul> + </li> + <li>Added Quick Outline for XML editors (Ctrl-O, Command-O). This feature shows the structure +of the current file including icons and ids, lets you filter and quickly jump to specific ids.</li> + <li>Updated the resource chooser to shows the resolved value for resources. For example, +when selecting {@code @string/hello} the chooser displays a resolved value such as "Hello World"). +The resource chooser also now allows you to edit the chosen value directly.</li> + <li>Updated Layout Editor so that it does not assign default ids to layouts, includes and +merge tags. This behavior tended to pollute the namespace with a lot of unused resources since +layouts are not usually manipulated via code, or referenced from XML. (The RelativeLayout editor +automatically assigns ids to views without ids when pointing to them.)</li> + <li>Added ability to export screenshots from the Layout Editor</li> + </ul> + </dd> + + <dt>Bug fixes:</dt> + <dd> + <ul> + <li>Fixed problem using Layout Editor with {@link android.widget.SlidingDrawer} which could + not be dragged into the layout on some platforms.</li> + <li>Fixed preview rendering for {@link android.widget.SlidingDrawer} and + {@link android.widget.TabHost}. + (<a href="http://code.google.com/p/android/issues/detail?id=23022">Issue 23022</a>).</li> + <li>Fixed issues that could prevent layout rendering due to unresolvable resources. + (<a href="http://code.google.com/p/android/issues/detail?id=21046">Issue 21046</a>, + <a href="http://code.google.com/p/android/issues/detail?id=21051">Issue 21051</a>)</li> + <li>Fixed a bug in resource chooser which made some types of framework resources impossible to +select. (<a href="http://code.google.com/p/android/issues/detail?id=20589">Issue 20589</a>)</li> + <li>Fixed a bug in the formatter where a certain whitespace pattern could result in a + non-space character getting deleted. + (<a href="http://code.google.com/p/android/issues/detail?id=23940">Issue 23940</a>)</li> + <li>Fixed a locale bug affecting Turkish locales in particular. + (<a href="http://code.google.com/p/android/issues/detail?id=23747">Issue 23747</a>)</li> + <li>Fixed issue where dex complains about duplicate classes in cases where a Library + Project depends on the same jar files or Java-only projects.</li> + <li>Fixed issue where test projects had to independently reference the library projects used + by an app project. Now referencing only the app project is enough.</li> + </ul> + </dd> + +</dl> + +</div> +</div> + +<div class="toggleable closed"> + <a href="#" onclick="return toggleDiv(this)"> + <img src="{@docRoot}assets/images/triangle-closed.png" class="toggle-img" height="9px" +width="9px" /> ADT 16.0.1</a> <em>(December 2011)</em> <div class="toggleme"> <dl> @@ -182,11 +280,11 @@ ADT 15.0.1</a> <em>(November 2011)</em> <div class="toggleme"> <dl> <dt>Dependencies:</dt> - + <dd>ADT 15.0.1 is designed for use with <a href="{@docRoot}sdk/tools-notes.html">SDK Tools r15</a>. If you haven't already installed SDK Tools r15 into your SDK, use the Android SDK Manager to do so.</dd> - + <dt>Bug fixes:</dt> <dd> <ul> diff --git a/docs/html/sdk/index.jd b/docs/html/sdk/index.jd index 5cf05e0..c09b3c2 100644 --- a/docs/html/sdk/index.jd +++ b/docs/html/sdk/index.jd @@ -2,21 +2,21 @@ page.title=Android SDK page.metaDescription=Download the official Android SDK to develop apps for Android-powered devices. sdk.redirect=0 -sdk.win_installer=installer_r16-windows.exe -sdk.win_installer_bytes=29561554 -sdk.win_installer_checksum=3521dda4904886b05980590f83cf3469 +sdk.win_installer=installer_r17-windows.exe +sdk.win_installer_bytes=37410775 +sdk.win_installer_checksum=5afaf6511ebaa52bd6d1dba4afc61e41 -sdk.win_download=android-sdk_r16-windows.zip -sdk.win_bytes=29562413 -sdk.win_checksum=6b926d0c0a871f1a946e65259984701a +sdk.win_download=android-sdk_r17-windows.zip +sdk.win_bytes=37417953 +sdk.win_checksum=3af1baeb39707e54df068e939aea5a79 -sdk.mac_download=android-sdk_r16-macosx.zip -sdk.mac_bytes=26158334 -sdk.mac_checksum=d1dc2b6f13eed5e3ce5cf26c4e4c47aa +sdk.mac_download=android-sdk_r17-macosx.zip +sdk.mac_bytes=33867836 +sdk.mac_checksum=52639aae036b7c2e47cf291696b23236 -sdk.linux_download=android-sdk_r16-linux.tgz -sdk.linux_bytes=22048174 -sdk.linux_checksum=3ba457f731d51da3741c29c8830a4583 +sdk.linux_download=android-sdk_r17-linux.tgz +sdk.linux_bytes=29706368 +sdk.linux_checksum=14e99dfa8eb1a8fadd2f3557322245c4 @jd:body diff --git a/docs/html/sdk/requirements.jd b/docs/html/sdk/requirements.jd index c970f6c..c76e8c8 100644 --- a/docs/html/sdk/requirements.jd +++ b/docs/html/sdk/requirements.jd @@ -24,7 +24,7 @@ Android applications using the Android SDK. </p> <h4 style="margin-top:.25em"><em>Eclipse IDE</em></h4> <ul> - <li>Eclipse 3.6 (Helios) or greater + <li>Eclipse 3.6.2 (Helios) or greater <p class="note"><strong>Note:</strong> Eclipse 3.5 (Galileo) is no longer supported with the latest version of ADT.</p></li> <li>Eclipse <a href="http://www.eclipse.org/jdt">JDT</a> plugin (included @@ -41,8 +41,8 @@ packages: </p> <li>Eclipse IDE for Java EE Developers</li> </ul> </li> - <li><a href="http://www.oracle.com/technetwork/java/javase/downloads/index.html">JDK 5 or JDK -6</a> (JRE alone is not sufficient)</li> + <li><a href="http://www.oracle.com/technetwork/java/javase/downloads/index.html">JDK 6</a> + (JRE alone is not sufficient)</li> <li><a href="eclipse-adt.html">Android Development Tools plugin</a> (recommended)</li> <li><strong>Not</strong> compatible with Gnu Compiler for Java (gcj)</li> @@ -51,8 +51,8 @@ packages: </p> <h4><em>Other development environments or IDEs</em></h4> <ul> - <li><a href="http://www.oracle.com/technetwork/java/javase/downloads/index.html">JDK 5 or JDK -6</a> (JRE alone is not sufficient)</li> + <li><a href="http://www.oracle.com/technetwork/java/javase/downloads/index.html">JDK 6</a> + (JRE alone is not sufficient)</li> <li><a href="http://ant.apache.org/">Apache Ant</a> 1.8 or later</li> <li><strong>Not</strong> compatible with Gnu Compiler for Java (gcj)</li> </ul> diff --git a/docs/html/sdk/sdk_toc.cs b/docs/html/sdk/sdk_toc.cs index f7541f7..5a5517c 100644 --- a/docs/html/sdk/sdk_toc.cs +++ b/docs/html/sdk/sdk_toc.cs @@ -81,7 +81,8 @@ class="new">new!</span></li> <div><a href="<?cs var:toroot ?>sdk/android-4.0-highlights.html"> <span class="en">Android 4.0.x Platform</span></a> <span class="new">new!</span></div> <ul> - <li><a href="<?cs var:toroot ?>sdk/android-4.0.3.html">Android 4.0.3 Platform</a> <span class="new">new!</span></li> + <li><a href="<?cs var:toroot ?>sdk/android-4.0.3.html">Android 4.0.3 Platform</a> + <span class="new">new!</span></li> <li><a href="<?cs var:toroot ?>sdk/android-4.0.html">Android 4.0 Platform</a> </li> </ul> </li> @@ -152,10 +153,10 @@ class="new">new!</span></li> </li> </ul> <ul> - <li><a href="<?cs var:toroot ?>sdk/tools-notes.html">SDK Tools, r16</a> <span + <li><a href="<?cs var:toroot ?>sdk/tools-notes.html">SDK Tools, r17</a> <span class="new">new!</span></li> <li><a href="<?cs var:toroot ?>sdk/win-usb.html">Google USB Driver, r4</a></li> - <li><a href="<?cs var:toroot ?>sdk/compatibility-library.html">Support Package, r6</a> + <li><a href="<?cs var:toroot ?>sdk/compatibility-library.html">Support Package, r7</a> <span class="new">new!</span></li> </ul> </li> @@ -171,7 +172,7 @@ class="new">new!</span></li> <span style="display:none" class="zh-TW"></span> </span> <ul> - <li><a href="<?cs var:toroot ?>sdk/eclipse-adt.html">ADT 16.0.1 + <li><a href="<?cs var:toroot ?>sdk/eclipse-adt.html">ADT 17.0.0 <span style="display:none" class="de"></span> <span style="display:none" class="es"></span> <span style="display:none" class="fr"></span> diff --git a/docs/html/sdk/tools-notes.jd b/docs/html/sdk/tools-notes.jd index 91bcb7d..bbbca81 100644 --- a/docs/html/sdk/tools-notes.jd +++ b/docs/html/sdk/tools-notes.jd @@ -64,11 +64,112 @@ padding: .25em 1em; } </style> - <div class="toggleable opened"> <a href="#" onclick="return toggleDiv(this)"> <img src="{@docRoot}assets/images/triangle-opened.png" class="toggle-img" height="9px" width="9px" /> + SDK Tools, Revision 17</a> <em>(March 2012)</em> + + <div class="toggleme"> + <p class="caution"><strong>Important:</strong> To download the new Android + 4.0 system components from the Android SDK Manager, you must first update the + SDK tools to revision 14 or later and restart the Android SDK Manager. If you do not, + the Android 4.0 system components will not be available for download.</p> + + <dl> + <dt>Dependencies:</dt> + <dd> + <ul> + <li>Android SDK Platform-tools revision 9 or later.</li> + <li>If you are developing in Eclipse with ADT, note that the SDK Tools r17 is designed for + use with ADT 17.0.0 and later. If you haven't already, we highly recommend updating your + <a href="{@docRoot}sdk/eclipse-adt.html">ADT Plugin</a> to 17.0.0.</li> + <li>If you are developing outside Eclipse, you must have + <a href="http://ant.apache.org/">Apache Ant</a> 1.8 or later.</li> + </ul> + </dd> + <dt>General notes:</dt> + <dd> + <ul> + <li>Emulator + <ul> + <li>Added support for hardware accelerated graphics rendering. This feature requires an +API Level 15, Revision 3 or later system image. +(<a href="{@docRoot}guide/developing/devices/emulator.html#accel-graphics">more info</a>) + <p class="note"><strong>Note:</strong> As of the SDK Tools Revision 17 release, the +API Level 15, Revision 3 system image is not yet available.</p> + </li> + <li>Added support for running Android x86 system images in virtualization mode on +Windows and Mac OS X. +(<a href="{@docRoot}guide/developing/devices/emulator.html#accel-vm">more info</a>)</li> + <li>Added experimental support for multi-touch input by enabing the emulator to receive + touch input from a USB-tethered physical Android device. + (<a href="http://tools.android.com/tips/hardware-emulation">more info</a>)</li> + </ul> + </li> + <li>Added viewing of live detailed network usage of an app in DDMS. (<a + href="http://tools.android.com/recent/detailednetworkusageinddms">more info</a>)</li> + <li>ProGuard + <ul> + <li>Updated the bundled ProGuard tool to version 4.7. In addition to many new features, +this update fixes the {@code Conversion to Dalvik format failed with error 1} error some users have +experienced.</li> + <li>Updated the default {@code proguard.cfg} file with better default flags for + Android.</li> + <li>Split the ProGuard configuration file has been in half, with project specific flags +kept in project and the generic Android flags distributed (and updated) with the tools +themselves.</li> + </ul> + </li> + <li>Build + <ul> + <li>Added a feature that allows you to run some code only in debug mode. Builds now +generate a class called {@code BuildConfig} containing a {@code DEBUG} constant that is +automatically set according to your build type. You can check the ({@code BuildConfig.DEBUG}) +constant in your code to run debug-only functions.</li> + <li>Fixed issue when a project and its libraries include the same jar file in their libs + folder.</li> + <li>Added support for custom views with custom attributes in libraries. Layouts using +custom attributes must use the namespace URI {@code http://schemas.android.com/apk/res-auto} instead +of the URI that includes the app package name. This URI is replaced with the app specific one at +build time.</li> + </ul> + </li> + <li>Lint + <ul> + <li>Updated Lint to check Android application code. Lint rules which previously +performed pattern based searches in the application code (such as the unused resource check) have +been rewritten to use the more accurate Java-style parse trees.</li> + <li>Added support for checking library projects. This change means that rules such as +the unused resource check properly handle resources declared in a library project and referenced in +a downstream project.</li> + <li>Added ability to suppress Lint warnings in Java code with the new +{@code @SuppressLint} annotation, and in XML files with the new tools: namespace and +ignore attribute. (<a + href="http://tools.android.com/recent/ignoringlintwarnings">more info</a>)</li> + <li>New Lint checks: + <ul> + <li>Added check for Android API calls that require a version of Android higher than + the minimum supported version. You can use the new {@code @TargetApi} annotation + to suppress warnings when the code is wrapped in a system version condition. + (<a href="http://tools.android.com/recent/lintapicheck">more info</a>)</li> + <li>Added over 20 new Lint rules, including checks for + <a href="http://tools.android.com/recent/lintperformancechecks">performance</a>, + XML layouts, manifest and file handling.</li> + </ul> + </li> + </ul> + </li> + </ul> + </dd> + </dl> + </div> +</div> + +<div class="toggleable closed"> + <a href="#" onclick="return toggleDiv(this)"> + <img src="{@docRoot}assets/images/triangle-closed.png" class="toggle-img" height="9px" + width="9px" /> SDK Tools, Revision 16</a> <em>(December 2011)</em> <div class="toggleme"> @@ -92,10 +193,10 @@ padding: .25em 1em; <dt>General notes:</dt> <dd> <ul> - <li>Added Lint tools to detect common errors in Android projects. + <li>Added Lint tools to detect common errors in Android projects. (<a href="http://tools.android.com/recent/lint">more info</a>)</li> <li>Added sensor emulation support, which allows the emulator to read sensor data from a - physical Android device. + physical Android device. (<a href="http://tools.android.com/recent/sensoremulation">more info</a>)</li> <li>Added support for using a webcam to emulate a camera on Mac OS X.</li> </ul> diff --git a/graphics/java/android/graphics/drawable/LayerDrawable.java b/graphics/java/android/graphics/drawable/LayerDrawable.java index 6698d31..383fe71 100644 --- a/graphics/java/android/graphics/drawable/LayerDrawable.java +++ b/graphics/java/android/graphics/drawable/LayerDrawable.java @@ -575,6 +575,11 @@ public class LayerDrawable extends Drawable implements Drawable.Callback { @Override public Drawable mutate() { if (!mMutated && super.mutate() == this) { + if (!mLayerState.canConstantState()) { + throw new IllegalStateException("One or more children of this LayerDrawable does " + + "not have constant state; this drawable cannot be mutated."); + } + mLayerState = new LayerState(mLayerState, this, null); final ChildDrawable[] array = mLayerState.mChildren; final int N = mLayerState.mNum; for (int i = 0; i < N; i++) { @@ -694,7 +699,7 @@ public class LayerDrawable extends Drawable implements Drawable.Callback { return stateful; } - public synchronized boolean canConstantState() { + public boolean canConstantState() { if (!mCheckedConstantState && mChildren != null) { mCanConstantState = true; final int N = mNum; diff --git a/include/common_time/local_clock.h b/include/common_time/local_clock.h index 845d1c2..384c3de 100644 --- a/include/common_time/local_clock.h +++ b/include/common_time/local_clock.h @@ -28,7 +28,7 @@ namespace android { class LocalClock { public: - LocalClock(); + LocalClock(); bool initCheck(); diff --git a/include/media/AudioTrack.h b/include/media/AudioTrack.h index 552e829..ad27a1e 100644 --- a/include/media/AudioTrack.h +++ b/include/media/AudioTrack.h @@ -169,7 +169,7 @@ public: callback_t cbf = 0, void* user = 0, int notificationFrames = 0, - int sessionId = 0); + int sessionId = 0); /* Creates an audio track and registers it with AudioFlinger. With this constructor, * the PCM data to be rendered by AudioTrack is passed in a shared memory buffer @@ -215,7 +215,7 @@ public: int notificationFrames = 0, const sp<IMemory>& sharedBuffer = 0, bool threadCanCallJava = false, - int sessionId = 0); + int sessionId = 0); /* Result of constructing the AudioTrack. This must be checked @@ -468,6 +468,7 @@ protected: // body of AudioTrackThread::threadLoop() bool processAudioBuffer(const sp<AudioTrackThread>& thread); + status_t createTrack_l(audio_stream_type_t streamType, uint32_t sampleRate, audio_format_t format, diff --git a/libs/hwui/FontRenderer.cpp b/libs/hwui/FontRenderer.cpp index 92a7573..d7937c7 100644 --- a/libs/hwui/FontRenderer.cpp +++ b/libs/hwui/FontRenderer.cpp @@ -518,6 +518,8 @@ FontRenderer::~FontRenderer() { mCacheLines.clear(); if (mInitialized) { + glDeleteBuffers(1, &mIndexBufferID); + delete[] mTextMeshPtr; delete mCacheTextureSmall; delete mCacheTexture128; diff --git a/libs/rs/scriptc/rs_allocation.rsh b/libs/rs/scriptc/rs_allocation.rsh index 89696b8..392a3ef 100644 --- a/libs/rs/scriptc/rs_allocation.rsh +++ b/libs/rs/scriptc/rs_allocation.rsh @@ -176,129 +176,6 @@ extern rs_element __attribute__((overloadable)) rsAllocationGetElement(rs_allocation a); /** - * @param m mesh to get data from - * @return number of allocations in the mesh that contain vertex - * data - */ -extern uint32_t __attribute__((overloadable)) - rsMeshGetVertexAllocationCount(rs_mesh m); - -/** - * @param m mesh to get data from - * @return number of primitive groups in the mesh. This would - * include simple primitives as well as allocations - * containing index data - */ -extern uint32_t __attribute__((overloadable)) - rsMeshGetPrimitiveCount(rs_mesh m); - -/** - * @param m mesh to get data from - * @param index index of the vertex allocation - * @return allocation containing vertex data - */ -extern rs_allocation __attribute__((overloadable)) - rsMeshGetVertexAllocation(rs_mesh m, uint32_t index); - -/** - * @param m mesh to get data from - * @param index index of the index allocation - * @return allocation containing index data - */ -extern rs_allocation __attribute__((overloadable)) - rsMeshGetIndexAllocation(rs_mesh m, uint32_t index); - -/** - * @param m mesh to get data from - * @param index index of the primitive - * @return primitive describing how the mesh is rendered - */ -extern rs_primitive __attribute__((overloadable)) - rsMeshGetPrimitive(rs_mesh m, uint32_t index); - -/** - * @param e element to get data from - * @return number of sub-elements in this element - */ -extern uint32_t __attribute__((overloadable)) - rsElementGetSubElementCount(rs_element e); - -/** - * @param e element to get data from - * @param index index of the sub-element to return - * @return sub-element in this element at given index - */ -extern rs_element __attribute__((overloadable)) - rsElementGetSubElement(rs_element, uint32_t index); - -/** - * @param e element to get data from - * @param index index of the sub-element to return - * @return length of the sub-element name including the null - * terminator (size of buffer needed to write the name) - */ -extern uint32_t __attribute__((overloadable)) - rsElementGetSubElementNameLength(rs_element e, uint32_t index); - -/** - * @param e element to get data from - * @param index index of the sub-element - * @param name array to store the name into - * @param nameLength length of the provided name array - * @return number of characters actually written, excluding the - * null terminator - */ -extern uint32_t __attribute__((overloadable)) - rsElementGetSubElementName(rs_element e, uint32_t index, char *name, uint32_t nameLength); - -/** - * @param e element to get data from - * @param index index of the sub-element - * @return array size of sub-element in this element at given - * index - */ -extern uint32_t __attribute__((overloadable)) - rsElementGetSubElementArraySize(rs_element e, uint32_t index); - -/** - * @param e element to get data from - * @param index index of the sub-element - * @return offset in bytes of sub-element in this element at - * given index - */ -extern uint32_t __attribute__((overloadable)) - rsElementGetSubElementOffsetBytes(rs_element e, uint32_t index); - -/** - * @param e element to get data from - * @return total size of the element in bytes - */ -extern uint32_t __attribute__((overloadable)) - rsElementGetSizeBytes(rs_element e); - -/** - * @param e element to get data from - * @return element's data type - */ -extern rs_data_type __attribute__((overloadable)) - rsElementGetDataType(rs_element e); - -/** - * @param e element to get data from - * @return element's data size - */ -extern rs_data_kind __attribute__((overloadable)) - rsElementGetDataKind(rs_element e); - -/** - * @param e element to get data from - * @return length of the element vector (for float2, float3, - * etc.) - */ -extern uint32_t __attribute__((overloadable)) - rsElementGetVectorSize(rs_element e); - -/** * Fetch allocation in a way described by the sampler * @param a 1D allocation to sample from * @param s sampler state diff --git a/libs/rs/scriptc/rs_core.rsh b/libs/rs/scriptc/rs_core.rsh index be900cb..5b99976 100644 --- a/libs/rs/scriptc/rs_core.rsh +++ b/libs/rs/scriptc/rs_core.rsh @@ -31,10 +31,14 @@ #include "rs_atomic.rsh" #include "rs_cl.rsh" #include "rs_debug.rsh" +#include "rs_element.rsh" #include "rs_math.rsh" +#include "rs_mesh.rsh" #include "rs_matrix.rsh" #include "rs_object.rsh" +#include "rs_program.rsh" #include "rs_quaternion.rsh" +#include "rs_sampler.rsh" #include "rs_time.rsh" diff --git a/libs/rs/scriptc/rs_element.rsh b/libs/rs/scriptc/rs_element.rsh new file mode 100644 index 0000000..72cb51c --- /dev/null +++ b/libs/rs/scriptc/rs_element.rsh @@ -0,0 +1,134 @@ +/* + * 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. + */ + +/*! \mainpage notitle + * + * Renderscript is a high-performance runtime that provides graphics rendering and + * compute operations at the native level. Renderscript code is compiled on devices + * at runtime to allow platform-independence as well. + * This reference documentation describes the Renderscript runtime APIs, which you + * can utilize to write Renderscript code in C99. The Renderscript header + * files are automatically included for you, except for the rs_graphics.rsh header. If + * you are doing graphics rendering, include the graphics header file like this: + * + * <code>#include "rs_graphics.rsh"</code> + * + * To use Renderscript, you need to utilize the Renderscript runtime APIs documented here + * as well as the Android framework APIs for Renderscript. + * For documentation on the Android framework APIs, see the <a target="_parent" href= + * "http://developer.android.com/reference/android/renderscript/package-summary.html"> + * android.renderscript</a> package reference. + * For more information on how to develop with Renderscript and how the runtime and + * Android framework APIs interact, see the <a target="_parent" href= + * "http://developer.android.com/guide/topics/renderscript/index.html">Renderscript + * developer guide</a> and the <a target="_parent" href= + * "http://developer.android.com/resources/samples/RenderScript/index.html"> + * Renderscript samples</a>. + */ + +/** @file rs_element.rsh + * \brief Element routines + * + * + */ + +#ifndef __RS_ELEMENT_RSH__ +#define __RS_ELEMENT_RSH__ + +/** + * @param e element to get data from + * @return number of sub-elements in this element + */ +extern uint32_t __attribute__((overloadable)) + rsElementGetSubElementCount(rs_element e); + +/** + * @param e element to get data from + * @param index index of the sub-element to return + * @return sub-element in this element at given index + */ +extern rs_element __attribute__((overloadable)) + rsElementGetSubElement(rs_element, uint32_t index); + +/** + * @param e element to get data from + * @param index index of the sub-element to return + * @return length of the sub-element name including the null + * terminator (size of buffer needed to write the name) + */ +extern uint32_t __attribute__((overloadable)) + rsElementGetSubElementNameLength(rs_element e, uint32_t index); + +/** + * @param e element to get data from + * @param index index of the sub-element + * @param name array to store the name into + * @param nameLength length of the provided name array + * @return number of characters actually written, excluding the + * null terminator + */ +extern uint32_t __attribute__((overloadable)) + rsElementGetSubElementName(rs_element e, uint32_t index, char *name, uint32_t nameLength); + +/** + * @param e element to get data from + * @param index index of the sub-element + * @return array size of sub-element in this element at given + * index + */ +extern uint32_t __attribute__((overloadable)) + rsElementGetSubElementArraySize(rs_element e, uint32_t index); + +/** + * @param e element to get data from + * @param index index of the sub-element + * @return offset in bytes of sub-element in this element at + * given index + */ +extern uint32_t __attribute__((overloadable)) + rsElementGetSubElementOffsetBytes(rs_element e, uint32_t index); + +/** + * @param e element to get data from + * @return total size of the element in bytes + */ +extern uint32_t __attribute__((overloadable)) + rsElementGetSizeBytes(rs_element e); + +/** + * @param e element to get data from + * @return element's data type + */ +extern rs_data_type __attribute__((overloadable)) + rsElementGetDataType(rs_element e); + +/** + * @param e element to get data from + * @return element's data size + */ +extern rs_data_kind __attribute__((overloadable)) + rsElementGetDataKind(rs_element e); + +/** + * @param e element to get data from + * @return length of the element vector (for float2, float3, + * etc.) + */ +extern uint32_t __attribute__((overloadable)) + rsElementGetVectorSize(rs_element e); + +#endif // __RS_ELEMENT_RSH__ + diff --git a/libs/rs/scriptc/rs_mesh.rsh b/libs/rs/scriptc/rs_mesh.rsh new file mode 100644 index 0000000..88f229b --- /dev/null +++ b/libs/rs/scriptc/rs_mesh.rsh @@ -0,0 +1,93 @@ +/* + * 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. + */ + +/*! \mainpage notitle + * + * Renderscript is a high-performance runtime that provides graphics rendering and + * compute operations at the native level. Renderscript code is compiled on devices + * at runtime to allow platform-independence as well. + * This reference documentation describes the Renderscript runtime APIs, which you + * can utilize to write Renderscript code in C99. The Renderscript header + * files are automatically included for you, except for the rs_graphics.rsh header. If + * you are doing graphics rendering, include the graphics header file like this: + * + * <code>#include "rs_graphics.rsh"</code> + * + * To use Renderscript, you need to utilize the Renderscript runtime APIs documented here + * as well as the Android framework APIs for Renderscript. + * For documentation on the Android framework APIs, see the <a target="_parent" href= + * "http://developer.android.com/reference/android/renderscript/package-summary.html"> + * android.renderscript</a> package reference. + * For more information on how to develop with Renderscript and how the runtime and + * Android framework APIs interact, see the <a target="_parent" href= + * "http://developer.android.com/guide/topics/renderscript/index.html">Renderscript + * developer guide</a> and the <a target="_parent" href= + * "http://developer.android.com/resources/samples/RenderScript/index.html"> + * Renderscript samples</a>. + */ + +/** @file rs_mesh.rsh + * \brief Mesh routines + * + * + */ + +#ifndef __RS_MESH_RSH__ +#define __RS_MESH_RSH__ + +/** + * @param m mesh to get data from + * @return number of allocations in the mesh that contain vertex + * data + */ +extern uint32_t __attribute__((overloadable)) + rsMeshGetVertexAllocationCount(rs_mesh m); + +/** + * @param m mesh to get data from + * @return number of primitive groups in the mesh. This would + * include simple primitives as well as allocations + * containing index data + */ +extern uint32_t __attribute__((overloadable)) + rsMeshGetPrimitiveCount(rs_mesh m); + +/** + * @param m mesh to get data from + * @param index index of the vertex allocation + * @return allocation containing vertex data + */ +extern rs_allocation __attribute__((overloadable)) + rsMeshGetVertexAllocation(rs_mesh m, uint32_t index); + +/** + * @param m mesh to get data from + * @param index index of the index allocation + * @return allocation containing index data + */ +extern rs_allocation __attribute__((overloadable)) + rsMeshGetIndexAllocation(rs_mesh m, uint32_t index); + +/** + * @param m mesh to get data from + * @param index index of the primitive + * @return primitive describing how the mesh is rendered + */ +extern rs_primitive __attribute__((overloadable)) + rsMeshGetPrimitive(rs_mesh m, uint32_t index); + +#endif // __RS_MESH_RSH__ + diff --git a/libs/rs/scriptc/rs_program.rsh b/libs/rs/scriptc/rs_program.rsh new file mode 100644 index 0000000..8c52680 --- /dev/null +++ b/libs/rs/scriptc/rs_program.rsh @@ -0,0 +1,152 @@ +/* + * 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. + */ + +/*! \mainpage notitle + * + * Renderscript is a high-performance runtime that provides graphics rendering and + * compute operations at the native level. Renderscript code is compiled on devices + * at runtime to allow platform-independence as well. + * This reference documentation describes the Renderscript runtime APIs, which you + * can utilize to write Renderscript code in C99. The Renderscript header + * files are automatically included for you, except for the rs_graphics.rsh header. If + * you are doing graphics rendering, include the graphics header file like this: + * + * <code>#include "rs_graphics.rsh"</code> + * + * To use Renderscript, you need to utilize the Renderscript runtime APIs documented here + * as well as the Android framework APIs for Renderscript. + * For documentation on the Android framework APIs, see the <a target="_parent" href= + * "http://developer.android.com/reference/android/renderscript/package-summary.html"> + * android.renderscript</a> package reference. + * For more information on how to develop with Renderscript and how the runtime and + * Android framework APIs interact, see the <a target="_parent" href= + * "http://developer.android.com/guide/topics/renderscript/index.html">Renderscript + * developer guide</a> and the <a target="_parent" href= + * "http://developer.android.com/resources/samples/RenderScript/index.html"> + * Renderscript samples</a>. + */ + +/** @file rs_program.rsh + * \brief Program object routines + * + * + */ + +#ifndef __RS_PROGRAM_RSH__ +#define __RS_PROGRAM_RSH__ + +/** + * @hide + * Get program store depth function + * + * @param ps + */ +extern rs_depth_func __attribute__((overloadable)) + rsProgramStoreGetDepthFunc(rs_program_store ps); + +/** + * @hide + * Get program store depth mask + * + * @param ps + */ +extern bool __attribute__((overloadable)) + rsProgramStoreGetDepthMask(rs_program_store ps); +/** + * @hide + * Get program store red component color mask + * + * @param ps + */ +extern bool __attribute__((overloadable)) + rsProgramStoreGetColorMaskR(rs_program_store ps); + +/** + * @hide + * Get program store green component color mask + * + * @param ps + */ +extern bool __attribute__((overloadable)) + rsProgramStoreGetColorMaskG(rs_program_store ps); + +/** + * @hide + * Get program store blur component color mask + * + * @param ps + */ +extern bool __attribute__((overloadable)) + rsProgramStoreGetColorMaskB(rs_program_store ps); + +/** + * @hide + * Get program store alpha component color mask + * + * @param ps + */ +extern bool __attribute__((overloadable)) + rsProgramStoreGetColorMaskA(rs_program_store ps); + +/** + * @hide + * Get program store blend source function + * + * @param ps + */ +extern rs_blend_src_func __attribute__((overloadable)) + rsProgramStoreGetBlendSrcFunc(rs_program_store ps); + +/** + * @hide + * Get program store blend destination function + * + * @param ps + */ +extern rs_blend_dst_func __attribute__((overloadable)) + rsProgramStoreGetBlendDstFunc(rs_program_store ps); + +/** + * @hide + * Get program store dither state + * + * @param ps + */ +extern bool __attribute__((overloadable)) + rsProgramStoreGetDitherEnabled(rs_program_store ps); + +/** + * @hide + * Get program raster point sprite state + * + * @param pr + */ +extern bool __attribute__((overloadable)) + rsProgramRasterGetPointSpriteEnabled(rs_program_raster pr); + +/** + * @hide + * Get program raster cull mode + * + * @param pr + */ +extern rs_cull_mode __attribute__((overloadable)) + rsProgramRasterGetCullMode(rs_program_raster pr); + + + +#endif // __RS_PROGRAM_RSH__ + diff --git a/libs/rs/scriptc/rs_sampler.rsh b/libs/rs/scriptc/rs_sampler.rsh new file mode 100644 index 0000000..130eca0 --- /dev/null +++ b/libs/rs/scriptc/rs_sampler.rsh @@ -0,0 +1,97 @@ +/* + * 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. + */ + +/*! \mainpage notitle + * + * Renderscript is a high-performance runtime that provides graphics rendering and + * compute operations at the native level. Renderscript code is compiled on devices + * at runtime to allow platform-independence as well. + * This reference documentation describes the Renderscript runtime APIs, which you + * can utilize to write Renderscript code in C99. The Renderscript header + * files are automatically included for you, except for the rs_graphics.rsh header. If + * you are doing graphics rendering, include the graphics header file like this: + * + * <code>#include "rs_graphics.rsh"</code> + * + * To use Renderscript, you need to utilize the Renderscript runtime APIs documented here + * as well as the Android framework APIs for Renderscript. + * For documentation on the Android framework APIs, see the <a target="_parent" href= + * "http://developer.android.com/reference/android/renderscript/package-summary.html"> + * android.renderscript</a> package reference. + * For more information on how to develop with Renderscript and how the runtime and + * Android framework APIs interact, see the <a target="_parent" href= + * "http://developer.android.com/guide/topics/renderscript/index.html">Renderscript + * developer guide</a> and the <a target="_parent" href= + * "http://developer.android.com/resources/samples/RenderScript/index.html"> + * Renderscript samples</a>. + */ + +/** @file rs_sampler.rsh + * \brief Sampler routines + * + * + */ + +#ifndef __RS_SAMPLER_RSH__ +#define __RS_SAMPLER_RSH__ + +/** + * @hide + * Get sampler minification value + * + * @param pr + */ +extern rs_sampler_value __attribute__((overloadable)) + rsSamplerGetMinification(rs_sampler s); + +/** + * @hide + * Get sampler magnification value + * + * @param pr + */ +extern rs_sampler_value __attribute__((overloadable)) + rsSamplerGetMagnification(rs_sampler s); + +/** + * @hide + * Get sampler wrap S value + * + * @param pr + */ +extern rs_sampler_value __attribute__((overloadable)) + rsSamplerGetWrapS(rs_sampler s); + +/** + * @hide + * Get sampler wrap T value + * + * @param pr + */ +extern rs_sampler_value __attribute__((overloadable)) + rsSamplerGetWrapT(rs_sampler s); + +/** + * @hide + * Get sampler anisotropy + * + * @param pr + */ +extern float __attribute__((overloadable)) + rsSamplerGetAnisotropy(rs_sampler s); + +#endif // __RS_SAMPLER_RSH__ + diff --git a/media/libeffects/lvm/wrapper/Bundle/EffectBundle.cpp b/media/libeffects/lvm/wrapper/Bundle/EffectBundle.cpp index ca93ce5..40dffd4 100644 --- a/media/libeffects/lvm/wrapper/Bundle/EffectBundle.cpp +++ b/media/libeffects/lvm/wrapper/Bundle/EffectBundle.cpp @@ -1493,7 +1493,7 @@ int VolumeSetVolumeLevel(EffectContext *pContext, int16_t level){ pContext->pBundledContext->firstVolume = LVM_FALSE; } return 0; -} /* end setVolumeLevel */ +} /* end VolumeSetVolumeLevel */ //---------------------------------------------------------------------------- // VolumeGetVolumeLevel() diff --git a/media/libmedia/AudioTrack.cpp b/media/libmedia/AudioTrack.cpp index 048be1d..55cd3ad 100644 --- a/media/libmedia/AudioTrack.cpp +++ b/media/libmedia/AudioTrack.cpp @@ -104,9 +104,10 @@ AudioTrack::AudioTrack( { mStatus = set(streamType, sampleRate, format, channelMask, frameCount, flags, cbf, user, notificationFrames, - 0, false, sessionId); + 0 /*sharedBuffer*/, false /*threadCanCallJava*/, sessionId); } +// DEPRECATED AudioTrack::AudioTrack( int streamType, uint32_t sampleRate, @@ -124,7 +125,7 @@ AudioTrack::AudioTrack( { mStatus = set((audio_stream_type_t)streamType, sampleRate, (audio_format_t)format, channelMask, frameCount, (audio_policy_output_flags_t)flags, cbf, user, notificationFrames, - 0, false, sessionId); + 0 /*sharedBuffer*/, false /*threadCanCallJava*/, sessionId); } AudioTrack::AudioTrack( @@ -144,8 +145,8 @@ AudioTrack::AudioTrack( mPreviousSchedulingGroup(ANDROID_TGROUP_DEFAULT) { mStatus = set(streamType, sampleRate, format, channelMask, - 0, flags, cbf, user, notificationFrames, - sharedBuffer, false, sessionId); + 0 /*frameCount*/, flags, cbf, user, notificationFrames, + sharedBuffer, false /*threadCanCallJava*/, sessionId); } AudioTrack::~AudioTrack() @@ -194,6 +195,7 @@ status_t AudioTrack::set( if (AudioSystem::getOutputSamplingRate(&afSampleRate, streamType) != NO_ERROR) { return NO_INIT; } + uint32_t afLatency; if (AudioSystem::getOutputLatency(&afLatency, streamType) != NO_ERROR) { return NO_INIT; @@ -203,9 +205,11 @@ status_t AudioTrack::set( if (streamType == AUDIO_STREAM_DEFAULT) { streamType = AUDIO_STREAM_MUSIC; } + if (sampleRate == 0) { sampleRate = afSampleRate; } + // these below should probably come from the audioFlinger too... if (format == AUDIO_FORMAT_DEFAULT) { format = AUDIO_FORMAT_PCM_16_BIT; diff --git a/media/libmedia/JetPlayer.cpp b/media/libmedia/JetPlayer.cpp index f1f62f7..7fa6bb7 100644 --- a/media/libmedia/JetPlayer.cpp +++ b/media/libmedia/JetPlayer.cpp @@ -89,7 +89,7 @@ int JetPlayer::init() // create the output AudioTrack mAudioTrack = new AudioTrack(); - mAudioTrack->set(AUDIO_STREAM_MUSIC, //TODO parametrize this + mAudioTrack->set(AUDIO_STREAM_MUSIC, //TODO parameterize this pLibConfig->sampleRate, AUDIO_FORMAT_PCM_16_BIT, audio_channel_out_mask_from_count(pLibConfig->numChannels), diff --git a/media/libmediaplayerservice/MediaPlayerService.cpp b/media/libmediaplayerservice/MediaPlayerService.cpp index 8f62ee4..148018d 100644 --- a/media/libmediaplayerservice/MediaPlayerService.cpp +++ b/media/libmediaplayerservice/MediaPlayerService.cpp @@ -1571,7 +1571,7 @@ status_t MediaPlayerService::AudioOutput::open( AUDIO_POLICY_OUTPUT_FLAG_NONE, CallbackWrapper, mCallbackData, - 0, + 0, // notification frames mSessionId); } else { t = new AudioTrack( diff --git a/media/libstagefright/MPEG4Extractor.cpp b/media/libstagefright/MPEG4Extractor.cpp index 6c95d4e..663f285 100644 --- a/media/libstagefright/MPEG4Extractor.cpp +++ b/media/libstagefright/MPEG4Extractor.cpp @@ -599,6 +599,7 @@ static void convertTimeToDate(int64_t time_1904, String8 *s) { } status_t MPEG4Extractor::parseChunk(off64_t *offset, int depth) { + ALOGV("entering parseChunk %lld/%d", *offset, depth); uint32_t hdr[2]; if (mDataSource->readAt(*offset, hdr, 8) < 8) { return ERROR_IO; @@ -625,6 +626,7 @@ status_t MPEG4Extractor::parseChunk(off64_t *offset, int depth) { char chunk[5]; MakeFourCCString(chunk_type, chunk); + ALOGV("chunk: %s @ %lld", chunk, *offset); #if 0 static const char kWhitespace[] = " "; @@ -1302,6 +1304,8 @@ status_t MPEG4Extractor::parseChunk(off64_t *offset, int depth) { break; } + case FOURCC('m', 'e', 'a', 'n'): + case FOURCC('n', 'a', 'm', 'e'): case FOURCC('d', 'a', 't', 'a'): { if (mPath.size() == 6 && underMetaDataPath(mPath)) { @@ -1437,6 +1441,15 @@ status_t MPEG4Extractor::parseChunk(off64_t *offset, int depth) { break; } + case FOURCC('-', '-', '-', '-'): + { + mLastCommentMean.clear(); + mLastCommentName.clear(); + mLastCommentData.clear(); + *offset += chunk_size; + break; + } + default: { *offset += chunk_size; @@ -1553,6 +1566,9 @@ status_t MPEG4Extractor::parseMetaData(off64_t offset, size_t size) { uint32_t flags = U32_AT(buffer); uint32_t metadataKey = 0; + char chunk[5]; + MakeFourCCString(mPath[4], chunk); + ALOGV("meta: %s @ %lld", chunk, offset); switch (mPath[4]) { case FOURCC(0xa9, 'a', 'l', 'b'): { @@ -1632,6 +1648,35 @@ status_t MPEG4Extractor::parseMetaData(off64_t offset, size_t size) { } break; } + case FOURCC('-', '-', '-', '-'): + { + buffer[size] = '\0'; + switch (mPath[5]) { + case FOURCC('m', 'e', 'a', 'n'): + mLastCommentMean.setTo((const char *)buffer + 4); + break; + case FOURCC('n', 'a', 'm', 'e'): + mLastCommentName.setTo((const char *)buffer + 4); + break; + case FOURCC('d', 'a', 't', 'a'): + mLastCommentData.setTo((const char *)buffer + 8); + break; + } + if (mLastCommentMean == "com.apple.iTunes" + && mLastCommentName == "iTunSMPB" + && mLastCommentData.length() != 0) { + int32_t delay, padding; + if (sscanf(mLastCommentData, + " %*x %x %x %*x", &delay, &padding) == 2) { + mLastTrack->meta->setInt32(kKeyEncoderDelay, delay); + mLastTrack->meta->setInt32(kKeyEncoderPadding, padding); + } + mLastCommentMean.clear(); + mLastCommentName.clear(); + mLastCommentData.clear(); + } + break; + } default: break; diff --git a/media/libstagefright/include/MPEG4Extractor.h b/media/libstagefright/include/MPEG4Extractor.h index eae62c6..5c549e0 100644 --- a/media/libstagefright/include/MPEG4Extractor.h +++ b/media/libstagefright/include/MPEG4Extractor.h @@ -20,6 +20,7 @@ #include <media/stagefright/MediaExtractor.h> #include <utils/Vector.h> +#include <utils/String8.h> namespace android { @@ -64,6 +65,9 @@ private: sp<MetaData> mFileMetaData; Vector<uint32_t> mPath; + String8 mLastCommentMean; + String8 mLastCommentName; + String8 mLastCommentData; status_t readMetaData(); status_t parseChunk(off64_t *offset, int depth); diff --git a/media/libstagefright/timedtext/TimedText3GPPSource.cpp b/media/libstagefright/timedtext/TimedText3GPPSource.cpp index c423ef0..4854121 100644 --- a/media/libstagefright/timedtext/TimedText3GPPSource.cpp +++ b/media/libstagefright/timedtext/TimedText3GPPSource.cpp @@ -39,19 +39,21 @@ TimedText3GPPSource::~TimedText3GPPSource() { } status_t TimedText3GPPSource::read( - int64_t *timeUs, Parcel *parcel, const MediaSource::ReadOptions *options) { + int64_t *startTimeUs, int64_t *endTimeUs, Parcel *parcel, + const MediaSource::ReadOptions *options) { MediaBuffer *textBuffer = NULL; status_t err = mSource->read(&textBuffer, options); if (err != OK) { return err; } CHECK(textBuffer != NULL); - textBuffer->meta_data()->findInt64(kKeyTime, timeUs); - // TODO: this is legacy code. when 'timeUs' can be <= 0? - if (*timeUs > 0) { - extractAndAppendLocalDescriptions(*timeUs, textBuffer, parcel); - } + textBuffer->meta_data()->findInt64(kKeyTime, startTimeUs); + CHECK_GE(*startTimeUs, 0); + extractAndAppendLocalDescriptions(*startTimeUs, textBuffer, parcel); textBuffer->release(); + // endTimeUs is a dummy parameter for 3gpp timed text format. + // Set a negative value to it to mark it is unavailable. + *endTimeUs = -1; return OK; } diff --git a/media/libstagefright/timedtext/TimedText3GPPSource.h b/media/libstagefright/timedtext/TimedText3GPPSource.h index 4ec3d8a..4170940 100644 --- a/media/libstagefright/timedtext/TimedText3GPPSource.h +++ b/media/libstagefright/timedtext/TimedText3GPPSource.h @@ -33,7 +33,8 @@ public: virtual status_t start() { return mSource->start(); } virtual status_t stop() { return mSource->stop(); } virtual status_t read( - int64_t *timeUs, + int64_t *startTimeUs, + int64_t *endTimeUs, Parcel *parcel, const MediaSource::ReadOptions *options = NULL); virtual status_t extractGlobalDescriptions(Parcel *parcel); diff --git a/media/libstagefright/timedtext/TimedTextPlayer.cpp b/media/libstagefright/timedtext/TimedTextPlayer.cpp index 8717914..917c62a 100644 --- a/media/libstagefright/timedtext/TimedTextPlayer.cpp +++ b/media/libstagefright/timedtext/TimedTextPlayer.cpp @@ -31,6 +31,7 @@ namespace android { static const int64_t kAdjustmentProcessingTimeUs = 100000ll; +static const int64_t kWaitTimeUsToRetryRead = 100000ll; TimedTextPlayer::TimedTextPlayer(const wp<MediaPlayerBase> &listener) : mListener(listener), @@ -139,13 +140,25 @@ void TimedTextPlayer::doSeekAndRead(int64_t seekTimeUs) { } void TimedTextPlayer::doRead(MediaSource::ReadOptions* options) { - int64_t timeUs = 0; + int64_t startTimeUs = 0; + int64_t endTimeUs = 0; sp<ParcelEvent> parcelEvent = new ParcelEvent(); - status_t err = mSource->read(&timeUs, &(parcelEvent->parcel), options); - if (err != OK) { + status_t err = mSource->read(&startTimeUs, &endTimeUs, + &(parcelEvent->parcel), options); + if (err == WOULD_BLOCK) { + postTextEventDelayUs(NULL, kWaitTimeUsToRetryRead); + return; + } else if (err != OK) { notifyError(err); - } else { - postTextEvent(parcelEvent, timeUs); + return; + } + + postTextEvent(parcelEvent, startTimeUs); + if (endTimeUs > 0) { + CHECK_GE(endTimeUs, startTimeUs); + // send an empty timed text to clear the subtitle when it reaches to the + // end time. + postTextEvent(NULL, endTimeUs); } } @@ -162,6 +175,13 @@ void TimedTextPlayer::postTextEvent(const sp<ParcelEvent>& parcel, int64_t timeU } else { delayUs = timeUs - positionUs - kAdjustmentProcessingTimeUs; } + postTextEventDelayUs(parcel, delayUs); + } +} + +void TimedTextPlayer::postTextEventDelayUs(const sp<ParcelEvent>& parcel, int64_t delayUs) { + sp<MediaPlayerBase> listener = mListener.promote(); + if (listener != NULL) { sp<AMessage> msg = new AMessage(kWhatSendSubtitle, id()); msg->setInt32("generation", mSendSubtitleGeneration); if (parcel != NULL) { diff --git a/media/libstagefright/timedtext/TimedTextPlayer.h b/media/libstagefright/timedtext/TimedTextPlayer.h index b869f18..47aff03 100644 --- a/media/libstagefright/timedtext/TimedTextPlayer.h +++ b/media/libstagefright/timedtext/TimedTextPlayer.h @@ -67,6 +67,7 @@ private: void doRead(MediaSource::ReadOptions* options = NULL); void onTextEvent(); void postTextEvent(const sp<ParcelEvent>& parcel = NULL, int64_t timeUs = -1); + void postTextEventDelayUs(const sp<ParcelEvent>& parcel = NULL, int64_t delayUs = -1); void notifyError(int error = 0); void notifyListener(const Parcel *parcel = NULL); diff --git a/media/libstagefright/timedtext/TimedTextSRTSource.cpp b/media/libstagefright/timedtext/TimedTextSRTSource.cpp index c44a99b..7b1f7f6 100644 --- a/media/libstagefright/timedtext/TimedTextSRTSource.cpp +++ b/media/libstagefright/timedtext/TimedTextSRTSource.cpp @@ -19,6 +19,7 @@ #include <utils/Log.h> #include <binder/Parcel.h> +#include <media/stagefright/foundation/ADebug.h> // for CHECK_xx #include <media/stagefright/foundation/AString.h> #include <media/stagefright/DataSource.h> #include <media/stagefright/MediaDefs.h> // for MEDIA_MIMETYPE_xxx @@ -63,19 +64,18 @@ status_t TimedTextSRTSource::stop() { } status_t TimedTextSRTSource::read( - int64_t *timeUs, + int64_t *startTimeUs, + int64_t *endTimeUs, Parcel *parcel, const MediaSource::ReadOptions *options) { - int64_t endTimeUs; AString text; - status_t err = getText(options, &text, timeUs, &endTimeUs); + status_t err = getText(options, &text, startTimeUs, endTimeUs); if (err != OK) { return err; } - if (*timeUs > 0) { - extractAndAppendLocalDescriptions(*timeUs, text, parcel); - } + CHECK_GE(*startTimeUs, 0); + extractAndAppendLocalDescriptions(*startTimeUs, text, parcel); return OK; } diff --git a/media/libstagefright/timedtext/TimedTextSRTSource.h b/media/libstagefright/timedtext/TimedTextSRTSource.h index 62710a0..e1371b8 100644 --- a/media/libstagefright/timedtext/TimedTextSRTSource.h +++ b/media/libstagefright/timedtext/TimedTextSRTSource.h @@ -36,7 +36,8 @@ public: virtual status_t start(); virtual status_t stop(); virtual status_t read( - int64_t *timeUs, + int64_t *startTimeUs, + int64_t *endTimeUs, Parcel *parcel, const MediaSource::ReadOptions *options = NULL); virtual sp<MetaData> getFormat(); diff --git a/media/libstagefright/timedtext/TimedTextSource.h b/media/libstagefright/timedtext/TimedTextSource.h index 9349342..756cc31 100644 --- a/media/libstagefright/timedtext/TimedTextSource.h +++ b/media/libstagefright/timedtext/TimedTextSource.h @@ -43,7 +43,8 @@ class TimedTextSource : public RefBase { virtual status_t stop() = 0; // Returns subtitle parcel and its start time. virtual status_t read( - int64_t *timeUs, + int64_t *startTimeUs, + int64_t *endTimeUs, Parcel *parcel, const MediaSource::ReadOptions *options = NULL) = 0; virtual status_t extractGlobalDescriptions(Parcel *parcel) { diff --git a/packages/SystemUI/res/layout/navigation_bar.xml b/packages/SystemUI/res/layout/navigation_bar.xml index bb80098..8fbab74 100644 --- a/packages/SystemUI/res/layout/navigation_bar.xml +++ b/packages/SystemUI/res/layout/navigation_bar.xml @@ -144,11 +144,11 @@ /> </LinearLayout> - <View android:id="@+id/deadzone" + <com.android.systemui.statusbar.policy.DeadZone + android:id="@+id/deadzone" android:layout_height="@dimen/navigation_bar_deadzone_size" android:layout_width="match_parent" android:layout_gravity="top" - android:clickable="true" /> </FrameLayout> @@ -272,11 +272,11 @@ /> </LinearLayout> - <View android:id="@+id/deadzone" + <com.android.systemui.statusbar.policy.DeadZone + android:id="@+id/deadzone" android:layout_width="@dimen/navigation_bar_deadzone_size" android:layout_height="match_parent" android:layout_gravity="left" - android:clickable="true" /> </FrameLayout> diff --git a/packages/SystemUI/res/values-am/strings.xml b/packages/SystemUI/res/values-am/strings.xml index e2e65b9..13aaacb 100644 --- a/packages/SystemUI/res/values-am/strings.xml +++ b/packages/SystemUI/res/values-am/strings.xml @@ -53,7 +53,7 @@ <string name="usb_accessory_permission_prompt" msgid="5171775411178865750">"መተግበሪያ <xliff:g id="APPLICATION">%1$s</xliff:g> የUSB ተቀጥላ ላይ እንዲደርስ ፍቀድ?"</string> <string name="usb_device_confirm_prompt" msgid="5161205258635253206">"የዚህ USB ተቀጥላ ሲያያዝ <xliff:g id="ACTIVITY">%1$s</xliff:g>ይከፈት?"</string> <string name="usb_accessory_confirm_prompt" msgid="3808984931830229888">"የዚህ USB ተቀጥላ ሲያያዝ <xliff:g id="ACTIVITY">%1$s</xliff:g> ይከፈት?"</string> - <string name="usb_accessory_uri_prompt" msgid="513450621413733343">"ምንም የተጫኑ መተግበሪያዎች ከዚህ የUSB ተቀጥላ ጋር አይሰሩም። በ<xliff:g id="URL">%1$s</xliff:g> ስለዚህ ተቀጥላ የበለጠ እወቅ።"</string> + <string name="usb_accessory_uri_prompt" msgid="513450621413733343">"ምንም የተጫኑ መተግበሪያዎች ከዚህ የUSB ተቀጥላ ጋር አይሰሩም። በ<xliff:g id="URL">%1$s</xliff:g> ስለዚህ ተቀጥላ የበለጠ ለመረዳት።"</string> <string name="title_usb_accessory" msgid="4966265263465181372">"የUSB ተቀጥላ"</string> <string name="label_view" msgid="6304565553218192990">"ዕይታ"</string> <string name="always_use_device" msgid="1450287437017315906">"ለዚህ USB መሣሪያ በነባሪነት ተጠቀም"</string> diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/DeadZone.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/DeadZone.java new file mode 100644 index 0000000..19fbe96 --- /dev/null +++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/DeadZone.java @@ -0,0 +1,41 @@ +/* + * Copyright (C) 2012 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.systemui.statusbar.policy; + +import android.content.Context; +import android.util.AttributeSet; +import android.view.MotionEvent; +import android.view.View; + +import com.android.systemui.R; + +public class DeadZone extends View { + public DeadZone(Context context, AttributeSet attrs) { + this(context, attrs, 0); + } + + public DeadZone(Context context, AttributeSet attrs, int defStyle) { + super(context, attrs); + } + + // I made you a touch event + @Override + public boolean onTouchEvent (MotionEvent event) { + return true; // but I eated it + } +} + diff --git a/policy/src/com/android/internal/policy/impl/SimPukUnlockScreen.java b/policy/src/com/android/internal/policy/impl/SimPukUnlockScreen.java index ba06996..f3e7d4a 100644 --- a/policy/src/com/android/internal/policy/impl/SimPukUnlockScreen.java +++ b/policy/src/com/android/internal/policy/impl/SimPukUnlockScreen.java @@ -106,7 +106,7 @@ public class SimPukUnlockScreen extends LinearLayout implements KeyguardScreen, mHeaderText.setSelected(true); mKeyguardStatusViewManager = new KeyguardStatusViewManager(this, updateMonitor, - lockpatternutils, callback, false); + lockpatternutils, callback, true); mPinText.setFocusableInTouchMode(true); mPinText.setOnFocusChangeListener(this); diff --git a/services/audioflinger/Android.mk b/services/audioflinger/Android.mk index 1652cae..257f62c 100644 --- a/services/audioflinger/Android.mk +++ b/services/audioflinger/Android.mk @@ -15,6 +15,7 @@ LOCAL_C_INCLUDES := \ $(call include-path-for, audio-effects) \ $(call include-path-for, audio-utils) +# FIXME keep libmedia_native but remove libmedia after split LOCAL_SHARED_LIBRARIES := \ libaudioutils \ libcommon_time_client \ diff --git a/services/audioflinger/AudioFlinger.cpp b/services/audioflinger/AudioFlinger.cpp index d83d19a..e92e69c 100644 --- a/services/audioflinger/AudioFlinger.cpp +++ b/services/audioflinger/AudioFlinger.cpp @@ -894,7 +894,8 @@ status_t AudioFlinger::setParameters(audio_io_handle_t ioHandle, const String8& // indicate output device change to all input threads for pre processing AudioParameter param = AudioParameter(keyValuePairs); int value; - if (param.getInt(String8(AudioParameter::keyRouting), value) == NO_ERROR) { + if ((param.getInt(String8(AudioParameter::keyRouting), value) == NO_ERROR) && + (value != 0)) { for (size_t i = 0; i < mRecordThreads.size(); i++) { mRecordThreads.valueAt(i)->setParameters(keyValuePairs); } @@ -1588,7 +1589,7 @@ void AudioFlinger::PlaybackThread::onFirstRef() } // PlaybackThread::createTrack_l() must be called with AudioFlinger::mLock held -sp<AudioFlinger::PlaybackThread::Track> AudioFlinger::PlaybackThread::createTrack_l( +sp<AudioFlinger::PlaybackThread::Track> AudioFlinger::PlaybackThread::createTrack_l( const sp<AudioFlinger::Client>& client, audio_stream_type_t streamType, uint32_t sampleRate, @@ -2337,7 +2338,7 @@ AudioFlinger::PlaybackThread::mixer_state AudioFlinger::MixerThread::prepareTrac size_t tracksWithEffect = 0; float masterVolume = mMasterVolume; - bool masterMute = mMasterMute; + bool masterMute = mMasterMute; if (masterMute) { masterVolume = 0; @@ -2376,7 +2377,7 @@ AudioFlinger::PlaybackThread::mixer_state AudioFlinger::MixerThread::prepareTrac // +1 for rounding and +1 for additional sample needed for interpolation minFrames = (mFrameCount * t->sampleRate()) / mSampleRate + 1 + 1; // add frames already consumed but not yet released by the resampler - // because cblk->framesReady() will include these frames + // because cblk->framesReady() will include these frames minFrames += mAudioMixer->getUnreleasedFrames(track->name()); // the minimum track buffer size is normally twice the number of frames necessary // to fill one buffer and the resampler should not leave more than one buffer worth @@ -2514,6 +2515,7 @@ AudioFlinger::PlaybackThread::mixer_state AudioFlinger::MixerThread::prepareTrac // reset retry count track->mRetryCount = kMaxTrackRetries; + // If one track is ready, set the mixer ready if: // - the mixer was not ready during previous round OR // - no other track is not ready @@ -3372,19 +3374,19 @@ AudioFlinger::ThreadBase::TrackBase::TrackBase( } } else { mCblk = (audio_track_cblk_t *)(new uint8_t[size]); - // construct the shared structure in-place. - new(mCblk) audio_track_cblk_t(); - // clear all buffers - mCblk->frameCount = frameCount; - mCblk->sampleRate = sampleRate; - mChannelCount = channelCount; - mChannelMask = channelMask; - mBuffer = (char*)mCblk + sizeof(audio_track_cblk_t); - memset(mBuffer, 0, frameCount*channelCount*sizeof(int16_t)); - // Force underrun condition to avoid false underrun callback until first data is - // written to buffer (other flags are cleared) - mCblk->flags = CBLK_UNDERRUN_ON; - mBufferEnd = (uint8_t *)mBuffer + bufferSize; + // construct the shared structure in-place. + new(mCblk) audio_track_cblk_t(); + // clear all buffers + mCblk->frameCount = frameCount; + mCblk->sampleRate = sampleRate; + mChannelCount = channelCount; + mChannelMask = channelMask; + mBuffer = (char*)mCblk + sizeof(audio_track_cblk_t); + memset(mBuffer, 0, frameCount*channelCount*sizeof(int16_t)); + // Force underrun condition to avoid false underrun callback until first data is + // written to buffer (other flags are cleared) + mCblk->flags = CBLK_UNDERRUN_ON; + mBufferEnd = (uint8_t *)mBuffer + bufferSize; } } @@ -3479,23 +3481,27 @@ AudioFlinger::PlaybackThread::Track::Track( const sp<IMemory>& sharedBuffer, int sessionId) : TrackBase(thread, client, sampleRate, format, channelMask, frameCount, sharedBuffer, sessionId), - mMute(false), mSharedBuffer(sharedBuffer), mName(-1), mMainBuffer(NULL), mAuxBuffer(NULL), + mMute(false), + // mFillingUpStatus ? + // mRetryCount initialized later when needed + mSharedBuffer(sharedBuffer), + mStreamType(streamType), + mName(-1), // see note below + mMainBuffer(thread->mixBuffer()), + mAuxBuffer(NULL), mAuxEffectId(0), mHasVolumeController(false) { if (mCblk != NULL) { - if (thread != NULL) { - mName = thread->getTrackName_l(); - mMainBuffer = thread->mixBuffer(); - } - ALOGV("Track constructor name %d, calling pid %d", mName, IPCThreadState::self()->getCallingPid()); - if (mName < 0) { - ALOGE("no more track names available"); - } - mStreamType = streamType; // NOTE: audio_track_cblk_t::frameSize for 8 bit PCM data is based on a sample size of // 16 bit because data is converted to 16 bit before being stored in buffer by AudioTrack mCblk->frameSize = audio_is_linear_pcm(format) ? mChannelCount * sizeof(int16_t) : sizeof(uint8_t); + // to avoid leaking a track name, do not allocate one unless there is an mCblk + mName = thread->getTrackName_l(); + if (mName < 0) { + ALOGE("no more track names available"); + } } + ALOGV("Track constructor name %d, calling pid %d", mName, IPCThreadState::self()->getCallingPid()); } AudioFlinger::PlaybackThread::Track::~Track() @@ -3792,16 +3798,9 @@ AudioFlinger::PlaybackThread::TimedTrack::create( if (!client->reserveTimedTrack()) return NULL; - sp<TimedTrack> track = new TimedTrack( + return new TimedTrack( thread, client, streamType, sampleRate, format, channelMask, frameCount, sharedBuffer, sessionId); - - if (track == NULL) { - client->releaseTimedTrack(); - return NULL; - } - - return track; } AudioFlinger::PlaybackThread::TimedTrack::TimedTrack( @@ -4261,7 +4260,7 @@ void AudioFlinger::RecordThread::RecordTrack::stop() RecordThread *recordThread = (RecordThread *)thread.get(); recordThread->stop(this); TrackBase::reset(); - // Force overerrun condition to avoid false overrun callback until first data is + // Force overrun condition to avoid false overrun callback until first data is // read from buffer android_atomic_or(CBLK_UNDERRUN_ON, &mCblk->flags); } diff --git a/services/audioflinger/AudioFlinger.h b/services/audioflinger/AudioFlinger.h index 0e4b24a..d1950a3 100644 --- a/services/audioflinger/AudioFlinger.h +++ b/services/audioflinger/AudioFlinger.h @@ -681,9 +681,9 @@ private: enum {FS_FILLING, FS_FILLED, FS_ACTIVE}; mutable uint8_t mFillingUpStatus; int8_t mRetryCount; - sp<IMemory> mSharedBuffer; + const sp<IMemory> mSharedBuffer; bool mResetDone; - audio_stream_type_t mStreamType; + const audio_stream_type_t mStreamType; int mName; int16_t *mMainBuffer; int32_t *mAuxBuffer; @@ -899,6 +899,7 @@ public: protected: SortedVector< wp<Track> > mActiveTracks; + // Allocate a track name. Returns name >= 0 if successful, -1 on failure. virtual int getTrackName_l() = 0; virtual void deleteTrackName_l(int name) = 0; virtual uint32_t activeSleepTimeUs(); @@ -1559,9 +1560,10 @@ mutable Mutex mLock; // mutex for process, commands and handl uint32_t mNewLeftVolume; // new volume on left channel uint32_t mNewRightVolume; // new volume on right channel uint32_t mStrategy; // strategy for this effect chain - // mSuspendedEffects lists all effect currently suspended in the chain - // use effect type UUID timelow field as key. There is no real risk of identical + // mSuspendedEffects lists all effects currently suspended in the chain. + // Use effect type UUID timelow field as key. There is no real risk of identical // timeLow fields among effect type UUIDs. + // Updated by updateSuspendedSessions_l() only. KeyedVector< int, sp<SuspendedEffectDesc> > mSuspendedEffects; }; diff --git a/services/audioflinger/AudioMixer.cpp b/services/audioflinger/AudioMixer.cpp index 1ec238b..3f4c19a 100644 --- a/services/audioflinger/AudioMixer.cpp +++ b/services/audioflinger/AudioMixer.cpp @@ -42,12 +42,15 @@ namespace android { // ---------------------------------------------------------------------------- -AudioMixer::AudioMixer(size_t frameCount, uint32_t sampleRate) - : mTrackNames(0), mSampleRate(sampleRate) +AudioMixer::AudioMixer(size_t frameCount, uint32_t sampleRate, uint32_t maxNumTracks) + : mTrackNames(0), mConfiguredNames((1 << maxNumTracks) - 1), mSampleRate(sampleRate) { // AudioMixer is not yet capable of multi-channel beyond stereo COMPILE_TIME_ASSERT_FUNCTION_SCOPE(2 == MAX_NUM_CHANNELS); + ALOG_ASSERT(maxNumTracks <= MAX_NUM_TRACKS, "maxNumTracks %u > MAX_NUM_TRACKS %u", + maxNumTracks, MAX_NUM_TRACKS); + LocalClock lc; mState.enabledTracks= 0; @@ -57,6 +60,10 @@ AudioMixer::AudioMixer(size_t frameCount, uint32_t sampleRate) mState.outputTemp = NULL; mState.resampleTemp = NULL; // mState.reserved + + // FIXME Most of the following initialization is probably redundant since + // tracks[i] should only be referenced if (mTrackNames & (1 << i)) != 0 + // and mTrackNames is initially 0. However, leave it here until that's verified. track_t* t = mState.tracks; for (unsigned i=0 ; i < MAX_NUM_TRACKS ; i++) { t->needs = 0; @@ -103,7 +110,7 @@ AudioMixer::~AudioMixer() int AudioMixer::getTrackName() { - uint32_t names = ~mTrackNames; + uint32_t names = (~mTrackNames) & mConfiguredNames; if (names != 0) { int n = __builtin_ctz(names); ALOGV("add track (%d)", n); @@ -132,7 +139,7 @@ void AudioMixer::deleteTrackName(int name) invalidateState(1<<name); } if (track.resampler != NULL) { - // delete the resampler + // delete the resampler delete track.resampler; track.resampler = NULL; track.sampleRate = mSampleRate; diff --git a/services/audioflinger/AudioMixer.h b/services/audioflinger/AudioMixer.h index b210212..856450c 100644 --- a/services/audioflinger/AudioMixer.h +++ b/services/audioflinger/AudioMixer.h @@ -31,7 +31,8 @@ namespace android { class AudioMixer { public: - AudioMixer(size_t frameCount, uint32_t sampleRate); + AudioMixer(size_t frameCount, uint32_t sampleRate, + uint32_t maxNumTracks = MAX_NUM_TRACKS); /*virtual*/ ~AudioMixer(); // non-virtual saves a v-table, restore if sub-classed @@ -70,9 +71,14 @@ public: // For all APIs with "name": TRACK0 <= name < TRACK0 + MAX_NUM_TRACKS + + // Allocate a track name. Returns new track name if successful, -1 on failure. int getTrackName(); + + // Free an allocated track by name void deleteTrackName(int name); + // Enable or disable an allocated track by name void enable(int name); void disable(int name); @@ -184,11 +190,17 @@ private: int32_t *outputTemp; int32_t *resampleTemp; int32_t reserved[2]; + // FIXME allocate dynamically to save some memory when maxNumTracks < MAX_NUM_TRACKS track_t tracks[MAX_NUM_TRACKS]; __attribute__((aligned(32))); }; // bitmask of allocated track names, where bit 0 corresponds to TRACK0 etc. uint32_t mTrackNames; + + // bitmask of configured track names; ~0 if maxNumTracks == MAX_NUM_TRACKS, + // but will have fewer bits set if maxNumTracks < MAX_NUM_TRACKS + const uint32_t mConfiguredNames; + const uint32_t mSampleRate; state_t mState __attribute__((aligned(32))); diff --git a/services/java/com/android/server/BootReceiver.java b/services/java/com/android/server/BootReceiver.java index da65438..22874e6 100644 --- a/services/java/com/android/server/BootReceiver.java +++ b/services/java/com/android/server/BootReceiver.java @@ -20,13 +20,13 @@ import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.content.SharedPreferences; -import android.net.Downloads; import android.os.Build; import android.os.DropBoxManager; import android.os.FileObserver; import android.os.FileUtils; import android.os.RecoverySystem; import android.os.SystemProperties; +import android.provider.Downloads; import android.util.Slog; import java.io.File; @@ -78,9 +78,8 @@ public class BootReceiver extends BroadcastReceiver { }.start(); } - private void removeOldUpdatePackages(Context ctx) { - Downloads.ByUri.removeAllDownloadsByPackage( - ctx, OLD_UPDATER_PACKAGE, OLD_UPDATER_CLASS); + private void removeOldUpdatePackages(Context context) { + Downloads.removeAllDownloadsByPackage(context, OLD_UPDATER_PACKAGE, OLD_UPDATER_CLASS); } private void logBootEvents(Context ctx) throws IOException { diff --git a/services/java/com/android/server/net/NetworkPolicyManagerService.java b/services/java/com/android/server/net/NetworkPolicyManagerService.java index 2ad24e2..0e04d59 100644 --- a/services/java/com/android/server/net/NetworkPolicyManagerService.java +++ b/services/java/com/android/server/net/NetworkPolicyManagerService.java @@ -157,6 +157,7 @@ public class NetworkPolicyManagerService extends INetworkPolicyManager.Stub { private static final int VERSION_ADDED_METERED = 4; private static final int VERSION_SPLIT_SNOOZE = 5; private static final int VERSION_ADDED_TIMEZONE = 6; + private static final int VERSION_ADDED_INFERRED = 7; // @VisibleForTesting public static final int TYPE_WARNING = 0x1; @@ -179,6 +180,7 @@ public class NetworkPolicyManagerService extends INetworkPolicyManager.Stub { private static final String ATTR_LAST_WARNING_SNOOZE = "lastWarningSnooze"; private static final String ATTR_LAST_LIMIT_SNOOZE = "lastLimitSnooze"; private static final String ATTR_METERED = "metered"; + private static final String ATTR_INFERRED = "inferred"; private static final String ATTR_UID = "uid"; private static final String ATTR_POLICY = "policy"; @@ -522,6 +524,11 @@ public class NetworkPolicyManagerService extends INetworkPolicyManager.Stub { case MATCH_MOBILE_3G_LOWER: case MATCH_MOBILE_4G: case MATCH_MOBILE_ALL: + // mobile templates aren't relevant in airplane mode + if (isAirplaneModeOn(mContext)) { + return false; + } + // mobile templates are relevant when subscriberid is active return Objects.equal(getActiveSubscriberId(), template.getSubscriberId()); } @@ -932,7 +939,7 @@ public class NetworkPolicyManagerService extends INetworkPolicyManager.Stub { final NetworkTemplate template = buildTemplateMobileAll(subscriberId); mNetworkPolicy.put(template, new NetworkPolicy(template, cycleDay, cycleTimezone, - warningBytes, LIMIT_DISABLED, SNOOZE_NEVER, SNOOZE_NEVER, true)); + warningBytes, LIMIT_DISABLED, SNOOZE_NEVER, SNOOZE_NEVER, true, true)); writePolicyLocked(); } } @@ -1004,12 +1011,18 @@ public class NetworkPolicyManagerService extends INetworkPolicyManager.Stub { } else { lastWarningSnooze = SNOOZE_NEVER; } + final boolean inferred; + if (version >= VERSION_ADDED_INFERRED) { + inferred = readBooleanAttribute(in, ATTR_INFERRED); + } else { + inferred = false; + } final NetworkTemplate template = new NetworkTemplate( networkTemplate, subscriberId); mNetworkPolicy.put(template, new NetworkPolicy(template, cycleDay, cycleTimezone, warningBytes, limitBytes, lastWarningSnooze, - lastLimitSnooze, metered)); + lastLimitSnooze, metered, inferred)); } else if (TAG_UID_POLICY.equals(tag)) { final int uid = readIntAttribute(in, ATTR_UID); @@ -1064,7 +1077,7 @@ public class NetworkPolicyManagerService extends INetworkPolicyManager.Stub { out.startDocument(null, true); out.startTag(null, TAG_POLICY_LIST); - writeIntAttribute(out, ATTR_VERSION, VERSION_ADDED_TIMEZONE); + writeIntAttribute(out, ATTR_VERSION, VERSION_ADDED_INFERRED); writeBooleanAttribute(out, ATTR_RESTRICT_BACKGROUND, mRestrictBackground); // write all known network policies @@ -1084,6 +1097,7 @@ public class NetworkPolicyManagerService extends INetworkPolicyManager.Stub { writeLongAttribute(out, ATTR_LAST_WARNING_SNOOZE, policy.lastWarningSnooze); writeLongAttribute(out, ATTR_LAST_LIMIT_SNOOZE, policy.lastLimitSnooze); writeBooleanAttribute(out, ATTR_METERED, policy.metered); + writeBooleanAttribute(out, ATTR_INFERRED, policy.inferred); out.endTag(null, TAG_NETWORK_POLICY); } @@ -1714,6 +1728,11 @@ public class NetworkPolicyManagerService extends INetworkPolicyManager.Stub { mHandler.getLooper().getQueue().addIdleHandler(handler); } + public static boolean isAirplaneModeOn(Context context) { + return Settings.System.getInt( + context.getContentResolver(), Settings.System.AIRPLANE_MODE_ON, 0) != 0; + } + private static void collectKeys(SparseIntArray source, SparseBooleanArray target) { final int size = source.size(); for (int i = 0; i < size; i++) { diff --git a/services/java/com/android/server/wm/AppWindowToken.java b/services/java/com/android/server/wm/AppWindowToken.java index 67b667a..3043da2 100644 --- a/services/java/com/android/server/wm/AppWindowToken.java +++ b/services/java/com/android/server/wm/AppWindowToken.java @@ -135,6 +135,10 @@ class AppWindowToken extends WindowToken { animLayerAdjustment = adj; updateLayers(); } + // Start out animation gone if window is gone, or visible if window is visible. + transformation.clear(); + transformation.setAlpha(reportedVisible ? 1 : 0); + hasTransformation = true; } public void setDummyAnimation() { @@ -186,14 +190,17 @@ class AppWindowToken extends WindowToken { } } - void showAllWindowsLocked() { + boolean showAllWindowsLocked() { + boolean isAnimating = false; final int NW = allAppWindows.size(); for (int i=0; i<NW; i++) { WindowState w = allAppWindows.get(i); if (WindowManagerService.DEBUG_VISIBILITY) Slog.v(WindowManagerService.TAG, "performing show on: " + w); w.performShowLocked(); + isAnimating |= w.isAnimating(); } + return isAnimating; } @@ -218,7 +225,7 @@ class AppWindowToken extends WindowToken { // This must be called while inside a transaction. boolean stepAnimationLocked(long currentTime, int dw, int dh) { - if (!service.mDisplayFrozen && service.mPolicy.isScreenOnFully()) { + if (service.okToDisplay()) { // We will run animations as long as the display isn't frozen. if (animation == WindowManagerService.sDummyAnimation) { diff --git a/services/java/com/android/server/wm/BlackFrame.java b/services/java/com/android/server/wm/BlackFrame.java index 40e452a..c915932 100644 --- a/services/java/com/android/server/wm/BlackFrame.java +++ b/services/java/com/android/server/wm/BlackFrame.java @@ -32,12 +32,14 @@ public class BlackFrame { class BlackSurface { final int left; final int top; + final int layer; final Surface surface; BlackSurface(SurfaceSession session, int layer, int l, int t, int r, int b) throws Surface.OutOfResourcesException { left = l; top = t; + this.layer = layer; int w = r-l; int h = b-t; surface = new Surface(session, 0, "BlackSurface", @@ -45,8 +47,6 @@ public class BlackFrame { if (WindowManagerService.SHOW_TRANSACTIONS || WindowManagerService.SHOW_SURFACE_ALLOC) Slog.i(WindowManagerService.TAG, " BLACK " + surface + ": CREATE layer=" + layer); - surface.setAlpha(1.0f); - surface.setLayer(layer); } void setMatrix(Matrix matrix) { @@ -58,6 +58,8 @@ public class BlackFrame { surface.setMatrix( mTmpFloats[Matrix.MSCALE_X], mTmpFloats[Matrix.MSKEW_Y], mTmpFloats[Matrix.MSKEW_X], mTmpFloats[Matrix.MSCALE_Y]); + surface.setAlpha(1.0f); + surface.setLayer(layer); if (false) { Slog.i(WindowManagerService.TAG, "Black Surface @ (" + left + "," + top + "): (" + mTmpFloats[Matrix.MTRANS_X] + "," diff --git a/services/java/com/android/server/wm/DimAnimator.java b/services/java/com/android/server/wm/DimAnimator.java index a9d4e01..85495ea 100644 --- a/services/java/com/android/server/wm/DimAnimator.java +++ b/services/java/com/android/server/wm/DimAnimator.java @@ -130,33 +130,31 @@ class DimAnimator { } } - boolean animating = false; - if (mLastDimAnimTime != 0) { + boolean animating = mLastDimAnimTime != 0; + if (animating) { mDimCurrentAlpha += mDimDeltaPerMs * (currentTime-mLastDimAnimTime); - boolean more = true; if (displayFrozen) { // If the display is frozen, there is no reason to animate. - more = false; + animating = false; } else if (mDimDeltaPerMs > 0) { if (mDimCurrentAlpha > mDimTargetAlpha) { - more = false; + animating = false; } } else if (mDimDeltaPerMs < 0) { if (mDimCurrentAlpha < mDimTargetAlpha) { - more = false; + animating = false; } } else { - more = false; + animating = false; } // Do we need to continue animating? - if (more) { + if (animating) { if (WindowManagerService.SHOW_TRANSACTIONS) Slog.i(WindowManagerService.TAG, " DIM " + mDimSurface + ": alpha=" + mDimCurrentAlpha); mLastDimAnimTime = currentTime; mDimSurface.setAlpha(mDimCurrentAlpha); - animating = true; } else { mDimCurrentAlpha = mDimTargetAlpha; mLastDimAnimTime = 0; diff --git a/services/java/com/android/server/wm/WindowManagerService.java b/services/java/com/android/server/wm/WindowManagerService.java index 6993657..31a2788 100644 --- a/services/java/com/android/server/wm/WindowManagerService.java +++ b/services/java/com/android/server/wm/WindowManagerService.java @@ -18,7 +18,6 @@ package com.android.server.wm; import static android.view.WindowManager.LayoutParams.FIRST_APPLICATION_WINDOW; import static android.view.WindowManager.LayoutParams.FIRST_SUB_WINDOW; -import static android.view.WindowManager.LayoutParams.FLAG_BLUR_BEHIND; import static android.view.WindowManager.LayoutParams.FLAG_COMPATIBLE_WINDOW; import static android.view.WindowManager.LayoutParams.FLAG_DIM_BEHIND; import static android.view.WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON; @@ -173,7 +172,6 @@ public class WindowManagerService extends IWindowManager.Stub static final boolean HIDE_STACK_CRAWLS = true; static final boolean PROFILE_ORIENTATION = false; - static final boolean BLUR = true; static final boolean localLOGV = DEBUG; /** How much to multiply the policy's type layer, to reserve room @@ -196,11 +194,6 @@ public class WindowManagerService extends IWindowManager.Stub static final int LAYER_OFFSET_DIM = 1; /** - * Blur surface layer is immediately below dim layer. - */ - static final int LAYER_OFFSET_BLUR = 2; - - /** * Layer at which to put the rotation freeze snapshot. */ static final int FREEZE_LAYER = (TYPE_LAYER_MULTIPLIER * 200) + 1; @@ -416,8 +409,6 @@ public class WindowManagerService extends IWindowManager.Stub SurfaceSession mFxSession; private DimAnimator mDimAnimator = null; - Surface mBlurSurface; - boolean mBlurShown; Watermark mWatermark; StrictModeFlash mStrictModeFlash; ScreenRotationAnimation mScreenRotationAnimation; @@ -597,7 +588,6 @@ public class WindowManagerService extends IWindowManager.Stub private int mAdjResult = 0; private Session mHoldScreen = null; private boolean mObscured = false; - private boolean mBlurring = false; private boolean mDimming = false; private boolean mSyswin = false; private float mScreenBrightness = -1; @@ -735,6 +725,7 @@ public class WindowManagerService extends IWindowManager.Stub mAllowBootMessages = allowBootMsgs; } + @Override public void run() { Looper.prepare(); WindowManagerService s = new WindowManagerService(mContext, mPM, @@ -774,6 +765,7 @@ public class WindowManagerService extends IWindowManager.Stub mPM = pm; } + @Override public void run() { Looper.prepare(); WindowManagerPolicyThread.set(this, Looper.myLooper()); @@ -2302,8 +2294,7 @@ public class WindowManagerService extends IWindowManager.Stub // to hold off on removing the window until the animation is done. // If the display is frozen, just remove immediately, since the // animation wouldn't be seen. - if (win.mSurface != null && !mDisplayFrozen && mDisplayEnabled - && mPolicy.isScreenOnFully()) { + if (win.mSurface != null && okToDisplay()) { // If we are not currently running the exit animation, we // need to see about starting one. if (wasVisible=win.isWinVisibleLw()) { @@ -2687,8 +2678,7 @@ public class WindowManagerService extends IWindowManager.Stub win.mEnterAnimationPending = true; } if (displayed) { - if (win.isDrawnLw() && !mDisplayFrozen - && mDisplayEnabled && mPolicy.isScreenOnFully()) { + if (win.isDrawnLw() && okToDisplay()) { applyEnterAnimationLocked(win); } if ((win.mAttrs.flags @@ -3015,7 +3005,7 @@ public class WindowManagerService extends IWindowManager.Stub // frozen, there is no reason to animate and it can cause strange // artifacts when we unfreeze the display if some different animation // is running. - if (!mDisplayFrozen && mDisplayEnabled && mPolicy.isScreenOnFully()) { + if (okToDisplay()) { int anim = mPolicy.selectAnimationLw(win, transit); int attr = -1; Animation a = null; @@ -3101,7 +3091,7 @@ public class WindowManagerService extends IWindowManager.Stub // frozen, there is no reason to animate and it can cause strange // artifacts when we unfreeze the display if some different animation // is running. - if (!mDisplayFrozen && mDisplayEnabled && mPolicy.isScreenOnFully()) { + if (okToDisplay()) { Animation a; if (mNextAppTransitionPackage != null) { a = loadAnimation(mNextAppTransitionPackage, enter ? @@ -3234,6 +3224,10 @@ public class WindowManagerService extends IWindowManager.Stub Slog.w(TAG, msg); return false; } + + boolean okToDisplay() { + return !mDisplayFrozen && mDisplayEnabled && mPolicy.isScreenOnFully(); + } AppWindowToken findAppWindowToken(IBinder token) { WindowToken wtoken = mTokenMap.get(token); @@ -3665,7 +3659,7 @@ public class WindowManagerService extends IWindowManager.Stub if (DEBUG_APP_TRANSITIONS) Slog.v( TAG, "Prepare app transition: transit=" + transit + " mNextAppTransition=" + mNextAppTransition); - if (!mDisplayFrozen && mDisplayEnabled && mPolicy.isScreenOnFully()) { + if (okToDisplay()) { if (mNextAppTransition == WindowManagerPolicy.TRANSIT_UNSET || mNextAppTransition == WindowManagerPolicy.TRANSIT_NONE) { mNextAppTransition = transit; @@ -3749,7 +3743,7 @@ public class WindowManagerService extends IWindowManager.Stub // If the display is frozen, we won't do anything until the // actual window is displayed so there is no reason to put in // the starting window. - if (mDisplayFrozen || !mDisplayEnabled || !mPolicy.isScreenOnFully()) { + if (!okToDisplay()) { return; } @@ -4039,8 +4033,7 @@ public class WindowManagerService extends IWindowManager.Stub // If we are preparing an app transition, then delay changing // the visibility of this token until we execute that transition. - if (!mDisplayFrozen && mDisplayEnabled && mPolicy.isScreenOnFully() - && mNextAppTransition != WindowManagerPolicy.TRANSIT_UNSET) { + if (okToDisplay() && mNextAppTransition != WindowManagerPolicy.TRANSIT_UNSET) { // Already in requested state, don't do anything more. if (wtoken.hiddenRequested != visible) { return; @@ -4168,7 +4161,7 @@ public class WindowManagerService extends IWindowManager.Stub } synchronized(mWindowMap) { - if (configChanges == 0 && !mDisplayFrozen && mPolicy.isScreenOnFully()) { + if (configChanges == 0 && okToDisplay()) { if (DEBUG_ORIENTATION) Slog.v(TAG, "Skipping set freeze of " + token); return; } @@ -5476,7 +5469,7 @@ public class WindowManagerService extends IWindowManager.Stub } } - rebuildBlackFrame(inTransaction); + rebuildBlackFrame(); for (int i=mWindows.size()-1; i>=0; i--) { WindowState w = mWindows.get(i); @@ -7151,45 +7144,32 @@ public class WindowManagerService extends IWindowManager.Stub } } - private void rebuildBlackFrame(boolean inTransaction) { - if (!inTransaction) { - if (SHOW_LIGHT_TRANSACTIONS) Slog.i(TAG, - ">>> OPEN TRANSACTION rebuildBlackFrame"); - Surface.openTransaction(); + private void rebuildBlackFrame() { + if (mBlackFrame != null) { + mBlackFrame.kill(); + mBlackFrame = null; } - try { - if (mBlackFrame != null) { - mBlackFrame.kill(); - mBlackFrame = null; - } - if (mBaseDisplayWidth < mInitialDisplayWidth - || mBaseDisplayHeight < mInitialDisplayHeight) { - int initW, initH, baseW, baseH; - final boolean rotated = (mRotation == Surface.ROTATION_90 - || mRotation == Surface.ROTATION_270); - if (rotated) { - initW = mInitialDisplayHeight; - initH = mInitialDisplayWidth; - baseW = mBaseDisplayHeight; - baseH = mBaseDisplayWidth; - } else { - initW = mInitialDisplayWidth; - initH = mInitialDisplayHeight; - baseW = mBaseDisplayWidth; - baseH = mBaseDisplayHeight; - } - Rect outer = new Rect(0, 0, initW, initH); - Rect inner = new Rect(0, 0, baseW, baseH); - try { - mBlackFrame = new BlackFrame(mFxSession, outer, inner, MASK_LAYER); - } catch (Surface.OutOfResourcesException e) { - } + if (mBaseDisplayWidth < mInitialDisplayWidth + || mBaseDisplayHeight < mInitialDisplayHeight) { + int initW, initH, baseW, baseH; + final boolean rotated = (mRotation == Surface.ROTATION_90 + || mRotation == Surface.ROTATION_270); + if (rotated) { + initW = mInitialDisplayHeight; + initH = mInitialDisplayWidth; + baseW = mBaseDisplayHeight; + baseH = mBaseDisplayWidth; + } else { + initW = mInitialDisplayWidth; + initH = mInitialDisplayHeight; + baseW = mBaseDisplayWidth; + baseH = mBaseDisplayHeight; } - } finally { - if (!inTransaction) { - Surface.closeTransaction(); - if (SHOW_LIGHT_TRANSACTIONS) Slog.i(TAG, - "<<< CLOSE TRANSACTION rebuildBlackFrame"); + Rect outer = new Rect(0, 0, initW, initH); + Rect inner = new Rect(0, 0, baseW, baseH); + try { + mBlackFrame = new BlackFrame(mFxSession, outer, inner, MASK_LAYER); + } catch (Surface.OutOfResourcesException e) { } } } @@ -7240,7 +7220,7 @@ public class WindowManagerService extends IWindowManager.Stub mH.sendEmptyMessage(H.SEND_NEW_CONFIGURATION); } - rebuildBlackFrame(false); + rebuildBlackFrame(); performLayoutAndPlaceSurfacesLocked(); } @@ -7625,7 +7605,7 @@ public class WindowManagerService extends IWindowManager.Stub // If the screen is currently frozen or off, then keep // it frozen/off until this window draws at its new // orientation. - if (mDisplayFrozen || !mPolicy.isScreenOnFully()) { + if (!okToDisplay()) { if (DEBUG_ORIENTATION) Slog.v(TAG, "Changing surface while display frozen: " + w); w.mOrientationChanging = true; @@ -7707,18 +7687,7 @@ public class WindowManagerService extends IWindowManager.Stub if (mDimAnimator != null && mDimAnimator.mDimShown) { mInnerFields.mAnimating |= mDimAnimator.updateSurface(mInnerFields.mDimming, currentTime, - mDisplayFrozen || !mDisplayEnabled || !mPolicy.isScreenOnFully()); - } - - if (!mInnerFields.mBlurring && mBlurShown) { - if (SHOW_TRANSACTIONS) Slog.i(TAG, " BLUR " + mBlurSurface - + ": HIDE"); - try { - mBlurSurface.hide(); - } catch (IllegalArgumentException e) { - Slog.w(TAG, "Illegal argument exception hiding blur surface"); - } - mBlurShown = false; + !okToDisplay()); } if (mBlackFrame != null) { @@ -7747,6 +7716,8 @@ public class WindowManagerService extends IWindowManager.Stub */ private int updateWindowsAndWallpaperLocked(final long currentTime, final int dw, final int dh, final int innerDw, final int innerDh) { + ++mTransactionSequence; + int changes = 0; for (int i = mWindows.size() - 1; i >= 0; i--) { WindowState w = mWindows.get(i); @@ -7976,7 +7947,7 @@ public class WindowManagerService extends IWindowManager.Stub // We can now show all of the drawn windows! if (!mOpeningApps.contains(wtoken)) { - wtoken.showAllWindowsLocked(); + mInnerFields.mAnimating |= wtoken.showAllWindowsLocked(); } } } @@ -8160,7 +8131,7 @@ public class WindowManagerService extends IWindowManager.Stub transit, false); wtoken.updateReportedVisibilityLocked(); wtoken.waitingToShow = false; - wtoken.showAllWindowsLocked(); + mInnerFields.mAnimating |= wtoken.showAllWindowsLocked(); } NN = mClosingApps.size(); for (i=0; i<NN; i++) { @@ -8301,9 +8272,9 @@ public class WindowManagerService extends IWindowManager.Stub // target, then the black goes *below* the wallpaper so we // don't cause the wallpaper to suddenly disappear. WindowState target = mInnerFields.mWindowAnimationBackground; - if (mWallpaperTarget == mInnerFields.mWindowAnimationBackground - || mLowerWallpaperTarget == mInnerFields.mWindowAnimationBackground - || mUpperWallpaperTarget == mInnerFields.mWindowAnimationBackground) { + if (mWallpaperTarget == target + || mLowerWallpaperTarget == target + || mUpperWallpaperTarget == target) { for (int i=0; i<mWindows.size(); i++) { WindowState w = mWindows.get(i); if (w.mIsWallpaper) { @@ -8656,76 +8627,30 @@ public class WindowManagerService extends IWindowManager.Stub boolean opaqueDrawn = canBeSeen && w.isOpaqueDrawn(); if (opaqueDrawn && w.isFullscreen(innerDw, innerDh)) { // This window completely covers everything behind it, - // so we want to leave all of them as unblurred (for + // so we want to leave all of them as undimmed (for // performance reasons). mInnerFields.mObscured = true; - } else if (canBeSeen && (attrFlags & (FLAG_BLUR_BEHIND | FLAG_DIM_BEHIND)) != 0) { - if (localLOGV) Slog.v(TAG, "Win " + w - + ": blurring=" + mInnerFields.mBlurring - + " obscured=" + mInnerFields.mObscured); - if ((attrFlags&FLAG_DIM_BEHIND) != 0) { - if (!mInnerFields.mDimming) { - //Slog.i(TAG, "DIM BEHIND: " + w); - mInnerFields.mDimming = true; - if (mDimAnimator == null) { - mDimAnimator = new DimAnimator(mFxSession); - } - if (attrs.type == WindowManager.LayoutParams.TYPE_BOOT_PROGRESS) { - mDimAnimator.show(mCurDisplayWidth, mCurDisplayHeight); - } else { - mDimAnimator.show(innerDw, innerDh); - } + } else if (canBeSeen && (attrFlags & FLAG_DIM_BEHIND) != 0) { + if (localLOGV) Slog.v(TAG, "Win " + w + " obscured=" + mInnerFields.mObscured); + if (!mInnerFields.mDimming) { + //Slog.i(TAG, "DIM BEHIND: " + w); + mInnerFields.mDimming = true; + if (mDimAnimator == null) { + mDimAnimator = new DimAnimator(mFxSession); + } + if (attrs.type == WindowManager.LayoutParams.TYPE_BOOT_PROGRESS) { + mDimAnimator.show(mCurDisplayWidth, mCurDisplayHeight); + } else { mDimAnimator.show(innerDw, innerDh); - mDimAnimator.updateParameters(mContext.getResources(), - w, currentTime); - } - } - if ((attrFlags & FLAG_BLUR_BEHIND) != 0) { - if (!mInnerFields.mBlurring) { - //Slog.i(TAG, "BLUR BEHIND: " + w); - mInnerFields.mBlurring = true; - if (mBlurSurface == null) { - try { - mBlurSurface = new Surface(mFxSession, 0, - "BlurSurface", - -1, 16, 16, - PixelFormat.OPAQUE, - Surface.FX_SURFACE_BLUR); - } catch (Exception e) { - Slog.e(TAG, "Exception creating Blur surface", e); - } - if (SHOW_TRANSACTIONS) Slog.i(TAG, " BLUR " - + mBlurSurface + ": CREATE"); - } - final int dw = mCurDisplayWidth; - final int dh = mCurDisplayHeight; - if (mBlurSurface != null) { - if (SHOW_TRANSACTIONS) Slog.i(TAG, " BLUR " - + mBlurSurface + ": pos=(0,0) (" + - dw + "x" + dh + "), layer=" + (w.mAnimLayer-1)); - mBlurSurface.setPosition(0, 0); - mBlurSurface.setSize(dw, dh); - mBlurSurface.setLayer(w.mAnimLayer-LAYER_OFFSET_BLUR); - if (!mBlurShown) { - try { - if (SHOW_TRANSACTIONS) Slog.i(TAG, " BLUR " - + mBlurSurface + ": SHOW"); - mBlurSurface.show(); - } catch (RuntimeException e) { - Slog.w(TAG, "Failure showing blur surface", e); - } - mBlurShown = true; - } - } } + mDimAnimator.updateParameters(mContext.getResources(), + w, currentTime); } } } private final int performAnimationsLocked(long currentTime, int dw, int dh, int innerDw, int innerDh) { - ++mTransactionSequence; - if (DEBUG_APP_TRANSITIONS) Slog.v(TAG, "*** ANIM STEP: seq=" + mTransactionSequence + " mAnimating=" + mInnerFields.mAnimating); @@ -8896,7 +8821,6 @@ public class WindowManagerService extends IWindowManager.Stub final boolean someoneLosingFocus = !mLosingFocus.isEmpty(); mInnerFields.mObscured = false; - mInnerFields.mBlurring = false; mInnerFields.mDimming = false; mInnerFields.mSyswin = false; @@ -9987,8 +9911,7 @@ public class WindowManagerService extends IWindowManager.Stub } pw.print(" mSystemBooted="); pw.print(mSystemBooted); pw.print(" mDisplayEnabled="); pw.println(mDisplayEnabled); - pw.print(" mLayoutNeeded="); pw.print(mLayoutNeeded); - pw.print(" mBlurShown="); pw.println(mBlurShown); + pw.print(" mLayoutNeeded="); pw.println(mLayoutNeeded); if (mDimAnimator != null) { pw.println(" mDimAnimator:"); mDimAnimator.printTo(" ", pw); diff --git a/services/java/com/android/server/wm/WindowState.java b/services/java/com/android/server/wm/WindowState.java index 57d0374..d1a14df 100644 --- a/services/java/com/android/server/wm/WindowState.java +++ b/services/java/com/android/server/wm/WindowState.java @@ -640,6 +640,10 @@ final class WindowState implements WindowManagerPolicy.WindowState { mAnimation = anim; mAnimation.restrictDuration(WindowManagerService.MAX_ANIMATION_DURATION); mAnimation.scaleCurrentDuration(mService.mWindowAnimationScale); + // Start out animation gone if window is gone, or visible if window is visible. + mTransformation.clear(); + mTransformation.setAlpha(mLastHidden ? 0 : 1); + mHasLocalTransformation = true; } public void clearAnimation() { @@ -933,13 +937,15 @@ final class WindowState implements WindowManagerPolicy.WindowState { if (!mService.showSurfaceRobustlyLocked(this)) { return false; } + + mService.enableScreenIfNeededLocked(); + + mService.applyEnterAnimationLocked(this); + mLastAlpha = -1; mHasDrawn = true; mLastHidden = false; mReadyToShow = false; - mService.enableScreenIfNeededLocked(); - - mService.applyEnterAnimationLocked(this); int i = mChildWindows.size(); while (i > 0) { @@ -1005,7 +1011,7 @@ final class WindowState implements WindowManagerPolicy.WindowState { // Save the animation state as it was before this step so WindowManagerService can tell if // we just started or just stopped animating by comparing mWasAnimating with isAnimating(). mWasAnimating = mAnimating; - if (!mService.mDisplayFrozen && mService.mPolicy.isScreenOnFully()) { + if (mService.okToDisplay()) { // We will run animations as long as the display isn't frozen. if (isDrawnLw() && mAnimation != null) { @@ -1509,11 +1515,10 @@ final class WindowState implements WindowManagerPolicy.WindowState { * sense to call from performLayoutAndPlaceSurfacesLockedInner().) */ boolean shouldAnimateMove() { - return mContentChanged && !mExiting && !mLastHidden && !mService.mDisplayFrozen + return mContentChanged && !mExiting && !mLastHidden && mService.okToDisplay() && (mFrame.top != mLastFrame.top || mFrame.left != mLastFrame.left) - && (mAttachedWindow == null || !mAttachedWindow.shouldAnimateMove()) - && mService.mPolicy.isScreenOnFully(); + && (mAttachedWindow == null || !mAttachedWindow.shouldAnimateMove()); } boolean isFullscreen(int screenWidth, int screenHeight) { @@ -1600,7 +1605,7 @@ final class WindowState implements WindowManagerPolicy.WindowState { if (doAnimation) { if (DEBUG_VISIBILITY) Slog.v(WindowManagerService.TAG, "doAnimation: mPolicyVisibility=" + mPolicyVisibility + " mAnimation=" + mAnimation); - if (mService.mDisplayFrozen || !mService.mPolicy.isScreenOnFully()) { + if (!mService.okToDisplay()) { doAnimation = false; } else if (mPolicyVisibility && mAnimation == null) { // Check for the case where we are currently visible and @@ -1626,7 +1631,7 @@ final class WindowState implements WindowManagerPolicy.WindowState { boolean hideLw(boolean doAnimation, boolean requestAnim) { if (doAnimation) { - if (mService.mDisplayFrozen || !mService.mPolicy.isScreenOnFully()) { + if (!mService.okToDisplay()) { doAnimation = false; } } diff --git a/telephony/java/com/android/internal/telephony/AdnRecordCache.java b/telephony/java/com/android/internal/telephony/AdnRecordCache.java index a175d49..db5f4da 100644 --- a/telephony/java/com/android/internal/telephony/AdnRecordCache.java +++ b/telephony/java/com/android/internal/telephony/AdnRecordCache.java @@ -33,7 +33,7 @@ import java.util.Iterator; public final class AdnRecordCache extends Handler implements IccConstants { //***** Instance Variables - PhoneBase phone; + private IccFileHandler mFh; private UsimPhoneBookManager mUsimPhoneBookManager; // Indexed by EF ID @@ -56,9 +56,9 @@ public final class AdnRecordCache extends Handler implements IccConstants { - public AdnRecordCache(PhoneBase phone) { - this.phone = phone; - mUsimPhoneBookManager = new UsimPhoneBookManager(phone, this); + public AdnRecordCache(IccFileHandler fh) { + mFh = fh; + mUsimPhoneBookManager = new UsimPhoneBookManager(mFh, this); } //***** Called from SIMRecords @@ -155,7 +155,7 @@ public final class AdnRecordCache extends Handler implements IccConstants { userWriteResponse.put(efid, response); - new AdnRecordLoader(phone).updateEF(adn, efid, extensionEF, + new AdnRecordLoader(mFh).updateEF(adn, efid, extensionEF, recordIndex, pin2, obtainMessage(EVENT_UPDATE_ADN_DONE, efid, recordIndex, adn)); } @@ -233,7 +233,7 @@ public final class AdnRecordCache extends Handler implements IccConstants { userWriteResponse.put(efid, response); - new AdnRecordLoader(phone).updateEF(newAdn, efid, extensionEF, + new AdnRecordLoader(mFh).updateEF(newAdn, efid, extensionEF, index, pin2, obtainMessage(EVENT_UPDATE_ADN_DONE, efid, index, newAdn)); } @@ -296,7 +296,7 @@ public final class AdnRecordCache extends Handler implements IccConstants { return; } - new AdnRecordLoader(phone).loadAllFromEF(efid, extensionEf, + new AdnRecordLoader(mFh).loadAllFromEF(efid, extensionEf, obtainMessage(EVENT_LOAD_ALL_ADN_LIKE_DONE, efid, 0)); } diff --git a/telephony/java/com/android/internal/telephony/AdnRecordLoader.java b/telephony/java/com/android/internal/telephony/AdnRecordLoader.java index 55bdc06..084fae6 100644 --- a/telephony/java/com/android/internal/telephony/AdnRecordLoader.java +++ b/telephony/java/com/android/internal/telephony/AdnRecordLoader.java @@ -20,16 +20,17 @@ import java.util.ArrayList; import android.os.AsyncResult; import android.os.Handler; +import android.os.Looper; import android.os.Message; import android.util.Log; public class AdnRecordLoader extends Handler { - static String LOG_TAG; + final static String LOG_TAG = "RIL_AdnRecordLoader"; //***** Instance Variables - PhoneBase phone; + private IccFileHandler mFh; int ef; int extensionEF; int pendingExtLoads; @@ -56,13 +57,11 @@ public class AdnRecordLoader extends Handler { //***** Constructor - public AdnRecordLoader(PhoneBase phone) { + public AdnRecordLoader(IccFileHandler fh) { // The telephony unit-test cases may create AdnRecords // in secondary threads - super(phone.getHandler().getLooper()); - - this.phone = phone; - LOG_TAG = phone.getPhoneName(); + super(Looper.getMainLooper()); + mFh = fh; } /** @@ -77,7 +76,7 @@ public class AdnRecordLoader extends Handler { this.recordNumber = recordNumber; this.userResponse = response; - phone.mIccFileHandler.loadEFLinearFixed( + mFh.loadEFLinearFixed( ef, recordNumber, obtainMessage(EVENT_ADN_LOAD_DONE)); @@ -95,7 +94,7 @@ public class AdnRecordLoader extends Handler { this.extensionEF = extensionEF; this.userResponse = response; - phone.mIccFileHandler.loadEFLinearFixedAll( + mFh.loadEFLinearFixedAll( ef, obtainMessage(EVENT_ADN_LOAD_ALL_DONE)); @@ -122,7 +121,7 @@ public class AdnRecordLoader extends Handler { this.userResponse = response; this.pin2 = pin2; - phone.mIccFileHandler.getEFLinearRecordSize( ef, + mFh.getEFLinearRecordSize( ef, obtainMessage(EVENT_EF_LINEAR_RECORD_SIZE_DONE, adn)); } @@ -163,7 +162,7 @@ public class AdnRecordLoader extends Handler { ar.exception); } - phone.mIccFileHandler.updateEFLinearFixed(ef, recordNumber, + mFh.updateEFLinearFixed(ef, recordNumber, data, pin2, obtainMessage(EVENT_UPDATE_RECORD_DONE)); pendingExtLoads = 1; @@ -203,7 +202,7 @@ public class AdnRecordLoader extends Handler { pendingExtLoads = 1; - phone.mIccFileHandler.loadEFLinearFixed( + mFh.loadEFLinearFixed( extensionEF, adn.extRecord, obtainMessage(EVENT_EXT_RECORD_LOAD_DONE, adn)); } @@ -253,7 +252,7 @@ public class AdnRecordLoader extends Handler { pendingExtLoads++; - phone.mIccFileHandler.loadEFLinearFixed( + mFh.loadEFLinearFixed( extensionEF, adn.extRecord, obtainMessage(EVENT_EXT_RECORD_LOAD_DONE, adn)); } diff --git a/telephony/java/com/android/internal/telephony/IccCard.java b/telephony/java/com/android/internal/telephony/IccCard.java index 965bafa..7ae6692 100644 --- a/telephony/java/com/android/internal/telephony/IccCard.java +++ b/telephony/java/com/android/internal/telephony/IccCard.java @@ -185,13 +185,14 @@ public class IccCard { mPhone.mCM, mHandler, EVENT_CDMA_SUBSCRIPTION_SOURCE_CHANGED, null); if (phone.mCM.getLteOnCdmaMode() == Phone.LTE_ON_CDMA_TRUE && phone instanceof CDMALTEPhone) { - mIccRecords = new CdmaLteUiccRecords(phone); mIccFileHandler = new CdmaLteUiccFileHandler(this, "", mPhone.mCM); + mIccRecords = new CdmaLteUiccRecords(this, mPhone.mContext, mPhone.mCM); } else { - mIccRecords = is3gpp ? new SIMRecords(phone) : new RuimRecords(phone); // Correct aid will be set later (when GET_SIM_STATUS returns) mIccFileHandler = is3gpp ? new SIMFileHandler(this, "", mPhone.mCM) : new RuimFileHandler(this, "", mPhone.mCM); + mIccRecords = is3gpp ? new SIMRecords(this, mPhone.mContext, mPhone.mCM) : + new RuimRecords(this, mPhone.mContext, mPhone.mCM); } mPhone.mCM.registerForOffOrNotAvailable(mHandler, EVENT_RADIO_OFF_OR_NOT_AVAILABLE, null); mPhone.mCM.registerForOn(mHandler, EVENT_RADIO_ON, null); diff --git a/telephony/java/com/android/internal/telephony/IccRecords.java b/telephony/java/com/android/internal/telephony/IccRecords.java index 6e82903..41c9d5a 100644 --- a/telephony/java/com/android/internal/telephony/IccRecords.java +++ b/telephony/java/com/android/internal/telephony/IccRecords.java @@ -16,6 +16,7 @@ package com.android.internal.telephony; +import android.content.Context; import android.os.AsyncResult; import android.os.Handler; import android.os.Message; @@ -32,9 +33,16 @@ public abstract class IccRecords extends Handler implements IccConstants { protected static final boolean DBG = true; // ***** Instance Variables + protected boolean mDestroyed = false; // set to true once this object needs to be disposed of + protected Context mContext; + protected CommandsInterface mCi; + protected IccFileHandler mFh; + protected IccCard mParentCard; - protected PhoneBase phone; protected RegistrantList recordsLoadedRegistrants = new RegistrantList(); + protected RegistrantList mRecordsEventsRegistrants = new RegistrantList(); + protected RegistrantList mNewSmsRegistrants = new RegistrantList(); + protected RegistrantList mNetworkSelectionModeAutomaticRegistrants = new RegistrantList(); protected int recordsToLoad; // number of pending load requests @@ -71,6 +79,9 @@ public abstract class IccRecords extends Handler implements IccConstants { // ***** Event Constants protected static final int EVENT_SET_MSISDN_DONE = 30; + public static final int EVENT_MWI = 0; + public static final int EVENT_CFI = 1; + public static final int EVENT_SPN = 2; public static final int EVENT_GET_ICC_RECORD_DONE = 100; @@ -91,15 +102,23 @@ public abstract class IccRecords extends Handler implements IccConstants { } // ***** Constructor - - public IccRecords(PhoneBase p) { - this.phone = p; + public IccRecords(IccCard card, Context c, CommandsInterface ci) { + mContext = c; + mCi = ci; + mFh = card.getIccFileHandler(); + mParentCard = card; } /** * Call when the IccRecords object is no longer going to be used. */ - public abstract void dispose(); + public void dispose() { + mDestroyed = true; + mParentCard = null; + mFh = null; + mCi = null; + mContext = null; + } protected abstract void onRadioOffOrNotAvailable(); public abstract void onReady(); @@ -109,7 +128,15 @@ public abstract class IccRecords extends Handler implements IccConstants { return adnCache; } + public IccCard getIccCard() { + return mParentCard; + } + public void registerForRecordsLoaded(Handler h, int what, Object obj) { + if (mDestroyed) { + return; + } + Registrant r = new Registrant(h, what, obj); recordsLoadedRegistrants.add(r); @@ -117,11 +144,35 @@ public abstract class IccRecords extends Handler implements IccConstants { r.notifyRegistrant(new AsyncResult(null, null, null)); } } - public void unregisterForRecordsLoaded(Handler h) { recordsLoadedRegistrants.remove(h); } + public void registerForRecordsEvents(Handler h, int what, Object obj) { + Registrant r = new Registrant (h, what, obj); + mRecordsEventsRegistrants.add(r); + } + public void unregisterForRecordsEvents(Handler h) { + mRecordsEventsRegistrants.remove(h); + } + + public void registerForNewSms(Handler h, int what, Object obj) { + Registrant r = new Registrant (h, what, obj); + mNewSmsRegistrants.add(r); + } + public void unregisterForNewSms(Handler h) { + mNewSmsRegistrants.remove(h); + } + + public void registerForNetworkSelectionModeAutomatic( + Handler h, int what, Object obj) { + Registrant r = new Registrant (h, what, obj); + mNetworkSelectionModeAutomaticRegistrants.add(r); + } + public void unregisterForNetworkSelectionModeAutomatic(Handler h) { + mNetworkSelectionModeAutomaticRegistrants.remove(h); + } + /** * Get the International Mobile Subscriber ID (IMSI) on a SIM * for GSM, UMTS and like networks. Default is null if IMSI is @@ -163,7 +214,7 @@ public abstract class IccRecords extends Handler implements IccConstants { AdnRecord adn = new AdnRecord(msisdnTag, msisdn); - new AdnRecordLoader(phone).updateEF(adn, EF_MSISDN, EF_EXT1, 1, null, + new AdnRecordLoader(mFh).updateEF(adn, EF_MSISDN, EF_EXT1, 1, null, obtainMessage(EVENT_SET_MSISDN_DONE, onComplete)); } diff --git a/telephony/java/com/android/internal/telephony/MccTable.java b/telephony/java/com/android/internal/telephony/MccTable.java index cdce841..e206783 100644 --- a/telephony/java/com/android/internal/telephony/MccTable.java +++ b/telephony/java/com/android/internal/telephony/MccTable.java @@ -18,6 +18,7 @@ package com.android.internal.telephony; import android.app.ActivityManagerNative; import android.app.AlarmManager; +import android.app.IActivityManager; import android.content.Context; import android.content.res.Configuration; import android.net.wifi.WifiManager; @@ -167,10 +168,10 @@ public final class MccTable /** * Updates MCC and MNC device configuration information for application retrieving * correct version of resources. If either MCC or MNC is 0, they will be ignored (not set). - * @param phone PhoneBae to act on. + * @param context Context to act on. * @param mccmnc truncated imsi with just the MCC and MNC - MNC assumed to be from 4th to end */ - public static void updateMccMncConfiguration(PhoneBase phone, String mccmnc) { + public static void updateMccMncConfiguration(Context context, String mccmnc) { if (!TextUtils.isEmpty(mccmnc)) { int mcc, mnc; @@ -185,9 +186,9 @@ public final class MccTable Log.d(LOG_TAG, "updateMccMncConfiguration: mcc=" + mcc + ", mnc=" + mnc); if (mcc != 0) { - setTimezoneFromMccIfNeeded(phone, mcc); - setLocaleFromMccIfNeeded(phone, mcc); - setWifiCountryCodeFromMcc(phone, mcc); + setTimezoneFromMccIfNeeded(context, mcc); + setLocaleFromMccIfNeeded(context, mcc); + setWifiCountryCodeFromMcc(context, mcc); } try { Configuration config = ActivityManagerNative.getDefault().getConfiguration(); @@ -205,16 +206,68 @@ public final class MccTable } /** + * Utility code to set the system locale if it's not set already + * @param context Context to act on. + * @param language Two character language code desired + * @param country Two character country code desired + * + * {@hide} + */ + public static void setSystemLocale(Context context, String language, String country) { + String l = SystemProperties.get("persist.sys.language"); + String c = SystemProperties.get("persist.sys.country"); + + if (null == language) { + return; // no match possible + } + language = language.toLowerCase(); + if (null == country) { + country = ""; + } + country = country.toUpperCase(); + + if((null == l || 0 == l.length()) && (null == c || 0 == c.length())) { + try { + // try to find a good match + String[] locales = context.getAssets().getLocales(); + final int N = locales.length; + String bestMatch = null; + for(int i = 0; i < N; i++) { + // only match full (lang + country) locales + if (locales[i]!=null && locales[i].length() >= 5 && + locales[i].substring(0,2).equals(language)) { + if (locales[i].substring(3,5).equals(country)) { + bestMatch = locales[i]; + break; + } else if (null == bestMatch) { + bestMatch = locales[i]; + } + } + } + if (null != bestMatch) { + IActivityManager am = ActivityManagerNative.getDefault(); + Configuration config = am.getConfiguration(); + config.locale = new Locale(bestMatch.substring(0,2), + bestMatch.substring(3,5)); + config.userSetLocale = true; + am.updateConfiguration(config); + } + } catch (Exception e) { + // Intentionally left blank + } + } + } + + /** * If the timezone is not already set, set it based on the MCC of the SIM. - * @param phone PhoneBase to act on (get context from). + * @param context Context to act on. * @param mcc Mobile Country Code of the SIM or SIM-like entity (build prop on CDMA) */ - private static void setTimezoneFromMccIfNeeded(PhoneBase phone, int mcc) { + private static void setTimezoneFromMccIfNeeded(Context context, int mcc) { String timezone = SystemProperties.get(ServiceStateTracker.TIMEZONE_PROPERTY); if (timezone == null || timezone.length() == 0) { String zoneId = defaultTimeZoneForMcc(mcc); if (zoneId != null && zoneId.length() > 0) { - Context context = phone.getContext(); // Set time zone based on MCC AlarmManager alarm = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE); @@ -226,27 +279,31 @@ public final class MccTable /** * If the locale is not already set, set it based on the MCC of the SIM. - * @param phone PhoneBase to act on. + * @param context Context to act on. * @param mcc Mobile Country Code of the SIM or SIM-like entity (build prop on CDMA) */ - private static void setLocaleFromMccIfNeeded(PhoneBase phone, int mcc) { + private static void setLocaleFromMccIfNeeded(Context context, int mcc) { + if (BaseCommands.getLteOnCdmaModeStatic() == Phone.LTE_ON_CDMA_TRUE) { + // Avoid system locale is set from MCC table if CDMALTEPhone is used. + // The locale will be picked up based on EFpl/EFli once CSIM records are loaded. + return; + } String language = MccTable.defaultLanguageForMcc(mcc); String country = MccTable.countryCodeForMcc(mcc); Log.d(LOG_TAG, "locale set to "+language+"_"+country); - phone.setSystemLocale(language, country, true); + setSystemLocale(context, language, country); } /** * If the number of allowed wifi channels has not been set, set it based on * the MCC of the SIM. - * @param phone PhoneBase to act on (get context from). + * @param context Context to act on. * @param mcc Mobile Country Code of the SIM or SIM-like entity (build prop on CDMA) */ - private static void setWifiCountryCodeFromMcc(PhoneBase phone, int mcc) { + private static void setWifiCountryCodeFromMcc(Context context, int mcc) { String country = MccTable.countryCodeForMcc(mcc); if (!country.isEmpty()) { - Context context = phone.getContext(); Log.d(LOG_TAG, "WIFI_COUNTRY_CODE set to " + country); WifiManager wM = (WifiManager) context.getSystemService(Context.WIFI_SERVICE); //persist diff --git a/telephony/java/com/android/internal/telephony/PhoneBase.java b/telephony/java/com/android/internal/telephony/PhoneBase.java index 0b5a82c..6fc0134 100644 --- a/telephony/java/com/android/internal/telephony/PhoneBase.java +++ b/telephony/java/com/android/internal/telephony/PhoneBase.java @@ -103,6 +103,10 @@ public abstract class PhoneBase extends Handler implements Phone { protected static final int EVENT_EMERGENCY_CALLBACK_MODE_ENTER = 25; protected static final int EVENT_EXIT_EMERGENCY_CALLBACK_RESPONSE = 26; protected static final int EVENT_CDMA_SUBSCRIPTION_SOURCE_CHANGED = 27; + // other + protected static final int EVENT_SET_NETWORK_AUTOMATIC = 28; + protected static final int EVENT_NEW_ICC_SMS = 29; + protected static final int EVENT_ICC_RECORD_EVENTS = 30; // Key used to read/write current CLIR setting public static final String CLIR_KEY = "clir_key"; @@ -600,7 +604,7 @@ public abstract class PhoneBase extends Handler implements Phone { if (l.length() >=5) { country = l.substring(3, 5); } - setSystemLocale(language, country, false); + MccTable.setSystemLocale(mContext, language, country); if (!country.isEmpty()) { try { @@ -619,62 +623,6 @@ public abstract class PhoneBase extends Handler implements Phone { } /** - * Utility code to set the system locale if it's not set already - * @param language Two character language code desired - * @param country Two character country code desired - * @param fromMcc Indicating whether the locale is set according to MCC table. - * This flag wil be ignored by default implementation. - * TODO: Use a source enumeration so that source of the locale - * can be prioritized. - * - * {@hide} - */ - public void setSystemLocale(String language, String country, boolean fromMcc) { - String l = SystemProperties.get("persist.sys.language"); - String c = SystemProperties.get("persist.sys.country"); - - if (null == language) { - return; // no match possible - } - language = language.toLowerCase(); - if (null == country) { - country = ""; - } - country = country.toUpperCase(); - - if((null == l || 0 == l.length()) && (null == c || 0 == c.length())) { - try { - // try to find a good match - String[] locales = mContext.getAssets().getLocales(); - final int N = locales.length; - String bestMatch = null; - for(int i = 0; i < N; i++) { - // only match full (lang + country) locales - if (locales[i]!=null && locales[i].length() >= 5 && - locales[i].substring(0,2).equals(language)) { - if (locales[i].substring(3,5).equals(country)) { - bestMatch = locales[i]; - break; - } else if (null == bestMatch) { - bestMatch = locales[i]; - } - } - } - if (null != bestMatch) { - IActivityManager am = ActivityManagerNative.getDefault(); - Configuration config = am.getConfiguration(); - config.locale = new Locale(bestMatch.substring(0,2), - bestMatch.substring(3,5)); - config.userSetLocale = true; - am.updateConfiguration(config); - } - } catch (Exception e) { - // Intentionally left blank - } - } - } - - /** * Get state */ public abstract Phone.State getState(); diff --git a/telephony/java/com/android/internal/telephony/cdma/CDMALTEPhone.java b/telephony/java/com/android/internal/telephony/cdma/CDMALTEPhone.java index 14a4b46..f914030 100644 --- a/telephony/java/com/android/internal/telephony/cdma/CDMALTEPhone.java +++ b/telephony/java/com/android/internal/telephony/cdma/CDMALTEPhone.java @@ -35,6 +35,7 @@ import com.android.internal.telephony.PhoneNotifier; import com.android.internal.telephony.PhoneProxy; import com.android.internal.telephony.SMSDispatcher; import com.android.internal.telephony.gsm.GsmSMSDispatcher; +import com.android.internal.telephony.gsm.SmsMessage; import com.android.internal.telephony.ims.IsimRecords; import com.android.internal.telephony.uicc.UiccController; @@ -62,17 +63,21 @@ public class CDMALTEPhone extends CDMAPhone { public CDMALTEPhone(Context context, CommandsInterface ci, PhoneNotifier notifier) { super(context, ci, notifier, false); m3gppSMS = new GsmSMSDispatcher(this, mSmsStorageMonitor, mSmsUsageMonitor); + mIccRecords.registerForNewSms(this, EVENT_NEW_ICC_SMS, null); } @Override public void handleMessage (Message msg) { AsyncResult ar; - Message onComplete; switch (msg.what) { // handle the select network completion callbacks. case EVENT_SET_NETWORK_MANUAL_COMPLETE: handleSetSelectNetwork((AsyncResult) msg.obj); break; + case EVENT_NEW_ICC_SMS: + ar = (AsyncResult)msg.obj; + m3gppSMS.dispatchMessage((SmsMessage)ar.result); + break; default: super.handleMessage(msg); } @@ -93,6 +98,7 @@ public class CDMALTEPhone extends CDMAPhone { synchronized(PhoneProxy.lockForRadioTechnologyChange) { super.dispose(); m3gppSMS.dispose(); + mIccRecords.unregisterForNewSms(this); } } @@ -214,15 +220,6 @@ public class CDMALTEPhone extends CDMAPhone { return false; } - @Override - public void setSystemLocale(String language, String country, boolean fromMcc) { - // Avoid system locale is set from MCC table if CDMALTEPhone is used. - // The locale will be picked up based on EFpl/EFli once CSIM records are loaded. - if (fromMcc) return; - - super.setSystemLocale(language, country, false); - } - // return IMSI from USIM as subscriber ID. @Override public String getSubscriberId() { diff --git a/telephony/java/com/android/internal/telephony/cdma/CDMAPhone.java b/telephony/java/com/android/internal/telephony/cdma/CDMAPhone.java index e86e441..9e4a735 100755 --- a/telephony/java/com/android/internal/telephony/cdma/CDMAPhone.java +++ b/telephony/java/com/android/internal/telephony/cdma/CDMAPhone.java @@ -173,7 +173,7 @@ public class CDMAPhone extends PhoneBase { mIccFileHandler, mIccCard); mCM.registerForAvailable(this, EVENT_RADIO_AVAILABLE, null); - mIccRecords.registerForRecordsLoaded(this, EVENT_RUIM_RECORDS_LOADED, null); + registerForRuimRecordEvents(); mCM.registerForOffOrNotAvailable(this, EVENT_RADIO_OFF_OR_NOT_AVAILABLE, null); mCM.registerForOn(this, EVENT_RADIO_ON, null); mCM.setOnSuppServiceNotification(this, EVENT_SSN, null); @@ -225,7 +225,7 @@ public class CDMAPhone extends PhoneBase { log("dispose"); //Unregister from all former registered events - mIccRecords.unregisterForRecordsLoaded(this); //EVENT_RUIM_RECORDS_LOADED + unregisterForRuimRecordEvents(); mCM.unregisterForAvailable(this); //EVENT_RADIO_AVAILABLE mCM.unregisterForOffOrNotAvailable(this); //EVENT_RADIO_OFF_OR_NOT_AVAILABLE mCM.unregisterForOn(this); //EVENT_RADIO_ON @@ -241,8 +241,6 @@ public class CDMAPhone extends PhoneBase { mSST.dispose(); mCdmaSSM.dispose(this); mSMS.dispose(); - mIccFileHandler.dispose(); // instance of RuimFileHandler - mIccRecords.dispose(); mRuimPhoneBookInterfaceManager.dispose(); mRuimSmsInterfaceManager.dispose(); mSubInfo.dispose(); @@ -999,6 +997,11 @@ public class CDMAPhone extends PhoneBase { } break; + case EVENT_ICC_RECORD_EVENTS: + ar = (AsyncResult)msg.obj; + processIccRecordEvents((Integer)ar.result); + break; + case EVENT_EXIT_EMERGENCY_CALLBACK_RESPONSE:{ handleExitEmergencyCallbackMode(msg); } @@ -1063,10 +1066,22 @@ public class CDMAPhone extends PhoneBase { } } + private void processIccRecordEvents(int eventCode) { + switch (eventCode) { + case RuimRecords.EVENT_MWI: + notifyMessageWaitingIndicator(); + break; + + default: + Log.e(LOG_TAG,"Unknown icc records event code " + eventCode); + break; + } + } + /** * Handles the call to get the subscription source * - * @param holds the new CDMA subscription source value + * @param newSubscriptionSource holds the new CDMA subscription source value */ private void handleCdmaSubscriptionSource(int newSubscriptionSource) { if (newSubscriptionSource != mCdmaSubscriptionSource) { @@ -1423,7 +1438,7 @@ public class CDMAPhone extends PhoneBase { getContext().getContentResolver().insert(uri, map); // Updates MCC MNC device configuration information - MccTable.updateMccMncConfiguration(this, operatorNumeric); + MccTable.updateMccMncConfiguration(mContext, operatorNumeric); return true; } catch (SQLException e) { @@ -1456,6 +1471,16 @@ public class CDMAPhone extends PhoneBase { return mEriManager.isEriFileLoaded(); } + private void registerForRuimRecordEvents() { + mIccRecords.registerForRecordsEvents(this, EVENT_ICC_RECORD_EVENTS, null); + mIccRecords.registerForRecordsLoaded(this, EVENT_RUIM_RECORDS_LOADED, null); + } + + private void unregisterForRuimRecordEvents() { + mIccRecords.unregisterForRecordsEvents(this); + mIccRecords.unregisterForRecordsLoaded(this); + } + protected void log(String s) { if (DBG) Log.d(LOG_TAG, "[CDMAPhone] " + s); diff --git a/telephony/java/com/android/internal/telephony/cdma/CdmaLteUiccRecords.java b/telephony/java/com/android/internal/telephony/cdma/CdmaLteUiccRecords.java index ca1e96d..eaa2ede 100755 --- a/telephony/java/com/android/internal/telephony/cdma/CdmaLteUiccRecords.java +++ b/telephony/java/com/android/internal/telephony/cdma/CdmaLteUiccRecords.java @@ -15,6 +15,7 @@ */ package com.android.internal.telephony.cdma; +import android.content.Context; import android.os.AsyncResult; import android.os.SystemProperties; import android.util.Log; @@ -22,6 +23,8 @@ import android.util.Log; import com.android.internal.telephony.AdnRecordLoader; import com.android.internal.telephony.GsmAlphabet; import com.android.internal.telephony.IccCardApplication.AppType; +import com.android.internal.telephony.CommandsInterface; +import com.android.internal.telephony.IccCard; import com.android.internal.telephony.IccFileHandler; import com.android.internal.telephony.IccUtils; import com.android.internal.telephony.MccTable; @@ -54,8 +57,8 @@ public final class CdmaLteUiccRecords extends SIMRecords { private final IsimUiccRecords mIsimUiccRecords = new IsimUiccRecords(); - public CdmaLteUiccRecords(PhoneBase p) { - super(p); + public CdmaLteUiccRecords(IccCard card, Context c, CommandsInterface ci) { + super(card, c, ci); } // Refer to ETSI TS 102.221 @@ -146,7 +149,7 @@ public final class CdmaLteUiccRecords extends SIMRecords { } if (DBG) log("spn=" + spn); if (DBG) log("spnCondition=" + mCsimSpnDisplayCondition); - phone.setSystemProperty(PROPERTY_ICC_OPERATOR_ALPHA, spn); + SystemProperties.set(PROPERTY_ICC_OPERATOR_ALPHA, spn); } } @@ -262,55 +265,54 @@ public final class CdmaLteUiccRecords extends SIMRecords { @Override protected void fetchSimRecords() { - IccFileHandler iccFh = phone.getIccFileHandler(); recordsRequested = true; - phone.mCM.getIMSI(obtainMessage(EVENT_GET_IMSI_DONE)); + mCi.getIMSIForApp(mParentCard.getAid(), obtainMessage(EVENT_GET_IMSI_DONE)); recordsToLoad++; - iccFh.loadEFTransparent(EF_ICCID, obtainMessage(EVENT_GET_ICCID_DONE)); + mFh.loadEFTransparent(EF_ICCID, obtainMessage(EVENT_GET_ICCID_DONE)); recordsToLoad++; - iccFh.loadEFTransparent(EF_AD, obtainMessage(EVENT_GET_AD_DONE)); + mFh.loadEFTransparent(EF_AD, obtainMessage(EVENT_GET_AD_DONE)); recordsToLoad++; - iccFh.loadEFTransparent(EF_PL, + mFh.loadEFTransparent(EF_PL, obtainMessage(EVENT_GET_ICC_RECORD_DONE, new EfPlLoaded())); recordsToLoad++; - new AdnRecordLoader(phone).loadFromEF(EF_MSISDN, EF_EXT1, 1, + new AdnRecordLoader(mFh).loadFromEF(EF_MSISDN, EF_EXT1, 1, obtainMessage(EVENT_GET_MSISDN_DONE)); recordsToLoad++; - iccFh.loadEFTransparent(EF_SST, obtainMessage(EVENT_GET_SST_DONE)); + mFh.loadEFTransparent(EF_SST, obtainMessage(EVENT_GET_SST_DONE)); recordsToLoad++; - iccFh.loadEFTransparent(EF_CSIM_LI, + mFh.loadEFTransparent(EF_CSIM_LI, obtainMessage(EVENT_GET_ICC_RECORD_DONE, new EfCsimLiLoaded())); recordsToLoad++; - iccFh.loadEFTransparent(EF_CSIM_SPN, + mFh.loadEFTransparent(EF_CSIM_SPN, obtainMessage(EVENT_GET_ICC_RECORD_DONE, new EfCsimSpnLoaded())); recordsToLoad++; - iccFh.loadEFLinearFixed(EF_CSIM_MDN, 1, + mFh.loadEFLinearFixed(EF_CSIM_MDN, 1, obtainMessage(EVENT_GET_ICC_RECORD_DONE, new EfCsimMdnLoaded())); recordsToLoad++; - iccFh.loadEFTransparent(EF_CSIM_IMSIM, + mFh.loadEFTransparent(EF_CSIM_IMSIM, obtainMessage(EVENT_GET_ICC_RECORD_DONE, new EfCsimImsimLoaded())); recordsToLoad++; - iccFh.loadEFLinearFixedAll(EF_CSIM_CDMAHOME, + mFh.loadEFLinearFixedAll(EF_CSIM_CDMAHOME, obtainMessage(EVENT_GET_ICC_RECORD_DONE, new EfCsimCdmaHomeLoaded())); recordsToLoad++; - iccFh.loadEFTransparent(EF_CSIM_EPRL, + mFh.loadEFTransparent(EF_CSIM_EPRL, obtainMessage(EVENT_GET_ICC_RECORD_DONE, new EfCsimEprlLoaded())); recordsToLoad++; // load ISIM records - recordsToLoad += mIsimUiccRecords.fetchIsimRecords(iccFh, this); + recordsToLoad += mIsimUiccRecords.fetchIsimRecords(mFh, this); } private int adjstMinDigits (int digits) { @@ -354,7 +356,7 @@ public final class CdmaLteUiccRecords extends SIMRecords { Integer.parseInt(imsi.substring(0,3))); } log("Setting locale to " + prefLang + "_" + country); - phone.setSystemLocale(prefLang, country, false); + MccTable.setSystemLocale(mContext, prefLang, country); } else { log ("No suitable CSIM selected locale"); } @@ -362,7 +364,7 @@ public final class CdmaLteUiccRecords extends SIMRecords { private String findBestLanguage(byte[] languages) { String bestMatch = null; - String[] locales = phone.getContext().getAssets().getLocales(); + String[] locales = mContext.getAssets().getLocales(); if ((languages == null) || (locales == null)) return null; @@ -436,23 +438,14 @@ public final class CdmaLteUiccRecords extends SIMRecords { return true; } - if (phone == null || phone.mIccCard == null) { + if (mParentCard == null) { return false; } - if (phone.mIccCard.isApplicationOnIcc(AppType.APPTYPE_CSIM) && + if (mParentCard.isApplicationOnIcc(AppType.APPTYPE_CSIM) && ((mMdn == null) || (mMin == null))) { return false; } return true; } - - /** - * Dispatch 3GPP format message. For CDMA/LTE phones, - * send the message to the secondary 3GPP format SMS dispatcher. - */ - @Override - protected int dispatchGsmMessage(SmsMessageBase message) { - return ((CDMALTEPhone) phone).m3gppSMS.dispatchMessage(message); - } } diff --git a/telephony/java/com/android/internal/telephony/cdma/RuimFileHandler.java b/telephony/java/com/android/internal/telephony/cdma/RuimFileHandler.java index 9f30d36..f440935 100644 --- a/telephony/java/com/android/internal/telephony/cdma/RuimFileHandler.java +++ b/telephony/java/com/android/internal/telephony/cdma/RuimFileHandler.java @@ -45,9 +45,6 @@ public final class RuimFileHandler extends IccFileHandler { super(card, aid, ci); } - public void dispose() { - } - protected void finalize() { Log.d(LOG_TAG, "RuimFileHandler finalized"); } diff --git a/telephony/java/com/android/internal/telephony/cdma/RuimRecords.java b/telephony/java/com/android/internal/telephony/cdma/RuimRecords.java index 265dff7..3855515 100755 --- a/telephony/java/com/android/internal/telephony/cdma/RuimRecords.java +++ b/telephony/java/com/android/internal/telephony/cdma/RuimRecords.java @@ -18,6 +18,7 @@ package com.android.internal.telephony.cdma; import static com.android.internal.telephony.TelephonyProperties.PROPERTY_ICC_OPERATOR_ISO_COUNTRY; import static com.android.internal.telephony.TelephonyProperties.PROPERTY_ICC_OPERATOR_NUMERIC; +import android.content.Context; import android.os.AsyncResult; import android.os.Handler; import android.os.Message; @@ -78,19 +79,19 @@ public final class RuimRecords extends IccRecords { private static final int EVENT_RUIM_REFRESH = 31; - public RuimRecords(PhoneBase p) { - super(p); + public RuimRecords(IccCard card, Context c, CommandsInterface ci) { + super(card, c, ci); - adnCache = new AdnRecordCache(phone); + adnCache = new AdnRecordCache(mFh); recordsRequested = false; // No load request is made till SIM ready // recordsToLoad is set to 0 because no requests are made yet recordsToLoad = 0; - p.mCM.registerForOffOrNotAvailable(this, EVENT_RADIO_OFF_OR_NOT_AVAILABLE, null); + mCi.registerForOffOrNotAvailable(this, EVENT_RADIO_OFF_OR_NOT_AVAILABLE, null); // NOTE the EVENT_SMS_ON_RUIM is not registered - p.mCM.registerForIccRefresh(this, EVENT_RUIM_REFRESH, null); + mCi.registerForIccRefresh(this, EVENT_RUIM_REFRESH, null); // Start off by setting empty state onRadioOffOrNotAvailable(); @@ -99,9 +100,11 @@ public final class RuimRecords extends IccRecords { @Override public void dispose() { + if (DBG) log("Disposing RuimRecords " + this); //Unregister for all events - phone.mCM.unregisterForOffOrNotAvailable( this); - phone.mCM.unregisterForIccRefresh(this); + mCi.unregisterForOffOrNotAvailable( this); + mCi.unregisterForIccRefresh(this); + super.dispose(); } @Override @@ -196,7 +199,7 @@ public final class RuimRecords extends IccRecords { boolean isRecordLoadResponse = false; - if (!phone.mIsTheCurrentActivePhone) { + if (mDestroyed) { loge("Received message " + msg + "[" + msg.what + "] while being destroyed. Ignoring."); return; @@ -235,7 +238,7 @@ public final class RuimRecords extends IccRecords { String operatorNumeric = getRUIMOperatorNumeric(); if (operatorNumeric != null) { if(operatorNumeric.length() <= 6){ - MccTable.updateMccMncConfiguration(phone, operatorNumeric); + MccTable.updateMccMncConfiguration(mContext, operatorNumeric); } } break; @@ -314,6 +317,7 @@ public final class RuimRecords extends IccRecords { // One record loaded successfully or failed, In either case // we need to update the recordsToLoad count recordsToLoad -= 1; + if (DBG) log("RuimRecords:onRecordLoaded " + recordsToLoad + " requested: " + recordsRequested); if (recordsToLoad == 0 && recordsRequested == true) { onAllRecordsLoaded(); @@ -338,7 +342,7 @@ public final class RuimRecords extends IccRecords { } recordsLoadedRegistrants.notifyRegistrants( new AsyncResult(null, null, null)); - phone.mIccCard.broadcastIccStateChangedIntent( + mParentCard.broadcastIccStateChangedIntent( IccCard.INTENT_VALUE_ICC_LOADED, null); } @@ -348,13 +352,12 @@ public final class RuimRecords extends IccRecords { READY is sent before IMSI ready */ - phone.mIccCard.broadcastIccStateChangedIntent( + mParentCard.broadcastIccStateChangedIntent( IccCard.INTENT_VALUE_ICC_READY, null); fetchRuimRecords(); - phone.mCM.getCDMASubscription(obtainMessage(EVENT_GET_CDMA_SUBSCRIPTION_DONE)); - + mCi.getCDMASubscription(obtainMessage(EVENT_GET_CDMA_SUBSCRIPTION_DONE)); } @@ -363,13 +366,14 @@ public final class RuimRecords extends IccRecords { Log.v(LOG_TAG, "RuimRecords:fetchRuimRecords " + recordsToLoad); - phone.mCM.getIMSI(obtainMessage(EVENT_GET_IMSI_DONE)); + mCi.getIMSI(obtainMessage(EVENT_GET_IMSI_DONE)); recordsToLoad++; - phone.getIccFileHandler().loadEFTransparent(EF_ICCID, + mFh.loadEFTransparent(EF_ICCID, obtainMessage(EVENT_GET_ICCID_DONE)); recordsToLoad++; + log("RuimRecords:fetchRuimRecords " + recordsToLoad + " requested: " + recordsRequested); // Further records that can be inserted are Operator/OEM dependent } @@ -401,7 +405,7 @@ public final class RuimRecords extends IccRecords { } countVoiceMessages = countWaiting; - ((CDMAPhone) phone).notifyMessageWaitingIndicator(); + mRecordsEventsRegistrants.notifyResult(EVENT_MWI); } private void handleRuimRefresh(IccRefreshResponse refreshResponse) { @@ -411,7 +415,7 @@ public final class RuimRecords extends IccRecords { } if (refreshResponse.aid != null && - !refreshResponse.aid.equals(phone.getIccCard().getAid())) { + !refreshResponse.aid.equals(mParentCard.getAid())) { // This is for different app. Ignore. return; } @@ -429,7 +433,7 @@ public final class RuimRecords extends IccRecords { break; case IccRefreshResponse.REFRESH_RESULT_RESET: if (DBG) log("handleRuimRefresh with SIM_REFRESH_RESET"); - phone.mCM.setRadioPower(false, null); + mCi.setRadioPower(false, null); /* Note: no need to call setRadioPower(true). Assuming the desired * radio power state is still ON (as tracked by ServiceStateTracker), * ServiceStateTracker will call setRadioPower when it receives the diff --git a/telephony/java/com/android/internal/telephony/gsm/GSMPhone.java b/telephony/java/com/android/internal/telephony/gsm/GSMPhone.java index 5e9a4f2..27f362c 100644 --- a/telephony/java/com/android/internal/telephony/gsm/GSMPhone.java +++ b/telephony/java/com/android/internal/telephony/gsm/GSMPhone.java @@ -152,7 +152,7 @@ public class GSMPhone extends PhoneBase { mStkService = CatService.getInstance(mCM, mIccRecords, mContext, mIccFileHandler, mIccCard); mCM.registerForAvailable(this, EVENT_RADIO_AVAILABLE, null); - mIccRecords.registerForRecordsLoaded(this, EVENT_SIM_RECORDS_LOADED, null); + registerForSimRecordEvents(); mCM.registerForOffOrNotAvailable(this, EVENT_RADIO_OFF_OR_NOT_AVAILABLE, null); mCM.registerForOn(this, EVENT_RADIO_ON, null); mCM.setOnUSSD(this, EVENT_USSD, null); @@ -205,7 +205,7 @@ public class GSMPhone extends PhoneBase { //Unregister from all former registered events mCM.unregisterForAvailable(this); //EVENT_RADIO_AVAILABLE - mIccRecords.unregisterForRecordsLoaded(this); //EVENT_SIM_RECORDS_LOADED + unregisterForSimRecordEvents(); mCM.unregisterForOffOrNotAvailable(this); //EVENT_RADIO_OFF_OR_NOT_AVAILABLE mCM.unregisterForOn(this); //EVENT_RADIO_ON mSST.unregisterForNetworkAttached(this); //EVENT_REGISTERED_TO_NETWORK @@ -219,8 +219,6 @@ public class GSMPhone extends PhoneBase { mCT.dispose(); mDataConnectionTracker.dispose(); mSST.dispose(); - mIccFileHandler.dispose(); // instance of SimFileHandler - mIccRecords.dispose(); mSimPhoneBookIntManager.dispose(); mSimSmsIntManager.dispose(); mSubInfo.dispose(); @@ -1288,6 +1286,21 @@ public class GSMPhone extends PhoneBase { } break; + case EVENT_NEW_ICC_SMS: + ar = (AsyncResult)msg.obj; + mSMS.dispatchMessage((SmsMessage)ar.result); + break; + + case EVENT_SET_NETWORK_AUTOMATIC: + ar = (AsyncResult)msg.obj; + setNetworkSelectionModeAutomatic((Message)ar.result); + break; + + case EVENT_ICC_RECORD_EVENTS: + ar = (AsyncResult)msg.obj; + processIccRecordEvents((Integer)ar.result); + break; + // handle the select network completion callbacks. case EVENT_SET_NETWORK_MANUAL_COMPLETE: case EVENT_SET_NETWORK_AUTOMATIC_COMPLETE: @@ -1311,7 +1324,18 @@ public class GSMPhone extends PhoneBase { } } - /** + private void processIccRecordEvents(int eventCode) { + switch (eventCode) { + case SIMRecords.EVENT_CFI: + notifyCallForwardingIndicator(); + break; + case SIMRecords.EVENT_MWI: + notifyMessageWaitingIndicator(); + break; + } + } + + /** * Sets the "current" field in the telephony provider according to the SIM's operator * * @return true for success; false otherwise. @@ -1460,4 +1484,20 @@ public class GSMPhone extends PhoneBase { public boolean isCspPlmnEnabled() { return mIccRecords.isCspPlmnEnabled(); } + + private void registerForSimRecordEvents() { + mIccRecords.registerForNetworkSelectionModeAutomatic( + this, EVENT_SET_NETWORK_AUTOMATIC, null); + mIccRecords.registerForNewSms(this, EVENT_NEW_ICC_SMS, null); + mIccRecords.registerForRecordsEvents(this, EVENT_ICC_RECORD_EVENTS, null); + mIccRecords.registerForRecordsLoaded(this, EVENT_SIM_RECORDS_LOADED, null); + } + + private void unregisterForSimRecordEvents() { + mIccRecords.unregisterForNetworkSelectionModeAutomatic(this); + mIccRecords.unregisterForNewSms(this); + mIccRecords.unregisterForRecordsEvents(this); + mIccRecords.unregisterForRecordsLoaded(this); + } + } diff --git a/telephony/java/com/android/internal/telephony/gsm/SIMFileHandler.java b/telephony/java/com/android/internal/telephony/gsm/SIMFileHandler.java index 455ee74..dcc9cfd 100644 --- a/telephony/java/com/android/internal/telephony/gsm/SIMFileHandler.java +++ b/telephony/java/com/android/internal/telephony/gsm/SIMFileHandler.java @@ -40,10 +40,6 @@ public final class SIMFileHandler extends IccFileHandler implements IccConstants super(card, aid, ci); } - public void dispose() { - super.dispose(); - } - protected void finalize() { Log.d(LOG_TAG, "SIMFileHandler finalized"); } diff --git a/telephony/java/com/android/internal/telephony/gsm/SIMRecords.java b/telephony/java/com/android/internal/telephony/gsm/SIMRecords.java index 68d3b2a..b88af2c 100755 --- a/telephony/java/com/android/internal/telephony/gsm/SIMRecords.java +++ b/telephony/java/com/android/internal/telephony/gsm/SIMRecords.java @@ -21,6 +21,7 @@ import static com.android.internal.telephony.TelephonyProperties.PROPERTY_ICC_OP import static com.android.internal.telephony.TelephonyProperties.PROPERTY_ICC_OPERATOR_NUMERIC; import android.content.Context; import android.os.AsyncResult; +import android.os.Handler; import android.os.Message; import android.os.SystemProperties; import android.util.Log; @@ -174,10 +175,10 @@ public class SIMRecords extends IccRecords { // ***** Constructor - public SIMRecords(PhoneBase p) { - super(p); + public SIMRecords(IccCard card, Context c, CommandsInterface ci) { + super(card, c, ci); - adnCache = new AdnRecordCache(phone); + adnCache = new AdnRecordCache(mFh); mVmConfig = new VoiceMailConstants(); mSpnOverride = new SpnOverride(); @@ -187,10 +188,10 @@ public class SIMRecords extends IccRecords { // recordsToLoad is set to 0 because no requests are made yet recordsToLoad = 0; - p.mCM.registerForOffOrNotAvailable( + mCi.registerForOffOrNotAvailable( this, EVENT_RADIO_OFF_OR_NOT_AVAILABLE, null); - p.mCM.setOnSmsOnSim(this, EVENT_SMS_ON_SIM, null); - p.mCM.registerForIccRefresh(this, EVENT_SIM_REFRESH, null); + mCi.setOnSmsOnSim(this, EVENT_SMS_ON_SIM, null); + mCi.registerForIccRefresh(this, EVENT_SIM_REFRESH, null); // Start off by setting empty state onRadioOffOrNotAvailable(); @@ -199,9 +200,12 @@ public class SIMRecords extends IccRecords { @Override public void dispose() { + if (DBG) log("Disposing SIMRecords " + this); //Unregister for all events - phone.mCM.unregisterForOffOrNotAvailable( this); - phone.mCM.unregisterForIccRefresh(this); + mCi.unregisterForOffOrNotAvailable( this); + mCi.unregisterForIccRefresh(this); + mCi.unSetOnSmsOnSim(this); + super.dispose(); } protected void finalize() { @@ -224,9 +228,9 @@ public class SIMRecords extends IccRecords { adnCache.reset(); - phone.setSystemProperty(PROPERTY_ICC_OPERATOR_NUMERIC, null); - phone.setSystemProperty(PROPERTY_ICC_OPERATOR_ALPHA, null); - phone.setSystemProperty(PROPERTY_ICC_OPERATOR_ISO_COUNTRY, null); + SystemProperties.set(PROPERTY_ICC_OPERATOR_NUMERIC, null); + SystemProperties.set(PROPERTY_ICC_OPERATOR_ALPHA, null); + SystemProperties.set(PROPERTY_ICC_OPERATOR_ISO_COUNTRY, null); // recordsRequested is set to false indicating that the SIM // read requests made so far are not valid. This is set to @@ -280,7 +284,7 @@ public class SIMRecords extends IccRecords { AdnRecord adn = new AdnRecord(msisdnTag, msisdn); - new AdnRecordLoader(phone).updateEF(adn, EF_MSISDN, EF_EXT1, 1, null, + new AdnRecordLoader(mFh).updateEF(adn, EF_MSISDN, EF_EXT1, 1, null, obtainMessage(EVENT_SET_MSISDN_DONE, onComplete)); } @@ -332,13 +336,13 @@ public class SIMRecords extends IccRecords { if (mailboxIndex != 0 && mailboxIndex != 0xff) { - new AdnRecordLoader(phone).updateEF(adn, EF_MBDN, EF_EXT6, + new AdnRecordLoader(mFh).updateEF(adn, EF_MBDN, EF_EXT6, mailboxIndex, null, obtainMessage(EVENT_SET_MBDN_DONE, onComplete)); } else if (isCphsMailboxEnabled()) { - new AdnRecordLoader(phone).updateEF(adn, EF_MAILBOX_CPHS, + new AdnRecordLoader(mFh).updateEF(adn, EF_MAILBOX_CPHS, EF_EXT1, 1, null, obtainMessage(EVENT_SET_CPHS_MAILBOX_DONE, onComplete)); @@ -379,7 +383,7 @@ public class SIMRecords extends IccRecords { countVoiceMessages = countWaiting; - phone.notifyMessageWaitingIndicator(); + mRecordsEventsRegistrants.notifyResult(EVENT_MWI); try { if (efMWIS != null) { @@ -398,7 +402,7 @@ public class SIMRecords extends IccRecords { efMWIS[1] = (byte) countWaiting; } - phone.getIccFileHandler().updateEFLinearFixed( + mFh.updateEFLinearFixed( EF_MWIS, 1, efMWIS, null, obtainMessage (EVENT_UPDATE_DONE, EF_MWIS)); } @@ -408,7 +412,7 @@ public class SIMRecords extends IccRecords { efCPHS_MWI[0] = (byte)((efCPHS_MWI[0] & 0xf0) | (countVoiceMessages == 0 ? 0x5 : 0xa)); - phone.getIccFileHandler().updateEFTransparent( + mFh.updateEFTransparent( EF_VOICE_MAIL_INDICATOR_CPHS, efCPHS_MWI, obtainMessage (EVENT_UPDATE_DONE, EF_VOICE_MAIL_INDICATOR_CPHS)); } @@ -435,7 +439,7 @@ public class SIMRecords extends IccRecords { callForwardingEnabled = enable; - phone.notifyCallForwardingIndicator(); + mRecordsEventsRegistrants.notifyResult(EVENT_CFI); try { if (mEfCfis != null) { @@ -449,7 +453,7 @@ public class SIMRecords extends IccRecords { // TODO: Should really update other fields in EF_CFIS, eg, // dialing number. We don't read or use it right now. - phone.getIccFileHandler().updateEFLinearFixed( + mFh.updateEFLinearFixed( EF_CFIS, 1, mEfCfis, null, obtainMessage (EVENT_UPDATE_DONE, EF_CFIS)); } @@ -463,7 +467,7 @@ public class SIMRecords extends IccRecords { | CFF_UNCONDITIONAL_DEACTIVE); } - phone.getIccFileHandler().updateEFTransparent( + mFh.updateEFTransparent( EF_CFF_CPHS, mEfCff, obtainMessage (EVENT_UPDATE_DONE, EF_CFF_CPHS)); } @@ -516,7 +520,7 @@ public class SIMRecords extends IccRecords { boolean isRecordLoadResponse = false; - if (!phone.mIsTheCurrentActivePhone) { + if (mDestroyed) { loge("Received message " + msg + "[" + msg.what + "] " + " while being destroyed. Ignoring."); return; @@ -574,9 +578,9 @@ public class SIMRecords extends IccRecords { if (mncLength != UNKNOWN && mncLength != UNINITIALIZED) { // finally have both the imsi and the mncLength and can parse the imsi properly - MccTable.updateMccMncConfiguration(phone, imsi.substring(0, 3 + mncLength)); + MccTable.updateMccMncConfiguration(mContext, imsi.substring(0, 3 + mncLength)); } - phone.mIccCard.broadcastIccStateChangedIntent( + mParentCard.broadcastIccStateChangedIntent( IccCard.INTENT_VALUE_ICC_IMSI, null); break; @@ -607,12 +611,12 @@ public class SIMRecords extends IccRecords { if (isValidMbdn) { // Note: MBDN was not included in NUM_OF_SIM_RECORDS_LOADED - new AdnRecordLoader(phone).loadFromEF(EF_MBDN, EF_EXT6, + new AdnRecordLoader(mFh).loadFromEF(EF_MBDN, EF_EXT6, mailboxIndex, obtainMessage(EVENT_GET_MBDN_DONE)); } else { // If this EF not present, try mailbox as in CPHS standard // CPHS (CPHS4_2.WW6) is a european standard. - new AdnRecordLoader(phone).loadFromEF(EF_MAILBOX_CPHS, + new AdnRecordLoader(mFh).loadFromEF(EF_MAILBOX_CPHS, EF_EXT1, 1, obtainMessage(EVENT_GET_CPHS_MAILBOX_DONE)); } @@ -644,7 +648,7 @@ public class SIMRecords extends IccRecords { // FIXME right now, only load line1's CPHS voice mail entry recordsToLoad += 1; - new AdnRecordLoader(phone).loadFromEF( + new AdnRecordLoader(mFh).loadFromEF( EF_MAILBOX_CPHS, EF_EXT1, 1, obtainMessage(EVENT_GET_CPHS_MAILBOX_DONE)); } @@ -661,7 +665,7 @@ public class SIMRecords extends IccRecords { // FIXME should use SST to decide // FIXME right now, only load line1's CPHS voice mail entry recordsToLoad += 1; - new AdnRecordLoader(phone).loadFromEF( + new AdnRecordLoader(mFh).loadFromEF( EF_MAILBOX_CPHS, EF_EXT1, 1, obtainMessage(EVENT_GET_CPHS_MAILBOX_DONE)); @@ -729,7 +733,7 @@ public class SIMRecords extends IccRecords { countVoiceMessages = -1; } - phone.notifyMessageWaitingIndicator(); + mRecordsEventsRegistrants.notifyResult(EVENT_MWI); break; case EVENT_GET_VOICE_MAIL_INDICATOR_CPHS_DONE: @@ -758,7 +762,7 @@ public class SIMRecords extends IccRecords { countVoiceMessages = 0; } - phone.notifyMessageWaitingIndicator(); + mRecordsEventsRegistrants.notifyResult(EVENT_MWI); } break; @@ -839,7 +843,8 @@ public class SIMRecords extends IccRecords { if (imsi != null && mncLength != UNKNOWN) { // finally have both imsi and the length of the mnc and can parse // the imsi properly - MccTable.updateMccMncConfiguration(phone, imsi.substring(0, 3 + mncLength)); + MccTable.updateMccMncConfiguration(mContext, + imsi.substring(0, 3 + mncLength)); } } break; @@ -867,7 +872,7 @@ public class SIMRecords extends IccRecords { callForwardingEnabled = ((data[0] & CFF_LINE1_MASK) == CFF_UNCONDITIONAL_ACTIVE); - phone.notifyCallForwardingIndicator(); + mRecordsEventsRegistrants.notifyResult(EVENT_CFI); } break; @@ -940,7 +945,7 @@ public class SIMRecords extends IccRecords { + ar.exception + " length " + index.length); } else { log("READ EF_SMS RECORD index=" + index[0]); - phone.getIccFileHandler().loadEFLinearFixed(EF_SMS,index[0], + mFh.loadEFLinearFixed(EF_SMS,index[0], obtainMessage(EVENT_GET_SMS_DONE)); } break; @@ -1012,7 +1017,7 @@ public class SIMRecords extends IccRecords { onCphsCompleted = null; } - new AdnRecordLoader(phone). + new AdnRecordLoader(mFh). updateEF(adn, EF_MAILBOX_CPHS, EF_EXT1, 1, null, obtainMessage(EVENT_SET_CPHS_MAILBOX_DONE, onCphsCompleted)); @@ -1066,7 +1071,7 @@ public class SIMRecords extends IccRecords { // Refer TS 51.011 Section 10.3.46 for the content description callForwardingEnabled = ((data[1] & 0x01) != 0); - phone.notifyCallForwardingIndicator(); + mRecordsEventsRegistrants.notifyResult(EVENT_CFI); break; case EVENT_GET_CSP_CPHS_DONE: @@ -1103,18 +1108,18 @@ public class SIMRecords extends IccRecords { switch(efid) { case EF_MBDN: recordsToLoad++; - new AdnRecordLoader(phone).loadFromEF(EF_MBDN, EF_EXT6, + new AdnRecordLoader(mFh).loadFromEF(EF_MBDN, EF_EXT6, mailboxIndex, obtainMessage(EVENT_GET_MBDN_DONE)); break; case EF_MAILBOX_CPHS: recordsToLoad++; - new AdnRecordLoader(phone).loadFromEF(EF_MAILBOX_CPHS, EF_EXT1, + new AdnRecordLoader(mFh).loadFromEF(EF_MAILBOX_CPHS, EF_EXT1, 1, obtainMessage(EVENT_GET_CPHS_MAILBOX_DONE)); break; case EF_CSP_CPHS: recordsToLoad++; log("[CSP] SIM Refresh for EF_CSP_CPHS"); - phone.getIccFileHandler().loadEFTransparent(EF_CSP_CPHS, + mFh.loadEFTransparent(EF_CSP_CPHS, obtainMessage(EVENT_GET_CSP_CPHS_DONE)); break; default: @@ -1134,7 +1139,7 @@ public class SIMRecords extends IccRecords { } if (refreshResponse.aid != null && - !refreshResponse.aid.equals(phone.getIccCard().getAid())) { + !refreshResponse.aid.equals(mParentCard.getAid())) { // This is for different app. Ignore. return; } @@ -1152,7 +1157,7 @@ public class SIMRecords extends IccRecords { break; case IccRefreshResponse.REFRESH_RESULT_RESET: if (DBG) log("handleSimRefresh with SIM_REFRESH_RESET"); - phone.mCM.setRadioPower(false, null); + mCi.setRadioPower(false, null); /* Note: no need to call setRadioPower(true). Assuming the desired * radio power state is still ON (as tracked by ServiceStateTracker), * ServiceStateTracker will call setRadioPower when it receives the @@ -1174,7 +1179,8 @@ public class SIMRecords extends IccRecords { * to send messages to the secondary 3GPP format SMS dispatcher. */ protected int dispatchGsmMessage(SmsMessageBase message) { - return phone.mSMS.dispatchMessage(message); + mNewSmsRegistrants.notifyResult(message); + return 0; } private void handleSms(byte[] ba) { @@ -1226,7 +1232,7 @@ public class SIMRecords extends IccRecords { ba[0] = 1; if (false) { // XXX writing seems to crash RdoServD - phone.getIccFileHandler().updateEFLinearFixed(EF_SMS, + mFh.updateEFLinearFixed(EF_SMS, i, ba, null, obtainMessage(EVENT_MARK_SMS_READ_DONE, i)); } } @@ -1237,6 +1243,7 @@ public class SIMRecords extends IccRecords { // One record loaded successfully or failed, In either case // we need to update the recordsToLoad count recordsToLoad -= 1; + if (DBG) log("onRecordLoaded " + recordsToLoad + " requested: " + recordsRequested); if (recordsToLoad == 0 && recordsRequested == true) { onAllRecordsLoaded(); @@ -1253,10 +1260,10 @@ public class SIMRecords extends IccRecords { // Some fields require more than one SIM record to set - phone.setSystemProperty(PROPERTY_ICC_OPERATOR_NUMERIC, operator); + SystemProperties.set(PROPERTY_ICC_OPERATOR_NUMERIC, operator); if (imsi != null) { - phone.setSystemProperty(PROPERTY_ICC_OPERATOR_ISO_COUNTRY, + SystemProperties.set(PROPERTY_ICC_OPERATOR_ISO_COUNTRY, MccTable.countryCodeForMcc(Integer.parseInt(imsi.substring(0,3)))); } else { @@ -1268,7 +1275,7 @@ public class SIMRecords extends IccRecords { recordsLoadedRegistrants.notifyRegistrants( new AsyncResult(null, null, null)); - phone.mIccCard.broadcastIccStateChangedIntent( + mParentCard.broadcastIccStateChangedIntent( IccCard.INTENT_VALUE_ICC_LOADED, null); } @@ -1294,7 +1301,7 @@ public class SIMRecords extends IccRecords { /* broadcast intent SIM_READY here so that we can make sure READY is sent before IMSI ready */ - phone.mIccCard.broadcastIccStateChangedIntent( + mParentCard.broadcastIccStateChangedIntent( IccCard.INTENT_VALUE_ICC_READY, null); fetchSimRecords(); @@ -1302,31 +1309,30 @@ public class SIMRecords extends IccRecords { protected void fetchSimRecords() { recordsRequested = true; - IccFileHandler iccFh = phone.getIccFileHandler(); - logv("fetchSimRecords " + recordsToLoad); + if (DBG) log("fetchSimRecords " + recordsToLoad); - phone.mCM.getIMSIForApp(phone.getIccCard().getAid(), obtainMessage(EVENT_GET_IMSI_DONE)); + mCi.getIMSIForApp(mParentCard.getAid(), obtainMessage(EVENT_GET_IMSI_DONE)); recordsToLoad++; - iccFh.loadEFTransparent(EF_ICCID, obtainMessage(EVENT_GET_ICCID_DONE)); + mFh.loadEFTransparent(EF_ICCID, obtainMessage(EVENT_GET_ICCID_DONE)); recordsToLoad++; // FIXME should examine EF[MSISDN]'s capability configuration // to determine which is the voice/data/fax line - new AdnRecordLoader(phone).loadFromEF(EF_MSISDN, EF_EXT1, 1, + new AdnRecordLoader(mFh).loadFromEF(EF_MSISDN, EF_EXT1, 1, obtainMessage(EVENT_GET_MSISDN_DONE)); recordsToLoad++; // Record number is subscriber profile - iccFh.loadEFLinearFixed(EF_MBI, 1, obtainMessage(EVENT_GET_MBI_DONE)); + mFh.loadEFLinearFixed(EF_MBI, 1, obtainMessage(EVENT_GET_MBI_DONE)); recordsToLoad++; - iccFh.loadEFTransparent(EF_AD, obtainMessage(EVENT_GET_AD_DONE)); + mFh.loadEFTransparent(EF_AD, obtainMessage(EVENT_GET_AD_DONE)); recordsToLoad++; // Record number is subscriber profile - iccFh.loadEFLinearFixed(EF_MWIS, 1, obtainMessage(EVENT_GET_MWIS_DONE)); + mFh.loadEFLinearFixed(EF_MWIS, 1, obtainMessage(EVENT_GET_MWIS_DONE)); recordsToLoad++; @@ -1334,39 +1340,39 @@ public class SIMRecords extends IccRecords { // the same info as EF[MWIS]. If both exist, both are updated // but the EF[MWIS] data is preferred // Please note this must be loaded after EF[MWIS] - iccFh.loadEFTransparent( + mFh.loadEFTransparent( EF_VOICE_MAIL_INDICATOR_CPHS, obtainMessage(EVENT_GET_VOICE_MAIL_INDICATOR_CPHS_DONE)); recordsToLoad++; // Same goes for Call Forward Status indicator: fetch both // EF[CFIS] and CPHS-EF, with EF[CFIS] preferred. - iccFh.loadEFLinearFixed(EF_CFIS, 1, obtainMessage(EVENT_GET_CFIS_DONE)); + mFh.loadEFLinearFixed(EF_CFIS, 1, obtainMessage(EVENT_GET_CFIS_DONE)); recordsToLoad++; - iccFh.loadEFTransparent(EF_CFF_CPHS, obtainMessage(EVENT_GET_CFF_DONE)); + mFh.loadEFTransparent(EF_CFF_CPHS, obtainMessage(EVENT_GET_CFF_DONE)); recordsToLoad++; getSpnFsm(true, null); - iccFh.loadEFTransparent(EF_SPDI, obtainMessage(EVENT_GET_SPDI_DONE)); + mFh.loadEFTransparent(EF_SPDI, obtainMessage(EVENT_GET_SPDI_DONE)); recordsToLoad++; - iccFh.loadEFLinearFixed(EF_PNN, 1, obtainMessage(EVENT_GET_PNN_DONE)); + mFh.loadEFLinearFixed(EF_PNN, 1, obtainMessage(EVENT_GET_PNN_DONE)); recordsToLoad++; - iccFh.loadEFTransparent(EF_SST, obtainMessage(EVENT_GET_SST_DONE)); + mFh.loadEFTransparent(EF_SST, obtainMessage(EVENT_GET_SST_DONE)); recordsToLoad++; - iccFh.loadEFTransparent(EF_INFO_CPHS, obtainMessage(EVENT_GET_INFO_CPHS_DONE)); + mFh.loadEFTransparent(EF_INFO_CPHS, obtainMessage(EVENT_GET_INFO_CPHS_DONE)); recordsToLoad++; - iccFh.loadEFTransparent(EF_CSP_CPHS,obtainMessage(EVENT_GET_CSP_CPHS_DONE)); + mFh.loadEFTransparent(EF_CSP_CPHS,obtainMessage(EVENT_GET_CSP_CPHS_DONE)); recordsToLoad++; // XXX should seek instead of examining them all if (false) { // XXX - iccFh.loadEFLinearFixedAll(EF_SMS, obtainMessage(EVENT_GET_ALL_SMS_DONE)); + mFh.loadEFLinearFixedAll(EF_SMS, obtainMessage(EVENT_GET_ALL_SMS_DONE)); recordsToLoad++; } @@ -1379,9 +1385,10 @@ public class SIMRecords extends IccRecords { + "ffffffffffffffffffffffffffffff"; byte[] ba = IccUtils.hexStringToBytes(sms); - iccFh.updateEFLinearFixed(EF_SMS, 1, ba, null, + mFh.updateEFLinearFixed(EF_SMS, 1, ba, null, obtainMessage(EVENT_MARK_SMS_READ_DONE, 1)); } + if (DBG) log("fetchSimRecords " + recordsToLoad + " requested: " + recordsRequested); } /** @@ -1467,7 +1474,7 @@ public class SIMRecords extends IccRecords { case INIT: spn = null; - phone.getIccFileHandler().loadEFTransparent( EF_SPN, + mFh.loadEFTransparent(EF_SPN, obtainMessage(EVENT_GET_SPN_DONE)); recordsToLoad++; @@ -1481,11 +1488,11 @@ public class SIMRecords extends IccRecords { if (DBG) log("Load EF_SPN: " + spn + " spnDisplayCondition: " + spnDisplayCondition); - phone.setSystemProperty(PROPERTY_ICC_OPERATOR_ALPHA, spn); + SystemProperties.set(PROPERTY_ICC_OPERATOR_ALPHA, spn); spnState = Get_Spn_Fsm_State.IDLE; } else { - phone.getIccFileHandler().loadEFTransparent( EF_SPN_CPHS, + mFh.loadEFTransparent( EF_SPN_CPHS, obtainMessage(EVENT_GET_SPN_DONE)); recordsToLoad++; @@ -1503,11 +1510,11 @@ public class SIMRecords extends IccRecords { data, 0, data.length - 1 ); if (DBG) log("Load EF_SPN_CPHS: " + spn); - phone.setSystemProperty(PROPERTY_ICC_OPERATOR_ALPHA, spn); + SystemProperties.set(PROPERTY_ICC_OPERATOR_ALPHA, spn); spnState = Get_Spn_Fsm_State.IDLE; } else { - phone.getIccFileHandler().loadEFTransparent( + mFh.loadEFTransparent( EF_SPN_SHORT_CPHS, obtainMessage(EVENT_GET_SPN_DONE)); recordsToLoad++; @@ -1521,7 +1528,7 @@ public class SIMRecords extends IccRecords { data, 0, data.length - 1); if (DBG) log("Load EF_SPN_SHORT_CPHS: " + spn); - phone.setSystemProperty(PROPERTY_ICC_OPERATOR_ALPHA, spn); + SystemProperties.set(PROPERTY_ICC_OPERATOR_ALPHA, spn); }else { if (DBG) log("No SPN loaded in either CHPS or 3GPP"); } @@ -1638,7 +1645,7 @@ public class SIMRecords extends IccRecords { // Operator Selection menu should be disabled. // Operator Selection Mode should be set to Automatic. log("[CSP] Set Automatic Network Selection"); - phone.setNetworkSelectionModeAutomatic(null); + mNetworkSelectionModeAutomaticRegistrants.notifyRegistrants(); } return; } diff --git a/telephony/java/com/android/internal/telephony/gsm/UsimPhoneBookManager.java b/telephony/java/com/android/internal/telephony/gsm/UsimPhoneBookManager.java index a9efc98..8f5a420 100755 --- a/telephony/java/com/android/internal/telephony/gsm/UsimPhoneBookManager.java +++ b/telephony/java/com/android/internal/telephony/gsm/UsimPhoneBookManager.java @@ -24,6 +24,7 @@ import android.util.Log; import com.android.internal.telephony.AdnRecord; import com.android.internal.telephony.AdnRecordCache; import com.android.internal.telephony.IccConstants; +import com.android.internal.telephony.IccFileHandler; import com.android.internal.telephony.IccUtils; import com.android.internal.telephony.PhoneBase; @@ -42,7 +43,7 @@ public class UsimPhoneBookManager extends Handler implements IccConstants { private static final boolean DBG = true; private PbrFile mPbrFile; private Boolean mIsPbrPresent; - private PhoneBase mPhone; + private IccFileHandler mFh; private AdnRecordCache mAdnCache; private Object mLock = new Object(); private ArrayList<AdnRecord> mPhoneBookRecords; @@ -74,8 +75,8 @@ public class UsimPhoneBookManager extends Handler implements IccConstants { private static final int USIM_EFEMAIL_TAG = 0xCA; private static final int USIM_EFCCP1_TAG = 0xCB; - public UsimPhoneBookManager(PhoneBase phone, AdnRecordCache cache) { - mPhone = phone; + public UsimPhoneBookManager(IccFileHandler fh, AdnRecordCache cache) { + mFh = fh; mPhoneBookRecords = new ArrayList<AdnRecord>(); mPbrFile = null; // We assume its present, after the first read this is updated. @@ -138,7 +139,7 @@ public class UsimPhoneBookManager extends Handler implements IccConstants { } private void readPbrFileAndWait() { - mPhone.getIccFileHandler().loadEFLinearFixedAll(EF_PBR, obtainMessage(EVENT_PBR_LOAD_DONE)); + mFh.loadEFLinearFixedAll(EF_PBR, obtainMessage(EVENT_PBR_LOAD_DONE)); try { mLock.wait(); } catch (InterruptedException e) { @@ -165,7 +166,7 @@ public class UsimPhoneBookManager extends Handler implements IccConstants { } } // Read the EFEmail file. - mPhone.getIccFileHandler().loadEFLinearFixedAll(fileIds.get(USIM_EFEMAIL_TAG), + mFh.loadEFLinearFixedAll(fileIds.get(USIM_EFEMAIL_TAG), obtainMessage(EVENT_EMAIL_LOAD_DONE)); try { mLock.wait(); @@ -183,7 +184,7 @@ public class UsimPhoneBookManager extends Handler implements IccConstants { } private void readIapFileAndWait(int efid) { - mPhone.getIccFileHandler().loadEFLinearFixedAll(efid, obtainMessage(EVENT_IAP_LOAD_DONE)); + mFh.loadEFLinearFixedAll(efid, obtainMessage(EVENT_IAP_LOAD_DONE)); try { mLock.wait(); } catch (InterruptedException e) { diff --git a/tests/TileBenchmark/src/com/test/tilebenchmark/PlaybackGraphs.java b/tests/TileBenchmark/src/com/test/tilebenchmark/PlaybackGraphs.java index a3ae9be..065e86f 100644 --- a/tests/TileBenchmark/src/com/test/tilebenchmark/PlaybackGraphs.java +++ b/tests/TileBenchmark/src/com/test/tilebenchmark/PlaybackGraphs.java @@ -37,10 +37,10 @@ public class PlaybackGraphs { private static Paint whiteLabels; private static double viewportCoverage(TileData view, TileData tile) { - if (tile.left < view.right - && tile.right >= view.left - && tile.top < view.bottom - && tile.bottom >= view.top) { + if (tile.left < (view.right * view.scale) + && tile.right >= (view.left * view.scale) + && tile.top < (view.bottom * view.scale) + && tile.bottom >= (view.top * view.scale)) { return 1.0f; } return 0.0f; @@ -215,7 +215,7 @@ public class PlaybackGraphs { int lastBar = 0; for (int frameIndex = 0; frameIndex < data.frames.length; frameIndex++) { TileData frame[] = data.frames[frameIndex]; - int newBar = (frame[0].top + frame[0].bottom) / 2; + int newBar = (int)((frame[0].top + frame[0].bottom) * frame[0].scale / 2.0f); MetricGen s = Metrics[metricIndex]; double absoluteValue = s.getValue(frame); diff --git a/tests/TileBenchmark/src/com/test/tilebenchmark/RunData.java b/tests/TileBenchmark/src/com/test/tilebenchmark/RunData.java index 2da61cc..5e48afd 100644 --- a/tests/TileBenchmark/src/com/test/tilebenchmark/RunData.java +++ b/tests/TileBenchmark/src/com/test/tilebenchmark/RunData.java @@ -46,7 +46,8 @@ public class RunData implements Serializable { public String toString() { return "Tile (" + left + "," + top + ")->(" - + right + "," + bottom + ")"; + + right + "," + bottom + ")" + + (isReady ? "ready" : "NOTready") + " at scale " + scale; } } diff --git a/voip/jni/rtp/AudioGroup.cpp b/voip/jni/rtp/AudioGroup.cpp index 1139577..b9bbd16 100644 --- a/voip/jni/rtp/AudioGroup.cpp +++ b/voip/jni/rtp/AudioGroup.cpp @@ -809,9 +809,9 @@ bool AudioGroup::DeviceThread::threadLoop() AudioTrack track; AudioRecord record; if (track.set(AUDIO_STREAM_VOICE_CALL, sampleRate, AUDIO_FORMAT_PCM_16_BIT, - AUDIO_CHANNEL_OUT_MONO, output) != NO_ERROR || record.set( - AUDIO_SOURCE_VOICE_COMMUNICATION, sampleRate, AUDIO_FORMAT_PCM_16_BIT, - AUDIO_CHANNEL_IN_MONO, input) != NO_ERROR) { + AUDIO_CHANNEL_OUT_MONO, output) != NO_ERROR || + record.set(AUDIO_SOURCE_VOICE_COMMUNICATION, sampleRate, AUDIO_FORMAT_PCM_16_BIT, + AUDIO_CHANNEL_IN_MONO, input) != NO_ERROR) { ALOGE("cannot initialize audio device"); return false; } |
