diff options
195 files changed, 2433 insertions, 2085 deletions
diff --git a/Android.mk b/Android.mk index eef900acf923..b0a3dace6477 100644 --- a/Android.mk +++ b/Android.mk @@ -61,7 +61,6 @@ LOCAL_SRC_FILES := $(filter-out \ LOCAL_SRC_FILES += \ core/java/android/accessibilityservice/IAccessibilityServiceConnection.aidl \ core/java/android/accessibilityservice/IAccessibilityServiceClient.aidl \ - core/java/android/accessibilityservice/IAccessibilityServiceClientCallback.aidl \ core/java/android/accounts/IAccountManager.aidl \ core/java/android/accounts/IAccountManagerResponse.aidl \ core/java/android/accounts/IAccountAuthenticator.aidl \ diff --git a/CleanSpec.mk b/CleanSpec.mk index 939c117ff246..539b84ebf549 100644 --- a/CleanSpec.mk +++ b/CleanSpec.mk @@ -129,6 +129,9 @@ $(call add-clean-step, rm -rf $(OUT_DIR)/host/$(HOST_PREBUILT_TAG)/obj/STATIC_LI $(call add-clean-step, rm -rf $(OUT_DIR)/target/common/obj/JAVA_LIBRARIES/framework_intermediates/src/core/java/android/accessibilityservice/IEventListener.java) $(call add-clean-step, rm -rf $(OUT_DIR)/target/common/obj/JAVA_LIBRARIES/framework_intermediates/src/core/java/android/accessibilityservice/IEventListener.P) $(call add-clean-step, rm -rf $(OUT_DIR)/target/common/obj/JAVA_LIBRARIES/framework_intermediates/src/core/java/android/view/accessibility/IAccessibilityManager.P) +$(call add-clean-step, rm -rf $(OUT_DIR)/target/common/obj/JAVA_LIBRARIES/framework_intermediates/src/core/java/android/accessibilityservice/IAccessibilityServiceClientCallback.java) +$(call add-clean-step, rm -rf $(OUT_DIR)/target/common/obj/JAVA_LIBRARIES/framework_intermediates/src/core/java/android/accessibilityservice/IAccessibilityServiceClientCallback.P) +$(call add-clean-step, rm -rf $(OUT_DIR)/target/common/obj/JAVA_LIBRARIES/framework_intermediates/src/core/java/android/accessibilityservice/IAccessibilityServiceClient.P) # ************************************************ # NEWER CLEAN STEPS MUST BE AT THE END OF THE LIST # ************************************************ diff --git a/api/16.txt b/api/16.txt index ee53bcc347b4..18a4b7b162dc 100644 --- a/api/16.txt +++ b/api/16.txt @@ -593,7 +593,6 @@ package android { field public static final int itemIconDisabledAlpha = 16843057; // 0x1010131 field public static final int itemPadding = 16843565; // 0x101032d field public static final int itemTextAppearance = 16843052; // 0x101012c - field public static final int kcm = 16843691; // 0x10103ab field public static final int keepScreenOn = 16843286; // 0x1010216 field public static final int key = 16843240; // 0x10101e8 field public static final int keyBackground = 16843315; // 0x1010233 @@ -608,6 +607,7 @@ package android { field public static final int keyTextColor = 16843318; // 0x1010236 field public static final int keyTextSize = 16843316; // 0x1010234 field public static final int keyWidth = 16843325; // 0x101023d + field public static final int keyboardLayout = 16843691; // 0x10103ab field public static final int keyboardMode = 16843341; // 0x101024d field public static final int keycode = 16842949; // 0x10100c5 field public static final int killAfterRestore = 16843420; // 0x101029c diff --git a/api/current.txt b/api/current.txt index 635947c0fe5e..8402f31b9cfc 100644 --- a/api/current.txt +++ b/api/current.txt @@ -594,7 +594,6 @@ package android { field public static final int itemIconDisabledAlpha = 16843057; // 0x1010131 field public static final int itemPadding = 16843565; // 0x101032d field public static final int itemTextAppearance = 16843052; // 0x101012c - field public static final int kcm = 16843691; // 0x10103ab field public static final int keepScreenOn = 16843286; // 0x1010216 field public static final int key = 16843240; // 0x10101e8 field public static final int keyBackground = 16843315; // 0x1010233 @@ -609,6 +608,7 @@ package android { field public static final int keyTextColor = 16843318; // 0x1010236 field public static final int keyTextSize = 16843316; // 0x1010234 field public static final int keyWidth = 16843325; // 0x101023d + field public static final int keyboardLayout = 16843691; // 0x10103ab field public static final int keyboardMode = 16843341; // 0x101024d field public static final int keycode = 16842949; // 0x10100c5 field public static final int killAfterRestore = 16843420; // 0x101029c diff --git a/core/java/android/accessibilityservice/AccessibilityService.java b/core/java/android/accessibilityservice/AccessibilityService.java index 850fe4879917..044c0c276221 100644 --- a/core/java/android/accessibilityservice/AccessibilityService.java +++ b/core/java/android/accessibilityservice/AccessibilityService.java @@ -371,7 +371,7 @@ public abstract class AccessibilityService extends Service { * * <strong>Note:</strong> To receive gestures an accessibility service must * request that the device is in touch exploration mode by setting the - * {@link android.accessibilityservice.AccessibilityServiceInfo#FLAG_INCLUDE_NOT_IMPORTANT_VIEWS} + * {@link android.accessibilityservice.AccessibilityServiceInfo#FLAG_REQUEST_TOUCH_EXPLORATION_MODE} * flag. * * @param gestureId The unique id of the performed gesture. @@ -565,10 +565,8 @@ public abstract class AccessibilityService extends Service { mCaller.sendMessage(message); } - public void onGesture(int gestureId, IAccessibilityServiceClientCallback callback, - int interactionId) { - Message message = mCaller.obtainMessageIIO(DO_ON_GESTURE, gestureId, interactionId, - callback); + public void onGesture(int gestureId) { + Message message = mCaller.obtainMessageI(DO_ON_GESTURE, gestureId); mCaller.sendMessage(message); } @@ -601,15 +599,7 @@ public abstract class AccessibilityService extends Service { return; case DO_ON_GESTURE : final int gestureId = message.arg1; - final int interactionId = message.arg2; - IAccessibilityServiceClientCallback callback = - (IAccessibilityServiceClientCallback) message.obj; - final boolean handled = mCallback.onGesture(gestureId); - try { - callback.setGestureResult(gestureId, handled, interactionId); - } catch (RemoteException re) { - Log.e(LOG_TAG, "Error calling back with the gesture resut.", re); - } + mCallback.onGesture(gestureId); return; default : Log.w(LOG_TAG, "Unknown message type " + message.what); diff --git a/core/java/android/accessibilityservice/IAccessibilityServiceClient.aidl b/core/java/android/accessibilityservice/IAccessibilityServiceClient.aidl index 0257aa463dfd..d459fd546264 100644 --- a/core/java/android/accessibilityservice/IAccessibilityServiceClient.aidl +++ b/core/java/android/accessibilityservice/IAccessibilityServiceClient.aidl @@ -16,7 +16,6 @@ package android.accessibilityservice; -import android.accessibilityservice.IAccessibilityServiceClientCallback; import android.accessibilityservice.IAccessibilityServiceConnection; import android.view.accessibility.AccessibilityEvent; @@ -33,5 +32,5 @@ import android.view.accessibility.AccessibilityEvent; void onInterrupt(); - void onGesture(int gesture, in IAccessibilityServiceClientCallback callback, int interactionId); + void onGesture(int gesture); } diff --git a/core/java/android/accessibilityservice/IAccessibilityServiceClientCallback.aidl b/core/java/android/accessibilityservice/IAccessibilityServiceClientCallback.aidl deleted file mode 100644 index 90613981f012..000000000000 --- a/core/java/android/accessibilityservice/IAccessibilityServiceClientCallback.aidl +++ /dev/null @@ -1,30 +0,0 @@ -/* -** 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. -*/ - -package android.accessibilityservice; - -import android.accessibilityservice.IAccessibilityServiceConnection; -import android.view.accessibility.AccessibilityEvent; - -/** - * Callback for IAccessibilityServiceClient. - * - * @hide - */ - oneway interface IAccessibilityServiceClientCallback { - - void setGestureResult(int gestureId, boolean handled, int interactionId); -} diff --git a/core/java/android/content/pm/PackageManager.java b/core/java/android/content/pm/PackageManager.java index a48924e9fa8a..2baad625a9cd 100644 --- a/core/java/android/content/pm/PackageManager.java +++ b/core/java/android/content/pm/PackageManager.java @@ -23,7 +23,6 @@ import android.content.Context; import android.content.Intent; import android.content.IntentFilter; import android.content.IntentSender; -import android.content.pm.ManifestDigest; import android.content.res.Resources; import android.content.res.XmlResourceParser; import android.graphics.drawable.Drawable; @@ -1090,10 +1089,6 @@ public abstract class PackageManager { public static final String EXTRA_VERIFICATION_INSTALL_FLAGS = "android.content.pm.extra.VERIFICATION_INSTALL_FLAGS"; - /** {@hide} */ - // TODO: enable this for userdebug and eng builds; see 6389556 - public static final boolean DEFAULT_ENFORCE_READ_EXTERNAL_STORAGE = false; - /** * Retrieve overall information about an application package that is * installed on the system. diff --git a/core/java/android/database/sqlite/SQLiteGlobal.java b/core/java/android/database/sqlite/SQLiteGlobal.java index 5d8f80eae167..5ff199a75257 100644 --- a/core/java/android/database/sqlite/SQLiteGlobal.java +++ b/core/java/android/database/sqlite/SQLiteGlobal.java @@ -18,6 +18,7 @@ package android.database.sqlite; import android.content.res.Resources; import android.os.StatFs; +import android.os.SystemProperties; /** * Provides access to SQLite functions that affect all database connection, @@ -62,7 +63,7 @@ public final class SQLiteGlobal { if (sDefaultPageSize == 0) { sDefaultPageSize = new StatFs("/data").getBlockSize(); } - return sDefaultPageSize; + return SystemProperties.getInt("debug.sqlite.pagesize", sDefaultPageSize); } } @@ -70,47 +71,55 @@ public final class SQLiteGlobal { * Gets the default journal mode when WAL is not in use. */ public static String getDefaultJournalMode() { - return Resources.getSystem().getString( - com.android.internal.R.string.db_default_journal_mode); + return SystemProperties.get("debug.sqlite.journalmode", + Resources.getSystem().getString( + com.android.internal.R.string.db_default_journal_mode)); } /** * Gets the journal size limit in bytes. */ public static int getJournalSizeLimit() { - return Resources.getSystem().getInteger( - com.android.internal.R.integer.db_journal_size_limit); + return SystemProperties.getInt("debug.sqlite.journalsizelimit", + Resources.getSystem().getInteger( + com.android.internal.R.integer.db_journal_size_limit)); } /** * Gets the default database synchronization mode when WAL is not in use. */ public static String getDefaultSyncMode() { - return Resources.getSystem().getString( - com.android.internal.R.string.db_default_sync_mode); + return SystemProperties.get("debug.sqlite.syncmode", + Resources.getSystem().getString( + com.android.internal.R.string.db_default_sync_mode)); } /** * Gets the database synchronization mode when in WAL mode. */ public static String getWALSyncMode() { - return Resources.getSystem().getString( - com.android.internal.R.string.db_wal_sync_mode); + return SystemProperties.get("debug.sqlite.wal.syncmode", + Resources.getSystem().getString( + com.android.internal.R.string.db_wal_sync_mode)); } /** * Gets the WAL auto-checkpoint integer in database pages. */ public static int getWALAutoCheckpoint() { - return Math.max(1, Resources.getSystem().getInteger( + int value = SystemProperties.getInt("debug.sqlite.wal.autocheckpoint", + Resources.getSystem().getInteger( com.android.internal.R.integer.db_wal_autocheckpoint)); + return Math.max(1, value); } /** * Gets the connection pool size when in WAL mode. */ public static int getWALConnectionPoolSize() { - return Math.max(2, Resources.getSystem().getInteger( + int value = SystemProperties.getInt("debug.sqlite.wal.poolsize", + Resources.getSystem().getInteger( com.android.internal.R.integer.db_connection_pool_size)); + return Math.max(2, value); } } diff --git a/core/java/android/hardware/input/InputManager.java b/core/java/android/hardware/input/InputManager.java index 5ba18507666e..6448b55c6653 100755 --- a/core/java/android/hardware/input/InputManager.java +++ b/core/java/android/hardware/input/InputManager.java @@ -96,14 +96,14 @@ public final class InputManager { * <keyboard-layouts xmlns:android="http://schemas.android.com/apk/res/android"> * <keyboard-layout android:name="keyboard_layout_english_us" * android:label="@string/keyboard_layout_english_us_label" - * android:kcm="@raw/keyboard_layout_english_us" /> + * android:keyboardLayout="@raw/keyboard_layout_english_us" /> * </keyboard-layouts> * </p><p> * The <code>android:name</code> attribute specifies an identifier by which * the keyboard layout will be known in the package. * The <code>android:label</code> attributes specifies a human-readable descriptive * label to describe the keyboard layout in the user interface, such as "English (US)". - * The <code>android:kcm</code> attribute refers to a + * The <code>android:keyboardLayout</code> attribute refers to a * <a href="http://source.android.com/tech/input/key-character-map-files.html"> * key character map</a> resource that defines the keyboard layout. * </p> diff --git a/core/java/android/os/Power.java b/core/java/android/os/Power.java deleted file mode 100644 index 58df940ca6b6..000000000000 --- a/core/java/android/os/Power.java +++ /dev/null @@ -1,109 +0,0 @@ -/* - * Copyright (C) 2007 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package android.os; - -import java.io.IOException; -import android.os.ServiceManager; - -/** - * Class that provides access to some of the power management functions. - * - * {@hide} - */ -public class Power -{ - // can't instantiate this class - private Power() - { - } - - /** - * Wake lock that ensures that the CPU is running. The screen might - * not be on. - */ - public static final int PARTIAL_WAKE_LOCK = 1; - - /** - * Wake lock that ensures that the screen is on. - */ - public static final int FULL_WAKE_LOCK = 2; - - public static native void acquireWakeLock(int lock, String id); - public static native void releaseWakeLock(String id); - - /** - * Brightness value for fully off - */ - public static final int BRIGHTNESS_OFF = 0; - - /** - * Brightness value for dim backlight - */ - public static final int BRIGHTNESS_DIM = 20; - - /** - * Brightness value for fully on - */ - public static final int BRIGHTNESS_ON = 255; - - /** - * Brightness value to use when battery is low - */ - public static final int BRIGHTNESS_LOW_BATTERY = 10; - - /** - * Threshold for BRIGHTNESS_LOW_BATTERY (percentage) - * Screen will stay dim if battery level is <= LOW_BATTERY_THRESHOLD - */ - public static final int LOW_BATTERY_THRESHOLD = 10; - - /** - * Turn the screen on or off - * - * @param on Whether you want the screen on or off - */ - public static native int setScreenState(boolean on); - - public static native int setLastUserActivityTimeout(long ms); - - /** - * Low-level function turn the device off immediately, without trying - * to be clean. Most people should use - * {@link android.internal.app.ShutdownThread} for a clean shutdown. - * - * @deprecated - * @hide - */ - @Deprecated - public static native void shutdown(); - - /** - * Reboot the device. - * @param reason code to pass to the kernel (e.g. "recovery"), or null. - * - * @throws IOException if reboot fails for some reason (eg, lack of - * permission) - */ - public static void reboot(String reason) throws IOException - { - rebootNative(reason); - } - - private static native void rebootNative(String reason) throws IOException ; - - public static native int powerInitNative(); -} diff --git a/core/java/android/os/PowerManager.java b/core/java/android/os/PowerManager.java index 21373ec89715..903c8b3cde12 100644 --- a/core/java/android/os/PowerManager.java +++ b/core/java/android/os/PowerManager.java @@ -197,7 +197,31 @@ public class PowerManager * Does not work with PARTIAL_WAKE_LOCKs. */ public static final int ON_AFTER_RELEASE = 0x20000000; - + + /** + * Brightness value to use when battery is low. + * @hide + */ + public static final int BRIGHTNESS_LOW_BATTERY = 10; + + /** + * Brightness value for fully on. + * @hide + */ + public static final int BRIGHTNESS_ON = 255; + + /** + * Brightness value for dim backlight. + * @hide + */ + public static final int BRIGHTNESS_DIM = 20; + + /** + * Brightness value for fully off. + * @hide + */ + public static final int BRIGHTNESS_OFF = 0; + /** * Class lets you say that you need to have the device on. * <p> diff --git a/core/java/android/os/Trace.java b/core/java/android/os/Trace.java index 911183d496d8..c0240fe1f939 100644 --- a/core/java/android/os/Trace.java +++ b/core/java/android/os/Trace.java @@ -38,6 +38,7 @@ public final class Trace { public static final long TRACE_TAG_ACTIVITY_MANAGER = 1L << 6; public static final long TRACE_TAG_SYNC_MANAGER = 1L << 7; public static final long TRACE_TAG_AUDIO = 1L << 8; + public static final long TRACE_TAG_VIDEO = 1L << 9; public static final int TRACE_FLAGS_START_BIT = 1; public static final String[] TRACE_TAGS = { diff --git a/core/java/android/provider/Settings.java b/core/java/android/provider/Settings.java index 497e66e86305..ea3cab44477c 100644 --- a/core/java/android/provider/Settings.java +++ b/core/java/android/provider/Settings.java @@ -4253,6 +4253,10 @@ public final class Settings { /** Timeout for package verification. {@hide} */ public static final String PACKAGE_VERIFIER_TIMEOUT = "verifier_timeout"; + /** {@hide} */ + public static final String + READ_EXTERNAL_STORAGE_ENFORCED_DEFAULT = "read_external_storage_enforced_default"; + /** * Duration in milliseconds before pre-authorized URIs for the contacts * provider should expire. diff --git a/core/java/android/service/wallpaper/WallpaperService.java b/core/java/android/service/wallpaper/WallpaperService.java index 9d3667766fec..3e0942c5c6e7 100644 --- a/core/java/android/service/wallpaper/WallpaperService.java +++ b/core/java/android/service/wallpaper/WallpaperService.java @@ -154,7 +154,6 @@ public abstract class WallpaperService extends Service { int mCurWindowPrivateFlags = mWindowPrivateFlags; final Rect mVisibleInsets = new Rect(); final Rect mWinFrame = new Rect(); - final Rect mSystemInsets = new Rect(); final Rect mContentInsets = new Rect(); final Configuration mConfiguration = new Configuration(); @@ -254,7 +253,7 @@ public abstract class WallpaperService extends Service { final BaseIWindow mWindow = new BaseIWindow() { @Override - public void resized(int w, int h, Rect systemInsets, Rect contentInsets, + public void resized(int w, int h, Rect contentInsets, Rect visibleInsets, boolean reportDraw, Configuration newConfig) { Message msg = mCaller.obtainMessageI(MSG_WINDOW_RESIZED, reportDraw ? 1 : 0); @@ -621,7 +620,7 @@ public abstract class WallpaperService extends Service { final int relayoutResult = mSession.relayout( mWindow, mWindow.mSeq, mLayout, mWidth, mHeight, - View.VISIBLE, 0, mWinFrame, mSystemInsets, mContentInsets, + View.VISIBLE, 0, mWinFrame, mContentInsets, mVisibleInsets, mConfiguration, mSurfaceHolder.mSurface); if (DEBUG) Log.v(TAG, "New surface: " + mSurfaceHolder.mSurface diff --git a/core/java/android/text/DynamicLayout.java b/core/java/android/text/DynamicLayout.java index dc58ef27280e..d909362357ed 100644 --- a/core/java/android/text/DynamicLayout.java +++ b/core/java/android/text/DynamicLayout.java @@ -35,6 +35,7 @@ import java.lang.ref.WeakReference; public class DynamicLayout extends Layout { private static final int PRIORITY = 128; + private static final int BLOCK_MINIMUM_CHARACTER_LENGTH = 400; /** * Make a layout for the specified text that will be updated as @@ -117,10 +118,6 @@ public class DynamicLayout extends Layout mObjects = new PackedObjectVector<Directions>(1); - mBlockEndLines = new int[] { 0 }; - mBlockIndices = new int[] { INVALID_BLOCK_INDEX }; - mNumberOfBlocks = 1; - mIncludePad = includepad; /* @@ -170,7 +167,6 @@ public class DynamicLayout extends Layout mObjects.insertAt(0, dirs); // Update from 0 characters to whatever the real text is - reflow(base, 0, 0, base.length()); if (base instanceof Spannable) { @@ -295,14 +291,12 @@ public class DynamicLayout extends Layout // the very end of the buffer, then we already have a line that // starts there, so disregard the blank line. - if (where + after != len && - reflowed.getLineStart(n - 1) == where + after) + if (where + after != len && reflowed.getLineStart(n - 1) == where + after) n--; // remove affected lines from old layout mInts.deleteAt(startline, endline - startline); mObjects.deleteAt(startline, endline - startline); - updateBlocks(startline, endline - 1, n); // adjust offsets in layout for new height and offsets @@ -362,6 +356,8 @@ public class DynamicLayout extends Layout mObjects.insertAt(startline + i, objects); } + updateBlocks(startline, endline - 1, n); + synchronized (sLock) { sStaticLayout = reflowed; reflowed.finish(); @@ -369,6 +365,62 @@ public class DynamicLayout extends Layout } /** + * Create the initial block structure, cutting the text into blocks of at least + * BLOCK_MINIMUM_CHARACTER_SIZE characters, aligned on the ends of paragraphs. + */ + private void createBlocks() { + int offset = BLOCK_MINIMUM_CHARACTER_LENGTH; + mNumberOfBlocks = 0; + final CharSequence text = mDisplay; + + while (true) { + offset = TextUtils.indexOf(text, '\n', offset); + if (offset < 0) { + addBlockAtOffset(text.length()); + break; + } else { + addBlockAtOffset(offset); + offset += BLOCK_MINIMUM_CHARACTER_LENGTH; + } + } + + // mBlockIndices and mBlockEndLines should have the same length + mBlockIndices = new int[mBlockEndLines.length]; + for (int i = 0; i < mBlockEndLines.length; i++) { + mBlockIndices[i] = INVALID_BLOCK_INDEX; + } + } + + /** + * Create a new block, ending at the specified character offset. + * A block will actually be created only if has at least one line, i.e. this offset is + * not on the end line of the previous block. + */ + private void addBlockAtOffset(int offset) { + final int line = getLineForOffset(offset); + + if (mBlockEndLines == null) { + // Initial creation of the array, no test on previous block ending line + mBlockEndLines = new int[ArrayUtils.idealIntArraySize(1)]; + mBlockEndLines[mNumberOfBlocks] = line; + mNumberOfBlocks++; + return; + } + + final int previousBlockEndLine = mBlockEndLines[mNumberOfBlocks - 1]; + if (line > previousBlockEndLine) { + if (mNumberOfBlocks == mBlockEndLines.length) { + // Grow the array if needed + int[] blockEndLines = new int[ArrayUtils.idealIntArraySize(mNumberOfBlocks + 1)]; + System.arraycopy(mBlockEndLines, 0, blockEndLines, 0, mNumberOfBlocks); + mBlockEndLines = blockEndLines; + } + mBlockEndLines[mNumberOfBlocks] = line; + mNumberOfBlocks++; + } + } + + /** * This method is called every time the layout is reflowed after an edition. * It updates the internal block data structure. The text is split in blocks * of contiguous lines, with at least one block for the entire text. @@ -388,6 +440,11 @@ public class DynamicLayout extends Layout * @hide */ void updateBlocks(int startLine, int endLine, int newLineCount) { + if (mBlockEndLines == null) { + createBlocks(); + return; + } + int firstBlock = -1; int lastBlock = -1; for (int i = 0; i < mNumberOfBlocks; i++) { diff --git a/core/java/android/view/IWindow.aidl b/core/java/android/view/IWindow.aidl index 555f306d965b..b4caad3d3908 100644 --- a/core/java/android/view/IWindow.aidl +++ b/core/java/android/view/IWindow.aidl @@ -45,7 +45,7 @@ oneway interface IWindow { */ void executeCommand(String command, String parameters, in ParcelFileDescriptor descriptor); - void resized(int w, int h, in Rect systemInsets, in Rect contentInsets, + void resized(int w, int h, in Rect contentInsets, in Rect visibleInsets, boolean reportDraw, in Configuration newConfig); void dispatchAppVisibility(boolean visible); void dispatchGetNewSurface(); diff --git a/core/java/android/view/IWindowSession.aidl b/core/java/android/view/IWindowSession.aidl index f26d5e1d14cf..d4a03ce657e3 100644 --- a/core/java/android/view/IWindowSession.aidl +++ b/core/java/android/view/IWindowSession.aidl @@ -58,10 +58,6 @@ interface IWindowSession { * {@link WindowManagerImpl#RELAYOUT_DEFER_SURFACE_DESTROY}. * @param outFrame Rect in which is placed the new position/size on * screen. - * @param outSystemInsets Rect in which is placed the offsets from - * <var>outFrame</var> over which any core system UI elements are - * currently covering the window. This is not generally used for - * layout, but just to know where the window is obscured. * @param outContentInsets Rect in which is placed the offsets from * <var>outFrame</var> in which the content of the window should be * placed. This can be used to modify the window layout to ensure its @@ -83,7 +79,7 @@ interface IWindowSession { */ int relayout(IWindow window, int seq, in WindowManager.LayoutParams attrs, int requestedWidth, int requestedHeight, int viewVisibility, - int flags, out Rect outFrame, out Rect outSystemInsets, + int flags, out Rect outFrame, out Rect outContentInsets, out Rect outVisibleInsets, out Configuration outConfig, out Surface outSurface); diff --git a/core/java/android/view/Surface.java b/core/java/android/view/Surface.java index 1011d7a1bb53..a9687683a6ed 100644 --- a/core/java/android/view/Surface.java +++ b/core/java/android/view/Surface.java @@ -511,7 +511,7 @@ public class Surface implements Parcelable { /** @hide */ public native void setFlags(int flags, int mask); /** @hide */ - public native void setActiveRect(Rect activeRect); + public native void setWindowCrop(Rect crop); diff --git a/core/java/android/view/SurfaceView.java b/core/java/android/view/SurfaceView.java index ee322f8b773c..f4ca9d2d3f64 100644 --- a/core/java/android/view/SurfaceView.java +++ b/core/java/android/view/SurfaceView.java @@ -98,7 +98,6 @@ public class SurfaceView extends View { MyWindow mWindow; final Rect mVisibleInsets = new Rect(); final Rect mWinFrame = new Rect(); - final Rect mSystemInsets = new Rect(); final Rect mContentInsets = new Rect(); final Configuration mConfiguration = new Configuration(); @@ -472,7 +471,7 @@ public class SurfaceView extends View { mWindow, mWindow.mSeq, mLayout, mWidth, mHeight, visible ? VISIBLE : GONE, WindowManagerImpl.RELAYOUT_DEFER_SURFACE_DESTROY, - mWinFrame, mSystemInsets, mContentInsets, + mWinFrame, mContentInsets, mVisibleInsets, mConfiguration, mNewSurface); if ((relayoutResult&WindowManagerImpl.RELAYOUT_RES_FIRST_TIME) != 0) { mReportDrawNeeded = true; @@ -606,7 +605,7 @@ public class SurfaceView extends View { mSurfaceView = new WeakReference<SurfaceView>(surfaceView); } - public void resized(int w, int h, Rect systemInsets, Rect contentInsets, + public void resized(int w, int h, Rect contentInsets, Rect visibleInsets, boolean reportDraw, Configuration newConfig) { SurfaceView surfaceView = mSurfaceView.get(); if (surfaceView != null) { diff --git a/core/java/android/view/VelocityTracker.java b/core/java/android/view/VelocityTracker.java index 1c35e31d4526..f703e34e93ad 100644 --- a/core/java/android/view/VelocityTracker.java +++ b/core/java/android/view/VelocityTracker.java @@ -298,6 +298,24 @@ public final class VelocityTracker implements Poolable<VelocityTracker> { return estimate(time, yCoeff); } + /** + * Gets the X coefficient with the specified index. + * @param index The index of the coefficient to return. + * @return The X coefficient, or 0 if the index is greater than the degree. + */ + public float getXCoeff(int index) { + return index <= degree ? xCoeff[index] : 0; + } + + /** + * Gets the Y coefficient with the specified index. + * @param index The index of the coefficient to return. + * @return The Y coefficient, or 0 if the index is greater than the degree. + */ + public float getYCoeff(int index) { + return index <= degree ? yCoeff[index] : 0; + } + private float estimate(float time, float[] c) { float a = 0; float scale = 1; diff --git a/core/java/android/view/View.java b/core/java/android/view/View.java index b4478bf972ef..501cf29cc4c4 100644 --- a/core/java/android/view/View.java +++ b/core/java/android/view/View.java @@ -666,7 +666,7 @@ public class View implements Drawable.Callback, Drawable.Callback2, KeyEvent.Cal protected static final String VIEW_LOG_TAG = "View"; /** - * When set to true, apps will draw debugging information about their layouts. + * When set to true, apps will draw debugging information about their layouts. * * @hide */ @@ -2135,6 +2135,13 @@ public class View implements Drawable.Callback, Drawable.Callback2, KeyEvent.Cal */ static final int VIEW_IS_ANIMATING_TRANSFORM = 0x10000000; + /** + * Flag indicating whether a view failed the quickReject() check in draw(). This condition + * is used to check whether later changes to the view's transform should invalidate the + * view to force the quickReject test to run again. + */ + static final int VIEW_QUICK_REJECTED = 0x20000000; + /* End of masks for mPrivateFlags2 */ static final int DRAG_MASK = DRAG_CAN_ACCEPT | DRAG_HOVERED; @@ -4794,17 +4801,46 @@ public class View implements Drawable.Callback, Drawable.Callback2, KeyEvent.Cal * entirely by its predecessors, and has an alpha greater than zero. * * @return Whether the view is visible on the screen. + * + * @hide */ - private boolean isVisibleToUser() { + protected boolean isVisibleToUser() { + return isVisibleToUser(null); + } + + /** + * Computes whether the given portion of this view is visible to the user. Such a view is + * attached, visible, all its predecessors are visible, has an alpha greater than zero, and + * the specified portion is not clipped entirely by its predecessors. + * + * @param boundInView the portion of the view to test; coordinates should be relative; may be + * <code>null</code>, and the entire view will be tested in this case. + * When <code>true</code> is returned by the function, the actual visible + * region will be stored in this parameter; that is, if boundInView is fully + * contained within the view, no modification will be made, otherwise regions + * outside of the visible area of the view will be clipped. + * + * @return Whether the specified portion of the view is visible on the screen. + * + * @hide + */ + protected boolean isVisibleToUser(Rect boundInView) { + Rect visibleRect = mAttachInfo.mTmpInvalRect; + Point offset = mAttachInfo.mPoint; // The first two checks are made also made by isShown() which // however traverses the tree up to the parent to catch that. // Therefore, we do some fail fast check to minimize the up // tree traversal. - return (mAttachInfo != null - && mAttachInfo.mWindowVisibility == View.VISIBLE - && getAlpha() > 0 - && isShown() - && getGlobalVisibleRect(mAttachInfo.mTmpInvalRect)); + boolean isVisible = mAttachInfo != null + && mAttachInfo.mWindowVisibility == View.VISIBLE + && getAlpha() > 0 + && isShown() + && getGlobalVisibleRect(visibleRect, offset); + if (isVisible && boundInView != null) { + visibleRect.offset(-offset.x, -offset.y); + isVisible &= boundInView.intersect(visibleRect); + } + return isVisible; } /** @@ -5577,7 +5613,7 @@ public class View implements Drawable.Callback, Drawable.Callback2, KeyEvent.Cal "unmatched pair of setHasTransientState calls"); } if ((hasTransientState && mTransientStateCount == 1) || - (hasTransientState && mTransientStateCount == 0)) { + (!hasTransientState && mTransientStateCount == 0)) { // update flag if we've just incremented up from 0 or decremented down to 0 mPrivateFlags2 = (mPrivateFlags2 & ~HAS_TRANSIENT_STATE) | (hasTransientState ? HAS_TRANSIENT_STATE : 0); @@ -8567,6 +8603,10 @@ public class View implements Drawable.Callback, Drawable.Callback2, KeyEvent.Cal if (mDisplayList != null) { mDisplayList.setCameraDistance(-Math.abs(distance) / dpi); } + if ((mPrivateFlags2 & VIEW_QUICK_REJECTED) == VIEW_QUICK_REJECTED) { + // View was rejected last time it was drawn by its parent; this may have changed + invalidateParentIfNeeded(); + } } /** @@ -8609,6 +8649,10 @@ public class View implements Drawable.Callback, Drawable.Callback2, KeyEvent.Cal if (mDisplayList != null) { mDisplayList.setRotation(rotation); } + if ((mPrivateFlags2 & VIEW_QUICK_REJECTED) == VIEW_QUICK_REJECTED) { + // View was rejected last time it was drawn by its parent; this may have changed + invalidateParentIfNeeded(); + } } } @@ -8656,6 +8700,10 @@ public class View implements Drawable.Callback, Drawable.Callback2, KeyEvent.Cal if (mDisplayList != null) { mDisplayList.setRotationY(rotationY); } + if ((mPrivateFlags2 & VIEW_QUICK_REJECTED) == VIEW_QUICK_REJECTED) { + // View was rejected last time it was drawn by its parent; this may have changed + invalidateParentIfNeeded(); + } } } @@ -8703,6 +8751,10 @@ public class View implements Drawable.Callback, Drawable.Callback2, KeyEvent.Cal if (mDisplayList != null) { mDisplayList.setRotationX(rotationX); } + if ((mPrivateFlags2 & VIEW_QUICK_REJECTED) == VIEW_QUICK_REJECTED) { + // View was rejected last time it was drawn by its parent; this may have changed + invalidateParentIfNeeded(); + } } } @@ -8742,6 +8794,10 @@ public class View implements Drawable.Callback, Drawable.Callback2, KeyEvent.Cal if (mDisplayList != null) { mDisplayList.setScaleX(scaleX); } + if ((mPrivateFlags2 & VIEW_QUICK_REJECTED) == VIEW_QUICK_REJECTED) { + // View was rejected last time it was drawn by its parent; this may have changed + invalidateParentIfNeeded(); + } } } @@ -8781,6 +8837,10 @@ public class View implements Drawable.Callback, Drawable.Callback2, KeyEvent.Cal if (mDisplayList != null) { mDisplayList.setScaleY(scaleY); } + if ((mPrivateFlags2 & VIEW_QUICK_REJECTED) == VIEW_QUICK_REJECTED) { + // View was rejected last time it was drawn by its parent; this may have changed + invalidateParentIfNeeded(); + } } } @@ -8828,6 +8888,10 @@ public class View implements Drawable.Callback, Drawable.Callback2, KeyEvent.Cal if (mDisplayList != null) { mDisplayList.setPivotX(pivotX); } + if ((mPrivateFlags2 & VIEW_QUICK_REJECTED) == VIEW_QUICK_REJECTED) { + // View was rejected last time it was drawn by its parent; this may have changed + invalidateParentIfNeeded(); + } } } @@ -8874,6 +8938,10 @@ public class View implements Drawable.Callback, Drawable.Callback2, KeyEvent.Cal if (mDisplayList != null) { mDisplayList.setPivotY(pivotY); } + if ((mPrivateFlags2 & VIEW_QUICK_REJECTED) == VIEW_QUICK_REJECTED) { + // View was rejected last time it was drawn by its parent; this may have changed + invalidateParentIfNeeded(); + } } } @@ -9032,6 +9100,10 @@ public class View implements Drawable.Callback, Drawable.Callback2, KeyEvent.Cal } mBackgroundSizeChanged = true; invalidateParentIfNeeded(); + if ((mPrivateFlags2 & VIEW_QUICK_REJECTED) == VIEW_QUICK_REJECTED) { + // View was rejected last time it was drawn by its parent; this may have changed + invalidateParentIfNeeded(); + } } } @@ -9101,6 +9173,10 @@ public class View implements Drawable.Callback, Drawable.Callback2, KeyEvent.Cal } mBackgroundSizeChanged = true; invalidateParentIfNeeded(); + if ((mPrivateFlags2 & VIEW_QUICK_REJECTED) == VIEW_QUICK_REJECTED) { + // View was rejected last time it was drawn by its parent; this may have changed + invalidateParentIfNeeded(); + } } } @@ -9164,6 +9240,10 @@ public class View implements Drawable.Callback, Drawable.Callback2, KeyEvent.Cal } mBackgroundSizeChanged = true; invalidateParentIfNeeded(); + if ((mPrivateFlags2 & VIEW_QUICK_REJECTED) == VIEW_QUICK_REJECTED) { + // View was rejected last time it was drawn by its parent; this may have changed + invalidateParentIfNeeded(); + } } } @@ -9224,6 +9304,10 @@ public class View implements Drawable.Callback, Drawable.Callback2, KeyEvent.Cal } mBackgroundSizeChanged = true; invalidateParentIfNeeded(); + if ((mPrivateFlags2 & VIEW_QUICK_REJECTED) == VIEW_QUICK_REJECTED) { + // View was rejected last time it was drawn by its parent; this may have changed + invalidateParentIfNeeded(); + } } } @@ -9308,6 +9392,10 @@ public class View implements Drawable.Callback, Drawable.Callback2, KeyEvent.Cal if (mDisplayList != null) { mDisplayList.setTranslationX(translationX); } + if ((mPrivateFlags2 & VIEW_QUICK_REJECTED) == VIEW_QUICK_REJECTED) { + // View was rejected last time it was drawn by its parent; this may have changed + invalidateParentIfNeeded(); + } } } @@ -9345,6 +9433,10 @@ public class View implements Drawable.Callback, Drawable.Callback2, KeyEvent.Cal if (mDisplayList != null) { mDisplayList.setTranslationY(translationY); } + if ((mPrivateFlags2 & VIEW_QUICK_REJECTED) == VIEW_QUICK_REJECTED) { + // View was rejected last time it was drawn by its parent; this may have changed + invalidateParentIfNeeded(); + } } } @@ -12816,8 +12908,10 @@ public class View implements Drawable.Callback, Drawable.Callback2, KeyEvent.Cal if (!concatMatrix && canvas.quickReject(mLeft, mTop, mRight, mBottom, Canvas.EdgeType.BW) && (mPrivateFlags & DRAW_ANIMATION) == 0) { + mPrivateFlags2 |= VIEW_QUICK_REJECTED; return more; } + mPrivateFlags2 &= ~VIEW_QUICK_REJECTED; if (hardwareAccelerated) { // Clear INVALIDATED flag to allow invalidation to occur during rendering, but @@ -17096,12 +17190,6 @@ public class View implements Drawable.Callback, Drawable.Callback2, KeyEvent.Cal boolean mUse32BitDrawingCache; /** - * Describes the parts of the window that are currently completely - * obscured by system UI elements. - */ - final Rect mSystemInsets = new Rect(); - - /** * For windows that are full-screen but using insets to layout inside * of the screen decorations, these are the current insets for the * content of the window. diff --git a/core/java/android/view/ViewRootImpl.java b/core/java/android/view/ViewRootImpl.java index 1fcb2c3561d2..90e6034da65e 100644 --- a/core/java/android/view/ViewRootImpl.java +++ b/core/java/android/view/ViewRootImpl.java @@ -262,8 +262,6 @@ public final class ViewRootImpl implements ViewParent, final Rect mPendingVisibleInsets = new Rect(); final Rect mPendingContentInsets = new Rect(); - final Rect mPendingSystemInsets = new Rect(); - final Rect mActiveRect = new Rect(); final ViewTreeObserver.InternalInsetsInfo mLastGivenInsets = new ViewTreeObserver.InternalInsetsInfo(); @@ -273,7 +271,6 @@ public final class ViewRootImpl implements ViewParent, final Configuration mPendingConfiguration = new Configuration(); class ResizedInfo { - Rect systemInsets; Rect contentInsets; Rect visibleInsets; Configuration newConfig; @@ -569,7 +566,6 @@ public final class ViewRootImpl implements ViewParent, if (mTranslator != null) { mTranslator.translateRectInScreenToAppWindow(mAttachInfo.mContentInsets); } - mPendingSystemInsets.set(0, 0, 0, 0); mPendingContentInsets.set(mAttachInfo.mContentInsets); mPendingVisibleInsets.set(0, 0, 0, 0); if (DEBUG_LAYOUT) Log.v(TAG, "Added window " + mWindow); @@ -1236,7 +1232,6 @@ public final class ViewRootImpl implements ViewParent, getRunQueue().executeActions(attachInfo.mHandler); boolean insetsChanged = false; - boolean activeRectChanged = false; boolean layoutRequested = mLayoutRequested && !mStopped; if (layoutRequested) { @@ -1248,12 +1243,7 @@ public final class ViewRootImpl implements ViewParent, // to opposite of the added touch mode. mAttachInfo.mInTouchMode = !mAddedTouchMode; ensureTouchModeLocally(mAddedTouchMode); - activeRectChanged = true; } else { - if (!mPendingSystemInsets.equals(mAttachInfo.mSystemInsets)) { - mAttachInfo.mSystemInsets.set(mPendingSystemInsets); - activeRectChanged = true; - } if (!mPendingContentInsets.equals(mAttachInfo.mContentInsets)) { insetsChanged = true; } @@ -1407,10 +1397,6 @@ public final class ViewRootImpl implements ViewParent, mPendingConfiguration.seq = 0; } - if (!mPendingSystemInsets.equals(mAttachInfo.mSystemInsets)) { - activeRectChanged = true; - mAttachInfo.mSystemInsets.set(mPendingSystemInsets); - } contentInsetsChanged = !mPendingContentInsets.equals( mAttachInfo.mContentInsets); visibleInsetsChanged = !mPendingVisibleInsets.equals( @@ -1513,7 +1499,6 @@ public final class ViewRootImpl implements ViewParent, // before actually drawing them, so it can display then // all at once. newSurface = true; - activeRectChanged = true; mFullRedrawNeeded = true; mPreviousTransparentRegion.setEmpty(); @@ -1579,7 +1564,6 @@ public final class ViewRootImpl implements ViewParent, // window size we asked for. We should avoid this by getting a maximum size from // the window session beforehand. if (mWidth != frame.width() || mHeight != frame.height()) { - activeRectChanged = true; mWidth = frame.width(); mHeight = frame.height(); } @@ -1698,14 +1682,6 @@ public final class ViewRootImpl implements ViewParent, } } - if (activeRectChanged && mSurface.isValid()) { - mActiveRect.set(attachInfo.mSystemInsets.left, attachInfo.mSystemInsets.top, - mWidth - attachInfo.mSystemInsets.right, - mHeight - attachInfo.mSystemInsets.bottom); - //Log.i(TAG, "Active rect " + mWindowAttributes.getTitle() + ": " + mActiveRect); - mSurface.setActiveRect(mActiveRect); - } - final boolean didLayout = layoutRequested && !mStopped; boolean triggerGlobalLayoutListener = didLayout || attachInfo.mRecomputeGlobalAttributes; @@ -2823,7 +2799,6 @@ public final class ViewRootImpl implements ViewParent, ResizedInfo ri = (ResizedInfo)msg.obj; if (mWinFrame.width() == msg.arg1 && mWinFrame.height() == msg.arg2 - && mPendingSystemInsets.equals(ri.systemInsets) && mPendingContentInsets.equals(ri.contentInsets) && mPendingVisibleInsets.equals(ri.visibleInsets) && ((ResizedInfo)msg.obj).newConfig == null) { @@ -2840,7 +2815,6 @@ public final class ViewRootImpl implements ViewParent, mWinFrame.right = msg.arg1; mWinFrame.top = 0; mWinFrame.bottom = msg.arg2; - mPendingSystemInsets.set(((ResizedInfo)msg.obj).systemInsets); mPendingContentInsets.set(((ResizedInfo)msg.obj).contentInsets); mPendingVisibleInsets.set(((ResizedInfo)msg.obj).visibleInsets); if (msg.what == MSG_RESIZED_REPORT) { @@ -3875,7 +3849,7 @@ public final class ViewRootImpl implements ViewParent, (int) (mView.getMeasuredWidth() * appScale + 0.5f), (int) (mView.getMeasuredHeight() * appScale + 0.5f), viewVisibility, insetsPending ? WindowManagerImpl.RELAYOUT_INSETS_PENDING : 0, - mWinFrame, mPendingSystemInsets, mPendingContentInsets, mPendingVisibleInsets, + mWinFrame, mPendingContentInsets, mPendingVisibleInsets, mPendingConfiguration, mSurface); //Log.d(TAG, "<<<<<< BACK FROM relayout"); if (restore) { @@ -4071,11 +4045,10 @@ public final class ViewRootImpl implements ViewParent, mHandler.sendMessage(msg); } - public void dispatchResized(int w, int h, Rect systemInsets, Rect contentInsets, + public void dispatchResized(int w, int h, Rect contentInsets, Rect visibleInsets, boolean reportDraw, Configuration newConfig) { if (DEBUG_LAYOUT) Log.v(TAG, "Resizing " + this + ": w=" + w - + " h=" + h + " systemInsets=" + systemInsets.toShortString() - + " contentInsets=" + contentInsets.toShortString() + + " h=" + h + " contentInsets=" + contentInsets.toShortString() + " visibleInsets=" + visibleInsets.toShortString() + " reportDraw=" + reportDraw); Message msg = mHandler.obtainMessage(reportDraw ? MSG_RESIZED_REPORT :MSG_RESIZED); @@ -4088,7 +4061,6 @@ public final class ViewRootImpl implements ViewParent, msg.arg1 = w; msg.arg2 = h; ResizedInfo ri = new ResizedInfo(); - ri.systemInsets = new Rect(systemInsets); ri.contentInsets = new Rect(contentInsets); ri.visibleInsets = new Rect(visibleInsets); ri.newConfig = newConfig; @@ -4744,11 +4716,11 @@ public final class ViewRootImpl implements ViewParent, mViewAncestor = new WeakReference<ViewRootImpl>(viewAncestor); } - public void resized(int w, int h, Rect systemInsets, Rect contentInsets, + public void resized(int w, int h, Rect contentInsets, Rect visibleInsets, boolean reportDraw, Configuration newConfig) { final ViewRootImpl viewAncestor = mViewAncestor.get(); if (viewAncestor != null) { - viewAncestor.dispatchResized(w, h, systemInsets, contentInsets, + viewAncestor.dispatchResized(w, h, contentInsets, visibleInsets, reportDraw, newConfig); } } diff --git a/core/java/android/view/WindowManagerPolicy.java b/core/java/android/view/WindowManagerPolicy.java index 388cfb3f5e87..0c5d6ea8e904 100644 --- a/core/java/android/view/WindowManagerPolicy.java +++ b/core/java/android/view/WindowManagerPolicy.java @@ -145,10 +145,6 @@ public interface WindowManagerPolicy { * @param displayFrame The frame of the overall display in which this * window can appear, used for constraining the overall dimensions * of the window. - * @param systemFrame The frame within the display that any system - * elements are currently covering. These indicate which parts of - * the window should be considered completely obscured by the screen - * decorations. * @param contentFrame The frame within the display in which we would * like active content to appear. This will cause windows behind to * be resized to match the given content frame. @@ -160,7 +156,7 @@ public interface WindowManagerPolicy { * are visible. */ public void computeFrameLw(Rect parentFrame, Rect displayFrame, - Rect systemFrame, Rect contentFrame, Rect visibleFrame); + Rect contentFrame, Rect visibleFrame); /** * Retrieve the current frame of the window that has been assigned by @@ -188,14 +184,6 @@ public interface WindowManagerPolicy { public Rect getDisplayFrameLw(); /** - * Retrieve the frame of the system elements that last covered the window. - * Must be called with the window manager lock held. - * - * @return Rect The rectangle holding the system frame. - */ - public Rect getSystemFrameLw(); - - /** * Retrieve the frame of the content area that this window was last * laid out in. This is the area in which the content of the window * should be placed. It will be smaller than the display frame to @@ -397,6 +385,9 @@ public interface WindowManagerPolicy { * Creates an input channel that will receive all input from the input dispatcher. */ public InputChannel monitorInput(String name); + + public void shutdown(); + public void rebootSafeMode(); } /** @@ -770,6 +761,21 @@ public interface WindowManagerPolicy { public void beginLayoutLw(int displayWidth, int displayHeight, int displayRotation); /** + * Return the rectangle of the screen currently covered by system decorations. + * This will be called immediately after {@link #layoutWindowLw}. It can + * fill in the rectangle to indicate any part of the screen that it knows + * for sure is covered by system decor such as the status bar. The rectangle + * is initially set to the actual size of the screen, indicating nothing is + * covered. + * + * @param systemRect The rectangle of the screen that is not covered by + * system decoration. + * @return Returns the layer above which the system rectangle should + * not be applied. + */ + public int getSystemDecorRectLw(Rect systemRect); + + /** * Called for each window attached to the window manager as layout is * proceeding. The implementation of this function must take care of * setting the window's frame, either here or in finishLayout(). @@ -794,7 +800,7 @@ public interface WindowManagerPolicy { * */ public void getContentInsetHintLw(WindowManager.LayoutParams attrs, Rect contentInset); - + /** * Called when layout of the windows is finished. After this function has * returned, all windows given to layoutWindow() <em>must</em> have had a diff --git a/core/java/android/webkit/HTML5VideoFullScreen.java b/core/java/android/webkit/HTML5VideoFullScreen.java index ea8f316a814f..62bc502b79e2 100644 --- a/core/java/android/webkit/HTML5VideoFullScreen.java +++ b/core/java/android/webkit/HTML5VideoFullScreen.java @@ -323,7 +323,9 @@ public class HTML5VideoFullScreen extends HTML5VideoView @Override public void showControllerInFullScreen() { - mMediaController.show(0); + if (mMediaController != null) { + mMediaController.show(0); + } } // Other listeners functions: diff --git a/core/java/android/webkit/WebViewClassic.java b/core/java/android/webkit/WebViewClassic.java index 057c3d15197c..eb6b7e3fdbc3 100644 --- a/core/java/android/webkit/WebViewClassic.java +++ b/core/java/android/webkit/WebViewClassic.java @@ -7452,18 +7452,12 @@ public final class WebViewClassic implements WebViewProvider, WebViewProvider.Sc case SHOW_RECT_MSG_ID: { WebViewCore.ShowRectData data = (WebViewCore.ShowRectData) msg.obj; - int x = getScrollX(); int left = contentToViewX(data.mLeft); int width = contentToViewDimension(data.mWidth); int maxWidth = contentToViewDimension(data.mContentWidth); int viewWidth = getViewWidth(); - if (width < viewWidth) { - // center align - x += left + width / 2 - getScrollX() - viewWidth / 2; - } else { - x += (int) (left + data.mXPercentInDoc * width - - getScrollX() - data.mXPercentInView * viewWidth); - } + int x = (int) (left + data.mXPercentInDoc * width - + data.mXPercentInView * viewWidth); if (DebugFlags.WEB_VIEW) { Log.v(LOGTAG, "showRectMsg=(left=" + left + ",width=" + width + ",maxWidth=" + maxWidth + diff --git a/core/java/android/webkit/WebViewInputDispatcher.java b/core/java/android/webkit/WebViewInputDispatcher.java index 95414359f372..9328d8c04010 100644 --- a/core/java/android/webkit/WebViewInputDispatcher.java +++ b/core/java/android/webkit/WebViewInputDispatcher.java @@ -334,6 +334,7 @@ final class WebViewInputDispatcher { DispatchEvent d = obtainDispatchEventLocked(eventToEnqueue, eventType, 0, webKitXOffset, webKitYOffset, webKitScale); + updateStateTrackersLocked(d, event); enqueueEventLocked(d); } return true; @@ -787,7 +788,6 @@ final class WebViewInputDispatcher { flags = d.mFlags; - updateStateTrackersLocked(d, event); if (event == d.mEvent) { d.mEvent = null; // retain ownership of event, don't recycle it yet } diff --git a/core/java/android/widget/AbsListView.java b/core/java/android/widget/AbsListView.java index c4e1bf5391d7..3b4ec7dfaf07 100644 --- a/core/java/android/widget/AbsListView.java +++ b/core/java/android/widget/AbsListView.java @@ -6317,6 +6317,7 @@ public abstract class AbsListView extends AdapterView<ListAdapter> implements Te if (mTransientStateViews == null) { mTransientStateViews = new SparseArray<View>(); } + scrap.dispatchStartTemporaryDetach(); mTransientStateViews.put(position, scrap); } return; diff --git a/core/java/android/widget/Editor.java b/core/java/android/widget/Editor.java index 4b7ec9ab2c3e..16490e8a0c01 100644 --- a/core/java/android/widget/Editor.java +++ b/core/java/android/widget/Editor.java @@ -16,6 +16,9 @@ package android.widget; +import com.android.internal.util.ArrayUtils; +import com.android.internal.widget.EditableInputConnection; + import android.R; import android.content.ClipData; import android.content.ClipData.Item; @@ -70,10 +73,10 @@ import android.view.Menu; import android.view.MenuItem; import android.view.MotionEvent; import android.view.View; -import android.view.ViewConfiguration; -import android.view.ViewGroup; import android.view.View.DragShadowBuilder; import android.view.View.OnClickListener; +import android.view.ViewConfiguration; +import android.view.ViewGroup; import android.view.ViewGroup.LayoutParams; import android.view.ViewParent; import android.view.ViewTreeObserver; @@ -85,12 +88,12 @@ import android.view.inputmethod.ExtractedTextRequest; import android.view.inputmethod.InputConnection; import android.view.inputmethod.InputMethodManager; import android.widget.AdapterView.OnItemClickListener; +import android.widget.Editor.InputContentType; +import android.widget.Editor.InputMethodState; +import android.widget.Editor.SelectionModifierCursorController; import android.widget.TextView.Drawables; import android.widget.TextView.OnEditorActionListener; -import com.android.internal.util.ArrayUtils; -import com.android.internal.widget.EditableInputConnection; - import java.text.BreakIterator; import java.util.Arrays; import java.util.Comparator; @@ -102,6 +105,8 @@ import java.util.HashMap; * @hide */ public class Editor { + private static final String TAG = "Editor"; + static final int BLINK = 500; private static final float[] TEMP_POSITION = new float[2]; private static int DRAG_SHADOW_MAX_TEXT_LENGTH = 20; @@ -151,6 +156,8 @@ public class Editor { boolean mInBatchEditControllers; boolean mShowSoftInputOnFocus = true; + boolean mPreserveDetachedSelection; + boolean mTemporaryDetach; SuggestionsPopupWindow mSuggestionsPopupWindow; SuggestionRangeSpan mSuggestionRangeSpan; @@ -190,6 +197,7 @@ public class Editor { showError(); mShowErrorAfterAttach = false; } + mTemporaryDetach = false; final ViewTreeObserver observer = mTextView.getViewTreeObserver(); // No need to create the controller. @@ -198,10 +206,22 @@ public class Editor { observer.addOnTouchModeChangeListener(mInsertionPointCursorController); } if (mSelectionModifierCursorController != null) { + mSelectionModifierCursorController.resetTouchOffsets(); observer.addOnTouchModeChangeListener(mSelectionModifierCursorController); } updateSpellCheckSpans(0, mTextView.getText().length(), true /* create the spell checker if needed */); + + if (mTextView.hasTransientState() && + mTextView.getSelectionStart() != mTextView.getSelectionEnd()) { + // Since transient state is reference counted make sure it stays matched + // with our own calls to it for managing selection. + // The action mode callback will set this back again when/if the action mode starts. + mTextView.setHasTransientState(false); + + // We had an active selection from before, start the selection mode. + startSelectionActionMode(); + } } void onDetachedFromWindow() { @@ -234,7 +254,10 @@ public class Editor { mSpellChecker = null; } + mPreserveDetachedSelection = true; hideControllers(); + mPreserveDetachedSelection = false; + mTemporaryDetach = false; } private void showError() { @@ -877,7 +900,9 @@ public class Editor { hideControllers(); Selection.setSelection((Spannable) mTextView.getText(), selStart, selEnd); } else { + if (mTemporaryDetach) mPreserveDetachedSelection = true; hideControllers(); + if (mTemporaryDetach) mPreserveDetachedSelection = false; downgradeEasyCorrectionSpans(); } @@ -2679,6 +2704,7 @@ public class Editor { if (menu.hasVisibleItems() || mode.getCustomView() != null) { getSelectionController().show(); + mTextView.setHasTransientState(true); return true; } else { return false; @@ -2707,7 +2733,17 @@ public class Editor { if (mCustomSelectionActionModeCallback != null) { mCustomSelectionActionModeCallback.onDestroyActionMode(mode); } - Selection.setSelection((Spannable) mTextView.getText(), mTextView.getSelectionEnd()); + + /* + * If we're ending this mode because we're detaching from a window, + * we still have selection state to preserve. Don't clear it, we'll + * bring back the selection mode when (if) we get reattached. + */ + if (!mPreserveDetachedSelection) { + Selection.setSelection((Spannable) mTextView.getText(), + mTextView.getSelectionEnd()); + mTextView.setHasTransientState(false); + } if (mSelectionModifierCursorController != null) { mSelectionModifierCursorController.hide(); diff --git a/core/java/android/widget/NumberPicker.java b/core/java/android/widget/NumberPicker.java index 6ff924b23d87..7c809b3d2b30 100644 --- a/core/java/android/widget/NumberPicker.java +++ b/core/java/android/widget/NumberPicker.java @@ -2239,20 +2239,17 @@ public class NumberPicker extends LinearLayout { 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.setVisibleToUser(isVisibleToUser(boundsInParent)); 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; @@ -2261,19 +2258,22 @@ public class NumberPicker extends LinearLayout { private AccessibilityNodeInfo createAccessibilityNodeInfoForNumberPicker(int left, int top, int right, int bottom) { AccessibilityNodeInfo info = AccessibilityNodeInfo.obtain(); - info.setClassName(Button.class.getName()); + info.setClassName(NumberPicker.class.getName()); info.setPackageName(mContext.getPackageName()); info.setSource(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.setParent((View) getParent()); info.setEnabled(NumberPicker.this.isEnabled()); info.setScrollable(true); Rect boundsInParent = mTempRect; boundsInParent.set(left, top, right, bottom); info.setBoundsInParent(boundsInParent); + info.setVisibleToUser(isVisibleToUser()); Rect boundsInScreen = boundsInParent; int[] locationOnScreen = mTempArray; getLocationOnScreen(locationOnScreen); - boundsInScreen.offsetTo(0, 0); boundsInScreen.offset(locationOnScreen[0], locationOnScreen[1]); info.setBoundsInScreen(boundsInScreen); return info; diff --git a/core/java/android/widget/TextView.java b/core/java/android/widget/TextView.java index 098a034b2e64..56eca01fb00b 100644 --- a/core/java/android/widget/TextView.java +++ b/core/java/android/widget/TextView.java @@ -7257,10 +7257,9 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener // usually because this instance is an editable field in a list if (!mDispatchTemporaryDetach) mTemporaryDetach = true; - // Because of View recycling in ListView, there is no easy way to know when a TextView with - // selection becomes visible again. Until a better solution is found, stop text selection - // mode (if any) as soon as this TextView is recycled. - if (mEditor != null) mEditor.hideControllers(); + // Tell the editor that we are temporarily detached. It can use this to preserve + // selection state as needed. + if (mEditor != null) mEditor.mTemporaryDetach = true; } @Override @@ -7269,6 +7268,7 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener // Only track when onStartTemporaryDetach() is called directly, // usually because this instance is an editable field in a list if (!mDispatchTemporaryDetach) mTemporaryDetach = false; + if (mEditor != null) mEditor.mTemporaryDetach = false; } @Override diff --git a/core/java/com/android/internal/view/BaseIWindow.java b/core/java/com/android/internal/view/BaseIWindow.java index fbed4859f0e4..4c34d73307d0 100644 --- a/core/java/com/android/internal/view/BaseIWindow.java +++ b/core/java/com/android/internal/view/BaseIWindow.java @@ -33,7 +33,7 @@ public class BaseIWindow extends IWindow.Stub { mSession = session; } - public void resized(int w, int h, Rect systemInsets, Rect contentInsets, + public void resized(int w, int h, Rect contentInsets, Rect visibleInsets, boolean reportDraw, Configuration newConfig) { if (reportDraw) { try { diff --git a/core/java/com/android/internal/widget/multiwaveview/MultiWaveView.java b/core/java/com/android/internal/widget/multiwaveview/MultiWaveView.java index 1fb60416c92c..60cd8956ca78 100644 --- a/core/java/com/android/internal/widget/multiwaveview/MultiWaveView.java +++ b/core/java/com/android/internal/widget/multiwaveview/MultiWaveView.java @@ -181,23 +181,37 @@ public class MultiWaveView extends View { mAlwaysTrackFinger = a.getBoolean(R.styleable.MultiWaveView_alwaysTrackFinger, false); mGravity = a.getInt(R.styleable.MultiWaveView_gravity, Gravity.TOP); - // Read chevron animation drawables - final int chevrons[] = { R.styleable.MultiWaveView_leftChevronDrawable, - R.styleable.MultiWaveView_rightChevronDrawable, - R.styleable.MultiWaveView_topChevronDrawable, - R.styleable.MultiWaveView_bottomChevronDrawable - }; - - for (int chevron : chevrons) { - TypedValue typedValue = a.peekValue(chevron); - for (int i = 0; i < mFeedbackCount; i++) { - mChevronDrawables.add( - typedValue != null ? new TargetDrawable(res, typedValue.resourceId) : null); + // Read array of chevron drawables + TypedValue outValue = new TypedValue(); + if (a.getValue(R.styleable.MultiWaveView_chevronDrawables, outValue)) { + ArrayList<TargetDrawable> chevrons = loadDrawableArray(outValue.resourceId); + for (int i = 0; i < chevrons.size(); i++) { + final TargetDrawable chevron = chevrons.get(i); + for (int k = 0; k < mFeedbackCount; k++) { + mChevronDrawables.add(chevron == null ? null : new TargetDrawable(chevron)); + } + } + } + + // Support old-style chevron specification if new specification not found + if (mChevronDrawables.size() == 0) { + final int chevronResIds[] = { + R.styleable.MultiWaveView_rightChevronDrawable, + R.styleable.MultiWaveView_topChevronDrawable, + R.styleable.MultiWaveView_leftChevronDrawable, + R.styleable.MultiWaveView_bottomChevronDrawable + }; + + for (int i = 0; i < chevronResIds.length; i++) { + TypedValue typedValue = a.peekValue(chevronResIds[i]); + for (int k = 0; k < mFeedbackCount; k++) { + mChevronDrawables.add( + typedValue != null ? new TargetDrawable(res, typedValue.resourceId) : null); + } } } // Read array of target drawables - TypedValue outValue = new TypedValue(); if (a.getValue(R.styleable.MultiWaveView_targetDrawables, outValue)) { internalSetTargetResources(outValue.resourceId); } @@ -244,14 +258,14 @@ public class MultiWaveView extends View { protected int getSuggestedMinimumWidth() { // View should be large enough to contain the background + handle and // target drawable on either edge. - return mOuterRing.getWidth() + mMaxTargetWidth; + return (int) (Math.max(mOuterRing.getWidth(), 2 * mOuterRadius) + mMaxTargetWidth); } @Override protected int getSuggestedMinimumHeight() { // View should be large enough to contain the unlock ring + target and // target drawable on either edge - return mOuterRing.getHeight() + mMaxTargetHeight; + return (int) (Math.max(mOuterRing.getHeight(), 2 * mOuterRadius) + mMaxTargetHeight); } private int resolveMeasured(int measureSpec, int desired) @@ -318,23 +332,24 @@ public class MultiWaveView extends View { * mFeedbackCount items in the order: left, right, top, bottom. */ private void startChevronAnimation() { - final float r = mHandleDrawable.getWidth() * 0.4f; - final float chevronAnimationDistance = mOuterRadius * 0.9f / 2.0f; - final float from[][] = { - { -r, 0}, // left - { +r, 0}, // right - {0, -r}, // top - {0, +r} }; // bottom - final float to[][] = { - { -chevronAnimationDistance, 0}, // left - { chevronAnimationDistance, 0}, // right - { 0, -chevronAnimationDistance}, // top - { 0, +chevronAnimationDistance} }; // bottom - + final float chevronStartDistance = mHandleDrawable.getWidth() * 0.8f; + final float chevronStopDistance = mOuterRadius * 0.9f / 2.0f; mChevronAnimations.clear(); final float startScale = 0.5f; final float endScale = 2.0f; - for (int direction = 0; direction < 4; direction++) { + + final int directionCount = mFeedbackCount > 0 ? mChevronDrawables.size()/mFeedbackCount : 0; + + // Add an animation for all chevron drawables. There are mFeedbackCount drawables + // in each direction and directionCount directions. + for (int direction = 0; direction < directionCount; direction++) { + double angle = 2.0 * Math.PI * direction / directionCount; + final float sx = (float) Math.cos(angle); + final float sy = 0.0f - (float) Math.sin(angle); + final float[] xrange = new float[] + {sx * chevronStartDistance, sx * chevronStopDistance}; + final float[] yrange = new float[] + {sy * chevronStartDistance, sy * chevronStopDistance}; for (int count = 0; count < mFeedbackCount; count++) { int delay = count * CHEVRON_INCREMENTAL_DELAY; final TargetDrawable icon = mChevronDrawables.get(direction*mFeedbackCount + count); @@ -344,8 +359,8 @@ public class MultiWaveView extends View { mChevronAnimations.add(Tweener.to(icon, CHEVRON_ANIMATION_DURATION, "ease", mChevronAnimationInterpolator, "delay", delay, - "x", new float[] { from[direction][0], to[direction][0] }, - "y", new float[] { from[direction][1], to[direction][1] }, + "x", xrange, + "y", yrange, "alpha", new float[] {1.0f, 0.0f}, "scaleX", new float[] {startScale, endScale}, "scaleY", new float[] {startScale, endScale}, @@ -529,22 +544,31 @@ public class MultiWaveView extends View { } } - private void internalSetTargetResources(int resourceId) { + private ArrayList<TargetDrawable> loadDrawableArray(int resourceId) { Resources res = getContext().getResources(); TypedArray array = res.obtainTypedArray(resourceId); - int count = array.length(); - ArrayList<TargetDrawable> targetDrawables = new ArrayList<TargetDrawable>(count); + final int count = array.length(); + ArrayList<TargetDrawable> drawables = new ArrayList<TargetDrawable>(count); + for (int i = 0; i < count; i++) { + TypedValue value = array.peekValue(i); + TargetDrawable target = new TargetDrawable(res, value != null ? value.resourceId : 0); + drawables.add(target); + } + array.recycle(); + return drawables; + } + + private void internalSetTargetResources(int resourceId) { + mTargetDrawables = loadDrawableArray(resourceId); + mTargetResourceId = resourceId; + final int count = mTargetDrawables.size(); int maxWidth = mHandleDrawable.getWidth(); int maxHeight = mHandleDrawable.getHeight(); for (int i = 0; i < count; i++) { - TypedValue value = array.peekValue(i); - TargetDrawable target= new TargetDrawable(res, value != null ? value.resourceId : 0); - targetDrawables.add(target); + TargetDrawable target = mTargetDrawables.get(i); maxWidth = Math.max(maxWidth, target.getWidth()); maxHeight = Math.max(maxHeight, target.getHeight()); } - mTargetResourceId = resourceId; - mTargetDrawables = targetDrawables; if (mMaxTargetWidth != maxWidth || mMaxTargetHeight != maxHeight) { mMaxTargetWidth = maxWidth; mMaxTargetHeight = maxHeight; @@ -553,7 +577,6 @@ public class MultiWaveView extends View { updateTargetPositions(mWaveCenterX, mWaveCenterY); updateChevronPositions(mWaveCenterX, mWaveCenterY); } - array.recycle(); } /** @@ -918,10 +941,14 @@ public class MultiWaveView extends View { super.onLayout(changed, left, top, right, bottom); final int width = right - left; final int height = bottom - top; + // Target placement width/height. This puts the targets on the greater of the ring + // width or the specified outer radius. + final float placementWidth = Math.max(mOuterRing.getWidth(), 2 * mOuterRadius); + final float placementHeight = Math.max(mOuterRing.getHeight(), 2 * mOuterRadius); float newWaveCenterX = mHorizontalOffset + mHorizontalInset - + Math.max(width, mMaxTargetWidth + mOuterRing.getWidth()) / 2; + + Math.max(width, mMaxTargetWidth + placementWidth) / 2; float newWaveCenterY = mVerticalOffset + mVerticalInset - + Math.max(height, + mMaxTargetHeight + mOuterRing.getHeight()) / 2; + + Math.max(height, + mMaxTargetHeight + placementHeight) / 2; assignDefaultsIfNeeded(newWaveCenterX, newWaveCenterY); diff --git a/core/java/com/android/internal/widget/multiwaveview/TargetDrawable.java b/core/java/com/android/internal/widget/multiwaveview/TargetDrawable.java index 0269819b7583..6392093c4434 100644 --- a/core/java/com/android/internal/widget/multiwaveview/TargetDrawable.java +++ b/core/java/com/android/internal/widget/multiwaveview/TargetDrawable.java @@ -85,6 +85,14 @@ public class TargetDrawable { setState(STATE_INACTIVE); } + public TargetDrawable(TargetDrawable other) { + mResourceId = other.mResourceId; + // Mutate the drawable so we can animate shared drawable properties. + mDrawable = other.mDrawable != null ? other.mDrawable.mutate() : null; + resizeDrawables(); + setState(STATE_INACTIVE); + } + public void setState(int [] state) { if (mDrawable instanceof StateListDrawable) { StateListDrawable d = (StateListDrawable) mDrawable; diff --git a/core/jni/Android.mk b/core/jni/Android.mk index cd0959bb0b64..c24f6c6608a9 100644 --- a/core/jni/Android.mk +++ b/core/jni/Android.mk @@ -66,7 +66,6 @@ LOCAL_SRC_FILES:= \ android_os_MessageQueue.cpp \ android_os_ParcelFileDescriptor.cpp \ android_os_Parcel.cpp \ - android_os_Power.cpp \ android_os_StatFs.cpp \ android_os_SystemClock.cpp \ android_os_SystemProperties.cpp \ @@ -217,8 +216,7 @@ LOCAL_SHARED_LIBRARIES := \ libjpeg \ libusbhost \ libharfbuzz \ - libz \ - libsuspend \ + libz ifeq ($(USE_OPENGL_RENDERER),true) LOCAL_SHARED_LIBRARIES += libhwui diff --git a/core/jni/AndroidRuntime.cpp b/core/jni/AndroidRuntime.cpp index b877071ceafe..241a905f1c1f 100644 --- a/core/jni/AndroidRuntime.cpp +++ b/core/jni/AndroidRuntime.cpp @@ -133,7 +133,6 @@ extern int register_android_os_Debug(JNIEnv* env); extern int register_android_os_MessageQueue(JNIEnv* env); extern int register_android_os_Parcel(JNIEnv* env); extern int register_android_os_ParcelFileDescriptor(JNIEnv *env); -extern int register_android_os_Power(JNIEnv *env); extern int register_android_os_StatFs(JNIEnv *env); extern int register_android_os_SystemProperties(JNIEnv *env); extern int register_android_os_SystemClock(JNIEnv* env); @@ -1147,7 +1146,6 @@ static const RegJNIRec gRegJNI[] = { REG_JNI(register_android_os_FileUtils), REG_JNI(register_android_os_MessageQueue), REG_JNI(register_android_os_ParcelFileDescriptor), - REG_JNI(register_android_os_Power), REG_JNI(register_android_os_StatFs), REG_JNI(register_android_os_Trace), REG_JNI(register_android_os_UEventObserver), diff --git a/core/jni/android_os_Parcel.cpp b/core/jni/android_os_Parcel.cpp index 3dfaac39dec4..858ec79addcc 100644 --- a/core/jni/android_os_Parcel.cpp +++ b/core/jni/android_os_Parcel.cpp @@ -61,7 +61,10 @@ namespace android { static struct parcel_offsets_t { + jclass clazz; jfieldID mNativePtr; + jmethodID obtain; + jmethodID recycle; } gParcelOffsets; Parcel* parcelForJavaObject(JNIEnv* env, jobject obj) @@ -76,6 +79,16 @@ Parcel* parcelForJavaObject(JNIEnv* env, jobject obj) return NULL; } +jobject createJavaParcelObject(JNIEnv* env) +{ + return env->CallStaticObjectMethod(gParcelOffsets.clazz, gParcelOffsets.obtain); +} + +void recycleJavaParcelObject(JNIEnv* env, jobject parcelObj) +{ + env->CallVoidMethod(parcelObj, gParcelOffsets.recycle); +} + static jint android_os_Parcel_dataSize(JNIEnv* env, jclass clazz, jint nativePtr) { Parcel* parcel = reinterpret_cast<Parcel*>(nativePtr); @@ -665,8 +678,11 @@ int register_android_os_Parcel(JNIEnv* env) clazz = env->FindClass(kParcelPathName); LOG_FATAL_IF(clazz == NULL, "Unable to find class android.os.Parcel"); - gParcelOffsets.mNativePtr - = env->GetFieldID(clazz, "mNativePtr", "I"); + gParcelOffsets.clazz = (jclass) env->NewGlobalRef(clazz); + gParcelOffsets.mNativePtr = env->GetFieldID(clazz, "mNativePtr", "I"); + gParcelOffsets.obtain = env->GetStaticMethodID(clazz, "obtain", + "()Landroid/os/Parcel;"); + gParcelOffsets.recycle = env->GetMethodID(clazz, "recycle", "()V"); return AndroidRuntime::registerNativeMethods( env, kParcelPathName, diff --git a/core/jni/android_os_Parcel.h b/core/jni/android_os_Parcel.h index 65f3819ef867..1db523a77ffd 100644 --- a/core/jni/android_os_Parcel.h +++ b/core/jni/android_os_Parcel.h @@ -23,5 +23,7 @@ namespace android { // Conversion from Java Parcel Object to C++ Parcel instance. // Note: does not type checking; must guarantee jobject is a Java Parcel extern Parcel* parcelForJavaObject(JNIEnv* env, jobject obj); +extern jobject createJavaParcelObject(JNIEnv* env); +extern void recycleJavaParcelObject(JNIEnv* env, jobject object); } diff --git a/core/jni/android_os_Power.cpp b/core/jni/android_os_Power.cpp deleted file mode 100644 index 373abd4a0907..000000000000 --- a/core/jni/android_os_Power.cpp +++ /dev/null @@ -1,136 +0,0 @@ -/* //device/libs/android_runtime/android_os_Power.cpp -** -** Copyright 2006, The Android Open Source Project -** -** Licensed under the Apache License, Version 2.0 (the "License"); -** you may not use this file except in compliance with the License. -** You may obtain a copy of the License at -** -** http://www.apache.org/licenses/LICENSE-2.0 -** -** Unless required by applicable law or agreed to in writing, software -** distributed under the License is distributed on an "AS IS" BASIS, -** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -** See the License for the specific language governing permissions and -** limitations under the License. -*/ - -#define LOG_TAG "Power-JNI" - -#include "JNIHelp.h" -#include "jni.h" -#include "android_runtime/AndroidRuntime.h" -#include <utils/misc.h> -#include <hardware/power.h> -#include <hardware_legacy/power.h> -#include <cutils/android_reboot.h> -#include <suspend/autosuspend.h> - -static struct power_module *sPowerModule; - -namespace android -{ - -static void -acquireWakeLock(JNIEnv *env, jobject clazz, jint lock, jstring idObj) -{ - if (idObj == NULL) { - jniThrowNullPointerException(env, "id is null"); - return ; - } - - const char *id = env->GetStringUTFChars(idObj, NULL); - - acquire_wake_lock(lock, id); - - env->ReleaseStringUTFChars(idObj, id); -} - -static void -releaseWakeLock(JNIEnv *env, jobject clazz, jstring idObj) -{ - if (idObj == NULL) { - jniThrowNullPointerException(env, "id is null"); - return ; - } - - const char *id = env->GetStringUTFChars(idObj, NULL); - - release_wake_lock(id); - - env->ReleaseStringUTFChars(idObj, id); - -} - -static int -setLastUserActivityTimeout(JNIEnv *env, jobject clazz, jlong timeMS) -{ - return set_last_user_activity_timeout(timeMS/1000); -} - -static int -setScreenState(JNIEnv *env, jobject clazz, jboolean on) -{ - if (on) { - autosuspend_disable(); - if (sPowerModule) { - sPowerModule->setInteractive(sPowerModule, true); - } - } else { - if (sPowerModule) { - sPowerModule->setInteractive(sPowerModule, false); - } - autosuspend_enable(); - } - - return 0; -} - -static void android_os_Power_shutdown(JNIEnv *env, jobject clazz) -{ - android_reboot(ANDROID_RB_POWEROFF, 0, 0); -} - -static void android_os_Power_reboot(JNIEnv *env, jobject clazz, jstring reason) -{ - if (reason == NULL) { - android_reboot(ANDROID_RB_RESTART, 0, 0); - } else { - const char *chars = env->GetStringUTFChars(reason, NULL); - android_reboot(ANDROID_RB_RESTART2, 0, (char *) chars); - env->ReleaseStringUTFChars(reason, chars); // In case it fails. - } - jniThrowIOException(env, errno); -} - -static int android_os_Power_init(JNIEnv *env, jobject clazz) -{ - status_t err = hw_get_module(POWER_HARDWARE_MODULE_ID, - (hw_module_t const**)&sPowerModule); - ALOGE_IF(err, "couldn't load %s module (%s)", - POWER_HARDWARE_MODULE_ID, strerror(-err)); - - if (!err) - sPowerModule->init(sPowerModule); - - return err; -} - -static JNINativeMethod method_table[] = { - { "acquireWakeLock", "(ILjava/lang/String;)V", (void*)acquireWakeLock }, - { "releaseWakeLock", "(Ljava/lang/String;)V", (void*)releaseWakeLock }, - { "setLastUserActivityTimeout", "(J)I", (void*)setLastUserActivityTimeout }, - { "setScreenState", "(Z)I", (void*)setScreenState }, - { "shutdown", "()V", (void*)android_os_Power_shutdown }, - { "powerInitNative", "()I", (void*)android_os_Power_init }, - { "rebootNative", "(Ljava/lang/String;)V", (void*)android_os_Power_reboot }, -}; - -int register_android_os_Power(JNIEnv *env) -{ - return AndroidRuntime::registerNativeMethods( - env, "android/os/Power", - method_table, NELEM(method_table)); -} - -}; diff --git a/core/jni/android_view_Surface.cpp b/core/jni/android_view_Surface.cpp index 8c4c42abbe9b..5739cbeb1cbf 100644 --- a/core/jni/android_view_Surface.cpp +++ b/core/jni/android_view_Surface.cpp @@ -345,32 +345,6 @@ static inline SkBitmap::Config convertPixelFormat(PixelFormat format) } } -static void Surface_setActiveRect(JNIEnv* env, jobject thiz, jobject activeRect) -{ - const sp<Surface>& surface(getSurface(env, thiz)); - if (!Surface::isValid(surface)) { - doThrowIAE(env); - return; - } - - android_native_rect_t nativeRect; - if (activeRect) { - nativeRect.left = env->GetIntField(activeRect, ro.l); - nativeRect.top = env->GetIntField(activeRect, ro.t); - nativeRect.right = env->GetIntField(activeRect, ro.r); - nativeRect.bottom= env->GetIntField(activeRect, ro.b); - } else { - doThrowIAE(env, "activeRect may not be null"); - return; - } - - int err = native_window_set_active_rect(surface.get(), &nativeRect); - if (err != NO_ERROR) { - doThrowRE(env, String8::format( - "Surface::setActiveRect returned an error: %d", err).string()); - } -} - static jobject Surface_lockCanvas(JNIEnv* env, jobject clazz, jobject dirtyRect) { const sp<Surface>& surface(getSurface(env, clazz)); @@ -773,6 +747,28 @@ static void Surface_setFreezeTint( } } +static void Surface_setWindowCrop(JNIEnv* env, jobject thiz, jobject crop) +{ + const sp<SurfaceControl>& surface(getSurfaceControl(env, thiz)); + if (surface == 0) return; + + Rect nativeCrop; + if (crop) { + nativeCrop.left = env->GetIntField(crop, ro.l); + nativeCrop.top = env->GetIntField(crop, ro.t); + nativeCrop.right = env->GetIntField(crop, ro.r); + nativeCrop.bottom= env->GetIntField(crop, ro.b); + } else { + nativeCrop.left = nativeCrop.top = nativeCrop.right = + nativeCrop.bottom = 0; + } + + status_t err = surface->setCrop(nativeCrop); + if (err<0 && err!=NO_INIT) { + doThrowIAE(env); + } +} + // ---------------------------------------------------------------------------- static void Surface_copyFrom( @@ -915,7 +911,7 @@ static JNINativeMethod gSurfaceMethods[] = { {"readFromParcel", "(Landroid/os/Parcel;)V", (void*)Surface_readFromParcel }, {"writeToParcel", "(Landroid/os/Parcel;I)V", (void*)Surface_writeToParcel }, {"isConsumerRunningBehind", "()Z", (void*)Surface_isConsumerRunningBehind }, - {"setActiveRect", "(Landroid/graphics/Rect;)V", (void*)Surface_setActiveRect }, + {"setWindowCrop", "(Landroid/graphics/Rect;)V", (void*)Surface_setWindowCrop }, }; void nativeClassInit(JNIEnv* env, jclass clazz) diff --git a/core/jni/android_view_VelocityTracker.cpp b/core/jni/android_view_VelocityTracker.cpp index 668d3bb7dfdd..04d1056103de 100644 --- a/core/jni/android_view_VelocityTracker.cpp +++ b/core/jni/android_view_VelocityTracker.cpp @@ -21,6 +21,7 @@ #include <android_runtime/AndroidRuntime.h> #include <utils/Log.h> #include <androidfw/Input.h> +#include <androidfw/VelocityTracker.h> #include "android_view_MotionEvent.h" diff --git a/core/res/res/drawable-hdpi/progress_bg_holo_dark.9.png b/core/res/res/drawable-hdpi/progress_bg_holo_dark.9.png Binary files differindex 310c368e7a68..877fd2b5d6a3 100644 --- a/core/res/res/drawable-hdpi/progress_bg_holo_dark.9.png +++ b/core/res/res/drawable-hdpi/progress_bg_holo_dark.9.png diff --git a/core/res/res/drawable-hdpi/progress_bg_holo_light.9.png b/core/res/res/drawable-hdpi/progress_bg_holo_light.9.png Binary files differindex 70cb7fc7e0bc..3f12166d259d 100644 --- a/core/res/res/drawable-hdpi/progress_bg_holo_light.9.png +++ b/core/res/res/drawable-hdpi/progress_bg_holo_light.9.png diff --git a/core/res/res/drawable-hdpi/progress_primary_holo_dark.9.png b/core/res/res/drawable-hdpi/progress_primary_holo_dark.9.png Binary files differindex 1c269205e874..b73abba7dab9 100644 --- a/core/res/res/drawable-hdpi/progress_primary_holo_dark.9.png +++ b/core/res/res/drawable-hdpi/progress_primary_holo_dark.9.png diff --git a/core/res/res/drawable-hdpi/progress_primary_holo_light.9.png b/core/res/res/drawable-hdpi/progress_primary_holo_light.9.png Binary files differindex 1c269205e874..2f76a22648d1 100644 --- a/core/res/res/drawable-hdpi/progress_primary_holo_light.9.png +++ b/core/res/res/drawable-hdpi/progress_primary_holo_light.9.png diff --git a/core/res/res/drawable-hdpi/progress_secondary_holo_dark.9.png b/core/res/res/drawable-hdpi/progress_secondary_holo_dark.9.png Binary files differindex 40d0d1645cbf..a75d0dd5b619 100644 --- a/core/res/res/drawable-hdpi/progress_secondary_holo_dark.9.png +++ b/core/res/res/drawable-hdpi/progress_secondary_holo_dark.9.png diff --git a/core/res/res/drawable-hdpi/progress_secondary_holo_light.9.png b/core/res/res/drawable-hdpi/progress_secondary_holo_light.9.png Binary files differindex 40d0d1645cbf..955b70807663 100644 --- a/core/res/res/drawable-hdpi/progress_secondary_holo_light.9.png +++ b/core/res/res/drawable-hdpi/progress_secondary_holo_light.9.png diff --git a/core/res/res/drawable-hdpi/scrubber_control_disabled_holo.png b/core/res/res/drawable-hdpi/scrubber_control_disabled_holo.png Binary files differindex 167d7d3f159f..370242a9e321 100644 --- a/core/res/res/drawable-hdpi/scrubber_control_disabled_holo.png +++ b/core/res/res/drawable-hdpi/scrubber_control_disabled_holo.png diff --git a/core/res/res/drawable-hdpi/scrubber_control_focused_holo.png b/core/res/res/drawable-hdpi/scrubber_control_focused_holo.png Binary files differindex 4048260c76a8..eea2c3e89ff0 100644 --- a/core/res/res/drawable-hdpi/scrubber_control_focused_holo.png +++ b/core/res/res/drawable-hdpi/scrubber_control_focused_holo.png diff --git a/core/res/res/drawable-hdpi/scrubber_control_normal_holo.png b/core/res/res/drawable-hdpi/scrubber_control_normal_holo.png Binary files differindex 90e9c9c9142f..3c98ee9b65b6 100644 --- a/core/res/res/drawable-hdpi/scrubber_control_normal_holo.png +++ b/core/res/res/drawable-hdpi/scrubber_control_normal_holo.png diff --git a/core/res/res/drawable-hdpi/scrubber_control_pressed_holo.png b/core/res/res/drawable-hdpi/scrubber_control_pressed_holo.png Binary files differindex 4a3e57c8c845..4dc8999de6c2 100644 --- a/core/res/res/drawable-hdpi/scrubber_control_pressed_holo.png +++ b/core/res/res/drawable-hdpi/scrubber_control_pressed_holo.png diff --git a/core/res/res/drawable-hdpi/scrubber_primary_holo.9.png b/core/res/res/drawable-hdpi/scrubber_primary_holo.9.png Binary files differindex 0d13f7142a92..260a0a54ccf2 100644 --- a/core/res/res/drawable-hdpi/scrubber_primary_holo.9.png +++ b/core/res/res/drawable-hdpi/scrubber_primary_holo.9.png diff --git a/core/res/res/drawable-hdpi/scrubber_secondary_holo.9.png b/core/res/res/drawable-hdpi/scrubber_secondary_holo.9.png Binary files differindex b39d83166976..09f2d585488c 100644 --- a/core/res/res/drawable-hdpi/scrubber_secondary_holo.9.png +++ b/core/res/res/drawable-hdpi/scrubber_secondary_holo.9.png diff --git a/core/res/res/drawable-hdpi/scrubber_track_holo_dark.9.png b/core/res/res/drawable-hdpi/scrubber_track_holo_dark.9.png Binary files differindex c997bf0299fc..0c0ccda79df9 100644 --- a/core/res/res/drawable-hdpi/scrubber_track_holo_dark.9.png +++ b/core/res/res/drawable-hdpi/scrubber_track_holo_dark.9.png diff --git a/core/res/res/drawable-hdpi/scrubber_track_holo_light.9.png b/core/res/res/drawable-hdpi/scrubber_track_holo_light.9.png Binary files differindex b2a22dcdb285..90528b1307e3 100644 --- a/core/res/res/drawable-hdpi/scrubber_track_holo_light.9.png +++ b/core/res/res/drawable-hdpi/scrubber_track_holo_light.9.png diff --git a/core/res/res/drawable-mdpi/progress_bg_holo_dark.9.png b/core/res/res/drawable-mdpi/progress_bg_holo_dark.9.png Binary files differindex 3d946e545d1e..155e5464e32f 100644 --- a/core/res/res/drawable-mdpi/progress_bg_holo_dark.9.png +++ b/core/res/res/drawable-mdpi/progress_bg_holo_dark.9.png diff --git a/core/res/res/drawable-mdpi/progress_bg_holo_light.9.png b/core/res/res/drawable-mdpi/progress_bg_holo_light.9.png Binary files differindex 4bb22f0e10e6..780b4b2560ef 100644 --- a/core/res/res/drawable-mdpi/progress_bg_holo_light.9.png +++ b/core/res/res/drawable-mdpi/progress_bg_holo_light.9.png diff --git a/core/res/res/drawable-mdpi/progress_primary_holo_dark.9.png b/core/res/res/drawable-mdpi/progress_primary_holo_dark.9.png Binary files differindex ab8ec6984417..b86f4b51dd14 100644 --- a/core/res/res/drawable-mdpi/progress_primary_holo_dark.9.png +++ b/core/res/res/drawable-mdpi/progress_primary_holo_dark.9.png diff --git a/core/res/res/drawable-mdpi/progress_primary_holo_light.9.png b/core/res/res/drawable-mdpi/progress_primary_holo_light.9.png Binary files differindex ab8ec6984417..6fb944577346 100644 --- a/core/res/res/drawable-mdpi/progress_primary_holo_light.9.png +++ b/core/res/res/drawable-mdpi/progress_primary_holo_light.9.png diff --git a/core/res/res/drawable-mdpi/progress_secondary_holo_dark.9.png b/core/res/res/drawable-mdpi/progress_secondary_holo_dark.9.png Binary files differindex 7274274b178b..5651a7a1c3ca 100644 --- a/core/res/res/drawable-mdpi/progress_secondary_holo_dark.9.png +++ b/core/res/res/drawable-mdpi/progress_secondary_holo_dark.9.png diff --git a/core/res/res/drawable-mdpi/progress_secondary_holo_light.9.png b/core/res/res/drawable-mdpi/progress_secondary_holo_light.9.png Binary files differindex 7274274b178b..9104cf94b5a7 100644 --- a/core/res/res/drawable-mdpi/progress_secondary_holo_light.9.png +++ b/core/res/res/drawable-mdpi/progress_secondary_holo_light.9.png diff --git a/core/res/res/drawable-mdpi/scrubber_control_disabled_holo.png b/core/res/res/drawable-mdpi/scrubber_control_disabled_holo.png Binary files differindex 351d5393e5d9..630a450967d9 100644 --- a/core/res/res/drawable-mdpi/scrubber_control_disabled_holo.png +++ b/core/res/res/drawable-mdpi/scrubber_control_disabled_holo.png diff --git a/core/res/res/drawable-mdpi/scrubber_control_focused_holo.png b/core/res/res/drawable-mdpi/scrubber_control_focused_holo.png Binary files differindex e6072ee3133d..c9e4796c79ae 100644 --- a/core/res/res/drawable-mdpi/scrubber_control_focused_holo.png +++ b/core/res/res/drawable-mdpi/scrubber_control_focused_holo.png diff --git a/core/res/res/drawable-mdpi/scrubber_control_normal_holo.png b/core/res/res/drawable-mdpi/scrubber_control_normal_holo.png Binary files differindex 79682c16729a..fb96f4b460bf 100644 --- a/core/res/res/drawable-mdpi/scrubber_control_normal_holo.png +++ b/core/res/res/drawable-mdpi/scrubber_control_normal_holo.png diff --git a/core/res/res/drawable-mdpi/scrubber_control_pressed_holo.png b/core/res/res/drawable-mdpi/scrubber_control_pressed_holo.png Binary files differindex ba53c0b8923b..30e18cd3d2e2 100644 --- a/core/res/res/drawable-mdpi/scrubber_control_pressed_holo.png +++ b/core/res/res/drawable-mdpi/scrubber_control_pressed_holo.png diff --git a/core/res/res/drawable-mdpi/scrubber_primary_holo.9.png b/core/res/res/drawable-mdpi/scrubber_primary_holo.9.png Binary files differindex 7cbf2f2ccd78..a7910d68ea79 100644 --- a/core/res/res/drawable-mdpi/scrubber_primary_holo.9.png +++ b/core/res/res/drawable-mdpi/scrubber_primary_holo.9.png diff --git a/core/res/res/drawable-mdpi/scrubber_secondary_holo.9.png b/core/res/res/drawable-mdpi/scrubber_secondary_holo.9.png Binary files differindex 81772a851b53..985b62e5be5f 100644 --- a/core/res/res/drawable-mdpi/scrubber_secondary_holo.9.png +++ b/core/res/res/drawable-mdpi/scrubber_secondary_holo.9.png diff --git a/core/res/res/drawable-mdpi/scrubber_track_holo_dark.9.png b/core/res/res/drawable-mdpi/scrubber_track_holo_dark.9.png Binary files differindex b8037a36f032..b91a4ee731a9 100644 --- a/core/res/res/drawable-mdpi/scrubber_track_holo_dark.9.png +++ b/core/res/res/drawable-mdpi/scrubber_track_holo_dark.9.png diff --git a/core/res/res/drawable-mdpi/scrubber_track_holo_light.9.png b/core/res/res/drawable-mdpi/scrubber_track_holo_light.9.png Binary files differindex 76df16ffd5a4..359ae4a1b75a 100644 --- a/core/res/res/drawable-mdpi/scrubber_track_holo_light.9.png +++ b/core/res/res/drawable-mdpi/scrubber_track_holo_light.9.png diff --git a/core/res/res/drawable-xhdpi/progress_bg_holo_dark.9.png b/core/res/res/drawable-xhdpi/progress_bg_holo_dark.9.png Binary files differindex 345f5d3067c1..c8b87d750138 100644 --- a/core/res/res/drawable-xhdpi/progress_bg_holo_dark.9.png +++ b/core/res/res/drawable-xhdpi/progress_bg_holo_dark.9.png diff --git a/core/res/res/drawable-xhdpi/progress_bg_holo_light.9.png b/core/res/res/drawable-xhdpi/progress_bg_holo_light.9.png Binary files differindex c843ef3af22f..cbd19ac4fc4d 100644 --- a/core/res/res/drawable-xhdpi/progress_bg_holo_light.9.png +++ b/core/res/res/drawable-xhdpi/progress_bg_holo_light.9.png diff --git a/core/res/res/drawable-xhdpi/progress_primary_holo_dark.9.png b/core/res/res/drawable-xhdpi/progress_primary_holo_dark.9.png Binary files differindex c6c3f1ec2488..f1069fd98eb2 100644 --- a/core/res/res/drawable-xhdpi/progress_primary_holo_dark.9.png +++ b/core/res/res/drawable-xhdpi/progress_primary_holo_dark.9.png diff --git a/core/res/res/drawable-xhdpi/progress_primary_holo_light.9.png b/core/res/res/drawable-xhdpi/progress_primary_holo_light.9.png Binary files differindex c6c3f1ec2488..e62123c4d45d 100644 --- a/core/res/res/drawable-xhdpi/progress_primary_holo_light.9.png +++ b/core/res/res/drawable-xhdpi/progress_primary_holo_light.9.png diff --git a/core/res/res/drawable-xhdpi/progress_secondary_holo_dark.9.png b/core/res/res/drawable-xhdpi/progress_secondary_holo_dark.9.png Binary files differindex 205b66e2cdef..06ae19c0421e 100644 --- a/core/res/res/drawable-xhdpi/progress_secondary_holo_dark.9.png +++ b/core/res/res/drawable-xhdpi/progress_secondary_holo_dark.9.png diff --git a/core/res/res/drawable-xhdpi/progress_secondary_holo_light.9.png b/core/res/res/drawable-xhdpi/progress_secondary_holo_light.9.png Binary files differindex 205b66e2cdef..37c6d5ff1a33 100644 --- a/core/res/res/drawable-xhdpi/progress_secondary_holo_light.9.png +++ b/core/res/res/drawable-xhdpi/progress_secondary_holo_light.9.png diff --git a/core/res/res/drawable-xhdpi/scrubber_control_disabled_holo.png b/core/res/res/drawable-xhdpi/scrubber_control_disabled_holo.png Binary files differindex 8cf3868fedae..62be77c78902 100644 --- a/core/res/res/drawable-xhdpi/scrubber_control_disabled_holo.png +++ b/core/res/res/drawable-xhdpi/scrubber_control_disabled_holo.png diff --git a/core/res/res/drawable-xhdpi/scrubber_control_focused_holo.png b/core/res/res/drawable-xhdpi/scrubber_control_focused_holo.png Binary files differindex 417b35af56ce..754dd2ff0d9a 100644 --- a/core/res/res/drawable-xhdpi/scrubber_control_focused_holo.png +++ b/core/res/res/drawable-xhdpi/scrubber_control_focused_holo.png diff --git a/core/res/res/drawable-xhdpi/scrubber_control_normal_holo.png b/core/res/res/drawable-xhdpi/scrubber_control_normal_holo.png Binary files differindex 8053d886fc60..d546a73ae442 100644 --- a/core/res/res/drawable-xhdpi/scrubber_control_normal_holo.png +++ b/core/res/res/drawable-xhdpi/scrubber_control_normal_holo.png diff --git a/core/res/res/drawable-xhdpi/scrubber_control_pressed_holo.png b/core/res/res/drawable-xhdpi/scrubber_control_pressed_holo.png Binary files differindex d17fa7ded231..0b6207220535 100644 --- a/core/res/res/drawable-xhdpi/scrubber_control_pressed_holo.png +++ b/core/res/res/drawable-xhdpi/scrubber_control_pressed_holo.png diff --git a/core/res/res/drawable-xhdpi/scrubber_primary_holo.9.png b/core/res/res/drawable-xhdpi/scrubber_primary_holo.9.png Binary files differindex 073ff4c574e8..3b0b24191290 100644 --- a/core/res/res/drawable-xhdpi/scrubber_primary_holo.9.png +++ b/core/res/res/drawable-xhdpi/scrubber_primary_holo.9.png diff --git a/core/res/res/drawable-xhdpi/scrubber_secondary_holo.9.png b/core/res/res/drawable-xhdpi/scrubber_secondary_holo.9.png Binary files differindex 4c7b0aacdbfc..90990347c7f6 100644 --- a/core/res/res/drawable-xhdpi/scrubber_secondary_holo.9.png +++ b/core/res/res/drawable-xhdpi/scrubber_secondary_holo.9.png diff --git a/core/res/res/drawable-xhdpi/scrubber_track_holo_dark.9.png b/core/res/res/drawable-xhdpi/scrubber_track_holo_dark.9.png Binary files differindex a217a90d4629..bfb20481511f 100644 --- a/core/res/res/drawable-xhdpi/scrubber_track_holo_dark.9.png +++ b/core/res/res/drawable-xhdpi/scrubber_track_holo_dark.9.png diff --git a/core/res/res/drawable-xhdpi/scrubber_track_holo_light.9.png b/core/res/res/drawable-xhdpi/scrubber_track_holo_light.9.png Binary files differindex 551fb0ae7af5..a7d396de21a4 100644 --- a/core/res/res/drawable-xhdpi/scrubber_track_holo_light.9.png +++ b/core/res/res/drawable-xhdpi/scrubber_track_holo_light.9.png diff --git a/core/res/res/layout-sw600dp/keyguard_screen_tab_unlock.xml b/core/res/res/layout-sw600dp/keyguard_screen_tab_unlock.xml index 66cf98d95a79..efd406d8d04e 100644 --- a/core/res/res/layout-sw600dp/keyguard_screen_tab_unlock.xml +++ b/core/res/res/layout-sw600dp/keyguard_screen_tab_unlock.xml @@ -31,7 +31,7 @@ <!-- top: status --> <RelativeLayout android:layout_height="0dip" - android:layout_weight="1" + android:layout_weight="0.42" android:layout_width="match_parent" android:gravity="center"> @@ -69,8 +69,9 @@ <LinearLayout android:layout_width="match_parent" android:layout_height="0dip" - android:layout_weight="1" - android:orientation="vertical"> + android:layout_weight="0.58" + android:orientation="vertical" + android:gravity="bottom"> <TextView android:id="@+id/screenLocked" @@ -87,7 +88,7 @@ android:orientation="horizontal" android:layout_width="wrap_content" android:layout_height="wrap_content" - android:layout_gravity="center" + android:layout_gravity="center_horizontal" android:gravity="center" android:targetDrawables="@array/lockscreen_targets_with_camera" @@ -98,7 +99,7 @@ android:outerRadius="@dimen/multiwaveview_target_placement_radius" android:snapMargin="@dimen/multiwaveview_snap_margin" android:hitRadius="@dimen/multiwaveview_hit_radius" - android:rightChevronDrawable="@drawable/ic_lockscreen_chevron_right" + android:chevronDrawables="@array/lockscreen_chevron_drawables" android:feedbackCount="3" android:vibrationDuration="20" /> diff --git a/core/res/res/layout-sw600dp/keyguard_screen_tab_unlock_land.xml b/core/res/res/layout-sw600dp/keyguard_screen_tab_unlock_land.xml index 65b442b9bae2..de64a510caa8 100644 --- a/core/res/res/layout-sw600dp/keyguard_screen_tab_unlock_land.xml +++ b/core/res/res/layout-sw600dp/keyguard_screen_tab_unlock_land.xml @@ -30,7 +30,7 @@ <!-- left side: status and music --> <RelativeLayout android:layout_height="match_parent" - android:layout_weight="1" + android:layout_weight="0.42" android:layout_width="0dip" android:gravity="center"> @@ -67,7 +67,7 @@ <!-- right side --> <RelativeLayout android:layout_height="match_parent" - android:layout_weight="1" + android:layout_weight="0.58" android:layout_width="0dip" android:gravity="center_horizontal|center_vertical"> @@ -87,7 +87,7 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_rowSpan="7" - android:layout_gravity="center_vertical|center_horizontal" + android:layout_gravity="center_vertical|right" android:gravity="center" android:targetDrawables="@array/lockscreen_targets_with_camera" @@ -98,7 +98,7 @@ android:outerRadius="@dimen/multiwaveview_target_placement_radius" android:snapMargin="@dimen/multiwaveview_snap_margin" android:hitRadius="@dimen/multiwaveview_hit_radius" - android:rightChevronDrawable="@drawable/ic_lockscreen_chevron_right" + android:chevronDrawables="@array/lockscreen_chevron_drawables" android:feedbackCount="3" android:vibrationDuration="20" /> diff --git a/core/res/res/layout/keyguard_screen_tab_unlock.xml b/core/res/res/layout/keyguard_screen_tab_unlock.xml index 3fd3023294c1..2dcb774e599a 100644 --- a/core/res/res/layout/keyguard_screen_tab_unlock.xml +++ b/core/res/res/layout/keyguard_screen_tab_unlock.xml @@ -139,7 +139,7 @@ android:outerRadius="@dimen/multiwaveview_target_placement_radius" android:snapMargin="@dimen/multiwaveview_snap_margin" android:hitRadius="@dimen/multiwaveview_hit_radius" - android:rightChevronDrawable="@drawable/ic_lockscreen_chevron_right" + android:chevronDrawables="@array/lockscreen_chevron_drawables" android:feedbackCount="3" android:vibrationDuration="20" /> diff --git a/core/res/res/layout/keyguard_screen_tab_unlock_land.xml b/core/res/res/layout/keyguard_screen_tab_unlock_land.xml index cd03c108a22e..10ddd1eb56d4 100644 --- a/core/res/res/layout/keyguard_screen_tab_unlock_land.xml +++ b/core/res/res/layout/keyguard_screen_tab_unlock_land.xml @@ -144,7 +144,7 @@ android:outerRadius="@dimen/multiwaveview_target_placement_radius" android:snapMargin="@dimen/multiwaveview_snap_margin" android:hitRadius="@dimen/multiwaveview_hit_radius" - android:topChevronDrawable="@drawable/ic_lockscreen_chevron_up" + android:chevronDrawables="@array/lockscreen_chevron_drawables" android:feedbackCount="3" android:vibrationDuration="20" /> diff --git a/core/res/res/values-be/strings.xml b/core/res/res/values-be/strings.xml index 86e21a949a85..a95541e805d5 100644 --- a/core/res/res/values-be/strings.xml +++ b/core/res/res/values-be/strings.xml @@ -1311,7 +1311,6 @@ <string name="sending" msgid="3245653681008218030">"Адпраўка..."</string> <string name="launchBrowserDefault" msgid="2057951947297614725">"Запусцiць браўзер?"</string> <string name="SetupCallDefault" msgid="5834948469253758575">"Прыняць выклік?"</string> - <!-- no translation found for activity_resolver_use_always (8017770747801494933) --> - <skip /> + <string name="activity_resolver_use_always" msgid="8017770747801494933">"Заўсёды"</string> <string name="activity_resolver_use_once" msgid="405646673463328329">"Толькі адзін раз"</string> </resources> diff --git a/core/res/res/values-bg/strings.xml b/core/res/res/values-bg/strings.xml index d5bb21eeddbb..6ebe576bc2ab 100644 --- a/core/res/res/values-bg/strings.xml +++ b/core/res/res/values-bg/strings.xml @@ -1311,7 +1311,6 @@ <string name="sending" msgid="3245653681008218030">"Изпраща се..."</string> <string name="launchBrowserDefault" msgid="2057951947297614725">"Да се стартира ли браузърът?"</string> <string name="SetupCallDefault" msgid="5834948469253758575">"Да се приеме ли обаждането?"</string> - <!-- no translation found for activity_resolver_use_always (8017770747801494933) --> - <skip /> + <string name="activity_resolver_use_always" msgid="8017770747801494933">"Винаги"</string> <string name="activity_resolver_use_once" msgid="405646673463328329">"Само веднъж"</string> </resources> diff --git a/core/res/res/values-cs/strings.xml b/core/res/res/values-cs/strings.xml index 3a0c936b5920..fb8f466df782 100644 --- a/core/res/res/values-cs/strings.xml +++ b/core/res/res/values-cs/strings.xml @@ -1311,7 +1311,6 @@ <string name="sending" msgid="3245653681008218030">"Odesílání..."</string> <string name="launchBrowserDefault" msgid="2057951947297614725">"Spustit prohlížeč?"</string> <string name="SetupCallDefault" msgid="5834948469253758575">"Přijmout hovor?"</string> - <!-- no translation found for activity_resolver_use_always (8017770747801494933) --> - <skip /> + <string name="activity_resolver_use_always" msgid="8017770747801494933">"Vždy"</string> <string name="activity_resolver_use_once" msgid="405646673463328329">"Pouze jednou"</string> </resources> diff --git a/core/res/res/values-et/strings.xml b/core/res/res/values-et/strings.xml index 81f420463dfc..88f8fdbb234c 100644 --- a/core/res/res/values-et/strings.xml +++ b/core/res/res/values-et/strings.xml @@ -1311,7 +1311,6 @@ <string name="sending" msgid="3245653681008218030">"Saatmine ..."</string> <string name="launchBrowserDefault" msgid="2057951947297614725">"Kas käivitada brauser?"</string> <string name="SetupCallDefault" msgid="5834948469253758575">"Kas vastata kõnele?"</string> - <!-- no translation found for activity_resolver_use_always (8017770747801494933) --> - <skip /> + <string name="activity_resolver_use_always" msgid="8017770747801494933">"Alati"</string> <string name="activity_resolver_use_once" msgid="405646673463328329">"Ainult üks kord"</string> </resources> diff --git a/core/res/res/values-hr/strings.xml b/core/res/res/values-hr/strings.xml index ccb47ef20b19..55f923f9f93c 100644 --- a/core/res/res/values-hr/strings.xml +++ b/core/res/res/values-hr/strings.xml @@ -1311,7 +1311,6 @@ <string name="sending" msgid="3245653681008218030">"Slanje..."</string> <string name="launchBrowserDefault" msgid="2057951947297614725">"Pokrenuti preglednik?"</string> <string name="SetupCallDefault" msgid="5834948469253758575">"Prihvatiti poziv?"</string> - <!-- no translation found for activity_resolver_use_always (8017770747801494933) --> - <skip /> + <string name="activity_resolver_use_always" msgid="8017770747801494933">"Uvijek"</string> <string name="activity_resolver_use_once" msgid="405646673463328329">"Samo jednom"</string> </resources> diff --git a/core/res/res/values-in/strings.xml b/core/res/res/values-in/strings.xml index 753e7fd69dd0..616b9be9a7b1 100644 --- a/core/res/res/values-in/strings.xml +++ b/core/res/res/values-in/strings.xml @@ -175,14 +175,10 @@ <string name="permgroupdesc_location" msgid="5704679763124170100">"Memonitor lokasi fisik Anda."</string> <string name="permgrouplab_network" msgid="5808983377727109831">"Komunikasi jaringan"</string> <string name="permgroupdesc_network" msgid="4478299413241861987">"Mengakses berbagai fitur jaringan."</string> - <!-- no translation found for permgrouplab_bluetoothNetwork (1585403544162128109) --> - <skip /> - <!-- no translation found for permgroupdesc_bluetoothNetwork (5625288577164282391) --> - <skip /> - <!-- no translation found for permgrouplab_shortrangeNetwork (130808676377486118) --> - <skip /> - <!-- no translation found for permgroupdesc_shortrangeNetwork (1884069062653436007) --> - <skip /> + <string name="permgrouplab_bluetoothNetwork" msgid="1585403544162128109">"Bluetooth"</string> + <string name="permgroupdesc_bluetoothNetwork" msgid="5625288577164282391">"Mengakses perangkat dan jaringan melalui Bluetooth."</string> + <string name="permgrouplab_shortrangeNetwork" msgid="130808676377486118">"Jaringan jarak pendek"</string> + <string name="permgroupdesc_shortrangeNetwork" msgid="1884069062653436007">"Mengakses perangkat melalui jaringan jarak pendek seperti NFC."</string> <string name="permgrouplab_audioSettings" msgid="8329261670151871235">"Setelan Audio"</string> <string name="permgroupdesc_audioSettings" msgid="2641515403347568130">"Mengubah setelan audio."</string> <string name="permgrouplab_affectsBattery" msgid="6209246653424798033">"Memengaruhi Baterai"</string> @@ -195,8 +191,7 @@ <skip /> <!-- no translation found for permgrouplab_writeDictionary (8090237702432576788) --> <skip /> - <!-- no translation found for permgroupdesc_writeDictionary (2711561994497361646) --> - <skip /> + <string name="permgroupdesc_writeDictionary" msgid="2711561994497361646">"Menambahkan kata ke kamus pengguna."</string> <string name="permgrouplab_bookmarks" msgid="1949519673103968229">"Bookmark dan Riwayat"</string> <string name="permgroupdesc_bookmarks" msgid="4169771606257963028">"Akses langsung ke bookmark dan riwayat browser."</string> <string name="permgrouplab_deviceAlarms" msgid="6117704629728824101">"Alarm"</string> @@ -1090,8 +1085,7 @@ <string name="date_time_set" msgid="5777075614321087758">"Setel"</string> <string name="date_time_done" msgid="2507683751759308828">"Selesai"</string> <string name="perms_new_perm_prefix" msgid="8257740710754301407"><font size="12" fgcolor="#ff900000">"BARU: "</font></string> - <!-- no translation found for perms_description_app (5139836143293299417) --> - <skip /> + <string name="perms_description_app" msgid="5139836143293299417">"Disediakan oleh <xliff:g id="APP_NAME">%1$s</xliff:g>."</string> <string name="no_permissions" msgid="7283357728219338112">"Tidak perlu izin"</string> <string name="usb_storage_activity_title" msgid="4465055157209648641">"Penyimpanan massal USB"</string> <string name="usb_storage_title" msgid="5901459041398751495">"USB terhubung"</string> @@ -1321,8 +1315,6 @@ <string name="sending" msgid="3245653681008218030">"Mengirim..."</string> <string name="launchBrowserDefault" msgid="2057951947297614725">"Luncurkan Browser?"</string> <string name="SetupCallDefault" msgid="5834948469253758575">"Terima panggilan?"</string> - <!-- no translation found for activity_resolver_use_always (8017770747801494933) --> - <skip /> - <!-- no translation found for activity_resolver_use_once (405646673463328329) --> - <skip /> + <string name="activity_resolver_use_always" msgid="8017770747801494933">"Selalu"</string> + <string name="activity_resolver_use_once" msgid="405646673463328329">"Sekali Saja"</string> </resources> diff --git a/core/res/res/values-ko/strings.xml b/core/res/res/values-ko/strings.xml index 56f4bc0d0df3..14730d958b16 100644 --- a/core/res/res/values-ko/strings.xml +++ b/core/res/res/values-ko/strings.xml @@ -175,28 +175,20 @@ <string name="permgroupdesc_location" msgid="5704679763124170100">"실제 위치 모니터링"</string> <string name="permgrouplab_network" msgid="5808983377727109831">"네트워크 통신"</string> <string name="permgroupdesc_network" msgid="4478299413241861987">"다양한 네트워크 기능에 액세스할 수 있도록 합니다."</string> - <!-- no translation found for permgrouplab_bluetoothNetwork (1585403544162128109) --> - <skip /> - <!-- no translation found for permgroupdesc_bluetoothNetwork (5625288577164282391) --> - <skip /> - <!-- no translation found for permgrouplab_shortrangeNetwork (130808676377486118) --> - <skip /> - <!-- no translation found for permgroupdesc_shortrangeNetwork (1884069062653436007) --> - <skip /> + <string name="permgrouplab_bluetoothNetwork" msgid="1585403544162128109">"블루투스"</string> + <string name="permgroupdesc_bluetoothNetwork" msgid="5625288577164282391">"블루투스를 통해 기기 및 네트워크에 액세스"</string> + <string name="permgrouplab_shortrangeNetwork" msgid="130808676377486118">"단거리 네트워크"</string> + <string name="permgroupdesc_shortrangeNetwork" msgid="1884069062653436007">"NFC와 같은 단거리 네트워크를 통해 기기에 액세스"</string> <string name="permgrouplab_audioSettings" msgid="8329261670151871235">"오디오 설정"</string> <string name="permgroupdesc_audioSettings" msgid="2641515403347568130">"오디오 설정을 변경합니다."</string> <string name="permgrouplab_affectsBattery" msgid="6209246653424798033">"배터리 소모"</string> <string name="permgroupdesc_affectsBattery" msgid="6441275320638916947">"배터리를 빨리 소모시킬 수 있는 기능을 사용합니다."</string> <string name="permgrouplab_calendar" msgid="5863508437783683902">"캘린더"</string> <string name="permgroupdesc_calendar" msgid="5777534316982184416">"캘린더 및 일정에 직접 액세스합니다."</string> - <!-- no translation found for permgrouplab_dictionary (4148597128843641379) --> - <skip /> - <!-- no translation found for permgroupdesc_dictionary (7921166355964764490) --> - <skip /> - <!-- no translation found for permgrouplab_writeDictionary (8090237702432576788) --> - <skip /> - <!-- no translation found for permgroupdesc_writeDictionary (2711561994497361646) --> - <skip /> + <string name="permgrouplab_dictionary" msgid="4148597128843641379">"사용자 사전 읽기"</string> + <string name="permgroupdesc_dictionary" msgid="7921166355964764490">"사용자 사전의 단어 읽기"</string> + <string name="permgrouplab_writeDictionary" msgid="8090237702432576788">"사용자 사전 쓰기"</string> + <string name="permgroupdesc_writeDictionary" msgid="2711561994497361646">"사용자 사전에 단어 추가"</string> <string name="permgrouplab_bookmarks" msgid="1949519673103968229">"북마크 및 기록"</string> <string name="permgroupdesc_bookmarks" msgid="4169771606257963028">"북마크 및 브라우저 기록에 직접 액세스합니다."</string> <string name="permgrouplab_deviceAlarms" msgid="6117704629728824101">"알람"</string> @@ -569,8 +561,7 @@ <string name="permdesc_sdcardRead" product="nosdcard" msgid="3530894470637667917">"앱이 사진과 미디어를 포함하고 있을 수 있는 USB 저장소의 콘텐츠를 읽도록 허용합니다."</string> <string name="permdesc_sdcardRead" product="default" msgid="2555811422562526606">"앱이 사진과 미디어를 포함하고 있을 수 있는 SD 카드의 콘텐츠를 읽도록 허용합니다."</string> <string name="permlab_sdcardWrite" product="nosdcard" msgid="8485979062254666748">"USB 저장소의 콘텐츠 수정 또는 삭제"</string> - <!-- no translation found for permlab_sdcardWrite (8805693630050458763) --> - <skip /> + <string name="permlab_sdcardWrite" product="default" msgid="8805693630050458763">"SD 카드의 콘텐츠 수정 또는 삭제"</string> <string name="permdesc_sdcardWrite" product="nosdcard" msgid="6175406299445710888">"앱이 USB 저장소에 쓸 수 있도록 허용합니다."</string> <string name="permdesc_sdcardWrite" product="default" msgid="4337417790936632090">"앱이 SD 카드에 쓸 수 있도록 허용합니다."</string> <string name="permlab_mediaStorageWrite" product="default" msgid="6859839199706879015">"내부 미디어 저장소 콘텐츠 수정/삭제"</string> @@ -1090,8 +1081,7 @@ <string name="date_time_set" msgid="5777075614321087758">"설정"</string> <string name="date_time_done" msgid="2507683751759308828">"완료"</string> <string name="perms_new_perm_prefix" msgid="8257740710754301407"><font size="12" fgcolor="#ff900000">"신규: "</font></string> - <!-- no translation found for perms_description_app (5139836143293299417) --> - <skip /> + <string name="perms_description_app" msgid="5139836143293299417">"<xliff:g id="APP_NAME">%1$s</xliff:g> 제공"</string> <string name="no_permissions" msgid="7283357728219338112">"권한 필요 없음"</string> <string name="usb_storage_activity_title" msgid="4465055157209648641">"USB 대용량 저장소"</string> <string name="usb_storage_title" msgid="5901459041398751495">"USB 연결됨"</string> @@ -1321,8 +1311,6 @@ <string name="sending" msgid="3245653681008218030">"전송 중..."</string> <string name="launchBrowserDefault" msgid="2057951947297614725">"브라우저를 실행하시겠습니까?"</string> <string name="SetupCallDefault" msgid="5834948469253758575">"통화를 수락하시겠습니까?"</string> - <!-- no translation found for activity_resolver_use_always (8017770747801494933) --> - <skip /> - <!-- no translation found for activity_resolver_use_once (405646673463328329) --> - <skip /> + <string name="activity_resolver_use_always" msgid="8017770747801494933">"항상"</string> + <string name="activity_resolver_use_once" msgid="405646673463328329">"한 번만"</string> </resources> diff --git a/core/res/res/values-land/arrays.xml b/core/res/res/values-land/arrays.xml index 537d27c503ec..7095c02696d3 100644 --- a/core/res/res/values-land/arrays.xml +++ b/core/res/res/values-land/arrays.xml @@ -69,4 +69,11 @@ <item>@string/description_target_camera</item> </array> + <array name="lockscreen_chevron_drawables"> + <item>@null</item> + <item>@drawable/ic_lockscreen_chevron_up</item> + <item>@null</item> + <item>@null</item> + </array> + </resources> diff --git a/core/res/res/values-ms/strings.xml b/core/res/res/values-ms/strings.xml index 927e2393bf70..47aa00a83041 100644 --- a/core/res/res/values-ms/strings.xml +++ b/core/res/res/values-ms/strings.xml @@ -1311,7 +1311,6 @@ <string name="sending" msgid="3245653681008218030">"Menghantar…"</string> <string name="launchBrowserDefault" msgid="2057951947297614725">"Lancarkan Penyemak Imbas?"</string> <string name="SetupCallDefault" msgid="5834948469253758575">"Terima panggilan?"</string> - <!-- no translation found for activity_resolver_use_always (8017770747801494933) --> - <skip /> + <string name="activity_resolver_use_always" msgid="8017770747801494933">"Sentiasa"</string> <string name="activity_resolver_use_once" msgid="405646673463328329">"Hanya Sekali"</string> </resources> diff --git a/core/res/res/values-nb/strings.xml b/core/res/res/values-nb/strings.xml index 88db9f48929a..d39c75cb95cf 100644 --- a/core/res/res/values-nb/strings.xml +++ b/core/res/res/values-nb/strings.xml @@ -1321,8 +1321,7 @@ <string name="sending" msgid="3245653681008218030">"Sender …"</string> <string name="launchBrowserDefault" msgid="2057951947297614725">"Vil du starte nettleseren?"</string> <string name="SetupCallDefault" msgid="5834948469253758575">"Vil du besvare anropet?"</string> - <!-- no translation found for activity_resolver_use_always (8017770747801494933) --> - <skip /> + <string name="activity_resolver_use_always" msgid="8017770747801494933">"Alltid"</string> <!-- no translation found for activity_resolver_use_once (405646673463328329) --> <skip /> </resources> diff --git a/core/res/res/values-pl/strings.xml b/core/res/res/values-pl/strings.xml index 62c839b13743..60ea8e8545dd 100644 --- a/core/res/res/values-pl/strings.xml +++ b/core/res/res/values-pl/strings.xml @@ -1321,8 +1321,7 @@ <string name="sending" msgid="3245653681008218030">"Wysyłanie..."</string> <string name="launchBrowserDefault" msgid="2057951947297614725">"Uruchomić przeglądarkę?"</string> <string name="SetupCallDefault" msgid="5834948469253758575">"Odebrać połączenie?"</string> - <!-- no translation found for activity_resolver_use_always (8017770747801494933) --> - <skip /> + <string name="activity_resolver_use_always" msgid="8017770747801494933">"Zawsze"</string> <!-- no translation found for activity_resolver_use_once (405646673463328329) --> <skip /> </resources> diff --git a/core/res/res/values-pt-rPT/strings.xml b/core/res/res/values-pt-rPT/strings.xml index 182534644a20..4bb3b2f6e9fa 100644 --- a/core/res/res/values-pt-rPT/strings.xml +++ b/core/res/res/values-pt-rPT/strings.xml @@ -175,28 +175,20 @@ <string name="permgroupdesc_location" msgid="5704679763124170100">"Monitorizar a sua localização física."</string> <string name="permgrouplab_network" msgid="5808983377727109831">"Comunicação de rede"</string> <string name="permgroupdesc_network" msgid="4478299413241861987">"Aceder a várias funcionalidades de rede."</string> - <!-- no translation found for permgrouplab_bluetoothNetwork (1585403544162128109) --> - <skip /> - <!-- no translation found for permgroupdesc_bluetoothNetwork (5625288577164282391) --> - <skip /> - <!-- no translation found for permgrouplab_shortrangeNetwork (130808676377486118) --> - <skip /> - <!-- no translation found for permgroupdesc_shortrangeNetwork (1884069062653436007) --> - <skip /> + <string name="permgrouplab_bluetoothNetwork" msgid="1585403544162128109">"Bluetooth"</string> + <string name="permgroupdesc_bluetoothNetwork" msgid="5625288577164282391">"Aceder a dispositivos e redes através de Bluetooth."</string> + <string name="permgrouplab_shortrangeNetwork" msgid="130808676377486118">"Redes de Curto Alcance"</string> + <string name="permgroupdesc_shortrangeNetwork" msgid="1884069062653436007">"Aceder a dispositivos através de redes de curto alcance como NFC."</string> <string name="permgrouplab_audioSettings" msgid="8329261670151871235">"Definições de Áudio"</string> <string name="permgroupdesc_audioSettings" msgid="2641515403347568130">"Alterar as definições de áudio."</string> <string name="permgrouplab_affectsBattery" msgid="6209246653424798033">"Afetar a Bateria"</string> <string name="permgroupdesc_affectsBattery" msgid="6441275320638916947">"Utilizar funcionalidades que podem descarregar rapidamente a bateria."</string> <string name="permgrouplab_calendar" msgid="5863508437783683902">"Calendário"</string> <string name="permgroupdesc_calendar" msgid="5777534316982184416">"Acesso direto ao calendário e eventos."</string> - <!-- no translation found for permgrouplab_dictionary (4148597128843641379) --> - <skip /> - <!-- no translation found for permgroupdesc_dictionary (7921166355964764490) --> - <skip /> - <!-- no translation found for permgrouplab_writeDictionary (8090237702432576788) --> - <skip /> - <!-- no translation found for permgroupdesc_writeDictionary (2711561994497361646) --> - <skip /> + <string name="permgrouplab_dictionary" msgid="4148597128843641379">"Ler Dicionário do Utilizador"</string> + <string name="permgroupdesc_dictionary" msgid="7921166355964764490">"Ler palavras no dicionário do utilizador."</string> + <string name="permgrouplab_writeDictionary" msgid="8090237702432576788">"Escrever no Dicionário do Utilizador"</string> + <string name="permgroupdesc_writeDictionary" msgid="2711561994497361646">"Adicionar palavras ao dicionário do utilizador."</string> <string name="permgrouplab_bookmarks" msgid="1949519673103968229">"Marcadores e Histórico"</string> <string name="permgroupdesc_bookmarks" msgid="4169771606257963028">"Acesso direto aos marcadores e histórico do navegador."</string> <string name="permgrouplab_deviceAlarms" msgid="6117704629728824101">"Alarme"</string> @@ -569,8 +561,7 @@ <string name="permdesc_sdcardRead" product="nosdcard" msgid="3530894470637667917">"Permitir que aplic. leia cont. da mem. USB, que poderão incluir fotogr. e multimédia."</string> <string name="permdesc_sdcardRead" product="default" msgid="2555811422562526606">"Permite que a aplicação leia os conteúdos do cartão SD que poderão incluir fotografias e elementos multimédia."</string> <string name="permlab_sdcardWrite" product="nosdcard" msgid="8485979062254666748">"modificar ou eliminar os conteúdos da memória USB"</string> - <!-- no translation found for permlab_sdcardWrite (8805693630050458763) --> - <skip /> + <string name="permlab_sdcardWrite" product="default" msgid="8805693630050458763">"modificar ou eliminar os conteúdos do cartão SD"</string> <string name="permdesc_sdcardWrite" product="nosdcard" msgid="6175406299445710888">"Permite que a aplicação escreva na unidade de armazenamento USB."</string> <string name="permdesc_sdcardWrite" product="default" msgid="4337417790936632090">"Permite que a aplicação escreva no cartão SD."</string> <string name="permlab_mediaStorageWrite" product="default" msgid="6859839199706879015">"modif./elim. armaz. interno"</string> @@ -1090,8 +1081,7 @@ <string name="date_time_set" msgid="5777075614321087758">"Definir"</string> <string name="date_time_done" msgid="2507683751759308828">"Concluído"</string> <string name="perms_new_perm_prefix" msgid="8257740710754301407"><font size="12" fgcolor="#ff900000">"NOVA: "</font></string> - <!-- no translation found for perms_description_app (5139836143293299417) --> - <skip /> + <string name="perms_description_app" msgid="5139836143293299417">"Fornecido por <xliff:g id="APP_NAME">%1$s</xliff:g>."</string> <string name="no_permissions" msgid="7283357728219338112">"Não são necessárias permissões"</string> <string name="usb_storage_activity_title" msgid="4465055157209648641">"Armazenamento em massa USB"</string> <string name="usb_storage_title" msgid="5901459041398751495">"Ligado através de USB"</string> @@ -1323,6 +1313,5 @@ <string name="SetupCallDefault" msgid="5834948469253758575">"Aceitar chamada?"</string> <!-- no translation found for activity_resolver_use_always (8017770747801494933) --> <skip /> - <!-- no translation found for activity_resolver_use_once (405646673463328329) --> - <skip /> + <string name="activity_resolver_use_once" msgid="405646673463328329">"Só Uma Vez"</string> </resources> diff --git a/core/res/res/values-pt/strings.xml b/core/res/res/values-pt/strings.xml index 66ec3a86150e..ba10acd543a8 100644 --- a/core/res/res/values-pt/strings.xml +++ b/core/res/res/values-pt/strings.xml @@ -1311,7 +1311,6 @@ <string name="sending" msgid="3245653681008218030">"Enviando..."</string> <string name="launchBrowserDefault" msgid="2057951947297614725">"Abrir Navegador?"</string> <string name="SetupCallDefault" msgid="5834948469253758575">"Aceitar chamada?"</string> - <!-- no translation found for activity_resolver_use_always (8017770747801494933) --> - <skip /> + <string name="activity_resolver_use_always" msgid="8017770747801494933">"Sempre"</string> <string name="activity_resolver_use_once" msgid="405646673463328329">"Só uma vez"</string> </resources> diff --git a/core/res/res/values-ro/strings.xml b/core/res/res/values-ro/strings.xml index 61428cd14add..45783d133f48 100644 --- a/core/res/res/values-ro/strings.xml +++ b/core/res/res/values-ro/strings.xml @@ -1321,8 +1321,7 @@ <string name="sending" msgid="3245653681008218030">"Se trimite..."</string> <string name="launchBrowserDefault" msgid="2057951947297614725">"Lansaţi browserul?"</string> <string name="SetupCallDefault" msgid="5834948469253758575">"Acceptaţi apelul?"</string> - <!-- no translation found for activity_resolver_use_always (8017770747801494933) --> - <skip /> + <string name="activity_resolver_use_always" msgid="8017770747801494933">"Întotdeauna"</string> <!-- no translation found for activity_resolver_use_once (405646673463328329) --> <skip /> </resources> diff --git a/core/res/res/values-sk/strings.xml b/core/res/res/values-sk/strings.xml index db562c7692b5..79cb76a07404 100644 --- a/core/res/res/values-sk/strings.xml +++ b/core/res/res/values-sk/strings.xml @@ -175,28 +175,20 @@ <string name="permgroupdesc_location" msgid="5704679763124170100">"Sledovanie vašej fyzickej polohy."</string> <string name="permgrouplab_network" msgid="5808983377727109831">"Sieťová komunikácia"</string> <string name="permgroupdesc_network" msgid="4478299413241861987">"Prístup k rôznym funkciám siete."</string> - <!-- no translation found for permgrouplab_bluetoothNetwork (1585403544162128109) --> - <skip /> - <!-- no translation found for permgroupdesc_bluetoothNetwork (5625288577164282391) --> - <skip /> - <!-- no translation found for permgrouplab_shortrangeNetwork (130808676377486118) --> - <skip /> - <!-- no translation found for permgroupdesc_shortrangeNetwork (1884069062653436007) --> - <skip /> + <string name="permgrouplab_bluetoothNetwork" msgid="1585403544162128109">"Bluetooth"</string> + <string name="permgroupdesc_bluetoothNetwork" msgid="5625288577164282391">"Prístup k zariadeniam a sieťam prostredníctvom rozhrania Bluetooth."</string> + <string name="permgrouplab_shortrangeNetwork" msgid="130808676377486118">"Siete krátkeho dosahu"</string> + <string name="permgroupdesc_shortrangeNetwork" msgid="1884069062653436007">"Prístup k zariadeniam prostredníctvom sietí krátkeho dosahu (napr. NFC)."</string> <string name="permgrouplab_audioSettings" msgid="8329261670151871235">"Nastavenia zvuku"</string> <string name="permgroupdesc_audioSettings" msgid="2641515403347568130">"Zmena nastavení zvuku."</string> <string name="permgrouplab_affectsBattery" msgid="6209246653424798033">"Má vplyv na batériu"</string> <string name="permgroupdesc_affectsBattery" msgid="6441275320638916947">"Používanie funkcií, ktoré môžu rýchlo vyčerpať batériu."</string> <string name="permgrouplab_calendar" msgid="5863508437783683902">"Kalendár"</string> <string name="permgroupdesc_calendar" msgid="5777534316982184416">"Priamy prístup ku kalendáru a udalostiam."</string> - <!-- no translation found for permgrouplab_dictionary (4148597128843641379) --> - <skip /> - <!-- no translation found for permgroupdesc_dictionary (7921166355964764490) --> - <skip /> - <!-- no translation found for permgrouplab_writeDictionary (8090237702432576788) --> - <skip /> - <!-- no translation found for permgroupdesc_writeDictionary (2711561994497361646) --> - <skip /> + <string name="permgrouplab_dictionary" msgid="4148597128843641379">"Čítanie požívateľského slovníka"</string> + <string name="permgroupdesc_dictionary" msgid="7921166355964764490">"Čítanie slov v používateľskom slovníku."</string> + <string name="permgrouplab_writeDictionary" msgid="8090237702432576788">"Zápis do používateľského slovníka"</string> + <string name="permgroupdesc_writeDictionary" msgid="2711561994497361646">"Pridávanie slov do používateľského slovníka."</string> <string name="permgrouplab_bookmarks" msgid="1949519673103968229">"Záložky a história"</string> <string name="permgroupdesc_bookmarks" msgid="4169771606257963028">"Priamy prístup k záložkám a histórii prehliadača."</string> <string name="permgrouplab_deviceAlarms" msgid="6117704629728824101">"Budík"</string> @@ -569,8 +561,7 @@ <string name="permdesc_sdcardRead" product="nosdcard" msgid="3530894470637667917">"Umožňuje aplikácii čítať obsah úložiska USB, ktorý môže obsahovať fotografie a mediálne údaje."</string> <string name="permdesc_sdcardRead" product="default" msgid="2555811422562526606">"Umožňuje aplikácii čítať obsah karty SD, ktorý môže zahrnovať fotografie a mediálne údaje."</string> <string name="permlab_sdcardWrite" product="nosdcard" msgid="8485979062254666748">"upraviť alebo odstrániť obsah úložiska USB"</string> - <!-- no translation found for permlab_sdcardWrite (8805693630050458763) --> - <skip /> + <string name="permlab_sdcardWrite" product="default" msgid="8805693630050458763">"úprava alebo odstránenie obsahu na karte SD"</string> <string name="permdesc_sdcardWrite" product="nosdcard" msgid="6175406299445710888">"Umožňuje aplikácii zápis do ukladacieho priestoru USB."</string> <string name="permdesc_sdcardWrite" product="default" msgid="4337417790936632090">"Umožňuje aplikácii zápis na kartu SD."</string> <string name="permlab_mediaStorageWrite" product="default" msgid="6859839199706879015">"úprava alebo odstránenie obsahu interného ukladacieho priestoru média"</string> @@ -1090,8 +1081,7 @@ <string name="date_time_set" msgid="5777075614321087758">"Nastaviť"</string> <string name="date_time_done" msgid="2507683751759308828">"Hotovo"</string> <string name="perms_new_perm_prefix" msgid="8257740710754301407"><font size="12" fgcolor="#ff900000">"NOVINKA: "</font></string> - <!-- no translation found for perms_description_app (5139836143293299417) --> - <skip /> + <string name="perms_description_app" msgid="5139836143293299417">"Poskytuje aplikácia <xliff:g id="APP_NAME">%1$s</xliff:g>."</string> <string name="no_permissions" msgid="7283357728219338112">"Nevyžadujú sa žiadne oprávnenia."</string> <string name="usb_storage_activity_title" msgid="4465055157209648641">"Veľkokapacitné úložisko USB"</string> <string name="usb_storage_title" msgid="5901459041398751495">"Zariadenie USB pripojené"</string> @@ -1321,8 +1311,6 @@ <string name="sending" msgid="3245653681008218030">"Odosielanie..."</string> <string name="launchBrowserDefault" msgid="2057951947297614725">"Spustiť prehliadač?"</string> <string name="SetupCallDefault" msgid="5834948469253758575">"Prijať hovor?"</string> - <!-- no translation found for activity_resolver_use_always (8017770747801494933) --> - <skip /> - <!-- no translation found for activity_resolver_use_once (405646673463328329) --> - <skip /> + <string name="activity_resolver_use_always" msgid="8017770747801494933">"Vždy"</string> + <string name="activity_resolver_use_once" msgid="405646673463328329">"Len raz"</string> </resources> diff --git a/core/res/res/values-sr/strings.xml b/core/res/res/values-sr/strings.xml index 11a733d5fc54..e943ddaea48c 100644 --- a/core/res/res/values-sr/strings.xml +++ b/core/res/res/values-sr/strings.xml @@ -1321,8 +1321,7 @@ <string name="sending" msgid="3245653681008218030">"Слање..."</string> <string name="launchBrowserDefault" msgid="2057951947297614725">"Желите ли да покренете прегледач?"</string> <string name="SetupCallDefault" msgid="5834948469253758575">"Желите ли да прихватите позив?"</string> - <!-- no translation found for activity_resolver_use_always (8017770747801494933) --> - <skip /> + <string name="activity_resolver_use_always" msgid="8017770747801494933">"Увек"</string> <!-- no translation found for activity_resolver_use_once (405646673463328329) --> <skip /> </resources> diff --git a/core/res/res/values-tl/strings.xml b/core/res/res/values-tl/strings.xml index 95447016ee24..70f81434b794 100644 --- a/core/res/res/values-tl/strings.xml +++ b/core/res/res/values-tl/strings.xml @@ -1311,7 +1311,6 @@ <string name="sending" msgid="3245653681008218030">"Ipinapadala..."</string> <string name="launchBrowserDefault" msgid="2057951947297614725">"Ilunsad ang Browser?"</string> <string name="SetupCallDefault" msgid="5834948469253758575">"Tanggapin ang tawag?"</string> - <!-- no translation found for activity_resolver_use_always (8017770747801494933) --> - <skip /> + <string name="activity_resolver_use_always" msgid="8017770747801494933">"Palagi"</string> <string name="activity_resolver_use_once" msgid="405646673463328329">"Isang Beses Lang"</string> </resources> diff --git a/core/res/res/values-uk/strings.xml b/core/res/res/values-uk/strings.xml index 4a1a0bcdcc0a..150f728fd484 100644 --- a/core/res/res/values-uk/strings.xml +++ b/core/res/res/values-uk/strings.xml @@ -175,28 +175,20 @@ <string name="permgroupdesc_location" msgid="5704679763124170100">"Відстежувати ваше фізичне місцезнаходження."</string> <string name="permgrouplab_network" msgid="5808983377727109831">"Підключення до мережі"</string> <string name="permgroupdesc_network" msgid="4478299413241861987">"Отримувати доступ до різних функцій мережі."</string> - <!-- no translation found for permgrouplab_bluetoothNetwork (1585403544162128109) --> - <skip /> - <!-- no translation found for permgroupdesc_bluetoothNetwork (5625288577164282391) --> - <skip /> - <!-- no translation found for permgrouplab_shortrangeNetwork (130808676377486118) --> - <skip /> - <!-- no translation found for permgroupdesc_shortrangeNetwork (1884069062653436007) --> - <skip /> + <string name="permgrouplab_bluetoothNetwork" msgid="1585403544162128109">"Bluetooth"</string> + <string name="permgroupdesc_bluetoothNetwork" msgid="5625288577164282391">"Отримувати доступ до пристроїв і мереж через Bluetooth."</string> + <string name="permgrouplab_shortrangeNetwork" msgid="130808676377486118">"Мережі короткого діапазону"</string> + <string name="permgroupdesc_shortrangeNetwork" msgid="1884069062653436007">"Отримувати доступ до пристроїв через мережі короткого діапазону, як-от NFC."</string> <string name="permgrouplab_audioSettings" msgid="8329261670151871235">"Налаштування звуку"</string> <string name="permgroupdesc_audioSettings" msgid="2641515403347568130">"Зміна налаштувань звуку."</string> <string name="permgrouplab_affectsBattery" msgid="6209246653424798033">"Заряд акумулятора"</string> <string name="permgroupdesc_affectsBattery" msgid="6441275320638916947">"Використання функцій, які швидко зменшують заряд акумулятора."</string> <string name="permgrouplab_calendar" msgid="5863508437783683902">"Календар"</string> <string name="permgroupdesc_calendar" msgid="5777534316982184416">"Безпосередній доступ до календаря та подій."</string> - <!-- no translation found for permgrouplab_dictionary (4148597128843641379) --> - <skip /> - <!-- no translation found for permgroupdesc_dictionary (7921166355964764490) --> - <skip /> - <!-- no translation found for permgrouplab_writeDictionary (8090237702432576788) --> - <skip /> - <!-- no translation found for permgroupdesc_writeDictionary (2711561994497361646) --> - <skip /> + <string name="permgrouplab_dictionary" msgid="4148597128843641379">"Читати словник користувача"</string> + <string name="permgroupdesc_dictionary" msgid="7921166355964764490">"Читати слова в словнику користувача."</string> + <string name="permgrouplab_writeDictionary" msgid="8090237702432576788">"Писати в словник користувача"</string> + <string name="permgroupdesc_writeDictionary" msgid="2711561994497361646">"Додавати слова в словник користувача."</string> <string name="permgrouplab_bookmarks" msgid="1949519673103968229">"Закладки й історія"</string> <string name="permgroupdesc_bookmarks" msgid="4169771606257963028">"Безпосередній доступ до закладок та історії веб-переглядача."</string> <string name="permgrouplab_deviceAlarms" msgid="6117704629728824101">"Сигнал"</string> @@ -569,8 +561,7 @@ <string name="permdesc_sdcardRead" product="nosdcard" msgid="3530894470637667917">"Дозволяє програмі читати вміст носія USB, що може включати фотографії й медіа-файли."</string> <string name="permdesc_sdcardRead" product="default" msgid="2555811422562526606">"Дозволяє програмі читати вміст карти SD, що може включати фотографії й медіа-файли."</string> <string name="permlab_sdcardWrite" product="nosdcard" msgid="8485979062254666748">"змінювати чи видаляти вміст USB"</string> - <!-- no translation found for permlab_sdcardWrite (8805693630050458763) --> - <skip /> + <string name="permlab_sdcardWrite" product="default" msgid="8805693630050458763">"змінювати чи видаляти вміст на карті SD"</string> <string name="permdesc_sdcardWrite" product="nosdcard" msgid="6175406299445710888">"Дозволяє програмі писати на носій USB"</string> <string name="permdesc_sdcardWrite" product="default" msgid="4337417790936632090">"Дозволяє програмі записувати на карту SD."</string> <string name="permlab_mediaStorageWrite" product="default" msgid="6859839199706879015">"змінювати/видаляти вміст внутр. сховища даних"</string> @@ -1090,8 +1081,7 @@ <string name="date_time_set" msgid="5777075614321087758">"Застосувати"</string> <string name="date_time_done" msgid="2507683751759308828">"Готово"</string> <string name="perms_new_perm_prefix" msgid="8257740710754301407"><font size="12" fgcolor="#ff900000">"НОВИЙ: "</font></string> - <!-- no translation found for perms_description_app (5139836143293299417) --> - <skip /> + <string name="perms_description_app" msgid="5139836143293299417">"Надано <xliff:g id="APP_NAME">%1$s</xliff:g>."</string> <string name="no_permissions" msgid="7283357728219338112">"Дозвіл не потрібний"</string> <string name="usb_storage_activity_title" msgid="4465055157209648641">"USB великої ємності"</string> <string name="usb_storage_title" msgid="5901459041398751495">"Підкл. через USB"</string> @@ -1321,8 +1311,6 @@ <string name="sending" msgid="3245653681008218030">"Надсилання…"</string> <string name="launchBrowserDefault" msgid="2057951947297614725">"Запустити веб-переглядач?"</string> <string name="SetupCallDefault" msgid="5834948469253758575">"Прийняти виклик?"</string> - <!-- no translation found for activity_resolver_use_always (8017770747801494933) --> - <skip /> - <!-- no translation found for activity_resolver_use_once (405646673463328329) --> - <skip /> + <string name="activity_resolver_use_always" msgid="8017770747801494933">"Завжди"</string> + <string name="activity_resolver_use_once" msgid="405646673463328329">"Лише один раз"</string> </resources> diff --git a/core/res/res/values-zh-rCN/strings.xml b/core/res/res/values-zh-rCN/strings.xml index ea037972531f..b2ba9973999c 100644 --- a/core/res/res/values-zh-rCN/strings.xml +++ b/core/res/res/values-zh-rCN/strings.xml @@ -1311,7 +1311,6 @@ <string name="sending" msgid="3245653681008218030">"正在发送..."</string> <string name="launchBrowserDefault" msgid="2057951947297614725">"要启动浏览器吗?"</string> <string name="SetupCallDefault" msgid="5834948469253758575">"要接听电话吗?"</string> - <!-- no translation found for activity_resolver_use_always (8017770747801494933) --> - <skip /> + <string name="activity_resolver_use_always" msgid="8017770747801494933">"始终"</string> <string name="activity_resolver_use_once" msgid="405646673463328329">"仅此一次"</string> </resources> diff --git a/core/res/res/values/arrays.xml b/core/res/res/values/arrays.xml index d05a31ce1529..1eeca5948d87 100644 --- a/core/res/res/values/arrays.xml +++ b/core/res/res/values/arrays.xml @@ -400,4 +400,11 @@ <item>@null</item> </array> + <array name="lockscreen_chevron_drawables"> + <item>@drawable/ic_lockscreen_chevron_right</item> + <item>@null</item> + <item>@null</item> + <item>@null</item> + </array> + </resources> diff --git a/core/res/res/values/attrs.xml b/core/res/res/values/attrs.xml index 69fe6dcfff5b..2f540a5302a5 100755 --- a/core/res/res/values/attrs.xml +++ b/core/res/res/values/attrs.xml @@ -5355,18 +5355,25 @@ <!-- Sets a drawable as the drag center. --> <attr name="handleDrawable" format="reference" /> - <!-- Drawable to use for chevron animation on the left. May be null. --> + <!-- Drawable to use for chevron animation on the left. May be null. + @deprecated use chevronDrawables instead --> <attr name="leftChevronDrawable" format="reference" /> - <!-- Drawable to use for chevron animation on the right. May be null. --> + <!-- Drawable to use for chevron animation on the right. May be null. + @deprecated use chevronDrawables instead --> <attr name="rightChevronDrawable" format="reference" /> - <!-- Drawable to use for chevron animation on the top. May be null. --> + <!-- Drawable to use for chevron animation on the top. May be null. + @deprecated use chevronDrawables instead --> <attr name="topChevronDrawable" format="reference" /> - <!-- Drawable to use for chevron animation on the bottom. May be null. --> + <!-- Drawable to use for chevron animation on the bottom. May be null. + @deprecated use chevronDrawables instead --> <attr name="bottomChevronDrawable" format="reference" /> + <!-- Drawables to use for chevron animations. May be null. --> + <attr name="chevronDrawables" format="reference"/> + <!-- Drawable to use for wave ripple animation. --> <attr name="waveDrawable" format="reference" /> @@ -5627,6 +5634,6 @@ <!-- The display label of the keyboard layout. --> <attr name="label" /> <!-- The key character map file resource. --> - <attr name="kcm" format="reference" /> + <attr name="keyboardLayout" format="reference" /> </declare-styleable> </resources> diff --git a/core/res/res/values/public.xml b/core/res/res/values/public.xml index bcc7cd9301a5..48038dd1c456 100644 --- a/core/res/res/values/public.xml +++ b/core/res/res/values/public.xml @@ -1009,6 +1009,7 @@ <java-symbol type="drawable" name="notification_bg_low" /> <java-symbol type="drawable" name="notification_template_icon_bg" /> <java-symbol type="drawable" name="notification_template_icon_low_bg" /> + <java-symbol type="drawable" name="ic_lockscreen_unlock_phantom" /> <java-symbol type="layout" name="action_bar_home" /> <java-symbol type="layout" name="action_bar_title_item" /> @@ -3603,8 +3604,7 @@ <public type="attr" name="permissionGroupFlags" id="0x010103a8" /> <public type="attr" name="isolatedProcess" id="0x010103a9" /> <public type="attr" name="importantForAccessibility" id="0x010103aa" /> - <public type="attr" name="kcm" id="0x010103ab" /> - - <public type="attr" name="fontFamily" /> + <public type="attr" name="keyboardLayout" id="0x010103ab" /> + <public type="attr" name="fontFamily" id="0x010103ac" /> </resources> diff --git a/data/fonts/DroidNaskh-Regular-SystemUI.ttf b/data/fonts/DroidNaskh-Regular-SystemUI.ttf Binary files differindex 5818b4969efd..2f495cf46e60 100755..100644 --- a/data/fonts/DroidNaskh-Regular-SystemUI.ttf +++ b/data/fonts/DroidNaskh-Regular-SystemUI.ttf diff --git a/data/fonts/fallback_fonts-ja.xml b/data/fonts/fallback_fonts-ja.xml index be53d1d493d7..5f9b5ed948bf 100644 --- a/data/fonts/fallback_fonts-ja.xml +++ b/data/fonts/fallback_fonts-ja.xml @@ -70,13 +70,28 @@ </family> <family> <fileset> + <file>DroidSansTamil-Regular.ttf</file> + <file>DroidSansTamil-Bold.ttf</file> + </fileset> + </family> + <family> + <fileset> + <file>AnjaliNewLipi-light.ttf</file> + </fileset> + </family> + <family> + <fileset> <file>Lohit-Bengali.ttf</file> </fileset> </family> <family> <fileset> - <file>DroidSansTamil-Regular.ttf</file> - <file>DroidSansTamil-Bold.ttf</file> + <file>Lohit-Kannada.ttf</file> + </fileset> + </family> + <family> + <fileset> + <file>Lohit-Telugu.ttf</file> </fileset> </family> <family> diff --git a/data/fonts/fallback_fonts.xml b/data/fonts/fallback_fonts.xml index 80fffa9c905d..8517152f9b7b 100644 --- a/data/fonts/fallback_fonts.xml +++ b/data/fonts/fallback_fonts.xml @@ -70,13 +70,27 @@ </family> <family> <fileset> + <file>DroidSansTamil-Regular.ttf</file> + <file>DroidSansTamil-Bold.ttf</file> + </family> + <family> + <fileset> + <file>AnjaliNewLipi-light.ttf</file> + </fileset> + </family> + <family> + <fileset> <file>Lohit-Bengali.ttf</file> </fileset> </family> <family> <fileset> - <file>DroidSansTamil-Regular.ttf</file> - <file>DroidSansTamil-Bold.ttf</file> + <file>Lohit-Kannada.ttf</file> + </fileset> + </family> + <family> + <fileset> + <file>Lohit-Telugu.ttf</file> </fileset> </family> <family> diff --git a/graphics/java/android/graphics/Rect.java b/graphics/java/android/graphics/Rect.java index ec911b06be75..6c204ab17745 100644 --- a/graphics/java/android/graphics/Rect.java +++ b/graphics/java/android/graphics/Rect.java @@ -49,9 +49,9 @@ public final class Rect implements Parcelable { * checking is performed, so the caller must ensure that left <= right and * top <= bottom. * - * @param left The X coordinate of the left side of the rectagle + * @param left The X coordinate of the left side of the rectangle * @param top The Y coordinate of the top of the rectangle - * @param right The X coordinate of the right side of the rectagle + * @param right The X coordinate of the right side of the rectangle * @param bottom The Y coordinate of the bottom of the rectangle */ public Rect(int left, int top, int right, int bottom) { @@ -235,9 +235,9 @@ public final class Rect implements Parcelable { * checking is performed, so it is up to the caller to ensure that * left <= right and top <= bottom. * - * @param left The X coordinate of the left side of the rectagle + * @param left The X coordinate of the left side of the rectangle * @param top The Y coordinate of the top of the rectangle - * @param right The X coordinate of the right side of the rectagle + * @param right The X coordinate of the right side of the rectangle * @param bottom The Y coordinate of the bottom of the rectangle */ public void set(int left, int top, int right, int bottom) { diff --git a/graphics/java/android/graphics/RectF.java b/graphics/java/android/graphics/RectF.java index c633d843cd1d..108b7f9b2da0 100644 --- a/graphics/java/android/graphics/RectF.java +++ b/graphics/java/android/graphics/RectF.java @@ -46,9 +46,9 @@ public class RectF implements Parcelable { * checking is performed, so the caller must ensure that left <= right and * top <= bottom. * - * @param left The X coordinate of the left side of the rectagle + * @param left The X coordinate of the left side of the rectangle * @param top The Y coordinate of the top of the rectangle - * @param right The X coordinate of the right side of the rectagle + * @param right The X coordinate of the right side of the rectangle * @param bottom The Y coordinate of the bottom of the rectangle */ public RectF(float left, float top, float right, float bottom) { @@ -182,9 +182,9 @@ public class RectF implements Parcelable { * checking is performed, so it is up to the caller to ensure that * left <= right and top <= bottom. * - * @param left The X coordinate of the left side of the rectagle + * @param left The X coordinate of the left side of the rectangle * @param top The Y coordinate of the top of the rectangle - * @param right The X coordinate of the right side of the rectagle + * @param right The X coordinate of the right side of the rectangle * @param bottom The Y coordinate of the bottom of the rectangle */ public void set(float left, float top, float right, float bottom) { diff --git a/include/androidfw/Input.h b/include/androidfw/Input.h index 6d03fd6be719..aa8b82459a09 100644 --- a/include/androidfw/Input.h +++ b/include/androidfw/Input.h @@ -27,7 +27,6 @@ #include <utils/Timers.h> #include <utils/RefBase.h> #include <utils/String8.h> -#include <utils/BitSet.h> #ifdef HAVE_ANDROID_OS class SkMatrix; @@ -607,182 +606,6 @@ private: Vector<MotionEvent*> mMotionEventPool; }; -/* - * Calculates the velocity of pointer movements over time. - */ -class VelocityTracker { -public: - // Default polynomial degree. (used by getVelocity) - static const uint32_t DEFAULT_DEGREE = 2; - - // Default sample horizon. (used by getVelocity) - // We don't use too much history by default since we want to react to quick - // changes in direction. - static const nsecs_t DEFAULT_HORIZON = 100 * 1000000; // 100 ms - - struct Position { - float x, y; - }; - - struct Estimator { - static const size_t MAX_DEGREE = 2; - - // Polynomial coefficients describing motion in X and Y. - float xCoeff[MAX_DEGREE + 1], yCoeff[MAX_DEGREE + 1]; - - // Polynomial degree (number of coefficients), or zero if no information is - // available. - uint32_t degree; - - // Confidence (coefficient of determination), between 0 (no fit) and 1 (perfect fit). - float confidence; - - inline void clear() { - degree = 0; - confidence = 0; - for (size_t i = 0; i <= MAX_DEGREE; i++) { - xCoeff[i] = 0; - yCoeff[i] = 0; - } - } - }; - - VelocityTracker(); - - // Resets the velocity tracker state. - void clear(); - - // Resets the velocity tracker state for specific pointers. - // Call this method when some pointers have changed and may be reusing - // an id that was assigned to a different pointer earlier. - void clearPointers(BitSet32 idBits); - - // Adds movement information for a set of pointers. - // The idBits bitfield specifies the pointer ids of the pointers whose positions - // are included in the movement. - // The positions array contains position information for each pointer in order by - // increasing id. Its size should be equal to the number of one bits in idBits. - void addMovement(nsecs_t eventTime, BitSet32 idBits, const Position* positions); - - // Adds movement information for all pointers in a MotionEvent, including historical samples. - void addMovement(const MotionEvent* event); - - // Gets the velocity of the specified pointer id in position units per second. - // Returns false and sets the velocity components to zero if there is - // insufficient movement information for the pointer. - bool getVelocity(uint32_t id, float* outVx, float* outVy) const; - - // Gets a quadratic estimator for the movements of the specified pointer id. - // Returns false and clears the estimator if there is no information available - // about the pointer. - bool getEstimator(uint32_t id, uint32_t degree, nsecs_t horizon, - Estimator* outEstimator) const; - - // Gets the active pointer id, or -1 if none. - inline int32_t getActivePointerId() const { return mActivePointerId; } - - // Gets a bitset containing all pointer ids from the most recent movement. - inline BitSet32 getCurrentPointerIdBits() const { return mMovements[mIndex].idBits; } - -private: - // Number of samples to keep. - static const uint32_t HISTORY_SIZE = 20; - - struct Movement { - nsecs_t eventTime; - BitSet32 idBits; - Position positions[MAX_POINTERS]; - - inline const Position& getPosition(uint32_t id) const { - return positions[idBits.getIndexOfBit(id)]; - } - }; - - uint32_t mIndex; - Movement mMovements[HISTORY_SIZE]; - int32_t mActivePointerId; -}; - - -/* - * Specifies parameters that govern pointer or wheel acceleration. - */ -struct VelocityControlParameters { - // A scale factor that is multiplied with the raw velocity deltas - // prior to applying any other velocity control factors. The scale - // factor should be used to adapt the input device resolution - // (eg. counts per inch) to the output device resolution (eg. pixels per inch). - // - // Must be a positive value. - // Default is 1.0 (no scaling). - float scale; - - // The scaled speed at which acceleration begins to be applied. - // This value establishes the upper bound of a low speed regime for - // small precise motions that are performed without any acceleration. - // - // Must be a non-negative value. - // Default is 0.0 (no low threshold). - float lowThreshold; - - // The scaled speed at which maximum acceleration is applied. - // The difference between highThreshold and lowThreshold controls - // the range of speeds over which the acceleration factor is interpolated. - // The wider the range, the smoother the acceleration. - // - // Must be a non-negative value greater than or equal to lowThreshold. - // Default is 0.0 (no high threshold). - float highThreshold; - - // The acceleration factor. - // When the speed is above the low speed threshold, the velocity will scaled - // by an interpolated value between 1.0 and this amount. - // - // Must be a positive greater than or equal to 1.0. - // Default is 1.0 (no acceleration). - float acceleration; - - VelocityControlParameters() : - scale(1.0f), lowThreshold(0.0f), highThreshold(0.0f), acceleration(1.0f) { - } - - VelocityControlParameters(float scale, float lowThreshold, - float highThreshold, float acceleration) : - scale(scale), lowThreshold(lowThreshold), - highThreshold(highThreshold), acceleration(acceleration) { - } -}; - -/* - * Implements mouse pointer and wheel speed control and acceleration. - */ -class VelocityControl { -public: - VelocityControl(); - - /* Sets the various parameters. */ - void setParameters(const VelocityControlParameters& parameters); - - /* Resets the current movement counters to zero. - * This has the effect of nullifying any acceleration. */ - void reset(); - - /* Translates a raw movement delta into an appropriately - * scaled / accelerated delta based on the current velocity. */ - void move(nsecs_t eventTime, float* deltaX, float* deltaY); - -private: - // If no movements are received within this amount of time, - // we assume the movement has stopped and reset the movement counters. - static const nsecs_t STOP_TIME = 500 * 1000000; // 500 ms - - VelocityControlParameters mParameters; - - nsecs_t mLastMovementTime; - VelocityTracker::Position mRawPosition; - VelocityTracker mVelocityTracker; -}; - } // namespace android #endif // _ANDROIDFW_INPUT_H diff --git a/include/androidfw/VelocityControl.h b/include/androidfw/VelocityControl.h new file mode 100644 index 000000000000..84e0444f2b81 --- /dev/null +++ b/include/androidfw/VelocityControl.h @@ -0,0 +1,107 @@ +/* + * Copyright (C) 2012 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef _ANDROIDFW_VELOCITY_CONTROL_H +#define _ANDROIDFW_VELOCITY_CONTROL_H + +#include <androidfw/Input.h> +#include <androidfw/VelocityTracker.h> +#include <utils/Timers.h> + +namespace android { + +/* + * Specifies parameters that govern pointer or wheel acceleration. + */ +struct VelocityControlParameters { + // A scale factor that is multiplied with the raw velocity deltas + // prior to applying any other velocity control factors. The scale + // factor should be used to adapt the input device resolution + // (eg. counts per inch) to the output device resolution (eg. pixels per inch). + // + // Must be a positive value. + // Default is 1.0 (no scaling). + float scale; + + // The scaled speed at which acceleration begins to be applied. + // This value establishes the upper bound of a low speed regime for + // small precise motions that are performed without any acceleration. + // + // Must be a non-negative value. + // Default is 0.0 (no low threshold). + float lowThreshold; + + // The scaled speed at which maximum acceleration is applied. + // The difference between highThreshold and lowThreshold controls + // the range of speeds over which the acceleration factor is interpolated. + // The wider the range, the smoother the acceleration. + // + // Must be a non-negative value greater than or equal to lowThreshold. + // Default is 0.0 (no high threshold). + float highThreshold; + + // The acceleration factor. + // When the speed is above the low speed threshold, the velocity will scaled + // by an interpolated value between 1.0 and this amount. + // + // Must be a positive greater than or equal to 1.0. + // Default is 1.0 (no acceleration). + float acceleration; + + VelocityControlParameters() : + scale(1.0f), lowThreshold(0.0f), highThreshold(0.0f), acceleration(1.0f) { + } + + VelocityControlParameters(float scale, float lowThreshold, + float highThreshold, float acceleration) : + scale(scale), lowThreshold(lowThreshold), + highThreshold(highThreshold), acceleration(acceleration) { + } +}; + +/* + * Implements mouse pointer and wheel speed control and acceleration. + */ +class VelocityControl { +public: + VelocityControl(); + + /* Sets the various parameters. */ + void setParameters(const VelocityControlParameters& parameters); + + /* Resets the current movement counters to zero. + * This has the effect of nullifying any acceleration. */ + void reset(); + + /* Translates a raw movement delta into an appropriately + * scaled / accelerated delta based on the current velocity. */ + void move(nsecs_t eventTime, float* deltaX, float* deltaY); + +private: + // If no movements are received within this amount of time, + // we assume the movement has stopped and reset the movement counters. + static const nsecs_t STOP_TIME = 500 * 1000000; // 500 ms + + VelocityControlParameters mParameters; + + nsecs_t mLastMovementTime; + VelocityTracker::Position mRawPosition; + VelocityTracker mVelocityTracker; +}; + +} // namespace android + +#endif // _ANDROIDFW_VELOCITY_CONTROL_H diff --git a/include/androidfw/VelocityTracker.h b/include/androidfw/VelocityTracker.h new file mode 100644 index 000000000000..6d17e1f32c2d --- /dev/null +++ b/include/androidfw/VelocityTracker.h @@ -0,0 +1,124 @@ +/* + * Copyright (C) 2012 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef _ANDROIDFW_VELOCITY_TRACKER_H +#define _ANDROIDFW_VELOCITY_TRACKER_H + +#include <androidfw/Input.h> +#include <utils/Timers.h> +#include <utils/BitSet.h> + +namespace android { + +/* + * Calculates the velocity of pointer movements over time. + */ +class VelocityTracker { +public: + // Default polynomial degree. (used by getVelocity) + static const uint32_t DEFAULT_DEGREE = 2; + + // Default sample horizon. (used by getVelocity) + // We don't use too much history by default since we want to react to quick + // changes in direction. + static const nsecs_t DEFAULT_HORIZON = 100 * 1000000; // 100 ms + + struct Position { + float x, y; + }; + + struct Estimator { + static const size_t MAX_DEGREE = 2; + + // Polynomial coefficients describing motion in X and Y. + float xCoeff[MAX_DEGREE + 1], yCoeff[MAX_DEGREE + 1]; + + // Polynomial degree (number of coefficients), or zero if no information is + // available. + uint32_t degree; + + // Confidence (coefficient of determination), between 0 (no fit) and 1 (perfect fit). + float confidence; + + inline void clear() { + degree = 0; + confidence = 0; + for (size_t i = 0; i <= MAX_DEGREE; i++) { + xCoeff[i] = 0; + yCoeff[i] = 0; + } + } + }; + + VelocityTracker(); + + // Resets the velocity tracker state. + void clear(); + + // Resets the velocity tracker state for specific pointers. + // Call this method when some pointers have changed and may be reusing + // an id that was assigned to a different pointer earlier. + void clearPointers(BitSet32 idBits); + + // Adds movement information for a set of pointers. + // The idBits bitfield specifies the pointer ids of the pointers whose positions + // are included in the movement. + // The positions array contains position information for each pointer in order by + // increasing id. Its size should be equal to the number of one bits in idBits. + void addMovement(nsecs_t eventTime, BitSet32 idBits, const Position* positions); + + // Adds movement information for all pointers in a MotionEvent, including historical samples. + void addMovement(const MotionEvent* event); + + // Gets the velocity of the specified pointer id in position units per second. + // Returns false and sets the velocity components to zero if there is + // insufficient movement information for the pointer. + bool getVelocity(uint32_t id, float* outVx, float* outVy) const; + + // Gets a quadratic estimator for the movements of the specified pointer id. + // Returns false and clears the estimator if there is no information available + // about the pointer. + bool getEstimator(uint32_t id, uint32_t degree, nsecs_t horizon, + Estimator* outEstimator) const; + + // Gets the active pointer id, or -1 if none. + inline int32_t getActivePointerId() const { return mActivePointerId; } + + // Gets a bitset containing all pointer ids from the most recent movement. + inline BitSet32 getCurrentPointerIdBits() const { return mMovements[mIndex].idBits; } + +private: + // Number of samples to keep. + static const uint32_t HISTORY_SIZE = 20; + + struct Movement { + nsecs_t eventTime; + BitSet32 idBits; + Position positions[MAX_POINTERS]; + + inline const Position& getPosition(uint32_t id) const { + return positions[idBits.getIndexOfBit(id)]; + } + }; + + uint32_t mIndex; + Movement mMovements[HISTORY_SIZE]; + int32_t mActivePointerId; +}; + +} // namespace android + +#endif // _ANDROIDFW_VELOCITY_TRACKER_H diff --git a/libs/androidfw/Android.mk b/libs/androidfw/Android.mk index 95c77d4e6499..3ed75a2988bc 100644 --- a/libs/androidfw/Android.mk +++ b/libs/androidfw/Android.mk @@ -33,6 +33,8 @@ commonUiSources:= \ Keyboard.cpp \ KeyCharacterMap.cpp \ KeyLayoutMap.cpp \ + VelocityControl.cpp \ + VelocityTracker.cpp \ VirtualKeyMap.cpp commonSources:= \ diff --git a/libs/androidfw/Input.cpp b/libs/androidfw/Input.cpp index fbe19268e4fb..40a6c47d031f 100644 --- a/libs/androidfw/Input.cpp +++ b/libs/androidfw/Input.cpp @@ -15,31 +15,13 @@ */ #define LOG_TAG "Input" - //#define LOG_NDEBUG 0 -// Log debug messages about keymap probing. -#define DEBUG_PROBE 0 - -// Log debug messages about velocity tracking. -#define DEBUG_VELOCITY 0 - -// Log debug messages about least squares fitting. -#define DEBUG_LEAST_SQUARES 0 - -// Log debug messages about acceleration. -#define DEBUG_ACCELERATION 0 - - -#include <stdlib.h> -#include <unistd.h> -#include <ctype.h> - -#include <androidfw/Input.h> - #include <math.h> #include <limits.h> +#include <androidfw/Input.h> + #ifdef HAVE_ANDROID_OS #include <binder/Parcel.h> @@ -665,492 +647,4 @@ void PooledInputEventFactory::recycle(InputEvent* event) { delete event; } - -// --- VelocityTracker --- - -const uint32_t VelocityTracker::DEFAULT_DEGREE; -const nsecs_t VelocityTracker::DEFAULT_HORIZON; -const uint32_t VelocityTracker::HISTORY_SIZE; - -static inline float vectorDot(const float* a, const float* b, uint32_t m) { - float r = 0; - while (m--) { - r += *(a++) * *(b++); - } - return r; -} - -static inline float vectorNorm(const float* a, uint32_t m) { - float r = 0; - while (m--) { - float t = *(a++); - r += t * t; - } - return sqrtf(r); -} - -#if DEBUG_LEAST_SQUARES || DEBUG_VELOCITY -static String8 vectorToString(const float* a, uint32_t m) { - String8 str; - str.append("["); - while (m--) { - str.appendFormat(" %f", *(a++)); - if (m) { - str.append(","); - } - } - str.append(" ]"); - return str; -} - -static String8 matrixToString(const float* a, uint32_t m, uint32_t n, bool rowMajor) { - String8 str; - str.append("["); - for (size_t i = 0; i < m; i++) { - if (i) { - str.append(","); - } - str.append(" ["); - for (size_t j = 0; j < n; j++) { - if (j) { - str.append(","); - } - str.appendFormat(" %f", a[rowMajor ? i * n + j : j * m + i]); - } - str.append(" ]"); - } - str.append(" ]"); - return str; -} -#endif - -VelocityTracker::VelocityTracker() { - clear(); -} - -void VelocityTracker::clear() { - mIndex = 0; - mMovements[0].idBits.clear(); - mActivePointerId = -1; -} - -void VelocityTracker::clearPointers(BitSet32 idBits) { - BitSet32 remainingIdBits(mMovements[mIndex].idBits.value & ~idBits.value); - mMovements[mIndex].idBits = remainingIdBits; - - if (mActivePointerId >= 0 && idBits.hasBit(mActivePointerId)) { - mActivePointerId = !remainingIdBits.isEmpty() ? remainingIdBits.firstMarkedBit() : -1; - } -} - -void VelocityTracker::addMovement(nsecs_t eventTime, BitSet32 idBits, const Position* positions) { - if (++mIndex == HISTORY_SIZE) { - mIndex = 0; - } - - while (idBits.count() > MAX_POINTERS) { - idBits.clearLastMarkedBit(); - } - - Movement& movement = mMovements[mIndex]; - movement.eventTime = eventTime; - movement.idBits = idBits; - uint32_t count = idBits.count(); - for (uint32_t i = 0; i < count; i++) { - movement.positions[i] = positions[i]; - } - - if (mActivePointerId < 0 || !idBits.hasBit(mActivePointerId)) { - mActivePointerId = count != 0 ? idBits.firstMarkedBit() : -1; - } - -#if DEBUG_VELOCITY - ALOGD("VelocityTracker: addMovement eventTime=%lld, idBits=0x%08x, activePointerId=%d", - eventTime, idBits.value, mActivePointerId); - for (BitSet32 iterBits(idBits); !iterBits.isEmpty(); ) { - uint32_t id = iterBits.firstMarkedBit(); - uint32_t index = idBits.getIndexOfBit(id); - iterBits.clearBit(id); - Estimator estimator; - getEstimator(id, DEFAULT_DEGREE, DEFAULT_HORIZON, &estimator); - ALOGD(" %d: position (%0.3f, %0.3f), " - "estimator (degree=%d, xCoeff=%s, yCoeff=%s, confidence=%f)", - id, positions[index].x, positions[index].y, - int(estimator.degree), - vectorToString(estimator.xCoeff, estimator.degree).string(), - vectorToString(estimator.yCoeff, estimator.degree).string(), - estimator.confidence); - } -#endif -} - -void VelocityTracker::addMovement(const MotionEvent* event) { - int32_t actionMasked = event->getActionMasked(); - - switch (actionMasked) { - case AMOTION_EVENT_ACTION_DOWN: - case AMOTION_EVENT_ACTION_HOVER_ENTER: - // Clear all pointers on down before adding the new movement. - clear(); - break; - case AMOTION_EVENT_ACTION_POINTER_DOWN: { - // Start a new movement trace for a pointer that just went down. - // We do this on down instead of on up because the client may want to query the - // final velocity for a pointer that just went up. - BitSet32 downIdBits; - downIdBits.markBit(event->getPointerId(event->getActionIndex())); - clearPointers(downIdBits); - break; - } - case AMOTION_EVENT_ACTION_MOVE: - case AMOTION_EVENT_ACTION_HOVER_MOVE: - break; - default: - // Ignore all other actions because they do not convey any new information about - // pointer movement. We also want to preserve the last known velocity of the pointers. - // Note that ACTION_UP and ACTION_POINTER_UP always report the last known position - // of the pointers that went up. ACTION_POINTER_UP does include the new position of - // pointers that remained down but we will also receive an ACTION_MOVE with this - // information if any of them actually moved. Since we don't know how many pointers - // will be going up at once it makes sense to just wait for the following ACTION_MOVE - // before adding the movement. - return; - } - - size_t pointerCount = event->getPointerCount(); - if (pointerCount > MAX_POINTERS) { - pointerCount = MAX_POINTERS; - } - - BitSet32 idBits; - for (size_t i = 0; i < pointerCount; i++) { - idBits.markBit(event->getPointerId(i)); - } - - nsecs_t eventTime; - Position positions[pointerCount]; - - size_t historySize = event->getHistorySize(); - for (size_t h = 0; h < historySize; h++) { - eventTime = event->getHistoricalEventTime(h); - for (size_t i = 0; i < pointerCount; i++) { - positions[i].x = event->getHistoricalX(i, h); - positions[i].y = event->getHistoricalY(i, h); - } - addMovement(eventTime, idBits, positions); - } - - eventTime = event->getEventTime(); - for (size_t i = 0; i < pointerCount; i++) { - positions[i].x = event->getX(i); - positions[i].y = event->getY(i); - } - addMovement(eventTime, idBits, positions); -} - -/** - * Solves a linear least squares problem to obtain a N degree polynomial that fits - * the specified input data as nearly as possible. - * - * Returns true if a solution is found, false otherwise. - * - * The input consists of two vectors of data points X and Y with indices 0..m-1. - * The output is a vector B with indices 0..n-1 that describes a polynomial - * that fits the data, such the sum of abs(Y[i] - (B[0] + B[1] X[i] + B[2] X[i]^2 ... B[n] X[i]^n)) - * for all i between 0 and m-1 is minimized. - * - * That is to say, the function that generated the input data can be approximated - * by y(x) ~= B[0] + B[1] x + B[2] x^2 + ... + B[n] x^n. - * - * The coefficient of determination (R^2) is also returned to describe the goodness - * of fit of the model for the given data. It is a value between 0 and 1, where 1 - * indicates perfect correspondence. - * - * This function first expands the X vector to a m by n matrix A such that - * A[i][0] = 1, A[i][1] = X[i], A[i][2] = X[i]^2, ..., A[i][n] = X[i]^n. - * - * Then it calculates the QR decomposition of A yielding an m by m orthonormal matrix Q - * and an m by n upper triangular matrix R. Because R is upper triangular (lower - * part is all zeroes), we can simplify the decomposition into an m by n matrix - * Q1 and a n by n matrix R1 such that A = Q1 R1. - * - * Finally we solve the system of linear equations given by R1 B = (Qtranspose Y) - * to find B. - * - * For efficiency, we lay out A and Q column-wise in memory because we frequently - * operate on the column vectors. Conversely, we lay out R row-wise. - * - * http://en.wikipedia.org/wiki/Numerical_methods_for_linear_least_squares - * http://en.wikipedia.org/wiki/Gram-Schmidt - */ -static bool solveLeastSquares(const float* x, const float* y, uint32_t m, uint32_t n, - float* outB, float* outDet) { -#if DEBUG_LEAST_SQUARES - ALOGD("solveLeastSquares: m=%d, n=%d, x=%s, y=%s", int(m), int(n), - vectorToString(x, m).string(), vectorToString(y, m).string()); -#endif - - // Expand the X vector to a matrix A. - float a[n][m]; // column-major order - for (uint32_t h = 0; h < m; h++) { - a[0][h] = 1; - for (uint32_t i = 1; i < n; i++) { - a[i][h] = a[i - 1][h] * x[h]; - } - } -#if DEBUG_LEAST_SQUARES - ALOGD(" - a=%s", matrixToString(&a[0][0], m, n, false /*rowMajor*/).string()); -#endif - - // Apply the Gram-Schmidt process to A to obtain its QR decomposition. - float q[n][m]; // orthonormal basis, column-major order - float r[n][n]; // upper triangular matrix, row-major order - for (uint32_t j = 0; j < n; j++) { - for (uint32_t h = 0; h < m; h++) { - q[j][h] = a[j][h]; - } - for (uint32_t i = 0; i < j; i++) { - float dot = vectorDot(&q[j][0], &q[i][0], m); - for (uint32_t h = 0; h < m; h++) { - q[j][h] -= dot * q[i][h]; - } - } - - float norm = vectorNorm(&q[j][0], m); - if (norm < 0.000001f) { - // vectors are linearly dependent or zero so no solution -#if DEBUG_LEAST_SQUARES - ALOGD(" - no solution, norm=%f", norm); -#endif - return false; - } - - float invNorm = 1.0f / norm; - for (uint32_t h = 0; h < m; h++) { - q[j][h] *= invNorm; - } - for (uint32_t i = 0; i < n; i++) { - r[j][i] = i < j ? 0 : vectorDot(&q[j][0], &a[i][0], m); - } - } -#if DEBUG_LEAST_SQUARES - ALOGD(" - q=%s", matrixToString(&q[0][0], m, n, false /*rowMajor*/).string()); - ALOGD(" - r=%s", matrixToString(&r[0][0], n, n, true /*rowMajor*/).string()); - - // calculate QR, if we factored A correctly then QR should equal A - float qr[n][m]; - for (uint32_t h = 0; h < m; h++) { - for (uint32_t i = 0; i < n; i++) { - qr[i][h] = 0; - for (uint32_t j = 0; j < n; j++) { - qr[i][h] += q[j][h] * r[j][i]; - } - } - } - ALOGD(" - qr=%s", matrixToString(&qr[0][0], m, n, false /*rowMajor*/).string()); -#endif - - // Solve R B = Qt Y to find B. This is easy because R is upper triangular. - // We just work from bottom-right to top-left calculating B's coefficients. - for (uint32_t i = n; i-- != 0; ) { - outB[i] = vectorDot(&q[i][0], y, m); - for (uint32_t j = n - 1; j > i; j--) { - outB[i] -= r[i][j] * outB[j]; - } - outB[i] /= r[i][i]; - } -#if DEBUG_LEAST_SQUARES - ALOGD(" - b=%s", vectorToString(outB, n).string()); -#endif - - // Calculate the coefficient of determination as 1 - (SSerr / SStot) where - // SSerr is the residual sum of squares (squared variance of the error), - // and SStot is the total sum of squares (squared variance of the data). - float ymean = 0; - for (uint32_t h = 0; h < m; h++) { - ymean += y[h]; - } - ymean /= m; - - float sserr = 0; - float sstot = 0; - for (uint32_t h = 0; h < m; h++) { - float err = y[h] - outB[0]; - float term = 1; - for (uint32_t i = 1; i < n; i++) { - term *= x[h]; - err -= term * outB[i]; - } - sserr += err * err; - float var = y[h] - ymean; - sstot += var * var; - } - *outDet = sstot > 0.000001f ? 1.0f - (sserr / sstot) : 1; -#if DEBUG_LEAST_SQUARES - ALOGD(" - sserr=%f", sserr); - ALOGD(" - sstot=%f", sstot); - ALOGD(" - det=%f", *outDet); -#endif - return true; -} - -bool VelocityTracker::getVelocity(uint32_t id, float* outVx, float* outVy) const { - Estimator estimator; - if (getEstimator(id, DEFAULT_DEGREE, DEFAULT_HORIZON, &estimator)) { - if (estimator.degree >= 1) { - *outVx = estimator.xCoeff[1]; - *outVy = estimator.yCoeff[1]; - return true; - } - } - *outVx = 0; - *outVy = 0; - return false; -} - -bool VelocityTracker::getEstimator(uint32_t id, uint32_t degree, nsecs_t horizon, - Estimator* outEstimator) const { - outEstimator->clear(); - - // Iterate over movement samples in reverse time order and collect samples. - float x[HISTORY_SIZE]; - float y[HISTORY_SIZE]; - float time[HISTORY_SIZE]; - uint32_t m = 0; - uint32_t index = mIndex; - const Movement& newestMovement = mMovements[mIndex]; - do { - const Movement& movement = mMovements[index]; - if (!movement.idBits.hasBit(id)) { - break; - } - - nsecs_t age = newestMovement.eventTime - movement.eventTime; - if (age > horizon) { - break; - } - - const Position& position = movement.getPosition(id); - x[m] = position.x; - y[m] = position.y; - time[m] = -age * 0.000000001f; - index = (index == 0 ? HISTORY_SIZE : index) - 1; - } while (++m < HISTORY_SIZE); - - if (m == 0) { - return false; // no data - } - - // Calculate a least squares polynomial fit. - if (degree > Estimator::MAX_DEGREE) { - degree = Estimator::MAX_DEGREE; - } - if (degree > m - 1) { - degree = m - 1; - } - if (degree >= 1) { - float xdet, ydet; - uint32_t n = degree + 1; - if (solveLeastSquares(time, x, m, n, outEstimator->xCoeff, &xdet) - && solveLeastSquares(time, y, m, n, outEstimator->yCoeff, &ydet)) { - outEstimator->degree = degree; - outEstimator->confidence = xdet * ydet; -#if DEBUG_LEAST_SQUARES - ALOGD("estimate: degree=%d, xCoeff=%s, yCoeff=%s, confidence=%f", - int(outEstimator->degree), - vectorToString(outEstimator->xCoeff, n).string(), - vectorToString(outEstimator->yCoeff, n).string(), - outEstimator->confidence); -#endif - return true; - } - } - - // No velocity data available for this pointer, but we do have its current position. - outEstimator->xCoeff[0] = x[0]; - outEstimator->yCoeff[0] = y[0]; - outEstimator->degree = 0; - outEstimator->confidence = 1; - return true; -} - - -// --- VelocityControl --- - -const nsecs_t VelocityControl::STOP_TIME; - -VelocityControl::VelocityControl() { - reset(); -} - -void VelocityControl::setParameters(const VelocityControlParameters& parameters) { - mParameters = parameters; - reset(); -} - -void VelocityControl::reset() { - mLastMovementTime = LLONG_MIN; - mRawPosition.x = 0; - mRawPosition.y = 0; - mVelocityTracker.clear(); -} - -void VelocityControl::move(nsecs_t eventTime, float* deltaX, float* deltaY) { - if ((deltaX && *deltaX) || (deltaY && *deltaY)) { - if (eventTime >= mLastMovementTime + STOP_TIME) { -#if DEBUG_ACCELERATION - ALOGD("VelocityControl: stopped, last movement was %0.3fms ago", - (eventTime - mLastMovementTime) * 0.000001f); -#endif - reset(); - } - - mLastMovementTime = eventTime; - if (deltaX) { - mRawPosition.x += *deltaX; - } - if (deltaY) { - mRawPosition.y += *deltaY; - } - mVelocityTracker.addMovement(eventTime, BitSet32(BitSet32::valueForBit(0)), &mRawPosition); - - float vx, vy; - float scale = mParameters.scale; - if (mVelocityTracker.getVelocity(0, &vx, &vy)) { - float speed = hypotf(vx, vy) * scale; - if (speed >= mParameters.highThreshold) { - // Apply full acceleration above the high speed threshold. - scale *= mParameters.acceleration; - } else if (speed > mParameters.lowThreshold) { - // Linearly interpolate the acceleration to apply between the low and high - // speed thresholds. - scale *= 1 + (speed - mParameters.lowThreshold) - / (mParameters.highThreshold - mParameters.lowThreshold) - * (mParameters.acceleration - 1); - } - -#if DEBUG_ACCELERATION - ALOGD("VelocityControl(%0.3f, %0.3f, %0.3f, %0.3f): " - "vx=%0.3f, vy=%0.3f, speed=%0.3f, accel=%0.3f", - mParameters.scale, mParameters.lowThreshold, mParameters.highThreshold, - mParameters.acceleration, - vx, vy, speed, scale / mParameters.scale); -#endif - } else { -#if DEBUG_ACCELERATION - ALOGD("VelocityControl(%0.3f, %0.3f, %0.3f, %0.3f): unknown velocity", - mParameters.scale, mParameters.lowThreshold, mParameters.highThreshold, - mParameters.acceleration); -#endif - } - - if (deltaX) { - *deltaX *= scale; - } - if (deltaY) { - *deltaY *= scale; - } - } -} - } // namespace android diff --git a/libs/androidfw/VelocityControl.cpp b/libs/androidfw/VelocityControl.cpp new file mode 100644 index 000000000000..cde2b76272f1 --- /dev/null +++ b/libs/androidfw/VelocityControl.cpp @@ -0,0 +1,110 @@ +/* + * Copyright (C) 2012 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#define LOG_TAG "VelocityControl" +//#define LOG_NDEBUG 0 + +// Log debug messages about acceleration. +#define DEBUG_ACCELERATION 0 + +#include <math.h> +#include <limits.h> + +#include <androidfw/VelocityControl.h> +#include <utils/BitSet.h> +#include <utils/Timers.h> + +namespace android { + +// --- VelocityControl --- + +const nsecs_t VelocityControl::STOP_TIME; + +VelocityControl::VelocityControl() { + reset(); +} + +void VelocityControl::setParameters(const VelocityControlParameters& parameters) { + mParameters = parameters; + reset(); +} + +void VelocityControl::reset() { + mLastMovementTime = LLONG_MIN; + mRawPosition.x = 0; + mRawPosition.y = 0; + mVelocityTracker.clear(); +} + +void VelocityControl::move(nsecs_t eventTime, float* deltaX, float* deltaY) { + if ((deltaX && *deltaX) || (deltaY && *deltaY)) { + if (eventTime >= mLastMovementTime + STOP_TIME) { +#if DEBUG_ACCELERATION + ALOGD("VelocityControl: stopped, last movement was %0.3fms ago", + (eventTime - mLastMovementTime) * 0.000001f); +#endif + reset(); + } + + mLastMovementTime = eventTime; + if (deltaX) { + mRawPosition.x += *deltaX; + } + if (deltaY) { + mRawPosition.y += *deltaY; + } + mVelocityTracker.addMovement(eventTime, BitSet32(BitSet32::valueForBit(0)), &mRawPosition); + + float vx, vy; + float scale = mParameters.scale; + if (mVelocityTracker.getVelocity(0, &vx, &vy)) { + float speed = hypotf(vx, vy) * scale; + if (speed >= mParameters.highThreshold) { + // Apply full acceleration above the high speed threshold. + scale *= mParameters.acceleration; + } else if (speed > mParameters.lowThreshold) { + // Linearly interpolate the acceleration to apply between the low and high + // speed thresholds. + scale *= 1 + (speed - mParameters.lowThreshold) + / (mParameters.highThreshold - mParameters.lowThreshold) + * (mParameters.acceleration - 1); + } + +#if DEBUG_ACCELERATION + ALOGD("VelocityControl(%0.3f, %0.3f, %0.3f, %0.3f): " + "vx=%0.3f, vy=%0.3f, speed=%0.3f, accel=%0.3f", + mParameters.scale, mParameters.lowThreshold, mParameters.highThreshold, + mParameters.acceleration, + vx, vy, speed, scale / mParameters.scale); +#endif + } else { +#if DEBUG_ACCELERATION + ALOGD("VelocityControl(%0.3f, %0.3f, %0.3f, %0.3f): unknown velocity", + mParameters.scale, mParameters.lowThreshold, mParameters.highThreshold, + mParameters.acceleration); +#endif + } + + if (deltaX) { + *deltaX *= scale; + } + if (deltaY) { + *deltaY *= scale; + } + } +} + +} // namespace android diff --git a/libs/androidfw/VelocityTracker.cpp b/libs/androidfw/VelocityTracker.cpp new file mode 100644 index 000000000000..2fb094ee6687 --- /dev/null +++ b/libs/androidfw/VelocityTracker.cpp @@ -0,0 +1,444 @@ +/* + * Copyright (C) 2012 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#define LOG_TAG "VelocityTracker" +//#define LOG_NDEBUG 0 + +// Log debug messages about velocity tracking. +#define DEBUG_VELOCITY 0 + +// Log debug messages about least squares fitting. +#define DEBUG_LEAST_SQUARES 0 + +#include <math.h> +#include <limits.h> + +#include <androidfw/VelocityTracker.h> +#include <utils/BitSet.h> +#include <utils/String8.h> +#include <utils/Timers.h> + +namespace android { + +// --- VelocityTracker --- + +const uint32_t VelocityTracker::DEFAULT_DEGREE; +const nsecs_t VelocityTracker::DEFAULT_HORIZON; +const uint32_t VelocityTracker::HISTORY_SIZE; + +static inline float vectorDot(const float* a, const float* b, uint32_t m) { + float r = 0; + while (m--) { + r += *(a++) * *(b++); + } + return r; +} + +static inline float vectorNorm(const float* a, uint32_t m) { + float r = 0; + while (m--) { + float t = *(a++); + r += t * t; + } + return sqrtf(r); +} + +#if DEBUG_LEAST_SQUARES || DEBUG_VELOCITY +static String8 vectorToString(const float* a, uint32_t m) { + String8 str; + str.append("["); + while (m--) { + str.appendFormat(" %f", *(a++)); + if (m) { + str.append(","); + } + } + str.append(" ]"); + return str; +} + +static String8 matrixToString(const float* a, uint32_t m, uint32_t n, bool rowMajor) { + String8 str; + str.append("["); + for (size_t i = 0; i < m; i++) { + if (i) { + str.append(","); + } + str.append(" ["); + for (size_t j = 0; j < n; j++) { + if (j) { + str.append(","); + } + str.appendFormat(" %f", a[rowMajor ? i * n + j : j * m + i]); + } + str.append(" ]"); + } + str.append(" ]"); + return str; +} +#endif + +VelocityTracker::VelocityTracker() { + clear(); +} + +void VelocityTracker::clear() { + mIndex = 0; + mMovements[0].idBits.clear(); + mActivePointerId = -1; +} + +void VelocityTracker::clearPointers(BitSet32 idBits) { + BitSet32 remainingIdBits(mMovements[mIndex].idBits.value & ~idBits.value); + mMovements[mIndex].idBits = remainingIdBits; + + if (mActivePointerId >= 0 && idBits.hasBit(mActivePointerId)) { + mActivePointerId = !remainingIdBits.isEmpty() ? remainingIdBits.firstMarkedBit() : -1; + } +} + +void VelocityTracker::addMovement(nsecs_t eventTime, BitSet32 idBits, const Position* positions) { + if (++mIndex == HISTORY_SIZE) { + mIndex = 0; + } + + while (idBits.count() > MAX_POINTERS) { + idBits.clearLastMarkedBit(); + } + + Movement& movement = mMovements[mIndex]; + movement.eventTime = eventTime; + movement.idBits = idBits; + uint32_t count = idBits.count(); + for (uint32_t i = 0; i < count; i++) { + movement.positions[i] = positions[i]; + } + + if (mActivePointerId < 0 || !idBits.hasBit(mActivePointerId)) { + mActivePointerId = count != 0 ? idBits.firstMarkedBit() : -1; + } + +#if DEBUG_VELOCITY + ALOGD("VelocityTracker: addMovement eventTime=%lld, idBits=0x%08x, activePointerId=%d", + eventTime, idBits.value, mActivePointerId); + for (BitSet32 iterBits(idBits); !iterBits.isEmpty(); ) { + uint32_t id = iterBits.firstMarkedBit(); + uint32_t index = idBits.getIndexOfBit(id); + iterBits.clearBit(id); + Estimator estimator; + getEstimator(id, DEFAULT_DEGREE, DEFAULT_HORIZON, &estimator); + ALOGD(" %d: position (%0.3f, %0.3f), " + "estimator (degree=%d, xCoeff=%s, yCoeff=%s, confidence=%f)", + id, positions[index].x, positions[index].y, + int(estimator.degree), + vectorToString(estimator.xCoeff, estimator.degree).string(), + vectorToString(estimator.yCoeff, estimator.degree).string(), + estimator.confidence); + } +#endif +} + +void VelocityTracker::addMovement(const MotionEvent* event) { + int32_t actionMasked = event->getActionMasked(); + + switch (actionMasked) { + case AMOTION_EVENT_ACTION_DOWN: + case AMOTION_EVENT_ACTION_HOVER_ENTER: + // Clear all pointers on down before adding the new movement. + clear(); + break; + case AMOTION_EVENT_ACTION_POINTER_DOWN: { + // Start a new movement trace for a pointer that just went down. + // We do this on down instead of on up because the client may want to query the + // final velocity for a pointer that just went up. + BitSet32 downIdBits; + downIdBits.markBit(event->getPointerId(event->getActionIndex())); + clearPointers(downIdBits); + break; + } + case AMOTION_EVENT_ACTION_MOVE: + case AMOTION_EVENT_ACTION_HOVER_MOVE: + break; + default: + // Ignore all other actions because they do not convey any new information about + // pointer movement. We also want to preserve the last known velocity of the pointers. + // Note that ACTION_UP and ACTION_POINTER_UP always report the last known position + // of the pointers that went up. ACTION_POINTER_UP does include the new position of + // pointers that remained down but we will also receive an ACTION_MOVE with this + // information if any of them actually moved. Since we don't know how many pointers + // will be going up at once it makes sense to just wait for the following ACTION_MOVE + // before adding the movement. + return; + } + + size_t pointerCount = event->getPointerCount(); + if (pointerCount > MAX_POINTERS) { + pointerCount = MAX_POINTERS; + } + + BitSet32 idBits; + for (size_t i = 0; i < pointerCount; i++) { + idBits.markBit(event->getPointerId(i)); + } + + nsecs_t eventTime; + Position positions[pointerCount]; + + size_t historySize = event->getHistorySize(); + for (size_t h = 0; h < historySize; h++) { + eventTime = event->getHistoricalEventTime(h); + for (size_t i = 0; i < pointerCount; i++) { + positions[i].x = event->getHistoricalX(i, h); + positions[i].y = event->getHistoricalY(i, h); + } + addMovement(eventTime, idBits, positions); + } + + eventTime = event->getEventTime(); + for (size_t i = 0; i < pointerCount; i++) { + positions[i].x = event->getX(i); + positions[i].y = event->getY(i); + } + addMovement(eventTime, idBits, positions); +} + +/** + * Solves a linear least squares problem to obtain a N degree polynomial that fits + * the specified input data as nearly as possible. + * + * Returns true if a solution is found, false otherwise. + * + * The input consists of two vectors of data points X and Y with indices 0..m-1. + * The output is a vector B with indices 0..n-1 that describes a polynomial + * that fits the data, such the sum of abs(Y[i] - (B[0] + B[1] X[i] + B[2] X[i]^2 ... B[n] X[i]^n)) + * for all i between 0 and m-1 is minimized. + * + * That is to say, the function that generated the input data can be approximated + * by y(x) ~= B[0] + B[1] x + B[2] x^2 + ... + B[n] x^n. + * + * The coefficient of determination (R^2) is also returned to describe the goodness + * of fit of the model for the given data. It is a value between 0 and 1, where 1 + * indicates perfect correspondence. + * + * This function first expands the X vector to a m by n matrix A such that + * A[i][0] = 1, A[i][1] = X[i], A[i][2] = X[i]^2, ..., A[i][n] = X[i]^n. + * + * Then it calculates the QR decomposition of A yielding an m by m orthonormal matrix Q + * and an m by n upper triangular matrix R. Because R is upper triangular (lower + * part is all zeroes), we can simplify the decomposition into an m by n matrix + * Q1 and a n by n matrix R1 such that A = Q1 R1. + * + * Finally we solve the system of linear equations given by R1 B = (Qtranspose Y) + * to find B. + * + * For efficiency, we lay out A and Q column-wise in memory because we frequently + * operate on the column vectors. Conversely, we lay out R row-wise. + * + * http://en.wikipedia.org/wiki/Numerical_methods_for_linear_least_squares + * http://en.wikipedia.org/wiki/Gram-Schmidt + */ +static bool solveLeastSquares(const float* x, const float* y, uint32_t m, uint32_t n, + float* outB, float* outDet) { +#if DEBUG_LEAST_SQUARES + ALOGD("solveLeastSquares: m=%d, n=%d, x=%s, y=%s", int(m), int(n), + vectorToString(x, m).string(), vectorToString(y, m).string()); +#endif + + // Expand the X vector to a matrix A. + float a[n][m]; // column-major order + for (uint32_t h = 0; h < m; h++) { + a[0][h] = 1; + for (uint32_t i = 1; i < n; i++) { + a[i][h] = a[i - 1][h] * x[h]; + } + } +#if DEBUG_LEAST_SQUARES + ALOGD(" - a=%s", matrixToString(&a[0][0], m, n, false /*rowMajor*/).string()); +#endif + + // Apply the Gram-Schmidt process to A to obtain its QR decomposition. + float q[n][m]; // orthonormal basis, column-major order + float r[n][n]; // upper triangular matrix, row-major order + for (uint32_t j = 0; j < n; j++) { + for (uint32_t h = 0; h < m; h++) { + q[j][h] = a[j][h]; + } + for (uint32_t i = 0; i < j; i++) { + float dot = vectorDot(&q[j][0], &q[i][0], m); + for (uint32_t h = 0; h < m; h++) { + q[j][h] -= dot * q[i][h]; + } + } + + float norm = vectorNorm(&q[j][0], m); + if (norm < 0.000001f) { + // vectors are linearly dependent or zero so no solution +#if DEBUG_LEAST_SQUARES + ALOGD(" - no solution, norm=%f", norm); +#endif + return false; + } + + float invNorm = 1.0f / norm; + for (uint32_t h = 0; h < m; h++) { + q[j][h] *= invNorm; + } + for (uint32_t i = 0; i < n; i++) { + r[j][i] = i < j ? 0 : vectorDot(&q[j][0], &a[i][0], m); + } + } +#if DEBUG_LEAST_SQUARES + ALOGD(" - q=%s", matrixToString(&q[0][0], m, n, false /*rowMajor*/).string()); + ALOGD(" - r=%s", matrixToString(&r[0][0], n, n, true /*rowMajor*/).string()); + + // calculate QR, if we factored A correctly then QR should equal A + float qr[n][m]; + for (uint32_t h = 0; h < m; h++) { + for (uint32_t i = 0; i < n; i++) { + qr[i][h] = 0; + for (uint32_t j = 0; j < n; j++) { + qr[i][h] += q[j][h] * r[j][i]; + } + } + } + ALOGD(" - qr=%s", matrixToString(&qr[0][0], m, n, false /*rowMajor*/).string()); +#endif + + // Solve R B = Qt Y to find B. This is easy because R is upper triangular. + // We just work from bottom-right to top-left calculating B's coefficients. + for (uint32_t i = n; i-- != 0; ) { + outB[i] = vectorDot(&q[i][0], y, m); + for (uint32_t j = n - 1; j > i; j--) { + outB[i] -= r[i][j] * outB[j]; + } + outB[i] /= r[i][i]; + } +#if DEBUG_LEAST_SQUARES + ALOGD(" - b=%s", vectorToString(outB, n).string()); +#endif + + // Calculate the coefficient of determination as 1 - (SSerr / SStot) where + // SSerr is the residual sum of squares (squared variance of the error), + // and SStot is the total sum of squares (squared variance of the data). + float ymean = 0; + for (uint32_t h = 0; h < m; h++) { + ymean += y[h]; + } + ymean /= m; + + float sserr = 0; + float sstot = 0; + for (uint32_t h = 0; h < m; h++) { + float err = y[h] - outB[0]; + float term = 1; + for (uint32_t i = 1; i < n; i++) { + term *= x[h]; + err -= term * outB[i]; + } + sserr += err * err; + float var = y[h] - ymean; + sstot += var * var; + } + *outDet = sstot > 0.000001f ? 1.0f - (sserr / sstot) : 1; +#if DEBUG_LEAST_SQUARES + ALOGD(" - sserr=%f", sserr); + ALOGD(" - sstot=%f", sstot); + ALOGD(" - det=%f", *outDet); +#endif + return true; +} + +bool VelocityTracker::getVelocity(uint32_t id, float* outVx, float* outVy) const { + Estimator estimator; + if (getEstimator(id, DEFAULT_DEGREE, DEFAULT_HORIZON, &estimator)) { + if (estimator.degree >= 1) { + *outVx = estimator.xCoeff[1]; + *outVy = estimator.yCoeff[1]; + return true; + } + } + *outVx = 0; + *outVy = 0; + return false; +} + +bool VelocityTracker::getEstimator(uint32_t id, uint32_t degree, nsecs_t horizon, + Estimator* outEstimator) const { + outEstimator->clear(); + + // Iterate over movement samples in reverse time order and collect samples. + float x[HISTORY_SIZE]; + float y[HISTORY_SIZE]; + float time[HISTORY_SIZE]; + uint32_t m = 0; + uint32_t index = mIndex; + const Movement& newestMovement = mMovements[mIndex]; + do { + const Movement& movement = mMovements[index]; + if (!movement.idBits.hasBit(id)) { + break; + } + + nsecs_t age = newestMovement.eventTime - movement.eventTime; + if (age > horizon) { + break; + } + + const Position& position = movement.getPosition(id); + x[m] = position.x; + y[m] = position.y; + time[m] = -age * 0.000000001f; + index = (index == 0 ? HISTORY_SIZE : index) - 1; + } while (++m < HISTORY_SIZE); + + if (m == 0) { + return false; // no data + } + + // Calculate a least squares polynomial fit. + if (degree > Estimator::MAX_DEGREE) { + degree = Estimator::MAX_DEGREE; + } + if (degree > m - 1) { + degree = m - 1; + } + if (degree >= 1) { + float xdet, ydet; + uint32_t n = degree + 1; + if (solveLeastSquares(time, x, m, n, outEstimator->xCoeff, &xdet) + && solveLeastSquares(time, y, m, n, outEstimator->yCoeff, &ydet)) { + outEstimator->degree = degree; + outEstimator->confidence = xdet * ydet; +#if DEBUG_LEAST_SQUARES + ALOGD("estimate: degree=%d, xCoeff=%s, yCoeff=%s, confidence=%f", + int(outEstimator->degree), + vectorToString(outEstimator->xCoeff, n).string(), + vectorToString(outEstimator->yCoeff, n).string(), + outEstimator->confidence); +#endif + return true; + } + } + + // No velocity data available for this pointer, but we do have its current position. + outEstimator->xCoeff[0] = x[0]; + outEstimator->yCoeff[0] = y[0]; + outEstimator->degree = 0; + outEstimator->confidence = 1; + return true; +} + +} // namespace android diff --git a/libs/hwui/Caches.cpp b/libs/hwui/Caches.cpp index 123695ab4a85..f2108203b9ba 100644 --- a/libs/hwui/Caches.cpp +++ b/libs/hwui/Caches.cpp @@ -48,25 +48,9 @@ namespace uirenderer { /////////////////////////////////////////////////////////////////////////////// Caches::Caches(): Singleton<Caches>(), mInitialized(false) { - GLint maxTextureUnits; - glGetIntegerv(GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS, &maxTextureUnits); - if (maxTextureUnits < REQUIRED_TEXTURE_UNITS_COUNT) { - ALOGW("At least %d texture units are required!", REQUIRED_TEXTURE_UNITS_COUNT); - } - - glGetIntegerv(GL_MAX_TEXTURE_SIZE, &maxTextureSize); - - if (extensions.hasDebugMarker()) { - eventMark = glInsertEventMarkerEXT; - startMark = glPushGroupMarkerEXT; - endMark = glPopGroupMarkerEXT; - } else { - eventMark = eventMarkNull; - startMark = startMarkNull; - endMark = endMarkNull; - } - init(); + initExtensions(); + initConstraints(); mDebugLevel = readDebugLevel(); ALOGD("Enabling debug mode %d", mDebugLevel); @@ -105,6 +89,36 @@ void Caches::init() { mInitialized = true; } +void Caches::initExtensions() { + if (extensions.hasDebugMarker()) { + eventMark = glInsertEventMarkerEXT; + startMark = glPushGroupMarkerEXT; + endMark = glPopGroupMarkerEXT; + } else { + eventMark = eventMarkNull; + startMark = startMarkNull; + endMark = endMarkNull; + } + + if (extensions.hasDebugLabel()) { + setLabel = glLabelObjectEXT; + getLabel = glGetObjectLabelEXT; + } else { + setLabel = setLabelNull; + getLabel = getLabelNull; + } +} + +void Caches::initConstraints() { + GLint maxTextureUnits; + glGetIntegerv(GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS, &maxTextureUnits); + if (maxTextureUnits < REQUIRED_TEXTURE_UNITS_COUNT) { + ALOGW("At least %d texture units are required!", REQUIRED_TEXTURE_UNITS_COUNT); + } + + glGetIntegerv(GL_MAX_TEXTURE_SIZE, &maxTextureSize); +} + void Caches::terminate() { if (!mInitialized) return; diff --git a/libs/hwui/Caches.h b/libs/hwui/Caches.h index 65ff9ad3423c..58361c9568f1 100644 --- a/libs/hwui/Caches.h +++ b/libs/hwui/Caches.h @@ -107,7 +107,7 @@ public: }; /** - * Initializes the cache. + * Initialize caches. */ void init(); @@ -247,15 +247,30 @@ public: GammaFontRenderer fontRenderer; ResourceCache resourceCache; + // Debug methods PFNGLINSERTEVENTMARKEREXTPROC eventMark; PFNGLPUSHGROUPMARKEREXTPROC startMark; PFNGLPOPGROUPMARKEREXTPROC endMark; + PFNGLLABELOBJECTEXTPROC setLabel; + PFNGLGETOBJECTLABELEXTPROC getLabel; + private: - static void eventMarkNull(GLsizei length, const GLchar *marker) { } - static void startMarkNull(GLsizei length, const GLchar *marker) { } + void initExtensions(); + void initConstraints(); + + static void eventMarkNull(GLsizei length, const GLchar* marker) { } + static void startMarkNull(GLsizei length, const GLchar* marker) { } static void endMarkNull() { } + static void setLabelNull(GLenum type, uint object, GLsizei length, + const char* label) { } + static void getLabelNull(GLenum type, uint object, GLsizei bufferSize, + GLsizei* length, char* label) { + if (length) *length = 0; + if (label) *label = '\0'; + } + GLuint mCurrentBuffer; GLuint mCurrentIndicesBuffer; void* mCurrentPositionPointer; diff --git a/libs/hwui/Extensions.h b/libs/hwui/Extensions.h index f11fecc7ae9c..6b174d6877a6 100644 --- a/libs/hwui/Extensions.h +++ b/libs/hwui/Extensions.h @@ -40,7 +40,6 @@ namespace uirenderer { #endif // Vendor strings - #define VENDOR_IMG "Imagination Technologies" /////////////////////////////////////////////////////////////////////////////// @@ -68,6 +67,7 @@ public: mHasFramebufferFetch = hasExtension("GL_NV_shader_framebuffer_fetch"); mHasDiscardFramebuffer = hasExtension("GL_EXT_discard_framebuffer"); mHasDebugMarker = hasExtension("GL_EXT_debug_marker"); + mHasDebugLabel = hasExtension("GL_EXT_debug_label"); const char* vendor = (const char*) glGetString(GL_VENDOR); EXT_LOGD("Vendor: %s", vendor); @@ -84,6 +84,7 @@ public: inline bool needsHighpTexCoords() const { return mNeedsHighpTexCoords; } inline bool hasDiscardFramebuffer() const { return mHasDiscardFramebuffer; } inline bool hasDebugMarker() const { return mHasDebugMarker; } + inline bool hasDebugLabel() const { return mHasDebugLabel; } bool hasExtension(const char* extension) const { const String8 s(extension); @@ -104,6 +105,7 @@ private: bool mHasFramebufferFetch; bool mHasDiscardFramebuffer; bool mHasDebugMarker; + bool mHasDebugLabel; }; // class Extensions }; // namespace uirenderer diff --git a/media/java/android/media/AudioService.java b/media/java/android/media/AudioService.java index f412b9b8f9c1..80152035adb2 100644 --- a/media/java/android/media/AudioService.java +++ b/media/java/android/media/AudioService.java @@ -33,6 +33,7 @@ import android.bluetooth.BluetoothClass; import android.bluetooth.BluetoothDevice; import android.bluetooth.BluetoothHeadset; import android.bluetooth.BluetoothProfile; +import android.content.ActivityNotFoundException; import android.content.BroadcastReceiver; import android.content.ComponentName; import android.content.ContentResolver; @@ -3607,24 +3608,20 @@ public class AudioService extends IAudioService.Stub implements OnFinished { // RemoteControl //========================================================================================== public void dispatchMediaKeyEvent(KeyEvent keyEvent) { - dispatchMediaKeyEvent(keyEvent, false /*needWakeLock*/); + filterMediaKeyEvent(keyEvent, false /*needWakeLock*/); } public void dispatchMediaKeyEventUnderWakelock(KeyEvent keyEvent) { - dispatchMediaKeyEvent(keyEvent, true /*needWakeLock*/); + filterMediaKeyEvent(keyEvent, true /*needWakeLock*/); } - /** - * Handles the dispatching of the media button events to one of the registered listeners, - * or if there was none, broadcast a ACTION_MEDIA_BUTTON intent to the rest of the system. - */ - private void dispatchMediaKeyEvent(KeyEvent keyEvent, boolean needWakeLock) { + private void filterMediaKeyEvent(KeyEvent keyEvent, boolean needWakeLock) { // sanity check on the incoming key event if (!isValidMediaKeyEvent(keyEvent)) { Log.e(TAG, "not dispatching invalid media key event " + keyEvent); return; } - // event filtering + // event filtering based on audio mode synchronized(mRingingLock) { if (mIsRinging || (getMode() == AudioSystem.MODE_IN_CALL) || (getMode() == AudioSystem.MODE_IN_COMMUNICATION) || @@ -3632,6 +3629,22 @@ public class AudioService extends IAudioService.Stub implements OnFinished { return; } } + // event filtering based on voice-based interactions + if (isValidVoiceInputKeyCode(keyEvent.getKeyCode())) { + filterVoiceInputKeyEvent(keyEvent, needWakeLock); + } else { + dispatchMediaKeyEvent(keyEvent, needWakeLock); + } + } + + /** + * Handles the dispatching of the media button events to one of the registered listeners, + * or if there was none, broadcast an ACTION_MEDIA_BUTTON intent to the rest of the system. + * @param keyEvent a non-null KeyEvent whose key code is one of the supported media buttons + * @param needWakeLock true if a PARTIAL_WAKE_LOCK needs to be held while this key event + * is dispatched. + */ + private void dispatchMediaKeyEvent(KeyEvent keyEvent, boolean needWakeLock) { if (needWakeLock) { mMediaEventWakeLock.acquire(); } @@ -3660,6 +3673,140 @@ public class AudioService extends IAudioService.Stub implements OnFinished { } } + /** + * The minimum duration during which a user must press to trigger voice-based interactions + */ + private final static int MEDIABUTTON_LONG_PRESS_DURATION_MS = 300; + /** + * The different states of the state machine to handle the launch of voice-based interactions, + * stored in mVoiceButtonState. + */ + private final static int VOICEBUTTON_STATE_IDLE = 0; + private final static int VOICEBUTTON_STATE_DOWN = 1; + private final static int VOICEBUTTON_STATE_DOWN_IGNORE_NEW = 2; + /** + * The different actions after state transitions on mVoiceButtonState. + */ + private final static int VOICEBUTTON_ACTION_DISCARD_CURRENT_KEY_PRESS = 1; + private final static int VOICEBUTTON_ACTION_START_VOICE_INPUT = 2; + private final static int VOICEBUTTON_ACTION_SIMULATE_KEY_PRESS = 3; + + private final Object mVoiceEventLock = new Object(); + private int mVoiceButtonState = VOICEBUTTON_STATE_IDLE; + private long mVoiceButtonDownTime = 0; + + /** + * Log an error when an unexpected action is encountered in the state machine to filter + * key events. + * @param keyAction the unexpected action of the key event being filtered + * @param stateName the string corresponding to the state in which the error occurred + */ + private static void logErrorForKeyAction(int keyAction, String stateName) { + Log.e(TAG, "unexpected action " + + KeyEvent.actionToString(keyAction) + + " in " + stateName + " state"); + } + + /** + * Filter key events that may be used for voice-based interactions + * @param keyEvent a non-null KeyEvent whose key code is that of one of the supported + * media buttons that can be used to trigger voice-based interactions. + * @param needWakeLock true if a PARTIAL_WAKE_LOCK needs to be held while this key event + * is dispatched. + */ + private void filterVoiceInputKeyEvent(KeyEvent keyEvent, boolean needWakeLock) { + int voiceButtonAction = VOICEBUTTON_ACTION_DISCARD_CURRENT_KEY_PRESS; + int keyAction = keyEvent.getAction(); + synchronized (mVoiceEventLock) { + // state machine on mVoiceButtonState + switch (mVoiceButtonState) { + + case VOICEBUTTON_STATE_IDLE: + if (keyAction == KeyEvent.ACTION_DOWN) { + mVoiceButtonDownTime = keyEvent.getDownTime(); + // valid state transition + mVoiceButtonState = VOICEBUTTON_STATE_DOWN; + } else if (keyAction == KeyEvent.ACTION_UP) { + // no state transition + // action is still VOICEBUTTON_ACTION_DISCARD_CURRENT_KEY_PRESS + } else { + logErrorForKeyAction(keyAction, "VOICEBUTTON_STATE_IDLE"); + } + break; + + case VOICEBUTTON_STATE_DOWN: + if ((keyEvent.getEventTime() - mVoiceButtonDownTime) + >= MEDIABUTTON_LONG_PRESS_DURATION_MS) { + // press was long enough, start voice-based interactions, regardless of + // whether this was a DOWN or UP key event + voiceButtonAction = VOICEBUTTON_ACTION_START_VOICE_INPUT; + if (keyAction == KeyEvent.ACTION_UP) { + // done tracking the key press, so transition back to idle state + mVoiceButtonState = VOICEBUTTON_STATE_IDLE; + } else if (keyAction == KeyEvent.ACTION_DOWN) { + // no need to observe the upcoming key events + mVoiceButtonState = VOICEBUTTON_STATE_DOWN_IGNORE_NEW; + } else { + logErrorForKeyAction(keyAction, "VOICEBUTTON_STATE_DOWN"); + } + } else { + if (keyAction == KeyEvent.ACTION_UP) { + // press wasn't long enough, simulate complete key press + voiceButtonAction = VOICEBUTTON_ACTION_SIMULATE_KEY_PRESS; + // not tracking the key press anymore, so transition back to idle state + mVoiceButtonState = VOICEBUTTON_STATE_IDLE; + } else if (keyAction == KeyEvent.ACTION_DOWN) { + // no state transition + // action is still VOICEBUTTON_ACTION_DISCARD_CURRENT_KEY_PRESS + } else { + logErrorForKeyAction(keyAction, "VOICEBUTTON_STATE_DOWN"); + } + } + break; + + case VOICEBUTTON_STATE_DOWN_IGNORE_NEW: + if (keyAction == KeyEvent.ACTION_UP) { + // done tracking the key press, so transition back to idle state + mVoiceButtonState = VOICEBUTTON_STATE_IDLE; + // action is still VOICEBUTTON_ACTION_DISCARD_CURRENT_KEY_PRESS + } else if (keyAction == KeyEvent.ACTION_DOWN) { + // no state transition: we've already launched voice-based interactions + // action is still VOICEBUTTON_ACTION_DISCARD_CURRENT_KEY_PRESS + } else { + logErrorForKeyAction(keyAction, "VOICEBUTTON_STATE_DOWN_IGNORE_NEW"); + } + break; + } + }//synchronized (mVoiceEventLock) + + // take action after media button event filtering for voice-based interactions + switch (voiceButtonAction) { + case VOICEBUTTON_ACTION_DISCARD_CURRENT_KEY_PRESS: + if (DEBUG_RC) Log.v(TAG, " ignore key event"); + break; + case VOICEBUTTON_ACTION_START_VOICE_INPUT: + if (DEBUG_RC) Log.v(TAG, " start voice-based interactions"); + // then start the voice-based interactions + startVoiceBasedInteractions(needWakeLock); + break; + case VOICEBUTTON_ACTION_SIMULATE_KEY_PRESS: + if (DEBUG_RC) Log.v(TAG, " send simulated key event"); + sendSimulatedMediaButtonEvent(keyEvent, needWakeLock); + break; + } + } + + private void sendSimulatedMediaButtonEvent(KeyEvent originalKeyEvent, boolean needWakeLock) { + // send DOWN event + KeyEvent keyEvent = KeyEvent.changeAction(originalKeyEvent, KeyEvent.ACTION_DOWN); + dispatchMediaKeyEvent(keyEvent, needWakeLock); + // send UP event + keyEvent = KeyEvent.changeAction(originalKeyEvent, KeyEvent.ACTION_UP); + dispatchMediaKeyEvent(keyEvent, needWakeLock); + + } + + private static boolean isValidMediaKeyEvent(KeyEvent keyEvent) { if (keyEvent == null) { return false; @@ -3686,6 +3833,63 @@ public class AudioService extends IAudioService.Stub implements OnFinished { return true; } + /** + * Checks whether the given key code is one that can trigger the launch of voice-based + * interactions. + * @param keyCode the key code associated with the key event + * @return true if the key is one of the supported voice-based interaction triggers + */ + private static boolean isValidVoiceInputKeyCode(int keyCode) { + if (keyCode == KeyEvent.KEYCODE_HEADSETHOOK) { + return true; + } else { + return false; + } + } + + /** + * Tell the system to start voice-based interactions / voice commands + */ + private void startVoiceBasedInteractions(boolean needWakeLock) { + Intent voiceIntent = new Intent(android.speech.RecognizerIntent.ACTION_WEB_SEARCH); + if (needWakeLock) { + mMediaEventWakeLock.acquire(); + } + voiceIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK + | Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS); + try { + if (mKeyguardManager != null) { + // it's ok to start voice-based interactions when: + // - the device is locked but doesn't require a password to be unlocked + // - the device is not locked + if ((mKeyguardManager.isKeyguardLocked() && !mKeyguardManager.isKeyguardSecure()) + || !mKeyguardManager.isKeyguardLocked()) { + mContext.startActivity(voiceIntent); + } + } + } catch (ActivityNotFoundException e) { + Log.e(TAG, "Error launching activity for ACTION_WEB_SEARCH: " + e); + } finally { + if (needWakeLock) { + mMediaEventWakeLock.release(); + } + } + } + + /** + * Verify whether it is safe to start voice-based interactions given the state of the system + * @return false is the Keyguard is locked and secure, true otherwise + */ + private boolean safeToStartVoiceBasedInteractions() { + KeyguardManager keyguard = + (KeyguardManager) mContext.getSystemService(Context.KEYGUARD_SERVICE); + if (keyguard == null) { + return false; + } + + return true; + } + private PowerManager.WakeLock mMediaEventWakeLock; private static final int WAKELOCK_RELEASE_ON_FINISHED = 1980; //magic number @@ -3703,7 +3907,14 @@ public class AudioService extends IAudioService.Stub implements OnFinished { BroadcastReceiver mKeyEventDone = new BroadcastReceiver() { public void onReceive(Context context, Intent intent) { - if (intent.getExtras().containsKey(EXTRA_WAKELOCK_ACQUIRED)) { + if (intent == null) { + return; + } + Bundle extras = intent.getExtras(); + if (extras == null) { + return; + } + if (extras.containsKey(EXTRA_WAKELOCK_ACQUIRED)) { mMediaEventWakeLock.release(); } } diff --git a/media/java/android/media/MediaPlayer.java b/media/java/android/media/MediaPlayer.java index 9f0fd485ba24..aa4cdbe219d6 100644 --- a/media/java/android/media/MediaPlayer.java +++ b/media/java/android/media/MediaPlayer.java @@ -2020,8 +2020,9 @@ public class MediaPlayer if (msg.obj == null) { mOnTimedTextListener.onTimedText(mMediaPlayer, null); } else { - if (msg.obj instanceof byte[]) { - TimedText text = new TimedText((byte[])(msg.obj)); + if (msg.obj instanceof Parcel) { + Parcel parcel = (Parcel)msg.obj; + TimedText text = new TimedText(parcel); mOnTimedTextListener.onTimedText(mMediaPlayer, text); } } diff --git a/media/java/android/media/TimedText.java b/media/java/android/media/TimedText.java index 1d7c9682b5fd..e6a7e1392b45 100644 --- a/media/java/android/media/TimedText.java +++ b/media/java/android/media/TimedText.java @@ -28,7 +28,7 @@ import java.util.ArrayList; * Class to hold the timed text's metadata, including: * <ul> * <li> The characters for rendering</li> - * <li> The rendering postion for the timed text</li> + * <li> The rendering position for the timed text</li> * </ul> * * <p> To render the timed text, applications need to do the following: @@ -86,7 +86,6 @@ public final class TimedText private static final String TAG = "TimedText"; - private Parcel mParcel = Parcel.obtain(); private final HashMap<Integer, Object> mKeyObjectMap = new HashMap<Integer, Object>(); @@ -356,10 +355,8 @@ public final class TimedText * @throws IllegalArgumentExcept if parseParcel() fails. * {@hide} */ - public TimedText(byte[] obj) { - mParcel.unmarshall(obj, 0, obj.length); - - if (!parseParcel()) { + public TimedText(Parcel parcel) { + if (!parseParcel(parcel)) { mKeyObjectMap.clear(); throw new IllegalArgumentException("parseParcel() fails"); } @@ -393,28 +390,28 @@ public final class TimedText * Parcel. These are stored in mKeyObjectMap for application to retrieve. * @return false if an error occurred during parsing. Otherwise, true. */ - private boolean parseParcel() { - mParcel.setDataPosition(0); - if (mParcel.dataAvail() == 0) { + private boolean parseParcel(Parcel parcel) { + parcel.setDataPosition(0); + if (parcel.dataAvail() == 0) { return false; } - int type = mParcel.readInt(); + int type = parcel.readInt(); if (type == KEY_LOCAL_SETTING) { - type = mParcel.readInt(); + type = parcel.readInt(); if (type != KEY_START_TIME) { return false; } - int mStartTimeMs = mParcel.readInt(); + int mStartTimeMs = parcel.readInt(); mKeyObjectMap.put(type, mStartTimeMs); - type = mParcel.readInt(); + type = parcel.readInt(); if (type != KEY_STRUCT_TEXT) { return false; } - int textLen = mParcel.readInt(); - byte[] text = mParcel.createByteArray(); + int textLen = parcel.readInt(); + byte[] text = parcel.createByteArray(); if (text == null || text.length == 0) { mTextChars = null; } else { @@ -426,8 +423,8 @@ public final class TimedText return false; } - while (mParcel.dataAvail() > 0) { - int key = mParcel.readInt(); + while (parcel.dataAvail() > 0) { + int key = parcel.readInt(); if (!isValidKey(key)) { Log.w(TAG, "Invalid timed text key found: " + key); return false; @@ -437,77 +434,77 @@ public final class TimedText switch (key) { case KEY_STRUCT_STYLE_LIST: { - readStyle(); + readStyle(parcel); object = mStyleList; break; } case KEY_STRUCT_FONT_LIST: { - readFont(); + readFont(parcel); object = mFontList; break; } case KEY_STRUCT_HIGHLIGHT_LIST: { - readHighlight(); + readHighlight(parcel); object = mHighlightPosList; break; } case KEY_STRUCT_KARAOKE_LIST: { - readKaraoke(); + readKaraoke(parcel); object = mKaraokeList; break; } case KEY_STRUCT_HYPER_TEXT_LIST: { - readHyperText(); + readHyperText(parcel); object = mHyperTextList; break; } case KEY_STRUCT_BLINKING_TEXT_LIST: { - readBlinkingText(); + readBlinkingText(parcel); object = mBlinkingPosList; break; } case KEY_WRAP_TEXT: { - mWrapText = mParcel.readInt(); + mWrapText = parcel.readInt(); object = mWrapText; break; } case KEY_HIGHLIGHT_COLOR_RGBA: { - mHighlightColorRGBA = mParcel.readInt(); + mHighlightColorRGBA = parcel.readInt(); object = mHighlightColorRGBA; break; } case KEY_DISPLAY_FLAGS: { - mDisplayFlags = mParcel.readInt(); + mDisplayFlags = parcel.readInt(); object = mDisplayFlags; break; } case KEY_STRUCT_JUSTIFICATION: { - int horizontal = mParcel.readInt(); - int vertical = mParcel.readInt(); + int horizontal = parcel.readInt(); + int vertical = parcel.readInt(); mJustification = new Justification(horizontal, vertical); object = mJustification; break; } case KEY_BACKGROUND_COLOR_RGBA: { - mBackgroundColorRGBA = mParcel.readInt(); + mBackgroundColorRGBA = parcel.readInt(); object = mBackgroundColorRGBA; break; } case KEY_STRUCT_TEXT_POS: { - int top = mParcel.readInt(); - int left = mParcel.readInt(); - int bottom = mParcel.readInt(); - int right = mParcel.readInt(); + int top = parcel.readInt(); + int left = parcel.readInt(); + int bottom = parcel.readInt(); + int right = parcel.readInt(); mTextBounds = new Rect(left, top, right, bottom); break; } case KEY_SCROLL_DELAY: { - mScrollDelay = mParcel.readInt(); + mScrollDelay = parcel.readInt(); object = mScrollDelay; break; } @@ -520,18 +517,18 @@ public final class TimedText if (mKeyObjectMap.containsKey(key)) { mKeyObjectMap.remove(key); } + // Previous mapping will be replaced with the new object, if there was one. mKeyObjectMap.put(key, object); } } - mParcel.recycle(); return true; } /* * To parse and store the Style list. */ - private void readStyle() { + private void readStyle(Parcel parcel) { boolean endOfStyle = false; int startChar = -1; int endChar = -1; @@ -541,23 +538,23 @@ public final class TimedText boolean isUnderlined = false; int fontSize = -1; int colorRGBA = -1; - while (!endOfStyle && (mParcel.dataAvail() > 0)) { - int key = mParcel.readInt(); + while (!endOfStyle && (parcel.dataAvail() > 0)) { + int key = parcel.readInt(); switch (key) { case KEY_START_CHAR: { - startChar = mParcel.readInt(); + startChar = parcel.readInt(); break; } case KEY_END_CHAR: { - endChar = mParcel.readInt(); + endChar = parcel.readInt(); break; } case KEY_FONT_ID: { - fontId = mParcel.readInt(); + fontId = parcel.readInt(); break; } case KEY_STYLE_FLAGS: { - int flags = mParcel.readInt(); + int flags = parcel.readInt(); // In the absence of any bits set in flags, the text // is plain. Otherwise, 1: bold, 2: italic, 4: underline isBold = ((flags % 2) == 1); @@ -566,17 +563,17 @@ public final class TimedText break; } case KEY_FONT_SIZE: { - fontSize = mParcel.readInt(); + fontSize = parcel.readInt(); break; } case KEY_TEXT_COLOR_RGBA: { - colorRGBA = mParcel.readInt(); + colorRGBA = parcel.readInt(); break; } default: { // End of the Style parsing. Reset the data position back - // to the position before the last mParcel.readInt() call. - mParcel.setDataPosition(mParcel.dataPosition() - 4); + // to the position before the last parcel.readInt() call. + parcel.setDataPosition(parcel.dataPosition() - 4); endOfStyle = true; break; } @@ -594,14 +591,14 @@ public final class TimedText /* * To parse and store the Font list */ - private void readFont() { - int entryCount = mParcel.readInt(); + private void readFont(Parcel parcel) { + int entryCount = parcel.readInt(); for (int i = 0; i < entryCount; i++) { - int id = mParcel.readInt(); - int nameLen = mParcel.readInt(); + int id = parcel.readInt(); + int nameLen = parcel.readInt(); - byte[] text = mParcel.createByteArray(); + byte[] text = parcel.createByteArray(); final String name = new String(text, 0, nameLen); Font font = new Font(id, name); @@ -616,9 +613,9 @@ public final class TimedText /* * To parse and store the Highlight list */ - private void readHighlight() { - int startChar = mParcel.readInt(); - int endChar = mParcel.readInt(); + private void readHighlight(Parcel parcel) { + int startChar = parcel.readInt(); + int endChar = parcel.readInt(); CharPos pos = new CharPos(startChar, endChar); if (mHighlightPosList == null) { @@ -630,14 +627,14 @@ public final class TimedText /* * To parse and store the Karaoke list */ - private void readKaraoke() { - int entryCount = mParcel.readInt(); + private void readKaraoke(Parcel parcel) { + int entryCount = parcel.readInt(); for (int i = 0; i < entryCount; i++) { - int startTimeMs = mParcel.readInt(); - int endTimeMs = mParcel.readInt(); - int startChar = mParcel.readInt(); - int endChar = mParcel.readInt(); + int startTimeMs = parcel.readInt(); + int endTimeMs = parcel.readInt(); + int startChar = parcel.readInt(); + int endChar = parcel.readInt(); Karaoke kara = new Karaoke(startTimeMs, endTimeMs, startChar, endChar); @@ -651,16 +648,16 @@ public final class TimedText /* * To parse and store HyperText list */ - private void readHyperText() { - int startChar = mParcel.readInt(); - int endChar = mParcel.readInt(); + private void readHyperText(Parcel parcel) { + int startChar = parcel.readInt(); + int endChar = parcel.readInt(); - int len = mParcel.readInt(); - byte[] url = mParcel.createByteArray(); + int len = parcel.readInt(); + byte[] url = parcel.createByteArray(); final String urlString = new String(url, 0, len); - len = mParcel.readInt(); - byte[] alt = mParcel.createByteArray(); + len = parcel.readInt(); + byte[] alt = parcel.createByteArray(); final String altString = new String(alt, 0, len); HyperText hyperText = new HyperText(startChar, endChar, urlString, altString); @@ -674,9 +671,9 @@ public final class TimedText /* * To parse and store blinking text list */ - private void readBlinkingText() { - int startChar = mParcel.readInt(); - int endChar = mParcel.readInt(); + private void readBlinkingText(Parcel parcel) { + int startChar = parcel.readInt(); + int endChar = parcel.readInt(); CharPos blinkingPos = new CharPos(startChar, endChar); if (mBlinkingPosList == null) { diff --git a/media/jni/android_media_MediaPlayer.cpp b/media/jni/android_media_MediaPlayer.cpp index 5eadb3a9c1d4..de22e094fe73 100644 --- a/media/jni/android_media_MediaPlayer.cpp +++ b/media/jni/android_media_MediaPlayer.cpp @@ -72,6 +72,7 @@ private: JNIMediaPlayerListener(); jclass mClass; // Reference to MediaPlayer class jobject mObject; // Weak ref to MediaPlayer Java object to call on + jobject mParcel; }; JNIMediaPlayerListener::JNIMediaPlayerListener(JNIEnv* env, jobject thiz, jobject weak_thiz) @@ -90,6 +91,7 @@ JNIMediaPlayerListener::JNIMediaPlayerListener(JNIEnv* env, jobject thiz, jobjec // We use a weak reference so the MediaPlayer object can be garbage collected. // The reference is only used as a proxy for callbacks. mObject = env->NewGlobalRef(weak_thiz); + mParcel = env->NewGlobalRef(createJavaParcelObject(env)); } JNIMediaPlayerListener::~JNIMediaPlayerListener() @@ -98,25 +100,30 @@ JNIMediaPlayerListener::~JNIMediaPlayerListener() JNIEnv *env = AndroidRuntime::getJNIEnv(); env->DeleteGlobalRef(mObject); env->DeleteGlobalRef(mClass); + + recycleJavaParcelObject(env, mParcel); + env->DeleteGlobalRef(mParcel); } void JNIMediaPlayerListener::notify(int msg, int ext1, int ext2, const Parcel *obj) { JNIEnv *env = AndroidRuntime::getJNIEnv(); if (obj && obj->dataSize() > 0) { - jbyteArray jArray = env->NewByteArray(obj->dataSize()); - if (jArray != NULL) { - jbyte *nArray = env->GetByteArrayElements(jArray, NULL); - memcpy(nArray, obj->data(), obj->dataSize()); - env->ReleaseByteArrayElements(jArray, nArray, 0); + if (mParcel != NULL) { + Parcel* nativeParcel = parcelForJavaObject(env, mParcel); + nativeParcel->setData(obj->data(), obj->dataSize()); env->CallStaticVoidMethod(mClass, fields.post_event, mObject, - msg, ext1, ext2, jArray); - env->DeleteLocalRef(jArray); + msg, ext1, ext2, mParcel); } } else { env->CallStaticVoidMethod(mClass, fields.post_event, mObject, msg, ext1, ext2, NULL); } + if (env->ExceptionCheck()) { + ALOGW("An exception occurred while notifying an event."); + LOGW_EX(env); + env->ExceptionClear(); + } } // ---------------------------------------------------------------------------- @@ -533,7 +540,6 @@ android_media_MediaPlayer_invoke(JNIEnv *env, jobject thiz, return UNKNOWN_ERROR; } - Parcel *request = parcelForJavaObject(env, java_request); Parcel *reply = parcelForJavaObject(env, java_reply); diff --git a/packages/InputDevices/res/xml/keyboard_layouts.xml b/packages/InputDevices/res/xml/keyboard_layouts.xml index 23f6bcb8e6c2..c2a2ecc00df5 100644 --- a/packages/InputDevices/res/xml/keyboard_layouts.xml +++ b/packages/InputDevices/res/xml/keyboard_layouts.xml @@ -2,109 +2,109 @@ <keyboard-layouts xmlns:android="http://schemas.android.com/apk/res/android"> <keyboard-layout android:name="keyboard_layout_english_us" android:label="@string/keyboard_layout_english_us_label" - android:kcm="@raw/keyboard_layout_english_us" /> + android:keyboardLayout="@raw/keyboard_layout_english_us" /> <keyboard-layout android:name="keyboard_layout_english_us_dvorak" android:label="@string/keyboard_layout_english_us_dvorak_label" - android:kcm="@raw/keyboard_layout_english_us_dvorak" /> + android:keyboardLayout="@raw/keyboard_layout_english_us_dvorak" /> <keyboard-layout android:name="keyboard_layout_german" android:label="@string/keyboard_layout_german_label" - android:kcm="@raw/keyboard_layout_german" /> + android:keyboardLayout="@raw/keyboard_layout_german" /> <keyboard-layout android:name="keyboard_layout_french" android:label="@string/keyboard_layout_french_label" - android:kcm="@raw/keyboard_layout_french" /> + android:keyboardLayout="@raw/keyboard_layout_french" /> <keyboard-layout android:name="keyboard_layout_french_ca" android:label="@string/keyboard_layout_french_ca_label" - android:kcm="@raw/keyboard_layout_french_ca" /> + android:keyboardLayout="@raw/keyboard_layout_french_ca" /> <keyboard-layout android:name="keyboard_layout_russian" android:label="@string/keyboard_layout_russian_label" - android:kcm="@raw/keyboard_layout_russian" /> + android:keyboardLayout="@raw/keyboard_layout_russian" /> <keyboard-layout android:name="keyboard_layout_russian_mac" android:label="@string/keyboard_layout_russian_mac_label" - android:kcm="@raw/keyboard_layout_russian_mac" /> + android:keyboardLayout="@raw/keyboard_layout_russian_mac" /> <keyboard-layout android:name="keyboard_layout_spanish" android:label="@string/keyboard_layout_spanish_label" - android:kcm="@raw/keyboard_layout_spanish" /> + android:keyboardLayout="@raw/keyboard_layout_spanish" /> <keyboard-layout android:name="keyboard_layout_swiss_french" android:label="@string/keyboard_layout_swiss_french_label" - android:kcm="@raw/keyboard_layout_swiss_french" /> + android:keyboardLayout="@raw/keyboard_layout_swiss_french" /> <keyboard-layout android:name="keyboard_layout_swiss_german" android:label="@string/keyboard_layout_swiss_german_label" - android:kcm="@raw/keyboard_layout_swiss_german" /> + android:keyboardLayout="@raw/keyboard_layout_swiss_german" /> <keyboard-layout android:name="keyboard_layout_belgian" android:label="@string/keyboard_layout_belgian" - android:kcm="@raw/keyboard_layout_belgian" /> + android:keyboardLayout="@raw/keyboard_layout_belgian" /> <keyboard-layout android:name="keyboard_layout_bulgarian" android:label="@string/keyboard_layout_bulgarian" - android:kcm="@raw/keyboard_layout_bulgarian" /> + android:keyboardLayout="@raw/keyboard_layout_bulgarian" /> <keyboard-layout android:name="keyboard_layout_italian" android:label="@string/keyboard_layout_italian" - android:kcm="@raw/keyboard_layout_italian" /> + android:keyboardLayout="@raw/keyboard_layout_italian" /> <keyboard-layout android:name="keyboard_layout_danish" android:label="@string/keyboard_layout_danish" - android:kcm="@raw/keyboard_layout_danish" /> + android:keyboardLayout="@raw/keyboard_layout_danish" /> <keyboard-layout android:name="keyboard_layout_norwegian" android:label="@string/keyboard_layout_norwegian" - android:kcm="@raw/keyboard_layout_norwegian" /> + android:keyboardLayout="@raw/keyboard_layout_norwegian" /> <keyboard-layout android:name="keyboard_layout_swedish" android:label="@string/keyboard_layout_swedish" - android:kcm="@raw/keyboard_layout_swedish" /> + android:keyboardLayout="@raw/keyboard_layout_swedish" /> <keyboard-layout android:name="keyboard_layout_finnish" android:label="@string/keyboard_layout_finnish" - android:kcm="@raw/keyboard_layout_finnish" /> + android:keyboardLayout="@raw/keyboard_layout_finnish" /> <keyboard-layout android:name="keyboard_layout_croatian" android:label="@string/keyboard_layout_croatian" - android:kcm="@raw/keyboard_layout_croatian_and_slovenian" /> + android:keyboardLayout="@raw/keyboard_layout_croatian_and_slovenian" /> <keyboard-layout android:name="keyboard_layout_czech" android:label="@string/keyboard_layout_czech" - android:kcm="@raw/keyboard_layout_czech" /> + android:keyboardLayout="@raw/keyboard_layout_czech" /> <keyboard-layout android:name="keyboard_layout_estonian" android:label="@string/keyboard_layout_estonian" - android:kcm="@raw/keyboard_layout_estonian" /> + android:keyboardLayout="@raw/keyboard_layout_estonian" /> <keyboard-layout android:name="keyboard_layout_hungarian" android:label="@string/keyboard_layout_hungarian" - android:kcm="@raw/keyboard_layout_hungarian" /> + android:keyboardLayout="@raw/keyboard_layout_hungarian" /> <keyboard-layout android:name="keyboard_layout_icelandic" android:label="@string/keyboard_layout_icelandic" - android:kcm="@raw/keyboard_layout_icelandic" /> + android:keyboardLayout="@raw/keyboard_layout_icelandic" /> <keyboard-layout android:name="keyboard_layout_portuguese" android:label="@string/keyboard_layout_portuguese" - android:kcm="@raw/keyboard_layout_portuguese" /> + android:keyboardLayout="@raw/keyboard_layout_portuguese" /> <keyboard-layout android:name="keyboard_layout_slovak" android:label="@string/keyboard_layout_slovak" - android:kcm="@raw/keyboard_layout_slovak" /> + android:keyboardLayout="@raw/keyboard_layout_slovak" /> <keyboard-layout android:name="keyboard_layout_slovenian" android:label="@string/keyboard_layout_slovenian" - android:kcm="@raw/keyboard_layout_croatian_and_slovenian" /> + android:keyboardLayout="@raw/keyboard_layout_croatian_and_slovenian" /> <keyboard-layout android:name="keyboard_layout_turkish" android:label="@string/keyboard_layout_turkish" - android:kcm="@raw/keyboard_layout_turkish" /> + android:keyboardLayout="@raw/keyboard_layout_turkish" /> <keyboard-layout android:name="keyboard_layout_ukrainian" android:label="@string/keyboard_layout_ukrainian" - android:kcm="@raw/keyboard_layout_ukrainian" /> + android:keyboardLayout="@raw/keyboard_layout_ukrainian" /> </keyboard-layouts> diff --git a/packages/SystemUI/res/layout-land/status_bar_recent_panel.xml b/packages/SystemUI/res/layout-land/status_bar_recent_panel.xml index 869b16446aaf..8a211172ddea 100644 --- a/packages/SystemUI/res/layout-land/status_bar_recent_panel.xml +++ b/packages/SystemUI/res/layout-land/status_bar_recent_panel.xml @@ -27,12 +27,6 @@ systemui:recentItemLayout="@layout/status_bar_recent_item" > - <ImageView - android:id="@+id/recents_transition_placeholder_icon" - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:visibility="invisible" /> - <FrameLayout android:id="@+id/recents_bg_protect" android:background="@drawable/status_bar_recents_background" @@ -42,6 +36,12 @@ android:clipToPadding="false" android:clipChildren="false"> + <ImageView + android:id="@+id/recents_transition_placeholder_icon" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:visibility="invisible" /> + <com.android.systemui.recent.RecentsHorizontalScrollView android:id="@+id/recents_container" android:layout_width="wrap_content" android:layout_height="match_parent" diff --git a/packages/SystemUI/res/layout-land/status_bar_search_panel.xml b/packages/SystemUI/res/layout-land/status_bar_search_panel.xml index 5d4d989e629c..392a8b56c8b9 100644 --- a/packages/SystemUI/res/layout-land/status_bar_search_panel.xml +++ b/packages/SystemUI/res/layout-land/status_bar_search_panel.xml @@ -52,7 +52,6 @@ prvandroid:directionDescriptions="@array/navbar_search_direction_descriptions" prvandroid:handleDrawable="@drawable/navbar_search_handle" prvandroid:waveDrawable="@drawable/navbar_search_outerring" - prvandroid:outerRadius="@dimen/navbar_search_target_placement_radius" prvandroid:snapMargin="@dimen/navbar_search_snap_margin" prvandroid:hitRadius="@dimen/navbar_search_hit_radius" prvandroid:feedbackCount="0" diff --git a/packages/SystemUI/res/layout-port/status_bar_recent_panel.xml b/packages/SystemUI/res/layout-port/status_bar_recent_panel.xml index fc9fcf43fe35..1d29c5a41fdf 100644 --- a/packages/SystemUI/res/layout-port/status_bar_recent_panel.xml +++ b/packages/SystemUI/res/layout-port/status_bar_recent_panel.xml @@ -27,12 +27,6 @@ systemui:recentItemLayout="@layout/status_bar_recent_item" > - <ImageView - android:id="@+id/recents_transition_placeholder_icon" - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:visibility="invisible" /> - <FrameLayout android:id="@+id/recents_bg_protect" android:background="@drawable/status_bar_recents_background" @@ -40,6 +34,12 @@ android:layout_height="match_parent" android:layout_alignParentBottom="true"> + <ImageView + android:id="@+id/recents_transition_placeholder_icon" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:visibility="invisible" /> + <com.android.systemui.recent.RecentsVerticalScrollView android:id="@+id/recents_container" android:layout_width="match_parent" diff --git a/packages/SystemUI/res/layout-port/status_bar_search_panel.xml b/packages/SystemUI/res/layout-port/status_bar_search_panel.xml index 2486b7507f58..371c57540fbc 100644 --- a/packages/SystemUI/res/layout-port/status_bar_search_panel.xml +++ b/packages/SystemUI/res/layout-port/status_bar_search_panel.xml @@ -52,7 +52,6 @@ prvandroid:directionDescriptions="@array/navbar_search_direction_descriptions" prvandroid:handleDrawable="@drawable/navbar_search_handle" prvandroid:waveDrawable="@drawable/navbar_search_outerring" - prvandroid:outerRadius="@dimen/navbar_search_target_placement_radius" prvandroid:snapMargin="@dimen/navbar_search_snap_margin" prvandroid:hitRadius="@dimen/navbar_search_hit_radius" prvandroid:feedbackCount="0" diff --git a/packages/SystemUI/res/layout-sw600dp/status_bar_search_panel.xml b/packages/SystemUI/res/layout-sw600dp/status_bar_search_panel.xml index 4b2fbc7f9f15..0ccfe95a2d61 100644 --- a/packages/SystemUI/res/layout-sw600dp/status_bar_search_panel.xml +++ b/packages/SystemUI/res/layout-sw600dp/status_bar_search_panel.xml @@ -61,7 +61,6 @@ prvandroid:directionDescriptions="@array/navbar_search_direction_descriptions" prvandroid:handleDrawable="@drawable/navbar_search_handle" prvandroid:waveDrawable="@drawable/navbar_search_outerring" - prvandroid:outerRadius="@dimen/navbar_search_target_placement_radius" prvandroid:snapMargin="@dimen/navbar_search_snap_margin" prvandroid:hitRadius="@dimen/navbar_search_hit_radius" prvandroid:feedbackCount="0" diff --git a/packages/SystemUI/res/layout-sw720dp/status_bar_search_panel.xml b/packages/SystemUI/res/layout-sw720dp/status_bar_search_panel.xml index b4872c771dea..0a5390a3f8de 100644 --- a/packages/SystemUI/res/layout-sw720dp/status_bar_search_panel.xml +++ b/packages/SystemUI/res/layout-sw720dp/status_bar_search_panel.xml @@ -36,7 +36,8 @@ android:layout_width="wrap_content" android:layout_height="@dimen/navbar_search_panel_height" android:layout_alignParentBottom="true" - android:layout_alignParentLeft="true"> + android:layout_alignParentLeft="true" + android:layout_marginLeft="-120dip"> <View android:layout_width="0dip" @@ -60,7 +61,6 @@ prvandroid:directionDescriptions="@array/navbar_search_direction_descriptions" prvandroid:handleDrawable="@drawable/navbar_search_handle" prvandroid:waveDrawable="@drawable/navbar_search_outerring" - prvandroid:outerRadius="@dimen/navbar_search_target_placement_radius" prvandroid:snapMargin="@dimen/navbar_search_snap_margin" prvandroid:hitRadius="@dimen/navbar_search_hit_radius" prvandroid:feedbackCount="0" diff --git a/packages/SystemUI/res/values-be/strings.xml b/packages/SystemUI/res/values-be/strings.xml index 82262f21ed8f..c4af8d85c2bd 100644 --- a/packages/SystemUI/res/values-be/strings.xml +++ b/packages/SystemUI/res/values-be/strings.xml @@ -144,10 +144,7 @@ <string name="status_bar_notification_inspect_item_title" msgid="1163547729015390250">"Інфармацыя пра прыкладанне"</string> <string name="notifications_off_title" msgid="8936620513608443224">"Паведамленні адключаны"</string> <string name="notifications_off_text" msgid="2529001315769385273">"Націсніце тут, каб зноў уключыць апавяшчэнні."</string> - <!-- no translation found for accessibility_rotation_lock_off (4062780228931590069) --> - <skip /> - <!-- no translation found for accessibility_rotation_lock_on_landscape (6731197337665366273) --> - <skip /> - <!-- no translation found for accessibility_rotation_lock_on_portrait (5809367521644012115) --> - <skip /> + <string name="accessibility_rotation_lock_off" msgid="4062780228931590069">"Экран паварочваецца аўтаматычна."</string> + <string name="accessibility_rotation_lock_on_landscape" msgid="6731197337665366273">"Экран заблакiраваны ў альбомнай арыентацыі."</string> + <string name="accessibility_rotation_lock_on_portrait" msgid="5809367521644012115">"Экран заблакiраваны ў партрэтнай арыентацыі."</string> </resources> diff --git a/packages/SystemUI/res/values-bg/strings.xml b/packages/SystemUI/res/values-bg/strings.xml index c32bafebb75c..a4a0e789b562 100644 --- a/packages/SystemUI/res/values-bg/strings.xml +++ b/packages/SystemUI/res/values-bg/strings.xml @@ -142,10 +142,7 @@ <string name="status_bar_notification_inspect_item_title" msgid="1163547729015390250">"Информация за приложението"</string> <string name="notifications_off_title" msgid="8936620513608443224">"Известията са изключени"</string> <string name="notifications_off_text" msgid="2529001315769385273">"Докоснете тук, за да включите отново известията."</string> - <!-- no translation found for accessibility_rotation_lock_off (4062780228931590069) --> - <skip /> - <!-- no translation found for accessibility_rotation_lock_on_landscape (6731197337665366273) --> - <skip /> - <!-- no translation found for accessibility_rotation_lock_on_portrait (5809367521644012115) --> - <skip /> + <string name="accessibility_rotation_lock_off" msgid="4062780228931590069">"Екранът ще се завърта автоматично."</string> + <string name="accessibility_rotation_lock_on_landscape" msgid="6731197337665366273">"Екранът е заключен в хоризонтална ориентация."</string> + <string name="accessibility_rotation_lock_on_portrait" msgid="5809367521644012115">"Екранът е заключен във вертикална ориентация."</string> </resources> diff --git a/packages/SystemUI/res/values-cs/strings.xml b/packages/SystemUI/res/values-cs/strings.xml index dfcb3b4f7790..c41cf6fd5b5f 100644 --- a/packages/SystemUI/res/values-cs/strings.xml +++ b/packages/SystemUI/res/values-cs/strings.xml @@ -144,10 +144,7 @@ <string name="status_bar_notification_inspect_item_title" msgid="1163547729015390250">"Informace o aplikaci"</string> <string name="notifications_off_title" msgid="8936620513608443224">"Oznámení jsou vypnuta"</string> <string name="notifications_off_text" msgid="2529001315769385273">"Chcete-li oznámení znovu zapnout, klepněte sem."</string> - <!-- no translation found for accessibility_rotation_lock_off (4062780228931590069) --> - <skip /> - <!-- no translation found for accessibility_rotation_lock_on_landscape (6731197337665366273) --> - <skip /> - <!-- no translation found for accessibility_rotation_lock_on_portrait (5809367521644012115) --> - <skip /> + <string name="accessibility_rotation_lock_off" msgid="4062780228931590069">"Obrazovka se automaticky otočí."</string> + <string name="accessibility_rotation_lock_on_landscape" msgid="6731197337665366273">"Obrazovka je uzamčena v orientaci na šířku."</string> + <string name="accessibility_rotation_lock_on_portrait" msgid="5809367521644012115">"Obrazovka je uzamčena v orientaci na výšku."</string> </resources> diff --git a/packages/SystemUI/res/values-de/strings.xml b/packages/SystemUI/res/values-de/strings.xml index 05208210986a..b7dcb143da47 100644 --- a/packages/SystemUI/res/values-de/strings.xml +++ b/packages/SystemUI/res/values-de/strings.xml @@ -66,7 +66,7 @@ <string name="screenshot_saving_title" msgid="8242282144535555697">"Screenshot wird gespeichert..."</string> <string name="screenshot_saving_text" msgid="2419718443411738818">"Screenshot wird gespeichert..."</string> <string name="screenshot_saved_title" msgid="6461865960961414961">"Screenshot aufgenommen"</string> - <string name="screenshot_saved_text" msgid="1152839647677558815">"Zum Anzeigen Ihres Screenshots berühren"</string> + <string name="screenshot_saved_text" msgid="1152839647677558815">"Zum Anzeigen des Screenshots berühren"</string> <string name="screenshot_failed_title" msgid="705781116746922771">"Screenshot konnte nicht aufgenommen werden."</string> <string name="screenshot_failed_text" msgid="8134011269572415402">"Screenshot konnte nicht gespeichert werden. Eventuell wird der Speicher gerade verwendet."</string> <string name="usb_preference_title" msgid="6551050377388882787">"USB-Dateiübertragungsoptionen"</string> diff --git a/packages/SystemUI/res/values-et/strings.xml b/packages/SystemUI/res/values-et/strings.xml index a2eb51e7f395..318ed0455587 100644 --- a/packages/SystemUI/res/values-et/strings.xml +++ b/packages/SystemUI/res/values-et/strings.xml @@ -142,10 +142,7 @@ <string name="status_bar_notification_inspect_item_title" msgid="1163547729015390250">"Rakenduse teave"</string> <string name="notifications_off_title" msgid="8936620513608443224">"Teatised väljas"</string> <string name="notifications_off_text" msgid="2529001315769385273">"Teatiste uuesti sisselülitamiseks puudutage siin."</string> - <!-- no translation found for accessibility_rotation_lock_off (4062780228931590069) --> - <skip /> - <!-- no translation found for accessibility_rotation_lock_on_landscape (6731197337665366273) --> - <skip /> - <!-- no translation found for accessibility_rotation_lock_on_portrait (5809367521644012115) --> - <skip /> + <string name="accessibility_rotation_lock_off" msgid="4062780228931590069">"Ekraani pööramine toimub automaatselt."</string> + <string name="accessibility_rotation_lock_on_landscape" msgid="6731197337665366273">"Ekraan on lukustatud horisontaalsuunas."</string> + <string name="accessibility_rotation_lock_on_portrait" msgid="5809367521644012115">"Ekraan on lukustatud vertikaalsuunas."</string> </resources> diff --git a/packages/SystemUI/res/values-hr/strings.xml b/packages/SystemUI/res/values-hr/strings.xml index 4b8700528ea1..4a1f35a9fee0 100644 --- a/packages/SystemUI/res/values-hr/strings.xml +++ b/packages/SystemUI/res/values-hr/strings.xml @@ -142,10 +142,7 @@ <string name="status_bar_notification_inspect_item_title" msgid="1163547729015390250">"Informacije o aplikaciji"</string> <string name="notifications_off_title" msgid="8936620513608443224">"Obavijesti isključene"</string> <string name="notifications_off_text" msgid="2529001315769385273">"Dotaknite ovdje da biste ponovo uključili obavijesti."</string> - <!-- no translation found for accessibility_rotation_lock_off (4062780228931590069) --> - <skip /> - <!-- no translation found for accessibility_rotation_lock_on_landscape (6731197337665366273) --> - <skip /> - <!-- no translation found for accessibility_rotation_lock_on_portrait (5809367521644012115) --> - <skip /> + <string name="accessibility_rotation_lock_off" msgid="4062780228931590069">"Zaslon će se automatski zakrenuti."</string> + <string name="accessibility_rotation_lock_on_landscape" msgid="6731197337665366273">"Zaslon je zaključan u pejzažnoj orijentaciji."</string> + <string name="accessibility_rotation_lock_on_portrait" msgid="5809367521644012115">"Zaslon je zaključan u portretnoj orijentaciji."</string> </resources> diff --git a/packages/SystemUI/res/values-in/strings.xml b/packages/SystemUI/res/values-in/strings.xml index 4571066724d8..a117252fd093 100644 --- a/packages/SystemUI/res/values-in/strings.xml +++ b/packages/SystemUI/res/values-in/strings.xml @@ -140,14 +140,10 @@ <string name="accessibility_clear_all" msgid="5235938559247164925">"Menghapus semua pemberitahuan."</string> <string name="dreams_dock_launcher" msgid="3541196417659166245">"Aktifkan tirai layar"</string> <string name="status_bar_notification_inspect_item_title" msgid="1163547729015390250">"Info aplikasi"</string> - <!-- no translation found for notifications_off_title (8936620513608443224) --> - <skip /> + <string name="notifications_off_title" msgid="8936620513608443224">"Pemberitahuan mati"</string> <!-- no translation found for notifications_off_text (2529001315769385273) --> <skip /> - <!-- no translation found for accessibility_rotation_lock_off (4062780228931590069) --> - <skip /> - <!-- no translation found for accessibility_rotation_lock_on_landscape (6731197337665366273) --> - <skip /> - <!-- no translation found for accessibility_rotation_lock_on_portrait (5809367521644012115) --> - <skip /> + <string name="accessibility_rotation_lock_off" msgid="4062780228931590069">"Layar akan diputar secara otomatis."</string> + <string name="accessibility_rotation_lock_on_landscape" msgid="6731197337665366273">"Layar dikunci dalam orientasi lanskap."</string> + <string name="accessibility_rotation_lock_on_portrait" msgid="5809367521644012115">"Layar dikunci dalam orientasi potret."</string> </resources> diff --git a/packages/SystemUI/res/values-ko/strings.xml b/packages/SystemUI/res/values-ko/strings.xml index 438cc0d8922a..e54b06c854be 100644 --- a/packages/SystemUI/res/values-ko/strings.xml +++ b/packages/SystemUI/res/values-ko/strings.xml @@ -140,14 +140,9 @@ <string name="accessibility_clear_all" msgid="5235938559247164925">"모든 알림 지우기"</string> <string name="dreams_dock_launcher" msgid="3541196417659166245">"스크린 세이버 활성화"</string> <string name="status_bar_notification_inspect_item_title" msgid="1163547729015390250">"앱 정보"</string> - <!-- no translation found for notifications_off_title (8936620513608443224) --> - <skip /> - <!-- no translation found for notifications_off_text (2529001315769385273) --> - <skip /> - <!-- no translation found for accessibility_rotation_lock_off (4062780228931590069) --> - <skip /> - <!-- no translation found for accessibility_rotation_lock_on_landscape (6731197337665366273) --> - <skip /> - <!-- no translation found for accessibility_rotation_lock_on_portrait (5809367521644012115) --> - <skip /> + <string name="notifications_off_title" msgid="8936620513608443224">"알림 사용 안함"</string> + <string name="notifications_off_text" msgid="2529001315769385273">"알림을 다시 사용하려면 여기를 터치하세요."</string> + <string name="accessibility_rotation_lock_off" msgid="4062780228931590069">"화면이 자동으로 회전됩니다."</string> + <string name="accessibility_rotation_lock_on_landscape" msgid="6731197337665366273">"화면이 가로 방향으로 잠겨 있습니다."</string> + <string name="accessibility_rotation_lock_on_portrait" msgid="5809367521644012115">"화면이 세로 방향으로 잠겨 있습니다."</string> </resources> diff --git a/packages/SystemUI/res/values-ms/strings.xml b/packages/SystemUI/res/values-ms/strings.xml index 929278350abb..3265cd51c9c6 100644 --- a/packages/SystemUI/res/values-ms/strings.xml +++ b/packages/SystemUI/res/values-ms/strings.xml @@ -142,10 +142,7 @@ <string name="status_bar_notification_inspect_item_title" msgid="1163547729015390250">"Maklumat apl"</string> <string name="notifications_off_title" msgid="8936620513608443224">"Pemberitahuan dimatikan"</string> <string name="notifications_off_text" msgid="2529001315769385273">"Ketik di sini untuk menghidupkan kembali pemberitahuan."</string> - <!-- no translation found for accessibility_rotation_lock_off (4062780228931590069) --> - <skip /> - <!-- no translation found for accessibility_rotation_lock_on_landscape (6731197337665366273) --> - <skip /> - <!-- no translation found for accessibility_rotation_lock_on_portrait (5809367521644012115) --> - <skip /> + <string name="accessibility_rotation_lock_off" msgid="4062780228931590069">"Skrin akan berputar secara automatik."</string> + <string name="accessibility_rotation_lock_on_landscape" msgid="6731197337665366273">"Skrin dikunci dalam orientasi landskap."</string> + <string name="accessibility_rotation_lock_on_portrait" msgid="5809367521644012115">"Skrin dikunci dalam orientasi potret."</string> </resources> diff --git a/packages/SystemUI/res/values-nb/strings.xml b/packages/SystemUI/res/values-nb/strings.xml index b416095354c8..2a9c1c857fd5 100644 --- a/packages/SystemUI/res/values-nb/strings.xml +++ b/packages/SystemUI/res/values-nb/strings.xml @@ -144,10 +144,7 @@ <skip /> <!-- no translation found for notifications_off_text (2529001315769385273) --> <skip /> - <!-- no translation found for accessibility_rotation_lock_off (4062780228931590069) --> - <skip /> - <!-- no translation found for accessibility_rotation_lock_on_landscape (6731197337665366273) --> - <skip /> - <!-- no translation found for accessibility_rotation_lock_on_portrait (5809367521644012115) --> - <skip /> + <string name="accessibility_rotation_lock_off" msgid="4062780228931590069">"Skjermen roterer automatisk."</string> + <string name="accessibility_rotation_lock_on_landscape" msgid="6731197337665366273">"Skjermen er låst i liggende retning."</string> + <string name="accessibility_rotation_lock_on_portrait" msgid="5809367521644012115">"Skjermen er låst i stående retning."</string> </resources> diff --git a/packages/SystemUI/res/values-pl/strings.xml b/packages/SystemUI/res/values-pl/strings.xml index 3dab38936b26..b01345e6d9c9 100644 --- a/packages/SystemUI/res/values-pl/strings.xml +++ b/packages/SystemUI/res/values-pl/strings.xml @@ -144,10 +144,7 @@ <skip /> <!-- no translation found for notifications_off_text (2529001315769385273) --> <skip /> - <!-- no translation found for accessibility_rotation_lock_off (4062780228931590069) --> - <skip /> - <!-- no translation found for accessibility_rotation_lock_on_landscape (6731197337665366273) --> - <skip /> - <!-- no translation found for accessibility_rotation_lock_on_portrait (5809367521644012115) --> - <skip /> + <string name="accessibility_rotation_lock_off" msgid="4062780228931590069">"Ekran zostanie obrócony automatycznie."</string> + <string name="accessibility_rotation_lock_on_landscape" msgid="6731197337665366273">"Ekran jest zablokowany w orientacji poziomej."</string> + <string name="accessibility_rotation_lock_on_portrait" msgid="5809367521644012115">"Ekran jest zablokowany w orientacji pionowej."</string> </resources> diff --git a/packages/SystemUI/res/values-pt-rPT/strings.xml b/packages/SystemUI/res/values-pt-rPT/strings.xml index 30950baba71c..77ed068d8979 100644 --- a/packages/SystemUI/res/values-pt-rPT/strings.xml +++ b/packages/SystemUI/res/values-pt-rPT/strings.xml @@ -140,10 +140,8 @@ <string name="accessibility_clear_all" msgid="5235938559247164925">"Limpar todas as notificações."</string> <string name="dreams_dock_launcher" msgid="3541196417659166245">"Ativar proteção de ecrã"</string> <string name="status_bar_notification_inspect_item_title" msgid="1163547729015390250">"Informações da aplicação"</string> - <!-- no translation found for notifications_off_title (8936620513608443224) --> - <skip /> - <!-- no translation found for notifications_off_text (2529001315769385273) --> - <skip /> + <string name="notifications_off_title" msgid="8936620513608443224">"Notificações desativadas"</string> + <string name="notifications_off_text" msgid="2529001315769385273">"Toque aqui para voltar a ativar as notificações."</string> <!-- no translation found for accessibility_rotation_lock_off (4062780228931590069) --> <skip /> <!-- no translation found for accessibility_rotation_lock_on_landscape (6731197337665366273) --> diff --git a/packages/SystemUI/res/values-pt/strings.xml b/packages/SystemUI/res/values-pt/strings.xml index 7f9e6e11aa82..f074d22955bb 100644 --- a/packages/SystemUI/res/values-pt/strings.xml +++ b/packages/SystemUI/res/values-pt/strings.xml @@ -144,10 +144,7 @@ <string name="status_bar_notification_inspect_item_title" msgid="1163547729015390250">"Informações do aplicativo"</string> <string name="notifications_off_title" msgid="8936620513608443224">"Notificações desativadas"</string> <string name="notifications_off_text" msgid="2529001315769385273">"Toque aqui para ativar as notificações novamente."</string> - <!-- no translation found for accessibility_rotation_lock_off (4062780228931590069) --> - <skip /> - <!-- no translation found for accessibility_rotation_lock_on_landscape (6731197337665366273) --> - <skip /> - <!-- no translation found for accessibility_rotation_lock_on_portrait (5809367521644012115) --> - <skip /> + <string name="accessibility_rotation_lock_off" msgid="4062780228931590069">"A tela girará automaticamente."</string> + <string name="accessibility_rotation_lock_on_landscape" msgid="6731197337665366273">"A tela está bloqueada na orientação paisagem."</string> + <string name="accessibility_rotation_lock_on_portrait" msgid="5809367521644012115">"A tela está bloqueada na orientação retrato."</string> </resources> diff --git a/packages/SystemUI/res/values-ro/strings.xml b/packages/SystemUI/res/values-ro/strings.xml index 2896eaea70fe..4750ac56abff 100644 --- a/packages/SystemUI/res/values-ro/strings.xml +++ b/packages/SystemUI/res/values-ro/strings.xml @@ -144,10 +144,7 @@ <skip /> <!-- no translation found for notifications_off_text (2529001315769385273) --> <skip /> - <!-- no translation found for accessibility_rotation_lock_off (4062780228931590069) --> - <skip /> - <!-- no translation found for accessibility_rotation_lock_on_landscape (6731197337665366273) --> - <skip /> - <!-- no translation found for accessibility_rotation_lock_on_portrait (5809367521644012115) --> - <skip /> + <string name="accessibility_rotation_lock_off" msgid="4062780228931590069">"Ecranul se va roti în mod automat."</string> + <string name="accessibility_rotation_lock_on_landscape" msgid="6731197337665366273">"Ecranul este blocat în orientarea de tip peisaj."</string> + <string name="accessibility_rotation_lock_on_portrait" msgid="5809367521644012115">"Ecranul este blocat în orientarea de tip portret."</string> </resources> diff --git a/packages/SystemUI/res/values-sk/strings.xml b/packages/SystemUI/res/values-sk/strings.xml index 64494b886e16..8e64487423cd 100644 --- a/packages/SystemUI/res/values-sk/strings.xml +++ b/packages/SystemUI/res/values-sk/strings.xml @@ -142,14 +142,9 @@ <string name="accessibility_clear_all" msgid="5235938559247164925">"Vymazať všetky upozornenia."</string> <string name="dreams_dock_launcher" msgid="3541196417659166245">"Aktivovať šetrič obrazovky"</string> <string name="status_bar_notification_inspect_item_title" msgid="1163547729015390250">"Informácie o aplikácii"</string> - <!-- no translation found for notifications_off_title (8936620513608443224) --> - <skip /> - <!-- no translation found for notifications_off_text (2529001315769385273) --> - <skip /> - <!-- no translation found for accessibility_rotation_lock_off (4062780228931590069) --> - <skip /> - <!-- no translation found for accessibility_rotation_lock_on_landscape (6731197337665366273) --> - <skip /> - <!-- no translation found for accessibility_rotation_lock_on_portrait (5809367521644012115) --> - <skip /> + <string name="notifications_off_title" msgid="8936620513608443224">"Upozornenia sú vypnuté"</string> + <string name="notifications_off_text" msgid="2529001315769385273">"Klepnutím sem upozornenia znova povolíte."</string> + <string name="accessibility_rotation_lock_off" msgid="4062780228931590069">"Obrazovka sa automaticky otočí."</string> + <string name="accessibility_rotation_lock_on_landscape" msgid="6731197337665366273">"Obrazovka je uzamknutá v orientácii na šírku."</string> + <string name="accessibility_rotation_lock_on_portrait" msgid="5809367521644012115">"Obrazovka je uzamknutá v orientácii na výšku."</string> </resources> diff --git a/packages/SystemUI/res/values-sr/strings.xml b/packages/SystemUI/res/values-sr/strings.xml index 6b475d3974be..5f523a2e7ed5 100644 --- a/packages/SystemUI/res/values-sr/strings.xml +++ b/packages/SystemUI/res/values-sr/strings.xml @@ -144,10 +144,7 @@ <skip /> <!-- no translation found for notifications_off_text (2529001315769385273) --> <skip /> - <!-- no translation found for accessibility_rotation_lock_off (4062780228931590069) --> - <skip /> - <!-- no translation found for accessibility_rotation_lock_on_landscape (6731197337665366273) --> - <skip /> - <!-- no translation found for accessibility_rotation_lock_on_portrait (5809367521644012115) --> - <skip /> + <string name="accessibility_rotation_lock_off" msgid="4062780228931590069">"Екран ће се аутоматски ротирати."</string> + <string name="accessibility_rotation_lock_on_landscape" msgid="6731197337665366273">"Екран је закључан у хоризонталном положају."</string> + <string name="accessibility_rotation_lock_on_portrait" msgid="5809367521644012115">"Екран је закључан у вертикалном положају."</string> </resources> diff --git a/packages/SystemUI/res/values-sw600dp/dimens.xml b/packages/SystemUI/res/values-sw600dp/dimens.xml index 2cb99ff9df51..07d55f15378f 100644 --- a/packages/SystemUI/res/values-sw600dp/dimens.xml +++ b/packages/SystemUI/res/values-sw600dp/dimens.xml @@ -27,9 +27,6 @@ <!-- 0x33 = center_horizontal|top --> <integer name="notification_panel_layout_gravity">0x31</integer> - <!-- Default target placement radius for navigation bar search target --> - <dimen name="navbar_search_target_placement_radius">182dip</dimen> - <!-- Diameter of outer shape drawable shown in navbar search--> <dimen name="navbar_search_outerring_diameter">364dp</dimen> diff --git a/packages/SystemUI/res/values-tl/strings.xml b/packages/SystemUI/res/values-tl/strings.xml index de4ae188046f..e1c41858d36c 100644 --- a/packages/SystemUI/res/values-tl/strings.xml +++ b/packages/SystemUI/res/values-tl/strings.xml @@ -142,10 +142,7 @@ <string name="status_bar_notification_inspect_item_title" msgid="1163547729015390250">"Impormasyon ng app"</string> <string name="notifications_off_title" msgid="8936620513608443224">"Naka-off ang mga notification"</string> <string name="notifications_off_text" msgid="2529001315769385273">"Tumapik dito upang muling i-on ang mga notification."</string> - <!-- no translation found for accessibility_rotation_lock_off (4062780228931590069) --> - <skip /> - <!-- no translation found for accessibility_rotation_lock_on_landscape (6731197337665366273) --> - <skip /> - <!-- no translation found for accessibility_rotation_lock_on_portrait (5809367521644012115) --> - <skip /> + <string name="accessibility_rotation_lock_off" msgid="4062780228931590069">"Awtomatikong iikot ang screen."</string> + <string name="accessibility_rotation_lock_on_landscape" msgid="6731197337665366273">"Naka-lock ang screen sa pahigang oryentasyon."</string> + <string name="accessibility_rotation_lock_on_portrait" msgid="5809367521644012115">"Naka-lock ang screen sa patayong oryentasyon."</string> </resources> diff --git a/packages/SystemUI/res/values-uk/strings.xml b/packages/SystemUI/res/values-uk/strings.xml index 6494fc82a49b..165baae71c90 100644 --- a/packages/SystemUI/res/values-uk/strings.xml +++ b/packages/SystemUI/res/values-uk/strings.xml @@ -140,14 +140,9 @@ <string name="accessibility_clear_all" msgid="5235938559247164925">"Очистити всі сповіщення."</string> <string name="dreams_dock_launcher" msgid="3541196417659166245">"Активувати заставку"</string> <string name="status_bar_notification_inspect_item_title" msgid="1163547729015390250">"Інформація про програму"</string> - <!-- no translation found for notifications_off_title (8936620513608443224) --> - <skip /> - <!-- no translation found for notifications_off_text (2529001315769385273) --> - <skip /> - <!-- no translation found for accessibility_rotation_lock_off (4062780228931590069) --> - <skip /> - <!-- no translation found for accessibility_rotation_lock_on_landscape (6731197337665366273) --> - <skip /> - <!-- no translation found for accessibility_rotation_lock_on_portrait (5809367521644012115) --> - <skip /> + <string name="notifications_off_title" msgid="8936620513608443224">"Сповіщення вимкнено"</string> + <string name="notifications_off_text" msgid="2529001315769385273">"Торкніться тут, щоб знову ввімкнути сповіщення."</string> + <string name="accessibility_rotation_lock_off" msgid="4062780228931590069">"Екран обертатиметься автоматично."</string> + <string name="accessibility_rotation_lock_on_landscape" msgid="6731197337665366273">"Екран заблоковано в альбомній орієнтації."</string> + <string name="accessibility_rotation_lock_on_portrait" msgid="5809367521644012115">"Екран заблоковано в книжковій орієнтації."</string> </resources> diff --git a/packages/SystemUI/res/values-zh-rCN/strings.xml b/packages/SystemUI/res/values-zh-rCN/strings.xml index 831cdc0f3335..007ee96fc821 100644 --- a/packages/SystemUI/res/values-zh-rCN/strings.xml +++ b/packages/SystemUI/res/values-zh-rCN/strings.xml @@ -144,10 +144,7 @@ <string name="status_bar_notification_inspect_item_title" msgid="1163547729015390250">"应用信息"</string> <string name="notifications_off_title" msgid="8936620513608443224">"通知功能已停用"</string> <string name="notifications_off_text" msgid="2529001315769385273">"点按此处可重新启用通知功能。"</string> - <!-- no translation found for accessibility_rotation_lock_off (4062780228931590069) --> - <skip /> - <!-- no translation found for accessibility_rotation_lock_on_landscape (6731197337665366273) --> - <skip /> - <!-- no translation found for accessibility_rotation_lock_on_portrait (5809367521644012115) --> - <skip /> + <string name="accessibility_rotation_lock_off" msgid="4062780228931590069">"屏幕会自动旋转。"</string> + <string name="accessibility_rotation_lock_on_landscape" msgid="6731197337665366273">"屏幕锁定为横向浏览模式。"</string> + <string name="accessibility_rotation_lock_on_portrait" msgid="5809367521644012115">"屏幕已锁定为纵向浏览模式。"</string> </resources> diff --git a/packages/SystemUI/res/values/dimens.xml b/packages/SystemUI/res/values/dimens.xml index 21e5fd7529ed..f54816606358 100644 --- a/packages/SystemUI/res/values/dimens.xml +++ b/packages/SystemUI/res/values/dimens.xml @@ -105,9 +105,6 @@ <!-- The width of the view containing the menu status bar icon --> <dimen name="navigation_menu_key_width">40dip</dimen> - <!-- Default target placement radius for navigation bar search target --> - <dimen name="navbar_search_target_placement_radius">150dip</dimen> - <!-- Default distance beyond which snaps to the target radius --> <dimen name="navbar_search_snap_margin">20dip</dimen> diff --git a/packages/SystemUI/src/com/android/systemui/recent/Choreographer.java b/packages/SystemUI/src/com/android/systemui/recent/Choreographer.java index a8c2020cdf00..ccdf038b1d3e 100644 --- a/packages/SystemUI/src/com/android/systemui/recent/Choreographer.java +++ b/packages/SystemUI/src/com/android/systemui/recent/Choreographer.java @@ -102,12 +102,14 @@ import android.view.ViewRootImpl; builder.with(noRecentAppsFadeAnim); } - Drawable background = mScrimView.getBackground(); - if (background != null) { - Animator bgAnim = ObjectAnimator.ofInt(background, - "alpha", appearing ? 0 : 255, appearing ? 255 : 0); - bgAnim.setDuration(appearing ? SCRIM_DURATION : CLOSE_DURATION); - builder.with(bgAnim); + if (appearing) { + Drawable background = mScrimView.getBackground(); + if (background != null) { + Animator bgAnim = ObjectAnimator.ofInt(background, + "alpha", appearing ? 0 : 255, appearing ? 255 : 0); + bgAnim.setDuration(appearing ? SCRIM_DURATION : CLOSE_DURATION); + builder.with(bgAnim); + } } mContentAnim.addListener(this); if (mListener != null) { diff --git a/packages/SystemUI/src/com/android/systemui/recent/RecentsPanelView.java b/packages/SystemUI/src/com/android/systemui/recent/RecentsPanelView.java index feb1ac879b52..6785c292f90e 100644 --- a/packages/SystemUI/src/com/android/systemui/recent/RecentsPanelView.java +++ b/packages/SystemUI/src/com/android/systemui/recent/RecentsPanelView.java @@ -469,7 +469,7 @@ public class RecentsPanelView extends FrameLayout implements OnItemClickListener Display d = ((WindowManager)mContext.getSystemService(Context.WINDOW_SERVICE)) .getDefaultDisplay(); if (!ActivityManager.isHighEndGfx(d)) { - mRecentsScrim.setBackgroundDrawable(null); + mRecentsScrim.setBackground(null); } else if (mRecentsScrim.getBackground() instanceof BitmapDrawable) { // In order to save space, we make the background texture repeat in the Y direction ((BitmapDrawable) mRecentsScrim.getBackground()).setTileModeY(TileMode.REPEAT); diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/BaseStatusBar.java b/packages/SystemUI/src/com/android/systemui/statusbar/BaseStatusBar.java index a310b1deaa77..a44279a33153 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/BaseStatusBar.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/BaseStatusBar.java @@ -751,6 +751,7 @@ public abstract class BaseStatusBar extends SystemUI implements protected abstract void tick(IBinder key, StatusBarNotification n, boolean firstTime); protected abstract void updateExpandedViewPos(int expandedPosition); protected abstract int getExpandedViewMaxHeight(); + protected abstract boolean isStatusBarExpanded(); protected boolean isTopNotification(ViewGroup parent, NotificationData.Entry entry) { return parent.indexOfChild(entry.row) == 0; diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/DelegateViewHelper.java b/packages/SystemUI/src/com/android/systemui/statusbar/DelegateViewHelper.java index e074a8080fa4..912a1659b181 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/DelegateViewHelper.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/DelegateViewHelper.java @@ -53,6 +53,9 @@ public class DelegateViewHelper { } public boolean onInterceptTouchEvent(MotionEvent event) { + if (mBar.isStatusBarExpanded()) { + return false; + } switch (event.getAction()) { case MotionEvent.ACTION_DOWN: mDownPoint[0] = event.getX(); diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java index d3fbdabd340f..612239026576 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java @@ -2109,5 +2109,10 @@ public class PhoneStatusBar extends BaseStatusBar { protected void haltTicker() { mTicker.halt(); } + + @Override + protected boolean isStatusBarExpanded() { + return mExpanded; + } } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/BrightnessController.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/BrightnessController.java index 72fdfad00f2d..3ba36afa5397 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/BrightnessController.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/BrightnessController.java @@ -31,8 +31,8 @@ import android.widget.CompoundButton; public class BrightnessController implements ToggleSlider.Listener { private static final String TAG = "StatusBar.BrightnessController"; - private static final int MINIMUM_BACKLIGHT = android.os.Power.BRIGHTNESS_DIM; - private static final int MAXIMUM_BACKLIGHT = android.os.Power.BRIGHTNESS_ON; + private static final int MINIMUM_BACKLIGHT = android.os.PowerManager.BRIGHTNESS_DIM; + private static final int MAXIMUM_BACKLIGHT = android.os.PowerManager.BRIGHTNESS_ON; private Context mContext; private ToggleSlider mControl; diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/tablet/TabletStatusBar.java b/packages/SystemUI/src/com/android/systemui/statusbar/tablet/TabletStatusBar.java index 906d1aae696c..a2c763728905 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/tablet/TabletStatusBar.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/tablet/TabletStatusBar.java @@ -1618,6 +1618,11 @@ public class TabletStatusBar extends BaseStatusBar implements @Override protected void updateExpandedViewPos(int expandedPosition) { } + + @Override + protected boolean isStatusBarExpanded() { + return mNotificationPanel.getVisibility() == View.VISIBLE; + } } diff --git a/policy/src/com/android/internal/policy/impl/GlobalActions.java b/policy/src/com/android/internal/policy/impl/GlobalActions.java index 3fa79b6eccd1..aa73de43a84b 100644 --- a/policy/src/com/android/internal/policy/impl/GlobalActions.java +++ b/policy/src/com/android/internal/policy/impl/GlobalActions.java @@ -16,14 +16,12 @@ package com.android.internal.policy.impl; -import com.android.internal.app.ShutdownThread; import com.android.internal.telephony.TelephonyIntents; import com.android.internal.telephony.TelephonyProperties; import com.android.internal.R; import android.app.ActivityManagerNative; import android.app.AlertDialog; -import android.app.admin.DevicePolicyManager; import android.content.BroadcastReceiver; import android.content.Context; import android.content.DialogInterface; @@ -48,6 +46,7 @@ import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.view.WindowManager; +import android.view.WindowManagerPolicy.WindowManagerFuncs; import android.widget.AdapterView; import android.widget.BaseAdapter; import android.widget.ImageView; @@ -68,6 +67,7 @@ class GlobalActions implements DialogInterface.OnDismissListener, DialogInterfac private static final boolean SHOW_SILENT_TOGGLE = true; private final Context mContext; + private final WindowManagerFuncs mWindowManagerFuncs; private final AudioManager mAudioManager; private ArrayList<Action> mItems; @@ -88,8 +88,9 @@ class GlobalActions implements DialogInterface.OnDismissListener, DialogInterfac /** * @param context everything needs a context :( */ - public GlobalActions(Context context) { + public GlobalActions(Context context, WindowManagerFuncs windowManagerFuncs) { mContext = context; + mWindowManagerFuncs = windowManagerFuncs; mAudioManager = (AudioManager) mContext.getSystemService(Context.AUDIO_SERVICE); // receive broadcasts @@ -186,11 +187,11 @@ class GlobalActions implements DialogInterface.OnDismissListener, DialogInterfac public void onPress() { // shutdown by making sure radio and power are handled accordingly. - ShutdownThread.shutdown(mContext, true); + mWindowManagerFuncs.shutdown(); } public boolean onLongPress() { - ShutdownThread.rebootSafeMode(mContext, true); + mWindowManagerFuncs.rebootSafeMode(); return true; } diff --git a/policy/src/com/android/internal/policy/impl/LockScreen.java b/policy/src/com/android/internal/policy/impl/LockScreen.java index c7a30e291b3f..8ea334e8fa84 100644 --- a/policy/src/com/android/internal/policy/impl/LockScreen.java +++ b/policy/src/com/android/internal/policy/impl/LockScreen.java @@ -129,6 +129,9 @@ class LockScreen extends LinearLayout implements KeyguardScreen { // Get the target position for the given resource. Returns -1 if not found. public int getTargetPosition(int resourceId); + + // Clean up when this widget is going away + public void cleanUp(); } class SlidingTabMethods implements SlidingTab.OnTriggerListener, UnlockWidgetCommonMethods { @@ -197,6 +200,10 @@ class LockScreen extends LinearLayout implements KeyguardScreen { public int getTargetPosition(int resourceId) { return -1; // Not supported } + + public void cleanUp() { + mSlidingTab.setOnTriggerListener(null); + } } class WaveViewMethods implements WaveView.OnTriggerListener, UnlockWidgetCommonMethods { @@ -240,6 +247,9 @@ class LockScreen extends LinearLayout implements KeyguardScreen { public int getTargetPosition(int resourceId) { return -1; // Not supported } + public void cleanUp() { + mWaveView.setOnTriggerListener(null); + } } private Intent getAssistIntent() { @@ -322,6 +332,7 @@ class LockScreen extends LinearLayout implements KeyguardScreen { mCallback.pokeWakelock(); break; + case com.android.internal.R.drawable.ic_lockscreen_unlock_phantom: case com.android.internal.R.drawable.ic_lockscreen_unlock: mCallback.goToUnlockScreen(); break; @@ -341,7 +352,7 @@ class LockScreen extends LinearLayout implements KeyguardScreen { try { mContext.startActivity(intent); } catch (ActivityNotFoundException e) { - Log.w(TAG, "Camera application not found"); + Log.w(TAG, "Activity not found for intent + " + intent.getAction()); } } @@ -373,6 +384,10 @@ class LockScreen extends LinearLayout implements KeyguardScreen { public int getTargetPosition(int resourceId) { return mMultiWaveView.getTargetPosition(resourceId); } + + public void cleanUp() { + mMultiWaveView.setOnTriggerListener(null); + } } private void requestUnlockScreen() { @@ -591,6 +606,7 @@ class LockScreen extends LinearLayout implements KeyguardScreen { public void cleanUp() { mUpdateMonitor.removeCallback(mInfoCallback); // this must be first mUpdateMonitor.removeCallback(mSimStateCallback); + mUnlockWidgetMethods.cleanUp(); mLockPatternUtils = null; mUpdateMonitor = null; mCallback = null; diff --git a/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java b/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java index 794ed15a05bc..3147ba7cbb0f 100755 --- a/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java +++ b/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java @@ -15,7 +15,6 @@ package com.android.internal.policy.impl; -import android.app.Activity; import android.app.ActivityManager; import android.app.ActivityManagerNative; import android.app.IUiModeManager; @@ -37,8 +36,6 @@ import android.content.res.Resources; import android.database.ContentObserver; import android.graphics.PixelFormat; import android.graphics.Rect; -import android.graphics.RectF; -import android.hardware.input.InputManager; import android.media.AudioManager; import android.media.IAudioService; import android.os.BatteryManager; @@ -60,7 +57,6 @@ import android.os.Vibrator; import android.provider.Settings; import com.android.internal.R; -import com.android.internal.app.ShutdownThread; import com.android.internal.policy.PolicyManager; import com.android.internal.statusbar.IStatusBarService; import com.android.internal.telephony.ITelephony; @@ -149,7 +145,6 @@ import java.io.FileDescriptor; import java.io.FileReader; import java.io.IOException; import java.io.PrintWriter; -import java.util.ArrayList; /** * WindowManagerPolicy implementation for the Android phone UI. This @@ -248,8 +243,6 @@ public class PhoneWindowManager implements WindowManagerPolicy { static final int SYSTEM_UI_CHANGING_LAYOUT = View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_FULLSCREEN; - private static final int BTN_MOUSE = 0x110; - /* Table of Application Launch keys. Maps from key codes to intent categories. * * These are special keys that are used to launch particular kinds of applications, @@ -448,7 +441,6 @@ public class PhoneWindowManager implements WindowManagerPolicy { static final Rect mTmpParentFrame = new Rect(); static final Rect mTmpDisplayFrame = new Rect(); - static final Rect mTmpSystemFrame = new Rect(); static final Rect mTmpContentFrame = new Rect(); static final Rect mTmpVisibleFrame = new Rect(); static final Rect mTmpNavigationFrame = new Rect(); @@ -727,7 +719,7 @@ public class PhoneWindowManager implements WindowManagerPolicy { mPowerKeyHandled = true; performHapticFeedbackLw(null, HapticFeedbackConstants.LONG_PRESS, false); sendCloseSystemWindows(SYSTEM_DIALOG_REASON_GLOBAL_ACTIONS); - ShutdownThread.shutdown(mContext, true); + mWindowManagerFuncs.shutdown(); break; } } @@ -741,7 +733,7 @@ public class PhoneWindowManager implements WindowManagerPolicy { void showGlobalActionsDialog() { if (mGlobalActions == null) { - mGlobalActions = new GlobalActions(mContext); + mGlobalActions = new GlobalActions(mContext, mWindowManagerFuncs); } final boolean keyguardShowing = keyguardIsShowingTq(); mGlobalActions.showDialog(keyguardShowing, isDeviceProvisioned()); @@ -2302,7 +2294,7 @@ public class PhoneWindowManager implements WindowManagerPolicy { mStatusBarLayer = mNavigationBar.getSurfaceLayer(); // And compute the final frame. mNavigationBar.computeFrameLw(mTmpNavigationFrame, mTmpNavigationFrame, - mTmpNavigationFrame, mTmpNavigationFrame, mTmpNavigationFrame); + mTmpNavigationFrame, mTmpNavigationFrame); if (DEBUG_LAYOUT) Log.i(TAG, "mNavigationBar frame: " + mTmpNavigationFrame); } if (DEBUG_LAYOUT) Log.i(TAG, String.format("mDock rect: (%d,%d - %d,%d)", @@ -2323,7 +2315,7 @@ public class PhoneWindowManager implements WindowManagerPolicy { mStatusBarLayer = mStatusBar.getSurfaceLayer(); // Let the status bar determine its size. - mStatusBar.computeFrameLw(pf, df, df, vf, vf); + mStatusBar.computeFrameLw(pf, df, vf, vf); // For layout, the status bar is always at the top with our fixed height. mStableTop = mUnrestrictedScreenTop + mStatusBarHeight; @@ -2357,6 +2349,17 @@ public class PhoneWindowManager implements WindowManagerPolicy { } } + /** {@inheritDoc} */ + public int getSystemDecorRectLw(Rect systemRect) { + systemRect.left = mSystemLeft; + systemRect.top = mSystemTop; + systemRect.right = mSystemRight; + systemRect.bottom = mSystemBottom; + if (mStatusBar != null) return mStatusBar.getSurfaceLayer(); + if (mNavigationBar != null) return mNavigationBar.getSurfaceLayer(); + return 0; + } + void setAttachedWindowFrames(WindowState win, int fl, int adjust, WindowState attached, boolean insetDecors, Rect pf, Rect df, Rect cf, Rect vf) { if (win.getSurfaceLayer() > mDockLayer && attached.getSurfaceLayer() < mDockLayer) { @@ -2427,7 +2430,6 @@ public class PhoneWindowManager implements WindowManagerPolicy { final Rect pf = mTmpParentFrame; final Rect df = mTmpDisplayFrame; - final Rect sf = mTmpSystemFrame; final Rect cf = mTmpContentFrame; final Rect vf = mTmpVisibleFrame; @@ -2671,20 +2673,6 @@ public class PhoneWindowManager implements WindowManagerPolicy { df.right = df.bottom = cf.right = cf.bottom = vf.right = vf.bottom = 10000; } - // Compute the system frame. This is easy: for things behind the - // status bar, it is any application windows; otherwise it is not set. - int parentType = attached != null ? attached.getAttrs().type : attrs.type; - if (win.getSurfaceLayer() < mStatusBarLayer - && parentType < WindowManager.LayoutParams.FIRST_SYSTEM_WINDOW) { - sf.left = mSystemLeft; - sf.top = mSystemTop; - sf.right = mSystemRight; - sf.bottom = mSystemBottom; - } else { - sf.left = sf.top = -10000; - sf.right = sf.bottom = 10000; - } - if (DEBUG_LAYOUT) Log.v(TAG, "Compute frame " + attrs.getTitle() + ": sim=#" + Integer.toHexString(sim) + " attach=" + attached + " type=" + attrs.type @@ -2692,7 +2680,7 @@ public class PhoneWindowManager implements WindowManagerPolicy { + " pf=" + pf.toShortString() + " df=" + df.toShortString() + " cf=" + cf.toShortString() + " vf=" + vf.toShortString()); - win.computeFrameLw(pf, df, sf, cf, vf); + win.computeFrameLw(pf, df, cf, vf); // Dock windows carve out the bottom of the screen, so normal windows // can't appear underneath them. diff --git a/services/input/InputReader.h b/services/input/InputReader.h index 03198a68484d..122a2abc034a 100644 --- a/services/input/InputReader.h +++ b/services/input/InputReader.h @@ -22,6 +22,8 @@ #include "InputListener.h" #include <androidfw/Input.h> +#include <androidfw/VelocityControl.h> +#include <androidfw/VelocityTracker.h> #include <ui/DisplayInfo.h> #include <utils/KeyedVector.h> #include <utils/threads.h> diff --git a/services/input/PointerController.h b/services/input/PointerController.h index 39dbf6b9e9bf..4c307c4a5ead 100644 --- a/services/input/PointerController.h +++ b/services/input/PointerController.h @@ -21,6 +21,7 @@ #include <ui/DisplayInfo.h> #include <androidfw/Input.h> +#include <utils/BitSet.h> #include <utils/RefBase.h> #include <utils/Looper.h> #include <utils/String8.h> diff --git a/services/java/com/android/server/PowerManagerService.java b/services/java/com/android/server/PowerManagerService.java index 289ab2a9abde..2cc270432b87 100644 --- a/services/java/com/android/server/PowerManagerService.java +++ b/services/java/com/android/server/PowerManagerService.java @@ -17,8 +17,8 @@ package com.android.server; import com.android.internal.app.IBatteryStats; -import com.android.internal.app.ShutdownThread; import com.android.server.am.BatteryStatsService; +import com.android.server.pm.ShutdownThread; import android.app.ActivityManagerNative; import android.app.IActivityManager; @@ -47,7 +47,6 @@ import android.os.IBinder; import android.os.IPowerManager; import android.os.LocalPowerManager; import android.os.Message; -import android.os.Power; import android.os.PowerManager; import android.os.Process; import android.os.RemoteException; @@ -71,6 +70,7 @@ import static android.provider.Settings.System.WINDOW_ANIMATION_SCALE; import static android.provider.Settings.System.TRANSITION_ANIMATION_SCALE; import java.io.FileDescriptor; +import java.io.IOException; import java.io.PrintWriter; import java.util.ArrayList; import java.util.HashMap; @@ -84,6 +84,12 @@ public class PowerManagerService extends IPowerManager.Stub private static final String TAG = "PowerManagerService"; static final String PARTIAL_NAME = "PowerManagerService"; + // Wake lock that ensures that the CPU is running. The screen might not be on. + private static final int PARTIAL_WAKE_LOCK_ID = 1; + + // Wake lock that ensures that the screen is on. + private static final int FULL_WAKE_LOCK_ID = 2; + static final boolean DEBUG_SCREEN_ON = false; private static final boolean LOG_PARTIAL_WL = false; @@ -134,6 +140,10 @@ public class PowerManagerService extends IPowerManager.Stub // Screen brightness should always have a value, but just in case... private static final int DEFAULT_SCREEN_BRIGHTNESS = 192; + // Threshold for BRIGHTNESS_LOW_BATTERY (percentage) + // Screen will stay dim if battery level is <= LOW_BATTERY_THRESHOLD + private static final int LOW_BATTERY_THRESHOLD = 10; + // flags for setPowerState private static final int ALL_LIGHTS_OFF = 0x00000000; private static final int SCREEN_ON_BIT = 0x00000001; @@ -175,8 +185,8 @@ public class PowerManagerService extends IPowerManager.Stub // we should read them from the driver, but our current hardware returns 0 // for the initial value. Oops! static final int INITIAL_SCREEN_BRIGHTNESS = 255; - static final int INITIAL_BUTTON_BRIGHTNESS = Power.BRIGHTNESS_OFF; - static final int INITIAL_KEYBOARD_BRIGHTNESS = Power.BRIGHTNESS_OFF; + static final int INITIAL_BUTTON_BRIGHTNESS = PowerManager.BRIGHTNESS_OFF; + static final int INITIAL_KEYBOARD_BRIGHTNESS = PowerManager.BRIGHTNESS_OFF; private final int MY_UID; private final int MY_PID; @@ -296,6 +306,11 @@ public class PowerManagerService extends IPowerManager.Stub private native void nativeInit(); private native void nativeSetPowerState(boolean screenOn, boolean screenBright); private native void nativeStartSurfaceFlingerAnimation(int mode); + private static native void nativeAcquireWakeLock(int lock, String id); + private static native void nativeReleaseWakeLock(String id); + private static native int nativeSetScreenState(boolean on); + private static native void nativeShutdown(); + private static native void nativeReboot(String reason) throws IOException; /* static PrintStream mLog; @@ -515,14 +530,13 @@ public class PowerManagerService extends IPowerManager.Stub MY_PID = Process.myPid(); Binder.restoreCallingIdentity(token); - // XXX remove this when the kernel doesn't timeout wake locks - Power.setLastUserActivityTimeout(7*24*3600*1000); // one week - // assume nothing is on yet mUserState = mPowerState = 0; // Add ourself to the Watchdog monitors. Watchdog.getInstance().addMonitor(this); + + nativeInit(); } private ContentQueryMap mSettings; @@ -541,11 +555,6 @@ public class PowerManagerService extends IPowerManager.Stub mAttentionLight = lights.getLight(LightsService.LIGHT_ID_ATTENTION); mHeadless = "1".equals(SystemProperties.get("ro.config.headless", "0")); - nativeInit(); - synchronized (mLocks) { - updateNativePowerStateLocked(); - } - mInitComplete = false; mScreenBrightnessAnimator = new ScreenBrightnessAnimator("mScreenBrightnessUpdaterThread", Process.THREAD_PRIORITY_DISPLAY); @@ -581,8 +590,6 @@ public class PowerManagerService extends IPowerManager.Stub } } - nativeInit(); - Power.powerInitNative(); synchronized (mLocks) { updateNativePowerStateLocked(); // We make sure to start out with the screen on due to user activity. @@ -686,6 +693,26 @@ public class PowerManagerService extends IPowerManager.Stub } } + /** + * Low-level function turn the device off immediately, without trying + * to be clean. Most people should use + * {@link com.android.server.pm.internal.app.ShutdownThread} for a clean shutdown. + */ + public static void lowLevelShutdown() { + nativeShutdown(); + } + + /** + * Low-level function to reboot the device. + * + * @param reason code to pass to the kernel (e.g. "recovery"), or null. + * @throws IOException if reboot fails for some reason (eg, lack of + * permission) + */ + public static void lowLevelReboot(String reason) throws IOException { + nativeReboot(reason); + } + private class WakeLock implements IBinder.DeathRecipient { WakeLock(int f, IBinder b, String t, int u, int p) { @@ -926,7 +953,7 @@ public class PowerManagerService extends IPowerManager.Stub if (LOG_PARTIAL_WL) EventLog.writeEvent(EventLogTags.POWER_PARTIAL_WAKE_STATE, 1, tag); } } - Power.acquireWakeLock(Power.PARTIAL_WAKE_LOCK,PARTIAL_NAME); + nativeAcquireWakeLock(PARTIAL_WAKE_LOCK_ID, PARTIAL_NAME); } if (diffsource) { @@ -1010,7 +1037,7 @@ public class PowerManagerService extends IPowerManager.Stub mPartialCount--; if (mPartialCount == 0) { if (LOG_PARTIAL_WL) EventLog.writeEvent(EventLogTags.POWER_PARTIAL_WAKE_STATE, 0, wl.tag); - Power.releaseWakeLock(PARTIAL_NAME); + nativeReleaseWakeLock(PARTIAL_NAME); } } // Unlink the lock from the binder. @@ -1719,10 +1746,10 @@ public class PowerManagerService extends IPowerManager.Stub + " mSkippedScreenOn=" + mSkippedScreenOn); } mScreenBrightnessHandler.removeMessages(ScreenBrightnessAnimator.ANIMATE_LIGHTS); - mScreenBrightnessAnimator.animateTo(Power.BRIGHTNESS_OFF, SCREEN_BRIGHT_BIT, 0); + mScreenBrightnessAnimator.animateTo(PowerManager.BRIGHTNESS_OFF, SCREEN_BRIGHT_BIT, 0); } } - int err = Power.setScreenState(on); + int err = nativeSetScreenState(on); if (err == 0) { mLastScreenOnTime = (on ? SystemClock.elapsedRealtime() : 0); if (mUseSoftwareAutoBrightness) { @@ -1934,7 +1961,7 @@ public class PowerManagerService extends IPowerManager.Stub private boolean batteryIsLow() { return (!mIsPowered && - mBatteryService.getBatteryLevel() <= Power.LOW_BATTERY_THRESHOLD); + mBatteryService.getBatteryLevel() <= LOW_BATTERY_THRESHOLD); } private boolean shouldDeferScreenOnLocked() { @@ -2024,7 +2051,7 @@ public class PowerManagerService extends IPowerManager.Stub nominalCurrentValue = mScreenBrightnessDim; break; case 0: - nominalCurrentValue = Power.BRIGHTNESS_OFF; + nominalCurrentValue = PowerManager.BRIGHTNESS_OFF; break; case SCREEN_BRIGHT_BIT: default: @@ -2050,7 +2077,7 @@ public class PowerManagerService extends IPowerManager.Stub // was dim steps = (int)(ANIM_STEPS*ratio*scale); } - brightness = Power.BRIGHTNESS_OFF; + brightness = PowerManager.BRIGHTNESS_OFF; } else { if ((oldState & SCREEN_ON_BIT) != 0) { // was bright @@ -2101,13 +2128,13 @@ public class PowerManagerService extends IPowerManager.Stub if (offMask != 0) { if (mSpew) Slog.i(TAG, "Setting brightess off: " + offMask); - setLightBrightness(offMask, Power.BRIGHTNESS_OFF); + setLightBrightness(offMask, PowerManager.BRIGHTNESS_OFF); } if (dimMask != 0) { int brightness = mScreenBrightnessDim; if ((newState & BATTERY_LOW_BIT) != 0 && - brightness > Power.BRIGHTNESS_LOW_BATTERY) { - brightness = Power.BRIGHTNESS_LOW_BATTERY; + brightness > PowerManager.BRIGHTNESS_LOW_BATTERY) { + brightness = PowerManager.BRIGHTNESS_LOW_BATTERY; } if (mSpew) Slog.i(TAG, "Setting brightess dim " + brightness + ": " + dimMask); setLightBrightness(dimMask, brightness); @@ -2115,8 +2142,8 @@ public class PowerManagerService extends IPowerManager.Stub if (onMask != 0) { int brightness = getPreferredBrightness(); if ((newState & BATTERY_LOW_BIT) != 0 && - brightness > Power.BRIGHTNESS_LOW_BATTERY) { - brightness = Power.BRIGHTNESS_LOW_BATTERY; + brightness > PowerManager.BRIGHTNESS_LOW_BATTERY) { + brightness = PowerManager.BRIGHTNESS_LOW_BATTERY; } if (mSpew) Slog.i(TAG, "Setting brightess on " + brightness + ": " + onMask); setLightBrightness(onMask, brightness); @@ -2198,8 +2225,8 @@ public class PowerManagerService extends IPowerManager.Stub if (elapsed < duration) { int delta = endValue - startValue; newValue = startValue + delta * elapsed / duration; - newValue = Math.max(Power.BRIGHTNESS_OFF, newValue); - newValue = Math.min(Power.BRIGHTNESS_ON, newValue); + newValue = Math.max(PowerManager.BRIGHTNESS_OFF, newValue); + newValue = Math.min(PowerManager.BRIGHTNESS_ON, newValue); } else { newValue = endValue; mInitialAnimation = false; @@ -2249,7 +2276,7 @@ public class PowerManagerService extends IPowerManager.Stub if (target != currentValue) { final boolean doScreenAnim = (mask & (SCREEN_BRIGHT_BIT | SCREEN_ON_BIT)) != 0; - final boolean turningOff = endValue == Power.BRIGHTNESS_OFF; + final boolean turningOff = endValue == PowerManager.BRIGHTNESS_OFF; if (turningOff && doScreenAnim) { // Cancel all pending animations since we're turning off mScreenBrightnessHandler.removeCallbacksAndMessages(null); @@ -2353,7 +2380,7 @@ public class PowerManagerService extends IPowerManager.Stub private boolean isScreenTurningOffLocked() { return (mScreenBrightnessAnimator.isAnimating() - && mScreenBrightnessAnimator.endValue == Power.BRIGHTNESS_OFF); + && mScreenBrightnessAnimator.endValue == PowerManager.BRIGHTNESS_OFF); } private boolean shouldLog(long time) { diff --git a/services/java/com/android/server/ShutdownActivity.java b/services/java/com/android/server/ShutdownActivity.java index c9d4d0117c56..d85abe63daeb 100644 --- a/services/java/com/android/server/ShutdownActivity.java +++ b/services/java/com/android/server/ShutdownActivity.java @@ -22,7 +22,8 @@ import android.content.Intent; import android.os.Bundle; import android.os.Handler; import android.util.Slog; -import com.android.internal.app.ShutdownThread; + +import com.android.server.pm.ShutdownThread; public class ShutdownActivity extends Activity { diff --git a/services/java/com/android/server/SystemServer.java b/services/java/com/android/server/SystemServer.java index 849281d60112..d9833ab37e2f 100644 --- a/services/java/com/android/server/SystemServer.java +++ b/services/java/com/android/server/SystemServer.java @@ -46,7 +46,6 @@ import android.util.Log; import android.util.Slog; import android.view.WindowManager; -import com.android.internal.app.ShutdownThread; import com.android.internal.os.BinderInternal; import com.android.internal.os.SamplingProfilerIntegration; import com.android.internal.widget.LockSettingsService; @@ -56,6 +55,7 @@ import com.android.server.input.InputManagerService; import com.android.server.net.NetworkPolicyManagerService; import com.android.server.net.NetworkStatsService; import com.android.server.pm.PackageManagerService; +import com.android.server.pm.ShutdownThread; import com.android.server.usb.UsbService; import com.android.server.wm.WindowManagerService; diff --git a/services/java/com/android/server/accessibility/AccessibilityManagerService.java b/services/java/com/android/server/accessibility/AccessibilityManagerService.java index 0c6d85dbb1e1..28ce1dfe965d 100644 --- a/services/java/com/android/server/accessibility/AccessibilityManagerService.java +++ b/services/java/com/android/server/accessibility/AccessibilityManagerService.java @@ -23,7 +23,6 @@ import android.Manifest; import android.accessibilityservice.AccessibilityService; import android.accessibilityservice.AccessibilityServiceInfo; import android.accessibilityservice.IAccessibilityServiceClient; -import android.accessibilityservice.IAccessibilityServiceClientCallback; import android.accessibilityservice.IAccessibilityServiceConnection; import android.app.PendingIntent; import android.content.BroadcastReceiver; @@ -44,7 +43,6 @@ import android.os.Build; import android.os.Bundle; import android.os.Handler; import android.os.IBinder; -import android.os.Looper; import android.os.Message; import android.os.RemoteException; import android.os.ServiceManager; @@ -58,9 +56,7 @@ import android.view.IWindow; import android.view.InputDevice; import android.view.KeyCharacterMap; import android.view.KeyEvent; -import android.view.View; import android.view.accessibility.AccessibilityEvent; -import android.view.accessibility.AccessibilityInteractionClient; import android.view.accessibility.AccessibilityManager; import android.view.accessibility.AccessibilityNodeInfo; import android.view.accessibility.IAccessibilityInteractionConnection; @@ -69,8 +65,6 @@ import android.view.accessibility.IAccessibilityManager; import android.view.accessibility.IAccessibilityManagerClient; import com.android.internal.content.PackageMonitor; -import com.android.internal.os.HandlerCaller; -import com.android.internal.os.HandlerCaller.Callback; import com.android.server.accessibility.TouchExplorer.GestureListener; import com.android.server.wm.WindowManagerService; @@ -85,7 +79,6 @@ import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.Set; -import java.util.concurrent.atomic.AtomicInteger; /** * This class is instantiated by the system as a system level service and can be @@ -107,8 +100,6 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub private static final int OWN_PROCESS_ID = android.os.Process.myPid(); - private static final int UNDEFINED = -1; - private static int sIdCounter = 0; private static int sNextWindowId; @@ -155,10 +146,6 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub private Service mUiAutomationService; - private GestureHandler mGestureHandler; - - private int mDefaultGestureHandlingHelperServiceId = UNDEFINED; - /** * Handler for delayed event dispatch. */ @@ -416,7 +403,6 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub IAccessibilityInteractionConnection connection) throws RemoteException { synchronized (mLock) { final IWindow addedWindowToken = windowToken; - final IAccessibilityInteractionConnection addedConnection = connection; final int windowId = sNextWindowId++; AccessibilityConnectionWrapper wrapper = new AccessibilityConnectionWrapper(windowId, connection); @@ -486,44 +472,15 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub @Override public boolean onGesture(int gestureId) { - // Lazily instantiate the gesture handler. - if (mGestureHandler == null) { - mGestureHandler = new GestureHandler(); - } synchronized (mLock) { boolean handled = notifyGestureLocked(gestureId, false); if (!handled) { handled = notifyGestureLocked(gestureId, true); } - if (!handled) { - mGestureHandler.scheduleHandleGestureDefault(gestureId); - } return handled; } } - private Service getDefaultGestureHandlingHelperService() { - // Since querying of screen content is done through the - // AccessibilityInteractionClient which talks to an - // IAccessibilityServiceConnection implementation we create a proxy - // Service when necessary to enable interaction with the remote - // view tree. Note that this service is just a stateless proxy - // that does not get any events or interrupts. - if (mDefaultGestureHandlingHelperServiceId == UNDEFINED) { - ComponentName name = new ComponentName("android", - "DefaultGestureHandlingHelperService"); - AccessibilityServiceInfo info = new AccessibilityServiceInfo(); - Service service = new Service(name, info, true); - mDefaultGestureHandlingHelperServiceId = service.mId; - AccessibilityInteractionClient.getInstance().addConnection( - mDefaultGestureHandlingHelperServiceId, service); - return service; - } else { - return (Service) AccessibilityInteractionClient.getInstance() - .getConnection(mDefaultGestureHandlingHelperServiceId); - } - } - private boolean notifyGestureLocked(int gestureId, boolean isDefault) { // TODO: Now we are giving the gestures to the last enabled // service that can handle them which is the last one @@ -537,7 +494,12 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub for (int i = mServices.size() - 1; i >= 0; i--) { Service service = mServices.get(i); if (service.mReqeustTouchExplorationMode && service.mIsDefault == isDefault) { - mGestureHandler.scheduleHandleGesture(gestureId, service.mServiceInterface); + try { + service.mServiceInterface.onGesture(gestureId); + } catch (RemoteException re) { + Slog.e(LOG_TAG, "Error during sending gesture " + gestureId + + " to " + service.mService, re); + } return true; } } @@ -983,212 +945,6 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub } } - class GestureHandler extends IAccessibilityServiceClientCallback.Stub - implements Runnable, Callback { - - private static final String THREAD_NAME = "AccessibilityGestureHandler"; - - private static final long TIMEOUT_INTERACTION_MILLIS = 5000; - - private static final int MSG_HANDLE_GESTURE = 1; - - private static final int MSG_HANDLE_GESTURE_DEFAULT = 2; - - private final AtomicInteger mInteractionCounter = new AtomicInteger(); - - private final Object mGestureLock = new Object(); - - private HandlerCaller mHandlerCaller; - - private volatile int mInteractionId = -1; - - private volatile boolean mGestureResult; - - public GestureHandler() { - synchronized (mGestureLock) { - Thread worker = new Thread(this, THREAD_NAME); - worker.start(); - while (mHandlerCaller == null) { - try { - mGestureLock.wait(); - } catch (InterruptedException ie) { - /* ignore */ - } - } - } - } - - @Override - public void run() { - Looper.prepare(); - synchronized (mGestureLock) { - mHandlerCaller = new HandlerCaller(mContext, Looper.myLooper(), this); - mGestureLock.notifyAll(); - } - Looper.loop(); - } - - @Override - public void setGestureResult(int gestureId, boolean handled, int interactionId) { - synchronized (mGestureLock) { - if (interactionId > mInteractionId) { - mGestureResult = handled; - mInteractionId = interactionId; - } - mGestureLock.notifyAll(); - } - } - - @Override - public void executeMessage(Message message) { - final int type = message.what; - switch (type) { - case MSG_HANDLE_GESTURE: { - IAccessibilityServiceClient service = - (IAccessibilityServiceClient) message.obj; - final int gestureId = message.arg1; - final int interactionId = message.arg2; - - try { - service.onGesture(gestureId, this, interactionId); - } catch (RemoteException re) { - Slog.e(LOG_TAG, "Error dispatching a gesture to a client.", re); - return; - } - - long waitTimeMillis = 0; - final long startTimeMillis = SystemClock.uptimeMillis(); - synchronized (mGestureLock) { - while (true) { - try { - // Did we get the expected callback? - if (mInteractionId == interactionId) { - break; - } - // Did we get an obsolete callback? - if (mInteractionId > interactionId) { - break; - } - // Did we time out? - final long elapsedTimeMillis = - SystemClock.uptimeMillis() - startTimeMillis; - waitTimeMillis = TIMEOUT_INTERACTION_MILLIS - elapsedTimeMillis; - if (waitTimeMillis <= 0) { - break; - } - mGestureLock.wait(waitTimeMillis); - } catch (InterruptedException ie) { - /* ignore */ - } - } - handleGestureIfNeededAndResetLocked(gestureId); - } - } break; - case MSG_HANDLE_GESTURE_DEFAULT: { - final int gestureId = message.arg1; - handleGestureDefault(gestureId); - } break; - default: { - throw new IllegalArgumentException("Unknown message type: " + type); - } - } - } - - private void handleGestureIfNeededAndResetLocked(int gestureId) { - if (!mGestureResult) { - handleGestureDefault(gestureId); - } - mGestureResult = false; - mInteractionId = -1; - } - - public void scheduleHandleGesture(int gestureId, IAccessibilityServiceClient service) { - final int interactionId = mInteractionCounter.incrementAndGet(); - mHandlerCaller.obtainMessageIIO(MSG_HANDLE_GESTURE, gestureId, interactionId, - service).sendToTarget(); - } - - public void scheduleHandleGestureDefault(int gestureId) { - final int interactionId = mInteractionCounter.incrementAndGet(); - mHandlerCaller.obtainMessageI(MSG_HANDLE_GESTURE_DEFAULT, gestureId).sendToTarget(); - } - - private void handleGestureDefault(int gestureId) { - Service service = getDefaultGestureHandlingHelperService(); - - // Global actions. - switch (gestureId) { - case AccessibilityService.GESTURE_SWIPE_DOWN_AND_LEFT: { - service.performGlobalAction(AccessibilityService.GLOBAL_ACTION_BACK); - } return; - case AccessibilityService.GESTURE_SWIPE_DOWN_AND_RIGHT: { - service.performGlobalAction(AccessibilityService.GLOBAL_ACTION_HOME); - } return; - case AccessibilityService.GESTURE_SWIPE_UP_AND_LEFT: { - service.performGlobalAction(AccessibilityService.GLOBAL_ACTION_RECENTS); - } return; - case AccessibilityService.GESTURE_SWIPE_UP_AND_RIGHT: { - service.performGlobalAction(AccessibilityService.GLOBAL_ACTION_NOTIFICATIONS); - } return; - } - - AccessibilityInteractionClient client = AccessibilityInteractionClient.getInstance(); - - AccessibilityNodeInfo root = client.getRootInActiveWindow(service.mId); - if (root == null) { - return; - } - - AccessibilityNodeInfo current = root.findFocus( - AccessibilityNodeInfo.FOCUS_ACCESSIBILITY); - if (current == null) { - current = root; - } - - // Local actions. - AccessibilityNodeInfo next = null; - switch (gestureId) { - case AccessibilityService.GESTURE_SWIPE_UP: { - // TODO: - } break; - case AccessibilityService.GESTURE_SWIPE_DOWN: { - // TODO: - } break; - case AccessibilityService.GESTURE_SWIPE_LEFT: { - // TODO: Implement the RTL support. -// if (mLayoutDirection == View.LAYOUT_DIRECTION_LTR) { - next = current.focusSearch(View.ACCESSIBILITY_FOCUS_BACKWARD); -// } else { // LAYOUT_DIRECTION_RTL -// next = current.focusSearch(View.ACCESSIBILITY_FOCUS_FORWARD); -// } - } break; - case AccessibilityService.GESTURE_SWIPE_RIGHT: { - // TODO: Implement the RTL support. -// if (mLayoutDirection == View.LAYOUT_DIRECTION_LTR) { - next = current.focusSearch(View.ACCESSIBILITY_FOCUS_FORWARD); -// } else { // LAYOUT_DIRECTION_RTL -// next = current.focusSearch(View.ACCESSIBILITY_FOCUS_BACKWARD); -// } - } break; - case AccessibilityService.GESTURE_SWIPE_UP_AND_DOWN: { - next = current.focusSearch(View.ACCESSIBILITY_FOCUS_UP); - } break; - case AccessibilityService.GESTURE_SWIPE_DOWN_AND_UP: { - next = current.focusSearch(View.ACCESSIBILITY_FOCUS_DOWN); - } break; - case AccessibilityService.GESTURE_SWIPE_LEFT_AND_RIGHT: { - next = current.focusSearch(View.ACCESSIBILITY_FOCUS_LEFT); - } break; - case AccessibilityService.GESTURE_SWIPE_RIGHT_AND_LEFT: { - next = current.focusSearch(View.ACCESSIBILITY_FOCUS_RIGHT); - } break; - } - if (next != null && !next.equals(current)) { - next.performAction(AccessibilityNodeInfo.ACTION_ACCESSIBILITY_FOCUS); - } - } - } - /** * This class represents an accessibility service. It stores all per service * data required for the service management, provides API for starting/stopping the @@ -1268,10 +1024,7 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub mIsDefault = (info.flags & DEFAULT) != 0; if (mIsAutomation || info.getResolveInfo().serviceInfo.applicationInfo.targetSdkVersion - // TODO: Uncomment this line and remove the line below when JellyBean - // SDK version is finalized. - // >= Build.VERSION_CODES.JELLY_BEAN) { - > Build.VERSION_CODES.ICE_CREAM_SANDWICH_MR1) { + >= Build.VERSION_CODES.JELLY_BEAN) { mIncludeNotImportantViews = (info.flags & FLAG_INCLUDE_NOT_IMPORTANT_VIEWS) != 0; } diff --git a/services/java/com/android/server/input/InputManagerService.java b/services/java/com/android/server/input/InputManagerService.java index 299649db0ae5..9e94b52fbaf5 100644 --- a/services/java/com/android/server/input/InputManagerService.java +++ b/services/java/com/android/server/input/InputManagerService.java @@ -597,7 +597,7 @@ public class InputManagerService extends IInputManager.Stub implements Watchdog. visitAllKeyboardLayouts(new KeyboardLayoutVisitor() { @Override public void visitKeyboardLayout(Resources resources, - String descriptor, String label, int kcmResId) { + String descriptor, String label, int keyboardLayoutResId) { list.add(new KeyboardLayout(descriptor, label)); } }); @@ -614,7 +614,7 @@ public class InputManagerService extends IInputManager.Stub implements Watchdog. visitKeyboardLayout(keyboardLayoutDescriptor, new KeyboardLayoutVisitor() { @Override public void visitKeyboardLayout(Resources resources, - String descriptor, String label, int kcmResId) { + String descriptor, String label, int keyboardLayoutResId) { result[0] = new KeyboardLayout(descriptor, label); } }); @@ -683,10 +683,11 @@ public class InputManagerService extends IInputManager.Stub implements Watchdog. com.android.internal.R.styleable.KeyboardLayout_name); String label = a.getString( com.android.internal.R.styleable.KeyboardLayout_label); - int kcmResId = a.getResourceId( - com.android.internal.R.styleable.KeyboardLayout_kcm, 0); - if (name == null || label == null || kcmResId == 0) { - Log.w(TAG, "Missing required 'name', 'label' or 'kcm' " + int keyboardLayoutResId = a.getResourceId( + com.android.internal.R.styleable.KeyboardLayout_keyboardLayout, + 0); + if (name == null || label == null || keyboardLayoutResId == 0) { + Log.w(TAG, "Missing required 'name', 'label' or 'keyboardLayout' " + "attributes in keyboard layout " + "resource from receiver " + receiver.packageName + "/" + receiver.name); @@ -695,7 +696,7 @@ public class InputManagerService extends IInputManager.Stub implements Watchdog. receiver.packageName, receiver.name, name); if (keyboardName == null || name.equals(keyboardName)) { visitor.visitKeyboardLayout(resources, descriptor, - label, kcmResId); + label, keyboardLayoutResId); } } } finally { @@ -1138,11 +1139,11 @@ public class InputManagerService extends IInputManager.Stub implements Watchdog. visitKeyboardLayout(keyboardLayoutDescriptor, new KeyboardLayoutVisitor() { @Override public void visitKeyboardLayout(Resources resources, - String descriptor, String label, int kcmResId) { + String descriptor, String label, int keyboardLayoutResId) { try { result[0] = descriptor; result[1] = Streams.readFully(new InputStreamReader( - resources.openRawResource(kcmResId))); + resources.openRawResource(keyboardLayoutResId))); } catch (IOException ex) { } catch (NotFoundException ex) { } @@ -1261,7 +1262,7 @@ public class InputManagerService extends IInputManager.Stub implements Watchdog. private interface KeyboardLayoutVisitor { void visitKeyboardLayout(Resources resources, - String descriptor, String label, int kcmResId); + String descriptor, String label, int keyboardLayoutResId); } private final class InputDevicesChangedListenerRecord implements DeathRecipient { diff --git a/services/java/com/android/server/pm/PackageManagerService.java b/services/java/com/android/server/pm/PackageManagerService.java index d41cd5a353f4..d7c5eea84a28 100644 --- a/services/java/com/android/server/pm/PackageManagerService.java +++ b/services/java/com/android/server/pm/PackageManagerService.java @@ -98,6 +98,7 @@ import android.os.ServiceManager; import android.os.SystemClock; import android.os.SystemProperties; import android.os.UserId; +import android.provider.Settings.Secure; import android.security.SystemKeyStore; import android.util.DisplayMetrics; import android.util.EventLog; @@ -9259,7 +9260,8 @@ public class PackageManagerService extends IPackageManager.Stub { mContext.enforceCallingOrSelfPermission(GRANT_REVOKE_PERMISSIONS, null); if (READ_EXTERNAL_STORAGE.equals(permission)) { synchronized (mPackages) { - if (mSettings.mReadExternalStorageEnforced != enforced) { + if (mSettings.mReadExternalStorageEnforced == null + || mSettings.mReadExternalStorageEnforced != enforced) { mSettings.mReadExternalStorageEnforced = enforced; mSettings.writeLPr(); @@ -9284,7 +9286,6 @@ public class PackageManagerService extends IPackageManager.Stub { @Override public boolean isPermissionEnforced(String permission) { - mContext.enforceCallingOrSelfPermission(GRANT_REVOKE_PERMISSIONS, null); synchronized (mPackages) { return isPermissionEnforcedLocked(permission); } @@ -9292,7 +9293,13 @@ public class PackageManagerService extends IPackageManager.Stub { private boolean isPermissionEnforcedLocked(String permission) { if (READ_EXTERNAL_STORAGE.equals(permission)) { - return mSettings.mReadExternalStorageEnforced; + if (mSettings.mReadExternalStorageEnforced != null) { + return mSettings.mReadExternalStorageEnforced; + } else { + // if user hasn't defined, fall back to secure default + return Secure.getInt(mContext.getContentResolver(), + Secure.READ_EXTERNAL_STORAGE_ENFORCED_DEFAULT, 0) != 0; + } } else { return true; } diff --git a/services/java/com/android/server/pm/Settings.java b/services/java/com/android/server/pm/Settings.java index d0eda2db5b9d..ffb69fa50bbb 100644 --- a/services/java/com/android/server/pm/Settings.java +++ b/services/java/com/android/server/pm/Settings.java @@ -111,7 +111,7 @@ final class Settings { int mInternalSdkPlatform; int mExternalSdkPlatform; - boolean mReadExternalStorageEnforced = PackageManager.DEFAULT_ENFORCE_READ_EXTERNAL_STORAGE; + Boolean mReadExternalStorageEnforced; /** Device identity for the purpose of package verification. */ private VerifierDeviceIdentity mVerifierDeviceIdentity; @@ -1147,8 +1147,7 @@ final class Settings { serializer.endTag(null, "verifier"); } - if (mReadExternalStorageEnforced - != PackageManager.DEFAULT_ENFORCE_READ_EXTERNAL_STORAGE) { + if (mReadExternalStorageEnforced != null) { serializer.startTag(null, TAG_READ_EXTERNAL_STORAGE); serializer.attribute( null, ATTR_ENFORCEMENT, mReadExternalStorageEnforced ? "1" : "0"); diff --git a/core/java/com/android/internal/app/ShutdownThread.java b/services/java/com/android/server/pm/ShutdownThread.java index d867ff9eed03..1d6e068184de 100644 --- a/core/java/com/android/internal/app/ShutdownThread.java +++ b/services/java/com/android/server/pm/ShutdownThread.java @@ -15,7 +15,7 @@ */ -package com.android.internal.app; +package com.android.server.pm; import android.app.ActivityManagerNative; import android.app.AlertDialog; @@ -32,7 +32,6 @@ import android.content.DialogInterface; import android.content.Intent; import android.content.IntentFilter; import android.os.Handler; -import android.os.Power; import android.os.PowerManager; import android.os.RemoteException; import android.os.ServiceManager; @@ -44,6 +43,8 @@ import android.os.storage.IMountService; import android.os.storage.IMountShutdownObserver; import com.android.internal.telephony.ITelephony; +import com.android.server.PowerManagerService; + import android.util.Log; import android.view.WindowManager; @@ -456,7 +457,7 @@ public final class ShutdownThread extends Thread { if (reboot) { Log.i(TAG, "Rebooting, reason: " + reason); try { - Power.reboot(reason); + PowerManagerService.lowLevelReboot(reason); } catch (Exception e) { Log.e(TAG, "Reboot failed, will attempt shutdown instead", e); } @@ -479,6 +480,6 @@ public final class ShutdownThread extends Thread { // Shutdown power Log.i(TAG, "Performing low-level shutdown..."); - Power.shutdown(); + PowerManagerService.lowLevelShutdown(); } } diff --git a/services/java/com/android/server/wm/Session.java b/services/java/com/android/server/wm/Session.java index 53c0e070461a..61c0e9cfd7ee 100644 --- a/services/java/com/android/server/wm/Session.java +++ b/services/java/com/android/server/wm/Session.java @@ -151,13 +151,13 @@ final class Session extends IWindowSession.Stub public int relayout(IWindow window, int seq, WindowManager.LayoutParams attrs, int requestedWidth, int requestedHeight, int viewFlags, - int flags, Rect outFrame, Rect outSystemInsets, Rect outContentInsets, + int flags, Rect outFrame, Rect outContentInsets, Rect outVisibleInsets, Configuration outConfig, Surface outSurface) { if (false) Slog.d(WindowManagerService.TAG, ">>>>>> ENTERED relayout from " + Binder.getCallingPid()); int res = mService.relayoutWindow(this, window, seq, attrs, requestedWidth, requestedHeight, viewFlags, flags, - outFrame, outSystemInsets, outContentInsets, outVisibleInsets, + outFrame, outContentInsets, outVisibleInsets, outConfig, outSurface); if (false) Slog.d(WindowManagerService.TAG, "<<<<<< EXITING relayout to " + Binder.getCallingPid()); diff --git a/services/java/com/android/server/wm/WindowAnimator.java b/services/java/com/android/server/wm/WindowAnimator.java index 146de34f50fe..480992beaa15 100644 --- a/services/java/com/android/server/wm/WindowAnimator.java +++ b/services/java/com/android/server/wm/WindowAnimator.java @@ -269,7 +269,7 @@ public class WindowAnimator { mPendingLayoutChanges); } mService.mFocusMayChange = true; - } else if (win.isReadyForDisplay() && winAnimator.mAnimation == null) { + } else if (win.isReadyForDisplay()) { mForceHiding = true; } } else if (mPolicy.canBeForceHidden(win, win.mAttrs)) { diff --git a/services/java/com/android/server/wm/WindowManagerService.java b/services/java/com/android/server/wm/WindowManagerService.java index 2efcb8e78767..b3ac6f1a8cf6 100755 --- a/services/java/com/android/server/wm/WindowManagerService.java +++ b/services/java/com/android/server/wm/WindowManagerService.java @@ -34,7 +34,6 @@ import static android.view.WindowManager.LayoutParams.TYPE_INPUT_METHOD_DIALOG; import static android.view.WindowManager.LayoutParams.TYPE_WALLPAPER; import com.android.internal.app.IBatteryStats; -import com.android.internal.app.ShutdownThread; import com.android.internal.policy.PolicyManager; import com.android.internal.policy.impl.PhoneWindowManager; import com.android.internal.view.IInputContext; @@ -48,6 +47,7 @@ import com.android.server.Watchdog; import com.android.server.am.BatteryStatsService; import com.android.server.input.InputFilter; import com.android.server.input.InputManagerService; +import com.android.server.pm.ShutdownThread; import android.Manifest; import android.app.ActivityManagerNative; @@ -82,7 +82,6 @@ import android.os.Looper; import android.os.Message; import android.os.Parcel; import android.os.ParcelFileDescriptor; -import android.os.Power; import android.os.PowerManager; import android.os.Process; import android.os.RemoteException; @@ -480,6 +479,9 @@ public class WindowManagerService extends IWindowManager.Stub = new ArrayList<IRotationWatcher>(); int mDeferredRotationPauseCount; + final Rect mSystemDecorRect = new Rect(); + int mSystemDecorLayer = 0; + int mPendingLayoutChanges = 0; boolean mLayoutNeeded = true; boolean mTraversalScheduled = false; @@ -2647,7 +2649,7 @@ public class WindowManagerService extends IWindowManager.Stub public int relayoutWindow(Session session, IWindow client, int seq, WindowManager.LayoutParams attrs, int requestedWidth, int requestedHeight, int viewVisibility, int flags, - Rect outFrame, Rect outSystemInsets, Rect outContentInsets, + Rect outFrame, Rect outContentInsets, Rect outVisibleInsets, Configuration outConfig, Surface outSurface) { boolean displayed = false; boolean inTouchMode; @@ -2939,7 +2941,6 @@ public class WindowManagerService extends IWindowManager.Stub win.mAppToken.updateReportedVisibilityLocked(); } outFrame.set(win.mCompatFrame); - outSystemInsets.set(win.mSystemInsets); outContentInsets.set(win.mContentInsets); outVisibleInsets.set(win.mVisibleInsets); if (localLOGV) Slog.v( @@ -3222,28 +3223,23 @@ public class WindowManagerService extends IWindowManager.Stub // Entering app zooms out from the center of the thumbnail. float scaleW = thumbWidth / mAppDisplayWidth; float scaleH = thumbHeight / mAppDisplayHeight; - AnimationSet set = new AnimationSet(true); Animation scale = new ScaleAnimation(scaleW, 1, scaleH, 1, computePivot(mNextAppTransitionStartX, scaleW), computePivot(mNextAppTransitionStartY, scaleH)); scale.setDuration(duration); scale.setFillBefore(true); - set.addAnimation(scale); - // Need to set an alpha animation on the entering app window - // in case it appears one frame before the thumbnail window - // (this solves flicker) - Animation alpha = new AlphaAnimation(0, 1); - alpha.setDuration(1); - alpha.setFillAfter(true); - set.addAnimation(alpha); - a = set; if (delayDuration > 0) { - a.setStartOffset(delayDuration); + scale.setStartOffset(delayDuration); } + a = scale; } else { - a = createExitAnimationLocked(transit, duration); - if (delayDuration > 0) { - a.setStartOffset(delayDuration); + if (delayed) { + a = new AlphaAnimation(1, 0); + a.setStartOffset(0); + a.setDuration(delayDuration - 50); + a.setBackgroundColor(0xFF000000); + } else { + a = createExitAnimationLocked(transit, duration); } } a.setFillAfter(true); @@ -5025,6 +5021,18 @@ public class WindowManagerService extends IWindowManager.Stub return mInputManager.monitorInput(inputChannelName); } + // Called by window manager policy. Not exposed externally. + @Override + public void shutdown() { + ShutdownThread.shutdown(mContext, true); + } + + // Called by window manager policy. Not exposed externally. + @Override + public void rebootSafeMode() { + ShutdownThread.rebootSafeMode(mContext, true); + } + public void setInputFilter(InputFilter filter) { mInputManager.setInputFilter(filter); } @@ -7710,6 +7718,7 @@ public class WindowManagerService extends IWindowManager.Stub } mPolicy.beginLayoutLw(dw, dh, mRotation); + mSystemDecorLayer = mPolicy.getSystemDecorRectLw(mSystemDecorRect); int seq = mLayoutSeq+1; if (seq < 0) seq = 0; @@ -8172,8 +8181,6 @@ public class WindowManagerService extends IWindowManager.Stub private void updateResizingWindows(final WindowState w) { final WindowStateAnimator winAnimator = w.mWinAnimator; if (w.mHasSurface && !w.mAppFreezing && w.mLayoutSeq == mLayoutSeq) { - w.mSystemInsetsChanged |= - !w.mLastSystemInsets.equals(w.mSystemInsets); w.mContentInsetsChanged |= !w.mLastContentInsets.equals(w.mContentInsets); w.mVisibleInsetsChanged |= @@ -8190,8 +8197,7 @@ public class WindowManagerService extends IWindowManager.Stub + ": configChanged=" + configChanged + " last=" + w.mLastFrame + " frame=" + w.mFrame); w.mLastFrame.set(w.mFrame); - if (w.mSystemInsetsChanged - || w.mContentInsetsChanged + if (w.mContentInsetsChanged || w.mVisibleInsetsChanged || winAnimator.mSurfaceResized || configChanged) { @@ -8203,7 +8209,6 @@ public class WindowManagerService extends IWindowManager.Stub + " configChanged=" + configChanged); } - w.mLastSystemInsets.set(w.mSystemInsets); w.mLastContentInsets.set(w.mContentInsets); w.mLastVisibleInsets.set(w.mVisibleInsets); makeWindowFreezingScreenIfNeededLocked(w); @@ -8587,11 +8592,10 @@ public class WindowManagerService extends IWindowManager.Stub winAnimator.mDrawState == WindowStateAnimator.DRAW_PENDING) Slog.i( TAG, "Resizing " + win + " WITH DRAW PENDING"); win.mClient.resized((int)winAnimator.mSurfaceW, - (int)winAnimator.mSurfaceH, win.mLastSystemInsets, + (int)winAnimator.mSurfaceH, win.mLastContentInsets, win.mLastVisibleInsets, winAnimator.mDrawState == WindowStateAnimator.DRAW_PENDING, configChanged ? win.mConfiguration : null); - win.mSystemInsetsChanged = false; win.mContentInsetsChanged = false; win.mVisibleInsetsChanged = false; winAnimator.mSurfaceResized = false; @@ -8700,13 +8704,13 @@ public class WindowManagerService extends IWindowManager.Stub mPowerManager.setScreenBrightnessOverride(-1); } else { mPowerManager.setScreenBrightnessOverride((int) - (mInnerFields.mScreenBrightness * Power.BRIGHTNESS_ON)); + (mInnerFields.mScreenBrightness * PowerManager.BRIGHTNESS_ON)); } if (mInnerFields.mButtonBrightness < 0 || mInnerFields.mButtonBrightness > 1.0f) { mPowerManager.setButtonBrightnessOverride(-1); } else { mPowerManager.setButtonBrightnessOverride((int) - (mInnerFields.mButtonBrightness * Power.BRIGHTNESS_ON)); + (mInnerFields.mButtonBrightness * PowerManager.BRIGHTNESS_ON)); } } if (mInnerFields.mHoldScreen != mHoldingScreenOn) { @@ -9582,6 +9586,8 @@ public class WindowManagerService extends IWindowManager.Stub pw.print(" mInTouchMode="); pw.print(mInTouchMode); pw.print(" mLayoutSeq="); pw.println(mLayoutSeq); if (dumpAll) { + pw.print(" mSystemDecorRect="); pw.print(mSystemDecorRect.toShortString()); + pw.print(" mSystemDecorLayer="); pw.println(mSystemDecorLayer); if (mLastStatusBarVisibility != 0) { pw.print(" mLastStatusBarVisibility=0x"); pw.println(Integer.toHexString(mLastStatusBarVisibility)); diff --git a/services/java/com/android/server/wm/WindowState.java b/services/java/com/android/server/wm/WindowState.java index 05e7d3a0a2d1..1fd80c26c8dc 100644 --- a/services/java/com/android/server/wm/WindowState.java +++ b/services/java/com/android/server/wm/WindowState.java @@ -133,14 +133,6 @@ final class WindowState implements WindowManagerPolicy.WindowState { boolean mContentInsetsChanged; /** - * Insets that are covered by system windows such as the status bar. These - * are in the application's coordinate space (without compatibility scale applied). - */ - final Rect mSystemInsets = new Rect(); - final Rect mLastSystemInsets = new Rect(); - boolean mSystemInsetsChanged; - - /** * Set to true if we are waiting for this window to receive its * given internal insets before laying out other windows based on it. */ @@ -171,6 +163,13 @@ final class WindowState implements WindowManagerPolicy.WindowState { */ int mTouchableInsets = ViewTreeObserver.InternalInsetsInfo.TOUCHABLE_INSETS_FRAME; + /** + * This is rectangle of the window's surface that is not covered by + * system decorations. + */ + final Rect mSystemDecorRect = new Rect(); + final Rect mLastSystemDecorRect = new Rect(); + // Current transformation being applied. float mGlobalScale=1; float mInvGlobalScale=1; @@ -187,7 +186,6 @@ final class WindowState implements WindowManagerPolicy.WindowState { final Rect mContainingFrame = new Rect(); final Rect mDisplayFrame = new Rect(); - final Rect mSystemFrame = new Rect(); final Rect mContentFrame = new Rect(); final Rect mParentFrame = new Rect(); final Rect mVisibleFrame = new Rect(); @@ -356,7 +354,7 @@ final class WindowState implements WindowManagerPolicy.WindowState { } @Override - public void computeFrameLw(Rect pf, Rect df, Rect sf, Rect cf, Rect vf) { + public void computeFrameLw(Rect pf, Rect df, Rect cf, Rect vf) { mHaveFrame = true; final Rect container = mContainingFrame; @@ -413,9 +411,6 @@ final class WindowState implements WindowManagerPolicy.WindowState { mContentChanged = true; } - final Rect system = mSystemFrame; - system.set(sf); - final Rect content = mContentFrame; content.set(cf); @@ -449,10 +444,6 @@ final class WindowState implements WindowManagerPolicy.WindowState { // Make sure the system, content and visible frames are inside of the // final window frame. - if (system.left < frame.left) system.left = frame.left; - if (system.top < frame.top) system.top = frame.top; - if (system.right > frame.right) system.right = frame.right; - if (system.bottom > frame.bottom) system.bottom = frame.bottom; if (content.left < frame.left) content.left = frame.left; if (content.top < frame.top) content.top = frame.top; if (content.right > frame.right) content.right = frame.right; @@ -462,12 +453,6 @@ final class WindowState implements WindowManagerPolicy.WindowState { if (visible.right > frame.right) visible.right = frame.right; if (visible.bottom > frame.bottom) visible.bottom = frame.bottom; - final Rect systemInsets = mSystemInsets; - systemInsets.left = system.left-frame.left; - systemInsets.top = system.top-frame.top; - systemInsets.right = frame.right-system.right; - systemInsets.bottom = frame.bottom-system.bottom; - final Rect contentInsets = mContentInsets; contentInsets.left = content.left-frame.left; contentInsets.top = content.top-frame.top; @@ -485,7 +470,6 @@ final class WindowState implements WindowManagerPolicy.WindowState { // If there is a size compatibility scale being applied to the // window, we need to apply this to its insets so that they are // reported to the app in its coordinate space. - systemInsets.scale(mInvGlobalScale); contentInsets.scale(mInvGlobalScale); visibleInsets.scale(mInvGlobalScale); @@ -506,7 +490,6 @@ final class WindowState implements WindowManagerPolicy.WindowState { + mRequestedWidth + ", mRequestedheight=" + mRequestedHeight + ") to" + " (pw=" + pw + ", ph=" + ph + "): frame=" + mFrame.toShortString() - + " si=" + systemInsets.toShortString() + " ci=" + contentInsets.toShortString() + " vi=" + visibleInsets.toShortString()); //} @@ -529,11 +512,6 @@ final class WindowState implements WindowManagerPolicy.WindowState { } @Override - public Rect getSystemFrameLw() { - return mSystemFrame; - } - - @Override public Rect getContentFrameLw() { return mContentFrame; } @@ -1067,6 +1045,9 @@ final class WindowState implements WindowManagerPolicy.WindowState { pw.print(prefix); pw.print("mFrame="); mFrame.printShortString(pw); pw.print(" last="); mLastFrame.printShortString(pw); pw.println(); + pw.print(prefix); pw.print("mSystemDecorRect="); mSystemDecorRect.printShortString(pw); + pw.print(" last="); mLastSystemDecorRect.printShortString(pw); + pw.println(); } if (mEnforceSizeCompat) { pw.print(prefix); pw.print("mCompatFrame="); mCompatFrame.printShortString(pw); @@ -1078,16 +1059,15 @@ final class WindowState implements WindowManagerPolicy.WindowState { pw.print(" parent="); mParentFrame.printShortString(pw); pw.print(" display="); mDisplayFrame.printShortString(pw); pw.println(); - pw.print(prefix); pw.print(" system="); mSystemFrame.printShortString(pw); - pw.print(" content="); mContentFrame.printShortString(pw); + pw.print(prefix); pw.print(" content="); mContentFrame.printShortString(pw); pw.print(" visible="); mVisibleFrame.printShortString(pw); pw.println(); - pw.print(prefix); pw.print("Cur insets: system="); mSystemInsets.printShortString(pw); - pw.print(" content="); mContentInsets.printShortString(pw);; + pw.print(prefix); pw.print("Cur insets: content="); + mContentInsets.printShortString(pw); pw.print(" visible="); mVisibleInsets.printShortString(pw); pw.println(); - pw.print(prefix); pw.print("Lst insets: system="); mLastSystemInsets.printShortString(pw); - pw.print(" content="); mLastContentInsets.printShortString(pw);; + pw.print(prefix); pw.print("Lst insets: content="); + mLastContentInsets.printShortString(pw); pw.print(" visible="); mLastVisibleInsets.printShortString(pw); pw.println(); } diff --git a/services/java/com/android/server/wm/WindowStateAnimator.java b/services/java/com/android/server/wm/WindowStateAnimator.java index 293d3e879d6a..0aa1b453e293 100644 --- a/services/java/com/android/server/wm/WindowStateAnimator.java +++ b/services/java/com/android/server/wm/WindowStateAnimator.java @@ -436,8 +436,9 @@ class WindowStateAnimator { private float mSurfaceTraceAlpha = 0; private int mLayer; - private PointF mPosition = new PointF(); - private Point mSize; + private final PointF mPosition = new PointF(); + private final Point mSize = new Point(); + private final Rect mWindowCrop = new Rect(); private boolean mShown = false; private String mName = "Not named"; @@ -445,7 +446,7 @@ class WindowStateAnimator { int pid, int display, int w, int h, int format, int flags) throws OutOfResourcesException { super(s, pid, display, w, h, format, flags); - mSize = new Point(w, h); + mSize.set(w, h); Slog.v(SURFACE_TAG, "ctor: " + this + ". Called by " + Debug.getCallers(3)); } @@ -455,7 +456,7 @@ class WindowStateAnimator { throws OutOfResourcesException { super(s, pid, name, display, w, h, format, flags); mName = name; - mSize = new Point(w, h); + mSize.set(w, h); Slog.v(SURFACE_TAG, "ctor: " + this + ". Called by " + Debug.getCallers(3)); } @@ -489,7 +490,7 @@ class WindowStateAnimator { @Override public void setPosition(float x, float y) { super.setPosition(x, y); - mPosition = new PointF(x, y); + mPosition.set(x, y); Slog.v(SURFACE_TAG, "setPosition: " + this + ". Called by " + Debug.getCallers(3)); } @@ -497,12 +498,20 @@ class WindowStateAnimator { @Override public void setSize(int w, int h) { super.setSize(w, h); - mSize = new Point(w, h); + mSize.set(w, h); Slog.v(SURFACE_TAG, "setSize: " + this + ". Called by " + Debug.getCallers(3)); } @Override + public void setWindowCrop(Rect crop) { + super.setWindowCrop(crop); + mWindowCrop.set(crop); + Slog.v(SURFACE_TAG, "setWindowCrop: " + this + ". Called by " + + Debug.getCallers(3)); + } + + @Override public void hide() { super.hide(); mShown = false; @@ -545,7 +554,8 @@ class WindowStateAnimator { return "Surface " + Integer.toHexString(System.identityHashCode(this)) + " " + mName + ": shown=" + mShown + " layer=" + mLayer + " alpha=" + mSurfaceTraceAlpha + " " + mPosition.x + "," + mPosition.y - + " " + mSize.x + "x" + mSize.y; + + " " + mSize.x + "x" + mSize.y + + " crop=" + mWindowCrop.toShortString(); } } @@ -596,6 +606,7 @@ class WindowStateAnimator { mSurfaceY = 0; mSurfaceW = w; mSurfaceH = h; + mWin.mLastSystemDecorRect.set(0, 0, 0, 0); try { final boolean isHwAccelerated = (attrs.flags & WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED) != 0; @@ -991,6 +1002,55 @@ class WindowStateAnimator { } } } + + // Need to recompute a new system decor rect each time. + if ((w.mAttrs.flags & LayoutParams.FLAG_SCALED) != 0) { + // Currently can't do this cropping for scaled windows. We'll + // just keep the crop rect the same as the source surface. + w.mSystemDecorRect.set(0, 0, w.mRequestedWidth, w.mRequestedHeight); + } else if (w.mLayer >= mService.mSystemDecorLayer) { + // Above the decor layer is easy, just use the entire window. + w.mSystemDecorRect.set(0, 0, w.mCompatFrame.width(), + w.mCompatFrame.height()); + } else { + final Rect decorRect = mService.mSystemDecorRect; + // Compute the offset of the window in relation to the decor rect. + final int offX = w.mXOffset + w.mFrame.left; + final int offY = w.mYOffset + w.mFrame.top; + // Initialize the decor rect to the entire frame. + w.mSystemDecorRect.set(0, 0, w.mFrame.width(), w.mFrame.height()); + // Intersect with the decor rect, offsetted by window position. + w.mSystemDecorRect.intersect(decorRect.left-offX, decorRect.top-offY, + decorRect.right-offX, decorRect.bottom-offY); + // If size compatibility is being applied to the window, the + // surface is scaled relative to the screen. Also apply this + // scaling to the crop rect. We aren't using the standard rect + // scale function because we want to round things to make the crop + // always round to a larger rect to ensure we don't crop too + // much and hide part of the window that should be seen. + if (w.mEnforceSizeCompat && w.mInvGlobalScale != 1.0f) { + final float scale = w.mInvGlobalScale; + w.mSystemDecorRect.left = (int) (w.mSystemDecorRect.left * scale - 0.5f); + w.mSystemDecorRect.top = (int) (w.mSystemDecorRect.top * scale - 0.5f); + w.mSystemDecorRect.right = (int) ((w.mSystemDecorRect.right+1) * scale - 0.5f); + w.mSystemDecorRect.bottom = (int) ((w.mSystemDecorRect.bottom+1) * scale - 0.5f); + } + } + + if (!w.mSystemDecorRect.equals(w.mLastSystemDecorRect)) { + w.mLastSystemDecorRect.set(w.mSystemDecorRect); + try { + if (WindowManagerService.SHOW_TRANSACTIONS) WindowManagerService.logSurface(w, + "CROP " + w.mSystemDecorRect.toShortString(), null); + mSurface.setWindowCrop(w.mSystemDecorRect); + } catch (RuntimeException e) { + Slog.w(TAG, "Error setting crop surface of " + w + + " crop=" + w.mSystemDecorRect.toShortString(), e); + if (!recoveringMemory) { + mService.reclaimSomeSurfaceMemoryLocked(this, "crop", true); + } + } + } } public void prepareSurfaceLocked(final boolean recoveringMemory) { diff --git a/services/jni/Android.mk b/services/jni/Android.mk index e2bd62200d55..e0a14afd1de3 100644 --- a/services/jni/Android.mk +++ b/services/jni/Android.mk @@ -23,7 +23,10 @@ LOCAL_C_INCLUDES += \ frameworks/base/services \ frameworks/base/core/jni \ external/skia/include/core \ - libcore/include + libcore/include \ + libcore/include/libsuspend \ + $(call include-path-for, libhardware)/hardware \ + $(call include-path-for, libhardware_legacy)/hardware_legacy \ LOCAL_SHARED_LIBRARIES := \ libandroid_runtime \ @@ -38,7 +41,8 @@ LOCAL_SHARED_LIBRARIES := \ libinput \ libskia \ libgui \ - libusbhost + libusbhost \ + libsuspend ifeq ($(WITH_MALLOC_LEAK_CHECK),true) LOCAL_CFLAGS += -DMALLOC_LEAK_CHECK diff --git a/services/jni/com_android_server_PowerManagerService.cpp b/services/jni/com_android_server_PowerManagerService.cpp index ce80c1f37066..a47f8fddd492 100644 --- a/services/jni/com_android_server_PowerManagerService.cpp +++ b/services/jni/com_android_server_PowerManagerService.cpp @@ -24,8 +24,14 @@ #include <limits.h> #include <android_runtime/AndroidRuntime.h> -#include <utils/Timers.h> #include <gui/ISurfaceComposer.h> +#include <utils/Timers.h> +#include <utils/misc.h> +#include <utils/String8.h> +#include <hardware/power.h> +#include <hardware_legacy/power.h> +#include <cutils/android_reboot.h> +#include <suspend/autosuspend.h> #include <private/gui/ComposerService.h> @@ -43,6 +49,7 @@ static struct { // ---------------------------------------------------------------------------- static jobject gPowerManagerServiceObj; +static struct power_module* gPowerModule; static Mutex gPowerManagerLock; static bool gScreenOn; @@ -76,6 +83,13 @@ bool android_server_PowerManagerService_isScreenBright() { } void android_server_PowerManagerService_userActivity(nsecs_t eventTime, int32_t eventType) { + if (gPowerModule) { + // Tell the power HAL when user activity occurs. + if (gPowerModule->powerHint) { + gPowerModule->powerHint(gPowerModule, POWER_HINT_INTERACTION, NULL); + } + } + if (gPowerManagerServiceObj) { // Throttle calls into user activity by event type. // We're a little conservative about argument checking here in case the caller @@ -112,33 +126,115 @@ void android_server_PowerManagerService_goToSleep(nsecs_t eventTime) { // ---------------------------------------------------------------------------- -static void android_server_PowerManagerService_nativeInit(JNIEnv* env, jobject obj) { +static void nativeInit(JNIEnv* env, jobject obj) { gPowerManagerServiceObj = env->NewGlobalRef(obj); + + status_t err = hw_get_module(POWER_HARDWARE_MODULE_ID, + (hw_module_t const**)&gPowerModule); + if (err) { + String8 msg; + msg.appendFormat("Couldn't load %s module (%s)", + POWER_HARDWARE_MODULE_ID, strerror(-err)); + ALOGE("%s", msg.string()); + jniThrowRuntimeException(env, msg.string()); + return; + } + + gPowerModule->init(gPowerModule); } -static void android_server_PowerManagerService_nativeSetPowerState(JNIEnv* env, +static void nativeSetPowerState(JNIEnv* env, jobject serviceObj, jboolean screenOn, jboolean screenBright) { AutoMutex _l(gPowerManagerLock); gScreenOn = screenOn; gScreenBright = screenBright; } -static void android_server_PowerManagerService_nativeStartSurfaceFlingerAnimation(JNIEnv* env, +static void nativeStartSurfaceFlingerAnimation(JNIEnv* env, jobject obj, jint mode) { sp<ISurfaceComposer> s(ComposerService::getComposerService()); s->turnElectronBeamOff(mode); } +static void nativeAcquireWakeLock(JNIEnv *env, jobject clazz, jint lock, jstring idObj) { + if (idObj == NULL) { + jniThrowNullPointerException(env, "id is null"); + return; + } + + const char *id = env->GetStringUTFChars(idObj, NULL); + + acquire_wake_lock(lock, id); + + env->ReleaseStringUTFChars(idObj, id); +} + +static void nativeReleaseWakeLock(JNIEnv *env, jobject clazz, jstring idObj) { + if (idObj == NULL) { + jniThrowNullPointerException(env, "id is null"); + return ; + } + + const char *id = env->GetStringUTFChars(idObj, NULL); + + release_wake_lock(id); + + env->ReleaseStringUTFChars(idObj, id); + +} + +static int nativeSetScreenState(JNIEnv *env, jobject clazz, jboolean on) { + if (on) { + autosuspend_disable(); + if (gPowerModule) { + gPowerModule->setInteractive(gPowerModule, true); + } + } else { + if (gPowerModule) { + gPowerModule->setInteractive(gPowerModule, false); + } + autosuspend_enable(); + } + + return 0; +} + +static void nativeShutdown(JNIEnv *env, jobject clazz) { + android_reboot(ANDROID_RB_POWEROFF, 0, 0); +} + +static void nativeReboot(JNIEnv *env, jobject clazz, jstring reason) { + if (reason == NULL) { + android_reboot(ANDROID_RB_RESTART, 0, 0); + } else { + const char *chars = env->GetStringUTFChars(reason, NULL); + android_reboot(ANDROID_RB_RESTART2, 0, (char *) chars); + env->ReleaseStringUTFChars(reason, chars); // In case it fails. + } + jniThrowIOException(env, errno); +} + + // ---------------------------------------------------------------------------- static JNINativeMethod gPowerManagerServiceMethods[] = { /* name, signature, funcPtr */ { "nativeInit", "()V", - (void*) android_server_PowerManagerService_nativeInit }, + (void*) nativeInit }, { "nativeSetPowerState", "(ZZ)V", - (void*) android_server_PowerManagerService_nativeSetPowerState }, + (void*) nativeSetPowerState }, { "nativeStartSurfaceFlingerAnimation", "(I)V", - (void*) android_server_PowerManagerService_nativeStartSurfaceFlingerAnimation }, + (void*) nativeStartSurfaceFlingerAnimation }, + { "nativeAcquireWakeLock", "(ILjava/lang/String;)V", + (void*) nativeAcquireWakeLock }, + { "nativeReleaseWakeLock", "(Ljava/lang/String;)V", + (void*) nativeReleaseWakeLock }, + { "nativeSetScreenState", "(Z)I", + (void*) nativeSetScreenState }, + { "nativeShutdown", "()V", + (void*) nativeShutdown }, + { "nativeReboot", "(Ljava/lang/String;)V", + (void*) nativeReboot }, }; #define FIND_CLASS(var, className) \ @@ -175,6 +271,8 @@ int register_android_server_PowerManagerService(JNIEnv* env) { } gScreenOn = true; gScreenBright = true; + gPowerManagerServiceObj = NULL; + gPowerModule = NULL; return 0; } diff --git a/telephony/java/com/android/internal/telephony/IccCard.java b/telephony/java/com/android/internal/telephony/IccCard.java index 92024cdd72ed..d738d7b63ea8 100644 --- a/telephony/java/com/android/internal/telephony/IccCard.java +++ b/telephony/java/com/android/internal/telephony/IccCard.java @@ -26,7 +26,6 @@ import android.content.res.Resources; import android.os.AsyncResult; import android.os.Handler; import android.os.Message; -import android.os.Power; import android.os.PowerManager; import android.os.Registrant; import android.os.RegistrantList; diff --git a/tests/RenderScriptTests/tests/src/com/android/rs/test/RSTestCore.java b/tests/RenderScriptTests/tests/src/com/android/rs/test/RSTestCore.java index d2e1527c7667..9321cb320358 100644 --- a/tests/RenderScriptTests/tests/src/com/android/rs/test/RSTestCore.java +++ b/tests/RenderScriptTests/tests/src/com/android/rs/test/RSTestCore.java @@ -69,6 +69,8 @@ public class RSTestCore { unitTests.add(new UT_vector(this, mRes, mCtx)); unitTests.add(new UT_array_init(this, mRes, mCtx)); unitTests.add(new UT_array_alloc(this, mRes, mCtx)); + unitTests.add(new UT_clamp(this, mRes, mCtx)); + unitTests.add(new UT_clamp_relaxed(this, mRes, mCtx)); unitTests.add(new UT_convert(this, mRes, mCtx)); unitTests.add(new UT_rsdebug(this, mRes, mCtx)); unitTests.add(new UT_rstime(this, mRes, mCtx)); diff --git a/tests/RenderScriptTests/tests/src/com/android/rs/test/UT_clamp.java b/tests/RenderScriptTests/tests/src/com/android/rs/test/UT_clamp.java new file mode 100644 index 000000000000..08c96bb1cb97 --- /dev/null +++ b/tests/RenderScriptTests/tests/src/com/android/rs/test/UT_clamp.java @@ -0,0 +1,40 @@ +/* + * Copyright (C) 2012 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.rs.test; + +import android.content.Context; +import android.content.res.Resources; +import android.renderscript.*; + +public class UT_clamp extends UnitTest { + private Resources mRes; + + protected UT_clamp(RSTestCore rstc, Resources res, Context ctx) { + super(rstc, "Clamp (Full)", ctx); + mRes = res; + } + + public void run() { + RenderScript pRS = RenderScript.create(mCtx); + ScriptC_clamp s = new ScriptC_clamp(pRS, mRes, R.raw.clamp); + pRS.setMessageHandler(mRsMessage); + s.invoke_clamp_test(); + pRS.finish(); + waitForMessage(); + pRS.destroy(); + } +} diff --git a/tests/RenderScriptTests/tests/src/com/android/rs/test/UT_clamp_relaxed.java b/tests/RenderScriptTests/tests/src/com/android/rs/test/UT_clamp_relaxed.java new file mode 100644 index 000000000000..a6fd868c8a77 --- /dev/null +++ b/tests/RenderScriptTests/tests/src/com/android/rs/test/UT_clamp_relaxed.java @@ -0,0 +1,41 @@ +/* + * Copyright (C) 2012 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.rs.test; + +import android.content.Context; +import android.content.res.Resources; +import android.renderscript.*; + +public class UT_clamp_relaxed extends UnitTest { + private Resources mRes; + + protected UT_clamp_relaxed(RSTestCore rstc, Resources res, Context ctx) { + super(rstc, "Clamp (Relaxed)", ctx); + mRes = res; + } + + public void run() { + RenderScript pRS = RenderScript.create(mCtx); + ScriptC_clamp_relaxed s = + new ScriptC_clamp_relaxed(pRS, mRes, R.raw.clamp_relaxed); + pRS.setMessageHandler(mRsMessage); + s.invoke_clamp_test(); + pRS.finish(); + waitForMessage(); + pRS.destroy(); + } +} diff --git a/tests/RenderScriptTests/tests/src/com/android/rs/test/clamp.rs b/tests/RenderScriptTests/tests/src/com/android/rs/test/clamp.rs new file mode 100644 index 000000000000..28b00bdcf190 --- /dev/null +++ b/tests/RenderScriptTests/tests/src/com/android/rs/test/clamp.rs @@ -0,0 +1,56 @@ +#include "shared.rsh" + +static bool test_clamp_vector() { + bool failed = false; + + float2 src2 = { 2.0f, 2.0f}; + float2 min2 = { 0.5f, -3.0f}; + float2 max2 = { 1.0f, 9.0f}; + + float2 res2 = clamp(src2, min2, max2); + _RS_ASSERT(res2.x == 1.0f); + _RS_ASSERT(res2.y == 2.0f); + + + float3 src3 = { 2.0f, 2.0f, 1.0f}; + float3 min3 = { 0.5f, -3.0f, 3.0f}; + float3 max3 = { 1.0f, 9.0f, 4.0f}; + + float3 res3 = clamp(src3, min3, max3); + _RS_ASSERT(res3.x == 1.0f); + _RS_ASSERT(res3.y == 2.0f); + _RS_ASSERT(res3.z == 3.0f); + + + float4 src4 = { 2.0f, 2.0f, 1.0f, 4.0f }; + float4 min4 = { 0.5f, -3.0f, 3.0f, 4.0f }; + float4 max4 = { 1.0f, 9.0f, 4.0f, 4.0f }; + + float4 res4 = clamp(src4, min4, max4); + _RS_ASSERT(res4.x == 1.0f); + _RS_ASSERT(res4.y == 2.0f); + _RS_ASSERT(res4.z == 3.0f); + _RS_ASSERT(res4.w == 4.0f); + + if (failed) { + rsDebug("test_clamp_vector FAILED", 0); + } + else { + rsDebug("test_clamp_vector PASSED", 0); + } + + return failed; +} + +void clamp_test() { + bool failed = false; + failed |= test_clamp_vector(); + + if (failed) { + rsSendToClientBlocking(RS_MSG_TEST_FAILED); + } + else { + rsSendToClientBlocking(RS_MSG_TEST_PASSED); + } +} + diff --git a/tests/RenderScriptTests/tests/src/com/android/rs/test/clamp_relaxed.rs b/tests/RenderScriptTests/tests/src/com/android/rs/test/clamp_relaxed.rs new file mode 100644 index 000000000000..71c65aee703b --- /dev/null +++ b/tests/RenderScriptTests/tests/src/com/android/rs/test/clamp_relaxed.rs @@ -0,0 +1,2 @@ +#include "clamp.rs" +#pragma rs_fp_relaxed diff --git a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/android/BridgeWindow.java b/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/android/BridgeWindow.java index c44ddc6e1409..379fb81462e1 100644 --- a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/android/BridgeWindow.java +++ b/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/android/BridgeWindow.java @@ -47,7 +47,7 @@ public final class BridgeWindow implements IWindow { } @Override - public void resized(int arg0, int arg1, Rect argBlah, Rect arg2, Rect arg3, + public void resized(int arg0, int arg1, Rect arg2, Rect arg3, boolean arg4, Configuration arg5) throws RemoteException { // pass for now. } diff --git a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/android/BridgeWindowSession.java b/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/android/BridgeWindowSession.java index 3996d2693241..6fb599d3a11d 100644 --- a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/android/BridgeWindowSession.java +++ b/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/android/BridgeWindowSession.java @@ -69,7 +69,7 @@ public final class BridgeWindowSession implements IWindowSession { } @Override public int relayout(IWindow arg0, int seq, LayoutParams arg1, int arg2, int arg3, int arg4, - int arg4_5, Rect arg4_6, Rect arg5, Rect arg6, Rect arg7, Configuration arg7b, + int arg4_5, Rect arg5, Rect arg6, Rect arg7, Configuration arg7b, Surface arg8) throws RemoteException { // pass for now. return 0; diff --git a/wifi/java/android/net/wifi/WifiConfiguration.java b/wifi/java/android/net/wifi/WifiConfiguration.java index dfc1b18a1bbc..0a846fd2f674 100644 --- a/wifi/java/android/net/wifi/WifiConfiguration.java +++ b/wifi/java/android/net/wifi/WifiConfiguration.java @@ -56,6 +56,12 @@ public class WifiConfiguration implements Parcelable { */ public static final String ENGINE_ENABLE = "1"; + /** + * String to set the engine value to when it should be disabled. + * @hide + */ + public static final String ENGINE_DISABLE = "0"; + /** {@hide} */ public static final String ssidVarName = "ssid"; /** {@hide} */ diff --git a/wifi/java/android/net/wifi/WifiNative.java b/wifi/java/android/net/wifi/WifiNative.java index 73618f69a23a..0a87a5380763 100644 --- a/wifi/java/android/net/wifi/WifiNative.java +++ b/wifi/java/android/net/wifi/WifiNative.java @@ -442,8 +442,8 @@ public class WifiNative { return doBooleanCommand("SET p2p_ssid_postfix " + postfix); } - public boolean setP2pGroupIdle(int time) { - return doBooleanCommand("SET p2p_group_idle " + time); + public boolean setP2pGroupIdle(String iface, int time) { + return doBooleanCommand("SET interface=" + iface + " p2p_group_idle " + time); } public void setPowerSave(boolean enabled) { @@ -624,13 +624,6 @@ public class WifiNative { return ""; } - public boolean isGroupOwner(String deviceAddress) { - /* BSS returns details only for a GO */ - String bssInfo = doStringCommand("BSS p2p_dev_addr=" + deviceAddress); - if (TextUtils.isEmpty(bssInfo)) return false; - return true; - } - public String p2pPeer(String deviceAddress) { return doStringCommand("P2P_PEER " + deviceAddress); } diff --git a/wifi/java/android/net/wifi/p2p/WifiP2pDeviceList.java b/wifi/java/android/net/wifi/p2p/WifiP2pDeviceList.java index 8942ff1152c0..b2347c851c1a 100644 --- a/wifi/java/android/net/wifi/p2p/WifiP2pDeviceList.java +++ b/wifi/java/android/net/wifi/p2p/WifiP2pDeviceList.java @@ -108,6 +108,15 @@ public class WifiP2pDeviceList implements Parcelable { return Collections.unmodifiableCollection(mDevices.values()); } + /** @hide */ + public boolean isGroupOwner(String deviceAddress) { + if (deviceAddress != null) { + WifiP2pDevice device = mDevices.get(deviceAddress); + if (device != null) return device.isGroupOwner(); + } + return false; + } + public String toString() { StringBuffer sbuf = new StringBuffer(); for (WifiP2pDevice device : mDevices.values()) { diff --git a/wifi/java/android/net/wifi/p2p/WifiP2pService.java b/wifi/java/android/net/wifi/p2p/WifiP2pService.java index b4a879a82080..cc49cae6fc10 100644 --- a/wifi/java/android/net/wifi/p2p/WifiP2pService.java +++ b/wifi/java/android/net/wifi/p2p/WifiP2pService.java @@ -159,6 +159,9 @@ public class WifiP2pService extends IWifiP2pManager.Stub { * is invoked */ private boolean mAutonomousGroup; + /* Invitation to join an existing p2p group */ + private boolean mJoinExistingGroup; + /* Track whether we are in p2p discovery. This is used to avoid sending duplicate * broadcasts */ @@ -761,7 +764,7 @@ public class WifiP2pService extends IWifiP2pManager.Stub { //Stop discovery before issuing connect mWifiNative.p2pStopFind(); - if (mWifiNative.isGroupOwner(mSavedPeerConfig.deviceAddress)) { + if (mPeers.isGroupOwner(mSavedPeerConfig.deviceAddress)) { p2pConnectWithPinDisplay(mSavedPeerConfig, JOIN_GROUP); } else { p2pConnectWithPinDisplay(mSavedPeerConfig, FORM_GROUP); @@ -778,7 +781,7 @@ public class WifiP2pService extends IWifiP2pManager.Stub { mWifiNative.p2pStopFind(); //If peer is a GO, we do not need to send provisional discovery, //the supplicant takes care of it. - if (mWifiNative.isGroupOwner(mSavedPeerConfig.deviceAddress)) { + if (mPeers.isGroupOwner(mSavedPeerConfig.deviceAddress)) { if (DBG) logd("Sending join to GO"); p2pConnectWithPinDisplay(mSavedPeerConfig, JOIN_GROUP); transitionTo(mGroupNegotiationState); @@ -795,6 +798,8 @@ public class WifiP2pService extends IWifiP2pManager.Stub { case WifiMonitor.P2P_GO_NEGOTIATION_REQUEST_EVENT: mSavedPeerConfig = (WifiP2pConfig) message.obj; + mAutonomousGroup = false; + mJoinExistingGroup = false; if (!sendConnectNoticeToApp(mPeers.get(mSavedPeerConfig.deviceAddress), mSavedPeerConfig)) { transitionTo(mUserAuthorizingInvitationState); @@ -824,6 +829,8 @@ public class WifiP2pService extends IWifiP2pManager.Stub { } } + mAutonomousGroup = false; + mJoinExistingGroup = true; //TODO In the p2p client case, we should set source address correctly. if (!sendConnectNoticeToApp(mPeers.get(mSavedPeerConfig.deviceAddress), mSavedPeerConfig)) { @@ -840,8 +847,6 @@ public class WifiP2pService extends IWifiP2pManager.Stub { break; case WifiP2pManager.CREATE_GROUP: mAutonomousGroup = true; - // An autonomous GO requires group idle settings to be reset - mWifiNative.setP2pGroupIdle(0); if (mWifiNative.p2pGroupAdd()) { replyToMessage(message, WifiP2pManager.CREATE_GROUP_SUCCEEDED); } else { @@ -863,11 +868,6 @@ public class WifiP2pService extends IWifiP2pManager.Stub { if (DBG) logd(getName()); sendMessageDelayed(obtainMessage(GROUP_CREATING_TIMED_OUT, ++mGroupCreatingTimeoutIndex, 0), GROUP_CREATING_WAIT_TIME_MS); - - // Set default group idle settings - if (!mAutonomousGroup) { - mWifiNative.setP2pGroupIdle(GROUP_IDLE_TIME_S); - } } @Override @@ -921,7 +921,7 @@ public class WifiP2pService extends IWifiP2pManager.Stub { switch (message.what) { case PEER_CONNECTION_USER_ACCEPT: //TODO: handle persistence - if (mWifiNative.isGroupOwner(mSavedPeerConfig.deviceAddress)) { + if (mJoinExistingGroup) { p2pConnectWithPinDisplay(mSavedPeerConfig, JOIN_GROUP); } else { p2pConnectWithPinDisplay(mSavedPeerConfig, FORM_GROUP); @@ -983,6 +983,7 @@ public class WifiP2pService extends IWifiP2pManager.Stub { mWifiNative.p2pConnect(mSavedPeerConfig, FORM_GROUP); transitionTo(mGroupNegotiationState); } else { + mJoinExistingGroup = false; transitionTo(mUserAuthorizingInvitationState); } } @@ -1031,6 +1032,10 @@ public class WifiP2pService extends IWifiP2pManager.Stub { if (mGroup.isGroupOwner()) { startDhcpServer(mGroup.getInterface()); } else { + // Set group idle only for a client on the group interface to speed up + // disconnect when GO is gone. Setting group idle time for a group owner + // causes connectivity issues for new clients + mWifiNative.setP2pGroupIdle(mGroup.getInterface(), GROUP_IDLE_TIME_S); mDhcpStateMachine = DhcpStateMachine.makeDhcpStateMachine(mContext, P2pStateMachine.this, mGroup.getInterface()); mDhcpStateMachine.sendMessage(DhcpStateMachine.CMD_START_DHCP); @@ -1455,6 +1460,13 @@ public class WifiP2pService extends IWifiP2pManager.Stub { sendMessage(PEER_CONNECTION_USER_REJECT); } }) + .setOnCancelListener(new DialogInterface.OnCancelListener() { + @Override + public void onCancel(DialogInterface arg0) { + if (DBG) logd(getName() + " ignore connect"); + sendMessage(PEER_CONNECTION_USER_REJECT); + } + }) .create(); //make the enter pin area or the display pin area visible |