From 22b86a7151ced245b6510cc014a9f55b173ce78c Mon Sep 17 00:00:00 2001 From: Daniel Sandler Date: Wed, 18 Aug 2010 22:09:07 -0400 Subject: [PATCH 01/90] Fix divide-by-zero when calculating signal level over a large output range. Change-Id: I17eff6fb458532465a836414e1973a8d5b7c715b --- wifi/java/android/net/wifi/WifiManager.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/wifi/java/android/net/wifi/WifiManager.java b/wifi/java/android/net/wifi/WifiManager.java index a774c12bba5e8..91563581a0e7c 100644 --- a/wifi/java/android/net/wifi/WifiManager.java +++ b/wifi/java/android/net/wifi/WifiManager.java @@ -765,8 +765,9 @@ public class WifiManager { } else if (rssi >= MAX_RSSI) { return numLevels - 1; } else { - int partitionSize = (MAX_RSSI - MIN_RSSI) / (numLevels - 1); - return (rssi - MIN_RSSI) / partitionSize; + float inputRange = (MAX_RSSI - MIN_RSSI); + float outputRange = (numLevels - 1); + return (int)((float)(rssi - MIN_RSSI) * outputRange / inputRange); } } From 8c057a033560f355d77ed13e46cf5c81703f057d Mon Sep 17 00:00:00 2001 From: Adam Powell Date: Tue, 24 Aug 2010 14:18:10 -0700 Subject: [PATCH 02/90] Disable FEATURE_ACTION_BAR on windows with incompatible feature sets. Change-Id: I70c860c72eb9e1f1f123764202334ab714f4f830 --- core/java/android/view/Window.java | 9 +++++++++ .../android/internal/policy/impl/PhoneWindow.java | 13 +++++++++++++ 2 files changed, 22 insertions(+) diff --git a/core/java/android/view/Window.java b/core/java/android/view/Window.java index 705af0f7f8e8a..6633367fddb51 100644 --- a/core/java/android/view/Window.java +++ b/core/java/android/view/Window.java @@ -771,6 +771,15 @@ public abstract class Window { return (mFeatures&flag) != 0; } + /** + * @hide Used internally to help resolve conflicting features. + */ + protected void removeFeature(int featureId) { + final int flag = 1< Date: Thu, 9 Sep 2010 11:54:19 -0700 Subject: [PATCH 03/90] Fix bug 2988160 - Flinging broken in certain apps/widgets Change-Id: I89de767cecbbc37cb2fe90a0346e8e1591dec60b --- core/java/android/view/VelocityTracker.java | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/core/java/android/view/VelocityTracker.java b/core/java/android/view/VelocityTracker.java index fb88c7135ba64..b1fdec89f1475 100644 --- a/core/java/android/view/VelocityTracker.java +++ b/core/java/android/view/VelocityTracker.java @@ -41,6 +41,7 @@ public final class VelocityTracker implements Poolable { private static final int MAX_AGE_MILLISECONDS = 200; private static final int POINTER_POOL_CAPACITY = 20; + private static final int INVALID_POINTER = -1; private static final Pool sPool = Pools.synchronizedPool( Pools.finitePool(new PoolableManager() { @@ -76,6 +77,7 @@ public final class VelocityTracker implements Poolable { private Pointer mPointerListHead; // sorted by id in increasing order private int mLastTouchIndex; private int mGeneration; + private int mActivePointerId; private VelocityTracker mNext; @@ -125,6 +127,7 @@ public final class VelocityTracker implements Poolable { mPointerListHead = null; mLastTouchIndex = 0; + mActivePointerId = INVALID_POINTER; } /** @@ -180,6 +183,10 @@ public final class VelocityTracker implements Poolable { // Pointer went down. Add it to the list. // Write a sentinel at the end of the pastTime trace so we will be able to // tell when the trace started. + if (mActivePointerId == INVALID_POINTER) { + // Congratulations! You're the new active pointer! + mActivePointerId = pointerId; + } pointer = obtainPointer(); pointer.id = pointerId; pointer.pastTime[lastTouchIndex] = Long.MIN_VALUE; @@ -214,6 +221,7 @@ public final class VelocityTracker implements Poolable { previousPointer = null; for (Pointer pointer = mPointerListHead; pointer != null; ) { final Pointer nextPointer = pointer.next; + final int pointerId = pointer.id; if (pointer.generation != generation) { // Pointer went up. Remove it from the list. if (previousPointer == null) { @@ -222,6 +230,12 @@ public final class VelocityTracker implements Poolable { previousPointer.next = nextPointer; } releasePointer(pointer); + + if (pointerId == mActivePointerId) { + // Pick a new active pointer. How is arbitrary. + mActivePointerId = mPointerListHead != null ? + mPointerListHead.id : INVALID_POINTER; + } } else { previousPointer = pointer; } @@ -334,7 +348,7 @@ public final class VelocityTracker implements Poolable { * @return The previously computed X velocity. */ public float getXVelocity() { - Pointer pointer = getPointer(0); + Pointer pointer = getPointer(mActivePointerId); return pointer != null ? pointer.xVelocity : 0; } @@ -345,7 +359,7 @@ public final class VelocityTracker implements Poolable { * @return The previously computed Y velocity. */ public float getYVelocity() { - Pointer pointer = getPointer(0); + Pointer pointer = getPointer(mActivePointerId); return pointer != null ? pointer.yVelocity : 0; } From 8bc73b5dd9de4db74aec2daebcd46cc097c13aa2 Mon Sep 17 00:00:00 2001 From: Christopher Tate Date: Thu, 9 Sep 2010 13:09:36 -0700 Subject: [PATCH 04/90] Don't crash in batterystats The number of timers to allocate time shares to is calculated by disregarding system-UID execution. However, the actual allocation of time *was* considering system-UID locks as well. This wound up trying to share time across more timers than had been counted in the first pass, leading to divide-by-zero exceptions. This patch changes the logic to account the time slice only to non-system-UID entities, in keeping with the commentary. Change-Id: I7384a3c269aea44e52bc983927f9417e11613ad5 --- .../java/com/android/internal/os/BatteryStatsImpl.java | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/core/java/com/android/internal/os/BatteryStatsImpl.java b/core/java/com/android/internal/os/BatteryStatsImpl.java index 9ed365813f570..0361cf86170ec 100644 --- a/core/java/com/android/internal/os/BatteryStatsImpl.java +++ b/core/java/com/android/internal/os/BatteryStatsImpl.java @@ -1378,13 +1378,13 @@ public final class BatteryStatsImpl extends BatteryStats { for (int i=0; i Date: Tue, 14 Sep 2010 11:35:49 -0700 Subject: [PATCH 05/90] Revert "caching code retooled to reduce locking + handle SMP" This reverts commit 992f7d52fad590d90edc166cd74380e96d627605. Change-Id: Ia5b789d1b2195d6ce43baffe24296c857f9b30f6 --- api/current.xml | 4 +- .../sqlite/DatabaseConnectionPool.java | 5 +- .../android/database/sqlite/SQLiteCache.java | 214 ------------------ .../database/sqlite/SQLiteCompiledSql.java | 153 ++++--------- .../database/sqlite/SQLiteDatabase.java | 188 +++++++++++++-- .../database/sqlite/SQLiteProgram.java | 53 ++++- .../database/sqlite/SQLiteCacheTest.java | 176 -------------- .../sqlite/SQLiteCompiledSqlTest.java | 99 -------- .../database/sqlite/SQLiteDatabaseTest.java | 38 +++- .../database/sqlite/SQLiteStatementTest.java | 6 - 10 files changed, 299 insertions(+), 637 deletions(-) delete mode 100644 core/java/android/database/sqlite/SQLiteCache.java delete mode 100644 core/tests/coretests/src/android/database/sqlite/SQLiteCacheTest.java delete mode 100644 core/tests/coretests/src/android/database/sqlite/SQLiteCompiledSqlTest.java diff --git a/api/current.xml b/api/current.xml index a9abb1415d365..b9fa1e1ab2a64 100644 --- a/api/current.xml +++ b/api/current.xml @@ -65918,7 +65918,7 @@ return="void" abstract="false" native="false" - synchronized="false" + synchronized="true" static="false" final="false" deprecated="not deprecated" @@ -65957,7 +65957,7 @@ return="void" abstract="false" native="false" - synchronized="false" + synchronized="true" static="false" final="false" deprecated="not deprecated" diff --git a/core/java/android/database/sqlite/DatabaseConnectionPool.java b/core/java/android/database/sqlite/DatabaseConnectionPool.java index aede438657840..54b06054f86c4 100644 --- a/core/java/android/database/sqlite/DatabaseConnectionPool.java +++ b/core/java/android/database/sqlite/DatabaseConnectionPool.java @@ -99,7 +99,7 @@ import java.util.Random; poolObj = mPool.get(0); } else { for (int i = 0; i < mMaxPoolSize; i++) { - if (mPool.get(i).mDb.mCache.isSqlInStatementCache(sql)) { + if (mPool.get(i).mDb.isSqlInStatementCache(sql)) { poolObj = mPool.get(i); break; } @@ -125,8 +125,7 @@ import java.util.Random; // there are free connections available. pick one // preferably a connection caching the pre-compiled statement of the given SQL for (int i = 0; i < poolSize; i++) { - if (mPool.get(i).isFree() && - mPool.get(i).mDb.mCache.isSqlInStatementCache(sql)) { + if (mPool.get(i).isFree() && mPool.get(i).mDb.isSqlInStatementCache(sql)) { poolObj = mPool.get(i); break; } diff --git a/core/java/android/database/sqlite/SQLiteCache.java b/core/java/android/database/sqlite/SQLiteCache.java deleted file mode 100644 index 049fb626197f7..0000000000000 --- a/core/java/android/database/sqlite/SQLiteCache.java +++ /dev/null @@ -1,214 +0,0 @@ -/* - * Copyright (C) 2010 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package android.database.sqlite; - -import android.util.Log; - -import java.util.LinkedHashMap; -import java.util.Map; -import java.util.Set; - -/** - * For each instance of {@link SQLiteDatabase}, this class maintains a LRU cache to store - * the compiled query statement ids returned by sqlite database. - *

- *

    - *
  • key = SQL statement with "?" for bind args
  • - *
  • value = {@link SQLiteCompiledSql}
  • - *
- * If an application opens the database and keeps it open during its entire life, then - * there will not be an overhead of compilation of SQL statements by sqlite. - *

- * Why is this cache NOT static? because sqlite attaches compiled-sql statements to the - * database connections. - *

- * This cache has an upper limit of mMaxSqlCacheSize (settable by calling the method - * (@link #setMaxSqlCacheSize(int)}). - */ -/* package */ class SQLiteCache { - private static final String TAG = "SQLiteCache"; - - /** The {@link SQLiteDatabase} instance this cache is attached to */ - private final SQLiteDatabase mDatabase; - - /** Default statement-cache size per database connection ( = instance of this class) */ - private int mMaxSqlCacheSize = 25; - - /** The LRU cache */ - private final Map mCompiledQueries = - new LinkedHashMap(mMaxSqlCacheSize + 1, 0.75f, true) { - @Override - public boolean removeEldestEntry(Map.Entry eldest) { - // eldest = least-recently used entry - // if it needs to be removed to accommodate a new entry, - // close {@link SQLiteCompiledSql} represented by this entry, if not in use - // and then let it be removed from the Map. - mDatabase.verifyLockOwner(); - if (this.size() <= mMaxSqlCacheSize) { - // cache is not full. nothing needs to be removed - return false; - } - // cache is full. eldest will be removed. - eldest.getValue().releaseIfNotInUse(); - // return true, so that this entry is removed automatically by the caller. - return true; - } - }; - - /** Maintains whether or not cacheFullWarning has been logged */ - private boolean mCacheFullWarning; - - /** The following 2 members maintain stats about cache hits and misses */ - private int mNumCacheHits; - private int mNumCacheMisses; - - /** - * Constructor used by {@link SQLiteDatabase}. - * @param db - */ - /* package */ SQLiteCache(SQLiteDatabase db) { - mDatabase = db; - } - - /** - * Adds the given SQL and its compiled-statement to the cache, if the given SQL statement - * doesn't already exist in cache. - * - * @return true if added to cache. false otherwise. - */ - /* package */ synchronized boolean addToCompiledQueries(String sql, - SQLiteCompiledSql compiledStatement) { - if (mCompiledQueries.containsKey(sql)) { - // already exists. - return false; - } - - /* add the given SQLiteCompiledSql compiledStatement to cache. - * no need to worry about the cache size - because {@link #mCompiledQueries} - * self-limits its size to {@link #mMaxSqlCacheSize}. - */ - mCompiledQueries.put(sql, compiledStatement); - - // need to log a warning to say that the cache is full? - if (!isCacheFullWarningLogged() && mCompiledQueries.size() == mMaxSqlCacheSize) { - /* - * cache size of {@link #mMaxSqlCacheSize} is not enough for this app. - * log a warning. - * chances are it is NOT using ? for bindargs - or cachesize is too small. - */ - Log.w(TAG, "Reached MAX size for compiled-sql statement cache for database " + - mDatabase.getPath() + - ". Use setMaxSqlCacheSize() in SQLiteDatabase to increase cachesize. "); - setCacheFullWarningLogged(); - } - return true; - } - - /** - * Returns the compiled-statement for the given SQL statement, if the entry exists in cache - * and is free to use. Returns null otherwise. - *

- * If a compiled-sql statement is returned for the caller, it is reserved for the caller. - * So, don't use this method unless the caller needs to acquire the object. - */ - /* package */ synchronized SQLiteCompiledSql getCompiledStatementForSql(String sql) { - SQLiteCompiledSql compiledStatement = mCompiledQueries.get(sql); - if (compiledStatement == null) { - mNumCacheMisses++; - return null; - } - mNumCacheHits++; - // reserve it for the caller, if it is not already in use - if (!compiledStatement.acquire()) { - // couldn't acquire it since it is already in use. bug in app? - if (SQLiteDebug.DEBUG_ACTIVE_CURSOR_FINALIZATION) { - Log.w(TAG, "Possible bug: Either using the same SQL in 2 threads at " + - " the same time, or previous instance of this SQL statement was " + - "never close()d. " + compiledStatement.toString()); - } - return null; - } - return compiledStatement; - } - - /** - * If the given statement is in cache, it is released back to cache and it is made available for - * others to use. - *

- * return true if the statement is put back in cache, false otherwise (false = the statement - * is NOT in cache) - */ - /* package */ synchronized boolean releaseBackToCache(SQLiteCompiledSql stmt) { - if (!mCompiledQueries.containsValue(stmt)) { - return false; - } - // it is in cache. release it from the caller, make it available for others to use - stmt.free(); - return true; - } - - /** - * releases all compiled-sql statements in the cache. - */ - /* package */ synchronized void dealloc() { - for (SQLiteCompiledSql stmt : mCompiledQueries.values()) { - stmt.setState(SQLiteCompiledSql.NSTATE_CACHE_DEALLOC); - stmt.releaseFromDatabase(); - } - mCompiledQueries.clear(); - } - - /** - * see documentation on {@link SQLiteDatabase#setMaxSqlCacheSize(int)}. - */ - /* package */ synchronized void setMaxSqlCacheSize(int cacheSize) { - if (cacheSize > SQLiteDatabase.MAX_SQL_CACHE_SIZE || cacheSize < 0) { - throw new IllegalStateException("expected value between 0 and " + - SQLiteDatabase.MAX_SQL_CACHE_SIZE); - } else if (cacheSize < mMaxSqlCacheSize) { - throw new IllegalStateException("cannot set cacheSize to a value less than the value " + - "set with previous setMaxSqlCacheSize() call."); - } - mMaxSqlCacheSize = cacheSize; - } - - /* package */ synchronized boolean isSqlInStatementCache(String sql) { - return mCompiledQueries.containsKey(sql); - } - - private synchronized boolean isCacheFullWarningLogged() { - return mCacheFullWarning; - } - - private synchronized void setCacheFullWarningLogged() { - mCacheFullWarning = true; - } - /* package */ synchronized int getCacheHitNum() { - return mNumCacheHits; - } - /* package */ synchronized int getCacheMissNum() { - return mNumCacheMisses; - } - /* package */ synchronized int getCachesize() { - return mCompiledQueries.size(); - } - - // only for testing - /* package */ synchronized Set getKeys() { - return mCompiledQueries.keySet(); - } -} diff --git a/core/java/android/database/sqlite/SQLiteCompiledSql.java b/core/java/android/database/sqlite/SQLiteCompiledSql.java index 120d090a881ea..0b5a4dff3d4d5 100644 --- a/core/java/android/database/sqlite/SQLiteCompiledSql.java +++ b/core/java/android/database/sqlite/SQLiteCompiledSql.java @@ -16,7 +16,6 @@ package android.database.sqlite; -import android.database.DatabaseUtils; import android.util.Log; /** @@ -25,19 +24,19 @@ import android.util.Log; * and it is released in one of the 2 following ways * 1. when {@link SQLiteDatabase} object is closed. * 2. if this is not cached in {@link SQLiteDatabase}, {@link android.database.Cursor#close()} - * releases this obj. + * releaases this obj. */ /* package */ class SQLiteCompiledSql { private static final String TAG = "SQLiteCompiledSql"; /** The database this program is compiled against. */ - /* package */ final SQLiteDatabase mDatabase; + /* package */ SQLiteDatabase mDatabase; /** * Native linkage, do not modify. This comes from the database. */ - /* package */ final int nHandle; + /* package */ int nHandle = 0; /** * Native linkage, do not modify. When non-0 this holds a reference to a valid @@ -47,53 +46,52 @@ import android.util.Log; */ /* package */ int nStatement = 0; - /** the following 3 members are for debugging purposes */ - private final String mSqlStmt; - private final Throwable mStackTrace; - private int nState = 0; - /** values the above member can take */ - private static final int NSTATE_CACHEABLE = 64; - private static final int NSTATE_IN_CACHE = 32; - private static final int NSTATE_INUSE = 16; - private static final int NSTATE_INUSE_RESETMASK = 0x0f; - /* package */ static final int NSTATE_CLOSE_NOOP = 1; - private static final int NSTATE_EVICTED_FROM_CACHE = 2; - /* package */ static final int NSTATE_CACHE_DEALLOC = 4; - private static final int NSTATE_IN_FINALIZER_Q = 8; + /** the following are for debugging purposes */ + private String mSqlStmt = null; + private Throwable mStackTrace = null; - private SQLiteCompiledSql(SQLiteDatabase db, String sql) { - db.verifyDbIsOpen(); - db.verifyLockOwner(); + /** when in cache and is in use, this member is set */ + private boolean mInUse = false; + + /* package */ SQLiteCompiledSql(SQLiteDatabase db, String sql) { + if (!db.isOpen()) { + throw new IllegalStateException("database " + db.getPath() + " already closed"); + } mDatabase = db; mSqlStmt = sql; mStackTrace = new DatabaseObjectNotClosedException().fillInStackTrace(); - nHandle = db.mNativeHandle; - native_compile(sql); + this.nHandle = db.mNativeHandle; + compile(sql, true); } - /* package */ static SQLiteCompiledSql get(SQLiteDatabase db, String sql, int type) { - // only CRUD statements are cached. - if (type != DatabaseUtils.STATEMENT_SELECT && type != DatabaseUtils.STATEMENT_UPDATE) { - return new SQLiteCompiledSql(db, sql); + /** + * Compiles the given SQL into a SQLite byte code program using sqlite3_prepare_v2(). If + * this method has been called previously without a call to close and forCompilation is set + * to false the previous compilation will be used. Setting forceCompilation to true will + * always re-compile the program and should be done if you pass differing SQL strings to this + * method. + * + *

Note: this method acquires the database lock.

+ * + * @param sql the SQL string to compile + * @param forceCompilation forces the SQL to be recompiled in the event that there is an + * existing compiled SQL program already around + */ + private void compile(String sql, boolean forceCompilation) { + mDatabase.verifyLockOwner(); + // Only compile if we don't have a valid statement already or the caller has + // explicitly requested a recompile. + if (forceCompilation) { + // Note that the native_compile() takes care of destroying any previously + // existing programs before it compiles. + native_compile(sql); } - // the given SQL statement is cacheable. - SQLiteCompiledSql stmt = db.mCache.getCompiledStatementForSql(sql); - if (stmt != null) { - return stmt; - } - // either the entry doesn't exist in cache or the one in cache is currently in use. - // try to add it to cache and let cache worry about what copy to keep - stmt = new SQLiteCompiledSql(db, sql); - stmt.nState |= NSTATE_CACHEABLE | - ((db.mCache.addToCompiledQueries(sql, stmt)) ? NSTATE_IN_CACHE : 0); - return stmt; } - /* package */ synchronized void releaseFromDatabase() { + /* package */ void releaseSqlStatement() { // Note that native_finalize() checks to make sure that nStatement is // non-null before destroying it. if (nStatement != 0) { - nState |= NSTATE_IN_FINALIZER_Q; mDatabase.finalizeStatementLater(nStatement); nStatement = 0; } @@ -103,47 +101,20 @@ import android.util.Log; * returns true if acquire() succeeds. false otherwise. */ /* package */ synchronized boolean acquire() { - if ((nState & NSTATE_INUSE) > 0 ) { - // this object is already in use + if (mInUse) { + // someone already has acquired it. return false; } - nState |= NSTATE_INUSE; + mInUse = true; return true; } - /* package */ synchronized void free() { - nState &= NSTATE_INUSE_RESETMASK; + /* package */ synchronized void release() { + mInUse = false; } - /* package */ void release(int type) { - if (type != DatabaseUtils.STATEMENT_SELECT && type != DatabaseUtils.STATEMENT_UPDATE) { - // it is not cached. release its memory from the database. - releaseFromDatabase(); - return; - } - // if in cache, reset its in-use flag - if (!mDatabase.mCache.releaseBackToCache(this)) { - // not in cache. release its memory from the database. - releaseFromDatabase(); - } - } - - /* package */ synchronized void releaseIfNotInUse() { - nState |= NSTATE_EVICTED_FROM_CACHE; - // if it is not in use, release its memory from the database - if ((nState & NSTATE_INUSE) == 0) { - releaseFromDatabase(); - } - } - - // only for testing purposes /* package */ synchronized boolean isInUse() { - return (nState & NSTATE_INUSE) > 0; - } - - /* package */ synchronized SQLiteCompiledSql setState(int val) { - nState = nState & val; - return this; // for chaining + return mInUse; } /** @@ -154,18 +125,11 @@ import android.util.Log; try { if (nStatement == 0) return; // finalizer should NEVER get called - // but if the database itself is not closed and is GC'ed, then - // all sub-objects attached to the database could end up getting GC'ed too. - // in that case, don't print any warning. - if ((nState & NSTATE_INUSE) == 0) { - // no need to print warning - } else { - int len = mSqlStmt.length(); - Log.w(TAG, "Releasing SQL statement in finalizer. " + - "Could be due to close() not being called on the cursor or on the database. " + - toString(), mStackTrace); - } - releaseFromDatabase(); + int len = mSqlStmt.length(); + Log.w(TAG, "Releasing statement in a finalizer. Please ensure " + + "that you explicitly call close() on your cursor: " + + mSqlStmt.substring(0, (len > 100) ? 100 : len), mStackTrace); + releaseSqlStatement(); } finally { super.finalize(); } @@ -176,27 +140,6 @@ import android.util.Log; StringBuilder buff = new StringBuilder(); buff.append(" nStatement="); buff.append(nStatement); - if ((nState & NSTATE_CACHEABLE) > 0) { - buff.append(",cacheable"); - } - if ((nState & NSTATE_IN_CACHE) > 0) { - buff.append(",cached"); - } - if ((nState & NSTATE_INUSE) > 0) { - buff.append(",in_use"); - } - if ((nState & NSTATE_CLOSE_NOOP) > 0) { - buff.append(",no_op_close"); - } - if ((nState & NSTATE_EVICTED_FROM_CACHE) > 0) { - buff.append(",evicted_from_cache"); - } - if ((nState & NSTATE_CACHE_DEALLOC) > 0) { - buff.append(",dealloc_cache"); - } - if ((nState & NSTATE_IN_FINALIZER_Q) > 0) { - buff.append(",in dbFInalizerQ"); - } buff.append(", db="); buff.append(mDatabase.getPath()); buff.append(", db_connectionNum="); diff --git a/core/java/android/database/sqlite/SQLiteDatabase.java b/core/java/android/database/sqlite/SQLiteDatabase.java index 70bd3d8304787..6937da01f6458 100644 --- a/core/java/android/database/sqlite/SQLiteDatabase.java +++ b/core/java/android/database/sqlite/SQLiteDatabase.java @@ -41,6 +41,7 @@ import java.lang.ref.WeakReference; import java.util.ArrayList; import java.util.HashMap; import java.util.Iterator; +import java.util.LinkedHashMap; import java.util.Locale; import java.util.Map; import java.util.Random; @@ -259,11 +260,60 @@ public class SQLiteDatabase extends SQLiteClosable { private final WeakHashMap mPrograms; /** - * Absolute max value that can be set by {@link #setMaxSqlCacheSize(int)}. - * Size of each prepared-statement is between 1K - 6K, depending on the complexity of the + * for each instance of this class, a LRU cache is maintained to store + * the compiled query statement ids returned by sqlite database. + * key = SQL statement with "?" for bind args + * value = {@link SQLiteCompiledSql} + * If an application opens the database and keeps it open during its entire life, then + * there will not be an overhead of compilation of SQL statements by sqlite. + * + * why is this cache NOT static? because sqlite attaches compiledsql statements to the + * struct created when {@link SQLiteDatabase#openDatabase(String, CursorFactory, int)} is + * invoked. + * + * this cache has an upper limit of mMaxSqlCacheSize (settable by calling the method + * (@link #setMaxSqlCacheSize(int)}). + */ + // default statement-cache size per database connection ( = instance of this class) + private int mMaxSqlCacheSize = 25; + /* package */ final Map mCompiledQueries = + new LinkedHashMap(mMaxSqlCacheSize + 1, 0.75f, true) { + @Override + public boolean removeEldestEntry(Map.Entry eldest) { + // eldest = least-recently used entry + // if it needs to be removed to accommodate a new entry, + // close {@link SQLiteCompiledSql} represented by this entry, if not in use + // and then let it be removed from the Map. + // when this is called, the caller must be trying to add a just-compiled stmt + // to cache; i.e., caller should already have acquired database lock AND + // the lock on mCompiledQueries. do as assert of these two 2 facts. + verifyLockOwner(); + if (this.size() <= mMaxSqlCacheSize) { + // cache is not full. nothing needs to be removed + return false; + } + // cache is full. eldest will be removed. + SQLiteCompiledSql entry = eldest.getValue(); + if (!entry.isInUse()) { + // this {@link SQLiteCompiledSql} is not in use. release it. + entry.releaseSqlStatement(); + } + // return true, so that this entry is removed automatically by the caller. + return true; + } + }; + /** + * absolute max value that can be set by {@link #setMaxSqlCacheSize(int)} + * size of each prepared-statement is between 1K - 6K, depending on the complexity of the * SQL statement & schema. */ public static final int MAX_SQL_CACHE_SIZE = 100; + private int mCacheFullWarnings; + private static final int MAX_WARNINGS_ON_CACHESIZE_CONDITION = 1; + + /** maintain stats about number of cache hits and misses */ + private int mNumCacheHits; + private int mNumCacheMisses; /** Used to find out where this object was created in case it never got closed. */ private final Throwable mStackTrace; @@ -272,9 +322,6 @@ public class SQLiteDatabase extends SQLiteClosable { private static final String LOG_SLOW_QUERIES_PROPERTY = "db.log.slow_query_threshold"; private final int mSlowQueryThreshold; - /** the LRU cache */ - /* package */ final SQLiteCache mCache = new SQLiteCache(this); - /** stores the list of statement ids that need to be finalized by sqlite */ private final ArrayList mClosedStatementIds = new ArrayList(); @@ -1040,7 +1087,7 @@ public class SQLiteDatabase extends SQLiteClosable { * to be closed. sqlite doesn't let a database close if there are * any unfinalized statements - such as the compiled-sql objects in mCompiledQueries. */ - mCache.dealloc(); + deallocCachedSqlStatements(); Iterator> iter = mPrograms.entrySet().iterator(); while (iter.hasNext()) { @@ -2043,20 +2090,113 @@ public class SQLiteDatabase extends SQLiteClosable { } } + /* + * ============================================================================ + * + * The following methods deal with compiled-sql cache + * ============================================================================ + */ + /** + * Adds the given SQL and its compiled-statement-id-returned-by-sqlite to the + * cache of compiledQueries attached to 'this'. + *

+ * If there is already a {@link SQLiteCompiledSql} in compiledQueries for the given SQL, + * the new {@link SQLiteCompiledSql} object is NOT inserted into the cache (i.e.,the current + * mapping is NOT replaced with the new mapping). + */ + /* package */ void addToCompiledQueries(String sql, SQLiteCompiledSql compiledStatement) { + synchronized(mCompiledQueries) { + // don't insert the new mapping if a mapping already exists + if (mCompiledQueries.containsKey(sql)) { + return; + } + + if (mCompiledQueries.size() == mMaxSqlCacheSize) { + /* + * cache size of {@link #mMaxSqlCacheSize} is not enough for this app. + * log a warning. + * chances are it is NOT using ? for bindargs - or cachesize is too small. + */ + if (++mCacheFullWarnings == MAX_WARNINGS_ON_CACHESIZE_CONDITION) { + Log.w(TAG, "Reached MAX size for compiled-sql statement cache for database " + + getPath() + ". Use setMaxSqlCacheSize() to increase cachesize. "); + } + } + /* add the given SQLiteCompiledSql compiledStatement to cache. + * no need to worry about the cache size - because {@link #mCompiledQueries} + * self-limits its size to {@link #mMaxSqlCacheSize}. + */ + mCompiledQueries.put(sql, compiledStatement); + if (SQLiteDebug.DEBUG_SQL_CACHE) { + Log.v(TAG, "|adding_sql_to_cache|" + getPath() + "|" + + mCompiledQueries.size() + "|" + sql); + } + } + } + + /** package-level access for testing purposes */ + /* package */ void deallocCachedSqlStatements() { + synchronized (mCompiledQueries) { + for (SQLiteCompiledSql compiledSql : mCompiledQueries.values()) { + compiledSql.releaseSqlStatement(); + } + mCompiledQueries.clear(); + } + } + + /** + * From the compiledQueries cache, returns the compiled-statement-id for the given SQL. + * Returns null, if not found in the cache. + */ + /* package */ SQLiteCompiledSql getCompiledStatementForSql(String sql) { + SQLiteCompiledSql compiledStatement = null; + boolean cacheHit; + synchronized(mCompiledQueries) { + cacheHit = (compiledStatement = mCompiledQueries.get(sql)) != null; + } + if (cacheHit) { + mNumCacheHits++; + } else { + mNumCacheMisses++; + } + + if (SQLiteDebug.DEBUG_SQL_CACHE) { + Log.v(TAG, "|cache_stats|" + + getPath() + "|" + mCompiledQueries.size() + + "|" + mNumCacheHits + "|" + mNumCacheMisses + + "|" + cacheHit + "|" + sql); + } + return compiledStatement; + } + /** * Sets the maximum size of the prepared-statement cache for this database. * (size of the cache = number of compiled-sql-statements stored in the cache). *

- * Maximum cache size can ONLY be increased from its current size (default = 25). + * Maximum cache size can ONLY be increased from its current size (default = 10). * If this method is called with smaller size than the current maximum value, * then IllegalStateException is thrown. + *

+ * This method is thread-safe. * * @param cacheSize the size of the cache. can be (0 to {@link #MAX_SQL_CACHE_SIZE}) * @throws IllegalStateException if input cacheSize > {@link #MAX_SQL_CACHE_SIZE} or * the value set with previous setMaxSqlCacheSize() call. */ - public void setMaxSqlCacheSize(int cacheSize) { - mCache.setMaxSqlCacheSize(cacheSize); + public synchronized void setMaxSqlCacheSize(int cacheSize) { + if (cacheSize > MAX_SQL_CACHE_SIZE || cacheSize < 0) { + throw new IllegalStateException("expected value between 0 and " + MAX_SQL_CACHE_SIZE); + } else if (cacheSize < mMaxSqlCacheSize) { + throw new IllegalStateException("cannot set cacheSize to a value less than the value " + + "set with previous setMaxSqlCacheSize() call."); + } + mMaxSqlCacheSize = cacheSize; + } + + /* package */ boolean isSqlInStatementCache(String sql) { + synchronized (mCompiledQueries) { + return mCompiledQueries.containsKey(sql); + } } /* package */ void finalizeStatementLater(int id) { @@ -2212,19 +2352,17 @@ public class SQLiteDatabase extends SQLiteClosable { * * @param size the value the connection handle pool size should be set to. */ - public void setConnectionPoolSize(int size) { - synchronized(this) { - if (mConnectionPool == null) { - throw new IllegalStateException("connection pool not enabled"); - } - int i = mConnectionPool.getMaxPoolSize(); - if (size < i) { - throw new IllegalArgumentException( - "cannot set max pool size to a value less than the current max value(=" + - i + ")"); - } - mConnectionPool.setMaxPoolSize(size); + public synchronized void setConnectionPoolSize(int size) { + if (mConnectionPool == null) { + throw new IllegalStateException("connection pool not enabled"); } + int i = mConnectionPool.getMaxPoolSize(); + if (size < i) { + throw new IllegalArgumentException( + "cannot set max pool size to a value less than the current max value(=" + + i + ")"); + } + mConnectionPool.setMaxPoolSize(size); } /* package */ SQLiteDatabase createPoolConnection(short connectionNum) { @@ -2340,16 +2478,16 @@ public class SQLiteDatabase extends SQLiteClosable { } if (pageCount > 0) { dbStatsList.add(new DbStats(dbName, pageCount, db.getPageSize(), - lookasideUsed, db.mCache.getCacheHitNum(), - db.mCache.getCacheMissNum(), db.mCache.getCachesize())); + lookasideUsed, db.mNumCacheHits, db.mNumCacheMisses, + db.mCompiledQueries.size())); } } // if there are pooled connections, return the cache stats for them also. if (db.mConnectionPool != null) { for (SQLiteDatabase pDb : db.mConnectionPool.getConnectionList()) { dbStatsList.add(new DbStats("(pooled # " + pDb.mConnectionNum + ") " - + lastnode, 0, 0, 0, pDb.mCache.getCacheHitNum(), - pDb.mCache.getCacheMissNum(), pDb.mCache.getCachesize())); + + lastnode, 0, 0, 0, pDb.mNumCacheHits, pDb.mNumCacheMisses, + pDb.mCompiledQueries.size())); } } } catch (SQLiteException e) { diff --git a/core/java/android/database/sqlite/SQLiteProgram.java b/core/java/android/database/sqlite/SQLiteProgram.java index b3903693dfa44..c7c0c79a31649 100644 --- a/core/java/android/database/sqlite/SQLiteProgram.java +++ b/core/java/android/database/sqlite/SQLiteProgram.java @@ -110,6 +110,42 @@ public abstract class SQLiteProgram extends SQLiteClosable { } } + private void compileSql() { + // only cache CRUD statements + if (mStatementType != DatabaseUtils.STATEMENT_SELECT && + mStatementType != DatabaseUtils.STATEMENT_UPDATE) { + mCompiledSql = new SQLiteCompiledSql(mDatabase, mSql); + nStatement = mCompiledSql.nStatement; + // since it is not in the cache, no need to acquire() it. + return; + } + + mCompiledSql = mDatabase.getCompiledStatementForSql(mSql); + if (mCompiledSql == null) { + // create a new compiled-sql obj + mCompiledSql = new SQLiteCompiledSql(mDatabase, mSql); + + // add it to the cache of compiled-sqls + // but before adding it and thus making it available for anyone else to use it, + // make sure it is acquired by me. + mCompiledSql.acquire(); + mDatabase.addToCompiledQueries(mSql, mCompiledSql); + } else { + // it is already in compiled-sql cache. + // try to acquire the object. + if (!mCompiledSql.acquire()) { + int last = mCompiledSql.nStatement; + // the SQLiteCompiledSql in cache is in use by some other SQLiteProgram object. + // we can't have two different SQLiteProgam objects can't share the same + // CompiledSql object. create a new one. + // finalize it when I am done with it in "this" object. + mCompiledSql = new SQLiteCompiledSql(mDatabase, mSql); + // since it is not in the cache, no need to acquire() it. + } + } + nStatement = mCompiledSql.nStatement; + } + @Override protected void onAllReferencesReleased() { release(); @@ -127,7 +163,16 @@ public abstract class SQLiteProgram extends SQLiteClosable { if (mCompiledSql == null) { return; } - mCompiledSql.release(mStatementType); + synchronized(mDatabase.mCompiledQueries) { + if (!mDatabase.mCompiledQueries.containsValue(mCompiledSql)) { + // it is NOT in compiled-sql cache. i.e., responsibility of + // releasing this statement is on me. + mCompiledSql.releaseSqlStatement(); + } else { + // it is in compiled-sql cache. reset its CompiledSql#mInUse flag + mCompiledSql.release(); + } + } mCompiledSql = null; nStatement = 0; } @@ -288,9 +333,6 @@ public abstract class SQLiteProgram extends SQLiteClosable { synchronized (this) { mBindArgs = null; if (nHandle == 0 || !mDatabase.isOpen()) { - if (mCompiledSql != null) { - mCompiledSql.setState(SQLiteCompiledSql.NSTATE_CLOSE_NOOP); - } return; } releaseReference(); @@ -307,8 +349,7 @@ public abstract class SQLiteProgram extends SQLiteClosable { /* package */ synchronized void compileAndbindAllArgs() { if (nStatement == 0) { // SQL statement is not compiled yet. compile it now. - mCompiledSql = SQLiteCompiledSql.get(mDatabase, mSql, mStatementType); - nStatement = mCompiledSql.nStatement; + compileSql(); } if (mBindArgs == null) { return; diff --git a/core/tests/coretests/src/android/database/sqlite/SQLiteCacheTest.java b/core/tests/coretests/src/android/database/sqlite/SQLiteCacheTest.java deleted file mode 100644 index 245981531c83b..0000000000000 --- a/core/tests/coretests/src/android/database/sqlite/SQLiteCacheTest.java +++ /dev/null @@ -1,176 +0,0 @@ -/* - * Copyright (C) 2010 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package android.database.sqlite; - - -import android.content.Context; -import android.database.DatabaseUtils; -import android.database.sqlite.SQLiteDatabase; -import android.database.sqlite.SQLiteDatabaseTest.ClassToTestSqlCompilationAndCaching; -import android.test.AndroidTestCase; -import android.test.suitebuilder.annotation.SmallTest; - -import java.io.File; -import java.util.ArrayList; - -public class SQLiteCacheTest extends AndroidTestCase { - private SQLiteDatabase mDatabase; - private File mDatabaseFile; - private static final String TABLE_NAME = "testCache"; - private SQLiteCache mCache; - - @Override - protected void setUp() throws Exception { - super.setUp(); - - File dbDir = getContext().getDir(this.getClass().getName(), Context.MODE_PRIVATE); - mDatabaseFile = new File(dbDir, "test.db"); - if (mDatabaseFile.exists()) { - mDatabaseFile.delete(); - } - mDatabase = SQLiteDatabase.openOrCreateDatabase(mDatabaseFile.getPath(), null); - assertNotNull(mDatabase); - mCache = mDatabase.mCache; - assertNotNull(mCache); - - // create a test table - mDatabase.execSQL("CREATE TABLE " + TABLE_NAME + " (i int, j int);"); - } - - @Override - protected void tearDown() throws Exception { - mDatabase.lock(); - // flush the above statement from cache and close all the pending statements to be released - mCache.dealloc(); - mDatabase.closePendingStatements(); - mDatabase.unlock(); - assertEquals(0, mDatabase.getQueuedUpStmtList().size()); - mDatabase.close(); - mDatabaseFile.delete(); - super.tearDown(); - } - - /** - * do N+1 queries - and when the 0th entry is removed from LRU cache due to the - * insertion of (N+1)th entry, make sure 0th entry is closed - */ - @SmallTest - public void testLruCaching() { - mDatabase.disableWriteAheadLogging(); - // set cache size - int N = 25; - mDatabase.setMaxSqlCacheSize(N); - - ArrayList stmtObjs = new ArrayList(); - ArrayList sqlStrings = new ArrayList(); - int stmt0 = 0; - for (int i = 0; i < N+1; i++) { - String s = "insert into " + TABLE_NAME + " values(" + i + ",?);"; - sqlStrings.add(s); - ClassToTestSqlCompilationAndCaching c = - ClassToTestSqlCompilationAndCaching.create(mDatabase, s); - int n = c.getSqlStatementId(); - stmtObjs.add(i, n); - if (i == 0) { - // save the statementId of this obj. we want to make sure it is thrown out of - // the cache at the end of this test. - stmt0 = n; - } - c.close(); - } - assertEquals(N, mCache.getCachesize()); - // is 0'th entry out of the cache? it should be in the list of statementIds - // corresponding to the pre-compiled sql statements to be finalized. - assertTrue(mDatabase.getQueuedUpStmtList().contains(stmt0)); - for (int i = 1; i < N+1; i++) { - SQLiteCompiledSql compSql = - mDatabase.mCache.getCompiledStatementForSql(sqlStrings.get(i)); - assertNotNull(compSql); - assertTrue(stmtObjs.contains(compSql.nStatement)); - } - assertEquals(N, mCache.getCachesize()); - - } - - /** - * Cache should only have Select / Insert / Update / Delete / Replace. - */ - @SmallTest - public void testCachingOfCRUDstatementsOnly() { - ClassToTestSqlCompilationAndCaching c; - // do some CRUD sql - int crudSqlNum = 7 * 4; - mDatabase.setMaxSqlCacheSize(crudSqlNum); - for (int i = 0; i < crudSqlNum / 4; i++) { - c= ClassToTestSqlCompilationAndCaching.create(mDatabase, - "insert into " + TABLE_NAME + " values(" + i + ",?);"); - c.close(); - c = ClassToTestSqlCompilationAndCaching.create(mDatabase, - "update " + TABLE_NAME + " set i = " + i); - c.close(); - c = ClassToTestSqlCompilationAndCaching.create(mDatabase, - "select * from " + TABLE_NAME + " where i = " + i); - c.close(); - c= ClassToTestSqlCompilationAndCaching.create(mDatabase, - "delete from " + TABLE_NAME + " where i = " + i); - c.close(); - } - // do some non-CRUD sql - c = ClassToTestSqlCompilationAndCaching.create(mDatabase, - "create table j (i int);"); - c.close(); - c = ClassToTestSqlCompilationAndCaching.create(mDatabase, - "pragma database_list;"); - c.close(); - c = ClassToTestSqlCompilationAndCaching.create(mDatabase, - "begin transaction;"); - c.close(); - c = ClassToTestSqlCompilationAndCaching.create(mDatabase, - "commit;"); - c.close(); - c = ClassToTestSqlCompilationAndCaching.create(mDatabase, - "attach database \"blah\" as blah_db;"); - c.close(); - // cache size should be crudSqlNum - assertEquals(crudSqlNum, mCache.getCachesize()); - // everything in the cache should be a CRUD sql statement - for (String s : mCache.getKeys()) { - int type = DatabaseUtils.getSqlStatementType(s); - assertTrue(type == DatabaseUtils.STATEMENT_SELECT || - type == DatabaseUtils.STATEMENT_UPDATE); - } - } - - /** - * calling SQLiteCache.getCompiledStatementForSql() should reserve the cached-entry - * for the caller, if the entry exists - */ - @SmallTest - public void testGetShouldReserveEntry() { - String sql = "insert into " + TABLE_NAME + " values(1,?);"; - ClassToTestSqlCompilationAndCaching c = - ClassToTestSqlCompilationAndCaching.create(mDatabase, sql); - c.close(); - SQLiteCompiledSql compiledSql = mCache.getCompiledStatementForSql(sql); - assertNotNull(compiledSql); - assertTrue(compiledSql.isInUse()); - // get entry for the same sql again. should get null and a warning in log - assertNull(mCache.getCompiledStatementForSql(sql)); - compiledSql.free(); - assertFalse(compiledSql.isInUse()); - } -} diff --git a/core/tests/coretests/src/android/database/sqlite/SQLiteCompiledSqlTest.java b/core/tests/coretests/src/android/database/sqlite/SQLiteCompiledSqlTest.java deleted file mode 100644 index 1606cf6bfd9a0..0000000000000 --- a/core/tests/coretests/src/android/database/sqlite/SQLiteCompiledSqlTest.java +++ /dev/null @@ -1,99 +0,0 @@ -/* - * Copyright (C) 2010 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package android.database.sqlite; - - -import android.content.Context; -import android.database.sqlite.SQLiteDatabase; -import android.database.sqlite.SQLiteDatabaseTest.ClassToTestSqlCompilationAndCaching; -import android.test.AndroidTestCase; -import android.test.suitebuilder.annotation.SmallTest; - -import java.io.File; - -public class SQLiteCompiledSqlTest extends AndroidTestCase { - private SQLiteDatabase mDatabase; - private File mDatabaseFile; - private static final String TABLE_NAME = "testCache"; - private SQLiteCache mCache; - - @Override - protected void setUp() throws Exception { - super.setUp(); - - File dbDir = getContext().getDir(this.getClass().getName(), Context.MODE_PRIVATE); - mDatabaseFile = new File(dbDir, "sqlitecursor_test.db"); - if (mDatabaseFile.exists()) { - mDatabaseFile.delete(); - } - mDatabase = SQLiteDatabase.openOrCreateDatabase(mDatabaseFile.getPath(), null); - assertNotNull(mDatabase); - mCache = mDatabase.mCache; - assertNotNull(mCache); - - // create a test table - mDatabase.execSQL("CREATE TABLE " + TABLE_NAME + " (i int, j int);"); - } - - @Override - protected void tearDown() throws Exception { - mDatabase.close(); - mDatabaseFile.delete(); - super.tearDown(); - } - - /** - * releaseIfNotInUse() should release only if it is not in use - */ - @SmallTest - public void testReleaseIfNotInUse() { - ClassToTestSqlCompilationAndCaching c; - // do some CRUD sql - int crudSqlNum = 20 * 4; - mDatabase.setMaxSqlCacheSize(crudSqlNum); - for (int i = 0; i < crudSqlNum / 4; i++) { - c = ClassToTestSqlCompilationAndCaching.create(mDatabase, - "insert into " + TABLE_NAME + " values(" + i + ",?);"); - c.close(); - c = ClassToTestSqlCompilationAndCaching.create(mDatabase, - "update " + TABLE_NAME + " set i = " + i); - c.close(); - c = ClassToTestSqlCompilationAndCaching.create(mDatabase, - "select * from " + TABLE_NAME + " where i = " + i); - c.close(); - c = ClassToTestSqlCompilationAndCaching.create(mDatabase, - "delete from " + TABLE_NAME + " where i = " + i); - c.close(); - } - assertEquals(crudSqlNum, mCache.getCachesize()); - String sql = "insert into " + TABLE_NAME + " values(1,?);"; - SQLiteCompiledSql compiledSql = mCache.getCompiledStatementForSql(sql); - assertNotNull(compiledSql); - assertTrue(compiledSql.isInUse()); - // the object is in use. try to release it - compiledSql.releaseIfNotInUse(); - // compiledSql should not be released yet - int stmtId = compiledSql.nStatement; - assertTrue(stmtId > 0); - // free the object and call releaseIfNotInUse() again - and it should work this time - compiledSql.free(); - assertFalse(compiledSql.isInUse()); - compiledSql.releaseIfNotInUse(); - assertEquals(0, compiledSql.nStatement); - assertTrue(mDatabase.getQueuedUpStmtList().contains(stmtId)); - } -} diff --git a/core/tests/coretests/src/android/database/sqlite/SQLiteDatabaseTest.java b/core/tests/coretests/src/android/database/sqlite/SQLiteDatabaseTest.java index 3249cb63f45f9..86eda710266f6 100644 --- a/core/tests/coretests/src/android/database/sqlite/SQLiteDatabaseTest.java +++ b/core/tests/coretests/src/android/database/sqlite/SQLiteDatabaseTest.java @@ -447,6 +447,42 @@ public class SQLiteDatabaseTest extends AndroidTestCase { } } + @SmallTest + public void testLruCachingOfSqliteCompiledSqlObjs() { + createTableAndClearCache(); + // set cache size + int N = SQLiteDatabase.MAX_SQL_CACHE_SIZE; + mDatabase.setMaxSqlCacheSize(N); + + // do N+1 queries - and when the 0th entry is removed from LRU cache due to the + // insertion of (N+1)th entry, make sure 0th entry is closed + ArrayList stmtObjs = new ArrayList(); + ArrayList sqlStrings = new ArrayList(); + int stmt0 = 0; + for (int i = 0; i < N+1; i++) { + String s = "insert into test values(" + i + ",?);"; + sqlStrings.add(s); + ClassToTestSqlCompilationAndCaching c = + ClassToTestSqlCompilationAndCaching.create(mDatabase, s); + int n = c.getSqlStatementId(); + stmtObjs.add(i, n); + if (i == 0) { + // save the statementId of this obj. we want to make sure it is thrown out of + // the cache at the end of this test. + stmt0 = n; + } + c.close(); + } + // is 0'th entry out of the cache? it should be in the list of statementIds + // corresponding to the pre-compiled sql statements to be finalized. + assertTrue(mDatabase.getQueuedUpStmtList().contains(stmt0)); + for (int i = 1; i < N+1; i++) { + SQLiteCompiledSql compSql = mDatabase.getCompiledStatementForSql(sqlStrings.get(i)); + assertNotNull(compSql); + assertTrue(stmtObjs.contains(compSql.nStatement)); + } + } + @MediumTest public void testDbCloseReleasingAllCachedSql() { mDatabase.execSQL("CREATE TABLE test (_id INTEGER PRIMARY KEY, text1 TEXT, text2 TEXT, " + @@ -467,7 +503,7 @@ public class SQLiteDatabaseTest extends AndroidTestCase { mDatabase.enableWriteAheadLogging(); mDatabase.lock(); // flush the above statement from cache and close all the pending statements to be released - mDatabase.mCache.dealloc(); + mDatabase.deallocCachedSqlStatements(); mDatabase.closePendingStatements(); mDatabase.unlock(); assertEquals(0, mDatabase.getQueuedUpStmtList().size()); diff --git a/core/tests/coretests/src/android/database/sqlite/SQLiteStatementTest.java b/core/tests/coretests/src/android/database/sqlite/SQLiteStatementTest.java index bdd6d5cc57e45..217545f9cf6c0 100644 --- a/core/tests/coretests/src/android/database/sqlite/SQLiteStatementTest.java +++ b/core/tests/coretests/src/android/database/sqlite/SQLiteStatementTest.java @@ -53,12 +53,6 @@ public class SQLiteStatementTest extends AndroidTestCase { * Start 2 threads to repeatedly execute the above SQL statement. * Even though 2 threads are executing the same SQL, they each should get their own copy of * prepared SQL statement id and there SHOULD NOT be an error from sqlite or android. - *

- * This method will produce a lot of the following warnings: - * Possible bug: Either using the same SQL in 2 threads at the same time, or - * previous instance of this SQL statement was never close()d. - * That is expected behavior. - * * @throws InterruptedException thrown if the test threads started by this test are interrupted */ @LargeTest From 5c86c06e66603b8d8344550b229fc83602fb05a8 Mon Sep 17 00:00:00 2001 From: android-build SharedAccount Date: Wed, 15 Sep 2010 09:13:06 -0700 Subject: [PATCH 06/90] fix merge issue Change-Id: I909993655f1845546cf9bb97254bffd696f90555 --- .../database/sqlite/SQLiteDatabase.java | 42 ++++++------------- 1 file changed, 12 insertions(+), 30 deletions(-) diff --git a/core/java/android/database/sqlite/SQLiteDatabase.java b/core/java/android/database/sqlite/SQLiteDatabase.java index da2e5af25155e..420070188d080 100644 --- a/core/java/android/database/sqlite/SQLiteDatabase.java +++ b/core/java/android/database/sqlite/SQLiteDatabase.java @@ -2185,25 +2185,6 @@ public class SQLiteDatabase extends SQLiteClosable { * @throws IllegalStateException if input cacheSize > {@link #MAX_SQL_CACHE_SIZE} or * the value set with previous setMaxSqlCacheSize() call. */ -<<<<<<< HEAD:core/java/android/database/sqlite/SQLiteDatabase.java - public synchronized void setMaxSqlCacheSize(int cacheSize) { - if (cacheSize > MAX_SQL_CACHE_SIZE || cacheSize < 0) { - throw new IllegalStateException("expected value between 0 and " + MAX_SQL_CACHE_SIZE); - } else if (cacheSize < mMaxSqlCacheSize) { - throw new IllegalStateException("cannot set cacheSize to a value less than the value " + - "set with previous setMaxSqlCacheSize() call."); - } - mMaxSqlCacheSize = cacheSize; - } - - /* package */ boolean isSqlInStatementCache(String sql) { - synchronized (mCompiledQueries) { - return mCompiledQueries.containsKey(sql); - } -||||||| - public void setMaxSqlCacheSize(int cacheSize) { - mCache.setMaxSqlCacheSize(cacheSize); -======= public void setMaxSqlCacheSize(int cacheSize) { synchronized(this) { if (cacheSize > MAX_SQL_CACHE_SIZE || cacheSize < 0) { @@ -2220,7 +2201,6 @@ public class SQLiteDatabase extends SQLiteClosable { synchronized (mCompiledQueries) { return mCompiledQueries.containsKey(sql); } ->>>>>>> master:core/java/android/database/sqlite/SQLiteDatabase.java } /* package */ void finalizeStatementLater(int id) { @@ -2376,17 +2356,19 @@ public class SQLiteDatabase extends SQLiteClosable { * * @param size the value the connection handle pool size should be set to. */ - public synchronized void setConnectionPoolSize(int size) { - if (mConnectionPool == null) { - throw new IllegalStateException("connection pool not enabled"); + public void setConnectionPoolSize(int size) { + synchronized(this) { + if (mConnectionPool == null) { + throw new IllegalStateException("connection pool not enabled"); + } + int i = mConnectionPool.getMaxPoolSize(); + if (size < i) { + throw new IllegalArgumentException( + "cannot set max pool size to a value less than the current max value(=" + + i + ")"); + } + mConnectionPool.setMaxPoolSize(size); } - int i = mConnectionPool.getMaxPoolSize(); - if (size < i) { - throw new IllegalArgumentException( - "cannot set max pool size to a value less than the current max value(=" + - i + ")"); - } - mConnectionPool.setMaxPoolSize(size); } /* package */ SQLiteDatabase createPoolConnection(short connectionNum) { From 25e9dd7467fced2c1d64ae1b35fae73038c51467 Mon Sep 17 00:00:00 2001 From: Sriram Raman Date: Wed, 15 Sep 2010 13:52:31 -0400 Subject: [PATCH 07/90] update current.xml Change-Id: I14bdbb783433196fd116704e59e31f682bce56f2 --- api/current.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/api/current.xml b/api/current.xml index 9b44e1e0c78a9..a57ba84da37b8 100644 --- a/api/current.xml +++ b/api/current.xml @@ -65918,7 +65918,7 @@ return="void" abstract="false" native="false" - synchronized="true" + synchronized="false" static="false" final="false" deprecated="not deprecated" @@ -65957,7 +65957,7 @@ return="void" abstract="false" native="false" - synchronized="true" + synchronized="false" static="false" final="false" deprecated="not deprecated" From ad7466b504e81ae613ebb71e74c56c66db4f3c2f Mon Sep 17 00:00:00 2001 From: Jeff Brown Date: Thu, 16 Sep 2010 12:31:46 -0700 Subject: [PATCH 08/90] Fix input dispatcher regression on launcher drag&drop. Change-Id: I40e937bd712cd2ed6cceac95dfd1b8c8e070724f --- libs/ui/InputDispatcher.cpp | 79 ++++++++++++++----------------------- 1 file changed, 30 insertions(+), 49 deletions(-) diff --git a/libs/ui/InputDispatcher.cpp b/libs/ui/InputDispatcher.cpp index 3b3c4831798e2..0524ea43a7f81 100644 --- a/libs/ui/InputDispatcher.cpp +++ b/libs/ui/InputDispatcher.cpp @@ -776,6 +776,9 @@ void InputDispatcher::resumeAfterTargetsNotReadyTimeoutLocked(nsecs_t newTimeout // Give up. mInputTargetWaitTimeoutExpired = true; + // Release the touch target. + releaseTouchedWindowLocked(); + // Input state will not be realistic. Mark it out of sync. ssize_t connectionIndex = getConnectionIndexLocked(inputChannel); if (connectionIndex >= 0) { @@ -2157,9 +2160,8 @@ void InputDispatcher::setInputWindows(const Vector& inputWindows) { { // acquire lock AutoMutex _l(mLock); - sp oldFocusedWindowChannel = mFocusedWindow - ? mFocusedWindow->inputChannel : NULL; - int32_t oldFocusedWindowLayer = mFocusedWindow ? mFocusedWindow->layer : -1; + // Clear old window pointers but remember their associated channels. + mFocusedWindow = NULL; sp touchedWindowChannel; if (mTouchedWindow) { @@ -2173,11 +2175,11 @@ void InputDispatcher::setInputWindows(const Vector& inputWindows) { } mTouchedWallpaperWindows.clear(); } - - mFocusedWindow = NULL; mWallpaperWindows.clear(); - mWindows.clear(); + + // Loop over new windows and rebuild the necessary window pointers for + // tracking focus and touch. mWindows.appendVector(inputWindows); size_t numWindows = mWindows.size(); @@ -2201,41 +2203,8 @@ void InputDispatcher::setInputWindows(const Vector& inputWindows) { mTouchedWindow = window; } } - mTempTouchedWallpaperChannels.clear(); - bool preempt = false; - if (mFocusedWindow - && mFocusedWindow->inputChannel != oldFocusedWindowChannel - && mFocusedWindow->canReceiveKeys) { - // If the new input focus is an error window or appears above the current - // input focus, drop the current touched window so that we can start - // delivering events to the new input focus as soon as possible. - if (mFocusedWindow->layoutParamsFlags & InputWindow::FLAG_SYSTEM_ERROR) { -#if DEBUG_FOCUS - LOGD("Preempting: New SYSTEM_ERROR window; resetting state"); -#endif - preempt = true; - } else if (oldFocusedWindowChannel.get() != NULL - && mFocusedWindow->layer > oldFocusedWindowLayer) { -#if DEBUG_FOCUS - LOGD("Preempting: Transferring focus to new window at higher layer: " - "old win layer=%d, new win layer=%d", - oldFocusedWindowLayer, mFocusedWindow->layer); -#endif - preempt = true; - } - } - if (mTouchedWindow && ! mTouchedWindow->visible) { -#if DEBUG_FOCUS - LOGD("Preempting: Touched window became invisible."); -#endif - preempt = true; - } - if (preempt) { - releaseTouchedWindowLocked(); - } - #if DEBUG_FOCUS logDispatchStateLocked(); #endif @@ -2310,7 +2279,17 @@ void InputDispatcher::setInputDispatchMode(bool enabled, bool frozen) { void InputDispatcher::logDispatchStateLocked() { String8 dump; dumpDispatchStateLocked(dump); - LOGD("%s", dump.string()); + + char* text = dump.lockBuffer(dump.size()); + char* start = text; + while (*start != '\0') { + char* end = strchr(start, '\n'); + if (*end == '\n') { + *(end++) = '\0'; + } + LOGD("%s", start); + start = end; + } } void InputDispatcher::dumpDispatchStateLocked(String8& dump) { @@ -2324,28 +2303,30 @@ void InputDispatcher::dumpDispatchStateLocked(String8& dump) { } else { dump.append(" focusedApplication: \n"); } - dump.appendFormat(" focusedWindow: '%s'\n", - mFocusedWindow != NULL ? mFocusedWindow->inputChannel->getName().string() : ""); - dump.appendFormat(" touchedWindow: '%s', touchDown=%d\n", - mTouchedWindow != NULL ? mTouchedWindow->inputChannel->getName().string() : "", + dump.appendFormat(" focusedWindow: name='%s'\n", + mFocusedWindow != NULL ? mFocusedWindow->name.string() : ""); + dump.appendFormat(" touchedWindow: name='%s', touchDown=%d\n", + mTouchedWindow != NULL ? mTouchedWindow->name.string() : "", mTouchDown); for (size_t i = 0; i < mTouchedWallpaperWindows.size(); i++) { - dump.appendFormat(" touchedWallpaperWindows[%d]: '%s'\n", - i, mTouchedWallpaperWindows[i]->inputChannel->getName().string()); + dump.appendFormat(" touchedWallpaperWindows[%d]: name='%s'\n", + i, mTouchedWallpaperWindows[i]->name.string()); } for (size_t i = 0; i < mWindows.size(); i++) { - dump.appendFormat(" windows[%d]: '%s', paused=%s, hasFocus=%s, hasWallpaper=%s, " - "visible=%s, flags=0x%08x, type=0x%08x, " + dump.appendFormat(" windows[%d]: name='%s', paused=%s, hasFocus=%s, hasWallpaper=%s, " + "visible=%s, canReceiveKeys=%s, flags=0x%08x, type=0x%08x, layer=%d, " "frame=[%d,%d][%d,%d], " "visibleFrame=[%d,%d][%d,%d], " "touchableArea=[%d,%d][%d,%d], " "ownerPid=%d, ownerUid=%d, dispatchingTimeout=%0.3fms\n", - i, mWindows[i].inputChannel->getName().string(), + i, mWindows[i].name.string(), toString(mWindows[i].paused), toString(mWindows[i].hasFocus), toString(mWindows[i].hasWallpaper), toString(mWindows[i].visible), + toString(mWindows[i].canReceiveKeys), mWindows[i].layoutParamsFlags, mWindows[i].layoutParamsType, + mWindows[i].layer, mWindows[i].frameLeft, mWindows[i].frameTop, mWindows[i].frameRight, mWindows[i].frameBottom, mWindows[i].visibleFrameLeft, mWindows[i].visibleFrameTop, From fb3aa3716cabf683b61a682ea92e6577505973df Mon Sep 17 00:00:00 2001 From: Adam Powell Date: Mon, 20 Sep 2010 11:23:56 -0700 Subject: [PATCH 09/90] Text selection anchors changed to use windows Manually cherry-picked Change-Id: Id080dfad0e2f324fef3a5175abc78f76c8bad4c8 --- api/current.xml | 150 +---- .../text/method/ArrowKeyMovementMethod.java | 2 + core/java/android/view/View.java | 57 -- core/java/android/view/ViewGroup.java | 100 +--- core/java/android/view/ViewParent.java | 7 - core/java/android/view/ViewRoot.java | 18 - core/java/android/widget/PopupWindow.java | 1 + core/java/android/widget/TextView.java | 533 +++++++----------- core/res/res/values/attrs.xml | 4 + core/res/res/values/public.xml | 1 + core/res/res/values/styles.xml | 11 + core/res/res/values/themes.xml | 1 + 12 files changed, 244 insertions(+), 641 deletions(-) diff --git a/api/current.xml b/api/current.xml index 27a17e616d45c..1781da61ac952 100644 --- a/api/current.xml +++ b/api/current.xml @@ -6268,17 +6268,6 @@ visibility="public" > - - + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Warning: Views that use this feature should take care to disable/enable overlay - * appropriately when they are attached/detached from their window. All overlays should be - * disabled when detached. - * - * @param enabled true if overlay drawing should be enabled for this view, false otherwise - * - * @see #onDrawOverlay(Canvas) - * - * @hide - */ - protected void setOverlayEnabled(boolean enabled) { - final boolean oldValue = (mPrivateFlags & HAS_OVERLAY) == HAS_OVERLAY; - mPrivateFlags = (mPrivateFlags & ~HAS_OVERLAY) | (enabled ? HAS_OVERLAY : 0); - if (enabled != oldValue) { - final ViewParent parent = getParent(); - if (parent != null) { - try { - parent.childOverlayStateChanged(this); - } catch (AbstractMethodError e) { - Log.e(VIEW_LOG_TAG, "Could not propagate hasOverlay state", e); - } - } - } - } - - /** - * @return true if this View has an overlay enabled. - * - * @see #setOverlayEnabled(boolean) - * @see #onDrawOverlay(Canvas) - * - * @hide - */ - public boolean isOverlayEnabled() { - return (mPrivateFlags & HAS_OVERLAY) == HAS_OVERLAY; - } - - /** - * Override this method to draw on an overlay layer above all other views in the window - * after the standard drawing pass is complete. This allows a view to draw outside its - * normal boundaries. - * @hide - */ - public void onDrawOverlay(Canvas canvas) { - } - private void resetPressedState() { if ((mViewFlags & ENABLED_MASK) == DISABLED) { return; diff --git a/core/java/android/view/ViewGroup.java b/core/java/android/view/ViewGroup.java index 3db4857402659..2b92e87258123 100644 --- a/core/java/android/view/ViewGroup.java +++ b/core/java/android/view/ViewGroup.java @@ -244,11 +244,6 @@ public abstract class ViewGroup extends View implements ViewParent, ViewManager */ protected static final int FLAG_DISALLOW_INTERCEPT = 0x80000; - /** - * When set, at least one child of this ViewGroup will return true from hasOverlay. - */ - private static final int FLAG_CHILD_HAS_OVERLAY = 0x100000; - /** * When set, this ViewGroup will split MotionEvents to multiple child Views when appropriate. */ @@ -910,33 +905,6 @@ public abstract class ViewGroup extends View implements ViewParent, ViewManager final View[] children = mChildren; final int count = mChildrenCount; - // Check for children with overlays first. They don't rely on hit rects to determine - // if they can accept a new touch event. - if ((mGroupFlags & FLAG_CHILD_HAS_OVERLAY) == FLAG_CHILD_HAS_OVERLAY) { - for (int i = count - 1; i >= 0; i--) { - final View child = children[i]; - // Don't let children respond to events as an overlay during an animation. - if ((child.mViewFlags & VISIBILITY_MASK) == VISIBLE - && child.getAnimation() == null - && child.isOverlayEnabled()) { - // offset the event to the view's coordinate system - final float xc = scrolledXFloat - child.mLeft; - final float yc = scrolledYFloat - child.mTop; - ev.setLocation(xc, yc); - child.mPrivateFlags &= ~CANCEL_NEXT_UP_EVENT; - if (child.dispatchTouchEvent(ev)) { - // Event handled, we have a target now. - mMotionTarget = child; - return true; - } - // The event didn't get handled, try the next view. - // Don't reset the event's location, it's not - // necessary here. - } - } - } - - // Now check views normally. for (int i = count - 1; i >= 0; i--) { final View child = children[i]; if ((child.mViewFlags & VISIBILITY_MASK) == VISIBLE @@ -2774,8 +2742,6 @@ public abstract class ViewGroup extends View implements ViewParent, ViewManager if (clearChildFocus != null) { clearChildFocus(clearChildFocus); } - - mGroupFlags &= ~FLAG_CHILD_HAS_OVERLAY; } /** @@ -3024,8 +2990,7 @@ public abstract class ViewGroup extends View implements ViewParent, ViewManager final int left = mLeft; final int top = mTop; - if ((mGroupFlags & FLAG_CHILD_HAS_OVERLAY) == FLAG_CHILD_HAS_OVERLAY || - dirty.intersect(0, 0, mRight - left, mBottom - top) || + if (dirty.intersect(0, 0, mRight - left, mBottom - top) || (mPrivateFlags & DRAW_ANIMATION) == DRAW_ANIMATION) { mPrivateFlags &= ~DRAWING_CACHE_VALID; @@ -4012,69 +3977,6 @@ public abstract class ViewGroup extends View implements ViewParent, ViewManager mAnimationListener = animationListener; } - /** - * Called when a child's overlay state changes between enabled/disabled. - * @param child Child view whose state has changed or null - * @hide - */ - public void childOverlayStateChanged(View child) { - boolean childHasOverlay = false; - if (child != null) { - childHasOverlay = child.isOverlayEnabled(); - } else { - final int childCount = getChildCount(); - for (int i = 0; i < childCount; i++) { - if (childHasOverlay |= getChildAt(i).isOverlayEnabled()) { - break; - } - } - } - - final boolean hasChildWithOverlay = childHasOverlay || - (mGroupFlags & FLAG_CHILD_HAS_OVERLAY) == FLAG_CHILD_HAS_OVERLAY; - - final boolean oldValue = isOverlayEnabled(); - mGroupFlags = (mGroupFlags & ~FLAG_CHILD_HAS_OVERLAY) | - (hasChildWithOverlay ? FLAG_CHILD_HAS_OVERLAY : 0); - if (isOverlayEnabled() != oldValue) { - final ViewParent parent = getParent(); - if (parent != null) { - try { - parent.childOverlayStateChanged(this); - } catch (AbstractMethodError e) { - Log.e("ViewGroup", "Could not propagate hasOverlay state", e); - } - } - } - } - - /** - * @hide - */ - public boolean isOverlayEnabled() { - return super.isOverlayEnabled() || - ((mGroupFlags & FLAG_CHILD_HAS_OVERLAY) == FLAG_CHILD_HAS_OVERLAY); - } - - /** - * @hide - */ - @Override - public void onDrawOverlay(Canvas canvas) { - if ((mGroupFlags & FLAG_CHILD_HAS_OVERLAY) == FLAG_CHILD_HAS_OVERLAY) { - final int childCount = getChildCount(); - for (int i = 0; i < childCount; i++) { - final View child = getChildAt(i); - if (child.isOverlayEnabled()) { - canvas.translate(child.mLeft - child.mScrollX, child.mTop - child.mScrollY); - child.onDrawOverlay(canvas); - canvas.translate(-(child.mLeft - child.mScrollX), - -(child.mTop - child.mScrollY)); - } - } - } - } - /** * LayoutParams are used by views to tell their parents how they want to be * laid out. See diff --git a/core/java/android/view/ViewParent.java b/core/java/android/view/ViewParent.java index d2907da0b8f56..d7d4c3f02d0d1 100644 --- a/core/java/android/view/ViewParent.java +++ b/core/java/android/view/ViewParent.java @@ -222,11 +222,4 @@ public interface ViewParent { */ public boolean requestChildRectangleOnScreen(View child, Rect rectangle, boolean immediate); - - /** - * Called when a child view's overlay state changes between enabled/disabled. - * @param child Child view whose state changed or null. - * @hide - */ - public void childOverlayStateChanged(View child); } diff --git a/core/java/android/view/ViewRoot.java b/core/java/android/view/ViewRoot.java index cb9f84da39b9e..e71b5b680553c 100644 --- a/core/java/android/view/ViewRoot.java +++ b/core/java/android/view/ViewRoot.java @@ -206,8 +206,6 @@ public final class ViewRoot extends Handler implements ViewParent, View.AttachIn AudioManager mAudioManager; private final int mDensity; - - private boolean mHasOverlay; public static IWindowSession getWindowSession(Looper mainLooper) { synchronized (mStaticInit) { @@ -1359,9 +1357,6 @@ public final class ViewRoot extends Handler implements ViewParent, View.AttachIn canvas.setScreenDensity(scalingRequired ? DisplayMetrics.DENSITY_DEVICE : 0); mView.draw(canvas); - if (mHasOverlay) { - mView.onDrawOverlay(canvas); - } } finally { mAttachInfo.mIgnoreDirtyState = false; } @@ -2744,19 +2739,6 @@ public final class ViewRoot extends Handler implements ViewParent, View.AttachIn return scrollToRectOrFocus(rectangle, immediate); } - /** - * @hide - */ - public void childOverlayStateChanged(View child) { - final boolean oldState = mHasOverlay; - mHasOverlay = child.isOverlayEnabled(); - // Invalidate the whole thing when we change overlay states just in case - // something left chunks of data drawn someplace it shouldn't have. - if (mHasOverlay != oldState) { - child.invalidate(); - } - } - class TakenSurfaceHolder extends BaseSurfaceHolder { @Override public boolean onAllowLockCanvas() { diff --git a/core/java/android/widget/PopupWindow.java b/core/java/android/widget/PopupWindow.java index 4a3e2a9155ed7..71f4f03f88d36 100644 --- a/core/java/android/widget/PopupWindow.java +++ b/core/java/android/widget/PopupWindow.java @@ -176,6 +176,7 @@ public class PopupWindow { attrs, com.android.internal.R.styleable.PopupWindow, defStyleAttr, defStyleRes); mBackground = a.getDrawable(R.styleable.PopupWindow_popupBackground); + mAnimationStyle = a.getResourceId(R.styleable.PopupWindow_windowAnimationStyle, -1); // If this is a StateListDrawable, try to find and store the drawable to be // used when the drop-down is placed above its anchor view, and the one to be diff --git a/core/java/android/widget/TextView.java b/core/java/android/widget/TextView.java index 3e5ddfcf47106..948a8b6417eeb 100644 --- a/core/java/android/widget/TextView.java +++ b/core/java/android/widget/TextView.java @@ -199,6 +199,9 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener private static final int PRIORITY = 100; private int mCurrentAlpha = 255; + + private final int[] mTempCoords = new int[2]; + private ColorStateList mTextColor; private int mCurTextColor; private ColorStateList mHintTextColor; @@ -3779,8 +3782,6 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener showError(); mShowErrorAfterAttach = false; } - - updateOverlay(); } @Override @@ -3798,8 +3799,6 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener if (mError != null) { hideError(); } - - setOverlayEnabled(false); } @Override @@ -4169,19 +4168,6 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener canvas.restore(); } - /** - * @hide - */ - @Override - public void onDrawOverlay(Canvas canvas) { - if (mInsertionPointCursorController != null) { - mInsertionPointCursorController.draw(canvas); - } - if (mSelectionModifierCursorController != null) { - mSelectionModifierCursorController.draw(canvas); - } - } - @Override public void getFocusedRect(Rect r) { if (mLayout == null) { @@ -6768,31 +6754,17 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener public boolean onTouchEvent(MotionEvent event) { final int action = event.getActionMasked(); if (action == MotionEvent.ACTION_DOWN) { - // Check to see if we're testing for our anchor overlay. - boolean handled = false; - final float x = event.getX(); - final float y = event.getY(); - if (x < 0 || x >= mRight - mLeft || y < 0 || y >= mBottom - mTop) { - if (mInsertionPointCursorController != null) { - handled |= mInsertionPointCursorController.onTouchEvent(event); - } - if (mSelectionModifierCursorController != null) { - handled |= mSelectionModifierCursorController.onTouchEvent(event); - } - - if (!handled) { - return false; - } + if (mInsertionPointCursorController != null) { + mInsertionPointCursorController.onTouchEvent(event); + } + if (mSelectionModifierCursorController != null) { + mSelectionModifierCursorController.onTouchEvent(event); } // Reset this state; it will be re-set if super.onTouchEvent // causes focus to move to the view. mTouchFocusSelected = false; mScrolled = false; - - if (handled) { - return true; - } } final boolean superResult = super.onTouchEvent(event); @@ -6808,7 +6780,6 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener } if ((mMovement != null || onCheckIsTextEditor()) && mText instanceof Spannable && mLayout != null) { - if (mInsertionPointCursorController != null) { mInsertionPointCursorController.onTouchEvent(event); } @@ -6822,11 +6793,22 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener int oldSelStart = getSelectionStart(); int oldSelEnd = getSelectionEnd(); + final int oldScrollX = mScrollX; + final int oldScrollY = mScrollY; + if (mMovement != null) { handled |= mMovement.onTouchEvent(this, (Spannable) mText, event); } if (isTextEditable()) { + if (mScrollX != oldScrollX || mScrollY != oldScrollY) { + // Hide insertion anchor while scrolling. Leave selection. + hideInsertionPointCursorController(); + if (mSelectionModifierCursorController != null && + mSelectionModifierCursorController.isShowing()) { + mSelectionModifierCursorController.updatePosition(); + } + } if (action == MotionEvent.ACTION_UP && isFocused() && !mScrolled) { InputMethodManager imm = (InputMethodManager) getContext().getSystemService(Context.INPUT_METHOD_SERVICE); @@ -7705,22 +7687,13 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener } } - private void updateOverlay() { - boolean enableOverlay = false; - if (mSelectionModifierCursorController != null) { - enableOverlay |= mSelectionModifierCursorController.isShowing(); - } - if (mInsertionPointCursorController != null) { - enableOverlay |= mInsertionPointCursorController.isShowing(); - } - setOverlayEnabled(enableOverlay); - } - /** * A CursorController instance can be used to control a cursor in the text. * * It can be passed to an {@link ArrowKeyMovementMethod} which can intercepts events * and send them to this object instead of the cursor. + * + * @hide */ public interface CursorController { /* Cursor fade-out animation duration, in milliseconds. */ @@ -7748,6 +7721,8 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener */ public void updatePosition(int x, int y); + public void updatePosition(); + /** * The controller and the cursor's positions can be link by a fixed offset, * computed when the controller is touched, and then maintained as it moves @@ -7766,154 +7741,192 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener * @param event The touch event */ public boolean onTouchEvent(MotionEvent event); - - /** - * Draws a visual representation of the controller on the canvas. - * - * Called at the end of {@link #draw(Canvas)}, in the content coordinates system. - * @param canvas The Canvas used by this TextView. - */ - public void draw(Canvas canvas); } - private class Handle { - Drawable mDrawable; - // Vertical extension of the touch region - int mTopExtension, mBottomExtension; - // Position of the virtual finger position on screen - int mHotSpotVerticalPosition; + private class HandleView extends View { + private boolean mPositionOnTop = false; + private Drawable mDrawable; + private PopupWindow mContainer; + private int mPositionX; + private int mPositionY; + private CursorController mController; + private boolean mIsDragging; - Handle(Drawable drawable) { - mDrawable = drawable; + public HandleView(CursorController controller, Drawable handle) { + super(TextView.this.mContext); + mController = controller; + mDrawable = handle; + mContainer = new PopupWindow(TextView.this.mContext, null, + com.android.internal.R.attr.textSelectHandleWindowStyle); + } + + @Override + public void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { + setMeasuredDimension(mDrawable.getIntrinsicWidth(), + mDrawable.getIntrinsicHeight()); + } + + public void show() { + if (!isPositionInBounds()) { + hide(); + return; + } + mContainer.setContentView(this); + final int[] coords = mTempCoords; + TextView.this.getLocationOnScreen(coords); + coords[0] += mPositionX; + coords[1] += mPositionY; + mContainer.showAtLocation(TextView.this, 0, coords[0], coords[1]); + } + + public void hide() { + mIsDragging = false; + mContainer.dismiss(); + } + + public boolean isShowing() { + return mContainer.isShowing(); + } + + private boolean isPositionInBounds() { + final int extendedPaddingTop = getExtendedPaddingTop(); + final int extendedPaddingBottom = getExtendedPaddingBottom(); + final int compoundPaddingLeft = getCompoundPaddingLeft(); + final int compoundPaddingRight = getCompoundPaddingRight(); + + final TextView hostView = TextView.this; + final int right = hostView.mRight; + final int left = hostView.mLeft; + final int bottom = hostView.mBottom; + final int top = hostView.mTop; + + final int clipLeft = left + compoundPaddingLeft; + final int clipTop = top + extendedPaddingTop; + final int clipRight = right - compoundPaddingRight; + final int clipBottom = bottom - extendedPaddingBottom; + + final int handleWidth = mDrawable.getIntrinsicWidth(); + return mPositionX >= clipLeft - handleWidth * 0.75f && + mPositionX <= clipRight + handleWidth * 0.25f && + mPositionY >= clipTop && mPositionY <= clipBottom; + } + + private void moveTo(int x, int y) { + mPositionX = x - TextView.this.mScrollX; + mPositionY = y - TextView.this.mScrollY; + if (isPositionInBounds()) { + if (mContainer.isShowing()){ + final int[] coords = mTempCoords; + TextView.this.getLocationOnScreen(coords); + coords[0] += mPositionX; + coords[1] += mPositionY; + mContainer.update(coords[0], coords[1], mRight - mLeft, mBottom - mTop); + } else { + show(); + } + } else { + hide(); + } + } + + @Override + public void onDraw(Canvas c) { + mDrawable.setBounds(0, 0, mRight - mLeft, mBottom - mTop); + if (mPositionOnTop) { + c.save(); + c.rotate(180, (mRight - mLeft) / 2, (mBottom - mTop) / 2); + mDrawable.draw(c); + c.restore(); + } else { + mDrawable.draw(c); + } + } + + @Override + public boolean onTouchEvent(MotionEvent ev) { + switch (ev.getActionMasked()) { + case MotionEvent.ACTION_DOWN: + mIsDragging = true; + break; + + case MotionEvent.ACTION_MOVE: + final float rawX = ev.getRawX(); + final float rawY = ev.getRawY(); + final int[] coords = mTempCoords; + TextView.this.getLocationOnScreen(coords); + final int x = (int) (rawX - coords[0] + 0.5f); + final int y = (int) (rawY - coords[1] + 0.5f); + mController.updatePosition(x, y); + break; + + case MotionEvent.ACTION_UP: + case MotionEvent.ACTION_CANCEL: + mIsDragging = false; + } + return true; + } + + public boolean isDragging() { + return mIsDragging; } void positionAtCursor(final int offset, boolean bottom) { - final int drawableWidth = mDrawable.getIntrinsicWidth(); - final int drawableHeight = mDrawable.getIntrinsicHeight(); + final int width = mDrawable.getIntrinsicWidth(); + final int height = mDrawable.getIntrinsicHeight(); final int line = mLayout.getLineForOffset(offset); final int lineTop = mLayout.getLineTop(line); final int lineBottom = mLayout.getLineBottom(line); - mHotSpotVerticalPosition = lineTop; - final Rect bounds = sCursorControllerTempRect; - bounds.left = (int) (mLayout.getPrimaryHorizontal(offset) - drawableWidth / 2.0) - + mScrollX; - bounds.top = (bottom ? lineBottom : lineTop) + mScrollY; + bounds.left = (int) (mLayout.getPrimaryHorizontal(offset) - width / 2.0) + + TextView.this.mScrollX; + bounds.top = (bottom ? lineBottom : lineTop) + TextView.this.mScrollY; - mTopExtension = bottom ? 0 : drawableHeight / 2; - mBottomExtension = 0; //drawableHeight / 4; - - // Extend touch region up when editing the last line of text (or a single line) so that - // it is easier to grab. - if (line == mLayout.getLineCount() - 1) { - mTopExtension = (lineBottom - lineTop) - drawableHeight / 2; - } - - bounds.right = bounds.left + drawableWidth; - bounds.bottom = bounds.top + drawableHeight; + bounds.right = bounds.left + width; + bounds.bottom = bounds.top + height; convertFromViewportToContentCoordinates(bounds); - invalidate(); - mDrawable.setBounds(bounds); - invalidate(); - } - - boolean hasFingerOn(float x, float y) { - // Simulate a 'fat finger' to ease grabbing of the controller. - // Expands according to controller image size instead of using dip distance. - // Assumes controller imager has a sensible size, proportionnal to screen density. - final int drawableWidth = mDrawable.getIntrinsicWidth(); - final Rect fingerRect = sCursorControllerTempRect; - fingerRect.set((int) (x - drawableWidth / 2.0), - (int) (y - mBottomExtension), - (int) (x + drawableWidth / 2.0), - (int) (y + mTopExtension)); - fingerRect.offset(mScrollX, mScrollY); - return Rect.intersects(mDrawable.getBounds(), fingerRect); - } - - void invalidate() { - final Rect bounds = mDrawable.getBounds(); - TextView.this.invalidate(bounds.left, bounds.top, - bounds.right, bounds.bottom); - } - - void postInvalidate() { - final Rect bounds = mDrawable.getBounds(); - TextView.this.postInvalidate(bounds.left, bounds.top, - bounds.right, bounds.bottom); - } - - void postInvalidateDelayed(long delay) { - final Rect bounds = mDrawable.getBounds(); - TextView.this.postInvalidateDelayed(delay, bounds.left, bounds.top, - bounds.right, bounds.bottom); + moveTo(bounds.left, bounds.top); } } class InsertionPointCursorController implements CursorController { - private static final int DELAY_BEFORE_FADE_OUT = 2100; + private static final int DELAY_BEFORE_FADE_OUT = 4100; - // Whether or not the cursor control is currently visible - private boolean mIsVisible = false; - // Starting time of the fade timer - private long mFadeOutTimerStart; // The cursor controller image - private final Handle mHandle; - // Used to detect a tap (vs drag) on the controller - private long mOnDownTimerStart; + private final HandleView mHandle; // Offset between finger hot point on cursor controller and actual cursor private float mOffsetX, mOffsetY; + private final Runnable mHider = new Runnable() { + public void run() { + hide(); + } + }; + InsertionPointCursorController() { Resources res = mContext.getResources(); - mHandle = new Handle(res.getDrawable(mTextSelectHandleRes)); + mHandle = new HandleView(this, res.getDrawable(mTextSelectHandleRes)); } public void show() { - updateDrawablePosition(); - // Has to be done after updateDrawablePosition, so that previous position invalidate - // in only done if necessary. - mIsVisible = true; - updateOverlay(); + updatePosition(); + mHandle.show(); + hideDelayed(DELAY_BEFORE_FADE_OUT); } public void hide() { - if (mIsVisible) { - long time = System.currentTimeMillis(); - // Start fading out, only if not already in progress - if (time - mFadeOutTimerStart < DELAY_BEFORE_FADE_OUT) { - mFadeOutTimerStart = time - DELAY_BEFORE_FADE_OUT; - mHandle.postInvalidate(); - } - } + mHandle.hide(); + TextView.this.removeCallbacks(mHider); + } + + private void hideDelayed(int msec) { + TextView.this.removeCallbacks(mHider); + TextView.this.postDelayed(mHider, msec); } public boolean isShowing() { - return mIsVisible; - } - - public void draw(Canvas canvas) { - if (mIsVisible) { - int time = (int) (System.currentTimeMillis() - mFadeOutTimerStart); - if (time <= DELAY_BEFORE_FADE_OUT) { - mHandle.postInvalidateDelayed(DELAY_BEFORE_FADE_OUT - time); - } else { - time -= DELAY_BEFORE_FADE_OUT; - if (time <= FADE_OUT_DURATION) { - final int alpha = (int) - ((255.0 * (FADE_OUT_DURATION - time)) / FADE_OUT_DURATION); - mHandle.mDrawable.setAlpha(alpha); - mHandle.postInvalidateDelayed(30); - } else { - mHandle.mDrawable.setAlpha(0); - mIsVisible = false; - updateOverlay(); - } - } - mHandle.mDrawable.draw(canvas); - } + return mHandle.isShowing(); } public void updatePosition(int x, int y) { @@ -7922,81 +7935,22 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener if (offset != previousOffset) { Selection.setSelection((Spannable) mText, offset); - updateDrawablePosition(); + updatePosition(); } + hideDelayed(DELAY_BEFORE_FADE_OUT); } - private void updateDrawablePosition() { - if (mIsVisible) { - // Clear previous cursor controller before bounds are updated - mHandle.postInvalidate(); - } - + public void updatePosition() { final int offset = getSelectionStart(); if (offset < 0) { // Should never happen, safety check. Log.w(LOG_TAG, "Update cursor controller position called with no cursor"); - mIsVisible = false; - updateOverlay(); + hide(); return; } mHandle.positionAtCursor(offset, true); - - mFadeOutTimerStart = System.currentTimeMillis(); - mHandle.mDrawable.setAlpha(255); - } - - public boolean onTouchEvent(MotionEvent event) { - if (isFocused() && isTextEditable() && mIsVisible) { - switch (event.getActionMasked()) { - case MotionEvent.ACTION_DOWN : { - final float x = event.getX(); - final float y = event.getY(); - - if (mHandle.hasFingerOn(x, y)) { - show(); - - if (mMovement instanceof ArrowKeyMovementMethod) { - ((ArrowKeyMovementMethod)mMovement).setCursorController(this); - } - - if (mParent != null) { - // Prevent possible scrollView parent from scrolling, so that - // we can use auto-scrolling. - mParent.requestDisallowInterceptTouchEvent(true); - } - - final Rect bounds = mHandle.mDrawable.getBounds(); - mOffsetX = (bounds.left + bounds.right) / 2.0f - x; - mOffsetY = mHandle.mHotSpotVerticalPosition - y; - - mOffsetX += viewportToContentHorizontalOffset(); - mOffsetY += viewportToContentVerticalOffset(); - - mOnDownTimerStart = event.getEventTime(); - return true; - } - return false; - } - - case MotionEvent.ACTION_UP : { - int time = (int) (event.getEventTime() - mOnDownTimerStart); - - if (time <= ViewConfiguration.getTapTimeout()) { - // A tap on the controller (not a drag) will move the cursor - int offset = getOffset((int) event.getX(), (int) event.getY()); - Selection.setSelection((Spannable) mText, offset); - - // Modified by cancelLongPress and prevents the cursor from changing - mScrolled = false; - } - break; - } - } - } - return false; } public float getOffsetX() { @@ -8006,88 +7960,59 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener public float getOffsetY() { return mOffsetY; } + + public boolean onTouchEvent(MotionEvent ev) { + return false; + } } class SelectionModifierCursorController implements CursorController { - // Whether or not the selection controls are currently visible - private boolean mIsVisible = false; - // Whether that start or the end of selection controller is dragged - private boolean mStartIsDragged = false; - // Starting time of the fade timer - private long mFadeOutTimerStart; // The cursor controller images - private final Handle mStartHandle, mEndHandle; + private HandleView mStartHandle, mEndHandle; // Offset between finger hot point on active cursor controller and actual cursor private float mOffsetX, mOffsetY; // The offsets of that last touch down event. Remembered to start selection there. private int mMinTouchOffset, mMaxTouchOffset; + // Whether selection anchors are active + private boolean mIsShowing; SelectionModifierCursorController() { Resources res = mContext.getResources(); - mStartHandle = new Handle(res.getDrawable(mTextSelectHandleLeftRes)); - mEndHandle = new Handle(res.getDrawable(mTextSelectHandleRightRes)); + mStartHandle = new HandleView(this, res.getDrawable(mTextSelectHandleLeftRes)); + mEndHandle = new HandleView(this, res.getDrawable(mTextSelectHandleRightRes)); } public void show() { - updateDrawablesPositions(); - // Has to be done after updateDrawablePositions, so that previous position invalidate - // in only done if necessary. - mIsVisible = true; - updateOverlay(); - mFadeOutTimerStart = -1; + mIsShowing = true; + updatePosition(); + mStartHandle.show(); + mEndHandle.show(); hideInsertionPointCursorController(); } public void hide() { - if (mIsVisible && (mFadeOutTimerStart < 0)) { - mFadeOutTimerStart = System.currentTimeMillis(); - mStartHandle.postInvalidate(); - mEndHandle.postInvalidate(); - } + mStartHandle.hide(); + mEndHandle.hide(); + mIsShowing = false; } public boolean isShowing() { - return mIsVisible; + return mIsShowing; } public void cancelFadeOutAnimation() { - mIsVisible = false; - updateOverlay(); - mStartHandle.postInvalidate(); - mEndHandle.postInvalidate(); - } - - public void draw(Canvas canvas) { - if (mIsVisible) { - if (mFadeOutTimerStart >= 0) { - int time = (int) (System.currentTimeMillis() - mFadeOutTimerStart); - if (time <= FADE_OUT_DURATION) { - final int alpha = 255 * (FADE_OUT_DURATION - time) / FADE_OUT_DURATION; - mStartHandle.mDrawable.setAlpha(alpha); - mEndHandle.mDrawable.setAlpha(alpha); - mStartHandle.postInvalidateDelayed(30); - mEndHandle.postInvalidateDelayed(30); - } else { - mStartHandle.mDrawable.setAlpha(0); - mEndHandle.mDrawable.setAlpha(0); - mIsVisible = false; - updateOverlay(); - } - } - mStartHandle.mDrawable.draw(canvas); - mEndHandle.mDrawable.draw(canvas); - } + hide(); } public void updatePosition(int x, int y) { int selectionStart = getSelectionStart(); int selectionEnd = getSelectionEnd(); - final int previousOffset = mStartIsDragged ? selectionStart : selectionEnd; + final int previousOffset = mStartHandle.isDragging() ? selectionStart : selectionEnd; int offset = getHysteresisOffset(x, y, previousOffset); // Handle the case where start and end are swapped, making sure start <= end - if (mStartIsDragged) { + if (mStartHandle.isDragging()) { if (offset <= selectionEnd) { if (selectionStart == offset) { return; // no change, no need to redraw; @@ -8096,7 +8021,9 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener } else { selectionStart = selectionEnd; selectionEnd = offset; - mStartIsDragged = false; + HandleView temp = mStartHandle; + mStartHandle = mEndHandle; + mEndHandle = temp; } } else { if (offset >= selectionStart) { @@ -8107,43 +8034,35 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener } else { selectionEnd = selectionStart; selectionStart = offset; - mStartIsDragged = true; + HandleView temp = mStartHandle; + mStartHandle = mEndHandle; + mEndHandle = temp; } } Selection.setSelection((Spannable) mText, selectionStart, selectionEnd); - updateDrawablesPositions(); + updatePosition(); } - private void updateDrawablesPositions() { - if (mIsVisible) { - // Clear previous cursor controller before bounds are updated - mStartHandle.postInvalidate(); - mEndHandle.postInvalidate(); - } - + public void updatePosition() { final int selectionStart = getSelectionStart(); final int selectionEnd = getSelectionEnd(); if ((selectionStart < 0) || (selectionEnd < 0)) { // Should never happen, safety check. Log.w(LOG_TAG, "Update selection controller position called with no cursor"); - mIsVisible = false; - updateOverlay(); + hide(); return; } - boolean oneLineSelection = - mLayout.getLineForOffset(selectionStart) == mLayout.getLineForOffset(selectionEnd); + boolean oneLineSelection = mLayout.getLineForOffset(selectionStart) == + mLayout.getLineForOffset(selectionEnd); mStartHandle.positionAtCursor(selectionStart, oneLineSelection); mEndHandle.positionAtCursor(selectionEnd, true); - - mStartHandle.mDrawable.setAlpha(255); - mEndHandle.mDrawable.setAlpha(255); } public boolean onTouchEvent(MotionEvent event) { - if (isTextEditable()) { + if (isFocused() && isTextEditable()) { switch (event.getActionMasked()) { case MotionEvent.ACTION_DOWN: final int x = (int) event.getX(); @@ -8152,34 +8071,6 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener // Remember finger down position, to be able to start selection from there mMinTouchOffset = mMaxTouchOffset = mLastTouchOffset = getOffset(x, y); - if (mIsVisible) { - if (mMovement instanceof ArrowKeyMovementMethod) { - boolean isOnStart = mStartHandle.hasFingerOn(x, y); - boolean isOnEnd = mEndHandle.hasFingerOn(x, y); - if (isOnStart || isOnEnd) { - if (mParent != null) { - // Prevent possible scrollView parent from scrolling, so - // that we can use auto-scrolling. - mParent.requestDisallowInterceptTouchEvent(true); - } - - // In case both controllers are under finger (very small - // selection region), arbitrarily pick end controller. - mStartIsDragged = !isOnEnd; - final Handle draggedHandle = - mStartIsDragged ? mStartHandle : mEndHandle; - final Rect bounds = draggedHandle.mDrawable.getBounds(); - mOffsetX = (bounds.left + bounds.right) / 2.0f - x; - mOffsetY = draggedHandle.mHotSpotVerticalPosition - y; - - mOffsetX += viewportToContentHorizontalOffset(); - mOffsetY += viewportToContentVerticalOffset(); - - ((ArrowKeyMovementMethod)mMovement).setCursorController(this); - return true; - } - } - } break; case MotionEvent.ACTION_POINTER_DOWN: @@ -8230,7 +8121,7 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener * @return true iff this controller is currently used to move the selection start. */ public boolean isSelectionStartDragged() { - return mIsVisible && mStartIsDragged; + return mStartHandle.isDragging(); } } diff --git a/core/res/res/values/attrs.xml b/core/res/res/values/attrs.xml index 779a33f3d006d..19b76abe2fe42 100755 --- a/core/res/res/values/attrs.xml +++ b/core/res/res/values/attrs.xml @@ -466,6 +466,9 @@ + + @@ -2355,6 +2358,7 @@ + diff --git a/core/res/res/values/public.xml b/core/res/res/values/public.xml index 6f53677554bb1..d892d54d08981 100644 --- a/core/res/res/values/public.xml +++ b/core/res/res/values/public.xml @@ -1255,6 +1255,7 @@ + diff --git a/core/res/res/values/styles.xml b/core/res/res/values/styles.xml index e8343f10e756b..c37bb66d299d8 100644 --- a/core/res/res/values/styles.xml +++ b/core/res/res/values/styles.xml @@ -881,6 +881,17 @@ @android:drawable/bottom_bar + + + + + + @@ -939,6 +938,8 @@ + + @@ -1009,6 +1015,7 @@ - - - + + @@ -1393,12 +1403,14 @@ - - + + + + + + @@ -1458,7 +1484,7 @@ @android:style/TextAppearance.Holo.Widget.ActionMode.Subtitle - @@ -1466,6 +1492,7 @@ @android:style/TextAppearance.Holo.Widget.ActionBar.Title @android:style/TextAppearance.Holo.Widget.ActionBar.Subtitle @null + ?android:attr/dividerVertical @@ -1493,6 +1520,9 @@ 24dip + + @@ -1619,13 +1649,13 @@ - - - - @@ -1676,16 +1706,16 @@ - - - @@ -826,7 +828,6 @@ @android:style/Widget.Holo.Spinner.DropDown @android:style/Widget.Holo.ActionButton @android:style/Widget.Holo.ActionButton.Overflow - 12dip @android:drawable/cab_holo_dark @android:drawable/cab_ic_close_holo @style/Widget.Holo.ActionBarView_TabView @@ -835,8 +836,10 @@ @style/Widget.Holo.ActionMode @style/Widget.Holo.ActionButton.CloseMode @android:style/Widget.Holo.ActionBar - 50dip + 56dip + @drawable/divider_vertical_holo_dark + @android:style/Widget.Holo.ButtonGroup From 6b9da2ef8cdc635924f5091d9aff3483fcf5fa5d Mon Sep 17 00:00:00 2001 From: Romain Guy Date: Mon, 11 Oct 2010 12:41:21 -0700 Subject: [PATCH 15/90] Redraw the screen when needed. Bug #3085265 Change-Id: Ibb47500f819b823eb4f3dee829f0396dce9a3d65 --- core/java/android/view/ViewRoot.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/core/java/android/view/ViewRoot.java b/core/java/android/view/ViewRoot.java index cce860b35e87d..7907ad2cb25fb 100644 --- a/core/java/android/view/ViewRoot.java +++ b/core/java/android/view/ViewRoot.java @@ -1281,8 +1281,9 @@ public final class ViewRoot extends Handler implements ViewParent, View.AttachIn if (mAttachInfo.mHardwareRenderer != null && mAttachInfo.mHardwareRenderer.isEnabled()) { if (!dirty.isEmpty() || mIsAnimating) { - mAttachInfo.mHardwareRenderer.draw(mView, mAttachInfo, yoff); + mIsAnimating = false; dirty.setEmpty(); + mAttachInfo.mHardwareRenderer.draw(mView, mAttachInfo, yoff); } if (scrolling) { From dda82d0e2385ef4d252a1e64e17ddc8b9eaf3aa0 Mon Sep 17 00:00:00 2001 From: Jason Sams Date: Fri, 15 Oct 2010 11:21:24 -0700 Subject: [PATCH 16/90] Fix deadlock on RS teardown. Change-Id: I34d2702b535e28e9519c7368fd8a942bfe0724bc --- libs/rs/rsObjectBase.cpp | 12 +++--------- 1 file changed, 3 insertions(+), 9 deletions(-) diff --git a/libs/rs/rsObjectBase.cpp b/libs/rs/rsObjectBase.cpp index e4b07c4c3d976..46b1750f6c5b3 100644 --- a/libs/rs/rsObjectBase.cpp +++ b/libs/rs/rsObjectBase.cpp @@ -93,9 +93,8 @@ bool ObjectBase::checkDelete() const if (mRSC && mRSC->props.mLogObjects) { dumpLOGV("checkDelete"); } - delete this; - unlockUserRef(); + delete this; return true; } return false; @@ -170,9 +169,7 @@ void ObjectBase::add() const void ObjectBase::remove() const { - // Should be within gObjectInitMutex lock - // lock will be from checkDelete a few levels up in the stack. - + lockUserRef(); //LOGV("calling remove rsc %p", mRSC); if (!mRSC) { rsAssert(!mPrev); @@ -191,12 +188,11 @@ void ObjectBase::remove() const } mPrev = NULL; mNext = NULL; + unlockUserRef(); } void ObjectBase::zeroAllUserRef(Context *rsc) { - lockUserRef(); - if (rsc->props.mLogObjects) { LOGV("Forcing release of all outstanding user refs."); } @@ -219,8 +215,6 @@ void ObjectBase::zeroAllUserRef(Context *rsc) LOGV("Objects remaining."); dumpAll(rsc); } - - unlockUserRef(); } void ObjectBase::dumpAll(Context *rsc) From 83f4fb2e857dc64cee1d2250d880e9e22d7fddc1 Mon Sep 17 00:00:00 2001 From: android-build SharedAccount Date: Sun, 24 Oct 2010 15:26:36 -0700 Subject: [PATCH 17/90] Merge packages/SystemUI Change-Id: Ic742a0ad1714229efe4ce565cf00b97ee5ec039d --- packages/SystemUI/Android.mk | 7 +- packages/SystemUI/AndroidManifest.xml | 17 +- .../res/drawable-hdpi/battery_low_battery.png | Bin 4060 -> 4264 bytes .../divider_horizontal_dark_opaque.9.png | Bin 0 -> 2747 bytes .../divider_horizontal_light_opaque.9.png | Bin 0 -> 128 bytes .../res/drawable-hdpi/stat_notify_alarm.png | Bin 1793 -> 1692 bytes .../drawable-hdpi/stat_sys_data_bluetooth.png | Bin 1246 -> 1406 bytes .../stat_sys_data_bluetooth_connected.png | Bin 1405 -> 1544 bytes .../stat_sys_data_connected_1x.png | Bin 4181 -> 1699 bytes .../stat_sys_data_connected_3g.png | Bin 4228 -> 1732 bytes .../stat_sys_data_connected_e.png | Bin 3897 -> 1581 bytes .../stat_sys_data_connected_g.png | Bin 3866 -> 1599 bytes .../stat_sys_data_connected_h.png | Bin 843 -> 1557 bytes .../stat_sys_data_fully_connected_1x.png | Bin 4186 -> 1680 bytes .../stat_sys_data_fully_connected_3g.png | Bin 4240 -> 1711 bytes .../stat_sys_data_fully_connected_e.png | Bin 3917 -> 1579 bytes .../stat_sys_data_fully_connected_g.png | Bin 3891 -> 1567 bytes .../stat_sys_data_fully_connected_h.png | Bin 880 -> 1552 bytes .../stat_sys_data_fully_in_1x.png | Bin 4373 -> 1864 bytes .../stat_sys_data_fully_in_3g.png | Bin 4458 -> 1845 bytes .../stat_sys_data_fully_in_e.png | Bin 1822 -> 1739 bytes .../stat_sys_data_fully_in_g.png | Bin 4067 -> 1729 bytes .../stat_sys_data_fully_in_h.png | Bin 1059 -> 1732 bytes .../stat_sys_data_fully_inandout_1x.png | Bin 4425 -> 1931 bytes .../stat_sys_data_fully_inandout_3g.png | Bin 4534 -> 1910 bytes .../stat_sys_data_fully_inandout_e.png | Bin 4132 -> 1822 bytes .../stat_sys_data_fully_inandout_g.png | Bin 4115 -> 1811 bytes .../stat_sys_data_fully_inandout_h.png | Bin 1141 -> 1806 bytes .../stat_sys_data_fully_out_1x.png | Bin 4340 -> 1877 bytes .../stat_sys_data_fully_out_3g.png | Bin 4454 -> 1893 bytes .../stat_sys_data_fully_out_e.png | Bin 4075 -> 1778 bytes .../stat_sys_data_fully_out_g.png | Bin 4066 -> 1769 bytes .../stat_sys_data_fully_out_h.png | Bin 1120 -> 1752 bytes .../res/drawable-hdpi/stat_sys_data_in_1x.png | Bin 4352 -> 1804 bytes .../res/drawable-hdpi/stat_sys_data_in_3g.png | Bin 4423 -> 1861 bytes .../res/drawable-hdpi/stat_sys_data_in_e.png | Bin 4078 -> 1752 bytes .../res/drawable-hdpi/stat_sys_data_in_g.png | Bin 4049 -> 1760 bytes .../res/drawable-hdpi/stat_sys_data_in_h.png | Bin 1017 -> 1742 bytes .../stat_sys_data_inandout_1x.png | Bin 4418 -> 1901 bytes .../stat_sys_data_inandout_3g.png | Bin 4515 -> 1911 bytes .../stat_sys_data_inandout_e.png | Bin 4130 -> 1863 bytes .../stat_sys_data_inandout_g.png | Bin 4104 -> 1874 bytes .../stat_sys_data_inandout_h.png | Bin 1106 -> 1858 bytes .../drawable-hdpi/stat_sys_data_out_1x.png | Bin 4350 -> 1786 bytes .../drawable-hdpi/stat_sys_data_out_3g.png | Bin 4429 -> 1891 bytes .../res/drawable-hdpi/stat_sys_data_out_e.png | Bin 4053 -> 1772 bytes .../res/drawable-hdpi/stat_sys_data_out_g.png | Bin 4033 -> 1781 bytes .../res/drawable-hdpi/stat_sys_data_out_h.png | Bin 1078 -> 1758 bytes .../drawable-hdpi/stat_sys_gps_acquiring.png | Bin 884 -> 500 bytes .../res/drawable-hdpi/stat_sys_r_signal_0.png | Bin 1223 -> 1276 bytes .../stat_sys_r_signal_0_fully.png | Bin 1223 -> 1276 bytes .../res/drawable-hdpi/stat_sys_r_signal_1.png | Bin 1239 -> 1657 bytes .../stat_sys_r_signal_1_fully.png | Bin 1239 -> 1730 bytes .../res/drawable-hdpi/stat_sys_r_signal_2.png | Bin 1231 -> 1890 bytes .../stat_sys_r_signal_2_fully.png | Bin 1231 -> 1930 bytes .../res/drawable-hdpi/stat_sys_r_signal_3.png | Bin 1206 -> 2013 bytes .../stat_sys_r_signal_3_fully.png | Bin 1206 -> 2038 bytes .../res/drawable-hdpi/stat_sys_r_signal_4.png | Bin 1151 -> 2089 bytes .../stat_sys_r_signal_4_fully.png | Bin 1151 -> 2069 bytes .../drawable-hdpi/stat_sys_ringer_silent.png | Bin 1300 -> 1378 bytes .../drawable-hdpi/stat_sys_ringer_vibrate.png | Bin 4980 -> 1936 bytes .../stat_sys_signal_flightmode.png | Bin 1492 -> 1081 bytes .../drawable-hdpi/stat_sys_signal_null.png | Bin 1304 -> 489 bytes .../drawable-hdpi/status_bar_close_on.9.png | Bin 0 -> 1262 bytes .../drawable-hdpi/statusbar_background.9.png | Bin 0 -> 2846 bytes .../res/drawable-mdpi/battery_low_battery.png | Bin 0 -> 5306 bytes .../divider_horizontal_dark_opaque.9.png | Bin 0 -> 2805 bytes .../divider_horizontal_light_opaque.9.png | Bin 0 -> 128 bytes .../drawable-mdpi/stat_sys_gps_acquiring.png | Bin 595 -> 890 bytes .../drawable-mdpi/status_bar_close_on.9.png | Bin 0 -> 1196 bytes .../drawable-mdpi/statusbar_background.9.png | Bin 0 -> 2849 bytes packages/SystemUI/res/layout/status_bar.xml | 7 +- .../res/layout/status_bar_expanded.xml | 13 +- .../res/layout/status_bar_latest_event.xml | 4 +- .../res/layout/status_bar_tracking.xml | 13 +- packages/SystemUI/res/values-cs/strings.xml | 32 + packages/SystemUI/res/values-da/strings.xml | 32 + packages/SystemUI/res/values-de/strings.xml | 32 + packages/SystemUI/res/values-el/strings.xml | 32 + .../SystemUI/res/values-es-rUS/strings.xml | 32 + packages/SystemUI/res/values-es/strings.xml | 32 + packages/SystemUI/res/values-fr/strings.xml | 32 + packages/SystemUI/res/values-it/strings.xml | 32 + packages/SystemUI/res/values-ja/strings.xml | 32 + packages/SystemUI/res/values-ko/strings.xml | 32 + packages/SystemUI/res/values-nb/strings.xml | 32 + packages/SystemUI/res/values-nl/strings.xml | 32 + packages/SystemUI/res/values-pl/strings.xml | 32 + .../SystemUI/res/values-pt-rPT/strings.xml | 32 + packages/SystemUI/res/values-pt/strings.xml | 32 + packages/SystemUI/res/values-ru/strings.xml | 32 + packages/SystemUI/res/values-sv/strings.xml | 32 + packages/SystemUI/res/values-tr/strings.xml | 32 + .../SystemUI/res/values-zh-rCN/strings.xml | 32 + .../SystemUI/res/values-zh-rTW/strings.xml | 32 + packages/SystemUI/res/values/colors.xml | 2 + packages/SystemUI/res/values/config.xml | 11 +- packages/SystemUI/res/values/strings.xml | 28 - packages/SystemUI/res/values/styles.xml | 16 +- .../systemui/statusbar/CloseDragHandle.java | 2 +- .../systemui/statusbar/CommandQueue.java | 29 +- .../systemui/statusbar/ExpandedView.java | 4 +- .../systemui/statusbar/LatestItemView.java | 12 +- .../systemui/statusbar/NotificationData.java | 81 +- .../systemui/statusbar/StatusBarPolicy.java | 40 +- .../systemui/statusbar/StatusBarService.java | 1464 ++++++++++++++++- .../systemui/statusbar/StatusBarView.java | 57 +- .../android/systemui/statusbar/Ticker.java | 16 +- .../systemui/statusbar/TickerView.java | 4 - .../systemui/statusbar/TrackingView.java | 2 +- 110 files changed, 2168 insertions(+), 301 deletions(-) create mode 100644 packages/SystemUI/res/drawable-hdpi/divider_horizontal_dark_opaque.9.png create mode 100644 packages/SystemUI/res/drawable-hdpi/divider_horizontal_light_opaque.9.png mode change 100755 => 100644 packages/SystemUI/res/drawable-hdpi/stat_sys_data_fully_connected_1x.png mode change 100755 => 100644 packages/SystemUI/res/drawable-hdpi/stat_sys_data_fully_connected_3g.png mode change 100755 => 100644 packages/SystemUI/res/drawable-hdpi/stat_sys_data_fully_connected_e.png mode change 100755 => 100644 packages/SystemUI/res/drawable-hdpi/stat_sys_data_fully_connected_g.png mode change 100755 => 100644 packages/SystemUI/res/drawable-hdpi/stat_sys_data_fully_connected_h.png mode change 100755 => 100644 packages/SystemUI/res/drawable-hdpi/stat_sys_data_fully_in_1x.png mode change 100755 => 100644 packages/SystemUI/res/drawable-hdpi/stat_sys_data_fully_in_3g.png mode change 100755 => 100644 packages/SystemUI/res/drawable-hdpi/stat_sys_data_fully_in_g.png mode change 100755 => 100644 packages/SystemUI/res/drawable-hdpi/stat_sys_data_fully_in_h.png mode change 100755 => 100644 packages/SystemUI/res/drawable-hdpi/stat_sys_data_fully_inandout_1x.png mode change 100755 => 100644 packages/SystemUI/res/drawable-hdpi/stat_sys_data_fully_inandout_3g.png mode change 100755 => 100644 packages/SystemUI/res/drawable-hdpi/stat_sys_data_fully_inandout_e.png mode change 100755 => 100644 packages/SystemUI/res/drawable-hdpi/stat_sys_data_fully_inandout_g.png mode change 100755 => 100644 packages/SystemUI/res/drawable-hdpi/stat_sys_data_fully_inandout_h.png mode change 100755 => 100644 packages/SystemUI/res/drawable-hdpi/stat_sys_data_fully_out_1x.png mode change 100755 => 100644 packages/SystemUI/res/drawable-hdpi/stat_sys_data_fully_out_3g.png mode change 100755 => 100644 packages/SystemUI/res/drawable-hdpi/stat_sys_data_fully_out_e.png mode change 100755 => 100644 packages/SystemUI/res/drawable-hdpi/stat_sys_data_fully_out_g.png mode change 100755 => 100644 packages/SystemUI/res/drawable-hdpi/stat_sys_data_fully_out_h.png create mode 100644 packages/SystemUI/res/drawable-hdpi/status_bar_close_on.9.png create mode 100644 packages/SystemUI/res/drawable-hdpi/statusbar_background.9.png create mode 100644 packages/SystemUI/res/drawable-mdpi/battery_low_battery.png create mode 100644 packages/SystemUI/res/drawable-mdpi/divider_horizontal_dark_opaque.9.png create mode 100644 packages/SystemUI/res/drawable-mdpi/divider_horizontal_light_opaque.9.png create mode 100755 packages/SystemUI/res/drawable-mdpi/status_bar_close_on.9.png create mode 100644 packages/SystemUI/res/drawable-mdpi/statusbar_background.9.png create mode 100644 packages/SystemUI/res/values-cs/strings.xml create mode 100644 packages/SystemUI/res/values-da/strings.xml create mode 100644 packages/SystemUI/res/values-de/strings.xml create mode 100644 packages/SystemUI/res/values-el/strings.xml create mode 100644 packages/SystemUI/res/values-es-rUS/strings.xml create mode 100644 packages/SystemUI/res/values-es/strings.xml create mode 100644 packages/SystemUI/res/values-fr/strings.xml create mode 100644 packages/SystemUI/res/values-it/strings.xml create mode 100644 packages/SystemUI/res/values-ja/strings.xml create mode 100644 packages/SystemUI/res/values-ko/strings.xml create mode 100644 packages/SystemUI/res/values-nb/strings.xml create mode 100644 packages/SystemUI/res/values-nl/strings.xml create mode 100644 packages/SystemUI/res/values-pl/strings.xml create mode 100644 packages/SystemUI/res/values-pt-rPT/strings.xml create mode 100644 packages/SystemUI/res/values-pt/strings.xml create mode 100644 packages/SystemUI/res/values-ru/strings.xml create mode 100644 packages/SystemUI/res/values-sv/strings.xml create mode 100644 packages/SystemUI/res/values-tr/strings.xml create mode 100644 packages/SystemUI/res/values-zh-rCN/strings.xml create mode 100644 packages/SystemUI/res/values-zh-rTW/strings.xml diff --git a/packages/SystemUI/Android.mk b/packages/SystemUI/Android.mk index 2c130693d00bb..4c83768d9ceea 100644 --- a/packages/SystemUI/Android.mk +++ b/packages/SystemUI/Android.mk @@ -3,16 +3,11 @@ include $(CLEAR_VARS) LOCAL_MODULE_TAGS := optional -LOCAL_SRC_FILES := $(call all-subdir-java-files) \ - ../../../ex/carousel/java/com/android/ex/carousel/carousel.rs +LOCAL_SRC_FILES := $(call all-subdir-java-files) LOCAL_JAVA_LIBRARIES := services -LOCAL_STATIC_JAVA_LIBRARIES := android-common-carousel - LOCAL_PACKAGE_NAME := SystemUI LOCAL_CERTIFICATE := platform -LOCAL_PROGUARD_FLAG_FILES := proguard.flags - include $(BUILD_PACKAGE) diff --git a/packages/SystemUI/AndroidManifest.xml b/packages/SystemUI/AndroidManifest.xml index 5fde3c3860c4c..7995869a31a2b 100644 --- a/packages/SystemUI/AndroidManifest.xml +++ b/packages/SystemUI/AndroidManifest.xml @@ -5,9 +5,6 @@ > - - - - - @@ -33,12 +25,5 @@ android:excludeFromRecents="true"> - - - diff --git a/packages/SystemUI/res/drawable-hdpi/battery_low_battery.png b/packages/SystemUI/res/drawable-hdpi/battery_low_battery.png index e74c22fe1499769b88519e45238b3ade5f3adcb6..2c7a0d4e2b70af7fb2fd6dc1c2fc30ffbde13cbe 100644 GIT binary patch literal 4264 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 Hc@_RIqPPr$ diff --git a/packages/SystemUI/res/drawable-hdpi/divider_horizontal_dark_opaque.9.png b/packages/SystemUI/res/drawable-hdpi/divider_horizontal_dark_opaque.9.png new file mode 100644 index 0000000000000000000000000000000000000000..d21aad295c291c4ba5adb87176f3703df7ba6a96 GIT binary patch literal 2747 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 ZVURj59DnzGuqaS9gQu&X%Q~loCIA`DCQ$$Y literal 0 HcmV?d00001 diff --git a/packages/SystemUI/res/drawable-hdpi/stat_notify_alarm.png b/packages/SystemUI/res/drawable-hdpi/stat_notify_alarm.png index 89daee190668284e70262dda78d1e3693983e5fc..2d3eb30f8e5a97bea735edcc2ca9470d0b4ff1b8 100644 GIT binary patch literal 1692 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 delta 1225 zcmV;)1UCEr3f>7JiBL{Q4GJ0x0000DNk~Le0000c0000c2nGNE0H{6bu8|=pe*}O@ zL_t(|+RRv6C~R#Qeup84LbNDJ_>FD0ih*)| zczCF^xVDrcZ*T9v88Gnl^aQ4ec5F^EGBO}MJlx`YUQh?>LY=7F#l=OLe<@vET{$MC zRBD8VhC)tG4opu^!^p^pEOV%nWdlxeR3acuCujnx!Ka+Gv@~L6XlTePf3pji94Ij` z9I2_PbR8HN_&Q(+%2r@JI1H5D-d;)F4g-dH2cz@!^wi><+uK|EE;%`w03$ea?8pIg zvIZCmMpJ!#Jv25pLQqi9f2Vh1##&lhFeT7^N=gb<2HsE2iDF={udgHsCNMA%e0+SM zsi_IV!oq}iVqjZaThQFx4A0O1=FY^#L?|yWC)W7yQS1iB%hJ*kw6(R7QZy$r7Znv{ z!WcfUudl<@)RgdBTwELk2M0Tjv6q*ZPclD0Po_d}n2YM_>WC4se-Ghzm^LyqGll4D zZ*PaSwKWrcD2jmb=|U_B4o!*R)M_DsO!V;8z|v4j z^e0)4PJ(i{a+>`|c1yEB{V>0LD1 zs;Y{F)0Cc*cySy1E)le@aT|{oUOi6crW0?(VKI z=kV|l^78UvZ*PyDBO@av!P#AsP#PKoqM$u}<#>U2A zVqyZ=35TL_e|dS?Y}e-2h)9dw;N;Wq)2~_k+uPfeCinw}(t$uQs_`Jha^Y{*eN?WluG-ER z$8lP0n^{iMFkk!25&sl2BK}-mUFjIh+Kr73WsF%fu>ZH^Zzv231cZXc-%>ua8 diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_data_bluetooth_connected.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_data_bluetooth_connected.png index 1e4bbf52c4f51886c2cf685ed23e72ce9bf6031c..18c77df2d2a87a4c6a0977844ca8cc686cfd01c1 100644 GIT binary patch literal 1544 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 diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_data_connected_1x.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_data_connected_1x.png index bdc8c2763ee2ba31cab3f93913782c32f1f1640c..818e29230fc3b5ede6e6a8bab18462cce7a0c062 100644 GIT binary patch literal 1699 zcmbVNX;2eq7+yK5ki{gMCQAvI5~@(t zK|6v~@kFi4C0GPGT1>$zlrq$gwc;_3&@!VU;)PbxZa8dzIR5C)?0(<-eed(U_iRC2 z%o2Z}ARhn#{1s8Cidt#Z`|*_bsBhaRP36=wo0O@^cp`~R)7mgVY#?+Ps4#1jF%_mY zq<`LyMF4+l`3ReZKoB_o&?##+ zLlUAw<>R&}Nkli2q!nQ@)6&uyX>0~zOJ>4Cq0r62Vue#0;r4V3sda=~>>(2jC}!8& za4U%u7SPS8)e)(rh)#Jr7J}KTRK6j$*vAt^rHtv&TA45dVw%nFxJI?@qze1jjkjvs z6Vk01Q-#@yRGXfvM^eZHn9AL|4Y?I5Z;)6UP8CIKLJ57U8MBZIR79t47zW&c@TD9c z7v{qp0Sn>@U|7KB@#H))TPA05*&G2n!SOaM8%B9jwv;20N#rn$%7tPvjPfC|j0LfI zGQMmAtFYKftwoPb*u^Qk<5>1Pv53@$X-UGCKoF*h4u~@nBw;raR!|zx1(jMoZgI=* z@{C1`VmAB>%pkWBW^gpW2>urP5G;UTn9qUuV{r>%NGKBu`Fyb)7D`bGeH?4}KRIJk z&M@80@ta%Wm4tjK7)R@j_mO!eXz)eTv&ZYsaC$Ib7?d#bAZ(FAgw77g@wIkCHvVW=t zr>L5E`4771<+Vp|zA5OF9~oMw-X9a{Uw+jTj4m%qA6&ZJueJNuJnpG{D62DId#2ra zp54{eH6!-eg~qCQzfCWWep;S==Sju|Xg~+{!A|G#enCFEyK5cLQMUF`s_N90*u)6= z-38TcM>e!DwT)3u#@e=XXC+?;Hk`kOYmUrc=5aEoZ}XpR`}#v^v!*~zlGP_orbFG& z2f5X`IS-XTWDzUV4v9c7yZntQLH`GYP=pDmUlPib!YRQGc`5O zFKOz7XWNvv}z-ezm2;*6z`vuk&JD3u4}T9@Fr$Yj`9(M|rM%C2*j#|Ix_6?WdVF8xPN_ z^Lj5jp`zfB=#}@G2H#vnd@It~ob6fM5+v;PEU8&Dw9Kb3dG&Rx$a~nPUfB^5D@_?<4+ugqng)9cG Ik|gH-1E*?_ZU6uP literal 4181 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 literal 4228 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 literal 3897 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 Hu0mjfpGiTr diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_data_connected_g.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_data_connected_g.png index d5ece7a58a74bacd859b59b3a7a00e58439d0f16..ec672eb118e554d831d3c4785d9670f4831e3d9c 100644 GIT binary patch literal 1599 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 Tgx-Bl2Nl$wu6{1-oD!M zM@L6C*IFH4jMQrOj0oSJjK||ve~%v+8i3Ll)N2M_>qJNI8-ER2*ZZoXW-zWFXbtGV zs4xc9BRVzNXXZCxt>`(D?iM`o7H0 z&VKS$*8&zq!sGR|^*!4`p|)+kNu?6-mtEI=mP)14e+=!$G&~ z0>@VR5CVTcEdW6d{)Ds`=i{&iOaTTU2FO8mkw_#8{{XG3R$YZ{F|O%$TfjU-0x3Yp z0!NWdCNl&ZaF8o_DAB$*d)jxOLR4mcetyk3i^VH6Ci=j(?f}MU4Ol9an>-K7)0J+m(Y6J6q{+$2vEkw2t+TVU#e;)` x<7Qg!^z#6K1E!ggm%s17g8qa3w)_%c0Py3=`IoZG!vFvP2>?k&PDHLkV1n=Yo6!IO diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_data_fully_connected_1x.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_data_fully_connected_1x.png old mode 100755 new mode 100644 index ba240827d25638a1f750856aa59ff8851b8291b6..0e6849bcd63a1a1da50dfbb842e6ba06cfeb44af GIT binary patch literal 1680 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 diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_data_fully_connected_3g.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_data_fully_connected_3g.png old mode 100755 new mode 100644 index 5af2b050cb9e752a602d2d46bc7d0fce9b10a64b..a86a3241240286d538d93fd8e5fd5a45926c8b28 GIT binary patch literal 1711 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 diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_data_fully_connected_e.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_data_fully_connected_e.png old mode 100755 new mode 100644 index 9909b09ca44e5e29bae736bfa18b6e52ac26c7b1..24902d6d59c86c9140cd3eb19a353d9329feb5f0 GIT binary patch literal 1579 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 b&%n&Ee}YCc$JcXCpd#DT)z4*}Q$iB}i}gx% literal 3891 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 BJMaJi diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_data_fully_connected_h.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_data_fully_connected_h.png old mode 100755 new mode 100644 index f84ad32aaa52281676a05b5ad3540f98eafdad86..d459ee37dcba099ec8efbca258a2fecf4e17690b GIT binary patch literal 1552 zcmeAS@N?(olHy`uVBq!ia0vp^B0#Lh!3HFcSnpm9q$EpRBT9nv(@M${i&7aJQ}UBi z6+Ckj(^G>|6H_V+Po~;1FfgZOhD4M^`1)8S=jZArg4F0$^BXQ!4Z zB&DWj=GiK}-@RW+Av48RDcsc8z_-9TH6zobswg$M$}c3jDm&RSMakYy!KT6rXh3di zNuokUZcbjYRfVk**jy_h8zii+qySb@l5ML5aa4qFfP!;=QL2Keo`G(%fti7VnW3Jc zv5C34xsHO7fuVuEfswwUk*=Y+m9dePfq?=PC;@FNN=dT{a&d#&1?1T(Wt5Z@Sn2DR zmzV368|&p4rRy77T3Uk4Ff!5ws?aU2%qvN((9J7WhMC}!TAW;zSx}OhpQivaF)=B> zw8T~k=u(ImatnNY;RfdwLjwvJWcn3}1^R}12Ku?VAb){X7ncO3BAkI$b#X{#L8^XG zYH@yPQ8F+-(v)GEfnkT=B9KC$Ypnc>GJ%njnB$V4T$-DjSK{ens|1wMOUX>JayE4` zcC&P|FmyIDFtac;v@|rZbTctCb2V}`G%_|bfti6#ueqV4laZyVi?fM~v!S7jo28Mt znVYMDfr*oai@Ax56HKpXUU5lcUUDkT-b|pqP`%E0^;$U>r6!i-7lq{K=fF}xKt_H^ zesM;Afr4|ese*4}a%LWg4~ia$Z(UN0GRsm^+=}vZ6~N(Zm5IfEQwvKop#KaFETH~2 zax!o>HMcM}c62m#Gc;C$>P;ah%=Ced(FY|Cq{IRf0;WI^6Q1;e9C+qQ%>(9`B4E}~ zUoxqkfq}`v)5S5Q;?|om!~Dwu0^cmlf|>(w>4mDRsFWRHi53+0p1M$Wb(4hglApqB z(oXiUD0@s~F`@ip~-uHZ;M6!91dC{epN58+@SN{F(Ps;^U zirxjqJnu{8{9(^f6?*Jp!4IkF9A8~UT=$DJwtPwuo+0pvdDY|J|0Ec=0`A;C^z_D$ zMY37m+YWl9ZN8}`SJCrL{fo}hl1nDKTc$blyt*gBSd@w=# z^rlmL>&=dSwqb8RwdY&G&!~$wr_yrF--jhPpKCvHbM`044C%$^d=JSy_$|-BVWp6l z8UNO=74ILb7d(y5&gO~xCiGT)NBmjEybFwW!4GHe3uyLbS{`5a-BoB$cDed`xxD({ zso(hL#fBAmG~`}sn5yDvy0xmm%ufDc)seDKqSqSh8MjHSIPGQRxcAxpxszgpGi4(< zJscC$b^pCg+IO<@hs^xtd-fOA8~^kB88f%l|K`0_($Wd)Q zXXK=38n(}qdlMvK zy=#3Kb@izLOYyfeb^Wg`M0j#?PD%aQa>XI^H)q5@(MTq<)AEdL3|kH5bVZ+BECrR( Mp00i_>zopr0FTH&Q~&?~ delta 855 zcmV-d1E~Cv4DbdaiBL{Q4GJ0x0000DNk~Le0000J0000c2nGNE04C?4(vcx3e-cSV zK~#9!>{d%_6hRQ~o}Jk-VPn=9jCc_bq7pZ^5DhH22QT^uB!UQnl3bFL;N$4yXviga z@^Q#N@F0Q_0tN|0NsQ>hgMu-bxY^BPH#0rmWz}rYrZ?{7A$p3v6g5*__0^-RdWQo5 z`&*0eGO*j@O`P75ETn{?qmaPZe~Xqh_TbLxWoDbeNDfjG$<>CW9B4ywU>kA|$wv|z zum;T1KzoszG%zWaH6ZCW81iMLB_qNbF!J2+{zY(9l;Ci};jR?mH8k_t<7e!-kFSD* zge>bW439#eB0u{~&QxLKcNNGHBvK3h9S4kFxCx-f5ayI_d zzlky*3!d!0=-g8nHaQ|aW1Om8Z-NQou{9;pKvwGHt+1aba`s!|)L(#mv`>2GC~b_4 z#==`$hE*~OlSRL)d9{F#^T^W}P1s}Pg!J@$$~drcaSn>)Il3nbf8QaGPkG`psK^PF z^z_`;1*80ZQHF0%u8LFGSC$k^rCRx-9_ZOeSG=km`MjP>_0R7!h)(ow_X=G@%}B*t zuT%LyzP35%t+`yTGn2^-Pft(xj*gB_pw0ry58!s%P%WVRM{Ls?KqFGhG;tL7pnQUW z1_lN`MY@B7gU687e}GvAkQ)I7L6D}1iPJmD=@#~VpGCCk1fa1;5nx(feSLk^2!@7+ zx~MgfTDGd0RXgCYu%o{=EX($;p!JocG&?#vMuZSmVSj)Bo2jWOs^?3}ip5`ZHOr?H zot&KPL8F4spg`~Xq`l2rqizdOO4)3-v%S52cxGm%cWi8IEn;I?cJz6GfGtroqg{Tt he+B&q+xGe;zyNLf$yvtmPbmNZ002ovPDHLkV1kinmFNHf diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_data_fully_in_1x.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_data_fully_in_1x.png old mode 100755 new mode 100644 index d80a8ce1ea85a21116f8dd55845c815bd297fb60..7b64751955e64276907e71ed91197399ebe163bf GIT binary patch literal 1864 zcmbVNX;2eq7!DSTX8}d=XzjX4bx@Ms+*v>jIe=;~kf2cISdtBiB%8R|kOU79tm1gk zDjvnrLGdWX1MwEALJ<&=qT+#yBUPXriV9jS19qce`@``^cV_qd-tT+g=XuZBb@H&_ z(IX~}pwVcfLqo(7)apUK-wgYl`j-0@7f{PYQW8Zfj2hC45*SUWHYQ*|r~ysHA}~~K zUwRqyr_nys=#)`plx!ZNG8*WpLx*lNm?&!+%|Fm)LRCo^2_#^NIy?aED!u>$I&}cJ zkRyX+CK0C9g`^OeA|*_zN=Z@))L`Ijz~6>Y00xXi0h>XOn-N<8_zoAL_Ksr)2)t7v zlLEl^PDRP&fXGN-0EZ6wsvs@|aA7*kV)J;sSpXA)AqK=`z)WA5hp?Ck1OWpNNU;%W z4H6-i4scOY0H`HN6T)Cvtya2~MK=#`(q#d6U34V zqNfOsL?38bvTxqI9sS#sI=Yf+;$OlpOA;UU*Azt5w{;m(1X)tK)h-{I3C<5SIUpw z{4RVHeC__zC%^ynyrhKJ`j~JTk*s-m<(bAB*uAo5r{96>qW!>RuLqTG93rCS$f z9Js7C7hf6fv>A}JyLLKt&%xyDZn=46M95$9=JZV|TQeuJ$o+)$`tDb?P4)Hl`Oo?r zBI{PZsPL|Xw4Pd5?R4$PDi^_u_36;m^5r=PEc~AJhu2P@UR9jKxZ!1S_n%mu;gWl> z@YGhWkNf(DlK9-R+M+{rRsSrz{V{Dv#^&e@-H;A9{Wg!IY|}0-dE3b;xqfw+SD+g z@F@*ze2R}GHQRA|zEprLCdy-m)*gJpGnKoxWS>aqTeEl)d)xdh*{MmrS)WI<+wcB? znD1hhitQB(cFgFSr+#kz`_D7=bReeW!mR0Rv6-c2J)D+Z!Yo zKkO4(o9CG`txtF^XMqOYo#$p=;&-hvWy3F#dHA!oW-MmH5)K;c%i-NU%qdQ ze`UE}{E9cx0U>~-$?6(9MbkL7V`io|+FMtY9OIKcWas(gISE=e^;a1MdnOb|?6>pe*Kl4bb zXZsDpQdWhwo(gw1WJDgET&D@&;_JPNBk#V^eShq-)5=HdwZTrknti#gFC&%md`n;T zg0XLx>^?rnaR55%{c literal 4373 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 P00000NkvXXu0mjfM@cnU diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_data_fully_in_3g.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_data_fully_in_3g.png old mode 100755 new mode 100644 index 31c976a0d6cc13bd1a4916e1e089004d2e78088b..d82930ceadf4a1a3098c9601d011e29fa9325d94 GIT binary patch literal 1845 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 diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_data_fully_in_e.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_data_fully_in_e.png index ae90cc8a230451eb46b30729ceb3ee5456489274..8096846f08cc65fce9b077b8c4a827dea17829f1 100755 GIT binary patch delta 930 zcmV;T16}-{4$BRY7YZf_1^@s6#5=pIu^~AEAVWbpG&C_qFhev%LNPH!MmaJ!HbzA- zFf>9qL^m`H#SB^FfcSiI7BxzL_(9c0$?C8 zIXEyeF*h_YH!?6bI59CfGD0vzH8(gjGeJQ$Mlmy!HUoZtip_z)0008}Nkl`q>>>yjBAi%?V7Nk1 zgsT)SY;3How9tqz$!*?tc4mB@-Dh%}y^SVtowx93cV}jQ^Sn;NwAR*sUfkN}>puiK zlP2!It)yRn8EwupMo5qXY0_k14y*twf?OIy&;S&I#4JFw4q@{kpWYGFAsI{af%SU* zvSnRuz~lPz`G+599fFRK(8?a@D_Mu|C^snxlTvPmVYmQAzx}y+@g!MyNU3l`h~PP> zDZ=0-j4jeeF0mNTgMs3AA;f|lc(1;{-Z%xX6^LAaMSv}02nypR)p$JF&=~^)>}(ol zE`ZK=zbrp#e_UH*jFq_!rr4t|5mp9y1~`ggqtR&MK&@6g1NUt+e&W*O!*E*y9RsIU znN1VP5#W)~WqS-bN~hykQ52^B@q` zMrU1SD;FNU!4d(L2v#+5VzRWw3Vp4)yv`(8rd))zsbg}1oB~`Skf||;=CmbBFTjOo z@cff38yZ+%r`Ti}!j96tNWClRW8)sr91hlhBp|xy7pu?-JV^lOgrw|3X02|^Kb{6n z0y1-|^t-z-lL(x}pCFyozUkliP`Gh=XCjc3rSbl1=xxGi$hhvn9TK2_gF588$XYq^ z_+pw?Muks!vcNMIF6tZT2W3_m3;zjJ*a@(7ZZWvcQZekc{8fUenSKJyq23E11}v3- zl%xtuWTDKu?c`u^=Sb83T=+M2l7Kd8j$nOCj7(e0bAY(xP{9(FEF02CrliWLBdaiG zdya*scmsUG65*BLp3U~gS9blCX<{hJm0xHbW_sAp+K_DII@6VnqPXmMuD_IWi>KyA zrUn06HYSFWz&6>(#&aLf@9E>Deh>Z~&K&?}zWxX>0GIbUP}rZ{0ssI207*qoM6N<$ Ef{HbwzW@LL delta 1013 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 literal 4067 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 VEDM9yGlT#D002ovPDHLkV1f;anUVki diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_data_fully_in_h.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_data_fully_in_h.png old mode 100755 new mode 100644 index 816085bdb799234884e84e6d692d3b183ef1a829..8805a40570109df9b292d74c4c01081ae451c3cd GIT binary patch literal 1732 zcmbVNYfuwc6pld<0Yx5yrJ(DIFB+2Fyb}o|ab*i*?i%og$?wb{xR50?GhVtKA^j{&4)!o!Pzj+@6wD|Bhg!~q0Hzax zn>b2HX_BI;SkyK%8n-Pr9@&xQGi2-LJ^1y0bH04v)DWyj|MOy7-B$72FwhFc|sOb2tmN~1CrLv zx@4hRrkJ)xN+K|oAWT9A!)mqCtt>ijPGP_TfxyARWQLL&p%%N5(Aq+cmSr;xGSq^Y zF%yB|M!>}hOWbOLMbPb zr4T6iu#^dL`7kViA%TL;<;t0In91U@XEiby=6D>}&vbw)6(?{@DsBR#aU4LYMKGg7 zc9iF3v@+C;ZAEnoGj0H;@+-t%W1qtlaLM>!h(8@SGZK<=czhO1BH<`t7C4R7{hypM zNM{(1=J-#u%p8#&=-9q$eNuQeJgAYJ7&AE<;?kPq6bf}TS|*9N^*r2v9`6$SUK+Z( zHPGj?VEM765D$ISz7Uu0W0Rf))umMB9OnlwiWVjJa&n4%(1F+24bN#4 zOM-rRf4H_cXy{=|zqbHemU(1l&i#p}&(2zhTC?UStlQfjxF_)OglGO(!<_L5dPSqJ ze~M46Yw7IOH;BZ!S7s$h7B*li*N-HfVQtx!g*PSPx6`jL4jFF<>^3&y3(TjSB7WUp z8#Y<^ggp?vF6*iPsC#SIuohFZV_Zl0#ecZ?{ykRm=yby9qo%_n%}LKrA3pca++3$K zK20j;_saKO5D(^*1<&(p#$TM<65-kCUS76~Pqp5QfxhS|cJD#Nd4`I*Y)V7;#Mx(u z$8*qK>dlB>6ZPbY(fY!hV&i;TQuiRy+;ctcH2p&6n#O~z&-GsP^@muczgezaeOwgU zCLavlg0z7L&L|7pzsA(Dp&F#v23(+B+;CH{ICqtAUr0TprfTx9L+Gc$PD2YbcPziy z@j>hFH`c5wTNUgC9#9_bt+fx<6?M(hmNm={INp&pzoq$-#?QW>y2|XHc<`=04?VI% zR8?IYZZG-f?xL0Q+S{A$_P%=5d*8Lhp}wNk&P+3wS8#~Vr*qmFQ%SUA;X@B~@ION0Z z9@+HsdTve5hCK)TGdfZ@i~20QhyI*_zFu}wBV)9h+QnaIE4qB6u3|~H=)+E`=Bqme zY>hDObBu;ovYn#(A9TBU84Ik7f?5|3>z4}qSBg9JEy2A%C0@svyGH`ID3ViVji@B; zzPCQ!^Ym@II&aWzU{}-q?up7PvmZ>lsXY?{#)3}iiGry7t(%8Cw~O;{n^xDg1)fab z{|W7}lHc?F_BJ3h!Izb#xV6*V&{>&5tEQrhzeK*f!!Fir;8yaImjql({y_y)R4mD$ pRocLO1g=_}+h3gbq$HQ>K^ZR(>**aEJ>mGTM9X7k-$o|x_y<7tmPr5r delta 1035 zcmV+m1oZpF4WkGliBL{Q4GJ0x0000DNk~Le0000J0000c2nGNE04C?4(vcx3f5k~e zK~#9!>{d%_6hRQ~>Ydqf<7zf2Mtpma_zH+9z7UL$i~a#Yh=QPa@g#zeqYn^42#9(S z^^mIvQ4qz5sH=#mM53Ug@e$)IaW|XY?9NP=RkJ;AZ+0{hyy=9dCN2W{;w1b#of1_xj@hyCO;~O4YF;D^1#x|`uEk|!;V^434Y3HH7 zNUKE4)qquCQUi^rHBJMwVL=13ZNktG(8?MSR)MkS#M5iu95;_MV>URxi^W7e^vqpj z^*+DpO)g|`N~pK%pnKs4t4l}cMS(f_er(*d&psysge1+?6Yfs-UdoHve;fD4&nSvP zDHNBFx|>P=%FJ&~&TL1FaR=$lF%%#{I7u;q^f{IUD3E{{knQx5;a6aiqOpLo2Qi9_ zqI2q?k#ocnI0n)IQIPF)o+H63s0_w`BxAN{c>CB-lC%LL3M8t|Y7xt8^){!KLHT(3 z3EE!X*_l^5?J6@`N9isjO@V& zk-kvcPr4E%Jic;^eMC{%?1=3QI@J)Jm9AS9L&~QOemPIYocK1c#d^e&>kH`{e`h#S`>!{aF90zhb6y*ed;T{ej%BnXo4DJCv2zr>Hi9>kmP$3bh9xDj$dnL zq0}^2R9=1=j3xj7?1q=B^p{c0&HQ&th4h-5*15-ns5G7CtSud_vEODFhwxb z*Dcd8Zo?ksVveasx0!o&NABr=C)4xSTltXiQKd17L@Jmtwt$AIGPkq6E_>&EXwGo_H2%JA zS2Ke*_yq8QWRIxsxj6C+s09>ehluRY|9?6D@$*A~0RYzW_p{=^bdUf5002ovPDHLk FV1kcZ?!*89 diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_data_fully_inandout_1x.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_data_fully_inandout_1x.png old mode 100755 new mode 100644 index 01320192bcc7c6a51d3dab4c5bc05532da0fb063..07545d52cad340d6c820d66f342574467c1326b7 GIT binary patch literal 1931 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 UZY$rf&Hw-a07*qoM6N<$f^GL?uK)l5 diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_data_fully_inandout_e.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_data_fully_inandout_e.png old mode 100755 new mode 100644 index ed099ffbdd5984a7fb3bb69f10509d743821a9fc..28578c6a4b5c7d34f37d0eefcc8bf7151aa5e643 GIT binary patch literal 1822 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 P?0+b^G!m%@Te{{SO=-I# delta 1119 zcmV-l1fctl4)q8jiBL{Q4GJ0x0000DNk~Le0000J0000c2nGNE04C?4(vcx2e*_mv zL_t(|+U!+ zh$7@1PZGqVCl!Mt9!v&B-4$XK)}Wis&pMmTIDg&KKUFX9^;GZHCNr*x-qORPYF<@+ z@2B4Px;X%_|LWm)!2UhhvCc?F}q_1Ep?xxCV?Y2j{=YCejeLIWG5A3UM&Z zuRip&T>ACvY&5FDSfO|O`NGcU>>q}c0vjdC^&ip~P8TCyX5s(1_5g_d|A@g2f0=yf=Hup@h4 z^Jm)2x96aHLZjPci1t}@TB&*)EKOt9)(Q`(PM+c>yRrQlIZGqe z7vLJL(>|L@w|Yjjh}#Wl(V;w8wA-ra>o{G;aRj}|YmAK0KEqG7e*%Wx!Uk(M%1|fE zMW3iGK^14!zpg<=WgR_%qP}K$t9s>3^^frDA0N&3NuS9qW?3-8m+4U7ATNLPX1o`< zDUh4m4S3mb5=;wY{OGwsyZumCAjN>y9omM>V2pE<_{dsQwrAYTiEqP~X4QCYNpBt= z6*umia;~B-GY^?)~^_e{OOUR(T8zrQfczS}nCT$w+s zw%{dY?nTattLBVx6dO@Do zJ}bIByqqBuPs%81ICJMeaSq{aF{L!4@#oK-Bb>{5uOEHF(xCFt7?hA)TJHpIn$1dC zWILXh*OG{}sLtpBjakAXtoj6ND^;okMk9KvF)bsj{biL-V3HVN2=)9BRXZMREbCSr zW@8gir6+Q)e+-=__9gG3sRu87nTc-Pq*{rnvJ3uErDF>!w<@Ca+c`d?Q)m*^F#P7l zv*K`dQIsBjR)z)P;%H#pJQu+|Ww5{J5-wnqX=ftt* zpW@pmUhyv5WG@(C_13O$bkaMYy&G?-FX@dNMn!f1HH=@jUeLFJ{q1Ljl@`v{_FP!^ l!^P?*cfQa5N3fd$3;@BlRD-}JghBuS002ovPDHLkV1kbv9zy^C diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_data_fully_out_1x.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_data_fully_out_1x.png old mode 100755 new mode 100644 index 6141f728250143362be3d712a61515d216579cc0..783c2b606c7751b931c5a7cab7c1e036fe5eed8f GIT binary patch literal 1877 zcmbVNX;2eq7!D8t55NOwgaWRK*a1zln>zudAt4AgLJ^gL_-aw#9q~K7qL8Z=saUcaw(;^|1!4?|@&}u>` za*hm?8N_h9c8LXpms^&_sVy05frb*g7zj2C2?9Ngs{pfJhZu$C5XyUAA+fg~Gbq4& z6+9z^^1-PDSqvaXF&N;`L7E!mf&dqyLo7Cr$6Ew2K?r1kOa{cHK|CRgDFi`a{Gkxm zFiom3Rw5m@MMxo(bR0Jb84Q!jL^rYMD3->61OkDbgUO^38Z=`zf~(9l#7LcBkibSY zrZwPN6anmvsuXk$9zr2J{SboQAd`J0MvUW$B2vaMs|*Z?4l?w5dtC3ejd(2luN$A# zHpXQeU`8x#MAu+yq8_Q#2{4hn&l|EU65a@-F)dLPl}>`H*XUsckCcQ^h#R^_s}YJh zVJxXY%7?^EkjsZ40R#%9Y%VvP84fX7T=oRVr?65MpT!0xTrpcBfgp)gz~phI;ULHk z<4bsKN!SE75;5W`L=8{a)e?5cv7FChg<=d=;V2e|qPmF=h)G9r)R>MM0P%7TAXBNe zh+Vdq=R>p-7}I9K8YzbAf%o|pYCmCL5XR+%^Z0yFFdjEE3>0&Cd=^V2;z%JDWgM&d zKRII%&M@rF@td~~-sa8`~eD|?A>--#>Chh#%bB6zg>Ey`@a-RFg8^zOIJGK>t9(s&dy^(gU=f7eB|> z2m*$x%hDA7Cr?x*cKt*?<^Aqza8G~ffms9J+&`K)>BQfFkKdjE|BMK??2P6;xm_j6 z?a?JSI{UDj7SgaypZtzL<5C89a_Px_^0`s3;C3+Z?PzZP-kVNT@4|KGxj(e37RiT3 z25k$+-n_L2DDS1Ji|gy_H&o>55CrM;yAyLWC8}nmeLx=J49p!}o9JW7Nj~a~taw$4`N^yG{g>`%((a+@1+5qq=VN zUn)Ox?MyJw{ZB`ysNMjVDpzY%M}=bE;A(g4TU}#=YeLiNY17I_uH{AFO~XqaoEChw zuui#Z*KVyx*}<`#>xvp_;pFs-%G}%20(4tlu7<&!=nb2;#spr7WX20uz$|erZ{?S{ zxaN&$PyGw5c(!fmzJnNBe-JHLp2Ssd$=coWm8^sE@IiTHK(D$W`N}ju(gvGimd)+f z+4HG~_K)g>Z4Nf@T4@E^>;A}U32|I6J+<&j@Ya#)oQ?%TTDIu>K6y~Z)0s~O@@@FH z;H#a-p1apO)G(F)Xp($$sJ!V;OLej0jMvL{T~aNp)w||N@a!1*Ac(EhqO@JzehsV* zqJ^q$MX4Tt{A#Rsui0M&I#$rd$wf#|%f?($>DhOrw&9fi(lgDlPu<}qZZBNOJ_qse z(V|ON*5>;+O<7ymNPby+5fNlJ_j%Kf79`H8r5}1pfm%AS19=F^9! z*1K36p2x?=T(&e+7RR%nHE@4_e8Yj?)1N>}TAG{LQF-@X{x40}`*z=Zrk5Yd4BYxx ibl&5|4xu@%Gn6Flma5^b4w0ArM;95sOi~-BT=x%B+ujQR literal 4340 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 diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_data_fully_out_e.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_data_fully_out_e.png old mode 100755 new mode 100644 index 54ebd9bcafabbfea5e5dfecb352bcf8a285e26e3..cbae7dc5226dc70c4cda4cf622f5f2f36dd4efa5 GIT binary patch literal 1778 zcmbVNX;2eq7>>16MM1#8$e~@rp;nUY<|Kg>LpFf`K@E)MR6?>L0g?^LS^}1_6B$f_ zK}J;2A{Nwfybu^sT11c{idv2iDk?$+JZcq0tWp8n4TtRy#~{YiXr#)MH=1ggZ+WqO3bSD=XqAlAr|5Gf*4 zWTdqr{sh8&r8+VSi;{$K<*0@tv*=Ka8Xb-%5c~s-I+;8L!GJ_0Nv-9PM(P_$fLg&L zeZ`c35}g21se?21NJM6Mq&zc4&QXv8z6AV@T%16IU^2j{N!1#-MjmOJmy7Q$$5aw9 zt%9ZSNHb1FNj3liRF42m3P_fNED&Hp6o}4Xv)MiX4TL}{NTWhDGQ{T6X^a%C~9|EhdI}B>aY=P%F3s zW*}X}5&1#_8p!g6APxj_L<|;7NE1RdI*T#K@j)zKNP~qek$?dQLJ%zC(AX@I5Cj>4 zzAzgau6NOZ5vod#|GvK!w@NG9BINl(-_+qo-$)Q-z%!pGdTFt#%;$Xl%*? ze(diZZg2PRAL`qz9NFEwXpIl;MYUhRL<4&yYfR}(h;qGCS9|IC->b0UEH~CfexZwr zqPY8KVncCNUf7#>({LzkvU}CX-ci7R@)N+ak)0#R=k^Rv*H- zO542!dFGfag{M5b=mo!5wGm%0ZW^d>YF<-#E_+_~>D$4#I~uPpwGsx5-0#ZfUU3so z#p!Ycx@`V%kwc{$%*q`qr^lR+KUw*MCbw2lJ3jVv7!=ntw$9q^TgP_k@lW?m4H^uF zL-duqJ(HK82?_&7}(E(_ar$AB{5ec6jHPTx%SAme5>lQpZ{?(D?+t?S<0bwYj24G6kVmKc6t@ zUp5b(x&ITkWT~SjzOz0kaeeKH+b!GH^S1Bm5D@)}FK#^PxBzTrbg{VZ98z50yn`vl zOM-YS4|pwHDx*RS|9zQhzwAv;giS3HdD6J)Se7nhem>s`tv>~;2RFG0M zVOK&vm`N@ literal 4075 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 diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_data_fully_out_g.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_data_fully_out_g.png old mode 100755 new mode 100644 index 2fe0bbf690c2447ef1dd7345c39ee1e68322cc4e..11f3a5c1db7cd4dfd2aac74a6734fe31d914c88b GIT binary patch literal 1769 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 U{I__l761SM07*qoM6N<$f?_3~T>t<8 diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_data_fully_out_h.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_data_fully_out_h.png old mode 100755 new mode 100644 index e58e019468718882e9c4a7be06d6ef212615cc7d..eb42294e2daa5d2b1c7afc7dfbc2c4a31dded770 GIT binary patch literal 1752 zcmbVNX;2eq7|tMdB$T3*p@>S?#R^DCc5{+Iz>q^CjbON2FQyGOplnO#O3bsESe{^SdzwiCN_j%rXc31ei zH4a2KB7s0~5QXq1`09+mD;LbizZd+QYw%?;CXiwgs1i$-84&_kfhHh;NGnqz5=5p* zF^ANQrB-MySq^^sUrzXl-3NR=T2r#p80xg2c0JCnQSVB4MD){1LD?< z3ME^@7tY$kB@U>@Fg=@0PEJlHB~wYLQALJXES8mnLh;2ld`&4jOlJ1gnLOqg_=rhv z)aWq{sspTyvIH~<qF- zrpOdMLY5#VG|4E(>!I|R1LL{-upz4=?hQN4sKJXO+sa4fNm@jQiTE54zac3!3O0`( zOck<(elU*$G5lbd1w$+$jlmF51Tcllpv`f-56grFEDG$$C%2hU+eIuj<-$&op`8r<$IHu!^BHqVI2Fw_`{qFd)WAY6@Ns7a0L0bT?h5XiZaA8}bGuOFO zrQ8wA*wC^9T-E35G<=37;EO6PAU7W%CLoWJ5^8Hznp)8IBj3E}jnzP|%d~w?ReN*) zrTY(h4~|}YdcV1;rC*!v?6P>G{@_p4BiqLYN{TAhdewj`KKpa$rS&eE(;1A_%R8bL-^>y=Nc z>|R-JNW6HO5nCI_m7<2Ol#y8PbmHSlZp1`;|4xbHvH)dN?$Eh~Q`MQdu>a2vgRS;; zJrCoaOqN*W=UOJ|>x)nK0sTV9ar@A&kyvnlqC^qBFCTs^NUo9uc)Qm1RuoXQ~)NtU&!loQr`LN)y(AJj@z=NK$M|`zQ4Fx4(s++Q#eGH>ba< zl@>KVEWc1O*0H@&e>i<3)&54|!=^kq*|4|&N0!(5b+2@M@6iWtcUyA}4lQ0oqz9Gqk~G(jm!rSutFn<5 z;hx0t zY~|`o%e5;RHZ69yT0?GiNU2wZ+s4E;4c}7YJ(Hran8v(%JLFluZ>+zQ*Vw(h$!X`l zvl|$tJ*u#)X#uNpY}${F)a-N_o+m2z4;tK-F%vjVga{+KVJ9ng_a3$WYea%|{1d_P Gng0O04yb_u delta 1098 zcmV-Q1hxCv4d4hNiBL{Q4GJ0x0000DNk~Le0000c0000c2nGNE0H{6bu8|=pe*^+a zL_t(|+U%G~XcR#dhO4H#r!!eh#4YX%hz5-dC}>bHf(Uw34-!EHK}C?{5CxZ`%h6o* zqImP-O;ChHh$wEO(HI30Oe7kTn3+j3OD|Q=_j;(8yaG`-k6x0li3I$0I%_=y$XDpB>iG~Bpg$727#5y0iE1e81)eLS52dr2n z|GIjI-uL05Tb)h80zYq*^6s^}^e&~E8#b7kNx;0lXN{W?&RGOA_pds~e@PWP!voXx`gD76U30HFwu&QsmWivbov zm2{4yjcceFs%Dn*c{HY|<)jVfaLSXK{zM2J>=z+{(I2*&!DjZn7UkF)od3Zz3f%O` zJ7GSyA2AOTAa!9T1q?V8eF7o5b z8fD*W>h)LDl79gnqvLd5q2*|zicx8?awCu?0Ix$)kMxin#N7dGf2&X>&%+3q&QtYL zgaU@EiXd2Sq#uS!5q~|A>VpLCC6eD@NVxet0b)L->ZmBj7!##ceDKbBcc*SL-L;ro zQo;K%PwITVan#y^eiji9lh_WZI$6*>9rt=nDdsPEX!THzQ5IN5WE7Y+X0R7!J;v2F zRR1b_UWvu2J~^whe>(Dg$wuu90p4!TR`$G>C3XgUg_7qVm-mNh7k-hUYsx;q5G$f( zvToykcI-=BUjO`pJzlm+%UNkwb@KSBmkja~zNMvQ6{^%<3?I|qx4QEy=E_YA*F%$& zUUtCMImOgbc(Mt%K%h znW(k1Q&4{k1oH;(%58ei9@RR!?&+s-h027GjM}$%wbQv_tpjJNQ*5xGR$ zzZv1ouxsVdf0E?aLvnaD(`1r$J$v&mei*$mnO_z`G9HgNw6(Q8$9=09U|A|P(p%T( zgMM#68tv`qdit!hv$H`;*-dSGdpki5hW4L$pjOh$7zDZKwssGkS|V1N5W@LTEeljAKxQ&q$v@L6E`AZyPw*fiKwZa)MV0E?VMuuKdF Qd;kCd07*qoM6N<$g3|B)Y5)KL diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_data_in_1x.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_data_in_1x.png index 00a29a484acdd297831b5d2ce6b827e38f412f2f..66fb60e90364dfec4e3dd567124a722d365ba9be 100644 GIT binary patch literal 1804 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 N002ovPDHLkV1iA@R-OO= diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_data_in_e.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_data_in_e.png index fc135fcbb6035060eea1ebeb4d3a79b0646a6e55..e39767a6dad1ea5df1635066fadd6dd7bfbba68e 100644 GIT binary patch literal 1752 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 diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_data_in_g.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_data_in_g.png index 3d33a6262f785f7f23253201e4004952c0aefae6..47c1fca332372074967abcd7b30d334d39f0adc4 100644 GIT binary patch literal 1760 zcmbVNX;2eq7+w%+jHGIzPJt@Rg4P3)-6UkmYJ`wO0)}#=no-KQBulbDvLRU{P&6ef zjJArFYFj`nj@D5`hfxrUN5!Ka@dm1(qC!nc=&g_2Q`+e{8y!Y&i z#Dv)#b^sdy0FEkFp3JO%%sZL&4)Z-aqp6x%{Aq=jPN6dBJlskEQazPUfGQJiAd(4O zpPzG*mH64OLQZIq# zMW|u5MMfCO*a9n&Qjnn06=dnedMIiZIMa?X1SW#ULAxp2Y{Tpl=p`@4?A^ya2z;qR zXGx$}PHEMNpp3E-U<4Nq*TEtf6d_zhAVg6#4CKQI%!BzngddKen1GMLFgWx;j5Vu1 z151`GhioyD1TxaJ1>^DZ^76QO0xo4W@DQRrrCX+j^m)bTunfTX@H)`87 z`4)ngOxUPgtB$EhM#wOj$=%xxxfL02u#c@IQxrT~PU&(@gqc>!B@lDN)suP*l?g== z2#N?J`LHMwK_Uerky0cTD3tsNfiO}&%<(3y0Fj|Ff*5&>B1VZIa-~=*MdT)J>dsc~!YZhqU1U+P2Q@u%ufWQB+h$hGXy`nwoVc!Nyv2sw>E=U`$8g?OQpM;==ZJnEKb3 zv9OM+=)EDX8HeM;efl$cT%$xD-#Jf2dE7cNHhV(1&$SREzz>aFz|Iy`^xtUlY)q3)%|AQR8&5uE=z7=ysDjKU)2G4rpB2t>2v{qdq_qRJ+9`$3Moz(6 z!}ICm4@bM6>-kfGfyEyb&l|^jyu?q@%L-ljSHq;z$4{F5*ZB7C8og&k)q%7=^|nim zJHI|#1lRbbv^Q|@EH77R;pNP_w2=K5jHx9yfT4%cI@ zzC>r>!ghU9&D^L&OxxLgcmCn{wCM9cL^qvVe%b3vRrkirnGcf#*ah}gkEYMQa9Znd zw()L0tDL5nt7^uto0u2pgBv#R_w16Yk0)%O6mW#U3E88W=BOQnf%(UJASt+`x8ubN z#kL&R=DSzwy_4!E2l|d&+7;@vJGiQAOIsMHIcdA*cKOofY*uyAhlNoM%E#?Ues=@p z@pS!@S+3aQUGcwrEf*g=&2@6`mw2AK8c~zVEn%PWmPReP*3m@2$1#jM0$6@LDm&DP z!cVqoR&Modp68LXkKcM@pswTo_2zDl6BI7r-y2c~6#Mg9cRT#d8;@OjSUzX*mhqmZ z89@~y??cJk_pXZ132Hf?TB^OuHhcm(MjmY$C;}>DfL-4f?@0gkgug7VYF+dosV^xx z@Oj&{iz%z$_uY3oZ1l=Fvf}KXW#5~CdEUoz>r*vp+lx1)oQv^%_P1l8e}sb#1Lu4z UB>CF1X!k!yrAUzPidpFV2eEdfNdN!< literal 4049 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 D8`qd4 diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_data_in_h.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_data_in_h.png index f36e1ebb8a3e08545fe5b1be9d3d5fbb9ef865d4..ac80dceeca9f84bee619d3c3eaab3ef420fe8d60 100755 GIT binary patch literal 1742 zcmbVNX;2eq7!H>pmeN{o6xT(uWgywjoj{O~1Pvt!AquF7A=!|K$%gDg5)dYcB31DQ zox!6hIPIuFM-DM6U@hYXsEmV!p<)#eqy?+!6bJ2w!}f>ckM7Lw_r2fuKF@p4eit9N z%+1x$l|&-BiI)qd#Ogu3K`yh1@0Bp?DPr-(Mag&~s=|$O147~}(R2h5Yvmb;6p<^< zS=W$o63IcOktO5Fl31<+)sp2l9kNNQC(tBP_)?QzuE<1iARWoj=y>3WwFLw;N*08wj}=Ngd2+&GycH&ek;f=eTSa1)mx&?2}TFljgHFs_LQPV#bzz3rF+0+T9u zCJ&r)Dp?W_2v7q8Fvw7-0%Ae{6DGqnI*Y{$0jLlRQ6MS>riQ{SE{)2CAYl3d32O$W ziYpaHPun6S9;n7~J(of;8jWNljf@&HC@_b^v2jqTp@c>#X4c_yQ>YFLoM8|mn8KjZ z;~G>4*cj#MXg1CR2~Vd&(CQ_U55zibI#EQ*C?>g{0+S(%R%?rEQX9ji$iHrUR2!3- z^$10ZU}&~MLDWMPI0Ghf_h~~mMZz2I3WJ6yihQFGRb*=s9WEB~K;nk1)F`6ZJg)E3KqCzyL zh$WiAigg$+*C~)0yBfmoG*<9QELUJaX;BwZLS4xtfpIhhR1Y!z?<)nu?nPLmUx@!(#EHVU9o;1x{m?|0ib@ z!WoLKIsVfuGe<-R+O{8BpAbF_527O`#z2fl+Jt!@iDdsyEab~fy~E`fGd=hotr@B} zm(q{V=7iLo+vDVrQy}a4aqAf-$Nps9in30yx}<-?*>$tp`}Uny#^u68j#|fV$G$^F z!-G2GNKVEk^smR%U;7?`RXf}RtYOxdc_STpsH$1IJ+;aur_C_C@XytmG55o3v*RwP z8&>EP2RQyho4alA9VD$w10oCg_JOFv&7={%$Lu*Wf>Tj4GawpC7z>4 zj`TbqTi_UZYo+wC_wBih$`76p^ON^2s(m~0j_#3<<>yZ@%}K!rZ@53c`1cue*V`fU zZ$_UAP*9VSw%5twZdXy;dcRix4%N%g?H{tq*_)14j$exV-E-cOA_1`Ep2A<{SeciX zx1g!12^BAXDUAuLw!eFS;pxc8Cs+KKex>d%X(=hq&OIl6)7GtPud69smn1dMy@?(5 zS!!7IxB&|kXQdwGt6%R4?&^%dvF0R_lJ5h2so%abxU6gR{8z=dPvltpsR6;K_HbgZ z7muH9d9OJx%MF_Mq`JT@%p-2dVtG*wxHQJ@wLY`=iW=P+vptVL+L#>dx~#<8gM9g@ zFyU3H>n6t^Zm6@eUd-{VtNW}{kl?cgb=?{jvgPb7afZ58HN1{Hk+Jzl>(`H+?(hCw(%BnAEo84cR8jG^boRae{)-xkbPmg_037M* zj4QhkW|!U3=#R!;?qFw~obA#MZU#c8UoHlF|8HTWZ)hG#agP&*Iqq)(n#KLraj-v-m+3BjSLrDNHkFGOW7# ztf(TxF7csa|K;Hp3sw^2KluK=JH>9amgGQ+eqgHbUc9E%_Jo@-cy|a@Y delta 993 zcmV<710MX&4fzKliBL{Q4GJ0x0000DNk~Le0000J0000c2nGNE04C?4(vcx3f161} zK~#9!>{dNUTTv8#@5Lm>Ak|=Fv`cA`4#BC2=oGioF(Be36(Lavr-Fk{iB#yML+fgh ziYOUWx;P}0A{H|Q3q?BEL8BF;`Lp?X_x7Bdd+W{5v#oUWgu}@_@7(X5ckVggdn%<= z`Cp>mgWVl$XJ<#nHCIiFp znggcO8I~o1q9Z)k%mAybf72_P9u4J&au}-IHhh(tQ5~cNM;X?_!n>gYh#AE1^Dhc; z9!HHbW22MHKD;oIFaEnc<-qpqFx(5+OvvR=BvhNP$0z zwnPf0re$%Z`6NbQ`ID2A4B@rXpao7(Pt))>jkc5-b_P)}j?ZmPe=tNS!d=e>1_qvE z??PFq!{JDPKWDSqehj}F?$)4_A!`cja~TLI?63Gttj(M?1O??PXs9YPhTPlRiz9@3 zwY|N4#b*$~>Lm&iTxU$%FiI_beSKY>ot^JvvDoO*(NT11Y3UlM>8VUj5(Q;>hUH)q z&_}3O6V&bU@bGY`f32VGDgMY*lYp!Os8}pE;Z4wX zbaZ@xOuFEDBea^51Wl*Y3S?H#A6*md@f!>_=fdIe-u(Q0xBS>!TU#Ed(-{K_(y{j_ zHZ52t06{>#WXamvnnOBqqd~tBe<*rgYip}}Y;guZb53F$`P`97^`}@1=8|&k`UQDuD>Uwf>b8|czjqbwSW<^`oY7HlH zKK=)yP+cxpYGq|5F*i5Y?smJoJRZ;6a3u2j%fZ3k#KgogZwtL9m^>a86JVN}nrey1 z<4tgb%V02gH!i)P>8;-y5||>rI82fdC7lLJTIG&GrZAAOzAtIt`)+Kx{69&ILhW=%EnS z45|dK3=t36A|xIq3CHzZ8ZA9Notn;|VunN-1jDe6gH8`1Gy;rf9j-71=!`zY3ec6yrk?@8)-=HRnqDV$CWvUj{;Sz*LA#SKDwTjCQ zVX^`tHpJx6K^6ysI1Cm`%n~p}VtOEh$w7uWK8IyM2rLwf5TQsYh9E=?3j`3t1_dHI z$Y6=sqG7B=XT%jcB|2Sn_ZOL?mH2W=z8LK*)kXK&nux zbvD^no{!NYs6m~Es>B9N3w+2gSN$3LAjAP7h|L7qALE805Ej8On=KGSa0nu#3}IFO zCucOm8Jev*{?jbOM??qOwx3#`5IzkLsv{=GK#ayZ>$z3L#O;(If=JV~-Y7W9L*TVb znZ6s|6^i)#Q*sYKMjGC8@R7M>ba%TMEY>wA0( zV{bY1x@P}g&B~zUZk#>&p46{<^2l26ybXd&*L~OBhgRwzZ{NX=-@3EhuEGksoUiV5 zi{8b!E>LeKN6OpmqrBbwn^G?Rp(;Lmp);m)vh^#jjh-e^s_ zj9FOP-fh+1*?Z>439^Z!ZiLU;dhk|^I5rY$uEz{I!E(bEM6gD zx9c*OhwoWGkB{Z!4UeIMXFcSSzw|F>KQwmqx{EWIQ{La8^kv~iDWnt45v&z<(bZW3 zFUwNSf&KO7*x8Z-9_-Jiv}TZ~;n$&Cd!PkTt#Op;u$u)C5P z%jsLVxX>~0?efA>EopI1uibOk%I|_CmofK?_A=+`SMT=kBxkJ^Z~rxVv+JI%lMN Gvi|`fPwR*P literal 4418 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 IM6N<$f}U4UdH?_b diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_data_inandout_3g.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_data_inandout_3g.png index dba9675cd963d36880904d9f3244938b05156e97..95bb3cd92510176e8beb5ff0bb4d566ca4924f92 100644 GIT binary patch literal 1911 zcmbVNX;c$e6b^{8s6Yz}6_+uricDq_vO)|ola#0d45(N=z>rK}gk(Z8K*SBB#f4T; zsiKIY!U4sCEA|u-P!t!CrQ%js&?<^cRa9I%QLz2t@ki&JnfLB{_xtXCW@SX!_d^{< zIM8Ucq4H2fNv*Eb>ti>F`ql?kl~K!gq%@k0Bs63?YQSh>H4%>iaxI#GDKS(%FXc2A zOrs6Z;8D?Jv|_42MQB0Pq63<=dJ0XW1&d62RF#C0Ks=U!>xA^jRW)<~R}1Mg*$POZ zmtcu_Xodlc%m|B8WhANiYPx755Nr}q1X_$l0h2aaXB3!(^pCs(YHvAa(1DLCWRj5n z$*E{X1Rx;{7{CUh02Rc601gbotUxZ8I{{!qFvNhE444@Ja|JA>0D^$NhfY~Ds5Js5 zBI~n7NkV!eN$Ld*MtXWWn9c$TLjnWl^Z6DICNqH22r$mmk*Fy^XY}l6Kro}qfa^(| z&;b@kG@eK$g>=f(Pa$aa3dLt)ov|-bRLU48RL_7xh@sV5;`*pN?7@=q+JPB9E=0H+0OCpi= zW92#{iRx5Xzg?WN+lS?S6)TV!Fq9+=Q3R3P-vJSc1W6bZ2|XZ*WCIFRh3hP`r97Xa zMKA-NhN)!+LJNG%uK@poeVEJRvJsfaWPOTTER!KT9uwj65i!J;u;_hQ_5aBkgK~yp zX^#IiOaBqoftKy()~AHe!-MIli7`;4(Qqm=_vs8ffnP0lNq7NF3sXeTgqQj4c~nQ4=s{n6#I zhpQSNHN|9QclqVq-1GN!)#Ln4M9n5)`612Xr_S9@V-|}FYpSai6@1v3$Q(U(erjru zUz~lTr>1;ZUj4L+3U*$unn#C;k~sHxAC6YMV)&C|-i~oyakWM3 zCdfN}aL@9fEx5v4ugsd}y3c*W{hp~I?7cZHwFB3Ud(iWG#FlH_FKws#pK#5~T~&PFda_@fs@)9?1!JH7&C4v~PX}nvSM##2wKj&d3+d#dv(%)8mtQ zC4u9;XBN-)x*@$sD+qoqc7A?fD)ZdnQNGUCF7MiPbG3PeZOC%8#pY6;Ho0zAE_V4u zpyKc@M<+4cBk!PTZ0v^G+a<@Blo~-@5_godr^M%vnYnGm83CC+p!s}slC_&|x6*Ok9NY6;zbCPi!wY+h z4!W;?baZ?<+u>^WVG~<-P`Oy?Eu}3m?IdJuZ1YJ@a1%r)`DPHZOb9^iFxaSaIPnXcT7@il6K* zO&i#?Qp~^85gik=2#eu#Z4Q(#)dY*~`uqFmpJ@*&dfV06;8K$v(U9`fTdUHQ;F<`7 z$2RaUzq8vbe>OjoPSnPpOiNF1j%#rI(`cMsdU2n(s3NHSVHzWEU;A94YEJmoqBB(m zDfxE-&d8v>3U+Mk4kr1&`JPOM?Humrc0>GTyi(CtFCBKda^T&9b5D)MhTi8pMjzil zMu}F1vBEm)PbR)%WtyvQUXCdj(YmCK=CWYk?L&_%t+sVncP<@ct0=1TCtlS)wBEkF z@(2u1CzFpUIJX|$I^`4o+lFNlX=Iv{Z*{5fRaJ3C){#LU7LR#9AX7BZo#tBhV0(1; RP0OE@CYOdG<&)yf{{WOP>UsbG literal 4515 zcmV;U5nS$xP)KLZ*U+IBfRsybQWXdwQbLP>6pAqfylh#{fb6;Z(vMMVS~$e@S=j*ftg6;Uhf59&ghTmgWD0l;*T zI709Y^p6lP1rIRMx#05C~cW=H_Aw*bJ-5DT&Z2n+x)QHX^p z00esgV8|mQcmRZ%02D^@S3L16t`O%c004NIvOKvYIYoh62rY33S640`D9%Y2D-rV&neh&#Q1i z007~1e$oCcFS8neI|hJl{-P!B1ZZ9hpmq0)X0i`JwE&>$+E?>%_LC6RbVIkUx0b+_+BaR3cnT7Zv!AJxW zizFb)h!jyGOOZ85F;a?DAXP{m@;!0_IfqH8(HlgRxt7s3}k3K`kFu>>-2Q$QMFfPW!La{h336o>X zu_CMttHv6zR;&ZNiS=X8v3CR#fknUxHUxJ0uoBa_M6WNWeqIg~6QE69c9o#eyhGvpiOA@W-aonk<7r1(?fC{oI5N*U!4 zfg=2N-7=cNnjjOr{yriy6mMFgG#l znCF=fnQv8CDz++o6_Lscl}eQ+l^ZHARH>?_s@|##Rr6KLRFA1%Q+=*RRWnoLsR`7U zt5vFIcfW3@?wFpwUVxrVZ>QdQz32KIeJ}k~{cZZE^+ya? z2D1z#2HOnI7(B%_ac?{wFUQ;QQA1tBKtrWrm0_3Rgps+?Jfqb{jYbcQX~taRB;#$y zZN{S}1|}gUOHJxc?wV3fxuz+mJ4`!F$IZ;mqRrNsHJd##*D~ju=bP7?-?v~|cv>vB zsJ6IeNwVZxrdjT`yl#bBIa#GxRa#xMMy;K#CDyyGyQdMSxlWT#tDe?p!?5wT$+oGt z8L;Kp2HUQ-ZMJ=3XJQv;x5ci*?vuTfeY$;({XGW_huIFR9a(?@3)XSs8O^N5RyOM=TTmp(3=8^+zpz2r)C z^>JO{deZfso3oq3?Wo(Y?l$ge?uXo;%ru`Vo>?<<(8I_>;8Eq#KMS9gFl*neeosSB zfoHYnBQIkwkyowPu(zdms`p{<7e4kra-ZWq<2*OsGTvEV%s0Td$hXT+!*8Bnh2KMe zBmZRodjHV?r+_5^X9J0WL4jKW`}lf%A-|44I@@LTvf1rHjG(ze6+w@Jt%Bvjts!X0 z?2xS?_ve_-kiKB_KiJlZ$9G`c^=E@oNG)mWWaNo-3TIW8)$Hg0Ub-~8?KhvJ>$ z3*&nim@mj(aCxE5!t{lw7O5^0EIO7zOo&c6l<+|iDySBWCGrz@C5{St!X3hAA}`T4 z(TLbXTq+(;@<=L8dXnssyft|w#WSTW<++3>sgS%(4NTpeI-VAqb|7ssJvzNHgOZVu zaYCvgO_R1~>SyL=cFU|~g|hy|Zi}}s9+d~lYqOB71z9Z$wnC=pR9Yz4DhIM>Wmjgu z&56o6maCpC&F##y%G;1PobR9i?GnNg;gYtchD%p19a!eQtZF&3JaKv33gZ<8D~47E ztUS1iwkmDaPpj=$m#%)jCVEY4fnLGNg2A-`YwHVD3gv};>)hAvT~AmqS>Lr``i7kw zJ{5_It`yrBmlc25DBO7E8;5VoznR>Ww5hAaxn$2~(q`%A-YuS64wkBy=9dm`4cXeX z4c}I@?e+FW+b@^RDBHV(wnMq2zdX3SWv9u`%{xC-q*U}&`cyXV(%rRT*Z6MH?i+i& z_B8C(+grT%{XWUQ+f@NoP1R=AW&26{v-dx)iK^-Nmiuj8txj!m?Z*Ss1N{dh4z}01 z)YTo*JycSU)+_5r4#yw9{+;i4Ee$peRgIj+;v;ZGdF1K$3E%e~4LaI(jC-u%2h$&R z9cLXcYC@Xwnns&bn)_Q~Te?roKGD|d-g^8;+aC{{G(1^(O7m37Y1-+6)01cN&y1aw zoqc{T`P^XJqPBbIW6s}d4{z_f5Om?vMgNQEJG?v2T=KYd^0M3I6IZxbny)%vZR&LD zJpPl@Psh8QyPB@KTx+@RdcC!KX7}kEo;S|j^u2lU7XQ}Oo;f|;z4Ll+_r>@1-xl3| zawq-H%e&ckC+@AhPrP6BKT#_XdT7&;F71j}Joy zkC~6lh7E@6o;W@^IpRNZ{ptLtL(gQ-CY~4mqW;US7Zxvm_|@yz&e53Bp_lTPlfP|z zrTyx_>lv@x#=^!PzR7qqF<$gm`|ZJZ+;<)Cqu&ot2z=0000WV@Og>004R=004l4008;_004mL004C`008P>0026e000+nl3&F} z000KgNkli zo;_Fe_4QAn=m7u#0RR6~&C3bGFaQA1msr}1N9jd6NM_KTLoS&kP&$AIp#*OXH})7qE2Ug=&R4wt!e1W%00960 zY|pU`fMkOViZ$^L>+y zyG05mWM&I7Xn3mkwi39w$T@14csLn*b@TJQ2ae{@}Ur?uWHr3%M!_P|^M zL{U^C1VRX;{HZ&Uk~B?Ugb;%YW)dI_!|SfI7-MLSp(u*CbKA09E?=#&*vsHg|JvMinB@px5L)#d4Qx>>EBQ)A36 zZ~=%hdHg^*&;yeo2=3xI{sdZ}|Ci@)+R0c|jUWoc-<%m;^xnOskzB}oBy4MnkQYdv z!PeYHu(T1<AVHW`|?2h_!+y@;HMnuyv0Prz@Wa6oeZ^8SZ7!HL6IIk!|*eC>Jo^ze2# z9Da9zFP}=BwTQJ?D}W&oPz|W}v|26O1oYGC^!;s`V#FXu5D~-(X_}JW-H{|o3os6F zolYk?9*<{RcftKRl40S8Ukfmo`B$h=ly<< zvktKhX(6B#j|HlM&1Ull@MgJO3gCbn;5Jr2UpP|6^{Hf8rt#~v*Q?cs^?Lmgcrl;P z-^^yS*KyZ%GX_A&^ZZ@E-~VikAhRXv6f*zI>#ogiBC%i=8VUXZ26-rQFCB`Yy?7C{y*Pmf58Aa_aA76AhnGl@ zWYrY<1Ju11bPz-EAS&*fEiSw6uI|kHqr<)u2S1xni2;{@~!?4uDfnMC9n`s5O~Pej=2@AQXf) z!0tsRlNq<|=Tjbk6cm(H4I64JrY0sH0@(MAEdV&-aQJ9?dirrR8og#&R%RkZ%kgrux-0AGc(hXNF?49LP4p% za&*N2K&b(#6aWQ6h|%BQKPjbzloC=YOixWc@%G~_E|AG&ZiK_(=DE2!dueHLd}U?j zm2McS@v$qVfKn1lDKN%@%gf8JaW2=3vOPEI_V#vjI-OpidcKrWC@G;7fuaP3LLn!l zgn|MT5RX4iN~sB}B$QM*K0dAhIP+8?0Gt*Ig}tGnp*xXC#0&<5ED#77hG7r@;GD~7 zG+G=P8My}lfk40@dOnWh2*+_mrBZPTAwM+b1o4-z(P-))2y1n9_4>iVL2G+^`*AE5 z`>rubbf?5CN{8c7<$|U44Nn1t78e(9cXf3==!?ZtoV!-QG^^|D*_Xv)@$2sHZp+x% z*hgrYrBbO!wrzjW#H@S6_FGzc4y)JeVq;@tzgDYSj^m)2xseP_JkFN0{}U#5cZQg#7>U_|g*p901}nGP$F!f}&CdON&z#QM_sbXuS{>5l<){MP<+`hutXH{&4)!o!$Mu_uKb*-g~xC7X8gw z$4QPf8f|Q3geZnu8PqeC{u%W?^L5>RYH=sU3NjYgkZDQ+qY2b_A_he2m0BzYQ>rsk zEZ9sM%}%3>Q;-U26kmnwnM$h;GhJ__&@|f2&~&3xm5h-PxP?XAZU2)t7v zlY_zcPAQ}^ARH$!Adm?Ms9+8Za1bWKVsp7%e*lFM7=lpX=%(f785755W?f}tQ;sBKxqV+G7O|LJ-}e{8DS7%CKaJG zk~-V~SQ(Xxcq$nTQl7pKL2r~wKM)&C!-=9&2Bj;F5W<8Zz1|wvJ8csggZ=BqN3~6H z8Ac3>!Ay86p`z-c@fiVAx%;#st0LtM|64*w6-BvNgsW2Zn1PHG1%uQVrdp@wbHmx3 zK!l61gHV_ggdjmI4oAWfu*4EHki`xXjc|Mn%RN!*l#8-eiHKtQTg=?qrc zTAugOiZDXA1XD{0To1gBxRhFlqCzd4*(Z^g8UIgo>+&QtZOffp3R_0Gg>58QB^qScq z?^s(~dtH6Id&iUGN1`}ci6z2|cWmhm@L?r<`~9IP}VDE5qrYRp0GT(`dCJ@);8z?jC=*aD$`St>Fr0~?v`+oZ#AJw*KQasxd+I$k~q&I@`V~f9-~6tJy7HHTCts+76cM z+vJVd--JEB!+wxu}aMu{}=3h%KX89btDw^m@GGIaIqdR&|&hf(XKV5cYcB<~AW?j6OcyNRq=sMYZ#)jrT>~Kv_-Mh;t4_9GxpB%Q4s!#aKOm1* zY!@Crwra>%6JgJiJTTqxcXsO1GuDTd)-A|4XDcI?7c;xh&V7-fU2E$kl}eZGf_FRZ znI1UHN!p6*^>d3FCw*U?(LMUAc+nQ^>t%G$o10JjzQ|2})0a|giCS?A&Tep9xw6*& zelFq~)?sO}Ed9aW=86q%X~)|&V_LjxWdoqX#rWfa=KPL2zsndr{DovdYe^0{4?p@4-3aT|K5SYUbRFw^{r7 zWtqIx%`~sY9_4ah6>6f}bKw2g_O5A$Y$e^*`@jdd>#h96h}r83ds7snu6Bzjt^0jn z$rAsbal3%k9cRnTy7`T-E%{S(%Ds`vQI5wM=G^j&1()A;6uhN9+f1{g*}OQ}KYyd8 Q*7|FU6i17yg$wik0bhdFrvLx| literal 4130 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 diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_data_inandout_g.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_data_inandout_g.png index 0985a0956d7c5b8da94ffb5c607f9d143641004d..31b926bd2f04962eacb1aa729a88b7ea4bbf8982 100644 GIT binary patch literal 1874 zcmbVNX;2eq7+&ONfMP`&(9vZ% z2wDcgDky@{Vn?e(Djs0H3V4AAtb9=qS0K%r5bP8oUMu5p!s#+_6o*X{~fohcin#Y#G zGMxxZQ_otV$KqB*$(1Y8l{^(RJsb=(@ks&=Mkqj&CPQoBn*`8%UOu_E9n&H3y$X>o zfIc{tAd3M-xE=%9G&n>Fb6}8z&=4kz%jHf3888CVVFn#xgdki#lfj2!aO8nVYkE}* zKUORqu|-M(D2*U=d^+7|G}4Sr8m>>JBRn3@#=&5OkQyNdvzAbpLbQf}Q3f$)Q0mn> zLXB%d8>1o_Uq%QZ($fziXmm2!M`EpEBvE9_=q81Zj?iGbMq`WXy|#gf#r}2UliCKk zS%=YMF$2C#uO#b{5-5hRq!;Yc|sQzB)snXFLpD95L;Ohkmj92Q3?5lRt6EajmnBId%VgaI=- z60T$v8=*B23at_wwW}uWj$qlJ#qvdZOhMp!IgV$Hc0f!TPT+<#TnCEc*q}_IRBLUr ztvny16=Qn!a!e)F;~MaNe);N8*oTo&7(uu!nEN4a9s=_uJRX;eN)et&EQCg|s{fNS zI_V7E)*Sz7meC`!18v)ntxpOchX>P=6Qd_b!{5K6i=4RJ2r()*-Ry~vP9KMQ|8%2s z_^;sw2=x`{8f=>TH2wuxk!$igE&Af6(%V50oVBKUvM^@T)q+WGZcddhyB*Q|w)V(B z`-4hleCA2+5GSf#EHFLV&|n!#c{Ofj)Lq42&B`v12;}W*p*i8(NnhU3_gR+dXzyVYwXLxYcwd{F!v+PN!)c zzoOEO8oD!jNKPxBSKan7aZHVOK~ur*c}oT#zBIm^|JeS)Ku^)K+)h9HiiDz+?hTp+ zEsD@2;lw()uXy3LMf>Gbf4;KAtD&v}du-wI=$xqmRmqW&LEAkS(ZGebH;fzHI?^n3se_d4m9stvpU{MV9nr6xa;ZeGpPTygLgJ_ zk{k7U8Y|z`wIO-`(@3O$wtwx+xvf0w#bD<#C6yD^2+*>cT9pV05>D_b?x5Yn98RU~ z?|jFsOT9izddf~kpL;^7TA%N7!Z)ex#n-DcW?5%mLN`U6ICS^*8=v0U9nlQ=7Dn$A zLe-R#+IvJpeO{f}o|T!M_QTFdBb3#9ux4^?eX*w<*w7JQ^NyPMooftZZvl{V;P9c+ z(zE9}gEP$)jlyr5y(k=~h8r1KWx(&LmD_@jCUa@iG8lU;ov~! zybUc|#=3=HsZTxa)nE4PHIldAOx@EFG-Fp{>RQLuqBD0cOK(1Y<@eMK=>dfx+t{D_Lqy0M2TyKNxA<3_5;$? literal 4104 zcmV+j5cltiP)KLZ*U+IBfRsybQWXdwQbLP>6pAqfylh#{fb6;Z(vMMVS~$e@S=j*ftg6;Uhf59&ghTmgWD0l;*T zI709Y^p6lP1rIRMx#05C~cW=H_Aw*bJ-5DT&Z2n+x)QHX^p z00esgV8|mQcmRZ%02D^@S3L16t`O%c004NIvOKvYIYoh62rY33S640`D9%Y2D-rV&neh&#Q1i z007~1e$oCcFS8neI|hJl{-P!B1ZZ9hpmq0)X0i`JwE&>$+E?>%_LC6RbVIkUx0b+_+BaR3cnT7Zv!AJxW zizFb)h!jyGOOZ85F;a?DAXP{m@;!0_IfqH8(HlgRxt7s3}k3K`kFu>>-2Q$QMFfPW!La{h336o>X zu_CMttHv6zR;&ZNiS=X8v3CR#fknUxHUxJ0uoBa_M6WNWeqIg~6QE69c9o#eyhGvpiOA@W-aonk<7r1(?fC{oI5N*U!4 zfg=2N-7=cNnjjOr{yriy6mMFgG#l znCF=fnQv8CDz++o6_Lscl}eQ+l^ZHARH>?_s@|##Rr6KLRFA1%Q+=*RRWnoLsR`7U zt5vFIcfW3@?wFpwUVxrVZ>QdQz32KIeJ}k~{cZZE^+ya? z2D1z#2HOnI7(B%_ac?{wFUQ;QQA1tBKtrWrm0_3Rgps+?Jfqb{jYbcQX~taRB;#$y zZN{S}1|}gUOHJxc?wV3fxuz+mJ4`!F$IZ;mqRrNsHJd##*D~ju=bP7?-?v~|cv>vB zsJ6IeNwVZxrdjT`yl#bBIa#GxRa#xMMy;K#CDyyGyQdMSxlWT#tDe?p!?5wT$+oGt z8L;Kp2HUQ-ZMJ=3XJQv;x5ci*?vuTfeY$;({XGW_huIFR9a(?@3)XSs8O^N5RyOM=TTmp(3=8^+zpz2r)C z^>JO{deZfso3oq3?Wo(Y?l$ge?uXo;%ru`Vo>?<<(8I_>;8Eq#KMS9gFl*neeosSB zfoHYnBQIkwkyowPu(zdms`p{<7e4kra-ZWq<2*OsGTvEV%s0Td$hXT+!*8Bnh2KMe zBmZRodjHV?r+_5^X9J0WL4jKW`}lf%A-|44I@@LTvf1rHjG(ze6+w@Jt%Bvjts!X0 z?2xS?_ve_-kiKB_KiJlZ$9G`c^=E@oNG)mWWaNo-3TIW8)$Hg0Ub-~8?KhvJ>$ z3*&nim@mj(aCxE5!t{lw7O5^0EIO7zOo&c6l<+|iDySBWCGrz@C5{St!X3hAA}`T4 z(TLbXTq+(;@<=L8dXnssyft|w#WSTW<++3>sgS%(4NTpeI-VAqb|7ssJvzNHgOZVu zaYCvgO_R1~>SyL=cFU|~g|hy|Zi}}s9+d~lYqOB71z9Z$wnC=pR9Yz4DhIM>Wmjgu z&56o6maCpC&F##y%G;1PobR9i?GnNg;gYtchD%p19a!eQtZF&3JaKv33gZ<8D~47E ztUS1iwkmDaPpj=$m#%)jCVEY4fnLGNg2A-`YwHVD3gv};>)hAvT~AmqS>Lr``i7kw zJ{5_It`yrBmlc25DBO7E8;5VoznR>Ww5hAaxn$2~(q`%A-YuS64wkBy=9dm`4cXeX z4c}I@?e+FW+b@^RDBHV(wnMq2zdX3SWv9u`%{xC-q*U}&`cyXV(%rRT*Z6MH?i+i& z_B8C(+grT%{XWUQ+f@NoP1R=AW&26{v-dx)iK^-Nmiuj8txj!m?Z*Ss1N{dh4z}01 z)YTo*JycSU)+_5r4#yw9{+;i4Ee$peRgIj+;v;ZGdF1K$3E%e~4LaI(jC-u%2h$&R z9cLXcYC@Xwnns&bn)_Q~Te?roKGD|d-g^8;+aC{{G(1^(O7m37Y1-+6)01cN&y1aw zoqc{T`P^XJqPBbIW6s}d4{z_f5Om?vMgNQEJG?v2T=KYd^0M3I6IZxbny)%vZR&LD zJpPl@Psh8QyPB@KTx+@RdcC!KX7}kEo;S|j^u2lU7XQ}Oo;f|;z4Ll+_r>@1-xl3| zawq-H%e&ckC+@AhPrP6BKT#_XdT7&;F71j}Joy zkC~6lh7E@6o;W@^IpRNZ{ptLtL(gQ-CY~4mqW;US7Zxvm_|@yz&e53Bp_lTPlfP|z zrTyx_>lv@x#=^!PzR7qqF<$gm`|ZJZ+;<)Cqu&ot2z=0000WV@Og>004R=004l4008;_004mL004C`008P>0026e000+nl3&F} z000FuNklBqYR%>HGKZ3>+LBtW2Lie`4U}<>i8_0RR91|NlhIu?c`M5Qfq3 zLewsn2d?B24q@g?s(%irFokf~2)+fLNitvt40tlIxcew&rPgydNfWREH!v~~DcRLp zKO!Rj@bdxy0RR8O5MVie{5UfM0|P4q1H*p?28Lfu)22;xQBY9$E-x?tgMop8m5Gas zi(}rrdBrR&EDQ_`42(?QzJ2?Vnwr}C`ST~ZONF5>{ma0>@Ro&-kN-Xs6BFZ)AK!U? z{P@AmXklSt%FoZw*4Ws14^M;#5q#et0rCi#vMj%hwM0?0 zIv9g@#Dq$vH(>*`G;YD3iak(L+PDK2 zKxN|sO!y1Ho=8HX!H|3ci2nCxEO-zrOq^tj$-UE@J9E_F{vzmrEcL!35It~`(4Hql z1PWm8fwRVS<5e<;q%~D#I-Op4z;8Y`WSIj5!%#HVfLZczlNl&1Um) zFc{p#7`4;sJo`M)Z`eRZ(f?OMR3_H z8nBQb(1isN+l>psg=u#w!EO?;i!P#Fi9|58qCdc$%T!wW7t&^tje?6%$*!a^vATF6 zU(ddmnYk`9uLcAQx^Q6TGR(bmXU;wMT+5@szWKT_OEY0)!Zv$0<41;J69B#`j}pc) zTB%fSN+}m&u~;k=3e9oOEh5rHL`o^?`@T0A3`VwXw{yANS)hj&fUxVj^E*2`M~pEr z#%2GrBdl0fc6zr0Wiz5EY3MNV_=-4QmH%%&H#{<(jN|oy;LeSHdtK+|MI)a z3~XdK-e@9#2%0pA2)nzx4+2brU{Xq{>Ei&>8bXNh{`>uBj4^9{ZT$rS_)X9aikFV# zj7Vz`F%W0StgXFd=C4XCz;vbKI3oa;0oodX=Xu_j$6H&sqtU2sSr!8Tr4*4#=li~L zT~`VrzMEjp>h=1Z5#o5YTAlB7IyaKZq_euZ`faA|gt5wq^$!5P0AL>;9xf~{F5Z2Z z$&{s>#6z|{J~^p9@AZ10TCG;1SS%h*K_isQ<@<#~;Uj<{2cSLAQ;kNW?YiT*?@uru zyRl}o`BeyEMIw<%zu!lH(8q8vKs+9g0tf>T9Ka--&9*NtE_!mJprnM966fdVLyPl; z%}1MWrBs+siF`i)u2!qvIXF151GL?4w|iD7>OsEK9qq~QxsZlha+yR(BqLUhQW2T-!%yhlcca#A}jcQzL zAhehsureY^SOy`Yk)95Rpfe~G?}_!skwlRxW10~I6Jmf&oz5E9khYPCMgMiwt0L)*Fb3C>MM2VGOr4=a^@JQ2(a0NyMynC>Bphxq z#Dh3|7Rcp85TDKE%D7^-RK^NsbNKKm$A_?N2xfC&0XJM4E`uOgCJ>7umWdaGfwI8q#LVOT{cpQ*79Jc@h1yX^4#}msSfdmexjbJtZCudC3 z8K$*4{?ja@M`QXHu=u173kx1#Vb$>^3&udJw@$)N4uBzCyu14kA zQC!Slp1%8)PoKc_?EJajHXEntEa97+{_KRN{uY&^xCICC3*CJVob1MJe@6$Oo>u>Q zZKA26v#9^&l8S5l_R)Q=UbFj65E+zGHdj{vQdPC*n|m)@BImY5<(2MoJYF3bVq5g! zl!wycuy`-vdAuM@;+8Ol5sA1*=5}Yrme)$1_`jqbd3G$MH|EGf*KbuD=P1(v#Y`jK z^k>0Ie_l>9ktn@WzLqTjP*3~K#Educ zQ(cABpazCxwj%%=#Q9x*w#wGY3m+bO>0P(@e%?g>BfC2L)1iKeQm0fu`J}R0$%RwB zz0=Q}j1Q>LPjFtD;`DlZi^KlxQa6WAR_)ElV=cbr7m7sza;lIkNoyxAnX0azbpWUC zquvl8d8YmIzGQqiC#H~KjW#Z;o;c@gBg%elpEGV^I4As^8Srl^nG&{RNyTM< z1bhXbC`s%;1HKI^t)%$1_1?FGHRO-p{?;sr%x|^swfL&ivGkyTYLD&(e}!6R%nUI<4jHV?ihcZY;OJ^K;kEr* zfI6RET)KhPuHC?0GjrEAd+HSh($+_fJCc*r>@%j|_PBuY29ADZxX-I-N~q9Pc|0f& zILOY}=Ffucz<|e-alj(!sY+~ delta 1083 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 T{9V*k00000NkvXXu0mjfPqjm- diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_data_out_e.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_data_out_e.png index a47b9822bdb37bbda3c329a3ea295fdaa9e5d13e..df6e1952b1caeab5680b8b74368acdb85fb2adb5 100644 GIT binary patch literal 1772 zcmbVNX;2eq7!HRbC>79_$kin{<&Y%1;n-|Ugpfm^5HLhYkP0E$Kp@G+WPyN)DKk{M!r6qm-wu@sn=Cb#O)OjKg}W#UjKd0E8XdQ7JP zlPY*Fhce}qG(HjFVFnZkqk&Wf7!CsA5Df|mg<&`tV1N)v2N`sTL4{ye2!jQJ!1O~Q ztQnLlmY6S`wna!BN;Zz`S#)|qK>@8GgoYWi=n#S+Rt^S(N@!4xg*serqUwx(GYovx zs4%GYxEj*|Rz`UymWOjFgr`#>X!Y^&?}&BA=|mAJqnqShKsoheF)Ylxigl z=7olbK`<1`WPssJ2x5kWhYQ2GAp#*IEF_f4pW%2PHUtucf-sXCC5RG25MPLJxey-) zxdH|l5-xxRGuRlN5tr)}=!{)8VRssfd=Sgx8BjTn86+5{ndyMUYz)VY*_a;SC4~X; za)nxFm96EOik6QW)cL4VXu!0Mo8v#tGIK<9pmqDM^$FqK@Sr+kVhqG+7`Yjl#Kd{U@VOGxt;b(SVAmrT zo*V0Vwd#C>IX@N%^jEE^4B&l>7!`bIo<0Dt-VjBWPB3PHz2nj3vW}6p2a)uFRZ^)bpuw*E^_heNamNxh z?lk(2-L{r>ck>!49fi@aMU7RxSrO#U5qHFj&Jihv1U-I3&6+oACc@MXJ4`8`DQOldSek8DI8PusV#ZRX9wvn%&{ zj2FF4qU~6_|4GmJZ!1SeM#gf2>aY0Hpxeh*Re3Dg{a`zHbdZB=6_eg-cHRHz%~^BJ z`ZFyp&j?PF3dflI)Ql*cC~(MHW50!tD!fA7{rp!8HyK0zK`2 zTE;?emhP?W+T?0}JUrY@cM3v(jI00My^>c_T$~mg)GjH_JNjtLJ=?EVcbO_SQ@wK4 zHEAk0dxsZWAgB4)Y=+i#N09!#m1Of2&5 zT(P;mz5TELah~_3?E_|EOk=;_Zz>JjGwM}vBgvZ_JO1K@#;zZ=B;Q>c7nt6VvdL-g zHXoNX8N1u|W1+t+piN{Bqqe#S?zo)(5Inr!bMWV@SFhGBw$zwQPA%D$E$ahMI$qdz z-)%wMWnN3A>(Kg&*qab%ad&Q5D{a2tl~i8Ef;|(@`l*Y%EB8&vqMCc%8rFS3@44k~ f%U}fQ4fPy}-LhuCpy|#^>;ET4AmTSfWt9E{D5#$A literal 4053 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 TA4c@p{y5?CNbG1>!t#Fr6LFzb delta 1054 zcmV+(1mXMM4Ymj&iBL{Q4GJ0x0000DNk~Le0000c0000c2nGNE0H{6bu8|=qf7nSx zK~#9!?3hhR8$lF+cVm;Nv7}0s)F0^0TRjvH+BVjMP`n5c6+N^FVzdZeig*+v=%EJ> z_2=4?7tuq(iwCVj#0nzTYeNmFHEE*NY`UA6nZ7qWQ&zng?XE(7@|euqS?2T2oA+KK zQ%a@VC^qSq${kp?axdE#R##VLe;9-s|1ru{JQG3;&uC3ejX7X^(;WV;ozHR842Q7s z=fa)_J>}1-X&&Pn;(K{qbNHqyKH}VAu>a;tOg&2O5y$lO^y6eQS?X{&?5R{LU07Hc z@%el|W@l$ThlhtH!k(X>zt`U0{>|VuQ^D-8dGYAT=qK3*4wPkSI1uoGe?6%vN?9Nf zn8o~vIygA^3hd!*FWQx3%;|L6m81epGSmAYV1Ixkz(Fvq$tp)l_e2zW%r7`q17bxRUID&C<`21WUw#U)7)Wk7T^ z%DAScCf=k$>>xe`Z{TN5R`P36ETc_7cb4n6)6=%RAkw}v8f7r4?T8KuY3Vc)! z4h|B!$1qzEX@7rT;dPW)5o5&dcE|hr`kn~`%wsTUklPMgTUwuD{)O+AOrs=K?p zFcb>8pz{z%cN7c;elIu{leDjs<}wav}V@0ORB-@`oE(9jTqR;S4C_iu`m z7#ka_1TRIbNEf!5nHf)UadGu?uXiYwPITgNxY#JLI)o?hxe>pih(U~C`$YU(KOXK4o zI=}DiY=XzMoA~;MaHOrRErR8TWUv_|OmVKNY8pI9&);-NArCD9!`lb9PQ$E^ngNZ) zVg#zulcuJo&&C(}`}^16##RHI)9m2?TaqZNhq?k_0$|s-x3^z|$BuXrKib&X=zz4c z4xcqEz*1OhbaWufdN7<13=HgVZEbx4xDEi_!Et3}1)+Xg(e~hRVjx9&d*5CtJ#%w& z(c0SDH2|uI`7c-(zfyCYWl1t7+VejVoGCrRc-a#4uRJC;&PXPSeD}lM9oYX0_D6sL Y0A*t~TIMaQod5s;07*qoM6N<$g2vnJNdN!< diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_gps_acquiring.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_gps_acquiring.png index 9003d671b16466b07dce707354910ce081780f86..150c9fc8705830dee1eb435afe3f1f84ef4845df 100644 GIT binary patch delta 473 zcmV;~0Ve+R2J{0ViBL{Q4GJ0x0000DNk~Le0000Q0000c2nGNE0NV147?B|-e*uLF0H~S5w3Vi=$^~kE2m)#z@AgPBMd=JReBAHYg{_&Y z5a$-?Z+E7qp7Oe!c~rIMAE?mOO7kiw<(T6XZ z82J6Er#$l5=NeP8N72ODFZ2Vz>tcskP;Z&74snmwyl(rGzk${VJp~v5pX;Z*Mi09I P00000NkvXXu0mjf^@+{& delta 860 zcmV-i1Ec)(1M~(ViBL{Q4GJ0x0000DNk~Le0000c0000c2nGNE0H{6bu8|=pe*+dt zL_t(|+U%H5NE=ZQ#$U2Ax+-pL48}j?B&In8#gIVI5~%bLl;l`RPo+U<)k~qJUV3e5 z5xn+REG-^NK~3?{6e@}Zb138@#bBf{Qc;o!3DM|kzX@FkX!PQvTiAhNlg-hA6iIUJ5&f9_ziEO(rq zp3<=lMvk0gO-)Tq5QG;!Jv|R-Tre0EYHMqkasEBvf7tEzxX0tM^8}MBp%jN=WjH{* zaXOuWxw$#nYPEiMxm?U4wot&KPDJoTif2*&r7XkNab#>KBqrLzvFxnc`5D(eHq>;6WCn(dZX+ikqS+ z`s49<=DNTP7c8*zn0$aBE_)d!9yaMU4S z0gRpD3Koe(_MpVQmX;P7i)YnBP@I${I4B)L3%i!Ss=F+~M@B{-W74TaBEhz|x7k(y z3{g8H1#z6r=kqVQe}R#Wj*gC_@}@R6HjJB_o9yW5=t?+J5cj>0>)vt$BO4nV^I;*K zNhXuF_4Rd@PN&P0S2MaN0BJxF`?=5Dz{tYku!vplLxk#iHk*~Uwzk;L&JNq(-)B&! zT%FYDv23u;&d##32>;VqEcTi!m|_zX69Nk24w8KcU%hbZGLK#GJp3n|R{!}-Ci8K6 mdipolP-^d${{z?`0R{lbNgJ|{L7`9p0000%?Y;Ec?vB;j_U^`Ib}wzC72mk^o~~zmFWfz| z-87nvNH#^IEK2+!T9hnCvsejyJkTbhBaliR2rt^5AqpP_bIN9ucTWDjbUBgB}>WV0mO&Eux5mbtDk;B z;F=mH9uCB*xD^9AZTpxFl4E_T%ve6dsYLhvcvp!>1Ui5UUeXJO!XNA&@m& z&GHFBs@p(&t04HN>7Sv1w zcNvu-a|DJ7)Tjl>1aQm| zJA>+xZEJv0?rv_#RYczK{kDdRq7(!(Gok|n%0iexH$GKU`B)(8mpG}DjxkiQlcqVE z;v_a06d93b{6V(Cu@W{UQ31)%N-saxoSUzS01)6rsGz*Om7|5B>baJMJ$C3d&u4FXBmEH0zMJoVXdm5;cZR+@9etB&L z`+_7!1VLaUfu*>kG{eLgHYE5(ieuSMqK;MnPtHi>4Cyw8~iKe}OtmBJn>kAh< z_Ij8~`-`=*yldmzrJUjSaO?_p5$H5N-dwxpf_7si~ zz0=h|-043#&u`Oi^B0@n>b|%4{q&m;d~@QN+_q1C&~7~{N1l+c&&_48!K&7FN}Nvg z9{Jc9^advT#A-W#=vrBZ3+s=0c6@cC<-_!SQ~k9HePeoT@~PUPQZo5mwWIR)-ew!fA#;bw!OW*!T(qs;V#hM z-yhce@$vEK09#yKv^>{tw`=yM z)TE>&x(>>~idu8IT=ZSEjza{-gTgX6I7pvp-ie6`AVdX^#{+)9-x8;I0C*}9sQCQ@ zFt#(kl$V#&XF)*$eG;<5fBycyB~zks9sq006xnO0UtM@M01W`-`%-rf#guU8pk zrHbH~%uj0!-x1jI@-l7r^z=}^X=w#ZeSJMf5ol>?p)Nv8V|pA@e*t@XdQz(RZES1| zwzs$Gx4ynU)mXlkl$1bjZY~9cuAs58QPnR4CCb!w7hPRlAILi}Fks5F^CvGaFHc!h zJe54hblnBon#8QI!wxS5y*%SA1ED{-mXfDPd#xYT2_+1wm z4l<*$nwlCYEiI)Be{XJX!rtDVu6H-XF0Zi;D|bUtg#Bm`o!q zjo}Hdr7>BbmgkoOtE{Yq=H_Pl4Yh%(&ceci;o@36(lRCEf0*fzl#`RA^3It0Xa!@D zz_QR|wog}MvMd(UZ9SggH`Z^JV}^+$(|~vg_#-doR6H1#HjDjQb4`aNOm}6zNQ=Ns zuo?2pIL780=KO3IT24|XSkH-?ohw>M>iPKvuq~QHCRo;QG?&+!DPTxOHjrF`={1Wj z&igtvJGv5He>m@?wdUeHd?qI+D+fXZW|slOgb*i{m6btNRTaIeF|FVY33pvsSO~SX zwbak;?(Qo6TU%Q+I>_b*0s*+bzNQ&4##>A%G1f9GY5r7+kB<*#W@frVp%8Vj7zZye zFJX3eR=JR1!HaKaXD7{4=jZ3);NU>DXlrXL&0J-3f64mL-Q7($ju)M^wKbaQk{eiv zL>IRdSW{EeAEJS8J3BiN3%?Y;Ec?vB;j_U^`Ib}wzC72mk^o~~zmFWfz| z-87nvNH#^IEK2+!T9hnCvsejyJkTbhBaliR2rt^5AqpP_bIN9ucTWDjbUBgB}>WV0mO&Eux5mbtDk;B z;F=mH9uCB*xD^9AZTpxFl4E_T%ve6dsYLhvcvp!>1Ui5UUeXJO!XNA&@m& z&GHFBs@p(&t04HN>7Sv1w zcNvu-a|DJ7)Tjl>1aQm| zJA>+xZEJv0?rv_#RYczK{kDdRq7(!(Gok|n%0iexH$GKU`B)(8mpG}DjxkiQlcqVE z;v_a06d93b{6V(Cu@W{UQ31)%N-saxoSUzS01)6rsGz*Om7|5B>baJMJ$C3d&u4FXBmEH0zMJoVXdm5;cZR+@9etB&L z`+_7!1VLaUfu*>kG{eLgHYE5(ieuSMqK;MnPtHi>4Cyw8~iKe}OtmBJn>kAh< z_Ij8~`-`=*yldmzrJUjSaO?_p5$H5N-dwxpf_7si~ zz0=h|-043#&u`Oi^B0@n>b|%4{q&m;d~@QN+_q1C&~7~{N1l+c&&_48!K&7FN}Nvg z9{Jc9^advT#A-W#=vrBZ3+s=0c6@cC<-_!SQ~k9HePeoT@~PUPQZo5mwWIR)-ew!fA#;bw!OW*!T(qs;V#hM z-yhce@$vEK09#yKv^>{tw`=yM z)TE>&x(>>~idu8IT=ZSEjza{-gTgX6I7pvp-ie6`AVdX^#{+)9-x8;I0C*}9sQCQ@ zFt#(kl$V#&XF)*$eG;<5fBycyB~zks9sq006xnO0UtM@M01W`-`%-rf#guU8pk zrHbH~%uj0!-x1jI@-l7r^z=}^X=w#ZeSJMf5ol>?p)Nv8V|pA@e*t@XdQz(RZES1| zwzs$Gx4ynU)mXlkl$1bjZY~9cuAs58QPnR4CCb!w7hPRlAILi}Fks5F^CvGaFHc!h zJe54hblnBon#8QI!wxS5y*%SA1ED{-mXfDPd#xYT2_+1wm z4l<*$nwlCYEiI)Be{XJX!rtDVu6H-XF0Zi;D|bUtg#Bm`o!q zjo}Hdr7>BbmgkoOtE{Yq=H_Pl4Yh%(&ceci;o@36(lRCEf0*fzl#`RA^3It0Xa!@D zz_QR|wog}MvMd(UZ9SggH`Z^JV}^+$(|~vg_#-doR6H1#HjDjQb4`aNOm}6zNQ=Ns zuo?2pIL780=KO3IT24|XSkH-?ohw>M>iPKvuq~QHCRo;QG?&+!DPTxOHjrF`={1Wj z&igtvJGv5He>m@?wdUeHd?qI+D+fXZW|slOgb*i{m6btNRTaIeF|FVY33pvsSO~SX zwbak;?(Qo6TU%Q+I>_b*0s*+bzNQ&4##>A%G1f9GY5r7+kB<*#W@frVp%8Vj7zZye zFJX3eR=JR1!HaKaXD7{4=jZ3);NU>DXlrXL&0J-3f64mL-Q7($ju)M^wKbaQk{eiv zL>IRdSW{EeAEJS8J3BiN3 z)A8U?TP==)Wh_<3T2L$=v{=NeWxy&Hp)=rxRSPN>t=(|g{&4)^&g_2Q`+e{8y!Y(p z#Do}6cYk*dhvOL+izTsZ0Q&~HO=iDW2S!%1%e#zP&n%|WnS7ikI0_SGAb>bCoT+&IMp3!R;phn8f#~nI+yV=U3IUHG(-HIEt2nH|^8Kgzdd(e1_2aqN? zZ<$C7X{{N%G%Xy=`D7$wYgFIkV zg~^ih#+=e?69E-P6M%>hg&QF;1c+fiED%a0k}v>)UMEi2vMpt+q|K z+Dd>)gpJCjjch&AXHS6H+`ZY5Ly`3cT}YE`QSfYxGUl2I3loRQdF&0}M4C{QNGZ@r zH4(51fy5CoEQKMdMkp4m5jBhm#KH-V*I^|Zg;XLEsZ~Oa28J<>6p@HEY6uc4BQS{& zQ%+#xEH(zW7>NnHBx`pZi@gzxs%QddC|XBR*%KX*m`O2|Et9eWs>LEeiyKLcLw1yB zELx19$vncOp(!&knqQQBjeQJLD=-WbDnw&(D`5mtAwmfzP(xCoFoHLZHN8#FK-L-1 z(H#G4mWd;_10CB}tNUvj-m*OCp^DLN>!S9UC_Lu2P0f9pJZJ816<6 z9U@Y~8e9B!pS*zVx%F zzunV%Ch(gPx2(?ff$>ilE(qH3b9hIE_C4Rvr{&1*?b&nFc$ph2N@68w8tgBs`_5NRv{lr}^DY=O-_cZXu#e^eOxczjl|3A}8 zUKB+Q{yj9LMas@E>aQ--S3f(RT-#*W(%b7z{)pE~bz?U-^E))ZUaE`2hoF~!WD1{&xO&vq%@oZN!FiWfZ%Nv?FQWE3;{ zwg*Q>7CF&tD?>x$=HyKdo-?(CkD&3Bz7+5e0I{iSw}w4>{s=lX;2nHLo7pMoUHbLi zAj{MZd~;XA&gkkVc^=J2>gK}@{*!!7LjUE%0q>NClz3&!j)Vut4A%)EiBL{Q4GJ0x0000DNk~Le0000c0000c2nGNE0H{6bu8|=pe*}3+ zL_t(|+RRunq&f-{%rCep)ORboN6EEHyQ?Gd4Dsg2MLp z_7-+9X=!OtP*4ET(a~^rb_PdBM?lDc$H&J`RbVkOF?P}^pvlR}pamZue;(lE5t8o{B`ucjBBGeeuf6`bGu;=GzrHl7Q zM@M0IcbDGl?(Pm6%lD$9BFN6prhqUN)YjGp*=3+apPK2St*z~oczb($4P|!z&CAKj zQPvdSN?v1{=>lU-_NSPJ zuxL#0aDs0g|8&X8$&j9&4wsjgQXQdl7D_RZvax8_WekDgj^EYQ1?}zau)VzvZnqn* zuCAnvurh`hxEff=*U|@jW!?0oaFsbS-uBIcke^4@w=>lWM#>U2=K@ANJ zicR*`@d8%^u4OYMejLn7Up`z~I>CF)ZdPNug(53^W%-FOzj?-ZFyef^RF};)yd`0| zD+8t`VCL9}_+=Vnb9HNeJ;r2?wUVfw#+Y67Db4(Pp;QyFXlHAw&E;7$1S}8;1P#K{ znk~*!3Xa3Df8(i%cg`nia)72sG||T7l9ZIBybvNVs|?t}!a~rX#l=O16+9u~Q|IUB zLuF+p&HDTM`-**MXNT?%B_$WS8uR6PM*0vBcc?Bz105jtU{_hOWUi0x>6+ zCFM&a5HS`q`g|A`fdjhKogj7bEMJ=p;XnFL9gG6@4HPUL_Jl^WN( zWp{bTqeU?zZoxECBcTJw@+-jKVIP%9L@0`~MV#@tV-Y4(%w+RWmIUUr*%8nLR`Y*y z#-N;GxSQi&%`$mJb)b9uw)H9D?eJiFYGRDkXbg|!1_OY{GdU_svfUe4)sZzvqDLVjO;U!&wamXil;|YszBQu#>lLlM;5#Q{hxw8Q0}Ra*3F_PE1x)5d$)e+pDQPz zX^QI5-Z)3Jw%m37T0?=n^F&vnZ0h@t=gC6{To+vz_x}bo|JCbk%YQQqe6)#n-%xPEoS{WXnsxeKG2p?RJYjTQ&-C-n-X5 zzc!}-+5DE_{O&4+qNZ(L1?NV?2yoaiSiA5-!RJL+l*i6IJU_U$r&w9Ha!Kg{&-@>E z$CNjzS8Q?o`Z~DTuXla>%hz2+rg-PE%0(eNf-WN+(^r{o{fPLHV_tv4l zvMUct&eonE-oL`N?sosZyvpe<26Il%tCiU|`;^Yt{E&vJeqEWR^t@|$N@vc^HRoHj ziGiW?wY^Ptzw)jfzx2)uuyz)ITFpPb?Of&j)?%RRi<6;cE1Lp?Kd8CEP1)0M0A);+OYmyB;T0fnPyE-4*bzW_!ftZF7s7XLdWSf5cgrK5p-J?zh{X*Oas^j$Pd{ zci;J*ILn$CFRx2K&t6MIH$Monc-0OZd=Zd#w79afOh8k@Iw2d*F-whmN5O5K^|hWJnNQDKSqK9$M6y7m}In@ z-l*+4Rqr!5-FHjNy8kM2NjzE?o3{0D?8m7U delta 1218 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 Y_*Yyp5X0Vh8vpSDrkM4Qye!uVU_x*gn@6Q!R zM}|J*%64Ti7|$reFg3mU(yyP3GyT0XH2EgIcvG@?DwZ%%8Cnu&NcBV#4k*mpWL%AF z^_lA~;9>^D$zasPQ}L<@k&ZA2XdOBMcC(d6GZ^9(cB@vGic>%mo@}&8z}sJ+1OcO7 z0><%FkjjeUDaNoY5|7P_)abHObwWM3VmTnTi)aEfPH6$V*<`Va>=N(+uZZ3|jyWLk zK!r+`fDfIDS49ITLE-=}0P@#CdQ#W7Q&EF&gJuEhzv#o`P>ihAcVrG6y?fgFpSBCh=4DbK@c}2 z2orFzkQuDPVxzPc9X?~%NZXyp3jY%;LP=ap5u}D7Ofwx2okCEAErqZGXe~@6 zLw1zsVYC=d8q;yToFvS^gZzq&kFk%TGAV{(Tq*Bi+#xW6pa@rh1sO0qzmBEA&W<;xV|lW$2Fm?U6Ns#U9fm+z-ch|FL!`ps`Wd0 zx_%XV?5%^d#@tqT>;P_6I4!o_MK?Ttqy~axm;>lbw9lgWM_|{C_0vKWx?SEG0aA`k5BNF z4{%IZQu=a|T0I!|!R&~bL(Vz9pZojfe&f}uY;oh2c%5{259vMh7WwnJJF5ro9pkqz z{yJjYhf9gw6M4fix%(iGx;k-cajjt$e{(m$EGsU!p<(^<-cvalcRiaL(^zxo0|Wc* zH|xaIo}jFO;=VIaZT|i8`1tsRmF4oXymhtZm2u7K+1sxtp&;w^q41iGL%}ZVo5KBWCwOgs*Sn+9Sbp{Xy><0vtP+jq zh5Vaugns!U3t7}Ydgr`ntKzG9s58a6adB7MZ?S2e_j4woWkV|lD#Gz2(XDXKp2qjZ z?rPr3&7HZ&V@#i%_rA5dr~22*y67d}$~!CPvcd|vm7sS_;ybwqLbFC>$G zAM|w3hopCR#(J_ECgw-9mYo_lF@fi*Bl&FG@w&1RFM?ezmz1GZz#-$)d&hWNC$;|GBO8l9 z>+fi3D=O4C6uf4UT6*$}cU9q4wOG~8(jTTS?%i;4_HTXpzTU?CPa?VSuIR#7kGwI_ zb0aP3$xe7?XKrnnw z#Qwtu_F%MRdGB~y?%STXGKuYM6Qdv&I?&j@OdG>d`Zfzr--omqePH#4L zh{`v+C$16qXqR7p=j!@lrxX0&IoBsYp6Vi>3ckfX-_hmQht6l!-90sQ#eKKCQ`@f% z`Q2EpY3}-lOmTeN`I{uCdStNESBr)%AQuh0L delta 1210 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 diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_r_signal_3_fully.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_r_signal_3_fully.png index 78738ac73ec7285d16fe4efda92a9976c62d5ff5..3664ab4fb8ce4f81d8a32648c441ef2f8ec8692b 100644 GIT binary patch literal 2038 zcmbVNYg7|w8V;hsLZ}|4MHD<^0FiRZ%n%Y13AapwK>`?};I6HNWFTosCM1IiV3DFI zyR<7uML|kS3sg!4+@hdC?jpLbCxWDS!GgDiAWP_$mU_dTD7gE>(;qwM%zWSbeed(U z_cMP^h>Lc1T;oV0k(~LP5h1a<6YmBGJK{S$^=uchxZ&JnJP}L7bz%)lij-ohD8N^W z(@`NRmS$&OK|@I-+cdc-8BZ3(vLu)?P;Au+)GO5lnnVf>*Q>=61&RZyXu4d*rdZlK zDS%wcrX&RmK!KWr%H*4KG-zT@oJf+RkT9i`@Gu}$&mstvC@u!{$_$m3rDs!K@v?}$ z^_WTlUa8;;Hs!Tb$$|ucgK1D8I1mhwfOHU`LxE5bjlp2}1271IR1l^@Z~(+$1;H#3 z1Qs3&VND}VV+j%7f-OQ~Q)D=Kj+oi0!p6o_fksSuONv~s|30HG0}%~s)JeSk{q zxyXQ^T8T!k#^sm_uri8Mu`HZTAv}E@f>JFIydhR;7ZOFJjH(x_sZbzDRVuA%rh7>;RWm>S?D z1_J`IM6R;R*7CfL7C|-g-KdnO!IZ$O{IcY4v5!P@BM}6lMFzi)I|_nf4oqVpL0phY zqlHiwu+sl0XH>!&sC7Xi+RAU0o6U_m*-cNk>5S41<$VBU)6B&5boanfIeIWNX)PMpm1>stPDtUtLn zl@lJ*O)GSq_(<<%+&*X%VUPUulRVgHEKU+$>KpBQd;{n$5uf)9Zx;R9lUvDNt2j4& zF`1wG$a!UA#?}lnDTmoS9$^QG?A&C9U%#I;jrx9Vw);m%?&OQ6f~pHuU}^tqtwJt0 zSN4;h1lgTeZwpWue$Dl?Ih!Aw7#hFzq(dQBVIkA%-gC>|JW+ zicj8~xZ01;6|eo}#N{2|+-!c@oc-;c9?yr>%*mt{9@lGZSCIWLAJ?vmiTFTJQjSWU zOGV?=twVcI$624GnK@(L#nFyXC!ZSLZQGWYmpJ|L+%FHjn_<}FC2Mlh(TA^&N8Y&- z`{0{`bKkoRHk@XwlRJSAqMmH<`pvBXF^R7jN%nzFdcRO&N zNA>dA0Y=qm*^Nh7SQ2(jF*&AvX7X#@8}p&W{9Cog*&yC#+L)dOFOOO0aJ1V8#v7l_ zJpT5WOUH!aVCVA^+M!O5%I{*uK~2!9yYn46x32A2e{e~RWA}}J-U}IiH0W!Z$`X1q zualOCv>f&*uaEvB<$iN%{Z+=buVib-eS6)#8(nIfx9_ZI*!oxgSk{;!-e4~!w@%+H zcJit2gSSLCxbw*hzv24h?P*2J-iv+bXPY{YB?r#9m>Rm%&QumKpY(`WU9{Hd%Qus| zd#*&b%V}*_nF80?6rtIFi_Gas0@}6idVftZLpuHa%AKw&%uDxwa`u{T#hLS)bdF_4 z?~QvtE!;h7uZd7Nb%or-;0UTmVIj`+hX=}9Y{^S}{YNZE*ZYvCO6l5W8|aLN5WbLKo7hs%=K)m|7Q+N$Na!}etLx^q^s`dl2zkA zE|&QpTMXEd5!#Pm4b68!XZB_7&R&z_&&iXF%>C)y7sy9_ZrwG<4&_d&T0h%6C|8w! z=~fnbf88m~ruJP~AA8FzJ2SJN>if;qPA|R+@*THj(Pt_KTaQ0|#tQhn_HI?&mWnur zcw#!7T%mi}#ak%}ID#UZoDW7zJ|_SG delta 1184 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 delta 1129 zcmV-v1eW`$5dR1viBL{Q4GJ0x0000DNk~Le0000c0000c2nGNE0H{6bu8|=pe*_^( zL_t(|+RRuxNGm}Uy@@e?5G*uN2rB-yvG7y*K~MxsA)p8%V&?}R0V5Bz(B{Dt<)u*( z8?h4+6&pVYHe#V*Vd1AxB2O?;3lZaA=gwo6-OcQ7cGt+eFeJM(bLZ^2ckbLfmXD7Q z_#ee)RzX)+m#O&^6BE$^wz08ce|WCdYE|sBh)r2vUvCct0>46`kefVaev{Sw2?+@c zPN(zd=H})zmof4Mzthsv`p6(iOiYBBn3$*{dV70=hlhtuLWaj;vEX7qxWJN=lUw8B z;wUJT_xJZN2a}hV2aS!5kd%}JdwYA-6$lyd^z_uK2+VG`J4mB|W@ct2e+nNTAK~)y z66WUS;Ns%K5GeBD(A(P!#B}sIJ3AYK!5{@lT*@J_p7;R)q0b@3Os=l3XhXB+!tlhT1G~O0E$U|em-4OZXKH(m>3jFe}6yyMe|NgO;N=zmka!Uzi!5Ou7Nuf*Hi_@ zzDz6y1qJjsD=Uls5@&_8f3q_~rsM%*7Lu>432bn1Q22j+eGRj-vteWO?7~QaS$V+3 zgLZay;Q9GqcsV>ggx%d;!#<{mu`pn-udlQ*866#k`T2ROw6?Yu+-|opMsMRWhI)B@ znvCIp1h%!cMW36So2kDkv4Xp|r>6&|r>9|PXb4hMQ_VB>^70}yfBCzyu`xI~Iic@5 zJ3A#~#SIy)tE&Tt!vUqGrQq>+ggzz4FG46Dgk3hnGs+tTxez&C{%)cizk%bW2r&75D0F<#$SFeabJjr?XzY1H{60u~B| zB!e)uX3FJx6MM({N#Uw%?*08e7nqd?Y+3YzB^6kZRQpaYu(GnUKPf3GeR%E#0s#p# z(Ga|jzzZC##&2$JeEa+R{JRT++>5C&iS%wluj@PRKcEOPf5|z#aD061RWzj$86F-s vbqzH#GNOHPXGEfrihs#fXS6PtKLr>7#RgiA^>F^(00000NkvXXu0mjfCHxCW diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_r_signal_4_fully.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_r_signal_4_fully.png index ac881431aae2aa770465cb956bb7e510b334cc3e..b4fa4816eb917297e9249c42a387b20bb51140af 100644 GIT binary patch literal 2069 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 diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_ringer_silent.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_ringer_silent.png index bdd37e10d8e3d1237bd0dcc7ffb35dcae39b58af..5a741bb2ed62f2c27afcf02a1980ad3426e4f07e 100644 GIT binary patch literal 1378 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 literal 4980 zcmeHLX;f3!7QP@LqD2N#8I1uIEF>Y!F%U3-gh45T3=f5n+=KubNG^{+1yLqNWN=_E zL}buv74%_I5dwXRARvmOfIz7V6{(^Yv?Ar*1cJDpcJbDF{YTbHcFx`V`}R5C*=Mhu z9CY8l?JETh1polPB01T6z*bN6mY0J+2Z7vN*r-DezK|!I21Sv%AYeyj2ZIO_lS~Ia zKr%Htq8Y@)U|WWlFXZdyileZZD6%L9#b|BqsUZT3!C0a(7HAWUk+CHX zV}>&|M$EpDHVOzlmrBEV*gMXqgGbiL5D4Pn(CDbBC{&aQip`~?jjgP#&=@Qli#38H zjCj#3h|D))@pMHLGaU9HkHTeeAO@R-5OI=&*^!Vn5()bev*c9D95*MD8!l$1QqW*H z$OKss4{eMxM$eCjmGEHDLm=K9jK!N(8P*%kCv#v32F(@6e1hbJupu@tgw6Rpa?UNr z&reC>KonCruSn22EW9d;c(Oc*ik=@KhKu)UCi~okac*R87zppRBRQN0iW7YF`GCQm z5E&9LdRCyh3E}J_p%6Bg=g#IaL{h?jk-`W(m4cgDr+7Fcxm`FkGnyHOGekP$!pSVU zHIi>c1!?5Sa0rQ>MW98yB7xx1pAw4rDO`{YvAOdSc!Ck1CisL);uUkv2aCuc1{4m? zqmm?^t(O0Jt{?gEAC>gx!ROHn{SSsd}d*+KB zMwH5`eeO7%+;7FsOBw{OhH^wZ!&0h8P_EK!h2XF78K2{Y>uS8r9Xdgh|qGGcq>jVPZBSl4j(u0G4 z={t7p7;oB2@ZrOrhM}P$4-$#Axj88*sid#3ulx0Du0bq{M2?cri%8~K+S~wv7y*)xn zsbkpK*cg}VcCD&veL-HHa(>&;w*Y_T(5UPg4gI^O=H{1vF+phQU0=WEk3DtC)QV1n zrIrnOCiF)aR91Af`Wj}x&(GIbl3h@cpPwi*+L*Nb`ybf@yS3ESn{~9c+b;S4kRg1+ ztNcE%sOW{Id}cAdJUu-`+8%_>TU*%_bbf=LUg?!HXIx&Y5i52S50Ug#o_2M0867!M zB@^Z|`0wJQwHGgX0!mx8oN4zNrW(U3ir)IGHo9)aPp_`i&&bHwE8le;vtBl(E$rw% z|J6MN0AamU5Xxk>JsKEbLj}*DG#_12WMb(Xr8E^<9i#cI5#U)nc-<|Eh#wu-=olLt z!<83Xb=qBy-|RlEO~>h!V=*^`6*nSr-`&yNw9C)$8-!V+y`$q1q(-r-u6a&_p^S4= z)rOSh4*~%qrhMEyR2ZsOrLdv!;rVfcQ7hobh-XR{p0jvTTH3Ddr{Bn>d2K!}49Fo8 ziRza8Z7wc{u5Yq^Hx^yxTe#dd%Bj7zb(QF+bcjvn} zkaG4YzV&Zcqspgleqx+*drC=oiu27oEW5up?@(&0f@R3c*Lj)Fio-k#InyQdq|HR63+{P+V;TOXX;r5dy=Ir8vrZC(E~ z$nuRt)HULJx}X|ZcjYkk!IGe(ne|PEuUoCh)^TYSTO2aimFQN&RXUNKoqfSZ3i;2Q z0g&C62d+P}`fHm*s{My<9M)8c{~&c91yC(eX1PZPcaivf%e-6hjiHeRI`IK@iQ`Dq z*pn&FX{Q*aNh+>2!kTS6cdqvI@oD1Ff;w1As=qe`RA#!ga?(0%a-uyvJ#U}1br~cE zX06z1Al;TCotWjalc;(_AoL(ZMt7U~55vDtFNp3Q##FU`N*x^^>J;*xw%1^`gsivcI8*D`#-udb%!W9yw?ZwaBg2X$*YnoiJqeVxWFU!6D9>{ap^f0@3$Ssx|lTd*9#@)B;Cx zgaLB>#tAIE$KSXEih{`+Djg8vYp(4=0e*g+tjPn2h diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_flightmode.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_flightmode.png index 7a419f1616e0a30d4eb9af26e71417ea3af9d42a..01c7e2a692a5a2ae16c546c4e789891eeca30719 100644 GIT binary patch delta 1058 zcmV+-1l{}83%Lj(iBL{Q4GJ0x0000DNk~Le0000T0000c2nGNE05~p?VUZyxe*@b| zL_t(|+U!?vXcR{jf3r7xd$-A%6O#rEiN%QagNLB4G*DZ1h>~Eg~eB ztU^@Z|KsP4JW^S$v3#Opf4_!wYc@Tb!J#ww(c#$0k7rHWy2qvK*w#+CJ7bl>n8m z7oO)`?&;}idz3O*u#(I-?+#w9cc#XkXlhBmoy|b*dmd(GCIztjf3=nloU6U_+r@g_ zToqTq62kRBxB|$XZVtr~t^2ziN2{2b$y~qn*Ki+^3B;|TezbN9vRNK& zJ#@6ow#F)43Kmv=f1b)azg~zo9Y1w4J#Gz54F7(~lQOM5x30EfeNrOnXY^gi-a9&qggjgZqL*VO(u_jaHq3CB-Ce}-$IZ+=eNSW7|}W>wpF zgZ1_MxE}&cLkDYgcqqKRG5`7^e>6O(Dg@4?n-EzaQkZsX$3gIYLu1m*aL29Cj5;uz z4}jCx2}VT(?1@oPj+JxDAVnX!GOBstT<8QJQ~1)=+XtWD+;Cb+4?;L+gf(DFE@8pX zxyc8Eb1-xUc$5+%H91seHs;beN2c<>Q{NM1pXf@?NGe|qsHCE0%oi|zwLeQOfpj@i zTvI50E2qH~(#Mz7p`UQ^WH4Sbeew07AoHE#XyMdS>9OKjrKDv^Iakf)xwWlaidRUN cLLLY(0BQf*$KY*gOaK4?07*qoM6N<$f-g=8ga7~l delta 1473 zcmV;y1wQ(@2-FK9iBL{Q4GJ0x0000DNk~Le0000c0000c2nGNE0H{6bu8|=pe+70) zL_t(|+RRu>NR?X@UcNQ8Bt43+O7Tg)LQzuDi8&C0&;kudI&)H9p-@mz&9&N-g0aW`zv+5g^a?QgHgx7YuB zoS&c5|FL=hs)D+@x?hs->FK!~e_-$4y>naE)6>&*&O>!&NlA&X)oT6o=;-L77~c3z zURw(Y2zVPF9^N=UK7L|oF>!*&*Jq zt5+#AGm~<1a_H8rTf7(c#NMVc=IiTg5uFv7wJ%@3P)kb-<>uy6Mn(p;x3`m@pPx$> z!n&-iEb{jLcUyq`_U#*e{P+=`u$Te^Ah-%9Hf#I)`wR;0?%lgQwpc7K0fTiA9x|?B z1juf0Z|jVq1Lg=6+S%Eee{SqdMvW;I0J0K5wa<0Hu)x_SS_Q5gMqR7Q%dyeE7XoJF zW{hDqS27c8ReHkzUj_yx-@kv?0YD%lfc^dbor2R^%n>k8qtk0UIP2ixfC0RE^~z4c z;NT$7p<|tqyxO(&A@_6&Oxqy@K;Wz1-d;*hPPS8kabI5_iQ9tLf4~ahDRGN%_JSg$ zE;DX(YB9;^vY(usFdZBpAJf3VfDV)juD`#Zfq^WeqoWxRsNl|>J9avaK*>2%U@Cf8 z3LD|~<;$0pkdWXoegF>ZzJC2mpFe-LStvF(*3@EZjA^soQ_D#*rr({U8=FOWIx|nf@#>PfkSXf|iDk!5Eb{Uui z1xp!$5~YdVcx-HpV^M3lrluxZSy|y2btT5Mz;rwYuIlRQvUA_`^fZl(jL^iy1Z`|= z(9X_|ZLXoAfv=XLq9UrStfb=NVt$^KltfikRWvy{Y0Egbe|b!r6eSHBz?7DjQgwAT zTL!|Bk&$)^kaePDVE{EXHB?($OS7}HJO{dfHQk9ZZ!IvK{=tI>Oqjd7yPWo-!sL0l zxvZ?rPC;B;99IWmeXK*_*xlVt*RNk^i$q05*{DEEq|#EDcWN=Tt*tHQqVn=`%FoZ| z%mS#}w{KHte`lwig68IC-ds`(N}I&QM6R_$LPFS@YVf;lF_a-GDJhhfm&eaSLqqvQ zpFVw}H*enXov1d9U%Yrh6%`dUH#f%{!Fs5*_@zSpmzzpgYGcgkO40>C8sbPQz%v9g zf_r{`o?VULfB*hHgU4DZe*XM9)z{bSHdo6cEs?5$fA0{ORH~LY_z$Z*di03rkgaKH zY3$zR8 z%<3_Rz+_e$RhlwRv`Xa0X7j47QH)7hr!~Jk#YN&oop)DO`wd0sN@S6$0AsB?%mP?D z?@U&;f0|3c5R7smcnG8^mBZ|q!#cPfq^fQ%=N-vH4!=P`LAHd@0`oKihOz}hAj;I# zR9ahGvsncfGfs`S==Ah-4*m}xKG^0_Re)HHWH&cA`9?wVfUIL;Vwn4+mrOsZh}5@= zth0cp@CuK+4u#+F@UUG40m`^{?;c-Qqobp=f4aJArxY*3xI>L(k=6I_-{*r*O-<3v z%nVn$;`-YW1w^a z3LXmcM*og)P{J^qqM&>$Lg1OHE8S_Wt*vg$BCgun+MIv5bEmocZA_($OZn7!Ss$1G b7ZG3pK5yMP((WhV00000NkvXXu0mjf9=qGE diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_null.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_null.png index 1adc05aa08312fb3abdf4372e8246e0d5bcacfc1..03d21470d89a7f73e9864f5a56539fbd03131ce4 100644 GIT binary patch delta 462 zcmV;<0WtoV3h4tOiBL{Q4GJ0x0000DNk~Le0000T0000c2nGNE05~p?VUZyxe*ue0 zL_t(|+U%D*Zi7G&hQT6o8J7rQ($To!3{i@7Mix>|fvDZ2@(mCigIMGyDbl!!fGSNC zmnJ+iV?nf##aSMTC5w?p%nXmu^Lto;&-0x7Z<}yuun~HBP@afY@Huz{zB^H?Sl{Wt zvn(qy4C4vn1vfS5VW$EWm#a`_AMOyhPm)-vL+KQ zP1B#agH7S$S{%of9|D`JGAE%b$htvEu|q7BQhT1arVP?iMz|m;4Cn!uJ#uG}4_2qW z_ckr~pF`DQh1=8K23uQ~B&G5!|EVy36pzp$>|1~V0804>$?t|4z5oCK07*qoM6N<$ Eg2aQ&U;qFB delta 1283 zcmV+e1^oKy1DFaSiBL{Q4GJ0x0000DNk~Le0000c0000c2nGNE0H{6bu8|=pe+0To zL_t(|+RRuvNMuVCz3sj$XuB{v?mKQMiWrF+iD1ytWMXFG_=C}(h#L68=#PQ1CMHgx zCL(Gim}#WAuOMo>;lAsyQ=fWNzpnTC{Z@xxP;|d{>sFn*_td?&p6%`JjsB0#@4XYW zw6wfSe_&wXbAU}vO?j>Bl&cs`It1Ig2>f#nj zN=l-dni}o~SP~7~=L-4T1>R3rzhphJI8@9~RgG{|vUWj$;pF)>loFDWT;k*h!nnWb=n*wWV4M)C3S zG&?)%qBJ--NZZ@nf84b=o%+Zw^9Uze%xT6k({KS_vz(xMWnkVWW|=QyVI!GkU>{L2=-nmwqYphY$4r4?kQIyN=jT&KMh2gFX=#bJ zwzf>8yA_U^23RW=!(k{aEYzM65>OpnUS29KhW{VJF;ABhf1EmbcL*0qRY*@N9$|6e zN_`*|VCTn^Gky3oU~sDM?# zd{n@2`G8VpW+vt4=F;BYo@N!)Vc2y_N(vPe6!18=f3dNl$yZlbd3I3g?(gsOYauSu z$hRmck!yvQ3_q#_1qC@{Vq)wl01;r32XVI?85!Z1ThY?e(x|Skj#sJU2#U!GaBL} zKH$K*SuEH7WFXbwE*SD3+1c4tRaNC+=Kb6ySj{h`E^9pvLzujtmc-R^qV8Ds7 z;b_Fad*(KRv~;IMKIi?gKErp2Wc{;^#*{ zsch)^^x<-~c6W9>FpXBOcbuuT9uI!Aw3qKpebn}$bnw*4uh#ch`o5HZe|72Q#B=Pe z#7@lGv7p2j{N+$=Vg7-YE6;aQ5%R~_diu?uGo88i`3K4Fm78BIys!QF+oMO%YSqgh zUr+oY?>^mkPi=PXgTO1hK8;+hZuFc#cJmk9TUHOQKD&6W*d;BVTiGJ8|EMMXxSuyH?K@|9-pWk)H2&{?&5{xfVNjyLYa;#s34PQv>2`^3aig E0EWG_(f|Me literal 0 HcmV?d00001 diff --git a/packages/SystemUI/res/drawable-hdpi/statusbar_background.9.png b/packages/SystemUI/res/drawable-hdpi/statusbar_background.9.png new file mode 100644 index 0000000000000000000000000000000000000000..a93383326758d171c094a3caf0a8db9c2e3e9827 GIT binary patch literal 2846 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 M07*qoM6N<$g6BqH>Hq)$ literal 0 HcmV?d00001 diff --git a/packages/SystemUI/res/drawable-mdpi/divider_horizontal_dark_opaque.9.png b/packages/SystemUI/res/drawable-mdpi/divider_horizontal_dark_opaque.9.png new file mode 100644 index 0000000000000000000000000000000000000000..9444f0d185834634e2dde145af2276c93ff6a312 GIT binary patch literal 2805 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 ZVURj59DnzGuqaS9gQu&X%Q~loCIA`DCQ$$Y literal 0 HcmV?d00001 diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_gps_acquiring.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_gps_acquiring.png index 31bc94ec1e564acc337d9a6457b674f99a2f1937..07f0a0a239af9957bd64fe36d5a1e2a97e81c7d1 100644 GIT binary patch delta 866 zcmV-o1D*WS1o{RciBL{Q4GJ0x0000DNk~Le0000H0000P2nGNE0M|anmysbSe*+vz zL_t(|+T>JAOjAJ=z0>K3z7l9l3y26l3=|~z!$fK%7{$aYHTYQ=gRa~PxYHP2=mrxF zfgmPoFwvDp!vb|9Mp=L)Mz8{EwBe&PfGDL^pYJy_PDMouhJ`zQ$;rEm`_7zu-kFOS zWAL{R`o~CGTU!_Fxu)y-3%A={e^*vkwqS!X7z{2(;#XDG#ZmXC23%250T| zBaWu&$n+L_vRyI!MpDB^(2?h6%V!d*j*fv(lK>GFAOVEAl?s)VeL8eyzZ@9OL>*EFpsrev7o zEfBMZIbMZGLR3&9fV8gwsx%*5ksX{t6--iq0Xo{=-aZ&p(#2us+1-hV6@!k5Ch-)b z`FY^}fNtdl1Ipn9#-5aym$%1A4$S;)r5ir1D#XiOZ3gq?v@`{Fe*>ONLNowJ7Q9BG z(ljb1i!QhQoY(7Zo;4QHTST_4!5>SUX&z|iSBlC}F8|XEVzt!)Jo9y|0wanG4fo7v%!vjag)g( zmsrBRbwBF?CDG5qE9$kuO()U2VwG7cClE6lsbpWG$f}Z^ozaNI{!?jrDEiBZhK7b& zEzI!KpIEUI7+MPqpCCjJIh;usiq{uEDk>^^I&T%ovb@mkIHnwJKX8<(Fr{=-5QP6_QGXL)06HdVPH%_T;s5{u07*qoM6N<$g5_q8pa1{> delta 569 zcmV-90>=IN2Gax~iBL{Q4GJ0x0000DNk~Le0000P0000P2nGNE0L1BqW04^ze*yJL zL_t(|+G70w|33q*0TTlqz^EmomJBCLyuG~zX=;hDuP@)5H*emVnVH37Q^?53$V{;% zJUl#3va+%aLPA0dY;0^2(G>!VpT87a0yM;pi;IgvSXh{WgM(w9xw$#mA}cE^Hhq2l zUS(zFlO`r6$rM@g=g%MGzkmNSe=spIG4S*AGqAI>&(qP-iTeEcvp6p=uaSa+f*DYJ zj=Q_NF{zfYAX)N*m6es@=g*&@@Mi!T46<-8P^y}flQT{KzkY2c+b6&{+5Yd}zrr6se||6kX_znv z5F35}{$1+L+c(E|?AQ?u495Rt#|bd94+DeZ3&`~#-yq|UA3sVwdGch9s+w9V(8r8q zTe4xph9AJVNQA}(iY32)|7KujW(Ik8ro6m->W?4a8OhG^K;NumV`G~yBO}AW!otD; z3OX1DMmoeI28Nk3GO{Eke`QAWIzAyGflWX_V8+|GZxe6by2bF~#R~>d(uM&L8yNYZ zI81%_?%f=+EP-0Y2+aL~K)HE9gZP2*!2q-rEC$m42dX-@b$4u&d=3L1gX)h$SnZsW?-r5%(GQ`zk9!uLS~AsQn;zFfp39xYDT62(s|s5su(?)1Hb_`sNdc^+B->UA;;0DU00rm#qErP_Jpf(^ff>iyW z)Z+ZoqGVuvq$$HR1H%r#MIePh*I4-%Wdb85F~=o8ximL5uf)^ERtYGhmy(%cW$Nf? zZs6={ZfI#_U}j-xXyM}Ia}t%N=+=uFAB-e&w-_YfQ~)nYowuu!2CVqSum;nGLKfY?wDaS*RO%#=-F+)s6S{p5K`*eV}^(ye9iqQ!c$`VvUK^vhRDW zG}FB$|MoQ7&xZ{@+^CzS_U+8|t)CAZmr(sY;X~~8jp_T|SIgagKIi@XpNqK^J)Y&? zy(E=f5PgeFUw7>RX3x0%qu-eNm93uE?cY*zP5Dqgs|17ho8GS(y^rsK$`4OhKbLh* G2~7Z)!JtO~ literal 0 HcmV?d00001 diff --git a/packages/SystemUI/res/drawable-mdpi/statusbar_background.9.png b/packages/SystemUI/res/drawable-mdpi/statusbar_background.9.png new file mode 100644 index 0000000000000000000000000000000000000000..6c588f792569e5e508c69e436e1025d8302a3c54 GIT binary patch literal 2849 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 @@ -111,6 +108,6 @@ android:gravity="center_vertical|left" android:paddingLeft="6px" android:paddingRight="6px" - android:background="@drawable/status_bar_background" + android:background="@drawable/statusbar_background" /> diff --git a/packages/SystemUI/res/layout/status_bar_expanded.xml b/packages/SystemUI/res/layout/status_bar_expanded.xml index b5b1b507988a2..c744e4bcc13d5 100644 --- a/packages/SystemUI/res/layout/status_bar_expanded.xml +++ b/packages/SystemUI/res/layout/status_bar_expanded.xml @@ -31,7 +31,7 @@ android:paddingTop="3dp" android:paddingBottom="5dp" android:paddingRight="3dp" - android:background="@drawable/shade_header_background" + android:background="@drawable/title_bar_portrait" > @@ -71,6 +71,7 @@ android:layout_width="match_parent" android:layout_height="match_parent" android:fadingEdge="none" + android:overScrollMode="ifContentScrolls" > diff --git a/packages/SystemUI/res/layout/status_bar_tracking.xml b/packages/SystemUI/res/layout/status_bar_tracking.xml index a2b40e6013163..3b9b77551bef4 100644 --- a/packages/SystemUI/res/layout/status_bar_tracking.xml +++ b/packages/SystemUI/res/layout/status_bar_tracking.xml @@ -26,11 +26,12 @@ android:paddingRight="0px" > - + diff --git a/packages/SystemUI/res/values-cs/strings.xml b/packages/SystemUI/res/values-cs/strings.xml new file mode 100644 index 0000000000000..ff59db085b525 --- /dev/null +++ b/packages/SystemUI/res/values-cs/strings.xml @@ -0,0 +1,32 @@ + + + + + + + "Vymazat" + "Žádná oznámení" + "Probíhající" + "Oznámení" + "Prosím připojte dobíjecí zařízení" + "Baterie je vybitá:" + "Zbývá %d%% nebo méně." + "Využití baterie" + diff --git a/packages/SystemUI/res/values-da/strings.xml b/packages/SystemUI/res/values-da/strings.xml new file mode 100644 index 0000000000000..9389617769af6 --- /dev/null +++ b/packages/SystemUI/res/values-da/strings.xml @@ -0,0 +1,32 @@ + + + + + + + "Ryd" + "Ingen meddelelser" + "I gang" + "Meddelelser" + "Forbind oplader" + "Batteriet er ved at være fladt:" + "%d%% eller mindre tilbage." + "Batteriforbrug" + diff --git a/packages/SystemUI/res/values-de/strings.xml b/packages/SystemUI/res/values-de/strings.xml new file mode 100644 index 0000000000000..3ea65d94c898d --- /dev/null +++ b/packages/SystemUI/res/values-de/strings.xml @@ -0,0 +1,32 @@ + + + + + + + "Löschen" + "Keine Benachrichtigungen" + "Aktuell" + "Benachrichtigungen" + "Ladegerät anschließen" + "Akku ist fast leer." + "%d%% oder weniger verbleiben." + "Akkuverbrauch" + diff --git a/packages/SystemUI/res/values-el/strings.xml b/packages/SystemUI/res/values-el/strings.xml new file mode 100644 index 0000000000000..cba104711c5bb --- /dev/null +++ b/packages/SystemUI/res/values-el/strings.xml @@ -0,0 +1,32 @@ + + + + + + + "Εκκαθάριση" + "Δεν υπάρχουν ειδοποιήσεις" + "Εν εξελίξει" + "Ειδοποιήσεις" + "Συνδέστε τον φορτιστή" + "Η στάθμη της μπαταρίας είναι χαμηλή:" + "Απομένει %d%% ή λιγότερο." + "Χρήση μπαταρίας" + diff --git a/packages/SystemUI/res/values-es-rUS/strings.xml b/packages/SystemUI/res/values-es-rUS/strings.xml new file mode 100644 index 0000000000000..56dead5ef96ad --- /dev/null +++ b/packages/SystemUI/res/values-es-rUS/strings.xml @@ -0,0 +1,32 @@ + + + + + + + "Borrar" + "No hay notificaciones" + "Continuo" + "Notificaciones" + "Conecta el cargador" + "Hay poca batería:" + "Restan %d%% o menos." + "Uso de la batería" + diff --git a/packages/SystemUI/res/values-es/strings.xml b/packages/SystemUI/res/values-es/strings.xml new file mode 100644 index 0000000000000..4ebe49201793d --- /dev/null +++ b/packages/SystemUI/res/values-es/strings.xml @@ -0,0 +1,32 @@ + + + + + + + "Borrar" + "No tienes notificaciones" + "Entrante" + "Notificaciones" + "Conecta el cargador" + "Se está agotando la batería:" + "%d%% o menos disponible" + "Uso de la batería" + diff --git a/packages/SystemUI/res/values-fr/strings.xml b/packages/SystemUI/res/values-fr/strings.xml new file mode 100644 index 0000000000000..7aff506b14c67 --- /dev/null +++ b/packages/SystemUI/res/values-fr/strings.xml @@ -0,0 +1,32 @@ + + + + + + + "Effacer" + "Aucune notification" + "En cours" + "Notifications" + "Branchez le chargeur" + "Le niveau de la batterie est bas :" + "Maximum %d%% restants." + "Utilisation de la batterie" + diff --git a/packages/SystemUI/res/values-it/strings.xml b/packages/SystemUI/res/values-it/strings.xml new file mode 100644 index 0000000000000..496a82e8dfe1c --- /dev/null +++ b/packages/SystemUI/res/values-it/strings.xml @@ -0,0 +1,32 @@ + + + + + + + "Cancella" + "Nessuna notifica" + "In corso" + "Notifiche" + "Collegare il caricabatterie" + "Batteria quasi scarica:" + "%d%% rimanente o meno." + "Utilizzo batteria" + diff --git a/packages/SystemUI/res/values-ja/strings.xml b/packages/SystemUI/res/values-ja/strings.xml new file mode 100644 index 0000000000000..24c018b978ba4 --- /dev/null +++ b/packages/SystemUI/res/values-ja/strings.xml @@ -0,0 +1,32 @@ + + + + + + + "通知を消去" + "通知なし" + "実行中" + "通知" + "充電してください" + "電池が残り少なくなっています:" + "残り%d%%未満です。" + "電池使用量" + diff --git a/packages/SystemUI/res/values-ko/strings.xml b/packages/SystemUI/res/values-ko/strings.xml new file mode 100644 index 0000000000000..0b6649d709e9c --- /dev/null +++ b/packages/SystemUI/res/values-ko/strings.xml @@ -0,0 +1,32 @@ + + + + + + + "지우기" + "알림 없음" + "진행 중" + "알림" + "충전기를 연결하세요." + "배터리 전원이 부족합니다." + "잔여 배터리가 %d%% 이하입니다." + "배터리 사용량" + diff --git a/packages/SystemUI/res/values-nb/strings.xml b/packages/SystemUI/res/values-nb/strings.xml new file mode 100644 index 0000000000000..5684e57af08d1 --- /dev/null +++ b/packages/SystemUI/res/values-nb/strings.xml @@ -0,0 +1,32 @@ + + + + + + + "Fjern" + "Ingen varslinger" + "Aktiviteter" + "Varslinger" + "Koble til en lader" + "Batteriet er nesten tomt:" + "mindre enn %d%% igjen." + "Batteribruk" + diff --git a/packages/SystemUI/res/values-nl/strings.xml b/packages/SystemUI/res/values-nl/strings.xml new file mode 100644 index 0000000000000..cd10b29655b91 --- /dev/null +++ b/packages/SystemUI/res/values-nl/strings.xml @@ -0,0 +1,32 @@ + + + + + + + "Wissen" + "Geen meldingen" + "Actief" + "Meldingen" + "Sluit de oplader aan" + "De accu raakt op:" + "%d%% of minder resterend." + "Accugebruik" + diff --git a/packages/SystemUI/res/values-pl/strings.xml b/packages/SystemUI/res/values-pl/strings.xml new file mode 100644 index 0000000000000..70f3ad252e08f --- /dev/null +++ b/packages/SystemUI/res/values-pl/strings.xml @@ -0,0 +1,32 @@ + + + + + + + "Wyczyść" + "Brak powiadomień" + "Bieżące" + "Powiadomienia" + "Podłącz ładowarkę" + "Bateria się rozładowuje:" + "Pozostało: %d%% lub mniej." + "Użycie baterii" + diff --git a/packages/SystemUI/res/values-pt-rPT/strings.xml b/packages/SystemUI/res/values-pt-rPT/strings.xml new file mode 100644 index 0000000000000..492063a95dfed --- /dev/null +++ b/packages/SystemUI/res/values-pt-rPT/strings.xml @@ -0,0 +1,32 @@ + + + + + + + "Limpar" + "Sem notificações" + "Em curso" + "Notificações" + "Ligue o carregador" + "A bateria está a ficar fraca:" + "Restam %d%% ou menos." + "Utilização da bateria" + diff --git a/packages/SystemUI/res/values-pt/strings.xml b/packages/SystemUI/res/values-pt/strings.xml new file mode 100644 index 0000000000000..08effa7312260 --- /dev/null +++ b/packages/SystemUI/res/values-pt/strings.xml @@ -0,0 +1,32 @@ + + + + + + + "Limpar" + "Sem notificações" + "Em andamento" + "Notificações" + "Conecte o carregador" + "A bateria está ficando baixa:" + "%d%% ou menos restante(s)." + "Uso da bateria" + diff --git a/packages/SystemUI/res/values-ru/strings.xml b/packages/SystemUI/res/values-ru/strings.xml new file mode 100644 index 0000000000000..7c5bcf7a8f0a0 --- /dev/null +++ b/packages/SystemUI/res/values-ru/strings.xml @@ -0,0 +1,32 @@ + + + + + + + "Очистить" + "Нет уведомлений" + "Текущие" + "Уведомления" + "Подключите зарядное устройство" + "Батарея разряжена:" + "Осталось %d%% или меньше." + "Расход заряда батареи" + diff --git a/packages/SystemUI/res/values-sv/strings.xml b/packages/SystemUI/res/values-sv/strings.xml new file mode 100644 index 0000000000000..1127c9d22457c --- /dev/null +++ b/packages/SystemUI/res/values-sv/strings.xml @@ -0,0 +1,32 @@ + + + + + + + "Ta bort" + "Inga aviseringar" + "Pågående" + "Meddelanden" + "Anslut laddaren" + "Batteriet håller på att ta slut:" + "%d%% eller mindre kvar." + "Batteriförbrukning" + diff --git a/packages/SystemUI/res/values-tr/strings.xml b/packages/SystemUI/res/values-tr/strings.xml new file mode 100644 index 0000000000000..dd66d82f41c4a --- /dev/null +++ b/packages/SystemUI/res/values-tr/strings.xml @@ -0,0 +1,32 @@ + + + + + + + "Temizle" + "Bildirim yok" + "Sürüyor" + "Bildirimler" + "Lütfen şarj cihazını takın" + "Pil tükeniyor:" + "%d%% veya daha az kaldı." + "Pil kullanımı" + diff --git a/packages/SystemUI/res/values-zh-rCN/strings.xml b/packages/SystemUI/res/values-zh-rCN/strings.xml new file mode 100644 index 0000000000000..cda0317713770 --- /dev/null +++ b/packages/SystemUI/res/values-zh-rCN/strings.xml @@ -0,0 +1,32 @@ + + + + + + + "清除" + "无通知" + "正在进行的" + "通知" + "请连接充电器" + "电量所剩不多:" + "电量剩余 %d%% 或更少。" + "电量使用情况" + diff --git a/packages/SystemUI/res/values-zh-rTW/strings.xml b/packages/SystemUI/res/values-zh-rTW/strings.xml new file mode 100644 index 0000000000000..503087ba6decf --- /dev/null +++ b/packages/SystemUI/res/values-zh-rTW/strings.xml @@ -0,0 +1,32 @@ + + + + + + + "清除" + "沒有通知" + "進行中" + "通知" + "請連接充電器" + "電池電量即將不足:" + "還剩 %d%% 以下。" + "電池使用狀況" + diff --git a/packages/SystemUI/res/values/colors.xml b/packages/SystemUI/res/values/colors.xml index a0def6b3453fc..6550438ecdb14 100644 --- a/packages/SystemUI/res/values/colors.xml +++ b/packages/SystemUI/res/values/colors.xml @@ -17,5 +17,7 @@ */ --> + #ff282828 + #ff969696 #ffffffff diff --git a/packages/SystemUI/res/values/config.xml b/packages/SystemUI/res/values/config.xml index ac00c69ca4253..8ea46e583a951 100644 --- a/packages/SystemUI/res/values/config.xml +++ b/packages/SystemUI/res/values/config.xml @@ -20,16 +20,7 @@ - - + false - - - 0 - diff --git a/packages/SystemUI/res/values/strings.xml b/packages/SystemUI/res/values/strings.xml index 1f24ba69bbc81..ba3a3d1d35384 100644 --- a/packages/SystemUI/res/values/strings.xml +++ b/packages/SystemUI/res/values/strings.xml @@ -24,18 +24,6 @@ all of the currently visible notifications. --> Clear - - Do not disturb - - - Show notifications - - No notifications @@ -63,20 +51,4 @@ power usage activity to find out what drained the battery. --> Battery use - - Settings - - - - Recent - - No recent applications. - - diff --git a/packages/SystemUI/res/values/styles.xml b/packages/SystemUI/res/values/styles.xml index f592703b929b1..86bcf3a6f01c0 100644 --- a/packages/SystemUI/res/values/styles.xml +++ b/packages/SystemUI/res/values/styles.xml @@ -19,24 +19,10 @@ - - - - diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/CloseDragHandle.java b/packages/SystemUI/src/com/android/systemui/statusbar/CloseDragHandle.java index 0f6723e06e1b8..f45caf51662b7 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/CloseDragHandle.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/CloseDragHandle.java @@ -23,7 +23,7 @@ import android.widget.LinearLayout; public class CloseDragHandle extends LinearLayout { - PhoneStatusBarService mService; + StatusBarService mService; public CloseDragHandle(Context context, AttributeSet attrs) { super(context, attrs); diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/CommandQueue.java b/packages/SystemUI/src/com/android/systemui/statusbar/CommandQueue.java index c164eb41d1fc7..4f080d5609ba9 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/CommandQueue.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/CommandQueue.java @@ -32,7 +32,7 @@ import com.android.internal.statusbar.StatusBarNotification; * coalescing these calls so they don't stack up. For the calls * are coalesced, note that they are all idempotent. */ -public class CommandQueue extends IStatusBar.Stub { +class CommandQueue extends IStatusBar.Stub { private static final String TAG = "StatusBar.CommandQueue"; private static final int MSG_MASK = 0xffff0000; @@ -52,10 +52,6 @@ public class CommandQueue extends IStatusBar.Stub { private static final int OP_EXPAND = 1; private static final int OP_COLLAPSE = 2; - private static final int MSG_SET_LIGHTS_ON = 0x00070000; - - private static final int MSG_SHOW_MENU = 0x00080000; - private StatusBarIconList mList; private Callbacks mCallbacks; private Handler mHandler = new H(); @@ -79,8 +75,6 @@ public class CommandQueue extends IStatusBar.Stub { public void disable(int state); public void animateExpand(); public void animateCollapse(); - public void setLightsOn(boolean on); - public void setMenuKeyVisible(boolean visible); } public CommandQueue(Callbacks callbacks, StatusBarIconList list) { @@ -149,20 +143,6 @@ public class CommandQueue extends IStatusBar.Stub { } } - public void setLightsOn(boolean on) { - synchronized (mList) { - mHandler.removeMessages(MSG_SET_LIGHTS_ON); - mHandler.obtainMessage(MSG_SET_LIGHTS_ON, on ? 1 : 0, 0, null).sendToTarget(); - } - } - - public void setMenuKeyVisible(boolean visible) { - synchronized (mList) { - mHandler.removeMessages(MSG_SHOW_MENU); - mHandler.obtainMessage(MSG_SHOW_MENU, visible ? 1 : 0, 0, null).sendToTarget(); - } - } - private final class H extends Handler { public void handleMessage(Message msg) { final int what = msg.what & MSG_MASK; @@ -216,13 +196,6 @@ public class CommandQueue extends IStatusBar.Stub { } else { mCallbacks.animateCollapse(); } - break; - case MSG_SET_LIGHTS_ON: - mCallbacks.setLightsOn(msg.arg1 != 0); - break; - case MSG_SHOW_MENU: - mCallbacks.setMenuKeyVisible(msg.arg1 != 0); - break; } } } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/ExpandedView.java b/packages/SystemUI/src/com/android/systemui/statusbar/ExpandedView.java index a2d4b95d3422a..3d85f27519db5 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/ExpandedView.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/ExpandedView.java @@ -27,7 +27,7 @@ import android.util.Slog; public class ExpandedView extends LinearLayout { - PhoneStatusBarService mService; + StatusBarService mService; int mPrevHeight = -1; public ExpandedView(Context context, AttributeSet attrs) { @@ -53,7 +53,7 @@ public class ExpandedView extends LinearLayout { //Slog.d(StatusBarService.TAG, "height changed old=" + mPrevHeight // + " new=" + height); mPrevHeight = height; - mService.updateExpandedViewPos(PhoneStatusBarService.EXPANDED_LEAVE_ALONE); + mService.updateExpandedViewPos(StatusBarService.EXPANDED_LEAVE_ALONE); } } } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/LatestItemView.java b/packages/SystemUI/src/com/android/systemui/statusbar/LatestItemView.java index 2f94af61e3771..1e89624d89f80 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/LatestItemView.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/LatestItemView.java @@ -23,22 +23,12 @@ import android.view.MotionEvent; import android.widget.FrameLayout; public class LatestItemView extends FrameLayout { - private boolean mDispatchTorches; public LatestItemView(Context context, AttributeSet attrs) { super(context, attrs); } public boolean dispatchTouchEvent(MotionEvent ev) { - if (mDispatchTorches) { - return super.dispatchTouchEvent(ev); - } else { - return onTouchEvent(ev); - } - } - - public void setOnClickListener(OnClickListener l) { - mDispatchTorches = l == null; - super.setOnClickListener(l); + return onTouchEvent(ev); } } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationData.java b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationData.java index 7e8a5c19cf579..7a8226724d9a4 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationData.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationData.java @@ -22,7 +22,6 @@ import android.view.View; import com.android.internal.statusbar.StatusBarNotification; -import java.util.Comparator; import java.util.ArrayList; /** @@ -36,47 +35,26 @@ public class NotificationData { public View row; // the outer expanded view public View content; // takes the click events and sends the PendingIntent public View expanded; // the inflated RemoteViews - public Entry() {} - public Entry(IBinder key, StatusBarNotification n, StatusBarIconView ic) { - this.key = key; - this.notification = n; - this.icon = ic; - } } private final ArrayList mEntries = new ArrayList(); - private final Comparator mEntryCmp = new Comparator() { - public int compare(Entry a, Entry b) { - return (int)(a.notification.notification.when - b.notification.notification.when); - } - }; public int size() { return mEntries.size(); } - public Entry get(int i) { - return mEntries.get(i); + public Entry getEntryAt(int index) { + return mEntries.get(index); } - public Entry findByKey(IBinder key) { - for (Entry e : mEntries) { - if (e.key == key) { - return e; + public int findEntry(IBinder key) { + final int N = mEntries.size(); + for (int i=0; i 0) { - break; - } - } - mEntries.add(i, entry); - return i; + return -1; } public int add(IBinder key, StatusBarNotification notification, View row, View content, @@ -88,23 +66,42 @@ public class NotificationData { entry.content = content; entry.expanded = expanded; entry.icon = icon; - return add(entry); + final int index = chooseIndex(notification.notification.when); + mEntries.add(index, entry); + return index; } public Entry remove(IBinder key) { - Entry e = findByKey(key); - if (e != null) { - mEntries.remove(e); + final int N = mEntries.size(); + for (int i=0; i when) { + return i; + } + } + return N; } /** * Return whether there are any visible items (i.e. items without an error). */ public boolean hasVisibleItems() { - for (Entry e : mEntries) { - if (e.expanded != null) { // the view successfully inflated + final int N = mEntries.size(); + for (int i=0; i= 0) { + oldList = mOngoing; + } else { + oldIndex = mLatest.findEntry(key); + if (oldIndex < 0) { + Slog.w(TAG, "updateNotification for unknown key: " + key); + return; + } + oldList = mLatest; + } + final NotificationData.Entry oldEntry = oldList.getEntryAt(oldIndex); + final StatusBarNotification oldNotification = oldEntry.notification; + final RemoteViews oldContentView = oldNotification.notification.contentView; + + final RemoteViews contentView = notification.notification.contentView; + + if (false) { + Slog.d(TAG, "old notification: when=" + oldNotification.notification.when + + " ongoing=" + oldNotification.isOngoing() + + " expanded=" + oldEntry.expanded + + " contentView=" + oldContentView); + Slog.d(TAG, "new notification: when=" + notification.notification.when + + " ongoing=" + oldNotification.isOngoing() + + " contentView=" + contentView); + } + + // Can we just reapply the RemoteViews in place? If when didn't change, the order + // didn't change. + if (notification.notification.when == oldNotification.notification.when + && notification.isOngoing() == oldNotification.isOngoing() + && oldEntry.expanded != null + && contentView != null && oldContentView != null + && contentView.getPackage() != null + && oldContentView.getPackage() != null + && oldContentView.getPackage().equals(contentView.getPackage()) + && oldContentView.getLayoutId() == contentView.getLayoutId()) { + if (SPEW) Slog.d(TAG, "reusing notification"); + oldEntry.notification = notification; + try { + // Reapply the RemoteViews + contentView.reapply(this, oldEntry.content); + // update the contentIntent + final PendingIntent contentIntent = notification.notification.contentIntent; + if (contentIntent != null) { + oldEntry.content.setOnClickListener(new Launcher(contentIntent, + notification.pkg, notification.tag, notification.id)); + } + // Update the icon. + final StatusBarIcon ic = new StatusBarIcon(notification.pkg, + notification.notification.icon, notification.notification.iconLevel, + notification.notification.number); + if (!oldEntry.icon.set(ic)) { + handleNotificationError(key, notification, "Couldn't update icon: " + ic); + return; + } + } + catch (RuntimeException e) { + // It failed to add cleanly. Log, and remove the view from the panel. + Slog.w(TAG, "Couldn't reapply views for package " + contentView.getPackage(), e); + removeNotificationViews(key); + addNotificationViews(key, notification); + } + } else { + if (SPEW) Slog.d(TAG, "not reusing notification"); + removeNotificationViews(key); + addNotificationViews(key, notification); + } + + // Restart the ticker if it's still running + if (notification.notification.tickerText != null + && !TextUtils.equals(notification.notification.tickerText, + oldEntry.notification.notification.tickerText)) { + tick(notification); + } + + // Recalculate the position of the sliding windows and the titles. + setAreThereNotifications(); + updateExpandedViewPos(EXPANDED_LEAVE_ALONE); + } + + public void removeNotification(IBinder key) { + if (SPEW) Slog.d(TAG, "removeNotification key=" + key); + StatusBarNotification old = removeNotificationViews(key); + + if (old != null) { + // Cancel the ticker if it's still running + mTicker.removeEntry(old); + + // Recalculate the position of the sliding windows and the titles. + setAreThereNotifications(); + updateExpandedViewPos(EXPANDED_LEAVE_ALONE); + } + } + + private int chooseIconIndex(boolean isOngoing, int viewIndex) { + final int latestSize = mLatest.size(); + if (isOngoing) { + return latestSize + (mOngoing.size() - viewIndex); + } else { + return latestSize - viewIndex; + } + } + + View[] makeNotificationView(StatusBarNotification notification, ViewGroup parent) { + Notification n = notification.notification; + RemoteViews remoteViews = n.contentView; + if (remoteViews == null) { + return null; + } + + // create the row view + LayoutInflater inflater = (LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE); + View row = inflater.inflate(R.layout.status_bar_latest_event, parent, false); + + // bind the click event to the content area + ViewGroup content = (ViewGroup)row.findViewById(R.id.content); + content.setDescendantFocusability(ViewGroup.FOCUS_BLOCK_DESCENDANTS); + content.setOnFocusChangeListener(mFocusChangeListener); + PendingIntent contentIntent = n.contentIntent; + if (contentIntent != null) { + content.setOnClickListener(new Launcher(contentIntent, notification.pkg, + notification.tag, notification.id)); + } + + View expanded = null; + Exception exception = null; + try { + expanded = remoteViews.apply(this, content); + } + catch (RuntimeException e) { + exception = e; + } + if (expanded == null) { + String ident = notification.pkg + "/0x" + Integer.toHexString(notification.id); + Slog.e(TAG, "couldn't inflate view for notification " + ident, exception); + return null; + } else { + content.addView(expanded); + row.setDrawingCacheEnabled(true); + } + + return new View[] { row, content, expanded }; + } + + StatusBarIconView addNotificationViews(IBinder key, StatusBarNotification notification) { + NotificationData list; + ViewGroup parent; + final boolean isOngoing = notification.isOngoing(); + if (isOngoing) { + list = mOngoing; + parent = mOngoingItems; + } else { + list = mLatest; + parent = mLatestItems; + } + // Construct the expanded view. + final View[] views = makeNotificationView(notification, parent); + if (views == null) { + handleNotificationError(key, notification, "Couldn't expand RemoteViews for: " + + notification); + return null; + } + final View row = views[0]; + final View content = views[1]; + final View expanded = views[2]; + // Construct the icon. + final StatusBarIconView iconView = new StatusBarIconView(this, + notification.pkg + "/0x" + Integer.toHexString(notification.id)); + final StatusBarIcon ic = new StatusBarIcon(notification.pkg, notification.notification.icon, + notification.notification.iconLevel, notification.notification.number); + if (!iconView.set(ic)) { + handleNotificationError(key, notification, "Coulding create icon: " + ic); + return null; + } + // Add the expanded view. + final int viewIndex = list.add(key, notification, row, content, expanded, iconView); + parent.addView(row, viewIndex); + // Add the icon. + final int iconIndex = chooseIconIndex(isOngoing, viewIndex); + mNotificationIcons.addView(iconView, iconIndex); + return iconView; + } + + StatusBarNotification removeNotificationViews(IBinder key) { + NotificationData.Entry entry = mOngoing.remove(key); + if (entry == null) { + entry = mLatest.remove(key); + if (entry == null) { + Slog.w(TAG, "removeNotification for unknown key: " + key); + return null; + } + } + // Remove the expanded view. + ((ViewGroup)entry.row.getParent()).removeView(entry.row); + // Remove the icon. + ((ViewGroup)entry.icon.getParent()).removeView(entry.icon); + + return entry.notification; + } + + private void setAreThereNotifications() { + boolean ongoing = mOngoing.hasVisibleItems(); + boolean latest = mLatest.hasVisibleItems(); + + // (no ongoing notifications are clearable) + if (mLatest.hasClearableItems()) { + mClearButton.setVisibility(View.VISIBLE); + } else { + mClearButton.setVisibility(View.INVISIBLE); + } + + mOngoingTitle.setVisibility(ongoing ? View.VISIBLE : View.GONE); + mLatestTitle.setVisibility(latest ? View.VISIBLE : View.GONE); + + if (ongoing || latest) { + mNoNotificationsTitle.setVisibility(View.GONE); + } else { + mNoNotificationsTitle.setVisibility(View.VISIBLE); + } + } + + + /** + * State is one or more of the DISABLE constants from StatusBarManager. + */ + public void disable(int state) { + final int old = mDisabled; + final int diff = state ^ old; + mDisabled = state; + + if ((diff & StatusBarManager.DISABLE_EXPAND) != 0) { + if ((state & StatusBarManager.DISABLE_EXPAND) != 0) { + if (SPEW) Slog.d(TAG, "DISABLE_EXPAND: yes"); + animateCollapse(); + } + } + if ((diff & StatusBarManager.DISABLE_NOTIFICATION_ICONS) != 0) { + if ((state & StatusBarManager.DISABLE_NOTIFICATION_ICONS) != 0) { + if (SPEW) Slog.d(TAG, "DISABLE_NOTIFICATION_ICONS: yes"); + if (mTicking) { + mTicker.halt(); + } else { + setNotificationIconVisibility(false, com.android.internal.R.anim.fade_out); + } + } else { + if (SPEW) Slog.d(TAG, "DISABLE_NOTIFICATION_ICONS: no"); + if (!mExpandedVisible) { + setNotificationIconVisibility(true, com.android.internal.R.anim.fade_in); + } + } + } else if ((diff & StatusBarManager.DISABLE_NOTIFICATION_TICKER) != 0) { + if (mTicking && (state & StatusBarManager.DISABLE_NOTIFICATION_TICKER) != 0) { + if (SPEW) Slog.d(TAG, "DISABLE_NOTIFICATION_TICKER: yes"); + mTicker.halt(); + } + } + } + + /** + * All changes to the status bar and notifications funnel through here and are batched. + */ + private class H extends Handler { + public void handleMessage(Message m) { + switch (m.what) { + case MSG_ANIMATE: + doAnimation(); + break; + case MSG_ANIMATE_REVEAL: + doRevealAnimation(); + break; + } + } + } + + View.OnFocusChangeListener mFocusChangeListener = new View.OnFocusChangeListener() { + public void onFocusChange(View v, boolean hasFocus) { + // Because 'v' is a ViewGroup, all its children will be (un)selected + // too, which allows marqueeing to work. + v.setSelected(hasFocus); + } + }; + + private void makeExpandedVisible() { + if (SPEW) Slog.d(TAG, "Make expanded visible: expanded visible=" + mExpandedVisible); + if (mExpandedVisible) { + return; + } + mExpandedVisible = true; + visibilityChanged(true); + + updateExpandedViewPos(EXPANDED_LEAVE_ALONE); + mExpandedParams.flags &= ~WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE; + mExpandedParams.flags |= WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM; + mExpandedDialog.getWindow().setAttributes(mExpandedParams); + mExpandedView.requestFocus(View.FOCUS_FORWARD); + mTrackingView.setVisibility(View.VISIBLE); + mExpandedView.setVisibility(View.VISIBLE); + + if (!mTicking) { + setDateViewVisibility(true, com.android.internal.R.anim.fade_in); + } + } + + public void animateExpand() { + if (SPEW) Slog.d(TAG, "Animate expand: expanded=" + mExpanded); + if ((mDisabled & StatusBarManager.DISABLE_EXPAND) != 0) { + return ; + } + if (mExpanded) { + return; + } + + prepareTracking(0, true); + performFling(0, 2000.0f, true); + } + + public void animateCollapse() { + if (SPEW) { + Slog.d(TAG, "animateCollapse(): mExpanded=" + mExpanded + + " mExpandedVisible=" + mExpandedVisible + + " mExpanded=" + mExpanded + + " mAnimating=" + mAnimating + + " mAnimY=" + mAnimY + + " mAnimVel=" + mAnimVel); + } + + if (!mExpandedVisible) { + return; + } + + int y; + if (mAnimating) { + y = (int)mAnimY; + } else { + y = mDisplay.getHeight()-1; + } + // Let the fling think that we're open so it goes in the right direction + // and doesn't try to re-open the windowshade. + mExpanded = true; + prepareTracking(y, false); + performFling(y, -2000.0f, true); + } + + void performExpand() { + if (SPEW) Slog.d(TAG, "performExpand: mExpanded=" + mExpanded); + if ((mDisabled & StatusBarManager.DISABLE_EXPAND) != 0) { + return ; + } + if (mExpanded) { + return; + } + + mExpanded = true; + makeExpandedVisible(); + updateExpandedViewPos(EXPANDED_FULL_OPEN); + + if (false) postStartTracing(); + } + + void performCollapse() { + if (SPEW) Slog.d(TAG, "performCollapse: mExpanded=" + mExpanded + + " mExpandedVisible=" + mExpandedVisible + + " mTicking=" + mTicking); + + if (!mExpandedVisible) { + return; + } + mExpandedVisible = false; + visibilityChanged(false); + mExpandedParams.flags |= WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE; + mExpandedParams.flags &= ~WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM; + mExpandedDialog.getWindow().setAttributes(mExpandedParams); + mTrackingView.setVisibility(View.GONE); + mExpandedView.setVisibility(View.GONE); + + if ((mDisabled & StatusBarManager.DISABLE_NOTIFICATION_ICONS) == 0) { + setNotificationIconVisibility(true, com.android.internal.R.anim.fade_in); + } + if (mDateView.getVisibility() == View.VISIBLE) { + setDateViewVisibility(false, com.android.internal.R.anim.fade_out); + } + + if (!mExpanded) { + return; + } + mExpanded = false; + } + + void doAnimation() { + if (mAnimating) { + if (SPEW) Slog.d(TAG, "doAnimation"); + if (SPEW) Slog.d(TAG, "doAnimation before mAnimY=" + mAnimY); + incrementAnim(); + if (SPEW) Slog.d(TAG, "doAnimation after mAnimY=" + mAnimY); + if (mAnimY >= mDisplay.getHeight()-1) { + if (SPEW) Slog.d(TAG, "Animation completed to expanded state."); + mAnimating = false; + updateExpandedViewPos(EXPANDED_FULL_OPEN); + performExpand(); + } + else if (mAnimY < mStatusBarView.getHeight()) { + if (SPEW) Slog.d(TAG, "Animation completed to collapsed state."); + mAnimating = false; + updateExpandedViewPos(0); + performCollapse(); + } + else { + updateExpandedViewPos((int)mAnimY); + mCurAnimationTime += ANIM_FRAME_DURATION; + mHandler.sendMessageAtTime(mHandler.obtainMessage(MSG_ANIMATE), mCurAnimationTime); + } + } + } + + void stopTracking() { + mTracking = false; + mVelocityTracker.recycle(); + mVelocityTracker = null; + } + + void incrementAnim() { + long now = SystemClock.uptimeMillis(); + float t = ((float)(now - mAnimLastTime)) / 1000; // ms -> s + final float y = mAnimY; + final float v = mAnimVel; // px/s + final float a = mAnimAccel; // px/s/s + mAnimY = y + (v*t) + (0.5f*a*t*t); // px + mAnimVel = v + (a*t); // px/s + mAnimLastTime = now; // ms + //Slog.d(TAG, "y=" + y + " v=" + v + " a=" + a + " t=" + t + " mAnimY=" + mAnimY + // + " mAnimAccel=" + mAnimAccel); + } + + void doRevealAnimation() { + final int h = mCloseView.getHeight() + mStatusBarView.getHeight(); + if (mAnimatingReveal && mAnimating && mAnimY < h) { + incrementAnim(); + if (mAnimY >= h) { + mAnimY = h; + updateExpandedViewPos((int)mAnimY); + } else { + updateExpandedViewPos((int)mAnimY); + mCurAnimationTime += ANIM_FRAME_DURATION; + mHandler.sendMessageAtTime(mHandler.obtainMessage(MSG_ANIMATE_REVEAL), + mCurAnimationTime); + } + } + } + + void prepareTracking(int y, boolean opening) { + mTracking = true; + mVelocityTracker = VelocityTracker.obtain(); + if (opening) { + mAnimAccel = 2000.0f; + mAnimVel = 200; + mAnimY = mStatusBarView.getHeight(); + updateExpandedViewPos((int)mAnimY); + mAnimating = true; + mAnimatingReveal = true; + mHandler.removeMessages(MSG_ANIMATE); + mHandler.removeMessages(MSG_ANIMATE_REVEAL); + long now = SystemClock.uptimeMillis(); + mAnimLastTime = now; + mCurAnimationTime = now + ANIM_FRAME_DURATION; + mAnimating = true; + mHandler.sendMessageAtTime(mHandler.obtainMessage(MSG_ANIMATE_REVEAL), + mCurAnimationTime); + makeExpandedVisible(); + } else { + // it's open, close it? + if (mAnimating) { + mAnimating = false; + mHandler.removeMessages(MSG_ANIMATE); + } + updateExpandedViewPos(y + mViewDelta); + } + } + + void performFling(int y, float vel, boolean always) { + mAnimatingReveal = false; + mDisplayHeight = mDisplay.getHeight(); + + mAnimY = y; + mAnimVel = vel; + + //Slog.d(TAG, "starting with mAnimY=" + mAnimY + " mAnimVel=" + mAnimVel); + + if (mExpanded) { + if (!always && ( + vel > 200.0f + || (y > (mDisplayHeight-25) && vel > -200.0f))) { + // We are expanded, but they didn't move sufficiently to cause + // us to retract. Animate back to the expanded position. + mAnimAccel = 2000.0f; + if (vel < 0) { + mAnimVel = 0; + } + } + else { + // We are expanded and are now going to animate away. + mAnimAccel = -2000.0f; + if (vel > 0) { + mAnimVel = 0; + } + } + } else { + if (always || ( + vel > 200.0f + || (y > (mDisplayHeight/2) && vel > -200.0f))) { + // We are collapsed, and they moved enough to allow us to + // expand. Animate in the notifications. + mAnimAccel = 2000.0f; + if (vel < 0) { + mAnimVel = 0; + } + } + else { + // We are collapsed, but they didn't move sufficiently to cause + // us to retract. Animate back to the collapsed position. + mAnimAccel = -2000.0f; + if (vel > 0) { + mAnimVel = 0; + } + } + } + //Slog.d(TAG, "mAnimY=" + mAnimY + " mAnimVel=" + mAnimVel + // + " mAnimAccel=" + mAnimAccel); + + long now = SystemClock.uptimeMillis(); + mAnimLastTime = now; + mCurAnimationTime = now + ANIM_FRAME_DURATION; + mAnimating = true; + mHandler.removeMessages(MSG_ANIMATE); + mHandler.removeMessages(MSG_ANIMATE_REVEAL); + mHandler.sendMessageAtTime(mHandler.obtainMessage(MSG_ANIMATE), mCurAnimationTime); + stopTracking(); + } + + boolean interceptTouchEvent(MotionEvent event) { + if (SPEW) { + Slog.d(TAG, "Touch: rawY=" + event.getRawY() + " event=" + event + " mDisabled=" + + mDisabled); + } + + if ((mDisabled & StatusBarManager.DISABLE_EXPAND) != 0) { + return false; + } + + final int statusBarSize = mStatusBarView.getHeight(); + final int hitSize = statusBarSize*2; + if (event.getAction() == MotionEvent.ACTION_DOWN) { + final int y = (int)event.getRawY(); + + if (!mExpanded) { + mViewDelta = statusBarSize - y; + } else { + mTrackingView.getLocationOnScreen(mAbsPos); + mViewDelta = mAbsPos[1] + mTrackingView.getHeight() - y; + } + if ((!mExpanded && y < hitSize) || + (mExpanded && y > (mDisplay.getHeight()-hitSize))) { + + // We drop events at the edge of the screen to make the windowshade come + // down by accident less, especially when pushing open a device with a keyboard + // that rotates (like g1 and droid) + int x = (int)event.getRawX(); + final int edgeBorder = mEdgeBorder; + if (x >= edgeBorder && x < mDisplay.getWidth() - edgeBorder) { + prepareTracking(y, !mExpanded);// opening if we're not already fully visible + mVelocityTracker.addMovement(event); + } + } + } else if (mTracking) { + mVelocityTracker.addMovement(event); + final int minY = statusBarSize + mCloseView.getHeight(); + if (event.getAction() == MotionEvent.ACTION_MOVE) { + int y = (int)event.getRawY(); + if (mAnimatingReveal && y < minY) { + // nothing + } else { + mAnimatingReveal = false; + updateExpandedViewPos(y + mViewDelta); + } + } else if (event.getAction() == MotionEvent.ACTION_UP) { + mVelocityTracker.computeCurrentVelocity(1000); + + float yVel = mVelocityTracker.getYVelocity(); + boolean negative = yVel < 0; + + float xVel = mVelocityTracker.getXVelocity(); + if (xVel < 0) { + xVel = -xVel; + } + if (xVel > 150.0f) { + xVel = 150.0f; // limit how much we care about the x axis + } + + float vel = (float)Math.hypot(yVel, xVel); + if (negative) { + vel = -vel; + } + + performFling((int)event.getRawY(), vel, false); + } + + } + return false; + } + + private class Launcher implements View.OnClickListener { + private PendingIntent mIntent; + private String mPkg; + private String mTag; + private int mId; + + Launcher(PendingIntent intent, String pkg, String tag, int id) { + mIntent = intent; + mPkg = pkg; + mTag = tag; + mId = id; + } + + public void onClick(View v) { + try { + // The intent we are sending is for the application, which + // won't have permission to immediately start an activity after + // the user switches to home. We know it is safe to do at this + // point, so make sure new activity switches are now allowed. + ActivityManagerNative.getDefault().resumeAppSwitches(); + } catch (RemoteException e) { + } + + if (mIntent != null) { + int[] pos = new int[2]; + v.getLocationOnScreen(pos); + Intent overlay = new Intent(); + overlay.setSourceBounds( + new Rect(pos[0], pos[1], pos[0]+v.getWidth(), pos[1]+v.getHeight())); + try { + mIntent.send(StatusBarService.this, 0, overlay); + } catch (PendingIntent.CanceledException e) { + // the stack trace isn't very helpful here. Just log the exception message. + Slog.w(TAG, "Sending contentIntent failed: " + e); + } + } + + try { + mBarService.onNotificationClick(mPkg, mTag, mId); + } catch (RemoteException ex) { + // system process is dead if we're here. + } + + // close the shade if it was open + animateCollapse(); + } + } + + private void tick(StatusBarNotification n) { + // Show the ticker if one is requested. Also don't do this + // until status bar window is attached to the window manager, + // because... well, what's the point otherwise? And trying to + // run a ticker without being attached will crash! + if (n.notification.tickerText != null && mStatusBarView.getWindowToken() != null) { + if (0 == (mDisabled & (StatusBarManager.DISABLE_NOTIFICATION_ICONS + | StatusBarManager.DISABLE_NOTIFICATION_TICKER))) { + mTicker.addEntry(n); + } + } + } + + /** + * Cancel this notification and tell the StatusBarManagerService / NotificationManagerService + * about the failure. + * + * WARNING: this will call back into us. Don't hold any locks. + */ + void handleNotificationError(IBinder key, StatusBarNotification n, String message) { + removeNotification(key); + try { + mBarService.onNotificationError(n.pkg, n.tag, n.id, n.uid, n.initialPid, message); + } catch (RemoteException ex) { + // The end is nigh. + } + } + + private class MyTicker extends Ticker { + MyTicker(Context context, StatusBarView sb) { + super(context, sb); + } + + @Override + void tickerStarting() { + if (SPEW) Slog.d(TAG, "tickerStarting"); + mTicking = true; + mIcons.setVisibility(View.GONE); + mTickerView.setVisibility(View.VISIBLE); + mTickerView.startAnimation(loadAnim(com.android.internal.R.anim.push_up_in, null)); + mIcons.startAnimation(loadAnim(com.android.internal.R.anim.push_up_out, null)); + if (mExpandedVisible) { + setDateViewVisibility(false, com.android.internal.R.anim.push_up_out); + } + } + + @Override + void tickerDone() { + if (SPEW) Slog.d(TAG, "tickerDone"); + mTicking = false; + mIcons.setVisibility(View.VISIBLE); + mTickerView.setVisibility(View.GONE); + mIcons.startAnimation(loadAnim(com.android.internal.R.anim.push_down_in, null)); + mTickerView.startAnimation(loadAnim(com.android.internal.R.anim.push_down_out, null)); + if (mExpandedVisible) { + setDateViewVisibility(true, com.android.internal.R.anim.push_down_in); + } + } + + void tickerHalting() { + if (SPEW) Slog.d(TAG, "tickerHalting"); + mTicking = false; + mIcons.setVisibility(View.VISIBLE); + mTickerView.setVisibility(View.GONE); + mIcons.startAnimation(loadAnim(com.android.internal.R.anim.fade_in, null)); + mTickerView.startAnimation(loadAnim(com.android.internal.R.anim.fade_out, null)); + if (mExpandedVisible) { + setDateViewVisibility(true, com.android.internal.R.anim.fade_in); + } + } + } + + private Animation loadAnim(int id, Animation.AnimationListener listener) { + Animation anim = AnimationUtils.loadAnimation(StatusBarService.this, id); + if (listener != null) { + anim.setAnimationListener(listener); + } + return anim; + } + + public String viewInfo(View v) { + return "(" + v.getLeft() + "," + v.getTop() + ")(" + v.getRight() + "," + v.getBottom() + + " " + v.getWidth() + "x" + v.getHeight() + ")"; + } + + protected void dump(FileDescriptor fd, PrintWriter pw, String[] args) { + if (checkCallingOrSelfPermission(android.Manifest.permission.DUMP) + != PackageManager.PERMISSION_GRANTED) { + pw.println("Permission Denial: can't dump StatusBar from from pid=" + + Binder.getCallingPid() + + ", uid=" + Binder.getCallingUid()); + return; + } + + synchronized (mQueueLock) { + pw.println("Current Status Bar state:"); + pw.println(" mExpanded=" + mExpanded + + ", mExpandedVisible=" + mExpandedVisible); + pw.println(" mTicking=" + mTicking); + pw.println(" mTracking=" + mTracking); + pw.println(" mAnimating=" + mAnimating + + ", mAnimY=" + mAnimY + ", mAnimVel=" + mAnimVel + + ", mAnimAccel=" + mAnimAccel); + pw.println(" mCurAnimationTime=" + mCurAnimationTime + + " mAnimLastTime=" + mAnimLastTime); + pw.println(" mDisplayHeight=" + mDisplayHeight + + " mAnimatingReveal=" + mAnimatingReveal + + " mViewDelta=" + mViewDelta); + pw.println(" mDisplayHeight=" + mDisplayHeight); + pw.println(" mExpandedParams: " + mExpandedParams); + pw.println(" mExpandedView: " + viewInfo(mExpandedView)); + pw.println(" mExpandedDialog: " + mExpandedDialog); + pw.println(" mTrackingParams: " + mTrackingParams); + pw.println(" mTrackingView: " + viewInfo(mTrackingView)); + pw.println(" mOngoingTitle: " + viewInfo(mOngoingTitle)); + pw.println(" mOngoingItems: " + viewInfo(mOngoingItems)); + pw.println(" mLatestTitle: " + viewInfo(mLatestTitle)); + pw.println(" mLatestItems: " + viewInfo(mLatestItems)); + pw.println(" mNoNotificationsTitle: " + viewInfo(mNoNotificationsTitle)); + pw.println(" mCloseView: " + viewInfo(mCloseView)); + pw.println(" mTickerView: " + viewInfo(mTickerView)); + pw.println(" mScrollView: " + viewInfo(mScrollView) + + " scroll " + mScrollView.getScrollX() + "," + mScrollView.getScrollY()); + pw.println("mNotificationLinearLayout: " + viewInfo(mNotificationLinearLayout)); + } + + if (true) { + // must happen on ui thread + mHandler.post(new Runnable() { + public void run() { + Slog.d(TAG, "mStatusIcons:"); + mStatusIcons.debug(); + } + }); + } + + } + + void onBarViewAttached() { + WindowManager.LayoutParams lp; + int pixelFormat; + Drawable bg; + + /// ---------- Tracking View -------------- + pixelFormat = PixelFormat.RGBX_8888; + bg = mTrackingView.getBackground(); + if (bg != null) { + pixelFormat = bg.getOpacity(); + } + + lp = new WindowManager.LayoutParams( + ViewGroup.LayoutParams.MATCH_PARENT, + ViewGroup.LayoutParams.MATCH_PARENT, + WindowManager.LayoutParams.TYPE_STATUS_BAR_PANEL, + WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN + | WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS + | WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM, + pixelFormat); +// lp.token = mStatusBarView.getWindowToken(); + lp.gravity = Gravity.TOP | Gravity.FILL_HORIZONTAL; + lp.setTitle("TrackingView"); + lp.y = mTrackingPosition; + mTrackingParams = lp; + + WindowManagerImpl.getDefault().addView(mTrackingView, lp); + } + + void onTrackingViewAttached() { + WindowManager.LayoutParams lp; + int pixelFormat; + Drawable bg; + + /// ---------- Expanded View -------------- + pixelFormat = PixelFormat.TRANSLUCENT; + + final int disph = mDisplay.getHeight(); + lp = mExpandedDialog.getWindow().getAttributes(); + lp.width = ViewGroup.LayoutParams.MATCH_PARENT; + lp.height = getExpandedHeight(); + lp.x = 0; + mTrackingPosition = lp.y = -disph; // sufficiently large negative + lp.type = WindowManager.LayoutParams.TYPE_STATUS_BAR_PANEL; + lp.flags = WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN + | WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS + | WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL + | WindowManager.LayoutParams.FLAG_DITHER + | WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE; + lp.format = pixelFormat; + lp.gravity = Gravity.TOP | Gravity.FILL_HORIZONTAL; + lp.setTitle("StatusBarExpanded"); + mExpandedDialog.getWindow().setAttributes(lp); + mExpandedDialog.getWindow().setFormat(pixelFormat); + mExpandedParams = lp; + + mExpandedDialog.getWindow().requestFeature(Window.FEATURE_NO_TITLE); + mExpandedDialog.setContentView(mExpandedView, + new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, + ViewGroup.LayoutParams.MATCH_PARENT)); + mExpandedDialog.getWindow().setBackgroundDrawable(null); + mExpandedDialog.show(); + FrameLayout hack = (FrameLayout)mExpandedView.getParent(); + } + + void setDateViewVisibility(boolean visible, int anim) { + mDateView.setUpdates(visible); + mDateView.setVisibility(visible ? View.VISIBLE : View.INVISIBLE); + mDateView.startAnimation(loadAnim(anim, null)); + } + + void setNotificationIconVisibility(boolean visible, int anim) { + int old = mNotificationIcons.getVisibility(); + int v = visible ? View.VISIBLE : View.INVISIBLE; + if (old != v) { + mNotificationIcons.setVisibility(v); + mNotificationIcons.startAnimation(loadAnim(anim, null)); + } + } + + void updateExpandedViewPos(int expandedPosition) { + if (SPEW) { + Slog.d(TAG, "updateExpandedViewPos before expandedPosition=" + expandedPosition + + " mTrackingParams.y=" + + ((mTrackingParams == null) ? "???" : mTrackingParams.y) + + " mTrackingPosition=" + mTrackingPosition); + } + + int h = mStatusBarView.getHeight(); + int disph = mDisplay.getHeight(); + + // If the expanded view is not visible, make sure they're still off screen. + // Maybe the view was resized. + if (!mExpandedVisible) { + if (mTrackingView != null) { + mTrackingPosition = -disph; + if (mTrackingParams != null) { + mTrackingParams.y = mTrackingPosition; + WindowManagerImpl.getDefault().updateViewLayout(mTrackingView, mTrackingParams); + } + } + if (mExpandedParams != null) { + mExpandedParams.y = -disph; + mExpandedDialog.getWindow().setAttributes(mExpandedParams); + } + return; + } + + // tracking view... + int pos; + if (expandedPosition == EXPANDED_FULL_OPEN) { + pos = h; + } + else if (expandedPosition == EXPANDED_LEAVE_ALONE) { + pos = mTrackingPosition; + } + else { + if (expandedPosition <= disph) { + pos = expandedPosition; + } else { + pos = disph; + } + pos -= disph-h; + } + mTrackingPosition = mTrackingParams.y = pos; + mTrackingParams.height = disph-h; + WindowManagerImpl.getDefault().updateViewLayout(mTrackingView, mTrackingParams); + + if (mExpandedParams != null) { + mCloseView.getLocationInWindow(mPositionTmp); + final int closePos = mPositionTmp[1]; + + mExpandedContents.getLocationInWindow(mPositionTmp); + final int contentsBottom = mPositionTmp[1] + mExpandedContents.getHeight(); + + if (expandedPosition != EXPANDED_LEAVE_ALONE) { + mExpandedParams.y = pos + mTrackingView.getHeight() + - (mTrackingParams.height-closePos) - contentsBottom; + int max = h; + if (mExpandedParams.y > max) { + mExpandedParams.y = max; + } + int min = mTrackingPosition; + if (mExpandedParams.y < min) { + mExpandedParams.y = min; + } + + boolean visible = (mTrackingPosition + mTrackingView.getHeight()) > h; + if (!visible) { + // if the contents aren't visible, move the expanded view way off screen + // because the window itself extends below the content view. + mExpandedParams.y = -disph; + } + mExpandedDialog.getWindow().setAttributes(mExpandedParams); + + if (SPEW) Slog.d(TAG, "updateExpandedViewPos visibilityChanged(" + visible + ")"); + visibilityChanged(visible); + } + } + + if (SPEW) { + Slog.d(TAG, "updateExpandedViewPos after expandedPosition=" + expandedPosition + + " mTrackingParams.y=" + mTrackingParams.y + + " mTrackingPosition=" + mTrackingPosition + + " mExpandedParams.y=" + mExpandedParams.y + + " mExpandedParams.height=" + mExpandedParams.height); + } + } + + int getExpandedHeight() { + return mDisplay.getHeight() - mStatusBarView.getHeight() - mCloseView.getHeight(); + } + + void updateExpandedHeight() { + if (mExpandedView != null) { + mExpandedParams.height = getExpandedHeight(); + mExpandedDialog.getWindow().setAttributes(mExpandedParams); + } + } + + /** + * The LEDs are turned o)ff when the notification panel is shown, even just a little bit. + * This was added last-minute and is inconsistent with the way the rest of the notifications + * are handled, because the notification isn't really cancelled. The lights are just + * turned off. If any other notifications happen, the lights will turn back on. Steve says + * this is what he wants. (see bug 1131461) + */ + void visibilityChanged(boolean visible) { + if (mPanelSlightlyVisible != visible) { + mPanelSlightlyVisible = visible; + try { + mBarService.onPanelRevealed(); + } catch (RemoteException ex) { + // Won't fail unless the world has ended. + } + } + } + + void performDisableActions(int net) { + int old = mDisabled; + int diff = net ^ old; + mDisabled = net; + + // act accordingly + if ((diff & StatusBarManager.DISABLE_EXPAND) != 0) { + if ((net & StatusBarManager.DISABLE_EXPAND) != 0) { + Slog.d(TAG, "DISABLE_EXPAND: yes"); + animateCollapse(); + } + } + if ((diff & StatusBarManager.DISABLE_NOTIFICATION_ICONS) != 0) { + if ((net & StatusBarManager.DISABLE_NOTIFICATION_ICONS) != 0) { + Slog.d(TAG, "DISABLE_NOTIFICATION_ICONS: yes"); + if (mTicking) { + mNotificationIcons.setVisibility(View.INVISIBLE); + mTicker.halt(); + } else { + setNotificationIconVisibility(false, com.android.internal.R.anim.fade_out); + } + } else { + Slog.d(TAG, "DISABLE_NOTIFICATION_ICONS: no"); + if (!mExpandedVisible) { + setNotificationIconVisibility(true, com.android.internal.R.anim.fade_in); + } + } + } else if ((diff & StatusBarManager.DISABLE_NOTIFICATION_TICKER) != 0) { + Slog.d(TAG, "DISABLE_NOTIFICATION_TICKER: " + + (((net & StatusBarManager.DISABLE_NOTIFICATION_TICKER) != 0) + ? "yes" : "no")); + if (mTicking && (net & StatusBarManager.DISABLE_NOTIFICATION_TICKER) != 0) { + mTicker.halt(); + } + } + } + + private View.OnClickListener mClearButtonListener = new View.OnClickListener() { + public void onClick(View v) { + try { + mBarService.onClearAllNotifications(); + } catch (RemoteException ex) { + // system process is dead if we're here. + } + animateCollapse(); + } + }; + + private BroadcastReceiver mBroadcastReceiver = new BroadcastReceiver() { + public void onReceive(Context context, Intent intent) { + String action = intent.getAction(); + if (Intent.ACTION_CLOSE_SYSTEM_DIALOGS.equals(action) + || Intent.ACTION_SCREEN_OFF.equals(action)) { + animateCollapse(); + } + else if (Intent.ACTION_CONFIGURATION_CHANGED.equals(action)) { + updateResources(); + } + } + }; + + /** + * Reload some of our resources when the configuration changes. + * + * We don't reload everything when the configuration changes -- we probably + * should, but getting that smooth is tough. Someday we'll fix that. In the + * meantime, just update the things that we know change. + */ + void updateResources() { + Resources res = getResources(); + + mClearButton.setText(getText(R.string.status_bar_clear_all_button)); + mOngoingTitle.setText(getText(R.string.status_bar_ongoing_events_title)); + mLatestTitle.setText(getText(R.string.status_bar_latest_events_title)); + mNoNotificationsTitle.setText(getText(R.string.status_bar_no_notifications_title)); + + mEdgeBorder = res.getDimensionPixelSize(R.dimen.status_bar_edge_ignore); + + if (false) Slog.v(TAG, "updateResources"); + } + + // + // tracing + // + + void postStartTracing() { + mHandler.postDelayed(mStartTracing, 3000); + } + + void vibrate() { + android.os.Vibrator vib = (android.os.Vibrator)getSystemService(Context.VIBRATOR_SERVICE); + vib.vibrate(250); + } + + Runnable mStartTracing = new Runnable() { + public void run() { + vibrate(); + SystemClock.sleep(250); + Slog.d(TAG, "startTracing"); + android.os.Debug.startMethodTracing("/data/statusbar-traces/trace"); + mHandler.postDelayed(mStopTracing, 10000); + } + }; + + Runnable mStopTracing = new Runnable() { + public void run() { + android.os.Debug.stopMethodTracing(); + Slog.d(TAG, "stopTracing"); + vibrate(); + } + }; +} diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/StatusBarView.java b/packages/SystemUI/src/com/android/systemui/statusbar/StatusBarView.java index 20fc41fb162b2..117b126409a3e 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/StatusBarView.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/StatusBarView.java @@ -19,7 +19,6 @@ package com.android.systemui.statusbar; import android.content.Context; import android.content.res.Configuration; import android.graphics.Canvas; -import android.graphics.Rect; import android.os.SystemClock; import android.util.AttributeSet; import android.view.MotionEvent; @@ -35,7 +34,7 @@ public class StatusBarView extends FrameLayout { static final int DIM_ANIM_TIME = 400; - PhoneStatusBarService mService; + StatusBarService mService; boolean mTracking; int mStartX, mStartY; ViewGroup mNotificationIcons; @@ -43,13 +42,6 @@ public class StatusBarView extends FrameLayout { View mDate; FixedSizeDrawable mBackground; - boolean mNightMode = false; - int mStartAlpha = 0, mEndAlpha = 0; - long mEndTime = 0; - - Rect mButtonBounds = new Rect(); - boolean mCapturingEvents = true; - public StatusBarView(Context context, AttributeSet attrs) { super(context, attrs); } @@ -72,33 +64,10 @@ public class StatusBarView extends FrameLayout { mService.onBarViewAttached(); } - @Override - protected void onConfigurationChanged(Configuration newConfig) { - super.onConfigurationChanged(newConfig); - boolean nightMode = (newConfig.uiMode & Configuration.UI_MODE_NIGHT_MASK) - == Configuration.UI_MODE_NIGHT_YES; - if (mNightMode != nightMode) { - mNightMode = nightMode; - mStartAlpha = getCurAlpha(); - mEndAlpha = mNightMode ? 0x80 : 0x00; - mEndTime = SystemClock.uptimeMillis() + DIM_ANIM_TIME; - invalidate(); - } - } - - int getCurAlpha() { - long time = SystemClock.uptimeMillis(); - if (time > mEndTime) { - return mEndAlpha; - } - return mEndAlpha - - (int)(((mEndAlpha-mStartAlpha) * (mEndTime-time) / DIM_ANIM_TIME)); - } - @Override protected void onSizeChanged(int w, int h, int oldw, int oldh) { super.onSizeChanged(w, h, oldw, oldh); - mService.updateExpandedViewPos(PhoneStatusBarService.EXPANDED_LEAVE_ALONE); + mService.updateExpandedViewPos(StatusBarService.EXPANDED_LEAVE_ALONE); } @Override @@ -131,18 +100,6 @@ public class StatusBarView extends FrameLayout { mBackground.setFixedBounds(-mDate.getLeft(), -mDate.getTop(), (r-l), (b-t)); } - @Override - protected void dispatchDraw(Canvas canvas) { - super.dispatchDraw(canvas); - int alpha = getCurAlpha(); - if (alpha != 0) { - canvas.drawARGB(alpha, 0, 0, 0); - } - if (alpha != mEndAlpha) { - invalidate(); - } - } - /** * Gets the left position of v in this view. Throws if v is not * a child of this. @@ -181,9 +138,6 @@ public class StatusBarView extends FrameLayout { */ @Override public boolean onTouchEvent(MotionEvent event) { - if (!mCapturingEvents) { - return false; - } if (event.getAction() != MotionEvent.ACTION_DOWN) { mService.interceptTouchEvent(event); } @@ -192,13 +146,6 @@ public class StatusBarView extends FrameLayout { @Override public boolean onInterceptTouchEvent(MotionEvent event) { - if (event.getAction() == MotionEvent.ACTION_DOWN) { - if (mButtonBounds.contains((int)event.getX(), (int)event.getY())) { - mCapturingEvents = false; - return false; - } - } - mCapturingEvents = true; return mService.interceptTouchEvent(event) ? true : super.onInterceptTouchEvent(event); } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/Ticker.java b/packages/SystemUI/src/com/android/systemui/statusbar/Ticker.java index e7b050973d750..3a697a6d2ce97 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/Ticker.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/Ticker.java @@ -141,7 +141,7 @@ public abstract class Ticker { } }; - public Ticker(Context context, View sb) { + Ticker(Context context, StatusBarView sb) { mContext = context; mTickerView = sb.findViewById(R.id.ticker); @@ -163,7 +163,7 @@ public abstract class Ticker { } - public void addEntry(StatusBarNotification n) { + void addEntry(StatusBarNotification n) { int initialCount = mSegments.size(); // If what's being displayed has the same text and icon, just drop it @@ -212,7 +212,7 @@ public abstract class Ticker { } } - public void removeEntry(StatusBarNotification n) { + void removeEntry(StatusBarNotification n) { for (int i=mSegments.size()-1; i>=0; i--) { Segment seg = mSegments.get(i); if (n.id == seg.notification.id && n.pkg.equals(seg.notification.pkg)) { @@ -221,13 +221,13 @@ public abstract class Ticker { } } - public void halt() { + void halt() { mHandler.removeCallbacks(mAdvanceTicker); mSegments.clear(); tickerHalting(); } - public void reflowText() { + void reflowText() { if (mSegments.size() > 0) { Segment seg = mSegments.get(0); CharSequence text = seg.getText(); @@ -266,8 +266,8 @@ public abstract class Ticker { mHandler.postDelayed(mAdvanceTicker, TICKER_SEGMENT_DELAY); } - public abstract void tickerStarting(); - public abstract void tickerDone(); - public abstract void tickerHalting(); + abstract void tickerStarting(); + abstract void tickerDone(); + abstract void tickerHalting(); } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/TickerView.java b/packages/SystemUI/src/com/android/systemui/statusbar/TickerView.java index 814081198d8bd..9749ae4427410 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/TickerView.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/TickerView.java @@ -34,9 +34,5 @@ public class TickerView extends TextSwitcher super.onSizeChanged(w, h, oldw, oldh); mTicker.reflowText(); } - - public void setTicker(Ticker t) { - mTicker = t; - } } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/TrackingView.java b/packages/SystemUI/src/com/android/systemui/statusbar/TrackingView.java index c59eb6a29d50f..9108eee1814e8 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/TrackingView.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/TrackingView.java @@ -26,7 +26,7 @@ import android.widget.LinearLayout; public class TrackingView extends LinearLayout { final Display mDisplay; - PhoneStatusBarService mService; + StatusBarService mService; boolean mTracking; int mStartX, mStartY; From 2c53234c16fcd83500921d31c861aa189b25ff50 Mon Sep 17 00:00:00 2001 From: android-build SharedAccount Date: Sun, 24 Oct 2010 19:03:10 -0700 Subject: [PATCH 18/90] Re-Merge packages/SystemUI. Earlier merge seems incorrect. Change-Id: I0c5a6d01a572b515ec602b60df68d72ef6164477 --- packages/SystemUI/Android.mk | 7 +- packages/SystemUI/AndroidManifest.xml | 21 +- .../res/anim/notification_dnd_off.xml | 23 + .../SystemUI/res/anim/notification_dnd_on.xml | 23 + .../res/drawable-hdpi/battery_low_battery.png | Bin 4264 -> 4060 bytes .../res/drawable-hdpi/stat_notify_alarm.png | Bin 1692 -> 1793 bytes .../drawable-hdpi/stat_sys_data_bluetooth.png | Bin 1406 -> 1246 bytes .../stat_sys_data_bluetooth_connected.png | Bin 1544 -> 1405 bytes .../stat_sys_data_connected_1x.png | Bin 1699 -> 4181 bytes .../stat_sys_data_connected_3g.png | Bin 1732 -> 4228 bytes .../stat_sys_data_connected_e.png | Bin 1581 -> 3897 bytes .../stat_sys_data_connected_g.png | Bin 1599 -> 3866 bytes .../stat_sys_data_connected_h.png | Bin 1557 -> 843 bytes .../stat_sys_data_fully_connected_1x.png | Bin 1680 -> 4186 bytes .../stat_sys_data_fully_connected_3g.png | Bin 1711 -> 4240 bytes .../stat_sys_data_fully_connected_e.png | Bin 1579 -> 3917 bytes .../stat_sys_data_fully_connected_g.png | Bin 1567 -> 3891 bytes .../stat_sys_data_fully_connected_h.png | Bin 1552 -> 880 bytes .../stat_sys_data_fully_in_1x.png | Bin 1864 -> 4373 bytes .../stat_sys_data_fully_in_3g.png | Bin 1845 -> 4458 bytes .../stat_sys_data_fully_in_e.png | Bin 1739 -> 1822 bytes .../stat_sys_data_fully_in_g.png | Bin 1729 -> 4067 bytes .../stat_sys_data_fully_in_h.png | Bin 1732 -> 1059 bytes .../stat_sys_data_fully_inandout_1x.png | Bin 1931 -> 4425 bytes .../stat_sys_data_fully_inandout_3g.png | Bin 1910 -> 4534 bytes .../stat_sys_data_fully_inandout_e.png | Bin 1822 -> 4132 bytes .../stat_sys_data_fully_inandout_g.png | Bin 1811 -> 4115 bytes .../stat_sys_data_fully_inandout_h.png | Bin 1806 -> 1141 bytes .../stat_sys_data_fully_out_1x.png | Bin 1877 -> 4340 bytes .../stat_sys_data_fully_out_3g.png | Bin 1893 -> 4454 bytes .../stat_sys_data_fully_out_e.png | Bin 1778 -> 4075 bytes .../stat_sys_data_fully_out_g.png | Bin 1769 -> 4066 bytes .../stat_sys_data_fully_out_h.png | Bin 1752 -> 1120 bytes .../res/drawable-hdpi/stat_sys_data_in_1x.png | Bin 1804 -> 4352 bytes .../res/drawable-hdpi/stat_sys_data_in_3g.png | Bin 1861 -> 4423 bytes .../res/drawable-hdpi/stat_sys_data_in_e.png | Bin 1752 -> 4078 bytes .../res/drawable-hdpi/stat_sys_data_in_g.png | Bin 1760 -> 4049 bytes .../res/drawable-hdpi/stat_sys_data_in_h.png | Bin 1742 -> 1017 bytes .../stat_sys_data_inandout_1x.png | Bin 1901 -> 4418 bytes .../stat_sys_data_inandout_3g.png | Bin 1911 -> 4515 bytes .../stat_sys_data_inandout_e.png | Bin 1863 -> 4130 bytes .../stat_sys_data_inandout_g.png | Bin 1874 -> 4104 bytes .../stat_sys_data_inandout_h.png | Bin 1858 -> 1106 bytes .../drawable-hdpi/stat_sys_data_out_1x.png | Bin 1786 -> 4350 bytes .../drawable-hdpi/stat_sys_data_out_3g.png | Bin 1891 -> 4429 bytes .../res/drawable-hdpi/stat_sys_data_out_e.png | Bin 1772 -> 4053 bytes .../res/drawable-hdpi/stat_sys_data_out_g.png | Bin 1781 -> 4033 bytes .../res/drawable-hdpi/stat_sys_data_out_h.png | Bin 1758 -> 1078 bytes .../drawable-hdpi/stat_sys_gps_acquiring.png | Bin 500 -> 884 bytes .../res/drawable-hdpi/stat_sys_r_signal_0.png | Bin 1276 -> 1223 bytes .../stat_sys_r_signal_0_fully.png | Bin 1276 -> 1223 bytes .../res/drawable-hdpi/stat_sys_r_signal_1.png | Bin 1657 -> 1239 bytes .../stat_sys_r_signal_1_fully.png | Bin 1730 -> 1239 bytes .../res/drawable-hdpi/stat_sys_r_signal_2.png | Bin 1890 -> 1231 bytes .../stat_sys_r_signal_2_fully.png | Bin 1930 -> 1231 bytes .../res/drawable-hdpi/stat_sys_r_signal_3.png | Bin 2013 -> 1206 bytes .../stat_sys_r_signal_3_fully.png | Bin 2038 -> 1206 bytes .../res/drawable-hdpi/stat_sys_r_signal_4.png | Bin 2089 -> 1151 bytes .../stat_sys_r_signal_4_fully.png | Bin 2069 -> 1151 bytes .../drawable-hdpi/stat_sys_ringer_silent.png | Bin 1378 -> 1300 bytes .../drawable-hdpi/stat_sys_ringer_vibrate.png | Bin 1936 -> 4980 bytes .../stat_sys_signal_flightmode.png | Bin 1081 -> 1492 bytes .../drawable-hdpi/stat_sys_signal_null.png | Bin 489 -> 1304 bytes .../drawable-mdpi/ic_sysbar_noti_avail.png | Bin 0 -> 247 bytes .../ic_sysbar_noti_avail_open.png | Bin 0 -> 503 bytes .../res/drawable-mdpi/ic_sysbar_noti_dnd.png | Bin 0 -> 393 bytes .../res/drawable-mdpi/ic_sysbar_noti_none.png | Bin 0 -> 185 bytes .../ic_sysbar_noti_none_open.png | Bin 0 -> 393 bytes .../res/drawable-mdpi/ic_sysbar_pocket.png | Bin 0 -> 509 bytes .../drawable-mdpi/ic_sysbar_pocket_drag.png | Bin 0 -> 627 bytes .../drawable-mdpi/ic_sysbar_pocket_hidden.png | Bin 0 -> 696 bytes .../ic_sysbar_pocket_holding.png | Bin 0 -> 606 bytes .../drawable-mdpi/stat_sys_gps_acquiring.png | Bin 890 -> 595 bytes .../drawable-mdpi/status_bar_back_default.png | Bin 398 -> 48936 bytes .../drawable-mdpi/status_bar_back_pressed.png | Bin 3215 -> 49157 bytes .../drawable-mdpi/status_bar_home_default.png | Bin 376 -> 646 bytes .../drawable-mdpi/status_bar_home_pressed.png | Bin 3373 -> 646 bytes .../status_bar_recent_default.png | Bin 350 -> 331 bytes .../status_bar_recent_pressed.png | Bin 3060 -> 331 bytes .../SystemUI/res/layout-xlarge/status_bar.xml | 136 +- .../res/layout-xlarge/status_bar_center.xml | 1 - .../res/layout-xlarge/sysbar_panel_pocket.xml | 61 + packages/SystemUI/res/layout/status_bar.xml | 7 +- .../res/layout/status_bar_expanded.xml | 13 +- .../res/layout/status_bar_latest_event.xml | 4 +- .../res/layout/status_bar_tracking.xml | 13 +- .../SystemUI/res/values-xlarge/config.xml | 5 + packages/SystemUI/res/values/colors.xml | 2 - packages/SystemUI/res/values/config.xml | 15 +- packages/SystemUI/res/values/strings.xml | 28 + packages/SystemUI/res/values/styles.xml | 16 +- .../src/com/android/systemui/SystemUI.java | 31 + .../com/android/systemui/SystemUIService.java | 105 ++ .../systemui/statusbar/CloseDragHandle.java | 2 +- .../systemui/statusbar/CommandQueue.java | 29 +- .../systemui/statusbar/ExpandedView.java | 4 +- .../systemui/statusbar/LatestItemView.java | 12 +- .../systemui/statusbar/NotificationData.java | 81 +- .../statusbar/PhoneStatusBarService.java | 59 +- .../systemui/statusbar/StatusBarPolicy.java | 39 +- .../systemui/statusbar/StatusBarService.java | 1462 +---------------- .../systemui/statusbar/StatusBarView.java | 57 +- .../android/systemui/statusbar/Ticker.java | 16 +- .../systemui/statusbar/TickerView.java | 4 + .../systemui/statusbar/TrackingView.java | 2 +- .../tablet/NotificationIconArea.java | 2 - .../statusbar/tablet/ShirtPocket.java | 248 +++ .../tablet/TabletStatusBarService.java | 183 ++- 108 files changed, 1017 insertions(+), 1694 deletions(-) create mode 100644 packages/SystemUI/res/anim/notification_dnd_off.xml create mode 100644 packages/SystemUI/res/anim/notification_dnd_on.xml mode change 100644 => 100755 packages/SystemUI/res/drawable-hdpi/stat_sys_data_fully_connected_1x.png mode change 100644 => 100755 packages/SystemUI/res/drawable-hdpi/stat_sys_data_fully_connected_3g.png mode change 100644 => 100755 packages/SystemUI/res/drawable-hdpi/stat_sys_data_fully_connected_e.png mode change 100644 => 100755 packages/SystemUI/res/drawable-hdpi/stat_sys_data_fully_connected_g.png mode change 100644 => 100755 packages/SystemUI/res/drawable-hdpi/stat_sys_data_fully_connected_h.png mode change 100644 => 100755 packages/SystemUI/res/drawable-hdpi/stat_sys_data_fully_in_1x.png mode change 100644 => 100755 packages/SystemUI/res/drawable-hdpi/stat_sys_data_fully_in_3g.png mode change 100644 => 100755 packages/SystemUI/res/drawable-hdpi/stat_sys_data_fully_in_g.png mode change 100644 => 100755 packages/SystemUI/res/drawable-hdpi/stat_sys_data_fully_in_h.png mode change 100644 => 100755 packages/SystemUI/res/drawable-hdpi/stat_sys_data_fully_inandout_1x.png mode change 100644 => 100755 packages/SystemUI/res/drawable-hdpi/stat_sys_data_fully_inandout_3g.png mode change 100644 => 100755 packages/SystemUI/res/drawable-hdpi/stat_sys_data_fully_inandout_e.png mode change 100644 => 100755 packages/SystemUI/res/drawable-hdpi/stat_sys_data_fully_inandout_g.png mode change 100644 => 100755 packages/SystemUI/res/drawable-hdpi/stat_sys_data_fully_inandout_h.png mode change 100644 => 100755 packages/SystemUI/res/drawable-hdpi/stat_sys_data_fully_out_1x.png mode change 100644 => 100755 packages/SystemUI/res/drawable-hdpi/stat_sys_data_fully_out_3g.png mode change 100644 => 100755 packages/SystemUI/res/drawable-hdpi/stat_sys_data_fully_out_e.png mode change 100644 => 100755 packages/SystemUI/res/drawable-hdpi/stat_sys_data_fully_out_g.png mode change 100644 => 100755 packages/SystemUI/res/drawable-hdpi/stat_sys_data_fully_out_h.png create mode 100644 packages/SystemUI/res/drawable-mdpi/ic_sysbar_noti_avail.png create mode 100644 packages/SystemUI/res/drawable-mdpi/ic_sysbar_noti_avail_open.png create mode 100644 packages/SystemUI/res/drawable-mdpi/ic_sysbar_noti_dnd.png create mode 100644 packages/SystemUI/res/drawable-mdpi/ic_sysbar_noti_none.png create mode 100644 packages/SystemUI/res/drawable-mdpi/ic_sysbar_noti_none_open.png create mode 100644 packages/SystemUI/res/drawable-mdpi/ic_sysbar_pocket.png create mode 100644 packages/SystemUI/res/drawable-mdpi/ic_sysbar_pocket_drag.png create mode 100644 packages/SystemUI/res/drawable-mdpi/ic_sysbar_pocket_hidden.png create mode 100644 packages/SystemUI/res/drawable-mdpi/ic_sysbar_pocket_holding.png create mode 100644 packages/SystemUI/res/layout-xlarge/sysbar_panel_pocket.xml create mode 100644 packages/SystemUI/src/com/android/systemui/SystemUI.java create mode 100644 packages/SystemUI/src/com/android/systemui/SystemUIService.java create mode 100644 packages/SystemUI/src/com/android/systemui/statusbar/tablet/ShirtPocket.java diff --git a/packages/SystemUI/Android.mk b/packages/SystemUI/Android.mk index 4c83768d9ceea..2c130693d00bb 100644 --- a/packages/SystemUI/Android.mk +++ b/packages/SystemUI/Android.mk @@ -3,11 +3,16 @@ include $(CLEAR_VARS) LOCAL_MODULE_TAGS := optional -LOCAL_SRC_FILES := $(call all-subdir-java-files) +LOCAL_SRC_FILES := $(call all-subdir-java-files) \ + ../../../ex/carousel/java/com/android/ex/carousel/carousel.rs LOCAL_JAVA_LIBRARIES := services +LOCAL_STATIC_JAVA_LIBRARIES := android-common-carousel + LOCAL_PACKAGE_NAME := SystemUI LOCAL_CERTIFICATE := platform +LOCAL_PROGUARD_FLAG_FILES := proguard.flags + include $(BUILD_PACKAGE) diff --git a/packages/SystemUI/AndroidManifest.xml b/packages/SystemUI/AndroidManifest.xml index 7995869a31a2b..d824f3051e0e8 100644 --- a/packages/SystemUI/AndroidManifest.xml +++ b/packages/SystemUI/AndroidManifest.xml @@ -5,16 +5,22 @@ > + + + - - + + + + diff --git a/packages/SystemUI/res/anim/notification_dnd_off.xml b/packages/SystemUI/res/anim/notification_dnd_off.xml new file mode 100644 index 0000000000000..4e88855f25890 --- /dev/null +++ b/packages/SystemUI/res/anim/notification_dnd_off.xml @@ -0,0 +1,23 @@ + + + + + + diff --git a/packages/SystemUI/res/anim/notification_dnd_on.xml b/packages/SystemUI/res/anim/notification_dnd_on.xml new file mode 100644 index 0000000000000..309943b9e9730 --- /dev/null +++ b/packages/SystemUI/res/anim/notification_dnd_on.xml @@ -0,0 +1,23 @@ + + + + + + diff --git a/packages/SystemUI/res/drawable-hdpi/battery_low_battery.png b/packages/SystemUI/res/drawable-hdpi/battery_low_battery.png index 2c7a0d4e2b70af7fb2fd6dc1c2fc30ffbde13cbe..e74c22fe1499769b88519e45238b3ade5f3adcb6 100644 GIT binary patch literal 4060 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 Hc@_RIqPPr$ literal 4264 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 literal 1406 zcmbVMeM}Q)7(bOEBeIb#Y|~7=9k4-Wdmp`C+gq!&y;e$Az|sJsEF9MtdP48Y-2tUR zBe)MF)8K~Ll+ArHwnamTi!j3!a4|XzZn!Xp4$&ELi(?~@MP0JFD^RvSh=1&oyZ3$G z_j!K5=kxaFW^Yc2UlR{OP=YIy@u=%6^?f!jR{c)f!aeG;T5%LAd19GT%Sr&U`ovNI zy8>)E@Br3VSM@b8L(qyc-dm^?x?iL@F`#85I@(Yms9Hmic~dCJauq;Nkz|UufC6E`+_HyA0&g4TjZG_DsS_KFIg@r?bNj)ad;DrZK z*(6^X?O~h?T&iS2{E8B!QM9(UR$Hsnic&d>n@pw%20>_44UJqUC~Qb0$jMOz2FRSm z2Nhlv;0PjHDpo5NMD=t&gh0^kUIZ58g+!?-Lqlv3#kCk32t?wV)0Pzv_}7gkwPkNz z5TG6)i`5dR)}t&rYOLn&!9)>7)f+lT;?<(Cm5j($2Y{fs7z?7_Xnnko#*7$g&@ncG zATY{^<0gYuZ#0kwhr>bWC_5R&SjyH!IgJeCByC30isOvaM3D}oLr*$&m{I4nI-|BO zK~`9S15sXH<<;Bt2Apu(A81S4CBQ18SHXQ=878flLI zG)weI?ZC)(vGrA9ad?2BPK>0EhWqpGUI<#&>0+$j(B)sf7XoK8632^Qk7?SoEpui1 zGCGqkEZCj!bYjyB&(%+UGX98XdF!>uE?MiZ-IuQ(^Id32ZQL%g?FXk0)y+=!OuF9a z+RSvVy!r55T?y5eYMc@Jcbq6acVo*~h9U3rR84+MQpRmtdGGk~udct}@!e-%_V`hd zWnGSn#?E~o4Ez1&Q|33JKUWOiOHE6fxT9Zp`0cn9s%@zB)JuIwzPWYJM^w$OO8GYZ zTvf_x4jVD8K7)B}aa*--C10%Dd2;)%1M-QYVpvKzz+Kv-`H6489`t7%%u0>z$CBb7 zs-fRaYkD%q%Fsvps$v?qOjgIuG@gI&`);J*)uQ8Tes0Z51#5o{ne&6#*_#l4*pqza zQ7FBnC2jxAPS-wf+77toTL&rY8 zI8>%P{f@nNyn}BW7|0oJpBUcw_!z}E7j1ZAXkEkE8{O;2N-!*IwA#|#+&YBR&}*lD z_|Q|~>WV)k_goq2_@n1HdwBNz$uaATh6f^lM3*C*>9mzJ{sYFd`ttw) diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_data_bluetooth_connected.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_data_bluetooth_connected.png index 18c77df2d2a87a4c6a0977844ca8cc686cfd01c1..1e4bbf52c4f51886c2cf685ed23e72ce9bf6031c 100644 GIT binary patch delta 1385 zcmV-v1(y1V4E+iriBL{Q4GJ0x0000DNk~Le0000c0000c2nGNE0H{6bu8|=pe+3^& zL_t(|+RRv6C}n#X|CmjKLbNHO$mLBgDaI`l$%~MtLz4$nB21Lagk0iqM2B*XM9n;z z7Y~ziDP@|M;YFidLO3qlog$avtl$5%{;j?CUfaGfov;4wwbuXpf8TF^_qD7ZA0O%e zNGeMO6ciL#biSvj=VgFRPEMMAf7aUCT5-=x>dM5#L|ctU^XK*Tb*6CZ{hPeDWoKtM z=H}*BH8nMLtJh+}Klsbt-MvI$B71v#diCnniz52<>la;JU3m+}D7CV(g0c@Bi|RP7&$mNkibX}4-ZDIq@*MY2naBmUtG`uUC;^LiZNzuYpWI(J7fy^fBE@QdU`s| z%*@c|&!0`U9CQjHrB(z6K!`b**c1}uG$A2@Sz&Z^)MRjSW9R@g6_gYhC_X-({SFTg zKOZoFvJ{vI4vEv>-)~YPm<`O)(UE2A{{Frq&&9uQE!Nc3e}odiuH)k3SZ5I9_NiqM*!}&z-UToo9v`e9b_2lpG z&-bLjR#sN1p`n3pZ~v>6(b3UVR8+*QrX(B7Xp80N=WG4bg@pxbX=!0X;7(XBBqT(~ zVz^&gTB7OcY5puCB7%H;d~~b~9Y$H~?(UAS-yU0w9`f9qF%4l>%?+nG#5I*kGbLLcnx>?E~X&G+Z#=BTQwO2-ATB4}`M zkjBQwI6uxp2HKY~I(2~Q^Eb%T(~}K#-rnAv2jJjJIsd0mpJ-@ki1XnL&O(NqL>_~{ zlrlu5!^1zmQ8)QA4dmoHROQbNMG&G!lm3#qiUl$w?^=UDtrl!)nckkHs@$oSOg*GD}@(?ete_y|*=H_PpGPAk4$$-gYcVJ+^ z_(4(W&3t@(oXz!cO;%PGn>jflTx)2CdlDEdX6PjpvlZ&r+S;1p z1UoV^!uq9{p(rWR7&Lq4H}oyz^z@W1L!)&}Obq))@TaAv@eDO}JlAn0-f}FR`4<-# zDKj&Ze+~`~%$D&iz@+s3`*#Kkv%e*OP6rr*S6@pqM(D)E1j|+wQjl18K9FBC6Dm}ZgX zc(D;`W2eyMKj^iXFwB)>OcrWTrVwkMzvCN}KVX=DPEJn71gn=TTFe~6{BOx;D7@-D r`QgqSvNVg8^sAo16))oAe+3u-7m1a%=P0WP00000NkvXXu0mjfpX;Ir literal 1544 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 Ik|gH-1E*?_ZU6uP diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_data_connected_3g.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_data_connected_3g.png index 95866b12e6114233419d7a767a7cb9a6e6082156..d0d13457b112ed2ba93dad957a71cc95d25aa19a 100644 GIT binary patch literal 4228 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 diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_data_connected_e.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_data_connected_e.png index 016b30b079acc6fbbed7da2324bb87cc389f4078..4211b8c2b9338efa7ecb3aa42a22a7d4707287fa 100644 GIT binary patch literal 3897 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 Hu0mjfpGiTr literal 1581 zcmbVMeNfY87>@{oICVEstacbu{DvlJ+NOEiK`(;@)?7_UzuP5d6kKeHmn@b5DVnhx=sfYVyI6-+kgqgWbH+n6jG)VnA< zZK5e#LEbq!5dcPKJIof&Vn`*dj7v-fbi{s_hercIVv^rOS)DWoX3=(sTLtwswLqZ5 zrh-<<42Z#_p>rH5g)F_IaH-i^=(H+rP|`v$(NFLME}El2zbn`6CHyLAh?n5yz%>kk zLn@q81r0l8F&IG&!_uHkj3ihQIReU2F^WlX9FGSj2#Uan1V$wZC{AD!0ztr$1@YEc zTQ*@LbtAU;lM2e=I1d5CKA%tQ!^8}0hf$?c8Q_pe5_pXSZ-JYm{0VNaD9Aw4UMuVH za1O=|1{kRoyT)5p-@N^x2&h`qxv^z%%>GdwADqhczr-u4>cNuz^KIBUr)vQ zntFCOl(kVYY4ukY=y#lHTxF>=eHqu<@$GMdRMFyx7ivn=PbA)X=-&?IRqJZ|GwLo! zr<~1r26fyH;b3a;^vbAEeRqHFjT7N)OOLzgpm|>38_z?I|8(Tyz4fzy>=EwqAq8;@ zQ$8`>`tGbBnO?4|-wZxB)}_5Ct2xiqYK|S&?fu+U3jxI+b{zgXZ*0tVeS>{t1&D-Y zW=EH*;wSZvI^Rn#sdYY5SS`zU3bq{Id;9i*q?z$wgvh?v{~^4XC9hGT-c_OIU2R}Q z*pywgvu41h+cWT2tY-4&)5!Yz%217TjME!8?Tk8fY008$=P#GW9GqB?DX4zLuPbx!i6Spy zq`*-B`?BtmneC#=J26aCYsooiqO9$~xC;$rPF>owdAPnOrlkBH_w?%IljEk=F*Bn- z?)rIuW9h!C%iHzt`D0C`-9h+b2>uoOz{J{0vrQ}!1nZ^GAU|mLp diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_data_connected_g.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_data_connected_g.png index ec672eb118e554d831d3c4785d9670f4831e3d9c..d5ece7a58a74bacd859b59b3a7a00e58439d0f16 100644 GIT binary patch literal 3866 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 literal 1557 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 literal 1680 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 literal 1711 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 BJMaJi literal 1567 zcmeAS@N?(olHy`uVBq!ia0vp^B0#Lh!3HFcSnpm9q$EpRBT9nv(@M${i&7aJQ}UBi z6+Ckj(^G>|6H_V+Po~;1FfgZOhD4M^`1)8S=jZArg4F0$^BXQ!4Z zB&DWj=GiK}-@RW+Av48RDcsc8z_-9TH6zobswg$M$}c3jDm&RSMakYy!KT6rXh3di zNuokUZcbjYRfVk**jy_h8zii+qySb@l5ML5aa4qFfP!;=QL2Keo`G(%fti7VnW3Jc zv5C34xsHO7fuVuEfswwUk*=Y+m9dePfq?=PC;@FNN=dT{a&d#&1?1T(Wt5Z@Sn2DR zmzV368|&p4rRy77T3Uk4Ff!5ws?aU2%qvN((9J7WhMC}!TAW;zSx}OhpQivaF)=B> zw8T~k=u(ImatnNY;RfdwLjwvJWcn3}1^R}12Ku?VAb){X7ncO3BAkI$b#X{#L8^XG zYH@yPQ8F+-(v)GEfnkT=B9KC$Ypnc>GJ%njnB$V4T$-DjSK{ens|1wMOUX>JayE4` zcC&P|FmyIDFtac;v@|rZbTctCb2V}`G%_|bfti6-ucNDxi>tY@vx$q7p`nYLrIERr zo2!9=iIatkIZzCy*E6rUBrz{J6=rWH$XU? zdpPHbvhp`o-&oDg|E~Un#=AAfYH3Dy->#lH>jLNI$&oi^XI7jkEB(59Rk-P7)$Fxa z=bx@Dj*~w0ztLcYF<<-P;}ty(w-;Z0@jH?uvvk8upX|SE0f`dFT(&42y=f=cK2`tC zm55E=$Fl9_mkWLn_!hm#{MZVe(_$G{1g2N%MQ#oAJReiE|9-qywvC+rDJdSd-<9*O z&zpN|iUNm--r85U4nKDG{cJJ&MsD2djg6n(Grpym3gj4WFyZuW(cd4Z^vP5zTXbGm z)0|vcgX*th4^o@?9YO(;BZ+QI!>&hrzWrOWph1luvH7tKF@XwEf}c%$S^uN}fU zJdI{D)*sO?UNDPe=b3Y@+Aka1=RW70t5v+EjXh@N%kvrGM$6TlR+-H4^)eFrzEpBOgH@OyPm&&t07oF3!K6CLxvGn*Y#c}(XZvE7_acq9W+5Jk=hrYg^ b&%n&Ee}YCc$JcXCpd#DT)z4*}Q$iB}i}gx% diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_data_fully_connected_h.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_data_fully_connected_h.png old mode 100644 new mode 100755 index d459ee37dcba099ec8efbca258a2fecf4e17690b..f84ad32aaa52281676a05b5ad3540f98eafdad86 GIT binary patch delta 855 zcmV-d1E~Cv4DbdaiBL{Q4GJ0x0000DNk~Le0000J0000c2nGNE04C?4(vcx3e-cSV zK~#9!>{d%_6hRQ~o}Jk-VPn=9jCc_bq7pZ^5DhH22QT^uB!UQnl3bFL;N$4yXviga z@^Q#N@F0Q_0tN|0NsQ>hgMu-bxY^BPH#0rmWz}rYrZ?{7A$p3v6g5*__0^-RdWQo5 z`&*0eGO*j@O`P75ETn{?qmaPZe~Xqh_TbLxWoDbeNDfjG$<>CW9B4ywU>kA|$wv|z zum;T1KzoszG%zWaH6ZCW81iMLB_qNbF!J2+{zY(9l;Ci};jR?mH8k_t<7e!-kFSD* zge>bW439#eB0u{~&QxLKcNNGHBvK3h9S4kFxCx-f5ayI_d zzlky*3!d!0=-g8nHaQ|aW1Om8Z-NQou{9;pKvwGHt+1aba`s!|)L(#mv`>2GC~b_4 z#==`$hE*~OlSRL)d9{F#^T^W}P1s}Pg!J@$$~drcaSn>)Il3nbf8QaGPkG`psK^PF z^z_`;1*80ZQHF0%u8LFGSC$k^rCRx-9_ZOeSG=km`MjP>_0R7!h)(ow_X=G@%}B*t zuT%LyzP35%t+`yTGn2^-Pft(xj*gB_pw0ry58!s%P%WVRM{Ls?KqFGhG;tL7pnQUW z1_lN`MY@B7gU687e}GvAkQ)I7L6D}1iPJmD=@#~VpGCCk1fa1;5nx(feSLk^2!@7+ zx~MgfTDGd0RXgCYu%o{=EX($;p!JocG&?#vMuZSmVSj)Bo2jWOs^?3}ip5`ZHOr?H zot&KPL8F4spg`~Xq`l2rqizdOO4)3-v%S52cxGm%cWi8IEn;I?cJz6GfGtroqg{Tt he+B&q+xGe;zyNLf$yvtmPbmNZ002ovPDHLkV1kinmFNHf literal 1552 zcmeAS@N?(olHy`uVBq!ia0vp^B0#Lh!3HFcSnpm9q$EpRBT9nv(@M${i&7aJQ}UBi z6+Ckj(^G>|6H_V+Po~;1FfgZOhD4M^`1)8S=jZArg4F0$^BXQ!4Z zB&DWj=GiK}-@RW+Av48RDcsc8z_-9TH6zobswg$M$}c3jDm&RSMakYy!KT6rXh3di zNuokUZcbjYRfVk**jy_h8zii+qySb@l5ML5aa4qFfP!;=QL2Keo`G(%fti7VnW3Jc zv5C34xsHO7fuVuEfswwUk*=Y+m9dePfq?=PC;@FNN=dT{a&d#&1?1T(Wt5Z@Sn2DR zmzV368|&p4rRy77T3Uk4Ff!5ws?aU2%qvN((9J7WhMC}!TAW;zSx}OhpQivaF)=B> zw8T~k=u(ImatnNY;RfdwLjwvJWcn3}1^R}12Ku?VAb){X7ncO3BAkI$b#X{#L8^XG zYH@yPQ8F+-(v)GEfnkT=B9KC$Ypnc>GJ%njnB$V4T$-DjSK{ens|1wMOUX>JayE4` zcC&P|FmyIDFtac;v@|rZbTctCb2V}`G%_|bfti6#ueqV4laZyVi?fM~v!S7jo28Mt znVYMDfr*oai@Ax56HKpXUU5lcUUDkT-b|pqP`%E0^;$U>r6!i-7lq{K=fF}xKt_H^ zesM;Afr4|ese*4}a%LWg4~ia$Z(UN0GRsm^+=}vZ6~N(Zm5IfEQwvKop#KaFETH~2 zax!o>HMcM}c62m#Gc;C$>P;ah%=Ced(FY|Cq{IRf0;WI^6Q1;e9C+qQ%>(9`B4E}~ zUoxqkfq}`v)5S5Q;?|om!~Dwu0^cmlf|>(w>4mDRsFWRHi53+0p1M$Wb(4hglApqB z(oXiUD0@s~F`@ip~-uHZ;M6!91dC{epN58+@SN{F(Ps;^U zirxjqJnu{8{9(^f6?*Jp!4IkF9A8~UT=$DJwtPwuo+0pvdDY|J|0Ec=0`A;C^z_D$ zMY37m+YWl9ZN8}`SJCrL{fo}hl1nDKTc$blyt*gBSd@w=# z^rlmL>&=dSwqb8RwdY&G&!~$wr_yrF--jhPpKCvHbM`044C%$^d=JSy_$|-BVWp6l z8UNO=74ILb7d(y5&gO~xCiGT)NBmjEybFwW!4GHe3uyLbS{`5a-BoB$cDed`xxD({ zso(hL#fBAmG~`}sn5yDvy0xmm%ufDc)seDKqSqSh8MjHSIPGQRxcAxpxszgpGi4(< zJscC$b^pCg+IO<@hs^xtd-fOA8~^kB88f%l|K`0_($Wd)Q zXXK=38n(}qdlMvK zy=#3Kb@izLOYyfeb^Wg`M0j#?PD%aQa>XI^H)q5@(MTq<)AEdL3|kH5bVZ+BECrR( Mp00i_>zopr0FTH&Q~&?~ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_data_fully_in_1x.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_data_fully_in_1x.png old mode 100644 new mode 100755 index 7b64751955e64276907e71ed91197399ebe163bf..d80a8ce1ea85a21116f8dd55845c815bd297fb60 GIT binary patch literal 4373 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 P00000NkvXXu0mjfM@cnU literal 1864 zcmbVNX;2eq7!DSTX8}d=XzjX4bx@Ms+*v>jIe=;~kf2cISdtBiB%8R|kOU79tm1gk zDjvnrLGdWX1MwEALJ<&=qT+#yBUPXriV9jS19qce`@``^cV_qd-tT+g=XuZBb@H&_ z(IX~}pwVcfLqo(7)apUK-wgYl`j-0@7f{PYQW8Zfj2hC45*SUWHYQ*|r~ysHA}~~K zUwRqyr_nys=#)`plx!ZNG8*WpLx*lNm?&!+%|Fm)LRCo^2_#^NIy?aED!u>$I&}cJ zkRyX+CK0C9g`^OeA|*_zN=Z@))L`Ijz~6>Y00xXi0h>XOn-N<8_zoAL_Ksr)2)t7v zlLEl^PDRP&fXGN-0EZ6wsvs@|aA7*kV)J;sSpXA)AqK=`z)WA5hp?Ck1OWpNNU;%W z4H6-i4scOY0H`HN6T)Cvtya2~MK=#`(q#d6U34V zqNfOsL?38bvTxqI9sS#sI=Yf+;$OlpOA;UU*Azt5w{;m(1X)tK)h-{I3C<5SIUpw z{4RVHeC__zC%^ynyrhKJ`j~JTk*s-m<(bAB*uAo5r{96>qW!>RuLqTG93rCS$f z9Js7C7hf6fv>A}JyLLKt&%xyDZn=46M95$9=JZV|TQeuJ$o+)$`tDb?P4)Hl`Oo?r zBI{PZsPL|Xw4Pd5?R4$PDi^_u_36;m^5r=PEc~AJhu2P@UR9jKxZ!1S_n%mu;gWl> z@YGhWkNf(DlK9-R+M+{rRsSrz{V{Dv#^&e@-H;A9{Wg!IY|}0-dE3b;xqfw+SD+g z@F@*ze2R}GHQRA|zEprLCdy-m)*gJpGnKoxWS>aqTeEl)d)xdh*{MmrS)WI<+wcB? znD1hhitQB(cFgFSr+#kz`_D7=bReeW!mR0Rv6-c2J)D+Z!Yo zKkO4(o9CG`txtF^XMqOYo#$p=;&-hvWy3F#dHA!oW-MmH5)K;c%i-NU%qdQ ze`UE}{E9cx0U>~-$?6(9MbkL7V`io|+FMtY9OIKcWas(gISE=e^;a1MdnOb|?6>pe*Kl4bb zXZsDpQdWhwo(gw1WJDgET&D@&;_JPNBk#V^eShq-)5=HdwZTrknti#gFC&%md`n;T zg0XLx>^?rnaR55%{c diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_data_fully_in_3g.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_data_fully_in_3g.png old mode 100644 new mode 100755 index d82930ceadf4a1a3098c9601d011e29fa9325d94..31c976a0d6cc13bd1a4916e1e089004d2e78088b GIT binary patch literal 4458 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 literal 1845 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 Ef{HbwzW@LL diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_data_fully_in_g.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_data_fully_in_g.png old mode 100644 new mode 100755 index e94e1467fe6058ff67ce5eb5a372391fbee16900..a487f2977d9a39fe0825aa719edf6a2dd4356708 GIT binary patch literal 4067 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 VEDM9yGlT#D002ovPDHLkV1f;anUVki literal 1729 zcmbVNX;2eq7|w85K&4gi0_v>61A!!)%^ir4gJ95L3;|K3vPm`&W3nMxNPOE5AC5n|GrQmSe&72%?>+ma zEHQqjUyvVxK$t06DU#!BApS1(nTCHaMl~PBmjzf{Dwc$5Fbix#2z)iFL;#5%&P3!0 zthQx$A<+bar$(zt#ZslKxhhmohTS@3tKNvC354hvs}WY|5DZWvnOXyn__(=^2x!$j z;yQ*Dlp2LdmUd;H2}#OJRH*WFDvp{MvjT{=a&ZDZg28}Qzr|qYT6x3?UM{|OA5)0H zgbJqP5#KnKDwP33)Pw*GGDuQ^Ob}pF$y6Gh#bQMQ5J&|nAVi@;Br1zbgSa3FOg=>1 znn|tU%0=QyTe!p{W?`6-OQBdS7P5s#MopO%Du=^yb3hOY*C3f~1`M{64Cc@&1`%Rb znY2bsiy8noBdkPoFdh;2^i2qQqg48q*kGPa6rM7Q6*f|+WRRlQyW^VBHe+(+UpL;V zZC2Qf2t|&V(HxTsuZJdd3XJFO{f69%xHsH2CM{kRc#8;C<>(OuCK2(7_zhXDRda<5 z0Zq&iv#CM|WU{GL4i)5x=}cxE6i0<X7NP~wva9oQmG;_2VybBaUe(+ zuthAoNHB$!7|a-KP$5%xwYc3$EbF~kuF!@eE5dC01xHv?p^uq;mqPbd&jBaS6&g90;bQJb+KI8E0f61DQcWP^jPo1#+X=|J%bizzwdk60aa=|2S#5eFEY@Fvyngg z_Iw|0kL_HqMm`+fb1c+aZVU5DO5n{bI#4WWd(mq9D>BWZXvkp9aNUG^S)UzzJ=fW9 zt&Khvt2r<0+B$znG9#?zwF@2%IhSJ0T@s?q-{p5Fa`fqrA%EZk`4)KNBkm2?iQyKP zUh7NvrCYLYB%!Ect+!{0qw#tcy`eVcXm#g(>5Vq4%{Bkk<=Vstw`(LRy*5FfcVOzn zlczk{+{Bx6)&|~A-!Ru10sQv!{O0MgSnCYu)%2ca z*?WKYpLQrXzDeifRLbK^lRqe^1rK-uPWY_ARKWT9kaOr^K4QKSF41+Ixw=+M{giqrR%wrT(!A9lk5lH!iGwncw2j z9;fuCEr}VdZ(KWDxG#J|{k4(Y%qH5bukYEabVnYf!}BWYNuTKMv<-NF^N{rGplLiL zrRJdbm?k`0d6(BF$L8`Jp)(EgJ#1Be)h%4~ZSM>FpzrSeKmA=W zY&+gFePzWpB5BsF0|m&u2HB mu#e~Fg}kbc@)~M$1!NG)Sey)m_oT@EQ<20aijE61iv9t(6P@k= diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_data_fully_in_h.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_data_fully_in_h.png old mode 100644 new mode 100755 index 8805a40570109df9b292d74c4c01081ae451c3cd..816085bdb799234884e84e6d692d3b183ef1a829 GIT binary patch delta 1035 zcmV+m1oZpF4WkGliBL{Q4GJ0x0000DNk~Le0000J0000c2nGNE04C?4(vcx3f5k~e zK~#9!>{d%_6hRQ~>Ydqf<7zf2Mtpma_zH+9z7UL$i~a#Yh=QPa@g#zeqYn^42#9(S z^^mIvQ4qz5sH=#mM53Ug@e$)IaW|XY?9NP=RkJ;AZ+0{hyy=9dCN2W{;w1b#of1_xj@hyCO;~O4YF;D^1#x|`uEk|!;V^434Y3HH7 zNUKE4)qquCQUi^rHBJMwVL=13ZNktG(8?MSR)MkS#M5iu95;_MV>URxi^W7e^vqpj z^*+DpO)g|`N~pK%pnKs4t4l}cMS(f_er(*d&psysge1+?6Yfs-UdoHve;fD4&nSvP zDHNBFx|>P=%FJ&~&TL1FaR=$lF%%#{I7u;q^f{IUD3E{{knQx5;a6aiqOpLo2Qi9_ zqI2q?k#ocnI0n)IQIPF)o+H63s0_w`BxAN{c>CB-lC%LL3M8t|Y7xt8^){!KLHT(3 z3EE!X*_l^5?J6@`N9isjO@V& zk-kvcPr4E%Jic;^eMC{%?1=3QI@J)Jm9AS9L&~QOemPIYocK1c#d^e&>kH`{e`h#S`>!{aF90zhb6y*ed;T{ej%BnXo4DJCv2zr>Hi9>kmP$3bh9xDj$dnL zq0}^2R9=1=j3xj7?1q=B^p{c0&HQ&th4h-5*15-ns5G7CtSud_vEODFhwxb z*Dcd8Zo?ksVveasx0!o&NABr=C)4xSTltXiQKd17L@Jmtwt$AIGPkq6E_>&EXwGo_H2%JA zS2Ke*_yq8QWRIxsxj6C+s09>ehluRY|9?6D@$*A~0RYzW_p{=^bdUf5002ovPDHLk FV1kcZ?!*89 literal 1732 zcmbVNYfuwc6pld<0Yx5yrJ(DIFB+2Fyb}o|ab*i*?i%og$?wb{xR50?GhVtKA^j{&4)!o!Pzj+@6wD|Bhg!~q0Hzax zn>b2HX_BI;SkyK%8n-Pr9@&xQGi2-LJ^1y0bH04v)DWyj|MOy7-B$72FwhFc|sOb2tmN~1CrLv zx@4hRrkJ)xN+K|oAWT9A!)mqCtt>ijPGP_TfxyARWQLL&p%%N5(Aq+cmSr;xGSq^Y zF%yB|M!>}hOWbOLMbPb zr4T6iu#^dL`7kViA%TL;<;t0In91U@XEiby=6D>}&vbw)6(?{@DsBR#aU4LYMKGg7 zc9iF3v@+C;ZAEnoGj0H;@+-t%W1qtlaLM>!h(8@SGZK<=czhO1BH<`t7C4R7{hypM zNM{(1=J-#u%p8#&=-9q$eNuQeJgAYJ7&AE<;?kPq6bf}TS|*9N^*r2v9`6$SUK+Z( zHPGj?VEM765D$ISz7Uu0W0Rf))umMB9OnlwiWVjJa&n4%(1F+24bN#4 zOM-rRf4H_cXy{=|zqbHemU(1l&i#p}&(2zhTC?UStlQfjxF_)OglGO(!<_L5dPSqJ ze~M46Yw7IOH;BZ!S7s$h7B*li*N-HfVQtx!g*PSPx6`jL4jFF<>^3&y3(TjSB7WUp z8#Y<^ggp?vF6*iPsC#SIuohFZV_Zl0#ecZ?{ykRm=yby9qo%_n%}LKrA3pca++3$K zK20j;_saKO5D(^*1<&(p#$TM<65-kCUS76~Pqp5QfxhS|cJD#Nd4`I*Y)V7;#Mx(u z$8*qK>dlB>6ZPbY(fY!hV&i;TQuiRy+;ctcH2p&6n#O~z&-GsP^@muczgezaeOwgU zCLavlg0z7L&L|7pzsA(Dp&F#v23(+B+;CH{ICqtAUr0TprfTx9L+Gc$PD2YbcPziy z@j>hFH`c5wTNUgC9#9_bt+fx<6?M(hmNm={INp&pzoq$-#?QW>y2|XHc<`=04?VI% zR8?IYZZG-f?xL0Q+S{A$_P%=5d*8Lhp}wNk&P+3wS8#~Vr*qmFQ%SUA;X@B~@ION0Z z9@+HsdTve5hCK)TGdfZ@i~20QhyI*_zFu}wBV)9h+QnaIE4qB6u3|~H=)+E`=Bqme zY>hDObBu;ovYn#(A9TBU84Ik7f?5|3>z4}qSBg9JEy2A%C0@svyGH`ID3ViVji@B; zzPCQ!^Ym@II&aWzU{}-q?up7PvmZ>lsXY?{#)3}iiGry7t(%8Cw~O;{n^xDg1)fab z{|W7}lHc?F_BJ3h!Izb#xV6*V&{>&5tEQrhzeK*f!!Fir;8yaImjql({y_y)R4mD$ pRocLO1g=_}+h3gbq$HQ>K^ZR(>**aEJ>mGTM9X7k-$o|x_y<7tmPr5r diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_data_fully_inandout_1x.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_data_fully_inandout_1x.png old mode 100644 new mode 100755 index 07545d52cad340d6c820d66f342574467c1326b7..01320192bcc7c6a51d3dab4c5bc05532da0fb063 GIT binary patch literal 4425 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 UZY$rf&Hw-a07*qoM6N<$f^GL?uK)l5 literal 1910 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 literal 1806 zcmbVNYfuwc6b@KHXrn0Lw6qRxhFtRGp^-TD6G2 zh^qh<1__p|4PR-*Vpm2gRV!0eLN$F(C=guvoz)BG|M-PoS1yy=mqc1A>`U zMy-L+;(EZ&h%Up;gosXh`X&UOL7{j{tT&A&icA^Pf*P0*17zxS_PAc7O+*a#uN&_~ zo0KaI7&8Vl;bxA%zlHR~y7`0?k&{PChnRS?+kRu{GdBad^)v$yc z#+C_X0!YFFc>)L$LZDE_;qjy_Da2y)IAa{|(&a-^Aqx@+BpgHnL5NJq;`3xu5afgj z5IzS98`G8RO$4e}VPkf+q+LEF4r2*?9{HRE~(1mhMM+Rk#O4 zTdy0q8@ipkB6BTm^5pTp)D4a>vWa#$#xV<-v`_394NU#Kv@bAFJV7iGH!ZkuUQFK? zqOU9OOeys4v9xsE9zWw?@rHv%jK8{zH1+JXQz!BsYur@hJ zVpAneTt$(5dyG#>j&LBu|I`8D@wO4_u)L$)!_)a5 z$KlTI_QWOaiC=YQJ+NM>0!MrjGAC`m^|+xjDJ(2F;@8`vrlzX;XCt6|#iRrX~%jO#GOcu(NzP_7~!jz`V&+wHln! zo%tg#ZdjI*3+^4*U)2nQl7*>-1$U1f?c*20=tkSmxCy1eYi-O*^EGSS(1(Nl+j=G_ zjd`~}xT$&492XnEQUIVf=P4mB)oW{`Z&(`}{}#45ZKe%xX|Kl0a+y1x#(9ND3XaE> z>>0n=*3+mQTJR!c-CbI^(}{EUj7MwMZHtw@2yn@d-UW6eL;e05Mwo?`l}Is2HmW?f2nIO13y?fvJObMaBu(?OpdpE7&C=b5u*!@7yR;`r{W zvBBp@{p`J6L-M%_`S-m2TM&;a3I4Ee%uIlf7J{gN7vzNk?o9zwiI}Rn+DFkm0J? zYev6zX|3mY)ZN@!IQ&UeF85%SSHXhp6QC|))!hm||MD((f#FbpT5r-;-cE1fY45XE z_to_cNk;;Eznh%W8qkuS&96BrQkA+~g-5u9%`Yk>Hs_IMU&=`JE4QVThEo>#rxjWI P?0+b^G!m%@Te{{SO=-I# diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_data_fully_out_1x.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_data_fully_out_1x.png old mode 100644 new mode 100755 index 783c2b606c7751b931c5a7cab7c1e036fe5eed8f..6141f728250143362be3d712a61515d216579cc0 GIT binary patch literal 4340 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 diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_data_fully_out_3g.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_data_fully_out_3g.png old mode 100644 new mode 100755 index 001eaea74cdc2b77e777d78f991153b62e15a742..d44a4cfc11776cac83cf3669935bfc5195e99977 GIT binary patch literal 4454 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 literal 1893 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 literal 1778 zcmbVNX;2eq7>>16MM1#8$e~@rp;nUY<|Kg>LpFf`K@E)MR6?>L0g?^LS^}1_6B$f_ zK}J;2A{Nwfybu^sT11c{idv2iDk?$+JZcq0tWp8n4TtRy#~{YiXr#)MH=1ggZ+WqO3bSD=XqAlAr|5Gf*4 zWTdqr{sh8&r8+VSi;{$K<*0@tv*=Ka8Xb-%5c~s-I+;8L!GJ_0Nv-9PM(P_$fLg&L zeZ`c35}g21se?21NJM6Mq&zc4&QXv8z6AV@T%16IU^2j{N!1#-MjmOJmy7Q$$5aw9 zt%9ZSNHb1FNj3liRF42m3P_fNED&Hp6o}4Xv)MiX4TL}{NTWhDGQ{T6X^a%C~9|EhdI}B>aY=P%F3s zW*}X}5&1#_8p!g6APxj_L<|;7NE1RdI*T#K@j)zKNP~qek$?dQLJ%zC(AX@I5Cj>4 zzAzgau6NOZ5vod#|GvK!w@NG9BINl(-_+qo-$)Q-z%!pGdTFt#%;$Xl%*? ze(diZZg2PRAL`qz9NFEwXpIl;MYUhRL<4&yYfR}(h;qGCS9|IC->b0UEH~CfexZwr zqPY8KVncCNUf7#>({LzkvU}CX-ci7R@)N+ak)0#R=k^Rv*H- zO542!dFGfag{M5b=mo!5wGm%0ZW^d>YF<-#E_+_~>D$4#I~uPpwGsx5-0#ZfUU3so z#p!Ycx@`V%kwc{$%*q`qr^lR+KUw*MCbw2lJ3jVv7!=ntw$9q^TgP_k@lW?m4H^uF zL-duqJ(HK82?_&7}(E(_ar$AB{5ec6jHPTx%SAme5>lQpZ{?(D?+t?S<0bwYj24G6kVmKc6t@ zUp5b(x&ITkWT~SjzOz0kaeeKH+b!GH^S1Bm5D@)}FK#^PxBzTrbg{VZ98z50yn`vl zOM-YS4|pwHDx*RS|9zQhzwAv;giS3HdD6J)Se7nhem>s`tv>~;2RFG0M zVOK&vm`N@ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_data_fully_out_g.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_data_fully_out_g.png old mode 100644 new mode 100755 index 11f3a5c1db7cd4dfd2aac74a6734fe31d914c88b..2fe0bbf690c2447ef1dd7345c39ee1e68322cc4e GIT binary patch literal 4066 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 U{I__l761SM07*qoM6N<$f?_3~T>t<8 literal 1769 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 Qd;kCd07*qoM6N<$g3|B)Y5)KL literal 1752 zcmbVNX;2eq7|tMdB$T3*p@>S?#R^DCc5{+Iz>q^CjbON2FQyGOplnO#O3bsESe{^SdzwiCN_j%rXc31ei zH4a2KB7s0~5QXq1`09+mD;LbizZd+QYw%?;CXiwgs1i$-84&_kfhHh;NGnqz5=5p* zF^ANQrB-MySq^^sUrzXl-3NR=T2r#p80xg2c0JCnQSVB4MD){1LD?< z3ME^@7tY$kB@U>@Fg=@0PEJlHB~wYLQALJXES8mnLh;2ld`&4jOlJ1gnLOqg_=rhv z)aWq{sspTyvIH~<qF- zrpOdMLY5#VG|4E(>!I|R1LL{-upz4=?hQN4sKJXO+sa4fNm@jQiTE54zac3!3O0`( zOck<(elU*$G5lbd1w$+$jlmF51Tcllpv`f-56grFEDG$$C%2hU+eIuj<-$&op`8r<$IHu!^BHqVI2Fw_`{qFd)WAY6@Ns7a0L0bT?h5XiZaA8}bGuOFO zrQ8wA*wC^9T-E35G<=37;EO6PAU7W%CLoWJ5^8Hznp)8IBj3E}jnzP|%d~w?ReN*) zrTY(h4~|}YdcV1;rC*!v?6P>G{@_p4BiqLYN{TAhdewj`KKpa$rS&eE(;1A_%R8bL-^>y=Nc z>|R-JNW6HO5nCI_m7<2Ol#y8PbmHSlZp1`;|4xbHvH)dN?$Eh~Q`MQdu>a2vgRS;; zJrCoaOqN*W=UOJ|>x)nK0sTV9ar@A&kyvnlqC^qBFCTs^NUo9uc)Qm1RuoXQ~)NtU&!loQr`LN)y(AJj@z=NK$M|`zQ4Fx4(s++Q#eGH>ba< zl@>KVEWc1O*0H@&e>i<3)&54|!=^kq*|4|&N0!(5b+2@M@6iWtcUyA}4lQ0oqz9Gqk~G(jm!rSutFn<5 z;hx0t zY~|`o%e5;RHZ69yT0?GiNU2wZ+s4E;4c}7YJ(Hran8v(%JLFluZ>+zQ*Vw(h$!X`l zvl|$tJ*u#)X#uNpY}${F)a-N_o+m2z4;tK-F%vjVga{+KVJ9ng_a3$WYea%|{1d_P Gng0O04yb_u diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_data_in_1x.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_data_in_1x.png index 66fb60e90364dfec4e3dd567124a722d365ba9be..00a29a484acdd297831b5d2ce6b827e38f412f2f 100644 GIT binary patch literal 4352 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 N002ovPDHLkV1iA@R-OO= literal 1861 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 literal 1752 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 D8`qd4 literal 1760 zcmbVNX;2eq7+w%+jHGIzPJt@Rg4P3)-6UkmYJ`wO0)}#=no-KQBulbDvLRU{P&6ef zjJArFYFj`nj@D5`hfxrUN5!Ka@dm1(qC!nc=&g_2Q`+e{8y!Y&i z#Dv)#b^sdy0FEkFp3JO%%sZL&4)Z-aqp6x%{Aq=jPN6dBJlskEQazPUfGQJiAd(4O zpPzG*mH64OLQZIq# zMW|u5MMfCO*a9n&Qjnn06=dnedMIiZIMa?X1SW#ULAxp2Y{Tpl=p`@4?A^ya2z;qR zXGx$}PHEMNpp3E-U<4Nq*TEtf6d_zhAVg6#4CKQI%!BzngddKen1GMLFgWx;j5Vu1 z151`GhioyD1TxaJ1>^DZ^76QO0xo4W@DQRrrCX+j^m)bTunfTX@H)`87 z`4)ngOxUPgtB$EhM#wOj$=%xxxfL02u#c@IQxrT~PU&(@gqc>!B@lDN)suP*l?g== z2#N?J`LHMwK_Uerky0cTD3tsNfiO}&%<(3y0Fj|Ff*5&>B1VZIa-~=*MdT)J>dsc~!YZhqU1U+P2Q@u%ufWQB+h$hGXy`nwoVc!Nyv2sw>E=U`$8g?OQpM;==ZJnEKb3 zv9OM+=)EDX8HeM;efl$cT%$xD-#Jf2dE7cNHhV(1&$SREzz>aFz|Iy`^xtUlY)q3)%|AQR8&5uE=z7=ysDjKU)2G4rpB2t>2v{qdq_qRJ+9`$3Moz(6 z!}ICm4@bM6>-kfGfyEyb&l|^jyu?q@%L-ljSHq;z$4{F5*ZB7C8og&k)q%7=^|nim zJHI|#1lRbbv^Q|@EH77R;pNP_w2=K5jHx9yfT4%cI@ zzC>r>!ghU9&D^L&OxxLgcmCn{wCM9cL^qvVe%b3vRrkirnGcf#*ah}gkEYMQa9Znd zw()L0tDL5nt7^uto0u2pgBv#R_w16Yk0)%O6mW#U3E88W=BOQnf%(UJASt+`x8ubN z#kL&R=DSzwy_4!E2l|d&+7;@vJGiQAOIsMHIcdA*cKOofY*uyAhlNoM%E#?Ues=@p z@pS!@S+3aQUGcwrEf*g=&2@6`mw2AK8c~zVEn%PWmPReP*3m@2$1#jM0$6@LDm&DP z!cVqoR&Modp68LXkKcM@pswTo_2zDl6BI7r-y2c~6#Mg9cRT#d8;@OjSUzX*mhqmZ z89@~y??cJk_pXZ132Hf?TB^OuHhcm(MjmY$C;}>DfL-4f?@0gkgug7VYF+dosV^xx z@Oj&{iz%z$_uY3oZ1l=Fvf}KXW#5~CdEUoz>r*vp+lx1)oQv^%_P1l8e}sb#1Lu4z UB>CF1X!k!yrAUzPidpFV2eEdfNdN!< diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_data_in_h.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_data_in_h.png index ac80dceeca9f84bee619d3c3eaab3ef420fe8d60..f36e1ebb8a3e08545fe5b1be9d3d5fbb9ef865d4 100755 GIT binary patch delta 993 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 diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_data_inandout_1x.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_data_inandout_1x.png index f88091b59ffa5b50fccb9b3dd191101b8529c429..ef5dbf47abf2351fbd0a522aa8f6500dd75f5568 100644 GIT binary patch literal 4418 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 IM6N<$f}U4UdH?_b literal 1901 zcmbVNX;2eq7!Cmu5n7c)uv1-w2Ph=FNl3E6ND?-|C_x$#LqR1Z3&fCYNES#?ltIG; zJYY~%JW2fdC7lLJTIG&GrZAAOzAtIt`)+Kx{69&ILhW=%EnS z45|dK3=t36A|xIq3CHzZ8ZA9Notn;|VunN-1jDe6gH8`1Gy;rf9j-71=!`zY3ec6yrk?@8)-=HRnqDV$CWvUj{;Sz*LA#SKDwTjCQ zVX^`tHpJx6K^6ysI1Cm`%n~p}VtOEh$w7uWK8IyM2rLwf5TQsYh9E=?3j`3t1_dHI z$Y6=sqG7B=XT%jcB|2Sn_ZOL?mH2W=z8LK*)kXK&nux zbvD^no{!NYs6m~Es>B9N3w+2gSN$3LAjAP7h|L7qALE805Ej8On=KGSa0nu#3}IFO zCucOm8Jev*{?jbOM??qOwx3#`5IzkLsv{=GK#ayZ>$z3L#O;(If=JV~-Y7W9L*TVb znZ6s|6^i)#Q*sYKMjGC8@R7M>ba%TMEY>wA0( zV{bY1x@P}g&B~zUZk#>&p46{<^2l26ybXd&*L~OBhgRwzZ{NX=-@3EhuEGksoUiV5 zi{8b!E>LeKN6OpmqrBbwn^G?Rp(;Lmp);m)vh^#jjh-e^s_ zj9FOP-fh+1*?Z>439^Z!ZiLU;dhk|^I5rY$uEz{I!E(bEM6gD zx9c*OhwoWGkB{Z!4UeIMXFcSSzw|F>KQwmqx{EWIQ{La8^kv~iDWnt45v&z<(bZW3 zFUwNSf&KO7*x8Z-9_-Jiv}TZ~;n$&Cd!PkTt#Op;u$u)C5P z%jsLVxX>~0?efA>EopI1uibOk%I|_CmofK?_A=+`SMT=kBxkJ^Z~rxVv+JI%lMN Gvi|`fPwR*P diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_data_inandout_3g.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_data_inandout_3g.png index 95bb3cd92510176e8beb5ff0bb4d566ca4924f92..dba9675cd963d36880904d9f3244938b05156e97 100644 GIT binary patch literal 4515 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 RP0OE@CYOdG<&)yf{{WOP>UsbG diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_data_inandout_e.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_data_inandout_e.png index 0ef47018993e97e143e6d965e05556038381d51b..2e5d82e850912501c0f2c38ce7fe82d4d231a9dc 100644 GIT binary patch literal 4130 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 literal 1863 zcmbVNX;2eq7!IH%Ahw_pK|q(KC|bxK2?$F!f}&CdON&z#QM_sbXuS{>5l<){MP<+`hutXH{&4)!o!$Mu_uKb*-g~xC7X8gw z$4QPf8f|Q3geZnu8PqeC{u%W?^L5>RYH=sU3NjYgkZDQ+qY2b_A_he2m0BzYQ>rsk zEZ9sM%}%3>Q;-U26kmnwnM$h;GhJ__&@|f2&~&3xm5h-PxP?XAZU2)t7v zlY_zcPAQ}^ARH$!Adm?Ms9+8Za1bWKVsp7%e*lFM7=lpX=%(f785755W?f}tQ;sBKxqV+G7O|LJ-}e{8DS7%CKaJG zk~-V~SQ(Xxcq$nTQl7pKL2r~wKM)&C!-=9&2Bj;F5W<8Zz1|wvJ8csggZ=BqN3~6H z8Ac3>!Ay86p`z-c@fiVAx%;#st0LtM|64*w6-BvNgsW2Zn1PHG1%uQVrdp@wbHmx3 zK!l61gHV_ggdjmI4oAWfu*4EHki`xXjc|Mn%RN!*l#8-eiHKtQTg=?qrc zTAugOiZDXA1XD{0To1gBxRhFlqCzd4*(Z^g8UIgo>+&QtZOffp3R_0Gg>58QB^qScq z?^s(~dtH6Id&iUGN1`}ci6z2|cWmhm@L?r<`~9IP}VDE5qrYRp0GT(`dCJ@);8z?jC=*aD$`St>Fr0~?v`+oZ#AJw*KQasxd+I$k~q&I@`V~f9-~6tJy7HHTCts+76cM z+vJVd--JEB!+wxu}aMu{}=3h%KX89btDw^m@GGIaIqdR&|&hf(XKV5cYcB<~AW?j6OcyNRq=sMYZ#)jrT>~Kv_-Mh;t4_9GxpB%Q4s!#aKOm1* zY!@Crwra>%6JgJiJTTqxcXsO1GuDTd)-A|4XDcI?7c;xh&V7-fU2E$kl}eZGf_FRZ znI1UHN!p6*^>d3FCw*U?(LMUAc+nQ^>t%G$o10JjzQ|2})0a|giCS?A&Tep9xw6*& zelFq~)?sO}Ed9aW=86q%X~)|&V_LjxWdoqX#rWfa=KPL2zsndr{DovdYe^0{4?p@4-3aT|K5SYUbRFw^{r7 zWtqIx%`~sY9_4ah6>6f}bKw2g_O5A$Y$e^*`@jdd>#h96h}r83ds7snu6Bzjt^0jn z$rAsbal3%k9cRnTy7`T-E%{S(%Ds`vQI5wM=G^j&1()A;6uhN9+f1{g*}OQ}KYyd8 Q*7|FU6i17yg$wik0bhdFrvLx| diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_data_inandout_g.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_data_inandout_g.png index 31b926bd2f04962eacb1aa729a88b7ea4bbf8982..0985a0956d7c5b8da94ffb5c607f9d143641004d 100644 GIT binary patch literal 4104 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 diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_data_inandout_h.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_data_inandout_h.png index ed02984ef85c950a733aaabd4c070e58bf8dc28d..7a32c4316f4a1b381c72b5c0a4d2d72246d7fb9e 100755 GIT binary patch delta 1083 zcmV-B1jPHo4$=rAiBL{Q4GJ0x0000DNk~Le0000J0000c2nGNE04C?4(vcx3fAmR2 zK~#9!>{d@qlSvex`Jk<(7z(?RuEfL`5)Wpxhs|b#E){MYjt~xnLn9JxB8H0+4#cc! zi6-vRZj78fae(wfmkS39hmzGq4hEtJIcSi!Kub!$(tqEK?@ecPXvJV+qKAFW%Y5IP zH@|uF=J(!L$~h-rOAPWA<@*Jze^(DHD=QQRrTQjZs+v>6v^n0<(eV*XI@ZYzZ1No) zExFK;^U7WVEz5a+C^G4U?@p<8(y=HiGEhpJ0EZ=eH(j4u`{L=1jn$LQjH#-HjsvLUQ28I6*%xhc#dVunt5484#Vz zg^`yl=O{V#B29Ig@+?dYeMQgvi_=_TM&0YhSp z5u`#YmD&e;2FFSxt&mpuRqFF&IYGBL1eQ!Db4=#S019kxZ=3LFeX+~KR@q)WBuawUJe%W`Nnd&O!E1H ztFzO47cS*zphF{2jbuQx*(`y`PRO*V6o?1GgPxwAgN==if9IjlL!ZSg;F(}KnVNch z4LG$9i!J0HN7BLwx2nDgDj;fTx5EYp2NTe;^UUI60csuuqC_AI-x1KNj11D!qFo@- z!NkWSlgS(~Z4r>T>OsEK9qq~QxsZlha+yR(BqLUhQW2T-!%yhlcca#A}jcQzL zAhehsureY^SOy`Yk)95Rpfe~G?}_!skwlRxW10~I6Jmf&oz5E9khYPCMgMiwt0L)*Fb3C>MM2VGOr4=a^@JQ2(a0NyMynC>Bphxq z#Dh3|7Rcp85TDKE%D7^-RK^NsbNKKm$A_?N2xfC&0XJM4E`uOgCJ>7umWdaGfwI8q#LVOT{cpQ*79Jc@h1yX^4#}msSfdmexjbJtZCudC3 z8K$*4{?ja@M`QXHu=u173kx1#Vb$>^3&udJw@$)N4uBzCyu14kA zQC!Slp1%8)PoKc_?EJajHXEntEa97+{_KRN{uY&^xCICC3*CJVob1MJe@6$Oo>u>Q zZKA26v#9^&l8S5l_R)Q=UbFj65E+zGHdj{vQdPC*n|m)@BImY5<(2MoJYF3bVq5g! zl!wycuy`-vdAuM@;+8Ol5sA1*=5}Yrme)$1_`jqbd3G$MH|EGf*KbuD=P1(v#Y`jK z^k>0Ie_l>9ktn@WzLqTjP*3~K#Educ zQ(cABpazCxwj%%=#Q9x*w#wGY3m+bO>0P(@e%?g>BfC2L)1iKeQm0fu`J}R0$%RwB zz0=Q}j1Q>LPjFtD;`DlZi^KlxQa6WAR_)ElV=cbr7m7sza;lIkNoyxAnX0azbpWUC zquvl8d8YmIzGQqiC#H~KjW#Z;o;c@gBg%elpEGV^I4As^8Srl^nG&{RNyTM< z1bhXbC`s%;1HKI^t)%$1_1?FGHRO-p{?;sr%x|^swfL&ivGkyTYLD&(e}!6R%nUI<4jHV?ihcZY;OJ^K;kEr* zfI6RET)KhPuHC?0GjrEAd+HSh($+_fJCc*r>@%j|_PBuY29ADZxX-I-N~q9Pc|0f& zILOY}=Ffucz<|e-alj(!sY+~ diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_data_out_1x.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_data_out_1x.png index 0ee5b08ed66098342239e1ad7fff7de5b995c235..b62255661df8f94f6b8d73a6ecaef479780a5dd6 100644 GIT binary patch literal 4350 zcmVKLZ*U+IBfRsybQWXdwQbLP>6pAqfylh#{fb6;Z(vMMVS~$e@S=j*ftg6;Uhf59&ghTmgWD0l;*T zI709Y^p6lP1rIRMx#05C~cW=H_Aw*bJ-5DT&Z2n+x)QHX^p z00esgV8|mQcmRZ%02D^@S3L16t`O%c004NIvOKvYIYoh62rY33S640`D9%Y2D-rV&neh&#Q1i z007~1e$oCcFS8neI|hJl{-P!B1ZZ9hpmq0)X0i`JwE&>$+E?>%_LC6RbVIkUx0b+_+BaR3cnT7Zv!AJxW zizFb)h!jyGOOZ85F;a?DAXP{m@;!0_IfqH8(HlgRxt7s3}k3K`kFu>>-2Q$QMFfPW!La{h336o>X zu_CMttHv6zR;&ZNiS=X8v3CR#fknUxHUxJ0uoBa_M6WNWeqIg~6QE69c9o#eyhGvpiOA@W-aonk<7r1(?fC{oI5N*U!4 zfg=2N-7=cNnjjOr{yriy6mMFgG#l znCF=fnQv8CDz++o6_Lscl}eQ+l^ZHARH>?_s@|##Rr6KLRFA1%Q+=*RRWnoLsR`7U zt5vFIcfW3@?wFpwUVxrVZ>QdQz32KIeJ}k~{cZZE^+ya? z2D1z#2HOnI7(B%_ac?{wFUQ;QQA1tBKtrWrm0_3Rgps+?Jfqb{jYbcQX~taRB;#$y zZN{S}1|}gUOHJxc?wV3fxuz+mJ4`!F$IZ;mqRrNsHJd##*D~ju=bP7?-?v~|cv>vB zsJ6IeNwVZxrdjT`yl#bBIa#GxRa#xMMy;K#CDyyGyQdMSxlWT#tDe?p!?5wT$+oGt z8L;Kp2HUQ-ZMJ=3XJQv;x5ci*?vuTfeY$;({XGW_huIFR9a(?@3)XSs8O^N5RyOM=TTmp(3=8^+zpz2r)C z^>JO{deZfso3oq3?Wo(Y?l$ge?uXo;%ru`Vo>?<<(8I_>;8Eq#KMS9gFl*neeosSB zfoHYnBQIkwkyowPu(zdms`p{<7e4kra-ZWq<2*OsGTvEV%s0Td$hXT+!*8Bnh2KMe zBmZRodjHV?r+_5^X9J0WL4jKW`}lf%A-|44I@@LTvf1rHjG(ze6+w@Jt%Bvjts!X0 z?2xS?_ve_-kiKB_KiJlZ$9G`c^=E@oNG)mWWaNo-3TIW8)$Hg0Ub-~8?KhvJ>$ z3*&nim@mj(aCxE5!t{lw7O5^0EIO7zOo&c6l<+|iDySBWCGrz@C5{St!X3hAA}`T4 z(TLbXTq+(;@<=L8dXnssyft|w#WSTW<++3>sgS%(4NTpeI-VAqb|7ssJvzNHgOZVu zaYCvgO_R1~>SyL=cFU|~g|hy|Zi}}s9+d~lYqOB71z9Z$wnC=pR9Yz4DhIM>Wmjgu z&56o6maCpC&F##y%G;1PobR9i?GnNg;gYtchD%p19a!eQtZF&3JaKv33gZ<8D~47E ztUS1iwkmDaPpj=$m#%)jCVEY4fnLGNg2A-`YwHVD3gv};>)hAvT~AmqS>Lr``i7kw zJ{5_It`yrBmlc25DBO7E8;5VoznR>Ww5hAaxn$2~(q`%A-YuS64wkBy=9dm`4cXeX z4c}I@?e+FW+b@^RDBHV(wnMq2zdX3SWv9u`%{xC-q*U}&`cyXV(%rRT*Z6MH?i+i& z_B8C(+grT%{XWUQ+f@NoP1R=AW&26{v-dx)iK^-Nmiuj8txj!m?Z*Ss1N{dh4z}01 z)YTo*JycSU)+_5r4#yw9{+;i4Ee$peRgIj+;v;ZGdF1K$3E%e~4LaI(jC-u%2h$&R z9cLXcYC@Xwnns&bn)_Q~Te?roKGD|d-g^8;+aC{{G(1^(O7m37Y1-+6)01cN&y1aw zoqc{T`P^XJqPBbIW6s}d4{z_f5Om?vMgNQEJG?v2T=KYd^0M3I6IZxbny)%vZR&LD zJpPl@Psh8QyPB@KTx+@RdcC!KX7}kEo;S|j^u2lU7XQ}Oo;f|;z4Ll+_r>@1-xl3| zawq-H%e&ckC+@AhPrP6BKT#_XdT7&;F71j}Joy zkC~6lh7E@6o;W@^IpRNZ{ptLtL(gQ-CY~4mqW;US7Zxvm_|@yz&e53Bp_lTPlfP|z zrTyx_>lv@x#=^!PzR7qqF<$gm`|ZJZ+;<)Cqu&ot2z=0000WV@Og>004R=004l4008;_004mL004C`008P>0026e000+nl3&F} z000IlNklwofkB9Yf#D4c0|UeFQ>RWTzIgFMfZ^D&V~p3X zUH|m||9=KXWIX@?00960f^%4&JbCp0@#CkgOkcnKU=R}%{mt~}_n*&wefP{5pJ832Lz{#+Erz3=;r zwN_bcWm8p^(OP#=wDt2m(YEa_1SSz-7~YTNv+&2ioO1`j0SoY@EX%mLHj<|42{?)f zVV>vDX&gzCWN(a#f!nH6vC@xHGFE9A3Zw9MZwD13CeWccwM$oZ&11Oa3GxDYhio

4~M*@c^ie7{eNGYl7df|EAcDY);JC5_Ll)47QbojS1 zhTa&mEZYkq<`0|A-AvBrN~v?ePCK|LisB{+g2yyX@AEwWsH*C$@B1%n?dOET0)y7t z?YeHEwRW4PxeUYb6>yJu#=VF!B!K}KeBWPMYv2CO@sE}AXH6>#*!J}m?03zU}@qabhM-W2wf`lZW&7Z36de3g$_y<7o}pMI5?JCFSdH+o^#$V zM-eB7?!Om)e;(e0gx;Zxc!2Nx8Nh~NDEn(Xb-+IXWmdj-#A|y$&HpZk{YqZvAqcxxcKu;!<-_}~D z)9J5f^UeL;{oN}O;rjaKHjd{fs@v^)z>%XDU;(Ul%-g`l%nS#EE0m&GEPk$3Dra#V z8xi@wDN}mA-t%&~{7xywmrmzrtycT!HdR};!Z3VDQ;kkj2E*aw_ERbKY!|>k#%Q$B zj7FosA~F||`96G`kpWDpR5}I_k=g&{=^)WR>dGIattblP-+eD>{#qdv1C`oBLj@f= zxOB1@QM6HLg$NS66s;8mX@)wKWT<4bn4#!U2rf=_=wby6KC6Qihk`a8sx=k$DWcC; zd_MF3+;=u#>U5@0|Nu^IF18H2)tgedv0#-#>U2mkK;Hl6bhZz*Vq4A zSXd}uUtjkqijwzwy}La*|6tF`8 zIH#tjZiYgk`;R(0Ql@G6uQ;8GAk4p9TU+}yGc!Y4T3Wso?3Yfbs|#2v?inlmY?`Lg z)z#H4RXy?Rx`C4u)xWZ`vZZMnrIa#V*HPFPdD8-5#A30ny}i97)1aU>gLAo@vcJDy z9f?Hdi=i+$IQTgn4!06QT%`jj3_%q|G1u4kw2tR_LMdf#xBD=eOp5L8?bS6kHFdSM swd2`rwtsPPahWl8@P8oa-%a*=0CR`<;rY!M141WtB8gl>o_Z0=XbSU=ukEVxTpsm4;+PA|xA=g#@N3CDN*R zQ4|CL@j@+CiX$qAf`B06iGv5C6{OfAO4UwjutGN+wm%$ybZ2(I@BO~_dER?=b9B^_ z*>+vco-zYRs!}eoMnxDTm0)Pu*C)Ci_sWFj_M^^7{`+#2{18SB}s%uutb)& zt{o1*;Vk6JSTQOVF6BrO6-8p!p%_#e42{DD1Q|3EX%dVQ6W~OpnoAn4YakJoGA?O_ zpAZmgLScn6EL{u7q({X{)03oZ87U}`7+~OF1S%Mn5DltiwT@%pk|uaL*xr0hB@ri7 z&?GKt(kZbpniz^`VWJ-e@R0%xfXDzTAl;YAWO@^600>Y48Wp7ZfJ_dZ#sL80)I-9o zX=QSb2og-$!Xz$9fub4?m8#e4DSA2u(I!$sHk)ncpwWCV4If>a8kHD))H?TR1_;(k zwMq@DMASqxqa*=ILAfN%)5#E28lmtlv068kC@f`EgG56GDF9WaGRHNctwTldzizx! zTNj(AfvF-`hooqwSUu$K(_k!j?>A&t#Ju4w(<-r|NRlB$nxcZ$XgI_rVK)?+QpRD1 z`ZD}LCg{te0Sp!hvgizkfWf2l1vEdpFAJLHco&uqLLmZLC_jWBA^<^1z~=Elhzaoc zG=R?FGx^ilaJ3GVsHO0`o?$#q%9!I6xN4A)nu7c<;^Cy(16nZEvl#8Gk8h`{-;iV>VP?S=Jfh$NO+5?X}*rI=RDVarI?Yyqoo*pOgygqEk|rKjyjKWw7io zw|}w9(IDE`7eU|;hg{p17Zn`SvNn}~pRWc>rSaF9K9Yc9^$MrO7K3PkHqkEtzx=%#iJ zB$1b7n_Sx3?Sn_kZsCHqfA?Z(u}9G2D?y%w!H36=;(BgGY-r9cejKnm@|G;hX4LD^ zoqGSHr+2Q5n^Wm{+hmO1sNYRCvNjv%@NIH>BwL@EoSfZ^g_o*EKc0Kxll(^bX6W3} zT;?86`yD`FZ@g_!q=j^ORFgU?EQ>rwxL;zU!c{ysvcmGv1&^t3IwB3h(p-5p-niey z%jITw*V^RN-f$ZF%VMKLZ*U+IBfRsybQWXdwQbLP>6pAqfylh#{fb6;Z(vMMVS~$e@S=j*ftg6;Uhf59&ghTmgWD0l;*T zI709Y^p6lP1rIRMx#05C~cW=H_Aw*bJ-5DT&Z2n+x)QHX^p z00esgV8|mQcmRZ%02D^@S3L16t`O%c004NIvOKvYIYoh62rY33S640`D9%Y2D-rV&neh&#Q1i z007~1e$oCcFS8neI|hJl{-P!B1ZZ9hpmq0)X0i`JwE&>$+E?>%_LC6RbVIkUx0b+_+BaR3cnT7Zv!AJxW zizFb)h!jyGOOZ85F;a?DAXP{m@;!0_IfqH8(HlgRxt7s3}k3K`kFu>>-2Q$QMFfPW!La{h336o>X zu_CMttHv6zR;&ZNiS=X8v3CR#fknUxHUxJ0uoBa_M6WNWeqIg~6QE69c9o#eyhGvpiOA@W-aonk<7r1(?fC{oI5N*U!4 zfg=2N-7=cNnjjOr{yriy6mMFgG#l znCF=fnQv8CDz++o6_Lscl}eQ+l^ZHARH>?_s@|##Rr6KLRFA1%Q+=*RRWnoLsR`7U zt5vFIcfW3@?wFpwUVxrVZ>QdQz32KIeJ}k~{cZZE^+ya? z2D1z#2HOnI7(B%_ac?{wFUQ;QQA1tBKtrWrm0_3Rgps+?Jfqb{jYbcQX~taRB;#$y zZN{S}1|}gUOHJxc?wV3fxuz+mJ4`!F$IZ;mqRrNsHJd##*D~ju=bP7?-?v~|cv>vB zsJ6IeNwVZxrdjT`yl#bBIa#GxRa#xMMy;K#CDyyGyQdMSxlWT#tDe?p!?5wT$+oGt z8L;Kp2HUQ-ZMJ=3XJQv;x5ci*?vuTfeY$;({XGW_huIFR9a(?@3)XSs8O^N5RyOM=TTmp(3=8^+zpz2r)C z^>JO{deZfso3oq3?Wo(Y?l$ge?uXo;%ru`Vo>?<<(8I_>;8Eq#KMS9gFl*neeosSB zfoHYnBQIkwkyowPu(zdms`p{<7e4kra-ZWq<2*OsGTvEV%s0Td$hXT+!*8Bnh2KMe zBmZRodjHV?r+_5^X9J0WL4jKW`}lf%A-|44I@@LTvf1rHjG(ze6+w@Jt%Bvjts!X0 z?2xS?_ve_-kiKB_KiJlZ$9G`c^=E@oNG)mWWaNo-3TIW8)$Hg0Ub-~8?KhvJ>$ z3*&nim@mj(aCxE5!t{lw7O5^0EIO7zOo&c6l<+|iDySBWCGrz@C5{St!X3hAA}`T4 z(TLbXTq+(;@<=L8dXnssyft|w#WSTW<++3>sgS%(4NTpeI-VAqb|7ssJvzNHgOZVu zaYCvgO_R1~>SyL=cFU|~g|hy|Zi}}s9+d~lYqOB71z9Z$wnC=pR9Yz4DhIM>Wmjgu z&56o6maCpC&F##y%G;1PobR9i?GnNg;gYtchD%p19a!eQtZF&3JaKv33gZ<8D~47E ztUS1iwkmDaPpj=$m#%)jCVEY4fnLGNg2A-`YwHVD3gv};>)hAvT~AmqS>Lr``i7kw zJ{5_It`yrBmlc25DBO7E8;5VoznR>Ww5hAaxn$2~(q`%A-YuS64wkBy=9dm`4cXeX z4c}I@?e+FW+b@^RDBHV(wnMq2zdX3SWv9u`%{xC-q*U}&`cyXV(%rRT*Z6MH?i+i& z_B8C(+grT%{XWUQ+f@NoP1R=AW&26{v-dx)iK^-Nmiuj8txj!m?Z*Ss1N{dh4z}01 z)YTo*JycSU)+_5r4#yw9{+;i4Ee$peRgIj+;v;ZGdF1K$3E%e~4LaI(jC-u%2h$&R z9cLXcYC@Xwnns&bn)_Q~Te?roKGD|d-g^8;+aC{{G(1^(O7m37Y1-+6)01cN&y1aw zoqc{T`P^XJqPBbIW6s}d4{z_f5Om?vMgNQEJG?v2T=KYd^0M3I6IZxbny)%vZR&LD zJpPl@Psh8QyPB@KTx+@RdcC!KX7}kEo;S|j^u2lU7XQ}Oo;f|;z4Ll+_r>@1-xl3| zawq-H%e&ckC+@AhPrP6BKT#_XdT7&;F71j}Joy zkC~6lh7E@6o;W@^IpRNZ{ptLtL(gQ-CY~4mqW;US7Zxvm_|@yz&e53Bp_lTPlfP|z zrTyx_>lv@x#=^!PzR7qqF<$gm`|ZJZ+;<)Cqu&ot2z=0000WV@Og>004R=004l4008;_004mL004C`008P>0026e000+nl3&F} z000JfNkl{9 z7GMtHyjnwRgZGY7%47ldS_fbR4&VkFy>~>!x00960bkDI3fg7KfDvwte+UYOU;;?2?Q{r(F_&oIY%H;U&G%M=9mmlC5wHLP z%%ZBN!(s3HzOV8;_gR*`#W{C1CL)gGv~62w#UiSDTtdKm|ETLqpRb9{FbwAB4ZsA< z0xU_gy`|~y-gTWX%kpD^&@}ZKpeTyVU#F}ceK{q2m56~bik=x^C52=l3=u1P3;R4p z5Ft;H7f2hh5b`i-(uY*3QUqBDENnGm5d5R%YM;yi0&A%WjnG?mf@jYOQy5UElk@ztdW8JL zNl8%@4?>7_Xf_fcNs_B&nVF`EahmA5?&&y=gkktNPc!o}10004mZoV0;8az08%0r( z=lNY(malEwo{!`BVXb}puE+w5F-8r;aA}NDecxZial8lA4|Pq`oIX&lEWi>3!L_ya z`CpztX(fZyHexUefBL2I;7KMeCD0tg7qFM^qWBIzg`16!VCW?ZIY4*arJLfRYa0y3 zo2~;PQ+p;&E$Qz@V@k5}q5>faJs!OOeJ6>96PBy0N&uU77q-jLy*&^ekf*9&rO!X< z>?MOo;0~xAkYByM`YBFu;xJZ@mN7e%>_A5h9bEoBf{P1HE1^1B?J} zKA(R+D+*MV7$YGDVvH0;K~$w}+uwjX;Aywp;jBZfq)7=%r2bVCqq5y@?*VU?%cTGg zI0Md;dJjCM`*F@4NEWzUuU1oxVK5lnOeT{zbzKKl{c&utYpJTL_v7*SqcMiBx3_oG z>GV_L#yn?3hr{8Q!@=VZ2UhF#_YN>)%;gI)un)oGgJ-kZG^+Zbst+#^P4LST|5OIMuYuCKNT>Sp)EV_bLF|^pmu%t*zbjJnv348V$F! zw6vP0X%UeoBCV8CU0q#2kB^UUn5Jn;DGe#5!OWz!R<7%wpPrspEXyiPOibhfoCWd} zrBbOql}ddSQo;}tLN>r2%yc?En@mnG1^i(!n7Cm>---+K^G^U20%L0c^++UAT3%j` zcXoE(42Q$*wrxifi9|{Y0U;%%l$L48Mp|aP-`JQ10IjuFN}bngwMtJ*$P%)Cp zq_euZdUtAS>YWf0Qu&eZ{%GxMk z2_^!w080VKaf+G<3D*(;|RcHWbj^liroSb|RjYciow#`r| zWEh4a06-~49UUFz>FMc*M8vYur;FjbuC7+A%Cam6Kn;Mtw82NC{v%4>Ix!k9n zogFbUGV(QuTUlA@YsTwUmJVP|uIuW9gM&h?Rt?wd9;($^cz=Jt;JU8XT64W#M=<}C z6$HQ=A0IEAoSghno`zNmN-5;?`AVr&>WjzYyUpO5nVI=KJUskV2+?wtDw>A|P%9RT z`DF6>pkWw7Yt6Q8f1jJ1D~^ti_VxGo4-O0rygfWTe6hE;_l23A>yORrm-yEJ<0v5o T{9V*k00000NkvXXu0mjfPqjm- literal 1891 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 diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_data_out_g.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_data_out_g.png index 4a2f867ece4f1034da24a8a3a7c157cb37a2a79d..9d90e71a14edddf3a59b8ee6f9dc2a22d7829755 100644 GIT binary patch literal 4033 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 Y0A*t~TIMaQod5s;07*qoM6N<$g2vnJNdN!< literal 1758 zcmbVNX;2eq7!HT1C_${lVLNq=fM_9mBxIAAaAgxk3DSsw7ZQ>UStZ%9Ssnc=&g_2Q`+e{8y!UKgROD0_ z=dsQ#7Rx1k8m3~_G0f{b%!&D4no@CyS-fa@96gKF(dlXmXN79XL>ve=sFQFNuGVIx z)Z!8r%Rxs($I)@h2(gAVaMd;)uEk(t&@7fD*kV#^7UMLKh$j(7Dd$;56$c=+Qci53 z5>lFExSp7nN#V0HBcnB$i!~xGCpZX@Si}s00jJe~#gJ??i!D-4AFr6%+m1mF(5FH# zmU8-?ic>}bGLpi9KrR%ZfdmjBfVnV_kD{nQfIu(=LI?;W0Wd1&Az}yu1|AM$jneAG zDoin8i;<)pJx!a$Aef$>&Q0fWNh%41MIw=n13>~9jR13okycv*jOGc03>a?KP=tvl zNF!ilR40%Y!i<9}~&LAg88msu@tlC_n?!oHI&867jq@wG}a*YBP$ zQN%BNp+s6P?5jPKD;*|&zOB%^v+hl#-{bAuAK$nt%C8!C;B}_-+x^on-PgyP(n@c} zIbKfi@=m-SVn4}$c#+c{YKKE@-JH!p?6rueemQx63*K+T|H-G%NBRBjcgo$py5#Jr z<4LR0hSZ+7&CSiR+ozust?<#!iAidWJa+ErlKRxjL#F!J+Nz3*H{7jtmDZPeYERen zw6qH~ACGKLt5_63!JmC3%)QnywLW`-6};!I8%J%bDb6V)l+)e6!c}GGJ1#gc8iO}3 z-?jeW8aM0G%J|;!Nj^Pa^!gf;ihn|@MqJKsX({Te$j>@3QSTvezQrHDwV!;feAkzIbQ@b`DN$?L9#E9GAfLV+W4DtnoIst3Ih1AJ zl&2_tJ*OZ`m*40Cmy{MBaCh7C!V=+k!_OI7FYtd-{-smb#iEsswcQT|Y-f50*pUAg z0j3i7v)3f(y4xK0yR;_6kLI&SK9q4a$8U$#_#d{j|EA+^g4d0;bH~T#w)3pzcnFSs z9l2l8rWwa>I@6e1&{er%=*kk`kj>T;f6U0)^jFiyoku#sy}iAzy>|CWJ13TG{)U*` TA4c@p{y5?CNbG1>!t#Fr6LFzb diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_gps_acquiring.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_gps_acquiring.png index 150c9fc8705830dee1eb435afe3f1f84ef4845df..9003d671b16466b07dce707354910ce081780f86 100644 GIT binary patch delta 860 zcmV-i1Ec)(1M~(ViBL{Q4GJ0x0000DNk~Le0000c0000c2nGNE0H{6bu8|=pe*+dt zL_t(|+U%H5NE=ZQ#$U2Ax+-pL48}j?B&In8#gIVI5~%bLl;l`RPo+U<)k~qJUV3e5 z5xn+REG-^NK~3?{6e@}Zb138@#bBf{Qc;o!3DM|kzX@FkX!PQvTiAhNlg-hA6iIUJ5&f9_ziEO(rq zp3<=lMvk0gO-)Tq5QG;!Jv|R-Tre0EYHMqkasEBvf7tEzxX0tM^8}MBp%jN=WjH{* zaXOuWxw$#nYPEiMxm?U4wot&KPDJoTif2*&r7XkNab#>KBqrLzvFxnc`5D(eHq>;6WCn(dZX+ikqS+ z`s49<=DNTP7c8*zn0$aBE_)d!9yaMU4S z0gRpD3Koe(_MpVQmX;P7i)YnBP@I${I4B)L3%i!Ss=F+~M@B{-W74TaBEhz|x7k(y z3{g8H1#z6r=kqVQe}R#Wj*gC_@}@R6HjJB_o9yW5=t?+J5cj>0>)vt$BO4nV^I;*K zNhXuF_4Rd@PN&P0S2MaN0BJxF`?=5Dz{tYku!vplLxk#iHk*~Uwzk;L&JNq(-)B&! zT%FYDv23u;&d##32>;VqEcTi!m|_zX69Nk24w8KcU%hbZGLK#GJp3n|R{!}-Ci8K6 mdipolP-^d${{z?`0R{lbNgJ|{L7`9p0000LF0H~S5w3Vi=$^~kE2m)#z@AgPBMd=JReBAHYg{_&Y z5a$-?Z+E7qp7Oe!c~rIMAE?mOO7kiw<(T6XZ z82J6Er#$l5=NeP8N72ODFZ2Vz>tcskP;Z&74snmwyl(rGzk${VJp~v5pX;Z*Mi09I P00000NkvXXu0mjf^@+{& diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_r_signal_0.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_r_signal_0.png index 1ef75d30ce5b2b66642202f5b79f11b4da81a9c2..95ba18137f6bab9fe698c611538e833cfbc3dc80 100644 GIT binary patch delta 1202 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 diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_r_signal_2.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_r_signal_2.png index 918a4764a8febe78a1e8f4d81eaf3360f05c7c0b..7bf6b51066fe189387863da7fc2e586ebc79af24 100644 GIT binary patch delta 1210 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 Y_*Yyp5X0Vh8vpSDrkM4Qye!uVU_x*gn@6Q!R zM}|J*%64Ti7|$reFg3mU(yyP3GyT0XH2EgIcvG@?DwZ%%8Cnu&NcBV#4k*mpWL%AF z^_lA~;9>^D$zasPQ}L<@k&ZA2XdOBMcC(d6GZ^9(cB@vGic>%mo@}&8z}sJ+1OcO7 z0><%FkjjeUDaNoY5|7P_)abHObwWM3VmTnTi)aEfPH6$V*<`Va>=N(+uZZ3|jyWLk zK!r+`fDfIDS49ITLE-=}0P@#CdQ#W7Q&EF&gJuEhzv#o`P>ihAcVrG6y?fgFpSBCh=4DbK@c}2 z2orFzkQuDPVxzPc9X?~%NZXyp3jY%;LP=ap5u}D7Ofwx2okCEAErqZGXe~@6 zLw1zsVYC=d8q;yToFvS^gZzq&kFk%TGAV{(Tq*Bi+#xW6pa@rh1sO0qzmBEA&W<;xV|lW$2Fm?U6Ns#U9fm+z-ch|FL!`ps`Wd0 zx_%XV?5%^d#@tqT>;P_6I4!o_MK?Ttqy~axm;>lbw9lgWM_|{C_0vKWx?SEG0aA`k5BNF z4{%IZQu=a|T0I!|!R&~bL(Vz9pZojfe&f}uY;oh2c%5{259vMh7WwnJJF5ro9pkqz z{yJjYhf9gw6M4fix%(iGx;k-cajjt$e{(m$EGsU!p<(^<-cvalcRiaL(^zxo0|Wc* zH|xaIo}jFO;=VIaZT|i8`1tsRmF4oXymhtZm2u7K+1sxtp&;w^q41iGL%}ZVo5KBWCwOgs*Sn+9Sbp{Xy><0vtP+jq zh5Vaugns!U3t7}Ydgr`ntKzG9s58a6adB7MZ?S2e_j4woWkV|lD#Gz2(XDXKp2qjZ z?rPr3&7HZ&V@#i%_rA5dr~22*y67d}$~!CPvcd|vm7sS_;ybwqLbFC>$G zAM|w3hopCR#(J_ECgw-9mYo_lF@fi*Bl&FG@w&1RFM?ezmz1GZz#-$)d&hWNC$;|GBO8l9 z>+fi3D=O4C6uf4UT6*$}cU9q4wOG~8(jTTS?%i;4_HTXpzTU?CPa?VSuIR#7kGwI_ zb0aP3$xe7?XKrnnw z#Qwtu_F%MRdGB~y?%STXGKuYM6Qdv&I?&j@OdG>d`Zfzr--omqePH#4L zh{`v+C$16qXqR7p=j!@lrxX0&IoBsYp6Vi>3ckfX-_hmQht6l!-90sQ#eKKCQ`@f% z`Q2EpY3}-lOmTeN`I{uCdStNESBr)%AQuh0L diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_r_signal_3.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_r_signal_3.png index 5b2acc6784027958b5105bde05437d84daf7bd9a..78738ac73ec7285d16fe4efda92a9976c62d5ff5 100644 GIT binary patch delta 1184 zcmV;R1Yi5z54H&*iBL{Q4GJ0x0000DNk~Le0000c0000c2nGNE0H{6bu8|=pe*{=b zL_t(|+RRv6C~Q#}{%4GlODG04BIK5mT%J&hlsu^^rR2dI>YS#GPVvCYsUte`g5*WY zgC<2@M9Pc2D2Z};z-Yv{JP70Ntbb|k_Fl7Z_86VNR(tPt{r0!M^{;;|)BF27{Eub{ zwS$h1j*!}qjEsZ_*wWIH;kIV8e_652B%aE;x;m@h@BbYL1RUfu3}Th=_==B6@v&h5P&a3_^y}WHRAkKV^X>BqX#%MMY6i zXm4+CUk)ZQF%hz|vLG@t63)-h;rRF%2pRDB_}HQd%xbmTNTPryCMF~ue?B}s!0G8J zOifL}$;pW!Q25g&B_&|7d<+{O9}jnTcW`!g21HUe$?SdJSnx3;_n5w(Lxh8v7NLvoSzoM^Vnq?Z}iQsh|7GQFLCmU2wzq)~iYI4As zewfC1#xP$M7*^85e^^^v8#FaF(GJn!E-Wml0@I^0RnM=7v5JZc=R#t;~;tk%|6XlQ7F-Q8VqyWMbo zeXSZivOm@mzY=4*fT5G@>FJ?)#l^*tmX=1HsuD2PxfU>fe=3>AG=Z_gs;VkUrOL`m ziGbz88MTOml_@c%OZ-@wg}!2^$#kN`7%NwE7it>Q3=~<|tG49T7}IL26pv|cNw~_? zbfN^zsK%H+HDi7)#^lQMGA5@n)|PK4>-j^ON;UEGo?pzGE?|K`KvD@qYt}g*H?cfc zP7bb$ZJ9e_e{zY7ixUFKbuvqQ&Jbr%Hn1vwqtrl+SV<<-^I^z=PEJS;Ta+S-D~#zq=q zqm7P^(mKrW?1`+EmzM{%#iO6cn?8BbDy*-yAV@9mM yzdxjFsDXh2?Tb4j7LHK-ORhS@b-DacfB^u|Sp>*!JE08#0000E literal 2013 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 diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_r_signal_4.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_r_signal_4.png index f1ff54870777f925a11a0a01df4d426920866a30..ac881431aae2aa770465cb956bb7e510b334cc3e 100644 GIT binary patch delta 1129 zcmV-v1eW`$5dR1viBL{Q4GJ0x0000DNk~Le0000c0000c2nGNE0H{6bu8|=pe*_^( zL_t(|+RRuxNGm}Uy@@e?5G*uN2rB-yvG7y*K~MxsA)p8%V&?}R0V5Bz(B{Dt<)u*( z8?h4+6&pVYHe#V*Vd1AxB2O?;3lZaA=gwo6-OcQ7cGt+eFeJM(bLZ^2ckbLfmXD7Q z_#ee)RzX)+m#O&^6BE$^wz08ce|WCdYE|sBh)r2vUvCct0>46`kefVaev{Sw2?+@c zPN(zd=H})zmof4Mzthsv`p6(iOiYBBn3$*{dV70=hlhtuLWaj;vEX7qxWJN=lUw8B z;wUJT_xJZN2a}hV2aS!5kd%}JdwYA-6$lyd^z_uK2+VG`J4mB|W@ct2e+nNTAK~)y z66WUS;Ns%K5GeBD(A(P!#B}sIJ3AYK!5{@lT*@J_p7;R)q0b@3Os=l3XhXB+!tlhT1G~O0E$U|em-4OZXKH(m>3jFe}6yyMe|NgO;N=zmka!Uzi!5Ou7Nuf*Hi_@ zzDz6y1qJjsD=Uls5@&_8f3q_~rsM%*7Lu>432bn1Q22j+eGRj-vteWO?7~QaS$V+3 zgLZay;Q9GqcsV>ggx%d;!#<{mu`pn-udlQ*866#k`T2ROw6?Yu+-|opMsMRWhI)B@ znvCIp1h%!cMW36So2kDkv4Xp|r>6&|r>9|PXb4hMQ_VB>^70}yfBCzyu`xI~Iic@5 zJ3A#~#SIy)tE&Tt!vUqGrQq>+ggzz4FG46Dgk3hnGs+tTxez&C{%)cizk%bW2r&75D0F<#$SFeabJjr?XzY1H{60u~B| zB!e)uX3FJx6MM({N#Uw%?*08e7nqd?Y+3YzB^6kZRQpaYu(GnUKPf3GeR%E#0s#p# z(Ga|jzzZC##&2$JeEa+R{JRT++>5C&iS%wluj@PRKcEOPf5|z#aD061RWzj$86F-s vbqzH#GNOHPXGEfrihs#fXS6PtKLr>7#RgiA^>F^(00000NkvXXu0mjfCHxCW literal 2089 zcmbVOc~ld39v=~uLr^OMo(w@*MM*NbAklCnArMMJ2myo=+n5Y6LNXy4B(Pi}g4V7e zi&~%+XhlRtOS!D51VvFUt)Q?z6}wmk6;XDrB7!?naQ6>i|JZqN=68KQpYQp5Z+44C ze%6*tEdcyja(52W8fAz22ryKqfN~O5K*!T z;dCKcsNuq~h<}O}4oMM76)ABFrjp?032xN0Z~+yJ$w9p;Uae#4*@XAHEPQU~b<>H$Q%2IuH6(~gCaF}$xZb06m<0Z> z8=pk$q{$kXB!P8kqE>;|Biea}jOXsp4H<#BH>@Bnf)_;|&qEc7Dp-vPcx(cGLR2D3 z7MISU@|k=Oh)W?eJRpb(k(qoNgW*f@g(y@8ZARl$Tn{oGa;MPgTpFJbK|DT_;?Cgv zlF2lV2hW|xrm@7^;<`X#7kEh+|O<)y1M3kQ+h= zg>nU=Hm;53`4BA+)*{J`iHnV5QV~}(A;@cUow+M z^B_!fmH$u9NVqd3V{`mZv&?Ma9cY|>Y<+z3@$$fG{KjbUtFdqE+|2-B8X@5MNcFd$ zh704C`8gaalC8ZJ>BcF)fLPc`xWYL9vfMkL#ddqr8;>v>%9#}zhNFH11*P|YEWhA4 zasPO#06cfvvdZZfkN%cRLmjteU4a8ho^`cx)sc~FD)jQYrdsMK_1eGEJ9h=Fz1p1o z>*t1d^TCR`IgJ6`r>PD}lxx?graXPAN1#U$#V*gEZP2-%%J}Q#)&n)mO7Fd%r~b=N zN23g)O2u|dQEg_8iU=;T$$jVVHv4CwdS10@*N)5O-*cDU2QzMUe&LQfIggDUJa|g` zZD)av%I)dMNZOqzFAubsEp|L<5tXpK)XeAkHkE3m`ki|bju;IW1qFE}k3DFs+~afI zn{L*6Wn7>7I^_7v6{%ju7O`nX&IyOG*pAs=;n@rRmfl?XU1hq1>H?ZM5My%2J8AUJ zE&{Z~vpDs?IQ;-4BFB7*@Zy&l!qx%zAjDc3}MF_?|~|Up1e9 zw;IcFVmTCT6FUUS1>6viov(a<)e{baZq$8U}Bkz@h?| zUThIBiT-Bc!{kJOuE^I9{f7oj`;1XXQ_GDn<@jd%88<|YTJ{5L+YS3}z0MTww zeMLpZlaXx`DPd5dlf?NEOEy4c}t z(^cEk4A$p^f0%8S&@T!IdFLA;Nalxi>RaLI${*!T6tl9Kx0!=Q+X7rB?!nYle*-r?wNA_x}5RNXw{jL zS-hN;(lSaQdMJ+eB8GRMykPF45beo*o!;H` z*f4w11A;)ZE&`H-_FiAh-JOkPB~lpR)AO(qefw&p%xtX&7XvNvJj%|?fX8;iRig+hEUuFFVQ>#$` diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_r_signal_4_fully.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_r_signal_4_fully.png index b4fa4816eb917297e9249c42a387b20bb51140af..ac881431aae2aa770465cb956bb7e510b334cc3e 100644 GIT binary patch delta 1129 zcmV-v1eW`i5dR1viBL{Q4GJ0x0000DNk~Le0000c0000c2nGNE0H{6bu8|=pe*_^( zL_t(|+RRuxNGm}Uy@@e?5G*uN2rB-yvG7y*K~MxsA)p8%V&?}R0V5Bz(B{Dt<)u*( z8?h4+6&pVYHe#V*Vd1AxB2O?;3lZaA=gwo6-OcQ7cGt+eFeJM(bLZ^2ckbLfmXD7Q z_#ee)RzX)+m#O&^6BE$^wz08ce|WCdYE|sBh)r2vUvCct0>46`kefVaev{Sw2?+@c zPN(zd=H})zmof4Mzthsv`p6(iOiYBBn3$*{dV70=hlhtuLWaj;vEX7qxWJN=lUw8B z;wUJT_xJZN2a}hV2aS!5kd%}JdwYA-6$lyd^z_uK2+VG`J4mB|W@ct2e+nNTAK~)y z66WUS;Ns%K5GeBD(A(P!#B}sIJ3AYK!5{@lT*@J_p7;R)q0b@3Os=l3XhXB+!tlhT1G~O0E$U|em-4OZXKH(m>3jFe}6yyMe|NgO;N=zmka!Uzi!5Ou7Nuf*Hi_@ zzDz6y1qJjsD=Uls5@&_8f3q_~rsM%*7Lu>432bn1Q22j+eGRj-vteWO?7~QaS$V+3 zgLZay;Q9GqcsV>ggx%d;!#<{mu`pn-udlQ*866#k`T2ROw6?Yu+-|opMsMRWhI)B@ znvCIp1h%!cMW36So2kDkv4Xp|r>6&|r>9|PXb4hMQ_VB>^70}yfBCzyu`xI~Iic@5 zJ3A#~#SIy)tE&Tt!vUqGrQq>+ggzz4FG46Dgk3hnGs+tTxez&C{%)cizk%bW2r&75D0F<#$SFeabJjr?XzY1H{60u~B| zB!e)uX3FJx6MM({N#Uw%?*08e7nqd?Y+3YzB^6kZRQpaYu(GnUKPf3GeR%E#0s#p# z(Ga|jzzZC##&2$JeEa+R{JRT++>5C&iS%wluj@PRKcEOPf5|z#aD061RWzj$86F-s vbqzH#GNOHPXGEfrihs#fXS6PtKLr>7#RgiA^>F^(00000NkvXXu0mjf&AAIS literal 2069 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 delta 1624 zcmbVNdo+}37$28$#LyIWlG|r6Y-GM~?lT#gi(yy{OP51MGvAn5W=1m;YUC@GiY_LS zbW&|px+=G5qbMSE+Cs&4k@n;`qFA+V+m6bA?LYgT^Io3c^ZuUOd!F<3YO!KGr51_Ct57a~*W zbh-~f0wItHl86v#DMV+HNh}Zqz74#8zJ(DtKitR}1EedGl^RyMA|)&=zrx5Ft56W} z-$0Ev3YN}-PMYXVDKIe#)~GhB#jpW&o4aEm&fY*~WrGP;gj${`S0*I$RpN~bSg95A z*?5D-S0b0N=oB&;NJaS1yaEh7+_Zb+k&A%*Jyh zs`W4+lBu*RjZBpS@P4KMVF_Zna#qIs1AbrA<-=-uDl8EoYLx=`QZJVLI|1+^CPbnz zxe(`T<_rOi#Gui56nY>?W^k$aZ(Pa$sT$D`4MJ2)q%1zH5v%1XTDeMTz`j6He8KE7 zefEVFur|RUEKg5K5GTP}09H!acr|{xKbv;o7z$-_Q^@B;r}qpMUJrK@+Gh8*#CepK z6x{u7+l<*q2TTN51N03l1G3QWy}`hOx_JR{U7041NhlXi<0B$nbD`hi!({z@dkhjb@wx zG{>KNPd4Lpk-RFVq@=_e6$zZ!la`v=ja!uV$j~`4tG&SC)yL~YxxWvZwv4`db)tE4 zzV6iJ%f#osy+>b9MOQt{NfYaI%XV6Nzn2!NpFh2Qn~%)w^N5Iuu#=MY!HndkI|!@a zwY3Rd6wj@DcAXM=b=uK=7GG~@C|qfwx@zeig3Xs546?L2YTNNCLJK#+a)~(Po{Q?;%gi^`Hqv$oSkA#2V1 zht{rHGjU-YcrS~Mj*G8IluD;71R1DzyH`k}#j@d7Jp`TiUQM1K+s)1GN9%LI=CQFc z#L3Z7;&pc+uBKvi#0yAFO!U1(6HZ()sEklZglKf#n=m}l-t+mJV(FP9Y6nc27s|Y? zdVM)Q#z*g2`|ROQU2(>mU%<{LOHO-}XrDP&0_4zeIGoeR(HyksevLwfATP_59jUQ> zH+OJw1v$)*XF57?x0DkNf1;_8)h@AV8+74qkInQ)M$h+PdhBI+eFwM3Nk2ziH?uD|I6McPsi{Dxm zjGf%qpsS+L=yX`U^T_5WSH;kFU*uwu{Srz*(5~!kOvcNATa)eWA*pF;wdxHU5^fzu z-=4yjQfV}r+V$zK19~6s*~-ewemo_pqHRku^`D3G@ fxm@;tMlV7!&zi`(-k!K(_$*Muz;OO0ZhY3i?n8;; diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_flightmode.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_flightmode.png index 01c7e2a692a5a2ae16c546c4e789891eeca30719..7a419f1616e0a30d4eb9af26e71417ea3af9d42a 100644 GIT binary patch delta 1473 zcmV;y1wQ(@2-FK9iBL{Q4GJ0x0000DNk~Le0000c0000c2nGNE0H{6bu8|=pe+70) zL_t(|+RRu>NR?X@UcNQ8Bt43+O7Tg)LQzuDi8&C0&;kudI&)H9p-@mz&9&N-g0aW`zv+5g^a?QgHgx7YuB zoS&c5|FL=hs)D+@x?hs->FK!~e_-$4y>naE)6>&*&O>!&NlA&X)oT6o=;-L77~c3z zURw(Y2zVPF9^N=UK7L|oF>!*&*Jq zt5+#AGm~<1a_H8rTf7(c#NMVc=IiTg5uFv7wJ%@3P)kb-<>uy6Mn(p;x3`m@pPx$> z!n&-iEb{jLcUyq`_U#*e{P+=`u$Te^Ah-%9Hf#I)`wR;0?%lgQwpc7K0fTiA9x|?B z1juf0Z|jVq1Lg=6+S%Eee{SqdMvW;I0J0K5wa<0Hu)x_SS_Q5gMqR7Q%dyeE7XoJF zW{hDqS27c8ReHkzUj_yx-@kv?0YD%lfc^dbor2R^%n>k8qtk0UIP2ixfC0RE^~z4c z;NT$7p<|tqyxO(&A@_6&Oxqy@K;Wz1-d;*hPPS8kabI5_iQ9tLf4~ahDRGN%_JSg$ zE;DX(YB9;^vY(usFdZBpAJf3VfDV)juD`#Zfq^WeqoWxRsNl|>J9avaK*>2%U@Cf8 z3LD|~<;$0pkdWXoegF>ZzJC2mpFe-LStvF(*3@EZjA^soQ_D#*rr({U8=FOWIx|nf@#>PfkSXf|iDk!5Eb{Uui z1xp!$5~YdVcx-HpV^M3lrluxZSy|y2btT5Mz;rwYuIlRQvUA_`^fZl(jL^iy1Z`|= z(9X_|ZLXoAfv=XLq9UrStfb=NVt$^KltfikRWvy{Y0Egbe|b!r6eSHBz?7DjQgwAT zTL!|Bk&$)^kaePDVE{EXHB?($OS7}HJO{dfHQk9ZZ!IvK{=tI>Oqjd7yPWo-!sL0l zxvZ?rPC;B;99IWmeXK*_*xlVt*RNk^i$q05*{DEEq|#EDcWN=Tt*tHQqVn=`%FoZ| z%mS#}w{KHte`lwig68IC-ds`(N}I&QM6R_$LPFS@YVf;lF_a-GDJhhfm&eaSLqqvQ zpFVw}H*enXov1d9U%Yrh6%`dUH#f%{!Fs5*_@zSpmzzpgYGcgkO40>C8sbPQz%v9g zf_r{`o?VULfB*hHgU4DZe*XM9)z{bSHdo6cEs?5$fA0{ORH~LY_z$Z*di03rkgaKH zY3$zR8 z%<3_Rz+_e$RhlwRv`Xa0X7j47QH)7hr!~Jk#YN&oop)DO`wd0sN@S6$0AsB?%mP?D z?@U&;f0|3c5R7smcnG8^mBZ|q!#cPfq^fQ%=N-vH4!=P`LAHd@0`oKihOz}hAj;I# zR9ahGvsncfGfs`S==Ah-4*m}xKG^0_Re)HHWH&cA`9?wVfUIL;Vwn4+mrOsZh}5@= zth0cp@CuK+4u#+F@UUG40m`^{?;c-Qqobp=f4aJArxY*3xI>L(k=6I_-{*r*O-<3v z%nVn$;`-YW1w^a z3LXmcM*og)P{J^qqM&>$Lg1OHE8S_Wt*vg$BCgun+MIv5bEmocZA_($OZn7!Ss$1G b7ZG3pK5yMP((WhV00000NkvXXu0mjf9=qGE delta 1058 zcmV+-1l{}83%Lj(iBL{Q4GJ0x0000DNk~Le0000T0000c2nGNE05~p?VUZyxe*@b| zL_t(|+U!?vXcR{jf3r7xd$-A%6O#rEiN%QagNLB4G*DZ1h>~Eg~eB ztU^@Z|KsP4JW^S$v3#Opf4_!wYc@Tb!J#ww(c#$0k7rHWy2qvK*w#+CJ7bl>n8m z7oO)`?&;}idz3O*u#(I-?+#w9cc#XkXlhBmoy|b*dmd(GCIztjf3=nloU6U_+r@g_ zToqTq62kRBxB|$XZVtr~t^2ziN2{2b$y~qn*Ki+^3B;|TezbN9vRNK& zJ#@6ow#F)43Kmv=f1b)azg~zo9Y1w4J#Gz54F7(~lQOM5x30EfeNrOnXY^gi-a9&qggjgZqL*VO(u_jaHq3CB-Ce}-$IZ+=eNSW7|}W>wpF zgZ1_MxE}&cLkDYgcqqKRG5`7^e>6O(Dg@4?n-EzaQkZsX$3gIYLu1m*aL29Cj5;uz z4}jCx2}VT(?1@oPj+JxDAVnX!GOBstT<8QJQ~1)=+XtWD+;Cb+4?;L+gf(DFE@8pX zxyc8Eb1-xUc$5+%H91seHs;beN2c<>Q{NM1pXf@?NGe|qsHCE0%oi|zwLeQOfpj@i zTvI50E2qH~(#Mz7p`UQ^WH4Sbeew07AoHE#XyMdS>9OKjrKDv^Iakf)xwWlaidRUN cLLLY(0BQf*$KY*gOaK4?07*qoM6N<$f-g=8ga7~l diff --git a/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_null.png b/packages/SystemUI/res/drawable-hdpi/stat_sys_signal_null.png index 03d21470d89a7f73e9864f5a56539fbd03131ce4..1adc05aa08312fb3abdf4372e8246e0d5bcacfc1 100644 GIT binary patch delta 1283 zcmV+e1^oKy1DFaSiBL{Q4GJ0x0000DNk~Le0000c0000c2nGNE0H{6bu8|=pe+0To zL_t(|+RRuvNMuVCz3sj$XuB{v?mKQMiWrF+iD1ytWMXFG_=C}(h#L68=#PQ1CMHgx zCL(Gim}#WAuOMo>;lAsyQ=fWNzpnTC{Z@xxP;|d{>sFn*_td?&p6%`JjsB0#@4XYW zw6wfSe_&wXbAU}vO?j>Bl&cs`It1Ig2>f#nj zN=l-dni}o~SP~7~=L-4T1>R3rzhphJI8@9~RgG{|vUWj$;pF)>loFDWT;k*h!nnWb=n*wWV4M)C3S zG&?)%qBJ--NZZ@nf84b=o%+Zw^9Uze%xT6k({KS_vz(xMWnkVWW|=QyVI!GkU>{L2=-nmwqYphY$4r4?kQIyN=jT&KMh2gFX=#bJ zwzf>8yA_U^23RW=!(k{aEYzM65>OpnUS29KhW{VJF;ABhf1EmbcL*0qRY*@N9$|6e zN_`*|VCTn^Gky3oU~sDM?# zd{n@2`G8VpW+vt4=F;BYo@N!)Vc2y_N(vPe6!18=f3dNl$yZlbd3I3g?(gsOYauSu z$hRmck!yvQ3_q#_1qC@{Vq)wl01;r32XVI?85!Z1ThY?e(x|Skj#sJU2#U!GaBL} zKH$K*SuEH7WFXbwE*SD3+1c4tRaNC+=Kb|fvDZ2@(mCigIMGyDbl!!fGSNC zmnJ+iV?nf##aSMTC5w?p%nXmu^Lto;&-0x7Z<}yuun~HBP@afY@Huz{zB^H?Sl{Wt zvn(qy4C4vn1vfS5VW$EWm#a`_AMOyhPm)-vL+KQ zP1B#agH7S$S{%of9|D`JGAE%b$htvEu|q7BQhT1arVP?iMz|m;4Cn!uJ#uG}4_2qW z_ckr~pF`DQh1=8K23uQ~B&G5!|EVy36pzp$>|1~V0804>$?t|4z5oCK07*qoM6N<$ Eg2aQ&U;qFB diff --git a/packages/SystemUI/res/drawable-mdpi/ic_sysbar_noti_avail.png b/packages/SystemUI/res/drawable-mdpi/ic_sysbar_noti_avail.png new file mode 100644 index 0000000000000000000000000000000000000000..9123fef48c9688c04afeda751e006f0c4891f79c GIT binary patch literal 247 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA1|-9oezpTC$r9IylHmNblJdl&R0hYC{G?O` z&)mfH)S%SFl*+=BsWw1GGd*1#Ln>~)nQ6$^pdi3<@J2-3+r<^y{hRhp63X;>Bf`W{ zXtq%KVOz82fnyS9&qSVi!U)s_1Pv=U+xdRDS0A;Y_}z2a9jV^VR#%s1w%jUru*zGr z<;8)iiwi$mOR**daEs2pIMHf>?CVQn3>hN5Obu=qHKbe@M{x8my0|O*X^Fy~TFnQ1 mDMvn?WQUl{z%b>xNCLyJbg@-C-FG;E1U+5-T-G@yGywo85Lyoa literal 0 HcmV?d00001 diff --git a/packages/SystemUI/res/drawable-mdpi/ic_sysbar_noti_avail_open.png b/packages/SystemUI/res/drawable-mdpi/ic_sysbar_noti_avail_open.png new file mode 100644 index 0000000000000000000000000000000000000000..8e56f2a9240783e1a46df25cbe78b6e986330d11 GIT binary patch literal 503 zcmV7c^=Pm#&IEpV#+ovCT>Q+ z2p9n)U<8c7q^;~5aDDsps^LJETkbn0KLYRt1kn~ZSMKiw;N%=*BNn1RS0E9c>h7gzu#}5ccXyflnVH?JkZsGVl;T5eUH#h<%oIWL-p*<$liO=}W;!1xKUI;6~ zBmU>86dDnTE4>fL??=wd3q&K5YBW@cbD+YCk8L&PO3JT)aSlj{^BH{dLPCQ^4sb%X z*q4`tbHWMXP)SDL2v39u%+dC#&o%@$BhX-y1)Q%265xg5q*afA6DM#SzlTJtA+19r zP{GkPo?UKp(x+}AsX})n=fF~^kV+D7Mj*%gS#ktSMomUdMomUdMomUjYgSISu}!Lw zN)mI;`hk*fIdVz4!dxxpR*_LJ3hmf`&QR2Q%?NmLpfw60-cCNllx*z;~eO{ tpV^f;`$}m9jDQg^0!F|H?9jdi7yz%du8v`+fSv#V002ovPDHLkV1hdC(trQ} literal 0 HcmV?d00001 diff --git a/packages/SystemUI/res/drawable-mdpi/ic_sysbar_noti_dnd.png b/packages/SystemUI/res/drawable-mdpi/ic_sysbar_noti_dnd.png new file mode 100644 index 0000000000000000000000000000000000000000..80cf99c68660a1cdd69c4a3d5a2ac8b238b9793c GIT binary patch literal 393 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA1|-9oezpTC$r9IylHmNblJdl&R0hYC{G?O` z&)mfH)S%SFl*+=BsWuD@jM|%{?9251a5^2X7ag6YZGz#VwP2f0&o`zhnBBtz$J}ry4Ca-e(>vXs5NHysGbr zzwP&@d{-|7EbZ4!sZu!D_dQoLsr1!)&pFJ?CTdODny)Rex|FH(Eu*ojT*ju_^S*Nw z!&+~gV-RvI(teQIU>Nm#jYDqlHX#OQnUs547b2!=u-8v5V0lrZ^zSs&zrB74KY_fL eu;!as0>gv_=}Z%6#z+Fgmci52&t;ucLK6UIa+Fs9 literal 0 HcmV?d00001 diff --git a/packages/SystemUI/res/drawable-mdpi/ic_sysbar_noti_none.png b/packages/SystemUI/res/drawable-mdpi/ic_sysbar_noti_none.png new file mode 100644 index 0000000000000000000000000000000000000000..e0d018bda2c7c065dfae00f3010a2fde18976042 GIT binary patch literal 185 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA1|-9oezpTC$r9IylHmNblJdl&R0hYC{G?O` z&)mfH)S%SFl*+=BsWw1G(Vi}jAr-gY+}Ox_z<|TmF*!BDEh*Zjxm#sZ&HCjQov+-> z`zOzS`~j#G3FNWb>}C)B`l@H*%!jQEb~-x6NRlAt{w*vL43FHoqSx!0EdU94y85}S Ib4q9e0C{aRB>(^b literal 0 HcmV?d00001 diff --git a/packages/SystemUI/res/drawable-mdpi/ic_sysbar_noti_none_open.png b/packages/SystemUI/res/drawable-mdpi/ic_sysbar_noti_none_open.png new file mode 100644 index 0000000000000000000000000000000000000000..5db8c9cf3d8426900fa6ca368160162a8c940ac1 GIT binary patch literal 393 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA1|-9oezpTC$r9IylHmNblJdl&R0hYC{G?O` z&)mfH)S%SFl*+=BsWuD@jM|l z&L4R3R(rBro}&G$DKo{i%nMF_ahzBMTYlLy;rIP7!IjLc6z;7crBFoA@hV4N0u*= z+_Ts3tGZSkIqXW|#9EiLoAkM-UEkyf_c_@ZlxkZj@pbzUNin97!` zd;Gaj6u&NjmwW1NmFKsZHOuzoN-Iwbu2&5_ubXM0$~9$c?rDM7&smDzHdcAvxtQ{L z+Uy@K5v)no%n~d+S2jH7JC-52iD{`+t|h}RixW+u3xcMe*!^$n2i5{B!Jp<{P~X5k e#`{+F0K?zHvlY{YIwk?bmci52&t;ucLK6V2>72L# literal 0 HcmV?d00001 diff --git a/packages/SystemUI/res/drawable-mdpi/ic_sysbar_pocket.png b/packages/SystemUI/res/drawable-mdpi/ic_sysbar_pocket.png new file mode 100644 index 0000000000000000000000000000000000000000..90dffa973c2dc9ae8b90d6a6146abd9a0edcdeab GIT binary patch literal 509 zcmVFdrP+=X(GP-y3@Z*6fK#f0aUO$dIB=J4~qMTm`f z3aGKisE;5{8Mu%w;TdCI2)i@HCv^&)NPXb@j**U-n0)HT=mSV@@kUO;{^;WCm$(PK zxry8ZB0vO)01+SpLZ#C_ZdT=zP7f7eice)vb~%O(gc5$cya z&aJ`Rb?6wVka0F1UAe)W)zAmWBy&f6ngvaTu3KW%mLDbh%-9k;U$MD^XQM~J>|Ej~ zU{q1pS2|t0EH3we2$+B^Ms^f`D1m>4PswiYrFRdO3uNTHqB!r3|_#}K17KP0M8`sB2AobU6U z?d!Epk|d^fEFZxp#XyIsw@E%iE~_ITZD1a56YyJCcs4qA@}1^AqU0H zXe@~b+lJ-d?m~aNsuK~fHy79Oyhqkir&$6x`42|Fugem!cOkS^4xI%oKKeEpk`SO9 z4;vXm(i6J*!wESB;4Z|J@v8|TP96xv08bafLnbS16yh=5=izlF9!PDYoG{F;cT8EP z5EF5JFZT|-xAQiddl7R22q}aCXfz#=<*YCIob+d;Gnk4K7l>0yyjHuA6mrzs2xdSy zM$*EfS>NNcoaLR`Y@?r>mRK9h=|Ffy6_+R0D?bM$Y5Rr73a|pK04u->sFQ$HI_(#5 zvidpG>1_qb@&`xA6Sq7fFgxXAhRV2Xn=u^IPfQur=^@sIe83g9U9CjYHIz^EzMT9c zwoiZ`Gh(Vv?~)4z+Ut;{3tWt37rfXneHRM(po(NJRvz?@Ga6{?BrvQYy{{Ay;MkR9 zqcOT#&c3UWat#9XzB?6li%O?gc^+=h0V|*e=Gea)SOHc*v+YZO0RZ|d+ykdJqAUOa N002ovPDHLkV1oNf1f~E0 literal 0 HcmV?d00001 diff --git a/packages/SystemUI/res/drawable-mdpi/ic_sysbar_pocket_hidden.png b/packages/SystemUI/res/drawable-mdpi/ic_sysbar_pocket_hidden.png new file mode 100644 index 0000000000000000000000000000000000000000..93b0d238fb0ce00df104210fe722317a1da1b55d GIT binary patch literal 696 zcmV;p0!RIcP)mGx`edX(cIHehlAp?wHG%Up#=s41A&3SKw#jC8EBTlKAX*=!C(-@aoj3nZ`&kEQmohO zY%-Z-_S$!{cL4MG{HELO-b#xOheP|j4P4fn&1RmaX|~(#((!n_b+J($F9u;A@Hf(` z0uK;;;S=BNq2OG`j*F7&P&QeX!MsjYI+E31uSWpRrQ{U=HNV+xPG!^SbRMgSV87r0 z#SfYAJy%{OR0Y_oeRyTSXLDimpY#`Oed;+i-5iZ2!YfUz|SfnUO2*J z&S8UD4qvO)`a?%Ho9I1g3CVbGuIcZhD4yslAB2#1zzO)7YCpKGzb|J=8k~hK_edn;*t8{ys%!jRTh8(kSxTo3}7Gn zqpDUiRvv(&5}@y;rE*>4)xQTq0CkmytKX0TSElOH3mK@3Sy#V5D+79+R(A9frgE9l z^dT=l@9VTz2Ke~I_ZtPu<|Y80cO7kee6xqEJ$l|3lf`0jD|WHmbt=7v$mMS@ev{E? zlmg7Pd1U~ntJMmIlH-Q1`+TXV;E%q))U_8+-+1hW&*bHDSqz86M!(TwcaqKjfS*pMWWlR>myqfG+(%vx`e*;D>^0=FA9YO};dfvlFc26B e30000-ER$ zikE#}g(9`@?1MVoyTwbPy`Cr;yPT?h0LcsO-9Su)@J1#36gTr$J zz3eMw331F1C1V=cFYGcJeH8)%LN|>CA;re2*m$ari1!a}w3o}a2k`_gqa*}~cSnZD zgxk~UR%}!!QA_qdu=Z6DdIzW0DMn0i5PUD$S0kA1~HuL~k2!71p zkbOFB(LlWz$Xh`>hAHOy^xLIq%pWm2OI}JGk7rHty5+JRdo|i8pyzTC1%x`(l~qpL sQ3mIIfCVI=@pobtzyeY(;75P~01;&5uPN_=cmMzZ07*qoM6N<$f*;-vo&W#< literal 0 HcmV?d00001 diff --git a/packages/SystemUI/res/drawable-mdpi/stat_sys_gps_acquiring.png b/packages/SystemUI/res/drawable-mdpi/stat_sys_gps_acquiring.png index 07f0a0a239af9957bd64fe36d5a1e2a97e81c7d1..31bc94ec1e564acc337d9a6457b674f99a2f1937 100644 GIT binary patch delta 569 zcmV-90>=IN2Gax~iBL{Q4GJ0x0000DNk~Le0000P0000P2nGNE0L1BqW04^ze*yJL zL_t(|+G70w|33q*0TTlqz^EmomJBCLyuG~zX=;hDuP@)5H*emVnVH37Q^?53$V{;% zJUl#3va+%aLPA0dY;0^2(G>!VpT87a0yM;pi;IgvSXh{WgM(w9xw$#mA}cE^Hhq2l zUS(zFlO`r6$rM@g=g%MGzkmNSe=spIG4S*AGqAI>&(qP-iTeEcvp6p=uaSa+f*DYJ zj=Q_NF{zfYAX)N*m6es@=g*&@@Mi!T46<-8P^y}flQT{KzkY2c+b6&{+5Yd}zrr6se||6kX_znv z5F35}{$1+L+c(E|?AQ?u495Rt#|bd94+DeZ3&`~#-yq|UA3sVwdGch9s+w9V(8r8q zTe4xph9AJVNQA}(iY32)|7KujW(Ik8ro6m->W?4a8OhG^K;NumV`G~yBO}AW!otD; z3OX1DMmoeI28Nk3GO{Eke`QAWIzAyGflWX_V8+|GZxe6by2bF~#R~>d(uM&L8yNYZ zI81%_?%f=+EP-0Y2+aL~K)HE9gZP2*!2q-rECJAOjAJ=z0>K3z7l9l3y26l3=|~z!$fK%7{$aYHTYQ=gRa~PxYHP2=mrxF zfgmPoFwvDp!vb|9Mp=L)Mz8{EwBe&PfGDL^pYJy_PDMouhJ`zQ$;rEm`_7zu-kFOS zWAL{R`o~CGTU!_Fxu)y-3%A={e^*vkwqS!X7z{2(;#XDG#ZmXC23%250T| zBaWu&$n+L_vRyI!MpDB^(2?h6%V!d*j*fv(lK>GFAOVEAl?s)VeL8eyzZ@9OL>*EFpsrev7o zEfBMZIbMZGLR3&9fV8gwsx%*5ksX{t6--iq0Xo{=-aZ&p(#2us+1-hV6@!k5Ch-)b z`FY^}fNtdl1Ipn9#-5aym$%1A4$S;)r5ir1D#XiOZ3gq?v@`{Fe*>ONLNowJ7Q9BG z(ljb1i!QhQoY(7Zo;4QHTST_4!5>SUX&z|iSBlC}F8|XEVzt!)Jo9y|0wanG4fo7v%!vjag)g( zmsrBRbwBF?CDG5qE9$kuO()U2VwG7cClE6lsbpWG$f}Z^ozaNI{!?jrDEiBZhK7b& zEzI!KpIEUI7+MPqpCCjJIh;usiq{uEDk>^^I&T%ovb@mkIHnwJKX8<(Fr{=-5QP6_QGXL)06HdVPH%_T;s5{u07*qoM6N<$g5_q8pa1{> diff --git a/packages/SystemUI/res/drawable-mdpi/status_bar_back_default.png b/packages/SystemUI/res/drawable-mdpi/status_bar_back_default.png index 5c578022412aa46a28fcdb291d5d8f26e62701ff..f99a66d305f9bfb81e9b3eb836accc057a9328ee 100644 GIT binary patch literal 48936 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 b{NHV-=AozN6mP+-H@)Wh&iDCB8kX`03bm(F delta 372 zcmZ4SkExG&f=az)iEBhjaDG}zd16s2gJVj5QmTSyZen_BP-QGiZ?~8iPVq|W^A)OOK!88S4u|f(knw%uQSVtEBzR}KHpAW1o@=Yzr9~Ue?(;tT zX(iP#u`Sd6n7OgAZ=n2zummCqy$Z{nb(u^Ek%;(uw1y zQ(JGe`gB~%ao#Al_^<(QA)kz`b4nGP#j61IjbC^sO8@K%*gGM=WAnLE-kZIA0&}yC z&1bbn?%TF*v0L>0gEwsD`gTg4+Pb}pZU1#fgvUUvBU1W|Yz%*tt_xOyf?#M9N! JWt~$(69A>=n3(_o diff --git a/packages/SystemUI/res/drawable-mdpi/status_bar_back_pressed.png b/packages/SystemUI/res/drawable-mdpi/status_bar_back_pressed.png index a2527b3cdd9c47343f6e7d9b40adc22f5e41a274..94a06494bea3824ea27da63a2c3408e860331dad 100644 GIT binary patch literal 49157 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 delta 3212 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 delta 325 zcmV-L0lNN%1^5Dx83+ad00374`G=7qCw~DNNkl9$;Y00000004Fk=o}zb z3+5ec)wYgO*H|u`M-b;~0FLl$5$piY z@M{pP0EzJ55NrU+@F@fffDRnd@G%4zV5SLY$?%cGjs@U86Q;m}+zMS?e`e5;{ue@X zPt-4ZkZD>el?h<^7CLkrF8}}l05Sk=%aLIY-ST#C^E-gcT>t<8000000ASC6rvL*0 XL30)6>zz*=00000NkvXXu0mjf$QFg( diff --git a/packages/SystemUI/res/drawable-mdpi/status_bar_home_pressed.png b/packages/SystemUI/res/drawable-mdpi/status_bar_home_pressed.png index 9e64fe89024b4e85c44ee6cd13a5738f2a4d6f0f..7e8ade56ca33567478246d186ec103a555cb632a 100644 GIT binary patch delta 597 zcmV-b0;>J38ioas83+OZ007uvZqSh-Cw~GcNkl!jHy+NUX%O2uMvHk+N#=Ugs#I-QowCD}gF z4vpLGuGMPsc)Z)~_IkbHaEQ)Ap%4m%z(=!BAO|KK4p*zy2b(ne5GVAnRx7Lai8LBm zQ!bZbO|#kDY&Hm0qtQqt5|haU5Pzf5C>o9C^Lc`OBF&~`GO4O+r_;eZ5Gv5fcY$d> zp966)7+@s0t=cD83QRB&$n=+XUGWuZ_Kv_N!>@$gw&*#%<@NOiH-lj^Wg3jkz z;6SuMtl5{%W)Fu0V`8BKB@u|(#NOTS_uK6@J`SM*9LzGB2&W>E2+Z2;c7NmX7<{mg zQ8N3E$0G&EQUSFw^N2WcVbs(Sv`DfJ}18@Aqq# zX=N~-PFpHn>Rs%30TxT6?RNX)VCU<#kbRh}@3Bh5Y6NR&G+5Sf8@*l&erul+2n6ik zRZJ_S^qZHj^?GeO#`$SCMnVo`dQ4fJz&7wlT=Ji5lGXiXRC|aQH0)KJL8$uV-A=yw jb8&HTadC0c^(DXn(?4N|Fw*oJ00000NkvXXu0mjf?|vke delta 3345 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 b{}*5Y2$F^F3sOCf00000NkvXXu0mjf@|#{a diff --git a/packages/SystemUI/res/drawable-mdpi/status_bar_recent_default.png b/packages/SystemUI/res/drawable-mdpi/status_bar_recent_default.png index 4dd8dc72597b914d5038da3dd5bed8fc911985cc..7de67b069a4156ed6ec544a0d28f07fbc3fc4007 100644 GIT binary patch delta 280 zcmV+z0q6eS0?PuB83+OZ007uvZqSh-Cw~C#Nkl#KtBrkYmK12w(d!G}G2GNPWxG0xS)tVvlx`|%Q}4=M1I-5M^*GTA&2QN*_fP~{ z>r*HTH+7t{KvM@P3pa&(=(>S|YHFoa#N$fa*%-66S5Qq&l{r-)R1|MLT+=k+KMDW< ez}h+8ao-U3d6}R5ZxG31Hz|+=yozcq4y?|xTlGug9 zB`jeZW?$fyX%xKE@QiVOV}r)8=Y5YI6>9#dG(4H}I?9X*Xc7oK_`={aUE;2)Rz<-e!ZSJv-8J(#?C-hDoLz_jVca?{Wg%OB27Ud8m|WIdPOoX$Ua z-suas+lMZV^m12Y+3eJ^&S)jW=8%7D^Y)%_VmM&AVgK5E*4ru$uc8?Zfo^-ky78Iz vL8ULH_Dlx~OjtkUi-4UBB4Q*Z9_Sxn2yA?izQr(QI!MUV)z4*}Q$iB}>FRuW diff --git a/packages/SystemUI/res/drawable-mdpi/status_bar_recent_pressed.png b/packages/SystemUI/res/drawable-mdpi/status_bar_recent_pressed.png index 350a3e9e76554e652a2c68c21034751d69adc659..7de67b069a4156ed6ec544a0d28f07fbc3fc4007 100644 GIT binary patch delta 280 zcmV+z0q6eo7s~>W83+OZ007uvZqSh-Cw~C#Nkl#KtBrkYmK12w(d!G}G2GNPWxG0xS)tVvlx`|%Q}4=M1I-5M^*GTA&2QN*_fP~{ z>r*HTH+7t{KvM@P3pa&(=(>S|YHFoa#N$fa*%-66S5Qq&l{r-)R1|MLT+=k+KMDW< ez}n-&;0P&lA|#tQHjCgu?Agq{r;2)? zIz3~-9iQ8M`}Xbrs_Ls}yT1F2Uw(btwo0q<>b=YMg!i{j$4_`G$F{yz+3&sf&VT2& z+IYY9)_9-(_#eFrFMlDTEA473H~$lD_vk4HQn`8(OSHE`}9>0H|K?`XTV zMz_@$ZwXkJ#efu~08ZdzD+2QOyy#Wr8Y%?A7C8vGO27gTbR^si9vjHH^j=W}E(PeV z@oDsnM&g$4f{WaWjrMspIuYo-Zhv;;;sP)d#^Zu?6{L0(LM=t0-CA_4>G_4tK$j5c z3ZDf*!!IZbbb>OPXx=P^dY-(10rGEvfdbNfbqig9J4PhI3((s5MhQFvHi6seTcf*0oO*IWR=|`1K=faP>qH^?9+QATkeeAv0K4|dS_GW03FK$3Lahr{{=8+W z%;}IsMOSx)dh+WhXo+sw$!2+ODh5bkrC{%IEc$%5`wxSVxzmmKytRfeZl^xz_<34e6B6)*_ z2m#1*55}7rk$PjTb2x2o>8#;Z*)uWPHUzLQs>kAp;B|h`i0;D4ZCuFW9POF}HA
Cefu6={z<7N zl_oXbT!5FnmOz(&d+j&tS=H>tB?Y-H)hr)T4fC5>%V@2md4FL@UBf$Wo%8ea@1LH& z@`JkG_S)BGmCBUfLPV&+Kl+JLoLPyp6l)Sqm>Tt14_vMZg$UTi;c$5W^70Z6mzU%6 za2T|O%S+lG_}GDtUDE!6_u=N**|$zlQ8Z-+*}rga0kmVrKK&88aCrqq8LWUdK0_Ux zIZ2!3u)<_!7Jr|~+~+EjIWJ$xZ}b}Sp04k7N{XD-U{bPgw+YS<&f<&tiR(*l;C{!U zkV}Ksp}cl}{$t7oubV%3JaA6q>FKFwl;Va;w)R4D9hokALMw9p?sbY|J;%d|_!!4u>P$x%2tA z?%cim>nOKP0`tNGfeHNI!isGH4pFxYKcq6Gcg>`9j0*zmAL`JYK;U84{VFgyf)=AL zfGR`det!~zBT-f-I}$4=MH9$*0dP^SY`1*E;Ch5LZVoEIl`cY?F*wyrBZ6AfROz0I zHjBlyEcJeF2wW-bFM6HfR?tLdQBV>ceUG`17<}DfY*_s!EMOWh9vy<`1Q@6){Mwsu ze*1Ih=ijZf&WLPZ)b%rvtc6WVvS*uu?t3tk|Z zv`w_H69WrTr9A)avkxCUc<@)PHa9EYWV8}f4GxouOT`KF#V>yeZr;2poFH(5>Zle7 zdWlaAFEto-j9u`G_HADTs1QwsPYZ0xK7R;=Dz2)$)p%7ksZrRJcCqD7smv<3MAUGu zAC8A1p_qY5x|C}doA=~-kuI~AQw~yCcLCfAjKGBeD_xtXYH_rqggza4=$OPO1||9j z>n3M-W$sU^aJ{3<7$qex8)#{mB}*V%!jHKX#4^)=a7!954%{fr`4ZL&3MKh;9)EXq zwpy34YhBtDpw_j7WC2zSIJY@ugVziJT&8Ygv4;5!z_fyd-0TCKm2gQg*4wheDv@EiSo|BKKbP1!E@1Z zJ@{pg3TB1DK0t!7_D30VeWOrIqdxIpt!wz^L?H&-!7^^1mRZ|bmcg7?x|*;E^g*JK z);E;Y{`2JV$A20UaUfdGu?ix-mj!V@5FaQr)T1>CA%xu6Mj;$4#LUe{eSdR;kkUaZ zI}y-Y09Oh%F=JK$7=@mP$Q{ttB2poUA4|0$6e9Xyq7C1eSS=bOXYCcs%G0ak$Xz*c zP0xvw?8bH6XVy7-cMVJBn*;!LZcexsUWGzKxdC-wC5rZWeT-Y=Na~l7H&RTv6>y@}&cf zIs#9sC)@T7OsKJ7WZYQ+|IZg&V0by4>w7EMB1w7om#hI}u@2?0AHDtd7i9V@1Kb{S zPal)ZvgcnmUX+4u;l24n>IKT)3GzgD*Mmoe8T*)kFM=p_RLEfz8WQS3DB*K@^R4gDM1Lg=$DS6Ez8}J0Hf^Hi zr>b=VO^dtCqR-;wk}e2=1uZzid*CIB;r~IQl1Q{zA)MK1Wk9ctb&`*`56oF76Q^9un5T;Oy z3Ibb`mk*?bK7S^JYrmQ$ghDZmF4Ko!Y5~`KNdh?V67Hbm_biOV@GI3#4J^^4|}ZsN|tEhR13jA0kfy(C1K0A+ShO zMC%$k*boAk``s!}S~%M9esCUbC{*f<{V4^ki6Bp_)_(^XW)oPZ)S-Rbx>W!@wCc>U z2!*7IXcB@7`!GLfZd`gbw*qUtaV#z2y!PJ&CTpto6EQi${YZc2GYm=aN^*l3;4XA> zOHA-$5gjdZNuWZYxMx*CDt}~<((*t&7mMPq#G@;m)VD}fa>=m>vGB-!Vxg0V(Cil&KLt#=x0n!D%ZPn0a3Q7za5qLz&mvUglU`Sa_^$v1 Y0JN~+&%FhB761SM07*qoM6N<$g3`>xBLDyZ diff --git a/packages/SystemUI/res/layout-xlarge/status_bar.xml b/packages/SystemUI/res/layout-xlarge/status_bar.xml index 295c79b72a5d9..429fdf2b17369 100644 --- a/packages/SystemUI/res/layout-xlarge/status_bar.xml +++ b/packages/SystemUI/res/layout-xlarge/status_bar.xml @@ -28,39 +28,26 @@ > - - + + - - + @@ -116,8 +107,8 @@ android:id="@+id/ticker" android:layout_width="wrap_content" android:layout_height="match_parent" - android:layout_alignParentLeft="true" - android:layout_toLeftOf="@+id/systemInfo" + android:layout_alignParentRight="true" + android:layout_toRightOf="@+id/systemInfo" android:paddingLeft="6dip" android:gravity="center_vertical" android:animateLayoutChanges="true" @@ -133,46 +124,67 @@ android:id="@+id/navigationArea" android:layout_width="wrap_content" android:layout_height="match_parent" - android:layout_alignParentRight="true" + android:layout_alignParentLeft="true" android:orientation="horizontal" > - + - - + android:paddingLeft="15dip" + android:paddingRight="15dip" + android:animateLayoutChanges="true" + android:clickable="true" + android:descendantFocusability="blocksDescendants" + android:gravity="center" + > + + diff --git a/packages/SystemUI/res/layout-xlarge/status_bar_center.xml b/packages/SystemUI/res/layout-xlarge/status_bar_center.xml index 2d74672dbb907..d4f0e5039e1f7 100644 --- a/packages/SystemUI/res/layout-xlarge/status_bar_center.xml +++ b/packages/SystemUI/res/layout-xlarge/status_bar_center.xml @@ -22,7 +22,6 @@ android:layout_height="match_parent" android:layout_centerInParent="true" android:clickable="true" - android:onClick="systemInfoClicked" > + + + + + + + + + + diff --git a/packages/SystemUI/res/layout/status_bar.xml b/packages/SystemUI/res/layout/status_bar.xml index a5d6885c6b907..2f1b36e8a8a35 100644 --- a/packages/SystemUI/res/layout/status_bar.xml +++ b/packages/SystemUI/res/layout/status_bar.xml @@ -21,7 +21,8 @@ @@ -108,6 +111,6 @@ android:gravity="center_vertical|left" android:paddingLeft="6px" android:paddingRight="6px" - android:background="@drawable/statusbar_background" + android:background="@drawable/status_bar_background" /> diff --git a/packages/SystemUI/res/layout/status_bar_expanded.xml b/packages/SystemUI/res/layout/status_bar_expanded.xml index c744e4bcc13d5..b5b1b507988a2 100644 --- a/packages/SystemUI/res/layout/status_bar_expanded.xml +++ b/packages/SystemUI/res/layout/status_bar_expanded.xml @@ -31,7 +31,7 @@ android:paddingTop="3dp" android:paddingBottom="5dp" android:paddingRight="3dp" - android:background="@drawable/title_bar_portrait" + android:background="@drawable/shade_header_background" > @@ -71,7 +71,6 @@ android:layout_width="match_parent" android:layout_height="match_parent" android:fadingEdge="none" - android:overScrollMode="ifContentScrolls" > diff --git a/packages/SystemUI/res/layout/status_bar_tracking.xml b/packages/SystemUI/res/layout/status_bar_tracking.xml index 3b9b77551bef4..a2b40e6013163 100644 --- a/packages/SystemUI/res/layout/status_bar_tracking.xml +++ b/packages/SystemUI/res/layout/status_bar_tracking.xml @@ -26,12 +26,11 @@ android:paddingRight="0px" > - + diff --git a/packages/SystemUI/res/values-xlarge/config.xml b/packages/SystemUI/res/values-xlarge/config.xml index 4cf5d18d118df..6df883c11d6d0 100644 --- a/packages/SystemUI/res/values-xlarge/config.xml +++ b/packages/SystemUI/res/values-xlarge/config.xml @@ -21,5 +21,10 @@ for different hardware and product builds. --> 1 + + + com.android.systemui.statusbar.tablet.TabletStatusBarService + diff --git a/packages/SystemUI/res/values/colors.xml b/packages/SystemUI/res/values/colors.xml index 6550438ecdb14..a0def6b3453fc 100644 --- a/packages/SystemUI/res/values/colors.xml +++ b/packages/SystemUI/res/values/colors.xml @@ -17,7 +17,5 @@ */ --> - #ff282828 - #ff969696 #ffffffff diff --git a/packages/SystemUI/res/values/config.xml b/packages/SystemUI/res/values/config.xml index 8ea46e583a951..4570d8e3827d4 100644 --- a/packages/SystemUI/res/values/config.xml +++ b/packages/SystemUI/res/values/config.xml @@ -20,7 +20,20 @@ - + + false + + + 0 + + + com.android.systemui.statusbar.PhoneStatusBarService + diff --git a/packages/SystemUI/res/values/strings.xml b/packages/SystemUI/res/values/strings.xml index ba3a3d1d35384..1f24ba69bbc81 100644 --- a/packages/SystemUI/res/values/strings.xml +++ b/packages/SystemUI/res/values/strings.xml @@ -24,6 +24,18 @@ all of the currently visible notifications. --> Clear + + Do not disturb + + + Show notifications + + No notifications @@ -51,4 +63,20 @@ power usage activity to find out what drained the battery. --> Battery use + + Settings + + + + Recent + + No recent applications. + + diff --git a/packages/SystemUI/res/values/styles.xml b/packages/SystemUI/res/values/styles.xml index 86bcf3a6f01c0..f592703b929b1 100644 --- a/packages/SystemUI/res/values/styles.xml +++ b/packages/SystemUI/res/values/styles.xml @@ -19,10 +19,24 @@ + + + + diff --git a/packages/SystemUI/src/com/android/systemui/SystemUI.java b/packages/SystemUI/src/com/android/systemui/SystemUI.java new file mode 100644 index 0000000000000..53fe2ff911906 --- /dev/null +++ b/packages/SystemUI/src/com/android/systemui/SystemUI.java @@ -0,0 +1,31 @@ +/* + * Copyright (C) 2010 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.systemui; + +import java.io.FileDescriptor; +import java.io.PrintWriter; + +import android.content.Context; + +public abstract class SystemUI { + public Context mContext; + + public abstract void start(); + + public void dump(FileDescriptor fd, PrintWriter pw, String[] args) { + } +} diff --git a/packages/SystemUI/src/com/android/systemui/SystemUIService.java b/packages/SystemUI/src/com/android/systemui/SystemUIService.java new file mode 100644 index 0000000000000..dda86d21f823f --- /dev/null +++ b/packages/SystemUI/src/com/android/systemui/SystemUIService.java @@ -0,0 +1,105 @@ +/* + * Copyright (C) 2010 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.systemui; + +import java.io.FileDescriptor; +import java.io.PrintWriter; + +import android.app.Service; +import android.content.BroadcastReceiver; +import android.content.Context; +import android.content.Intent; +import android.content.pm.PackageManager; +import android.os.Binder; +import android.os.IBinder; +import android.util.Slog; + +public class SystemUIService extends Service { + static final String TAG = "SystemUIService"; + + /** + * The class names of the stuff to start. + */ + final Object[] SERVICES = new Object[] { + R.string.config_statusBarComponent, + }; + + /** + * Hold a reference on the stuff we start. + */ + SystemUI[] mServices; + + private Class chooseClass(Object o) { + if (o instanceof Integer) { + final String cl = getString((Integer)o); + try { + return getClassLoader().loadClass(cl); + } catch (ClassNotFoundException ex) { + throw new RuntimeException(ex); + } + } else if (o instanceof Class) { + return (Class)o; + } else { + throw new RuntimeException("Unknown system ui service: " + o); + } + } + + @Override + public void onCreate() { + final int N = SERVICES.length; + mServices = new SystemUI[N]; + for (int i=0; i= 0) { - oldList = mOngoing; - } else { - oldIndex = mLatest.findEntry(key); - if (oldIndex < 0) { - Slog.w(TAG, "updateNotification for unknown key: " + key); - return; - } - oldList = mLatest; - } - final NotificationData.Entry oldEntry = oldList.getEntryAt(oldIndex); - final StatusBarNotification oldNotification = oldEntry.notification; - final RemoteViews oldContentView = oldNotification.notification.contentView; - - final RemoteViews contentView = notification.notification.contentView; - - if (false) { - Slog.d(TAG, "old notification: when=" + oldNotification.notification.when - + " ongoing=" + oldNotification.isOngoing() - + " expanded=" + oldEntry.expanded - + " contentView=" + oldContentView); - Slog.d(TAG, "new notification: when=" + notification.notification.when - + " ongoing=" + oldNotification.isOngoing() - + " contentView=" + contentView); - } - - // Can we just reapply the RemoteViews in place? If when didn't change, the order - // didn't change. - if (notification.notification.when == oldNotification.notification.when - && notification.isOngoing() == oldNotification.isOngoing() - && oldEntry.expanded != null - && contentView != null && oldContentView != null - && contentView.getPackage() != null - && oldContentView.getPackage() != null - && oldContentView.getPackage().equals(contentView.getPackage()) - && oldContentView.getLayoutId() == contentView.getLayoutId()) { - if (SPEW) Slog.d(TAG, "reusing notification"); - oldEntry.notification = notification; - try { - // Reapply the RemoteViews - contentView.reapply(this, oldEntry.content); - // update the contentIntent - final PendingIntent contentIntent = notification.notification.contentIntent; - if (contentIntent != null) { - oldEntry.content.setOnClickListener(new Launcher(contentIntent, - notification.pkg, notification.tag, notification.id)); - } - // Update the icon. - final StatusBarIcon ic = new StatusBarIcon(notification.pkg, - notification.notification.icon, notification.notification.iconLevel, - notification.notification.number); - if (!oldEntry.icon.set(ic)) { - handleNotificationError(key, notification, "Couldn't update icon: " + ic); - return; - } - } - catch (RuntimeException e) { - // It failed to add cleanly. Log, and remove the view from the panel. - Slog.w(TAG, "Couldn't reapply views for package " + contentView.getPackage(), e); - removeNotificationViews(key); - addNotificationViews(key, notification); - } - } else { - if (SPEW) Slog.d(TAG, "not reusing notification"); - removeNotificationViews(key); - addNotificationViews(key, notification); - } - - // Restart the ticker if it's still running - if (notification.notification.tickerText != null - && !TextUtils.equals(notification.notification.tickerText, - oldEntry.notification.notification.tickerText)) { - tick(notification); - } - - // Recalculate the position of the sliding windows and the titles. - setAreThereNotifications(); - updateExpandedViewPos(EXPANDED_LEAVE_ALONE); - } - - public void removeNotification(IBinder key) { - if (SPEW) Slog.d(TAG, "removeNotification key=" + key); - StatusBarNotification old = removeNotificationViews(key); - - if (old != null) { - // Cancel the ticker if it's still running - mTicker.removeEntry(old); - - // Recalculate the position of the sliding windows and the titles. - setAreThereNotifications(); - updateExpandedViewPos(EXPANDED_LEAVE_ALONE); - } - } - - private int chooseIconIndex(boolean isOngoing, int viewIndex) { - final int latestSize = mLatest.size(); - if (isOngoing) { - return latestSize + (mOngoing.size() - viewIndex); - } else { - return latestSize - viewIndex; - } - } - - View[] makeNotificationView(StatusBarNotification notification, ViewGroup parent) { - Notification n = notification.notification; - RemoteViews remoteViews = n.contentView; - if (remoteViews == null) { - return null; - } - - // create the row view - LayoutInflater inflater = (LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE); - View row = inflater.inflate(R.layout.status_bar_latest_event, parent, false); - - // bind the click event to the content area - ViewGroup content = (ViewGroup)row.findViewById(R.id.content); - content.setDescendantFocusability(ViewGroup.FOCUS_BLOCK_DESCENDANTS); - content.setOnFocusChangeListener(mFocusChangeListener); - PendingIntent contentIntent = n.contentIntent; - if (contentIntent != null) { - content.setOnClickListener(new Launcher(contentIntent, notification.pkg, - notification.tag, notification.id)); - } - - View expanded = null; - Exception exception = null; - try { - expanded = remoteViews.apply(this, content); - } - catch (RuntimeException e) { - exception = e; - } - if (expanded == null) { - String ident = notification.pkg + "/0x" + Integer.toHexString(notification.id); - Slog.e(TAG, "couldn't inflate view for notification " + ident, exception); - return null; - } else { - content.addView(expanded); - row.setDrawingCacheEnabled(true); - } - - return new View[] { row, content, expanded }; - } - - StatusBarIconView addNotificationViews(IBinder key, StatusBarNotification notification) { - NotificationData list; - ViewGroup parent; - final boolean isOngoing = notification.isOngoing(); - if (isOngoing) { - list = mOngoing; - parent = mOngoingItems; - } else { - list = mLatest; - parent = mLatestItems; - } - // Construct the expanded view. - final View[] views = makeNotificationView(notification, parent); - if (views == null) { - handleNotificationError(key, notification, "Couldn't expand RemoteViews for: " - + notification); - return null; - } - final View row = views[0]; - final View content = views[1]; - final View expanded = views[2]; - // Construct the icon. - final StatusBarIconView iconView = new StatusBarIconView(this, - notification.pkg + "/0x" + Integer.toHexString(notification.id)); - final StatusBarIcon ic = new StatusBarIcon(notification.pkg, notification.notification.icon, - notification.notification.iconLevel, notification.notification.number); - if (!iconView.set(ic)) { - handleNotificationError(key, notification, "Coulding create icon: " + ic); - return null; - } - // Add the expanded view. - final int viewIndex = list.add(key, notification, row, content, expanded, iconView); - parent.addView(row, viewIndex); - // Add the icon. - final int iconIndex = chooseIconIndex(isOngoing, viewIndex); - mNotificationIcons.addView(iconView, iconIndex); - return iconView; - } - - StatusBarNotification removeNotificationViews(IBinder key) { - NotificationData.Entry entry = mOngoing.remove(key); - if (entry == null) { - entry = mLatest.remove(key); - if (entry == null) { - Slog.w(TAG, "removeNotification for unknown key: " + key); - return null; - } - } - // Remove the expanded view. - ((ViewGroup)entry.row.getParent()).removeView(entry.row); - // Remove the icon. - ((ViewGroup)entry.icon.getParent()).removeView(entry.icon); - - return entry.notification; - } - - private void setAreThereNotifications() { - boolean ongoing = mOngoing.hasVisibleItems(); - boolean latest = mLatest.hasVisibleItems(); - - // (no ongoing notifications are clearable) - if (mLatest.hasClearableItems()) { - mClearButton.setVisibility(View.VISIBLE); - } else { - mClearButton.setVisibility(View.INVISIBLE); - } - - mOngoingTitle.setVisibility(ongoing ? View.VISIBLE : View.GONE); - mLatestTitle.setVisibility(latest ? View.VISIBLE : View.GONE); - - if (ongoing || latest) { - mNoNotificationsTitle.setVisibility(View.GONE); - } else { - mNoNotificationsTitle.setVisibility(View.VISIBLE); - } - } - - - /** - * State is one or more of the DISABLE constants from StatusBarManager. - */ - public void disable(int state) { - final int old = mDisabled; - final int diff = state ^ old; - mDisabled = state; - - if ((diff & StatusBarManager.DISABLE_EXPAND) != 0) { - if ((state & StatusBarManager.DISABLE_EXPAND) != 0) { - if (SPEW) Slog.d(TAG, "DISABLE_EXPAND: yes"); - animateCollapse(); - } - } - if ((diff & StatusBarManager.DISABLE_NOTIFICATION_ICONS) != 0) { - if ((state & StatusBarManager.DISABLE_NOTIFICATION_ICONS) != 0) { - if (SPEW) Slog.d(TAG, "DISABLE_NOTIFICATION_ICONS: yes"); - if (mTicking) { - mTicker.halt(); - } else { - setNotificationIconVisibility(false, com.android.internal.R.anim.fade_out); - } - } else { - if (SPEW) Slog.d(TAG, "DISABLE_NOTIFICATION_ICONS: no"); - if (!mExpandedVisible) { - setNotificationIconVisibility(true, com.android.internal.R.anim.fade_in); - } - } - } else if ((diff & StatusBarManager.DISABLE_NOTIFICATION_TICKER) != 0) { - if (mTicking && (state & StatusBarManager.DISABLE_NOTIFICATION_TICKER) != 0) { - if (SPEW) Slog.d(TAG, "DISABLE_NOTIFICATION_TICKER: yes"); - mTicker.halt(); - } - } - } - - /** - * All changes to the status bar and notifications funnel through here and are batched. - */ - private class H extends Handler { - public void handleMessage(Message m) { - switch (m.what) { - case MSG_ANIMATE: - doAnimation(); - break; - case MSG_ANIMATE_REVEAL: - doRevealAnimation(); - break; - } - } - } - - View.OnFocusChangeListener mFocusChangeListener = new View.OnFocusChangeListener() { - public void onFocusChange(View v, boolean hasFocus) { - // Because 'v' is a ViewGroup, all its children will be (un)selected - // too, which allows marqueeing to work. - v.setSelected(hasFocus); - } - }; - - private void makeExpandedVisible() { - if (SPEW) Slog.d(TAG, "Make expanded visible: expanded visible=" + mExpandedVisible); - if (mExpandedVisible) { - return; - } - mExpandedVisible = true; - visibilityChanged(true); - - updateExpandedViewPos(EXPANDED_LEAVE_ALONE); - mExpandedParams.flags &= ~WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE; - mExpandedParams.flags |= WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM; - mExpandedDialog.getWindow().setAttributes(mExpandedParams); - mExpandedView.requestFocus(View.FOCUS_FORWARD); - mTrackingView.setVisibility(View.VISIBLE); - mExpandedView.setVisibility(View.VISIBLE); - - if (!mTicking) { - setDateViewVisibility(true, com.android.internal.R.anim.fade_in); - } - } - - public void animateExpand() { - if (SPEW) Slog.d(TAG, "Animate expand: expanded=" + mExpanded); - if ((mDisabled & StatusBarManager.DISABLE_EXPAND) != 0) { - return ; - } - if (mExpanded) { - return; - } - - prepareTracking(0, true); - performFling(0, 2000.0f, true); - } - - public void animateCollapse() { - if (SPEW) { - Slog.d(TAG, "animateCollapse(): mExpanded=" + mExpanded - + " mExpandedVisible=" + mExpandedVisible - + " mExpanded=" + mExpanded - + " mAnimating=" + mAnimating - + " mAnimY=" + mAnimY - + " mAnimVel=" + mAnimVel); - } - - if (!mExpandedVisible) { - return; - } - - int y; - if (mAnimating) { - y = (int)mAnimY; - } else { - y = mDisplay.getHeight()-1; - } - // Let the fling think that we're open so it goes in the right direction - // and doesn't try to re-open the windowshade. - mExpanded = true; - prepareTracking(y, false); - performFling(y, -2000.0f, true); - } - - void performExpand() { - if (SPEW) Slog.d(TAG, "performExpand: mExpanded=" + mExpanded); - if ((mDisabled & StatusBarManager.DISABLE_EXPAND) != 0) { - return ; - } - if (mExpanded) { - return; - } - - mExpanded = true; - makeExpandedVisible(); - updateExpandedViewPos(EXPANDED_FULL_OPEN); - - if (false) postStartTracing(); - } - - void performCollapse() { - if (SPEW) Slog.d(TAG, "performCollapse: mExpanded=" + mExpanded - + " mExpandedVisible=" + mExpandedVisible - + " mTicking=" + mTicking); - - if (!mExpandedVisible) { - return; - } - mExpandedVisible = false; - visibilityChanged(false); - mExpandedParams.flags |= WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE; - mExpandedParams.flags &= ~WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM; - mExpandedDialog.getWindow().setAttributes(mExpandedParams); - mTrackingView.setVisibility(View.GONE); - mExpandedView.setVisibility(View.GONE); - - if ((mDisabled & StatusBarManager.DISABLE_NOTIFICATION_ICONS) == 0) { - setNotificationIconVisibility(true, com.android.internal.R.anim.fade_in); - } - if (mDateView.getVisibility() == View.VISIBLE) { - setDateViewVisibility(false, com.android.internal.R.anim.fade_out); - } - - if (!mExpanded) { - return; - } - mExpanded = false; - } - - void doAnimation() { - if (mAnimating) { - if (SPEW) Slog.d(TAG, "doAnimation"); - if (SPEW) Slog.d(TAG, "doAnimation before mAnimY=" + mAnimY); - incrementAnim(); - if (SPEW) Slog.d(TAG, "doAnimation after mAnimY=" + mAnimY); - if (mAnimY >= mDisplay.getHeight()-1) { - if (SPEW) Slog.d(TAG, "Animation completed to expanded state."); - mAnimating = false; - updateExpandedViewPos(EXPANDED_FULL_OPEN); - performExpand(); - } - else if (mAnimY < mStatusBarView.getHeight()) { - if (SPEW) Slog.d(TAG, "Animation completed to collapsed state."); - mAnimating = false; - updateExpandedViewPos(0); - performCollapse(); - } - else { - updateExpandedViewPos((int)mAnimY); - mCurAnimationTime += ANIM_FRAME_DURATION; - mHandler.sendMessageAtTime(mHandler.obtainMessage(MSG_ANIMATE), mCurAnimationTime); - } - } - } - - void stopTracking() { - mTracking = false; - mVelocityTracker.recycle(); - mVelocityTracker = null; - } - - void incrementAnim() { - long now = SystemClock.uptimeMillis(); - float t = ((float)(now - mAnimLastTime)) / 1000; // ms -> s - final float y = mAnimY; - final float v = mAnimVel; // px/s - final float a = mAnimAccel; // px/s/s - mAnimY = y + (v*t) + (0.5f*a*t*t); // px - mAnimVel = v + (a*t); // px/s - mAnimLastTime = now; // ms - //Slog.d(TAG, "y=" + y + " v=" + v + " a=" + a + " t=" + t + " mAnimY=" + mAnimY - // + " mAnimAccel=" + mAnimAccel); - } - - void doRevealAnimation() { - final int h = mCloseView.getHeight() + mStatusBarView.getHeight(); - if (mAnimatingReveal && mAnimating && mAnimY < h) { - incrementAnim(); - if (mAnimY >= h) { - mAnimY = h; - updateExpandedViewPos((int)mAnimY); - } else { - updateExpandedViewPos((int)mAnimY); - mCurAnimationTime += ANIM_FRAME_DURATION; - mHandler.sendMessageAtTime(mHandler.obtainMessage(MSG_ANIMATE_REVEAL), - mCurAnimationTime); - } - } - } - - void prepareTracking(int y, boolean opening) { - mTracking = true; - mVelocityTracker = VelocityTracker.obtain(); - if (opening) { - mAnimAccel = 2000.0f; - mAnimVel = 200; - mAnimY = mStatusBarView.getHeight(); - updateExpandedViewPos((int)mAnimY); - mAnimating = true; - mAnimatingReveal = true; - mHandler.removeMessages(MSG_ANIMATE); - mHandler.removeMessages(MSG_ANIMATE_REVEAL); - long now = SystemClock.uptimeMillis(); - mAnimLastTime = now; - mCurAnimationTime = now + ANIM_FRAME_DURATION; - mAnimating = true; - mHandler.sendMessageAtTime(mHandler.obtainMessage(MSG_ANIMATE_REVEAL), - mCurAnimationTime); - makeExpandedVisible(); - } else { - // it's open, close it? - if (mAnimating) { - mAnimating = false; - mHandler.removeMessages(MSG_ANIMATE); - } - updateExpandedViewPos(y + mViewDelta); - } - } - - void performFling(int y, float vel, boolean always) { - mAnimatingReveal = false; - mDisplayHeight = mDisplay.getHeight(); - - mAnimY = y; - mAnimVel = vel; - - //Slog.d(TAG, "starting with mAnimY=" + mAnimY + " mAnimVel=" + mAnimVel); - - if (mExpanded) { - if (!always && ( - vel > 200.0f - || (y > (mDisplayHeight-25) && vel > -200.0f))) { - // We are expanded, but they didn't move sufficiently to cause - // us to retract. Animate back to the expanded position. - mAnimAccel = 2000.0f; - if (vel < 0) { - mAnimVel = 0; - } - } - else { - // We are expanded and are now going to animate away. - mAnimAccel = -2000.0f; - if (vel > 0) { - mAnimVel = 0; - } - } - } else { - if (always || ( - vel > 200.0f - || (y > (mDisplayHeight/2) && vel > -200.0f))) { - // We are collapsed, and they moved enough to allow us to - // expand. Animate in the notifications. - mAnimAccel = 2000.0f; - if (vel < 0) { - mAnimVel = 0; - } - } - else { - // We are collapsed, but they didn't move sufficiently to cause - // us to retract. Animate back to the collapsed position. - mAnimAccel = -2000.0f; - if (vel > 0) { - mAnimVel = 0; - } - } - } - //Slog.d(TAG, "mAnimY=" + mAnimY + " mAnimVel=" + mAnimVel - // + " mAnimAccel=" + mAnimAccel); - - long now = SystemClock.uptimeMillis(); - mAnimLastTime = now; - mCurAnimationTime = now + ANIM_FRAME_DURATION; - mAnimating = true; - mHandler.removeMessages(MSG_ANIMATE); - mHandler.removeMessages(MSG_ANIMATE_REVEAL); - mHandler.sendMessageAtTime(mHandler.obtainMessage(MSG_ANIMATE), mCurAnimationTime); - stopTracking(); - } - - boolean interceptTouchEvent(MotionEvent event) { - if (SPEW) { - Slog.d(TAG, "Touch: rawY=" + event.getRawY() + " event=" + event + " mDisabled=" - + mDisabled); - } - - if ((mDisabled & StatusBarManager.DISABLE_EXPAND) != 0) { - return false; - } - - final int statusBarSize = mStatusBarView.getHeight(); - final int hitSize = statusBarSize*2; - if (event.getAction() == MotionEvent.ACTION_DOWN) { - final int y = (int)event.getRawY(); - - if (!mExpanded) { - mViewDelta = statusBarSize - y; - } else { - mTrackingView.getLocationOnScreen(mAbsPos); - mViewDelta = mAbsPos[1] + mTrackingView.getHeight() - y; - } - if ((!mExpanded && y < hitSize) || - (mExpanded && y > (mDisplay.getHeight()-hitSize))) { - - // We drop events at the edge of the screen to make the windowshade come - // down by accident less, especially when pushing open a device with a keyboard - // that rotates (like g1 and droid) - int x = (int)event.getRawX(); - final int edgeBorder = mEdgeBorder; - if (x >= edgeBorder && x < mDisplay.getWidth() - edgeBorder) { - prepareTracking(y, !mExpanded);// opening if we're not already fully visible - mVelocityTracker.addMovement(event); - } - } - } else if (mTracking) { - mVelocityTracker.addMovement(event); - final int minY = statusBarSize + mCloseView.getHeight(); - if (event.getAction() == MotionEvent.ACTION_MOVE) { - int y = (int)event.getRawY(); - if (mAnimatingReveal && y < minY) { - // nothing - } else { - mAnimatingReveal = false; - updateExpandedViewPos(y + mViewDelta); - } - } else if (event.getAction() == MotionEvent.ACTION_UP) { - mVelocityTracker.computeCurrentVelocity(1000); - - float yVel = mVelocityTracker.getYVelocity(); - boolean negative = yVel < 0; - - float xVel = mVelocityTracker.getXVelocity(); - if (xVel < 0) { - xVel = -xVel; - } - if (xVel > 150.0f) { - xVel = 150.0f; // limit how much we care about the x axis - } - - float vel = (float)Math.hypot(yVel, xVel); - if (negative) { - vel = -vel; - } - - performFling((int)event.getRawY(), vel, false); - } - - } - return false; - } - - private class Launcher implements View.OnClickListener { - private PendingIntent mIntent; - private String mPkg; - private String mTag; - private int mId; - - Launcher(PendingIntent intent, String pkg, String tag, int id) { - mIntent = intent; - mPkg = pkg; - mTag = tag; - mId = id; - } - - public void onClick(View v) { - try { - // The intent we are sending is for the application, which - // won't have permission to immediately start an activity after - // the user switches to home. We know it is safe to do at this - // point, so make sure new activity switches are now allowed. - ActivityManagerNative.getDefault().resumeAppSwitches(); - } catch (RemoteException e) { - } - - if (mIntent != null) { - int[] pos = new int[2]; - v.getLocationOnScreen(pos); - Intent overlay = new Intent(); - overlay.setSourceBounds( - new Rect(pos[0], pos[1], pos[0]+v.getWidth(), pos[1]+v.getHeight())); - try { - mIntent.send(StatusBarService.this, 0, overlay); - } catch (PendingIntent.CanceledException e) { - // the stack trace isn't very helpful here. Just log the exception message. - Slog.w(TAG, "Sending contentIntent failed: " + e); - } - } - - try { - mBarService.onNotificationClick(mPkg, mTag, mId); - } catch (RemoteException ex) { - // system process is dead if we're here. - } - - // close the shade if it was open - animateCollapse(); - } - } - - private void tick(StatusBarNotification n) { - // Show the ticker if one is requested. Also don't do this - // until status bar window is attached to the window manager, - // because... well, what's the point otherwise? And trying to - // run a ticker without being attached will crash! - if (n.notification.tickerText != null && mStatusBarView.getWindowToken() != null) { - if (0 == (mDisabled & (StatusBarManager.DISABLE_NOTIFICATION_ICONS - | StatusBarManager.DISABLE_NOTIFICATION_TICKER))) { - mTicker.addEntry(n); - } - } - } - - /** - * Cancel this notification and tell the StatusBarManagerService / NotificationManagerService - * about the failure. - * - * WARNING: this will call back into us. Don't hold any locks. - */ - void handleNotificationError(IBinder key, StatusBarNotification n, String message) { - removeNotification(key); - try { - mBarService.onNotificationError(n.pkg, n.tag, n.id, n.uid, n.initialPid, message); - } catch (RemoteException ex) { - // The end is nigh. - } - } - - private class MyTicker extends Ticker { - MyTicker(Context context, StatusBarView sb) { - super(context, sb); - } - - @Override - void tickerStarting() { - if (SPEW) Slog.d(TAG, "tickerStarting"); - mTicking = true; - mIcons.setVisibility(View.GONE); - mTickerView.setVisibility(View.VISIBLE); - mTickerView.startAnimation(loadAnim(com.android.internal.R.anim.push_up_in, null)); - mIcons.startAnimation(loadAnim(com.android.internal.R.anim.push_up_out, null)); - if (mExpandedVisible) { - setDateViewVisibility(false, com.android.internal.R.anim.push_up_out); - } - } - - @Override - void tickerDone() { - if (SPEW) Slog.d(TAG, "tickerDone"); - mTicking = false; - mIcons.setVisibility(View.VISIBLE); - mTickerView.setVisibility(View.GONE); - mIcons.startAnimation(loadAnim(com.android.internal.R.anim.push_down_in, null)); - mTickerView.startAnimation(loadAnim(com.android.internal.R.anim.push_down_out, null)); - if (mExpandedVisible) { - setDateViewVisibility(true, com.android.internal.R.anim.push_down_in); - } - } - - void tickerHalting() { - if (SPEW) Slog.d(TAG, "tickerHalting"); - mTicking = false; - mIcons.setVisibility(View.VISIBLE); - mTickerView.setVisibility(View.GONE); - mIcons.startAnimation(loadAnim(com.android.internal.R.anim.fade_in, null)); - mTickerView.startAnimation(loadAnim(com.android.internal.R.anim.fade_out, null)); - if (mExpandedVisible) { - setDateViewVisibility(true, com.android.internal.R.anim.fade_in); - } - } - } - - private Animation loadAnim(int id, Animation.AnimationListener listener) { - Animation anim = AnimationUtils.loadAnimation(StatusBarService.this, id); - if (listener != null) { - anim.setAnimationListener(listener); - } - return anim; - } - - public String viewInfo(View v) { - return "(" + v.getLeft() + "," + v.getTop() + ")(" + v.getRight() + "," + v.getBottom() - + " " + v.getWidth() + "x" + v.getHeight() + ")"; - } - - protected void dump(FileDescriptor fd, PrintWriter pw, String[] args) { - if (checkCallingOrSelfPermission(android.Manifest.permission.DUMP) - != PackageManager.PERMISSION_GRANTED) { - pw.println("Permission Denial: can't dump StatusBar from from pid=" - + Binder.getCallingPid() - + ", uid=" + Binder.getCallingUid()); - return; - } - - synchronized (mQueueLock) { - pw.println("Current Status Bar state:"); - pw.println(" mExpanded=" + mExpanded - + ", mExpandedVisible=" + mExpandedVisible); - pw.println(" mTicking=" + mTicking); - pw.println(" mTracking=" + mTracking); - pw.println(" mAnimating=" + mAnimating - + ", mAnimY=" + mAnimY + ", mAnimVel=" + mAnimVel - + ", mAnimAccel=" + mAnimAccel); - pw.println(" mCurAnimationTime=" + mCurAnimationTime - + " mAnimLastTime=" + mAnimLastTime); - pw.println(" mDisplayHeight=" + mDisplayHeight - + " mAnimatingReveal=" + mAnimatingReveal - + " mViewDelta=" + mViewDelta); - pw.println(" mDisplayHeight=" + mDisplayHeight); - pw.println(" mExpandedParams: " + mExpandedParams); - pw.println(" mExpandedView: " + viewInfo(mExpandedView)); - pw.println(" mExpandedDialog: " + mExpandedDialog); - pw.println(" mTrackingParams: " + mTrackingParams); - pw.println(" mTrackingView: " + viewInfo(mTrackingView)); - pw.println(" mOngoingTitle: " + viewInfo(mOngoingTitle)); - pw.println(" mOngoingItems: " + viewInfo(mOngoingItems)); - pw.println(" mLatestTitle: " + viewInfo(mLatestTitle)); - pw.println(" mLatestItems: " + viewInfo(mLatestItems)); - pw.println(" mNoNotificationsTitle: " + viewInfo(mNoNotificationsTitle)); - pw.println(" mCloseView: " + viewInfo(mCloseView)); - pw.println(" mTickerView: " + viewInfo(mTickerView)); - pw.println(" mScrollView: " + viewInfo(mScrollView) - + " scroll " + mScrollView.getScrollX() + "," + mScrollView.getScrollY()); - pw.println("mNotificationLinearLayout: " + viewInfo(mNotificationLinearLayout)); - } - - if (true) { - // must happen on ui thread - mHandler.post(new Runnable() { - public void run() { - Slog.d(TAG, "mStatusIcons:"); - mStatusIcons.debug(); - } - }); - } - - } - - void onBarViewAttached() { - WindowManager.LayoutParams lp; - int pixelFormat; - Drawable bg; - - /// ---------- Tracking View -------------- - pixelFormat = PixelFormat.RGBX_8888; - bg = mTrackingView.getBackground(); - if (bg != null) { - pixelFormat = bg.getOpacity(); - } - - lp = new WindowManager.LayoutParams( - ViewGroup.LayoutParams.MATCH_PARENT, - ViewGroup.LayoutParams.MATCH_PARENT, - WindowManager.LayoutParams.TYPE_STATUS_BAR_PANEL, - WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN - | WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS - | WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM, - pixelFormat); -// lp.token = mStatusBarView.getWindowToken(); - lp.gravity = Gravity.TOP | Gravity.FILL_HORIZONTAL; - lp.setTitle("TrackingView"); - lp.y = mTrackingPosition; - mTrackingParams = lp; - - WindowManagerImpl.getDefault().addView(mTrackingView, lp); - } - - void onTrackingViewAttached() { - WindowManager.LayoutParams lp; - int pixelFormat; - Drawable bg; - - /// ---------- Expanded View -------------- - pixelFormat = PixelFormat.TRANSLUCENT; - - final int disph = mDisplay.getHeight(); - lp = mExpandedDialog.getWindow().getAttributes(); - lp.width = ViewGroup.LayoutParams.MATCH_PARENT; - lp.height = getExpandedHeight(); - lp.x = 0; - mTrackingPosition = lp.y = -disph; // sufficiently large negative - lp.type = WindowManager.LayoutParams.TYPE_STATUS_BAR_PANEL; - lp.flags = WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN - | WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS - | WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL - | WindowManager.LayoutParams.FLAG_DITHER - | WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE; - lp.format = pixelFormat; - lp.gravity = Gravity.TOP | Gravity.FILL_HORIZONTAL; - lp.setTitle("StatusBarExpanded"); - mExpandedDialog.getWindow().setAttributes(lp); - mExpandedDialog.getWindow().setFormat(pixelFormat); - mExpandedParams = lp; - - mExpandedDialog.getWindow().requestFeature(Window.FEATURE_NO_TITLE); - mExpandedDialog.setContentView(mExpandedView, - new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, - ViewGroup.LayoutParams.MATCH_PARENT)); - mExpandedDialog.getWindow().setBackgroundDrawable(null); - mExpandedDialog.show(); - FrameLayout hack = (FrameLayout)mExpandedView.getParent(); - } - - void setDateViewVisibility(boolean visible, int anim) { - mDateView.setUpdates(visible); - mDateView.setVisibility(visible ? View.VISIBLE : View.INVISIBLE); - mDateView.startAnimation(loadAnim(anim, null)); - } - - void setNotificationIconVisibility(boolean visible, int anim) { - int old = mNotificationIcons.getVisibility(); - int v = visible ? View.VISIBLE : View.INVISIBLE; - if (old != v) { - mNotificationIcons.setVisibility(v); - mNotificationIcons.startAnimation(loadAnim(anim, null)); - } - } - - void updateExpandedViewPos(int expandedPosition) { - if (SPEW) { - Slog.d(TAG, "updateExpandedViewPos before expandedPosition=" + expandedPosition - + " mTrackingParams.y=" - + ((mTrackingParams == null) ? "???" : mTrackingParams.y) - + " mTrackingPosition=" + mTrackingPosition); - } - - int h = mStatusBarView.getHeight(); - int disph = mDisplay.getHeight(); - - // If the expanded view is not visible, make sure they're still off screen. - // Maybe the view was resized. - if (!mExpandedVisible) { - if (mTrackingView != null) { - mTrackingPosition = -disph; - if (mTrackingParams != null) { - mTrackingParams.y = mTrackingPosition; - WindowManagerImpl.getDefault().updateViewLayout(mTrackingView, mTrackingParams); - } - } - if (mExpandedParams != null) { - mExpandedParams.y = -disph; - mExpandedDialog.getWindow().setAttributes(mExpandedParams); - } - return; - } - - // tracking view... - int pos; - if (expandedPosition == EXPANDED_FULL_OPEN) { - pos = h; - } - else if (expandedPosition == EXPANDED_LEAVE_ALONE) { - pos = mTrackingPosition; - } - else { - if (expandedPosition <= disph) { - pos = expandedPosition; - } else { - pos = disph; - } - pos -= disph-h; - } - mTrackingPosition = mTrackingParams.y = pos; - mTrackingParams.height = disph-h; - WindowManagerImpl.getDefault().updateViewLayout(mTrackingView, mTrackingParams); - - if (mExpandedParams != null) { - mCloseView.getLocationInWindow(mPositionTmp); - final int closePos = mPositionTmp[1]; - - mExpandedContents.getLocationInWindow(mPositionTmp); - final int contentsBottom = mPositionTmp[1] + mExpandedContents.getHeight(); - - if (expandedPosition != EXPANDED_LEAVE_ALONE) { - mExpandedParams.y = pos + mTrackingView.getHeight() - - (mTrackingParams.height-closePos) - contentsBottom; - int max = h; - if (mExpandedParams.y > max) { - mExpandedParams.y = max; - } - int min = mTrackingPosition; - if (mExpandedParams.y < min) { - mExpandedParams.y = min; - } - - boolean visible = (mTrackingPosition + mTrackingView.getHeight()) > h; - if (!visible) { - // if the contents aren't visible, move the expanded view way off screen - // because the window itself extends below the content view. - mExpandedParams.y = -disph; - } - mExpandedDialog.getWindow().setAttributes(mExpandedParams); - - if (SPEW) Slog.d(TAG, "updateExpandedViewPos visibilityChanged(" + visible + ")"); - visibilityChanged(visible); - } - } + // TODO lp.windowAnimations = R.style.Animation_StatusBar; + WindowManagerImpl.getDefault().addView(sb, lp); if (SPEW) { - Slog.d(TAG, "updateExpandedViewPos after expandedPosition=" + expandedPosition - + " mTrackingParams.y=" + mTrackingParams.y - + " mTrackingPosition=" + mTrackingPosition - + " mExpandedParams.y=" + mExpandedParams.y - + " mExpandedParams.height=" + mExpandedParams.height); + Slog.d(TAG, "Added status bar view: gravity=0x" + Integer.toHexString(lp.gravity) + + " icons=" + iconList.size() + + " lights=" + (switches[0]?"on":"off") + + " menu=" + (switches[1]?"visible":"invisible") + ); } } - - int getExpandedHeight() { - return mDisplay.getHeight() - mStatusBarView.getHeight() - mCloseView.getHeight(); - } - - void updateExpandedHeight() { - if (mExpandedView != null) { - mExpandedParams.height = getExpandedHeight(); - mExpandedDialog.getWindow().setAttributes(mExpandedParams); - } - } - - /** - * The LEDs are turned o)ff when the notification panel is shown, even just a little bit. - * This was added last-minute and is inconsistent with the way the rest of the notifications - * are handled, because the notification isn't really cancelled. The lights are just - * turned off. If any other notifications happen, the lights will turn back on. Steve says - * this is what he wants. (see bug 1131461) - */ - void visibilityChanged(boolean visible) { - if (mPanelSlightlyVisible != visible) { - mPanelSlightlyVisible = visible; - try { - mBarService.onPanelRevealed(); - } catch (RemoteException ex) { - // Won't fail unless the world has ended. - } - } - } - - void performDisableActions(int net) { - int old = mDisabled; - int diff = net ^ old; - mDisabled = net; - - // act accordingly - if ((diff & StatusBarManager.DISABLE_EXPAND) != 0) { - if ((net & StatusBarManager.DISABLE_EXPAND) != 0) { - Slog.d(TAG, "DISABLE_EXPAND: yes"); - animateCollapse(); - } - } - if ((diff & StatusBarManager.DISABLE_NOTIFICATION_ICONS) != 0) { - if ((net & StatusBarManager.DISABLE_NOTIFICATION_ICONS) != 0) { - Slog.d(TAG, "DISABLE_NOTIFICATION_ICONS: yes"); - if (mTicking) { - mNotificationIcons.setVisibility(View.INVISIBLE); - mTicker.halt(); - } else { - setNotificationIconVisibility(false, com.android.internal.R.anim.fade_out); - } - } else { - Slog.d(TAG, "DISABLE_NOTIFICATION_ICONS: no"); - if (!mExpandedVisible) { - setNotificationIconVisibility(true, com.android.internal.R.anim.fade_in); - } - } - } else if ((diff & StatusBarManager.DISABLE_NOTIFICATION_TICKER) != 0) { - Slog.d(TAG, "DISABLE_NOTIFICATION_TICKER: " - + (((net & StatusBarManager.DISABLE_NOTIFICATION_TICKER) != 0) - ? "yes" : "no")); - if (mTicking && (net & StatusBarManager.DISABLE_NOTIFICATION_TICKER) != 0) { - mTicker.halt(); - } - } - } - - private View.OnClickListener mClearButtonListener = new View.OnClickListener() { - public void onClick(View v) { - try { - mBarService.onClearAllNotifications(); - } catch (RemoteException ex) { - // system process is dead if we're here. - } - animateCollapse(); - } - }; - - private BroadcastReceiver mBroadcastReceiver = new BroadcastReceiver() { - public void onReceive(Context context, Intent intent) { - String action = intent.getAction(); - if (Intent.ACTION_CLOSE_SYSTEM_DIALOGS.equals(action) - || Intent.ACTION_SCREEN_OFF.equals(action)) { - animateCollapse(); - } - else if (Intent.ACTION_CONFIGURATION_CHANGED.equals(action)) { - updateResources(); - } - } - }; - - /** - * Reload some of our resources when the configuration changes. - * - * We don't reload everything when the configuration changes -- we probably - * should, but getting that smooth is tough. Someday we'll fix that. In the - * meantime, just update the things that we know change. - */ - void updateResources() { - Resources res = getResources(); - - mClearButton.setText(getText(R.string.status_bar_clear_all_button)); - mOngoingTitle.setText(getText(R.string.status_bar_ongoing_events_title)); - mLatestTitle.setText(getText(R.string.status_bar_latest_events_title)); - mNoNotificationsTitle.setText(getText(R.string.status_bar_no_notifications_title)); - - mEdgeBorder = res.getDimensionPixelSize(R.dimen.status_bar_edge_ignore); - - if (false) Slog.v(TAG, "updateResources"); - } - - // - // tracing - // - - void postStartTracing() { - mHandler.postDelayed(mStartTracing, 3000); - } - - void vibrate() { - android.os.Vibrator vib = (android.os.Vibrator)getSystemService(Context.VIBRATOR_SERVICE); - vib.vibrate(250); - } - - Runnable mStartTracing = new Runnable() { - public void run() { - vibrate(); - SystemClock.sleep(250); - Slog.d(TAG, "startTracing"); - android.os.Debug.startMethodTracing("/data/statusbar-traces/trace"); - mHandler.postDelayed(mStopTracing, 10000); - } - }; - - Runnable mStopTracing = new Runnable() { - public void run() { - android.os.Debug.stopMethodTracing(); - Slog.d(TAG, "stopTracing"); - vibrate(); - } - }; } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/StatusBarView.java b/packages/SystemUI/src/com/android/systemui/statusbar/StatusBarView.java index 117b126409a3e..20fc41fb162b2 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/StatusBarView.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/StatusBarView.java @@ -19,6 +19,7 @@ package com.android.systemui.statusbar; import android.content.Context; import android.content.res.Configuration; import android.graphics.Canvas; +import android.graphics.Rect; import android.os.SystemClock; import android.util.AttributeSet; import android.view.MotionEvent; @@ -34,7 +35,7 @@ public class StatusBarView extends FrameLayout { static final int DIM_ANIM_TIME = 400; - StatusBarService mService; + PhoneStatusBarService mService; boolean mTracking; int mStartX, mStartY; ViewGroup mNotificationIcons; @@ -42,6 +43,13 @@ public class StatusBarView extends FrameLayout { View mDate; FixedSizeDrawable mBackground; + boolean mNightMode = false; + int mStartAlpha = 0, mEndAlpha = 0; + long mEndTime = 0; + + Rect mButtonBounds = new Rect(); + boolean mCapturingEvents = true; + public StatusBarView(Context context, AttributeSet attrs) { super(context, attrs); } @@ -64,10 +72,33 @@ public class StatusBarView extends FrameLayout { mService.onBarViewAttached(); } + @Override + protected void onConfigurationChanged(Configuration newConfig) { + super.onConfigurationChanged(newConfig); + boolean nightMode = (newConfig.uiMode & Configuration.UI_MODE_NIGHT_MASK) + == Configuration.UI_MODE_NIGHT_YES; + if (mNightMode != nightMode) { + mNightMode = nightMode; + mStartAlpha = getCurAlpha(); + mEndAlpha = mNightMode ? 0x80 : 0x00; + mEndTime = SystemClock.uptimeMillis() + DIM_ANIM_TIME; + invalidate(); + } + } + + int getCurAlpha() { + long time = SystemClock.uptimeMillis(); + if (time > mEndTime) { + return mEndAlpha; + } + return mEndAlpha + - (int)(((mEndAlpha-mStartAlpha) * (mEndTime-time) / DIM_ANIM_TIME)); + } + @Override protected void onSizeChanged(int w, int h, int oldw, int oldh) { super.onSizeChanged(w, h, oldw, oldh); - mService.updateExpandedViewPos(StatusBarService.EXPANDED_LEAVE_ALONE); + mService.updateExpandedViewPos(PhoneStatusBarService.EXPANDED_LEAVE_ALONE); } @Override @@ -100,6 +131,18 @@ public class StatusBarView extends FrameLayout { mBackground.setFixedBounds(-mDate.getLeft(), -mDate.getTop(), (r-l), (b-t)); } + @Override + protected void dispatchDraw(Canvas canvas) { + super.dispatchDraw(canvas); + int alpha = getCurAlpha(); + if (alpha != 0) { + canvas.drawARGB(alpha, 0, 0, 0); + } + if (alpha != mEndAlpha) { + invalidate(); + } + } + /** * Gets the left position of v in this view. Throws if v is not * a child of this. @@ -138,6 +181,9 @@ public class StatusBarView extends FrameLayout { */ @Override public boolean onTouchEvent(MotionEvent event) { + if (!mCapturingEvents) { + return false; + } if (event.getAction() != MotionEvent.ACTION_DOWN) { mService.interceptTouchEvent(event); } @@ -146,6 +192,13 @@ public class StatusBarView extends FrameLayout { @Override public boolean onInterceptTouchEvent(MotionEvent event) { + if (event.getAction() == MotionEvent.ACTION_DOWN) { + if (mButtonBounds.contains((int)event.getX(), (int)event.getY())) { + mCapturingEvents = false; + return false; + } + } + mCapturingEvents = true; return mService.interceptTouchEvent(event) ? true : super.onInterceptTouchEvent(event); } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/Ticker.java b/packages/SystemUI/src/com/android/systemui/statusbar/Ticker.java index 3a697a6d2ce97..e7b050973d750 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/Ticker.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/Ticker.java @@ -141,7 +141,7 @@ public abstract class Ticker { } }; - Ticker(Context context, StatusBarView sb) { + public Ticker(Context context, View sb) { mContext = context; mTickerView = sb.findViewById(R.id.ticker); @@ -163,7 +163,7 @@ public abstract class Ticker { } - void addEntry(StatusBarNotification n) { + public void addEntry(StatusBarNotification n) { int initialCount = mSegments.size(); // If what's being displayed has the same text and icon, just drop it @@ -212,7 +212,7 @@ public abstract class Ticker { } } - void removeEntry(StatusBarNotification n) { + public void removeEntry(StatusBarNotification n) { for (int i=mSegments.size()-1; i>=0; i--) { Segment seg = mSegments.get(i); if (n.id == seg.notification.id && n.pkg.equals(seg.notification.pkg)) { @@ -221,13 +221,13 @@ public abstract class Ticker { } } - void halt() { + public void halt() { mHandler.removeCallbacks(mAdvanceTicker); mSegments.clear(); tickerHalting(); } - void reflowText() { + public void reflowText() { if (mSegments.size() > 0) { Segment seg = mSegments.get(0); CharSequence text = seg.getText(); @@ -266,8 +266,8 @@ public abstract class Ticker { mHandler.postDelayed(mAdvanceTicker, TICKER_SEGMENT_DELAY); } - abstract void tickerStarting(); - abstract void tickerDone(); - abstract void tickerHalting(); + public abstract void tickerStarting(); + public abstract void tickerDone(); + public abstract void tickerHalting(); } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/TickerView.java b/packages/SystemUI/src/com/android/systemui/statusbar/TickerView.java index 9749ae4427410..814081198d8bd 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/TickerView.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/TickerView.java @@ -34,5 +34,9 @@ public class TickerView extends TextSwitcher super.onSizeChanged(w, h, oldw, oldh); mTicker.reflowText(); } + + public void setTicker(Ticker t) { + mTicker = t; + } } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/TrackingView.java b/packages/SystemUI/src/com/android/systemui/statusbar/TrackingView.java index 9108eee1814e8..c59eb6a29d50f 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/TrackingView.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/TrackingView.java @@ -26,7 +26,7 @@ import android.widget.LinearLayout; public class TrackingView extends LinearLayout { final Display mDisplay; - StatusBarService mService; + PhoneStatusBarService mService; boolean mTracking; int mStartX, mStartY; diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/tablet/NotificationIconArea.java b/packages/SystemUI/src/com/android/systemui/statusbar/tablet/NotificationIconArea.java index 7c7d74c3ce107..2b4f9d260ba87 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/tablet/NotificationIconArea.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/tablet/NotificationIconArea.java @@ -32,13 +32,11 @@ public class NotificationIconArea extends LinearLayout { private static final String TAG = "NotificationIconArea"; IconLayout mIconLayout; - DraggerView mDraggerView; public NotificationIconArea(Context context, AttributeSet attrs) { super(context, attrs); mIconLayout = (IconLayout)findViewById(R.id.icons); - mDraggerView = (DraggerView) findViewById(R.id.handle); } static class IconLayout extends LinearLayout { diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/tablet/ShirtPocket.java b/packages/SystemUI/src/com/android/systemui/statusbar/tablet/ShirtPocket.java new file mode 100644 index 0000000000000..658038cad5a97 --- /dev/null +++ b/packages/SystemUI/src/com/android/systemui/statusbar/tablet/ShirtPocket.java @@ -0,0 +1,248 @@ +/* + * Copyright (C) 2010 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.systemui.statusbar.tablet; + +import android.animation.ObjectAnimator; +import android.content.Context; +import android.util.Slog; +import android.view.View; +import android.util.AttributeSet; +import android.widget.ImageView; +import android.widget.TextView; +import android.view.DragEvent; +import android.view.MotionEvent; +import android.content.ClipData; +import android.content.ClipDescription; +import android.graphics.Paint; +import android.graphics.Bitmap; +import android.graphics.Canvas; +import android.graphics.Point; +import android.view.WindowManager; +import android.widget.FrameLayout; +import android.view.WindowManagerImpl; +import android.graphics.PixelFormat; +import android.view.Gravity; + +import com.android.systemui.R; + +public class ShirtPocket extends FrameLayout { + private static final boolean DEBUG = false; + private static final String TAG = "StatusBar/ShirtPocket"; + + private ClipData mClipping = null; + + private View mWindow = null; + private ImageView mIcon; + private ImageView mPreviewIcon; + private TextView mDescription; + private TextView mAltText; + + public ShirtPocket(Context context, AttributeSet attrs) { + super(context, attrs); + setupWindow(); + } + + // TODO: "pin area" panel, dragging things out + ObjectAnimator mAnimHide, mAnimShow; + + protected void onAttachedToWindow() { + // Drag API notes: we must be visible to receive drag events + setVisibility(View.VISIBLE); + + mIcon = (ImageView) findViewById(R.id.pocket_icon); + refreshStatusIcon(); + + setOnClickListener(new View.OnClickListener() { + public void onClick(View v) { + if (mClipping != null) { + if (mWindow.getVisibility() == View.VISIBLE) hideWindow(); + else showWindow(); + } + } + }); + } + + private void refreshStatusIcon() { + setClickable(mClipping != null); + mIcon.setImageResource(mClipping == null + ? R.drawable.ic_sysbar_pocket_hidden + : R.drawable.ic_sysbar_pocket_holding); + mIcon.setVisibility(mClipping == null ? View.INVISIBLE : View.VISIBLE); + } + + private void showWindow() { + getHandler().post(new Runnable() { + public void run() { + mWindow.setVisibility(View.VISIBLE); + refreshStatusIcon(); + } + }); + } + + private void hideWindow() { + getHandler().post(new Runnable() { + public void run() { + mWindow.setVisibility(View.GONE); + refreshStatusIcon(); + } + }); + } + + private void hideWindowInJustASec() { + getHandler().postDelayed(new Runnable() { + public void run() { + mWindow.setVisibility(View.GONE); + refreshStatusIcon(); + } + }, + 250); + } + + private void stash(ClipData clipping) { + mClipping = clipping; + if (mClipping != null) { + Bitmap icon = mClipping.getIcon(); + mDescription.setText(mClipping.getLabel()); + if (icon != null) { + mPreviewIcon.setImageBitmap(icon); + mPreviewIcon.setVisibility(View.VISIBLE); + mAltText.setVisibility(View.GONE); + } else { + mPreviewIcon.setVisibility(View.GONE); + mAltText.setVisibility(View.VISIBLE); + if (mClipping.getItemCount() > 0) { + // TODO: figure out how to visualize every kind of ClipData! + mAltText.setText(mClipping.getItem(0).coerceToText(getContext())); + } + } + } + } + + private boolean isInViewContentArea(View v, int x, int y) { + final int l = v.getPaddingLeft(); + final int r = v.getWidth() - v.getPaddingRight(); + final int t = v.getPaddingTop(); + final int b = v.getHeight() - v.getPaddingBottom(); + return x >= l && x < r && y >= t && y < b; + } + + View.OnTouchListener mWindowTouchListener = new View.OnTouchListener() { + public boolean onTouch(View v, MotionEvent ev) { + final int action = ev.getAction(); + if (action == MotionEvent.ACTION_OUTSIDE + || (action == MotionEvent.ACTION_DOWN + && !isInViewContentArea(mWindow, (int)ev.getX(), (int)ev.getY()))) { + hideWindow(); + return true; + } else if (action == MotionEvent.ACTION_DOWN) { + Slog.d(TAG, "ACTION_DOWN"); + final ClipData clip = mClipping; + if (clip != null) { + final Bitmap icon = clip.getIcon(); + DragThumbnailBuilder thumb; + if (icon != null) { + thumb = new DragThumbnailBuilder(v) { + public void onProvideThumbnailMetrics(Point thumbnailSize, Point thumbnailTouchPoint) { + thumbnailSize.set(icon.getWidth(), icon.getHeight()); + thumbnailTouchPoint.set(thumbnailSize.x / 2, thumbnailSize.y / 2); + } + public void onDrawThumbnail(Canvas canvas) { + canvas.drawBitmap(icon, 0, 0, new Paint()); + } + }; + } else { + // uhhh, what now? + thumb = new DragThumbnailBuilder(mWindow.findViewById(R.id.preview)); + } + + ShirtPocket.this.startDrag(clip, thumb, false); + + // TODO: only discard the clipping if it was accepted + stash(null); + + hideWindowInJustASec(); // will refresh the icon + + return true; + } + } + return false; + } + }; + + private void setupWindow() { + mWindow = View.inflate(getContext(), R.layout.sysbar_panel_pocket, null); + + mPreviewIcon = (ImageView) mWindow.findViewById(R.id.icon); + mDescription = (TextView) mWindow.findViewById(R.id.description); + mAltText = (TextView) mWindow.findViewById(R.id.alt); + + mWindow.setVisibility(View.GONE); + mWindow.setOnTouchListener(mWindowTouchListener); + WindowManager.LayoutParams lp = new WindowManager.LayoutParams( + 400, + 250, + WindowManager.LayoutParams.TYPE_STATUS_BAR_PANEL, + WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN + | WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM, + PixelFormat.TRANSLUCENT); + lp.gravity = Gravity.BOTTOM | Gravity.RIGHT; +// int pos[] = new int[2]; +// getLocationOnScreen(pos); +// lp.x = pos[1]; +// lp.y = 0; + lp.setTitle("ShirtPocket"); + lp.windowAnimations = com.android.internal.R.style.Animation_SlidingCard; + + WindowManagerImpl.getDefault().addView(mWindow, lp); + + } + + public boolean onDragEvent(DragEvent event) { + if (DEBUG) Slog.d(TAG, "onDragEvent: " + event); + if (mIcon != null) { + switch (event.getAction()) { + // We want to appear whenever a potential drag takes off from anywhere in the UI. + case DragEvent.ACTION_DRAG_STARTED: + mIcon.setImageResource(mClipping == null + ? R.drawable.ic_sysbar_pocket + : R.drawable.ic_sysbar_pocket_holding); + mIcon.setVisibility(View.VISIBLE); + break; + case DragEvent.ACTION_DRAG_ENTERED: + if (DEBUG) Slog.d(TAG, "entered!"); + mIcon.setImageResource(R.drawable.ic_sysbar_pocket_drag); + break; + case DragEvent.ACTION_DRAG_EXITED: + if (DEBUG) Slog.d(TAG, "exited!"); + mIcon.setImageResource(mClipping == null + ? R.drawable.ic_sysbar_pocket + : R.drawable.ic_sysbar_pocket_holding); + break; + case DragEvent.ACTION_DROP: + if (DEBUG) Slog.d(TAG, "dropped!"); + stash(event.getClipData()); + refreshStatusIcon(); + break; + case DragEvent.ACTION_DRAG_ENDED: + refreshStatusIcon(); + break; + } + } + return true; // we want everything, thank you + } +} + diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/tablet/TabletStatusBarService.java b/packages/SystemUI/src/com/android/systemui/statusbar/tablet/TabletStatusBarService.java index 340e269d89c6f..d11aba67854c9 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/tablet/TabletStatusBarService.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/tablet/TabletStatusBarService.java @@ -16,6 +16,9 @@ package com.android.systemui.statusbar.tablet; +import java.io.FileDescriptor; +import java.io.PrintWriter; + import android.app.ActivityManagerNative; import android.app.PendingIntent; import android.app.Notification; @@ -74,12 +77,13 @@ public class TabletStatusBarService extends StatusBarService { private NotificationData mNotns = new NotificationData(); TabletStatusBarView mStatusBarView; - View mNotificationTrigger; + ImageView mNotificationTrigger; NotificationIconArea mNotificationIconArea; View mNotificationButtons; View mSystemInfo; View mNavigationArea; View mMenuButton; + View mRecentButton; NotificationPanel mNotificationPanel; SystemPanel mSystemPanel; @@ -107,11 +111,13 @@ public class TabletStatusBarService extends StatusBarService { boolean mNotificationsOn = true; protected void addPanelWindows() { - final Resources res = getResources(); + final Context context = mContext; + + final Resources res = context.getResources(); final int barHeight= res.getDimensionPixelSize( com.android.internal.R.dimen.status_bar_height); - mNotificationPanel = (NotificationPanel)View.inflate(this, + mNotificationPanel = (NotificationPanel)View.inflate(context, R.layout.sysbar_panel_notifications, null); mNotificationPanel.setVisibility(View.GONE); mNotificationPanel.setOnTouchListener( @@ -126,13 +132,13 @@ public class TabletStatusBarService extends StatusBarService { WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN | WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM, PixelFormat.TRANSLUCENT); - lp.gravity = Gravity.BOTTOM | Gravity.LEFT; + lp.gravity = Gravity.BOTTOM | Gravity.RIGHT; lp.setTitle("NotificationPanel"); lp.windowAnimations = com.android.internal.R.style.Animation_SlidingCard; WindowManagerImpl.getDefault().addView(mNotificationPanel, lp); - mSystemPanel = (SystemPanel) View.inflate(this, R.layout.sysbar_panel_system, null); + mSystemPanel = (SystemPanel) View.inflate(context, R.layout.sysbar_panel_system, null); mSystemPanel.setVisibility(View.GONE); mSystemPanel.setOnTouchListener(new TouchOutsideListener(MSG_CLOSE_SYSTEM_PANEL, mSystemPanel)); @@ -155,17 +161,18 @@ public class TabletStatusBarService extends StatusBarService { } @Override - public void onCreate() { - super.onCreate(); // will add the main bar view + public void start() { + super.start(); // will add the main bar view } protected View makeStatusBarView() { - Resources res = getResources(); + final Context context = mContext; + final Resources res = context.getResources(); mIconSize = res.getDimensionPixelSize(com.android.internal.R.dimen.status_bar_icon_size); final TabletStatusBarView sb = (TabletStatusBarView)View.inflate( - this, R.layout.status_bar, null); + context, R.layout.status_bar, null); mStatusBarView = sb; sb.setHandler(mHandler); @@ -174,14 +181,19 @@ public class TabletStatusBarService extends StatusBarService { mCurtains = sb.findViewById(R.id.lights_out); mSystemInfo = sb.findViewById(R.id.systemInfo); + mSystemInfo.setOnClickListener(mOnClickListener); mSystemInfo.setOnLongClickListener(new SetLightsOnListener(false)); + mRecentButton = sb.findViewById(R.id.recent); + mRecentButton.setOnClickListener(mOnClickListener); + SetLightsOnListener on = new SetLightsOnListener(true); mCurtains.setOnClickListener(on); mCurtains.setOnLongClickListener(on); // the button to open the notification area - mNotificationTrigger = sb.findViewById(R.id.expand); + mNotificationTrigger = (ImageView) sb.findViewById(R.id.notificationTrigger); + mNotificationTrigger.setOnClickListener(mOnClickListener); // the more notifications icon mNotificationIconArea = (NotificationIconArea)sb.findViewById(R.id.notificationIcons); @@ -189,15 +201,15 @@ public class TabletStatusBarService extends StatusBarService { // the clear and dnd buttons mNotificationButtons = sb.findViewById(R.id.notificationButtons); mClearButton = (TextView)mNotificationButtons.findViewById(R.id.clear_all_button); - mClearButton.setOnClickListener(mClearButtonListener); + mClearButton.setOnClickListener(mOnClickListener); mDoNotDisturbButton = (TextView)mNotificationButtons.findViewById(R.id.do_not_disturb); - mDoNotDisturbButton.setOnClickListener(mDoNotDisturbButtonListener); + mDoNotDisturbButton.setOnClickListener(mOnClickListener); // where the icons go mIconLayout = (NotificationIconArea.IconLayout) sb.findViewById(R.id.icons); - mTicker = new TabletTicker((Context)this, (FrameLayout)sb.findViewById(R.id.ticker)); + mTicker = new TabletTicker(context, (FrameLayout)sb.findViewById(R.id.ticker)); // System info (center) mBatteryMeter = (ImageView) sb.findViewById(R.id.battery); @@ -210,6 +222,7 @@ public class TabletStatusBarService extends StatusBarService { // set the initial view visibility setAreThereNotifications(); + refreshNotificationTrigger(); // Add the windows addPanelWindows(); @@ -241,6 +254,7 @@ public class TabletStatusBarService extends StatusBarService { R.anim.notification_icons_out); setViewVisibility(mNotificationButtons, View.VISIBLE, R.anim.notification_buttons_in); + refreshNotificationTrigger(); } break; case MSG_CLOSE_NOTIFICATION_PANEL: @@ -251,6 +265,7 @@ public class TabletStatusBarService extends StatusBarService { R.anim.notification_icons_in); setViewVisibility(mNotificationButtons, View.GONE, R.anim.notification_buttons_out); + refreshNotificationTrigger(); } break; case MSG_OPEN_SYSTEM_PANEL: @@ -264,6 +279,22 @@ public class TabletStatusBarService extends StatusBarService { } } } + + public void refreshNotificationTrigger() { + if (mNotificationTrigger == null) return; + + int resId; + boolean panel = (mNotificationPanel != null + && mNotificationPanel.getVisibility() == View.VISIBLE); + if (!mNotificationsOn) { + resId = R.drawable.ic_sysbar_noti_dnd; + } else if (mNotns.size() > 0) { + resId = panel ? R.drawable.ic_sysbar_noti_avail_open : R.drawable.ic_sysbar_noti_avail; + } else { + resId = panel ? R.drawable.ic_sysbar_noti_none_open : R.drawable.ic_sysbar_noti_none; + } + mNotificationTrigger.setImageResource(resId); + } public void setBatteryMeter(int level, boolean plugged) { if (DEBUG) Slog.d(TAG, "battery=" + level + (plugged ? " - plugged" : " - unplugged")); @@ -366,7 +397,7 @@ public class TabletStatusBarService extends StatusBarService { oldEntry.notification = notification; try { // Reapply the RemoteViews - contentView.reapply(this, oldEntry.content); + contentView.reapply(mContext, oldEntry.content); // update the contentIntent final PendingIntent contentIntent = notification.notification.contentIntent; if (contentIntent != null) { @@ -551,37 +582,6 @@ public class TabletStatusBarService extends StatusBarService { */ } - public void notificationIconsClicked(View v) { - if (DEBUG) Slog.d(TAG, "clicked notification icons"); - if ((mDisabled & StatusBarManager.DISABLE_EXPAND) == 0) { - int msg = (mNotificationPanel.getVisibility() == View.GONE) - ? MSG_OPEN_NOTIFICATION_PANEL - : MSG_CLOSE_NOTIFICATION_PANEL; - mHandler.removeMessages(msg); - mHandler.sendEmptyMessage(msg); - } - } - - public void systemInfoClicked(View v) { - if (DEBUG) Slog.d(TAG, "clicked system info"); - if ((mDisabled & StatusBarManager.DISABLE_EXPAND) == 0) { - int msg = (mSystemPanel.getVisibility() == View.GONE) - ? MSG_OPEN_SYSTEM_PANEL - : MSG_CLOSE_SYSTEM_PANEL; - mHandler.removeMessages(msg); - mHandler.sendEmptyMessage(msg); - } - } - - public void recentButtonClicked(View v) { - if (DEBUG) Slog.d(TAG, "clicked recent apps"); - Intent intent = new Intent(); - intent.setClass(this, RecentApplicationsActivity.class); - intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK - | Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS); - startActivity(intent); - } - /** * Cancel this notification and tell the status bar service about the failure. Hold no locks. */ @@ -594,23 +594,75 @@ public class TabletStatusBarService extends StatusBarService { } } - private View.OnClickListener mClearButtonListener = new View.OnClickListener() { + private View.OnClickListener mOnClickListener = new View.OnClickListener() { public void onClick(View v) { - try { - mBarService.onClearAllNotifications(); - } catch (RemoteException ex) { - // system process is dead if we're here. + if (v == mClearButton) { + onClickClearButton(); + } else if (v == mDoNotDisturbButton) { + onClickDoNotDisturb(); + } else if (v == mNotificationTrigger) { + onClickNotificationTrigger(); + } else if (v == mSystemInfo) { + onClickSystemInfo(); + } else if (v == mRecentButton) { + onClickRecentButton(); } - animateCollapse(); } }; - private View.OnClickListener mDoNotDisturbButtonListener = new View.OnClickListener() { - public void onClick(View v) { - mNotificationsOn = !mNotificationsOn; - animateCollapse(); + void onClickClearButton() { + try { + mBarService.onClearAllNotifications(); + } catch (RemoteException ex) { + // system process is dead if we're here. } - }; + animateCollapse(); + refreshNotificationTrigger(); + } + + void onClickDoNotDisturb() { + mNotificationsOn = !mNotificationsOn; + mIconLayout.setVisibility(mNotificationsOn ? View.VISIBLE : View.INVISIBLE); // TODO: animation + animateCollapse(); + refreshNotificationTrigger(); + } + + public void onClickNotificationTrigger() { + if (DEBUG) Slog.d(TAG, "clicked notification icons"); + if ((mDisabled & StatusBarManager.DISABLE_EXPAND) == 0) { + if (!mNotificationsOn) { + mNotificationsOn = true; + mIconLayout.setVisibility(View.VISIBLE); // TODO: animation + refreshNotificationTrigger(); + } else { + int msg = (mNotificationPanel.getVisibility() == View.GONE) + ? MSG_OPEN_NOTIFICATION_PANEL + : MSG_CLOSE_NOTIFICATION_PANEL; + mHandler.removeMessages(msg); + mHandler.sendEmptyMessage(msg); + } + } + } + + public void onClickSystemInfo() { + if (DEBUG) Slog.d(TAG, "clicked system info"); + if ((mDisabled & StatusBarManager.DISABLE_EXPAND) == 0) { + int msg = (mSystemPanel.getVisibility() == View.GONE) + ? MSG_OPEN_SYSTEM_PANEL + : MSG_CLOSE_SYSTEM_PANEL; + mHandler.removeMessages(msg); + mHandler.sendEmptyMessage(msg); + } + } + + public void onClickRecentButton() { + if (DEBUG) Slog.d(TAG, "clicked recent apps"); + Intent intent = new Intent(); + intent.setClass(mContext, RecentApplicationsActivity.class); + intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK + | Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS); + mContext.startActivity(intent); + } private class NotificationClicker implements View.OnClickListener { private PendingIntent mIntent; @@ -642,7 +694,7 @@ public class TabletStatusBarService extends StatusBarService { overlay.setSourceBounds( new Rect(pos[0], pos[1], pos[0]+v.getWidth(), pos[1]+v.getHeight())); try { - mIntent.send(TabletStatusBarService.this, 0, overlay); + mIntent.send(mContext, 0, overlay); } catch (PendingIntent.CanceledException e) { // the stack trace isn't very helpful here. Just log the exception message. Slog.w(TAG, "Sending contentIntent failed: " + e); @@ -685,7 +737,7 @@ public class TabletStatusBarService extends StatusBarService { Slog.d(TAG, "addNotificationViews(key=" + key + ", notification=" + notification); } // Construct the icon. - final StatusBarIconView iconView = new StatusBarIconView(this, + final StatusBarIconView iconView = new StatusBarIconView(mContext, notification.pkg + "/0x" + Integer.toHexString(notification.id)); iconView.setScaleType(ImageView.ScaleType.CENTER_INSIDE); @@ -733,6 +785,8 @@ public class TabletStatusBarService extends StatusBarService { for (int i=0; i Date: Sun, 24 Oct 2010 22:52:44 -0400 Subject: [PATCH 19/90] Third time. Fix deleted files issues. merge packages/SystemUI through bd5dba. Change-Id: I6ab85abb3b78d352dfd4854f011a9a241de3dc35 --- .../divider_horizontal_dark_opaque.9.png | Bin 2747 -> 0 bytes .../divider_horizontal_light_opaque.9.png | Bin 128 -> 0 bytes .../res/drawable-hdpi/status_bar_close_on.9.png | Bin 1262 -> 0 bytes .../res/drawable-hdpi/statusbar_background.9.png | Bin 2846 -> 0 bytes .../res/drawable-mdpi/battery_low_battery.png | Bin 5306 -> 0 bytes .../divider_horizontal_dark_opaque.9.png | Bin 2805 -> 0 bytes .../divider_horizontal_light_opaque.9.png | Bin 128 -> 0 bytes .../res/drawable-mdpi/ic_sysbar_back.png | Bin 636 -> 0 bytes .../res/drawable-mdpi/status_bar_close_on.9.png | Bin 1196 -> 0 bytes .../res/drawable-mdpi/statusbar_background.9.png | Bin 2849 -> 0 bytes 10 files changed, 0 insertions(+), 0 deletions(-) delete mode 100644 packages/SystemUI/res/drawable-hdpi/divider_horizontal_dark_opaque.9.png delete mode 100644 packages/SystemUI/res/drawable-hdpi/divider_horizontal_light_opaque.9.png delete mode 100644 packages/SystemUI/res/drawable-hdpi/status_bar_close_on.9.png delete mode 100644 packages/SystemUI/res/drawable-hdpi/statusbar_background.9.png delete mode 100644 packages/SystemUI/res/drawable-mdpi/battery_low_battery.png delete mode 100644 packages/SystemUI/res/drawable-mdpi/divider_horizontal_dark_opaque.9.png delete mode 100644 packages/SystemUI/res/drawable-mdpi/divider_horizontal_light_opaque.9.png delete mode 100644 packages/SystemUI/res/drawable-mdpi/ic_sysbar_back.png delete mode 100755 packages/SystemUI/res/drawable-mdpi/status_bar_close_on.9.png delete mode 100644 packages/SystemUI/res/drawable-mdpi/statusbar_background.9.png diff --git a/packages/SystemUI/res/drawable-hdpi/divider_horizontal_dark_opaque.9.png b/packages/SystemUI/res/drawable-hdpi/divider_horizontal_dark_opaque.9.png deleted file mode 100644 index d21aad295c291c4ba5adb87176f3703df7ba6a96..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2747 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 ZVURj59DnzGuqaS9gQu&X%Q~loCIA`DCQ$$Y diff --git a/packages/SystemUI/res/drawable-hdpi/status_bar_close_on.9.png b/packages/SystemUI/res/drawable-hdpi/status_bar_close_on.9.png deleted file mode 100644 index 87d194408536ed3f92fc318ab56c17f69eee46ec..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1262 zcmbVMTWs4@76ySj{h`E^9pvLzujtmc-R^qV8Ds7 z;b_Fad*(KRv~;IMKIi?gKErp2Wc{;^#*{ zsch)^^x<-~c6W9>FpXBOcbuuT9uI!Aw3qKpebn}$bnw*4uh#ch`o5HZe|72Q#B=Pe z#7@lGv7p2j{N+$=Vg7-YE6;aQ5%R~_diu?uGo88i`3K4Fm78BIys!QF+oMO%YSqgh zUr+oY?>^mkPi=PXgTO1hK8;+hZuFc#cJmk9TUHOQKD&6W*d;BVTiGJ8|EMMXxSuyH?K@|9-pWk)H2&{?&5{xfVNjyLYa;#s34PQv>2`^3aig E0EWG_(f|Me diff --git a/packages/SystemUI/res/drawable-hdpi/statusbar_background.9.png b/packages/SystemUI/res/drawable-hdpi/statusbar_background.9.png deleted file mode 100644 index a93383326758d171c094a3caf0a8db9c2e3e9827..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2846 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 M07*qoM6N<$g6BqH>Hq)$ diff --git a/packages/SystemUI/res/drawable-mdpi/divider_horizontal_dark_opaque.9.png b/packages/SystemUI/res/drawable-mdpi/divider_horizontal_dark_opaque.9.png deleted file mode 100644 index 9444f0d185834634e2dde145af2276c93ff6a312..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2805 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 ZVURj59DnzGuqaS9gQu&X%Q~loCIA`DCQ$$Y diff --git a/packages/SystemUI/res/drawable-mdpi/ic_sysbar_back.png b/packages/SystemUI/res/drawable-mdpi/ic_sysbar_back.png deleted file mode 100644 index 6c5a79bab4c9f8c37c1aabfd683a1ea5a9a1d734..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 636 zcmV-?0)zdDP)dbVG7wVRUJ4ZXi@?ZDjyBFETkVF)%b!L52VT0o6%F zK~!jg?U*rc!Y~wue@78jhQh$yjjg>wcBCXr$Mz7Mpf_l@_6S|NBC#^kjSYz9%*p3shoyH6Js$XD? zReFwdeghzo#@GT_OMRlfQDr#eQ9TP)5jeu%R{Y6d7)X#WAw_uLFeBO_70831OePQG z@i>#fKJo2GoR0gRO6BeT!II{yWQ?%uh+{2{C>Z` zrx+I?5U2tlhT-fQ@PMI!ZFs;ypbqeWra)cb0gWxJD*SXhy<036pVx#3^!DJhKb|~z z(Z@M&(_j`yX9=C8ZNmeGyHJ*8&z$qN=Xu{@7|!HA8ocu82yDfNIF4U@-~Za}cF|}w z`jGp`2uq?Pu$CK1k_?U#PeLL|l0mE0dL??}D2m>KAQ%vF7DnqG zs4CI#_rIK~?KlD3aRRo}c!58j WgJTs>Izz1h0000$m42dX-@b$4u&d=3L1gX)h$SnZsW?-r5%(GQ`zk9!uLS~AsQn;zFfp39xYDT62(s|s5su(?)1Hb_`sNdc^+B->UA;;0DU00rm#qErP_Jpf(^ff>iyW z)Z+ZoqGVuvq$$HR1H%r#MIePh*I4-%Wdb85F~=o8ximL5uf)^ERtYGhmy(%cW$Nf? zZs6={ZfI#_U}j-xXyM}Ia}t%N=+=uFAB-e&w-_YfQ~)nYowuu!2CVqSum;nGLKfY?wDaS*RO%#=-F+)s6S{p5K`*eV}^(ye9iqQ!c$`VvUK^vhRDW zG}FB$|MoQ7&xZ{@+^CzS_U+8|t)CAZmr(sY;X~~8jp_T|SIgagKIi@XpNqK^J)Y&? zy(E=f5PgeFUw7>RX3x0%qu-eNm93uE?cY*zP5Dqgs|17ho8GS(y^rsK$`4OhKbLh* G2~7Z)!JtO~ diff --git a/packages/SystemUI/res/drawable-mdpi/statusbar_background.9.png b/packages/SystemUI/res/drawable-mdpi/statusbar_background.9.png deleted file mode 100644 index 6c588f792569e5e508c69e436e1025d8302a3c54..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2849 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 Date: Tue, 2 Nov 2010 13:47:20 -0700 Subject: [PATCH 20/90] In java, System.getProperty returns null when the property doesn't exist, rather than an empty string like it does in native code. b/3157546 Change-Id: I7985a405e4d2d1f20be0a151aa2cf2e5a83b380b --- media/java/android/media/MediaScanner.java | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/media/java/android/media/MediaScanner.java b/media/java/android/media/MediaScanner.java index 5aabddf0a24eb..8c3efffcdf3b2 100644 --- a/media/java/android/media/MediaScanner.java +++ b/media/java/android/media/MediaScanner.java @@ -383,6 +383,11 @@ public class MediaScanner private MyMediaScannerClient mClient = new MyMediaScannerClient(); + private boolean isDrmEnabled() { + String prop = System.getProperty("drm.service.enabled"); + return prop != null && prop.equals("true"); + } + private class MyMediaScannerClient implements MediaScannerClient { private String mArtist; @@ -449,8 +454,7 @@ public class MediaScanner } } - if (System.getProperty("drm.service.enabled").equals("true") - && MediaFile.isDrmFileType(mFileType)) { + if (isDrmEnabled() && MediaFile.isDrmFileType(mFileType)) { mFileType = getFileTypeFromDrm(path); } @@ -882,7 +886,7 @@ public class MediaScanner } private int getFileTypeFromDrm(String path) { - if (!System.getProperty("drm.service.enabled").equals("true")) { + if (!isDrmEnabled()) { return 0; } From 6e2956c2bb1a8b0b85f301474d02012dedbcc718 Mon Sep 17 00:00:00 2001 From: Joe Onorato Date: Tue, 2 Nov 2010 00:14:33 -0700 Subject: [PATCH 21/90] Put back the back button Change-Id: I0aea487eb2123d3d7e689c2f8ef24e9025a34aee --- .../SystemUI/res/drawable-mdpi/ic_sysbar_back.png | Bin 0 -> 979 bytes .../SystemUI/res/layout-xlarge/status_bar.xml | 2 +- 2 files changed, 1 insertion(+), 1 deletion(-) create mode 100644 packages/SystemUI/res/drawable-mdpi/ic_sysbar_back.png diff --git a/packages/SystemUI/res/drawable-mdpi/ic_sysbar_back.png b/packages/SystemUI/res/drawable-mdpi/ic_sysbar_back.png new file mode 100644 index 0000000000000000000000000000000000000000..6baf5ea9cff67b2f45c0d6b41182a8fd5053f406 GIT binary patch literal 979 zcmV;^11$WBP)WwYh{sp_f4Dy_e)t+Dk|;{Syj3_EbtF(32R1(&SKV4nhbthK5Sf zP!o;SZdUEAjN!4US$EYayn$i$?faPDoB7TASf*C1sfJn9sv#E&fC8WZC;$q80-yk{ zQrI5!$$%O_M?g8yB4}+`09*q#gKCKXdeCgIKqv;Vv9Y0ASXj`a;Ug`^FhIStX6>Qv z)p7s~xDJnT()eUDd3$qn^PR{u0~bOgIP2O*LAhMk#N+X$QmM3pJRs{141fknO=RKD z&W<~i$-J#rtDZs5LSmAt(&@BecXxM%zI&j zZY8Xw@p4FNFc?-FzjZoYN~_ftoKEMy)oLxbXmW-?DoOze;bQ9*N!4og575Nu=;%kE z&leZH7I^YUsy8}W$hwwcz>7|v=NEIi+=oac@+}&TE{bd#m%8{#4x#PsZBI6v6++0} zNeBVaEueSNa2x0Y81r5euY7g8-OH1clP5&+@nxQ92S722A=@-fuLlPQ7SJH{^8^5S z2@r=96BAE89?wrKI>(KmEC3DBW2R7v(&!q@Y)}pWQev@Kuuv$hgB>>!#NPDu^kci- zUc@SSB)4o1{KZ+ga3#3_&$c&!$cyn zPE;|GQ6R?yQnnH=AWJjD6a(05qwm4 z>pW1ym^?<3)y3=e?uEnQM|!>fC4^N$B9Jl(A`l3C(r7eaFqB-7`TUn{$(0;vIOIl- z+{?_(&AoTITt1d%Bci(Pym~>>v9YmrVWBgbOv`@1KYCdojM5Jrc%)=8t+q<7r% From d926e78c9b104412b80d9f55df3a4efb904ca06a Mon Sep 17 00:00:00 2001 From: Jim Miller Date: Thu, 4 Nov 2010 21:06:31 -0700 Subject: [PATCH 22/90] Fix 3165868: Fix stall in state machine logic in WaveView It was possible for the state machine to get stuck when user interaction and animations both completed before success was detected. This fixes the problem by explicitly advancing the state machine when an up event is detected. Change-Id: I802e3f1bb35aeab7a0d6f64e85acaa6980b9d65a --- core/java/com/android/internal/widget/WaveView.java | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/core/java/com/android/internal/widget/WaveView.java b/core/java/com/android/internal/widget/WaveView.java index f91d3d6a5c2b6..81633b12f2861 100644 --- a/core/java/com/android/internal/widget/WaveView.java +++ b/core/java/com/android/internal/widget/WaveView.java @@ -269,7 +269,7 @@ public class WaveView extends View implements ValueAnimator.AnimatorUpdateListen break; case STATE_ATTEMPTING: - if (DBG) Log.v(TAG, "State ATTEMPTING"); + if (DBG) Log.v(TAG, "State ATTEMPTING (fingerDown = " + fingerDown + ")"); //TweenMax.to(unlockHalo, 0.4, { x:mouseX, y:mouseY, scaleX:1, scaleY:1, // alpha: 1, ease:Quint.easeOut }); if (dragDistance > mSnapRadius) { @@ -282,6 +282,7 @@ public class WaveView extends View implements ValueAnimator.AnimatorUpdateListen mUnlockHalo.addAnimTo(0, 0, "scaleY", 1.0f, true); mUnlockHalo.addAnimTo(0, 0, "alpha", 1.0f, true); } else { + if (DBG) Log.v(TAG, "up detected, moving to STATE_UNLOCK_ATTEMPT"); mLockState = STATE_UNLOCK_ATTEMPT; } } else { @@ -480,9 +481,16 @@ public class WaveView extends View implements ValueAnimator.AnimatorUpdateListen break; case MotionEvent.ACTION_UP: + if (DBG) Log.v(TAG, "ACTION_UP"); mFingerDown = false; postDelayed(mLockTimerActions, RESET_TIMEOUT); setGrabbedState(OnTriggerListener.NO_HANDLE); + // Normally the state machine is driven by user interaction causing redraws. + // However, when there's no more user interaction and no running animations, + // the state machine stops advancing because onDraw() never gets called. + // The following ensures we advance to the next state in this case, + // either STATE_UNLOCK_ATTEMPT or STATE_RESET_LOCK. + waveUpdateFrame(mMouseX, mMouseY, mFingerDown); handled = true; break; From 3c88c4a8e113033bd4d30d6bc93b2af81435f70b Mon Sep 17 00:00:00 2001 From: Mike Lockwood Date: Fri, 5 Nov 2010 17:24:34 -0400 Subject: [PATCH 23/90] MediaScanner: Fix mismatch between internal and external file paths. Change-Id: If2fac90a466c4d63fc90f96e91733c9e9ca14680 Signed-off-by: Mike Lockwood --- media/java/android/media/MediaScanner.java | 34 +++++++++++++++------- 1 file changed, 23 insertions(+), 11 deletions(-) diff --git a/media/java/android/media/MediaScanner.java b/media/java/android/media/MediaScanner.java index 3f6b7a2f7861c..4fe2c43aec580 100644 --- a/media/java/android/media/MediaScanner.java +++ b/media/java/android/media/MediaScanner.java @@ -29,6 +29,7 @@ import android.database.SQLException; import android.drm.DrmManagerClient; import android.graphics.BitmapFactory; import android.net.Uri; +import android.os.Environment; import android.os.Process; import android.os.RemoteException; import android.os.SystemProperties; @@ -127,17 +128,6 @@ public class MediaScanner private static final int FILES_PRESCAN_FORMAT_COLUMN_INDEX = 2; private static final int FILES_PRESCAN_DATE_MODIFIED_COLUMN_INDEX = 3; - private static final String[] MEDIA_PRESCAN_PROJECTION = new String[] { - MediaStore.MediaColumns._ID, // 0 - MediaStore.MediaColumns.DATA, // 1 - MediaStore.MediaColumns.DATE_MODIFIED, // 2 - }; - - private static final int MEDIA_PRESCAN_ID_COLUMN_INDEX = 0; - private static final int MEDIA_PRESCAN_PATH_COLUMN_INDEX = 1; - private static final int MEDIA_PRESCAN_DATE_MODIFIED_COLUMN_INDEX = 2; - - private static final String[] PLAYLIST_MEMBERS_PROJECTION = new String[] { Audio.Playlists.Members.PLAYLIST_ID, // 0 }; @@ -301,6 +291,9 @@ public class MediaScanner private boolean mProcessPlaylists, mProcessGenres; private int mMtpObjectHandle; + private final String mMediaStoragePath; + private final String mExternalStoragePath; + // used when scanning the image database so we know whether we have to prune // old thumbnail files private int mOriginalCount; @@ -370,6 +363,14 @@ public class MediaScanner mBitmapOptions.inJustDecodeBounds = true; setDefaultRingtoneFileNames(); + + String mediaStoragePath = SystemProperties.get("ro.media.storage"); + if (mediaStoragePath != null && mediaStoragePath.length() > 0) { + mMediaStoragePath = mediaStoragePath; + } else { + mMediaStoragePath = null; + } + mExternalStoragePath = Environment.getExternalStorageDirectory().getAbsolutePath(); } private void setDefaultRingtoneFileNames() { @@ -459,6 +460,11 @@ public class MediaScanner } String key = path; + if (mMediaStoragePath != null && key.startsWith(mMediaStoragePath)) { + // MediaProvider uses external variant of path for _data, so we need to match + // against that path instead. + key = mExternalStoragePath + key.substring(mMediaStoragePath.length()); + } if (mCaseInsensitivePaths) { key = path.toLowerCase(); } @@ -925,6 +931,12 @@ public class MediaScanner } if (filePath != null) { + if (mMediaStoragePath != null && filePath.startsWith(mMediaStoragePath)) { + // MediaProvider uses external variant of path for _data, so we need to query + // using that path instead. + filePath = mExternalStoragePath + filePath.substring(mMediaStoragePath.length()); + } + // query for only one file where = Files.FileColumns.DATA + "=?"; selectionArgs = new String[] { filePath }; From 20ef3338c666cf34de2068d183218cde9619a118 Mon Sep 17 00:00:00 2001 From: "Tadashi G. Takaoka" Date: Tue, 9 Nov 2010 12:19:32 -0800 Subject: [PATCH 24/90] Revert "Add a history of InputMethodSubtype for getting the last subtype of selected IME when IME was changed." This reverts commit 1ab852fbcfe155c9d4373b7130f8515591669634. --- core/java/android/provider/Settings.java | 8 - .../server/InputMethodManagerService.java | 273 +++--------------- 2 files changed, 47 insertions(+), 234 deletions(-) diff --git a/core/java/android/provider/Settings.java b/core/java/android/provider/Settings.java index 1fe2c5a940947..ddfcb0652fd97 100644 --- a/core/java/android/provider/Settings.java +++ b/core/java/android/provider/Settings.java @@ -2395,14 +2395,6 @@ public final class Settings { public static final String SELECTED_INPUT_METHOD_SUBTYPE = "selected_input_method_subtype"; - /** - * Setting to record the history of input method subtype, holding the pair of ID of IME - * and its last used subtype. - * @hide - */ - public static final String INPUT_METHODS_SUBTYPE_HISTORY = - "input_methods_subtype_history"; - /** * Whether the device has been provisioned (0 = false, 1 = true) */ diff --git a/services/java/com/android/server/InputMethodManagerService.java b/services/java/com/android/server/InputMethodManagerService.java index da5f204f438cc..d035eb586aad1 100644 --- a/services/java/com/android/server/InputMethodManagerService.java +++ b/services/java/com/android/server/InputMethodManagerService.java @@ -116,7 +116,6 @@ public class InputMethodManagerService extends IInputMethodManager.Stub static final long TIME_TO_RECONNECT = 10*1000; private static final int NOT_A_SUBTYPE_ID = -1; - private static final String NOT_A_SUBTYPE_ID_STR = String.valueOf(NOT_A_SUBTYPE_ID); // If IME doesn't support the system locale, the default subtype will be the first defined one. private static final int DEFAULT_SUBTYPE_ID = 0; @@ -367,7 +366,9 @@ public class InputMethodManagerService extends IInputMethodManager.Stub if (!doit) { return true; } - resetSelectedInputMethodAndSubtypeLocked(""); + Settings.Secure.putString(mContext.getContentResolver(), + Settings.Secure.DEFAULT_INPUT_METHOD, ""); + resetSelectedInputMethodSubtype(); chooseNewDefaultIMELocked(); return true; } @@ -424,7 +425,9 @@ public class InputMethodManagerService extends IInputMethodManager.Stub changed = true; curIm = null; Slog.i(TAG, "Unsetting current input method"); - resetSelectedInputMethodAndSubtypeLocked(""); + Settings.Secure.putString(mContext.getContentResolver(), + Settings.Secure.DEFAULT_INPUT_METHOD, ""); + resetSelectedInputMethodSubtype(); } } } @@ -507,7 +510,9 @@ public class InputMethodManagerService extends IInputMethodManager.Stub Slog.i(TAG, "No default found, using " + defIm.getId()); } if (defIm != null) { - setSelectSubtypeLocked(defIm, NOT_A_SUBTYPE_ID); + Settings.Secure.putString(mContext.getContentResolver(), + Settings.Secure.DEFAULT_INPUT_METHOD, defIm.getId()); + putSelectedInputMethodSubtype(defIm, NOT_A_SUBTYPE_ID); } } @@ -989,7 +994,7 @@ public class InputMethodManagerService extends IInputMethodManager.Stub synchronized (mMethodMap) { if (mCurMethod != null) { try { - setSelectSubtypeLocked(info, subtypeId); + putSelectedInputMethodSubtype(info, subtypeId); if (mInputShown) { // If mInputShown is false, there is no IME button on the // system bar. @@ -1009,13 +1014,13 @@ public class InputMethodManagerService extends IInputMethodManager.Stub final long ident = Binder.clearCallingIdentity(); try { + mCurMethodId = id; // Set a subtype to this input method. // subtypeId the name of a subtype which will be set. - setSelectedInputMethodAndSubtypeLocked(info, subtypeId); - // mCurMethodId should be updated after setSelectedInputMethodAndSubtypeLocked() - // because mCurMethodId is stored as a history in - // setSelectedInputMethodAndSubtypeLocked(). - mCurMethodId = id; + putSelectedInputMethodSubtype(info, subtypeId); + + Settings.Secure.putString(mContext.getContentResolver(), + Settings.Secure.DEFAULT_INPUT_METHOD, id); if (ActivityManagerNative.isSystemReady()) { Intent intent = new Intent(Intent.ACTION_INPUT_METHOD_CHANGED); @@ -1482,7 +1487,9 @@ public class InputMethodManagerService extends IInputMethodManager.Stub } } InputMethodInfo imi = enabled.get(i); - resetSelectedInputMethodAndSubtypeLocked(imi.getId()); + Settings.Secure.putString(mContext.getContentResolver(), + Settings.Secure.DEFAULT_INPUT_METHOD, imi.getId()); + putSelectedInputMethodSubtype(imi, NOT_A_SUBTYPE_ID); return true; } @@ -1786,8 +1793,11 @@ public class InputMethodManagerService extends IInputMethodManager.Stub String selId = Settings.Secure.getString(mContext.getContentResolver(), Settings.Secure.DEFAULT_INPUT_METHOD); if (id.equals(selId)) { - resetSelectedInputMethodAndSubtypeLocked(enabledInputMethodsList.size() > 0 - ? enabledInputMethodsList.get(0).first : ""); + Settings.Secure.putString( + mContext.getContentResolver(), Settings.Secure.DEFAULT_INPUT_METHOD, + enabledInputMethodsList.size() > 0 + ? enabledInputMethodsList.get(0).first : ""); + resetSelectedInputMethodSubtype(); } // Previous state was enabled. return true; @@ -1799,54 +1809,22 @@ public class InputMethodManagerService extends IInputMethodManager.Stub } } - private void saveCurrentInputMethodAndSubtypeToHistory() { - String subtypeId = NOT_A_SUBTYPE_ID_STR; - if (mCurrentSubtype != null) { - subtypeId = String.valueOf(mCurrentSubtype.hashCode()); - } - mSettings.addSubtypeToHistory(mCurMethodId, subtypeId); + private void resetSelectedInputMethodSubtype() { + Settings.Secure.putInt(mContext.getContentResolver(), + Settings.Secure.SELECTED_INPUT_METHOD_SUBTYPE, NOT_A_SUBTYPE_ID); } - private void setSelectSubtypeLocked(InputMethodInfo imi, int subtypeId) { - saveCurrentInputMethodAndSubtypeToHistory(); - if (imi == null || subtypeId < 0) { - mSettings.putSelectedSubtype(NOT_A_SUBTYPE_ID); - mCurrentSubtype = null; + private void putSelectedInputMethodSubtype(InputMethodInfo imi, int subtypeId) { + final ArrayList subtypes = imi.getSubtypes(); + if (subtypeId >= 0 && subtypeId < subtypes.size()) { + Settings.Secure.putInt(mContext.getContentResolver(), + Settings.Secure.SELECTED_INPUT_METHOD_SUBTYPE, + subtypes.get(subtypeId).hashCode()); + mCurrentSubtype = subtypes.get(subtypeId); } else { - final ArrayList subtypes = imi.getSubtypes(); - if (subtypeId < subtypes.size()) { - mSettings.putSelectedSubtype(subtypes.get(subtypeId).hashCode()); - mCurrentSubtype = subtypes.get(subtypeId); - } else { - mSettings.putSelectedSubtype(NOT_A_SUBTYPE_ID); - mCurrentSubtype = null; - } + resetSelectedInputMethodSubtype(); + mCurrentSubtype = null; } - - } - - private void setSelectedInputMethodAndSubtypeLocked(InputMethodInfo imi, int subtypeId) { - setSelectSubtypeLocked(imi, subtypeId); - mSettings.putSelectedInputMethod(imi.getId()); - } - - private void resetSelectedInputMethodAndSubtypeLocked(String newDefaultIme) { - InputMethodInfo imi = mMethodMap.get(newDefaultIme); - int lastSubtypeId = NOT_A_SUBTYPE_ID; - // newDefaultIme is empty when there is no candidate for the selected IME. - if (imi != null && !TextUtils.isEmpty(newDefaultIme)) { - String subtypeHashCode = mSettings.getLastSubtypeForInputMethodLocked(newDefaultIme); - if (subtypeHashCode != null) { - try { - lastSubtypeId = getSubtypeIdFromHashCode( - imi, Integer.valueOf(subtypeHashCode)); - } catch (NumberFormatException e) { - Slog.w(TAG, "HashCode for subtype looks broken: " + subtypeHashCode, e); - } - } - } - setSelectSubtypeLocked(imi, lastSubtypeId); - mSettings.putSelectedInputMethod(newDefaultIme); } private int getSelectedInputMethodSubtypeId(String id) { @@ -1854,6 +1832,7 @@ public class InputMethodManagerService extends IInputMethodManager.Stub if (imi == null) { return NOT_A_SUBTYPE_ID; } + ArrayList subtypes = imi.getSubtypes(); int subtypeId; try { subtypeId = Settings.Secure.getInt(mContext.getContentResolver(), @@ -1861,14 +1840,9 @@ public class InputMethodManagerService extends IInputMethodManager.Stub } catch (SettingNotFoundException e) { return NOT_A_SUBTYPE_ID; } - return getSubtypeIdFromHashCode(imi, subtypeId); - } - - private int getSubtypeIdFromHashCode(InputMethodInfo imi, int subtypeHashCode) { - ArrayList subtypes = imi.getSubtypes(); for (int i = 0; i < subtypes.size(); ++i) { InputMethodSubtype ims = subtypes.get(i); - if (subtypeHashCode == ims.hashCode()) { + if (subtypeId == ims.hashCode()) { return i; } } @@ -1948,10 +1922,10 @@ public class InputMethodManagerService extends IInputMethodManager.Stub // example: ("ime0;subtype0;subtype1;subtype2:ime1:ime2;subtype0") private static final char INPUT_METHOD_SEPARATER = ':'; private static final char INPUT_METHOD_SUBTYPE_SEPARATER = ';'; - private final TextUtils.SimpleStringSplitter mInputMethodSplitter = + private final TextUtils.SimpleStringSplitter mStringColonSplitter = new TextUtils.SimpleStringSplitter(INPUT_METHOD_SEPARATER); - private final TextUtils.SimpleStringSplitter mSubtypeSplitter = + private final TextUtils.SimpleStringSplitter mStringSemiColonSplitter = new TextUtils.SimpleStringSplitter(INPUT_METHOD_SUBTYPE_SEPARATER); private final ContentResolver mResolver; @@ -2014,16 +1988,16 @@ public class InputMethodManagerService extends IInputMethodManager.Stub if (TextUtils.isEmpty(enabledInputMethodsStr)) { return imsList; } - mInputMethodSplitter.setString(enabledInputMethodsStr); - while (mInputMethodSplitter.hasNext()) { - String nextImsStr = mInputMethodSplitter.next(); - mSubtypeSplitter.setString(nextImsStr); - if (mSubtypeSplitter.hasNext()) { + mStringColonSplitter.setString(enabledInputMethodsStr); + while (mStringColonSplitter.hasNext()) { + String nextImsStr = mStringColonSplitter.next(); + mStringSemiColonSplitter.setString(nextImsStr); + if (mStringSemiColonSplitter.hasNext()) { ArrayList subtypeHashes = new ArrayList(); // The first element is ime id. - String imeId = mSubtypeSplitter.next(); - while (mSubtypeSplitter.hasNext()) { - subtypeHashes.add(mSubtypeSplitter.next()); + String imeId = mStringSemiColonSplitter.next(); + while (mStringSemiColonSplitter.hasNext()) { + subtypeHashes.add(mStringSemiColonSplitter.next()); } imsList.add(new Pair>(imeId, subtypeHashes)); } @@ -2109,161 +2083,8 @@ public class InputMethodManagerService extends IInputMethodManager.Stub private String getEnabledInputMethodsStr() { mEnabledInputMethodsStrCache = Settings.Secure.getString( mResolver, Settings.Secure.ENABLED_INPUT_METHODS); - if (DEBUG) { - Slog.d(TAG, "getEnabledInputMethodsStr: " + mEnabledInputMethodsStrCache); - } return mEnabledInputMethodsStrCache; } - - private void saveSubtypeHistory( - List> savedImes, String newImeId, String newSubtypeId) { - StringBuilder builder = new StringBuilder(); - boolean isImeAdded = false; - if (!TextUtils.isEmpty(newImeId) && !TextUtils.isEmpty(newSubtypeId)) { - builder.append(newImeId).append(INPUT_METHOD_SUBTYPE_SEPARATER).append( - newSubtypeId); - isImeAdded = true; - } - for (Pair ime: savedImes) { - String imeId = ime.first; - String subtypeId = ime.second; - if (TextUtils.isEmpty(subtypeId)) { - subtypeId = NOT_A_SUBTYPE_ID_STR; - } - if (isImeAdded) { - builder.append(INPUT_METHOD_SEPARATER); - } else { - isImeAdded = true; - } - builder.append(imeId).append(INPUT_METHOD_SUBTYPE_SEPARATER).append( - subtypeId); - } - // Remove the last INPUT_METHOD_SEPARATER - putSubtypeHistoryStr(builder.toString()); - } - - public void addSubtypeToHistory(String imeId, String subtypeId) { - List> subtypeHistory = loadInputMethodAndSubtypeHistoryLocked(); - for (Pair ime: subtypeHistory) { - if (ime.first.equals(imeId)) { - if (DEBUG) { - Slog.v(TAG, "Subtype found in the history: " + imeId - + ime.second); - } - // We should break here - subtypeHistory.remove(ime); - break; - } - } - saveSubtypeHistory(subtypeHistory, imeId, subtypeId); - } - - private void putSubtypeHistoryStr(String str) { - if (DEBUG) { - Slog.d(TAG, "putSubtypeHistoryStr: " + str); - } - Settings.Secure.putString( - mResolver, Settings.Secure.INPUT_METHODS_SUBTYPE_HISTORY, str); - } - - public Pair getLastInputMethodAndSubtypeLocked() { - // Gets the first one from the history - return getLastSubtypeForInputMethodLockedInternal(null); - } - - public String getLastSubtypeForInputMethodLocked(String imeId) { - Pair ime = getLastSubtypeForInputMethodLockedInternal(imeId); - if (ime != null) { - return ime.second; - } else { - return null; - } - } - - private Pair getLastSubtypeForInputMethodLockedInternal(String imeId) { - List>> enabledImes = - getEnabledInputMethodsAndSubtypeListLocked(); - List> subtypeHistory = loadInputMethodAndSubtypeHistoryLocked(); - for (Pair imeAndSubtype: subtypeHistory) { - final String imeInTheHistory = imeAndSubtype.first; - // If imeId is empty, returns the first IME and subtype in the history - if (TextUtils.isEmpty(imeId) || imeInTheHistory.equals(imeId)) { - final String subtypeInTheHistory = imeAndSubtype.second; - final String subtypeHashCode = getEnabledSubtypeForInputMethodAndSubtypeLocked( - enabledImes, imeInTheHistory, subtypeInTheHistory); - if (!TextUtils.isEmpty(subtypeHashCode)) { - if (DEBUG) { - Slog.d(TAG, "Enabled subtype found in the history:" + subtypeHashCode); - } - return new Pair(imeInTheHistory, subtypeHashCode); - } - } - } - if (DEBUG) { - Slog.d(TAG, "No enabled IME found in the history"); - } - return null; - } - - private String getEnabledSubtypeForInputMethodAndSubtypeLocked(List>> enabledImes, String imeId, String subtypeHashCode) { - for (Pair> enabledIme: enabledImes) { - if (enabledIme.first.equals(imeId)) { - for (String s: enabledIme.second) { - if (s.equals(subtypeHashCode)) { - // If both imeId and subtypeId are enabled, return subtypeId. - return s; - } - } - // If imeId was enabled but subtypeId was disabled. - return NOT_A_SUBTYPE_ID_STR; - } - } - // If both imeId and subtypeId are disabled, return null - return null; - } - - private List> loadInputMethodAndSubtypeHistoryLocked() { - ArrayList> imsList = new ArrayList>(); - final String subtypeHistoryStr = getSubtypeHistoryStr(); - if (TextUtils.isEmpty(subtypeHistoryStr)) { - return imsList; - } - mInputMethodSplitter.setString(subtypeHistoryStr); - while (mInputMethodSplitter.hasNext()) { - String nextImsStr = mInputMethodSplitter.next(); - mSubtypeSplitter.setString(nextImsStr); - if (mSubtypeSplitter.hasNext()) { - String subtypeId = NOT_A_SUBTYPE_ID_STR; - // The first element is ime id. - String imeId = mSubtypeSplitter.next(); - while (mSubtypeSplitter.hasNext()) { - subtypeId = mSubtypeSplitter.next(); - break; - } - imsList.add(new Pair(imeId, subtypeId)); - } - } - return imsList; - } - - private String getSubtypeHistoryStr() { - if (DEBUG) { - Slog.d(TAG, "getSubtypeHistoryStr: " + Settings.Secure.getString( - mResolver, Settings.Secure.INPUT_METHODS_SUBTYPE_HISTORY)); - } - return Settings.Secure.getString( - mResolver, Settings.Secure.INPUT_METHODS_SUBTYPE_HISTORY); - } - - public void putSelectedInputMethod(String imeId) { - Settings.Secure.putString(mResolver, Settings.Secure.DEFAULT_INPUT_METHOD, imeId); - } - - public void putSelectedSubtype(int subtypeId) { - Settings.Secure.putInt( - mResolver, Settings.Secure.SELECTED_INPUT_METHOD_SUBTYPE, subtypeId); - } } // ---------------------------------------------------------------------- From b4dbb4bcd0ec9c51acb1b4426caf2a5f4e4f9e80 Mon Sep 17 00:00:00 2001 From: Leon Scroggins Date: Thu, 11 Nov 2010 14:20:06 -0500 Subject: [PATCH 25/90] Ensure that text passed in is non-null. Bug:3183112 Change-Id: Icf00e2793cb9b62dd0ebb4f60b8ddcafea3e581f --- core/java/android/webkit/WebView.java | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/core/java/android/webkit/WebView.java b/core/java/android/webkit/WebView.java index fb760ac708d87..f3f9a6d95ba67 100644 --- a/core/java/android/webkit/WebView.java +++ b/core/java/android/webkit/WebView.java @@ -6529,8 +6529,11 @@ public class WebView extends AbsoluteLayout // If the text entry has created more events, ignore // this one. } else if (msg.arg2 == mTextGeneration) { - mWebTextView.setTextAndKeepSelection( - (String) msg.obj); + String text = (String) msg.obj; + if (null == text) { + text = ""; + } + mWebTextView.setTextAndKeepSelection(text); } } break; From 48f7f84a41a8b717d077e4db53f8454242194955 Mon Sep 17 00:00:00 2001 From: Vasu Nori Date: Mon, 15 Nov 2010 13:10:11 -0800 Subject: [PATCH 26/90] map _data column to local_filename column. bug:3197501 this bug is caused by Change-Id: Ief1693785f0484c1b434fb41a68693f9aff96492 Change-Id: Id654322d587968f50aecc7d965b8d7a8d78ce50d --- core/java/android/app/DownloadManager.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/java/android/app/DownloadManager.java b/core/java/android/app/DownloadManager.java index 3a6fd231ba393..0741d41b1cf8f 100644 --- a/core/java/android/app/DownloadManager.java +++ b/core/java/android/app/DownloadManager.java @@ -284,7 +284,7 @@ public class DownloadManager { */ public static final String[] UNDERLYING_COLUMNS = new String[] { Downloads.Impl._ID, - Downloads.Impl._DATA, + Downloads.Impl._DATA + " AS " + COLUMN_LOCAL_FILENAME, Downloads.Impl.COLUMN_MEDIAPROVIDER_URI, Downloads.Impl.COLUMN_DESTINATION, Downloads.Impl.COLUMN_TITLE, From 18b51eca98a7f4bc83dae80b1b8845e6a6efb674 Mon Sep 17 00:00:00 2001 From: Jim Miller Date: Tue, 16 Nov 2010 18:56:42 -0800 Subject: [PATCH 27/90] Fix 3191824: Fix lockscreen portrait mode for xlarge devices This fixes a number of bugs in the layout file for lockscreen. Change-Id: I58f66389939e91e8e2184940d6824e0fe0650986 --- .../keyguard_screen_tab_unlock.xml | 24 +++++++++---------- 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/core/res/res/layout-xlarge/keyguard_screen_tab_unlock.xml b/core/res/res/layout-xlarge/keyguard_screen_tab_unlock.xml index b3645aada1f2a..c76e8339bdc9b 100644 --- a/core/res/res/layout-xlarge/keyguard_screen_tab_unlock.xml +++ b/core/res/res/layout-xlarge/keyguard_screen_tab_unlock.xml @@ -21,23 +21,22 @@ state of the device, as well as instructions on how to get past it depending on the state of the device. It is the same for landscape and portrait.--> - + android:orientation="vertical" + android:id="@+id/root" + android:background="#70000000"> - + android:layout_width="match_parent" + android:layout_height="0dip" + android:layout_weight="1" + android:orientation="vertical" + android:gravity="center_vertical"> + @@ -93,5 +93,5 @@ /> - + From c99582bb16c57f0b178794d64a6723854f2851e7 Mon Sep 17 00:00:00 2001 From: Brad Fitzpatrick Date: Tue, 23 Nov 2010 10:31:52 -0800 Subject: [PATCH 28/90] StrictMode fingerprinting / hashCode improvements. Change-Id: I08ff939327f7c11a562851847ae91c67b1db4f87 --- core/java/android/os/StrictMode.java | 20 ++++++++++++++++++- .../server/am/ActivityManagerService.java | 4 ++-- 2 files changed, 21 insertions(+), 3 deletions(-) diff --git a/core/java/android/os/StrictMode.java b/core/java/android/os/StrictMode.java index 86322acc10dab..e986181540e52 100644 --- a/core/java/android/os/StrictMode.java +++ b/core/java/android/os/StrictMode.java @@ -988,7 +988,7 @@ public final class StrictMode { } // Not perfect, but fast and good enough for dup suppression. - Integer crashFingerprint = info.crashInfo.stackTrace.hashCode(); + Integer crashFingerprint = info.hashCode(); long lastViolationTime = 0; if (mLastViolationTime.containsKey(crashFingerprint)) { lastViolationTime = mLastViolationTime.get(crashFingerprint); @@ -1545,6 +1545,24 @@ public final class StrictMode { } } + @Override + public int hashCode() { + int result = 17; + result = 37 * result + crashInfo.stackTrace.hashCode(); + if (numAnimationsRunning != 0) { + result *= 37; + } + if (broadcastIntentAction != null) { + result = 37 * result + broadcastIntentAction.hashCode(); + } + if (tags != null) { + for (String tag : tags) { + result = 37 * result + tag.hashCode(); + } + } + return result; + } + /** * Create an instance of ViolationInfo initialized from a Parcel. */ diff --git a/services/java/com/android/server/am/ActivityManagerService.java b/services/java/com/android/server/am/ActivityManagerService.java index 1773eca9d50db..1a10cffe15ced 100644 --- a/services/java/com/android/server/am/ActivityManagerService.java +++ b/services/java/com/android/server/am/ActivityManagerService.java @@ -557,7 +557,7 @@ public final class ActivityManagerService extends ActivityManagerNative = new HashMap>(); /** - * Fingerprints (String.hashCode()) of stack traces that we've + * Fingerprints (hashCode()) of stack traces that we've * already logged DropBox entries for. Guarded by itself. If * something (rogue user app) forces this over * MAX_DUP_SUPPRESSED_STACKS entries, the contents are cleared. @@ -6671,7 +6671,7 @@ public final class ActivityManagerService extends ActivityManagerNative ProcessRecord r = findAppProcess(app); if ((violationMask & StrictMode.PENALTY_DROPBOX) != 0) { - Integer stackFingerprint = info.crashInfo.stackTrace.hashCode(); + Integer stackFingerprint = info.hashCode(); boolean logIt = true; synchronized (mAlreadyLoggedViolatedStacks) { if (mAlreadyLoggedViolatedStacks.contains(stackFingerprint)) { From d91fe8e64008cf2465ab4d969eded642a0e003ab Mon Sep 17 00:00:00 2001 From: Vasu Nori Date: Mon, 22 Nov 2010 11:55:51 -0800 Subject: [PATCH 29/90] print certain rows from downloads.db when bugreports are taken when downloads fail/get stuck, we need to look at the database state for those downloads. and when the users report such problems, it is a royal pain not to have that info and most users don't seem to bother sending database dumps because it is a bit of work. so lets just dump info about downloads that failed or downloads from GSF (OTAs, for example) helps debugging. there is STOP ship comment to not dump data once HC is released. Change-Id: Id1254982fd82b4c55f1816a2491f00966840f024 --- core/java/android/app/ActivityThread.java | 6 +++ .../database/sqlite/SQLiteDatabase.java | 42 ++++++++++++++++++- .../android/database/sqlite/SQLiteDebug.java | 16 ++++--- 3 files changed, 56 insertions(+), 8 deletions(-) diff --git a/core/java/android/app/ActivityThread.java b/core/java/android/app/ActivityThread.java index c0714e3bba254..5c4f57a51ac00 100644 --- a/core/java/android/app/ActivityThread.java +++ b/core/java/android/app/ActivityThread.java @@ -870,6 +870,12 @@ public final class ActivityThread { (dbStats.dbSize > 0) ? String.valueOf(dbStats.dbSize) : " ", (dbStats.lookaside > 0) ? String.valueOf(dbStats.lookaside) : " ", dbStats.cache, dbStats.dbName); + if (dbStats.dataDump != null) { + int size = dbStats.dataDump.size(); + for (int dumpIndex = 0; dumpIndex < size; dumpIndex++) { + printRow(pw, "%s", dbStats.dataDump.get(dumpIndex)); + } + } } } diff --git a/core/java/android/database/sqlite/SQLiteDatabase.java b/core/java/android/database/sqlite/SQLiteDatabase.java index 7efb7fdc1ac14..87f55d2045d11 100644 --- a/core/java/android/database/sqlite/SQLiteDatabase.java +++ b/core/java/android/database/sqlite/SQLiteDatabase.java @@ -2507,7 +2507,7 @@ public class SQLiteDatabase extends SQLiteClosable { if (pageCount > 0) { dbStatsList.add(new DbStats(dbName, pageCount, db.getPageSize(), lookasideUsed, db.getCacheHitNum(), db.getCacheMissNum(), - db.getCachesize())); + db.getCachesize(), getDataDump(db))); } } // if there are pooled connections, return the cache stats for them also. @@ -2518,7 +2518,7 @@ public class SQLiteDatabase extends SQLiteClosable { for (SQLiteDatabase pDb : connPool.getConnectionList()) { dbStatsList.add(new DbStats("(pooled # " + pDb.mConnectionNum + ") " + lastnode, 0, 0, 0, pDb.getCacheHitNum(), - pDb.getCacheMissNum(), pDb.getCachesize())); + pDb.getCacheMissNum(), pDb.getCachesize(), null)); } } } catch (SQLiteException e) { @@ -2529,6 +2529,44 @@ public class SQLiteDatabase extends SQLiteClosable { return dbStatsList; } + private static ArrayList getDataDump(SQLiteDatabase db) { + // create database dump of certain data from certain databases for debugging purposes + if (db.getPath().equalsIgnoreCase( + "/data/data/com.android.providers.downloads/databases/downloads.db")) { + String sql = + "select * from downloads " + + " where notificationpackage = 'com.google.android.gsf'" + + " or status >= 400"; + Cursor cursor = db.rawQuery(sql, null); + try { + int count = cursor.getCount(); + if (count == 0) { + return null; + } + ArrayList buff = new ArrayList(); + buff.add(" Data from downloads.db"); + int columnCount = cursor.getColumnCount(); + for (int i =0; i < count && cursor.moveToNext(); i++) { + buff.add(" Row#" + i + ""); + for (int j = 0; j < columnCount; j++) { + String colName = cursor.getColumnName(j); + String value = cursor.getString(j); + buff.add(" " + colName + " = " + value); + } + } + for (String s : buff) Log.i("vnoritag", s); + return buff; + } catch (SQLiteException e) { + Log.w(TAG, "exception in executing the sql: " + sql, e); + } finally { + if (cursor != null) { + cursor.close(); + } + } + } + return null; + } + /** * Returns list of full pathnames of all attached databases including the main database * by executing 'pragma database_list' on the database. diff --git a/core/java/android/database/sqlite/SQLiteDebug.java b/core/java/android/database/sqlite/SQLiteDebug.java index 9496079178e61..72377f074bf5f 100644 --- a/core/java/android/database/sqlite/SQLiteDebug.java +++ b/core/java/android/database/sqlite/SQLiteDebug.java @@ -121,27 +121,31 @@ public final class SQLiteDebug { */ public static class DbStats { /** name of the database */ - public String dbName; + public final String dbName; /** the page size for the database */ - public long pageSize; + public final long pageSize; /** the database size */ - public long dbSize; + public final long dbSize; /** documented here http://www.sqlite.org/c3ref/c_dbstatus_lookaside_used.html */ - public int lookaside; + public final int lookaside; /** statement cache stats: hits/misses/cachesize */ - public String cache; + public final String cache; + + /** database dump of 'useful info for debugging only */ + public final ArrayList dataDump; public DbStats(String dbName, long pageCount, long pageSize, int lookaside, - int hits, int misses, int cachesize) { + int hits, int misses, int cachesize, ArrayList data) { this.dbName = dbName; this.pageSize = pageSize / 1024; dbSize = (pageCount * pageSize) / 1024; this.lookaside = lookaside; this.cache = hits + "/" + misses + "/" + cachesize; + this.dataDump = data; } } From dfc1d2c58ec7a6de418c1899bec4b671abf5660b Mon Sep 17 00:00:00 2001 From: Adam Powell Date: Wed, 25 Aug 2010 14:37:03 -0700 Subject: [PATCH 30/90] Merge overscrolling from gingerbread. Change-Id: I3eb4413261b38ddd8c609d6153bdfd4ae46c6a0f --- api/current.xml | 560 +++++++++++ core/java/android/view/View.java | 163 ++++ core/java/android/view/ViewConfiguration.java | 33 +- core/java/android/webkit/OverScrollGlow.java | 223 +++++ core/java/android/webkit/WebSettings.java | 19 + core/java/android/webkit/WebView.java | 328 +++++-- core/java/android/widget/AbsListView.java | 698 +++++++++++--- core/java/android/widget/EdgeGlow.java | 327 +++++++ core/java/android/widget/GridView.java | 7 +- .../android/widget/HorizontalScrollView.java | 193 +++- core/java/android/widget/ListView.java | 166 +++- core/java/android/widget/OverScroller.java | 888 ++++++++++++++++++ core/java/android/widget/ScrollView.java | 184 +++- core/java/android/widget/Scroller.java | 44 +- core/res/res/layout/alert_dialog.xml | 3 +- .../res/layout/preference_dialog_edittext.xml | 3 +- core/res/res/layout/select_dialog.xml | 3 +- core/res/res/values/attrs.xml | 18 + core/res/res/values/public.xml | 3 + .../res/layout/status_bar_expanded.xml | 1 + 20 files changed, 3606 insertions(+), 258 deletions(-) create mode 100644 core/java/android/webkit/OverScrollGlow.java create mode 100644 core/java/android/widget/EdgeGlow.java create mode 100644 core/java/android/widget/OverScroller.java diff --git a/api/current.xml b/api/current.xml index 403e3d058fb6d..fb8f65b0a8c87 100644 --- a/api/current.xml +++ b/api/current.xml @@ -6774,6 +6774,39 @@ visibility="public" > + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + computeHorizontalScrollExtent(); + final boolean canScrollVertical = + computeVerticalScrollRange() > computeVerticalScrollExtent(); + final boolean overScrollHorizontal = overScrollMode == OVER_SCROLL_ALWAYS || + (overScrollMode == OVER_SCROLL_IF_CONTENT_SCROLLS && canScrollHorizontal); + final boolean overScrollVertical = overScrollMode == OVER_SCROLL_ALWAYS || + (overScrollMode == OVER_SCROLL_IF_CONTENT_SCROLLS && canScrollVertical); + + int newScrollX = scrollX + deltaX; + if (!overScrollHorizontal) { + maxOverScrollX = 0; + } + + int newScrollY = scrollY + deltaY; + if (!overScrollVertical) { + maxOverScrollY = 0; + } + + // Clamp values if at the limits and record + final int left = -maxOverScrollX; + final int right = maxOverScrollX + scrollRangeX; + final int top = -maxOverScrollY; + final int bottom = maxOverScrollY + scrollRangeY; + + boolean clampedX = false; + if (newScrollX > right) { + newScrollX = right; + clampedX = true; + } else if (newScrollX < left) { + newScrollX = left; + clampedX = true; + } + + boolean clampedY = false; + if (newScrollY > bottom) { + newScrollY = bottom; + clampedY = true; + } else if (newScrollY < top) { + newScrollY = top; + clampedY = true; + } + + onOverScrolled(newScrollX, newScrollY, clampedX, clampedY); + + return clampedX || clampedY; + } + + /** + * Called by {@link #overScrollBy(int, int, int, int, int, int, int, int, boolean)} to + * respond to the results of an over-scroll operation. + * + * @param scrollX New X scroll value in pixels + * @param scrollY New Y scroll value in pixels + * @param clampedX True if scrollX was clamped to an over-scroll boundary + * @param clampedY True if scrollY was clamped to an over-scroll boundary + */ + protected void onOverScrolled(int scrollX, int scrollY, + boolean clampedX, boolean clampedY) { + // Intentionally empty. + } + + /** + * Returns the over-scroll mode for this view. The result will be + * one of {@link #OVER_SCROLL_ALWAYS} (default), {@link #OVER_SCROLL_IF_CONTENT_SCROLLS} + * (allow over-scrolling only if the view content is larger than the container), + * or {@link #OVER_SCROLL_NEVER}. + * + * @return This view's over-scroll mode. + */ + public int getOverScrollMode() { + return mOverScrollMode; + } + + /** + * Set the over-scroll mode for this view. Valid over-scroll modes are + * {@link #OVER_SCROLL_ALWAYS} (default), {@link #OVER_SCROLL_IF_CONTENT_SCROLLS} + * (allow over-scrolling only if the view content is larger than the container), + * or {@link #OVER_SCROLL_NEVER}. + * + * Setting the over-scroll mode of a view will have an effect only if the + * view is capable of scrolling. + * + * @param overScrollMode The new over-scroll mode for this view. + */ + public void setOverScrollMode(int overScrollMode) { + if (overScrollMode != OVER_SCROLL_ALWAYS && + overScrollMode != OVER_SCROLL_IF_CONTENT_SCROLLS && + overScrollMode != OVER_SCROLL_NEVER) { + throw new IllegalArgumentException("Invalid overscroll mode " + overScrollMode); + } + mOverScrollMode = overScrollMode; + } + /** * A MeasureSpec encapsulates the layout requirements passed from parent to child. * Each MeasureSpec represents a requirement for either the width or the height. diff --git a/core/java/android/view/ViewConfiguration.java b/core/java/android/view/ViewConfiguration.java index 85981d2137dc6..bb85894982442 100644 --- a/core/java/android/view/ViewConfiguration.java +++ b/core/java/android/view/ViewConfiguration.java @@ -144,7 +144,7 @@ public class ViewConfiguration { /** * Maximum velocity to initiate a fling, as measured in pixels per second */ - private static final int MAXIMUM_FLING_VELOCITY = 4000; + private static final int MAXIMUM_FLING_VELOCITY = 8000; /** * The maximum size of View's drawing cache, expressed in bytes. This size @@ -158,6 +158,16 @@ public class ViewConfiguration { */ private static float SCROLL_FRICTION = 0.015f; + /** + * Max distance to overscroll for edge effects + */ + private static final int OVERSCROLL_DISTANCE = 0; + + /** + * Max distance to overfling for edge effects + */ + private static final int OVERFLING_DISTANCE = 4; + private final int mEdgeSlop; private final int mFadingEdgeLength; private final int mMinimumFlingVelocity; @@ -168,6 +178,8 @@ public class ViewConfiguration { private final int mDoubleTapSlop; private final int mWindowTouchSlop; private final int mMaximumDrawingCacheSize; + private final int mOverscrollDistance; + private final int mOverflingDistance; private static final SparseArray sConfigurations = new SparseArray(2); @@ -188,6 +200,8 @@ public class ViewConfiguration { mWindowTouchSlop = WINDOW_TOUCH_SLOP; //noinspection deprecation mMaximumDrawingCacheSize = MAXIMUM_DRAWING_CACHE_SIZE; + mOverscrollDistance = OVERSCROLL_DISTANCE; + mOverflingDistance = OVERFLING_DISTANCE; } /** @@ -216,6 +230,9 @@ public class ViewConfiguration { // Size of the screen in bytes, in ARGB_8888 format mMaximumDrawingCacheSize = 4 * metrics.widthPixels * metrics.heightPixels; + + mOverscrollDistance = (int) (density * OVERSCROLL_DISTANCE + 0.5f); + mOverflingDistance = (int) (density * OVERFLING_DISTANCE + 0.5f); } /** @@ -472,6 +489,20 @@ public class ViewConfiguration { return mMaximumDrawingCacheSize; } + /** + * @return The maximum distance a View should overscroll by when showing edge effects. + */ + public int getScaledOverscrollDistance() { + return mOverscrollDistance; + } + + /** + * @return The maximum distance a View should overfling by when showing edge effects. + */ + public int getScaledOverflingDistance() { + return mOverflingDistance; + } + /** * The amount of time that the zoom controls should be * displayed on the screen expressed in milliseconds. diff --git a/core/java/android/webkit/OverScrollGlow.java b/core/java/android/webkit/OverScrollGlow.java new file mode 100644 index 0000000000000..53600f6924e04 --- /dev/null +++ b/core/java/android/webkit/OverScrollGlow.java @@ -0,0 +1,223 @@ +/* + * Copyright (C) 2010 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package android.webkit; + +import com.android.internal.R; + +import android.content.res.Resources; +import android.graphics.Canvas; +import android.graphics.drawable.Drawable; +import android.view.View; +import android.widget.EdgeGlow; + +/** + * This class manages the edge glow effect when a WebView is flung or pulled beyond the edges. + * @hide + */ +public class OverScrollGlow { + private WebView mHostView; + + private EdgeGlow mEdgeGlowTop; + private EdgeGlow mEdgeGlowBottom; + private EdgeGlow mEdgeGlowLeft; + private EdgeGlow mEdgeGlowRight; + + private int mOverScrollDeltaX; + private int mOverScrollDeltaY; + + public OverScrollGlow(WebView host) { + mHostView = host; + final Resources res = host.getContext().getResources(); + final Drawable edge = res.getDrawable(R.drawable.overscroll_edge); + final Drawable glow = res.getDrawable(R.drawable.overscroll_glow); + mEdgeGlowTop = new EdgeGlow(edge, glow); + mEdgeGlowBottom = new EdgeGlow(edge, glow); + mEdgeGlowLeft = new EdgeGlow(edge, glow); + mEdgeGlowRight = new EdgeGlow(edge, glow); + } + + /** + * Pull leftover touch scroll distance into one of the edge glows as appropriate. + * + * @param x Current X scroll offset + * @param y Current Y scroll offset + * @param oldX Old X scroll offset + * @param oldY Old Y scroll offset + * @param maxX Maximum range for horizontal scrolling + * @param maxY Maximum range for vertical scrolling + */ + public void pullGlow(int x, int y, int oldX, int oldY, int maxX, int maxY) { + // Only show overscroll bars if there was no movement in any direction + // as a result of scrolling. + if (oldX == mHostView.getScrollX() && oldY == mHostView.getScrollY()) { + // Don't show left/right glows if we fit the whole content. + // Also don't show if there was vertical movement. + if (maxX > 0) { + final int pulledToX = oldX + mOverScrollDeltaX; + if (pulledToX < 0) { + mEdgeGlowLeft.onPull((float) mOverScrollDeltaX / mHostView.getWidth()); + if (!mEdgeGlowRight.isFinished()) { + mEdgeGlowRight.onRelease(); + } + } else if (pulledToX > maxX) { + mEdgeGlowRight.onPull((float) mOverScrollDeltaX / mHostView.getWidth()); + if (!mEdgeGlowLeft.isFinished()) { + mEdgeGlowLeft.onRelease(); + } + } + mOverScrollDeltaX = 0; + } + + if (maxY > 0 || mHostView.getOverScrollMode() == View.OVER_SCROLL_ALWAYS) { + final int pulledToY = oldY + mOverScrollDeltaY; + if (pulledToY < 0) { + mEdgeGlowTop.onPull((float) mOverScrollDeltaY / mHostView.getHeight()); + if (!mEdgeGlowBottom.isFinished()) { + mEdgeGlowBottom.onRelease(); + } + } else if (pulledToY > maxY) { + mEdgeGlowBottom.onPull((float) mOverScrollDeltaY / mHostView.getHeight()); + if (!mEdgeGlowTop.isFinished()) { + mEdgeGlowTop.onRelease(); + } + } + mOverScrollDeltaY = 0; + } + } + } + + /** + * Set touch delta values indicating the current amount of overscroll. + * + * @param deltaX + * @param deltaY + */ + public void setOverScrollDeltas(int deltaX, int deltaY) { + mOverScrollDeltaX = deltaX; + mOverScrollDeltaY = deltaY; + } + + /** + * Absorb leftover fling velocity into one of the edge glows as appropriate. + * + * @param x Current X scroll offset + * @param y Current Y scroll offset + * @param oldX Old X scroll offset + * @param oldY Old Y scroll offset + * @param rangeX Maximum range for horizontal scrolling + * @param rangeY Maximum range for vertical scrolling + */ + public void absorbGlow(int x, int y, int oldX, int oldY, int rangeX, int rangeY) { + if (rangeY > 0 || mHostView.getOverScrollMode() == View.OVER_SCROLL_ALWAYS) { + if (y < 0 && oldY >= 0) { + mEdgeGlowTop.onAbsorb((int) mHostView.mScroller.getCurrVelocity()); + if (!mEdgeGlowBottom.isFinished()) { + mEdgeGlowBottom.onRelease(); + } + } else if (y > rangeY && oldY <= rangeY) { + mEdgeGlowBottom.onAbsorb((int) mHostView.mScroller.getCurrVelocity()); + if (!mEdgeGlowTop.isFinished()) { + mEdgeGlowTop.onRelease(); + } + } + } + + if (rangeX > 0) { + if (x < 0 && oldX >= 0) { + mEdgeGlowLeft.onAbsorb((int) mHostView.mScroller.getCurrVelocity()); + if (!mEdgeGlowRight.isFinished()) { + mEdgeGlowRight.onRelease(); + } + } else if (x > rangeX && oldX <= rangeX) { + mEdgeGlowRight.onAbsorb((int) mHostView.mScroller.getCurrVelocity()); + if (!mEdgeGlowLeft.isFinished()) { + mEdgeGlowLeft.onRelease(); + } + } + } + } + + /** + * Draw the glow effect along the sides of the widget. mEdgeGlow* must be non-null. + * + * @param canvas Canvas to draw into, transformed into view coordinates. + * @return true if glow effects are still animating and the view should invalidate again. + */ + public boolean drawEdgeGlows(Canvas canvas) { + final int scrollX = mHostView.getScrollX(); + final int scrollY = mHostView.getScrollY(); + final int width = mHostView.getWidth(); + int height = mHostView.getHeight(); + + boolean invalidateForGlow = false; + if (!mEdgeGlowTop.isFinished()) { + final int restoreCount = canvas.save(); + + canvas.translate(-width / 2 + scrollX, Math.min(0, scrollY)); + mEdgeGlowTop.setSize(width * 2, height); + invalidateForGlow |= mEdgeGlowTop.draw(canvas); + canvas.restoreToCount(restoreCount); + } + if (!mEdgeGlowBottom.isFinished()) { + final int restoreCount = canvas.save(); + + canvas.translate(-width / 2 + scrollX, + Math.max(mHostView.computeMaxScrollY(), scrollY) + height); + canvas.rotate(180, width, 0); + mEdgeGlowBottom.setSize(width * 2, height); + invalidateForGlow |= mEdgeGlowBottom.draw(canvas); + canvas.restoreToCount(restoreCount); + } + if (!mEdgeGlowLeft.isFinished()) { + final int restoreCount = canvas.save(); + + canvas.rotate(270); + canvas.translate(-height * 1.5f - scrollY, Math.min(0, scrollX)); + mEdgeGlowLeft.setSize(height * 2, width); + invalidateForGlow |= mEdgeGlowLeft.draw(canvas); + canvas.restoreToCount(restoreCount); + } + if (!mEdgeGlowRight.isFinished()) { + final int restoreCount = canvas.save(); + + canvas.rotate(90); + canvas.translate(-height / 2 + scrollY, + -(Math.max(mHostView.computeMaxScrollX(), scrollX) + width)); + mEdgeGlowRight.setSize(height * 2, width); + invalidateForGlow |= mEdgeGlowRight.draw(canvas); + canvas.restoreToCount(restoreCount); + } + return invalidateForGlow; + } + + /** + * @return True if any glow is still animating + */ + public boolean isAnimating() { + return (!mEdgeGlowTop.isFinished() || !mEdgeGlowBottom.isFinished() || + !mEdgeGlowLeft.isFinished() || !mEdgeGlowRight.isFinished()); + } + + /** + * Release all glows from any touch pulls in progress. + */ + public void releaseAll() { + mEdgeGlowTop.onRelease(); + mEdgeGlowBottom.onRelease(); + mEdgeGlowLeft.onRelease(); + mEdgeGlowRight.onRelease(); + } +} diff --git a/core/java/android/webkit/WebSettings.java b/core/java/android/webkit/WebSettings.java index 98e6ab88fd8f0..2e69d995cd6d9 100644 --- a/core/java/android/webkit/WebSettings.java +++ b/core/java/android/webkit/WebSettings.java @@ -268,6 +268,8 @@ public class WebSettings { private AutoFillProfile mAutoFillProfile; + private boolean mUseWebViewBackgroundForOverscroll = true; + // private WebSettings, not accessible by the host activity static private int mDoubleTapToastCount = 3; @@ -630,6 +632,23 @@ public class WebSettings { return mEnableSmoothTransition; } + /** + * Set whether the WebView uses its background for over scroll background. + * If true, it will use the WebView's background. If false, it will use an + * internal pattern. Default is true. + */ + public void setUseWebViewBackgroundForOverscrollBackground(boolean view) { + mUseWebViewBackgroundForOverscroll = view; + } + + /** + * Returns true if this WebView uses WebView's background instead of + * internal pattern for over scroll background. + */ + public boolean getUseWebViewBackgroundForOverscrollBackground() { + return mUseWebViewBackgroundForOverscroll; + } + /** * Store whether the WebView is saving form data. */ diff --git a/core/java/android/webkit/WebView.java b/core/java/android/webkit/WebView.java index 376b1d099769b..3cb9084fbca4b 100644 --- a/core/java/android/webkit/WebView.java +++ b/core/java/android/webkit/WebView.java @@ -16,19 +16,24 @@ package android.webkit; +import com.android.internal.R; + import android.annotation.Widget; import android.app.AlertDialog; import android.content.BroadcastReceiver; import android.content.ClipboardManager; import android.content.Context; import android.content.DialogInterface; -import android.content.IntentFilter; import android.content.DialogInterface.OnCancelListener; +import android.content.Intent; +import android.content.IntentFilter; import android.content.pm.PackageInfo; import android.content.pm.PackageManager; -import android.content.Intent; +import android.content.res.Resources; import android.database.DataSetObserver; import android.graphics.Bitmap; +import android.graphics.BitmapFactory; +import android.graphics.BitmapShader; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.CornerPathEffect; @@ -40,6 +45,7 @@ import android.graphics.Point; import android.graphics.Rect; import android.graphics.RectF; import android.graphics.Region; +import android.graphics.Shader; import android.graphics.drawable.Drawable; import android.net.Uri; import android.net.http.SslCertificate; @@ -81,13 +87,12 @@ import android.widget.AdapterView; import android.widget.AdapterView.OnItemClickListener; import android.widget.ArrayAdapter; import android.widget.CheckedTextView; +import android.widget.EdgeGlow; import android.widget.LinearLayout; import android.widget.ListView; -import android.widget.Scroller; +import android.widget.OverScroller; import android.widget.Toast; -import junit.framework.Assert; - import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; @@ -102,6 +107,8 @@ import java.util.Set; import java.util.regex.Matcher; import java.util.regex.Pattern; +import junit.framework.Assert; + /** *

A View that displays web pages. This class is the basis upon which you * can roll your own web browser or simply display some online content within your Activity. @@ -529,7 +536,13 @@ public class WebView extends AbsoluteLayout // time for the longest scroll animation private static final int MAX_DURATION = 750; // milliseconds private static final int SLIDE_TITLE_DURATION = 500; // milliseconds - private Scroller mScroller; + + // Used by OverScrollGlow + OverScroller mScroller; + + private boolean mInOverScrollMode = false; + private static Paint mOverScrollBackground; + private static Paint mOverScrollBorder; private boolean mWrapContent; private static final int MOTIONLESS_FALSE = 0; @@ -734,6 +747,20 @@ public class WebView extends AbsoluteLayout // variable to cache the above pattern in case accessibility is enabled. private Pattern mMatchAxsUrlParameterPattern; + /** + * Max distance to overscroll by in pixels. + * This how far content can be pulled beyond its normal bounds by the user. + */ + private int mOverscrollDistance; + + /** + * Max distance to overfling by in pixels. + * This is how far flinged content can move beyond the end of its normal bounds. + */ + private int mOverflingDistance; + + private OverScrollGlow mOverScrollGlow; + // Used to match key downs and key ups private boolean mGotKeyDown; @@ -909,7 +936,7 @@ public class WebView extends AbsoluteLayout L10nUtils.loadStrings(context); mWebViewCore = new WebViewCore(context, this, mCallbackProxy, javascriptInterfaces); mDatabase = WebViewDatabase.getInstance(context); - mScroller = new Scroller(context); + mScroller = new OverScroller(context, null, 0, 0, false); //TODO Use OverScroller's flywheel mZoomManager = new ZoomManager(this, mCallbackProxy); /* The init method must follow the creation of certain member variables, @@ -1044,6 +1071,9 @@ public class WebView extends AbsoluteLayout // Compute the inverse of the density squared. DRAG_LAYER_INVERSE_DENSITY_SQUARED = 1 / (density * density); + + mOverscrollDistance = configuration.getScaledOverscrollDistance(); + mOverflingDistance = configuration.getScaledOverflingDistance(); } /** @@ -1066,6 +1096,18 @@ public class WebView extends AbsoluteLayout new TextToSpeech(getContext(), null)); } + @Override + public void setOverScrollMode(int mode) { + super.setOverScrollMode(mode); + if (mode != OVER_SCROLL_NEVER) { + if (mOverScrollGlow == null) { + mOverScrollGlow = new OverScrollGlow(this); + } + } else { + mOverScrollGlow = null; + } + } + /* package */void updateDefaultZoomDensity(int zoomDensity) { final float density = mContext.getResources().getDisplayMetrics().density * 100 / zoomDensity; @@ -1197,7 +1239,8 @@ public class WebView extends AbsoluteLayout * @hide */ public int getVisibleTitleHeight() { - return Math.max(getTitleHeight() - mScrollY, 0); + // need to restrict mScrollY due to over scroll + return Math.max(getTitleHeight() - Math.max(0, mScrollY), 0); } /* @@ -1946,7 +1989,7 @@ public class WebView extends AbsoluteLayout } nativeClearCursor(); // start next trackball movement from page edge if (bottom) { - return pinScrollTo(mScrollX, computeVerticalScrollRange(), true, 0); + return pinScrollTo(mScrollX, computeRealVerticalScrollRange(), true, 0); } // Page down. int h = getHeight(); @@ -2171,13 +2214,15 @@ public class WebView extends AbsoluteLayout // Expects x in view coordinates int pinLocX(int x) { - return pinLoc(x, getViewWidth(), computeHorizontalScrollRange()); + if (mInOverScrollMode) return x; + return pinLoc(x, getViewWidth(), computeRealHorizontalScrollRange()); } // Expects y in view coordinates int pinLocY(int y) { + if (mInOverScrollMode) return y; return pinLoc(y, getViewHeightWithTitle(), - computeVerticalScrollRange() + getTitleHeight()); + computeRealVerticalScrollRange() + getTitleHeight()); } /** @@ -2412,7 +2457,7 @@ public class WebView extends AbsoluteLayout // Sets r to be our visible rectangle in content coordinates private void calcOurContentVisibleRect(Rect r) { calcOurVisibleRect(r); - // pin the rect to the bounds of the content + // since we might overscroll, pin the rect to the bounds of the content r.left = Math.max(viewToContentX(r.left), 0); // viewToContentY will remove the total height of the title bar. Add // the visible height back in to account for the fact that if the title @@ -2497,8 +2542,7 @@ public class WebView extends AbsoluteLayout return false; } - @Override - protected int computeHorizontalScrollRange() { + private int computeRealHorizontalScrollRange() { if (mDrawHistory) { return mHistoryWidth; } else if (mHorizontalScrollBarMode == SCROLLBAR_ALWAYSOFF @@ -2512,7 +2556,27 @@ public class WebView extends AbsoluteLayout } @Override - protected int computeVerticalScrollRange() { + protected int computeHorizontalScrollRange() { + int range = computeRealHorizontalScrollRange(); + + // Adjust reported range if overscrolled to compress the scroll bars + final int scrollX = mScrollX; + final int overscrollRight = computeMaxScrollX(); + if (scrollX < 0) { + range -= scrollX; + } else if (scrollX > overscrollRight) { + range += scrollX - overscrollRight; + } + + return range; + } + + @Override + protected int computeHorizontalScrollOffset() { + return Math.max(mScrollX, 0); + } + + private int computeRealVerticalScrollRange() { if (mDrawHistory) { return mHistoryHeight; } else if (mVerticalScrollBarMode == SCROLLBAR_ALWAYSOFF @@ -2525,6 +2589,22 @@ public class WebView extends AbsoluteLayout } } + @Override + protected int computeVerticalScrollRange() { + int range = computeRealVerticalScrollRange(); + + // Adjust reported range if overscrolled to compress the scroll bars + final int scrollY = mScrollY; + final int overscrollBottom = computeMaxScrollY(); + if (scrollY < 0) { + range -= scrollY; + } else if (scrollY > overscrollBottom) { + range += scrollY - overscrollBottom; + } + + return range; + } + @Override protected int computeVerticalScrollOffset() { return Math.max(mScrollY - getTitleHeight(), 0); @@ -2540,10 +2620,39 @@ public class WebView extends AbsoluteLayout protected void onDrawVerticalScrollBar(Canvas canvas, Drawable scrollBar, int l, int t, int r, int b) { + if (mScrollY < 0) { + t -= mScrollY; + } scrollBar.setBounds(l, t + getVisibleTitleHeight(), r, b); scrollBar.draw(canvas); } + @Override + protected void onOverScrolled(int scrollX, int scrollY, boolean clampedX, + boolean clampedY) { + mInOverScrollMode = false; + int maxX = computeMaxScrollX(); + int maxY = computeMaxScrollY(); + if (maxX == 0) { + // do not over scroll x if the page just fits the screen + scrollX = pinLocX(scrollX); + } else if (scrollX < 0 || scrollX > maxX) { + mInOverScrollMode = true; + } + if (scrollY < 0 || scrollY > maxY) { + mInOverScrollMode = true; + } + + int oldX = mScrollX; + int oldY = mScrollY; + + super.scrollTo(scrollX, scrollY); + + if (mOverScrollGlow != null) { + mOverScrollGlow.pullGlow(mScrollX, mScrollY, oldX, oldY, maxX, maxY); + } + } + /** * Get the url for the current page. This is not always the same as the url * passed to WebViewClient.onPageStarted because although the load for @@ -2923,17 +3032,29 @@ public class WebView extends AbsoluteLayout if (mScroller.computeScrollOffset()) { int oldX = mScrollX; int oldY = mScrollY; - mScrollX = mScroller.getCurrX(); - mScrollY = mScroller.getCurrY(); - postInvalidate(); // So we draw again - if (oldX != mScrollX || oldY != mScrollY) { - onScrollChanged(mScrollX, mScrollY, oldX, oldY); - } else if (mScroller.getStartX() != mScrollX - || mScroller.getStartY() != mScrollY) { - abortAnimation(); - mPrivateHandler.removeMessages(RESUME_WEBCORE_PRIORITY); - WebViewCore.resumePriority(); - WebViewCore.resumeUpdatePicture(mWebViewCore); + int x = mScroller.getCurrX(); + int y = mScroller.getCurrY(); + invalidate(); // So we draw again + + if (!mScroller.isFinished()) { + final int rangeX = computeMaxScrollX(); + final int rangeY = computeMaxScrollY(); + overScrollBy(x - oldX, y - oldY, oldX, oldY, + rangeX, rangeY, + mOverflingDistance, mOverflingDistance, false); + + if (mOverScrollGlow != null) { + mOverScrollGlow.absorbGlow(x, y, oldX, oldY, rangeX, rangeY); + } + } else { + mScrollX = x; + mScrollY = y; + if (mScroller.getStartX() != mScrollX || mScroller.getStartY() != mScrollY) { + abortAnimation(); + mPrivateHandler.removeMessages(RESUME_WEBCORE_PRIORITY); + WebViewCore.resumePriority(); + WebViewCore.resumeUpdatePicture(mWebViewCore); + } } } else { super.computeScroll(); @@ -3436,6 +3557,40 @@ public class WebView extends AbsoluteLayout drawCoreAndCursorRing(canvas, mBackgroundColor, mDrawCursorRing); } + /** + * Draw the background when beyond bounds + * @param canvas Canvas to draw into + */ + private void drawOverScrollBackground(Canvas canvas) { + if (mOverScrollBackground == null) { + mOverScrollBackground = new Paint(); + Bitmap bm = BitmapFactory.decodeResource( + mContext.getResources(), + com.android.internal.R.drawable.status_bar_background); + mOverScrollBackground.setShader(new BitmapShader(bm, + Shader.TileMode.REPEAT, Shader.TileMode.REPEAT)); + mOverScrollBorder = new Paint(); + mOverScrollBorder.setStyle(Paint.Style.STROKE); + mOverScrollBorder.setStrokeWidth(0); + mOverScrollBorder.setColor(0xffbbbbbb); + } + + int top = 0; + int right = computeRealHorizontalScrollRange(); + int bottom = top + computeRealVerticalScrollRange(); + // first draw the background and anchor to the top of the view + canvas.save(); + canvas.translate(mScrollX, mScrollY); + canvas.clipRect(-mScrollX, top - mScrollY, right - mScrollX, bottom + - mScrollY, Region.Op.DIFFERENCE); + canvas.drawPaint(mOverScrollBackground); + canvas.restore(); + // then draw the border + canvas.drawRect(-1, top - 1, right, bottom, mOverScrollBorder); + // next clip the region for the content + canvas.clipRect(0, top, right, bottom); + } + @Override protected void onDraw(Canvas canvas) { // if mNativeClass is 0, the WebView has been destroyed. Do nothing. @@ -3452,6 +3607,10 @@ public class WebView extends AbsoluteLayout } int saveCount = canvas.save(); + if (mInOverScrollMode && !getSettings() + .getUseWebViewBackgroundForOverscrollBackground()) { + drawOverScrollBackground(canvas); + } if (mTitleBar != null) { canvas.translate(0, (int) mTitleBar.getHeight()); } @@ -3466,6 +3625,10 @@ public class WebView extends AbsoluteLayout } mWebViewCore.signalRepaintDone(); + if (mOverScrollGlow != null && mOverScrollGlow.drawEdgeGlows(canvas)) { + invalidate(); + } + // paint the highlight in the end if (!mTouchHighlightRegion.isEmpty()) { if (mTouchHightlightPaint == null) { @@ -4707,12 +4870,14 @@ public class WebView extends AbsoluteLayout @Override protected void onScrollChanged(int l, int t, int oldl, int oldt) { super.onScrollChanged(l, t, oldl, oldt); - sendOurVisibleRect(); - // update WebKit if visible title bar height changed. The logic is same - // as getVisibleTitleHeight. - int titleHeight = getTitleHeight(); - if (Math.max(titleHeight - t, 0) != Math.max(titleHeight - oldt, 0)) { - sendViewSizeZoom(false); + if (!mInOverScrollMode) { + sendOurVisibleRect(); + // update WebKit if visible title bar height changed. The logic is same + // as getVisibleTitleHeight. + int titleHeight = getTitleHeight(); + if (Math.max(titleHeight - t, 0) != Math.max(titleHeight - oldt, 0)) { + sendViewSizeZoom(false); + } } } @@ -5167,20 +5332,6 @@ public class WebView extends AbsoluteLayout } // do pan - if (mTouchMode != TOUCH_DRAG_LAYER_MODE) { - int newScrollX = pinLocX(mScrollX + deltaX); - int newDeltaX = newScrollX - mScrollX; - if (deltaX != newDeltaX) { - deltaX = newDeltaX; - fDeltaX = (float) newDeltaX; - } - int newScrollY = pinLocY(mScrollY + deltaY); - int newDeltaY = newScrollY - mScrollY; - if (deltaY != newDeltaY) { - deltaY = newDeltaY; - fDeltaY = (float) newDeltaY; - } - } boolean done = false; boolean keepScrollBarsVisible = false; if (Math.abs(fDeltaX) < 1.0f && Math.abs(fDeltaY) < 1.0f) { @@ -5370,6 +5521,12 @@ public class WebView extends AbsoluteLayout mHeldMotionless = MOTIONLESS_IGNORE; doFling(); break; + } else { + if (mScroller.springBack(mScrollX, mScrollY, 0, + computeMaxScrollX(), 0, + computeMaxScrollY())) { + invalidate(); + } } // redraw in high-quality, as we're done dragging mHeldMotionless = MOTIONLESS_TRUE; @@ -5390,6 +5547,8 @@ public class WebView extends AbsoluteLayout } case MotionEvent.ACTION_CANCEL: { if (mTouchMode == TOUCH_DRAG_MODE) { + mScroller.springBack(mScrollX, mScrollY, 0, + computeMaxScrollX(), 0, computeMaxScrollY()); invalidate(); } cancelWebCoreTouchEvent(contentX, contentY, false); @@ -5465,7 +5624,22 @@ public class WebView extends AbsoluteLayout } return; } - scrollBy(deltaX, deltaY); + + final int oldX = mScrollX; + final int oldY = mScrollY; + final int rangeX = computeMaxScrollX(); + final int rangeY = computeMaxScrollY(); + + if (mOverScrollGlow != null) { + mOverScrollGlow.setOverScrollDeltas(deltaX, deltaY); + } + + overScrollBy(deltaX, deltaY, oldX, oldY, + rangeX, rangeY, + mOverscrollDistance, mOverscrollDistance, true); + if (mOverScrollGlow != null && mOverScrollGlow.isAnimating()) { + invalidate(); + } } mZoomManager.keepZoomPickerVisible(); } @@ -5478,6 +5652,11 @@ public class WebView extends AbsoluteLayout mVelocityTracker.recycle(); mVelocityTracker = null; } + + // Release any pulled glows + if (mOverScrollGlow != null) { + mOverScrollGlow.releaseAll(); + } } private void cancelTouch() { @@ -5488,6 +5667,7 @@ public class WebView extends AbsoluteLayout mVelocityTracker.recycle(); mVelocityTracker = null; } + if (mTouchMode == TOUCH_DRAG_MODE || mTouchMode == TOUCH_DRAG_LAYER_MODE) { WebViewCore.resumePriority(); @@ -5799,12 +5979,20 @@ public class WebView extends AbsoluteLayout } } - private int computeMaxScrollX() { - return Math.max(computeHorizontalScrollRange() - getViewWidth(), 0); + /** + * Compute the maximum horizontal scroll position. Used by {@link OverScrollGlow}. + * @return Maximum horizontal scroll position within real content + */ + int computeMaxScrollX() { + return Math.max(computeRealHorizontalScrollRange() - getViewWidth(), 0); } - private int computeMaxScrollY() { - return Math.max(computeVerticalScrollRange() + getTitleHeight() + /** + * Compute the maximum vertical scroll position. Used by {@link OverScrollGlow}. + * @return Maximum vertical scroll position within real content + */ + int computeMaxScrollY() { + return Math.max(computeRealVerticalScrollRange() + getTitleHeight() - getViewHeightWithTitle(), 0); } @@ -5823,7 +6011,7 @@ public class WebView extends AbsoluteLayout public void flingScroll(int vx, int vy) { mScroller.fling(mScrollX, mScrollY, vx, vy, 0, computeMaxScrollX(), 0, - computeMaxScrollY()); + computeMaxScrollY(), mOverflingDistance, mOverflingDistance); invalidate(); } @@ -5853,6 +6041,10 @@ public class WebView extends AbsoluteLayout if ((maxX == 0 && vy == 0) || (maxY == 0 && vx == 0)) { WebViewCore.resumePriority(); WebViewCore.resumeUpdatePicture(mWebViewCore); + if (mScroller.springBack(mScrollX, mScrollY, 0, computeMaxScrollX(), + 0, computeMaxScrollY())) { + invalidate(); + } return; } float currentVelocity = mScroller.getCurrVelocity(); @@ -5879,13 +6071,37 @@ public class WebView extends AbsoluteLayout + " maxX=" + maxX + " maxY=" + maxY + " mScrollX=" + mScrollX + " mScrollY=" + mScrollY); } + + // Allow sloppy flings without overscrolling at the edges. + if ((mScrollX == 0 || mScrollX == maxX) && Math.abs(vx) < Math.abs(vy)) { + vx = 0; + } + if ((mScrollY == 0 || mScrollY == maxY) && Math.abs(vy) < Math.abs(vx)) { + vy = 0; + } + + if (mOverscrollDistance < mOverflingDistance) { + if (mScrollX == -mOverscrollDistance || mScrollX == maxX + mOverscrollDistance) { + vx = 0; + } + if (mScrollY == -mOverscrollDistance || mScrollY == maxY + mOverscrollDistance) { + vy = 0; + } + } + mLastVelX = vx; mLastVelY = vy; mLastVelocity = velocity; - mScroller.fling(mScrollX, mScrollY, -vx, -vy, 0, maxX, 0, maxY); + // no horizontal overscroll if the content just fits + mScroller.fling(mScrollX, mScrollY, -vx, -vy, 0, maxX, 0, maxY, + maxX == 0 ? 0 : mOverflingDistance, mOverflingDistance); + // Duration is calculated based on velocity. With range boundaries and overscroll + // we may not know how long the final animation will take. (Hence the deprecation + // warning on the call below.) It's not a big deal for scroll bars but if webcore + // resumes during this effect we will take a performance hit. See computeScroll; + // we resume webcore there when the animation is finished. final int time = mScroller.getDuration(); - mPrivateHandler.sendEmptyMessageDelayed(RESUME_WEBCORE_PRIORITY, time); awakenScrollBars(time); invalidate(); } @@ -6684,6 +6900,10 @@ public class WebView extends AbsoluteLayout case MotionEvent.ACTION_CANCEL: if (mDeferTouchMode == TOUCH_DRAG_MODE) { // no fling in defer process + mScroller.springBack(mScrollX, mScrollY, 0, + computeMaxScrollX(), 0, + computeMaxScrollY()); + invalidate(); WebViewCore.resumePriority(); WebViewCore.resumeUpdatePicture(mWebViewCore); } diff --git a/core/java/android/widget/AbsListView.java b/core/java/android/widget/AbsListView.java index 70cfee96468c2..eb8e2de8f92ae 100644 --- a/core/java/android/widget/AbsListView.java +++ b/core/java/android/widget/AbsListView.java @@ -20,6 +20,7 @@ import com.android.internal.R; import android.content.Context; import android.content.Intent; +import android.content.res.Resources; import android.content.res.TypedArray; import android.graphics.Canvas; import android.graphics.Rect; @@ -39,6 +40,7 @@ import android.util.LongSparseArray; import android.util.SparseBooleanArray; import android.util.StateSet; import android.view.ActionMode; +import android.view.ContextMenu.ContextMenuInfo; import android.view.Gravity; import android.view.HapticFeedbackConstants; import android.view.KeyEvent; @@ -52,7 +54,6 @@ import android.view.ViewConfiguration; import android.view.ViewDebug; import android.view.ViewGroup; import android.view.ViewTreeObserver; -import android.view.ContextMenu.ContextMenuInfo; import android.view.inputmethod.BaseInputConnection; import android.view.inputmethod.EditorInfo; import android.view.inputmethod.InputConnection; @@ -137,6 +138,17 @@ public abstract class AbsListView extends AdapterView implements Te */ static final int TOUCH_MODE_FLING = 4; + /** + * Indicates the touch gesture is an overscroll - a scroll beyond the beginning or end. + */ + static final int TOUCH_MODE_OVERSCROLL = 5; + + /** + * Indicates the view is being flung outside of normal content bounds + * and will spring back. + */ + static final int TOUCH_MODE_OVERFLING = 6; + /** * Regular layout - usually an unsolicited layout from the view system */ @@ -445,6 +457,16 @@ public abstract class AbsListView extends AdapterView implements Te private ContextMenuInfo mContextMenuInfo = null; + /** + * Maximum distance to record overscroll + */ + int mOverscrollMax; + + /** + * Content height divided by this is the overscroll limit. + */ + static final int OVERSCROLL_LIMIT_DIVISOR = 3; + /** * Used to request a layout when we changed touch mode */ @@ -547,6 +569,48 @@ public abstract class AbsListView extends AdapterView implements Te */ private static final int INVALID_POINTER = -1; + /** + * Maximum distance to overscroll by during edge effects + */ + int mOverscrollDistance; + + /** + * Maximum distance to overfling during edge effects + */ + int mOverflingDistance; + + // These two EdgeGlows are always set and used together. + // Checking one for null is as good as checking both. + + /** + * Tracks the state of the top edge glow. + */ + private EdgeGlow mEdgeGlowTop; + + /** + * Tracks the state of the bottom edge glow. + */ + private EdgeGlow mEdgeGlowBottom; + + /** + * An estimate of how many pixels are between the top of the list and + * the top of the first position in the adapter, based on the last time + * we saw it. Used to hint where to draw edge glows. + */ + private int mFirstPositionDistanceGuess; + + /** + * An estimate of how many pixels are between the bottom of the list and + * the bottom of the last position in the adapter, based on the last time + * we saw it. Used to hint where to draw edge glows. + */ + private int mLastPositionDistanceGuess; + + /** + * Used for determining when to cancel out of overscroll. + */ + private int mDirection = 0; + /** * Interface definition for a callback to be invoked when the list or grid * has been scrolled. @@ -690,9 +754,29 @@ public abstract class AbsListView extends AdapterView implements Te mTouchSlop = configuration.getScaledTouchSlop(); mMinimumVelocity = configuration.getScaledMinimumFlingVelocity(); mMaximumVelocity = configuration.getScaledMaximumFlingVelocity(); + mOverscrollDistance = configuration.getScaledOverscrollDistance(); + mOverflingDistance = configuration.getScaledOverflingDistance(); + mDensityScale = getContext().getResources().getDisplayMetrics().density; } + @Override + public void setOverScrollMode(int mode) { + if (mode != OVER_SCROLL_NEVER) { + if (mEdgeGlowTop == null) { + final Resources res = getContext().getResources(); + final Drawable edge = res.getDrawable(R.drawable.overscroll_edge); + final Drawable glow = res.getDrawable(R.drawable.overscroll_glow); + mEdgeGlowTop = new EdgeGlow(edge, glow); + mEdgeGlowBottom = new EdgeGlow(edge, glow); + } + } else { + mEdgeGlowTop = null; + mEdgeGlowBottom = null; + } + super.setOverScrollMode(mode); + } + /** * {@inheritDoc} */ @@ -1002,6 +1086,18 @@ public abstract class AbsListView extends AdapterView implements Te mMultiChoiceModeCallback.setWrapped(listener); } + /** + * @return true if all list content currently fits within the view boundaries + */ + private boolean contentFits() { + final int childCount = getChildCount(); + if (childCount != mItemCount) { + return false; + } + + return getChildAt(0).getTop() >= 0 && getChildAt(childCount - 1).getBottom() <= mBottom; + } + /** * Enables fast scrolling by letting the user quickly scroll through lists by * dragging the fast scroll thumb. The adapter attached to the list may want @@ -1540,6 +1636,10 @@ public abstract class AbsListView extends AdapterView implements Te int result; if (mSmoothScrollbarEnabled) { result = Math.max(mItemCount * 100, 0); + if (mScrollY != 0) { + // Compensate for overscroll + result += Math.abs((int) ((float) mScrollY / getHeight() * mItemCount * 100)); + } } else { result = mItemCount; } @@ -1612,6 +1712,8 @@ public abstract class AbsListView extends AdapterView implements Te layoutChildren(); mInLayout = false; + + mOverscrollMax = (b - t) / OVERSCROLL_LIMIT_DIVISOR; } /** @@ -2126,6 +2228,7 @@ public abstract class AbsListView extends AdapterView implements Te mFlingRunnable.endFling(); if (mScrollY != 0) { mScrollY = 0; + finishGlows(); invalidate(); } } @@ -2445,9 +2548,10 @@ public abstract class AbsListView extends AdapterView implements Te // Check if we have moved far enough that it looks more like a // scroll than a tap final int distance = Math.abs(deltaY); - if (distance > mTouchSlop) { + final boolean overscroll = mScrollY != 0; + if (overscroll || distance > mTouchSlop) { createScrollingCache(); - mTouchMode = TOUCH_MODE_SCROLL; + mTouchMode = overscroll ? TOUCH_MODE_OVERSCROLL : TOUCH_MODE_SCROLL; mMotionCorrection = deltaY; final Handler handler = getHandler(); // Handler should not be null unless the AbsListView is not attached to a @@ -2483,6 +2587,19 @@ public abstract class AbsListView extends AdapterView implements Te // touch mode). Force an initial layout to get rid of the selection. layoutChildren(); } + } else { + int touchMode = mTouchMode; + if (touchMode == TOUCH_MODE_OVERSCROLL || touchMode == TOUCH_MODE_OVERFLING) { + if (mFlingRunnable != null) { + mFlingRunnable.endFling(); + } + + if (mScrollY != 0) { + mScrollY = 0; + finishGlows(); + invalidate(); + } + } } } @@ -2513,49 +2630,63 @@ public abstract class AbsListView extends AdapterView implements Te switch (action & MotionEvent.ACTION_MASK) { case MotionEvent.ACTION_DOWN: { - mActivePointerId = ev.getPointerId(0); - final int x = (int) ev.getX(); - final int y = (int) ev.getY(); - int motionPosition = pointToPosition(x, y); - if (!mDataChanged) { - if ((mTouchMode != TOUCH_MODE_FLING) && (motionPosition >= 0) - && (getAdapter().isEnabled(motionPosition))) { - // User clicked on an actual view (and was not stopping a fling). It might be a - // click or a scroll. Assume it is a click until proven otherwise - mTouchMode = TOUCH_MODE_DOWN; - // FIXME Debounce - if (mPendingCheckForTap == null) { - mPendingCheckForTap = new CheckForTap(); - } - postDelayed(mPendingCheckForTap, ViewConfiguration.getTapTimeout()); - } else { - if (ev.getEdgeFlags() != 0 && motionPosition < 0) { - // If we couldn't find a view to click on, but the down event was touching - // the edge, we will bail out and try again. This allows the edge correcting - // code in ViewRoot to try to find a nearby view to select - return false; - } + switch (mTouchMode) { + case TOUCH_MODE_OVERFLING: { + mFlingRunnable.endFling(); + mTouchMode = TOUCH_MODE_OVERSCROLL; + mMotionY = mLastY = (int) ev.getY(); + mMotionCorrection = 0; + mActivePointerId = ev.getPointerId(0); + break; + } - if (mTouchMode == TOUCH_MODE_FLING) { - // Stopped a fling. It is a scroll. - createScrollingCache(); - mTouchMode = TOUCH_MODE_SCROLL; - mMotionCorrection = 0; - motionPosition = findMotionRow(y); - mFlingRunnable.flywheelTouch(); + default: { + mActivePointerId = ev.getPointerId(0); + final int x = (int) ev.getX(); + final int y = (int) ev.getY(); + int motionPosition = pointToPosition(x, y); + if (!mDataChanged) { + if ((mTouchMode != TOUCH_MODE_FLING) && (motionPosition >= 0) + && (getAdapter().isEnabled(motionPosition))) { + // User clicked on an actual view (and was not stopping a fling). It might be a + // click or a scroll. Assume it is a click until proven otherwise + mTouchMode = TOUCH_MODE_DOWN; + // FIXME Debounce + if (mPendingCheckForTap == null) { + mPendingCheckForTap = new CheckForTap(); + } + postDelayed(mPendingCheckForTap, ViewConfiguration.getTapTimeout()); + } else { + if (ev.getEdgeFlags() != 0 && motionPosition < 0) { + // If we couldn't find a view to click on, but the down event was touching + // the edge, we will bail out and try again. This allows the edge correcting + // code in ViewRoot to try to find a nearby view to select + return false; + } + + if (mTouchMode == TOUCH_MODE_FLING) { + // Stopped a fling. It is a scroll. + createScrollingCache(); + mTouchMode = TOUCH_MODE_SCROLL; + mMotionCorrection = 0; + motionPosition = findMotionRow(y); + mFlingRunnable.flywheelTouch(); + } } } - } - if (motionPosition >= 0) { - // Remember where the motion event started - v = getChildAt(motionPosition - mFirstPosition); - mMotionViewOriginalTop = v.getTop(); + if (motionPosition >= 0) { + // Remember where the motion event started + v = getChildAt(motionPosition - mFirstPosition); + mMotionViewOriginalTop = v.getTop(); + } + mMotionX = x; + mMotionY = y; + mMotionPosition = motionPosition; + mLastY = Integer.MIN_VALUE; + break; + } } - mMotionX = x; - mMotionY = y; - mMotionPosition = motionPosition; - mLastY = Integer.MIN_VALUE; break; } @@ -2593,9 +2724,25 @@ public abstract class AbsListView extends AdapterView implements Te requestDisallowInterceptTouchEvent(true); } + final int rawDeltaY = deltaY; deltaY -= mMotionCorrection; int incrementalDeltaY = mLastY != Integer.MIN_VALUE ? y - mLastY : deltaY; + final int motionIndex; + if (mMotionPosition >= 0) { + motionIndex = mMotionPosition - mFirstPosition; + } else { + // If we don't have a motion position that we can reliably track, + // pick something in the middle to make a best guess at things below. + motionIndex = getChildCount() / 2; + } + + int motionViewPrevTop = 0; + View motionView = this.getChildAt(motionIndex); + if (motionView != null) { + motionViewPrevTop = motionView.getTop(); + } + // No need to do all this work if we're not going to move anyway boolean atEdge = false; if (incrementalDeltaY != 0) { @@ -2603,23 +2750,117 @@ public abstract class AbsListView extends AdapterView implements Te } // Check to see if we have bumped into the scroll limit - if (atEdge && getChildCount() > 0) { - // Treat this like we're starting a new scroll from the current - // position. This will let the user start scrolling back into - // content immediately rather than needing to scroll back to the - // point where they hit the limit first. - int motionPosition = findMotionRow(y); - if (motionPosition >= 0) { - final View motionView = getChildAt(motionPosition - mFirstPosition); - mMotionViewOriginalTop = motionView.getTop(); + motionView = this.getChildAt(motionIndex); + if (motionView != null) { + // Check if the top of the motion view is where it is + // supposed to be + final int motionViewRealTop = motionView.getTop(); + if (atEdge) { + // Apply overscroll + + int overscroll = -incrementalDeltaY - + (motionViewRealTop - motionViewPrevTop); + overScrollBy(0, overscroll, 0, mScrollY, 0, 0, + 0, mOverscrollDistance, true); + if (Math.abs(mOverscrollDistance) == Math.abs(mScrollY)) { + // Don't allow overfling if we're at the edge. + mVelocityTracker.clear(); + } + + final int overscrollMode = getOverScrollMode(); + if (overscrollMode == OVER_SCROLL_ALWAYS || + (overscrollMode == OVER_SCROLL_IF_CONTENT_SCROLLS && + !contentFits())) { + mDirection = 0; // Reset when entering overscroll. + mTouchMode = TOUCH_MODE_OVERSCROLL; + if (rawDeltaY > 0) { + mEdgeGlowTop.onPull((float) overscroll / getHeight()); + if (!mEdgeGlowBottom.isFinished()) { + mEdgeGlowBottom.onRelease(); + } + } else if (rawDeltaY < 0) { + mEdgeGlowBottom.onPull((float) overscroll / getHeight()); + if (!mEdgeGlowTop.isFinished()) { + mEdgeGlowTop.onRelease(); + } + } + } } mMotionY = y; - mMotionPosition = motionPosition; invalidate(); } mLastY = y; } break; + + case TOUCH_MODE_OVERSCROLL: + if (y != mLastY) { + final int rawDeltaY = deltaY; + deltaY -= mMotionCorrection; + int incrementalDeltaY = mLastY != Integer.MIN_VALUE ? y - mLastY : deltaY; + + final int oldScroll = mScrollY; + final int newScroll = oldScroll - incrementalDeltaY; + int newDirection = y > mLastY ? 1 : -1; + + if (mDirection == 0) { + mDirection = newDirection; + } + + if (mDirection != newDirection) { + // Coming back to 'real' list scrolling + incrementalDeltaY = -newScroll; + mScrollY = 0; + + // No need to do all this work if we're not going to move anyway + if (incrementalDeltaY != 0) { + trackMotionScroll(incrementalDeltaY, incrementalDeltaY); + } + + // Check to see if we are back in + View motionView = this.getChildAt(mMotionPosition - mFirstPosition); + if (motionView != null) { + mTouchMode = TOUCH_MODE_SCROLL; + + // We did not scroll the full amount. Treat this essentially like the + // start of a new touch scroll + final int motionPosition = findClosestMotionRow(y); + + mMotionCorrection = 0; + motionView = getChildAt(motionPosition - mFirstPosition); + mMotionViewOriginalTop = motionView.getTop(); + mMotionY = y; + mMotionPosition = motionPosition; + } + } else { + overScrollBy(0, -incrementalDeltaY, 0, mScrollY, 0, 0, + 0, mOverscrollDistance, true); + final int overscrollMode = getOverScrollMode(); + if (overscrollMode == OVER_SCROLL_ALWAYS || + (overscrollMode == OVER_SCROLL_IF_CONTENT_SCROLLS && + !contentFits())) { + if (rawDeltaY > 0) { + mEdgeGlowTop.onPull((float) -incrementalDeltaY / getHeight()); + if (!mEdgeGlowBottom.isFinished()) { + mEdgeGlowBottom.onRelease(); + } + } else if (rawDeltaY < 0) { + mEdgeGlowBottom.onPull((float) -incrementalDeltaY / getHeight()); + if (!mEdgeGlowTop.isFinished()) { + mEdgeGlowTop.onRelease(); + } + } + invalidate(); + } + if (Math.abs(mOverscrollDistance) == Math.abs(mScrollY)) { + // Don't allow overfling if we're at the edge. + mVelocityTracker.clear(); + } + } + mLastY = y; + mDirection = newDirection; + } + break; } break; @@ -2693,19 +2934,30 @@ public abstract class AbsListView extends AdapterView implements Te case TOUCH_MODE_SCROLL: final int childCount = getChildCount(); if (childCount > 0) { - if (mFirstPosition == 0 && getChildAt(0).getTop() >= mListPadding.top && + final int firstChildTop = getChildAt(0).getTop(); + final int lastChildBottom = getChildAt(childCount - 1).getBottom(); + final int contentTop = mListPadding.top; + final int contentBottom = getHeight() - mListPadding.bottom; + if (mFirstPosition == 0 && firstChildTop >= contentTop && mFirstPosition + childCount < mItemCount && - getChildAt(childCount - 1).getBottom() <= - getHeight() - mListPadding.bottom) { + lastChildBottom <= getHeight() - contentBottom) { mTouchMode = TOUCH_MODE_REST; reportScrollStateChange(OnScrollListener.SCROLL_STATE_IDLE); } else { final VelocityTracker velocityTracker = mVelocityTracker; velocityTracker.computeCurrentVelocity(1000, mMaximumVelocity); + final int initialVelocity = (int) (velocityTracker.getYVelocity(mActivePointerId) * mVelocityScale); - - if (Math.abs(initialVelocity) > mMinimumVelocity) { + // Fling if we have enough velocity and we aren't at a boundary. + // Since we can potentially overfling more than we can overscroll, don't + // allow the weird behavior where you can scroll to a boundary then + // fling further. + if (Math.abs(initialVelocity) > mMinimumVelocity && + !((mFirstPosition == 0 && + firstChildTop == contentTop - mOverscrollDistance) || + (mFirstPosition + childCount == mItemCount && + lastChildBottom == contentBottom + mOverscrollDistance))) { if (mFlingRunnable == null) { mFlingRunnable = new FlingRunnable(); } @@ -2725,10 +2977,32 @@ public abstract class AbsListView extends AdapterView implements Te reportScrollStateChange(OnScrollListener.SCROLL_STATE_IDLE); } break; + + case TOUCH_MODE_OVERSCROLL: + if (mFlingRunnable == null) { + mFlingRunnable = new FlingRunnable(); + } + final VelocityTracker velocityTracker = mVelocityTracker; + velocityTracker.computeCurrentVelocity(1000, mMaximumVelocity); + final int initialVelocity = (int) velocityTracker.getYVelocity(mActivePointerId); + + reportScrollStateChange(OnScrollListener.SCROLL_STATE_FLING); + if (Math.abs(initialVelocity) > mMinimumVelocity) { + mFlingRunnable.startOverfling(-initialVelocity); + } else { + mFlingRunnable.startSpringback(); + } + + break; } setPressed(false); + if (mEdgeGlowTop != null) { + mEdgeGlowTop.onRelease(); + mEdgeGlowBottom.onRelease(); + } + // Need to redraw since we probably aren't drawing the selector anymore invalidate(); @@ -2759,24 +3033,42 @@ public abstract class AbsListView extends AdapterView implements Te } case MotionEvent.ACTION_CANCEL: { - mTouchMode = TOUCH_MODE_REST; - setPressed(false); - View motionView = getChildAt(mMotionPosition - mFirstPosition); - if (motionView != null) { - motionView.setPressed(false); - } - clearScrollingCache(); + switch (mTouchMode) { + case TOUCH_MODE_OVERSCROLL: + if (mFlingRunnable == null) { + mFlingRunnable = new FlingRunnable(); + } + mFlingRunnable.startSpringback(); + break; - final Handler handler = getHandler(); - if (handler != null) { - handler.removeCallbacks(mPendingCheckForLongPress); - } + case TOUCH_MODE_OVERFLING: + // Do nothing - let it play out. + break; - if (mVelocityTracker != null) { - mVelocityTracker.recycle(); - mVelocityTracker = null; + default: + mTouchMode = TOUCH_MODE_REST; + setPressed(false); + View motionView = this.getChildAt(mMotionPosition - mFirstPosition); + if (motionView != null) { + motionView.setPressed(false); + } + clearScrollingCache(); + + final Handler handler = getHandler(); + if (handler != null) { + handler.removeCallbacks(mPendingCheckForLongPress); + } + + if (mVelocityTracker != null) { + mVelocityTracker.recycle(); + mVelocityTracker = null; + } } + if (mEdgeGlowTop != null) { + mEdgeGlowTop.onRelease(); + mEdgeGlowBottom.onRelease(); + } mActivePointerId = INVALID_POINTER; break; } @@ -2800,11 +3092,62 @@ public abstract class AbsListView extends AdapterView implements Te return true; } + @Override + protected void onOverScrolled(int scrollX, int scrollY, + boolean clampedX, boolean clampedY) { + mScrollY = scrollY; + + if (clampedY) { + // Velocity is broken by hitting the limit; don't start a fling off of this. + if (mVelocityTracker != null) { + mVelocityTracker.clear(); + } + } + awakenScrollBars(); + } + @Override public void draw(Canvas canvas) { super.draw(canvas); + if (mEdgeGlowTop != null) { + final int scrollY = mScrollY; + if (!mEdgeGlowTop.isFinished()) { + final int restoreCount = canvas.save(); + final int width = getWidth(); + + canvas.translate(-width / 2, Math.min(0, scrollY + mFirstPositionDistanceGuess)); + mEdgeGlowTop.setSize(width * 2, getHeight()); + if (mEdgeGlowTop.draw(canvas)) { + invalidate(); + } + canvas.restoreToCount(restoreCount); + } + if (!mEdgeGlowBottom.isFinished()) { + final int restoreCount = canvas.save(); + final int width = getWidth(); + final int height = getHeight(); + + canvas.translate(-width / 2, + Math.max(height, scrollY + mLastPositionDistanceGuess)); + canvas.rotate(180, width, 0); + mEdgeGlowBottom.setSize(width * 2, height); + if (mEdgeGlowBottom.draw(canvas)) { + invalidate(); + } + canvas.restoreToCount(restoreCount); + } + } if (mFastScroller != null) { - mFastScroller.draw(canvas); + final int scrollY = mScrollY; + if (scrollY != 0) { + // Pin to the top/bottom during overscroll + int restoreCount = canvas.save(); + canvas.translate(0, (float) scrollY); + mFastScroller.draw(canvas); + canvas.restoreToCount(restoreCount); + } else { + mFastScroller.draw(canvas); + } } } @@ -2823,6 +3166,10 @@ public abstract class AbsListView extends AdapterView implements Te switch (action & MotionEvent.ACTION_MASK) { case MotionEvent.ACTION_DOWN: { int touchMode = mTouchMode; + if (touchMode == TOUCH_MODE_OVERFLING || touchMode == TOUCH_MODE_OVERSCROLL) { + mMotionCorrection = 0; + return true; + } final int x = (int) ev.getX(); final int y = (int) ev.getY(); @@ -2887,6 +3234,7 @@ public abstract class AbsListView extends AdapterView implements Te final int newPointerIndex = pointerIndex == 0 ? 1 : 0; mMotionX = (int) ev.getX(newPointerIndex); mMotionY = (int) ev.getY(newPointerIndex); + mMotionCorrection = 0; mActivePointerId = ev.getPointerId(newPointerIndex); if (mVelocityTracker != null) { mVelocityTracker.clear(); @@ -2942,7 +3290,7 @@ public abstract class AbsListView extends AdapterView implements Te /** * Tracks the decay of a fling scroll */ - private final Scroller mScroller; + private final OverScroller mScroller; /** * Y value reported by mScroller on the previous fling @@ -2953,7 +3301,7 @@ public abstract class AbsListView extends AdapterView implements Te public void run() { final int activeId = mActivePointerId; final VelocityTracker vt = mVelocityTracker; - final Scroller scroller = mScroller; + final OverScroller scroller = mScroller; if (vt == null || activeId == INVALID_POINTER) { return; } @@ -2975,7 +3323,7 @@ public abstract class AbsListView extends AdapterView implements Te private static final int FLYWHEEL_TIMEOUT = 40; // milliseconds FlingRunnable() { - mScroller = new Scroller(getContext()); + mScroller = new OverScroller(getContext()); } void start(int initialVelocity) { @@ -2998,6 +3346,42 @@ public abstract class AbsListView extends AdapterView implements Te } } + void startSpringback() { + if (mScroller.springBack(0, mScrollY, 0, 0, 0, 0)) { + mTouchMode = TOUCH_MODE_OVERFLING; + invalidate(); + post(this); + } else { + mTouchMode = TOUCH_MODE_REST; + } + } + + void startOverfling(int initialVelocity) { + final int min = mScrollY > 0 ? Integer.MIN_VALUE : 0; + final int max = mScrollY > 0 ? 0 : Integer.MAX_VALUE; + mScroller.fling(0, mScrollY, 0, initialVelocity, 0, 0, min, max, 0, getHeight()); + mTouchMode = TOUCH_MODE_OVERFLING; + invalidate(); + post(this); + } + + void edgeReached(int delta) { + mScroller.notifyVerticalEdgeReached(mScrollY, 0, mOverflingDistance); + final int overscrollMode = getOverScrollMode(); + if (overscrollMode == OVER_SCROLL_ALWAYS || + (overscrollMode == OVER_SCROLL_IF_CONTENT_SCROLLS && !contentFits())) { + mTouchMode = TOUCH_MODE_OVERFLING; + final int vel = (int) mScroller.getCurrVelocity(); + if (delta > 0) { + mEdgeGlowTop.onAbsorb(vel); + } else { + mEdgeGlowBottom.onAbsorb(vel); + } + } + invalidate(); + post(this); + } + void startScroll(int distance, int duration) { int initialY = distance < 0 ? Integer.MAX_VALUE : 0; mLastFlingY = initialY; @@ -3040,58 +3424,100 @@ public abstract class AbsListView extends AdapterView implements Te return; } // Fall through - case TOUCH_MODE_FLING: + case TOUCH_MODE_FLING: { if (mItemCount == 0 || getChildCount() == 0) { endFling(); return; } - break; - } - final Scroller scroller = mScroller; - boolean more = scroller.computeScrollOffset(); - final int y = scroller.getCurrY(); - // Flip sign to convert finger direction to list items direction - // (e.g. finger moving down means list is moving towards the top) - int delta = mLastFlingY - y; + final OverScroller scroller = mScroller; + boolean more = scroller.computeScrollOffset(); + final int y = scroller.getCurrY(); - // Pretend that each frame of a fling scroll is a touch scroll - if (delta > 0) { - // List is moving towards the top. Use first view as mMotionPosition - mMotionPosition = mFirstPosition; - final View firstView = getChildAt(0); - mMotionViewOriginalTop = firstView.getTop(); + // Flip sign to convert finger direction to list items direction + // (e.g. finger moving down means list is moving towards the top) + int delta = mLastFlingY - y; - // Don't fling more than 1 screen - delta = Math.min(getHeight() - mPaddingBottom - mPaddingTop - 1, delta); - } else { - // List is moving towards the bottom. Use last view as mMotionPosition - int offsetToLast = getChildCount() - 1; - mMotionPosition = mFirstPosition + offsetToLast; + // Pretend that each frame of a fling scroll is a touch scroll + if (delta > 0) { + // List is moving towards the top. Use first view as mMotionPosition + mMotionPosition = mFirstPosition; + final View firstView = getChildAt(0); + mMotionViewOriginalTop = firstView.getTop(); - final View lastView = getChildAt(offsetToLast); - mMotionViewOriginalTop = lastView.getTop(); + // Don't fling more than 1 screen + delta = Math.min(getHeight() - mPaddingBottom - mPaddingTop - 1, delta); + } else { + // List is moving towards the bottom. Use last view as mMotionPosition + int offsetToLast = getChildCount() - 1; + mMotionPosition = mFirstPosition + offsetToLast; - // Don't fling more than 1 screen - delta = Math.max(-(getHeight() - mPaddingBottom - mPaddingTop - 1), delta); - } + final View lastView = getChildAt(offsetToLast); + mMotionViewOriginalTop = lastView.getTop(); - // Don't stop just because delta is zero (it could have been rounded) - final boolean atEnd = trackMotionScroll(delta, delta) && (delta != 0); + // Don't fling more than 1 screen + delta = Math.max(-(getHeight() - mPaddingBottom - mPaddingTop - 1), delta); + } - if (more && !atEnd) { - invalidate(); - mLastFlingY = y; - post(this); - } else { - endFling(); + // Check to see if we have bumped into the scroll limit + View motionView = getChildAt(mMotionPosition - mFirstPosition); + int oldTop = 0; + if (motionView != null) { + oldTop = motionView.getTop(); + } - if (PROFILE_FLINGING) { - if (mFlingProfilingStarted) { - Debug.stopMethodTracing(); - mFlingProfilingStarted = false; + // Don't stop just because delta is zero (it could have been rounded) + final boolean atEnd = trackMotionScroll(delta, delta) && (delta != 0); + if (atEnd) { + if (motionView != null) { + // Tweak the scroll for how far we overshot + int overshoot = -(delta - (motionView.getTop() - oldTop)); + overScrollBy(0, overshoot, 0, mScrollY, 0, 0, + 0, mOverflingDistance, false); + } + edgeReached(delta); + break; + } + + if (more && !atEnd) { + invalidate(); + mLastFlingY = y; + post(this); + } else { + endFling(); + + if (PROFILE_FLINGING) { + if (mFlingProfilingStarted) { + Debug.stopMethodTracing(); + mFlingProfilingStarted = false; + } + + if (mFlingStrictSpan != null) { + mFlingStrictSpan.finish(); + mFlingStrictSpan = null; + } } } + break; + } + + case TOUCH_MODE_OVERFLING: { + final OverScroller scroller = mScroller; + if (scroller.computeScrollOffset()) { + final int scrollY = mScrollY; + final int deltaY = scroller.getCurrY() - scrollY; + if (overScrollBy(0, deltaY, 0, scrollY, 0, 0, + 0, mOverflingDistance, false)) { + startSpringback(); + } else { + invalidate(); + post(this); + } + } else { + endFling(); + } + break; + } } } } @@ -3620,16 +4046,29 @@ public abstract class AbsListView extends AdapterView implements Te final int firstPosition = mFirstPosition; - if (firstPosition == 0 && firstTop >= listPadding.top && deltaY >= 0) { - // Don't need to move views down if the top of the first position - // is already visible - return true; + // Update our guesses for where the first and last views are + if (firstPosition == 0) { + mFirstPositionDistanceGuess = firstTop - mListPadding.top; + } else { + mFirstPositionDistanceGuess += incrementalDeltaY; + } + if (firstPosition + childCount == mItemCount) { + mLastPositionDistanceGuess = lastBottom + mListPadding.bottom; + } else { + mLastPositionDistanceGuess += incrementalDeltaY; } - if (firstPosition + childCount == mItemCount && lastBottom <= end && deltaY <= 0) { + if (firstPosition == 0 && firstTop >= listPadding.top && incrementalDeltaY >= 0) { + // Don't need to move views down if the top of the first position + // is already visible + return incrementalDeltaY != 0; + } + + if (firstPosition + childCount == mItemCount && lastBottom <= end && + incrementalDeltaY <= 0) { // Don't need to move views up if the bottom of the last position // is already visible - return true; + return incrementalDeltaY != 0; } final boolean down = incrementalDeltaY < 0; @@ -3804,6 +4243,22 @@ public abstract class AbsListView extends AdapterView implements Te */ abstract int findMotionRow(int y); + /** + * Find the row closest to y. This row will be used as the motion row when scrolling. + * + * @param y Where the user touched + * @return The position of the first (or only) item in the row closest to y + */ + int findClosestMotionRow(int y) { + final int childCount = getChildCount(); + if (childCount == 0) { + return INVALID_POSITION; + } + + final int motionRow = findMotionRow(y); + return motionRow != INVALID_POSITION ? motionRow : mFirstPosition + childCount - 1; + } + /** * Causes all the views to be rebuilt and redrawn. */ @@ -4577,6 +5032,13 @@ public abstract class AbsListView extends AdapterView implements Te return result; } + private void finishGlows() { + if (mEdgeGlowTop != null) { + mEdgeGlowTop.finish(); + mEdgeGlowBottom.finish(); + } + } + /** * Sets up this AbsListView to use a remote views adapter which connects to a RemoteViewsService * through the specified intent. diff --git a/core/java/android/widget/EdgeGlow.java b/core/java/android/widget/EdgeGlow.java new file mode 100644 index 0000000000000..416be86e59156 --- /dev/null +++ b/core/java/android/widget/EdgeGlow.java @@ -0,0 +1,327 @@ +/* + * Copyright (C) 2010 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package android.widget; + +import android.graphics.Canvas; +import android.graphics.drawable.Drawable; +import android.view.animation.AnimationUtils; +import android.view.animation.DecelerateInterpolator; +import android.view.animation.Interpolator; + +/** + * This class performs the glow effect used at the edges of scrollable widgets. + * @hide + */ +public class EdgeGlow { + private static final String TAG = "EdgeGlow"; + + // Time it will take the effect to fully recede in ms + private static final int RECEDE_TIME = 1000; + + // Time it will take before a pulled glow begins receding + private static final int PULL_TIME = 167; + + // Time it will take for a pulled glow to decay to partial strength before release + private static final int PULL_DECAY_TIME = 1000; + + private static final float MAX_ALPHA = 0.8f; + private static final float HELD_EDGE_ALPHA = 0.7f; + private static final float HELD_EDGE_SCALE_Y = 0.5f; + private static final float HELD_GLOW_ALPHA = 0.5f; + private static final float HELD_GLOW_SCALE_Y = 0.5f; + + private static final float MAX_GLOW_HEIGHT = 3.f; + + private static final float PULL_GLOW_BEGIN = 1.f; + private static final float PULL_EDGE_BEGIN = 0.6f; + + // Minimum velocity that will be absorbed + private static final int MIN_VELOCITY = 100; + + private static final float EPSILON = 0.001f; + + private final Drawable mEdge; + private final Drawable mGlow; + private int mWidth; + private int mHeight; + + private float mEdgeAlpha; + private float mEdgeScaleY; + private float mGlowAlpha; + private float mGlowScaleY; + + private float mEdgeAlphaStart; + private float mEdgeAlphaFinish; + private float mEdgeScaleYStart; + private float mEdgeScaleYFinish; + private float mGlowAlphaStart; + private float mGlowAlphaFinish; + private float mGlowScaleYStart; + private float mGlowScaleYFinish; + + private long mStartTime; + private float mDuration; + + private final Interpolator mInterpolator; + + private static final int STATE_IDLE = 0; + private static final int STATE_PULL = 1; + private static final int STATE_ABSORB = 2; + private static final int STATE_RECEDE = 3; + private static final int STATE_PULL_DECAY = 4; + + // How much dragging should effect the height of the edge image. + // Number determined by user testing. + private static final int PULL_DISTANCE_EDGE_FACTOR = 5; + + // How much dragging should effect the height of the glow image. + // Number determined by user testing. + private static final int PULL_DISTANCE_GLOW_FACTOR = 5; + private static final float PULL_DISTANCE_ALPHA_GLOW_FACTOR = 0.8f; + + private static final int VELOCITY_EDGE_FACTOR = 8; + private static final int VELOCITY_GLOW_FACTOR = 16; + + private int mState = STATE_IDLE; + + private float mPullDistance; + + public EdgeGlow(Drawable edge, Drawable glow) { + mEdge = edge; + mGlow = glow; + + mInterpolator = new DecelerateInterpolator(); + } + + public void setSize(int width, int height) { + mWidth = width; + mHeight = height; + } + + public boolean isFinished() { + return mState == STATE_IDLE; + } + + public void finish() { + mState = STATE_IDLE; + } + + /** + * Call when the object is pulled by the user. + * + * @param deltaDistance Change in distance since the last call + */ + public void onPull(float deltaDistance) { + final long now = AnimationUtils.currentAnimationTimeMillis(); + if (mState == STATE_PULL_DECAY && now - mStartTime < mDuration) { + return; + } + if (mState != STATE_PULL) { + mGlowScaleY = PULL_GLOW_BEGIN; + } + mState = STATE_PULL; + + mStartTime = now; + mDuration = PULL_TIME; + + mPullDistance += deltaDistance; + float distance = Math.abs(mPullDistance); + + mEdgeAlpha = mEdgeAlphaStart = Math.max(PULL_EDGE_BEGIN, Math.min(distance, MAX_ALPHA)); + mEdgeScaleY = mEdgeScaleYStart = Math.max( + HELD_EDGE_SCALE_Y, Math.min(distance * PULL_DISTANCE_EDGE_FACTOR, 1.f)); + + mGlowAlpha = mGlowAlphaStart = Math.min(MAX_ALPHA, + mGlowAlpha + + (Math.abs(deltaDistance) * PULL_DISTANCE_ALPHA_GLOW_FACTOR)); + + float glowChange = Math.abs(deltaDistance); + if (deltaDistance > 0 && mPullDistance < 0) { + glowChange = -glowChange; + } + if (mPullDistance == 0) { + mGlowScaleY = 0; + } + + // Do not allow glow to get larger than MAX_GLOW_HEIGHT. + mGlowScaleY = mGlowScaleYStart = Math.min(MAX_GLOW_HEIGHT, Math.max( + 0, mGlowScaleY + glowChange * PULL_DISTANCE_GLOW_FACTOR)); + + mEdgeAlphaFinish = mEdgeAlpha; + mEdgeScaleYFinish = mEdgeScaleY; + mGlowAlphaFinish = mGlowAlpha; + mGlowScaleYFinish = mGlowScaleY; + } + + /** + * Call when the object is released after being pulled. + */ + public void onRelease() { + mPullDistance = 0; + + if (mState != STATE_PULL && mState != STATE_PULL_DECAY) { + return; + } + + mState = STATE_RECEDE; + mEdgeAlphaStart = mEdgeAlpha; + mEdgeScaleYStart = mEdgeScaleY; + mGlowAlphaStart = mGlowAlpha; + mGlowScaleYStart = mGlowScaleY; + + mEdgeAlphaFinish = 0.f; + mEdgeScaleYFinish = 0.f; + mGlowAlphaFinish = 0.f; + mGlowScaleYFinish = 0.f; + + mStartTime = AnimationUtils.currentAnimationTimeMillis(); + mDuration = RECEDE_TIME; + } + + /** + * Call when the effect absorbs an impact at the given velocity. + * + * @param velocity Velocity at impact in pixels per second. + */ + public void onAbsorb(int velocity) { + mState = STATE_ABSORB; + velocity = Math.max(MIN_VELOCITY, Math.abs(velocity)); + + mStartTime = AnimationUtils.currentAnimationTimeMillis(); + mDuration = 0.1f + (velocity * 0.03f); + + // The edge should always be at least partially visible, regardless + // of velocity. + mEdgeAlphaStart = 0.f; + mEdgeScaleY = mEdgeScaleYStart = 0.f; + // The glow depends more on the velocity, and therefore starts out + // nearly invisible. + mGlowAlphaStart = 0.5f; + mGlowScaleYStart = 0.f; + + // Factor the velocity by 8. Testing on device shows this works best to + // reflect the strength of the user's scrolling. + mEdgeAlphaFinish = Math.max(0, Math.min(velocity * VELOCITY_EDGE_FACTOR, 1)); + // Edge should never get larger than the size of its asset. + mEdgeScaleYFinish = Math.max( + HELD_EDGE_SCALE_Y, Math.min(velocity * VELOCITY_EDGE_FACTOR, 1.f)); + + // Growth for the size of the glow should be quadratic to properly + // respond + // to a user's scrolling speed. The faster the scrolling speed, the more + // intense the effect should be for both the size and the saturation. + mGlowScaleYFinish = Math.min(0.025f + (velocity * (velocity / 100) * 0.00015f), 1.75f); + // Alpha should change for the glow as well as size. + mGlowAlphaFinish = Math.max( + mGlowAlphaStart, Math.min(velocity * VELOCITY_GLOW_FACTOR * .00001f, MAX_ALPHA)); + } + + + /** + * Draw into the provided canvas. Assumes that the canvas has been rotated + * accordingly and the size has been set. The effect will be drawn the full + * width of X=0 to X=width, emitting from Y=0 and extending to some factor < + * 1.f of height. + * + * @param canvas Canvas to draw into + * @return true if drawing should continue beyond this frame to continue the + * animation + */ + public boolean draw(Canvas canvas) { + update(); + + final int edgeHeight = mEdge.getIntrinsicHeight(); + final int glowHeight = mGlow.getIntrinsicHeight(); + + final float distScale = (float) mHeight / mWidth; + + mGlow.setAlpha((int) (Math.max(0, Math.min(mGlowAlpha, 1)) * 255)); + // Width of the image should be 3 * the width of the screen. + // Should start off screen to the left. + mGlow.setBounds(-mWidth, 0, mWidth * 2, (int) Math.min( + glowHeight * mGlowScaleY * distScale * 0.6f, mHeight * MAX_GLOW_HEIGHT)); + mGlow.draw(canvas); + + mEdge.setAlpha((int) (Math.max(0, Math.min(mEdgeAlpha, 1)) * 255)); + mEdge.setBounds(0, 0, mWidth, (int) (edgeHeight * mEdgeScaleY)); + mEdge.draw(canvas); + + return mState != STATE_IDLE; + } + + private void update() { + final long time = AnimationUtils.currentAnimationTimeMillis(); + final float t = Math.min((time - mStartTime) / mDuration, 1.f); + + final float interp = mInterpolator.getInterpolation(t); + + mEdgeAlpha = mEdgeAlphaStart + (mEdgeAlphaFinish - mEdgeAlphaStart) * interp; + mEdgeScaleY = mEdgeScaleYStart + (mEdgeScaleYFinish - mEdgeScaleYStart) * interp; + mGlowAlpha = mGlowAlphaStart + (mGlowAlphaFinish - mGlowAlphaStart) * interp; + mGlowScaleY = mGlowScaleYStart + (mGlowScaleYFinish - mGlowScaleYStart) * interp; + + if (t >= 1.f - EPSILON) { + switch (mState) { + case STATE_ABSORB: + mState = STATE_RECEDE; + mStartTime = AnimationUtils.currentAnimationTimeMillis(); + mDuration = RECEDE_TIME; + + mEdgeAlphaStart = mEdgeAlpha; + mEdgeScaleYStart = mEdgeScaleY; + mGlowAlphaStart = mGlowAlpha; + mGlowScaleYStart = mGlowScaleY; + + // After absorb, the glow and edge should fade to nothing. + mEdgeAlphaFinish = 0.f; + mEdgeScaleYFinish = 0.f; + mGlowAlphaFinish = 0.f; + mGlowScaleYFinish = 0.f; + break; + case STATE_PULL: + mState = STATE_PULL_DECAY; + mStartTime = AnimationUtils.currentAnimationTimeMillis(); + mDuration = PULL_DECAY_TIME; + + mEdgeAlphaStart = mEdgeAlpha; + mEdgeScaleYStart = mEdgeScaleY; + mGlowAlphaStart = mGlowAlpha; + mGlowScaleYStart = mGlowScaleY; + + // After pull, the glow and edge should fade to nothing. + mEdgeAlphaFinish = 0.f; + mEdgeScaleYFinish = 0.f; + mGlowAlphaFinish = 0.f; + mGlowScaleYFinish = 0.f; + break; + case STATE_PULL_DECAY: + // When receding, we want edge to decrease more slowly + // than the glow. + float factor = mGlowScaleYFinish != 0 ? 1 + / (mGlowScaleYFinish * mGlowScaleYFinish) + : Float.MAX_VALUE; + mEdgeScaleY = mEdgeScaleYStart + + (mEdgeScaleYFinish - mEdgeScaleYStart) * + interp * factor; + break; + case STATE_RECEDE: + mState = STATE_IDLE; + break; + } + } + } +} diff --git a/core/java/android/widget/GridView.java b/core/java/android/widget/GridView.java index 114ae81a05b93..414646023a128 100644 --- a/core/java/android/widget/GridView.java +++ b/core/java/android/widget/GridView.java @@ -1954,7 +1954,12 @@ public class GridView extends AbsListView { // TODO: Account for vertical spacing too final int numColumns = mNumColumns; final int rowCount = (mItemCount + numColumns - 1) / numColumns; - return Math.max(rowCount * 100, 0); + int result = Math.max(rowCount * 100, 0); + if (mScrollY != 0) { + // Compensate for overscroll + result += Math.abs((int) ((float) mScrollY / getHeight() * rowCount * 100)); + } + return result; } } diff --git a/core/java/android/widget/HorizontalScrollView.java b/core/java/android/widget/HorizontalScrollView.java index e30d4c8dc54a3..9fc91daeba100 100644 --- a/core/java/android/widget/HorizontalScrollView.java +++ b/core/java/android/widget/HorizontalScrollView.java @@ -16,19 +16,24 @@ package android.widget; -import android.content.Context; -import android.content.res.TypedArray; -import android.graphics.Rect; +import com.android.internal.R; + import android.util.AttributeSet; -import android.view.FocusFinder; -import android.view.KeyEvent; -import android.view.MotionEvent; -import android.view.VelocityTracker; +import android.graphics.Canvas; +import android.graphics.Rect; +import android.graphics.drawable.Drawable; import android.view.View; +import android.view.VelocityTracker; import android.view.ViewConfiguration; import android.view.ViewGroup; +import android.view.KeyEvent; +import android.view.FocusFinder; +import android.view.MotionEvent; import android.view.ViewParent; import android.view.animation.AnimationUtils; +import android.content.Context; +import android.content.res.Resources; +import android.content.res.TypedArray; import java.util.List; @@ -65,7 +70,9 @@ public class HorizontalScrollView extends FrameLayout { private long mLastScroll; private final Rect mTempRect = new Rect(); - private Scroller mScroller; + private OverScroller mScroller; + private EdgeGlow mEdgeGlowLeft; + private EdgeGlow mEdgeGlowRight; /** * Flag to indicate that we are moving focus ourselves. This is so the @@ -119,6 +126,9 @@ public class HorizontalScrollView extends FrameLayout { private int mMinimumVelocity; private int mMaximumVelocity; + private int mOverscrollDistance; + private int mOverflingDistance; + /** * ID of the active pointer. This is used to retain consistency during * drags/flings if multiple pointers are used. @@ -191,7 +201,7 @@ public class HorizontalScrollView extends FrameLayout { private void initScrollView() { - mScroller = new Scroller(getContext()); + mScroller = new OverScroller(getContext()); setFocusable(true); setDescendantFocusability(FOCUS_AFTER_DESCENDANTS); setWillNotDraw(false); @@ -199,6 +209,8 @@ public class HorizontalScrollView extends FrameLayout { mTouchSlop = configuration.getScaledTouchSlop(); mMinimumVelocity = configuration.getScaledMinimumFlingVelocity(); mMaximumVelocity = configuration.getScaledMaximumFlingVelocity(); + mOverscrollDistance = configuration.getScaledOverscrollDistance(); + mOverflingDistance = configuration.getScaledOverflingDistance(); } @Override @@ -463,6 +475,9 @@ public class HorizontalScrollView extends FrameLayout { /* Release the drag */ mIsBeingDragged = false; mActivePointerId = INVALID_POINTER; + if (mScroller.springBack(mScrollX, mScrollY, 0, getScrollRange(), 0, 0)) { + invalidate(); + } break; case MotionEvent.ACTION_POINTER_UP: onSecondaryPointerUp(ev); @@ -495,9 +510,7 @@ public class HorizontalScrollView extends FrameLayout { switch (action & MotionEvent.ACTION_MASK) { case MotionEvent.ACTION_DOWN: { final float x = ev.getX(); - if (!(mIsBeingDragged = inChild((int) x, (int) ev.getY()))) { - return false; - } + mIsBeingDragged = true; /* * If being flinged and user touches, stop the fling. isFinished @@ -520,7 +533,36 @@ public class HorizontalScrollView extends FrameLayout { final int deltaX = (int) (mLastMotionX - x); mLastMotionX = x; - scrollBy(deltaX, 0); + final int oldX = mScrollX; + final int oldY = mScrollY; + final int range = getScrollRange(); + if (overScrollBy(deltaX, 0, mScrollX, 0, range, 0, + mOverscrollDistance, 0, true)) { + // Break our velocity if we hit a scroll barrier. + mVelocityTracker.clear(); + } + onScrollChanged(mScrollX, mScrollY, oldX, oldY); + + final int overscrollMode = getOverScrollMode(); + if (overscrollMode == OVER_SCROLL_ALWAYS || + (overscrollMode == OVER_SCROLL_IF_CONTENT_SCROLLS && range > 0)) { + final int pulledToX = oldX + deltaX; + if (pulledToX < 0) { + mEdgeGlowLeft.onPull((float) deltaX / getWidth()); + if (!mEdgeGlowRight.isFinished()) { + mEdgeGlowRight.onRelease(); + } + } else if (pulledToX > range) { + mEdgeGlowRight.onPull((float) deltaX / getWidth()); + if (!mEdgeGlowLeft.isFinished()) { + mEdgeGlowLeft.onRelease(); + } + } + if (mEdgeGlowLeft != null + && (!mEdgeGlowLeft.isFinished() || !mEdgeGlowRight.isFinished())) { + invalidate(); + } + } } break; case MotionEvent.ACTION_UP: @@ -529,8 +571,15 @@ public class HorizontalScrollView extends FrameLayout { velocityTracker.computeCurrentVelocity(1000, mMaximumVelocity); int initialVelocity = (int) velocityTracker.getXVelocity(mActivePointerId); - if (getChildCount() > 0 && Math.abs(initialVelocity) > mMinimumVelocity) { - fling(-initialVelocity); + if (getChildCount() > 0) { + if ((Math.abs(initialVelocity) > mMinimumVelocity)) { + fling(-initialVelocity); + } else { + final int right = getScrollRange(); + if (mScroller.springBack(mScrollX, mScrollY, 0, right, 0, 0)) { + invalidate(); + } + } } mActivePointerId = INVALID_POINTER; @@ -540,16 +589,27 @@ public class HorizontalScrollView extends FrameLayout { mVelocityTracker.recycle(); mVelocityTracker = null; } + if (mEdgeGlowLeft != null) { + mEdgeGlowLeft.onRelease(); + mEdgeGlowRight.onRelease(); + } } break; case MotionEvent.ACTION_CANCEL: if (mIsBeingDragged && getChildCount() > 0) { + if (mScroller.springBack(mScrollX, mScrollY, 0, getScrollRange(), 0, 0)) { + invalidate(); + } mActivePointerId = INVALID_POINTER; mIsBeingDragged = false; if (mVelocityTracker != null) { mVelocityTracker.recycle(); mVelocityTracker = null; } + if (mEdgeGlowLeft != null) { + mEdgeGlowLeft.onRelease(); + mEdgeGlowRight.onRelease(); + } } break; case MotionEvent.ACTION_POINTER_UP: @@ -576,12 +636,28 @@ public class HorizontalScrollView extends FrameLayout { } } + @Override + protected void onOverScrolled(int scrollX, int scrollY, + boolean clampedX, boolean clampedY) { + // Treat animating scrolls differently; see #computeScroll() for why. + if (!mScroller.isFinished()) { + mScrollX = scrollX; + mScrollY = scrollY; + if (clampedX) { + mScroller.springBack(mScrollX, mScrollY, 0, getScrollRange(), 0, 0); + } + } else { + super.scrollTo(scrollX, scrollY); + } + awakenScrollBars(); + } + private int getScrollRange() { int scrollRange = 0; if (getChildCount() > 0) { View child = getChildAt(0); scrollRange = Math.max(0, - child.getWidth() - getWidth() - mPaddingLeft - mPaddingRight); + child.getWidth() - (getWidth() - mPaddingLeft - mPaddingRight)); } return scrollRange; } @@ -958,7 +1034,16 @@ public class HorizontalScrollView extends FrameLayout { return contentWidth; } - return getChildAt(0).getRight(); + int scrollRange = getChildAt(0).getRight(); + final int scrollX = mScrollX; + final int overscrollRight = Math.max(0, scrollRange - contentWidth); + if (scrollX < 0) { + scrollRange -= scrollX; + } else if (scrollX > overscrollRight) { + scrollRange += scrollX - overscrollRight; + } + + return scrollRange; } @Override @@ -1019,14 +1104,20 @@ public class HorizontalScrollView extends FrameLayout { int x = mScroller.getCurrX(); int y = mScroller.getCurrY(); - if (getChildCount() > 0) { - View child = getChildAt(0); - x = clamp(x, getWidth() - mPaddingRight - mPaddingLeft, child.getWidth()); - y = clamp(y, getHeight() - mPaddingBottom - mPaddingTop, child.getHeight()); - if (x != oldX || y != oldY) { - mScrollX = x; - mScrollY = y; - onScrollChanged(x, y, oldX, oldY); + if (oldX != x || oldY != y) { + overScrollBy(x - oldX, y - oldY, oldX, oldY, getScrollRange(), 0, + mOverflingDistance, 0, false); + onScrollChanged(mScrollX, mScrollY, oldX, oldY); + + final int range = getScrollRange(); + final int overscrollMode = getOverScrollMode(); + if (overscrollMode == OVER_SCROLL_ALWAYS || + (overscrollMode == OVER_SCROLL_IF_CONTENT_SCROLLS && range > 0)) { + if (x < 0 && oldX >= 0) { + mEdgeGlowLeft.onAbsorb((int) mScroller.getCurrVelocity()); + } else if (x > range && oldX <= range) { + mEdgeGlowRight.onAbsorb((int) mScroller.getCurrVelocity()); + } } } awakenScrollBars(); @@ -1263,7 +1354,7 @@ public class HorizontalScrollView extends FrameLayout { int right = getChildAt(0).getWidth(); mScroller.fling(mScrollX, mScrollY, velocityX, 0, 0, - Math.max(0, right - width), 0, 0); + Math.max(0, right - width), 0, 0, width/2, 0); final boolean movingRight = velocityX > 0; @@ -1301,6 +1392,56 @@ public class HorizontalScrollView extends FrameLayout { } } + @Override + public void setOverScrollMode(int mode) { + if (mode != OVER_SCROLL_NEVER) { + if (mEdgeGlowLeft == null) { + final Resources res = getContext().getResources(); + final Drawable edge = res.getDrawable(R.drawable.overscroll_edge); + final Drawable glow = res.getDrawable(R.drawable.overscroll_glow); + mEdgeGlowLeft = new EdgeGlow(edge, glow); + mEdgeGlowRight = new EdgeGlow(edge, glow); + } + } else { + mEdgeGlowLeft = null; + mEdgeGlowRight = null; + } + super.setOverScrollMode(mode); + } + + @Override + public void draw(Canvas canvas) { + super.draw(canvas); + if (mEdgeGlowLeft != null) { + final int scrollX = mScrollX; + if (!mEdgeGlowLeft.isFinished()) { + final int restoreCount = canvas.save(); + final int height = getHeight(); + + canvas.rotate(270); + canvas.translate(-height * 1.5f, Math.min(0, scrollX)); + mEdgeGlowLeft.setSize(getHeight() * 2, getWidth()); + if (mEdgeGlowLeft.draw(canvas)) { + invalidate(); + } + canvas.restoreToCount(restoreCount); + } + if (!mEdgeGlowRight.isFinished()) { + final int restoreCount = canvas.save(); + final int width = getWidth(); + final int height = getHeight(); + + canvas.rotate(90); + canvas.translate(-height / 2, -(Math.max(getScrollRange(), scrollX) + width)); + mEdgeGlowRight.setSize(height * 2, width); + if (mEdgeGlowRight.draw(canvas)) { + invalidate(); + } + canvas.restoreToCount(restoreCount); + } + } + } + private int clamp(int n, int my, int child) { if (my >= child || n < 0) { return 0; diff --git a/core/java/android/widget/ListView.java b/core/java/android/widget/ListView.java index 502cc38bd758c..fd4f950cde17a 100644 --- a/core/java/android/widget/ListView.java +++ b/core/java/android/widget/ListView.java @@ -104,6 +104,9 @@ public class ListView extends AbsListView { Drawable mDivider; int mDividerHeight; + Drawable mOverScrollHeader; + Drawable mOverScrollFooter; + private boolean mIsCacheColorOpaque; private boolean mDividerIsOpaque; @@ -152,6 +155,18 @@ public class ListView extends AbsListView { setDivider(d); } + final Drawable osHeader = a.getDrawable( + com.android.internal.R.styleable.ListView_overScrollHeader); + if (osHeader != null) { + setOverscrollHeader(osHeader); + } + + final Drawable osFooter = a.getDrawable( + com.android.internal.R.styleable.ListView_overScrollFooter); + if (osFooter != null) { + setOverscrollFooter(osFooter); + } + // Use the height specified, zero being the default final int dividerHeight = a.getDimensionPixelSize( com.android.internal.R.styleable.ListView_dividerHeight, 0); @@ -2962,14 +2977,52 @@ public class ListView extends AbsListView { } super.setCacheColorHint(color); } - + + void drawOverscrollHeader(Canvas canvas, Drawable drawable, Rect bounds) { + final int height = drawable.getMinimumHeight(); + + canvas.save(); + canvas.clipRect(bounds); + + final int span = bounds.bottom - bounds.top; + if (span < height) { + bounds.top = bounds.bottom - height; + } + + drawable.setBounds(bounds); + drawable.draw(canvas); + + canvas.restore(); + } + + void drawOverscrollFooter(Canvas canvas, Drawable drawable, Rect bounds) { + final int height = drawable.getMinimumHeight(); + + canvas.save(); + canvas.clipRect(bounds); + + final int span = bounds.bottom - bounds.top; + if (span < height) { + bounds.bottom = bounds.top + height; + } + + drawable.setBounds(bounds); + drawable.draw(canvas); + + canvas.restore(); + } + @Override protected void dispatchDraw(Canvas canvas) { // Draw the dividers final int dividerHeight = mDividerHeight; + final Drawable overscrollHeader = mOverScrollHeader; + final Drawable overscrollFooter = mOverScrollFooter; + final boolean drawOverscrollHeader = overscrollHeader != null; + final boolean drawOverscrollFooter = overscrollFooter != null; final boolean drawDividers = dividerHeight > 0 && mDivider != null; - if (drawDividers) { + if (drawDividers || drawOverscrollHeader || drawOverscrollFooter) { // Only modify the top and bottom in the loop, we set the left and right here final Rect bounds = mTempRect; bounds.left = mPaddingLeft; @@ -2998,34 +3051,67 @@ public class ListView extends AbsListView { final int listBottom = mBottom - mTop - mListPadding.bottom + mScrollY; if (!mStackFromBottom) { - int bottom; + int bottom = 0; + // Draw top divider or header for overscroll + final int scrollY = mScrollY; + if (count > 0 && scrollY < 0) { + if (drawOverscrollHeader) { + bounds.bottom = 0; + bounds.top = scrollY; + drawOverscrollHeader(canvas, overscrollHeader, bounds); + } else if (drawDividers) { + bounds.bottom = 0; + bounds.top = -dividerHeight; + drawDivider(canvas, bounds, -1); + } + } + for (int i = 0; i < count; i++) { if ((headerDividers || first + i >= headerCount) && (footerDividers || first + i < footerLimit)) { View child = getChildAt(i); bottom = child.getBottom(); // Don't draw dividers next to items that are not enabled - if ((areAllItemsSelectable || - (adapter.isEnabled(first + i) && (i == count - 1 || - adapter.isEnabled(first + i + 1))))) { - bounds.top = bottom; - bounds.bottom = bottom + dividerHeight; - drawDivider(canvas, bounds, i); - } else if (fillForMissingDividers) { - bounds.top = bottom; - bounds.bottom = bottom + dividerHeight; - canvas.drawRect(bounds, paint); + + if (drawDividers && + (bottom < listBottom && !(drawOverscrollFooter && i == count - 1))) { + if ((areAllItemsSelectable || + (adapter.isEnabled(first + i) && (i == count - 1 || + adapter.isEnabled(first + i + 1))))) { + bounds.top = bottom; + bounds.bottom = bottom + dividerHeight; + drawDivider(canvas, bounds, i); + } else if (fillForMissingDividers) { + bounds.top = bottom; + bounds.bottom = bottom + dividerHeight; + canvas.drawRect(bounds, paint); + } } } } + + final int overFooterBottom = mBottom + mScrollY; + if (drawOverscrollFooter && first + count == itemCount && + overFooterBottom > bottom) { + bounds.top = bottom; + bounds.bottom = overFooterBottom; + drawOverscrollFooter(canvas, overscrollFooter, bounds); + } } else { int top; int listTop = mListPadding.top; final int scrollY = mScrollY; - for (int i = 0; i < count; i++) { + if (count > 0 && drawOverscrollHeader) { + bounds.top = scrollY; + bounds.bottom = getChildAt(0).getTop(); + drawOverscrollHeader(canvas, overscrollHeader, bounds); + } + + final int start = drawOverscrollHeader ? 1 : 0; + for (int i = start; i < count; i++) { if ((headerDividers || first + i >= headerCount) && (footerDividers || first + i < footerLimit)) { View child = getChildAt(i); @@ -3052,9 +3138,16 @@ public class ListView extends AbsListView { } if (count > 0 && scrollY > 0) { - bounds.top = listBottom; - bounds.bottom = listBottom + dividerHeight; - drawDivider(canvas, bounds, -1); + if (drawOverscrollFooter) { + final int absListBottom = mBottom; + bounds.top = absListBottom; + bounds.bottom = absListBottom + scrollY; + drawOverscrollFooter(canvas, overscrollFooter, bounds); + } else if (drawDividers) { + bounds.top = listBottom; + bounds.bottom = listBottom + dividerHeight; + drawDivider(canvas, bounds, -1); + } } } } @@ -3150,6 +3243,45 @@ public class ListView extends AbsListView { invalidate(); } + /** + * Sets the drawable that will be drawn above all other list content. + * This area can become visible when the user overscrolls the list. + * + * @param header The drawable to use + */ + public void setOverscrollHeader(Drawable header) { + mOverScrollHeader = header; + if (mScrollY < 0) { + invalidate(); + } + } + + /** + * @return The drawable that will be drawn above all other list content + */ + public Drawable getOverscrollHeader() { + return mOverScrollHeader; + } + + /** + * Sets the drawable that will be drawn below all other list content. + * This area can become visible when the user overscrolls the list, + * or when the list's content does not fully fill the container area. + * + * @param footer The drawable to use + */ + public void setOverscrollFooter(Drawable footer) { + mOverScrollFooter = footer; + invalidate(); + } + + /** + * @return The drawable that will be drawn below all other list content + */ + public Drawable getOverscrollFooter() { + return mOverScrollFooter; + } + @Override protected void onFocusChanged(boolean gainFocus, int direction, Rect previouslyFocusedRect) { super.onFocusChanged(gainFocus, direction, previouslyFocusedRect); diff --git a/core/java/android/widget/OverScroller.java b/core/java/android/widget/OverScroller.java new file mode 100644 index 0000000000000..cd81e31ce8697 --- /dev/null +++ b/core/java/android/widget/OverScroller.java @@ -0,0 +1,888 @@ +/* + * Copyright (C) 2010 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package android.widget; + +import android.content.Context; +import android.graphics.Interpolator; +import android.view.ViewConfiguration; +import android.view.animation.AnimationUtils; + +/** + * This class encapsulates scrolling with the ability to overshoot the bounds + * of a scrolling operation. This class is a drop-in replacement for + * {@link android.widget.Scroller} in most cases. + */ +public class OverScroller { + int mMode; + + private final MagneticOverScroller mScrollerX; + private final MagneticOverScroller mScrollerY; + + private float mDeceleration; + private final float mPpi; + private final boolean mFlywheel; + + private static float DECELERATION_RATE = (float) (Math.log(0.75) / Math.log(0.9)); + private static float ALPHA = 800; // pixels / seconds + private static float START_TENSION = 0.4f; // Tension at start: (0.4 * total T, 1.0 * Distance) + private static float END_TENSION = 1.0f - START_TENSION; + private static final int NB_SAMPLES = 100; + private static final float[] SPLINE_POSITION = new float[NB_SAMPLES + 1]; + private static final float[] SPLINE_TIME = new float[NB_SAMPLES + 1]; + + private static final int DEFAULT_DURATION = 250; + private static final int SCROLL_MODE = 0; + private static final int FLING_MODE = 1; + + static { + float x_min = 0.0f; + float y_min = 0.0f; + for (int i = 0; i < NB_SAMPLES; i++) { + final float alpha = (float) i / NB_SAMPLES; + { + float x_max = 1.0f; + float x, tx, coef; + while (true) { + x = x_min + (x_max - x_min) / 2.0f; + coef = 3.0f * x * (1.0f - x); + tx = coef * ((1.0f - x) * START_TENSION + x * END_TENSION) + x * x * x; + if (Math.abs(tx - alpha) < 1E-5) break; + if (tx > alpha) x_max = x; + else x_min = x; + } + SPLINE_POSITION[i] = coef + x * x * x; + } + + { + float y_max = 1.0f; + float y, dy, coef; + while (true) { + y = y_min + (y_max - y_min) / 2.0f; + coef = 3.0f * y * (1.0f - y); + dy = coef + y * y * y; + if (Math.abs(dy - alpha) < 1E-5) break; + if (dy > alpha) y_max = y; + else y_min = y; + } + SPLINE_TIME[i] = coef * ((1.0f - y) * START_TENSION + y * END_TENSION) + y * y * y; + } + } + SPLINE_POSITION[NB_SAMPLES] = SPLINE_TIME[NB_SAMPLES] = 1.0f; + } + + public OverScroller(Context context) { + this(context, null, 0.f, 0.f, true); + } + + /** + * Creates an OverScroller. + * @param context The context of this application. + * @param interpolator The scroll interpolator. If null, a default (viscous) interpolator will + * be used. + * @param bounceCoefficientX A value between 0 and 1 that will determine the proportion of the + * velocity which is preserved in the bounce when the horizontal edge is reached. A null value + * means no bounce. + * @param bounceCoefficientY Same as bounceCoefficientX but for the vertical direction. + */ + public OverScroller(Context context, Interpolator interpolator, + float bounceCoefficientX, float bounceCoefficientY, boolean flywheel) { + mFlywheel = flywheel; + mPpi = context.getResources().getDisplayMetrics().density * 160.0f; + mDeceleration = computeDeceleration(ViewConfiguration.getScrollFriction()); + mScrollerX = new MagneticOverScroller(); + mScrollerY = new MagneticOverScroller(); + + mScrollerX.setBounceCoefficient(bounceCoefficientX); + mScrollerY.setBounceCoefficient(bounceCoefficientY); + } + + + /** + * The amount of friction applied to flings. The default value + * is {@link ViewConfiguration#getScrollFriction}. + * + * @param friction A scalar dimension-less value representing the coefficient of + * friction. + */ + public final void setFriction(float friction) { + mDeceleration = computeDeceleration(friction); + } + + private float computeDeceleration(float friction) { + return 9.81f // g (m/s^2) + * 39.37f // inch/meter + * mPpi // pixels per inch + * friction; + } + + /** + * + * Returns whether the scroller has finished scrolling. + * + * @return True if the scroller has finished scrolling, false otherwise. + */ + public final boolean isFinished() { + return mScrollerX.mFinished && mScrollerY.mFinished; + } + + /** + * Force the finished field to a particular value. Contrary to + * {@link #abortAnimation()}, forcing the animation to finished + * does NOT cause the scroller to move to the final x and y + * position. + * + * @param finished The new finished value. + */ + public final void forceFinished(boolean finished) { + mScrollerX.mFinished = mScrollerY.mFinished = finished; + } + + /** + * Returns the current X offset in the scroll. + * + * @return The new X offset as an absolute distance from the origin. + */ + public final int getCurrX() { + return mScrollerX.mCurrentPosition; + } + + /** + * Returns the current Y offset in the scroll. + * + * @return The new Y offset as an absolute distance from the origin. + */ + public final int getCurrY() { + return mScrollerY.mCurrentPosition; + } + + /** + * @hide + * Returns the current velocity. + * + * @return The original velocity less the deceleration, norm of the X and Y velocity vector. + */ + public float getCurrVelocity() { + float squaredNorm = mScrollerX.mCurrVelocity * mScrollerX.mCurrVelocity; + squaredNorm += mScrollerY.mCurrVelocity * mScrollerY.mCurrVelocity; + return (float) Math.sqrt(squaredNorm); + } + + /** + * Returns the start X offset in the scroll. + * + * @return The start X offset as an absolute distance from the origin. + */ + public final int getStartX() { + return mScrollerX.mStart; + } + + /** + * Returns the start Y offset in the scroll. + * + * @return The start Y offset as an absolute distance from the origin. + */ + public final int getStartY() { + return mScrollerY.mStart; + } + + /** + * Returns where the scroll will end. Valid only for "fling" scrolls. + * + * @return The final X offset as an absolute distance from the origin. + */ + public final int getFinalX() { + return mScrollerX.mFinal; + } + + /** + * Returns where the scroll will end. Valid only for "fling" scrolls. + * + * @return The final Y offset as an absolute distance from the origin. + */ + public final int getFinalY() { + return mScrollerY.mFinal; + } + + /** + * Returns how long the scroll event will take, in milliseconds. + * + * @return The duration of the scroll in milliseconds. + * + * @hide Pending removal once nothing depends on it + * @deprecated OverScrollers don't necessarily have a fixed duration. + * This function will lie to the best of its ability. + */ + @Deprecated + public final int getDuration() { + return Math.max(mScrollerX.mDuration, mScrollerY.mDuration); + } + + /** + * Extend the scroll animation. This allows a running animation to scroll + * further and longer, when used with {@link #setFinalX(int)} or {@link #setFinalY(int)}. + * + * @param extend Additional time to scroll in milliseconds. + * @see #setFinalX(int) + * @see #setFinalY(int) + * + * @hide Pending removal once nothing depends on it + * @deprecated OverScrollers don't necessarily have a fixed duration. + * Instead of setting a new final position and extending + * the duration of an existing scroll, use startScroll + * to begin a new animation. + */ + @Deprecated + public void extendDuration(int extend) { + mScrollerX.extendDuration(extend); + mScrollerY.extendDuration(extend); + } + + /** + * Sets the final position (X) for this scroller. + * + * @param newX The new X offset as an absolute distance from the origin. + * @see #extendDuration(int) + * @see #setFinalY(int) + * + * @hide Pending removal once nothing depends on it + * @deprecated OverScroller's final position may change during an animation. + * Instead of setting a new final position and extending + * the duration of an existing scroll, use startScroll + * to begin a new animation. + */ + @Deprecated + public void setFinalX(int newX) { + mScrollerX.setFinalPosition(newX); + } + + /** + * Sets the final position (Y) for this scroller. + * + * @param newY The new Y offset as an absolute distance from the origin. + * @see #extendDuration(int) + * @see #setFinalX(int) + * + * @hide Pending removal once nothing depends on it + * @deprecated OverScroller's final position may change during an animation. + * Instead of setting a new final position and extending + * the duration of an existing scroll, use startScroll + * to begin a new animation. + */ + @Deprecated + public void setFinalY(int newY) { + mScrollerY.setFinalPosition(newY); + } + + /** + * Call this when you want to know the new location. If it returns true, the + * animation is not yet finished. + */ + public boolean computeScrollOffset() { + if (isFinished()) { + return false; + } + + switch (mMode) { + case SCROLL_MODE: + long time = AnimationUtils.currentAnimationTimeMillis(); + // Any scroller can be used for time, since they were started + // together in scroll mode. We use X here. + final long elapsedTime = time - mScrollerX.mStartTime; + + final int duration = mScrollerX.mDuration; + if (elapsedTime < duration) { + float q = (float) (elapsedTime) / duration; + + q = Scroller.viscousFluid(q); + + mScrollerX.updateScroll(q); + mScrollerY.updateScroll(q); + } else { + abortAnimation(); + } + break; + + case FLING_MODE: + if (!mScrollerX.mFinished) { + if (!mScrollerX.update()) { + if (!mScrollerX.continueWhenFinished()) { + mScrollerX.finish(); + } + } + } + + if (!mScrollerY.mFinished) { + if (!mScrollerY.update()) { + if (!mScrollerY.continueWhenFinished()) { + mScrollerY.finish(); + } + } + } + + break; + } + + return true; + } + + /** + * Start scrolling by providing a starting point and the distance to travel. + * The scroll will use the default value of 250 milliseconds for the + * duration. + * + * @param startX Starting horizontal scroll offset in pixels. Positive + * numbers will scroll the content to the left. + * @param startY Starting vertical scroll offset in pixels. Positive numbers + * will scroll the content up. + * @param dx Horizontal distance to travel. Positive numbers will scroll the + * content to the left. + * @param dy Vertical distance to travel. Positive numbers will scroll the + * content up. + */ + public void startScroll(int startX, int startY, int dx, int dy) { + startScroll(startX, startY, dx, dy, DEFAULT_DURATION); + } + + /** + * Start scrolling by providing a starting point and the distance to travel. + * + * @param startX Starting horizontal scroll offset in pixels. Positive + * numbers will scroll the content to the left. + * @param startY Starting vertical scroll offset in pixels. Positive numbers + * will scroll the content up. + * @param dx Horizontal distance to travel. Positive numbers will scroll the + * content to the left. + * @param dy Vertical distance to travel. Positive numbers will scroll the + * content up. + * @param duration Duration of the scroll in milliseconds. + */ + public void startScroll(int startX, int startY, int dx, int dy, int duration) { + mMode = SCROLL_MODE; + mScrollerX.startScroll(startX, dx, duration); + mScrollerY.startScroll(startY, dy, duration); + } + + /** + * Call this when you want to 'spring back' into a valid coordinate range. + * + * @param startX Starting X coordinate + * @param startY Starting Y coordinate + * @param minX Minimum valid X value + * @param maxX Maximum valid X value + * @param minY Minimum valid Y value + * @param maxY Minimum valid Y value + * @return true if a springback was initiated, false if startX and startY were + * already within the valid range. + */ + public boolean springBack(int startX, int startY, int minX, int maxX, int minY, int maxY) { + mMode = FLING_MODE; + + // Make sure both methods are called. + final boolean spingbackX = mScrollerX.springback(startX, minX, maxX); + final boolean spingbackY = mScrollerY.springback(startY, minY, maxY); + return spingbackX || spingbackY; + } + + public void fling(int startX, int startY, int velocityX, int velocityY, + int minX, int maxX, int minY, int maxY) { + fling(startX, startY, velocityX, velocityY, minX, maxX, minY, maxY, 0, 0); + } + + /** + * Start scrolling based on a fling gesture. The distance traveled will + * depend on the initial velocity of the fling. + * + * @param startX Starting point of the scroll (X) + * @param startY Starting point of the scroll (Y) + * @param velocityX Initial velocity of the fling (X) measured in pixels per + * second. + * @param velocityY Initial velocity of the fling (Y) measured in pixels per + * second + * @param minX Minimum X value. The scroller will not scroll past this point + * unless overX > 0. If overfling is allowed, it will use minX as + * a springback boundary. + * @param maxX Maximum X value. The scroller will not scroll past this point + * unless overX > 0. If overfling is allowed, it will use maxX as + * a springback boundary. + * @param minY Minimum Y value. The scroller will not scroll past this point + * unless overY > 0. If overfling is allowed, it will use minY as + * a springback boundary. + * @param maxY Maximum Y value. The scroller will not scroll past this point + * unless overY > 0. If overfling is allowed, it will use maxY as + * a springback boundary. + * @param overX Overfling range. If > 0, horizontal overfling in either + * direction will be possible. + * @param overY Overfling range. If > 0, vertical overfling in either + * direction will be possible. + */ + public void fling(int startX, int startY, int velocityX, int velocityY, + int minX, int maxX, int minY, int maxY, int overX, int overY) { + // Continue a scroll or fling in progress + if (mFlywheel && !isFinished()) { + float oldVelocityX = mScrollerX.mCurrVelocity; + float oldVelocityY = mScrollerY.mCurrVelocity; + if (Math.signum(velocityX) == Math.signum(oldVelocityX) && + Math.signum(velocityY) == Math.signum(oldVelocityY)) { + velocityX += oldVelocityX; + velocityY += oldVelocityY; + } + } + + mMode = FLING_MODE; + mScrollerX.fling(startX, velocityX, minX, maxX, overX); + mScrollerY.fling(startY, velocityY, minY, maxY, overY); + } + + /** + * Notify the scroller that we've reached a horizontal boundary. + * Normally the information to handle this will already be known + * when the animation is started, such as in a call to one of the + * fling functions. However there are cases where this cannot be known + * in advance. This function will transition the current motion and + * animate from startX to finalX as appropriate. + * + * @param startX Starting/current X position + * @param finalX Desired final X position + * @param overX Magnitude of overscroll allowed. This should be the maximum + * desired distance from finalX. Absolute value - must be positive. + */ + public void notifyHorizontalEdgeReached(int startX, int finalX, int overX) { + mScrollerX.notifyEdgeReached(startX, finalX, overX); + } + + /** + * Notify the scroller that we've reached a vertical boundary. + * Normally the information to handle this will already be known + * when the animation is started, such as in a call to one of the + * fling functions. However there are cases where this cannot be known + * in advance. This function will animate a parabolic motion from + * startY to finalY. + * + * @param startY Starting/current Y position + * @param finalY Desired final Y position + * @param overY Magnitude of overscroll allowed. This should be the maximum + * desired distance from finalY. Absolute value - must be positive. + */ + public void notifyVerticalEdgeReached(int startY, int finalY, int overY) { + mScrollerY.notifyEdgeReached(startY, finalY, overY); + } + + /** + * Returns whether the current Scroller is currently returning to a valid position. + * Valid bounds were provided by the + * {@link #fling(int, int, int, int, int, int, int, int, int, int)} method. + * + * One should check this value before calling + * {@link #startScroll(int, int, int, int)} as the interpolation currently in progress + * to restore a valid position will then be stopped. The caller has to take into account + * the fact that the started scroll will start from an overscrolled position. + * + * @return true when the current position is overscrolled and in the process of + * interpolating back to a valid value. + */ + public boolean isOverScrolled() { + return ((!mScrollerX.mFinished && + mScrollerX.mState != MagneticOverScroller.TO_EDGE) || + (!mScrollerY.mFinished && + mScrollerY.mState != MagneticOverScroller.TO_EDGE)); + } + + /** + * Stops the animation. Contrary to {@link #forceFinished(boolean)}, + * aborting the animating causes the scroller to move to the final x and y + * positions. + * + * @see #forceFinished(boolean) + */ + public void abortAnimation() { + mScrollerX.finish(); + mScrollerY.finish(); + } + + /** + * Returns the time elapsed since the beginning of the scrolling. + * + * @return The elapsed time in milliseconds. + * + * @hide + */ + public int timePassed() { + final long time = AnimationUtils.currentAnimationTimeMillis(); + final long startTime = Math.min(mScrollerX.mStartTime, mScrollerY.mStartTime); + return (int) (time - startTime); + } + + /** + * @hide + */ + public boolean isScrollingInDirection(float xvel, float yvel) { + final int dx = mScrollerX.mFinal - mScrollerX.mStart; + final int dy = mScrollerY.mFinal - mScrollerY.mStart; + return !isFinished() && Math.signum(xvel) == Math.signum(dx) && + Math.signum(yvel) == Math.signum(dy); + } + + class MagneticOverScroller { + // Initial position + int mStart; + + // Current position + int mCurrentPosition; + + // Final position + int mFinal; + + // Initial velocity + int mVelocity; + + // Current velocity + float mCurrVelocity; + + // Constant current deceleration + float mDeceleration; + + // Animation starting time, in system milliseconds + long mStartTime; + + // Animation duration, in milliseconds + int mDuration; + + // Duration to complete spline component of animation + int mSplineDuration; + + // Distance to travel along spline animation + int mSplineDistance; + + // Whether the animation is currently in progress + boolean mFinished; + + private static final int TO_EDGE = 0; + private static final int TO_BOUNDARY = 1; + private static final int TO_BOUNCE = 2; + + private int mState = TO_EDGE; + + // The allowed overshot distance before boundary is reached. + private int mOver; + + // If the velocity is smaller than this value, no bounce is triggered + // when the edge limits are reached (would result in a zero pixels + // displacement anyway). + private static final float MINIMUM_VELOCITY_FOR_BOUNCE = 140.0f; //Float.MAX_VALUE;//140.0f; + + // Proportion of the velocity that is preserved when the edge is reached. + private static final float DEFAULT_BOUNCE_COEFFICIENT = 0.36f; + + private float mBounceCoefficient = DEFAULT_BOUNCE_COEFFICIENT; + + MagneticOverScroller() { + mFinished = true; + } + + void updateScroll(float q) { + mCurrentPosition = mStart + Math.round(q * (mFinal - mStart)); + } + + /* + * Get a signed deceleration that will reduce the velocity. + */ + float getDeceleration(int velocity) { + return velocity > 0 ? -OverScroller.this.mDeceleration : OverScroller.this.mDeceleration; + } + + /* + * Modifies mDuration to the duration it takes to get from start to newFinal using the + * spline interpolation. The previous duration was needed to get to oldFinal. + */ + void adjustDuration(int start, int oldFinal, int newFinal) { + final int oldDistance = oldFinal - start; + final int newDistance = newFinal - start; + final float x = (float) Math.abs((float) newDistance / oldDistance); + final int index = (int) (NB_SAMPLES * x); + if (index < NB_SAMPLES) { + final float x_inf = (float) index / NB_SAMPLES; + final float x_sup = (float) (index + 1) / NB_SAMPLES; + final float t_inf = SPLINE_TIME[index]; + final float t_sup = SPLINE_TIME[index + 1]; + final float timeCoef = t_inf + (x - x_inf) / (x_sup - x_inf) * (t_sup - t_inf); + + mDuration *= timeCoef; + } + } + + void startScroll(int start, int distance, int duration) { + mFinished = false; + + mStart = start; + mFinal = start + distance; + + mStartTime = AnimationUtils.currentAnimationTimeMillis(); + mDuration = duration; + + // Unused + mDeceleration = 0.0f; + mVelocity = 0; + } + + void finish() { + mCurrentPosition = mFinal; + // Not reset since WebView relies on this value for fast fling. + // TODO: restore when WebView uses the fast fling implemented in this class. + // mCurrVelocity = 0.0f; + mFinished = true; + } + + void setFinalPosition(int position) { + mFinal = position; + mFinished = false; + } + + void extendDuration(int extend) { + final long time = AnimationUtils.currentAnimationTimeMillis(); + final int elapsedTime = (int) (time - mStartTime); + mDuration = elapsedTime + extend; + mFinished = false; + } + + void setBounceCoefficient(float coefficient) { + mBounceCoefficient = coefficient; + } + + boolean springback(int start, int min, int max) { + mFinished = true; + + mStart = mFinal = start; + mVelocity = 0; + + mStartTime = AnimationUtils.currentAnimationTimeMillis(); + mDuration = 0; + + if (start < min) { + startSpringback(start, min, 0); + } else if (start > max) { + startSpringback(start, max, 0); + } + + return !mFinished; + } + + private void startSpringback(int start, int end, int velocity) { + mFinished = false; + mState = TO_BOUNCE; + mStart = mFinal = end; + final float velocitySign = Math.signum(start - end); + mDeceleration = getDeceleration((int) velocitySign); + fitOnBounceCurve(start, end, velocity); + mDuration = - (int) (2000.0f * mVelocity / mDeceleration); + } + + void fling(int start, int velocity, int min, int max, int over) { + mOver = over; + mFinished = false; + mCurrVelocity = mVelocity = velocity; + mDuration = mSplineDuration = 0; + mStartTime = AnimationUtils.currentAnimationTimeMillis(); + mStart = start; + + if (start > max || start < min) { + startAfterEdge(start, min, max, velocity); + return; + } + + mState = TO_EDGE; + double totalDistance = 0.0; + + if (velocity != 0) { + final double l = Math.log(START_TENSION * Math.abs(velocity) / ALPHA); + // Duration are expressed in milliseconds + mDuration = mSplineDuration = (int) (1000.0 * Math.exp(l / (DECELERATION_RATE - 1.0))); + totalDistance = (ALPHA * Math.exp(DECELERATION_RATE / (DECELERATION_RATE - 1.0) * l)); + } + + mSplineDistance = (int) (totalDistance * Math.signum(velocity)); + mFinal = start + mSplineDistance; + + // Clamp to a valid final position + if (mFinal < min) { + adjustDuration(mStart, mFinal, min); + mFinal = min; + } + + if (mFinal > max) { + adjustDuration(mStart, mFinal, max); + mFinal = max; + } + } + + private void fitOnBounceCurve(int start, int end, int velocity) { + // Simulate a bounce that started from edge + final float durationToApex = - velocity / mDeceleration; + final float distanceToApex = velocity * velocity / 2.0f / Math.abs(mDeceleration); + final float distanceToEdge = Math.abs(end - start); + final float totalDuration = (float) Math.sqrt( + 2.0 * (distanceToApex + distanceToEdge) / Math.abs(mDeceleration)); + mStartTime -= (int) (1000.0f * (totalDuration - durationToApex)); + mStart = end; + mVelocity = (int) (- mDeceleration * totalDuration); + } + + private void startBounceAfterEdge(int start, int end, int velocity) { + mDeceleration = getDeceleration(velocity == 0 ? start - end : velocity); + fitOnBounceCurve(start, end, velocity); + onEdgeReached(); + } + + private void startAfterEdge(int start, int min, int max, int velocity) { + if (start > min && start < max) { + mFinished = true; + return; + } + final boolean positive = start > max; + final int edge = positive ? max : min; + final int overDistance = start - edge; + boolean keepIncreasing = overDistance * velocity >= 0; + if (keepIncreasing) { + // Will result in a bounce or a to_boundary depending on velocity. + startBounceAfterEdge(start, edge, velocity); + } else { + final double l = Math.log(START_TENSION * Math.abs(velocity) / ALPHA); + final double totalDistance = + (ALPHA * Math.exp(DECELERATION_RATE / (DECELERATION_RATE - 1.0) * l)); + if (totalDistance > Math.abs(overDistance)) { + fling(start, velocity, positive ? min : start, positive ? start : max, mOver); + } else { + startSpringback(start, edge, velocity); + } + } + } + + void notifyEdgeReached(int start, int end, int over) { + mOver = over; + mStartTime = AnimationUtils.currentAnimationTimeMillis(); + // We were in fling/scroll mode before: current velocity is such that distance to edge + // is increasing. Ensures that startAfterEdge will not start a new fling. + startAfterEdge(start, end, end, (int) mCurrVelocity); + } + + private void onEdgeReached() { + // mStart, mVelocity and mStartTime were adjusted to their values when edge was reached. + final float distance = - mVelocity * mVelocity / (2.0f * mDeceleration); + + if (Math.abs(distance) < mOver) { + // Spring force will bring us back to final position + mState = TO_BOUNCE; + mFinal = mStart; + mDuration = - (int) (2000.0f * mVelocity / mDeceleration); + } else { + // Velocity is too high, we will hit the boundary limit + mState = TO_BOUNDARY; + int over = mVelocity > 0 ? mOver : -mOver; + mFinal = mStart + over; + mDuration = (int) (1000.0 * Math.PI * over / 2.0 / mVelocity); + } + } + + boolean continueWhenFinished() { + switch (mState) { + case TO_EDGE: + // Duration from start to null velocity + if (mDuration < mSplineDuration) { + // If the animation was clamped, we reached the edge + mStart = mFinal; + // Speed when edge was reached + mVelocity = (int) mCurrVelocity; + mDeceleration = getDeceleration(mVelocity); + mStartTime += mDuration; + onEdgeReached(); + } else { + // Normal stop, no need to continue + return false; + } + break; + case TO_BOUNDARY: + mStartTime += mDuration; + startSpringback(mFinal, mFinal - (mVelocity > 0 ? mOver:-mOver), 0); + break; + case TO_BOUNCE: + mVelocity = (int) (mVelocity * mBounceCoefficient); + if (Math.abs(mVelocity) < MINIMUM_VELOCITY_FOR_BOUNCE) { + return false; + } + mStartTime += mDuration; + mDuration = - (int) (mVelocity / mDeceleration); + break; + } + + update(); + return true; + } + + /* + * Update the current position and velocity for current time. Returns + * true if update has been done and false if animation duration has been + * reached. + */ + boolean update() { + final long time = AnimationUtils.currentAnimationTimeMillis(); + final long currentTime = time - mStartTime; + + if (currentTime > mDuration) { + return false; + } + + double distance = 0.0; + switch (mState) { + case TO_EDGE: { + final float t = (float) currentTime / mSplineDuration; + final int index = (int) (NB_SAMPLES * t); + float distanceCoef = 1.f; + float velocityCoef = 0.f; + if (index < NB_SAMPLES) { + final float t_inf = (float) index / NB_SAMPLES; + final float t_sup = (float) (index + 1) / NB_SAMPLES; + final float d_inf = SPLINE_POSITION[index]; + final float d_sup = SPLINE_POSITION[index + 1]; + velocityCoef = (d_sup - d_inf) / (t_sup - t_inf); + distanceCoef = d_inf + (t - t_inf) * velocityCoef; + } + + distance = distanceCoef * mSplineDistance; + mCurrVelocity = velocityCoef * mSplineDistance / mSplineDuration * 1000; + break; + } + + case TO_BOUNCE: { + final float t = currentTime / 1000.0f; + mCurrVelocity = mVelocity + mDeceleration * t; + distance = mVelocity * t + mDeceleration * t * t / 2.0f; + break; + } + + case TO_BOUNDARY: { + final float t = currentTime / 1000.0f; + final float d = t * Math.abs(mVelocity) / mOver; + mCurrVelocity = mVelocity * (float) Math.cos(d); + distance = (mVelocity > 0 ? mOver : -mOver) * Math.sin(d); + break; + } + } + + mCurrentPosition = mStart + (int) Math.round(distance); + return true; + } + } +} diff --git a/core/java/android/widget/ScrollView.java b/core/java/android/widget/ScrollView.java index eb527eb3d3e0d..3faec5578d663 100644 --- a/core/java/android/widget/ScrollView.java +++ b/core/java/android/widget/ScrollView.java @@ -19,8 +19,11 @@ package android.widget; import com.android.internal.R; import android.content.Context; +import android.content.res.Resources; import android.content.res.TypedArray; +import android.graphics.Canvas; import android.graphics.Rect; +import android.graphics.drawable.Drawable; import android.util.AttributeSet; import android.view.FocusFinder; import android.view.KeyEvent; @@ -61,7 +64,9 @@ public class ScrollView extends FrameLayout { private long mLastScroll; private final Rect mTempRect = new Rect(); - private Scroller mScroller; + private OverScroller mScroller; + private EdgeGlow mEdgeGlowTop; + private EdgeGlow mEdgeGlowBottom; /** * Flag to indicate that we are moving focus ourselves. This is so the @@ -115,6 +120,9 @@ public class ScrollView extends FrameLayout { private int mMinimumVelocity; private int mMaximumVelocity; + private int mOverscrollDistance; + private int mOverflingDistance; + /** * ID of the active pointer. This is used to retain consistency during * drags/flings if multiple pointers are used. @@ -187,7 +195,7 @@ public class ScrollView extends FrameLayout { private void initScrollView() { - mScroller = new Scroller(getContext()); + mScroller = new OverScroller(getContext()); setFocusable(true); setDescendantFocusability(FOCUS_AFTER_DESCENDANTS); setWillNotDraw(false); @@ -195,6 +203,8 @@ public class ScrollView extends FrameLayout { mTouchSlop = configuration.getScaledTouchSlop(); mMinimumVelocity = configuration.getScaledMinimumFlingVelocity(); mMaximumVelocity = configuration.getScaledMaximumFlingVelocity(); + mOverscrollDistance = configuration.getScaledOverscrollDistance(); + mOverflingDistance = configuration.getScaledOverflingDistance(); } @Override @@ -459,6 +469,9 @@ public class ScrollView extends FrameLayout { /* Release the drag */ mIsBeingDragged = false; mActivePointerId = INVALID_POINTER; + if (mScroller.springBack(mScrollX, mScrollY, 0, 0, 0, getScrollRange())) { + invalidate(); + } break; case MotionEvent.ACTION_POINTER_UP: onSecondaryPointerUp(ev); @@ -491,9 +504,7 @@ public class ScrollView extends FrameLayout { switch (action & MotionEvent.ACTION_MASK) { case MotionEvent.ACTION_DOWN: { final float y = ev.getY(); - if (!(mIsBeingDragged = inChild((int) ev.getX(), (int) y))) { - return false; - } + mIsBeingDragged = true; /* * If being flinged and user touches, stop the fling. isFinished @@ -516,7 +527,36 @@ public class ScrollView extends FrameLayout { final int deltaY = (int) (mLastMotionY - y); mLastMotionY = y; - scrollBy(0, deltaY); + final int oldX = mScrollX; + final int oldY = mScrollY; + final int range = getScrollRange(); + if (overScrollBy(0, deltaY, 0, mScrollY, 0, range, + 0, mOverscrollDistance, true)) { + // Break our velocity if we hit a scroll barrier. + mVelocityTracker.clear(); + } + onScrollChanged(mScrollX, mScrollY, oldX, oldY); + + final int overscrollMode = getOverScrollMode(); + if (overscrollMode == OVER_SCROLL_ALWAYS || + (overscrollMode == OVER_SCROLL_IF_CONTENT_SCROLLS && range > 0)) { + final int pulledToY = oldY + deltaY; + if (pulledToY < 0) { + mEdgeGlowTop.onPull((float) deltaY / getHeight()); + if (!mEdgeGlowBottom.isFinished()) { + mEdgeGlowBottom.onRelease(); + } + } else if (pulledToY > range) { + mEdgeGlowBottom.onPull((float) deltaY / getHeight()); + if (!mEdgeGlowTop.isFinished()) { + mEdgeGlowTop.onRelease(); + } + } + if (mEdgeGlowTop != null + && (!mEdgeGlowTop.isFinished() || !mEdgeGlowBottom.isFinished())) { + invalidate(); + } + } } break; case MotionEvent.ACTION_UP: @@ -525,8 +565,15 @@ public class ScrollView extends FrameLayout { velocityTracker.computeCurrentVelocity(1000, mMaximumVelocity); int initialVelocity = (int) velocityTracker.getYVelocity(mActivePointerId); - if (getChildCount() > 0 && Math.abs(initialVelocity) > mMinimumVelocity) { - fling(-initialVelocity); + if (getChildCount() > 0) { + if ((Math.abs(initialVelocity) > mMinimumVelocity)) { + fling(-initialVelocity); + } else { + final int bottom = getScrollRange(); + if (mScroller.springBack(mScrollX, mScrollY, 0, 0, 0, bottom)) { + invalidate(); + } + } } mActivePointerId = INVALID_POINTER; @@ -536,16 +583,27 @@ public class ScrollView extends FrameLayout { mVelocityTracker.recycle(); mVelocityTracker = null; } + if (mEdgeGlowTop != null) { + mEdgeGlowTop.onRelease(); + mEdgeGlowBottom.onRelease(); + } } break; case MotionEvent.ACTION_CANCEL: if (mIsBeingDragged && getChildCount() > 0) { + if (mScroller.springBack(mScrollX, mScrollY, 0, 0, 0, getScrollRange())) { + invalidate(); + } mActivePointerId = INVALID_POINTER; mIsBeingDragged = false; if (mVelocityTracker != null) { mVelocityTracker.recycle(); mVelocityTracker = null; } + if (mEdgeGlowTop != null) { + mEdgeGlowTop.onRelease(); + mEdgeGlowBottom.onRelease(); + } } break; case MotionEvent.ACTION_POINTER_UP: @@ -572,6 +630,32 @@ public class ScrollView extends FrameLayout { } } + @Override + protected void onOverScrolled(int scrollX, int scrollY, + boolean clampedX, boolean clampedY) { + // Treat animating scrolls differently; see #computeScroll() for why. + if (!mScroller.isFinished()) { + mScrollX = scrollX; + mScrollY = scrollY; + if (clampedY) { + mScroller.springBack(mScrollX, mScrollY, 0, 0, 0, getScrollRange()); + } + } else { + super.scrollTo(scrollX, scrollY); + } + awakenScrollBars(); + } + + private int getScrollRange() { + int scrollRange = 0; + if (getChildCount() > 0) { + View child = getChildAt(0); + scrollRange = Math.max(0, + child.getHeight() - (getHeight() - mPaddingBottom - mPaddingTop)); + } + return scrollRange; + } + /** *

* Finds the next focusable component that fits in this View's bounds @@ -948,7 +1032,16 @@ public class ScrollView extends FrameLayout { return contentHeight; } - return getChildAt(0).getBottom(); + int scrollRange = getChildAt(0).getBottom(); + final int scrollY = mScrollY; + final int overscrollBottom = Math.max(0, scrollRange - contentHeight); + if (scrollY < 0) { + scrollRange -= scrollY; + } else if (scrollY > overscrollBottom) { + scrollRange += scrollY - overscrollBottom; + } + + return scrollRange; } @Override @@ -1009,14 +1102,20 @@ public class ScrollView extends FrameLayout { int x = mScroller.getCurrX(); int y = mScroller.getCurrY(); - if (getChildCount() > 0) { - View child = getChildAt(0); - x = clamp(x, getWidth() - mPaddingRight - mPaddingLeft, child.getWidth()); - y = clamp(y, getHeight() - mPaddingBottom - mPaddingTop, child.getHeight()); - if (x != oldX || y != oldY) { - mScrollX = x; - mScrollY = y; - onScrollChanged(x, y, oldX, oldY); + if (oldX != x || oldY != y) { + overScrollBy(x - oldX, y - oldY, oldX, oldY, 0, getScrollRange(), + 0, mOverflingDistance, false); + onScrollChanged(mScrollX, mScrollY, oldX, oldY); + + final int range = getScrollRange(); + final int overscrollMode = getOverScrollMode(); + if (overscrollMode == OVER_SCROLL_ALWAYS || + (overscrollMode == OVER_SCROLL_IF_CONTENT_SCROLLS && range > 0)) { + if (y < 0 && oldY >= 0) { + mEdgeGlowTop.onAbsorb((int) mScroller.getCurrVelocity()); + } else if (y > range && oldY <= range) { + mEdgeGlowBottom.onAbsorb((int) mScroller.getCurrVelocity()); + } } } awakenScrollBars(); @@ -1254,7 +1353,7 @@ public class ScrollView extends FrameLayout { int bottom = getChildAt(0).getHeight(); mScroller.fling(mScrollX, mScrollY, 0, velocityY, 0, 0, 0, - Math.max(0, bottom - height)); + Math.max(0, bottom - height), 0, height/2); final boolean movingDown = velocityY > 0; @@ -1292,6 +1391,55 @@ public class ScrollView extends FrameLayout { } } + @Override + public void setOverScrollMode(int mode) { + if (mode != OVER_SCROLL_NEVER) { + if (mEdgeGlowTop == null) { + final Resources res = getContext().getResources(); + final Drawable edge = res.getDrawable(R.drawable.overscroll_edge); + final Drawable glow = res.getDrawable(R.drawable.overscroll_glow); + mEdgeGlowTop = new EdgeGlow(edge, glow); + mEdgeGlowBottom = new EdgeGlow(edge, glow); + } + } else { + mEdgeGlowTop = null; + mEdgeGlowBottom = null; + } + super.setOverScrollMode(mode); + } + + @Override + public void draw(Canvas canvas) { + super.draw(canvas); + if (mEdgeGlowTop != null) { + final int scrollY = mScrollY; + if (!mEdgeGlowTop.isFinished()) { + final int restoreCount = canvas.save(); + final int width = getWidth(); + + canvas.translate(-width / 2, Math.min(0, scrollY)); + mEdgeGlowTop.setSize(width * 2, getHeight()); + if (mEdgeGlowTop.draw(canvas)) { + invalidate(); + } + canvas.restoreToCount(restoreCount); + } + if (!mEdgeGlowBottom.isFinished()) { + final int restoreCount = canvas.save(); + final int width = getWidth(); + final int height = getHeight(); + + canvas.translate(-width / 2, Math.max(getScrollRange(), scrollY) + height); + canvas.rotate(180, width, 0); + mEdgeGlowBottom.setSize(width * 2, height); + if (mEdgeGlowBottom.draw(canvas)) { + invalidate(); + } + canvas.restoreToCount(restoreCount); + } + } + } + private int clamp(int n, int my, int child) { if (my >= child || n < 0) { /* my >= child is this case: diff --git a/core/java/android/widget/Scroller.java b/core/java/android/widget/Scroller.java index b1f50ba04dc61..f00640eb5e45b 100644 --- a/core/java/android/widget/Scroller.java +++ b/core/java/android/widget/Scroller.java @@ -52,14 +52,10 @@ public class Scroller { private float mDurationReciprocal; private float mDeltaX; private float mDeltaY; - private float mViscousFluidScale; - private float mViscousFluidNormalize; private boolean mFinished; private Interpolator mInterpolator; private boolean mFlywheel; - private float mCoeffX = 0.0f; - private float mCoeffY = 1.0f; private float mVelocity; private static final int DEFAULT_DURATION = 250; @@ -94,8 +90,17 @@ public class Scroller { SPLINE[i] = d; } SPLINE[NB_SAMPLES] = 1.0f; + + // This controls the viscous fluid effect (how much of it) + sViscousFluidScale = 8.0f; + // must be set to 1.0 (used in viscousFluid()) + sViscousFluidNormalize = 1.0f; + sViscousFluidNormalize = 1.0f / viscousFluid(1.0f); } + private static float sViscousFluidScale; + private static float sViscousFluidNormalize; + /** * Create a Scroller with the default duration and interpolator. */ @@ -103,6 +108,11 @@ public class Scroller { this(context, null); } + /** + * Create a Scroller with the specified interpolator. If the interpolator is + * null, the default (viscous) interpolator will be used. "Flywheel" behavior will + * be in effect for apps targeting Honeycomb or newer. + */ public Scroller(Context context, Interpolator interpolator) { this(context, interpolator, context.getApplicationInfo().targetSdkVersion >= Build.VERSION_CODES.HONEYCOMB); @@ -110,7 +120,8 @@ public class Scroller { /** * Create a Scroller with the specified interpolator. If the interpolator is - * null, the default (viscous) interpolator will be used. + * null, the default (viscous) interpolator will be used. Specify whether or + * not to support progressive "flywheel" behavior in flinging. */ public Scroller(Context context, Interpolator interpolator, boolean flywheel) { mFinished = true; @@ -332,12 +343,7 @@ public class Scroller { mFinalY = startY + dy; mDeltaX = dx; mDeltaY = dy; - mDurationReciprocal = 1.0f / mDuration; - // This controls the viscous fluid effect (how much of it) - mViscousFluidScale = 8.0f; - // must be set to 1.0 (used in viscousFluid()) - mViscousFluidNormalize = 1.0f; - mViscousFluidNormalize = 1.0f / viscousFluid(1.0f); + mDurationReciprocal = 1.0f / (float) mDuration; } /** @@ -393,8 +399,8 @@ public class Scroller { mStartX = startX; mStartY = startY; - mCoeffX = velocity == 0 ? 1.0f : velocityX / velocity; - mCoeffY = velocity == 0 ? 1.0f : velocityY / velocity; + float coeffX = velocity == 0 ? 1.0f : velocityX / velocity; + float coeffY = velocity == 0 ? 1.0f : velocityY / velocity; int totalDistance = (int) (ALPHA * Math.exp(DECELERATION_RATE / (DECELERATION_RATE - 1.0) * l)); @@ -404,22 +410,20 @@ public class Scroller { mMinY = minY; mMaxY = maxY; - mFinalX = startX + Math.round(totalDistance * mCoeffX); + mFinalX = startX + Math.round(totalDistance * coeffX); // Pin to mMinX <= mFinalX <= mMaxX mFinalX = Math.min(mFinalX, mMaxX); mFinalX = Math.max(mFinalX, mMinX); - mFinalY = startY + Math.round(totalDistance * mCoeffY); + mFinalY = startY + Math.round(totalDistance * coeffY); // Pin to mMinY <= mFinalY <= mMaxY mFinalY = Math.min(mFinalY, mMaxY); mFinalY = Math.max(mFinalY, mMinY); } - - - private float viscousFluid(float x) + static float viscousFluid(float x) { - x *= mViscousFluidScale; + x *= sViscousFluidScale; if (x < 1.0f) { x -= (1.0f - (float)Math.exp(-x)); } else { @@ -427,7 +431,7 @@ public class Scroller { x = 1.0f - (float)Math.exp(1.0f - x); x = start + x * (1.0f - start); } - x *= mViscousFluidNormalize; + x *= sViscousFluidNormalize; return x; } diff --git a/core/res/res/layout/alert_dialog.xml b/core/res/res/layout/alert_dialog.xml index 3982ed9c159bc..e3ba63484f306 100644 --- a/core/res/res/layout/alert_dialog.xml +++ b/core/res/res/layout/alert_dialog.xml @@ -81,7 +81,8 @@ android:paddingTop="2dip" android:paddingBottom="12dip" android:paddingLeft="14dip" - android:paddingRight="10dip"> + android:paddingRight="10dip" + android:overScrollMode="ifContentScrolls"> + android:layout_marginBottom="48dp" + android:overScrollMode="ifContentScrolls"> + android:scrollbars="vertical" + android:overScrollMode="ifContentScrolls" /> diff --git a/core/res/res/values/attrs.xml b/core/res/res/values/attrs.xml index 651bfea4f2921..770adf5a81e02 100755 --- a/core/res/res/values/attrs.xml +++ b/core/res/res/values/attrs.xml @@ -1632,6 +1632,20 @@ public void sayHello(View v) method of your context (typically, your Activity). --> + + + + + + + + + + + + + + diff --git a/core/res/res/values/public.xml b/core/res/res/values/public.xml index f4d1df8ae730c..f2ab5cdce58e7 100644 --- a/core/res/res/values/public.xml +++ b/core/res/res/values/public.xml @@ -1253,6 +1253,9 @@ + + + diff --git a/packages/SystemUI/res/layout/status_bar_expanded.xml b/packages/SystemUI/res/layout/status_bar_expanded.xml index 3ad199e09377f..18e8273614d0a 100644 --- a/packages/SystemUI/res/layout/status_bar_expanded.xml +++ b/packages/SystemUI/res/layout/status_bar_expanded.xml @@ -71,6 +71,7 @@ android:layout_width="match_parent" android:layout_height="match_parent" android:fadingEdge="none" + android:overScrollMode="ifContentScrolls" > Date: Tue, 23 Nov 2010 11:07:30 -0800 Subject: [PATCH 31/90] Update edge and glow rendering to match new specs. Change-Id: Id2ad0ff4fa78617cb79475952e9ce561ee8fec10 --- core/java/android/widget/AbsListView.java | 12 ++++++------ core/java/android/widget/EdgeGlow.java | 18 +++++++++++------- 2 files changed, 17 insertions(+), 13 deletions(-) diff --git a/core/java/android/widget/AbsListView.java b/core/java/android/widget/AbsListView.java index eb8e2de8f92ae..423a788c9d40b 100644 --- a/core/java/android/widget/AbsListView.java +++ b/core/java/android/widget/AbsListView.java @@ -3115,8 +3115,8 @@ public abstract class AbsListView extends AdapterView implements Te final int restoreCount = canvas.save(); final int width = getWidth(); - canvas.translate(-width / 2, Math.min(0, scrollY + mFirstPositionDistanceGuess)); - mEdgeGlowTop.setSize(width * 2, getHeight()); + canvas.translate(0, Math.min(0, scrollY + mFirstPositionDistanceGuess)); + mEdgeGlowTop.setSize(width, getHeight()); if (mEdgeGlowTop.draw(canvas)) { invalidate(); } @@ -3127,10 +3127,10 @@ public abstract class AbsListView extends AdapterView implements Te final int width = getWidth(); final int height = getHeight(); - canvas.translate(-width / 2, - Math.max(height, scrollY + mLastPositionDistanceGuess)); - canvas.rotate(180, width, 0); - mEdgeGlowBottom.setSize(width * 2, height); + canvas.translate(-width, 0); + canvas.rotate(-180, width, 0); + canvas.translate(0, -height); + mEdgeGlowBottom.setSize(width, height); if (mEdgeGlowBottom.draw(canvas)) { invalidate(); } diff --git a/core/java/android/widget/EdgeGlow.java b/core/java/android/widget/EdgeGlow.java index 416be86e59156..9b3a6e646ccd6 100644 --- a/core/java/android/widget/EdgeGlow.java +++ b/core/java/android/widget/EdgeGlow.java @@ -245,19 +245,23 @@ public class EdgeGlow { update(); final int edgeHeight = mEdge.getIntrinsicHeight(); + final int edgeWidth = mEdge.getIntrinsicWidth(); final int glowHeight = mGlow.getIntrinsicHeight(); - - final float distScale = (float) mHeight / mWidth; + final int glowWidth = mGlow.getIntrinsicWidth(); mGlow.setAlpha((int) (Math.max(0, Math.min(mGlowAlpha, 1)) * 255)); - // Width of the image should be 3 * the width of the screen. - // Should start off screen to the left. - mGlow.setBounds(-mWidth, 0, mWidth * 2, (int) Math.min( - glowHeight * mGlowScaleY * distScale * 0.6f, mHeight * MAX_GLOW_HEIGHT)); + + // Center the glow inside the width of the container. + int glowLeft = (mWidth - glowWidth)/2; + mGlow.setBounds(glowLeft, 0, mWidth - glowLeft, (int) Math.min( + glowHeight * mGlowScaleY * glowHeight/ glowWidth * 0.6f, + glowHeight * MAX_GLOW_HEIGHT)); mGlow.draw(canvas); mEdge.setAlpha((int) (Math.max(0, Math.min(mEdgeAlpha, 1)) * 255)); - mEdge.setBounds(0, 0, mWidth, (int) (edgeHeight * mEdgeScaleY)); + + int edgeLeft = (mWidth - edgeWidth)/2; + mEdge.setBounds(edgeLeft, 0, mWidth - edgeLeft, (int) (edgeHeight * mEdgeScaleY)); mEdge.draw(canvas); return mState != STATE_IDLE; From 678b1777b08a6d70471a86005c116182a58a7f94 Mon Sep 17 00:00:00 2001 From: Mindy Pereira Date: Tue, 23 Nov 2010 13:00:58 -0800 Subject: [PATCH 32/90] Create logic for applying padding only to custom preference layouts n the case of any standard PreferenceFragment layout, we can change the list styling to add padding and set clipToPadding to false. In this case, we don't want extra padding in the parent ViewGroup (R.id.prefs). When an app specifies a custom preference fragment layout, we want to add the previously existing padding styles R.id.prefs. Change-Id: Idfd77dcbef264c6f5f4121b66fd54c684ad0a288 --- .../preference/PreferenceFrameLayout.java | 84 +++++++++++++++++++ .../res/layout/preference_list_content.xml | 4 +- .../res/layout/preference_list_fragment.xml | 4 + core/res/res/values/attrs.xml | 9 ++ core/res/res/values/styles.xml | 13 ++- core/res/res/values/themes.xml | 10 ++- 6 files changed, 117 insertions(+), 7 deletions(-) create mode 100644 core/java/android/preference/PreferenceFrameLayout.java diff --git a/core/java/android/preference/PreferenceFrameLayout.java b/core/java/android/preference/PreferenceFrameLayout.java new file mode 100644 index 0000000000000..426abf0222ef7 --- /dev/null +++ b/core/java/android/preference/PreferenceFrameLayout.java @@ -0,0 +1,84 @@ +/* + * Copyright (C) 2010 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package android.preference; + +import android.content.Context; +import android.content.res.TypedArray; +import android.util.AttributeSet; +import android.view.View; +import android.widget.FrameLayout; + +/** + * @hide + */ +public class PreferenceFrameLayout extends FrameLayout { + private static final int DEFAULT_TOP_PADDING = 0; + private static final int DEFAULT_BOTTOM_PADDING = 0; + private final int mTopPadding; + private final int mBottomPadding; + private boolean mPaddingApplied = false; + + public PreferenceFrameLayout(Context context) { + this(context, null); + } + + public PreferenceFrameLayout(Context context, AttributeSet attrs) { + this(context, attrs, com.android.internal.R.attr.preferenceFrameLayoutStyle); + } + + public PreferenceFrameLayout(Context context, AttributeSet attrs, int defStyle) { + super(context, attrs, defStyle); + TypedArray a = context.obtainStyledAttributes(attrs, + com.android.internal.R.styleable.PreferenceFrameLayout, defStyle, 0); + + mTopPadding = (int) a.getDimension( + com.android.internal.R.styleable.PreferenceFrameLayout_topPadding, + DEFAULT_TOP_PADDING); + mBottomPadding = (int) a.getDimension( + com.android.internal.R.styleable.PreferenceFrameLayout_bottomPadding, + DEFAULT_BOTTOM_PADDING); + + a.recycle(); + } + + @Override + public void addView(View child) { + int topPadding = getPaddingTop(); + int bottomPadding = getPaddingBottom(); + // Check on the id of the child before adding it. + if (child != null && child.getId() != com.android.internal.R.id.default_preference_layout) { + // Add the padding to the view group after determining if the padding already exists. + if (!mPaddingApplied) { + topPadding += mTopPadding; + bottomPadding += mBottomPadding; + mPaddingApplied = true; + } + } else { + if (mPaddingApplied) { + topPadding -= mTopPadding; + bottomPadding -= mBottomPadding; + mPaddingApplied = false; + } + } + int previousTop = getPaddingTop(); + int previousBottom = getPaddingBottom(); + if (previousTop != topPadding || previousBottom != bottomPadding) { + setPadding(getPaddingLeft(), topPadding, getPaddingRight(), bottomPadding); + } + super.addView(child); + } +} \ No newline at end of file diff --git a/core/res/res/layout/preference_list_content.xml b/core/res/res/layout/preference_list_content.xml index 6c0e773d69248..0f844180c2be5 100644 --- a/core/res/res/layout/preference_list_content.xml +++ b/core/res/res/layout/preference_list_content.xml @@ -56,7 +56,7 @@ - diff --git a/core/res/res/layout/preference_list_fragment.xml b/core/res/res/layout/preference_list_fragment.xml index c499b8a0a57c9..dbe0df0c49e32 100644 --- a/core/res/res/layout/preference_list_fragment.xml +++ b/core/res/res/layout/preference_list_fragment.xml @@ -18,6 +18,7 @@ --> diff --git a/core/res/res/values/attrs.xml b/core/res/res/values/attrs.xml index 770adf5a81e02..3f81a895b9328 100755 --- a/core/res/res/values/attrs.xml +++ b/core/res/res/values/attrs.xml @@ -610,6 +610,9 @@ + + + @@ -2135,6 +2138,12 @@ + + + + + + diff --git a/core/res/res/values/styles.xml b/core/res/res/values/styles.xml index 4aa16f9325adb..6985de6a57d8a 100644 --- a/core/res/res/values/styles.xml +++ b/core/res/res/values/styles.xml @@ -48,10 +48,15 @@ @android:drawable/popup_bottom_medium @android:drawable/popup_center_medium - + + + + diff --git a/core/res/res/values/themes.xml b/core/res/res/values/themes.xml index 9215bf22c634e..1ef99d0b21391 100644 --- a/core/res/res/values/themes.xml +++ b/core/res/res/values/themes.xml @@ -262,13 +262,16 @@ @android:drawable/search_dropdown_dark + + + @android:style/Widget.PreferenceFrameLayout - + - + + + + diff --git a/services/java/com/android/server/MountService.java b/services/java/com/android/server/MountService.java index d862585b09c50..7440f525c3d42 100644 --- a/services/java/com/android/server/MountService.java +++ b/services/java/com/android/server/MountService.java @@ -19,6 +19,7 @@ package com.android.server; import com.android.internal.app.IMediaContainerService; import com.android.server.am.ActivityManagerService; +import android.Manifest; import android.content.BroadcastReceiver; import android.content.ComponentName; import android.content.Context; @@ -1635,7 +1636,8 @@ class MountService extends IMountService.Stub implements INativeDaemonConnectorC throw new IllegalArgumentException("password cannot be null"); } - // TODO: Enforce a permission + mContext.enforceCallingOrSelfPermission(Manifest.permission.CRYPT_KEEPER, + "no permission to access the crypt keeper"); waitForReady(); @@ -1675,12 +1677,13 @@ class MountService extends IMountService.Stub implements INativeDaemonConnectorC throw new IllegalArgumentException("password cannot be null"); } - // TODO: Enforce a permission + mContext.enforceCallingOrSelfPermission(Manifest.permission.CRYPT_KEEPER, + "no permission to access the crypt keeper"); waitForReady(); if (DEBUG_EVENTS) { - Slog.i(TAG, "decrypting storage..."); + Slog.i(TAG, "encrypting storage..."); } try { From b8f777aaa92df6138ce6e651f5fd874e6f924aae Mon Sep 17 00:00:00 2001 From: Jaikumar Ganesh Date: Thu, 20 Jan 2011 14:49:53 -0800 Subject: [PATCH 67/90] Temporary Changes for certification of SCO. Bug: 3349475 Change-Id: I555b127a1d9218494cd05c07c9e9f29628f3bc74 --- .../android/bluetooth/BluetoothHeadset.java | 20 +++++++++++++++++++ .../android/bluetooth/IBluetoothHeadset.aidl | 2 ++ 2 files changed, 22 insertions(+) diff --git a/core/java/android/bluetooth/BluetoothHeadset.java b/core/java/android/bluetooth/BluetoothHeadset.java index d5b0042010015..2959fc02d57c8 100644 --- a/core/java/android/bluetooth/BluetoothHeadset.java +++ b/core/java/android/bluetooth/BluetoothHeadset.java @@ -670,6 +670,26 @@ public final class BluetoothHeadset implements BluetoothProfile { return false; } + /** + * Send a AT command message to the headset. + * @param device Remote Bluetooth Device + * @param cmd The String to send. + * @hide + */ + public void sendAtCommand(BluetoothDevice device, String command) { + if (DBG) log("sendAtCommand()"); + if (mService != null && isEnabled() && isValidDevice(device)) { + try { + mService.sendAtCommand(device, command); + } catch (RemoteException e) { + Log.e(TAG, e.toString()); + } + } else { + Log.w(TAG, "Proxy not attached to service"); + if (DBG) Log.d(TAG, Log.getStackTraceString(new Throwable())); + } + } + private ServiceConnection mConnection = new ServiceConnection() { public void onServiceConnected(ComponentName className, IBinder service) { if (DBG) Log.d(TAG, "Proxy object connected"); diff --git a/core/java/android/bluetooth/IBluetoothHeadset.aidl b/core/java/android/bluetooth/IBluetoothHeadset.aidl index e9521939ef85f..3c6cf7711333d 100644 --- a/core/java/android/bluetooth/IBluetoothHeadset.aidl +++ b/core/java/android/bluetooth/IBluetoothHeadset.aidl @@ -50,4 +50,6 @@ interface IBluetoothHeadset { boolean startVirtualVoiceCall(in BluetoothDevice device); boolean stopVirtualVoiceCall(in BluetoothDevice device); + + void sendAtCommand(in BluetoothDevice device, String urc); } From af69b3573ebfeca81be1b13fc377f30b545bf0b0 Mon Sep 17 00:00:00 2001 From: Jeff Brown Date: Mon, 24 Jan 2011 15:21:56 -0800 Subject: [PATCH 68/90] Fix regression setting input windows. Change-Id: I24d58a02f69ae40f03b133d487354a883585e93e --- .../android/server/WindowManagerService.java | 58 +++++++++---------- 1 file changed, 26 insertions(+), 32 deletions(-) diff --git a/services/java/com/android/server/WindowManagerService.java b/services/java/com/android/server/WindowManagerService.java index eeb224c75964b..2c8403c82751d 100644 --- a/services/java/com/android/server/WindowManagerService.java +++ b/services/java/com/android/server/WindowManagerService.java @@ -677,8 +677,7 @@ public class WindowManagerService extends IWindowManager.Stub // stop intercepting input mDragState.unregister(); - mInputMonitor.setUpdateInputWindowsNeededLw(); - mInputMonitor.updateInputWindowsLw(); + mInputMonitor.updateInputWindowsLw(true /*force*/); // free our resources and drop all the object references mDragState.reset(); @@ -2382,6 +2381,8 @@ public class WindowManagerService extends IWindowManager.Stub res |= WindowManagerImpl.ADD_FLAG_APP_VISIBLE; } + mInputMonitor.setUpdateInputWindowsNeededLw(); + boolean focusChanged = false; if (win.canReceiveKeys()) { focusChanged = updateFocusedWindowLocked(UPDATE_FOCUS_WILL_ASSIGN_LAYERS, @@ -2404,7 +2405,7 @@ public class WindowManagerService extends IWindowManager.Stub if (focusChanged) { finishUpdateFocusedWindowAfterAssignLayersLocked(false /*updateInputWindows*/); } - mInputMonitor.updateInputWindowsLw(); + mInputMonitor.updateInputWindowsLw(false /*force*/); if (localLOGV) Slog.v( TAG, "New client " + client.asBinder() @@ -2484,7 +2485,7 @@ public class WindowManagerService extends IWindowManager.Stub updateFocusedWindowLocked(UPDATE_FOCUS_WILL_PLACE_SURFACES, false /*updateInputWindows*/); performLayoutAndPlaceSurfacesLocked(); - mInputMonitor.updateInputWindowsLw(); + mInputMonitor.updateInputWindowsLw(false /*force*/); if (win.mAppToken != null) { win.mAppToken.updateReportedVisibilityLocked(); } @@ -2600,8 +2601,7 @@ public class WindowManagerService extends IWindowManager.Stub } } - mInputMonitor.setUpdateInputWindowsNeededLw(); - mInputMonitor.updateInputWindowsLw(); + mInputMonitor.updateInputWindowsLw(true /*force*/); } private static void logSurface(WindowState w, String msg, RuntimeException where) { @@ -2851,8 +2851,7 @@ public class WindowManagerService extends IWindowManager.Stub outSurface.release(); } } catch (Exception e) { - mInputMonitor.setUpdateInputWindowsNeededLw(); - mInputMonitor.updateInputWindowsLw(); + mInputMonitor.updateInputWindowsLw(true /*force*/); Slog.w(TAG, "Exception thrown when creating surface for client " + client + " (" + win.mAttrs.getTitle() + ")", @@ -2996,8 +2995,7 @@ public class WindowManagerService extends IWindowManager.Stub inTouchMode = mInTouchMode; - mInputMonitor.setUpdateInputWindowsNeededLw(); - mInputMonitor.updateInputWindowsLw(); + mInputMonitor.updateInputWindowsLw(true /*force*/); } if (configChanged) { @@ -3380,8 +3378,7 @@ public class WindowManagerService extends IWindowManager.Stub } } - mInputMonitor.setUpdateInputWindowsNeededLw(); - mInputMonitor.updateInputWindowsLw(); + mInputMonitor.updateInputWindowsLw(true /*force*/); } else { Slog.w(TAG, "Attempted to remove non-existing token: " + token); } @@ -4042,7 +4039,7 @@ public class WindowManagerService extends IWindowManager.Stub false /*updateInputWindows*/); performLayoutAndPlaceSurfacesLocked(); } - mInputMonitor.updateInputWindowsLw(); + mInputMonitor.updateInputWindowsLw(false /*force*/); } } @@ -4479,8 +4476,9 @@ public class WindowManagerService extends IWindowManager.Stub updateFocusedWindowLocked(UPDATE_FOCUS_WILL_PLACE_SURFACES, false /*updateInputWindows*/); mLayoutNeeded = true; + mInputMonitor.setUpdateInputWindowsNeededLw(); performLayoutAndPlaceSurfacesLocked(); - mInputMonitor.updateInputWindowsLw(); + mInputMonitor.updateInputWindowsLw(false /*force*/); } Binder.restoreCallingIdentity(origId); } @@ -4517,13 +4515,14 @@ public class WindowManagerService extends IWindowManager.Stub pos = reAddAppWindowsLocked(pos, wtoken); if (updateFocusAndLayout) { + mInputMonitor.setUpdateInputWindowsNeededLw(); if (!updateFocusedWindowLocked(UPDATE_FOCUS_WILL_PLACE_SURFACES, false /*updateInputWindows*/)) { assignLayersLocked(); } mLayoutNeeded = true; performLayoutAndPlaceSurfacesLocked(); - mInputMonitor.updateInputWindowsLw(); + mInputMonitor.updateInputWindowsLw(false /*force*/); } } @@ -4549,13 +4548,14 @@ public class WindowManagerService extends IWindowManager.Stub } } + mInputMonitor.setUpdateInputWindowsNeededLw(); if (!updateFocusedWindowLocked(UPDATE_FOCUS_WILL_PLACE_SURFACES, false /*updateInputWindows*/)) { assignLayersLocked(); } mLayoutNeeded = true; performLayoutAndPlaceSurfacesLocked(); - mInputMonitor.updateInputWindowsLw(); + mInputMonitor.updateInputWindowsLw(false /*force*/); //dump(); } @@ -5909,8 +5909,8 @@ public class WindowManagerService extends IWindowManager.Stub } /* Updates the cached window information provided to the input dispatcher. */ - public void updateInputWindowsLw() { - if (!mUpdateInputWindowsNeeded) { + public void updateInputWindowsLw(boolean force) { + if (!force && !mUpdateInputWindowsNeeded) { return; } mUpdateInputWindowsNeeded = false; @@ -6060,7 +6060,7 @@ public class WindowManagerService extends IWindowManager.Stub setUpdateInputWindowsNeededLw(); if (updateInputWindows) { - updateInputWindowsLw(); + updateInputWindowsLw(false /*force*/); } } } @@ -6088,8 +6088,7 @@ public class WindowManagerService extends IWindowManager.Stub } window.paused = true; - setUpdateInputWindowsNeededLw(); - updateInputWindowsLw(); + updateInputWindowsLw(true /*force*/); } } @@ -6100,8 +6099,7 @@ public class WindowManagerService extends IWindowManager.Stub } window.paused = false; - setUpdateInputWindowsNeededLw(); - updateInputWindowsLw(); + updateInputWindowsLw(true /*force*/); } } @@ -6577,15 +6575,13 @@ public class WindowManagerService extends IWindowManager.Stub // the actual drag event dispatch stuff in the dragstate mDragState.register(); - mInputMonitor.setUpdateInputWindowsNeededLw(); - mInputMonitor.updateInputWindowsLw(); + mInputMonitor.updateInputWindowsLw(true /*force*/); if (!mInputManager.transferTouchFocus(callingWin.mInputChannel, mDragState.mServerChannel)) { Slog.e(TAG, "Unable to transfer touch focus"); mDragState.unregister(); mDragState = null; - mInputMonitor.setUpdateInputWindowsNeededLw(); - mInputMonitor.updateInputWindowsLw(); + mInputMonitor.updateInputWindowsLw(true /*force*/); return false; } @@ -9183,8 +9179,7 @@ public class WindowManagerService extends IWindowManager.Stub // !!! TODO: ANR the app that has failed to start the drag in time if (mDragState != null) { mDragState.unregister(); - mInputMonitor.setUpdateInputWindowsNeededLw(); - mInputMonitor.updateInputWindowsLw(); + mInputMonitor.updateInputWindowsLw(true /*force*/); mDragState.reset(); mDragState = null; } @@ -9584,7 +9579,7 @@ public class WindowManagerService extends IWindowManager.Stub // Window frames may have changed. Tell the input dispatcher about it. mInputMonitor.setUpdateInputWindowsNeededLw(); if (updateInputWindows) { - mInputMonitor.updateInputWindowsLw(); + mInputMonitor.updateInputWindowsLw(false /*force*/); } return mPolicy.finishLayoutLw(); @@ -10858,8 +10853,7 @@ public class WindowManagerService extends IWindowManager.Stub } // Finally update all input windows now that the window changes have stabilized. - mInputMonitor.setUpdateInputWindowsNeededLw(); - mInputMonitor.updateInputWindowsLw(); + mInputMonitor.updateInputWindowsLw(true /*force*/); setHoldScreenLocked(holdScreen != null); if (screenBrightness < 0 || screenBrightness > 1.0f) { From 59266380319c0ffdccaeecd3611e45290670efd1 Mon Sep 17 00:00:00 2001 From: Romain Guy Date: Tue, 25 Jan 2011 12:52:58 -0800 Subject: [PATCH 69/90] Prevent crash in View when gathering attributes without an AttachInfo. Bug #3385339 Change-Id: I06b6f03721b52ab0b9d13c2fb3e133ae25d99970 --- core/java/android/view/ViewRoot.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/java/android/view/ViewRoot.java b/core/java/android/view/ViewRoot.java index 19d78111c1bf8..68b6a8a87a7d2 100644 --- a/core/java/android/view/ViewRoot.java +++ b/core/java/android/view/ViewRoot.java @@ -893,7 +893,7 @@ public final class ViewRoot extends Handler implements ViewParent, } } - if (attachInfo.mRecomputeGlobalAttributes) { + if (attachInfo.mRecomputeGlobalAttributes && host.mAttachInfo != null) { //Log.i(TAG, "Computing view hierarchy attributes!"); attachInfo.mRecomputeGlobalAttributes = false; boolean oldScreenOn = attachInfo.mKeepScreenOn; From 34a3a507866f837e9685dc031689c1de15623fb8 Mon Sep 17 00:00:00 2001 From: Gilles Debunne Date: Tue, 25 Jan 2011 13:07:22 -0800 Subject: [PATCH 70/90] Fix for a call to startActivity from outside of an app. Bug 3246715 Regression introduced by https://android-git.corp.google.com/g/#change,86174 Change-Id: Icba170746d196386bd9b0309582f724cb076d937 --- core/java/android/text/method/LinkMovementMethod.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/core/java/android/text/method/LinkMovementMethod.java b/core/java/android/text/method/LinkMovementMethod.java index 9e73371fbbe5a..aff233df16a39 100644 --- a/core/java/android/text/method/LinkMovementMethod.java +++ b/core/java/android/text/method/LinkMovementMethod.java @@ -42,9 +42,9 @@ public class LinkMovementMethod extends ScrollingMovementMethod { case KeyEvent.KEYCODE_DPAD_CENTER: case KeyEvent.KEYCODE_ENTER: if (KeyEvent.metaStateHasNoModifiers(movementMetaState)) { - if (event.getAction() == KeyEvent.ACTION_DOWN - && event.getRepeatCount() == 0) { - return action(CLICK, widget, buffer); + if (event.getAction() == KeyEvent.ACTION_DOWN && + event.getRepeatCount() == 0 && action(CLICK, widget, buffer)) { + return true; } } break; From b1af975b75f0f3309e29e5c15685cde944f80e65 Mon Sep 17 00:00:00 2001 From: Daniel Sandler Date: Wed, 26 Jan 2011 11:45:36 -0500 Subject: [PATCH 71/90] Wrong clock font in system bar. Whoops. Bug: 3385564 Change-Id: I7231e9f7494bce436e93aed9793770cff40841a4 --- data/fonts/fonts.mk | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/data/fonts/fonts.mk b/data/fonts/fonts.mk index faecfee4bc5fc..692ce3425d1e2 100644 --- a/data/fonts/fonts.mk +++ b/data/fonts/fonts.mk @@ -29,4 +29,4 @@ PRODUCT_COPY_FILES := \ frameworks/base/data/fonts/DroidSansFallback.ttf:system/fonts/DroidSansFallback.ttf \ frameworks/base/data/fonts/AndroidClock.ttf:system/fonts/AndroidClock.ttf \ frameworks/base/data/fonts/AndroidClock_Highlight.ttf:system/fonts/AndroidClock_Highlight.ttf \ - frameworks/base/data/fonts/AndroidClock_Highlight.ttf:system/fonts/AndroidClock_Solid.ttf + frameworks/base/data/fonts/AndroidClock_Solid.ttf:system/fonts/AndroidClock_Solid.ttf From 79b795327c28f5ed8b35bdb391b86ed8270b1a1c Mon Sep 17 00:00:00 2001 From: Jeff Brown Date: Wed, 26 Jan 2011 10:40:10 -0800 Subject: [PATCH 72/90] Fix emulator touchscreen. Bug: 3393763 Change-Id: Ief16640344d61d283aac08ef4b53e85d7ee3c73f --- data/keyboards/qwerty.idc | 3 +++ data/keyboards/qwerty2.idc | 3 +++ 2 files changed, 6 insertions(+) diff --git a/data/keyboards/qwerty.idc b/data/keyboards/qwerty.idc index 4cf0b84625b26..375d78576548e 100644 --- a/data/keyboards/qwerty.idc +++ b/data/keyboards/qwerty.idc @@ -16,6 +16,9 @@ # Emulator keyboard configuration file #1. # +touch.deviceType = touchScreen +touch.orientationAware = 1 + keyboard.layout = qwerty keyboard.characterMap = qwerty keyboard.orientationAware = 1 diff --git a/data/keyboards/qwerty2.idc b/data/keyboards/qwerty2.idc index 2e5a9381d6681..369205ea3f983 100644 --- a/data/keyboards/qwerty2.idc +++ b/data/keyboards/qwerty2.idc @@ -16,6 +16,9 @@ # Emulator keyboard configuration file #2. # +touch.deviceType = touchScreen +touch.orientationAware = 1 + keyboard.layout = qwerty keyboard.characterMap = qwerty2 keyboard.orientationAware = 1 From 4e87ee742f7a68f18616f5c19a6a6674e1d085c5 Mon Sep 17 00:00:00 2001 From: Romain Guy Date: Wed, 26 Jan 2011 10:54:43 -0800 Subject: [PATCH 73/90] Fix NPE in YouTube. Bug #3385339 Change-Id: Id7b307994e343cdb808161a7fae590536f04252e --- core/java/android/view/View.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/java/android/view/View.java b/core/java/android/view/View.java index 65d2e11ae0e67..164aec623f8b2 100644 --- a/core/java/android/view/View.java +++ b/core/java/android/view/View.java @@ -4750,7 +4750,7 @@ public class View implements Drawable.Callback, KeyEvent.Callback, Accessibility } void performCollectViewAttributes(int visibility) { - if ((visibility & VISIBILITY_MASK) == VISIBLE) { + if ((visibility & VISIBILITY_MASK) == VISIBLE && mAttachInfo != null) { if ((mViewFlags & KEEP_SCREEN_ON) == KEEP_SCREEN_ON) { mAttachInfo.mKeepScreenOn = true; } From 808198929926c24706e682aec6c312d029b94528 Mon Sep 17 00:00:00 2001 From: Wink Saville Date: Wed, 26 Jan 2011 09:21:32 -0800 Subject: [PATCH 74/90] Increase the default timeout from 30 to 60 seconds. The DEFAULT_WAKE_LOCK_TIMEOUT should be longer than the timeouts of the vendor ril, aka. rild. We are seeing timeouts which are 30secs and possibly longer. An alternative would be to add TelephonyManager.PROPERTY_WAKE_LOCK_TIMEOUT for but I feel a 60 second default is appropriate for all platforms. Bug: 3392618 Change-Id: I63f6b211b584857999174524d4ea4efa1994dfba --- telephony/java/com/android/internal/telephony/RIL.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/telephony/java/com/android/internal/telephony/RIL.java b/telephony/java/com/android/internal/telephony/RIL.java index 7506bb1642ab6..39bbd63da94b7 100644 --- a/telephony/java/com/android/internal/telephony/RIL.java +++ b/telephony/java/com/android/internal/telephony/RIL.java @@ -214,7 +214,7 @@ public final class RIL extends BaseCommands implements CommandsInterface { * Wake lock timeout should be longer than the longest timeout in * the vendor ril. */ - private static final int DEFAULT_WAKE_LOCK_TIMEOUT = 30000; + private static final int DEFAULT_WAKE_LOCK_TIMEOUT = 60000; //***** Instance Variables From 6067ca2f8d9cb76fda970b0e08523200d87c5499 Mon Sep 17 00:00:00 2001 From: Wink Saville Date: Wed, 26 Jan 2011 15:43:49 -0800 Subject: [PATCH 75/90] Comment out the isAvailable optimization. As the comment says this causes problems if the connection is handling errors. This removes the optimization for now. Bug: 3386481 Change-Id: I6cb00abe8b1949e9b79b4906a6bdab5872b5054d --- .../java/com/android/server/ConnectivityService.java | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/services/java/com/android/server/ConnectivityService.java b/services/java/com/android/server/ConnectivityService.java index bd3c554a5be52..e689654110b66 100644 --- a/services/java/com/android/server/ConnectivityService.java +++ b/services/java/com/android/server/ConnectivityService.java @@ -1152,7 +1152,17 @@ public class ConnectivityService extends IConnectivityManager.Stub { if (checkType == prevNetType) continue; if (mNetAttributes[checkType] == null) continue; if (!mNetAttributes[checkType].isDefault()) continue; - if (!mNetTrackers[checkType].isAvailable()) continue; + +// Enabling the isAvailable() optimization caused mobile to not get +// selected if it was in the middle of error handling. Specifically +// a moble connection that took 30 seconds to complete the DEACTIVATE_DATA_CALL +// would not be available and we wouldn't get connected to anything. +// So removing the isAvailable() optimization below for now. TODO: This +// optimization should work and we need to investigate why it doesn't work. +// This could be related to how DEACTIVATE_DATA_CALL is reporting its +// complete before it is really complete. +// if (!mNetTrackers[checkType].isAvailable()) continue; + // if (currentPriority >= mNetAttributes[checkType].mPriority) continue; NetworkStateTracker checkTracker = mNetTrackers[checkType]; From 366fec6c0812723f384dffbeb59a6de6b87f800b Mon Sep 17 00:00:00 2001 From: Gil Dobjanschi Date: Thu, 27 Jan 2011 09:51:46 -0800 Subject: [PATCH 76/90] Bug fix: 3398192 NPE at android.media.videoeditor.VideoEditorImpl.clearSurface Change-Id: Ib7cb994e995d934cf896b856da462c9240fcb5f0 --- .../media/videoeditor/VideoEditorImpl.java | 43 +++++++++---------- 1 file changed, 21 insertions(+), 22 deletions(-) diff --git a/media/java/android/media/videoeditor/VideoEditorImpl.java b/media/java/android/media/videoeditor/VideoEditorImpl.java index a590eecd357de..54b3837f68966 100755 --- a/media/java/android/media/videoeditor/VideoEditorImpl.java +++ b/media/java/android/media/videoeditor/VideoEditorImpl.java @@ -424,7 +424,7 @@ public class VideoEditorImpl implements VideoEditor { mMediaItems, mTransitions, mAudioTracks, listener); } catch (InterruptedException ex) { - Log.e("VideoEditorImpl", "Sem acquire NOT successful in export"); + Log.e(TAG, "Sem acquire NOT successful in export"); } finally { mExportSemaphore.release(); } @@ -444,7 +444,7 @@ public class VideoEditorImpl implements VideoEditor { mAudioTracks, listener); } } catch (InterruptedException ex) { - Log.e("VideoEditorImpl", "Sem acquire NOT successful in previewStoryBoard"); + Log.e(TAG, "Sem acquire NOT successful in previewStoryBoard"); } finally { if (semAcquireDone) { mPreviewSemaphore.release(); @@ -891,7 +891,7 @@ public class VideoEditorImpl implements VideoEditor { } } catch (InterruptedException ex) { - Log.e("VideoEditorImpl", "Sem acquire NOT successful in renderPreviewFrame"); + Log.e(TAG, "Sem acquire NOT successful in renderPreviewFrame"); } finally { if (semAcquireDone) { @@ -1567,16 +1567,14 @@ public class VideoEditorImpl implements VideoEditor { mPreviewSemaphore.acquire(); semAcquireDone = true; } catch (InterruptedException ex) { - Log.e("VideoEditorImpl", "Sem acquire NOT successful in startPreview"); + Log.e(TAG, "Sem acquire NOT successful in startPreview"); } if (semAcquireDone) { Surface mSurface = surfaceHolder.getSurface(); if (mSurface == null) { - Log.e("VideoEditoeImpl", - "Surface could not be retrieved from surface holder"); throw new - RuntimeException(); + throw new RuntimeException("Surface could not be retrieved from surface holder"); } if (mMediaItems.size() > 0) { @@ -1588,15 +1586,15 @@ public class VideoEditorImpl implements VideoEditor { mPreviewInProgress = true; } catch (IllegalArgumentException ex) { mPreviewSemaphore.release(); - Log.e("VideoEditorImpl", "Illegal Argument exception in do preview"); + Log.e(TAG, "Illegal Argument exception in do preview"); throw ex; } catch (IllegalStateException ex) { mPreviewSemaphore.release(); - Log.e("VideoEditorImpl", "Illegal State exception in do preview"); + Log.e(TAG, "Illegal State exception in do preview"); throw ex; } catch (RuntimeException ex) { mPreviewSemaphore.release(); - Log.e("VideoEditorImpl", "Runtime exception in do preview"); + Log.e(TAG, "Runtime exception in do preview"); throw ex; } } @@ -1732,7 +1730,7 @@ public class VideoEditorImpl implements VideoEditor { if (mMediaItems.size() > 0) { MediaItem mI = mMediaItems.get(0); /* - * Lets initialise the width for default aspect ratio i.e 16:9 + * Lets initialiZe the width for default aspect ratio i.e 16:9 */ int height = 480; int width = 854; @@ -1784,18 +1782,19 @@ public class VideoEditorImpl implements VideoEditor { * and needs to be cleared. */ public void clearSurface(SurfaceHolder surfaceHolder) { + if (surfaceHolder == null) { + throw new IllegalArgumentException("Invalid surface holder"); + } - if (surfaceHolder == null) { - throw new IllegalArgumentException(); - } - Surface surface = surfaceHolder.getSurface(); + final Surface surface = surfaceHolder.getSurface(); + if (surface == null) { + throw new RuntimeException("Surface could not be retrieved from surface holder"); + } - if (surface == null) { - Log.e("VideoEditorImpl", - "Surface could not be retrieved from surface holder"); - throw new RuntimeException(); - } - mMANativeHelper.clearPreviewSurface(surface); + if (mMANativeHelper != null) { + mMANativeHelper.clearPreviewSurface(surface); + } else { + Log.w(TAG, "Native helper was not ready!"); + } } - } From 8084d33ace55e53afaf8a272214c3c4a31cc804f Mon Sep 17 00:00:00 2001 From: Chet Haase Date: Thu, 27 Jan 2011 10:30:25 -0800 Subject: [PATCH 77/90] Fix NPE with display lists when view not attached There was logic in ViewGroup that assumed that an accelerated view must always be able to get a display list for any child that it was drawing. One situation occurred, however, that caused a problem with this - a contacts activity was started and not yet attached, but was being asked to render into an accelerated canvas. We assumed that the child would have a display list and simply called getDisplayList(). But since that call returned null, we later deref'd the null object. The fix is to check whether a child can have a display list instead of assuming that it can just because the container view is accelerated. Change-Id: I7de62fd597ad50720c9585d621bec02e77c171df --- core/java/android/view/View.java | 17 ++++++++++++++++- core/java/android/view/ViewGroup.java | 2 +- 2 files changed, 17 insertions(+), 2 deletions(-) diff --git a/core/java/android/view/View.java b/core/java/android/view/View.java index c64f5648e5414..5e8f31aceef98 100644 --- a/core/java/android/view/View.java +++ b/core/java/android/view/View.java @@ -8227,6 +8227,21 @@ public class View implements Drawable.Callback, KeyEvent.Callback, Accessibility * @hide */ protected void dispatchGetDisplayList() {} + + /** + * A view that is not attached or hardware accelerated cannot create a display list. + * This method checks these conditions and returns the appropriate result. + * + * @return true if view has the ability to create a display list, false otherwise. + * + * @hide + */ + public boolean canHaveDisplayList() { + if (mAttachInfo == null || mAttachInfo.mHardwareRenderer == null) { + return false; + } + return true; + } /** *

Returns a display list that can be used to draw this view again @@ -8237,7 +8252,7 @@ public class View implements Drawable.Callback, KeyEvent.Callback, Accessibility * @hide */ public DisplayList getDisplayList() { - if (mAttachInfo == null || mAttachInfo.mHardwareRenderer == null) { + if (!canHaveDisplayList()) { return null; } diff --git a/core/java/android/view/ViewGroup.java b/core/java/android/view/ViewGroup.java index 1313b78150953..d0509b20134ae 100644 --- a/core/java/android/view/ViewGroup.java +++ b/core/java/android/view/ViewGroup.java @@ -2381,7 +2381,7 @@ public abstract class ViewGroup extends View implements ViewParent, ViewManager } else if (layerType == LAYER_TYPE_NONE) { // Delay getting the display list until animation-driven alpha values are // set up and possibly passed on to the view - hasDisplayList = true; + hasDisplayList = child.canHaveDisplayList(); } } } From 6468ab068dfc66ccf117f2a27c9ff4c9be4a1536 Mon Sep 17 00:00:00 2001 From: Daniel Sandler Date: Wed, 26 Jan 2011 21:19:10 -0500 Subject: [PATCH 78/90] Correct the translationY of the empty notification panel. This also restores the proper slide-in animation. Yay! Bug: 3391683 Change-Id: Id38b4bdf2bad88084db47b3fa4ef7d1d81f94aff --- .../statusbar/tablet/NotificationPanel.java | 61 ++++++++++++++----- 1 file changed, 45 insertions(+), 16 deletions(-) diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/tablet/NotificationPanel.java b/packages/SystemUI/src/com/android/systemui/statusbar/tablet/NotificationPanel.java index 1004e18ee0647..372aa90410eb6 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/tablet/NotificationPanel.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/tablet/NotificationPanel.java @@ -60,6 +60,9 @@ public class NotificationPanel extends RelativeLayout implements StatusBarPanel, View mSettingsView; ViewGroup mContentParent; + // amount to slide mContentParent down by when mContentFrame is missing + float mContentFrameMissingTranslation; + Choreographer mChoreo = new Choreographer(); public NotificationPanel(Context context, AttributeSet attrs) { @@ -87,11 +90,17 @@ public class NotificationPanel extends RelativeLayout implements StatusBarPanel, mNotificationScroller = findViewById(R.id.notification_scroller); mContentFrame = (ViewGroup)findViewById(R.id.content_frame); + mContentFrameMissingTranslation = + mContentFrame.getBackground().getMinimumHeight() + 10; + + mShowing = false; + + setContentFrameVisible(mNotificationCount > 0, false); } public void show(boolean show, boolean animate) { if (show && !mShowing) { - setContentFrameVisible(mNotificationCount > 0, false); + setContentFrameVisible(mSettingsView != null || mNotificationCount > 0, false); } if (animate) { @@ -120,7 +129,7 @@ public class NotificationPanel extends RelativeLayout implements StatusBarPanel, public void onVisibilityChanged(View v, int vis) { super.onVisibilityChanged(v, vis); // when we hide, put back the notifications - if (!isShown()) { + if (vis != View.VISIBLE) { if (mSettingsView != null) removeSettingsView(); mNotificationScroller.setVisibility(View.VISIBLE); mNotificationScroller.setAlpha(1f); @@ -161,10 +170,8 @@ public class NotificationPanel extends RelativeLayout implements StatusBarPanel, setContentFrameVisible(n > 0, false); } else if (mSettingsView == null) { // we're looking at the notifications; time to maybe make some changes - if (mNotificationCount == 0 && n > 0) { - setContentFrameVisible(true, true); - } else if (mNotificationCount > 0 && n == 0) { - setContentFrameVisible(false, true); + if (mNotificationCount != n) { + setContentFrameVisible(n > 0, true); } } mNotificationCount = n; @@ -173,22 +180,35 @@ public class NotificationPanel extends RelativeLayout implements StatusBarPanel, public void setContentFrameVisible(final boolean showing, boolean animate) { if (!animate) { mContentFrame.setVisibility(showing ? View.VISIBLE : View.GONE); - mContentParent.setTranslationY(showing ? 0f : 100f); + mContentFrame.setAlpha(1f); + // the translation will be patched up when the window is slid into place return; } - mContentFrame.setVisibility(showing ? View.VISIBLE : View.GONE); + if (showing) { + mContentFrame.setVisibility(View.VISIBLE); + } AnimatorSet set = new AnimatorSet(); - float adjust = mContentFrame.getBackground().getMinimumHeight() + 8; // fudge factor set.play(ObjectAnimator.ofFloat( mContentFrame, "alpha", showing ? 0f : 1f, showing ? 1f : 0f)) .with(ObjectAnimator.ofFloat( mContentParent, "translationY", - showing ? adjust : 0f, - showing ? 0f : adjust)); + showing ? mContentFrameMissingTranslation : 0f, + showing ? 0f : mContentFrameMissingTranslation)) + ; + set.setDuration(200); + if (!showing) { + set.addListener(new AnimatorListenerAdapter() { + @Override + public void onAnimationEnd(Animator _a) { + mContentFrame.setVisibility(View.GONE); + mContentFrame.setAlpha(1f); + } + }); + } set.start(); } @@ -238,10 +258,15 @@ public class NotificationPanel extends RelativeLayout implements StatusBarPanel, } public boolean isInContentArea(int x, int y) { - mContentArea.left = mContentFrame.getLeft() + mContentFrame.getPaddingLeft(); - mContentArea.top = mTitleArea.getTop() + mTitleArea.getPaddingTop(); - mContentArea.right = mContentFrame.getRight() - mContentFrame.getPaddingRight(); - mContentArea.bottom = mContentFrame.getBottom() - mContentFrame.getPaddingBottom(); + mContentArea.left = mTitleArea.getLeft() + mTitleArea.getPaddingLeft(); + mContentArea.top = mTitleArea.getTop() + mTitleArea.getPaddingTop() + + (int)mContentParent.getTranslationY(); // account for any adjustment + mContentArea.right = mTitleArea.getRight() - mTitleArea.getPaddingRight(); + + View theBottom = (mContentFrame.getVisibility() == View.VISIBLE) + ? mContentFrame : mTitleArea; + mContentArea.bottom = theBottom.getBottom() - theBottom.getPaddingBottom(); + offsetDescendantRectToMyCoords(mContentParent, mContentArea); return mContentArea.contains(x, y); } @@ -291,12 +316,16 @@ public class NotificationPanel extends RelativeLayout implements StatusBarPanel, if (appearing) { // we want to go from near-the-top to the top, unless we're half-open in the right // general vicinity - start = (y < HYPERSPACE_OFFRAMP) ? y : HYPERSPACE_OFFRAMP; end = 0; + if (mNotificationCount == 0) { + end += mContentFrameMissingTranslation; + } + start = (y < (HYPERSPACE_OFFRAMP+end)) ? y : (HYPERSPACE_OFFRAMP+end); } else { start = y; end = y + HYPERSPACE_OFFRAMP; } + Animator posAnim = ObjectAnimator.ofFloat(mContentParent, "translationY", start, end); posAnim.setInterpolator(appearing From f68ea0b8409512dd4ae7b2d3c1ccd3fe95880d17 Mon Sep 17 00:00:00 2001 From: Derek Sollenberger Date: Thu, 27 Jan 2011 17:33:14 -0500 Subject: [PATCH 79/90] Add Plugin API for controling the device power states This is an initial API that will allow the plugin to request to keep the screen on. companion change is in external/webkit bug: 3331493 Change-Id: Ic18787e7ecd705a5b2e31a34ea884fd39ad9d11a --- core/java/android/webkit/WebView.java | 8 +++++++- core/java/android/webkit/WebViewCore.java | 9 +++++++++ 2 files changed, 16 insertions(+), 1 deletion(-) diff --git a/core/java/android/webkit/WebView.java b/core/java/android/webkit/WebView.java index 2a2b3af05a3f8..63632996bc992 100644 --- a/core/java/android/webkit/WebView.java +++ b/core/java/android/webkit/WebView.java @@ -673,6 +673,7 @@ public class WebView extends AbsoluteLayout static final int AUTOFILL_COMPLETE = 134; static final int SELECT_AT = 135; + static final int SCREEN_ON = 136; private static final int FIRST_PACKAGE_MSG_ID = SCROLL_TO_MSG_ID; private static final int LAST_PACKAGE_MSG_ID = SET_TOUCH_HIGHLIGHT_RECTS; @@ -726,7 +727,8 @@ public class WebView extends AbsoluteLayout "SAVE_WEBARCHIVE_FINISHED", // = 132; "SET_AUTOFILLABLE", // = 133; "AUTOFILL_COMPLETE", // = 134; - "SELECT_AT" // = 135; + "SELECT_AT", // = 135; + "SCREEN_ON" // = 136; }; // If the site doesn't use the viewport meta tag to specify the viewport, @@ -7454,6 +7456,10 @@ public class WebView extends AbsoluteLayout doMotionUp(msg.arg1, msg.arg2); break; + case SCREEN_ON: + setKeepScreenOn(msg.arg1 == 1); + break; + case SHOW_FULLSCREEN: { View view = (View) msg.obj; int npp = msg.arg1; diff --git a/core/java/android/webkit/WebViewCore.java b/core/java/android/webkit/WebViewCore.java index 27bf51c9442f1..3bde0002e3aaa 100644 --- a/core/java/android/webkit/WebViewCore.java +++ b/core/java/android/webkit/WebViewCore.java @@ -2548,6 +2548,15 @@ final class WebViewCore { return mContext; } + // called by JNI + private void keepScreenOn(boolean screenOn) { + if (mWebView != null) { + Message message = mWebView.mPrivateHandler.obtainMessage(WebView.SCREEN_ON); + message.arg1 = screenOn ? 1 : 0; + message.sendToTarget(); + } + } + // called by JNI private Class getPluginClass(String libName, String clsName) { From 8b9e553eb7a1dd9fea2f8818874b2b4b49c6e5eb Mon Sep 17 00:00:00 2001 From: Romain Guy Date: Thu, 27 Jan 2011 15:36:40 -0800 Subject: [PATCH 80/90] Catch exception when ViewRoot's surface is not valid. Bug #3399426 Change-Id: Id4e0b8714c9520c4e84e81c2978752d46c912b6b --- core/java/android/view/ViewRoot.java | 1 + core/jni/android_view_Surface.cpp | 4 +++- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/core/java/android/view/ViewRoot.java b/core/java/android/view/ViewRoot.java index 41fc6c6e33d07..b21af410b3069 100644 --- a/core/java/android/view/ViewRoot.java +++ b/core/java/android/view/ViewRoot.java @@ -1537,6 +1537,7 @@ public final class ViewRoot extends Handler implements ViewParent, int top = dirty.top; int right = dirty.right; int bottom = dirty.bottom; + canvas = surface.lockCanvas(dirty); if (left != dirty.left || top != dirty.top || right != dirty.right || diff --git a/core/jni/android_view_Surface.cpp b/core/jni/android_view_Surface.cpp index e4af33f1e885f..aa9c1078363ba 100644 --- a/core/jni/android_view_Surface.cpp +++ b/core/jni/android_view_Surface.cpp @@ -296,8 +296,10 @@ static inline SkBitmap::Config convertPixelFormat(PixelFormat format) static jobject Surface_lockCanvas(JNIEnv* env, jobject clazz, jobject dirtyRect) { const sp& surface(getSurface(env, clazz)); - if (!Surface::isValid(surface)) + if (!Surface::isValid(surface)) { + doThrow(env, "java/lang/IllegalArgumentException", NULL); return 0; + } // get dirty region Region dirtyRegion; From 0cb595082fcb8968c2521cebee0429ae2a9c5272 Mon Sep 17 00:00:00 2001 From: Andreas Huber Date: Fri, 25 Feb 2011 09:13:53 -0800 Subject: [PATCH 81/90] DO NOT MERGE: Cherry picked hacks to better hide A/V sync issues. Squashed commit of the following: commit b1732e9b8bfea4c99bd07907c9aac9fcf1e8b264 Author: Andreas Huber Date: Thu Feb 24 12:05:40 2011 -0800 DO NOT MERGE: Alternate patch for late video issue: seek only the video ahead to the next syncframe after the current audio media position, leave audio untouched. Change-Id: I4f6eb4e577147bc12ed2e998bea299f4bcfaf936 related-to-bug: 3375737 commit 5e7282cf0b5c7a613da5e65fd6c8cb33a1058f8e Author: Andreas Huber Date: Fri Feb 11 13:09:36 2011 -0800 DO NOT MERGE: Start playing (and decoding) audio only after the first video frame has been decoded. if there's both audio and video content. This gives the video decoder an opportunity to fill its internal buffer queue at the start of playback. Change-Id: If17c4243546b1c27c8e5ee43941654d0e36f5ee5 related-to-bug: 3431702 Change-Id: Ic3a6be467ff7ad09da04b1d2bb1a692ee38002b4 --- media/libstagefright/AwesomePlayer.cpp | 203 +++++++++++++------ media/libstagefright/include/AwesomePlayer.h | 13 +- 2 files changed, 154 insertions(+), 62 deletions(-) diff --git a/media/libstagefright/AwesomePlayer.cpp b/media/libstagefright/AwesomePlayer.cpp index 89b3dab46d733..1a8e86db31e02 100644 --- a/media/libstagefright/AwesomePlayer.cpp +++ b/media/libstagefright/AwesomePlayer.cpp @@ -52,7 +52,7 @@ #include "include/LiveSession.h" #define USE_SURFACE_ALLOC 1 -#define FRAME_DROP_FREQ 7 +#define FRAME_DROP_FREQ 0 namespace android { @@ -477,7 +477,7 @@ void AwesomePlayer::reset_l() { mTimeSourceDeltaUs = 0; mVideoTimeUs = 0; - mSeeking = false; + mSeeking = NO_SEEK; mSeekNotificationSent = false; mSeekTimeUs = 0; @@ -783,25 +783,6 @@ status_t AwesomePlayer::play_l() { mAudioPlayer = new AudioPlayer(mAudioSink, this); mAudioPlayer->setSource(mAudioSource); - // We've already started the MediaSource in order to enable - // the prefetcher to read its data. - status_t err = mAudioPlayer->start( - true /* sourceAlreadyStarted */); - - if (err != OK) { - delete mAudioPlayer; - mAudioPlayer = NULL; - - mFlags &= ~(PLAYING | FIRST_FRAME); - - if (mDecryptHandle != NULL) { - mDrmManagerClient->setPlaybackStatus(mDecryptHandle, - Playback::STOP, 0); - } - - return err; - } - mTimeSource = mAudioPlayer; deferredAudioSeek = true; @@ -809,8 +790,26 @@ status_t AwesomePlayer::play_l() { mWatchForAudioSeekComplete = false; mWatchForAudioEOS = true; } - } else { - mAudioPlayer->resume(); + } + + CHECK(!(mFlags & AUDIO_RUNNING)); + + if (mVideoSource == NULL) { + status_t err = startAudioPlayer_l(); + + if (err != OK) { + delete mAudioPlayer; + mAudioPlayer = NULL; + + mFlags &= ~(PLAYING | FIRST_FRAME); + + if (mDecryptHandle != NULL) { + mDrmManagerClient->setPlaybackStatus( + mDecryptHandle, Playback::STOP, 0); + } + + return err; + } } } @@ -842,6 +841,36 @@ status_t AwesomePlayer::play_l() { return OK; } +status_t AwesomePlayer::startAudioPlayer_l() { + CHECK(!(mFlags & AUDIO_RUNNING)); + + if (mAudioSource == NULL || mAudioPlayer == NULL) { + return OK; + } + + if (!(mFlags & AUDIOPLAYER_STARTED)) { + mFlags |= AUDIOPLAYER_STARTED; + + // We've already started the MediaSource in order to enable + // the prefetcher to read its data. + status_t err = mAudioPlayer->start( + true /* sourceAlreadyStarted */); + + if (err != OK) { + notifyListener_l(MEDIA_ERROR, MEDIA_ERROR_UNKNOWN, err); + return err; + } + } else { + mAudioPlayer->resume(); + } + + mFlags |= AUDIO_RUNNING; + + mWatchForAudioEOS = true; + + return OK; +} + void AwesomePlayer::notifyVideoSize_l() { sp meta = mVideoSource->getFormat(); @@ -943,7 +972,7 @@ status_t AwesomePlayer::pause_l(bool at_eos) { cancelPlayerEvents(true /* keepBufferingGoing */); - if (mAudioPlayer != NULL) { + if (mAudioPlayer != NULL && (mFlags & AUDIO_RUNNING)) { if (at_eos) { // If we played the audio stream to completion we // want to make sure that all samples remaining in the audio @@ -952,6 +981,8 @@ status_t AwesomePlayer::pause_l(bool at_eos) { } else { mAudioPlayer->pause(); } + + mFlags &= ~AUDIO_RUNNING; } mFlags &= ~PLAYING; @@ -1009,7 +1040,7 @@ status_t AwesomePlayer::getPosition(int64_t *positionUs) { if (mRTSPController != NULL) { *positionUs = mRTSPController->getNormalPlayTimeUs(); } - else if (mSeeking) { + else if (mSeeking != NO_SEEK) { *positionUs = mSeekTimeUs; } else if (mVideoSource != NULL) { Mutex::Autolock autoLock(mMiscStateLock); @@ -1053,7 +1084,7 @@ status_t AwesomePlayer::seekTo_l(int64_t timeUs) { play_l(); } - mSeeking = true; + mSeeking = SEEK; mSeekNotificationSent = false; mSeekTimeUs = timeUs; mFlags &= ~(AT_EOS | AUDIO_AT_EOS | VIDEO_AT_EOS); @@ -1072,7 +1103,7 @@ status_t AwesomePlayer::seekTo_l(int64_t timeUs) { } void AwesomePlayer::seekAudioIfNecessary_l() { - if (mSeeking && mVideoSource == NULL && mAudioPlayer != NULL) { + if (mSeeking != NO_SEEK && mVideoSource == NULL && mAudioPlayer != NULL) { mAudioPlayer->seekTo(mSeekTimeUs); mWatchForAudioSeekComplete = true; @@ -1168,7 +1199,12 @@ status_t AwesomePlayer::initVideoDecoder(uint32_t flags) { } void AwesomePlayer::finishSeekIfNecessary(int64_t videoTimeUs) { - if (!mSeeking) { + if (mSeeking == SEEK_VIDEO_ONLY) { + mSeeking = NO_SEEK; + return; + } + + if (mSeeking == NO_SEEK) { return; } @@ -1179,9 +1215,7 @@ void AwesomePlayer::finishSeekIfNecessary(int64_t videoTimeUs) { // requested seek time instead. mAudioPlayer->seekTo(videoTimeUs < 0 ? mSeekTimeUs : videoTimeUs); - mAudioPlayer->resume(); mWatchForAudioSeekComplete = true; - mWatchForAudioEOS = true; } else if (!mSeekNotificationSent) { // If we're playing video only, report seek complete now, // otherwise audio player will notify us later. @@ -1189,7 +1223,7 @@ void AwesomePlayer::finishSeekIfNecessary(int64_t videoTimeUs) { } mFlags |= FIRST_FRAME; - mSeeking = false; + mSeeking = NO_SEEK; mSeekNotificationSent = false; if (mDecryptHandle != NULL) { @@ -1209,13 +1243,13 @@ void AwesomePlayer::onVideoEvent() { } mVideoEventPending = false; - if (mSeeking) { + if (mSeeking != NO_SEEK) { if (mVideoBuffer) { mVideoBuffer->release(); mVideoBuffer = NULL; } - if (mCachedSource != NULL && mAudioSource != NULL) { + if (mSeeking == SEEK && mCachedSource != NULL && mAudioSource != NULL) { // We're going to seek the video source first, followed by // the audio source. // In order to avoid jumps in the DataSource offset caused by @@ -1224,8 +1258,10 @@ void AwesomePlayer::onVideoEvent() { // locations, we'll "pause" the audio source, causing it to // stop reading input data until a subsequent seek. - if (mAudioPlayer != NULL) { + if (mAudioPlayer != NULL && (mFlags & AUDIO_RUNNING)) { mAudioPlayer->pause(); + + mFlags &= ~AUDIO_RUNNING; } mAudioSource->pause(); } @@ -1233,11 +1269,14 @@ void AwesomePlayer::onVideoEvent() { if (!mVideoBuffer) { MediaSource::ReadOptions options; - if (mSeeking) { + if (mSeeking != NO_SEEK) { LOGV("seeking to %lld us (%.2f secs)", mSeekTimeUs, mSeekTimeUs / 1E6); options.setSeekTo( - mSeekTimeUs, MediaSource::ReadOptions::SEEK_CLOSEST_SYNC); + mSeekTimeUs, + mSeeking == SEEK_VIDEO_ONLY + ? MediaSource::ReadOptions::SEEK_NEXT_SYNC + : MediaSource::ReadOptions::SEEK_CLOSEST_SYNC); } for (;;) { status_t err = mVideoSource->read(&mVideoBuffer, &options); @@ -1261,7 +1300,7 @@ void AwesomePlayer::onVideoEvent() { // So video playback is complete, but we may still have // a seek request pending that needs to be applied // to the audio track. - if (mSeeking) { + if (mSeeking != NO_SEEK) { LOGV("video stream ended while seeking!"); } finishSeekIfNecessary(-1); @@ -1287,14 +1326,29 @@ void AwesomePlayer::onVideoEvent() { int64_t timeUs; CHECK(mVideoBuffer->meta_data()->findInt64(kKeyTime, &timeUs)); + if (mSeeking == SEEK_VIDEO_ONLY) { + if (mSeekTimeUs > timeUs) { + LOGI("XXX mSeekTimeUs = %lld us, timeUs = %lld us", + mSeekTimeUs, timeUs); + } + } + { Mutex::Autolock autoLock(mMiscStateLock); mVideoTimeUs = timeUs; } - bool wasSeeking = mSeeking; + SeekType wasSeeking = mSeeking; finishSeekIfNecessary(timeUs); + if (mAudioPlayer != NULL && !(mFlags & AUDIO_RUNNING)) { + status_t err = startAudioPlayer_l(); + if (err != OK) { + LOGE("Startung the audio player failed w/ err %d", err); + return; + } + } + TimeSource *ts = (mFlags & AUDIO_AT_EOS) ? &mSystemTimeSource : mTimeSource; if (mFlags & FIRST_FRAME) { @@ -1309,41 +1363,68 @@ void AwesomePlayer::onVideoEvent() { mTimeSourceDeltaUs = realTimeUs - mediaTimeUs; } - int64_t nowUs = ts->getRealTimeUs() - mTimeSourceDeltaUs; + if (wasSeeking == SEEK_VIDEO_ONLY) { + int64_t nowUs = ts->getRealTimeUs() - mTimeSourceDeltaUs; - int64_t latenessUs = nowUs - timeUs; + int64_t latenessUs = nowUs - timeUs; - if (wasSeeking) { + if (latenessUs > 0) { + LOGI("after SEEK_VIDEO_ONLY we're late by %.2f secs", latenessUs / 1E6); + } + } + + if (wasSeeking == NO_SEEK) { // Let's display the first frame after seeking right away. - latenessUs = 0; - } - if (mRTPSession != NULL) { - // We'll completely ignore timestamps for gtalk videochat - // and we'll play incoming video as fast as we get it. - latenessUs = 0; - } + int64_t nowUs = ts->getRealTimeUs() - mTimeSourceDeltaUs; + + int64_t latenessUs = nowUs - timeUs; + + if (latenessUs > 500000ll + && mRTSPController == NULL + && mAudioPlayer != NULL + && mAudioPlayer->getMediaTimeMapping( + &realTimeUs, &mediaTimeUs)) { + LOGI("we're much too late (%.2f secs), video skipping ahead", + latenessUs / 1E6); - if (latenessUs > 40000) { - // We're more than 40ms late. - LOGV("we're late by %lld us (%.2f secs)", latenessUs, latenessUs / 1E6); - if ( mSinceLastDropped > FRAME_DROP_FREQ) - { - LOGV("we're late by %lld us (%.2f secs) dropping one after %d frames", latenessUs, latenessUs / 1E6, mSinceLastDropped); - mSinceLastDropped = 0; mVideoBuffer->release(); mVideoBuffer = NULL; + mSeeking = SEEK_VIDEO_ONLY; + mSeekTimeUs = mediaTimeUs; + postVideoEvent_l(); return; } - } - if (latenessUs < -10000) { - // We're more than 10ms early. + if (latenessUs > 40000) { + // We're more than 40ms late. - postVideoEvent_l(10000); - return; + LOGV("we're late by %lld us (%.2f secs)", + latenessUs, latenessUs / 1E6); + + if ( mSinceLastDropped > FRAME_DROP_FREQ) + { + LOGV("we're late by %lld us (%.2f secs) dropping one " + "after %d frames", + latenessUs, latenessUs / 1E6, mSinceLastDropped); + + mSinceLastDropped = 0; + mVideoBuffer->release(); + mVideoBuffer = NULL; + + postVideoEvent_l(); + return; + } + } + + if (latenessUs < -10000) { + // We're more than 10ms early. + + postVideoEvent_l(10000); + return; + } } if (mVideoRendererIsPreview || mVideoRenderer == NULL) { @@ -1424,7 +1505,7 @@ void AwesomePlayer::onCheckAudioStatus() { mSeekNotificationSent = true; } - mSeeking = false; + mSeeking = NO_SEEK; } status_t finalStatus; diff --git a/media/libstagefright/include/AwesomePlayer.h b/media/libstagefright/include/AwesomePlayer.h index 41ef181caef9e..d5819a46ce43a 100644 --- a/media/libstagefright/include/AwesomePlayer.h +++ b/media/libstagefright/include/AwesomePlayer.h @@ -119,6 +119,9 @@ private: // sufficient data to begin playback and finish the preparation phase // for good. PREPARING_CONNECTED = 2048, + + AUDIO_RUNNING = 8192, + AUDIOPLAYER_STARTED = 16384, }; mutable Mutex mLock; @@ -160,7 +163,13 @@ private: int64_t mTimeSourceDeltaUs; int64_t mVideoTimeUs; - bool mSeeking; + enum SeekType { + NO_SEEK, + SEEK, + SEEK_VIDEO_ONLY + }; + SeekType mSeeking; + bool mSeekNotificationSent; int64_t mSeekTimeUs; @@ -256,6 +265,8 @@ private: void finishSeekIfNecessary(int64_t videoTimeUs); void ensureCacheIsFetching_l(); + status_t startAudioPlayer_l(); + AwesomePlayer(const AwesomePlayer &); AwesomePlayer &operator=(const AwesomePlayer &); }; From 6d24560ac6921c7fe569b2db053a2d0457c97a99 Mon Sep 17 00:00:00 2001 From: Mike Lockwood Date: Fri, 18 Feb 2011 13:23:13 -0500 Subject: [PATCH 82/90] DO NOT MERGE: KeyguardManager: Add isKeyguardLocked() and isKeyguardSecure() BUG: 3402847 Change-Id: I7cb199763e8d5386914b4c2173c9e1579b08674c Signed-off-by: Mike Lockwood --- core/java/android/app/KeyguardManager.java | 34 +++++++++++++++++++ core/java/android/view/IWindowManager.aidl | 2 ++ .../android/view/WindowManagerPolicy.java | 18 ++++++++++ .../policy/impl/PhoneWindowManager.java | 11 ++++++ .../android/server/WindowManagerService.java | 8 +++++ 5 files changed, 73 insertions(+) diff --git a/core/java/android/app/KeyguardManager.java b/core/java/android/app/KeyguardManager.java index e3d8e2047c96a..1e8743cae68a8 100644 --- a/core/java/android/app/KeyguardManager.java +++ b/core/java/android/app/KeyguardManager.java @@ -116,6 +116,40 @@ public class KeyguardManager { return new KeyguardLock(tag); } + /** + * isKeyguardLocked + * + * Return whether the keyguard is currently locked. + * + * @return true if in keyguard is locked. + * + * @hide + */ + public boolean isKeyguardLocked() { + try { + return mWM.isKeyguardSecure(); + } catch (RemoteException ex) { + return false; + } + } + + /** + * isKeyguardSecure + * + * Return whether the keyguard requires a password to unlock. + * + * @return true if in keyguard is secure. + * + * @hide + */ + public boolean isKeyguardSecure() { + try { + return mWM.isKeyguardSecure(); + } catch (RemoteException ex) { + return false; + } + } + /** * If keyguard screen is showing or in restricted key input mode (i.e. in * keyguard password emergency screen). When in such mode, certain keys, diff --git a/core/java/android/view/IWindowManager.aidl b/core/java/android/view/IWindowManager.aidl index 51653df16d1c7..dd8242a6fef19 100644 --- a/core/java/android/view/IWindowManager.aidl +++ b/core/java/android/view/IWindowManager.aidl @@ -100,6 +100,8 @@ interface IWindowManager void disableKeyguard(IBinder token, String tag); void reenableKeyguard(IBinder token); void exitKeyguardSecurely(IOnKeyguardExitResult callback); + boolean isKeyguardLocked(); + boolean isKeyguardSecure(); boolean inKeyguardRestrictedInputMode(); void closeSystemDialogs(String reason); diff --git a/core/java/android/view/WindowManagerPolicy.java b/core/java/android/view/WindowManagerPolicy.java index ad069029eabe3..be68cb9e4a449 100644 --- a/core/java/android/view/WindowManagerPolicy.java +++ b/core/java/android/view/WindowManagerPolicy.java @@ -753,6 +753,24 @@ public interface WindowManagerPolicy { */ void exitKeyguardSecurely(OnKeyguardExitResult callback); + /** + * isKeyguardLocked + * + * Return whether the keyguard is currently locked. + * + * @return true if in keyguard is locked. + */ + public boolean isKeyguardLocked(); + + /** + * isKeyguardSecure + * + * Return whether the keyguard requires a password to unlock. + * + * @return true if in keyguard is secure. + */ + public boolean isKeyguardSecure(); + /** * inKeyguardRestrictedKeyInputMode * diff --git a/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java b/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java index 066daa89d2674..2231ad9185f1b 100755 --- a/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java +++ b/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java @@ -2430,6 +2430,17 @@ public class PhoneWindowManager implements WindowManagerPolicy { return mKeyguardMediator.isShowingAndNotHidden(); } + + /** {@inheritDoc} */ + public boolean isKeyguardLocked() { + return keyguardOn(); + } + + /** {@inheritDoc} */ + public boolean isKeyguardSecure() { + return mKeyguardMediator.isSecure(); + } + /** {@inheritDoc} */ public boolean inKeyguardRestrictedKeyInputMode() { return mKeyguardMediator.isInputRestricted(); diff --git a/services/java/com/android/server/WindowManagerService.java b/services/java/com/android/server/WindowManagerService.java index 2efb4449eb908..a3c3b86754434 100644 --- a/services/java/com/android/server/WindowManagerService.java +++ b/services/java/com/android/server/WindowManagerService.java @@ -4746,6 +4746,14 @@ public class WindowManagerService extends IWindowManager.Stub return mPolicy.inKeyguardRestrictedKeyInputMode(); } + public boolean isKeyguardLocked() { + return mPolicy.isKeyguardLocked(); + } + + public boolean isKeyguardSecure() { + return mPolicy.isKeyguardSecure(); + } + public void closeSystemDialogs(String reason) { synchronized(mWindowMap) { for (int i=mWindows.size()-1; i>=0; i--) { From d91ee1211ab71a7a87f9b1b4781fa1df45bc8da2 Mon Sep 17 00:00:00 2001 From: Mike Lockwood Date: Sat, 26 Feb 2011 11:23:49 -0500 Subject: [PATCH 83/90] DO NOT MERGE: KeyguardManager: Fix copy & paste error in isKeyguardLocked() BUG: 3402847 Change-Id: Ic731e49b43fa40df6f8b658d8620a99a85c346e6 Signed-off-by: Mike Lockwood --- core/java/android/app/KeyguardManager.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/java/android/app/KeyguardManager.java b/core/java/android/app/KeyguardManager.java index 1e8743cae68a8..a601fbf90ab56 100644 --- a/core/java/android/app/KeyguardManager.java +++ b/core/java/android/app/KeyguardManager.java @@ -127,7 +127,7 @@ public class KeyguardManager { */ public boolean isKeyguardLocked() { try { - return mWM.isKeyguardSecure(); + return mWM.isKeyguardLocked(); } catch (RemoteException ex) { return false; } From 88fa05b865007af11ea5d02073181daeb59615e4 Mon Sep 17 00:00:00 2001 From: Mike Lockwood Date: Fri, 18 Feb 2011 09:07:14 -0500 Subject: [PATCH 84/90] DO NOT MERGE: MTP: Add support for dynamically adding and removing storage units BUG: 3402847 Change-Id: I46e90f546a8d72c273cd7f2de2d086bb6dbdc1b8 Signed-off-by: Mike Lockwood --- media/jni/android_mtp_MtpServer.cpp | 18 +++--- media/mtp/MtpServer.cpp | 91 +++++++++++++++++++++++------ media/mtp/MtpServer.h | 18 ++++-- media/mtp/MtpStorage.cpp | 4 +- media/mtp/MtpStorage.h | 5 +- media/mtp/mtp.h | 2 + 6 files changed, 106 insertions(+), 32 deletions(-) diff --git a/media/jni/android_mtp_MtpServer.cpp b/media/jni/android_mtp_MtpServer.cpp index 3883fb2dcd7a7..b27441fb681c2 100644 --- a/media/jni/android_mtp_MtpServer.cpp +++ b/media/jni/android_mtp_MtpServer.cpp @@ -35,6 +35,7 @@ #include "private/android_filesystem_config.h" #include "MtpServer.h" +#include "MtpStorage.h" using namespace android; @@ -56,22 +57,24 @@ class MtpThread : public Thread { private: MtpDatabase* mDatabase; MtpServer* mServer; - String8 mStoragePath; - uint64_t mReserveSpace; + MtpStorage* mStorage; Mutex mMutex; bool mUsePtp; int mFd; public: - MtpThread(MtpDatabase* database, const char* storagePath, uint64_t reserveSpace) + MtpThread(MtpDatabase* database, MtpStorage* storage) : mDatabase(database), mServer(NULL), - mStoragePath(storagePath), - mReserveSpace(reserveSpace), + mStorage(storage), mFd(-1) { } + virtual ~MtpThread() { + delete mStorage; + } + void setPtpMode(bool usePtp) { mMutex.lock(); mUsePtp = usePtp; @@ -86,7 +89,7 @@ public: (mUsePtp ? MTP_INTERFACE_MODE_PTP : MTP_INTERFACE_MODE_MTP)); mServer = new MtpServer(mFd, mDatabase, AID_MEDIA_RW, 0664, 0775); - mServer->addStorage(mStoragePath, mReserveSpace); + mServer->addStorage(mStorage); mMutex.unlock(); mServer->run(); @@ -137,7 +140,8 @@ android_mtp_MtpServer_setup(JNIEnv *env, jobject thiz, jobject javaDatabase, const char *storagePathStr = env->GetStringUTFChars(storagePath, NULL); // create the thread and assign it to the smart pointer - sThread = new MtpThread(database, storagePathStr, reserveSpace); + MtpStorage* storage = new MtpStorage(MTP_FIRST_STORAGE_ID, storagePathStr, reserveSpace); + sThread = new MtpThread(database, storage); env->ReleaseStringUTFChars(storagePath, storagePathStr); #endif diff --git a/media/mtp/MtpServer.cpp b/media/mtp/MtpServer.cpp index be004d2dd7867..469fb0470b4cd 100644 --- a/media/mtp/MtpServer.cpp +++ b/media/mtp/MtpServer.cpp @@ -84,6 +84,8 @@ static const MtpOperationCode kSupportedOperationCodes[] = { static const MtpEventCode kSupportedEventCodes[] = { MTP_EVENT_OBJECT_ADDED, MTP_EVENT_OBJECT_REMOVED, + MTP_EVENT_STORE_ADDED, + MTP_EVENT_STORE_REMOVED, }; MtpServer::MtpServer(int fd, MtpDatabase* database, @@ -104,11 +106,23 @@ MtpServer::MtpServer(int fd, MtpDatabase* database, MtpServer::~MtpServer() { } -void MtpServer::addStorage(const char* filePath, uint64_t reserveSpace) { - int index = mStorages.size() + 1; - index |= index << 16; // set high and low part to our index - MtpStorage* storage = new MtpStorage(index, filePath, reserveSpace); - addStorage(storage); +void MtpServer::addStorage(MtpStorage* storage) { + Mutex::Autolock autoLock(mMutex); + + mStorages.push(storage); + sendStoreAdded(storage->getStorageID()); +} + +void MtpServer::removeStorage(MtpStorage* storage) { + Mutex::Autolock autoLock(mMutex); + + for (int i = 0; i < mStorages.size(); i++) { + if (mStorages[i] == storage) { + mStorages.removeAt(i); + sendStoreRemoved(storage->getStorageID()); + break; + } + } } MtpStorage* MtpServer::getStorage(MtpStorageID id) { @@ -122,6 +136,12 @@ MtpStorage* MtpServer::getStorage(MtpStorageID id) { return NULL; } +bool MtpServer::hasStorage(MtpStorageID id) { + if (id == 0 || id == 0xFFFFFFFF) + return mStorages.size() > 0; + return (getStorage(id) != NULL); +} + void MtpServer::run() { int fd = mFD; @@ -203,28 +223,38 @@ void MtpServer::run() { } void MtpServer::sendObjectAdded(MtpObjectHandle handle) { - if (mSessionOpen) { - LOGV("sendObjectAdded %d\n", handle); - mEvent.setEventCode(MTP_EVENT_OBJECT_ADDED); - mEvent.setTransactionID(mRequest.getTransactionID()); - mEvent.setParameter(1, handle); - int ret = mEvent.write(mFD); - LOGV("mEvent.write returned %d\n", ret); - } + LOGV("sendObjectAdded %d\n", handle); + sendEvent(MTP_EVENT_OBJECT_ADDED, handle); } void MtpServer::sendObjectRemoved(MtpObjectHandle handle) { + LOGV("sendObjectRemoved %d\n", handle); + sendEvent(MTP_EVENT_OBJECT_REMOVED, handle); +} + +void MtpServer::sendStoreAdded(MtpStorageID id) { + LOGV("sendStoreAdded %08X\n", id); + sendEvent(MTP_EVENT_STORE_ADDED, id); +} + +void MtpServer::sendStoreRemoved(MtpStorageID id) { + LOGV("sendStoreRemoved %08X\n", id); + sendEvent(MTP_EVENT_STORE_REMOVED, id); +} + +void MtpServer::sendEvent(MtpEventCode code, uint32_t param1) { if (mSessionOpen) { - LOGV("sendObjectRemoved %d\n", handle); - mEvent.setEventCode(MTP_EVENT_OBJECT_REMOVED); + mEvent.setEventCode(code); mEvent.setTransactionID(mRequest.getTransactionID()); - mEvent.setParameter(1, handle); + mEvent.setParameter(1, param1); int ret = mEvent.write(mFD); LOGV("mEvent.write returned %d\n", ret); } } bool MtpServer::handleRequest() { + Mutex::Autolock autoLock(mMutex); + MtpOperationCode operation = mRequest.getOperationCode(); MtpResponseCode response; @@ -438,6 +468,9 @@ MtpResponseCode MtpServer::doGetObjectHandles() { MtpObjectFormat format = mRequest.getParameter(2); // 0 for all formats MtpObjectHandle parent = mRequest.getParameter(3); // 0xFFFFFFFF for objects with no parent // 0x00000000 for all objects? + + if (!hasStorage(storageID)) + return MTP_RESPONSE_INVALID_STORAGE_ID; if (parent == 0xFFFFFFFF) parent = 0; @@ -454,6 +487,8 @@ MtpResponseCode MtpServer::doGetNumObjects() { MtpObjectFormat format = mRequest.getParameter(2); // 0 for all formats MtpObjectHandle parent = mRequest.getParameter(3); // 0xFFFFFFFF for objects with no parent // 0x00000000 for all objects? + if (!hasStorage(storageID)) + return MTP_RESPONSE_INVALID_STORAGE_ID; if (parent == 0xFFFFFFFF) parent = 0; @@ -470,7 +505,9 @@ MtpResponseCode MtpServer::doGetNumObjects() { MtpResponseCode MtpServer::doGetObjectReferences() { if (!mSessionOpen) return MTP_RESPONSE_SESSION_NOT_OPEN; - MtpStorageID handle = mRequest.getParameter(1); + if (!hasStorage()) + return MTP_RESPONSE_INVALID_OBJECT_HANDLE; + MtpObjectHandle handle = mRequest.getParameter(1); // FIXME - check for invalid object handle MtpObjectHandleList* handles = mDatabase->getObjectReferences(handle); @@ -486,7 +523,10 @@ MtpResponseCode MtpServer::doGetObjectReferences() { MtpResponseCode MtpServer::doSetObjectReferences() { if (!mSessionOpen) return MTP_RESPONSE_SESSION_NOT_OPEN; + if (!hasStorage()) + return MTP_RESPONSE_INVALID_OBJECT_HANDLE; MtpStorageID handle = mRequest.getParameter(1); + MtpObjectHandleList* references = mData.getAUInt32(); MtpResponseCode result = mDatabase->setObjectReferences(handle, references); delete references; @@ -494,6 +534,8 @@ MtpResponseCode MtpServer::doSetObjectReferences() { } MtpResponseCode MtpServer::doGetObjectPropValue() { + if (!hasStorage()) + return MTP_RESPONSE_INVALID_OBJECT_HANDLE; MtpObjectHandle handle = mRequest.getParameter(1); MtpObjectProperty property = mRequest.getParameter(2); LOGV("GetObjectPropValue %d %s\n", handle, @@ -503,6 +545,8 @@ MtpResponseCode MtpServer::doGetObjectPropValue() { } MtpResponseCode MtpServer::doSetObjectPropValue() { + if (!hasStorage()) + return MTP_RESPONSE_INVALID_OBJECT_HANDLE; MtpObjectHandle handle = mRequest.getParameter(1); MtpObjectProperty property = mRequest.getParameter(2); LOGV("SetObjectPropValue %d %s\n", handle, @@ -536,6 +580,8 @@ MtpResponseCode MtpServer::doResetDevicePropValue() { } MtpResponseCode MtpServer::doGetObjectPropList() { + if (!hasStorage()) + return MTP_RESPONSE_INVALID_OBJECT_HANDLE; MtpObjectHandle handle = mRequest.getParameter(1); // use uint32_t so we can support 0xFFFFFFFF @@ -551,11 +597,15 @@ MtpResponseCode MtpServer::doGetObjectPropList() { } MtpResponseCode MtpServer::doGetObjectInfo() { + if (!hasStorage()) + return MTP_RESPONSE_INVALID_OBJECT_HANDLE; MtpObjectHandle handle = mRequest.getParameter(1); return mDatabase->getObjectInfo(handle, mData); } MtpResponseCode MtpServer::doGetObject() { + if (!hasStorage()) + return MTP_RESPONSE_INVALID_OBJECT_HANDLE; MtpObjectHandle handle = mRequest.getParameter(1); MtpString pathBuf; int64_t fileLength; @@ -591,6 +641,8 @@ MtpResponseCode MtpServer::doGetObject() { } MtpResponseCode MtpServer::doGetPartialObject() { + if (!hasStorage()) + return MTP_RESPONSE_INVALID_OBJECT_HANDLE; MtpObjectHandle handle = mRequest.getParameter(1); uint32_t offset = mRequest.getParameter(2); uint32_t length = mRequest.getParameter(3); @@ -687,6 +739,7 @@ MtpResponseCode MtpServer::doSendObjectInfo() { if (mSendObjectFileSize > storage->getFreeSpace()) return MTP_RESPONSE_STORAGE_FULL; +LOGD("path: %s parent: %d storageID: %08X", (const char*)path, parent, storageID); MtpObjectHandle handle = mDatabase->beginSendObject((const char*)path, format, parent, storageID, mSendObjectFileSize, modifiedTime); if (handle == kInvalidObjectHandle) { @@ -718,6 +771,8 @@ MtpResponseCode MtpServer::doSendObjectInfo() { } MtpResponseCode MtpServer::doSendObject() { + if (!hasStorage()) + return MTP_RESPONSE_GENERAL_ERROR; MtpResponseCode result = MTP_RESPONSE_OK; mode_t mask; int ret; @@ -834,6 +889,8 @@ static void deletePath(const char* path) { } MtpResponseCode MtpServer::doDeleteObject() { + if (!hasStorage()) + return MTP_RESPONSE_INVALID_OBJECT_HANDLE; MtpObjectHandle handle = mRequest.getParameter(1); MtpObjectFormat format = mRequest.getParameter(2); // FIXME - support deleting all objects if handle is 0xFFFFFFFF diff --git a/media/mtp/MtpServer.h b/media/mtp/MtpServer.h index 605d5a2e0d4d7..1efa7158baa65 100644 --- a/media/mtp/MtpServer.h +++ b/media/mtp/MtpServer.h @@ -22,9 +22,10 @@ #include "MtpResponsePacket.h" #include "MtpEventPacket.h" #include "mtp.h" - #include "MtpUtils.h" +#include + namespace android { class MtpDatabase; @@ -62,20 +63,29 @@ private: MtpString mSendObjectFilePath; size_t mSendObjectFileSize; + Mutex mMutex; + public: MtpServer(int fd, MtpDatabase* database, int fileGroup, int filePerm, int directoryPerm); virtual ~MtpServer(); - void addStorage(const char* filePath, uint64_t reserveSpace); - inline void addStorage(MtpStorage* storage) { mStorages.push(storage); } - MtpStorage* getStorage(MtpStorageID id); + void addStorage(MtpStorage* storage); + void removeStorage(MtpStorage* storage); + void run(); void sendObjectAdded(MtpObjectHandle handle); void sendObjectRemoved(MtpObjectHandle handle); private: + MtpStorage* getStorage(MtpStorageID id); + inline bool hasStorage() { return mStorages.size() > 0; } + bool hasStorage(MtpStorageID id); + void sendStoreAdded(MtpStorageID id); + void sendStoreRemoved(MtpStorageID id); + void sendEvent(MtpEventCode code, uint32_t param1); + bool handleRequest(); MtpResponseCode doGetDeviceInfo(); diff --git a/media/mtp/MtpStorage.cpp b/media/mtp/MtpStorage.cpp index 2fbbc512d1e23..6cb88b33551f8 100644 --- a/media/mtp/MtpStorage.cpp +++ b/media/mtp/MtpStorage.cpp @@ -59,7 +59,7 @@ int MtpStorage::getAccessCapability() const { uint64_t MtpStorage::getMaxCapacity() { if (mMaxCapacity == 0) { struct statfs stat; - if (statfs(mFilePath, &stat)) + if (statfs(getPath(), &stat)) return -1; mMaxCapacity = (uint64_t)stat.f_blocks * (uint64_t)stat.f_bsize; } @@ -68,7 +68,7 @@ uint64_t MtpStorage::getMaxCapacity() { uint64_t MtpStorage::getFreeSpace() { struct statfs stat; - if (statfs(mFilePath, &stat)) + if (statfs(getPath(), &stat)) return -1; uint64_t freeSpace = (uint64_t)stat.f_bavail * (uint64_t)stat.f_bsize; return (freeSpace > mReserveSpace ? freeSpace - mReserveSpace : 0); diff --git a/media/mtp/MtpStorage.h b/media/mtp/MtpStorage.h index ace720b9f5111..858c9d38a3f6b 100644 --- a/media/mtp/MtpStorage.h +++ b/media/mtp/MtpStorage.h @@ -17,6 +17,7 @@ #ifndef _MTP_STORAGE_H #define _MTP_STORAGE_H +#include "MtpTypes.h" #include "mtp.h" namespace android { @@ -27,7 +28,7 @@ class MtpStorage { private: MtpStorageID mStorageID; - const char* mFilePath; + MtpString mFilePath; uint64_t mMaxCapacity; // amount of free space to leave unallocated uint64_t mReserveSpace; @@ -44,7 +45,7 @@ public: uint64_t getMaxCapacity(); uint64_t getFreeSpace(); const char* getDescription() const; - inline const char* getPath() const { return mFilePath; } + inline const char* getPath() const { return (const char *)mFilePath; } }; }; // namespace android diff --git a/media/mtp/mtp.h b/media/mtp/mtp.h index 8bc2e22c31d8a..6fedc161b9c19 100644 --- a/media/mtp/mtp.h +++ b/media/mtp/mtp.h @@ -22,6 +22,8 @@ #define MTP_STANDARD_VERSION 100 +#define MTP_FIRST_STORAGE_ID 0x00010001 + // Container Types #define MTP_CONTAINER_TYPE_UNDEFINED 0 #define MTP_CONTAINER_TYPE_COMMAND 1 From 6c213a77f8e3c9c5bbc131bcd8f54c04a8bc2a8a Mon Sep 17 00:00:00 2001 From: Mike Lockwood Date: Fri, 18 Feb 2011 13:24:01 -0500 Subject: [PATCH 85/90] DO NOT MERGE: MTP: Disable MTP when the keyguard is locked and secure BUG: 3402847 Change-Id: Id0e20597423131a13ac7cef13ec5c39b962b3e0b Signed-off-by: Mike Lockwood --- media/java/android/mtp/MtpServer.java | 7 ++++++ media/jni/android_mtp_MtpServer.cpp | 31 ++++++++++++++++++++++++++- 2 files changed, 37 insertions(+), 1 deletion(-) diff --git a/media/java/android/mtp/MtpServer.java b/media/java/android/mtp/MtpServer.java index d433887cf9f28..fe734e141cbce 100644 --- a/media/java/android/mtp/MtpServer.java +++ b/media/java/android/mtp/MtpServer.java @@ -54,6 +54,12 @@ public class MtpServer { native_set_ptp_mode(usePtp); } + // Used to disable MTP by removing all storage units. + // This is done to disable access to file transfer when the device is locked. + public void setLocked(boolean locked) { + native_set_locked(locked); + } + private native final void native_setup(MtpDatabase database, String storagePath, long reserveSpace); private native final void native_start(); @@ -61,4 +67,5 @@ public class MtpServer { private native final void native_send_object_added(int handle); private native final void native_send_object_removed(int handle); private native final void native_set_ptp_mode(boolean usePtp); + private native final void native_set_locked(boolean locked); } diff --git a/media/jni/android_mtp_MtpServer.cpp b/media/jni/android_mtp_MtpServer.cpp index b27441fb681c2..e025ef1acff8c 100644 --- a/media/jni/android_mtp_MtpServer.cpp +++ b/media/jni/android_mtp_MtpServer.cpp @@ -60,6 +60,7 @@ private: MtpStorage* mStorage; Mutex mMutex; bool mUsePtp; + bool mLocked; int mFd; public: @@ -67,6 +68,8 @@ public: : mDatabase(database), mServer(NULL), mStorage(storage), + mUsePtp(false), + mLocked(false), mFd(-1) { } @@ -81,6 +84,20 @@ public: mMutex.unlock(); } + void setLocked(bool locked) { + mMutex.lock(); + if (locked != mLocked) { + if (mServer) { + if (locked) + mServer->removeStorage(mStorage); + else + mServer->addStorage(mStorage); + } + mLocked = locked; + } + mMutex.unlock(); + } + virtual bool threadLoop() { mMutex.lock(); mFd = open("/dev/mtp_usb", O_RDWR); @@ -89,7 +106,8 @@ public: (mUsePtp ? MTP_INTERFACE_MODE_PTP : MTP_INTERFACE_MODE_MTP)); mServer = new MtpServer(mFd, mDatabase, AID_MEDIA_RW, 0664, 0775); - mServer->addStorage(mStorage); + if (!mLocked) + mServer->addStorage(mStorage); mMutex.unlock(); mServer->run(); @@ -199,6 +217,16 @@ android_mtp_MtpServer_set_ptp_mode(JNIEnv *env, jobject thiz, jboolean usePtp) #endif } +static void +android_mtp_MtpServer_set_locked(JNIEnv *env, jobject thiz, jboolean locked) +{ +#ifdef HAVE_ANDROID_OS + MtpThread *thread = sThread.get(); + if (thread) + thread->setLocked(locked); +#endif +} + // ---------------------------------------------------------------------------- static JNINativeMethod gMethods[] = { @@ -209,6 +237,7 @@ static JNINativeMethod gMethods[] = { {"native_send_object_added", "(I)V", (void *)android_mtp_MtpServer_send_object_added}, {"native_send_object_removed", "(I)V", (void *)android_mtp_MtpServer_send_object_removed}, {"native_set_ptp_mode", "(Z)V", (void *)android_mtp_MtpServer_set_ptp_mode}, + {"native_set_locked", "(Z)V", (void *)android_mtp_MtpServer_set_locked}, }; static const char* const kClassPathName = "android/mtp/MtpServer"; From 566bf98a82079ca678b03f459950b9892f6b2096 Mon Sep 17 00:00:00 2001 From: Wink Saville Date: Mon, 28 Feb 2011 15:32:41 -0800 Subject: [PATCH 86/90] Fixing the write of BackgroundData setting, DO NOT MERGE. I outsmarted myself trying to minimize writes and caused no writes to occur. bug:3485934 Change-Id: I43b6ebbed3f13277edfb2e28f09cf7b98ea66776 --- .../java/com/android/server/ConnectivityService.java | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/services/java/com/android/server/ConnectivityService.java b/services/java/com/android/server/ConnectivityService.java index e689654110b66..2f12a9564428f 100644 --- a/services/java/com/android/server/ConnectivityService.java +++ b/services/java/com/android/server/ConnectivityService.java @@ -989,13 +989,11 @@ public class ConnectivityService extends IConnectivityManager.Stub { } private void handleSetBackgroundData(boolean enabled) { - if (enabled != getBackgroundDataSetting()) { - Settings.Secure.putInt(mContext.getContentResolver(), - Settings.Secure.BACKGROUND_DATA, enabled ? 1 : 0); - Intent broadcast = new Intent( - ConnectivityManager.ACTION_BACKGROUND_DATA_SETTING_CHANGED); - mContext.sendBroadcast(broadcast); - } + Settings.Secure.putInt(mContext.getContentResolver(), + Settings.Secure.BACKGROUND_DATA, enabled ? 1 : 0); + Intent broadcast = new Intent( + ConnectivityManager.ACTION_BACKGROUND_DATA_SETTING_CHANGED); + mContext.sendBroadcast(broadcast); } /** From 6a4a1d7488e61c3aacdd37f2f95139168a283aef Mon Sep 17 00:00:00 2001 From: Gilles Debunne Date: Thu, 3 Feb 2011 14:17:05 -0800 Subject: [PATCH 87/90] Bugfixes in StaticLayout. DO NOT MERGE. Bug 3422121 Cherry-picked from master's 95472. With ellipsize, lines starting with a very long word that does not fit inside the width were simply ignored. Cut the long word instead. start - widthStart index offset shift in BiDi. The original ellipsize-end patch that added '...' after the last word on end-ellipsized lines has been punted in favor of a true ellipsize support in I. I believe the StaticLayout calculateEllipsise is a no-op since textwidth <= avail by construction: fitWidth and okwidth are < outerWidth. The only exception is the paraEnd != here case in generate (when not a single character fits in width). This case is exercised by StaticLayoutTest in cts (width of 8 pixels) and revealed an offset error in widstart. All in all, it looks like this code was probably never really tested. I tried some typical text configuration to make sure these changes improved the situation. Change-Id: I6c2cb26436a21f0f89078c275a89e891f0f23b92 --- core/java/android/text/Layout.java | 21 +++---- core/java/android/text/StaticLayout.java | 70 +++--------------------- 2 files changed, 20 insertions(+), 71 deletions(-) diff --git a/core/java/android/text/Layout.java b/core/java/android/text/Layout.java index 8700af802ae64..fe3664111815c 100644 --- a/core/java/android/text/Layout.java +++ b/core/java/android/text/Layout.java @@ -1727,6 +1727,17 @@ public abstract class Layout { } } + /** + * Inform this layout that not all of its lines will be displayed, because a maximum number of + * lines has been set on the associated TextView. + * + * A non strictly positive value means that all lines are displayed. + * + * @param lineCount number of visible lines + * @hide + */ + public void setMaximumVisibleLineCount(int lineCount) {} + private CharSequence mText; private TextPaint mPaint; /* package */ TextPaint mWorkPaint; @@ -1765,14 +1776,4 @@ public abstract class Layout { /* package */ static final Directions DIRS_ALL_RIGHT_TO_LEFT = new Directions(new int[] { 0, RUN_LENGTH_MASK | RUN_RTL_FLAG }); - /** - * Inform this layout that not all of its lines will be displayed, because a maximum number of - * lines has been set on the associated TextView. - * - * A non positive value means that all lines are displayed. - * - * @param line line number of the last visible line (line numbers start at 1 for the first line) - * @hide - */ - public void setMaximumVisibleLineCount(int line) {} } diff --git a/core/java/android/text/StaticLayout.java b/core/java/android/text/StaticLayout.java index ac3df795c760c..27fe24e7adadf 100644 --- a/core/java/android/text/StaticLayout.java +++ b/core/java/android/text/StaticLayout.java @@ -360,8 +360,6 @@ public class StaticLayout extends Layout okbottom = fitbottom; } } else { - if (ellipsize != null) { - // Break only at spaces using ok indexes. if (ok != here) { // Log.e("text", "output ok " + here + " to " +ok); @@ -377,43 +375,7 @@ public class StaticLayout extends Layout choosehtv, fm, hasTabOrEmoji, needMultiply, paraStart, chdirs, dir, easy, ok == bufend, includepad, trackpad, - chs, widths, here - paraStart, - ellipsize, ellipsizedWidth, okwidth, - paint); - - here = ok; - } else { - // Act like it fit even though it didn't. - - fitwidth = w; - here = fit = j + 1; - - if (fmtop < fittop) - fittop = fmtop; - if (fmascent < fitascent) - fitascent = fmascent; - if (fmdescent > fitdescent) - fitdescent = fmdescent; - if (fmbottom > fitbottom) - fitbottom = fmbottom; - } - } else { - if (ok != here) { - // Log.e("text", "output ok " + here + " to " +ok); - - while (ok < spanEnd && chs[ok - paraStart] == ' ') { - ok++; - } - - v = out(source, - here, ok, - okascent, okdescent, oktop, okbottom, - v, - spacingmult, spacingadd, chooseht, - choosehtv, fm, hasTabOrEmoji, - needMultiply, paraStart, chdirs, dir, easy, - ok == bufend, includepad, trackpad, - chs, widths, here - paraStart, + chs, widths, paraStart, ellipsize, ellipsizedWidth, okwidth, paint); @@ -429,7 +391,7 @@ public class StaticLayout extends Layout choosehtv, fm, hasTabOrEmoji, needMultiply, paraStart, chdirs, dir, easy, fit == bufend, includepad, trackpad, - chs, widths, here - paraStart, + chs, widths, paraStart, ellipsize, ellipsizedWidth, fitwidth, paint); @@ -451,13 +413,12 @@ public class StaticLayout extends Layout needMultiply, paraStart, chdirs, dir, easy, here + 1 == bufend, includepad, trackpad, - chs, widths, here - paraStart, + chs, widths, paraStart, ellipsize, ellipsizedWidth, widths[here - paraStart], paint); here = here + 1; } - } if (here < spanStart) { // didn't output all the text for this span @@ -500,7 +461,7 @@ public class StaticLayout extends Layout choosehtv, fm, hasTabOrEmoji, needMultiply, paraStart, chdirs, dir, easy, paraEnd == bufend, includepad, trackpad, - chs, widths, here - paraStart, + chs, widths, paraStart, ellipsize, ellipsizedWidth, w, paint); } @@ -620,19 +581,6 @@ public class StaticLayout extends Layout return false; } -/* - private static void dump(byte[] data, int count, String label) { - if (false) { - System.out.print(label); - - for (int i = 0; i < count; i++) - System.out.print(" " + data[i]); - - System.out.println(); - } - } -*/ - private int out(CharSequence text, int start, int end, int above, int below, int top, int bottom, int v, float spacingmult, float spacingadd, @@ -735,8 +683,8 @@ public class StaticLayout extends Layout if (easy) { mLineDirections[j] = linedirs; } else { - mLineDirections[j] = AndroidBidi.directions(dir, chdirs, widstart, chs, - widstart, end - start); + mLineDirections[j] = AndroidBidi.directions(dir, chdirs, start - widstart, chs, + start - widstart, end - start); } // If ellipsize is in marquee mode, do not apply ellipsis on the first line @@ -875,7 +823,7 @@ public class StaticLayout extends Layout @Override public int getLineDescent(int line) { int descent = mLines[mColumns * line + DESCENT]; - if (mMaximumVisibleLineCount > 0 && line >= mMaximumVisibleLineCount - 1 && + if (mMaximumVisibleLineCount > 0 && line >= mMaximumVisibleLineCount - 1 && // -1 intended line != mLineCount) { descent += getBottomPadding(); } @@ -939,8 +887,8 @@ public class StaticLayout extends Layout * @hide */ @Override - public void setMaximumVisibleLineCount(int line) { - mMaximumVisibleLineCount = line; + public void setMaximumVisibleLineCount(int lineCount) { + mMaximumVisibleLineCount = lineCount; } private int mLineCount; From 526d0cdf40349e480c69e921d7e294ee41f2884b Mon Sep 17 00:00:00 2001 From: Mathias Agopian Date: Wed, 9 Feb 2011 18:38:55 -0800 Subject: [PATCH 88/90] fix [3408713] Dialog window invisible sometimes weak pointer comparison operators were implemented wrong, they were using the internal "unsafe" pointer. We could end up with two "equal" weak pointer pointing to different objects. this caused KeyedVector keyed by weak pointer to work incorrectly, in turn causing a window that just got added to a list to be immediately removed. Change-Id: Ib191010c39aafa9229109e4211f6c3b2b2f9696d --- include/utils/RefBase.h | 62 +++++++++++++++++++++++++++++++---------- 1 file changed, 48 insertions(+), 14 deletions(-) diff --git a/include/utils/RefBase.h b/include/utils/RefBase.h index 9c64ac0443405..c24c0dbcb28ff 100644 --- a/include/utils/RefBase.h +++ b/include/utils/RefBase.h @@ -31,13 +31,10 @@ template class wp; // --------------------------------------------------------------------------- -#define COMPARE(_op_) \ +#define COMPARE_WEAK(_op_) \ inline bool operator _op_ (const sp& o) const { \ return m_ptr _op_ o.m_ptr; \ } \ -inline bool operator _op_ (const wp& o) const { \ - return m_ptr _op_ o.m_ptr; \ -} \ inline bool operator _op_ (const T* o) const { \ return m_ptr _op_ o; \ } \ @@ -46,12 +43,18 @@ inline bool operator _op_ (const sp& o) const { \ return m_ptr _op_ o.m_ptr; \ } \ template \ -inline bool operator _op_ (const wp& o) const { \ +inline bool operator _op_ (const U* o) const { \ + return m_ptr _op_ o; \ +} + +#define COMPARE(_op_) \ +COMPARE_WEAK(_op_) \ +inline bool operator _op_ (const wp& o) const { \ return m_ptr _op_ o.m_ptr; \ } \ template \ -inline bool operator _op_ (const U* o) const { \ - return m_ptr _op_ o; \ +inline bool operator _op_ (const wp& o) const { \ + return m_ptr _op_ o.m_ptr; \ } // --------------------------------------------------------------------------- @@ -274,13 +277,43 @@ public: inline T* unsafe_get() const { return m_ptr; } // Operators - - COMPARE(==) - COMPARE(!=) - COMPARE(>) - COMPARE(<) - COMPARE(<=) - COMPARE(>=) + + COMPARE_WEAK(==) + COMPARE_WEAK(!=) + COMPARE_WEAK(>) + COMPARE_WEAK(<) + COMPARE_WEAK(<=) + COMPARE_WEAK(>=) + + inline bool operator == (const wp& o) const { + return (m_ptr == o.m_ptr) && (m_refs == o.m_refs); + } + template + inline bool operator == (const wp& o) const { + return m_ptr == o.m_ptr; + } + + inline bool operator > (const wp& o) const { + return (m_ptr == o.m_ptr) ? (m_refs > o.m_refs) : (m_ptr > o.m_ptr); + } + template + inline bool operator > (const wp& o) const { + return (m_ptr == o.m_ptr) ? (m_refs > o.m_refs) : (m_ptr > o.m_ptr); + } + + inline bool operator < (const wp& o) const { + return (m_ptr == o.m_ptr) ? (m_refs < o.m_refs) : (m_ptr < o.m_ptr); + } + template + inline bool operator < (const wp& o) const { + return (m_ptr == o.m_ptr) ? (m_refs < o.m_refs) : (m_ptr < o.m_ptr); + } + inline bool operator != (const wp& o) const { return m_refs != o.m_refs; } + template inline bool operator != (const wp& o) const { return !operator == (o); } + inline bool operator <= (const wp& o) const { return !operator > (o); } + template inline bool operator <= (const wp& o) const { return !operator > (o); } + inline bool operator >= (const wp& o) const { return !operator < (o); } + template inline bool operator >= (const wp& o) const { return !operator < (o); } private: template friend class sp; @@ -294,6 +327,7 @@ template TextOutput& operator<<(TextOutput& to, const wp& val); #undef COMPARE +#undef COMPARE_WEAK // --------------------------------------------------------------------------- // No user serviceable parts below here. From fd78a46b9c524f59326dab41335cd8c0a62f5c14 Mon Sep 17 00:00:00 2001 From: Gilles Debunne Date: Fri, 25 Feb 2011 14:34:20 -0800 Subject: [PATCH 89/90] DO NOT MERGE Cherry-pick of cd59febcea2 from master AIOOB exception fix in TabWidget Bug http://code.google.com/p/android/issues/detail?id=15005 The problem was not specific to the legacy theme. The code that first measure the tab's width with no contraint was incorrectly using the mImposedTabsWidth array which could not have the right size if a child was added. The first measure after a child is added should indeed crash. Could be investigated. This fix is sure anyway. Change-Id: If5015aaa2d5574939fd5d6c6362ed6db94d35d4a --- core/java/android/widget/TabWidget.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/java/android/widget/TabWidget.java b/core/java/android/widget/TabWidget.java index 22f6f4ed93d83..d74ef245e5f7e 100644 --- a/core/java/android/widget/TabWidget.java +++ b/core/java/android/widget/TabWidget.java @@ -174,8 +174,8 @@ public class TabWidget extends LinearLayout implements OnFocusChangeListener { void measureHorizontal(int widthMeasureSpec, int heightMeasureSpec) { // First, measure with no constraint final int unspecifiedWidth = MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED); - super.measureHorizontal(unspecifiedWidth, heightMeasureSpec); mImposedTabsHeight = -1; + super.measureHorizontal(unspecifiedWidth, heightMeasureSpec); int extraWidth = getMeasuredWidth() - MeasureSpec.getSize(widthMeasureSpec); if (extraWidth > 0) { From 913d9ae818b95a288089507d92b5121695ee774b Mon Sep 17 00:00:00 2001 From: Wink Saville Date: Mon, 31 Jan 2011 18:11:31 -0800 Subject: [PATCH 90/90] Provide default value for operator numeric for CDMA. If the RIL_REQUEST_OPERATOR response[2], the numeric for the operator, is bad use the system property ro.cdma.home.operator.numeric. bug: 3383515 Change-Id: I090e5ba0cb7e3a7f1dc08d24996e78e489b9cd41 --- .../android/internal/telephony/cdma/CDMAPhone.java | 3 ++- .../telephony/cdma/CdmaServiceStateTracker.java | 14 ++++++++++++++ 2 files changed, 16 insertions(+), 1 deletion(-) diff --git a/telephony/java/com/android/internal/telephony/cdma/CDMAPhone.java b/telephony/java/com/android/internal/telephony/cdma/CDMAPhone.java index a1d512100625b..db4cefd402993 100755 --- a/telephony/java/com/android/internal/telephony/cdma/CDMAPhone.java +++ b/telephony/java/com/android/internal/telephony/cdma/CDMAPhone.java @@ -136,6 +136,7 @@ public class CDMAPhone extends PhoneBase { Registrant mPostDialHandler; + static String PROPERTY_CDMA_HOME_OPERATOR_NUMERIC = "ro.cdma.home.operator.numeric"; // Constructors public CDMAPhone(Context context, CommandsInterface ci, PhoneNotifier notifier) { @@ -195,7 +196,7 @@ public class CDMAPhone extends PhoneBase { setSystemProperty(PROPERTY_ICC_OPERATOR_ALPHA, operatorAlpha); // Sets operator numeric property by retrieving from build-time system property - String operatorNumeric = SystemProperties.get("ro.cdma.home.operator.numeric"); + String operatorNumeric = SystemProperties.get(PROPERTY_CDMA_HOME_OPERATOR_NUMERIC); setSystemProperty(PROPERTY_ICC_OPERATOR_NUMERIC, operatorNumeric); // Sets iso country property by retrieving from build-time system property diff --git a/telephony/java/com/android/internal/telephony/cdma/CdmaServiceStateTracker.java b/telephony/java/com/android/internal/telephony/cdma/CdmaServiceStateTracker.java index a7f786664fece..b217f07b9c1ef 100755 --- a/telephony/java/com/android/internal/telephony/cdma/CdmaServiceStateTracker.java +++ b/telephony/java/com/android/internal/telephony/cdma/CdmaServiceStateTracker.java @@ -16,6 +16,8 @@ package com.android.internal.telephony.cdma; +import static com.android.internal.telephony.TelephonyProperties.PROPERTY_ICC_OPERATOR_NUMERIC; + import com.android.internal.telephony.CommandException; import com.android.internal.telephony.CommandsInterface; import com.android.internal.telephony.DataConnectionTracker; @@ -794,6 +796,18 @@ final class CdmaServiceStateTracker extends ServiceStateTracker { String opNames[] = (String[])ar.result; if (opNames != null && opNames.length >= 3) { + // If the NUMERIC field isn't valid use PROPERTY_CDMA_HOME_OPERATOR_NUMERIC + if ((opNames[2] == null) || (opNames[2].length() < 5) + || ("00000".equals(opNames[2]))) { + opNames[2] = SystemProperties.get( + CDMAPhone.PROPERTY_CDMA_HOME_OPERATOR_NUMERIC, "00000"); + if (DBG) { + log("RIL_REQUEST_OPERATOR.response[2], the numeric, " + + " is bad. Using SystemProperties '" + + CDMAPhone.PROPERTY_CDMA_HOME_OPERATOR_NUMERIC + + "'= " + opNames[2]); + } + } if (cm.getRadioState().isNVReady()) { // In CDMA in case on NV, the ss.mOperatorAlphaLong is set later with the // ERI text, so here it is ignored what is coming from the modem.